`, and ``.\n$font-family-monospace: Menlo, Monaco, Consolas, \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n\n$font-size-base: 14px !default;\n$font-size-large: ceil(($font-size-base * 1.25)) !default; // ~18px\n$font-size-small: ceil(($font-size-base * 0.85)) !default; // ~12px\n\n$font-size-h1: floor(($font-size-base * 2.6)) !default; // ~36px\n$font-size-h2: floor(($font-size-base * 2.15)) !default; // ~30px\n$font-size-h3: ceil(($font-size-base * 1.7)) !default; // ~24px\n$font-size-h4: ceil(($font-size-base * 1.25)) !default; // ~18px\n$font-size-h5: $font-size-base !default;\n$font-size-h6: ceil(($font-size-base * 0.85)) !default; // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n$line-height-base: 1.428571429 !default; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n$line-height-computed: floor(($font-size-base * $line-height-base)) !default; // ~20px\n\n//** By default, this inherits from the ``.\n$headings-font-family: inherit !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.1 !default;\n$headings-color: inherit !default;\n\n\n//== Iconography\n//\n//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n//** Load fonts from this directory.\n\n// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.\n// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.\n$icon-font-path: if($bootstrap-sass-asset-helper, \"bootstrap/\", \"../fonts/bootstrap/\") !default;\n\n//** File name for all font files.\n$icon-font-name: \"glyphicons-halflings-regular\" !default;\n//** Element ID within SVG icon file.\n$icon-font-svg-id: \"glyphicons_halflingsregular\" !default;\n\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n$padding-base-vertical: 6px !default;\n$padding-base-horizontal: 12px !default;\n\n$padding-large-vertical: 10px !default;\n$padding-large-horizontal: 16px !default;\n\n$padding-small-vertical: 5px !default;\n$padding-small-horizontal: 10px !default;\n\n$padding-xs-vertical: 1px !default;\n$padding-xs-horizontal: 5px !default;\n\n$line-height-large: 1.3333333 !default; // extra decimals for Win 8.1 Chrome\n$line-height-small: 1.5 !default;\n\n$border-radius-base: 4px !default;\n$border-radius-large: 6px !default;\n$border-radius-small: 3px !default;\n\n//** Global color for active items (e.g., navs or dropdowns).\n$component-active-color: #fff !default;\n//** Global background color for active items (e.g., navs or dropdowns).\n$component-active-bg: $brand-primary !default;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n$caret-width-base: 4px !default;\n//** Carets increase slightly in size for larger components.\n$caret-width-large: 5px !default;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for ``s and ` `s.\n$table-cell-padding: 8px !default;\n//** Padding for cells in `.table-condensed`.\n$table-condensed-cell-padding: 5px !default;\n\n//** Default background color used for all table.\n$table-bg: transparent !default;\n//** Background color used for `.table-striped`.\n$table-bg-accent: #f9f9f9 !default;\n//** Background color used for `.table-hover`.\n$table-bg-hover: #f5f5f5 !default;\n$table-bg-active: $table-bg-hover !default;\n\n//** Border color for table and cell borders.\n$table-border-color: #ddd !default;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n$btn-font-weight: normal !default;\n\n$btn-default-color: #333 !default;\n$btn-default-bg: #fff !default;\n$btn-default-border: #ccc !default;\n\n$btn-primary-color: #fff !default;\n$btn-primary-bg: $brand-primary !default;\n$btn-primary-border: darken($btn-primary-bg, 5%) !default;\n\n$btn-success-color: #fff !default;\n$btn-success-bg: $brand-success !default;\n$btn-success-border: darken($btn-success-bg, 5%) !default;\n\n$btn-info-color: #fff !default;\n$btn-info-bg: $brand-info !default;\n$btn-info-border: darken($btn-info-bg, 5%) !default;\n\n$btn-warning-color: #fff !default;\n$btn-warning-bg: $brand-warning !default;\n$btn-warning-border: darken($btn-warning-bg, 5%) !default;\n\n$btn-danger-color: #fff !default;\n$btn-danger-bg: $brand-danger !default;\n$btn-danger-border: darken($btn-danger-bg, 5%) !default;\n\n$btn-link-disabled-color: $gray-light !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius-base: $border-radius-base !default;\n$btn-border-radius-large: $border-radius-large !default;\n$btn-border-radius-small: $border-radius-small !default;\n\n\n//== Forms\n//\n//##\n\n//** ` ` background color\n$input-bg: #fff !default;\n//** ` ` background color\n$input-bg-disabled: $gray-lighter !default;\n\n//** Text color for ` `s\n$input-color: $gray !default;\n//** ` ` border color\n$input-border: #ccc !default;\n\n// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4\n//** Default `.form-control` border radius\n// This has no effect on ``s in some browsers, due to the limited stylability of ``s in CSS.\n$input-border-radius: $border-radius-base !default;\n//** Large `.form-control` border radius\n$input-border-radius-large: $border-radius-large !default;\n//** Small `.form-control` border radius\n$input-border-radius-small: $border-radius-small !default;\n\n//** Border color for inputs on focus\n$input-border-focus: #66afe9 !default;\n\n//** Placeholder text color\n$input-color-placeholder: #999 !default;\n\n//** Default `.form-control` height\n$input-height-base: ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;\n//** Large `.form-control` height\n$input-height-large: (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;\n//** Small `.form-control` height\n$input-height-small: (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;\n\n//** `.form-group` margin\n$form-group-margin-bottom: 15px !default;\n\n$legend-color: $gray-dark !default;\n$legend-border-color: #e5e5e5 !default;\n\n//** Background color for textual input addons\n$input-group-addon-bg: $gray-lighter !default;\n//** Border color for textual input addons\n$input-group-addon-border-color: $input-border !default;\n\n//** Disabled cursor for form controls and buttons.\n$cursor-disabled: not-allowed !default;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n$dropdown-bg: #fff !default;\n//** Dropdown menu `border-color`.\n$dropdown-border: rgba(0,0,0,.15) !default;\n//** Dropdown menu `border-color` **for IE8**.\n$dropdown-fallback-border: #ccc !default;\n//** Divider color for between dropdown items.\n$dropdown-divider-bg: #e5e5e5 !default;\n\n//** Dropdown link text color.\n$dropdown-link-color: $gray-dark !default;\n//** Hover color for dropdown links.\n$dropdown-link-hover-color: darken($gray-dark, 5%) !default;\n//** Hover background for dropdown links.\n$dropdown-link-hover-bg: #f5f5f5 !default;\n\n//** Active dropdown menu item text color.\n$dropdown-link-active-color: $component-active-color !default;\n//** Active dropdown menu item background color.\n$dropdown-link-active-bg: $component-active-bg !default;\n\n//** Disabled dropdown menu item background color.\n$dropdown-link-disabled-color: $gray-light !default;\n\n//** Text color for headers within dropdown menus.\n$dropdown-header-color: $gray-light !default;\n\n//** Deprecated `$dropdown-caret-color` as of v3.1.0\n$dropdown-caret-color: #000 !default;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n$zindex-navbar: 1000 !default;\n$zindex-dropdown: 1000 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n$zindex-navbar-fixed: 1030 !default;\n$zindex-modal-background: 1040 !default;\n$zindex-modal: 1050 !default;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n//** Deprecated `$screen-xs` as of v3.0.1\n$screen-xs: 480px !default;\n//** Deprecated `$screen-xs-min` as of v3.2.0\n$screen-xs-min: $screen-xs !default;\n//** Deprecated `$screen-phone` as of v3.0.1\n$screen-phone: $screen-xs-min !default;\n\n// Small screen / tablet\n//** Deprecated `$screen-sm` as of v3.0.1\n$screen-sm: 768px !default;\n$screen-sm-min: $screen-sm !default;\n//** Deprecated `$screen-tablet` as of v3.0.1\n$screen-tablet: $screen-sm-min !default;\n\n// Medium screen / desktop\n//** Deprecated `$screen-md` as of v3.0.1\n$screen-md: 992px !default;\n$screen-md-min: $screen-md !default;\n//** Deprecated `$screen-desktop` as of v3.0.1\n$screen-desktop: $screen-md-min !default;\n\n// Large screen / wide desktop\n//** Deprecated `$screen-lg` as of v3.0.1\n$screen-lg: 1200px !default;\n$screen-lg-min: $screen-lg !default;\n//** Deprecated `$screen-lg-desktop` as of v3.0.1\n$screen-lg-desktop: $screen-lg-min !default;\n\n// So media queries don't overlap when required, provide a maximum\n$screen-xs-max: ($screen-sm-min - 1) !default;\n$screen-sm-max: ($screen-md-min - 1) !default;\n$screen-md-max: ($screen-lg-min - 1) !default;\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n$grid-columns: 12 !default;\n//** Padding between columns. Gets divided in half for the left and right.\n$grid-gutter-width: 30px !default;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n$grid-float-breakpoint: $screen-sm-min !default;\n//** Point at which the navbar begins collapsing.\n$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n$container-tablet: (720px + $grid-gutter-width) !default;\n//** For `$screen-sm-min` and up.\n$container-sm: $container-tablet !default;\n\n// Medium screen / desktop\n$container-desktop: (940px + $grid-gutter-width) !default;\n//** For `$screen-md-min` and up.\n$container-md: $container-desktop !default;\n\n// Large screen / wide desktop\n$container-large-desktop: (1140px + $grid-gutter-width) !default;\n//** For `$screen-lg-min` and up.\n$container-lg: $container-large-desktop !default;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n$navbar-height: 50px !default;\n$navbar-margin-bottom: $line-height-computed !default;\n$navbar-border-radius: $border-radius-base !default;\n$navbar-padding-horizontal: floor(($grid-gutter-width / 2)) !default;\n$navbar-padding-vertical: (($navbar-height - $line-height-computed) / 2) !default;\n$navbar-collapse-max-height: 340px !default;\n\n$navbar-default-color: #777 !default;\n$navbar-default-bg: #f8f8f8 !default;\n$navbar-default-border: darken($navbar-default-bg, 6.5%) !default;\n\n// Navbar links\n$navbar-default-link-color: #777 !default;\n$navbar-default-link-hover-color: #333 !default;\n$navbar-default-link-hover-bg: transparent !default;\n$navbar-default-link-active-color: #555 !default;\n$navbar-default-link-active-bg: darken($navbar-default-bg, 6.5%) !default;\n$navbar-default-link-disabled-color: #ccc !default;\n$navbar-default-link-disabled-bg: transparent !default;\n\n// Navbar brand label\n$navbar-default-brand-color: $navbar-default-link-color !default;\n$navbar-default-brand-hover-color: darken($navbar-default-brand-color, 10%) !default;\n$navbar-default-brand-hover-bg: transparent !default;\n\n// Navbar toggle\n$navbar-default-toggle-hover-bg: #ddd !default;\n$navbar-default-toggle-icon-bar-bg: #888 !default;\n$navbar-default-toggle-border-color: #ddd !default;\n\n\n//=== Inverted navbar\n// Reset inverted navbar basics\n$navbar-inverse-color: lighten($gray-light, 15%) !default;\n$navbar-inverse-bg: #222 !default;\n$navbar-inverse-border: darken($navbar-inverse-bg, 10%) !default;\n\n// Inverted navbar links\n$navbar-inverse-link-color: lighten($gray-light, 15%) !default;\n$navbar-inverse-link-hover-color: #fff !default;\n$navbar-inverse-link-hover-bg: transparent !default;\n$navbar-inverse-link-active-color: $navbar-inverse-link-hover-color !default;\n$navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 10%) !default;\n$navbar-inverse-link-disabled-color: #444 !default;\n$navbar-inverse-link-disabled-bg: transparent !default;\n\n// Inverted navbar brand label\n$navbar-inverse-brand-color: $navbar-inverse-link-color !default;\n$navbar-inverse-brand-hover-color: #fff !default;\n$navbar-inverse-brand-hover-bg: transparent !default;\n\n// Inverted navbar toggle\n$navbar-inverse-toggle-hover-bg: #333 !default;\n$navbar-inverse-toggle-icon-bar-bg: #fff !default;\n$navbar-inverse-toggle-border-color: #333 !default;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n$nav-link-padding: 10px 15px !default;\n$nav-link-hover-bg: $gray-lighter !default;\n\n$nav-disabled-link-color: $gray-light !default;\n$nav-disabled-link-hover-color: $gray-light !default;\n\n//== Tabs\n$nav-tabs-border-color: #ddd !default;\n\n$nav-tabs-link-hover-border-color: $gray-lighter !default;\n\n$nav-tabs-active-link-hover-bg: $body-bg !default;\n$nav-tabs-active-link-hover-color: $gray !default;\n$nav-tabs-active-link-hover-border-color: #ddd !default;\n\n$nav-tabs-justified-link-border-color: #ddd !default;\n$nav-tabs-justified-active-link-border-color: $body-bg !default;\n\n//== Pills\n$nav-pills-border-radius: $border-radius-base !default;\n$nav-pills-active-link-hover-bg: $component-active-bg !default;\n$nav-pills-active-link-hover-color: $component-active-color !default;\n\n\n//== Pagination\n//\n//##\n\n$pagination-color: $link-color !default;\n$pagination-bg: #fff !default;\n$pagination-border: #ddd !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-lighter !default;\n$pagination-hover-border: #ddd !default;\n\n$pagination-active-color: #fff !default;\n$pagination-active-bg: $brand-primary !default;\n$pagination-active-border: $brand-primary !default;\n\n$pagination-disabled-color: $gray-light !default;\n$pagination-disabled-bg: #fff !default;\n$pagination-disabled-border: #ddd !default;\n\n\n//== Pager\n//\n//##\n\n$pager-bg: $pagination-bg !default;\n$pager-border: $pagination-border !default;\n$pager-border-radius: 15px !default;\n\n$pager-hover-bg: $pagination-hover-bg !default;\n\n$pager-active-bg: $pagination-active-bg !default;\n$pager-active-color: $pagination-active-color !default;\n\n$pager-disabled-color: $pagination-disabled-color !default;\n\n\n//== Jumbotron\n//\n//##\n\n$jumbotron-padding: 30px !default;\n$jumbotron-color: inherit !default;\n$jumbotron-bg: $gray-lighter !default;\n$jumbotron-heading-color: inherit !default;\n$jumbotron-font-size: ceil(($font-size-base * 1.5)) !default;\n$jumbotron-heading-font-size: ceil(($font-size-base * 4.5)) !default;\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n$state-success-text: #3c763d !default;\n$state-success-bg: #dff0d8 !default;\n$state-success-border: darken(adjust-hue($state-success-bg, -10), 5%) !default;\n\n$state-info-text: #31708f !default;\n$state-info-bg: #d9edf7 !default;\n$state-info-border: darken(adjust-hue($state-info-bg, -10), 7%) !default;\n\n$state-warning-text: #8a6d3b !default;\n$state-warning-bg: #fcf8e3 !default;\n$state-warning-border: darken(adjust-hue($state-warning-bg, -10), 5%) !default;\n\n$state-danger-text: #a94442 !default;\n$state-danger-bg: #f2dede !default;\n$state-danger-border: darken(adjust-hue($state-danger-bg, -10), 5%) !default;\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n$tooltip-max-width: 200px !default;\n//** Tooltip text color\n$tooltip-color: #fff !default;\n//** Tooltip background color\n$tooltip-bg: #000 !default;\n$tooltip-opacity: .9 !default;\n\n//** Tooltip arrow width\n$tooltip-arrow-width: 5px !default;\n//** Tooltip arrow color\n$tooltip-arrow-color: $tooltip-bg !default;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n$popover-bg: #fff !default;\n//** Popover maximum width\n$popover-max-width: 276px !default;\n//** Popover border color\n$popover-border-color: rgba(0,0,0,.2) !default;\n//** Popover fallback border color\n$popover-fallback-border-color: #ccc !default;\n\n//** Popover title background color\n$popover-title-bg: darken($popover-bg, 3%) !default;\n\n//** Popover arrow width\n$popover-arrow-width: 10px !default;\n//** Popover arrow color\n$popover-arrow-color: $popover-bg !default;\n\n//** Popover outer arrow width\n$popover-arrow-outer-width: ($popover-arrow-width + 1) !default;\n//** Popover outer arrow color\n$popover-arrow-outer-color: fade_in($popover-border-color, 0.05) !default;\n//** Popover outer arrow fallback color\n$popover-arrow-outer-fallback-color: darken($popover-fallback-border-color, 20%) !default;\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n$label-default-bg: $gray-light !default;\n//** Primary label background color\n$label-primary-bg: $brand-primary !default;\n//** Success label background color\n$label-success-bg: $brand-success !default;\n//** Info label background color\n$label-info-bg: $brand-info !default;\n//** Warning label background color\n$label-warning-bg: $brand-warning !default;\n//** Danger label background color\n$label-danger-bg: $brand-danger !default;\n\n//** Default label text color\n$label-color: #fff !default;\n//** Default text color of a linked label\n$label-link-hover-color: #fff !default;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n$modal-inner-padding: 15px !default;\n\n//** Padding applied to the modal title\n$modal-title-padding: 15px !default;\n//** Modal title line-height\n$modal-title-line-height: $line-height-base !default;\n\n//** Background color of modal content area\n$modal-content-bg: #fff !default;\n//** Modal content border color\n$modal-content-border-color: rgba(0,0,0,.2) !default;\n//** Modal content border color **for IE8**\n$modal-content-fallback-border-color: #999 !default;\n\n//** Modal backdrop background color\n$modal-backdrop-bg: #000 !default;\n//** Modal backdrop opacity\n$modal-backdrop-opacity: .5 !default;\n//** Modal header border color\n$modal-header-border-color: #e5e5e5 !default;\n//** Modal footer border color\n$modal-footer-border-color: $modal-header-border-color !default;\n\n$modal-lg: 900px !default;\n$modal-md: 600px !default;\n$modal-sm: 300px !default;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n$alert-padding: 15px !default;\n$alert-border-radius: $border-radius-base !default;\n$alert-link-font-weight: bold !default;\n\n$alert-success-bg: $state-success-bg !default;\n$alert-success-text: $state-success-text !default;\n$alert-success-border: $state-success-border !default;\n\n$alert-info-bg: $state-info-bg !default;\n$alert-info-text: $state-info-text !default;\n$alert-info-border: $state-info-border !default;\n\n$alert-warning-bg: $state-warning-bg !default;\n$alert-warning-text: $state-warning-text !default;\n$alert-warning-border: $state-warning-border !default;\n\n$alert-danger-bg: $state-danger-bg !default;\n$alert-danger-text: $state-danger-text !default;\n$alert-danger-border: $state-danger-border !default;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n$progress-bg: #f5f5f5 !default;\n//** Progress bar text color\n$progress-bar-color: #fff !default;\n//** Variable for setting rounded corners on progress bar.\n$progress-border-radius: $border-radius-base !default;\n\n//** Default progress bar color\n$progress-bar-bg: $brand-primary !default;\n//** Success progress bar color\n$progress-bar-success-bg: $brand-success !default;\n//** Warning progress bar color\n$progress-bar-warning-bg: $brand-warning !default;\n//** Danger progress bar color\n$progress-bar-danger-bg: $brand-danger !default;\n//** Info progress bar color\n$progress-bar-info-bg: $brand-info !default;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n$list-group-bg: #fff !default;\n//** `.list-group-item` border color\n$list-group-border: #ddd !default;\n//** List group border radius\n$list-group-border-radius: $border-radius-base !default;\n\n//** Background color of single list items on hover\n$list-group-hover-bg: #f5f5f5 !default;\n//** Text color of active list items\n$list-group-active-color: $component-active-color !default;\n//** Background color of active list items\n$list-group-active-bg: $component-active-bg !default;\n//** Border color of active list elements\n$list-group-active-border: $list-group-active-bg !default;\n//** Text color for content within active list items\n$list-group-active-text-color: lighten($list-group-active-bg, 40%) !default;\n\n//** Text color of disabled list items\n$list-group-disabled-color: $gray-light !default;\n//** Background color of disabled list items\n$list-group-disabled-bg: $gray-lighter !default;\n//** Text color for content within disabled list items\n$list-group-disabled-text-color: $list-group-disabled-color !default;\n\n$list-group-link-color: #555 !default;\n$list-group-link-hover-color: $list-group-link-color !default;\n$list-group-link-heading-color: #333 !default;\n\n\n//== Panels\n//\n//##\n\n$panel-bg: #fff !default;\n$panel-body-padding: 15px !default;\n$panel-heading-padding: 10px 15px !default;\n$panel-footer-padding: $panel-heading-padding !default;\n$panel-border-radius: $border-radius-base !default;\n\n//** Border color for elements within panels\n$panel-inner-border: #ddd !default;\n$panel-footer-bg: #f5f5f5 !default;\n\n$panel-default-text: $gray-dark !default;\n$panel-default-border: #ddd !default;\n$panel-default-heading-bg: #f5f5f5 !default;\n\n$panel-primary-text: #fff !default;\n$panel-primary-border: $brand-primary !default;\n$panel-primary-heading-bg: $brand-primary !default;\n\n$panel-success-text: $state-success-text !default;\n$panel-success-border: $state-success-border !default;\n$panel-success-heading-bg: $state-success-bg !default;\n\n$panel-info-text: $state-info-text !default;\n$panel-info-border: $state-info-border !default;\n$panel-info-heading-bg: $state-info-bg !default;\n\n$panel-warning-text: $state-warning-text !default;\n$panel-warning-border: $state-warning-border !default;\n$panel-warning-heading-bg: $state-warning-bg !default;\n\n$panel-danger-text: $state-danger-text !default;\n$panel-danger-border: $state-danger-border !default;\n$panel-danger-heading-bg: $state-danger-bg !default;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n$thumbnail-padding: 4px !default;\n//** Thumbnail background color\n$thumbnail-bg: $body-bg !default;\n//** Thumbnail border color\n$thumbnail-border: #ddd !default;\n//** Thumbnail border radius\n$thumbnail-border-radius: $border-radius-base !default;\n\n//** Custom text color for thumbnail captions\n$thumbnail-caption-color: $text-color !default;\n//** Padding around the thumbnail caption\n$thumbnail-caption-padding: 9px !default;\n\n\n//== Wells\n//\n//##\n\n$well-bg: #f5f5f5 !default;\n$well-border: darken($well-bg, 7%) !default;\n\n\n//== Badges\n//\n//##\n\n$badge-color: #fff !default;\n//** Linked badge text color on hover\n$badge-link-hover-color: #fff !default;\n$badge-bg: $gray-light !default;\n\n//** Badge text color in active nav link\n$badge-active-color: $link-color !default;\n//** Badge background color in active nav link\n$badge-active-bg: #fff !default;\n\n$badge-font-weight: bold !default;\n$badge-line-height: 1 !default;\n$badge-border-radius: 10px !default;\n\n\n//== Breadcrumbs\n//\n//##\n\n$breadcrumb-padding-vertical: 8px !default;\n$breadcrumb-padding-horizontal: 15px !default;\n//** Breadcrumb background color\n$breadcrumb-bg: #f5f5f5 !default;\n//** Breadcrumb text color\n$breadcrumb-color: #ccc !default;\n//** Text color of current page in the breadcrumb\n$breadcrumb-active-color: $gray-light !default;\n//** Textual separator for between breadcrumb elements\n$breadcrumb-separator: \"/\" !default;\n\n\n//== Carousel\n//\n//##\n\n$carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6) !default;\n\n$carousel-control-color: #fff !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-font-size: 20px !default;\n\n$carousel-indicator-active-bg: #fff !default;\n$carousel-indicator-border-color: #fff !default;\n\n$carousel-caption-color: #fff !default;\n\n\n//== Close\n//\n//##\n\n$close-font-weight: bold !default;\n$close-color: #000 !default;\n$close-text-shadow: 0 1px 0 #fff !default;\n\n\n//== Code\n//\n//##\n\n$code-color: #c7254e !default;\n$code-bg: #f9f2f4 !default;\n\n$kbd-color: #fff !default;\n$kbd-bg: #333 !default;\n\n$pre-bg: #f5f5f5 !default;\n$pre-color: $gray-dark !default;\n$pre-border-color: #ccc !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n//== Type\n//\n//##\n\n//** Horizontal offset for forms and lists.\n$component-offset-horizontal: 180px !default;\n//** Text muted color\n$text-muted: $gray-light !default;\n//** Abbreviations and acronyms border color\n$abbr-border-color: $gray-light !default;\n//** Headings small color\n$headings-small-color: $gray-light !default;\n//** Blockquote small color\n$blockquote-small-color: $gray-light !default;\n//** Blockquote font size\n$blockquote-font-size: ($font-size-base * 1.25) !default;\n//** Blockquote border color\n$blockquote-border-color: $gray-lighter !default;\n//** Page header border color\n$page-header-border-color: $gray-lighter !default;\n//** Width of horizontal description list titles\n$dl-horizontal-offset: $component-offset-horizontal !default;\n//** Horizontal line color.\n$hr-border: $gray-lighter !default;\n",
+ "// Mixins\n// --------------------------------------------------\n\n// Utilities\n@import \"mixins/hide-text\";\n@import \"mixins/opacity\";\n@import \"mixins/image\";\n@import \"mixins/labels\";\n@import \"mixins/reset-filter\";\n@import \"mixins/resize\";\n@import \"mixins/responsive-visibility\";\n@import \"mixins/size\";\n@import \"mixins/tab-focus\";\n@import \"mixins/reset-text\";\n@import \"mixins/text-emphasis\";\n@import \"mixins/text-overflow\";\n@import \"mixins/vendor-prefixes\";\n\n// Components\n@import \"mixins/alerts\";\n@import \"mixins/buttons\";\n@import \"mixins/panels\";\n@import \"mixins/pagination\";\n@import \"mixins/list-group\";\n@import \"mixins/nav-divider\";\n@import \"mixins/forms\";\n@import \"mixins/progress-bar\";\n@import \"mixins/table-row\";\n\n// Skins\n@import \"mixins/background-variant\";\n@import \"mixins/border-radius\";\n@import \"mixins/gradients\";\n\n// Layout\n@import \"mixins/clearfix\";\n@import \"mixins/center-block\";\n@import \"mixins/nav-vertical-align\";\n@import \"mixins/grid-framework\";\n@import \"mixins/grid\";\n",
+ "// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n@mixin hide-text() {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n@mixin text-hide() {\n @include hide-text;\n}\n",
+ "// Opacity\n\n@mixin opacity($opacity) {\n opacity: $opacity;\n // IE8 filter\n $opacity-ie: ($opacity * 100);\n filter: alpha(opacity=$opacity-ie);\n}\n",
+ "// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n@mixin img-responsive($display: block) {\n display: $display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path(\"#{$file-1x}\"), \"#{$file-1x}\"));\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path(\"#{$file-2x}\"), \"#{$file-2x}\"));\n background-size: $width-1x $height-1x;\n }\n}\n",
+ "// Labels\n\n@mixin label-variant($color) {\n background-color: $color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken($color, 10%);\n }\n }\n}\n",
+ "// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n@mixin reset-filter() {\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n",
+ "// Resize anything\n\n@mixin resizable($direction) {\n resize: $direction; // Options: horizontal, vertical, both\n overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`\n}\n",
+ "// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n// [converter] $parent hack\n@mixin responsive-visibility($parent) {\n #{$parent} {\n display: block !important;\n }\n table#{$parent} { display: table !important; }\n tr#{$parent} { display: table-row !important; }\n th#{$parent},\n td#{$parent} { display: table-cell !important; }\n}\n\n// [converter] $parent hack\n@mixin responsive-invisibility($parent) {\n #{$parent} {\n display: none !important;\n }\n}\n",
+ "// Sizing shortcuts\n\n@mixin size($width, $height) {\n width: $width;\n height: $height;\n}\n\n@mixin square($size) {\n @include size($size, $size);\n}\n",
+ "// WebKit-style focus\n\n@mixin tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n",
+ "@mixin reset-text() {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n",
+ "// Typography\n\n// [converter] $parent hack\n@mixin text-emphasis-variant($parent, $color) {\n #{$parent} {\n color: $color;\n }\n a#{$parent}:hover,\n a#{$parent}:focus {\n color: darken($color, 10%);\n }\n}\n",
+ "// Text overflow\n// Requires inline-block or block for proper styling\n\n@mixin text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n",
+ "// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n@mixin animation($animation) {\n -webkit-animation: $animation;\n -o-animation: $animation;\n animation: $animation;\n}\n@mixin animation-name($name) {\n -webkit-animation-name: $name;\n animation-name: $name;\n}\n@mixin animation-duration($duration) {\n -webkit-animation-duration: $duration;\n animation-duration: $duration;\n}\n@mixin animation-timing-function($timing-function) {\n -webkit-animation-timing-function: $timing-function;\n animation-timing-function: $timing-function;\n}\n@mixin animation-delay($delay) {\n -webkit-animation-delay: $delay;\n animation-delay: $delay;\n}\n@mixin animation-iteration-count($iteration-count) {\n -webkit-animation-iteration-count: $iteration-count;\n animation-iteration-count: $iteration-count;\n}\n@mixin animation-direction($direction) {\n -webkit-animation-direction: $direction;\n animation-direction: $direction;\n}\n@mixin animation-fill-mode($fill-mode) {\n -webkit-animation-fill-mode: $fill-mode;\n animation-fill-mode: $fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n@mixin backface-visibility($visibility){\n -webkit-backface-visibility: $visibility;\n -moz-backface-visibility: $visibility;\n backface-visibility: $visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n@mixin box-shadow($shadow...) {\n -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1\n box-shadow: $shadow;\n}\n\n// Box sizing\n@mixin box-sizing($boxmodel) {\n -webkit-box-sizing: $boxmodel;\n -moz-box-sizing: $boxmodel;\n box-sizing: $boxmodel;\n}\n\n// CSS3 Content Columns\n@mixin content-columns($column-count, $column-gap: $grid-gutter-width) {\n -webkit-column-count: $column-count;\n -moz-column-count: $column-count;\n column-count: $column-count;\n -webkit-column-gap: $column-gap;\n -moz-column-gap: $column-gap;\n column-gap: $column-gap;\n}\n\n// Optional hyphenation\n@mixin hyphens($mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: $mode;\n -moz-hyphens: $mode;\n -ms-hyphens: $mode; // IE10+\n -o-hyphens: $mode;\n hyphens: $mode;\n}\n\n// Placeholder text\n@mixin placeholder($color: $input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: $color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: $color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: $color; } // Safari and Chrome\n}\n\n// Transformations\n@mixin scale($ratio...) {\n -webkit-transform: scale($ratio);\n -ms-transform: scale($ratio); // IE9 only\n -o-transform: scale($ratio);\n transform: scale($ratio);\n}\n\n@mixin scaleX($ratio) {\n -webkit-transform: scaleX($ratio);\n -ms-transform: scaleX($ratio); // IE9 only\n -o-transform: scaleX($ratio);\n transform: scaleX($ratio);\n}\n@mixin scaleY($ratio) {\n -webkit-transform: scaleY($ratio);\n -ms-transform: scaleY($ratio); // IE9 only\n -o-transform: scaleY($ratio);\n transform: scaleY($ratio);\n}\n@mixin skew($x, $y) {\n -webkit-transform: skewX($x) skewY($y);\n -ms-transform: skewX($x) skewY($y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX($x) skewY($y);\n transform: skewX($x) skewY($y);\n}\n@mixin translate($x, $y) {\n -webkit-transform: translate($x, $y);\n -ms-transform: translate($x, $y); // IE9 only\n -o-transform: translate($x, $y);\n transform: translate($x, $y);\n}\n@mixin translate3d($x, $y, $z) {\n -webkit-transform: translate3d($x, $y, $z);\n transform: translate3d($x, $y, $z);\n}\n@mixin rotate($degrees) {\n -webkit-transform: rotate($degrees);\n -ms-transform: rotate($degrees); // IE9 only\n -o-transform: rotate($degrees);\n transform: rotate($degrees);\n}\n@mixin rotateX($degrees) {\n -webkit-transform: rotateX($degrees);\n -ms-transform: rotateX($degrees); // IE9 only\n -o-transform: rotateX($degrees);\n transform: rotateX($degrees);\n}\n@mixin rotateY($degrees) {\n -webkit-transform: rotateY($degrees);\n -ms-transform: rotateY($degrees); // IE9 only\n -o-transform: rotateY($degrees);\n transform: rotateY($degrees);\n}\n@mixin perspective($perspective) {\n -webkit-perspective: $perspective;\n -moz-perspective: $perspective;\n perspective: $perspective;\n}\n@mixin perspective-origin($perspective) {\n -webkit-perspective-origin: $perspective;\n -moz-perspective-origin: $perspective;\n perspective-origin: $perspective;\n}\n@mixin transform-origin($origin) {\n -webkit-transform-origin: $origin;\n -moz-transform-origin: $origin;\n -ms-transform-origin: $origin; // IE9 only\n transform-origin: $origin;\n}\n\n\n// Transitions\n\n@mixin transition($transition...) {\n -webkit-transition: $transition;\n -o-transition: $transition;\n transition: $transition;\n}\n@mixin transition-property($transition-property...) {\n -webkit-transition-property: $transition-property;\n transition-property: $transition-property;\n}\n@mixin transition-delay($transition-delay) {\n -webkit-transition-delay: $transition-delay;\n transition-delay: $transition-delay;\n}\n@mixin transition-duration($transition-duration...) {\n -webkit-transition-duration: $transition-duration;\n transition-duration: $transition-duration;\n}\n@mixin transition-timing-function($timing-function) {\n -webkit-transition-timing-function: $timing-function;\n transition-timing-function: $timing-function;\n}\n@mixin transition-transform($transition...) {\n -webkit-transition: -webkit-transform $transition;\n -moz-transition: -moz-transform $transition;\n -o-transition: -o-transform $transition;\n transition: transform $transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n@mixin user-select($select) {\n -webkit-user-select: $select;\n -moz-user-select: $select;\n -ms-user-select: $select; // IE10+\n user-select: $select;\n}\n",
+ "// Alerts\n\n@mixin alert-variant($background, $border, $text-color) {\n background-color: $background;\n border-color: $border;\n color: $text-color;\n\n hr {\n border-top-color: darken($border, 5%);\n }\n .alert-link {\n color: darken($text-color, 10%);\n }\n}\n",
+ "// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n@mixin button-variant($color, $background, $border) {\n color: $color;\n background-color: $background;\n border-color: $border;\n\n &:focus,\n &.focus {\n color: $color;\n background-color: darken($background, 10%);\n border-color: darken($border, 25%);\n }\n &:hover {\n color: $color;\n background-color: darken($background, 10%);\n border-color: darken($border, 12%);\n }\n &:active,\n &.active,\n .open > &.dropdown-toggle {\n color: $color;\n background-color: darken($background, 10%);\n border-color: darken($border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: $color;\n background-color: darken($background, 17%);\n border-color: darken($border, 25%);\n }\n }\n &:active,\n &.active,\n .open > &.dropdown-toggle {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: $background;\n border-color: $border;\n }\n }\n\n .badge {\n color: $background;\n background-color: $color;\n }\n}\n\n// Button sizes\n@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n padding: $padding-vertical $padding-horizontal;\n font-size: $font-size;\n line-height: $line-height;\n border-radius: $border-radius;\n}\n",
+ "// Panels\n\n@mixin panel-variant($border, $heading-text-color, $heading-bg-color, $heading-border) {\n border-color: $border;\n\n & > .panel-heading {\n color: $heading-text-color;\n background-color: $heading-bg-color;\n border-color: $heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: $border;\n }\n .badge {\n color: $heading-bg-color;\n background-color: $heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: $border;\n }\n }\n}\n",
+ "// Pagination\n\n@mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n > li {\n > a,\n > span {\n padding: $padding-vertical $padding-horizontal;\n font-size: $font-size;\n line-height: $line-height;\n }\n &:first-child {\n > a,\n > span {\n @include border-left-radius($border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n @include border-right-radius($border-radius);\n }\n }\n }\n}\n",
+ "// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n color: $color;\n background-color: $background;\n\n // [converter] extracted a&, button& to a.list-group-item-#{$state}, button.list-group-item-#{$state}\n }\n\n a.list-group-item-#{$state},\n button.list-group-item-#{$state} {\n color: $color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: $color;\n background-color: darken($background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: $color;\n border-color: $color;\n }\n }\n}\n",
+ "// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: #e5e5e5) {\n height: 1px;\n margin: (($line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: $color;\n}\n",
+ "// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n@mixin form-control-validation($text-color: #555, $border-color: #ccc, $background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline,\n &.radio label,\n &.checkbox label,\n &.radio-inline label,\n &.checkbox-inline label {\n color: $text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: $border-color;\n @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken($border-color, 10%);\n $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($border-color, 20%);\n @include box-shadow($shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: $text-color;\n border-color: $border-color;\n background-color: $background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: $text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `$input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n@mixin form-control-focus($color: $input-border-focus) {\n $color-rgba: rgba(red($color), green($color), blue($color), .6);\n &:focus {\n border-color: $color;\n outline: 0;\n @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px $color-rgba);\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. ``\n// element gets special love because it's special, and that's a fact!\n// [converter] $parent hack\n@mixin input-size($parent, $input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n #{$parent} {\n height: $input-height;\n padding: $padding-vertical $padding-horizontal;\n font-size: $font-size;\n line-height: $line-height;\n border-radius: $border-radius;\n }\n\n select#{$parent} {\n height: $input-height;\n line-height: $input-height;\n }\n\n textarea#{$parent},\n select[multiple]#{$parent} {\n height: auto;\n }\n}\n",
+ "// Progress bars\n\n@mixin progress-bar-variant($color) {\n background-color: $color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n @include gradient-striped;\n }\n}\n",
+ "// Tables\n\n@mixin table-row-variant($state, $background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested table.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.#{$state},\n > th.#{$state},\n &.#{$state} > td,\n &.#{$state} > th {\n background-color: $background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.#{$state}:hover,\n > th.#{$state}:hover,\n &.#{$state}:hover > td,\n &:hover > .#{$state},\n &.#{$state}:hover > th {\n background-color: darken($background, 5%);\n }\n }\n}\n",
+ "// Contextual backgrounds\n\n// [converter] $parent hack\n@mixin bg-variant($parent, $color) {\n #{$parent} {\n background-color: $color;\n }\n a#{$parent}:hover,\n a#{$parent}:focus {\n background-color: darken($color, 10%);\n }\n}\n",
+ "// Single side border-radius\n\n@mixin border-top-radius($radius) {\n border-top-right-radius: $radius;\n border-top-left-radius: $radius;\n}\n@mixin border-right-radius($radius) {\n border-bottom-right-radius: $radius;\n border-top-right-radius: $radius;\n}\n@mixin border-bottom-radius($radius) {\n border-bottom-right-radius: $radius;\n border-bottom-left-radius: $radius;\n}\n@mixin border-left-radius($radius) {\n border-bottom-left-radius: $radius;\n border-top-left-radius: $radius;\n}\n",
+ "// Gradients\n\n\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n// Color stops are not available in IE9 and below.\n@mixin gradient-horizontal($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Opera 12\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n// Color stops are not available in IE9 and below.\n@mixin gradient-vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, $start-color $start-percent, $end-color $end-percent); // Opera 12\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down\n}\n\n@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient($deg, $start-color, $end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient($deg, $start-color, $end-color); // Opera 12\n background-image: linear-gradient($deg, $start-color, $end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n}\n@mixin gradient-horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);\n background-image: -o-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down, gets no color-stop at all for proper fallback\n}\n@mixin gradient-vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n background-image: -webkit-linear-gradient($start-color, $mid-color $color-stop, $end-color);\n background-image: -o-linear-gradient($start-color, $mid-color $color-stop, $end-color);\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down, gets no color-stop at all for proper fallback\n}\n@mixin gradient-radial($inner-color: #555, $outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, $inner-color, $outer-color);\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {\n background-image: -webkit-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n",
+ "// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n@mixin clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n",
+ "// Center-align a block level element\n\n@mixin center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n",
+ "// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n@mixin navbar-vertical-align($element-height) {\n margin-top: (($navbar-height - $element-height) / 2);\n margin-bottom: (($navbar-height - $element-height) / 2);\n}\n",
+ "// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin make-grid-columns($i: 1, $list: \".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}\") {\n @for $i from (1 + 1) through $grid-columns {\n $list: \"#{$list}, .col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}\";\n }\n #{$list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil(($grid-gutter-width / 2));\n padding-right: floor(($grid-gutter-width / 2));\n }\n}\n\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin float-grid-columns($class, $i: 1, $list: \".col-#{$class}-#{$i}\") {\n @for $i from (1 + 1) through $grid-columns {\n $list: \"#{$list}, .col-#{$class}-#{$i}\";\n }\n #{$list} {\n float: left;\n }\n}\n\n\n@mixin calc-grid-column($index, $class, $type) {\n @if ($type == width) and ($index > 0) {\n .col-#{$class}-#{$index} {\n width: percentage(($index / $grid-columns));\n }\n }\n @if ($type == push) and ($index > 0) {\n .col-#{$class}-push-#{$index} {\n left: percentage(($index / $grid-columns));\n }\n }\n @if ($type == push) and ($index == 0) {\n .col-#{$class}-push-0 {\n left: auto;\n }\n }\n @if ($type == pull) and ($index > 0) {\n .col-#{$class}-pull-#{$index} {\n right: percentage(($index / $grid-columns));\n }\n }\n @if ($type == pull) and ($index == 0) {\n .col-#{$class}-pull-0 {\n right: auto;\n }\n }\n @if ($type == offset) {\n .col-#{$class}-offset-#{$index} {\n margin-left: percentage(($index / $grid-columns));\n }\n }\n}\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin loop-grid-columns($columns, $class, $type) {\n @for $i from 0 through $columns {\n @include calc-grid-column($i, $class, $type);\n }\n}\n\n\n// Create grid for specific class\n@mixin make-grid($class) {\n @include float-grid-columns($class);\n @include loop-grid-columns($grid-columns, $class, width);\n @include loop-grid-columns($grid-columns, $class, pull);\n @include loop-grid-columns($grid-columns, $class, push);\n @include loop-grid-columns($grid-columns, $class, offset);\n}\n",
+ "// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n@mixin container-fixed($gutter: $grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: ($gutter / 2);\n padding-right: ($gutter / 2);\n @include clearfix;\n}\n\n// Creates a wrapper for a series of columns\n@mixin make-row($gutter: $grid-gutter-width) {\n margin-left: ceil(($gutter / -2));\n margin-right: floor(($gutter / -2));\n @include clearfix;\n}\n\n// Generate the extra small columns\n@mixin make-xs-column($columns, $gutter: $grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage(($columns / $grid-columns));\n min-height: 1px;\n padding-left: ($gutter / 2);\n padding-right: ($gutter / 2);\n}\n@mixin make-xs-column-offset($columns) {\n margin-left: percentage(($columns / $grid-columns));\n}\n@mixin make-xs-column-push($columns) {\n left: percentage(($columns / $grid-columns));\n}\n@mixin make-xs-column-pull($columns) {\n right: percentage(($columns / $grid-columns));\n}\n\n// Generate the small columns\n@mixin make-sm-column($columns, $gutter: $grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: ($gutter / 2);\n padding-right: ($gutter / 2);\n\n @media (min-width: $screen-sm-min) {\n float: left;\n width: percentage(($columns / $grid-columns));\n }\n}\n@mixin make-sm-column-offset($columns) {\n @media (min-width: $screen-sm-min) {\n margin-left: percentage(($columns / $grid-columns));\n }\n}\n@mixin make-sm-column-push($columns) {\n @media (min-width: $screen-sm-min) {\n left: percentage(($columns / $grid-columns));\n }\n}\n@mixin make-sm-column-pull($columns) {\n @media (min-width: $screen-sm-min) {\n right: percentage(($columns / $grid-columns));\n }\n}\n\n// Generate the medium columns\n@mixin make-md-column($columns, $gutter: $grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: ($gutter / 2);\n padding-right: ($gutter / 2);\n\n @media (min-width: $screen-md-min) {\n float: left;\n width: percentage(($columns / $grid-columns));\n }\n}\n@mixin make-md-column-offset($columns) {\n @media (min-width: $screen-md-min) {\n margin-left: percentage(($columns / $grid-columns));\n }\n}\n@mixin make-md-column-push($columns) {\n @media (min-width: $screen-md-min) {\n left: percentage(($columns / $grid-columns));\n }\n}\n@mixin make-md-column-pull($columns) {\n @media (min-width: $screen-md-min) {\n right: percentage(($columns / $grid-columns));\n }\n}\n\n// Generate the large columns\n@mixin make-lg-column($columns, $gutter: $grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: ($gutter / 2);\n padding-right: ($gutter / 2);\n\n @media (min-width: $screen-lg-min) {\n float: left;\n width: percentage(($columns / $grid-columns));\n }\n}\n@mixin make-lg-column-offset($columns) {\n @media (min-width: $screen-lg-min) {\n margin-left: percentage(($columns / $grid-columns));\n }\n}\n@mixin make-lg-column-push($columns) {\n @media (min-width: $screen-lg-min) {\n left: percentage(($columns / $grid-columns));\n }\n}\n@mixin make-lg-column-pull($columns) {\n @media (min-width: $screen-lg-min) {\n right: percentage(($columns / $grid-columns));\n }\n}\n",
+ "/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n",
+ "/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n",
+ "//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n @include box-sizing(border-box);\n}\n*:before,\n*:after {\n @include box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: $font-family-base;\n font-size: $font-size-base;\n line-height: $line-height-base;\n color: $text-color;\n background-color: $body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n\n &:focus {\n @include tab-focus;\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n @include img-responsive;\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: $border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: $thumbnail-padding;\n line-height: $line-height-base;\n background-color: $thumbnail-bg;\n border: 1px solid $thumbnail-border;\n border-radius: $thumbnail-border-radius;\n @include transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n @include img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: $line-height-computed;\n margin-bottom: $line-height-computed;\n border: 0;\n border-top: 1px solid $hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n",
+ "//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: $headings-font-family;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: $headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: $line-height-computed;\n margin-bottom: ($line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: ($line-height-computed / 2);\n margin-bottom: ($line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: $font-size-h1; }\nh2, .h2 { font-size: $font-size-h2; }\nh3, .h3 { font-size: $font-size-h3; }\nh4, .h4 { font-size: $font-size-h4; }\nh5, .h5 { font-size: $font-size-h5; }\nh6, .h6 { font-size: $font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 ($line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: $line-height-computed;\n font-size: floor(($font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: $screen-sm-min) {\n font-size: ($font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * $font-size-small / $font-size-base));\n}\n\nmark,\n.mark {\n background-color: $state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: $text-muted;\n}\n\n@include text-emphasis-variant('.text-primary', $brand-primary);\n\n@include text-emphasis-variant('.text-success', $state-success-text);\n\n@include text-emphasis-variant('.text-info', $state-info-text);\n\n@include text-emphasis-variant('.text-warning', $state-warning-text);\n\n@include text-emphasis-variant('.text-danger', $state-danger-text);\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n}\n@include bg-variant('.bg-primary', $brand-primary);\n\n@include bg-variant('.bg-success', $state-success-bg);\n\n@include bg-variant('.bg-info', $state-info-bg);\n\n@include bg-variant('.bg-warning', $state-warning-bg);\n\n@include bg-variant('.bg-danger', $state-danger-bg);\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: (($line-height-computed / 2) - 1);\n margin: ($line-height-computed * 2) 0 $line-height-computed;\n border-bottom: 1px solid $page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: ($line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// [converter] extracted from `.list-unstyled` for libsass compatibility\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n// [converter] extracted as `@mixin list-unstyled` for libsass compatibility\n.list-unstyled {\n @include list-unstyled;\n}\n\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled;\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: $line-height-computed;\n}\ndt,\ndd {\n line-height: $line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n @include clearfix; // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: $grid-float-breakpoint) {\n dt {\n float: left;\n width: ($dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n @include text-overflow;\n }\n dd {\n margin-left: $dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted $abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n @extend .text-uppercase;\n}\n\n// Blockquotes\nblockquote {\n padding: ($line-height-computed / 2) $line-height-computed;\n margin: 0 0 $line-height-computed;\n font-size: $blockquote-font-size;\n border-left: 5px solid $blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: $line-height-base;\n color: $blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid $blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: $line-height-computed;\n font-style: normal;\n line-height: $line-height-base;\n}\n",
+ "//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: $font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: $code-color;\n background-color: $code-bg;\n border-radius: $border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: $kbd-color;\n background-color: $kbd-bg;\n border-radius: $border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: (($line-height-computed - 1) / 2);\n margin: 0 0 ($line-height-computed / 2);\n font-size: ($font-size-base - 1); // 14px to 13px\n line-height: $line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: $pre-color;\n background-color: $pre-bg;\n border: 1px solid $pre-border-color;\n border-radius: $border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: $pre-scrollable-max-height;\n overflow-y: scroll;\n}\n",
+ "//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: $table-bg;\n}\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: $line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: $table-cell-padding;\n line-height: $line-height-base;\n vertical-align: top;\n border-top: 1px solid $table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid $table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid $table-border-color;\n }\n\n // Nesting\n .table {\n background-color: $body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: $table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid $table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid $table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: $table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: $table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested table.\n\n// Generate the contextual variants\n@include table-row-variant('active', $table-bg-active);\n@include table-row-variant('success', $state-success-bg);\n@include table-row-variant('info', $state-info-bg);\n@include table-row-variant('warning', $state-warning-bg);\n@include table-row-variant('danger', $state-danger-bg);\n\n\n// Responsive table\n//\n// Wrap your table in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: $screen-xs-max) {\n width: 100%;\n margin-bottom: ($line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid $table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered table\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n",
+ "//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: $line-height-computed;\n font-size: ($font-size-base * 1.5);\n line-height: inherit;\n color: $legend-color;\n border: 0;\n border-bottom: 1px solid $legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n @include box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n @include tab-focus;\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: ($padding-base-vertical + 1);\n font-size: $font-size-base;\n line-height: $line-height-base;\n color: $input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: $padding-base-vertical $padding-base-horizontal;\n font-size: $font-size-base;\n line-height: $line-height-base;\n color: $input-color;\n background-color: $input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid $input-border;\n border-radius: $input-border-radius; // Note: This has no effect on s in some browsers, due to the limited stylability of s in CSS.\n @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);\n\n // Customize the `:focus` state to imitate native WebKit styles.\n @include form-control-focus;\n\n // Placeholder\n @include placeholder;\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n background-color: $input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n }\n\n &[disabled],\n fieldset[disabled] & {\n cursor: $cursor-disabled;\n }\n\n // [converter] extracted textarea& to textarea.form-control\n}\n\n// Reset height for `textarea`s\ntextarea.form-control {\n height: auto;\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n//\n// Note that as of 8.3, iOS doesn't support `datetime` or `week`.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n &.form-control {\n line-height: $input-height-base;\n }\n\n &.input-sm,\n .input-group-sm & {\n line-height: $input-height-small;\n }\n\n &.input-lg,\n .input-group-lg & {\n line-height: $input-height-large;\n }\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: $form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: $line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: $cursor-disabled;\n }\n}\n// These classes are used directly on s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: $cursor-disabled;\n }\n}\n// These classes are used on elements with descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: $cursor-disabled;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: ($padding-base-vertical + 1);\n padding-bottom: ($padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n min-height: ($line-height-computed + $font-size-base);\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n@include input-size('.input-sm', $input-height-small, $padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $input-border-radius-small);\n.form-group-sm {\n .form-control {\n height: $input-height-small;\n padding: $padding-small-vertical $padding-small-horizontal;\n font-size: $font-size-small;\n line-height: $line-height-small;\n border-radius: $input-border-radius-small;\n }\n select.form-control {\n height: $input-height-small;\n line-height: $input-height-small;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: $input-height-small;\n min-height: ($line-height-computed + $font-size-small);\n padding: ($padding-small-vertical + 1) $padding-small-horizontal;\n font-size: $font-size-small;\n line-height: $line-height-small;\n }\n}\n\n@include input-size('.input-lg', $input-height-large, $padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $input-border-radius-large);\n.form-group-lg {\n .form-control {\n height: $input-height-large;\n padding: $padding-large-vertical $padding-large-horizontal;\n font-size: $font-size-large;\n line-height: $line-height-large;\n border-radius: $input-border-radius-large;\n }\n select.form-control {\n height: $input-height-large;\n line-height: $input-height-large;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: $input-height-large;\n min-height: ($line-height-computed + $font-size-large);\n padding: ($padding-large-vertical + 1) $padding-large-horizontal;\n font-size: $font-size-large;\n line-height: $line-height-large;\n }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: ($input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: $input-height-base;\n height: $input-height-base;\n line-height: $input-height-base;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: $input-height-large;\n height: $input-height-large;\n line-height: $input-height-large;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: $input-height-small;\n height: $input-height-small;\n line-height: $input-height-small;\n}\n\n// Feedback states\n.has-success {\n @include form-control-validation($state-success-text, $state-success-text, $state-success-bg);\n}\n.has-warning {\n @include form-control-validation($state-warning-text, $state-warning-text, $state-warning-bg);\n}\n.has-error {\n @include form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n & ~ .form-control-feedback {\n top: ($line-height-computed + 5); // Height of the `label` and its margin\n }\n &.sr-only ~ .form-control-feedback {\n top: 0;\n }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten($text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n// [converter] extracted from `.form-inline` for libsass compatibility\n@mixin form-inline {\n\n // Kick in the inline\n @media (min-width: $screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-static {\n display: inline-block;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Re-override the feedback icon.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n// [converter] extracted as `@mixin form-inline` for libsass compatibility\n.form-inline {\n @include form-inline;\n}\n\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: ($padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: ($line-height-computed + ($padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n @include make-row;\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: $screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: ($padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n right: floor(($grid-gutter-width / 2));\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: $screen-sm-min) {\n .control-label {\n padding-top: (($padding-large-vertical * $line-height-large) + 1);\n font-size: $font-size-large;\n }\n }\n }\n .form-group-sm {\n @media (min-width: $screen-sm-min) {\n .control-label {\n padding-top: ($padding-small-vertical + 1);\n font-size: $font-size-small;\n }\n }\n }\n}\n",
+ "//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: $btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $btn-border-radius-base);\n @include user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n @include tab-focus;\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: $btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: $cursor-disabled;\n @include opacity(.65);\n @include box-shadow(none);\n }\n\n // [converter] extracted a& to a.btn\n}\n\na.btn {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `` elements\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border);\n}\n.btn-primary {\n @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: $link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n @include box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: $btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);\n}\n.btn-xs {\n @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n",
+ "//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal;\n margin-bottom: $line-height-computed;\n list-style: none;\n background-color: $breadcrumb-bg;\n border-radius: $border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"#{$breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: $breadcrumb-color;\n }\n }\n\n > .active {\n color: $breadcrumb-active-color;\n }\n}\n",
+ "//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: $line-height-computed 0;\n border-radius: $border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: $padding-base-vertical $padding-base-horizontal;\n line-height: $line-height-base;\n text-decoration: none;\n color: $pagination-color;\n background-color: $pagination-bg;\n border: 1px solid $pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n @include border-left-radius($border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n @include border-right-radius($border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 3;\n color: $pagination-hover-color;\n background-color: $pagination-hover-bg;\n border-color: $pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 2;\n color: $pagination-active-color;\n background-color: $pagination-active-bg;\n border-color: $pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: $pagination-disabled-color;\n background-color: $pagination-disabled-bg;\n border-color: $pagination-disabled-border;\n cursor: $cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n @include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);\n}\n\n// Small\n.pagination-sm {\n @include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);\n}\n",
+ "//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: $label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // [converter] extracted a& to a.label\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Add hover effects, but only for links\na.label {\n &:hover,\n &:focus {\n color: $label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n @include label-variant($label-default-bg);\n}\n\n.label-primary {\n @include label-variant($label-primary-bg);\n}\n\n.label-success {\n @include label-variant($label-success-bg);\n}\n\n.label-info {\n @include label-variant($label-info-bg);\n}\n\n.label-warning {\n @include label-variant($label-warning-bg);\n}\n\n.label-danger {\n @include label-variant($label-danger-bg);\n}\n",
+ "//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: $font-size-small;\n font-weight: $badge-font-weight;\n color: $badge-color;\n line-height: $badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: $badge-bg;\n border-radius: $badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // [converter] extracted a& to a.badge\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: $badge-active-color;\n background-color: $badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n\n// Hover state, but only for links\na.badge {\n &:hover,\n &:focus {\n color: $badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n}\n",
+ "//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: $alert-padding;\n margin-bottom: $line-height-computed;\n border: 1px solid transparent;\n border-radius: $alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing $headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: $alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: ($alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);\n}\n\n.alert-info {\n @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);\n}\n\n.alert-warning {\n @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);\n}\n\n.alert-danger {\n @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);\n}\n",
+ "//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: ($font-size-base * 1.5);\n font-weight: $close-font-weight;\n line-height: 1;\n color: $close-color;\n text-shadow: $close-text-shadow;\n @include opacity(.2);\n\n &:hover,\n &:focus {\n color: $close-color;\n text-decoration: none;\n cursor: pointer;\n @include opacity(.5);\n }\n\n // [converter] extracted button& to button.close\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n",
+ "//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n @include clearfix;\n}\n.center-block {\n @include center-block;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n @include text-hide;\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n",
+ "@import 'ember-power-select/variables';\n\n// Configure ember-basic-dropdown\n$ember-basic-dropdown-content-background-color: $ember-power-select-background-color;\n\n@import 'ember-basic-dropdown';\n\n.ember-power-select {\n position: relative;\n}\n.ember-power-select *, .ember-power-select-dropdown * {\n box-sizing: border-box;\n}\n\n// Trigger\n.ember-power-select-trigger {\n border: $ember-power-select-trigger-border;\n border-radius: $ember-power-select-trigger-default-border-radius;\n background-color: $ember-power-select-background-color;\n line-height: $ember-power-select-line-height;\n text-overflow: ellipsis;\n min-height: #{$ember-power-select-line-height}em;\n user-select: none;\n -webkit-user-select: none;\n color: $ember-power-select-text-color;\n &:focus {\n border: $ember-power-select-trigger-focus-border;\n box-shadow: $ember-power-select-focus-box-shadow;\n @if $ember-power-select-focus-outline {\n outline: $ember-power-select-focus-outline;\n }\n }\n .ember-power-select.multiple & { height: auto; }\n .ember-power-select:not(.multiple) & { white-space: nowrap; }\n .ember-basic-dropdown--opened.ember-basic-dropdown--below &, .ember-basic-dropdown--opened.ember-basic-dropdown--in-place & {\n border-bottom-left-radius: $ember-power-select-opened-border-radius;\n border-bottom-right-radius: $ember-power-select-opened-border-radius;\n }\n .ember-basic-dropdown--opened.ember-basic-dropdown--above & {\n border-top-left-radius: $ember-power-select-opened-border-radius;\n border-top-right-radius: $ember-power-select-opened-border-radius;\n }\n}\n.ember-power-select-placeholder {\n color: $ember-power-select-placeholder-color;\n}\n.ember-power-select-status-icon {\n position: absolute;\n display: inline-block;\n width: 0; height: 0; top: 0; bottom: 0; margin: auto; // Vertical center trick!\n border-style: solid;\n border-width: 7px 4px 0 4px;\n border-color: $ember-power-select-trigger-icon-color transparent transparent transparent;\n .ember-basic-dropdown--opened & {\n transform: rotate(180deg);\n }\n}\n.ember-power-select-clear-btn {\n position: absolute;\n cursor: pointer;\n}\n\n// Multiple select\n.ember-power-select-trigger-multiple-input {\n font-family: inherit;\n font-size: inherit;\n width: 25px;\n border: none;\n display: inline-block;\n line-height: inherit;\n -webkit-appearance: none;\n outline: none;\n padding: 0;\n &:disabled {\n background-color: $ember-power-select-disabled-background-color;\n }\n}\n.ember-power-select-multiple-option {\n border: 1px solid gray;\n border-radius: $ember-power-select-multiple-option-border-radius;\n color: $ember-power-select-multiple-selection-color;\n background-color: $ember-power-select-multiple-selection-background-color;\n padding: 0 4px;\n display: inline-block;\n line-height: 1.5;\n margin: 2px 0;\n}\n.ember-power-select-multiple-remove-btn {\n cursor: pointer;\n &:not(:hover) { opacity: 0.5; }\n}\n// Search bar\n.ember-power-select-search {\n padding: 4px;\n input {\n border: $ember-power-select-search-field-border;\n border-radius: $ember-power-select-search-input-border-radius;\n width: 100%;\n font-size: inherit;\n line-height: inherit;\n padding: 0 5px;\n &:focus {\n border: 1px solid $ember-power-select-focus-border-color;\n box-shadow: $ember-power-select-focus-box-shadow;\n @if $ember-power-select-focus-outline {\n outline: $ember-power-select-focus-outline;\n }\n }\n }\n}\n\n// Dropdown\n.ember-power-select-dropdown {\n width: 100%;\n border-left: $ember-power-select-dropdown-left-border;\n border-right: $ember-power-select-dropdown-right-border;\n line-height: $ember-power-select-line-height;\n border-radius: $ember-power-select-dropdown-default-border-radius;\n box-shadow: $ember-power-select-dropdown-box-shadow;\n overflow: hidden;\n color: $ember-power-select-text-color;\n &.ember-basic-dropdown--above {\n @if ($ember-power-select-dropdown-margin > 0) {\n transform: translateY(-#{$ember-power-select-dropdown-margin});\n }\n border-top: $ember-power-select-dropdown-top-border;\n border-bottom: $ember-power-select-dropdown-contiguous-border;\n border-bottom-left-radius: $ember-power-select-opened-border-radius;\n border-bottom-right-radius: $ember-power-select-opened-border-radius;\n }\n &.ember-basic-dropdown--below, .ember-basic-dropdown--in-place & {\n @if ($ember-power-select-dropdown-margin > 0) {\n transform: translateY(#{$ember-power-select-dropdown-margin});\n }\n border-top: $ember-power-select-dropdown-contiguous-border;\n border-bottom: $ember-power-select-dropdown-bottom-border;\n border-top-left-radius: $ember-power-select-opened-border-radius;\n border-top-right-radius: $ember-power-select-opened-border-radius;\n }\n}\n.ember-power-select-options {\n list-style: none;\n margin: 0;\n padding: 0;\n user-select: none;\n -webkit-user-select: none;\n &:not(.ember-power-select-options--nested) {\n overflow-y: auto;\n max-height: #{$ember-power-select-number-of-visible-options * $ember-power-select-line-height}em;\n }\n}\n\n.ember-power-select-option {\n cursor: pointer;\n padding: 0 $ember-power-select-option-padding;\n}\n.ember-power-select-option--disabled {\n color: $ember-power-select-disabled-option-color;\n pointer-events: none;\n}\n.ember-power-select-option--selected { background-color: $ember-power-select-selected-background; }\n.ember-power-select-option--highlighted {\n background-color: $ember-power-select-highlighted-background;\n color: $ember-power-select-highlighted-color;\n}\n\n// Groups\n.ember-power-select-group-name {\n cursor: default;\n font-weight: bold;\n}\n\n// Disabled styles\n.ember-power-select.ember-basic-dropdown--disabled {\n .ember-power-select-trigger {\n background-color: $ember-power-select-disabled-background-color;\n }\n}\n\n// LTR styles\n.ember-power-select-trigger {\n padding: 0 16px 0 8px;\n}\n.ember-power-select-status-icon {\n right: 5px;\n}\n.ember-power-select-clear-btn {\n right: $ember-power-select-clear-btn-margin;\n}\n\n.ember-power-select-group {\n .ember-power-select-group {\n .ember-power-select-group-name { padding-left: 3 * $ember-power-select-option-padding; }\n .ember-power-select-option { padding-left: 5 * $ember-power-select-option-padding; }\n }\n .ember-power-select-option { padding-left: 3 * $ember-power-select-option-padding; }\n .ember-power-select-group-name { padding-left: $ember-power-select-option-padding; }\n}\n\n// RTL styles\n.ember-power-select[dir=rtl] {\n .ember-power-select-trigger {\n padding: 0 8px 0 16px;\n }\n .ember-power-select-status-icon {\n left: 5px;\n right: initial;\n }\n .ember-power-select-clear-btn {\n left: $ember-power-select-clear-btn-margin;\n right: initial;\n }\n}\n\n.ember-power-select-dropdown[dir=rtl] {\n .ember-power-select-group {\n .ember-power-select-group {\n .ember-power-select-group-name { padding-right: 3 * $ember-power-select-option-padding; }\n .ember-power-select-option { padding-right: 5 * $ember-power-select-option-padding; }\n }\n .ember-power-select-option { padding-right: 3 * $ember-power-select-option-padding; }\n .ember-power-select-group-name { padding-right: $ember-power-select-option-padding; }\n }\n}\n",
+ "// Variables\n\n// Backgrounds\n$ember-power-select-background-color: #ffffff !default;\n$ember-power-select-disabled-background-color: #eeeeee !default;\n$ember-power-select-multiple-selection-background-color: #e4e4e4 !default;\n$ember-power-select-highlighted-background: #5897fb !default;\n$ember-power-select-selected-background: #dddddd !default;\n\n// Texts\n$ember-power-select-text-color: inherit !default;\n$ember-power-select-placeholder-color: #999999 !default;\n$ember-power-select-disabled-option-color: #999999 !default;\n$ember-power-select-multiple-selection-color: #333333 !default;\n\n// Borders\n$ember-power-select-border-color: #aaaaaa !default;\n$ember-power-select-focus-border-color: $ember-power-select-border-color !default;\n$ember-power-select-default-border: 1px solid $ember-power-select-border-color !default;\n$ember-power-select-default-focus-border: 1px solid $ember-power-select-focus-border-color !default;\n\n$ember-power-select-trigger-border: $ember-power-select-default-border !default;\n$ember-power-select-trigger-focus-border: $ember-power-select-default-focus-border !default;\n$ember-power-select-dropdown-border: $ember-power-select-default-border !default;\n$ember-power-select-search-field-border: $ember-power-select-default-border !default;\n\n$ember-power-select-dropdown-top-border: $ember-power-select-dropdown-border !default;\n$ember-power-select-dropdown-right-border: $ember-power-select-dropdown-border !default;\n$ember-power-select-dropdown-bottom-border: $ember-power-select-dropdown-border !default;\n$ember-power-select-dropdown-left-border: $ember-power-select-dropdown-border !default;\n\n$ember-power-select-dropdown-contiguous-border: none !default;\n\n// Borders radius\n$ember-power-select-default-border-radius: 4px !default; // General border radius\n$ember-power-select-trigger-default-border-radius: $ember-power-select-default-border-radius !default;\n$ember-power-select-dropdown-default-border-radius: $ember-power-select-default-border-radius !default;\n\n$ember-power-select-opened-border-radius: 0 !default; // Border radious of the side of the dropdown and the trigger where they touch\n\n$ember-power-select-search-input-border-radius: 0 !default;\n$ember-power-select-multiple-option-border-radius: $ember-power-select-default-border-radius !default;\n\n// Other\n$ember-power-select-focus-box-shadow: none !default;\n$ember-power-select-dropdown-margin: 0 !default; // Margin between the dropdown and the trigger\n$ember-power-select-dropdown-box-shadow: none !default;\n$ember-power-select-highlighted-color: #ffffff !default;\n$ember-power-select-line-height: 1.75 !default;\n$ember-power-select-trigger-icon-color: $ember-power-select-border-color !default;\n$ember-power-select-clear-btn-margin: 25px !default;\n$ember-power-select-option-padding: 8px !default;\n$ember-power-select-number-of-visible-options: 7;\n$ember-power-select-focus-outline: null !default;",
+ "$ember-basic-dropdown-content-background-color: #FFF !default;\n$ember-basic-dropdown-content-z-index: 1000 !default;\n\n.ember-basic-dropdown {\n position: relative;\n}\n.ember-basic-dropdown, .ember-basic-dropdown *, .ember-basic-dropdown-content, .ember-basic-dropdown-content * {\n box-sizing: border-box;\n}\n\n.ember-basic-dropdown-content {\n position: absolute;\n width: auto;\n z-index: $ember-basic-dropdown-content-z-index;\n background-color: $ember-basic-dropdown-content-background-color;\n}",
+ ".ember-modal-overlay {\n height: 100vh;\n left: 0;\n position: fixed;\n right: 0;\n top: 0;\n z-index: 50;\n}\n.ember-modal-dialog {\n z-index: 50;\n position: fixed;\n\n &.ember-modal-dialog-in-place {\n position: relative;\n }\n}\n",
+ ".ember-modal-dialog {\n border-radius: 8px;\n background-color: #fff;\n box-shadow: 0 0 10px #222;\n padding: 10px;\n}\n.ember-modal-overlay.translucent {\n background-color: rgba(#808080, .77);\n}\n",
+ "/*** Colors ***/\n$branding-color-1: #E67716; // Orange\n$branding-color-2: #79AFB7; // Teal\n$branding-color-3: #A92A0E; // Red\n$branding-color-4: #B69174; // Light Brown\n$branding-color-5: #474747; // Dark grey\n\n$grayscale-color-white: #FFFFFF;\n$grayscale-color-x-light: #E4E4E4;\n$grayscale-color-light: #999999;\n$grayscale-color-medium: #767676;\n$grayscale-color-dark: #333333;\n$grayscale-color-x-dark: #111111;\n\n$color-accent-percentage-small: 10%;\n$color-accent-percentage-large: 20%;\n\n/*** Layout ***/\n$topbar-panel-height: 70px;\n$sidebar-panel-width: 250px;\n",
+ "@import \"../../../vendor/sass-flex-mixin/flexbox\";\n\n@mixin border-radius($radius) {\n -webkit-border-radius: $radius;\n -moz-border-radius: $radius;\n -ms-border-radius: $radius;\n border-radius: $radius;\n background-clip: padding-box;\n}\n\n@mixin border-top-radius($radius) {\n -webkit-border-top-right-radius: $radius;\n border-top-right-radius: $radius;\n -webkit-border-top-left-radius: $radius;\n border-top-left-radius: $radius;\n background-clip: padding-box;\n}\n\n@mixin border-right-radius($radius) {\n -webkit-border-bottom-right-radius: $radius;\n border-bottom-right-radius: $radius;\n -webkit-border-top-right-radius: $radius;\n border-top-right-radius: $radius;\n background-clip: padding-box;\n}\n\n@mixin border-bottom-radius($radius) {\n -webkit-border-bottom-right-radius: $radius;\n border-bottom-right-radius: $radius;\n -webkit-border-bottom-left-radius: $radius;\n border-bottom-left-radius: $radius;\n background-clip: padding-box;\n}\n\n@mixin border-left-radius($radius) {\n -webkit-border-bottom-left-radius: $radius;\n border-bottom-left-radius: $radius;\n -webkit-border-top-left-radius: $radius;\n border-top-left-radius: $radius;\n background-clip: padding-box;\n}\n\n@mixin inner-shadow($color) {\n -webkit-box-shadow: inset 0 1px 1px $color;\n -moz-box-shadow: inset 0 1px 1px $color;\n box-shadow: inset 0 1px 1px $color;\n}\n\n@mixin text-shadow($hex) {\n text-shadow: 0 1px 0 $hex;\n}\n\n@mixin dark-background-font {\n @include text-shadow(#000);\n color: lighten($grayscale-color-light, $color-accent-percentage-large);\n}\n\n@mixin light-background-strong-font {\n @include text-shadow(#FFF);\n color: lighten($grayscale-color-dark, $color-accent-percentage-large);\n}\n",
+ "// Flexbox Mixins\n// http://philipwalton.github.io/solved-by-flexbox/\n// https://github.com/philipwalton/solved-by-flexbox\n// \n// Copyright (c) 2013 Brian Franco\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to\n// the following conditions:\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n// This is a set of mixins for those who want to mess around with flexbox\n// using the native support of current browsers. For full support table\n// check: http://caniuse.com/flexbox\n//\n// Basically this will use:\n//\n// * Fallback, old syntax (IE10, mobile webkit browsers - no wrapping)\n// * Final standards syntax (FF, Safari, Chrome, IE11, Opera)\n//\n// This was inspired by:\n// \n// * http://dev.opera.com/articles/view/advanced-cross-browser-flexbox/\n// \n// With help from:\n// \n// * http://w3.org/tr/css3-flexbox/\n// * http://the-echoplex.net/flexyboxes/\n// * http://msdn.microsoft.com/en-us/library/ie/hh772069(v=vs.85).aspx\n// * http://css-tricks.com/using-flexbox/\n// * http://dev.opera.com/articles/view/advanced-cross-browser-flexbox/\n// * https://developer.mozilla.org/en-us/docs/web/guide/css/flexible_boxes\n\n//----------------------------------------------------------------------\n\n// Flexbox Containers\n//\n// The 'flex' value causes an element to generate a block-level flex\n// container box.\n//\n// The 'inline-flex' value causes an element to generate a inline-level\n// flex container box. \n//\n// display: flex | inline-flex\n//\n// http://w3.org/tr/css3-flexbox/#flex-containers\n//\n// (Placeholder selectors for each type, for those who rather @extend)\n\n@mixin flexbox {\n\tdisplay: -webkit-box;\n\tdisplay: -webkit-flex;\n\tdisplay: -moz-flex;\n\tdisplay: -ms-flexbox;\n\tdisplay: flex;\n}\n\n%flexbox { @include flexbox; }\n\n//----------------------------------\n\n@mixin inline-flex {\n\tdisplay: -webkit-inline-box;\n\tdisplay: -webkit-inline-flex;\n\tdisplay: -moz-inline-flex;\n\tdisplay: -ms-inline-flexbox;\n\tdisplay: inline-flex;\n}\n\n%inline-flex { @include inline-flex; }\n\n//----------------------------------------------------------------------\n\n// Flexbox Direction\n//\n// The 'flex-direction' property specifies how flex items are placed in\n// the flex container, by setting the direction of the flex container's\n// main axis. This determines the direction that flex items are laid out in. \n//\n// Values: row | row-reverse | column | column-reverse\n// Default: row\n//\n// http://w3.org/tr/css3-flexbox/#flex-direction-property\n\n@mixin flex-direction($value: row) {\n\t@if $value == row-reverse {\n\t\t-webkit-box-direction: reverse;\n\t\t-webkit-box-orient: horizontal;\n\t} @else if $value == column {\n\t\t-webkit-box-direction: normal;\n\t\t-webkit-box-orient: vertical;\n\t} @else if $value == column-reverse {\n\t\t-webkit-box-direction: reverse;\n\t\t-webkit-box-orient: vertical;\n\t} @else {\n\t\t-webkit-box-direction: normal;\n\t\t-webkit-box-orient: horizontal;\n\t}\n\t-webkit-flex-direction: $value;\n\t-moz-flex-direction: $value;\n\t-ms-flex-direction: $value;\n\tflex-direction: $value;\n}\n\t// Shorter version:\n\t@mixin flex-dir($args...) { @include flex-direction($args...); }\n\n//----------------------------------------------------------------------\n\n// Flexbox Wrap\n//\n// The 'flex-wrap' property controls whether the flex container is single-line\n// or multi-line, and the direction of the cross-axis, which determines\n// the direction new lines are stacked in. \n//\n// Values: nowrap | wrap | wrap-reverse\n// Default: nowrap\n//\n// http://w3.org/tr/css3-flexbox/#flex-wrap-property\n\n@mixin flex-wrap($value: nowrap) {\n\t// No Webkit Box fallback.\n\t-webkit-flex-wrap: $value;\n\t-moz-flex-wrap: $value;\n\t@if $value == nowrap {\n\t\t-ms-flex-wrap: none;\n\t} @else { \n\t\t-ms-flex-wrap: $value; \n\t}\n\tflex-wrap: $value;\n}\n\n//----------------------------------------------------------------------\n\n// Flexbox Flow (shorthand)\n//\n// The 'flex-flow' property is a shorthand for setting the 'flex-direction'\n// and 'flex-wrap' properties, which together define the flex container's\n// main and cross axes.\n//\n// Values: | \n// Default: row nowrap\n//\n// http://w3.org/tr/css3-flexbox/#flex-flow-property\n\n@mixin flex-flow($values: (row nowrap)) {\n\t// No Webkit Box fallback.\n\t-webkit-flex-flow: $values;\n\t-moz-flex-flow: $values;\n\t-ms-flex-flow: $values;\n\tflex-flow: $values;\n}\n\n//----------------------------------------------------------------------\n\n// Flexbox Order\n//\n// The 'order' property controls the order in which flex items appear within\n// their flex container, by assigning them to ordinal groups.\n//\n// Default: 0\n//\n// http://w3.org/tr/css3-flexbox/#order-property\n\n@mixin order($int: 0) {\n\t-webkit-box-ordinal-group: $int + 1;\n\t-webkit-order: $int;\n\t-moz-order: $int;\n\t-ms-flex-order: $int;\n\torder: $int;\n}\n\n//----------------------------------------------------------------------\n\n// Flexbox Grow\n//\n// The 'flex-grow' property sets the flex grow factor. Negative numbers\n// are invalid.\n//\n// Default: 0\n//\n// http://w3.org/tr/css3-flexbox/#flex-grow-property\n\n@mixin flex-grow($int: 0) {\n\t-webkit-box-flex: $int;\n\t-webkit-flex-grow: $int;\n\t-moz-flex-grow: $int;\n\t-ms-flex-positive: $int;\n\tflex-grow: $int;\n}\n\n//----------------------------------------------------------------------\n\n// Flexbox Shrink\n//\n// The 'flex-shrink' property sets the flex shrink factor. Negative numbers\n// are invalid.\n//\n// Default: 1\n//\n// http://w3.org/tr/css3-flexbox/#flex-shrink-property\n\n@mixin flex-shrink($int: 1) {\n\t-webkit-flex-shrink: $int;\n\t-moz-flex-shrink: $int;\n\t-ms-flex-negative: $int;\n\tflex-shrink: $int;\n}\n\n//----------------------------------------------------------------------\n\n// Flexbox Basis\n//\n// The 'flex-basis' property sets the flex basis. Negative lengths are invalid. \n//\n// Values: Like \"width\" \n// Default: auto\n//\n// http://www.w3.org/TR/css3-flexbox/#flex-basis-property\n\n@mixin flex-basis($value: auto) {\n\t-webkit-flex-basis: $value;\n\t-moz-flex-basis: $value;\n\t-ms-flex-preferred-size: $value;\n\tflex-basis: $value;\n}\n\n//----------------------------------------------------------------------\n\n// Flexbox \"Flex\" (shorthand)\n//\n// The 'flex' property specifies the components of a flexible length: the\n// flex grow factor and flex shrink factor, and the flex basis. When an\n// element is a flex item, 'flex' is consulted instead of the main size\n// property to determine the main size of the element. If an element is\n// not a flex item, 'flex' has no effect.\n//\n// Values: none | || \n// Default: See individual properties (1 1 0).\n//\n// http://w3.org/tr/css3-flexbox/#flex-property\n\n@mixin flex($fg: 1, $fs: null, $fb: null) {\n \n\t// Set a variable to be used by box-flex properties\n\t$fg-boxflex: $fg;\n\n\t// Box-Flex only supports a flex-grow value so let's grab the\n\t// first item in the list and just return that.\n\t@if type-of($fg) == 'list' {\n\t\t$fg-boxflex: nth($fg, 1);\n\t}\n\n\t-webkit-box-flex: $fg-boxflex;\n\t-webkit-flex: $fg $fs $fb;\n\t-moz-box-flex: $fg-boxflex;\n\t-moz-flex: $fg $fs $fb;\n\t-ms-flex: $fg $fs $fb;\n\tflex: $fg $fs $fb;\n}\n\n//----------------------------------------------------------------------\n\n// Flexbox Justify Content\n//\n// The 'justify-content' property aligns flex items along the main axis\n// of the current line of the flex container. This is done after any flexible\n// lengths and any auto margins have been resolved. Typically it helps distribute\n// extra free space leftover when either all the flex items on a line are\n// inflexible, or are flexible but have reached their maximum size. It also\n// exerts some control over the alignment of items when they overflow the line.\n//\n// Note: 'space-*' values not supported in older syntaxes.\n//\n// Values: flex-start | flex-end | center | space-between | space-around\n// Default: flex-start\n//\n// http://w3.org/tr/css3-flexbox/#justify-content-property\n\n@mixin justify-content($value: flex-start) {\n\t@if $value == flex-start {\n\t\t-webkit-box-pack: start;\n\t\t-ms-flex-pack: start;\n\t} @else if $value == flex-end {\n\t\t-webkit-box-pack: end;\n\t\t-ms-flex-pack: end;\n\t} @else if $value == space-between {\n\t\t-webkit-box-pack: justify;\n\t\t-ms-flex-pack: justify;\n\t} @else if $value == space-around {\n\t\t-ms-flex-pack: distribute;\t\t\n\t} @else {\n\t\t-webkit-box-pack: $value;\n\t\t-ms-flex-pack: $value;\n\t}\n\t-webkit-justify-content: $value;\n\t-moz-justify-content: $value;\n\tjustify-content: $value;\n}\n\t// Shorter version:\n\t@mixin flex-just($args...) { @include justify-content($args...); }\n\n//----------------------------------------------------------------------\n\n// Flexbox Align Items\n//\n// Flex items can be aligned in the cross axis of the current line of the\n// flex container, similar to 'justify-content' but in the perpendicular\n// direction. 'align-items' sets the default alignment for all of the flex\n// container's items, including anonymous flex items. 'align-self' allows\n// this default alignment to be overridden for individual flex items. (For\n// anonymous flex items, 'align-self' always matches the value of 'align-items'\n// on their associated flex container.) \n//\n// Values: flex-start | flex-end | center | baseline | stretch\n// Default: stretch\n//\n// http://w3.org/tr/css3-flexbox/#align-items-property\n\n@mixin align-items($value: stretch) {\n\t@if $value == flex-start {\n\t\t-webkit-box-align: start;\n\t\t-ms-flex-align: start;\n\t} @else if $value == flex-end {\n\t\t-webkit-box-align: end;\n\t\t-ms-flex-align: end;\n\t} @else {\n\t\t-webkit-box-align: $value;\n\t\t-ms-flex-align: $value;\n\t}\n\t-webkit-align-items: $value;\n\t-moz-align-items: $value;\n\talign-items: $value;\n}\n\n//----------------------------------\n\n// Flexbox Align Self\n//\n// Values: auto | flex-start | flex-end | center | baseline | stretch\n// Default: auto\n\n@mixin align-self($value: auto) {\n\t// No Webkit Box Fallback.\n\t-webkit-align-self: $value;\n\t-moz-align-self: $value;\n\t@if $value == flex-start {\n\t\t-ms-flex-item-align: start;\n\t} @else if $value == flex-end {\n\t\t-ms-flex-item-align: end;\n\t} @else {\n\t\t-ms-flex-item-align: $value;\n\t}\n\talign-self: $value;\n}\n\n//----------------------------------------------------------------------\n\n// Flexbox Align Content\n//\n// The 'align-content' property aligns a flex container's lines within the\n// flex container when there is extra space in the cross-axis, similar to\n// how 'justify-content' aligns individual items within the main-axis. Note,\n// this property has no effect when the flexbox has only a single line.\n//\n// Values: flex-start | flex-end | center | space-between | space-around | stretch\n// Default: stretch\n//\n// http://w3.org/tr/css3-flexbox/#align-content-property\n\n@mixin align-content($value: stretch) {\n\t// No Webkit Box Fallback.\n\t-webkit-align-content: $value;\n\t-moz-align-content: $value;\n\t@if $value == flex-start {\n\t\t-ms-flex-line-pack: start;\n\t} @else if $value == flex-end {\n\t\t-ms-flex-line-pack: end;\n\t} @else {\n\t\t-ms-flex-line-pack: $value;\n\t}\n\talign-content: $value;\n}\n",
+ "body {\n background-color: #FFF;\n font-weight: 500;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n}\n\nsection {\n margin-bottom: 40px;\n\n .section-title {\n border-bottom: 1px solid #CCC;\n display: inline-block;\n font-size: 16px;\n margin-bottom: 10px;\n padding-bottom: 5px;\n }\n\n &.form-section {\n margin-bottom: 40px;\n }\n\n &:last-child {\n margin-bottom: 0px;\n }\n}\n\nul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\nol {\n li {\n margin-bottom: 10px;\n }\n}\n\na {\n color: $branding-color-1;\n\n &:hover {\n color: $branding-color-1;\n text-decoration: none;\n }\n\n &:focus {\n color: $branding-color-1;\n outline: none;\n text-decoration: none;\n }\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n}\n\np {\n &:last-child {\n margin: 0;\n }\n}\n\n@-webkit-keyframes spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(359deg);\n transform: rotate(359deg);\n }\n}\n\n@keyframes spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(359deg);\n transform: rotate(359deg);\n }\n}\n",
+ ".btn-primary {\n background-color: darken($branding-color-2, 5%);\n border-color: darken($branding-color-2, 5%);\n\n &:hover, &:active, &:focus, &:active:focus {\n background-color: darken($branding-color-2, 10%);\n border-color: darken($branding-color-2, 10%);\n }\n\n &:disabled, &:disabled:hover {\n background-color: lighten($branding-color-2, 3%);\n border-color: lighten($branding-color-2, 3%);\n }\n}\n\n.btn-info {\n background-color: lighten($branding-color-1, 48%);\n border-color: $branding-color-1;\n color: darken($branding-color-1, 2%);\n\n &:hover, &:active, &:focus, &:active:focus, &:active:hover {\n background-color: lighten($branding-color-1, 40%);\n border-color: darken($branding-color-1, 5%);\n color: darken($branding-color-1, 10%);\n }\n}\n\n.table {\n border-color: $grayscale-color-x-light;\n display: inline-block;\n margin: 0;\n\n thead {\n tr {\n th {\n border-bottom: 1px;\n padding: 10px 15px;\n text-align: left;\n }\n }\n }\n\n tbody {\n tr {\n td {\n border-top: 1px solid rgba(221, 221, 221, 0.2);\n padding: 10px 15px;\n text-align: left;\n vertical-align: middle;\n }\n }\n }\n}\n\n.list-inline {\n margin: 0;\n\n li {\n padding: 0;\n }\n}\n\n.alert {\n &.alert-info {\n a {\n color: $branding-color-5;\n }\n }\n}\n\ncode {\n background-color: lighten($branding-color-1, 48%);\n color: darken($branding-color-1, 2%);\n word-break: break-word;\n\n &.comma-list {\n .item {\n &:after {\n content: \", \";\n }\n\n &:last-child:after {\n content: \"\";\n }\n }\n }\n}\n\npre {\n background: #2b2b2b;\n border-color: #2b2b2b;\n color: #bababa;\n white-space: pre-wrap; /* CSS 3 */\n white-space: -moz-pre-wrap; /* Mozilla, since 1999 */\n white-space: -pre-wrap; /* Opera 4-6 */\n white-space: -o-pre-wrap; /* Opera 7 */\n word-wrap: break-word; /* Internet Explorer 5.5+ */\n}\n\n@media only screen and (max-width: 768px) {\n .table {\n overflow-x: scroll;\n }\n\n .breadcrumb {\n > li {\n + li:before {\n padding: 0;\n }\n }\n }\n}\n",
+ ".app-panel {\n @include flexbox;\n @include flex-direction(column);\n height: 100vh;\n width: 100vw;\n min-height: 0;\n min-width: 0;\n}\n\n",
+ ".results-panel {\n @include flex(1);\n @include flexbox;\n @include flex-direction(column);\n min-height: 0;\n\n .view-header {\n @include flex(none);\n border-bottom: 1px solid $grayscale-color-x-light;\n padding: 20px 40px;\n }\n\n .view-body {\n @include flex(1);\n background-color: rgba(0, 0, 0, 0.03);\n height: 100%;\n overflow-y: auto;\n position: relative;\n }\n}\n\n@media only screen and (max-width: 768px) {\n .results-panel {\n .view-header {\n padding: 5px 10px;\n }\n }\n}\n\n\n",
+ ".sidebar-panel {\n @include flex(none);\n background-color: lighten($grayscale-color-dark, 10%);\n border-right: 1px solid darken($grayscale-color-dark, $color-accent-percentage-small);\n overflow-y: auto;\n width: $sidebar-panel-width;\n\n .cluster-selector {\n background-color: lighten($grayscale-color-dark, 2%);\n border: none;\n border-bottom: 1px solid $grayscale-color-x-dark;\n border-top: 1px solid lighten($grayscale-color-dark, $color-accent-percentage-small);\n padding: 5px;\n width: 100%;\n\n .ember-power-select-trigger {\n &:focus {\n outline: none;\n }\n }\n\n .ember-power-select-status-icon {\n margin-right: 5px;\n }\n }\n\n .current-cluster {\n header {\n @include dark-background-font;\n background-color: lighten($grayscale-color-dark, 2%);\n border-bottom: 1px solid $grayscale-color-x-dark;\n border-top: 1px solid lighten($grayscale-color-dark, $color-accent-percentage-small);\n padding: 10px;\n position: relative;\n\n .title {\n display: block;\n font-size: 18px;\n margin-right: 20px;\n word-break: break-all;\n }\n\n .meta {\n font-size: 9px;\n text-transform: uppercase;\n\n li {\n &:after {\n content: \", \";\n }\n\n &:last-child {\n &:after {\n content: \"\";\n }\n }\n }\n\n .dev-mode {\n color: $branding-color-1;\n }\n }\n\n .cluster-status-circle {\n border-radius: 8px;\n box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, .75);\n -moz-box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, .75);\n -webkit-box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, .75);\n display: inline-block;\n height: 16px;\n margin-top: -8px;\n position: absolute;\n right: 10px;\n top: 50%;\n width: 16px;\n\n &.ok {\n background: darken(#5cb85c, 10);\n }\n\n &.warning {\n background: darken(#f0ad4e, 10);\n }\n\n &.down {\n background: darken(#d9534f, 10);\n }\n }\n }\n\n .cluster-section-links {\n %current-link-style {\n &:after {\n background: lighten($grayscale-color-light, $color-accent-percentage-large);\n border-radius: 4px;\n content: \"\";\n display: inline-block;\n height: 8px;\n left: 8px;\n margin-top: -4px;\n position: absolute;\n top: 50%;\n width: 8px;\n }\n }\n\n a {\n @include dark-background-font;\n background-color: lighten($grayscale-color-dark, 5%);\n border-bottom: 1px solid $grayscale-color-x-dark;\n border-top: 1px solid lighten($grayscale-color-dark, $color-accent-percentage-small);\n display: block;\n font-size: 16px;\n padding: 10px 10px 10px 25px;\n position: relative;\n text-transform: uppercase;\n\n &:hover {\n background-color: $grayscale-color-dark;\n }\n }\n\n &.current-section-is-data {\n .data {\n @extend %current-link-style;\n }\n }\n\n &.current-section-is-ops {\n .ops {\n @extend %current-link-style;\n }\n }\n\n &.current-section-is-query {\n .query {\n @extend %current-link-style;\n }\n }\n }\n }\n}\n\n@media only screen and (max-width: 768px) {\n .sidebar-panel {\n width: 100%;\n\n .current-cluster {\n header {\n display: none;\n }\n\n .cluster-section-links {\n a {\n padding: 5px 5px 5px 25px;\n }\n }\n }\n }\n}\n",
+ ".topbar {\n @include flex(none);\n @include flexbox;\n @include flex-direction(row);\n @include justify-content(space-between);\n background-color: $grayscale-color-dark;\n border-bottom: 1px solid darken($grayscale-color-dark, $color-accent-percentage-small);\n height: $topbar-panel-height;\n\n .logo {\n display: inline-block;\n height: 30px;\n margin: 20px;\n width: 150px;\n }\n\n .topbar-nav {\n display: inline-block;\n\n .topbar-nav-item {\n border-left: 1px solid $grayscale-color-x-dark;\n float: left;\n\n a {\n @include dark-background-font;\n border-left: 1px solid lighten($grayscale-color-dark, $color-accent-percentage-small);\n display: inline-block;\n line-height: $topbar-panel-height;\n padding: 0 20px;\n\n &:hover {\n @include dark-background-font;\n background-color: darken($grayscale-color-dark, $color-accent-percentage-small);\n border-left: 1px solid $grayscale-color-dark;\n }\n\n &.selected {\n background-color: darken($grayscale-color-dark, $color-accent-percentage-large);\n border-left: 1px solid darken($grayscale-color-dark, $color-accent-percentage-large);\n cursor: default;\n }\n }\n }\n }\n}\n\n@media only screen and (max-width: 768px) {\n $topbar-panel-height: 40px;\n\n .topbar {\n width: 100%;\n height: $topbar-panel-height;\n\n .logo {\n margin: 5px;\n }\n\n .topbar-nav {\n .topbar-nav-item {\n a {\n line-height: $topbar-panel-height;\n }\n }\n }\n }\n}\n",
+ ".wrapper-panel {\n @include flex(1);\n @include flexbox;\n @include flex-direction(row);\n min-width: 0;\n}\n\n@media only screen and (max-width: 768px) {\n .wrapper-panel {\n @include flex-direction(column);\n }\n}\n",
+ ".action-buttons {\n float: right;\n text-align: right;\n\n .action-button {\n @extend .btn;\n @extend .btn-sm;\n margin-left: 5px;\n }\n\n .edit {\n @extend .btn-primary;\n }\n\n .cancel {\n @extend .btn-danger;\n }\n\n .update {\n @extend .btn-primary;\n }\n\n .create {\n @extend .btn-primary;\n }\n\n .raw {\n @extend .btn-primary;\n }\n\n .refresh {\n @extend .btn-primary;\n }\n}\n",
+ ".view-body {\n .alert {\n border-left: none;\n border-radius: 0;\n border-right: none;\n margin-bottom: 0;\n padding-left: 40px;\n padding-right: 20px;\n\n &:last-of-type {\n margin-bottom: 20px;\n }\n }\n\n .dashboard-module {\n .alert {\n border-radius: 4px;\n margin-bottom: 20px;\n padding: 15px;\n }\n }\n\n .close {\n padding-left: 10px;\n }\n\n .more-info {\n color: #474747; // TODO: Make one for each type of alert, right now styled for .info-alert\n cursor: pointer;\n font-size: 12px;\n font-weight: bold;\n }\n}\n\n.alert {\n ul {\n list-style: disc inside;\n }\n}\n",
+ ".breadcrumb-container {\n display: block;\n margin-bottom: 5px;\n min-height: 17px;\n\n .breadcrumb {\n background-color: inherit;\n font-size: 12px;\n margin: 0;\n padding: 0;\n\n li {\n color: lighten($grayscale-color-dark, $color-accent-percentage-large);\n margin-bottom: 0;\n\n &:last-child {\n a {\n color: lighten($grayscale-color-dark, $color-accent-percentage-large);\n cursor: default;\n }\n }\n }\n }\n}\n\n@media only screen and (max-width: 768px) {\n .view-label {\n font-size: 16px;\n font-weight: 500;\n }\n}\n",
+ ".button-list {\n li {\n margin-bottom: 10px;\n\n a {\n @extend .btn;\n @extend .btn-primary;\n\n &.danger {\n @extend .btn-danger;\n }\n }\n }\n\n &.small {\n li {\n a {\n @extend .btn-xs;\n }\n }\n }\n}\n",
+ ".cluster-resource-link {\n @extend .btn;\n @extend .btn-sm;\n @extend .btn-primary;\n @extend .btn-block;\n text-align: left;\n}\n",
+ ".cluster-status {\n &.cluster-status-label {\n @extend .label;\n text-transform: uppercase;\n\n &.ok {\n @extend .label-success;\n }\n\n &.warning {\n @extend .label-warning;\n }\n\n &.down {\n @extend .label-danger;\n }\n }\n}\n",
+ ".code-list {\n margin-bottom: 20px;\n\n li {\n padding-bottom: 5px;\n border-bottom: 1px solid $grayscale-color-x-light;\n margin-bottom: 3px;\n\n &:last-child {\n padding-bottom: 0;\n border-bottom: none;\n margin-bottom: 0;\n }\n }\n}\n",
+ ".app-panel {\n .CodeMirror {\n @include border-radius(5);\n border-radius: 5px;\n padding: 10px 15px;\n height: auto;\n }\n}\n\n",
+ "// Don't focus when inside of a code block\ncode {\n .ember-content-editable {\n margin-top: -50px; // Not sure why this space is being added to the component\n min-height: 100px;\n\n &:focus {\n outline: none;\n }\n }\n}\n\npre.editable {\n background: #FFF;\n border-color: #000;\n border-radius: 0px;\n}\n\n",
+ ".dashboard-module {\n background: #FFF;\n border: 1px solid $grayscale-color-x-light;\n border-top: 3px solid $grayscale-color-x-light;\n margin: 20px 20px 30px 40px;\n\n &.small-width {\n max-width: 600px;\n }\n\n &.medium-width {\n max-width: 800px;\n }\n\n &.large-width {\n max-width: 1000px;\n }\n\n &.no-border {\n background: none;\n border: none;\n\n .module-body {\n padding: 0;\n }\n }\n\n .module-header {\n @include flexbox;\n @include flex-direction(row);\n @include justify-content(space-between);\n border-bottom: 1px solid $grayscale-color-x-light;\n padding: 20px;\n\n .module-label {\n font-size: 18px;\n line-height: 30px;\n }\n\n .module-actions {\n .action-button {\n @extend .btn;\n @extend .btn-sm;\n margin-left: 5px;\n }\n\n .edit {\n @extend .btn-primary;\n }\n\n .cancel {\n @extend .btn-danger;\n }\n\n .delete {\n @extend .btn-danger;\n }\n\n .update {\n @extend .btn-primary;\n }\n\n .create {\n @extend .btn-primary;\n }\n\n .save {\n @extend .btn-primary;\n }\n\n .raw {\n @extend .btn-primary;\n }\n\n .refresh {\n @extend .btn-primary;\n }\n }\n }\n\n .module-body {\n padding: 20px;\n position: relative;\n\n .module-edit-group {\n .group-header {\n font-size: 18px;\n padding: 10px 0;\n }\n\n .key {\n width: 25%;\n }\n\n .value {\n width: 75%;\n }\n }\n }\n\n .mini-label {\n font-size: 10px;\n }\n}\n\n@media only screen and (max-width: 768px) {\n .dashboard-module {\n margin: 10px;\n }\n}\n",
+ ".ember-power-select {\n .ember-power-select-trigger {\n &:focus {\n outline: none;\n }\n }\n\n &.node-chart-select {\n min-width: 250px;\n display: inline-block;\n }\n}\n",
+ ".ivy-tabs {\n .ivy-tab-list {\n border-bottom: 1px solid $grayscale-color-x-light;\n\n &.capitalize {\n text-transform: capitalize;\n }\n\n .ivy-tab {\n border: none;\n color: $branding-color-1;\n cursor: pointer;\n display: inline-block;\n font-weight: bold;\n margin: 0 30px 0 0;\n outline: none;\n padding: 15px 0;\n\n &[aria-selected=true] {\n border-bottom: 1px solid lighten($grayscale-color-dark, $color-accent-percentage-small);\n color: $grayscale-color-dark;\n cursor: default;\n margin-bottom: -1px;\n }\n }\n }\n\n .ivy-tab-panel {\n padding-top: 15px;\n }\n\n &.half-width {\n display: inline-block;\n width: 50%;\n }\n\n &.vertical {\n @include flexbox;\n @include flex-direction(row);\n margin-top: 20px;\n\n .ivy-tab-list {\n @include flex(none);\n border-bottom: none;\n border-right: 1px solid $grayscale-color-x-light;\n\n .ivy-tab {\n border: none;\n color: $branding-color-1;\n cursor: pointer;\n display: block;\n font-weight: bold;\n margin: 0;\n outline: none;\n padding: 8px 20px 8px 0;\n\n &:first-child {\n padding-top: 0px;\n }\n\n &[aria-selected=true] {\n border-right: 1px solid lighten($grayscale-color-dark, $color-accent-percentage-small);\n color: $grayscale-color-dark;\n cursor: default;\n margin-right: -1px;\n }\n }\n }\n\n .ivy-tab-panel {\n @include flex(1);\n padding: 0 20px 0 30px;\n }\n }\n}\n",
+ ".key-value-table {\n th, td {\n padding-bottom: 10px;\n vertical-align: top;\n }\n\n .key {\n font-weight: bold;\n padding-right: 20px;\n }\n\n &.bucket-props-overview {\n .key {\n min-width: 175px;\n }\n }\n\n &.bucket-props-advanced {\n .key {\n min-width: 225px;\n }\n }\n\n}\n",
+ ".ember-application {\n .loading-slider {\n height: 3px;\n\n span {\n background-color: $branding-color-1;\n height: 3px;\n }\n }\n}\n",
+ "$spinner-color: #69717d !default;\n$spinner-size: 48px !default;\n\n.loading-background {\n @include flexbox;\n @include align-items(center);\n @include justify-content(center);\n background: rgba(0, 0, 0, 0.03);\n margin: -20px;\n min-height: 200px;\n\n &.entire-page {\n background: none;\n bottom: 0;\n left: 0;\n margin: 0;\n position: absolute;\n right: 0;\n top: 0;\n }\n}\n\n.loading-container {\n background: white;\n border: 1px solid $grayscale-color-x-light;\n border-radius: 3px;\n margin: 0 auto;\n max-width: 50%;\n padding: 30px;\n text-align: center;\n .status-message {\n margin-bottom: 20px;\n }\n .spinner {\n display: inline-block;\n font-size: $spinner-size;\n height: 1em;\n position: relative;\n width: 1em;\n .spinner-blade {\n $animation-delay: 0s;\n $blade-rotation: 0deg;\n\n animation: spinner-fade 1s infinite linear;\n background-color: transparent;\n border-radius: 0.0555em;\n bottom: 0;\n height: 0.2777em;\n left: 0.4629em;\n position: absolute;\n transform-origin: center -0.2222em;\n width: 0.074em;\n\n @for $i from 1 through 12 {\n &:nth-child(#{$i}) {\n $blade-rotation: $blade-rotation + 30;\n $animation-delay: $animation-delay + 0.083;\n\n animation-delay: $animation-delay;\n transform: rotate($blade-rotation);\n }\n }\n }\n }\n}\n\n@keyframes spinner-fade {\n 0% {\n background-color: $spinner-color;\n }\n 100% {\n background-color: transparent;\n }\n}\n",
+ ".map-section {\n margin-bottom: 30px;\n\n code {\n font-size: 16px;\n }\n\n .map-section-title {\n margin-bottom: 10px;\n text-transform: uppercase;\n }\n\n .item-instance {\n button {\n @extend .btn;\n @extend .btn-xs;\n visibility: hidden;\n }\n\n &:hover {\n button {\n visibility: visible;\n }\n }\n\n .delete-button {\n @extend .btn-danger;\n }\n\n .edit-button {\n @extend .btn-primary;\n }\n }\n\n .add-instance {\n .add-instance-input {\n @extend .form-control;\n display: inline;\n\n &.make-room {\n width: 50%;\n }\n }\n\n .add-instance-button {\n @extend .btn;\n @extend .btn-primary;\n }\n }\n}\n\n.map-section.maps-list {\n .map-name {\n font-weight: bold;\n margin-bottom: 10px;\n\n .expand-contents {\n cursor: pointer;\n font-weight: normal;\n margin-left: 15px;\n }\n }\n\n .sub-map-contents {\n background: rgba(0, 0, 0, .05);\n display: none;\n margin-bottom: 10px;\n padding: 10px;\n\n &.expanded {\n display: block;\n }\n }\n}\n",
+ ".ember-modal-overlay.translucent {\n background-color: rgba(#000, .65);\n}\n\n.ember-modal-dialog {\n border-radius: 5px;\n background-color: #fff;\n box-shadow: 0 0 15px #222;\n margin: 0;\n padding: 0;\n}\n\n.modal-content-container {\n padding: 10px;\n margin: 10px;\n max-width: 400px;\n\n .modal-header {\n margin-bottom: 20px;\n }\n\n .modal-footer {\n margin-top: 20px;\n }\n}\n",
+ ".object-content-list {\n font-size: 16px;\n\n li {\n margin-bottom: 5px;\n\n &:hover {\n .remove-item {\n visibility: visible;\n }\n }\n\n .remove-item {\n @extend .btn;\n @extend .btn-xs;\n @extend .btn-danger;\n visibility: hidden;\n }\n\n .input-add-item {\n @extend .form-control;\n display: inline;\n width: 60%;\n }\n\n .button-add-item {\n @extend .btn;\n @extend .btn-primary;\n }\n }\n}\n",
+ ".pagination-component-container {\n .pagination-links {\n .pagination-link {\n @extend .btn;\n @extend .btn-xs;\n @extend .btn-default;\n margin-bottom: 5px;\n\n &.selected {\n @extend .btn-primary;\n }\n }\n\n .text-link {\n &.invisible {\n visibility: hidden;\n }\n }\n }\n}\n",
+ ".legacy-map-styling {\n th {\n background: #FFF\n }\n tr:nth-child(even) {\n background: #FFF\n }\n tr:nth-child(odd) {\n background: #EEE\n }\n\n .nowrap {\n white-space: nowrap;\n }\n\n .loading {\n padding-bottom: 3em;\n padding-top: 3em;\n }\n\n .cluster-resource-header {\n background-color: #3c948b;\n border: 1px solid #CCC;\n border-radius: 4px;\n color: white;\n display: inline-block;\n font-size: 14px;\n font-weight: normal;\n padding: 6px 3em 6px 2em;\n text-align: left;\n vertical-align: middle;\n white-space: nowrap;\n }\n\n .cluster-resource-link {\n /*background-color: #337ab7;*/\n padding: 6px 2em 6px 1em;\n text-align: left;\n }\n\n .cluster-resource-icon {\n margin-right: 1em;\n }\n\n .status-ok {\n color: green;\n }\n .status-disabled {\n color: grey;\n }\n .warning {\n color: red;\n }\n\n .key {\n padding-bottom: 3em;\n padding-top: 3em;\n }\n\n .spinner {\n padding: 3em 0px;\n }\n\n .property-header {\n background-color: #DDD;\n margin-bottom: 1em;\n padding: 0.5em 3px;\n }\n\n .bucket-properties {\n border: 1px solid gray;\n box-sizing: border-box;\n margin-bottom: 2em;\n margin-left: 0px auto;\n\n margin-right: 0px auto;\n margin-top: 2em;\n }\n\n .property-row {\n padding: 0.5em 1em;\n }\n\n .object-contents {\n border: 1px solid #ddd;\n border-radius: 3px;\n margin-bottom: 15px;\n margin-top: 20px;\n position: relative;\n width: 95%;\n }\n\n .object-contents-header {\n background-color: #e7ecee;\n border-bottom: 1px solid #d8d8d8;\n border-top-left-radius: 2px;\n border-top-right-radius: 2px;\n line-height: 30px;\n padding: 5px 10px;\n }\n\n .object-contents-header::before {\n content: \"\";\n display: table;\n }\n\n .object-contents-header::after {\n clear: both;\n content: \"\";\n display: table;\n }\n\n .object-contents-actions {\n float: right;\n /*padding-top: 3px;*/\n }\n\n .object-contents-info {\n float: left;\n font-family: Consolas, \"Liberation Mono\", Courier, monospace;\n font-size: 12px;\n }\n\n .object-contents-body {\n background-color: #f7f7f7;\n padding: 20px;\n }\n\n .object-contents-footer {\n background-color: #e7ecee;\n border-bottom-left-radius: 2px;\n border-bottom-right-radius: 2px;\n border-top: 1px solid #d8d8d8;\n font-family: Consolas, \"Liberation Mono\", Courier, monospace;\n font-size: 11px;\n line-height: 30px;\n padding: 5px 10px;\n }\n\n .value-counter {\n font-size: 200%;\n }\n\n .set-contents-list {\n border-left: 1px solid #ddd;\n border-right: 1px solid #ddd;\n border-top: 1px solid #ddd;\n margin-bottom: 1.5em;\n width: 100%;\n }\n .set-contents-list div.set-element-row:nth-child(even) {\n background-color: #eee;\n }\n .set-element-row {\n border-bottom: 1px solid #ccc;\n padding: 0.5em 0px;\n }\n .set-element {\n font-size: 110%;\n }\n\n .field-label {\n font-weight: bold;\n text-align: right;\n }\n\n .map-composite-field-name {\n padding: 0.5em 0px;\n }\n\n .form-inline .input-increment {\n vertical-align: middle;\n width: 5em;\n }\n\n .divider {\n font-size: 150%;\n margin: 0px 10px;\n vertical-align: middle;\n }\n}\n",
+ "#side-drawer-container {\n @include flex(none);\n border-left: 1px solid $grayscale-color-x-light;\n overflow: scroll;\n\n &.drawer-closed {\n border-left: none;\n }\n\n .side-drawer {\n background: #FFF;\n overflow: scroll;\n width: 400px;\n\n &.open {\n display: block;\n }\n\n &.closed {\n display: none;\n }\n\n .drawer-header {\n border-bottom: 1px solid $grayscale-color-x-light;\n font-size: 24px;\n font-weight: 500;\n\n .drawer-label {\n display: inline-block;\n padding: 43px 20px 19px 20px;\n width: 340px;\n }\n\n .close-container {\n cursor: pointer;\n float: right;\n padding: 43px 20px 19px 20px;\n }\n }\n\n .drawer-body {\n padding: 20px;\n\n h2 {\n font-size: 24px;\n border-bottom: 1px solid $grayscale-color-x-light;\n padding: 10px 0;\n }\n\n h3 {\n font-size: 20px;\n }\n\n h4 {\n font-size: 16px;\n }\n\n p {\n margin-bottom: 20px;\n }\n\n pre {\n margin-bottom: 20px;\n font-size: 11px;\n }\n\n ul {\n list-style: disc;\n margin-bottom: 20px;\n margin-left: 20px;\n }\n\n table {\n @extend .table;\n @extend .table-striped;\n margin-bottom: 20px;\n\n code {\n background: none;\n }\n }\n }\n\n @media only screen and (min-device-width: 769px) and (max-width: 1175px) {\n $topbar-panel-height: 70px;\n\n position: fixed;\n top: $topbar-panel-height;\n bottom: 0;\n right: 0;\n z-index: 1000;\n border-left: 1px solid $grayscale-color-x-light;\n }\n\n @media only screen and (max-width: 768px) {\n $topbar-panel-height: 40px;\n\n position: fixed;\n top: $topbar-panel-height;\n bottom: 0;\n right: 0;\n z-index: 1000;\n border-left: 1px solid $grayscale-color-x-light;\n width: 300px;\n\n .drawer-header {\n font-size: 18px;\n\n .drawer-label {\n width: 250px;\n padding: 10px;\n }\n\n .close-container {\n padding: 10px;\n }\n }\n\n .drawer-body {\n padding: 10px;\n }\n }\n }\n}\n",
+ ".table {\n thead th {\n padding-top: 0;\n\n &:first-child {\n padding-left: 0;\n }\n }\n\n tbody td {\n &:first-child {\n padding-left: 0;\n }\n }\n\n &.cluster-table {\n .object-type {\n min-width: 125px;\n }\n }\n}\n",
+ ".ember-application {\n .tooltip-icon {\n color: #777;\n cursor: help;\n font-size: 10px;\n }\n\n .tooltip-text {\n @extend a;\n cursor: help;\n font-size: 10px;\n }\n\n .tooltip {\n &.in {\n opacity: 1;\n }\n\n &.tooltip-wide {\n max-width: 400px;\n }\n\n .tooltip-content-wrapper {\n padding: 10px;\n\n .title-wrapper {\n margin-bottom: 10px;\n\n .title {\n @extend .label;\n @extend .label-default;\n font-size: 14px;\n word-break: break-word;\n }\n }\n\n .description-wrapper {\n margin-bottom: 5px;\n\n .description {\n display: inline-block;\n word-break: break-word;\n }\n }\n\n .small {\n font-size: 12px;\n font-style: italic;\n word-break: break-word;\n }\n }\n }\n}\n\n\n\n",
+ ".view-label {\n display: block;\n font-size: 24px;\n font-weight: 500;\n}\n\n@media only screen and (max-width: 768px) {\n .view-label {\n font-size: 16px;\n font-weight: 500;\n }\n}\n",
+ ".bucket-create-container {\n input[type='text'], input[type='number'] {\n max-width: 350px;\n }\n\n .property-input {\n max-width: 170px;\n display: inline-block;\n margin-right: 10px;\n }\n\n .remove-property {\n font-size: 9px;\n cursor: pointer;\n }\n\n .add-property {\n @extend a;\n cursor: pointer;\n }\n\n .CodeMirror {\n min-height: 100px;\n margin-bottom: 5px;\n }\n}\n",
+ ".bucket-type-create-container {\n .bucket-type-create-form {\n .name-input {\n max-width: 350px;\n }\n\n .type-input {\n max-width: 350px;\n }\n\n .property-input {\n max-width: 170px;\n display: inline-block;\n margin-right: 10px;\n }\n\n .remove-property {\n font-size: 9px;\n cursor: pointer;\n }\n\n .add-property {\n @extend a;\n cursor: pointer;\n }\n }\n}\n\n.bucket-type-edit-container {\n .bucket-type-edit-form {\n .name-input {\n max-width: 350px;\n }\n\n .type-input {\n max-width: 350px;\n }\n\n .property-input {\n max-width: 170px;\n display: inline-block;\n margin-right: 10px;\n }\n\n .remove-property {\n font-size: 9px;\n cursor: pointer;\n }\n\n .add-property {\n @extend a;\n cursor: pointer;\n }\n }\n}\n",
+ ".cluster-ops-container {\n .repl-action-select {\n max-width: 250px;\n }\n\n .cluster-graph {\n margin-top: 40px;\n padding-bottom: 40px;\n margin-bottom: 20px;\n border-bottom: 1px solid $grayscale-color-x-light;\n\n header {\n .header-left {\n float: left;\n font-weight: bold;\n }\n\n .header-right {\n float: right;\n }\n }\n }\n}\n\n@media only screen and (max-width: 768px) {\n .cluster-ops-container {\n .cluster-graph {\n header {\n .header-left {\n float: none;\n margin-bottom: 10px;\n }\n\n .header-right {\n float: none;\n margin-bottom: 10px;\n }\n }\n }\n }\n}\n",
+ ".object-counter-container {\n .counter-value {\n font-size: 24px;\n }\n .form-control {\n width: 50px;\n }\n}\n\n.update-object-form {\n input.form-control {\n max-width: 300px;\n }\n}\n",
+ ".search-schema-container {\n\n .schema-name {\n max-width: 350px;\n }\n\n .CodeMirror {\n height: 300px;\n }\n\n .submit-button-container {\n @include clearfix;\n\n .btn {\n margin-top: 10px;\n }\n }\n}\n",
+ ".ts-table-container {\n label {\n margin-bottom: 10px;\n }\n\n .CodeMirror {\n height: 250px;\n }\n\n .submit-button-container {\n @include clearfix;\n\n .btn {\n float: right;\n margin-top: 10px;\n }\n }\n}\n\n.ts-table-reference {\n .key {\n min-width: 125px;\n }\n}\n\n.table-create-container {\n //.table-name {\n // width: 354px;\n //}\n //\n //.family, .series, .table-field {\n // input {\n // width: 175px;\n // }\n //\n // select {\n // width: 175px;\n // }\n //}\n //\n //.quantum {\n // input, select {\n // width: 100%;\n // }\n //\n // .field-name {\n // width: 175px;\n // }\n //\n // .quantity {\n // width: 66px;\n // }\n //\n // .unit {\n // width: 105px;\n // }\n //}\n //\n //.remove-field {\n // font-size: 9px;\n // cursor: pointer;\n //}\n //\n //.add-field {\n // @extend a;\n // cursor: pointer;\n //}\n}\n\n.table-write-container {}\n\n.table-query-container {\n .split-panel {\n @include flexbox;\n @include flex-direction(row);\n\n .left-panel {\n @include flex(1);\n max-width: 50%;\n padding-right: 10px;\n }\n\n .right-panel {\n @include flex(1);\n max-width: 50%;\n padding-left: 10px;\n\n .clear-statement {\n @extend a;\n cursor: pointer;\n font-size: 10px;\n margin-right: 5px;\n }\n }\n }\n}\n"
+ ],
+ "mappings": ";ACAA;;;;GAIG;AiCJH,4EAA4E;AAQ5E,AAAA,IAAI,CAAC;EACH,WAAW,EAAE,UAAW;EACxB,oBAAoB,EAAE,IAAK;EAC3B,wBAAwB,EAAE,IAAK,GAChC;;AAMD,AAAA,IAAI,CAAC;EACH,MAAM,EAAE,CAAE,GACX;;AAYD,AAAA,OAAO;AACP,AAAA,KAAK;AACL,AAAA,OAAO;AACP,AAAA,UAAU;AACV,AAAA,MAAM;AACN,AAAA,MAAM;AACN,AAAA,MAAM;AACN,AAAA,MAAM;AACN,AAAA,IAAI;AACJ,AAAA,IAAI;AACJ,AAAA,GAAG;AACH,AAAA,OAAO;AACP,AAAA,OAAO,CAAC;EACN,OAAO,EAAE,KAAM,GAChB;;AAOD,AAAA,KAAK;AACL,AAAA,MAAM;AACN,AAAA,QAAQ;AACR,AAAA,KAAK,CAAC;EACJ,OAAO,EAAE,YAAa;EACtB,cAAc,EAAE,QAAS,GAC1B;;AAOD,AAAoB,KAAf,AAAA,IAAK,EAAA,AAAA,AAAS,QAAR,AAAA,GAAW;EACpB,OAAO,EAAE,IAAK;EACd,MAAM,EAAE,CAAE,GACX;;CAOD,AAAA,AAAO,MAAN,AAAA;AACD,AAAA,QAAQ,CAAC;EACP,OAAO,EAAE,IAAK,GACf;;AASD,AAAA,CAAC,EoDxFD,ApDwFA,kBoDxFkB,CAOhB,aAAa,EEPf,AtDwFA,wBsDxFwB,CAgBtB,aAAa,EChBf,AvDwFA,6BuDxF6B,CAC3B,wBAAwB,CAoBtB,aAAa,EAOjB,AvD4DA,2BuD5D2B,CACzB,sBAAsB,CAoBpB,aAAa,EIsBjB,A3DiBA,sB2DjBsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,C3DCpB;EACA,gBAAgB,EAAE,WAAY,GAC/B;;AAOD,AAAC,CAAA,AAAA,OAAO,EoDjGR,ApDiGA,kBoDjGkB,CAOhB,aAAa,ApD0Fd,OAAO,EsDjGR,AtDiGA,wBsDjGwB,CAgBtB,aAAa,AtDiFd,OAAO,EuDjGR,AvDiGA,6BuDjG6B,CAC3B,wBAAwB,CAoBtB,aAAa,AvD4EhB,OAAO,EuDrER,AvDqEA,2BuDrE2B,CACzB,sBAAsB,CAoBpB,aAAa,AvDgDhB,OAAO,E2D1BR,A3D0BA,sB2D1BsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,A3DUrB,OAAO;AACR,AAAC,CAAA,AAAA,MAAM;AoDlGP,ApDiGQ,kBoDjGU,CAOhB,aAAa,ApD2Fd,MAAM;AsDlGP,AtDiGQ,wBsDjGgB,CAgBtB,aAAa,AtDkFd,MAAM;AuDlGP,AvDiGQ,6BuDjGqB,CAC3B,wBAAwB,CAoBtB,aAAa,AvD6EhB,MAAM;AuDtEP,AvDqEQ,2BuDrEmB,CACzB,sBAAsB,CAoBpB,aAAa,AvDiDhB,MAAM;A2D3BP,A3D0BQ,sB2D1Bc,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,A3DWrB,MAAM,CAAC;EACN,OAAO,EAAE,CAAE,GACZ;;AASD,AAAU,IAAN,CAAA,AAAA,KAAC,AAAA,EAAO;EACV,aAAa,EAAE,UAAW,GAC3B;;AAMD,AAAA,CAAC;AACD,AAAA,MAAM,CAAC;EACL,WAAW,EAAE,IAAK,GACnB;;AAMD,AAAA,GAAG,CAAC;EACF,UAAU,EAAE,MAAO,GACpB;;AAOD,AAAA,EAAE,CAAC;EACD,SAAS,EAAE,GAAI;EACf,MAAM,EAAE,QAAS,GAClB;;AAMD,AAAA,IAAI,CAAC;EACH,UAAU,EAAE,IAAK;EACjB,KAAK,EAAE,IAAK,GACb;;AAMD,AAAA,KAAK,CAAC;EACJ,SAAS,EAAE,GAAI,GAChB;;AAMD,AAAA,GAAG;AACH,AAAA,GAAG,CAAC;EACF,SAAS,EAAE,GAAI;EACf,WAAW,EAAE,CAAE;EACf,QAAQ,EAAE,QAAS;EACnB,cAAc,EAAE,QAAS,GAC1B;;AAED,AAAA,GAAG,CAAC;EACF,GAAG,EAAE,MAAO,GACb;;AAED,AAAA,GAAG,CAAC;EACF,MAAM,EAAE,OAAQ,GACjB;;AASD,AAAA,GAAG,CAAC;EACF,MAAM,EAAE,CAAE,GACX;;AAMD,AAAa,GAAV,AAAA,IAAK,CAAA,AAAA,KAAK,EAAE;EACb,QAAQ,EAAE,MAAO,GAClB;;AASD,AAAA,MAAM,CAAC;EACL,MAAM,EAAE,QAAS,GAClB;;AAMD,AAAA,EAAE,CAAC;EACD,UAAU,EAAE,WAAY;EACxB,MAAM,EAAE,CAAE,GACX;;AAMD,AAAA,GAAG,CAAC;EACF,QAAQ,EAAE,IAAK,GAChB;;AAMD,AAAA,IAAI;AACJ,AAAA,GAAG;AACH,AAAA,GAAG;AACH,AAAA,IAAI,CAAC;EACH,WAAW,EAAE,oBAAqB;EAClC,SAAS,EAAE,GAAI,GAChB;;AAiBD,AAAA,MAAM;AACN,AAAA,KAAK;AACL,AAAA,QAAQ;AACR,AAAA,MAAM;AACN,AAAA,QAAQ,CAAC;EACP,KAAK,EAAE,OAAQ;EACf,IAAI,EAAE,OAAQ;EACd,MAAM,EAAE,CAAE,GACX;;AAMD,AAAA,MAAM,CAAC;EACL,QAAQ,EAAE,OAAQ,GACnB;;AASD,AAAA,MAAM;AACN,AAAA,MAAM,CAAC;EACL,cAAc,EAAE,IAAK,GACtB;;AAUD,AAAA,MAAM;AACN,AAAwB,IAApB,CAAC,KAAK,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb;AACX,AAAkB,KAAb,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ;AACN,AAAmB,KAAd,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,EAAe;EACnB,kBAAkB,EAAE,MAAO;EAC3B,MAAM,EAAE,OAAQ,GACjB;;AAMD,AAAe,MAAT,CAAA,AAAA,QAAC,AAAA;AACP,AAAmB,IAAf,CAAC,KAAK,CAAA,AAAA,QAAC,AAAA,EAAU;EACnB,MAAM,EAAE,OAAQ,GACjB;;AAMD,AAAM,MAAA,AAAA,kBAAkB;AACxB,AAAK,KAAA,AAAA,kBAAkB,CAAC;EACtB,MAAM,EAAE,CAAE;EACV,OAAO,EAAE,CAAE,GACZ;;AAOD,AAAA,KAAK,CAAC;EACJ,WAAW,EAAE,MAAO,GACrB;;AAUD,AAAqB,KAAhB,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf;AACN,AAAkB,KAAb,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,EAAc;EAClB,UAAU,EAAE,UAAW;EACvB,OAAO,EAAE,CAAE,GACZ;;AAQD,AAAoB,KAAf,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,CAAc,2BAA2B;AAC/C,AAAoB,KAAf,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,CAAc,2BAA2B,CAAC;EAC9C,MAAM,EAAE,IAAK,GACd;;AAOD,AAAmB,KAAd,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,EAAe;EACnB,kBAAkB,EAAE,SAAU;EAC9B,UAAU,EAAE,WAAY,GACzB;;AAQD,AAAoB,KAAf,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,CAAc,8BAA8B;AAClD,AAAoB,KAAf,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,CAAc,2BAA2B,CAAC;EAC9C,kBAAkB,EAAE,IAAK,GAC1B;;AAMD,AAAA,QAAQ,CAAC;EACP,MAAM,EAAE,iBAAkB;EAC1B,MAAM,EAAE,KAAM;EACd,OAAO,EAAE,qBAAsB,GAChC;;AAOD,AAAA,MAAM,CAAC;EACL,MAAM,EAAE,CAAE;EACV,OAAO,EAAE,CAAE,GACZ;;AAMD,AAAA,QAAQ,CAAC;EACP,QAAQ,EAAE,IAAK,GAChB;;AAOD,AAAA,QAAQ,CAAC;EACP,WAAW,EAAE,IAAK,GACnB;;AASD,AAAA,KAAK,CAAC;EACJ,eAAe,EAAE,QAAS;EAC1B,cAAc,EAAE,CAAE,GACnB;;AAED,AAAA,EAAE;AACF,AAAA,EAAE,CAAC;EACD,OAAO,EAAE,CAAE,GACZ;;ACvaD,qFAAqF;AAOrF,MAAM,CAAN,KAAK;EACD,AAAA,CAAC;EACD,AAAC,CAAA,AAAA,OAAO;EACR,AAAC,CAAA,AAAA,MAAM,CAAC;IACJ,UAAU,EAAE,sBAAuB;IACnC,KAAK,EAAE,eAAgB;IACvB,UAAU,EAAE,eAAgB;IAC5B,WAAW,EAAE,eAAgB,GAChC;EAED,AAAA,CAAC,EmDjBL,AnDiBI,kBmDjBc,CAOhB,aAAa,EEPf,ArDiBI,wBqDjBoB,CAgBtB,aAAa,EChBf,AtDiBI,6BsDjByB,CAC3B,wBAAwB,CAoBtB,aAAa,EAOjB,AtDXI,2BsDWuB,CACzB,sBAAsB,CAoBpB,aAAa,EIsBjB,A1DtDI,sB0DsDkB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB;E1DrElB,AAAC,CAAA,AAAA,QAAQ;EmDlBb,AnDiBK,kBmDjBa,CAOhB,aAAa,AnDWV,QAAQ;EqDlBb,ArDiBK,wBqDjBmB,CAgBtB,aAAa,ArDEV,QAAQ;EsDlBb,AtDiBK,6BsDjBwB,CAC3B,wBAAwB,CAoBtB,aAAa,AtDHZ,QAAQ;EsDUb,AtDXK,2BsDWsB,CACzB,sBAAsB,CAoBpB,aAAa,AtD/BZ,QAAQ;E0DqDb,A1DtDK,sB0DsDiB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,A1DrEjB,QAAQ,CAAC;IACN,eAAe,EAAE,SAAU,GAC9B;EAED,AAAO,CAAN,CAAA,AAAA,IAAC,AAAA,CAAK,MAAM,EmDtBjB,AnDsBI,kBmDtBc,EnDsBb,AAAA,IAAC,AAAA,CmDfJ,aAAa,AnDeJ,MAAM,EqDtBjB,ArDsBI,wBqDtBoB,ErDsBnB,AAAA,IAAC,AAAA,CqDNJ,aAAa,ArDMJ,MAAM,EsDtBjB,AtDsBI,6BsDtByB,CAC3B,wBAAwB,EtDqBrB,AAAA,IAAC,AAAA,CsDDF,aAAa,AtDCN,MAAM,EsDMjB,AtDNI,2BsDMuB,CACzB,sBAAsB,EtDPnB,AAAA,IAAC,AAAA,CsD2BF,aAAa,AtD3BN,MAAM,E0DiDjB,A1DjDI,sB0DiDkB,CACpB,YAAY,CAUV,YAAY,E1D5DX,AAAA,IAAC,AAAA,C0DiEA,gBAAgB,A1DjEX,MAAM,CAAC;IACV,OAAO,EAAE,IAAI,CAAC,UAAI,CAAO,GAAG,GAC/B;EAED,AAAW,IAAP,CAAA,AAAA,KAAC,AAAA,CAAM,MAAM,CAAC;IACd,OAAO,EAAE,IAAI,CAAC,WAAI,CAAQ,GAAG,GAChC;EAID,AAAY,CAAX,CAAA,AAAA,IAAC,EAAM,GAAG,AAAT,CAAU,MAAM,EmDhCtB,AnDgCI,kBmDhCc,EnDgCb,AAAA,IAAC,EAAM,GAAG,AAAT,CmDzBJ,aAAa,AnDyBC,MAAM,EqDhCtB,ArDgCI,wBqDhCoB,ErDgCnB,AAAA,IAAC,EAAM,GAAG,AAAT,CqDhBJ,aAAa,ArDgBC,MAAM,EsDhCtB,AtDgCI,6BsDhCyB,CAC3B,wBAAwB,EtD+BrB,AAAA,IAAC,EAAM,GAAG,AAAT,CsDXF,aAAa,AtDWD,MAAM,EsDJtB,AtDII,2BsDJuB,CACzB,sBAAsB,EtDGnB,AAAA,IAAC,EAAM,GAAG,AAAT,CsDiBF,aAAa,AtDjBD,MAAM,E0DuCtB,A1DvCI,sB0DuCkB,CACpB,YAAY,CAUV,YAAY,E1DlDX,AAAA,IAAC,EAAM,GAAG,AAAT,C0DuDA,gBAAgB,A1DvDN,MAAM;EAClB,AAAsB,CAArB,CAAA,AAAA,IAAC,EAAM,aAAa,AAAnB,CAAoB,MAAM;EmDjChC,AnDgCsB,kBmDhCJ,EnDiCb,AAAA,IAAC,EAAM,aAAa,AAAnB,CmD1BJ,aAAa,AnD0BW,MAAM;EqDjChC,ArDgCsB,wBqDhCE,ErDiCnB,AAAA,IAAC,EAAM,aAAa,AAAnB,CqDjBJ,aAAa,ArDiBW,MAAM;EsDjChC,AtDgCsB,6BsDhCO,CAC3B,wBAAwB,EtDgCrB,AAAA,IAAC,EAAM,aAAa,AAAnB,CsDZF,aAAa,AtDYS,MAAM;EsDLhC,AtDIsB,2BsDJK,CACzB,sBAAsB,EtDInB,AAAA,IAAC,EAAM,aAAa,AAAnB,CsDgBF,aAAa,AtDhBS,MAAM;E0DsChC,A1DvCsB,sB0DuCA,CACpB,YAAY,CAUV,YAAY,E1DjDX,AAAA,IAAC,EAAM,aAAa,AAAnB,C0DsDA,gBAAgB,A1DtDI,MAAM,CAAC;IACzB,OAAO,EAAE,EAAG,GACf;EAED,AAAA,GAAG;EACH,AAAA,UAAU,CAAC;IACP,MAAM,EAAE,cAAe;IACvB,iBAAiB,EAAE,KAAM,GAC5B;EAED,AAAA,KAAK,CAAC;IACF,OAAO,EAAE,kBAAmB,GAC/B;EAED,AAAA,EAAE;EACF,AAAA,GAAG,CAAC;IACA,iBAAiB,EAAE,KAAM,GAC5B;EAED,AAAA,GAAG,CAAC;IACA,SAAS,EAAE,eAAgB,GAC9B;EAED,AAAA,CAAC;EACD,AAAA,EAAE;EACF,AAAA,EAAE,CAAC;IACC,OAAO,EAAE,CAAE;IACX,MAAM,EAAE,CAAE,GACb;EAED,AAAA,EAAE;EACF,AAAA,EAAE,CAAC;IACC,gBAAgB,EAAE,KAAM,GAC3B;EAKD,AAAA,OAAO,CAAC;IACJ,OAAO,EAAE,IAAK,GACjB;EACD,AAEM,IAFF,GAEE,MAAM,E6B5EhB,A7B4EU,e6B5EK,CAIb,cAAc,G7BwEN,MAAM,EgC5EhB,AhC4EU,YgC5EE,CACV,EAAE,CAGA,CAAC,GhCwEK,MAAM,EgC5EhB,AhC4EU,YgC5EE,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,GnDqEL,MAAM,EmD5EhB,AnD4EU,kBmD5EQ,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,GnDqEL,MAAM,EgC5EhB,AhC4EU,YgC5EE,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,GrD4DL,MAAM,EqD5EhB,ArD4EU,wBqD5Ec,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,GrD4DL,MAAM,EgC5EhB,AhC4EU,YgC5EE,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,GtDuDP,MAAM,EsD5EhB,AtD4EU,6BsD5EmB,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,GtDuDP,MAAM,EgC5EhB,AhC4EU,YgC5EE,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,GtD2BP,MAAM,EsDhDhB,AtDgDU,2BsDhDiB,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,GtD2BP,MAAM,EgC5EhB,AhC4EU,YgC5EE,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,G1DXZ,MAAM,E0DLhB,A1DKU,sB0DLY,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,G1DXZ,MAAM,EiC5EhB,AjC4EU,sBiC5EY,GjC4EZ,MAAM,EsC5EhB,AtC4EU,iBsC5EO,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,GtCoCV,MAAM,E4C5EhB,A5C4EU,Y4C5EE,CAYV,cAAc,CACZ,MAAM,G5C+DA,MAAM,E4C5EhB,A5C4EU,Y4C5EE,CAkCV,aAAa,CAUX,oBAAoB,G5CgCd,MAAM,E8C5EhB,A9C4EU,oB8C5EU,CAGlB,EAAE,CASA,YAAY,G9CgEN,MAAM,E8C5EhB,A9C4EU,oB8C5EU,CAGlB,EAAE,CAsBA,gBAAgB,G9CmDV,MAAM,E+C5EhB,A/C4EU,+B+C5EqB,CAC7B,iBAAiB,CACf,gBAAgB,G/C0EV,MAAM;EADZ,AACM,OADC,GAAG,IAAI,GACR,MAAM,E6B5EhB,A7B4EU,e6B5EK;E7B2EX,OAAO,G6BvET,cAAc,G7BwEN,MAAM,EgC5EhB,AhC4EU,YgC5EE,CACV,EAAE;EhC0EA,OAAO,GgCvEP,CAAC,GhCwEK,MAAM,EgC5EhB,AhC4EU,YgC5EE,CACV,EAAE,CmBDJ,kBAAkB;EnD2Ed,OAAO,GmDpET,aAAa,GnDqEL,MAAM,EmD5EhB,AnD4EU,kBmD5EQ,CnBAlB,YAAY,CACV,EAAE;EhC0EA,OAAO,GmDpET,aAAa,GnDqEL,MAAM,EgC5EhB,AhC4EU,YgC5EE,CACV,EAAE,CqBDJ,wBAAwB;ErD2EpB,OAAO,GqD3DT,aAAa,GrD4DL,MAAM,EqD5EhB,ArD4EU,wBqD5Ec,CrBAxB,YAAY,CACV,EAAE;EhC0EA,OAAO,GqD3DT,aAAa,GrD4DL,MAAM,EgC5EhB,AhC4EU,YgC5EE,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;EtD0EtB,OAAO,GsDtDP,aAAa,GtDuDP,MAAM,EsD5EhB,AtD4EU,6BsD5EmB,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;EhC0EA,OAAO,GsDtDP,aAAa,GtDuDP,MAAM,EgC5EhB,AhC4EU,YgC5EE,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;EtD8CpB,OAAO,GsD1BP,aAAa,GtD2BP,MAAM,EsDhDhB,AtDgDU,2BsDhDiB,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;EhC0EA,OAAO,GsD1BP,aAAa,GtD2BP,MAAM,EgC5EhB,AhC4EU,YgC5EE,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;E1DPZ,OAAO,G0DYL,gBAAgB,G1DXZ,MAAM,E0DLhB,A1DKU,sB0DLY,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;EhC0EA,OAAO,G0DYL,gBAAgB,G1DXZ,MAAM;EADZ,AACM,OADC,GiC3EX,sBAAsB,GjC4EZ,MAAM,EsC5EhB,AtC4EU,iBsC5EO,CA2Bf,cAAc,CAYZ,eAAe;EtCoCf,OAAO,GsCnCL,cAAc,GtCoCV,MAAM,E4C5EhB,A5C4EU,Y4C5EE,CAYV,cAAc;E5C+DZ,OAAO,G4C9DP,MAAM,G5C+DA,MAAM,E4C5EhB,A5C4EU,Y4C5EE,CAkCV,aAAa;E5CyCX,OAAO,G4C/BP,oBAAoB,G5CgCd,MAAM,E8C5EhB,A9C4EU,oB8C5EU,CAGlB,EAAE;E9CwEA,OAAO,G8C/DP,YAAY,G9CgEN,MAAM,E8C5EhB,A9C4EU,oB8C5EU,CAGlB,EAAE;E9CwEA,OAAO,G8ClDP,gBAAgB,G9CmDV,MAAM,E+C5EhB,A/C4EU,+B+C5EqB,CAC7B,iBAAiB;E/C0Ef,OAAO,G+CzEP,gBAAgB,G/C0EV,MAAM,CAAC;IACL,gBAAgB,EAAE,eAAgB,GACrC;EAEL,AAAA,MAAM,EkChFV,AlCgFI,ekChFW,AACZ,qBAAqB,EiBDxB,AnDgFI,kBmDhFc,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,CnDoDH;IACH,MAAM,EAAE,cAAe,GAC1B;EAED,AAAA,MAAM,EiDpFV,AjDoFI,sBiDpFkB,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,CjDYA;IACH,eAAe,EAAE,mBAAoB,GAMxC;IAPD,AAGI,MAHE,CAGF,EAAE,EiDvFV,AjDuFQ,sBiDvFc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,CjDeH,EAAE;IAHN,AAII,MAJE,CAIF,EAAE,EiDxFV,AjDwFQ,sBiDxFc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,CjDgBH,EAAE,CAAC;MACC,gBAAgB,EAAE,eAAgB,GACrC;EAEL,AACI,eADW,CACX,EAAE;EADN,AAEI,eAFW,CAEX,EAAE,CAAC;IACC,MAAM,EAAE,yBAA0B,GACrC;;ACtFT,AAAA,CAAC,CAAC;EpBgEA,kBAAkB,EoB/DE,UAAU;EpBgE3B,eAAe,EoBhEE,UAAU;EpBiEtB,UAAU,EoBjEE,UAAU,GAC/B;;AACD,AAAC,CAAA,AAAA,OAAO;AACR,AAAC,CAAA,AAAA,MAAM,CAAC;EpB4DN,kBAAkB,EoB3DE,UAAU;EpB4D3B,eAAe,EoB5DE,UAAU;EpB6DtB,UAAU,EoB7DE,UAAU,GAC/B;;AAKD,AAAA,IAAI,CAAC;EACH,SAAS,EAAE,IAAK;EAChB,2BAA2B,EAAE,WAAI,GAClC;;AAED,AAAA,IAAI,CAAC;EACH,WAAW,ElCkBa,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU;EkCjBtE,SAAS,ElCuBe,IAAI;EkCtB5B,WAAW,ElCkCa,OAAW;EkCjCnC,KAAK,ElClBkB,OAAO;EkCmB9B,gBAAgB,ElCFM,IAAI,GkCG3B;;AAGD,AAAA,KAAK;AACL,AAAA,MAAM;AACN,AAAA,MAAM;AACN,AAAA,QAAQ,CAAC;EACP,WAAW,EAAE,OAAQ;EACrB,SAAS,EAAE,OAAQ;EACnB,WAAW,EAAE,OAAQ,GACtB;;AAKD,AAAA,CAAC,EkD/CD,AlD+CA,kBkD/CkB,CAOhB,aAAa,EEPf,ApD+CA,wBoD/CwB,CAgBtB,aAAa,EChBf,ArD+CA,6BqD/C6B,CAC3B,wBAAwB,CAoBtB,aAAa,EAOjB,ArDmBA,2BqDnB2B,CACzB,sBAAsB,CAoBpB,aAAa,EIsBjB,AzDxBA,sByDwBsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,CzDxCpB;EACA,KAAK,ElC/BiB,OAAM;EkCgC5B,eAAe,EAAE,IAAK,GAWvB;EAbD,AAAA,CAAC,AAIE,MAAM,EkDnDT,AlD+CA,kBkD/CkB,CAOhB,aAAa,AlD4CZ,MAAM,EoDnDT,ApD+CA,wBoD/CwB,CAgBtB,aAAa,ApDmCZ,MAAM,EqDnDT,ArD+CA,6BqD/C6B,CAC3B,wBAAwB,CAoBtB,aAAa,ArD8Bd,MAAM,EqDvBT,ArDmBA,2BqDnB2B,CACzB,sBAAsB,CAoBpB,aAAa,ArDEd,MAAM,EyDoBT,AzDxBA,sByDwBsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,AzDpCnB,MAAM,EAJT,AAAA,CAAC,AAKE,MAAM,EkDpDT,AlD+CA,kBkD/CkB,CAOhB,aAAa,AlD6CZ,MAAM,EoDpDT,ApD+CA,wBoD/CwB,CAgBtB,aAAa,ApDoCZ,MAAM,EqDpDT,ArD+CA,6BqD/C6B,CAC3B,wBAAwB,CAoBtB,aAAa,ArD+Bd,MAAM,EqDxBT,ArDmBA,2BqDnB2B,CACzB,sBAAsB,CAoBpB,aAAa,ArDGd,MAAM,EyDmBT,AzDxBA,sByDwBsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,AzDnCnB,MAAM,CAAC;IACN,KAAK,ElCjBe,OAAM;IkCkB1B,eAAe,ElChBK,SAAS,GkCiB9B;EARH,AAAA,CAAC,AAUE,MAAM,EkDzDT,AlD+CA,kBkD/CkB,CAOhB,aAAa,AlDkDZ,MAAM,EoDzDT,ApD+CA,wBoD/CwB,CAgBtB,aAAa,ApDyCZ,MAAM,EqDzDT,ArD+CA,6BqD/C6B,CAC3B,wBAAwB,CAoBtB,aAAa,ArDoCd,MAAM,EqD7BT,ArDmBA,2BqDnB2B,CACzB,sBAAsB,CAoBpB,aAAa,ArDQd,MAAM,EyDcT,AzDxBA,sByDwBsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,AzD9BnB,MAAM,CAAC;IxBrDR,OAAO,EAAE,WAAY;IAErB,OAAO,EAAE,iCAAkC;IAC3C,cAAc,EAAE,IAAK,GwBoDpB;;AASH,AAAA,MAAM,CAAC;EACL,MAAM,EAAE,CAAE,GACX;;AAKD,AAAA,GAAG,CAAC;EACF,cAAc,EAAE,MAAO,GACxB;;AAGD,AAAA,eAAe,CAAC;E9BvEd,OAAO,EADuB,KAAK;EAEnC,SAAS,EAAE,IAAK;EAChB,MAAM,EAAE,IAAK,G8BuEd;;AAGD,AAAA,YAAY,CAAC;EACX,aAAa,ElCwBa,GAAG,GkCvB9B;;AAKD,AAAA,cAAc,CAAC;EACb,OAAO,ElCgpBqB,GAAG;EkC/oB/B,WAAW,ElC/Ba,OAAW;EkCgCnC,gBAAgB,ElClEM,IAAI;EkCmE1B,MAAM,EAAE,GAAG,CAAC,KAAK,ClCipBW,IAAI;EkChpBhC,aAAa,ElCYa,GAAG;Ec4E7B,kBAAkB,EoBvFE,GAAG,CAAC,IAAG,CAAC,WAAW;EpBwFlC,aAAa,EoBxFE,GAAG,CAAC,IAAG,CAAC,WAAW;EpByF/B,UAAU,EoBzFE,GAAG,CAAC,IAAG,CAAC,WAAW;E9BzFvC,OAAO,E8B4FiB,YAAY;E9B3FpC,SAAS,EAAE,IAAK;EAChB,MAAM,EAAE,IAAK,G8B2Fd;;AAGD,AAAA,WAAW,CAAC;EACV,aAAa,EAAE,GAAI,GACpB;;AAKD,AAAA,EAAE,CAAC;EACD,UAAU,ElChDc,IAAK;EkCiD7B,aAAa,ElCjDW,IAAK;EkCkD7B,MAAM,EAAE,CAAE;EACV,UAAU,EAAE,GAAG,CAAC,KAAK,ClCrGE,OAAO,GkCsG/B;;AAOD,AAAA,QAAQ,CAAC;EACP,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,GAAI;EACX,MAAM,EAAE,GAAI;EACZ,MAAM,EAAE,IAAK;EACb,OAAO,EAAE,CAAE;EACX,QAAQ,EAAE,MAAO;EACjB,IAAI,EAAE,gBAAI;EACV,MAAM,EAAE,CAAE,GACX;;AAMD,AAAA,kBAAkB,AACf,OAAO,EADV,AAAA,kBAAkB,AAEf,MAAM,CAAC;EACN,QAAQ,EAAE,MAAO;EACjB,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EACb,MAAM,EAAE,CAAE;EACV,QAAQ,EAAE,OAAQ;EAClB,IAAI,EAAE,IAAK,GACZ;;CAUH,AAAA,AAAc,IAAb,CAAK,QAAQ,AAAb,EAAe;EACd,MAAM,EAAE,OAAQ,GACjB;;ACxJD,AAAA,EAAE,EAAE,AAAA,EAAE,EAAE,AAAA,EAAE,EAAE,AAAA,EAAE,EAAE,AAAA,EAAE,EAAE,AAAA,EAAE;AACtB,AAAA,GAAG,EAAE,AAAA,GAAG,EAAE,AAAA,GAAG,EAAE,AAAA,GAAG,EAAE,AAAA,GAAG,EAAE,AAAA,GAAG,CAAC;EAC3B,WAAW,EnC0Da,OAAO;EmCzD/B,WAAW,EnC0Da,GAAG;EmCzD3B,WAAW,EnC0Da,GAAG;EmCzD3B,KAAK,EnC0DmB,OAAO,GmClDhC;EAbD,AAOE,EAPA,CAOA,KAAK;EAPP,AAQE,EARA,CAQA,MAAM,EARJ,AAOF,EAPI,CAOJ,KAAK;EAPH,AAQF,EARI,CAQJ,MAAM,EARA,AAON,EAPQ,CAOR,KAAK;EAPC,AAQN,EARQ,CAQR,MAAM,EARI,AAOV,EAPY,CAOZ,KAAK;EAPK,AAQV,EARY,CAQZ,MAAM,EARQ,AAOd,EAPgB,CAOhB,KAAK;EAPS,AAQd,EARgB,CAQhB,MAAM,EARY,AAOlB,EAPoB,CAOpB,KAAK;EAPa,AAQlB,EARoB,CAQpB,MAAM;EAPR,AAME,GANC,CAMD,KAAK;EANP,AAOE,GAPC,CAOD,MAAM,EAPH,AAMH,GANM,CAMN,KAAK;EANF,AAOH,GAPM,CAON,MAAM,EAPE,AAMR,GANW,CAMX,KAAK;EANG,AAOR,GAPW,CAOX,MAAM,EAPO,AAMb,GANgB,CAMhB,KAAK;EANQ,AAOb,GAPgB,CAOhB,MAAM,EAPY,AAMlB,GANqB,CAMrB,KAAK;EANa,AAOlB,GAPqB,CAOrB,MAAM,EAPiB,AAMvB,GAN0B,CAM1B,KAAK;EANkB,AAOvB,GAP0B,CAO1B,MAAM,CAAC;IACL,WAAW,EAAE,MAAO;IACpB,WAAW,EAAE,CAAE;IACf,KAAK,EnCLgB,OAAO,GmCM7B;;AAGH,AAAA,EAAE,EAAE,AAAA,GAAG;AACP,AAAA,EAAE,EAAE,AAAA,GAAG;AACP,AAAA,EAAE,EAAE,AAAA,GAAG,CAAC;EACN,UAAU,EnCuCc,IAAK;EmCtC7B,aAAa,EAAG,IAAqB,GAMtC;EAVD,AAME,EANA,CAMA,KAAK;EANP,AAOE,EAPA,CAOA,MAAM,EAPJ,AAMF,GANK,CAML,KAAK;EANH,AAOF,GAPK,CAOL,MAAM;EANR,AAKE,EALA,CAKA,KAAK;EALP,AAME,EANA,CAMA,MAAM,EANJ,AAKF,GALK,CAKL,KAAK;EALH,AAMF,GANK,CAML,MAAM;EALR,AAIE,EAJA,CAIA,KAAK;EAJP,AAKE,EALA,CAKA,MAAM,EALJ,AAIF,GAJK,CAIL,KAAK;EAJH,AAKF,GALK,CAKL,MAAM,CAAC;IACL,SAAS,EAAE,GAAI,GAChB;;AAEH,AAAA,EAAE,EAAE,AAAA,GAAG;AACP,AAAA,EAAE,EAAE,AAAA,GAAG;AACP,AAAA,EAAE,EAAE,AAAA,GAAG,CAAC;EACN,UAAU,EAAG,IAAqB;EAClC,aAAa,EAAG,IAAqB,GAMtC;EAVD,AAME,EANA,CAMA,KAAK;EANP,AAOE,EAPA,CAOA,MAAM,EAPJ,AAMF,GANK,CAML,KAAK;EANH,AAOF,GAPK,CAOL,MAAM;EANR,AAKE,EALA,CAKA,KAAK;EALP,AAME,EANA,CAMA,MAAM,EANJ,AAKF,GALK,CAKL,KAAK;EALH,AAMF,GANK,CAML,MAAM;EALR,AAIE,EAJA,CAIA,KAAK;EAJP,AAKE,EALA,CAKA,MAAM,EALJ,AAIF,GAJK,CAIL,KAAK;EAJH,AAKF,GALK,CAKL,MAAM,CAAC;IACL,SAAS,EAAE,GAAI,GAChB;;AAGH,AAAA,EAAE,EAAE,AAAA,GAAG,CAAC;EAAE,SAAS,EnCSO,IAAK,GmCTO;;AACtC,AAAA,EAAE,EAAE,AAAA,GAAG,CAAC;EAAE,SAAS,EnCSO,IAAK,GmCTO;;AACtC,AAAA,EAAE,EAAE,AAAA,GAAG,CAAC;EAAE,SAAS,EnCSO,IAAI,GmCTQ;;AACtC,AAAA,EAAE,EAAE,AAAA,GAAG,CAAC;EAAE,SAAS,EnCSO,IAAI,GmCTQ;;AACtC,AAAA,EAAE,EAAE,AAAA,GAAG,CAAC;EAAE,SAAS,EnCCO,IAAI,GmCDQ;;AACtC,AAAA,EAAE,EAAE,AAAA,GAAG,CAAC;EAAE,SAAS,EnCSO,IAAI,GmCTQ;;AAMtC,AAAA,CAAC,CAAC;EACA,MAAM,EAAE,CAAC,CAAC,CAAC,CAAE,IAAqB,GACnC;;AAED,AAAA,KAAK,CAAC;EACJ,aAAa,EnCGW,IAAK;EmCF7B,SAAS,EAAE,IAAK;EAChB,WAAW,EAAE,GAAI;EACjB,WAAW,EAAE,GAAI,GAKlB;EAHC,MAAM,EAAL,SAAS,EAAE,KAAK;IANnB,AAAA,KAAK,CAAC;MAOF,SAAS,EAAG,IAAe,GAE9B;;AAOD,AAAA,KAAK;AACL,AAAA,MAAM,CAAC;EACL,SAAS,EAAE,GAAK,GACjB;;AAED,AAAA,IAAI;AACJ,AAAA,KAAK,CAAC;EACJ,gBAAgB,EnC4ae,OAAO;EmC3atC,OAAO,EAAE,IAAK,GACf;;AAGD,AAAA,UAAU,CAAW;EAAE,UAAU,EAAE,IAAK,GAAI;;AAC5C,AAAA,WAAW,CAAU;EAAE,UAAU,EAAE,KAAM,GAAI;;AAC7C,AAAA,YAAY,CAAS;EAAE,UAAU,EAAE,MAAO,GAAI;;AAC9C,AAAA,aAAa,CAAQ;EAAE,UAAU,EAAE,OAAQ,GAAI;;AAC/C,AAAA,YAAY,CAAS;EAAE,WAAW,EAAE,MAAO,GAAI;;AAG/C,AAAA,eAAe,CAAM;EAAE,cAAc,EAAE,SAAU,GAAI;;AACrD,AAAA,eAAe,EAyIf,AAzIA,WAyIW,CAzIU;EAAE,cAAc,EAAE,SAAU,GAAI;;AACrD,AAAA,gBAAgB,CAAK;EAAE,cAAc,EAAE,UAAW,GAAI;;AAGtD,AAAA,WAAW,CAAC;EACV,KAAK,EnCxFkB,OAAO,GmCyF/B;;AvBnGC,AAAA,aAAa,CAAb;EACE,KAAK,EZYe,OAAM,GYX3B;;AACD,AAAc,CAAb,AAAA,aAAa,AAAA,MAAM,EwEPtB,AxEOE,kBwEPgB,CxEOf,aAAa,AwEAd,aAAa,AxEAC,MAAM,E0EPtB,A1EOE,wB0EPsB,C1EOrB,aAAa,A0ESd,aAAa,A1ETC,MAAM,E2EPtB,A3EOE,6B2EP2B,CAC3B,wBAAwB,C3EMvB,aAAa,A2EcZ,aAAa,A3EdD,MAAM,E2EqBtB,A3ErBE,2B2EqByB,CACzB,sBAAsB,C3EtBrB,aAAa,A2E0CZ,aAAa,A3E1CD,MAAM,E+EgEtB,A/EhEE,sB+EgEoB,CACpB,YAAY,CAUV,YAAY,C/E3Eb,aAAa,A+EgFV,gBAAgB,A/EhFN,MAAM;AACpB,AAAc,CAAb,AAAA,aAAa,AAAA,MAAM;AwERtB,AxEOsB,kBwEPJ,CxEQf,aAAa,AwEDd,aAAa,AxECC,MAAM;A0ERtB,A1EOsB,wB0EPE,C1EQrB,aAAa,A0EQd,aAAa,A1ERC,MAAM;A2ERtB,A3EOsB,6B2EPO,CAC3B,wBAAwB,C3EOvB,aAAa,A2EaZ,aAAa,A3EbD,MAAM;A2EoBtB,A3ErBsB,2B2EqBK,CACzB,sBAAsB,C3ErBrB,aAAa,A2EyCZ,aAAa,A3EzCD,MAAM;A+E+DtB,A/EhEsB,sB+EgEA,CACpB,YAAY,CAUV,YAAY,C/E1Eb,aAAa,A+E+EV,gBAAgB,A/E/EN,MAAM,CADpB;EACE,KAAK,EAAE,OAAM,GACd;;AALD,AAAA,aAAa,CAAb;EACE,KAAK,EZkfwB,OAAO,GYjfrC;;AACD,AAAc,CAAb,AAAA,aAAa,AAAA,MAAM,EwEPtB,AxEOE,kBwEPgB,CxEOf,aAAa,AwEAd,aAAa,AxEAC,MAAM,E0EPtB,A1EOE,wB0EPsB,C1EOrB,aAAa,A0ESd,aAAa,A1ETC,MAAM,E2EPtB,A3EOE,6B2EP2B,CAC3B,wBAAwB,C3EMvB,aAAa,A2EcZ,aAAa,A3EdD,MAAM,E2EqBtB,A3ErBE,2B2EqByB,CACzB,sBAAsB,C3EtBrB,aAAa,A2E0CZ,aAAa,A3E1CD,MAAM,E+EgEtB,A/EhEE,sB+EgEoB,CACpB,YAAY,CAUV,YAAY,C/E3Eb,aAAa,A+EgFV,gBAAgB,A/EhFN,MAAM;AACpB,AAAc,CAAb,AAAA,aAAa,AAAA,MAAM;AwERtB,AxEOsB,kBwEPJ,CxEQf,aAAa,AwEDd,aAAa,AxECC,MAAM;A0ERtB,A1EOsB,wB0EPE,C1EQrB,aAAa,A0EQd,aAAa,A1ERC,MAAM;A2ERtB,A3EOsB,6B2EPO,CAC3B,wBAAwB,C3EOvB,aAAa,A2EaZ,aAAa,A3EbD,MAAM;A2EoBtB,A3ErBsB,2B2EqBK,CACzB,sBAAsB,C3ErBrB,aAAa,A2EyCZ,aAAa,A3EzCD,MAAM;A+E+DtB,A/EhEsB,sB+EgEA,CACpB,YAAY,CAUV,YAAY,C/E1Eb,aAAa,A+E+EV,gBAAgB,A/E/EN,MAAM,CADpB;EACE,KAAK,EAAE,OAAM,GACd;;AALD,AAAA,UAAU,CAAV;EACE,KAAK,EZsfwB,OAAO,GYrfrC;;AACD,AAAW,CAAV,AAAA,UAAU,AAAA,MAAM,EwEPnB,AxEOE,kBwEPgB,CxEOf,UAAU,AwEAX,aAAa,AxEAF,MAAM,E0EPnB,A1EOE,wB0EPsB,C1EOrB,UAAU,A0ESX,aAAa,A1ETF,MAAM,E2EPnB,A3EOE,6B2EP2B,CAC3B,wBAAwB,C3EMvB,UAAU,A2EcT,aAAa,A3EdJ,MAAM,E2EqBnB,A3ErBE,2B2EqByB,CACzB,sBAAsB,C3EtBrB,UAAU,A2E0CT,aAAa,A3E1CJ,MAAM,E+EgEnB,A/EhEE,sB+EgEoB,CACpB,YAAY,CAUV,YAAY,C/E3Eb,UAAU,A+EgFP,gBAAgB,A/EhFT,MAAM;AACjB,AAAW,CAAV,AAAA,UAAU,AAAA,MAAM;AwERnB,AxEOmB,kBwEPD,CxEQf,UAAU,AwEDX,aAAa,AxECF,MAAM;A0ERnB,A1EOmB,wB0EPK,C1EQrB,UAAU,A0EQX,aAAa,A1ERF,MAAM;A2ERnB,A3EOmB,6B2EPU,CAC3B,wBAAwB,C3EOvB,UAAU,A2EaT,aAAa,A3EbJ,MAAM;A2EoBnB,A3ErBmB,2B2EqBQ,CACzB,sBAAsB,C3ErBrB,UAAU,A2EyCT,aAAa,A3EzCJ,MAAM;A+E+DnB,A/EhEmB,sB+EgEG,CACpB,YAAY,CAUV,YAAY,C/E1Eb,UAAU,A+E+EP,gBAAgB,A/E/ET,MAAM,CADjB;EACE,KAAK,EAAE,OAAM,GACd;;AALD,AAAA,aAAa,CAAb;EACE,KAAK,EZ0fwB,OAAO,GYzfrC;;AACD,AAAc,CAAb,AAAA,aAAa,AAAA,MAAM,EwEPtB,AxEOE,kBwEPgB,CxEOf,aAAa,AwEAd,aAAa,AxEAC,MAAM,E0EPtB,A1EOE,wB0EPsB,C1EOrB,aAAa,A0ESd,aAAa,A1ETC,MAAM,E2EPtB,A3EOE,6B2EP2B,CAC3B,wBAAwB,C3EMvB,aAAa,A2EcZ,aAAa,A3EdD,MAAM,E2EqBtB,A3ErBE,2B2EqByB,CACzB,sBAAsB,C3EtBrB,aAAa,A2E0CZ,aAAa,A3E1CD,MAAM,E+EgEtB,A/EhEE,sB+EgEoB,CACpB,YAAY,CAUV,YAAY,C/E3Eb,aAAa,A+EgFV,gBAAgB,A/EhFN,MAAM;AACpB,AAAc,CAAb,AAAA,aAAa,AAAA,MAAM;AwERtB,AxEOsB,kBwEPJ,CxEQf,aAAa,AwEDd,aAAa,AxECC,MAAM;A0ERtB,A1EOsB,wB0EPE,C1EQrB,aAAa,A0EQd,aAAa,A1ERC,MAAM;A2ERtB,A3EOsB,6B2EPO,CAC3B,wBAAwB,C3EOvB,aAAa,A2EaZ,aAAa,A3EbD,MAAM;A2EoBtB,A3ErBsB,2B2EqBK,CACzB,sBAAsB,C3ErBrB,aAAa,A2EyCZ,aAAa,A3EzCD,MAAM;A+E+DtB,A/EhEsB,sB+EgEA,CACpB,YAAY,CAUV,YAAY,C/E1Eb,aAAa,A+E+EV,gBAAgB,A/E/EN,MAAM,CADpB;EACE,KAAK,EAAE,OAAM,GACd;;AALD,AAAA,YAAY,CAAZ;EACE,KAAK,EZ8fwB,OAAO,GY7frC;;AACD,AAAa,CAAZ,AAAA,YAAY,AAAA,MAAM,EwEPrB,AxEOE,kBwEPgB,CxEOf,YAAY,AwEAb,aAAa,AxEAA,MAAM,E0EPrB,A1EOE,wB0EPsB,C1EOrB,YAAY,A0ESb,aAAa,A1ETA,MAAM,E2EPrB,A3EOE,6B2EP2B,CAC3B,wBAAwB,C3EMvB,YAAY,A2EcX,aAAa,A3EdF,MAAM,E2EqBrB,A3ErBE,2B2EqByB,CACzB,sBAAsB,C3EtBrB,YAAY,A2E0CX,aAAa,A3E1CF,MAAM,E+EgErB,A/EhEE,sB+EgEoB,CACpB,YAAY,CAUV,YAAY,C/E3Eb,YAAY,A+EgFT,gBAAgB,A/EhFP,MAAM;AACnB,AAAa,CAAZ,AAAA,YAAY,AAAA,MAAM;AwERrB,AxEOqB,kBwEPH,CxEQf,YAAY,AwEDb,aAAa,AxECA,MAAM;A0ERrB,A1EOqB,wB0EPG,C1EQrB,YAAY,A0EQb,aAAa,A1ERA,MAAM;A2ERrB,A3EOqB,6B2EPQ,CAC3B,wBAAwB,C3EOvB,YAAY,A2EaX,aAAa,A3EbF,MAAM;A2EoBrB,A3ErBqB,2B2EqBM,CACzB,sBAAsB,C3ErBrB,YAAY,A2EyCX,aAAa,A3EzCF,MAAM;A+E+DrB,A/EhEqB,sB+EgEC,CACpB,YAAY,CAUV,YAAY,C/E1Eb,YAAY,A+E+ET,gBAAgB,A/E/EP,MAAM,CADnB;EACE,KAAK,EAAE,OAAM,GACd;;AuB6GH,AAAA,WAAW,CAAC;EAGV,KAAK,EAAE,IAAK,GACb;;AXtHC,AAAA,WAAW,CAAX;EACE,gBAAgB,ExBYI,OAAM,GwBX3B;;AACD,AAAY,CAAX,AAAA,WAAW,AAAA,MAAM,E4DPpB,A5DOE,kB4DPgB,C5DOf,WAAW,A4DAZ,aAAa,A5DAD,MAAM,E8DPpB,A9DOE,wB8DPsB,C9DOrB,WAAW,A8DSZ,aAAa,A9DTD,MAAM,E+DPpB,A/DOE,6B+DP2B,CAC3B,wBAAwB,C/DMvB,WAAW,A+DcV,aAAa,A/DdH,MAAM,E+DqBpB,A/DrBE,2B+DqByB,CACzB,sBAAsB,C/DtBrB,WAAW,A+D0CV,aAAa,A/D1CH,MAAM,EmEgEpB,AnEhEE,sBmEgEoB,CACpB,YAAY,CAUV,YAAY,CnE3Eb,WAAW,AmEgFR,gBAAgB,AnEhFR,MAAM;AAClB,AAAY,CAAX,AAAA,WAAW,AAAA,MAAM;A4DRpB,A5DOoB,kB4DPF,C5DQf,WAAW,A4DDZ,aAAa,A5DCD,MAAM;A8DRpB,A9DOoB,wB8DPI,C9DQrB,WAAW,A8DQZ,aAAa,A9DRD,MAAM;A+DRpB,A/DOoB,6B+DPS,CAC3B,wBAAwB,C/DOvB,WAAW,A+DaV,aAAa,A/DbH,MAAM;A+DoBpB,A/DrBoB,2B+DqBO,CACzB,sBAAsB,C/DrBrB,WAAW,A+DyCV,aAAa,A/DzCH,MAAM;AmE+DpB,AnEhEoB,sBmEgEE,CACpB,YAAY,CAUV,YAAY,CnE1Eb,WAAW,AmE+ER,gBAAgB,AnE/ER,MAAM,CADlB;EACE,gBAAgB,EAAE,OAAM,GACzB;;AALD,AAAA,WAAW,CAAX;EACE,gBAAgB,ExBmfa,OAAO,GwBlfrC;;AACD,AAAY,CAAX,AAAA,WAAW,AAAA,MAAM,E4DPpB,A5DOE,kB4DPgB,C5DOf,WAAW,A4DAZ,aAAa,A5DAD,MAAM,E8DPpB,A9DOE,wB8DPsB,C9DOrB,WAAW,A8DSZ,aAAa,A9DTD,MAAM,E+DPpB,A/DOE,6B+DP2B,CAC3B,wBAAwB,C/DMvB,WAAW,A+DcV,aAAa,A/DdH,MAAM,E+DqBpB,A/DrBE,2B+DqByB,CACzB,sBAAsB,C/DtBrB,WAAW,A+D0CV,aAAa,A/D1CH,MAAM,EmEgEpB,AnEhEE,sBmEgEoB,CACpB,YAAY,CAUV,YAAY,CnE3Eb,WAAW,AmEgFR,gBAAgB,AnEhFR,MAAM;AAClB,AAAY,CAAX,AAAA,WAAW,AAAA,MAAM;A4DRpB,A5DOoB,kB4DPF,C5DQf,WAAW,A4DDZ,aAAa,A5DCD,MAAM;A8DRpB,A9DOoB,wB8DPI,C9DQrB,WAAW,A8DQZ,aAAa,A9DRD,MAAM;A+DRpB,A/DOoB,6B+DPS,CAC3B,wBAAwB,C/DOvB,WAAW,A+DaV,aAAa,A/DbH,MAAM;A+DoBpB,A/DrBoB,2B+DqBO,CACzB,sBAAsB,C/DrBrB,WAAW,A+DyCV,aAAa,A/DzCH,MAAM;AmE+DpB,AnEhEoB,sBmEgEE,CACpB,YAAY,CAUV,YAAY,CnE1Eb,WAAW,AmE+ER,gBAAgB,AnE/ER,MAAM,CADlB;EACE,gBAAgB,EAAE,OAAM,GACzB;;AALD,AAAA,QAAQ,CAAR;EACE,gBAAgB,ExBufa,OAAO,GwBtfrC;;AACD,AAAS,CAAR,AAAA,QAAQ,AAAA,MAAM,E4DPjB,A5DOE,kB4DPgB,C5DOf,QAAQ,A4DAT,aAAa,A5DAJ,MAAM,E8DPjB,A9DOE,wB8DPsB,C9DOrB,QAAQ,A8DST,aAAa,A9DTJ,MAAM,E+DPjB,A/DOE,6B+DP2B,CAC3B,wBAAwB,C/DMvB,QAAQ,A+DcP,aAAa,A/DdN,MAAM,E+DqBjB,A/DrBE,2B+DqByB,CACzB,sBAAsB,C/DtBrB,QAAQ,A+D0CP,aAAa,A/D1CN,MAAM,EmEgEjB,AnEhEE,sBmEgEoB,CACpB,YAAY,CAUV,YAAY,CnE3Eb,QAAQ,AmEgFL,gBAAgB,AnEhFX,MAAM;AACf,AAAS,CAAR,AAAA,QAAQ,AAAA,MAAM;A4DRjB,A5DOiB,kB4DPC,C5DQf,QAAQ,A4DDT,aAAa,A5DCJ,MAAM;A8DRjB,A9DOiB,wB8DPO,C9DQrB,QAAQ,A8DQT,aAAa,A9DRJ,MAAM;A+DRjB,A/DOiB,6B+DPY,CAC3B,wBAAwB,C/DOvB,QAAQ,A+DaP,aAAa,A/DbN,MAAM;A+DoBjB,A/DrBiB,2B+DqBU,CACzB,sBAAsB,C/DrBrB,QAAQ,A+DyCP,aAAa,A/DzCN,MAAM;AmE+DjB,AnEhEiB,sBmEgEK,CACpB,YAAY,CAUV,YAAY,CnE1Eb,QAAQ,AmE+EL,gBAAgB,AnE/EX,MAAM,CADf;EACE,gBAAgB,EAAE,OAAM,GACzB;;AALD,AAAA,WAAW,CAAX;EACE,gBAAgB,ExB2fa,OAAO,GwB1frC;;AACD,AAAY,CAAX,AAAA,WAAW,AAAA,MAAM,E4DPpB,A5DOE,kB4DPgB,C5DOf,WAAW,A4DAZ,aAAa,A5DAD,MAAM,E8DPpB,A9DOE,wB8DPsB,C9DOrB,WAAW,A8DSZ,aAAa,A9DTD,MAAM,E+DPpB,A/DOE,6B+DP2B,CAC3B,wBAAwB,C/DMvB,WAAW,A+DcV,aAAa,A/DdH,MAAM,E+DqBpB,A/DrBE,2B+DqByB,CACzB,sBAAsB,C/DtBrB,WAAW,A+D0CV,aAAa,A/D1CH,MAAM,EmEgEpB,AnEhEE,sBmEgEoB,CACpB,YAAY,CAUV,YAAY,CnE3Eb,WAAW,AmEgFR,gBAAgB,AnEhFR,MAAM;AAClB,AAAY,CAAX,AAAA,WAAW,AAAA,MAAM;A4DRpB,A5DOoB,kB4DPF,C5DQf,WAAW,A4DDZ,aAAa,A5DCD,MAAM;A8DRpB,A9DOoB,wB8DPI,C9DQrB,WAAW,A8DQZ,aAAa,A9DRD,MAAM;A+DRpB,A/DOoB,6B+DPS,CAC3B,wBAAwB,C/DOvB,WAAW,A+DaV,aAAa,A/DbH,MAAM;A+DoBpB,A/DrBoB,2B+DqBO,CACzB,sBAAsB,C/DrBrB,WAAW,A+DyCV,aAAa,A/DzCH,MAAM;AmE+DpB,AnEhEoB,sBmEgEE,CACpB,YAAY,CAUV,YAAY,CnE1Eb,WAAW,AmE+ER,gBAAgB,AnE/ER,MAAM,CADlB;EACE,gBAAgB,EAAE,OAAM,GACzB;;AALD,AAAA,UAAU,CAAV;EACE,gBAAgB,ExB+fa,OAAO,GwB9frC;;AACD,AAAW,CAAV,AAAA,UAAU,AAAA,MAAM,E4DPnB,A5DOE,kB4DPgB,C5DOf,UAAU,A4DAX,aAAa,A5DAF,MAAM,E8DPnB,A9DOE,wB8DPsB,C9DOrB,UAAU,A8DSX,aAAa,A9DTF,MAAM,E+DPnB,A/DOE,6B+DP2B,CAC3B,wBAAwB,C/DMvB,UAAU,A+DcT,aAAa,A/DdJ,MAAM,E+DqBnB,A/DrBE,2B+DqByB,CACzB,sBAAsB,C/DtBrB,UAAU,A+D0CT,aAAa,A/D1CJ,MAAM,EmEgEnB,AnEhEE,sBmEgEoB,CACpB,YAAY,CAUV,YAAY,CnE3Eb,UAAU,AmEgFP,gBAAgB,AnEhFT,MAAM;AACjB,AAAW,CAAV,AAAA,UAAU,AAAA,MAAM;A4DRnB,A5DOmB,kB4DPD,C5DQf,UAAU,A4DDX,aAAa,A5DCF,MAAM;A8DRnB,A9DOmB,wB8DPK,C9DQrB,UAAU,A8DQX,aAAa,A9DRF,MAAM;A+DRnB,A/DOmB,6B+DPU,CAC3B,wBAAwB,C/DOvB,UAAU,A+DaT,aAAa,A/DbJ,MAAM;A+DoBnB,A/DrBmB,2B+DqBQ,CACzB,sBAAsB,C/DrBrB,UAAU,A+DyCT,aAAa,A/DzCJ,MAAM;AmE+DnB,AnEhEmB,sBmEgEG,CACpB,YAAY,CAUV,YAAY,CnE1Eb,UAAU,AmE+EP,gBAAgB,AnE/ET,MAAM,CADjB;EACE,gBAAgB,EAAE,OAAM,GACzB;;AWgIH,AAAA,YAAY,CAAC;EACX,cAAc,EAAI,GAAqB;EACvC,MAAM,EAAG,IAAqB,CAAM,CAAC,CnC1Eb,IAAK;EmC2E7B,aAAa,EAAE,GAAG,CAAC,KAAK,CnC7HD,OAAO,GmC8H/B;;AAOD,AAAA,EAAE;AACF,AAAA,EAAE,CAAC;EACD,UAAU,EAAE,CAAE;EACd,aAAa,EAAG,IAAqB,GAKtC;EARD,AAIE,EAJA,CAIA,EAAE;EAJJ,AAKE,EALA,CAKA,EAAE;EAJJ,AAGE,EAHA,CAGA,EAAE;EAHJ,AAIE,EAJA,CAIA,EAAE,CAAC;IACD,aAAa,EAAE,CAAE,GAClB;;AAWH,AAAA,cAAc,CAAC;EAJb,YAAY,EAAE,CAAE;EAChB,UAAU,EAAE,IAAK,GAKlB;;AAID,AAAA,YAAY,CAAC;EAVX,YAAY,EAAE,CAAE;EAChB,UAAU,EAAE,IAAK;EAWjB,WAAW,EAAE,IAAK,GAOnB;EATD,AAII,YAJQ,GAIR,EAAE,CAAC;IACH,OAAO,EAAE,YAAa;IACtB,YAAY,EAAE,GAAI;IAClB,aAAa,EAAE,GAAI,GACpB;;AAIH,AAAA,EAAE,CAAC;EACD,UAAU,EAAE,CAAE;EACd,aAAa,EnCzHW,IAAK,GmC0H9B;;AACD,AAAA,EAAE;AACF,AAAA,EAAE,CAAC;EACD,WAAW,EnC/Ha,OAAW,GmCgIpC;;AACD,AAAA,EAAE,CAAC;EACD,WAAW,EAAE,IAAK,GACnB;;AACD,AAAA,EAAE,CAAC;EACD,WAAW,EAAE,CAAE,GAChB;;AAOD,AACE,cADY,CACZ,EAAE,ARhMD,OAAO,EQ+LV,AACE,cADY,CACZ,EAAE,AR/LD,MAAM,CAAC;EACN,OAAO,EAAE,GAAI;EACb,OAAO,EAAE,KAAM,GAChB;;AQ2LH,AACE,cADY,CACZ,EAAE,AR3LD,MAAM,CAAC;EACN,KAAK,EAAE,IAAK,GACb;;AQ6LD,MAAM,EAAL,SAAS,EAAE,KAAK;EALnB,AAMI,cANU,CAMV,EAAE,CAAC;IACD,KAAK,EAAE,IAAK;IACZ,KAAK,EAAG,KAAqB;IAC7B,KAAK,EAAE,IAAK;IACZ,UAAU,EAAE,KAAM;ItBlNtB,QAAQ,EAAE,MAAO;IACjB,aAAa,EAAE,QAAS;IACxB,WAAW,EAAE,MAAO,GsBkNjB;EAZL,AAaI,cAbU,CAaV,EAAE,CAAC;IACD,WAAW,EnC2nBa,KAAK,GmC1nB9B;;AASL,AAAU,IAAN,CAAA,AAAA,KAAC,AAAA;AAEL,AAAwB,IAApB,CAAA,AAAA,mBAAC,AAAA,EAAqB;EACxB,MAAM,EAAE,IAAK;EACb,aAAa,EAAE,GAAG,CAAC,MAAM,CnC1NF,OAAO,GmC2N/B;;AACD,AAAA,WAAW,CAAC;EACV,SAAS,EAAE,GAAI,GAEhB;;AAGD,AAAA,UAAU,CAAC;EACT,OAAO,EAAG,IAAqB,CnChLP,IAAK;EmCiL7B,MAAM,EAAE,CAAC,CAAC,CAAC,CnCjLa,IAAK;EmCkL7B,SAAS,EnC4mBoB,MAAe;EmC3mB5C,WAAW,EAAE,GAAG,CAAC,KAAK,CnCrOC,OAAO,GmC6P/B;EA5BD,AAME,UANQ,CAMR,CAAC,AAGE,WAAW;EAThB,AAOE,UAPQ,CAOR,EAAE,AAEC,WAAW;EAThB,AAQE,UARQ,CAQR,EAAE,AACC,WAAW,CAAC;IACX,aAAa,EAAE,CAAE,GAClB;EAXL,AAgBE,UAhBQ,CAgBR,MAAM;EAhBR,AAiBE,UAjBQ,CAiBR,KAAK;EAjBP,AAkBE,UAlBQ,CAkBR,MAAM,CAAC;IACL,OAAO,EAAE,KAAM;IACf,SAAS,EAAE,GAAI;IACf,WAAW,EnCtMW,OAAW;ImCuMjC,KAAK,EnCxPgB,OAAO,GmC6P7B;IA3BH,AAgBE,UAhBQ,CAgBR,MAAM,AAQH,OAAO;IAxBZ,AAiBE,UAjBQ,CAiBR,KAAK,AAOF,OAAO;IAxBZ,AAkBE,UAlBQ,CAkBR,MAAM,AAMH,OAAO,CAAC;MACP,OAAO,EAAE,aAAc,GACxB;;AAOL,AAAA,mBAAmB;AACnB,AAAU,UAAA,AAAA,WAAW,CAAC;EACpB,aAAa,EAAE,IAAK;EACpB,YAAY,EAAE,CAAE;EAChB,YAAY,EAAE,GAAG,CAAC,KAAK,CnCtQA,OAAO;EmCuQ9B,WAAW,EAAE,CAAE;EACf,UAAU,EAAE,KAAM,GAWnB;EAjBD,AASE,mBATiB,CASjB,MAAM,AAGH,OAAO;EAZZ,AAUE,mBAViB,CAUjB,KAAK,AAEF,OAAO;EAZZ,AAWE,mBAXiB,CAWjB,MAAM,AACH,OAAO;EAXZ,AAQE,UARQ,AAAA,WAAW,CAQnB,MAAM,AAGH,OAAO;EAXZ,AASE,UATQ,AAAA,WAAW,CASnB,KAAK,AAEF,OAAO;EAXZ,AAUE,UAVQ,AAAA,WAAW,CAUnB,MAAM,AACH,OAAO,CAAC;IAAE,OAAO,EAAE,EAAG,GAAI;EAZ/B,AASE,mBATiB,CASjB,MAAM,AAIH,MAAM;EAbX,AAUE,mBAViB,CAUjB,KAAK,AAGF,MAAM;EAbX,AAWE,mBAXiB,CAWjB,MAAM,AAEH,MAAM;EAZX,AAQE,UARQ,AAAA,WAAW,CAQnB,MAAM,AAIH,MAAM;EAZX,AASE,UATQ,AAAA,WAAW,CASnB,KAAK,AAGF,MAAM;EAZX,AAUE,UAVQ,AAAA,WAAW,CAUnB,MAAM,AAEH,MAAM,CAAC;IACN,OAAO,EAAE,aAAc,GACxB;;AAKL,AAAA,OAAO,CAAC;EACN,aAAa,EnCrOW,IAAK;EmCsO7B,UAAU,EAAE,MAAO;EACnB,WAAW,EnCzOa,OAAW,GmC0OpC;;ACnSD,AAAA,IAAI;AACJ,AAAA,GAAG;AACH,AAAA,GAAG;AACH,AAAA,IAAI,CAAC;EACH,WAAW,EpCsCa,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,GoCrC1E;;AAGD,AAAA,IAAI,CAAC;EACH,OAAO,EAAE,OAAQ;EACjB,SAAS,EAAE,GAAI;EACf,KAAK,EpCmzBuB,OAAO;EoClzBnC,gBAAgB,EpCmzBY,OAAO;EoClzBnC,aAAa,EpC0Fa,GAAG,GoCzF9B;;AAGD,AAAA,GAAG,CAAC;EACF,OAAO,EAAE,OAAQ;EACjB,SAAS,EAAE,GAAI;EACf,KAAK,EpC6yBuB,IAAI;EoC5yBhC,gBAAgB,EpC6yBY,IAAI;EoC5yBhC,aAAa,EpCmFa,GAAG;EoClF7B,UAAU,EAAE,KAAK,CAAC,CAAC,CAAE,IAAG,CAAC,CAAC,CAAC,mBAAI,GAQhC;EAdD,AAQE,GARC,CAQD,GAAG,CAAC;IACF,OAAO,EAAE,CAAE;IACX,SAAS,EAAE,IAAK;IAChB,WAAW,EAAE,IAAK;IAClB,UAAU,EAAE,IAAK,GAClB;;AAIH,AAAA,GAAG,CAAC;EACF,OAAO,EAAE,KAAM;EACf,OAAO,EAAI,KAAqB;EAChC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAE,IAAqB;EAClC,SAAS,EAAG,IAAe;EAC3B,WAAW,EpCkBa,OAAW;EoCjBnC,UAAU,EAAE,SAAU;EACtB,SAAS,EAAE,UAAW;EACtB,KAAK,EpCpCkB,OAAO;EoCqC9B,gBAAgB,EpCyxBY,OAAO;EoCxxBnC,MAAM,EAAE,GAAG,CAAC,KAAK,CpC0xBW,IAAI;EoCzxBhC,aAAa,EpC0Da,GAAG,GoC/C9B;EAtBD,AAcE,GAdC,CAcD,IAAI,CAAC;IACH,OAAO,EAAE,CAAE;IACX,SAAS,EAAE,OAAQ;IACnB,KAAK,EAAE,OAAQ;IACf,WAAW,EAAE,QAAS;IACtB,gBAAgB,EAAE,WAAY;IAC9B,aAAa,EAAE,CAAE,GAClB;;AAIH,AAAA,eAAe,CAAC;EACd,UAAU,EpC2wBkB,KAAK;EoC1wBjC,UAAU,EAAE,MAAO,GACpB;;AC/DD,AAAA,KAAK,CAAC;EACJ,gBAAgB,ErCgIc,WAAW,GqC/H1C;;AACD,AAAA,OAAO,CAAC;EACN,WAAW,ErCwHmB,GAAG;EqCvHjC,cAAc,ErCuHgB,GAAG;EqCtHjC,KAAK,ErCGkB,OAAO;EqCF9B,UAAU,EAAE,IAAK,GAClB;;AACD,AAAA,EAAE,CAAC;EACD,UAAU,EAAE,IAAK,GAClB;;AAKD,AAAA,MAAM,E6CrBN,A7CqBA,sB6CrBsB,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,C7CnDJ;EACL,KAAK,EAAE,IAAK;EACZ,SAAS,EAAE,IAAK;EAChB,aAAa,ErCyCW,IAAK,GqCD9B;EA3CD,AASQ,MATF,GAKF,KAAK,GAGH,EAAE,GACA,EAAE,E6C9BV,A7C8BQ,sB6C9Bc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G7C9CP,KAAK,GAGH,EAAE,GACA,EAAE;EATV,AAUQ,MAVF,GAKF,KAAK,GAGH,EAAE,GAEA,EAAE,E6C/BV,A7C+BQ,sB6C/Bc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G7C9CP,KAAK,GAGH,EAAE,GAEA,EAAE;EAVV,AASQ,MATF,GAMF,KAAK,GAEH,EAAE,GACA,EAAE,E6C9BV,A7C8BQ,sB6C9Bc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G7C7CP,KAAK,GAEH,EAAE,GACA,EAAE;EATV,AAUQ,MAVF,GAMF,KAAK,GAEH,EAAE,GAEA,EAAE,E6C/BV,A7C+BQ,sB6C/Bc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G7C7CP,KAAK,GAEH,EAAE,GAEA,EAAE;EAVV,AASQ,MATF,GAOF,KAAK,GACH,EAAE,GACA,EAAE,E6C9BV,A7C8BQ,sB6C9Bc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G7C5CP,KAAK,GACH,EAAE,GACA,EAAE;EATV,AAUQ,MAVF,GAOF,KAAK,GACH,EAAE,GAEA,EAAE,E6C/BV,A7C+BQ,sB6C/Bc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G7C5CP,KAAK,GACH,EAAE,GAEA,EAAE,CAAC;IACH,OAAO,ErCiGiB,GAAG;IqChG3B,WAAW,ErC8BO,OAAW;IqC7B7B,cAAc,EAAE,GAAI;IACpB,UAAU,EAAE,GAAG,CAAC,KAAK,CrC2GG,IAAI,GqC1G7B;EAfP,AAmBiB,MAnBX,GAmBF,KAAK,GAAG,EAAE,GAAG,EAAE,E6CxCnB,A7CwCiB,sB6CxCK,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G7ChCP,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC;IAChB,cAAc,EAAE,MAAO;IACvB,aAAa,EAAE,GAAG,CAAC,KAAK,CrCoGI,IAAI,GqCnGjC;EAtBH,AA4BQ,MA5BF,GAwBF,OAAO,GAAG,KAAK,GAGb,EAAE,AAAA,YAAY,GACZ,EAAE,E6CjDV,A7CiDQ,sB6CjDc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G7C3BP,OAAO,GAAG,KAAK,GAGb,EAAE,AAAA,YAAY,GACZ,EAAE;EA5BV,AA6BQ,MA7BF,GAwBF,OAAO,GAAG,KAAK,GAGb,EAAE,AAAA,YAAY,GAEZ,EAAE,E6ClDV,A7CkDQ,sB6ClDc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G7C3BP,OAAO,GAAG,KAAK,GAGb,EAAE,AAAA,YAAY,GAEZ,EAAE;EA7BV,AA4BQ,MA5BF,GAyBF,QAAQ,GAAG,KAAK,GAEd,EAAE,AAAA,YAAY,GACZ,EAAE,E6CjDV,A7CiDQ,sB6CjDc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G7C1BP,QAAQ,GAAG,KAAK,GAEd,EAAE,AAAA,YAAY,GACZ,EAAE;EA5BV,AA6BQ,MA7BF,GAyBF,QAAQ,GAAG,KAAK,GAEd,EAAE,AAAA,YAAY,GAEZ,EAAE,E6ClDV,A7CkDQ,sB6ClDc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G7C1BP,QAAQ,GAAG,KAAK,GAEd,EAAE,AAAA,YAAY,GAEZ,EAAE;EA7BV,AA4BQ,MA5BF,GA0BF,KAAK,AAAA,YAAY,GACf,EAAE,AAAA,YAAY,GACZ,EAAE,E6CjDV,A7CiDQ,sB6CjDc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G7CzBP,KAAK,AAAA,YAAY,GACf,EAAE,AAAA,YAAY,GACZ,EAAE;EA5BV,AA6BQ,MA7BF,GA0BF,KAAK,AAAA,YAAY,GACf,EAAE,AAAA,YAAY,GAEZ,EAAE,E6ClDV,A7CkDQ,sB6ClDc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G7CzBP,KAAK,AAAA,YAAY,GACf,EAAE,AAAA,YAAY,GAEZ,EAAE,CAAC;IACH,UAAU,EAAE,CAAE,GACf;EA/BP,AAmCY,MAnCN,GAmCF,KAAK,GAAG,KAAK,E6CxDjB,A7CwDY,sB6CxDU,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G7ChBP,KAAK,GAAG,KAAK,CAAC;IACd,UAAU,EAAE,GAAG,CAAC,KAAK,CrCqFO,IAAI,GqCpFjC;EArCH,AAwCE,MAxCI,CAwCJ,MAAM,E6C7DR,A7C6DE,sB6C7DoB,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,C7CXT,MAAM,EAxCR,AAwCE,MAxCI,C6CrBN,sBAAsB,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,EAxEX,A7C6DE,sB6C7DoB,CASpB,YAAY,CA+BV,YAAY,C7CnBhB,MAAM,C6CmDA,KAAK,EAxEX,A7C6DE,sB6C7DoB,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,CAAL,KAAK,C7CXF;IACL,gBAAgB,ErCjCI,IAAI,GqCkCzB;;AAMH,AAKQ,gBALQ,GACZ,KAAK,GAGH,EAAE,GACA,EAAE;AALV,AAMQ,gBANQ,GACZ,KAAK,GAGH,EAAE,GAEA,EAAE;AANV,AAKQ,gBALQ,GAEZ,KAAK,GAEH,EAAE,GACA,EAAE;AALV,AAMQ,gBANQ,GAEZ,KAAK,GAEH,EAAE,GAEA,EAAE;AANV,AAKQ,gBALQ,GAGZ,KAAK,GACH,EAAE,GACA,EAAE;AALV,AAMQ,gBANQ,GAGZ,KAAK,GACH,EAAE,GAEA,EAAE,CAAC;EACH,OAAO,ErCuDiB,GAAG,GqCtD5B;;AAUP,AAAA,eAAe,CAAC;EACd,MAAM,EAAE,GAAG,CAAC,KAAK,CrCsDa,IAAI,GqCrCnC;EAlBD,AAMQ,eANO,GAEX,KAAK,GAGH,EAAE,GACA,EAAE;EANV,AAOQ,eAPO,GAEX,KAAK,GAGH,EAAE,GAEA,EAAE;EAPV,AAMQ,eANO,GAGX,KAAK,GAEH,EAAE,GACA,EAAE;EANV,AAOQ,eAPO,GAGX,KAAK,GAEH,EAAE,GAEA,EAAE;EAPV,AAMQ,eANO,GAIX,KAAK,GACH,EAAE,GACA,EAAE;EANV,AAOQ,eAPO,GAIX,KAAK,GACH,EAAE,GAEA,EAAE,CAAC;IACH,MAAM,EAAE,GAAG,CAAC,KAAK,CrC+CO,IAAI,GqC9C7B;EATP,AAaM,eAbS,GAYX,KAAK,GAAG,EAAE,GACR,EAAE;EAbR,AAcM,eAdS,GAYX,KAAK,GAAG,EAAE,GAER,EAAE,CAAC;IACH,mBAAmB,EAAE,GAAI,GAC1B;;AASL,AAC8B,cADhB,GACV,KAAK,GAAG,EAAE,AAAA,YAAa,CAAA,AAAA,GAAG,G6CjH9B,A7CiH8B,sB6CjHR,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G7CyCP,KAAK,GAAG,EAAE,AAAA,YAAa,CAAA,AAAA,GAAG,EAAE;EAC5B,gBAAgB,ErCsBY,OAAO,GqCrBpC;;AAQH,AACc,YADF,GACR,KAAK,GAAG,EAAE,AAAA,MAAM,CAAC;EACjB,gBAAgB,ErCaY,OAAO,GqCZpC;;AAQH,AAAuB,KAAlB,CAAC,GAAG,CAAA,AAAA,KAAC,EAAO,MAAM,AAAb,EAAe;EACvB,QAAQ,EAAE,MAAO;EACjB,KAAK,EAAE,IAAK;EACZ,OAAO,EAAE,YAAa,GACvB;;AACD,AACE,KADG,CACH,EAAE,CAEC,AAAA,KAAC,EAAO,MAAM,AAAb;AAHN,AAEE,KAFG,CAEH,EAAE,CACC,AAAA,KAAC,EAAO,MAAM,AAAb,EAAe;EACf,QAAQ,EAAE,MAAO;EACjB,KAAK,EAAE,IAAK;EACZ,OAAO,EAAE,UAAW,GACrB;;Ad7IH,AAGM,MAHA,GAAG,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,OAAO,E2DRf,A3DQQ,sB2DRc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,OAAO;AAHb,AAIM,MAJA,GAAG,KAAK,GAAG,EAAE,GAIf,EAAE,AAAA,OAAO,E2DTf,A3DSQ,sB2DTc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,GAIf,EAAE,AAAA,OAAO;AAJb,AAKa,MALP,GAAG,KAAK,GAAG,EAAE,AAKhB,OAAO,GAAG,EAAE,E2DVjB,A3DUe,sB2DVO,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,AAKhB,OAAO,GAAG,EAAE;AALf,AAMa,MANP,GAAG,KAAK,GAAG,EAAE,AAMhB,OAAO,GAAG,EAAE,E2DXjB,A3DWe,sB2DXO,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,AAMhB,OAAO,GAAG,EAAE;AALf,AAEM,MAFA,GAAG,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,OAAO,E2DRf,A3DQQ,sB2DRc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,OAAO;AAFb,AAGM,MAHA,GAAG,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,OAAO,E2DTf,A3DSQ,sB2DTc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,OAAO;AAHb,AAIa,MAJP,GAAG,KAAK,GAAG,EAAE,AAIhB,OAAO,GAAG,EAAE,E2DVjB,A3DUe,sB2DVO,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,AAIhB,OAAO,GAAG,EAAE;AAJf,AAKa,MALP,GAAG,KAAK,GAAG,EAAE,AAKhB,OAAO,GAAG,EAAE,E2DXjB,A3DWe,sB2DXO,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,AAKhB,OAAO,GAAG,EAAE;AAJf,AACM,MADA,GAAG,KAAK,GAAG,EAAE,GACf,EAAE,AAAA,OAAO,E2DRf,A3DQQ,sB2DRc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,GACf,EAAE,AAAA,OAAO;AADb,AAEM,MAFA,GAAG,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,OAAO,E2DTf,A3DSQ,sB2DTc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,OAAO;AAFb,AAGa,MAHP,GAAG,KAAK,GAAG,EAAE,AAGhB,OAAO,GAAG,EAAE,E2DVjB,A3DUe,sB2DVO,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,AAGhB,OAAO,GAAG,EAAE;AAHf,AAIa,MAJP,GAAG,KAAK,GAAG,EAAE,AAIhB,OAAO,GAAG,EAAE,E2DXjB,A3DWe,sB2DXO,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,AAIhB,OAAO,GAAG,EAAE,CAHb;EACE,gBAAgB,EvBiIU,OAAO,GuBhIlC;;AAKH,AACa,YADD,GAAG,KAAK,GAAG,EAAE,GACrB,EAAE,AAAA,OAAO,AAAA,MAAM;AADnB,AAEa,YAFD,GAAG,KAAK,GAAG,EAAE,GAErB,EAAE,AAAA,OAAO,AAAA,MAAM;AAFnB,AAGmB,YAHP,GAAG,KAAK,GAAG,EAAE,AAGtB,OAAO,AAAA,MAAM,GAAG,EAAE;AAHrB,AAIY,YAJA,GAAG,KAAK,GAAG,EAAE,AAItB,MAAM,GAAG,OAAO;AAJnB,AAKmB,YALP,GAAG,KAAK,GAAG,EAAE,AAKtB,OAAO,AAAA,MAAM,GAAG,EAAE,CAJnB;EACE,gBAAgB,EAAE,OAAM,GACzB;;AAbH,AAGM,MAHA,GAAG,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,QAAQ,E2DRhB,A3DQQ,sB2DRc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,QAAQ;AAHd,AAIM,MAJA,GAAG,KAAK,GAAG,EAAE,GAIf,EAAE,AAAA,QAAQ,E2DThB,A3DSQ,sB2DTc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,GAIf,EAAE,AAAA,QAAQ;AAJd,AAKc,MALR,GAAG,KAAK,GAAG,EAAE,AAKhB,QAAQ,GAAG,EAAE,E2DVlB,A3DUgB,sB2DVM,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,AAKhB,QAAQ,GAAG,EAAE;AALhB,AAMc,MANR,GAAG,KAAK,GAAG,EAAE,AAMhB,QAAQ,GAAG,EAAE,E2DXlB,A3DWgB,sB2DXM,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,AAMhB,QAAQ,GAAG,EAAE;AALhB,AAEM,MAFA,GAAG,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,QAAQ,E2DRhB,A3DQQ,sB2DRc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,QAAQ;AAFd,AAGM,MAHA,GAAG,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,QAAQ,E2DThB,A3DSQ,sB2DTc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,QAAQ;AAHd,AAIc,MAJR,GAAG,KAAK,GAAG,EAAE,AAIhB,QAAQ,GAAG,EAAE,E2DVlB,A3DUgB,sB2DVM,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,AAIhB,QAAQ,GAAG,EAAE;AAJhB,AAKc,MALR,GAAG,KAAK,GAAG,EAAE,AAKhB,QAAQ,GAAG,EAAE,E2DXlB,A3DWgB,sB2DXM,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,AAKhB,QAAQ,GAAG,EAAE;AAJhB,AACM,MADA,GAAG,KAAK,GAAG,EAAE,GACf,EAAE,AAAA,QAAQ,E2DRhB,A3DQQ,sB2DRc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,GACf,EAAE,AAAA,QAAQ;AADd,AAEM,MAFA,GAAG,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,QAAQ,E2DThB,A3DSQ,sB2DTc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,QAAQ;AAFd,AAGc,MAHR,GAAG,KAAK,GAAG,EAAE,AAGhB,QAAQ,GAAG,EAAE,E2DVlB,A3DUgB,sB2DVM,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,AAGhB,QAAQ,GAAG,EAAE;AAHhB,AAIc,MAJR,GAAG,KAAK,GAAG,EAAE,AAIhB,QAAQ,GAAG,EAAE,E2DXlB,A3DWgB,sB2DXM,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,AAIhB,QAAQ,GAAG,EAAE,CAHd;EACE,gBAAgB,EvB+eW,OAAO,GuB9enC;;AAKH,AACc,YADF,GAAG,KAAK,GAAG,EAAE,GACrB,EAAE,AAAA,QAAQ,AAAA,MAAM;AADpB,AAEc,YAFF,GAAG,KAAK,GAAG,EAAE,GAErB,EAAE,AAAA,QAAQ,AAAA,MAAM;AAFpB,AAGoB,YAHR,GAAG,KAAK,GAAG,EAAE,AAGtB,QAAQ,AAAA,MAAM,GAAG,EAAE;AAHtB,AAIY,YAJA,GAAG,KAAK,GAAG,EAAE,AAItB,MAAM,GAAG,QAAQ;AAJpB,AAKoB,YALR,GAAG,KAAK,GAAG,EAAE,AAKtB,QAAQ,AAAA,MAAM,GAAG,EAAE,CAJpB;EACE,gBAAgB,EAAE,OAAM,GACzB;;AAbH,AAGM,MAHA,GAAG,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,KAAK,E2DRb,A3DQQ,sB2DRc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,KAAK;AAHX,AAIM,MAJA,GAAG,KAAK,GAAG,EAAE,GAIf,EAAE,AAAA,KAAK,E2DTb,A3DSQ,sB2DTc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,GAIf,EAAE,AAAA,KAAK;AAJX,AAKW,MALL,GAAG,KAAK,GAAG,EAAE,AAKhB,KAAK,GAAG,EAAE,E2DVf,A3DUa,sB2DVS,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,AAKhB,KAAK,GAAG,EAAE;AALb,AAMW,MANL,GAAG,KAAK,GAAG,EAAE,AAMhB,KAAK,GAAG,EAAE,E2DXf,A3DWa,sB2DXS,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,AAMhB,KAAK,GAAG,EAAE;AALb,AAEM,MAFA,GAAG,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,KAAK,E2DRb,A3DQQ,sB2DRc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,KAAK;AAFX,AAGM,MAHA,GAAG,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,KAAK,E2DTb,A3DSQ,sB2DTc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,KAAK;AAHX,AAIW,MAJL,GAAG,KAAK,GAAG,EAAE,AAIhB,KAAK,GAAG,EAAE,E2DVf,A3DUa,sB2DVS,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,AAIhB,KAAK,GAAG,EAAE;AAJb,AAKW,MALL,GAAG,KAAK,GAAG,EAAE,AAKhB,KAAK,GAAG,EAAE,E2DXf,A3DWa,sB2DXS,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,AAKhB,KAAK,GAAG,EAAE;AAJb,AACM,MADA,GAAG,KAAK,GAAG,EAAE,GACf,EAAE,AAAA,KAAK,E2DRb,A3DQQ,sB2DRc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,GACf,EAAE,AAAA,KAAK;AADX,AAEM,MAFA,GAAG,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,KAAK,E2DTb,A3DSQ,sB2DTc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,KAAK;AAFX,AAGW,MAHL,GAAG,KAAK,GAAG,EAAE,AAGhB,KAAK,GAAG,EAAE,E2DVf,A3DUa,sB2DVS,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,AAGhB,KAAK,GAAG,EAAE;AAHb,AAIW,MAJL,GAAG,KAAK,GAAG,EAAE,AAIhB,KAAK,GAAG,EAAE,E2DXf,A3DWa,sB2DXS,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,AAIhB,KAAK,GAAG,EAAE,CAHX;EACE,gBAAgB,EvBmfW,OAAO,GuBlfnC;;AAKH,AACW,YADC,GAAG,KAAK,GAAG,EAAE,GACrB,EAAE,AAAA,KAAK,AAAA,MAAM;AADjB,AAEW,YAFC,GAAG,KAAK,GAAG,EAAE,GAErB,EAAE,AAAA,KAAK,AAAA,MAAM;AAFjB,AAGiB,YAHL,GAAG,KAAK,GAAG,EAAE,AAGtB,KAAK,AAAA,MAAM,GAAG,EAAE;AAHnB,AAIY,YAJA,GAAG,KAAK,GAAG,EAAE,AAItB,MAAM,GAAG,KAAK;AAJjB,AAKiB,YALL,GAAG,KAAK,GAAG,EAAE,AAKtB,KAAK,AAAA,MAAM,GAAG,EAAE,CAJjB;EACE,gBAAgB,EAAE,OAAM,GACzB;;AAbH,AAGM,MAHA,GAAG,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,QAAQ,E2DRhB,A3DQQ,sB2DRc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,QAAQ;AAHd,AAIM,MAJA,GAAG,KAAK,GAAG,EAAE,GAIf,EAAE,AAAA,QAAQ,E2DThB,A3DSQ,sB2DTc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,GAIf,EAAE,AAAA,QAAQ;AAJd,AAKc,MALR,GAAG,KAAK,GAAG,EAAE,AAKhB,QAAQ,GAAG,EAAE,E2DVlB,A3DUgB,sB2DVM,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,AAKhB,QAAQ,GAAG,EAAE;AALhB,AAMc,MANR,GAAG,KAAK,GAAG,EAAE,AAMhB,QAAQ,GAAG,EAAE,E2DXlB,A3DWgB,sB2DXM,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,AAMhB,QAAQ,GAAG,EAAE;AALhB,AAEM,MAFA,GAAG,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,QAAQ,E2DRhB,A3DQQ,sB2DRc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,QAAQ;AAFd,AAGM,MAHA,GAAG,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,QAAQ,E2DThB,A3DSQ,sB2DTc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,QAAQ;AAHd,AAIc,MAJR,GAAG,KAAK,GAAG,EAAE,AAIhB,QAAQ,GAAG,EAAE,E2DVlB,A3DUgB,sB2DVM,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,AAIhB,QAAQ,GAAG,EAAE;AAJhB,AAKc,MALR,GAAG,KAAK,GAAG,EAAE,AAKhB,QAAQ,GAAG,EAAE,E2DXlB,A3DWgB,sB2DXM,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,AAKhB,QAAQ,GAAG,EAAE;AAJhB,AACM,MADA,GAAG,KAAK,GAAG,EAAE,GACf,EAAE,AAAA,QAAQ,E2DRhB,A3DQQ,sB2DRc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,GACf,EAAE,AAAA,QAAQ;AADd,AAEM,MAFA,GAAG,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,QAAQ,E2DThB,A3DSQ,sB2DTc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,QAAQ;AAFd,AAGc,MAHR,GAAG,KAAK,GAAG,EAAE,AAGhB,QAAQ,GAAG,EAAE,E2DVlB,A3DUgB,sB2DVM,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,AAGhB,QAAQ,GAAG,EAAE;AAHhB,AAIc,MAJR,GAAG,KAAK,GAAG,EAAE,AAIhB,QAAQ,GAAG,EAAE,E2DXlB,A3DWgB,sB2DXM,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,AAIhB,QAAQ,GAAG,EAAE,CAHd;EACE,gBAAgB,EvBufW,OAAO,GuBtfnC;;AAKH,AACc,YADF,GAAG,KAAK,GAAG,EAAE,GACrB,EAAE,AAAA,QAAQ,AAAA,MAAM;AADpB,AAEc,YAFF,GAAG,KAAK,GAAG,EAAE,GAErB,EAAE,AAAA,QAAQ,AAAA,MAAM;AAFpB,AAGoB,YAHR,GAAG,KAAK,GAAG,EAAE,AAGtB,QAAQ,AAAA,MAAM,GAAG,EAAE;AAHtB,AAIY,YAJA,GAAG,KAAK,GAAG,EAAE,AAItB,MAAM,GAAG,QAAQ;AAJpB,AAKoB,YALR,GAAG,KAAK,GAAG,EAAE,AAKtB,QAAQ,AAAA,MAAM,GAAG,EAAE,CAJpB;EACE,gBAAgB,EAAE,OAAM,GACzB;;AAbH,AAGM,MAHA,GAAG,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,OAAO,E2DRf,A3DQQ,sB2DRc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,OAAO;AAHb,AAIM,MAJA,GAAG,KAAK,GAAG,EAAE,GAIf,EAAE,AAAA,OAAO,E2DTf,A3DSQ,sB2DTc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,GAIf,EAAE,AAAA,OAAO;AAJb,AAKa,MALP,GAAG,KAAK,GAAG,EAAE,AAKhB,OAAO,GAAG,EAAE,E2DVjB,A3DUe,sB2DVO,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,AAKhB,OAAO,GAAG,EAAE;AALf,AAMa,MANP,GAAG,KAAK,GAAG,EAAE,AAMhB,OAAO,GAAG,EAAE,E2DXjB,A3DWe,sB2DXO,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DnEA,KAAK,GAAG,EAAE,AAMhB,OAAO,GAAG,EAAE;AALf,AAEM,MAFA,GAAG,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,OAAO,E2DRf,A3DQQ,sB2DRc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,OAAO;AAFb,AAGM,MAHA,GAAG,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,OAAO,E2DTf,A3DSQ,sB2DTc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,GAGf,EAAE,AAAA,OAAO;AAHb,AAIa,MAJP,GAAG,KAAK,GAAG,EAAE,AAIhB,OAAO,GAAG,EAAE,E2DVjB,A3DUe,sB2DVO,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,AAIhB,OAAO,GAAG,EAAE;AAJf,AAKa,MALP,GAAG,KAAK,GAAG,EAAE,AAKhB,OAAO,GAAG,EAAE,E2DXjB,A3DWe,sB2DXO,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DlEA,KAAK,GAAG,EAAE,AAKhB,OAAO,GAAG,EAAE;AAJf,AACM,MADA,GAAG,KAAK,GAAG,EAAE,GACf,EAAE,AAAA,OAAO,E2DRf,A3DQQ,sB2DRc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,GACf,EAAE,AAAA,OAAO;AADb,AAEM,MAFA,GAAG,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,OAAO,E2DTf,A3DSQ,sB2DTc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,GAEf,EAAE,AAAA,OAAO;AAFb,AAGa,MAHP,GAAG,KAAK,GAAG,EAAE,AAGhB,OAAO,GAAG,EAAE,E2DVjB,A3DUe,sB2DVO,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,AAGhB,OAAO,GAAG,EAAE;AAHf,AAIa,MAJP,GAAG,KAAK,GAAG,EAAE,AAIhB,OAAO,GAAG,EAAE,E2DXjB,A3DWe,sB2DXO,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,G3DjEA,KAAK,GAAG,EAAE,AAIhB,OAAO,GAAG,EAAE,CAHb;EACE,gBAAgB,EvB2fW,OAAO,GuB1fnC;;AAKH,AACa,YADD,GAAG,KAAK,GAAG,EAAE,GACrB,EAAE,AAAA,OAAO,AAAA,MAAM;AADnB,AAEa,YAFD,GAAG,KAAK,GAAG,EAAE,GAErB,EAAE,AAAA,OAAO,AAAA,MAAM;AAFnB,AAGmB,YAHP,GAAG,KAAK,GAAG,EAAE,AAGtB,OAAO,AAAA,MAAM,GAAG,EAAE;AAHrB,AAIY,YAJA,GAAG,KAAK,GAAG,EAAE,AAItB,MAAM,GAAG,OAAO;AAJnB,AAKmB,YALP,GAAG,KAAK,GAAG,EAAE,AAKtB,OAAO,AAAA,MAAM,GAAG,EAAE,CAJnB;EACE,gBAAgB,EAAE,OAAM,GACzB;;AcwJL,AAAA,iBAAiB,CAAC;EAChB,UAAU,EAAE,IAAK;EACjB,UAAU,EAAE,KAAM,GA6DnB;EA3DC,MAAM,CAAN,MAAM,MAAM,SAAS,EAAE,KAAK;IAJ9B,AAAA,iBAAiB,CAAC;MAKd,KAAK,EAAE,IAAK;MACZ,aAAa,EAAG,IAAqB;MACrC,UAAU,EAAE,MAAO;MACnB,kBAAkB,EAAE,wBAAyB;MAC7C,MAAM,EAAE,GAAG,CAAC,KAAK,CrCrCW,IAAI,GqC2FnC;MA/DD,AAYM,iBAZW,GAYX,MAAM,E6CtLZ,A7CsLI,sB6CtLkB,CASpB,YAAY,CA+BV,YAAY,C7CkIhB,iBAAiB,G6ClGX,KAAK,C7C8GE;QACP,aAAa,EAAE,CAAE,GAalB;QA1BL,AAoBY,iBApBK,GAYX,MAAM,GAIJ,KAAK,GAGH,EAAE,GACA,EAAE,E6C9Ld,A7C8LY,sB6C9LU,CASpB,YAAY,CA+BV,YAAY,C7CkIhB,iBAAiB,G6ClGX,KAAK,G7CkHH,KAAK,GAGH,EAAE,GACA,EAAE;QApBd,AAqBY,iBArBK,GAYX,MAAM,GAIJ,KAAK,GAGH,EAAE,GAEA,EAAE,E6C/Ld,A7C+LY,sB6C/LU,CASpB,YAAY,CA+BV,YAAY;Q7CkIhB,iBAAiB,G6ClGX,KAAK,G7CkHH,KAAK,GAGH,EAAE,GAEA,EAAE;QArBd,AAoBY,iBApBK,GAYX,MAAM,GAKJ,KAAK,GAEH,EAAE,GACA,EAAE,E6C9Ld,A7C8LY,sB6C9LU,CASpB,YAAY,CA+BV,YAAY;Q7CkIhB,iBAAiB,G6ClGX,KAAK,G7CmHH,KAAK,GAEH,EAAE,GACA,EAAE;QApBd,AAqBY,iBArBK,GAYX,MAAM,GAKJ,KAAK,GAEH,EAAE,GAEA,EAAE,E6C/Ld,A7C+LY,sB6C/LU,CASpB,YAAY,CA+BV,YAAY;Q7CkIhB,iBAAiB,G6ClGX,KAAK,G7CmHH,KAAK,GAEH,EAAE,GAEA,EAAE;QArBd,AAoBY,iBApBK,GAYX,MAAM,GAMJ,KAAK,GACH,EAAE,GACA,EAAE,E6C9Ld,A7C8LY,sB6C9LU,CASpB,YAAY,CA+BV,YAAY;Q7CkIhB,iBAAiB,G6ClGX,KAAK,G7CoHH,KAAK,GACH,EAAE,GACA,EAAE;QApBd,AAqBY,iBArBK,GAYX,MAAM,GAMJ,KAAK,GACH,EAAE,GAEA,EAAE,E6C/Ld,A7C+LY,sB6C/LU,CASpB,YAAY,CA+BV,YAAY;Q7CkIhB,iBAAiB,G6ClGX,KAAK,G7CoHH,KAAK,GACH,EAAE,GAEA,EAAE,CAAC;UACH,WAAW,EAAE,MAAO,GACrB;MAvBX,AA6BM,iBA7BW,GA6BX,eAAe,CAAC;QAChB,MAAM,EAAE,CAAE,GA+BX;QA7DL,AAqCc,iBArCG,GA6BX,eAAe,GAIb,KAAK,GAGH,EAAE,GACA,EAAE,AAAA,YAAY;QArC1B,AAsCc,iBAtCG,GA6BX,eAAe,GAIb,KAAK,GAGH,EAAE,GAEA,EAAE,AAAA,YAAY;QAtC1B,AAqCc,iBArCG,GA6BX,eAAe,GAKb,KAAK,GAEH,EAAE,GACA,EAAE,AAAA,YAAY;QArC1B,AAsCc,iBAtCG,GA6BX,eAAe,GAKb,KAAK,GAEH,EAAE,GAEA,EAAE,AAAA,YAAY;QAtC1B,AAqCc,iBArCG,GA6BX,eAAe,GAMb,KAAK,GACH,EAAE,GACA,EAAE,AAAA,YAAY;QArC1B,AAsCc,iBAtCG,GA6BX,eAAe,GAMb,KAAK,GACH,EAAE,GAEA,EAAE,AAAA,YAAY,CAAC;UACf,WAAW,EAAE,CAAE,GAChB;QAxCX,AAyCc,iBAzCG,GA6BX,eAAe,GAIb,KAAK,GAGH,EAAE,GAKA,EAAE,AAAA,WAAW;QAzCzB,AA0Cc,iBA1CG,GA6BX,eAAe,GAIb,KAAK,GAGH,EAAE,GAMA,EAAE,AAAA,WAAW;QA1CzB,AAyCc,iBAzCG,GA6BX,eAAe,GAKb,KAAK,GAEH,EAAE,GAKA,EAAE,AAAA,WAAW;QAzCzB,AA0Cc,iBA1CG,GA6BX,eAAe,GAKb,KAAK,GAEH,EAAE,GAMA,EAAE,AAAA,WAAW;QA1CzB,AAyCc,iBAzCG,GA6BX,eAAe,GAMb,KAAK,GACH,EAAE,GAKA,EAAE,AAAA,WAAW;QAzCzB,AA0Cc,iBA1CG,GA6BX,eAAe,GAMb,KAAK,GACH,EAAE,GAMA,EAAE,AAAA,WAAW,CAAC;UACd,YAAY,EAAE,CAAE,GACjB;QA5CX,AAsDY,iBAtDK,GA6BX,eAAe,GAsBb,KAAK,GAEH,EAAE,AAAA,WAAW,GACX,EAAE;QAtDd,AAuDY,iBAvDK,GA6BX,eAAe,GAsBb,KAAK,GAEH,EAAE,AAAA,WAAW,GAEX,EAAE;QAvDd,AAsDY,iBAtDK,GA6BX,eAAe,GAuBb,KAAK,GACH,EAAE,AAAA,WAAW,GACX,EAAE;QAtDd,AAuDY,iBAvDK,GA6BX,eAAe,GAuBb,KAAK,GACH,EAAE,AAAA,WAAW,GAEX,EAAE,CAAC;UACH,aAAa,EAAE,CAAE,GAClB;;AC1NX,AAAA,QAAQ,CAAC;EACP,OAAO,EAAE,CAAE;EACX,MAAM,EAAE,CAAE;EACV,MAAM,EAAE,CAAE;EAIV,SAAS,EAAE,CAAE,GACd;;AAED,AAAA,MAAM,CAAC;EACL,OAAO,EAAE,KAAM;EACf,KAAK,EAAE,IAAK;EACZ,OAAO,EAAE,CAAE;EACX,aAAa,EtC0CW,IAAK;EsCzC7B,SAAS,EAAG,IAAe;EAC3B,WAAW,EAAE,OAAQ;EACrB,KAAK,EtCdkB,OAAO;EsCe9B,MAAM,EAAE,CAAE;EACV,aAAa,EAAE,GAAG,CAAC,KAAK,CtCmMO,OAAO,GsClMvC;;AAED,AAAA,KAAK,CAAC;EACJ,OAAO,EAAE,YAAa;EACtB,SAAS,EAAE,IAAK;EAChB,aAAa,EAAE,GAAI;EACnB,WAAW,EAAE,IAAK,GACnB;;AAUD,AAAmB,KAAd,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,EAAe;ExB4BnB,kBAAkB,EwB3BE,UAAU;ExB4B3B,eAAe,EwB5BE,UAAU;ExB6BtB,UAAU,EwB7BE,UAAU,GAC/B;;AAGD,AAAkB,KAAb,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ;AACN,AAAqB,KAAhB,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf,EAAiB;EACrB,MAAM,EAAE,OAAQ;EAChB,UAAU,EAAE,MAAO;EACnB,WAAW,EAAE,MAAO,GACrB;;AAED,AAAiB,KAAZ,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX,EAAa;EACjB,OAAO,EAAE,KAAM,GAChB;;AAGD,AAAkB,KAAb,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,EAAc;EAClB,OAAO,EAAE,KAAM;EACf,KAAK,EAAE,IAAK,GACb;;AAGD,AAAe,MAAT,CAAA,AAAA,QAAC,AAAA;AACP,AAAW,MAAL,CAAA,AAAA,IAAC,AAAA,EAAM;EACX,MAAM,EAAE,IAAK,GACd;;AAGD,AAAkB,KAAb,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX,CAAY,MAAM;AACxB,AAAmB,KAAd,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,CAAa,MAAM;AACzB,AAAsB,KAAjB,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf,CAAgB,MAAM,CAAC;E5BzE3B,OAAO,EAAE,WAAY;EAErB,OAAO,EAAE,iCAAkC;EAC3C,cAAc,EAAE,IAAK,G4BwEtB;;AAGD,AAAA,MAAM,CAAC;EACL,OAAO,EAAE,KAAM;EACf,WAAW,EAAG,GAAsB;EACpC,SAAS,EtClCe,IAAI;EsCmC5B,WAAW,EtCvBa,OAAW;EsCwBnC,KAAK,EtC1EkB,OAAO,GsC2E/B;;AAyBD,AAAA,aAAa,EuCjHb,AvCiHA,YuCjHY,CAkCV,aAAa,CACX,mBAAmB,EEnCvB,AzCiHA,oByCjHoB,CAGlB,EAAE,CAgBA,eAAe,CzC8FL;EACZ,OAAO,EAAE,KAAM;EACf,KAAK,EAAE,IAAK;EACZ,MAAM,EtCiG0B,IAAqB;EsChGrD,OAAO,EtCvBmB,GAAG,CACH,IAAI;EsCuB9B,SAAS,EtCnEe,IAAI;EsCoE5B,WAAW,EtCxDa,OAAW;EsCyDnC,KAAK,EtC3GkB,OAAO;EsC4G9B,gBAAgB,EtCmEe,IAAI;EsClEnC,gBAAgB,EAAE,IAAK;EACvB,MAAM,EAAE,GAAG,CAAC,KAAK,CtCwEc,IAAI;EsCvEnC,aAAa,EtCfa,GAAG;EczC7B,kBAAkB,EwByDE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI;ExBxDhC,UAAU,EwBwDE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI;ExB4DxC,kBAAkB,EwB3DE,YAAY,CAAC,WAAW,CAAC,KAAI,EAAE,UAAU,CAAC,WAAW,CAAC,KAAI;ExB4DzE,aAAa,EwB5DE,YAAY,CAAC,WAAW,CAAC,KAAI,EAAE,UAAU,CAAC,WAAW,CAAC,KAAI;ExB6DtE,UAAU,EwB7DE,YAAY,CAAC,WAAW,CAAC,KAAI,EAAE,UAAU,CAAC,WAAW,CAAC,KAAI,GA0B/E;EAvCD,AAAA,aAAa,AjBzDV,MAAM,EwDxDT,AvCiHA,YuCjHY,CAkCV,aAAa,CACX,mBAAmB,AxDqBpB,MAAM,E0DxDT,AzCiHA,oByCjHoB,CAGlB,EAAE,CAgBA,eAAe,A1DqChB,MAAM,CAAC;IACN,YAAY,ErBsJiB,OAAO;IqBrJpC,OAAO,EAAE,CAAE;IPUb,kBAAkB,EOTI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI,EAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAJlD,wBAAI;IPcT,UAAU,EOVI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI,EAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAJlD,wBAAI,GAKhB;EiBqDH,AAAA,aAAa,AxBXV,kBAAkB,E+DtGrB,AvCiHA,YuCjHY,CAkCV,aAAa,CACX,mBAAmB,A/DmEpB,kBAAkB,EiEtGrB,AzCiHA,oByCjHoB,CAGlB,EAAE,CAgBA,eAAe,AjEmFhB,kBAAkB,CAAC;IAClB,KAAK,Ed2GwB,IAAI;Ic1GjC,OAAO,EAAE,CAAE,GACZ;EwBQH,AAAA,aAAa,AxBPV,sBAAsB,E+D1GzB,AvCiHA,YuCjHY,CAkCV,aAAa,CACX,mBAAmB,A/DuEpB,sBAAsB,EiE1GzB,AzCiHA,oByCjHoB,CAGlB,EAAE,CAgBA,eAAe,AjEuFhB,sBAAsB,CAAC;IAAE,KAAK,EdwGA,IAAI,GcxGQ;EwBO7C,AAAA,aAAa,AxBNV,2BAA2B,E+D3G9B,AvCiHA,YuCjHY,CAkCV,aAAa,CACX,mBAAmB,A/DwEpB,2BAA2B,EiE3G9B,AzCiHA,oByCjHoB,CAGlB,EAAE,CAgBA,eAAe,AjEwFhB,2BAA2B,CAAE;IAAE,KAAK,EduGN,IAAI,GcvGc;EwBMnD,AAAA,aAAa,CA0BV,AAAA,QAAC,AAAA,GuC3IJ,AvCiHA,YuCjHY,CAkCV,aAAa,EvCyGZ,AAAA,QAAC,AAAA,CuCxGA,mBAAmB,EEnCvB,AzCiHA,oByCjHoB,CAGlB,EAAE,EzCwID,AAAA,QAAC,AAAA,CyCxHA,eAAe,EzC8FnB,AAAA,aAAa,CA2BV,AAAA,QAAC,AAAA,GuC5IJ,AvCiHA,YuCjHY,CAkCV,aAAa,EvC0GZ,AAAA,QAAC,AAAA,CuCzGA,mBAAmB,EEnCvB,AzCiHA,oByCjHoB,CAGlB,EAAE,EzCyID,AAAA,QAAC,AAAA,CyCzHA,eAAe;EzC0HjB,AA5BF,QA4BU,CAAA,AAAA,QAAC,AAAA,EA5BX,aAAa;EA4BX,AA5BF,QA4BU,CAAA,AAAA,QAAC,AAAA,EuC7IX,YAAY,CAkCV,aAAa,CACX,mBAAmB,EAnCvB,AvCiHA,YuCjHY,CAkCV,aAAa;EvC2Gb,QAAQ,CAAA,AAAA,QAAC,AAAA,EuC1GP,mBAAmB;EvC0GrB,AA5BF,QA4BU,CAAA,AAAA,QAAC,AAAA,EyC7IX,oBAAoB,CAGlB,EAAE,CAgBA,eAAe,EAnBnB,AzCiHA,oByCjHoB,CAGlB,EAAE;EzC0IF,QAAQ,CAAA,AAAA,QAAC,AAAA,EyC1HP,eAAe,CzC0HI;IACnB,gBAAgB,EtC/HK,OAAO;IsCgI5B,OAAO,EAAE,CAAE,GACZ;EA/BH,AAAA,aAAa,CAiCV,AAAA,QAAC,AAAA,GuClJJ,AvCiHA,YuCjHY,CAkCV,aAAa,EvCgHZ,AAAA,QAAC,AAAA,CuC/GA,mBAAmB,EEnCvB,AzCiHA,oByCjHoB,CAGlB,EAAE,EzC+ID,AAAA,QAAC,AAAA,CyC/HA,eAAe;EzCgIjB,AAlCF,QAkCU,CAAA,AAAA,QAAC,AAAA,EAlCX,aAAa;EAkCX,AAlCF,QAkCU,CAAA,AAAA,QAAC,AAAA,EuCnJX,YAAY,CAkCV,aAAa,CACX,mBAAmB,EAnCvB,AvCiHA,YuCjHY,CAkCV,aAAa;EvCiHb,QAAQ,CAAA,AAAA,QAAC,AAAA,EuChHP,mBAAmB;EvCgHrB,AAlCF,QAkCU,CAAA,AAAA,QAAC,AAAA,EyCnJX,oBAAoB,CAGlB,EAAE,CAgBA,eAAe,EAnBnB,AzCiHA,oByCjHoB,CAGlB,EAAE;EzCgJF,QAAQ,CAAA,AAAA,QAAC,AAAA,EyChIP,eAAe,CzCgII;IACnB,MAAM,EtCmFuB,WAAW,GsClFzC;;AAMH,AAAQ,QAAA,AAAA,aAAa,EuC3JrB,AvC2JA,YuC3JY,CAkCV,aAAa,CvCyHf,QAAQ,AuCxHJ,mBAAmB,EEnCvB,AzC2JA,oByC3JoB,CAGlB,EAAE,CzCwJJ,QAAQ,AyCxIJ,eAAe,CzCwIG;EACpB,MAAM,EAAE,IAAK,GACd;;AAUD,AAAmB,KAAd,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,EAAe;EACnB,kBAAkB,EAAE,IAAK,GAC1B;;AAYD,MAAM,CAAN,MAAM,MAAM,8BAAC,EAA+B,CAAC;EAC3C,AAAiB,KAAZ,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX,CAIH,aAAa,EuC1LlB,AvCsLE,YuCtLU,CAkCV,aAAa,CvCoJb,KAAK,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX,CuCnJJ,mBAAmB,EEnCvB,AzCsLE,oByCtLkB,CAGlB,EAAE,CzCmLF,KAAK,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX,CyCnKJ,eAAe;EzCoKjB,AAAiB,KAAZ,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX,CAGH,aAAa;EuC1LlB,AvCsLoB,YuCtLR,CAkCV,aAAa,CvCqJb,KAAK,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX,CuCpJJ,mBAAmB;EEnCvB,AzCsLoB,oByCtLA,CAGlB,EAAE,CzCoLF,KAAK,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX,CyCpKJ,eAAe;EzCqKjB,AAA2B,KAAtB,CAAA,AAAA,IAAC,CAAK,gBAAgB,AAArB,CAEH,aAAa;EuC1LlB,AvCuLoB,YuCvLR,CAkCV,aAAa,CvCsJb,KAAK,CAAA,AAAA,IAAC,CAAK,gBAAgB,AAArB,CuCrJJ,mBAAmB;EEnCvB,AzCuLoB,oByCvLA,CAGlB,EAAE,CzCqLF,KAAK,CAAA,AAAA,IAAC,CAAK,gBAAgB,AAArB,CyCrKJ,eAAe;EzCsKjB,AAAkB,KAAb,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,CACH,aAAa;EuC1LlB,AvCwL8B,YuCxLlB,CAkCV,aAAa,CvCuJb,KAAK,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,CuCtJJ,mBAAmB;EEnCvB,AzCwL8B,oByCxLV,CAGlB,EAAE,CzCsLF,KAAK,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,CyCtKJ,eAAe,CzCuKA;IACb,WAAW,EtC0BiB,IAAqB,GsCzBlD;EANH,AAAiB,KAAZ,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX,CAQH,SAAS;EACV,AATe,eASA,CATjB,KAAK,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX;EACN,AAAiB,KAAZ,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX,CAOH,SAAS;EACV,AARe,eAQA;EARjB,KAAK,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX;EACN,AAA2B,KAAtB,CAAA,AAAA,IAAC,CAAK,gBAAgB,AAArB,CAMH,SAAS;EACV,AAPyB,eAOV;EAPjB,KAAK,CAAA,AAAA,IAAC,CAAK,gBAAgB,AAArB;EACN,AAAkB,KAAb,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,CAKH,SAAS;EACV,AANgB,eAMD;EANjB,KAAK,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,EAMc;IAChB,WAAW,EtCyBiB,IAAK,GsCxBlC;EAXH,AAAiB,KAAZ,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX,CAaH,SAAS;EACV,AAde,eAcA,CAdjB,KAAK,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX;EACN,AAAiB,KAAZ,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX,CAYH,SAAS;EACV,AAbe,eAaA;EAbjB,KAAK,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX;EACN,AAA2B,KAAtB,CAAA,AAAA,IAAC,CAAK,gBAAgB,AAArB,CAWH,SAAS;EACV,AAZyB,eAYV;EAZjB,KAAK,CAAA,AAAA,IAAC,CAAK,gBAAgB,AAArB;EACN,AAAkB,KAAb,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,CAUH,SAAS;EACV,AAXgB,eAWD;EAXjB,KAAK,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,EAWc;IAChB,WAAW,EtCkBiB,IAAI,GsCjBjC;;AAUL,AAAA,WAAW,CAAC;EACV,aAAa,EtCWkB,IAAI,GsCVpC;;AAOD,AAAA,MAAM;AACN,AAAA,SAAS,CAAC;EACR,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,KAAM;EACf,UAAU,EAAE,IAAK;EACjB,aAAa,EAAE,IAAK,GASrB;EAdD,AAOE,MAPI,CAOJ,KAAK;EANP,AAME,SANO,CAMP,KAAK,CAAC;IACJ,UAAU,EtChKY,IAAK;IsCiK3B,YAAY,EAAE,IAAK;IACnB,aAAa,EAAE,CAAE;IACjB,WAAW,EAAE,MAAO;IACpB,MAAM,EAAE,OAAQ,GACjB;;AAEH,AAAyB,MAAnB,CAAC,KAAK,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ;AACb,AAAgC,aAAnB,CAAC,KAAK,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ;AACpB,AAA+B,SAAtB,CAAC,KAAK,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf;AAChB,AAAsC,gBAAtB,CAAC,KAAK,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf,EAAiB;EACtC,QAAQ,EAAE,QAAS;EACnB,WAAW,EAAE,KAAM;EACnB,UAAU,EAAE,MAAO,GACpB;;AAED,AAAS,MAAH,GAAG,MAAM;AACf,AAAY,SAAH,GAAG,SAAS,CAAC;EACpB,UAAU,EAAE,IAAK,GAClB;;AAGD,AAAA,aAAa;AACb,AAAA,gBAAgB,CAAC;EACf,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,YAAa;EACtB,YAAY,EAAE,IAAK;EACnB,aAAa,EAAE,CAAE;EACjB,cAAc,EAAE,MAAO;EACvB,WAAW,EAAE,MAAO;EACpB,MAAM,EAAE,OAAQ,GACjB;;AACD,AAAgB,aAAH,GAAG,aAAa;AAC7B,AAAmB,gBAAH,GAAG,gBAAgB,CAAC;EAClC,UAAU,EAAE,CAAE;EACd,WAAW,EAAE,IAAK,GACnB;;AAMD,AAAkB,KAAb,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,EAEH,AAAA,QAAC,AAAA,GAFJ,AAAkB,KAAb,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,CAGH,SAAS;AACV,AAJgB,QAIR,CAAA,AAAA,QAAC,AAAA,EAJX,KAAK,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ;AACN,AAAqB,KAAhB,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf,EACH,AAAA,QAAC,AAAA;AADJ,AAAqB,KAAhB,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf,CAEH,SAAS;AACV,AAHmB,QAGX,CAAA,AAAA,QAAC,AAAA;AAHX,KAAK,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf,EAGiB;EACnB,MAAM,EtCzCuB,WAAW,GsC0CzC;;AAGH,AAAA,aAAa,AAEV,SAAS;AACV,AAHF,QAGU,CAAA,AAAA,QAAC,AAAA,EAHX,aAAa;AACb,AAAA,gBAAgB,AACb,SAAS;AACV,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA;AAFX,gBAAgB,CAEO;EACnB,MAAM,EtCjDuB,WAAW,GsCkDzC;;AAGH,AAII,MAJE,AAEH,SAAS,CAER,KAAK;AADP,AACE,QADM,CAAA,AAAA,QAAC,AAAA,EAHX,MAAM,CAIF,KAAK;AAHT,AAGI,SAHK,AACN,SAAS,CAER,KAAK;AADP,AACE,QADM,CAAA,AAAA,QAAC,AAAA;AAFX,SAAS,CAGL,KAAK,CAAC;EACJ,MAAM,EtC1DqB,WAAW,GsC2DvC;;AAUL,AAAA,oBAAoB,CAAC;EAEnB,WAAW,EAAG,GAAsB;EACpC,cAAc,EAAG,GAAsB;EAEvC,aAAa,EAAE,CAAE;EACjB,UAAU,EAAG,IAAqB,GAOnC;EAbD,AAAA,oBAAoB,AAQjB,SAAS,EARZ,AAAA,oBAAoB,AASjB,SAAS,CAAC;IACT,YAAY,EAAE,CAAE;IAChB,aAAa,EAAE,CAAE,GAClB;;AjBlPD,AAAA,SAAS,CAAT;EACE,MAAM,ErBkJwB,IAAK;EqBjJnC,OAAO,ErB4BiB,GAAG,CACH,IAAI;EqB5B5B,SAAS,ErBpBa,IAAI;EqBqB1B,WAAW,ErBiCa,GAAG;EqBhC3B,aAAa,ErBoCW,GAAG,GqBnC5B;;AAED,AAAM,MAAA,AAAA,SAAS,CAAf;EACE,MAAM,ErB0IwB,IAAK;EqBzInC,WAAW,ErByImB,IAAK,GqBxIpC;;AAED,AAAQ,QAAA,AAAA,SAAS;AACjB,AAAgB,MAAV,CAAA,AAAA,QAAC,AAAA,CAAS,SAAS,CADzB;EACE,MAAM,EAAE,IAAK,GACd;;AiBgPH,AACE,cADY,CACZ,aAAa,EADf,AACE,cADY,CuCrUd,YAAY,CAkCV,aAAa,CACX,mBAAmB,EAnCvB,AvCsUE,YuCtUU,CAkCV,aAAa,CvCmSf,cAAc,CuClSV,mBAAmB,EvCkSvB,AACE,cADY,CyCrUd,oBAAoB,CAGlB,EAAE,CAgBA,eAAe,EAnBnB,AzCsUE,oByCtUkB,CAGlB,EAAE,CzCkUJ,cAAc,CyClTV,eAAe,CzCmTH;EACZ,MAAM,EtC9GwB,IAAK;EsC+GnC,OAAO,EtCpOiB,GAAG,CACH,IAAI;EsCoO5B,SAAS,EtCpRa,IAAI;EsCqR1B,WAAW,EtC/Na,GAAG;EsCgO3B,aAAa,EtC5NW,GAAG,GsC6N5B;;AAPH,AAQQ,cARM,CAQZ,MAAM,AAAA,aAAa,EARrB,AAQE,cARY,CuCrUd,YAAY,CAkCV,aAAa,CvC2Sb,MAAM,AuC1SJ,mBAAmB,EAnCvB,AvC6UE,YuC7UU,CAkCV,aAAa,CvCmSf,cAAc,CAQZ,MAAM,AuC1SJ,mBAAmB,EvCkSvB,AAQE,cARY,CyCrUd,oBAAoB,CAGlB,EAAE,CzC0UF,MAAM,AyC1TJ,eAAe,EAnBnB,AzC6UE,oByC7UkB,CAGlB,EAAE,CzCkUJ,cAAc,CAQZ,MAAM,AyC1TJ,eAAe,CzC0TG;EAClB,MAAM,EtCrHwB,IAAK;EsCsHnC,WAAW,EtCtHmB,IAAK,GsCuHpC;;AAXH,AAYU,cAZI,CAYZ,QAAQ,AAAA,aAAa,EAZvB,AAYE,cAZY,CuCrUd,YAAY,CAkCV,aAAa,CvC+Sb,QAAQ,AuC9SN,mBAAmB,EAnCvB,AvCiVE,YuCjVU,CAkCV,aAAa,CvCmSf,cAAc,CAYZ,QAAQ,AuC9SN,mBAAmB,EvCkSvB,AAYE,cAZY,CyCrUd,oBAAoB,CAGlB,EAAE,CzC8UF,QAAQ,AyC9TN,eAAe,EAnBnB,AzCiVE,oByCjVkB,CAGlB,EAAE,CzCkUJ,cAAc,CAYZ,QAAQ,AyC9TN,eAAe;AzCkTnB,AAakB,cAbJ,CAaZ,MAAM,CAAA,AAAA,QAAC,AAAA,CAAS,aAAa;AAb/B,AAYuB,cAZT,CuCrUd,YAAY,CAkCV,aAAa,CvCgTb,MAAM,CAAA,AAAA,QAAC,AAAA,CuC/SL,mBAAmB,EAnCvB,AvCiVuB,YuCjVX,CAkCV,aAAa;AvCmSf,cAAc,CAaZ,MAAM,CAAA,AAAA,QAAC,AAAA,CuC/SL,mBAAmB;AvCkSvB,AAYuB,cAZT,CyCrUd,oBAAoB,CAGlB,EAAE,CzC+UF,MAAM,CAAA,AAAA,QAAC,AAAA,CyC/TL,eAAe,EAnBnB,AzCiVuB,oByCjVH,CAGlB,EAAE;AzCkUJ,cAAc,CAaZ,MAAM,CAAA,AAAA,QAAC,AAAA,CyC/TL,eAAe,CzC+Ta;EAC5B,MAAM,EAAE,IAAK,GACd;;AAfH,AAgBE,cAhBY,CAgBZ,oBAAoB,CAAC;EACnB,MAAM,EtC7HwB,IAAK;EsC8HnC,UAAU,EAAG,IAAqB;EAClC,OAAO,EAAG,GAAuB,CtCnPT,IAAI;EsCoP5B,SAAS,EtCpSa,IAAI;EsCqS1B,WAAW,EtC/Oa,GAAG,GsCgP5B;;AjBrRD,AAAA,SAAS,CAAT;EACE,MAAM,ErBgJwB,IAAI;EqB/IlC,OAAO,ErByBiB,IAAI,CACJ,IAAI;EqBzB5B,SAAS,ErBrBa,IAAI;EqBsB1B,WAAW,ErBgCa,OAAS;EqB/BjC,aAAa,ErBmCW,GAAG,GqBlC5B;;AAED,AAAM,MAAA,AAAA,SAAS,CAAf;EACE,MAAM,ErBwIwB,IAAI;EqBvIlC,WAAW,ErBuImB,IAAI,GqBtInC;;AAED,AAAQ,QAAA,AAAA,SAAS;AACjB,AAAgB,MAAV,CAAA,AAAA,QAAC,AAAA,CAAS,SAAS,CADzB;EACE,MAAM,EAAE,IAAK,GACd;;AiB0QH,AACE,cADY,CACZ,aAAa,EADf,AACE,cADY,CuC/Vd,YAAY,CAkCV,aAAa,CACX,mBAAmB,EAnCvB,AvCgWE,YuChWU,CAkCV,aAAa,CvC6Tf,cAAc,CuC5TV,mBAAmB,EvC4TvB,AACE,cADY,CyC/Vd,oBAAoB,CAGlB,EAAE,CAgBA,eAAe,EAnBnB,AzCgWE,oByChWkB,CAGlB,EAAE,CzC4VJ,cAAc,CyC5UV,eAAe,CzC6UH;EACZ,MAAM,EtC1IwB,IAAI;EsC2IlC,OAAO,EtCjQiB,IAAI,CACJ,IAAI;EsCiQ5B,SAAS,EtC/Sa,IAAI;EsCgT1B,WAAW,EtC1Pa,OAAS;EsC2PjC,aAAa,EtCvPW,GAAG,GsCwP5B;;AAPH,AAQQ,cARM,CAQZ,MAAM,AAAA,aAAa,EARrB,AAQE,cARY,CuC/Vd,YAAY,CAkCV,aAAa,CvCqUb,MAAM,AuCpUJ,mBAAmB,EAnCvB,AvCuWE,YuCvWU,CAkCV,aAAa,CvC6Tf,cAAc,CAQZ,MAAM,AuCpUJ,mBAAmB,EvC4TvB,AAQE,cARY,CyC/Vd,oBAAoB,CAGlB,EAAE,CzCoWF,MAAM,AyCpVJ,eAAe,EAnBnB,AzCuWE,oByCvWkB,CAGlB,EAAE,CzC4VJ,cAAc,CAQZ,MAAM,AyCpVJ,eAAe,CzCoVG;EAClB,MAAM,EtCjJwB,IAAI;EsCkJlC,WAAW,EtClJmB,IAAI,GsCmJnC;;AAXH,AAYU,cAZI,CAYZ,QAAQ,AAAA,aAAa,EAZvB,AAYE,cAZY,CuC/Vd,YAAY,CAkCV,aAAa,CvCyUb,QAAQ,AuCxUN,mBAAmB,EAnCvB,AvC2WE,YuC3WU,CAkCV,aAAa,CvC6Tf,cAAc,CAYZ,QAAQ,AuCxUN,mBAAmB,EvC4TvB,AAYE,cAZY,CyC/Vd,oBAAoB,CAGlB,EAAE,CzCwWF,QAAQ,AyCxVN,eAAe,EAnBnB,AzC2WE,oByC3WkB,CAGlB,EAAE,CzC4VJ,cAAc,CAYZ,QAAQ,AyCxVN,eAAe;AzC4UnB,AAakB,cAbJ,CAaZ,MAAM,CAAA,AAAA,QAAC,AAAA,CAAS,aAAa;AAb/B,AAYuB,cAZT,CuC/Vd,YAAY,CAkCV,aAAa,CvC0Ub,MAAM,CAAA,AAAA,QAAC,AAAA,CuCzUL,mBAAmB,EAnCvB,AvC2WuB,YuC3WX,CAkCV,aAAa;AvC6Tf,cAAc,CAaZ,MAAM,CAAA,AAAA,QAAC,AAAA,CuCzUL,mBAAmB;AvC4TvB,AAYuB,cAZT,CyC/Vd,oBAAoB,CAGlB,EAAE,CzCyWF,MAAM,CAAA,AAAA,QAAC,AAAA,CyCzVL,eAAe,EAnBnB,AzC2WuB,oByC3WH,CAGlB,EAAE;AzC4VJ,cAAc,CAaZ,MAAM,CAAA,AAAA,QAAC,AAAA,CyCzVL,eAAe,CzCyVa;EAC5B,MAAM,EAAE,IAAK,GACd;;AAfH,AAgBE,cAhBY,CAgBZ,oBAAoB,CAAC;EACnB,MAAM,EtCzJwB,IAAI;EsC0JlC,UAAU,EAAG,IAAqB;EAClC,OAAO,EAAG,IAAuB,CtChRT,IAAI;EsCiR5B,SAAS,EtC/Ta,IAAI;EsCgU1B,WAAW,EtC1Qa,OAAS,GsC2QlC;;AAQH,AAAA,aAAa,CAAC;EAEZ,QAAQ,EAAE,QAAS,GAMpB;EARD,AAKE,aALW,CAKX,aAAa,EALf,AAKE,aALW,CuC7Xb,YAAY,CAkCV,aAAa,CACX,mBAAmB,EAnCvB,AvCkYE,YuClYU,CAkCV,aAAa,CvC2Vf,aAAa,CuC1VT,mBAAmB,EvC0VvB,AAKE,aALW,CyC7Xb,oBAAoB,CAGlB,EAAE,CAgBA,eAAe,EAnBnB,AzCkYE,oByClYkB,CAGlB,EAAE,CzC0XJ,aAAa,CyC1WT,eAAe,CzC+WH;IACZ,aAAa,EAAG,MAAkB,GACnC;;AAGH,AAAA,sBAAsB,CAAC;EACrB,QAAQ,EAAE,QAAS;EACnB,GAAG,EAAE,CAAE;EACP,KAAK,EAAE,CAAE;EACT,OAAO,EAAE,CAAE;EACX,OAAO,EAAE,KAAM;EACf,KAAK,EtCxL2B,IAAqB;EsCyLrD,MAAM,EtCzL0B,IAAqB;EsC0LrD,WAAW,EtC1LqB,IAAqB;EsC2LrD,UAAU,EAAE,MAAO;EACnB,cAAc,EAAE,IAAK,GACtB;;AACD,AAAY,SAAH,GAAG,sBAAsB;AAClC,AAAkB,eAAH,GAAG,sBAAsB;AACxC,AAA+B,cAAjB,CAAC,aAAa,GAAG,sBAAsB;AAArD,AAA+B,cAAjB,CuCrZd,YAAY,CAkCV,aAAa,CACX,mBAAmB,GvCkXQ,sBAAsB,EuCrZrD,AvCqZ+B,YuCrZnB,CAkCV,aAAa;AvCmXf,cAAc,CuClXV,mBAAmB,GvCkXQ,sBAAsB;AAArD,AAA+B,cAAjB,CyCrZd,oBAAoB,CAGlB,EAAE,CAgBA,eAAe,GzCkYY,sBAAsB,EyCrZrD,AzCqZ+B,oByCrZX,CAGlB,EAAE;AzCkZJ,cAAc,CyClYV,eAAe,GzCkYY,sBAAsB,CAAC;EACpD,KAAK,EtC/L2B,IAAI;EsCgMpC,MAAM,EtChM0B,IAAI;EsCiMpC,WAAW,EtCjMqB,IAAI,GsCkMrC;;AACD,AAAY,SAAH,GAAG,sBAAsB;AAClC,AAAkB,eAAH,GAAG,sBAAsB;AACxC,AAA+B,cAAjB,CAAC,aAAa,GAAG,sBAAsB;AAArD,AAA+B,cAAjB,CuC5Zd,YAAY,CAkCV,aAAa,CACX,mBAAmB,GvCyXQ,sBAAsB,EuC5ZrD,AvC4Z+B,YuC5ZnB,CAkCV,aAAa;AvC0Xf,cAAc,CuCzXV,mBAAmB,GvCyXQ,sBAAsB;AAArD,AAA+B,cAAjB,CyC5Zd,oBAAoB,CAGlB,EAAE,CAgBA,eAAe,GzCyYY,sBAAsB,EyC5ZrD,AzC4Z+B,oByC5ZX,CAGlB,EAAE;AzCyZJ,cAAc,CyCzYV,eAAe,GzCyYY,sBAAsB,CAAC;EACpD,KAAK,EtCpM2B,IAAK;EsCqMrC,MAAM,EtCrM0B,IAAK;EsCsMrC,WAAW,EtCtMqB,IAAK,GsCuMtC;;AAGD,AjB5ZE,YiB4ZU,CjB5ZV,WAAW;AiB4Zb,AjB3ZE,YiB2ZU,CjB3ZV,cAAc;AiB2ZhB,AjB1ZE,YiB0ZU,CjB1ZV,MAAM;AiB0ZR,AjBzZE,YiByZU,CjBzZV,SAAS;AiByZX,AjBxZE,YiBwZU,CjBxZV,aAAa;AiBwZf,AjBvZE,YiBuZU,CjBvZV,gBAAgB;AiBuZlB,AjBtZU,YiBsZE,AjBtZT,MAAM,CAAC,KAAK;AiBsZf,AjBrZa,YiBqZD,AjBrZT,SAAS,CAAC,KAAK;AiBqZlB,AjBpZiB,YiBoZL,AjBpZT,aAAa,CAAC,KAAK;AiBoZtB,AjBnZoB,YiBmZR,AjBnZT,gBAAgB,CAAC,KAAK,CAAE;EACvB,KAAK,ErBsewB,OAAO,GqBrerC;;AiBiZH,AjB/YE,YiB+YU,CjB/YV,aAAa,EiB+Yf,AjB/YE,YiB+YU,CuCnaZ,YAAY,CAkCV,aAAa,CACX,mBAAmB,EAnCvB,AxDoBE,YwDpBU,CAkCV,aAAa,CvCiYf,YAAY,CuChYR,mBAAmB,EvCgYvB,AjB/YE,YiB+YU,CyCnaZ,oBAAoB,CAGlB,EAAE,CAgBA,eAAe,EAnBnB,A1DoBE,oB0DpBkB,CAGlB,EAAE,CzCgaJ,YAAY,CyChZR,eAAe,C1DCH;EACZ,YAAY,ErBkeiB,OAAO;EcnbtC,kBAAkB,EO9CI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI;EP+ClC,UAAU,EO/CI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI,GAMzC;EiBuYH,AjB/YE,YiB+YU,CjB/YV,aAAa,AAGV,MAAM,EiB4YX,AjB/YE,YiB+YU,CuCnaZ,YAAY,CAkCV,aAAa,CACX,mBAAmB,AxDZlB,MAAM,EwDvBX,AxDoBE,YwDpBU,CAkCV,aAAa,CvCiYf,YAAY,CuChYR,mBAAmB,AxDZlB,MAAM,EiB4YX,AjB/YE,YiB+YU,CyCnaZ,oBAAoB,CAGlB,EAAE,CAgBA,eAAe,A1DId,MAAM,E0DvBX,A1DoBE,oB0DpBkB,CAGlB,EAAE,CzCgaJ,YAAY,CyChZR,eAAe,A1DId,MAAM,CAAC;IACN,YAAY,EAAE,OAAM;IP4CxB,kBAAkB,EO3CL,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI,EAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO;IP4CtD,UAAU,EO5CL,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI,EAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,GAE3D;;AiBwYL,AjBrYE,YiBqYU,CjBrYV,kBAAkB,CAAC;EACjB,KAAK,ErBwdwB,OAAO;EqBvdpC,YAAY,ErBudiB,OAAO;EqBtdpC,gBAAgB,ErBuda,OAAO,GqBtdrC;;AiBiYH,AjB/XE,YiB+XU,CjB/XV,sBAAsB,CAAC;EACrB,KAAK,ErBkdwB,OAAO,GqBjdrC;;AiBgYH,AjB/ZE,YiB+ZU,CjB/ZV,WAAW;AiB+Zb,AjB9ZE,YiB8ZU,CjB9ZV,cAAc;AiB8ZhB,AjB7ZE,YiB6ZU,CjB7ZV,MAAM;AiB6ZR,AjB5ZE,YiB4ZU,CjB5ZV,SAAS;AiB4ZX,AjB3ZE,YiB2ZU,CjB3ZV,aAAa;AiB2Zf,AjB1ZE,YiB0ZU,CjB1ZV,gBAAgB;AiB0ZlB,AjBzZU,YiByZE,AjBzZT,MAAM,CAAC,KAAK;AiByZf,AjBxZa,YiBwZD,AjBxZT,SAAS,CAAC,KAAK;AiBwZlB,AjBvZiB,YiBuZL,AjBvZT,aAAa,CAAC,KAAK;AiBuZtB,AjBtZoB,YiBsZR,AjBtZT,gBAAgB,CAAC,KAAK,CAAE;EACvB,KAAK,ErB8ewB,OAAO,GqB7erC;;AiBoZH,AjBlZE,YiBkZU,CjBlZV,aAAa,EiBkZf,AjBlZE,YiBkZU,CuCtaZ,YAAY,CAkCV,aAAa,CACX,mBAAmB,EAnCvB,AxDoBE,YwDpBU,CAkCV,aAAa,CvCoYf,YAAY,CuCnYR,mBAAmB,EvCmYvB,AjBlZE,YiBkZU,CyCtaZ,oBAAoB,CAGlB,EAAE,CAgBA,eAAe,EAnBnB,A1DoBE,oB0DpBkB,CAGlB,EAAE,CzCmaJ,YAAY,CyCnZR,eAAe,C1DCH;EACZ,YAAY,ErB0eiB,OAAO;Ec3btC,kBAAkB,EO9CI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI;EP+ClC,UAAU,EO/CI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI,GAMzC;EiB0YH,AjBlZE,YiBkZU,CjBlZV,aAAa,AAGV,MAAM,EiB+YX,AjBlZE,YiBkZU,CuCtaZ,YAAY,CAkCV,aAAa,CACX,mBAAmB,AxDZlB,MAAM,EwDvBX,AxDoBE,YwDpBU,CAkCV,aAAa,CvCoYf,YAAY,CuCnYR,mBAAmB,AxDZlB,MAAM,EiB+YX,AjBlZE,YiBkZU,CyCtaZ,oBAAoB,CAGlB,EAAE,CAgBA,eAAe,A1DId,MAAM,E0DvBX,A1DoBE,oB0DpBkB,CAGlB,EAAE,CzCmaJ,YAAY,CyCnZR,eAAe,A1DId,MAAM,CAAC;IACN,YAAY,EAAE,OAAM;IP4CxB,kBAAkB,EO3CL,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI,EAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO;IP4CtD,UAAU,EO5CL,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI,EAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,GAE3D;;AiB2YL,AjBxYE,YiBwYU,CjBxYV,kBAAkB,CAAC;EACjB,KAAK,ErBgewB,OAAO;EqB/dpC,YAAY,ErB+diB,OAAO;EqB9dpC,gBAAgB,ErB+da,OAAO,GqB9drC;;AiBoYH,AjBlYE,YiBkYU,CjBlYV,sBAAsB,CAAC;EACrB,KAAK,ErB0dwB,OAAO,GqBzdrC;;AiBmYH,AjBlaE,UiBkaQ,CjBlaR,WAAW;AiBkab,AjBjaE,UiBiaQ,CjBjaR,cAAc;AiBiahB,AjBhaE,UiBgaQ,CjBhaR,MAAM;AiBgaR,AjB/ZE,UiB+ZQ,CjB/ZR,SAAS;AiB+ZX,AjB9ZE,UiB8ZQ,CjB9ZR,aAAa;AiB8Zf,AjB7ZE,UiB6ZQ,CjB7ZR,gBAAgB;AiB6ZlB,AjB5ZU,UiB4ZA,AjB5ZP,MAAM,CAAC,KAAK;AiB4Zf,AjB3Za,UiB2ZH,AjB3ZP,SAAS,CAAC,KAAK;AiB2ZlB,AjB1ZiB,UiB0ZP,AjB1ZP,aAAa,CAAC,KAAK;AiB0ZtB,AjBzZoB,UiByZV,AjBzZP,gBAAgB,CAAC,KAAK,CAAE;EACvB,KAAK,ErBkfwB,OAAO,GqBjfrC;;AiBuZH,AjBrZE,UiBqZQ,CjBrZR,aAAa,EiBqZf,AjBrZE,UiBqZQ,CuCzaV,YAAY,CAkCV,aAAa,CACX,mBAAmB,EAnCvB,AxDoBE,YwDpBU,CAkCV,aAAa,CvCuYf,UAAU,CuCtYN,mBAAmB,EvCsYvB,AjBrZE,UiBqZQ,CyCzaV,oBAAoB,CAGlB,EAAE,CAgBA,eAAe,EAnBnB,A1DoBE,oB0DpBkB,CAGlB,EAAE,CzCsaJ,UAAU,CyCtZN,eAAe,C1DCH;EACZ,YAAY,ErB8eiB,OAAO;Ec/btC,kBAAkB,EO9CI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI;EP+ClC,UAAU,EO/CI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI,GAMzC;EiB6YH,AjBrZE,UiBqZQ,CjBrZR,aAAa,AAGV,MAAM,EiBkZX,AjBrZE,UiBqZQ,CuCzaV,YAAY,CAkCV,aAAa,CACX,mBAAmB,AxDZlB,MAAM,EwDvBX,AxDoBE,YwDpBU,CAkCV,aAAa,CvCuYf,UAAU,CuCtYN,mBAAmB,AxDZlB,MAAM,EiBkZX,AjBrZE,UiBqZQ,CyCzaV,oBAAoB,CAGlB,EAAE,CAgBA,eAAe,A1DId,MAAM,E0DvBX,A1DoBE,oB0DpBkB,CAGlB,EAAE,CzCsaJ,UAAU,CyCtZN,eAAe,A1DId,MAAM,CAAC;IACN,YAAY,EAAE,OAAM;IP4CxB,kBAAkB,EO3CL,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI,EAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO;IP4CtD,UAAU,EO5CL,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI,EAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,GAE3D;;AiB8YL,AjB3YE,UiB2YQ,CjB3YR,kBAAkB,CAAC;EACjB,KAAK,ErBoewB,OAAO;EqBnepC,YAAY,ErBmeiB,OAAO;EqBlepC,gBAAgB,ErBmea,OAAO,GqBlerC;;AiBuYH,AjBrYE,UiBqYQ,CjBrYR,sBAAsB,CAAC;EACrB,KAAK,ErB8dwB,OAAO,GqB7drC;;AiBwYH,AAEM,aAFO,CAAC,KAAK,GAEb,sBAAsB,CAAC;EACxB,GAAG,EAAG,IAAqB,GAC7B;;AAJH,AAKc,aALD,CAAC,KAAK,AAKhB,QAAQ,GAAG,sBAAsB,CAAC;EAChC,GAAG,EAAE,CAAE,GACT;;AASH,AAAA,WAAW,CAAC;EACV,OAAO,EAAE,KAAM;EACf,UAAU,EAAE,GAAI;EAChB,aAAa,EAAE,IAAK;EACpB,KAAK,EAAE,OAAO,GACf;;AAkBC,MAAM,EAAL,SAAS,EAAE,KAAK;EAmEnB,AAjEI,YAiEQ,CAjER,WAAW,CAAC;IACV,OAAO,EAAE,YAAa;IACtB,aAAa,EAAE,CAAE;IACjB,cAAc,EAAE,MAAO,GACxB;EA6DL,AA1DI,YA0DQ,CA1DR,aAAa,EA0DjB,AA1DI,YA0DQ,CuCxhBZ,YAAY,CAkCV,aAAa,CACX,mBAAmB,EAnCvB,AvC8dI,YuC9dQ,CAkCV,aAAa,CvCsff,YAAY,CuCrfR,mBAAmB,EvCqfvB,AA1DI,YA0DQ,CyCxhBZ,oBAAoB,CAGlB,EAAE,CAgBA,eAAe,EAnBnB,AzC8dI,oByC9dgB,CAGlB,EAAE,CzCqhBJ,YAAY,CyCrgBR,eAAe,CzC2cD;IACZ,OAAO,EAAE,YAAa;IACtB,KAAK,EAAE,IAAK;IACZ,cAAc,EAAE,MAAO,GACxB;EAsDL,AAnDI,YAmDQ,CAnDR,oBAAoB,CAAC;IACnB,OAAO,EAAE,YAAa,GACvB;EAiDL,AA/CI,YA+CQ,CA/CR,YAAY,CAAC;IACX,OAAO,EAAE,YAAa;IACtB,cAAc,EAAE,MAAO,GAOxB;IAsCL,AA3CM,YA2CM,CA/CR,YAAY,CAIV,kBAAkB;IA2CxB,AA1CM,YA0CM,CA/CR,YAAY,CAKV,gBAAgB;IA0CtB,AAzCM,YAyCM,CA/CR,YAAY,CAMV,aAAa;IAyCnB,AA1CsB,YA0CV,CA/CR,YAAY,CuCzehB,YAAY,CAkCV,aAAa,CACX,mBAAmB,EAnCvB,AvC8esB,YuC9eV,CAkCV,aAAa;IvCsff,YAAY,CA/CR,YAAY,CuCtcZ,mBAAmB;IvCqfvB,AA1CsB,YA0CV,CA/CR,YAAY,CyCzehB,oBAAoB,CAGlB,EAAE,CAgBA,eAAe,EAnBnB,AzC8esB,oByC9eF,CAGlB,EAAE;IzCqhBJ,YAAY,CA/CR,YAAY,CyCtdZ,eAAe,CzC4dC;MACZ,KAAK,EAAE,IAAK,GACb;EAuCP,AAnCmB,YAmCP,CAnCR,YAAY,GAAG,aAAa,EAmChC,AAnCiB,YAmCL,CuCxhBZ,YAAY,CAkCV,aAAa,CvCmdX,YAAY,GuCldZ,mBAAmB,EAnCvB,AvCqfiB,YuCrfL,CAkCV,aAAa,CvCsff,YAAY,CAnCR,YAAY,GuCldZ,mBAAmB,EvCqfvB,AAnCiB,YAmCL,CyCxhBZ,oBAAoB,CAGlB,EAAE,CzCkfA,YAAY,GyCleZ,eAAe,EAnBnB,AzCqfiB,oByCrfG,CAGlB,EAAE,CzCqhBJ,YAAY,CAnCR,YAAY,GyCleZ,eAAe,CzCkec;IAC3B,KAAK,EAAE,IAAK,GACb;EAiCL,AA/BI,YA+BQ,CA/BR,cAAc,CAAC;IACb,aAAa,EAAE,CAAE;IACjB,cAAc,EAAE,MAAO,GACxB;EA4BL,AAxBI,YAwBQ,CAxBR,MAAM;EAwBV,AAvBI,YAuBQ,CAvBR,SAAS,CAAC;IACR,OAAO,EAAE,YAAa;IACtB,UAAU,EAAE,CAAE;IACd,aAAa,EAAE,CAAE;IACjB,cAAc,EAAE,MAAO,GAKxB;IAcL,AAjBM,YAiBM,CAxBR,MAAM,CAOJ,KAAK;IAiBX,AAjBM,YAiBM,CAvBR,SAAS,CAMP,KAAK,CAAC;MACJ,YAAY,EAAE,CAAE,GACjB;EAeP,AAb6B,YAajB,CAbR,MAAM,CAAC,KAAK,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ;EAajB,AAZmC,YAYvB,CAZR,SAAS,CAAC,KAAK,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf,EAAiB;IAC/B,QAAQ,EAAE,QAAS;IACnB,WAAW,EAAE,CAAE,GAChB;EASL,AANkB,YAMN,CANR,aAAa,CAAC,sBAAsB,CAAC;IACnC,GAAG,EAAE,CAAE,GACR;;AAeL,AAKE,gBALc,CAKd,MAAM;AALR,AAME,gBANc,CAMd,SAAS;AANX,AAOE,gBAPc,CAOd,aAAa;AAPf,AAQE,gBARc,CAQd,gBAAgB,CAAC;EACf,UAAU,EAAE,CAAE;EACd,aAAa,EAAE,CAAE;EACjB,WAAW,EAAG,GAAsB,GACrC;;AAZH,AAeE,gBAfc,CAed,MAAM;AAfR,AAgBE,gBAhBc,CAgBd,SAAS,CAAC;EACR,UAAU,EAAG,IAAqB,GACnC;;AAlBH,AAqBE,gBArBc,CAqBd,WAAW,CAAC;EPziBZ,WAAW,EAAG,KAAI;EAClB,YAAY,EAAE,KAAK,GO0iBlB;EAvBH,AAqBE,gBArBc,CAqBd,WAAW,AX3iBV,OAAO,EWshBV,AAqBE,gBArBc,CAqBd,WAAW,AX1iBV,MAAM,CAAC;IACN,OAAO,EAAE,GAAI;IACb,OAAO,EAAE,KAAM,GAChB;EWkhBH,AAqBE,gBArBc,CAqBd,WAAW,AXtiBV,MAAM,CAAC;IACN,KAAK,EAAE,IAAK,GACb;;AW0iBD,MAAM,EAAL,SAAS,EAAE,KAAK;EA3BnB,AA4BI,gBA5BY,CA4BZ,cAAc,CAAC;IACb,UAAU,EAAE,KAAM;IAClB,aAAa,EAAE,CAAE;IACjB,WAAW,EAAG,GAAsB,GACrC;;AAhCL,AAuCgB,gBAvCA,CAuCd,aAAa,CAAC,sBAAsB,CAAC;EACnC,KAAK,EAAE,IAAK,GACb;;AAOC,MAAM,EAAL,SAAS,EAAE,KAAK;EAhDrB,AAiDM,gBAjDU,CA+Cd,cAAc,CAEV,cAAc,CAAC;IACb,WAAW,EAAI,UAAuB;IACtC,SAAS,EtCliBS,IAAI,GsCmiBvB;;AAIH,MAAM,EAAL,SAAS,EAAE,KAAK;EAxDrB,AAyDM,gBAzDU,CAuDd,cAAc,CAEV,cAAc,CAAC;IACb,WAAW,EAAG,GAAuB;IACrC,SAAS,EtCziBS,IAAI,GsC0iBvB;;ACvlBP,AAAA,IAAI,EuBRJ,AvBQA,euBRe,CAIb,cAAc,EGJhB,A1BQA,Y0BRY,CACV,EAAE,CAGA,CAAC,EAJL,A1BQA,Y0BRY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,EAPf,A7CQA,kB6CRkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,EnBPf,A1BQA,Y0BRY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,EAhBf,A/CQA,wB+CRwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,ErBhBf,A1BQA,Y0BRY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,EArBjB,AhDQA,6BgDR6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,EtBrBjB,A1BQA,Y0BRY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,EArBjB,AhDpBA,2BgDoB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,EtBjDjB,A1BQA,Y0BRY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,EAhBtB,ApD/DA,sBoD+DsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,EzBvFtB,A3BQA,sB2BRsB,EKAtB,AhCQA,iBgCRiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,EMxCpB,AtCQA,YsCRY,CAYV,cAAc,CACZ,MAAM,EAbV,AtCQA,YsCRY,CAkCV,aAAa,CAUX,oBAAoB,EE5CxB,AxCQA,oBwCRoB,CAGlB,EAAE,CASA,YAAY,EAZhB,AxCQA,oBwCRoB,CAGlB,EAAE,CAsBA,gBAAgB,ECzBpB,AzCQA,+ByCR+B,CAC7B,iBAAiB,CACf,gBAAgB,CzCMf;EACH,OAAO,EAAE,YAAa;EACtB,aAAa,EAAE,CAAE;EACjB,WAAW,EvC0IoB,MAAM;EuCzIrC,UAAU,EAAE,MAAO;EACnB,cAAc,EAAE,MAAO;EACvB,YAAY,EAAE,YAAa;EAC3B,MAAM,EAAE,OAAQ;EAChB,gBAAgB,EAAE,IAAK;EACvB,MAAM,EAAE,qBAAsB;EAC9B,WAAW,EAAE,MAAO;EvB6CpB,OAAO,EhB+BmB,GAAG,CACH,IAAI;EgB/B9B,SAAS,EhBbe,IAAI;EgBc5B,WAAW,EhBFa,OAAW;EgBGnC,aAAa,EhB2Ca,GAAG;Ec4G7B,mBAAmB,EyBrME,IAAI;EzBsMtB,gBAAgB,EyBtME,IAAI;EzBuMrB,eAAe,EyBvME,IAAI;EzBwMjB,WAAW,EyBxME,IAAI,GAkC1B;EA9CD,AAAA,IAAI,AAiBC,MAAM,EuBzBX,AvBQA,euBRe,CAIb,cAAc,AvBqBX,MAAM,E0BzBX,A1BQA,Y0BRY,CACV,EAAE,CAGA,CAAC,A1BqBA,MAAM,E0BzBX,A1BQA,Y0BRY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,A7CkBV,MAAM,E6CzBX,A7CQA,kB6CRkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,A7CkBV,MAAM,E0BzBX,A1BQA,Y0BRY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,A/CSV,MAAM,E+CzBX,A/CQA,wB+CRwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,A/CSV,MAAM,E0BzBX,A1BQA,Y0BRY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,AhDIZ,MAAM,EgDzBX,AhDQA,6BgDR6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,AhDIZ,MAAM,E0BzBX,A1BQA,Y0BRY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,AhDxBZ,MAAM,EgDGX,AhDpBA,2BgDoB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,AhDxBZ,MAAM,E0BzBX,A1BQA,Y0BRY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,ApD9DjB,MAAM,EoD8CX,ApD/DA,sBoD+DsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,ApD9DjB,MAAM,E2BzBX,A3BQA,sB2BRsB,A3ByBjB,MAAM,EgCzBX,AhCQA,iBgCRiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,AhCff,MAAM,EsCzBX,AtCQA,YsCRY,CAYV,cAAc,CACZ,MAAM,AtCYL,MAAM,EsCzBX,AtCQA,YsCRY,CAkCV,aAAa,CAUX,oBAAoB,AtCnBnB,MAAM,EwCzBX,AxCQA,oBwCRoB,CAGlB,EAAE,CASA,YAAY,AxCaX,MAAM,EwCzBX,AxCQA,oBwCRoB,CAGlB,EAAE,CAsBA,gBAAgB,AxCAf,MAAM,EyCzBX,AzCQA,+ByCR+B,CAC7B,iBAAiB,CACf,gBAAgB,AzCuBf,MAAM,EAjBX,AAAA,IAAI,AAkBC,MAAM,EuB1BX,AvBQA,euBRe,CvB0BV,MAAM,AuBtBT,cAAc,EGJhB,A1BQA,Y0BRY,CACV,EAAE,CAGA,CAAC,A1BsBA,MAAM,E0B1BX,A1BQA,Y0BRY,CACV,EAAE,CmBDJ,kBAAkB,C7C0Bb,MAAM,A6CnBT,aAAa,EAPf,A7CQA,kB6CRkB,CnBAlB,YAAY,CACV,EAAE,C1ByBC,MAAM,A6CnBT,aAAa,EnBPf,A1BQA,Y0BRY,CACV,EAAE,CqBDJ,wBAAwB,C/C0BnB,MAAM,A+CVT,aAAa,EAhBf,A/CQA,wB+CRwB,CrBAxB,YAAY,CACV,EAAE,C1ByBC,MAAM,A+CVT,aAAa,ErBhBf,A1BQA,Y0BRY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,ChDyBrB,MAAM,AgDLP,aAAa,EArBjB,AhDQA,6BgDR6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,C1ByBC,MAAM,AgDLP,aAAa,EtBrBjB,A1BQA,Y0BRY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,ChDHnB,MAAM,AgDuBP,aAAa,EArBjB,AhDpBA,2BgDoB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,C1ByBC,MAAM,AgDuBP,aAAa,EtBjDjB,A1BQA,Y0BRY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CpDxDX,MAAM,AoD6DL,gBAAgB,EAhBtB,ApD/DA,sBoD+DsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C1ByBC,MAAM,AoD6DL,gBAAgB,EpD7DjB,AAlBL,MAkBW,A2B1BX,sBAAsB,EKAtB,AhCQA,iBgCRiB,CA2Bf,cAAc,CAYZ,eAAe,ChCbd,MAAM,AgCcL,cAAc,EMxCpB,AtCQA,YsCRY,CAYV,cAAc,CACZ,MAAM,AtCaL,MAAM,EsC1BX,AtCQA,YsCRY,CAkCV,aAAa,CtCRV,MAAM,AsCkBP,oBAAoB,EE5CxB,AxCQA,oBwCRoB,CAGlB,EAAE,CxCuBC,MAAM,AwCdP,YAAY,EAZhB,AxCQA,oBwCRoB,CAGlB,EAAE,CxCuBC,MAAM,AwCDP,gBAAgB,ECzBpB,AzCQA,+ByCR+B,CAC7B,iBAAiB,CzCyBd,MAAM,AyCxBP,gBAAgB,EzCMpB,AAAA,IAAI,AAeD,OAAO,AAEL,MAAM,EuBzBX,AvBQA,euBRe,CAIb,cAAc,AvBmBb,OAAO,AAEL,MAAM,E0BzBX,A1BQA,Y0BRY,CACV,EAAE,CAGA,CAAC,A1BmBF,OAAO,AAEL,MAAM,E0BzBX,A1BQA,Y0BRY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,A7CgBZ,OAAO,AAEL,MAAM,E6CzBX,A7CQA,kB6CRkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,A7CgBZ,OAAO,AAEL,MAAM,E0BzBX,A1BQA,Y0BRY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,A/COZ,OAAO,AAEL,MAAM,E+CzBX,A/CQA,wB+CRwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,A/COZ,OAAO,AAEL,MAAM,E0BzBX,A1BQA,Y0BRY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,AhDEd,OAAO,AAEL,MAAM,EgDzBX,AhDQA,6BgDR6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,AhDEd,OAAO,AAEL,MAAM,E0BzBX,A1BQA,Y0BRY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,AhD1Bd,OAAO,AAEL,MAAM,EgDGX,AhDpBA,2BgDoB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,AhD1Bd,OAAO,AAEL,MAAM,E0BzBX,A1BQA,Y0BRY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,ApDhEnB,OAAO,AAEL,MAAM,EoD8CX,ApD/DA,sBoD+DsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,ApDhEnB,OAAO,AAEL,MAAM,E2BzBX,A3BQA,sB2BRsB,A3BuBnB,OAAO,AAEL,MAAM,EgCzBX,AhCQA,iBgCRiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,AhCjBjB,OAAO,AAEL,MAAM,EsCzBX,AtCQA,YsCRY,CAYV,cAAc,CACZ,MAAM,AtCUP,OAAO,AAEL,MAAM,EsCzBX,AtCQA,YsCRY,CAkCV,aAAa,CAUX,oBAAoB,AtCrBrB,OAAO,AAEL,MAAM,EwCzBX,AxCQA,oBwCRoB,CAGlB,EAAE,CASA,YAAY,AxCWb,OAAO,AAEL,MAAM,EwCzBX,AxCQA,oBwCRoB,CAGlB,EAAE,CAsBA,gBAAgB,AxCFjB,OAAO,AAEL,MAAM,EyCzBX,AzCQA,+ByCR+B,CAC7B,iBAAiB,CACf,gBAAgB,AzCqBjB,OAAO,AAEL,MAAM,EAjBX,AAAA,IAAI,AAeD,OAAO,AAGL,MAAM,EuB1BX,AvBQA,euBRe,CAIb,cAAc,AvBmBb,OAAO,AAGL,MAAM,E0B1BX,A1BQA,Y0BRY,CACV,EAAE,CAGA,CAAC,A1BmBF,OAAO,AAGL,MAAM,E0B1BX,A1BQA,Y0BRY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,A7CgBZ,OAAO,AAGL,MAAM,E6C1BX,A7CQA,kB6CRkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,A7CgBZ,OAAO,AAGL,MAAM,E0B1BX,A1BQA,Y0BRY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,A/COZ,OAAO,AAGL,MAAM,E+C1BX,A/CQA,wB+CRwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,A/COZ,OAAO,AAGL,MAAM,E0B1BX,A1BQA,Y0BRY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,AhDEd,OAAO,AAGL,MAAM,EgD1BX,AhDQA,6BgDR6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,AhDEd,OAAO,AAGL,MAAM,E0B1BX,A1BQA,Y0BRY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,AhD1Bd,OAAO,AAGL,MAAM,EgDEX,AhDpBA,2BgDoB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,AhD1Bd,OAAO,AAGL,MAAM,E0B1BX,A1BQA,Y0BRY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,ApDhEnB,OAAO,AAGL,MAAM,EoD6CX,ApD/DA,sBoD+DsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,ApDhEnB,OAAO,AAGL,MAAM,E2B1BX,A3BQA,sB2BRsB,A3BuBnB,OAAO,AAGL,MAAM,EgC1BX,AhCQA,iBgCRiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,AhCjBjB,OAAO,AAGL,MAAM,EsC1BX,AtCQA,YsCRY,CAYV,cAAc,CACZ,MAAM,AtCUP,OAAO,AAGL,MAAM,EsC1BX,AtCQA,YsCRY,CAkCV,aAAa,CAUX,oBAAoB,AtCrBrB,OAAO,AAGL,MAAM,EwC1BX,AxCQA,oBwCRoB,CAGlB,EAAE,CASA,YAAY,AxCWb,OAAO,AAGL,MAAM,EwC1BX,AxCQA,oBwCRoB,CAGlB,EAAE,CAsBA,gBAAgB,AxCFjB,OAAO,AAGL,MAAM,EyC1BX,AzCQA,+ByCR+B,CAC7B,iBAAiB,CACf,gBAAgB,AzCqBjB,OAAO,AAGL,MAAM,EAlBX,AAAA,IAAI,AAgBD,OAAO,AACL,MAAM,EuBzBX,AvBQA,euBRe,CvBwBZ,OAAO,AuBpBR,cAAc,AvBqBX,MAAM,E0BzBX,A1BQA,Y0BRY,CACV,EAAE,CAGA,CAAC,A1BoBF,OAAO,AACL,MAAM,E0BzBX,A1BQA,Y0BRY,CACV,EAAE,CmBDJ,kBAAkB,C7CwBf,OAAO,A6CjBR,aAAa,A7CkBV,MAAM,E6CzBX,A7CQA,kB6CRkB,CnBAlB,YAAY,CACV,EAAE,C1BuBD,OAAO,A6CjBR,aAAa,A7CkBV,MAAM,E0BzBX,A1BQA,Y0BRY,CACV,EAAE,CqBDJ,wBAAwB,C/CwBrB,OAAO,A+CRR,aAAa,A/CSV,MAAM,E+CzBX,A/CQA,wB+CRwB,CrBAxB,YAAY,CACV,EAAE,C1BuBD,OAAO,A+CRR,aAAa,A/CSV,MAAM,E0BzBX,A1BQA,Y0BRY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,ChDuBvB,OAAO,AgDHN,aAAa,AhDIZ,MAAM,EgDzBX,AhDQA,6BgDR6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,C1BuBD,OAAO,AgDHN,aAAa,AhDIZ,MAAM,E0BzBX,A1BQA,Y0BRY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,ChDLrB,OAAO,AgDyBN,aAAa,AhDxBZ,MAAM,EgDGX,AhDpBA,2BgDoB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,C1BuBD,OAAO,AgDyBN,aAAa,AhDxBZ,MAAM,E0BzBX,A1BQA,Y0BRY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CpD1Db,OAAO,AoD+DJ,gBAAgB,ApD9DjB,MAAM,EoD8CX,ApD/DA,sBoD+DsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C1BuBD,OAAO,AoD+DJ,gBAAgB,ApD9DjB,MAAM,EADR,AAhBH,OAgBU,A2BxBV,sBAAsB,A3ByBjB,MAAM,EgCzBX,AhCQA,iBgCRiB,CA2Bf,cAAc,CAYZ,eAAe,ChCfhB,OAAO,AgCgBJ,cAAc,AhCff,MAAM,EsCzBX,AtCQA,YsCRY,CAYV,cAAc,CACZ,MAAM,AtCWP,OAAO,AACL,MAAM,EsCzBX,AtCQA,YsCRY,CAkCV,aAAa,CtCVZ,OAAO,AsCoBN,oBAAoB,AtCnBnB,MAAM,EwCzBX,AxCQA,oBwCRoB,CAGlB,EAAE,CxCqBD,OAAO,AwCZN,YAAY,AxCaX,MAAM,EwCzBX,AxCQA,oBwCRoB,CAGlB,EAAE,CxCqBD,OAAO,AwCCN,gBAAgB,AxCAf,MAAM,EyCzBX,AzCQA,+ByCR+B,CAC7B,iBAAiB,CzCuBhB,OAAO,AyCtBN,gBAAgB,AzCuBf,MAAM,EAjBX,AAAA,IAAI,AAgBD,OAAO,AAEL,MAAM,EuB1BX,AvBQA,euBRe,CvBwBZ,OAAO,AAEL,MAAM,AuBtBT,cAAc,EGJhB,A1BQA,Y0BRY,CACV,EAAE,CAGA,CAAC,A1BoBF,OAAO,AAEL,MAAM,E0B1BX,A1BQA,Y0BRY,CACV,EAAE,CmBDJ,kBAAkB,C7CwBf,OAAO,AAEL,MAAM,A6CnBT,aAAa,EAPf,A7CQA,kB6CRkB,CnBAlB,YAAY,CACV,EAAE,C1BuBD,OAAO,AAEL,MAAM,A6CnBT,aAAa,EnBPf,A1BQA,Y0BRY,CACV,EAAE,CqBDJ,wBAAwB,C/CwBrB,OAAO,AAEL,MAAM,A+CVT,aAAa,EAhBf,A/CQA,wB+CRwB,CrBAxB,YAAY,CACV,EAAE,C1BuBD,OAAO,AAEL,MAAM,A+CVT,aAAa,ErBhBf,A1BQA,Y0BRY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,ChDuBvB,OAAO,AAEL,MAAM,AgDLP,aAAa,EArBjB,AhDQA,6BgDR6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,C1BuBD,OAAO,AAEL,MAAM,AgDLP,aAAa,EtBrBjB,A1BQA,Y0BRY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,ChDLrB,OAAO,AAEL,MAAM,AgDuBP,aAAa,EArBjB,AhDpBA,2BgDoB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,C1BuBD,OAAO,AAEL,MAAM,AgDuBP,aAAa,EtBjDjB,A1BQA,Y0BRY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CpD1Db,OAAO,AAEL,MAAM,AoD6DL,gBAAgB,EAhBtB,ApD/DA,sBoD+DsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C1BuBD,OAAO,AAEL,MAAM,AoD6DL,gBAAgB,EpD/DnB,AAhBH,OAgBU,AAEL,MAAM,A2B1BX,sBAAsB,EKAtB,AhCQA,iBgCRiB,CA2Bf,cAAc,CAYZ,eAAe,ChCfhB,OAAO,AAEL,MAAM,AgCcL,cAAc,EMxCpB,AtCQA,YsCRY,CAYV,cAAc,CACZ,MAAM,AtCWP,OAAO,AAEL,MAAM,EsC1BX,AtCQA,YsCRY,CAkCV,aAAa,CtCVZ,OAAO,AAEL,MAAM,AsCkBP,oBAAoB,EE5CxB,AxCQA,oBwCRoB,CAGlB,EAAE,CxCqBD,OAAO,AAEL,MAAM,AwCdP,YAAY,EAZhB,AxCQA,oBwCRoB,CAGlB,EAAE,CxCqBD,OAAO,AAEL,MAAM,AwCDP,gBAAgB,ECzBpB,AzCQA,+ByCR+B,CAC7B,iBAAiB,CzCuBhB,OAAO,AAEL,MAAM,AyCxBP,gBAAgB,CzCwBR;I7BtBV,OAAO,EAAE,WAAY;IAErB,OAAO,EAAE,iCAAkC;IAC3C,cAAc,EAAE,IAAK,G6BqBlB;EApBL,AAAA,IAAI,AAuBD,MAAM,EuB/BT,AvBQA,euBRe,CAIb,cAAc,AvB2Bb,MAAM,E0B/BT,A1BQA,Y0BRY,CACV,EAAE,CAGA,CAAC,A1B2BF,MAAM,E0B/BT,A1BQA,Y0BRY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,A7CwBZ,MAAM,E6C/BT,A7CQA,kB6CRkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,A7CwBZ,MAAM,E0B/BT,A1BQA,Y0BRY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,A/CeZ,MAAM,E+C/BT,A/CQA,wB+CRwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,A/CeZ,MAAM,E0B/BT,A1BQA,Y0BRY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,AhDUd,MAAM,EgD/BT,AhDQA,6BgDR6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,AhDUd,MAAM,E0B/BT,A1BQA,Y0BRY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,AhDlBd,MAAM,EgDHT,AhDpBA,2BgDoB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,AhDlBd,MAAM,E0B/BT,A1BQA,Y0BRY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,ApDxDnB,MAAM,EoDwCT,ApD/DA,sBoD+DsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,ApDxDnB,MAAM,E2B/BT,A3BQA,sB2BRsB,A3B+BnB,MAAM,EgC/BT,AhCQA,iBgCRiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,AhCTjB,MAAM,EsC/BT,AtCQA,YsCRY,CAYV,cAAc,CACZ,MAAM,AtCkBP,MAAM,EsC/BT,AtCQA,YsCRY,CAkCV,aAAa,CAUX,oBAAoB,AtCbrB,MAAM,EwC/BT,AxCQA,oBwCRoB,CAGlB,EAAE,CASA,YAAY,AxCmBb,MAAM,EwC/BT,AxCQA,oBwCRoB,CAGlB,EAAE,CAsBA,gBAAgB,AxCMjB,MAAM,EyC/BT,AzCQA,+ByCR+B,CAC7B,iBAAiB,CACf,gBAAgB,AzC6BjB,MAAM,EAvBT,AAAA,IAAI,AAwBD,MAAM,EuBhCT,AvBQA,euBRe,CAIb,cAAc,AvB4Bb,MAAM,E0BhCT,A1BQA,Y0BRY,CACV,EAAE,CAGA,CAAC,A1B4BF,MAAM,E0BhCT,A1BQA,Y0BRY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,A7CyBZ,MAAM,E6ChCT,A7CQA,kB6CRkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,A7CyBZ,MAAM,E0BhCT,A1BQA,Y0BRY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,A/CgBZ,MAAM,E+ChCT,A/CQA,wB+CRwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,A/CgBZ,MAAM,E0BhCT,A1BQA,Y0BRY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,AhDWd,MAAM,EgDhCT,AhDQA,6BgDR6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,AhDWd,MAAM,E0BhCT,A1BQA,Y0BRY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,AhDjBd,MAAM,EgDJT,AhDpBA,2BgDoB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,AhDjBd,MAAM,E0BhCT,A1BQA,Y0BRY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,ApDvDnB,MAAM,EoDuCT,ApD/DA,sBoD+DsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,ApDvDnB,MAAM,E2BhCT,A3BQA,sB2BRsB,A3BgCnB,MAAM,EgChCT,AhCQA,iBgCRiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,AhCRjB,MAAM,EsChCT,AtCQA,YsCRY,CAYV,cAAc,CACZ,MAAM,AtCmBP,MAAM,EsChCT,AtCQA,YsCRY,CAkCV,aAAa,CAUX,oBAAoB,AtCZrB,MAAM,EwChCT,AxCQA,oBwCRoB,CAGlB,EAAE,CASA,YAAY,AxCoBb,MAAM,EwChCT,AxCQA,oBwCRoB,CAGlB,EAAE,CAsBA,gBAAgB,AxCOjB,MAAM,EyChCT,AzCQA,+ByCR+B,CAC7B,iBAAiB,CACf,gBAAgB,AzC8BjB,MAAM,EAxBT,AAAA,IAAI,AAyBD,MAAM,EuBjCT,AvBQA,euBRe,CvBiCZ,MAAM,AuB7BP,cAAc,EGJhB,A1BQA,Y0BRY,CACV,EAAE,CAGA,CAAC,A1B6BF,MAAM,E0BjCT,A1BQA,Y0BRY,CACV,EAAE,CmBDJ,kBAAkB,C7CiCf,MAAM,A6C1BP,aAAa,EAPf,A7CQA,kB6CRkB,CnBAlB,YAAY,CACV,EAAE,C1BgCD,MAAM,A6C1BP,aAAa,EnBPf,A1BQA,Y0BRY,CACV,EAAE,CqBDJ,wBAAwB,C/CiCrB,MAAM,A+CjBP,aAAa,EAhBf,A/CQA,wB+CRwB,CrBAxB,YAAY,CACV,EAAE,C1BgCD,MAAM,A+CjBP,aAAa,ErBhBf,A1BQA,Y0BRY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,ChDgCvB,MAAM,AgDZL,aAAa,EArBjB,AhDQA,6BgDR6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,C1BgCD,MAAM,AgDZL,aAAa,EtBrBjB,A1BQA,Y0BRY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,ChDIrB,MAAM,AgDgBL,aAAa,EArBjB,AhDpBA,2BgDoB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,C1BgCD,MAAM,AgDgBL,aAAa,EtBjDjB,A1BQA,Y0BRY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CpDjDb,MAAM,AoDsDH,gBAAgB,EAhBtB,ApD/DA,sBoD+DsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C1BgCD,MAAM,AoDsDH,gBAAgB,EpDtDnB,AAzBH,MAyBS,A2BjCT,sBAAsB,EKAtB,AhCQA,iBgCRiB,CA2Bf,cAAc,CAYZ,eAAe,ChCNhB,MAAM,AgCOH,cAAc,EMxCpB,AtCQA,YsCRY,CAYV,cAAc,CACZ,MAAM,AtCoBP,MAAM,EsCjCT,AtCQA,YsCRY,CAkCV,aAAa,CtCDZ,MAAM,AsCWL,oBAAoB,EE5CxB,AxCQA,oBwCRoB,CAGlB,EAAE,CxC8BD,MAAM,AwCrBL,YAAY,EAZhB,AxCQA,oBwCRoB,CAGlB,EAAE,CxC8BD,MAAM,AwCRL,gBAAgB,ECzBpB,AzCQA,+ByCR+B,CAC7B,iBAAiB,CzCgChB,MAAM,AyC/BL,gBAAgB,CzC+BV;IACN,KAAK,EvCqHwB,IAAI;IuCpHjC,eAAe,EAAE,IAAK,GACvB;EA5BH,AAAA,IAAI,AA8BD,OAAO,EuBtCV,AvBQA,euBRe,CAIb,cAAc,AvBkCb,OAAO,E0BtCV,A1BQA,Y0BRY,CACV,EAAE,CAGA,CAAC,A1BkCF,OAAO,E0BtCV,A1BQA,Y0BRY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,A7C+BZ,OAAO,E6CtCV,A7CQA,kB6CRkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,A7C+BZ,OAAO,E0BtCV,A1BQA,Y0BRY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,A/CsBZ,OAAO,E+CtCV,A/CQA,wB+CRwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,A/CsBZ,OAAO,E0BtCV,A1BQA,Y0BRY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,AhDiBd,OAAO,EgDtCV,AhDQA,6BgDR6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,AhDiBd,OAAO,E0BtCV,A1BQA,Y0BRY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,AhDXd,OAAO,EgDVV,AhDpBA,2BgDoB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,AhDXd,OAAO,E0BtCV,A1BQA,Y0BRY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,ApDjDnB,OAAO,EoDiCV,ApD/DA,sBoD+DsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,ApDjDnB,OAAO,E2BtCV,A3BQA,sB2BRsB,A3BsCnB,OAAO,EgCtCV,AhCQA,iBgCRiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,AhCFjB,OAAO,EsCtCV,AtCQA,YsCRY,CAYV,cAAc,CACZ,MAAM,AtCyBP,OAAO,EsCtCV,AtCQA,YsCRY,CAkCV,aAAa,CAUX,oBAAoB,AtCNrB,OAAO,EwCtCV,AxCQA,oBwCRoB,CAGlB,EAAE,CASA,YAAY,AxC0Bb,OAAO,EwCtCV,AxCQA,oBwCRoB,CAGlB,EAAE,CAsBA,gBAAgB,AxCajB,OAAO,EyCtCV,AzCQA,+ByCR+B,CAC7B,iBAAiB,CACf,gBAAgB,AzCoCjB,OAAO,EA9BV,AAAA,IAAI,AA+BD,OAAO,EuBvCV,AvBQA,euBRe,CvBuCZ,OAAO,AuBnCR,cAAc,EGJhB,A1BQA,Y0BRY,CACV,EAAE,CAGA,CAAC,A1BmCF,OAAO,E0BvCV,A1BQA,Y0BRY,CACV,EAAE,CmBDJ,kBAAkB,C7CuCf,OAAO,A6ChCR,aAAa,EAPf,A7CQA,kB6CRkB,CnBAlB,YAAY,CACV,EAAE,C1BsCD,OAAO,A6ChCR,aAAa,EnBPf,A1BQA,Y0BRY,CACV,EAAE,CqBDJ,wBAAwB,C/CuCrB,OAAO,A+CvBR,aAAa,EAhBf,A/CQA,wB+CRwB,CrBAxB,YAAY,CACV,EAAE,C1BsCD,OAAO,A+CvBR,aAAa,ErBhBf,A1BQA,Y0BRY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,ChDsCvB,OAAO,AgDlBN,aAAa,EArBjB,AhDQA,6BgDR6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,C1BsCD,OAAO,AgDlBN,aAAa,EtBrBjB,A1BQA,Y0BRY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,ChDUrB,OAAO,AgDUN,aAAa,EArBjB,AhDpBA,2BgDoB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,C1BsCD,OAAO,AgDUN,aAAa,EtBjDjB,A1BQA,Y0BRY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CpD3Cb,OAAO,AoDgDJ,gBAAgB,EAhBtB,ApD/DA,sBoD+DsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C1BsCD,OAAO,AoDgDJ,gBAAgB,EpDhDnB,AA/BH,OA+BU,A2BvCV,sBAAsB,EKAtB,AhCQA,iBgCRiB,CA2Bf,cAAc,CAYZ,eAAe,ChCAhB,OAAO,AgCCJ,cAAc,EMxCpB,AtCQA,YsCRY,CAYV,cAAc,CACZ,MAAM,AtC0BP,OAAO,EsCvCV,AtCQA,YsCRY,CAkCV,aAAa,CtCKZ,OAAO,AsCKN,oBAAoB,EE5CxB,AxCQA,oBwCRoB,CAGlB,EAAE,CxCoCD,OAAO,AwC3BN,YAAY,EAZhB,AxCQA,oBwCRoB,CAGlB,EAAE,CxCoCD,OAAO,AwCdN,gBAAgB,ECzBpB,AzCQA,+ByCR+B,CAC7B,iBAAiB,CzCsChB,OAAO,AyCrCN,gBAAgB,CzCqCT;IACP,OAAO,EAAE,CAAE;IACX,gBAAgB,EAAE,IAAK;IzB2BzB,kBAAkB,EyB1BI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI;IzB2BlC,UAAU,EyB3BI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAI,GACzC;EAnCH,AAAA,IAAI,AAqCD,SAAS,EuB7CZ,AvBQA,euBRe,CvB6CZ,SAAS,AuBzCV,cAAc,EGJhB,A1BQA,Y0BRY,CACV,EAAE,CAGA,CAAC,A1ByCF,SAAS,E0B7CZ,A1BQA,Y0BRY,CACV,EAAE,CmBDJ,kBAAkB,C7C6Cf,SAAS,A6CtCV,aAAa,EAPf,A7CQA,kB6CRkB,CnBAlB,YAAY,CACV,EAAE,C1B4CD,SAAS,A6CtCV,aAAa,EnBPf,A1BQA,Y0BRY,CACV,EAAE,CqBDJ,wBAAwB,C/C6CrB,SAAS,A+C7BV,aAAa,EAhBf,A/CQA,wB+CRwB,CrBAxB,YAAY,CACV,EAAE,C1B4CD,SAAS,A+C7BV,aAAa,ErBhBf,A1BQA,Y0BRY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,ChD4CvB,SAAS,AgDxBR,aAAa,EArBjB,AhDQA,6BgDR6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,C1B4CD,SAAS,AgDxBR,aAAa,EtBrBjB,A1BQA,Y0BRY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,ChDgBrB,SAAS,AgDIR,aAAa,EArBjB,AhDpBA,2BgDoB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,C1B4CD,SAAS,AgDIR,aAAa,EtBjDjB,A1BQA,Y0BRY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CpDrCb,SAAS,AoD0CN,gBAAgB,EAhBtB,ApD/DA,sBoD+DsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C1B4CD,SAAS,AoD0CN,gBAAgB,EpD1CnB,AArCH,SAqCY,A2B7CZ,sBAAsB,EKAtB,AhCQA,iBgCRiB,CA2Bf,cAAc,CAYZ,eAAe,ChCMhB,SAAS,AgCLN,cAAc,EMxCpB,AtCQA,YsCRY,CAYV,cAAc,CACZ,MAAM,AtCgCP,SAAS,EsC7CZ,AtCQA,YsCRY,CAkCV,aAAa,CtCWZ,SAAS,AsCDR,oBAAoB,EE5CxB,AxCQA,oBwCRoB,CAGlB,EAAE,CxC0CD,SAAS,AwCjCR,YAAY,EAZhB,AxCQA,oBwCRoB,CAGlB,EAAE,CxC0CD,SAAS,AwCpBR,gBAAgB,ECzBpB,AzCQA,+ByCR+B,CAC7B,iBAAiB,CzC4ChB,SAAS,AyC3CR,gBAAgB,EzCMpB,AAAA,IAAI,CAsCD,AAAA,QAAC,AAAA,GuB9CJ,AvBQA,euBRe,EvB8CZ,AAAA,QAAC,AAAA,CuB1CF,cAAc,EGJhB,A1BQA,Y0BRY,CACV,EAAE,CAGA,CAAC,C1B0CF,AAAA,QAAC,AAAA,G0B9CJ,A1BQA,Y0BRY,CACV,EAAE,CmBDJ,kBAAkB,E7C8Cf,AAAA,QAAC,AAAA,C6CvCF,aAAa,EAPf,A7CQA,kB6CRkB,CnBAlB,YAAY,CACV,EAAE,E1B6CD,AAAA,QAAC,AAAA,C6CvCF,aAAa,EnBPf,A1BQA,Y0BRY,CACV,EAAE,CqBDJ,wBAAwB,E/C8CrB,AAAA,QAAC,AAAA,C+C9BF,aAAa,EAhBf,A/CQA,wB+CRwB,CrBAxB,YAAY,CACV,EAAE,E1B6CD,AAAA,QAAC,AAAA,C+C9BF,aAAa,ErBhBf,A1BQA,Y0BRY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,EhD6CvB,AAAA,QAAC,AAAA,CgDzBA,aAAa,EArBjB,AhDQA,6BgDR6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,E1B6CD,AAAA,QAAC,AAAA,CgDzBA,aAAa,EtBrBjB,A1BQA,Y0BRY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,EhDiBrB,AAAA,QAAC,AAAA,CgDGA,aAAa,EArBjB,AhDpBA,2BgDoB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,E1B6CD,AAAA,QAAC,AAAA,CgDGA,aAAa,EtBjDjB,A1BQA,Y0BRY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,EpDpCb,AAAA,QAAC,AAAA,CoDyCE,gBAAgB,EAhBtB,ApD/DA,sBoD+DsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,E1B6CD,AAAA,QAAC,AAAA,CoDyCE,gBAAgB,GpDzCnB,AAAA,AAtCH,QAsCI,AAAA,C2B9CJ,sBAAsB,EKAtB,AhCQA,iBgCRiB,CA2Bf,cAAc,CAYZ,eAAe,EhCOhB,AAAA,QAAC,AAAA,CgCNE,cAAc,EMxCpB,AtCQA,YsCRY,CAYV,cAAc,CACZ,MAAM,CtCiCP,AAAA,QAAC,AAAA,GsC9CJ,AtCQA,YsCRY,CAkCV,aAAa,EtCYZ,AAAA,QAAC,AAAA,CsCFA,oBAAoB,EE5CxB,AxCQA,oBwCRoB,CAGlB,EAAE,ExC2CD,AAAA,QAAC,AAAA,CwClCA,YAAY,EAZhB,AxCQA,oBwCRoB,CAGlB,EAAE,ExC2CD,AAAA,QAAC,AAAA,CwCrBA,gBAAgB,ECzBpB,AzCQA,+ByCR+B,CAC7B,iBAAiB,EzC6ChB,AAAA,QAAC,AAAA,CyC5CA,gBAAgB;EzC6ClB,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,EAvCX,IAAI;EAuCF,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,EuB/CX,eAAe,CAIb,cAAc,EAJhB,AvBQA,euBRe;EvB+Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,EuB3CT,cAAc;EvB2Cd,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,E0B/CX,YAAY,CACV,EAAE,CAGA,CAAC,EAJL,A1BQA,Y0BRY,CACV,EAAE;E1B8CF,QAAQ,CAAA,AAAA,QAAC,AAAA,E0B3CP,CAAC;E1B2CH,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,E0B/CX,YAAY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,EnBPf,A1BQA,Y0BRY,CACV,EAAE,CmBDJ,kBAAkB;E7C+ChB,QAAQ,CAAA,AAAA,QAAC,AAAA,E6CxCT,aAAa;E7CwCb,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,E6C/CX,kBAAkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,EAPf,A7CQA,kB6CRkB,CnBAlB,YAAY,CACV,EAAE;E1B8CF,QAAQ,CAAA,AAAA,QAAC,AAAA,E6CxCT,aAAa;E7CwCb,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,E0B/CX,YAAY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,ErBhBf,A1BQA,Y0BRY,CACV,EAAE,CqBDJ,wBAAwB;E/C+CtB,QAAQ,CAAA,AAAA,QAAC,AAAA,E+C/BT,aAAa;E/C+Bb,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,E+C/CX,wBAAwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,EAhBf,A/CQA,wB+CRwB,CrBAxB,YAAY,CACV,EAAE;E1B8CF,QAAQ,CAAA,AAAA,QAAC,AAAA,E+C/BT,aAAa;E/C+Bb,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,E0B/CX,YAAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,EtBrBjB,A1BQA,Y0BRY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;EhD8CxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgD1BP,aAAa;EhD0Bf,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,EgD/CX,6BAA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,EArBjB,AhDQA,6BgDR6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;E1B8CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EgD1BP,aAAa;EhD0Bf,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,E0B/CX,YAAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,EtBjDjB,A1BQA,Y0BRY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;EhDkBtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgDEP,aAAa;EhDFf,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,EgDnBX,2BAA2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,EArBjB,AhDpBA,2BgDoB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;E1B8CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EgDEP,aAAa;EhDFf,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,E0B/CX,YAAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,E1BvFtB,A1BQA,Y0BRY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;EpDnCd,QAAQ,CAAA,AAAA,QAAC,AAAA,EoDwCL,gBAAgB;EpDxCpB,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,EoDwBX,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,EAhBtB,ApD/DA,sBoD+DsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;E1B8CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EoDwCL,gBAAgB;EpDxCpB,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,E2B/CX,sBAAsB;E3B+CpB,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,EgC/CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,EAxCpB,AhCQA,iBgCRiB,CA2Bf,cAAc,CAYZ,eAAe;EhCQjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgCPL,cAAc;EhCOlB,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,EsC/CX,YAAY,CAYV,cAAc,CACZ,MAAM,EAbV,AtCQA,YsCRY,CAYV,cAAc;EtCmCd,QAAQ,CAAA,AAAA,QAAC,AAAA,EsClCP,MAAM;EtCkCR,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,EsC/CX,YAAY,CAkCV,aAAa,CAUX,oBAAoB,EA5CxB,AtCQA,YsCRY,CAkCV,aAAa;EtCab,QAAQ,CAAA,AAAA,QAAC,AAAA,EsCHP,oBAAoB;EtCGtB,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,EwC/CX,oBAAoB,CAGlB,EAAE,CASA,YAAY,EAZhB,AxCQA,oBwCRoB,CAGlB,EAAE;ExC4CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EwCnCP,YAAY;ExCmCd,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,EwC/CX,oBAAoB,CAGlB,EAAE,CAsBA,gBAAgB,EAzBpB,AxCQA,oBwCRoB,CAGlB,EAAE;ExC4CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EwCtBP,gBAAgB;ExCsBlB,AAvCF,QAuCU,CAAA,AAAA,QAAC,AAAA,EyC/CX,+BAA+B,CAC7B,iBAAiB,CACf,gBAAgB,EAFpB,AzCQA,+ByCR+B,CAC7B,iBAAiB;EzC8CjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EyC7CP,gBAAgB,CzC6CG;IACnB,MAAM,EvCuLuB,WAAW;IGpO1C,OAAO,EoC8CY,IAAG;IpC3CtB,MAAM,EAAE,iBAAK;IW8Db,kBAAkB,EyBlBI,IAAI;IzBmBlB,UAAU,EyBnBI,IAAI,GACzB;;AAKH,AAAC,CAAA,AAAA,IAAI,AACF,SAAS,EuBzDZ,AvBwDA,euBxDe,CvBwDf,CAAC,AACE,SAAS,AuBrDV,cAAc,EAJhB,AvBwDA,euBxDe,CsBAf,kBAAkB,C7CyDf,SAAS,AuBrDV,cAAc,AsBGd,aAAa,EAPf,A7CwDA,kB6CxDkB,CtBAlB,eAAe,CvByDZ,SAAS,AuBrDV,cAAc,AsBGd,aAAa,EtBPf,AvBwDA,euBxDe,CwBAf,wBAAwB,C/CyDrB,SAAS,AuBrDV,cAAc,AwBYd,aAAa,EAhBf,A/CwDA,wB+CxDwB,CxBAxB,eAAe,CvByDZ,SAAS,AuBrDV,cAAc,AwBYd,aAAa,ExBhBf,AvBwDA,euBxDe,CyBAf,6BAA6B,CAC3B,wBAAwB,ChDwDvB,SAAS,AuBrDV,cAAc,AyBiBZ,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,CzBD1B,eAAe,CvByDZ,SAAS,AuBrDV,cAAc,AyBiBZ,aAAa,EzBrBjB,AvBwDA,euBxDe,CyB4Bf,2BAA2B,CACzB,sBAAsB,ChD4BrB,SAAS,AuBrDV,cAAc,AyB6CZ,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,CzB7BxB,eAAe,CvByDZ,SAAS,AuBrDV,cAAc,AyB6CZ,aAAa,EzBjDjB,AvBwDA,euBxDe,C6BuEf,sBAAsB,CACpB,YAAY,CAUV,YAAY,CpDzBb,SAAS,AuBrDV,cAAc,A6BmFV,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,C7BlFhB,eAAe,CvByDZ,SAAS,AuBrDV,cAAc,A6BmFV,gBAAgB,E1BvFtB,A1BwDA,Y0BxDY,CACV,EAAE,CAGA,CAAC,A1BqDF,SAAS,E0BzDZ,A1BwDA,Y0BxDY,CACV,EAAE,CmBDJ,kBAAkB,C7CyDf,SAAS,A6ClDV,aAAa,EAPf,A7CwDA,kB6CxDkB,CnBAlB,YAAY,CACV,EAAE,C1BwDD,SAAS,A6ClDV,aAAa,EnBPf,A1BwDA,Y0BxDY,CACV,EAAE,CqBDJ,wBAAwB,C/CyDrB,SAAS,A+CzCV,aAAa,EAhBf,A/CwDA,wB+CxDwB,CrBAxB,YAAY,CACV,EAAE,C1BwDD,SAAS,A+CzCV,aAAa,ErBhBf,A1BwDA,Y0BxDY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,ChDwDvB,SAAS,AgDpCR,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,C1BwDD,SAAS,AgDpCR,aAAa,EtBrBjB,A1BwDA,Y0BxDY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,ChD4BrB,SAAS,AgDRR,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,C1BwDD,SAAS,AgDRR,aAAa,EtBjDjB,A1BwDA,Y0BxDY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CpDzBb,SAAS,AoD8BN,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C1BwDD,SAAS,AoD8BN,gBAAgB,EpD/BtB,AAAA,CAAC,AACE,SAAS,A2BzDZ,sBAAsB,EkBAtB,A7CwDA,kB6CxDkB,C7CyDf,SAAS,A2BzDZ,sBAAsB,AkBOpB,aAAa,EEPf,A/CwDA,wB+CxDwB,C/CyDrB,SAAS,A2BzDZ,sBAAsB,AoBgBpB,aAAa,EChBf,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,ChDwDvB,SAAS,A2BzDZ,sBAAsB,AqBqBlB,aAAa,EAOjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,ChD4BrB,SAAS,A2BzDZ,sBAAsB,AqBiDlB,aAAa,EIsBjB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,CpDzBb,SAAS,A2BzDZ,sBAAsB,AyBuFhB,gBAAgB,EpBvFtB,AhCwDA,iBgCxDiB,CA2Bf,cAAc,CAYZ,eAAe,ChCiBnB,CAAC,AACE,SAAS,AgCjBN,cAAc,EAxCpB,AhCwDA,iBgCxDiB,CA2Bf,cAAc,CAYZ,eAAe,CavCnB,kBAAkB,C7CyDf,SAAS,AgCjBN,cAAc,AajClB,aAAa,EAPf,A7CwDA,kB6CxDkB,CbAlB,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,ChCkBhB,SAAS,AgCjBN,cAAc,AajClB,aAAa,EbPf,AhCwDA,iBgCxDiB,CA2Bf,cAAc,CAYZ,eAAe,CevCnB,wBAAwB,C/CyDrB,SAAS,AgCjBN,cAAc,AexBlB,aAAa,EAhBf,A/CwDA,wB+CxDwB,CfAxB,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,ChCkBhB,SAAS,AgCjBN,cAAc,AexBlB,aAAa,EfhBf,AhCwDA,iBgCxDiB,CA2Bf,cAAc,CAYZ,eAAe,CgBvCnB,6BAA6B,CAC3B,wBAAwB,ChDwDvB,SAAS,AgCjBN,cAAc,AgBnBhB,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,ChBD1B,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,ChCkBhB,SAAS,AgCjBN,cAAc,AgBnBhB,aAAa,EhBrBjB,AhCwDA,iBgCxDiB,CA2Bf,cAAc,CAYZ,eAAe,CgBXnB,2BAA2B,CACzB,sBAAsB,ChD4BrB,SAAS,AgCjBN,cAAc,AgBShB,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,ChB7BxB,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,ChCkBhB,SAAS,AgCjBN,cAAc,AgBShB,aAAa,EhBjDjB,AhCwDA,iBgCxDiB,CA2Bf,cAAc,CAYZ,eAAe,CoBgCnB,sBAAsB,CACpB,YAAY,CAUV,YAAY,CpDzBb,SAAS,AgCjBN,cAAc,AoB+Cd,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,CpBlFhB,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,ChCkBhB,SAAS,AgCjBN,cAAc,AoB+Cd,gBAAgB,EdvFtB,AtCwDA,YsCxDY,CAkCV,aAAa,CtCsBf,CAAC,AACE,SAAS,AsCbR,oBAAoB,EA5CxB,AtCwDA,YsCxDY,CAkCV,aAAa,COlCf,kBAAkB,C7CyDf,SAAS,AsCbR,oBAAoB,AOrCtB,aAAa,EAPf,A7CwDA,kB6CxDkB,CPAlB,YAAY,CAkCV,aAAa,CtCuBZ,SAAS,AsCbR,oBAAoB,AOrCtB,aAAa,EPPf,AtCwDA,YsCxDY,CAkCV,aAAa,CSlCf,wBAAwB,C/CyDrB,SAAS,AsCbR,oBAAoB,AS5BtB,aAAa,EAhBf,A/CwDA,wB+CxDwB,CTAxB,YAAY,CAkCV,aAAa,CtCuBZ,SAAS,AsCbR,oBAAoB,AS5BtB,aAAa,EThBf,AtCwDA,YsCxDY,CAkCV,aAAa,CUlCf,6BAA6B,CAC3B,wBAAwB,ChDwDvB,SAAS,AsCbR,oBAAoB,AUvBpB,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,CVD1B,YAAY,CAkCV,aAAa,CtCuBZ,SAAS,AsCbR,oBAAoB,AUvBpB,aAAa,EVrBjB,AtCwDA,YsCxDY,CAkCV,aAAa,CUNf,2BAA2B,CACzB,sBAAsB,ChD4BrB,SAAS,AsCbR,oBAAoB,AUKpB,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,CV7BxB,YAAY,CAkCV,aAAa,CtCuBZ,SAAS,AsCbR,oBAAoB,AUKpB,aAAa,EVjDjB,AtCwDA,YsCxDY,CAkCV,aAAa,CcqCf,sBAAsB,CACpB,YAAY,CAUV,YAAY,CpDzBb,SAAS,AsCbR,oBAAoB,Ac2ClB,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,CdlFhB,YAAY,CAkCV,aAAa,CtCuBZ,SAAS,AsCbR,oBAAoB,Ac2ClB,gBAAgB,EZvFtB,AxCwDA,oBwCxDoB,CAGlB,EAAE,CxCqDJ,CAAC,AACE,SAAS,AwC7CR,YAAY,EAZhB,AxCwDA,oBwCxDoB,CAGlB,EAAE,CKHJ,kBAAkB,C7CyDf,SAAS,AwC7CR,YAAY,AKLd,aAAa,EAPf,A7CwDA,kB6CxDkB,CLAlB,oBAAoB,CAGlB,EAAE,CxCsDD,SAAS,AwC7CR,YAAY,AKLd,aAAa,ELPf,AxCwDA,oBwCxDoB,CAGlB,EAAE,COHJ,wBAAwB,C/CyDrB,SAAS,AwC7CR,YAAY,AOId,aAAa,EAhBf,A/CwDA,wB+CxDwB,CPAxB,oBAAoB,CAGlB,EAAE,CxCsDD,SAAS,AwC7CR,YAAY,AOId,aAAa,EPhBf,AxCwDA,oBwCxDoB,CAGlB,EAAE,CQHJ,6BAA6B,CAC3B,wBAAwB,ChDwDvB,SAAS,AwC7CR,YAAY,AQSZ,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,CRD1B,oBAAoB,CAGlB,EAAE,CxCsDD,SAAS,AwC7CR,YAAY,AQSZ,aAAa,ERrBjB,AxCwDA,oBwCxDoB,CAGlB,EAAE,CQyBJ,2BAA2B,CACzB,sBAAsB,ChD4BrB,SAAS,AwC7CR,YAAY,AQqCZ,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,CR7BxB,oBAAoB,CAGlB,EAAE,CxCsDD,SAAS,AwC7CR,YAAY,AQqCZ,aAAa,ERjDjB,AxCwDA,oBwCxDoB,CAGlB,EAAE,CYoEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CpDzBb,SAAS,AwC7CR,YAAY,AY2EV,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,CZlFhB,oBAAoB,CAGlB,EAAE,CxCsDD,SAAS,AwC7CR,YAAY,AY2EV,gBAAgB,EZvFtB,AxCwDA,oBwCxDoB,CAGlB,EAAE,CxCqDJ,CAAC,AACE,SAAS,AwChCR,gBAAgB,EAzBpB,AxCwDA,oBwCxDoB,CAGlB,EAAE,CKHJ,kBAAkB,C7CyDf,SAAS,AwChCR,gBAAgB,AKlBlB,aAAa,EAPf,A7CwDA,kB6CxDkB,CLAlB,oBAAoB,CAGlB,EAAE,CxCsDD,SAAS,AwChCR,gBAAgB,AKlBlB,aAAa,ELPf,AxCwDA,oBwCxDoB,CAGlB,EAAE,COHJ,wBAAwB,C/CyDrB,SAAS,AwChCR,gBAAgB,AOTlB,aAAa,EAhBf,A/CwDA,wB+CxDwB,CPAxB,oBAAoB,CAGlB,EAAE,CxCsDD,SAAS,AwChCR,gBAAgB,AOTlB,aAAa,EPhBf,AxCwDA,oBwCxDoB,CAGlB,EAAE,CQHJ,6BAA6B,CAC3B,wBAAwB,ChDwDvB,SAAS,AwChCR,gBAAgB,AQJhB,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,CRD1B,oBAAoB,CAGlB,EAAE,CxCsDD,SAAS,AwChCR,gBAAgB,AQJhB,aAAa,ERrBjB,AxCwDA,oBwCxDoB,CAGlB,EAAE,CQyBJ,2BAA2B,CACzB,sBAAsB,ChD4BrB,SAAS,AwChCR,gBAAgB,AQwBhB,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,CR7BxB,oBAAoB,CAGlB,EAAE,CxCsDD,SAAS,AwChCR,gBAAgB,AQwBhB,aAAa,ERjDjB,AxCwDA,oBwCxDoB,CAGlB,EAAE,CYoEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CpDzBb,SAAS,AwChCR,gBAAgB,AY8Dd,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,CZlFhB,oBAAoB,CAGlB,EAAE,CxCsDD,SAAS,AwChCR,gBAAgB,AY8Dd,gBAAgB,EXvFtB,AzCwDA,+ByCxD+B,CAC7B,iBAAiB,CzCuDnB,CAAC,AACE,SAAS,AyCvDR,gBAAgB,EAFpB,AzCwDA,+ByCxD+B,CAC7B,iBAAiB,CIDnB,kBAAkB,C7CyDf,SAAS,AyCvDR,gBAAgB,AIKlB,aAAa,EAPf,A7CwDA,kB6CxDkB,CJAlB,+BAA+B,CAC7B,iBAAiB,CzCwDhB,SAAS,AyCvDR,gBAAgB,AIKlB,aAAa,EJPf,AzCwDA,+ByCxD+B,CAC7B,iBAAiB,CMDnB,wBAAwB,C/CyDrB,SAAS,AyCvDR,gBAAgB,AMclB,aAAa,EAhBf,A/CwDA,wB+CxDwB,CNAxB,+BAA+B,CAC7B,iBAAiB,CzCwDhB,SAAS,AyCvDR,gBAAgB,AMclB,aAAa,ENhBf,AzCwDA,+ByCxD+B,CAC7B,iBAAiB,CODnB,6BAA6B,CAC3B,wBAAwB,ChDwDvB,SAAS,AyCvDR,gBAAgB,AOmBhB,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,CPD1B,+BAA+B,CAC7B,iBAAiB,CzCwDhB,SAAS,AyCvDR,gBAAgB,AOmBhB,aAAa,EPrBjB,AzCwDA,+ByCxD+B,CAC7B,iBAAiB,CO2BnB,2BAA2B,CACzB,sBAAsB,ChD4BrB,SAAS,AyCvDR,gBAAgB,AO+ChB,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,CP7BxB,+BAA+B,CAC7B,iBAAiB,CzCwDhB,SAAS,AyCvDR,gBAAgB,AO+ChB,aAAa,EPjDjB,AzCwDA,+ByCxD+B,CAC7B,iBAAiB,CWsEnB,sBAAsB,CACpB,YAAY,CAUV,YAAY,CpDzBb,SAAS,AyCvDR,gBAAgB,AWqFd,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,CXlFhB,+BAA+B,CAC7B,iBAAiB,CzCwDhB,SAAS,AyCvDR,gBAAgB,AWqFd,gBAAgB,EPvFtB,A7CwDA,kB6CxDkB,C7CwDjB,IAAI,AACF,SAAS,A6ClDV,aAAa,EAPf,A7CwDA,kB6CxDkB,CnBAlB,YAAY,CACV,EAAE,CAGA,CAAC,A1BqDF,SAAS,A6ClDV,aAAa,EnBPf,A1BwDA,Y0BxDY,CACV,EAAE,CmBDJ,kBAAkB,CnBId,CAAC,A1BqDF,SAAS,A6ClDV,aAAa,EAPf,A7CwDA,kB6CxDkB,CPAlB,YAAY,CAYV,cAAc,CACZ,MAAM,AtC4CP,SAAS,A6ClDV,aAAa,EPPf,AtCwDA,YsCxDY,CAYV,cAAc,COZhB,kBAAkB,CPad,MAAM,AtC4CP,SAAS,A6ClDV,aAAa,EEPf,A/CwDA,wB+CxDwB,C/CwDvB,IAAI,AACF,SAAS,A+CzCV,aAAa,EAhBf,A/CwDA,wB+CxDwB,CrBAxB,YAAY,CACV,EAAE,CAGA,CAAC,A1BqDF,SAAS,A+CzCV,aAAa,ErBhBf,A1BwDA,Y0BxDY,CACV,EAAE,CqBDJ,wBAAwB,CrBIpB,CAAC,A1BqDF,SAAS,A+CzCV,aAAa,EAhBf,A/CwDA,wB+CxDwB,CTAxB,YAAY,CAYV,cAAc,CACZ,MAAM,AtC4CP,SAAS,A+CzCV,aAAa,EThBf,AtCwDA,YsCxDY,CAYV,cAAc,CSZhB,wBAAwB,CTapB,MAAM,AtC4CP,SAAS,A+CzCV,aAAa,EChBf,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,ChDuDzB,IAAI,AACF,SAAS,AgDpCR,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CAGA,CAAC,A1BqDF,SAAS,AgDpCR,aAAa,EtBrBjB,A1BwDA,Y0BxDY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CtBGtB,CAAC,A1BqDF,SAAS,AgDpCR,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,CVD1B,YAAY,CAYV,cAAc,CACZ,MAAM,AtC4CP,SAAS,AgDpCR,aAAa,EVrBjB,AtCwDA,YsCxDY,CAYV,cAAc,CUZhB,6BAA6B,CAC3B,wBAAwB,CVYtB,MAAM,AtC4CP,SAAS,AgDpCR,aAAa,EAOjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,ChD2BvB,IAAI,AACF,SAAS,AgDRR,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CAGA,CAAC,A1BqDF,SAAS,AgDRR,aAAa,EtBjDjB,A1BwDA,Y0BxDY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CtBzBpB,CAAC,A1BqDF,SAAS,AgDRR,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,CV7BxB,YAAY,CAYV,cAAc,CACZ,MAAM,AtC4CP,SAAS,AgDRR,aAAa,EVjDjB,AtCwDA,YsCxDY,CAYV,cAAc,CUgBhB,2BAA2B,CACzB,sBAAsB,CVhBpB,MAAM,AtC4CP,SAAS,AgDRR,aAAa,EIsBjB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,CpD1Bf,IAAI,AACF,SAAS,AoD8BN,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CAGA,CAAC,A1BqDF,SAAS,AoD8BN,gBAAgB,E1BvFtB,A1BwDA,Y0BxDY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1B9EZ,CAAC,A1BqDF,SAAS,AoD8BN,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,CdlFhB,YAAY,CAYV,cAAc,CACZ,MAAM,AtC4CP,SAAS,AoD8BN,gBAAgB,EdvFtB,AtCwDA,YsCxDY,CAYV,cAAc,Cc2DhB,sBAAsB,CACpB,YAAY,CAUV,YAAY,CdrEZ,MAAM,AtC4CP,SAAS,AoD8BN,gBAAgB;ApD7BpB,AAFD,QAES,CAAA,AAAA,QAAC,AAAA,EAFX,CAAC,AAAA,IAAI;AAEH,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EuB1DX,eAAe,CvBwDf,CAAC,AuBpDC,cAAc,EAJhB,AvBwDA,euBxDe;AvB0Db,QAAQ,CAAA,AAAA,QAAC,AAAA,EAFX,CAAC,AuBpDC,cAAc;AvBsDd,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EuB1DX,eAAe,CsBAf,kBAAkB,CtBIhB,cAAc,AsBGd,aAAa,EtBPf,AvBwDA,euBxDe,CsBAf,kBAAkB;A7C0DhB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuBtDT,cAAc,AsBGd,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E6C1DX,kBAAkB,CtBAlB,eAAe,CAIb,cAAc,AsBGd,aAAa,EAPf,A7CwDA,kB6CxDkB,CtBAlB,eAAe;AvB0Db,QAAQ,CAAA,AAAA,QAAC,AAAA,EuBtDT,cAAc,AsBGd,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EuB1DX,eAAe,CwBAf,wBAAwB,CxBItB,cAAc,AwBYd,aAAa,ExBhBf,AvBwDA,euBxDe,CwBAf,wBAAwB;A/C0DtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuBtDT,cAAc,AwBYd,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E+C1DX,wBAAwB,CxBAxB,eAAe,CAIb,cAAc,AwBYd,aAAa,EAhBf,A/CwDA,wB+CxDwB,CxBAxB,eAAe;AvB0Db,QAAQ,CAAA,AAAA,QAAC,AAAA,EuBtDT,cAAc,AwBYd,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EuB1DX,eAAe,CyBAf,6BAA6B,CAC3B,wBAAwB,CzBGxB,cAAc,AyBiBZ,aAAa,EzBrBjB,AvBwDA,euBxDe,CyBAf,6BAA6B,CAC3B,wBAAwB;AhDyDxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuBtDT,cAAc,AyBiBZ,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD1DX,6BAA6B,CAC3B,wBAAwB,CzBD1B,eAAe,CAIb,cAAc,AyBiBZ,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,CzBD1B,eAAe;AvB0Db,QAAQ,CAAA,AAAA,QAAC,AAAA,EuBtDT,cAAc,AyBiBZ,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EuB1DX,eAAe,CyB4Bf,2BAA2B,CACzB,sBAAsB,CzBzBtB,cAAc,AyB6CZ,aAAa,EzBjDjB,AvBwDA,euBxDe,CyB4Bf,2BAA2B,CACzB,sBAAsB;AhD6BtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuBtDT,cAAc,AyB6CZ,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD9BX,2BAA2B,CACzB,sBAAsB,CzB7BxB,eAAe,CAIb,cAAc,AyB6CZ,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,CzB7BxB,eAAe;AvB0Db,QAAQ,CAAA,AAAA,QAAC,AAAA,EuBtDT,cAAc,AyB6CZ,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EuB1DX,eAAe,C6BuEf,sBAAsB,CACpB,YAAY,CAUV,YAAY,C7B9Ed,cAAc,A6BmFV,gBAAgB,E7BvFtB,AvBwDA,euBxDe,C6BuEf,sBAAsB,CACpB,YAAY,CAUV,YAAY;ApDxBd,QAAQ,CAAA,AAAA,QAAC,AAAA,EuBtDT,cAAc,A6BmFV,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EoDaX,sBAAsB,CACpB,YAAY,CAUV,YAAY,C7BlFhB,eAAe,CAIb,cAAc,A6BmFV,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,C7BlFhB,eAAe;AvB0Db,QAAQ,CAAA,AAAA,QAAC,AAAA,EuBtDT,cAAc,A6BmFV,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E0B1DX,YAAY,CACV,EAAE,CAGA,CAAC,EAJL,A1BwDA,Y0BxDY,CACV,EAAE;A1ByDF,QAAQ,CAAA,AAAA,QAAC,AAAA,E0BtDP,CAAC;A1BsDH,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E0B1DX,YAAY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,EnBPf,A1BwDA,Y0BxDY,CACV,EAAE,CmBDJ,kBAAkB;A7C0DhB,QAAQ,CAAA,AAAA,QAAC,AAAA,E6CnDT,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E6C1DX,kBAAkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,EAPf,A7CwDA,kB6CxDkB,CnBAlB,YAAY,CACV,EAAE;A1ByDF,QAAQ,CAAA,AAAA,QAAC,AAAA,E6CnDT,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E0B1DX,YAAY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,ErBhBf,A1BwDA,Y0BxDY,CACV,EAAE,CqBDJ,wBAAwB;A/C0DtB,QAAQ,CAAA,AAAA,QAAC,AAAA,E+C1CT,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E+C1DX,wBAAwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,EAhBf,A/CwDA,wB+CxDwB,CrBAxB,YAAY,CACV,EAAE;A1ByDF,QAAQ,CAAA,AAAA,QAAC,AAAA,E+C1CT,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E0B1DX,YAAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,EtBrBjB,A1BwDA,Y0BxDY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;AhDyDxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgDrCP,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD1DX,6BAA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;A1ByDF,QAAQ,CAAA,AAAA,QAAC,AAAA,EgDrCP,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E0B1DX,YAAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,EtBjDjB,A1BwDA,Y0BxDY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;AhD6BtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgDTP,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD9BX,2BAA2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;A1ByDF,QAAQ,CAAA,AAAA,QAAC,AAAA,EgDTP,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E0B1DX,YAAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,E1BvFtB,A1BwDA,Y0BxDY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;ApDxBd,QAAQ,CAAA,AAAA,QAAC,AAAA,EoD6BL,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EoDaX,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;A1ByDF,QAAQ,CAAA,AAAA,QAAC,AAAA,EoD6BL,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EAFX,CAAC,A2BxDD,sBAAsB;A3B0DpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E6C1DX,kBAAkB,ClBAlB,sBAAsB,AkBOpB,aAAa,EAPf,A7CwDA,kB6CxDkB;A7C0DhB,QAAQ,CAAA,AAAA,QAAC,AAAA,E2B1DX,sBAAsB,AkBOpB,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E+C1DX,wBAAwB,CpBAxB,sBAAsB,AoBgBpB,aAAa,EAhBf,A/CwDA,wB+CxDwB;A/C0DtB,QAAQ,CAAA,AAAA,QAAC,AAAA,E2B1DX,sBAAsB,AoBgBpB,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD1DX,6BAA6B,CAC3B,wBAAwB,CrBD1B,sBAAsB,AqBqBlB,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB;AhDyDxB,QAAQ,CAAA,AAAA,QAAC,AAAA,E2B1DX,sBAAsB,AqBqBlB,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD9BX,2BAA2B,CACzB,sBAAsB,CrB7BxB,sBAAsB,AqBiDlB,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB;AhD6BtB,QAAQ,CAAA,AAAA,QAAC,AAAA,E2B1DX,sBAAsB,AqBiDlB,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EoDaX,sBAAsB,CACpB,YAAY,CAUV,YAAY,CzBlFhB,sBAAsB,AyBuFhB,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY;ApDxBd,QAAQ,CAAA,AAAA,QAAC,AAAA,E2B1DX,sBAAsB,AyBuFhB,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgC1DX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,ChCiBnB,CAAC,AgChBK,cAAc,EAxCpB,AhCwDA,iBgCxDiB,CA2Bf,cAAc,CAYZ,eAAe;AhCmBjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAFX,CAAC,AgChBK,cAAc;AhCkBlB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgC1DX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CavCnB,kBAAkB,CbwCZ,cAAc,AajClB,aAAa,EbPf,AhCwDA,iBgCxDiB,CA2Bf,cAAc,CAYZ,eAAe,CavCnB,kBAAkB;A7C0DhB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgClBL,cAAc,AajClB,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E6C1DX,kBAAkB,CbAlB,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,AajClB,aAAa,EAPf,A7CwDA,kB6CxDkB,CbAlB,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe;AhCmBjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgClBL,cAAc,AajClB,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgC1DX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CevCnB,wBAAwB,CfwClB,cAAc,AexBlB,aAAa,EfhBf,AhCwDA,iBgCxDiB,CA2Bf,cAAc,CAYZ,eAAe,CevCnB,wBAAwB;A/C0DtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgClBL,cAAc,AexBlB,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E+C1DX,wBAAwB,CfAxB,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,AexBlB,aAAa,EAhBf,A/CwDA,wB+CxDwB,CfAxB,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe;AhCmBjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgClBL,cAAc,AexBlB,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgC1DX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CgBvCnB,6BAA6B,CAC3B,wBAAwB,ChBuCpB,cAAc,AgBnBhB,aAAa,EhBrBjB,AhCwDA,iBgCxDiB,CA2Bf,cAAc,CAYZ,eAAe,CgBvCnB,6BAA6B,CAC3B,wBAAwB;AhDyDxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgClBL,cAAc,AgBnBhB,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD1DX,6BAA6B,CAC3B,wBAAwB,ChBD1B,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,AgBnBhB,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,ChBD1B,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe;AhCmBjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgClBL,cAAc,AgBnBhB,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgC1DX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CgBXnB,2BAA2B,CACzB,sBAAsB,ChBWlB,cAAc,AgBShB,aAAa,EhBjDjB,AhCwDA,iBgCxDiB,CA2Bf,cAAc,CAYZ,eAAe,CgBXnB,2BAA2B,CACzB,sBAAsB;AhD6BtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgClBL,cAAc,AgBShB,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD9BX,2BAA2B,CACzB,sBAAsB,ChB7BxB,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,AgBShB,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,ChB7BxB,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe;AhCmBjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgClBL,cAAc,AgBShB,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgC1DX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CoBgCnB,sBAAsB,CACpB,YAAY,CAUV,YAAY,CpB1CV,cAAc,AoB+Cd,gBAAgB,EpBvFtB,AhCwDA,iBgCxDiB,CA2Bf,cAAc,CAYZ,eAAe,CoBgCnB,sBAAsB,CACpB,YAAY,CAUV,YAAY;ApDxBd,QAAQ,CAAA,AAAA,QAAC,AAAA,EgClBL,cAAc,AoB+Cd,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EoDaX,sBAAsB,CACpB,YAAY,CAUV,YAAY,CpBlFhB,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,AoB+Cd,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,CpBlFhB,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe;AhCmBjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgClBL,cAAc,AoB+Cd,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EsC1DX,YAAY,CAkCV,aAAa,CtCsBf,CAAC,AsCZG,oBAAoB,EA5CxB,AtCwDA,YsCxDY,CAkCV,aAAa;AtCwBb,QAAQ,CAAA,AAAA,QAAC,AAAA,EAFX,CAAC,AsCZG,oBAAoB;AtCctB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EsC1DX,YAAY,CAkCV,aAAa,COlCf,kBAAkB,CP4Cd,oBAAoB,AOrCtB,aAAa,EPPf,AtCwDA,YsCxDY,CAkCV,aAAa,COlCf,kBAAkB;A7C0DhB,QAAQ,CAAA,AAAA,QAAC,AAAA,EsCdP,oBAAoB,AOrCtB,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E6C1DX,kBAAkB,CPAlB,YAAY,CAkCV,aAAa,CAUX,oBAAoB,AOrCtB,aAAa,EAPf,A7CwDA,kB6CxDkB,CPAlB,YAAY,CAkCV,aAAa;AtCwBb,QAAQ,CAAA,AAAA,QAAC,AAAA,EsCdP,oBAAoB,AOrCtB,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EsC1DX,YAAY,CAkCV,aAAa,CSlCf,wBAAwB,CT4CpB,oBAAoB,AS5BtB,aAAa,EThBf,AtCwDA,YsCxDY,CAkCV,aAAa,CSlCf,wBAAwB;A/C0DtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EsCdP,oBAAoB,AS5BtB,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E+C1DX,wBAAwB,CTAxB,YAAY,CAkCV,aAAa,CAUX,oBAAoB,AS5BtB,aAAa,EAhBf,A/CwDA,wB+CxDwB,CTAxB,YAAY,CAkCV,aAAa;AtCwBb,QAAQ,CAAA,AAAA,QAAC,AAAA,EsCdP,oBAAoB,AS5BtB,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EsC1DX,YAAY,CAkCV,aAAa,CUlCf,6BAA6B,CAC3B,wBAAwB,CV2CtB,oBAAoB,AUvBpB,aAAa,EVrBjB,AtCwDA,YsCxDY,CAkCV,aAAa,CUlCf,6BAA6B,CAC3B,wBAAwB;AhDyDxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EsCdP,oBAAoB,AUvBpB,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD1DX,6BAA6B,CAC3B,wBAAwB,CVD1B,YAAY,CAkCV,aAAa,CAUX,oBAAoB,AUvBpB,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,CVD1B,YAAY,CAkCV,aAAa;AtCwBb,QAAQ,CAAA,AAAA,QAAC,AAAA,EsCdP,oBAAoB,AUvBpB,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EsC1DX,YAAY,CAkCV,aAAa,CUNf,2BAA2B,CACzB,sBAAsB,CVepB,oBAAoB,AUKpB,aAAa,EVjDjB,AtCwDA,YsCxDY,CAkCV,aAAa,CUNf,2BAA2B,CACzB,sBAAsB;AhD6BtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EsCdP,oBAAoB,AUKpB,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD9BX,2BAA2B,CACzB,sBAAsB,CV7BxB,YAAY,CAkCV,aAAa,CAUX,oBAAoB,AUKpB,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,CV7BxB,YAAY,CAkCV,aAAa;AtCwBb,QAAQ,CAAA,AAAA,QAAC,AAAA,EsCdP,oBAAoB,AUKpB,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EsC1DX,YAAY,CAkCV,aAAa,CcqCf,sBAAsB,CACpB,YAAY,CAUV,YAAY,CdtCZ,oBAAoB,Ac2ClB,gBAAgB,EdvFtB,AtCwDA,YsCxDY,CAkCV,aAAa,CcqCf,sBAAsB,CACpB,YAAY,CAUV,YAAY;ApDxBd,QAAQ,CAAA,AAAA,QAAC,AAAA,EsCdP,oBAAoB,Ac2ClB,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EoDaX,sBAAsB,CACpB,YAAY,CAUV,YAAY,CdlFhB,YAAY,CAkCV,aAAa,CAUX,oBAAoB,Ac2ClB,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,CdlFhB,YAAY,CAkCV,aAAa;AtCwBb,QAAQ,CAAA,AAAA,QAAC,AAAA,EsCdP,oBAAoB,Ac2ClB,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EwC1DX,oBAAoB,CAGlB,EAAE,CxCqDJ,CAAC,AwC5CG,YAAY,EAZhB,AxCwDA,oBwCxDoB,CAGlB,EAAE;AxCuDF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAFX,CAAC,AwC5CG,YAAY;AxC8Cd,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EwC1DX,oBAAoB,CAGlB,EAAE,CKHJ,kBAAkB,CLYd,YAAY,AKLd,aAAa,ELPf,AxCwDA,oBwCxDoB,CAGlB,EAAE,CKHJ,kBAAkB;A7C0DhB,QAAQ,CAAA,AAAA,QAAC,AAAA,EwC9CP,YAAY,AKLd,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E6C1DX,kBAAkB,CLAlB,oBAAoB,CAGlB,EAAE,CASA,YAAY,AKLd,aAAa,EAPf,A7CwDA,kB6CxDkB,CLAlB,oBAAoB,CAGlB,EAAE;AxCuDF,QAAQ,CAAA,AAAA,QAAC,AAAA,EwC9CP,YAAY,AKLd,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EwC1DX,oBAAoB,CAGlB,EAAE,COHJ,wBAAwB,CPYpB,YAAY,AOId,aAAa,EPhBf,AxCwDA,oBwCxDoB,CAGlB,EAAE,COHJ,wBAAwB;A/C0DtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EwC9CP,YAAY,AOId,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E+C1DX,wBAAwB,CPAxB,oBAAoB,CAGlB,EAAE,CASA,YAAY,AOId,aAAa,EAhBf,A/CwDA,wB+CxDwB,CPAxB,oBAAoB,CAGlB,EAAE;AxCuDF,QAAQ,CAAA,AAAA,QAAC,AAAA,EwC9CP,YAAY,AOId,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EwC1DX,oBAAoB,CAGlB,EAAE,CQHJ,6BAA6B,CAC3B,wBAAwB,CRWtB,YAAY,AQSZ,aAAa,ERrBjB,AxCwDA,oBwCxDoB,CAGlB,EAAE,CQHJ,6BAA6B,CAC3B,wBAAwB;AhDyDxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EwC9CP,YAAY,AQSZ,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD1DX,6BAA6B,CAC3B,wBAAwB,CRD1B,oBAAoB,CAGlB,EAAE,CASA,YAAY,AQSZ,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,CRD1B,oBAAoB,CAGlB,EAAE;AxCuDF,QAAQ,CAAA,AAAA,QAAC,AAAA,EwC9CP,YAAY,AQSZ,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EwC1DX,oBAAoB,CAGlB,EAAE,CQyBJ,2BAA2B,CACzB,sBAAsB,CRjBpB,YAAY,AQqCZ,aAAa,ERjDjB,AxCwDA,oBwCxDoB,CAGlB,EAAE,CQyBJ,2BAA2B,CACzB,sBAAsB;AhD6BtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EwC9CP,YAAY,AQqCZ,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD9BX,2BAA2B,CACzB,sBAAsB,CR7BxB,oBAAoB,CAGlB,EAAE,CASA,YAAY,AQqCZ,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,CR7BxB,oBAAoB,CAGlB,EAAE;AxCuDF,QAAQ,CAAA,AAAA,QAAC,AAAA,EwC9CP,YAAY,AQqCZ,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EwC1DX,oBAAoB,CAGlB,EAAE,CYoEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CZtEZ,YAAY,AY2EV,gBAAgB,EZvFtB,AxCwDA,oBwCxDoB,CAGlB,EAAE,CYoEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;ApDxBd,QAAQ,CAAA,AAAA,QAAC,AAAA,EwC9CP,YAAY,AY2EV,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EoDaX,sBAAsB,CACpB,YAAY,CAUV,YAAY,CZlFhB,oBAAoB,CAGlB,EAAE,CASA,YAAY,AY2EV,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,CZlFhB,oBAAoB,CAGlB,EAAE;AxCuDF,QAAQ,CAAA,AAAA,QAAC,AAAA,EwC9CP,YAAY,AY2EV,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EwC1DX,oBAAoB,CAGlB,EAAE,CxCqDJ,CAAC,AwC/BG,gBAAgB,EAzBpB,AxCwDA,oBwCxDoB,CAGlB,EAAE;AxCuDF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAFX,CAAC,AwC/BG,gBAAgB;AxCiClB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EwC1DX,oBAAoB,CAGlB,EAAE,CKHJ,kBAAkB,CLyBd,gBAAgB,AKlBlB,aAAa,ELPf,AxCwDA,oBwCxDoB,CAGlB,EAAE,CKHJ,kBAAkB;A7C0DhB,QAAQ,CAAA,AAAA,QAAC,AAAA,EwCjCP,gBAAgB,AKlBlB,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E6C1DX,kBAAkB,CLAlB,oBAAoB,CAGlB,EAAE,CAsBA,gBAAgB,AKlBlB,aAAa,EAPf,A7CwDA,kB6CxDkB,CLAlB,oBAAoB,CAGlB,EAAE;AxCuDF,QAAQ,CAAA,AAAA,QAAC,AAAA,EwCjCP,gBAAgB,AKlBlB,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EwC1DX,oBAAoB,CAGlB,EAAE,COHJ,wBAAwB,CPyBpB,gBAAgB,AOTlB,aAAa,EPhBf,AxCwDA,oBwCxDoB,CAGlB,EAAE,COHJ,wBAAwB;A/C0DtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EwCjCP,gBAAgB,AOTlB,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E+C1DX,wBAAwB,CPAxB,oBAAoB,CAGlB,EAAE,CAsBA,gBAAgB,AOTlB,aAAa,EAhBf,A/CwDA,wB+CxDwB,CPAxB,oBAAoB,CAGlB,EAAE;AxCuDF,QAAQ,CAAA,AAAA,QAAC,AAAA,EwCjCP,gBAAgB,AOTlB,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EwC1DX,oBAAoB,CAGlB,EAAE,CQHJ,6BAA6B,CAC3B,wBAAwB,CRwBtB,gBAAgB,AQJhB,aAAa,ERrBjB,AxCwDA,oBwCxDoB,CAGlB,EAAE,CQHJ,6BAA6B,CAC3B,wBAAwB;AhDyDxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EwCjCP,gBAAgB,AQJhB,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD1DX,6BAA6B,CAC3B,wBAAwB,CRD1B,oBAAoB,CAGlB,EAAE,CAsBA,gBAAgB,AQJhB,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,CRD1B,oBAAoB,CAGlB,EAAE;AxCuDF,QAAQ,CAAA,AAAA,QAAC,AAAA,EwCjCP,gBAAgB,AQJhB,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EwC1DX,oBAAoB,CAGlB,EAAE,CQyBJ,2BAA2B,CACzB,sBAAsB,CRJpB,gBAAgB,AQwBhB,aAAa,ERjDjB,AxCwDA,oBwCxDoB,CAGlB,EAAE,CQyBJ,2BAA2B,CACzB,sBAAsB;AhD6BtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EwCjCP,gBAAgB,AQwBhB,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD9BX,2BAA2B,CACzB,sBAAsB,CR7BxB,oBAAoB,CAGlB,EAAE,CAsBA,gBAAgB,AQwBhB,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,CR7BxB,oBAAoB,CAGlB,EAAE;AxCuDF,QAAQ,CAAA,AAAA,QAAC,AAAA,EwCjCP,gBAAgB,AQwBhB,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EwC1DX,oBAAoB,CAGlB,EAAE,CYoEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CZzDZ,gBAAgB,AY8Dd,gBAAgB,EZvFtB,AxCwDA,oBwCxDoB,CAGlB,EAAE,CYoEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;ApDxBd,QAAQ,CAAA,AAAA,QAAC,AAAA,EwCjCP,gBAAgB,AY8Dd,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EoDaX,sBAAsB,CACpB,YAAY,CAUV,YAAY,CZlFhB,oBAAoB,CAGlB,EAAE,CAsBA,gBAAgB,AY8Dd,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,CZlFhB,oBAAoB,CAGlB,EAAE;AxCuDF,QAAQ,CAAA,AAAA,QAAC,AAAA,EwCjCP,gBAAgB,AY8Dd,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EyC1DX,+BAA+B,CAC7B,iBAAiB,CzCuDnB,CAAC,AyCtDG,gBAAgB,EAFpB,AzCwDA,+ByCxD+B,CAC7B,iBAAiB;AzCyDjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAFX,CAAC,AyCtDG,gBAAgB;AzCwDlB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EyC1DX,+BAA+B,CAC7B,iBAAiB,CIDnB,kBAAkB,CJEd,gBAAgB,AIKlB,aAAa,EJPf,AzCwDA,+ByCxD+B,CAC7B,iBAAiB,CIDnB,kBAAkB;A7C0DhB,QAAQ,CAAA,AAAA,QAAC,AAAA,EyCxDP,gBAAgB,AIKlB,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E6C1DX,kBAAkB,CJAlB,+BAA+B,CAC7B,iBAAiB,CACf,gBAAgB,AIKlB,aAAa,EAPf,A7CwDA,kB6CxDkB,CJAlB,+BAA+B,CAC7B,iBAAiB;AzCyDjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EyCxDP,gBAAgB,AIKlB,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EyC1DX,+BAA+B,CAC7B,iBAAiB,CMDnB,wBAAwB,CNEpB,gBAAgB,AMclB,aAAa,ENhBf,AzCwDA,+ByCxD+B,CAC7B,iBAAiB,CMDnB,wBAAwB;A/C0DtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EyCxDP,gBAAgB,AMclB,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E+C1DX,wBAAwB,CNAxB,+BAA+B,CAC7B,iBAAiB,CACf,gBAAgB,AMclB,aAAa,EAhBf,A/CwDA,wB+CxDwB,CNAxB,+BAA+B,CAC7B,iBAAiB;AzCyDjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EyCxDP,gBAAgB,AMclB,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EyC1DX,+BAA+B,CAC7B,iBAAiB,CODnB,6BAA6B,CAC3B,wBAAwB,CPCtB,gBAAgB,AOmBhB,aAAa,EPrBjB,AzCwDA,+ByCxD+B,CAC7B,iBAAiB,CODnB,6BAA6B,CAC3B,wBAAwB;AhDyDxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EyCxDP,gBAAgB,AOmBhB,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD1DX,6BAA6B,CAC3B,wBAAwB,CPD1B,+BAA+B,CAC7B,iBAAiB,CACf,gBAAgB,AOmBhB,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,CPD1B,+BAA+B,CAC7B,iBAAiB;AzCyDjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EyCxDP,gBAAgB,AOmBhB,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EyC1DX,+BAA+B,CAC7B,iBAAiB,CO2BnB,2BAA2B,CACzB,sBAAsB,CP3BpB,gBAAgB,AO+ChB,aAAa,EPjDjB,AzCwDA,+ByCxD+B,CAC7B,iBAAiB,CO2BnB,2BAA2B,CACzB,sBAAsB;AhD6BtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EyCxDP,gBAAgB,AO+ChB,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD9BX,2BAA2B,CACzB,sBAAsB,CP7BxB,+BAA+B,CAC7B,iBAAiB,CACf,gBAAgB,AO+ChB,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,CP7BxB,+BAA+B,CAC7B,iBAAiB;AzCyDjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EyCxDP,gBAAgB,AO+ChB,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EyC1DX,+BAA+B,CAC7B,iBAAiB,CWsEnB,sBAAsB,CACpB,YAAY,CAUV,YAAY,CXhFZ,gBAAgB,AWqFd,gBAAgB,EXvFtB,AzCwDA,+ByCxD+B,CAC7B,iBAAiB,CWsEnB,sBAAsB,CACpB,YAAY,CAUV,YAAY;ApDxBd,QAAQ,CAAA,AAAA,QAAC,AAAA,EyCxDP,gBAAgB,AWqFd,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EoDaX,sBAAsB,CACpB,YAAY,CAUV,YAAY,CXlFhB,+BAA+B,CAC7B,iBAAiB,CACf,gBAAgB,AWqFd,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,CXlFhB,+BAA+B,CAC7B,iBAAiB;AzCyDjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EyCxDP,gBAAgB,AWqFd,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E6C1DX,kBAAkB,C7CwDjB,IAAI,A6CjDH,aAAa,EAPf,A7CwDA,kB6CxDkB;A7C0DhB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAFV,IAAI,A6CjDH,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E6C1DX,kBAAkB,CnBAlB,YAAY,CACV,EAAE,CAGA,CAAC,AmBGH,aAAa,EAPf,A7CwDA,kB6CxDkB,CnBAlB,YAAY,CACV,EAAE;A1ByDF,QAAQ,CAAA,AAAA,QAAC,AAAA,E0BtDP,CAAC,AmBGH,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E0B1DX,YAAY,CACV,EAAE,CmBDJ,kBAAkB,CnBId,CAAC,AmBGH,aAAa,EnBPf,A1BwDA,Y0BxDY,CACV,EAAE,CmBDJ,kBAAkB;A7C0DhB,QAAQ,CAAA,AAAA,QAAC,AAAA,E0BtDP,CAAC,AmBGH,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E6C1DX,kBAAkB,CPAlB,YAAY,CAYV,cAAc,CACZ,MAAM,AONR,aAAa,EAPf,A7CwDA,kB6CxDkB,CPAlB,YAAY,CAYV,cAAc;AtC8Cd,QAAQ,CAAA,AAAA,QAAC,AAAA,EsC7CP,MAAM,AONR,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EsC1DX,YAAY,CAYV,cAAc,COZhB,kBAAkB,CPad,MAAM,AONR,aAAa,EPPf,AtCwDA,YsCxDY,CAYV,cAAc,COZhB,kBAAkB;A7C0DhB,QAAQ,CAAA,AAAA,QAAC,AAAA,EsC7CP,MAAM,AONR,aAAa;A7CmDb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E+C1DX,wBAAwB,C/CwDvB,IAAI,A+CxCH,aAAa,EAhBf,A/CwDA,wB+CxDwB;A/C0DtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAFV,IAAI,A+CxCH,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E+C1DX,wBAAwB,CrBAxB,YAAY,CACV,EAAE,CAGA,CAAC,AqBYH,aAAa,EAhBf,A/CwDA,wB+CxDwB,CrBAxB,YAAY,CACV,EAAE;A1ByDF,QAAQ,CAAA,AAAA,QAAC,AAAA,E0BtDP,CAAC,AqBYH,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E0B1DX,YAAY,CACV,EAAE,CqBDJ,wBAAwB,CrBIpB,CAAC,AqBYH,aAAa,ErBhBf,A1BwDA,Y0BxDY,CACV,EAAE,CqBDJ,wBAAwB;A/C0DtB,QAAQ,CAAA,AAAA,QAAC,AAAA,E0BtDP,CAAC,AqBYH,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E+C1DX,wBAAwB,CTAxB,YAAY,CAYV,cAAc,CACZ,MAAM,ASGR,aAAa,EAhBf,A/CwDA,wB+CxDwB,CTAxB,YAAY,CAYV,cAAc;AtC8Cd,QAAQ,CAAA,AAAA,QAAC,AAAA,EsC7CP,MAAM,ASGR,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EsC1DX,YAAY,CAYV,cAAc,CSZhB,wBAAwB,CTapB,MAAM,ASGR,aAAa,EThBf,AtCwDA,YsCxDY,CAYV,cAAc,CSZhB,wBAAwB;A/C0DtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EsC7CP,MAAM,ASGR,aAAa;A/C0Cb,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD1DX,6BAA6B,CAC3B,wBAAwB,ChDuDzB,IAAI,AgDnCD,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB;AhDyDxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAFV,IAAI,AgDnCD,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD1DX,6BAA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CAGA,CAAC,AsBiBD,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;A1ByDF,QAAQ,CAAA,AAAA,QAAC,AAAA,E0BtDP,CAAC,AsBiBD,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E0B1DX,YAAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CtBGtB,CAAC,AsBiBD,aAAa,EtBrBjB,A1BwDA,Y0BxDY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;AhDyDxB,QAAQ,CAAA,AAAA,QAAC,AAAA,E0BtDP,CAAC,AsBiBD,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD1DX,6BAA6B,CAC3B,wBAAwB,CVD1B,YAAY,CAYV,cAAc,CACZ,MAAM,AUQN,aAAa,EArBjB,AhDwDA,6BgDxD6B,CAC3B,wBAAwB,CVD1B,YAAY,CAYV,cAAc;AtC8Cd,QAAQ,CAAA,AAAA,QAAC,AAAA,EsC7CP,MAAM,AUQN,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EsC1DX,YAAY,CAYV,cAAc,CUZhB,6BAA6B,CAC3B,wBAAwB,CVYtB,MAAM,AUQN,aAAa,EVrBjB,AtCwDA,YsCxDY,CAYV,cAAc,CUZhB,6BAA6B,CAC3B,wBAAwB;AhDyDxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EsC7CP,MAAM,AUQN,aAAa;AhDqCf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD9BX,2BAA2B,CACzB,sBAAsB,ChD2BvB,IAAI,AgDPD,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB;AhD6BtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAFV,IAAI,AgDPD,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD9BX,2BAA2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CAGA,CAAC,AsB6CD,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;A1ByDF,QAAQ,CAAA,AAAA,QAAC,AAAA,E0BtDP,CAAC,AsB6CD,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E0B1DX,YAAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CtBzBpB,CAAC,AsB6CD,aAAa,EtBjDjB,A1BwDA,Y0BxDY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;AhD6BtB,QAAQ,CAAA,AAAA,QAAC,AAAA,E0BtDP,CAAC,AsB6CD,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EgD9BX,2BAA2B,CACzB,sBAAsB,CV7BxB,YAAY,CAYV,cAAc,CACZ,MAAM,AUoCN,aAAa,EArBjB,AhD4BA,2BgD5B2B,CACzB,sBAAsB,CV7BxB,YAAY,CAYV,cAAc;AtC8Cd,QAAQ,CAAA,AAAA,QAAC,AAAA,EsC7CP,MAAM,AUoCN,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EsC1DX,YAAY,CAYV,cAAc,CUgBhB,2BAA2B,CACzB,sBAAsB,CVhBpB,MAAM,AUoCN,aAAa,EVjDjB,AtCwDA,YsCxDY,CAYV,cAAc,CUgBhB,2BAA2B,CACzB,sBAAsB;AhD6BtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EsC7CP,MAAM,AUoCN,aAAa;AhDSf,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EoDaX,sBAAsB,CACpB,YAAY,CAUV,YAAY,CpD1Bf,IAAI,AoD+BC,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY;ApDxBd,QAAQ,CAAA,AAAA,QAAC,AAAA,EAFV,IAAI,AoD+BC,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EoDaX,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CAGA,CAAC,A0BmFC,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;A1ByDF,QAAQ,CAAA,AAAA,QAAC,AAAA,E0BtDP,CAAC,A0BmFC,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,E0B1DX,YAAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1B9EZ,CAAC,A0BmFC,gBAAgB,E1BvFtB,A1BwDA,Y0BxDY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;ApDxBd,QAAQ,CAAA,AAAA,QAAC,AAAA,E0BtDP,CAAC,A0BmFC,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EoDaX,sBAAsB,CACpB,YAAY,CAUV,YAAY,CdlFhB,YAAY,CAYV,cAAc,CACZ,MAAM,Ac0EJ,gBAAgB,EAhBtB,ApDfA,sBoDesB,CACpB,YAAY,CAUV,YAAY,CdlFhB,YAAY,CAYV,cAAc;AtC8Cd,QAAQ,CAAA,AAAA,QAAC,AAAA,EsC7CP,MAAM,Ac0EJ,gBAAgB;ApD7BpB,AAFF,QAEU,CAAA,AAAA,QAAC,AAAA,EsC1DX,YAAY,CAYV,cAAc,Cc2DhB,sBAAsB,CACpB,YAAY,CAUV,YAAY,CdrEZ,MAAM,Ac0EJ,gBAAgB,EdvFtB,AtCwDA,YsCxDY,CAYV,cAAc,Cc2DhB,sBAAsB,CACpB,YAAY,CAUV,YAAY;ApDxBd,QAAQ,CAAA,AAAA,QAAC,AAAA,EsC7CP,MAAM,Ac0EJ,gBAAgB,CpD7BC;EACnB,cAAc,EAAE,IAAK,GACtB;;AAOH,AAAA,YAAY,EyCnEZ,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,CACf,gBAAgB,CzCiEP;EvB7DX,KAAK,EhBiJ0B,IAAI;EgBhJnC,gBAAgB,EhBiJe,IAAI;EgBhJnC,YAAY,EhBiJmB,IAAI,GuCpFpC;EAFD,AAAA,YAAY,AvBzDT,MAAM,EgEVT,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,CACf,gBAAgB,AhEQjB,MAAM,EuByDT,AAAA,YAAY,AvBxDT,MAAM,EgEXT,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,ChEUhB,MAAM,AgETL,gBAAgB,ChESV;IACN,KAAK,EhB2IwB,IAAI;IgB1IjC,gBAAgB,EAAE,OAAM;IACpB,YAAY,EAAE,OAAM,GACzB;EuBoDH,AAAA,YAAY,AvBnDT,MAAM,EgEhBT,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,CACf,gBAAgB,AhEcjB,MAAM,CAAC;IACN,KAAK,EhBsIwB,IAAI;IgBrIjC,gBAAgB,EAAE,OAAM;IACpB,YAAY,EAAE,OAAM,GACzB;EuB+CH,AAAA,YAAY,AvB9CT,OAAO,EgErBV,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,CACf,gBAAgB,AhEmBjB,OAAO,EuB8CV,AAAA,YAAY,AvB7CT,OAAO,EgEtBV,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,ChEqBhB,OAAO,AgEpBN,gBAAgB;EhEqBlB,AuB4CF,KvB5CO,GuB4CP,YAAY,AvB5CD,gBAAgB,EgEvB3B,AzCmEA,+ByCnE+B,CAC7B,iBAAiB;EhEsBjB,KAAK,GAAI,gBAAgB,AgErBvB,gBAAgB,ChEqBQ;IACxB,KAAK,EhB+HwB,IAAI;IgB9HjC,gBAAgB,EAAE,OAAM;IACpB,YAAY,EAAE,OAAM,GASzB;IuBgCH,AAAA,YAAY,AvB9CT,OAAO,AAOL,MAAM,EgE5BX,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,CACf,gBAAgB,AhEmBjB,OAAO,AAOL,MAAM,EuBuCX,AAAA,YAAY,AvB9CT,OAAO,AAQL,MAAM,EgE7BX,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,CACf,gBAAgB,AhEmBjB,OAAO,AAQL,MAAM,EuBsCX,AAAA,YAAY,AvB9CT,OAAO,AASL,MAAM,EgE9BX,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,CACf,gBAAgB,AhEmBjB,OAAO,AASL,MAAM,EuBqCX,AAAA,YAAY,AvB7CT,OAAO,AAML,MAAM,EgE5BX,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,ChEqBhB,OAAO,AgEpBN,gBAAgB,AhE0Bf,MAAM,EuBuCX,AAAA,YAAY,AvB7CT,OAAO,AAOL,MAAM,EgE7BX,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,ChEqBhB,OAAO,AgEpBN,gBAAgB,AhE2Bf,MAAM,EuBsCX,AAAA,YAAY,AvB7CT,OAAO,AAQL,MAAM,EgE9BX,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,ChEqBhB,OAAO,AAQL,MAAM,AgE5BP,gBAAgB;IhEqBlB,AuB4CF,KvB5CO,GuB4CP,YAAY,AvB5CD,gBAAgB,AAKtB,MAAM,EgE5BX,AzCmEA,+ByCnE+B,CAC7B,iBAAiB;IhEsBjB,KAAK,GAAI,gBAAgB,AgErBvB,gBAAgB,AhE0Bf,MAAM;IALT,AuB4CF,KvB5CO,GuB4CP,YAAY,AvB5CD,gBAAgB,AAMtB,MAAM,EgE7BX,AzCmEA,+ByCnE+B,CAC7B,iBAAiB;IhEsBjB,KAAK,GAAI,gBAAgB,AgErBvB,gBAAgB,AhE2Bf,MAAM;IANT,AuB4CF,KvB5CO,GuB4CP,YAAY,AvB5CD,gBAAgB,AAOtB,MAAM,EgE9BX,AzCmEA,+ByCnE+B,CAC7B,iBAAiB;IhEsBjB,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AgE5BP,gBAAgB,ChE4BR;MACN,KAAK,EhBwHsB,IAAI;MgBvH/B,gBAAgB,EAAE,OAAM;MACpB,YAAY,EAAE,OAAM,GACzB;EuBiCL,AAAA,YAAY,AvB/BT,OAAO,EgEpCV,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,CACf,gBAAgB,AhEkCjB,OAAO,EuB+BV,AAAA,YAAY,AvB9BT,OAAO,EgErCV,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,ChEoChB,OAAO,AgEnCN,gBAAgB;EhEoClB,AuB6BF,KvB7BO,GuB6BP,YAAY,AvB7BD,gBAAgB,EgEtC3B,AzCmEA,+ByCnE+B,CAC7B,iBAAiB;EhEqCjB,KAAK,GAAI,gBAAgB,AgEpCvB,gBAAgB,ChEoCQ;IACxB,gBAAgB,EAAE,IAAK,GACxB;EuB2BH,AAAA,YAAY,AvB1BT,SAAS,EgEzCZ,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,ChEwChB,SAAS,AgEvCR,gBAAgB,EzCiEpB,AAAA,YAAY,AvB1BT,SAAS,AAIP,MAAM,EgE7CX,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,ChEwChB,SAAS,AgEvCR,gBAAgB,AhE2Cf,MAAM,EuBsBX,AAAA,YAAY,AvB1BT,SAAS,AAKP,MAAM,EgE9CX,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,ChEwChB,SAAS,AgEvCR,gBAAgB,AhE4Cf,MAAM,EuBqBX,AAAA,YAAY,AvB1BT,SAAS,AAMP,MAAM,EgE/CX,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,ChEwChB,SAAS,AAMP,MAAM,AgE7CP,gBAAgB,EzCiEpB,AAAA,YAAY,AvB1BT,SAAS,AAOP,OAAO,EgEhDZ,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,ChEwChB,SAAS,AgEvCR,gBAAgB,AhE8Cf,OAAO,EuBmBZ,AAAA,YAAY,AvB1BT,SAAS,AAQP,OAAO,EgEjDZ,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,ChEwChB,SAAS,AAQP,OAAO,AgE/CR,gBAAgB,EzCiEpB,AAAA,YAAY,CvBzBT,AAAA,QAAC,AAAA,GgE1CJ,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,EhEyChB,AAAA,QAAC,AAAA,CgExCA,gBAAgB,EzCiEpB,AAAA,YAAY,CvBzBT,AAAA,QAAC,AAAA,CAGC,MAAM,EgE7CX,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,EhEyChB,AAAA,QAAC,AAAA,CgExCA,gBAAgB,AhE2Cf,MAAM,EuBsBX,AAAA,YAAY,CvBzBT,AAAA,QAAC,AAAA,CAIC,MAAM,EgE9CX,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,EhEyChB,AAAA,QAAC,AAAA,CgExCA,gBAAgB,AhE4Cf,MAAM,EuBqBX,AAAA,YAAY,CvBzBT,AAAA,QAAC,AAAA,CAKC,MAAM,EgE/CX,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,EhEyChB,AAAA,QAAC,AAAA,CAKC,MAAM,AgE7CP,gBAAgB,EzCiEpB,AAAA,YAAY,CvBzBT,AAAA,QAAC,AAAA,CAMC,OAAO,EgEhDZ,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,EhEyChB,AAAA,QAAC,AAAA,CgExCA,gBAAgB,AhE8Cf,OAAO,EuBmBZ,AAAA,YAAY,CvBzBT,AAAA,QAAC,AAAA,CAOC,OAAO,EgEjDZ,AzCmEA,+ByCnE+B,CAC7B,iBAAiB,EhEyChB,AAAA,QAAC,AAAA,CAOC,OAAO,AgE/CR,gBAAgB;EhEyClB,AuBwBF,QvBxBU,CAAA,AAAA,QAAC,AAAA,EuBwBX,YAAY;EvBxBV,AuBwBF,QvBxBU,CAAA,AAAA,QAAC,AAAA,EgE3CX,+BAA+B,CAC7B,iBAAiB,CACf,gBAAgB,EAFpB,AzCmEA,+ByCnE+B,CAC7B,iBAAiB;EhE0CjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgEzCP,gBAAgB;EhEyClB,AuBwBF,QvBxBU,CAAA,AAAA,QAAC,AAAA,EuBwBX,YAAY,AvBtBP,MAAM;EAFT,AuBwBF,QvBxBU,CAAA,AAAA,QAAC,AAAA,EgE3CX,+BAA+B,CAC7B,iBAAiB,CACf,gBAAgB,AhE2Cf,MAAM,EgE7CX,AzCmEA,+ByCnE+B,CAC7B,iBAAiB;EhE0CjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgEzCP,gBAAgB,AhE2Cf,MAAM;EAFT,AuBwBF,QvBxBU,CAAA,AAAA,QAAC,AAAA,EuBwBX,YAAY,AvBrBP,MAAM;EAHT,AuBwBF,QvBxBU,CAAA,AAAA,QAAC,AAAA,EgE3CX,+BAA+B,CAC7B,iBAAiB,CACf,gBAAgB,AhE4Cf,MAAM,EgE9CX,AzCmEA,+ByCnE+B,CAC7B,iBAAiB;EhE0CjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgEzCP,gBAAgB,AhE4Cf,MAAM;EAHT,AuBwBF,QvBxBU,CAAA,AAAA,QAAC,AAAA,EuBwBX,YAAY,AvBpBP,MAAM;EAJT,AuBwBF,QvBxBU,CAAA,AAAA,QAAC,AAAA,EgE3CX,+BAA+B,CAC7B,iBAAiB,ChE8Cd,MAAM,AgE7CP,gBAAgB,EAFpB,AzCmEA,+ByCnE+B,CAC7B,iBAAiB;EhE0CjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AgE7CP,gBAAgB;EhEyClB,AuBwBF,QvBxBU,CAAA,AAAA,QAAC,AAAA,EuBwBX,YAAY,AvBnBP,OAAO;EALV,AuBwBF,QvBxBU,CAAA,AAAA,QAAC,AAAA,EgE3CX,+BAA+B,CAC7B,iBAAiB,CACf,gBAAgB,AhE8Cf,OAAO,EgEhDZ,AzCmEA,+ByCnE+B,CAC7B,iBAAiB;EhE0CjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgEzCP,gBAAgB,AhE8Cf,OAAO;EALV,AuBwBF,QvBxBU,CAAA,AAAA,QAAC,AAAA,EuBwBX,YAAY,AvBlBP,OAAO;EANV,AuBwBF,QvBxBU,CAAA,AAAA,QAAC,AAAA,EgE3CX,+BAA+B,CAC7B,iBAAiB,ChEgDd,OAAO,AgE/CR,gBAAgB,EAFpB,AzCmEA,+ByCnE+B,CAC7B,iBAAiB;EhE0CjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AgE/CR,gBAAgB,ChE+CP;IACP,gBAAgB,EhBsGW,IAAI;IgBrG3B,YAAY,EhBsGW,IAAI,GgBrGhC;EuBeL,AvBZE,YuBYU,CvBZV,MAAM,EgEvDR,AhEuDE,+BgEvD6B,CAC7B,iBAAiB,CACf,gBAAgB,ChEqDlB,MAAM,CAAC;IACL,KAAK,EhBgGwB,IAAI;IgB/FjC,gBAAgB,EhB8Fa,IAAI,GgB7FlC;;AuBYH,AAAA,YAAY,EuBtEZ,AvBsEA,euBtEe,CAUb,KAAK,EAVP,AvBsEA,euBtEe,CAkBb,OAAO,EAlBT,AvBsEA,euBtEe,CAsBb,OAAO,EAtBT,AvBsEA,euBtEe,CA0Bb,IAAI,EA1BN,AvBsEA,euBtEe,CA8Bb,QAAQ,EG9BV,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,EAJL,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,EAPf,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,EnBPf,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,EAhBf,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,ErBhBf,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,EArBjB,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,EtBrBjB,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,EArBjB,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,EtBjDjB,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,EAhBtB,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,EzBvFtB,A3BsEA,sB2BtEsB,EKAtB,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,EA9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,EA1Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,EA9Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,EAlEX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,EAtEV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,EM1Ed,AtCsEA,YsCtEY,CAYV,cAAc,CAiBZ,YAAY,EA7BhB,AtCsEA,YsCtEY,CAkCV,aAAa,CAUX,oBAAoB,EE5CxB,AxCsEA,oBwCtEoB,CAGlB,EAAE,CAsBA,gBAAgB,ECzBpB,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,CzC8DH;EvBhEX,KAAK,EhBqJ0B,IAAI;EgBpJnC,gBAAgB,EhBUM,OAAM;EgBT5B,YAAY,EhBqJmB,OAAM,GuCrFtC;EAFD,AAAA,YAAY,AvB5DT,MAAM,E8CVT,AvBsEA,euBtEe,CAUb,KAAK,A9CAJ,MAAM,E8CVT,AvBsEA,euBtEe,CAkBb,OAAO,A9CRN,MAAM,E8CVT,AvBsEA,euBtEe,CAsBb,OAAO,A9CZN,MAAM,E8CVT,AvBsEA,euBtEe,CA0Bb,IAAI,A9ChBH,MAAM,E8CVT,AvBsEA,euBtEe,CA8Bb,QAAQ,A9CpBP,MAAM,EiDVT,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDMF,MAAM,EiDVT,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,ApEGZ,MAAM,EoEVT,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,ApEGZ,MAAM,EiDVT,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,AtENZ,MAAM,EsEVT,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,AtENZ,MAAM,EiDVT,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,AvEXd,MAAM,EuEVT,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,AvEXd,MAAM,EiDVT,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,AvEvCd,MAAM,EuEkBT,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,AvEvCd,MAAM,EiDVT,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,A3E7EnB,MAAM,E2E6DT,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,A3E7EnB,MAAM,EkDVT,A3BsEA,sB2BtEsB,AlDUnB,MAAM,EuDVT,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,AvDpCR,MAAM,EuDVT,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,AvDhDV,MAAM,EuDVT,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,AvDpDV,MAAM,EuDVT,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,AvDxDR,MAAM,EuDVT,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,AvD5DP,MAAM,EuDVT,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,AvDhEX,MAAM,E6DVT,AtCsEA,YsCtEY,CAYV,cAAc,CAiBZ,YAAY,A7DnBb,MAAM,E6DVT,AtCsEA,YsCtEY,CAkCV,aAAa,CAUX,oBAAoB,A7DlCrB,MAAM,E+DVT,AxCsEA,oBwCtEoB,CAGlB,EAAE,CAsBA,gBAAgB,A/DfjB,MAAM,EgEVT,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,AhEEb,MAAM,EuB4DT,AAAA,YAAY,AvB3DT,MAAM,E8CXT,AvBsEA,euBtEe,C9CWZ,MAAM,A8CDP,KAAK,EAVP,AvBsEA,euBtEe,C9CWZ,MAAM,A8COP,OAAO,EAlBT,AvBsEA,euBtEe,C9CWZ,MAAM,A8CWP,OAAO,EAtBT,AvBsEA,euBtEe,C9CWZ,MAAM,A8CeP,IAAI,EA1BN,AvBsEA,euBtEe,C9CWZ,MAAM,A8CmBP,QAAQ,EG9BV,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDOF,MAAM,EiDXT,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CpEWf,MAAM,AoEJP,aAAa,EAPf,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CjDUD,MAAM,AoEJP,aAAa,EnBPf,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CtEWrB,MAAM,AsEKP,aAAa,EAhBf,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CjDUD,MAAM,AsEKP,aAAa,ErBhBf,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEUvB,MAAM,AuEUL,aAAa,EArBjB,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDUD,MAAM,AuEUL,aAAa,EtBrBjB,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvElBrB,MAAM,AuEsCL,aAAa,EArBjB,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDUD,MAAM,AuEsCL,aAAa,EtBjDjB,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3EvEb,MAAM,A2E4EH,gBAAgB,EAhBtB,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDUD,MAAM,A2E4EH,gBAAgB,E3E5EnB,AuB2DH,MvB3DS,AkDXT,sBAAsB,EKAtB,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvD5BhB,MAAM,AuDmCH,KAAK,EA9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvD5BhB,MAAM,AuD+CH,OAAO,EA1Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvD5BhB,MAAM,AuDmDH,OAAO,EA9Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvD5BhB,MAAM,AuDuDH,KAAK,EAlEX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvD5BhB,MAAM,AuD2DH,IAAI,EAtEV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvD5BhB,MAAM,AuD+DH,QAAQ,EM1Ed,AtCsEA,YsCtEY,CAYV,cAAc,C7DDb,MAAM,A6DkBL,YAAY,EA7BhB,AtCsEA,YsCtEY,CAkCV,aAAa,C7DvBZ,MAAM,A6DiCL,oBAAoB,EE5CxB,AxCsEA,oBwCtEoB,CAGlB,EAAE,C/DQD,MAAM,A+DcL,gBAAgB,ECzBpB,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,ChEUhB,MAAM,AgETL,gBAAgB,AAMb,SAAS,ChEGN;IACN,KAAK,EhB+IwB,IAAI;IgB9IjC,gBAAgB,EAAE,OAAM;IACpB,YAAY,EAAE,OAAM,GACzB;EuBuDH,AAAA,YAAY,AvBtDT,MAAM,E8ChBT,AvBsEA,euBtEe,CAUb,KAAK,A9CMJ,MAAM,E8ChBT,AvBsEA,euBtEe,CAkBb,OAAO,A9CFN,MAAM,E8ChBT,AvBsEA,euBtEe,CAsBb,OAAO,A9CNN,MAAM,E8ChBT,AvBsEA,euBtEe,CA0Bb,IAAI,A9CVH,MAAM,E8ChBT,AvBsEA,euBtEe,CA8Bb,QAAQ,A9CdP,MAAM,EiDhBT,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDYF,MAAM,EiDhBT,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,ApESZ,MAAM,EoEhBT,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,ApESZ,MAAM,EiDhBT,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,AtEAZ,MAAM,EsEhBT,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,AtEAZ,MAAM,EiDhBT,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,AvELd,MAAM,EuEhBT,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,AvELd,MAAM,EiDhBT,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,AvEjCd,MAAM,EuEYT,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,AvEjCd,MAAM,EiDhBT,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,A3EvEnB,MAAM,E2EuDT,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,A3EvEnB,MAAM,EkDhBT,A3BsEA,sB2BtEsB,AlDgBnB,MAAM,EuDhBT,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,AvD9BR,MAAM,EuDhBT,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,AvD1CV,MAAM,EuDhBT,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,AvD9CV,MAAM,EuDhBT,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,AvDlDR,MAAM,EuDhBT,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,AvDtDP,MAAM,EuDhBT,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,AvD1DX,MAAM,E6DhBT,AtCsEA,YsCtEY,CAYV,cAAc,CAiBZ,YAAY,A7Dbb,MAAM,E6DhBT,AtCsEA,YsCtEY,CAkCV,aAAa,CAUX,oBAAoB,A7D5BrB,MAAM,E+DhBT,AxCsEA,oBwCtEoB,CAGlB,EAAE,CAsBA,gBAAgB,A/DTjB,MAAM,EgEhBT,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,AhEQb,MAAM,CAAC;IACN,KAAK,EhB0IwB,IAAI;IgBzIjC,gBAAgB,EAAE,OAAM;IACpB,YAAY,EAAE,OAAM,GACzB;EuBkDH,AAAA,YAAY,AvBjDT,OAAO,E8CrBV,AvBsEA,euBtEe,CAUb,KAAK,A9CWJ,OAAO,E8CrBV,AvBsEA,euBtEe,CAkBb,OAAO,A9CGN,OAAO,E8CrBV,AvBsEA,euBtEe,CAsBb,OAAO,A9CDN,OAAO,E8CrBV,AvBsEA,euBtEe,CA0Bb,IAAI,A9CLH,OAAO,E8CrBV,AvBsEA,euBtEe,CA8Bb,QAAQ,A9CTP,OAAO,EiDrBV,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDiBF,OAAO,EiDrBV,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,ApEcZ,OAAO,EoErBV,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,ApEcZ,OAAO,EiDrBV,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,AtEKZ,OAAO,EsErBV,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,AtEKZ,OAAO,EiDrBV,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,AvEAd,OAAO,EuErBV,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,AvEAd,OAAO,EiDrBV,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,AvE5Bd,OAAO,EuEOV,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,AvE5Bd,OAAO,EiDrBV,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,A3ElEnB,OAAO,E2EkDV,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,A3ElEnB,OAAO,EkDrBV,A3BsEA,sB2BtEsB,AlDqBnB,OAAO,EuDrBV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,AvDzBR,OAAO,EuDrBV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,AvDrCV,OAAO,EuDrBV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,AvDzCV,OAAO,EuDrBV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,AvD7CR,OAAO,EuDrBV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,AvDjDP,OAAO,EuDrBV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,AvDrDX,OAAO,E6DrBV,AtCsEA,YsCtEY,CAYV,cAAc,CAiBZ,YAAY,A7DRb,OAAO,E6DrBV,AtCsEA,YsCtEY,CAkCV,aAAa,CAUX,oBAAoB,A7DvBrB,OAAO,E+DrBV,AxCsEA,oBwCtEoB,CAGlB,EAAE,CAsBA,gBAAgB,A/DJjB,OAAO,EgErBV,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,AhEab,OAAO,EuBiDV,AAAA,YAAY,AvBhDT,OAAO,E8CtBV,AvBsEA,euBtEe,C9CsBZ,OAAO,A8CZR,KAAK,EAVP,AvBsEA,euBtEe,C9CsBZ,OAAO,A8CJR,OAAO,EAlBT,AvBsEA,euBtEe,C9CsBZ,OAAO,A8CAR,OAAO,EAtBT,AvBsEA,euBtEe,C9CsBZ,OAAO,A8CIR,IAAI,EA1BN,AvBsEA,euBtEe,C9CsBZ,OAAO,A8CQR,QAAQ,EG9BV,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDkBF,OAAO,EiDtBV,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CpEsBf,OAAO,AoEfR,aAAa,EAPf,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CjDqBD,OAAO,AoEfR,aAAa,EnBPf,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CtEsBrB,OAAO,AsENR,aAAa,EAhBf,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CjDqBD,OAAO,AsENR,aAAa,ErBhBf,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEqBvB,OAAO,AuEDN,aAAa,EArBjB,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDqBD,OAAO,AuEDN,aAAa,EtBrBjB,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEPrB,OAAO,AuE2BN,aAAa,EArBjB,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDqBD,OAAO,AuE2BN,aAAa,EtBjDjB,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3E5Db,OAAO,A2EiEJ,gBAAgB,EAhBtB,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDqBD,OAAO,A2EiEJ,gBAAgB,E3EjEnB,AuBgDH,OvBhDU,AkDtBV,sBAAsB,EKAtB,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuDwBJ,KAAK,EA9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuDoCJ,OAAO,EA1Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuDwCJ,OAAO,EA9Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuD4CJ,KAAK,EAlEX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuDgDJ,IAAI,EAtEV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuDoDJ,QAAQ,EM1Ed,AtCsEA,YsCtEY,CAYV,cAAc,C7DUb,OAAO,A6DON,YAAY,EA7BhB,AtCsEA,YsCtEY,CAkCV,aAAa,C7DZZ,OAAO,A6DsBN,oBAAoB,EE5CxB,AxCsEA,oBwCtEoB,CAGlB,EAAE,C/DmBD,OAAO,A+DGN,gBAAgB,ECzBpB,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,ChEqBhB,OAAO,AgEpBN,gBAAgB,AAMb,SAAS;EhEed,AuB+CF,KvB/CO,GuB+CP,YAAY,AvB/CD,gBAAgB,E8CvB3B,AvBsEA,euBtEe;E9CuBb,KAAK,GAAI,gBAAgB,A8CbzB,KAAK,EAVP,AvBsEA,euBtEe;E9CuBb,KAAK,GAAI,gBAAgB,A8CLzB,OAAO,EAlBT,AvBsEA,euBtEe;E9CuBb,KAAK,GAAI,gBAAgB,A8CDzB,OAAO,EAtBT,AvBsEA,euBtEe;E9CuBb,KAAK,GAAI,gBAAgB,A8CGzB,IAAI,EA1BN,AvBsEA,euBtEe;E9CuBb,KAAK,GAAI,gBAAgB,A8COzB,QAAQ,EG9BV,A1BsEA,Y0BtEY,CACV,EAAE;EjDsBF,KAAK,GiDnBH,CAAC,AjDmBM,gBAAgB,EiDvB3B,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB;EpEuBhB,KAAK,GAAI,gBAAgB,AoEhBzB,aAAa,EAPf,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE;EjDsBF,KAAK,GAAI,gBAAgB,AoEhBzB,aAAa,EnBPf,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB;EtEuBtB,KAAK,GAAI,gBAAgB,AsEPzB,aAAa,EAhBf,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE;EjDsBF,KAAK,GAAI,gBAAgB,AsEPzB,aAAa,ErBhBf,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;EvEsBxB,KAAK,GAAI,gBAAgB,AuEFvB,aAAa,EArBjB,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;EjDsBF,KAAK,GAAI,gBAAgB,AuEFvB,aAAa,EtBrBjB,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;EvENtB,KAAK,GAAI,gBAAgB,AuE0BvB,aAAa,EArBjB,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;EjDsBF,KAAK,GAAI,gBAAgB,AuE0BvB,aAAa,EtBjDjB,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;E3E3Dd,KAAK,GAAI,gBAAgB,A2EgErB,gBAAgB,EAhBtB,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;EjDsBF,KAAK,GAAI,gBAAgB,A2EgErB,gBAAgB;E3EhEpB,AuB+CF,KvB/CO,GAAI,gBAAgB,AkDvB3B,sBAAsB,EKAtB,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDhBjB,KAAK,GAAI,gBAAgB,AuDuBrB,KAAK,EA9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDhBjB,KAAK,GAAI,gBAAgB,AuDmCrB,OAAO,EA1Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDhBjB,KAAK,GAAI,gBAAgB,AuDuCrB,OAAO,EA9Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDhBjB,KAAK,GAAI,gBAAgB,AuD2CrB,KAAK,EAlEX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDhBjB,KAAK,GAAI,gBAAgB,AuD+CrB,IAAI,EAtEV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDhBjB,KAAK,GAAI,gBAAgB,AuDmDrB,QAAQ,EM1Ed,AtCsEA,YsCtEY,CAYV,cAAc;E7DWd,KAAK,GAAI,gBAAgB,A6DMvB,YAAY,EA7BhB,AtCsEA,YsCtEY,CAkCV,aAAa;E7DXb,KAAK,GAAI,gBAAgB,A6DqBvB,oBAAoB,EE5CxB,AxCsEA,oBwCtEoB,CAGlB,EAAE;E/DoBF,KAAK,GAAI,gBAAgB,A+DEvB,gBAAgB,ECzBpB,AzCsEA,+ByCtE+B,CAC7B,iBAAiB;EhEsBjB,KAAK,GAAI,gBAAgB,AgErBvB,gBAAgB,AAMb,SAAS,ChEeY;IACxB,KAAK,EhBmIwB,IAAI;IgBlIjC,gBAAgB,EAAE,OAAM;IACpB,YAAY,EAAE,OAAM,GASzB;IuBmCH,AAAA,YAAY,AvBjDT,OAAO,AAOL,MAAM,E8C5BX,AvBsEA,euBtEe,CAUb,KAAK,A9CWJ,OAAO,AAOL,MAAM,E8C5BX,AvBsEA,euBtEe,CAkBb,OAAO,A9CGN,OAAO,AAOL,MAAM,E8C5BX,AvBsEA,euBtEe,CAsBb,OAAO,A9CDN,OAAO,AAOL,MAAM,E8C5BX,AvBsEA,euBtEe,CA0Bb,IAAI,A9CLH,OAAO,AAOL,MAAM,E8C5BX,AvBsEA,euBtEe,CA8Bb,QAAQ,A9CTP,OAAO,AAOL,MAAM,EiD5BX,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDiBF,OAAO,AAOL,MAAM,EiD5BX,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,ApEcZ,OAAO,AAOL,MAAM,EoE5BX,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,ApEcZ,OAAO,AAOL,MAAM,EiD5BX,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,AtEKZ,OAAO,AAOL,MAAM,EsE5BX,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,AtEKZ,OAAO,AAOL,MAAM,EiD5BX,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,AvEAd,OAAO,AAOL,MAAM,EuE5BX,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,AvEAd,OAAO,AAOL,MAAM,EiD5BX,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,AvE5Bd,OAAO,AAOL,MAAM,EuEAX,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,AvE5Bd,OAAO,AAOL,MAAM,EiD5BX,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,A3ElEnB,OAAO,AAOL,MAAM,E2E2CX,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,A3ElEnB,OAAO,AAOL,MAAM,EkD5BX,A3BsEA,sB2BtEsB,AlDqBnB,OAAO,AAOL,MAAM,EuD5BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,AvDzBR,OAAO,AAOL,MAAM,EuD5BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,AvDrCV,OAAO,AAOL,MAAM,EuD5BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,AvDzCV,OAAO,AAOL,MAAM,EuD5BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,AvD7CR,OAAO,AAOL,MAAM,EuD5BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,AvDjDP,OAAO,AAOL,MAAM,EuD5BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,AvDrDX,OAAO,AAOL,MAAM,E6D5BX,AtCsEA,YsCtEY,CAYV,cAAc,CAiBZ,YAAY,A7DRb,OAAO,AAOL,MAAM,E6D5BX,AtCsEA,YsCtEY,CAkCV,aAAa,CAUX,oBAAoB,A7DvBrB,OAAO,AAOL,MAAM,E+D5BX,AxCsEA,oBwCtEoB,CAGlB,EAAE,CAsBA,gBAAgB,A/DJjB,OAAO,AAOL,MAAM,EgE5BX,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,AhEab,OAAO,AAOL,MAAM,EuB0CX,AAAA,YAAY,AvBjDT,OAAO,AAQL,MAAM,E8C7BX,AvBsEA,euBtEe,CAUb,KAAK,A9CWJ,OAAO,AAQL,MAAM,E8C7BX,AvBsEA,euBtEe,CAkBb,OAAO,A9CGN,OAAO,AAQL,MAAM,E8C7BX,AvBsEA,euBtEe,CAsBb,OAAO,A9CDN,OAAO,AAQL,MAAM,E8C7BX,AvBsEA,euBtEe,CA0Bb,IAAI,A9CLH,OAAO,AAQL,MAAM,E8C7BX,AvBsEA,euBtEe,CA8Bb,QAAQ,A9CTP,OAAO,AAQL,MAAM,EiD7BX,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDiBF,OAAO,AAQL,MAAM,EiD7BX,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,ApEcZ,OAAO,AAQL,MAAM,EoE7BX,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,ApEcZ,OAAO,AAQL,MAAM,EiD7BX,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,AtEKZ,OAAO,AAQL,MAAM,EsE7BX,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,AtEKZ,OAAO,AAQL,MAAM,EiD7BX,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,AvEAd,OAAO,AAQL,MAAM,EuE7BX,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,AvEAd,OAAO,AAQL,MAAM,EiD7BX,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,AvE5Bd,OAAO,AAQL,MAAM,EuEDX,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,AvE5Bd,OAAO,AAQL,MAAM,EiD7BX,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,A3ElEnB,OAAO,AAQL,MAAM,E2E0CX,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,A3ElEnB,OAAO,AAQL,MAAM,EkD7BX,A3BsEA,sB2BtEsB,AlDqBnB,OAAO,AAQL,MAAM,EuD7BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,AvDzBR,OAAO,AAQL,MAAM,EuD7BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,AvDrCV,OAAO,AAQL,MAAM,EuD7BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,AvDzCV,OAAO,AAQL,MAAM,EuD7BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,AvD7CR,OAAO,AAQL,MAAM,EuD7BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,AvDjDP,OAAO,AAQL,MAAM,EuD7BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,AvDrDX,OAAO,AAQL,MAAM,E6D7BX,AtCsEA,YsCtEY,CAYV,cAAc,CAiBZ,YAAY,A7DRb,OAAO,AAQL,MAAM,E6D7BX,AtCsEA,YsCtEY,CAkCV,aAAa,CAUX,oBAAoB,A7DvBrB,OAAO,AAQL,MAAM,E+D7BX,AxCsEA,oBwCtEoB,CAGlB,EAAE,CAsBA,gBAAgB,A/DJjB,OAAO,AAQL,MAAM,EgE7BX,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,AhEab,OAAO,AAQL,MAAM,EuByCX,AAAA,YAAY,AvBjDT,OAAO,AASL,MAAM,E8C9BX,AvBsEA,euBtEe,CAUb,KAAK,A9CWJ,OAAO,AASL,MAAM,E8C9BX,AvBsEA,euBtEe,CAkBb,OAAO,A9CGN,OAAO,AASL,MAAM,E8C9BX,AvBsEA,euBtEe,CAsBb,OAAO,A9CDN,OAAO,AASL,MAAM,E8C9BX,AvBsEA,euBtEe,CA0Bb,IAAI,A9CLH,OAAO,AASL,MAAM,E8C9BX,AvBsEA,euBtEe,CA8Bb,QAAQ,A9CTP,OAAO,AASL,MAAM,EiD9BX,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDiBF,OAAO,AASL,MAAM,EiD9BX,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,ApEcZ,OAAO,AASL,MAAM,EoE9BX,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,ApEcZ,OAAO,AASL,MAAM,EiD9BX,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,AtEKZ,OAAO,AASL,MAAM,EsE9BX,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,AtEKZ,OAAO,AASL,MAAM,EiD9BX,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,AvEAd,OAAO,AASL,MAAM,EuE9BX,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,AvEAd,OAAO,AASL,MAAM,EiD9BX,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,AvE5Bd,OAAO,AASL,MAAM,EuEFX,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,AvE5Bd,OAAO,AASL,MAAM,EiD9BX,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,A3ElEnB,OAAO,AASL,MAAM,E2EyCX,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,A3ElEnB,OAAO,AASL,MAAM,EkD9BX,A3BsEA,sB2BtEsB,AlDqBnB,OAAO,AASL,MAAM,EuD9BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,AvDzBR,OAAO,AASL,MAAM,EuD9BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,AvDrCV,OAAO,AASL,MAAM,EuD9BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,AvDzCV,OAAO,AASL,MAAM,EuD9BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,AvD7CR,OAAO,AASL,MAAM,EuD9BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,AvDjDP,OAAO,AASL,MAAM,EuD9BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,AvDrDX,OAAO,AASL,MAAM,E6D9BX,AtCsEA,YsCtEY,CAYV,cAAc,CAiBZ,YAAY,A7DRb,OAAO,AASL,MAAM,E6D9BX,AtCsEA,YsCtEY,CAkCV,aAAa,CAUX,oBAAoB,A7DvBrB,OAAO,AASL,MAAM,E+D9BX,AxCsEA,oBwCtEoB,CAGlB,EAAE,CAsBA,gBAAgB,A/DJjB,OAAO,AASL,MAAM,EgE9BX,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,AhEab,OAAO,AASL,MAAM,EuBwCX,AAAA,YAAY,AvBhDT,OAAO,AAML,MAAM,E8C5BX,AvBsEA,euBtEe,C9CsBZ,OAAO,A8CZR,KAAK,A9CkBF,MAAM,E8C5BX,AvBsEA,euBtEe,C9CsBZ,OAAO,A8CJR,OAAO,A9CUJ,MAAM,E8C5BX,AvBsEA,euBtEe,C9CsBZ,OAAO,A8CAR,OAAO,A9CMJ,MAAM,E8C5BX,AvBsEA,euBtEe,C9CsBZ,OAAO,A8CIR,IAAI,A9CED,MAAM,E8C5BX,AvBsEA,euBtEe,C9CsBZ,OAAO,A8CQR,QAAQ,A9CFL,MAAM,EiD5BX,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDkBF,OAAO,AAML,MAAM,EiD5BX,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CpEsBf,OAAO,AoEfR,aAAa,ApEqBV,MAAM,EoE5BX,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CjDqBD,OAAO,AoEfR,aAAa,ApEqBV,MAAM,EiD5BX,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CtEsBrB,OAAO,AsENR,aAAa,AtEYV,MAAM,EsE5BX,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CjDqBD,OAAO,AsENR,aAAa,AtEYV,MAAM,EiD5BX,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEqBvB,OAAO,AuEDN,aAAa,AvEOZ,MAAM,EuE5BX,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDqBD,OAAO,AuEDN,aAAa,AvEOZ,MAAM,EiD5BX,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEPrB,OAAO,AuE2BN,aAAa,AvErBZ,MAAM,EuEAX,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDqBD,OAAO,AuE2BN,aAAa,AvErBZ,MAAM,EiD5BX,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3E5Db,OAAO,A2EiEJ,gBAAgB,A3E3DjB,MAAM,E2E2CX,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDqBD,OAAO,A2EiEJ,gBAAgB,A3E3DjB,MAAM,EANR,AuBgDH,OvBhDU,AkDtBV,sBAAsB,AlD4BjB,MAAM,EuD5BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuDwBJ,KAAK,AvDlBN,MAAM,EuD5BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuDoCJ,OAAO,AvD9BR,MAAM,EuD5BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuDwCJ,OAAO,AvDlCR,MAAM,EuD5BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuD4CJ,KAAK,AvDtCN,MAAM,EuD5BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuDgDJ,IAAI,AvD1CL,MAAM,EuD5BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuDoDJ,QAAQ,AvD9CT,MAAM,E6D5BX,AtCsEA,YsCtEY,CAYV,cAAc,C7DUb,OAAO,A6DON,YAAY,A7DDX,MAAM,E6D5BX,AtCsEA,YsCtEY,CAkCV,aAAa,C7DZZ,OAAO,A6DsBN,oBAAoB,A7DhBnB,MAAM,E+D5BX,AxCsEA,oBwCtEoB,CAGlB,EAAE,C/DmBD,OAAO,A+DGN,gBAAgB,A/DGf,MAAM,EgE5BX,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,ChEqBhB,OAAO,AgEpBN,gBAAgB,AAMb,SAAS,AhEoBX,MAAM,EuB0CX,AAAA,YAAY,AvBhDT,OAAO,AAOL,MAAM,E8C7BX,AvBsEA,euBtEe,C9CsBZ,OAAO,A8CZR,KAAK,A9CmBF,MAAM,E8C7BX,AvBsEA,euBtEe,C9CsBZ,OAAO,A8CJR,OAAO,A9CWJ,MAAM,E8C7BX,AvBsEA,euBtEe,C9CsBZ,OAAO,A8CAR,OAAO,A9COJ,MAAM,E8C7BX,AvBsEA,euBtEe,C9CsBZ,OAAO,A8CIR,IAAI,A9CGD,MAAM,E8C7BX,AvBsEA,euBtEe,C9CsBZ,OAAO,A8CQR,QAAQ,A9CDL,MAAM,EiD7BX,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDkBF,OAAO,AAOL,MAAM,EiD7BX,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CpEsBf,OAAO,AoEfR,aAAa,ApEsBV,MAAM,EoE7BX,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CjDqBD,OAAO,AoEfR,aAAa,ApEsBV,MAAM,EiD7BX,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CtEsBrB,OAAO,AsENR,aAAa,AtEaV,MAAM,EsE7BX,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CjDqBD,OAAO,AsENR,aAAa,AtEaV,MAAM,EiD7BX,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEqBvB,OAAO,AuEDN,aAAa,AvEQZ,MAAM,EuE7BX,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDqBD,OAAO,AuEDN,aAAa,AvEQZ,MAAM,EiD7BX,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEPrB,OAAO,AuE2BN,aAAa,AvEpBZ,MAAM,EuEDX,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDqBD,OAAO,AuE2BN,aAAa,AvEpBZ,MAAM,EiD7BX,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3E5Db,OAAO,A2EiEJ,gBAAgB,A3E1DjB,MAAM,E2E0CX,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDqBD,OAAO,A2EiEJ,gBAAgB,A3E1DjB,MAAM,EAPR,AuBgDH,OvBhDU,AkDtBV,sBAAsB,AlD6BjB,MAAM,EuD7BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuDwBJ,KAAK,AvDjBN,MAAM,EuD7BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuDoCJ,OAAO,AvD7BR,MAAM,EuD7BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuDwCJ,OAAO,AvDjCR,MAAM,EuD7BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuD4CJ,KAAK,AvDrCN,MAAM,EuD7BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuDgDJ,IAAI,AvDzCL,MAAM,EuD7BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuDoDJ,QAAQ,AvD7CT,MAAM,E6D7BX,AtCsEA,YsCtEY,CAYV,cAAc,C7DUb,OAAO,A6DON,YAAY,A7DAX,MAAM,E6D7BX,AtCsEA,YsCtEY,CAkCV,aAAa,C7DZZ,OAAO,A6DsBN,oBAAoB,A7DfnB,MAAM,E+D7BX,AxCsEA,oBwCtEoB,CAGlB,EAAE,C/DmBD,OAAO,A+DGN,gBAAgB,A/DIf,MAAM,EgE7BX,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,ChEqBhB,OAAO,AgEpBN,gBAAgB,AAMb,SAAS,AhEqBX,MAAM,EuByCX,AAAA,YAAY,AvBhDT,OAAO,AAQL,MAAM,E8C9BX,AvBsEA,euBtEe,C9CsBZ,OAAO,AAQL,MAAM,A8CpBT,KAAK,EAVP,AvBsEA,euBtEe,C9CsBZ,OAAO,AAQL,MAAM,A8CZT,OAAO,EAlBT,AvBsEA,euBtEe,C9CsBZ,OAAO,AAQL,MAAM,A8CRT,OAAO,EAtBT,AvBsEA,euBtEe,C9CsBZ,OAAO,AAQL,MAAM,A8CJT,IAAI,EA1BN,AvBsEA,euBtEe,C9CsBZ,OAAO,AAQL,MAAM,A8CAT,QAAQ,EG9BV,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDkBF,OAAO,AAQL,MAAM,EiD9BX,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CpEsBf,OAAO,AAQL,MAAM,AoEvBT,aAAa,EAPf,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CjDqBD,OAAO,AAQL,MAAM,AoEvBT,aAAa,EnBPf,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CtEsBrB,OAAO,AAQL,MAAM,AsEdT,aAAa,EAhBf,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CjDqBD,OAAO,AAQL,MAAM,AsEdT,aAAa,ErBhBf,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEqBvB,OAAO,AAQL,MAAM,AuETP,aAAa,EArBjB,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDqBD,OAAO,AAQL,MAAM,AuETP,aAAa,EtBrBjB,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEPrB,OAAO,AAQL,MAAM,AuEmBP,aAAa,EArBjB,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDqBD,OAAO,AAQL,MAAM,AuEmBP,aAAa,EtBjDjB,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3E5Db,OAAO,AAQL,MAAM,A2EyDL,gBAAgB,EAhBtB,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDqBD,OAAO,AAQL,MAAM,A2EyDL,gBAAgB,E3EjEnB,AuBgDH,OvBhDU,AAQL,MAAM,AkD9BX,sBAAsB,EKAtB,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AAQL,MAAM,AuDgBL,KAAK,EA9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AAQL,MAAM,AuD4BL,OAAO,EA1Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AAQL,MAAM,AuDgCL,OAAO,EA9Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AAQL,MAAM,AuDoCL,KAAK,EAlEX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AAQL,MAAM,AuDwCL,IAAI,EAtEV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AAQL,MAAM,AuD4CL,QAAQ,EM1Ed,AtCsEA,YsCtEY,CAYV,cAAc,C7DUb,OAAO,AAQL,MAAM,A6DDP,YAAY,EA7BhB,AtCsEA,YsCtEY,CAkCV,aAAa,C7DZZ,OAAO,AAQL,MAAM,A6DcP,oBAAoB,EE5CxB,AxCsEA,oBwCtEoB,CAGlB,EAAE,C/DmBD,OAAO,AAQL,MAAM,A+DLP,gBAAgB,ECzBpB,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,ChEqBhB,OAAO,AAQL,MAAM,AgE5BP,gBAAgB,AAMb,SAAS;IhEed,AuB+CF,KvB/CO,GuB+CP,YAAY,AvB/CD,gBAAgB,AAKtB,MAAM,E8C5BX,AvBsEA,euBtEe;I9CuBb,KAAK,GAAI,gBAAgB,A8CbzB,KAAK,A9CkBF,MAAM,E8C5BX,AvBsEA,euBtEe;I9CuBb,KAAK,GAAI,gBAAgB,A8CLzB,OAAO,A9CUJ,MAAM,E8C5BX,AvBsEA,euBtEe;I9CuBb,KAAK,GAAI,gBAAgB,A8CDzB,OAAO,A9CMJ,MAAM,E8C5BX,AvBsEA,euBtEe;I9CuBb,KAAK,GAAI,gBAAgB,A8CGzB,IAAI,A9CED,MAAM,E8C5BX,AvBsEA,euBtEe;I9CuBb,KAAK,GAAI,gBAAgB,A8COzB,QAAQ,A9CFL,MAAM,EiD5BX,A1BsEA,Y0BtEY,CACV,EAAE;IjDsBF,KAAK,GiDnBH,CAAC,AjDmBM,gBAAgB,AAKtB,MAAM,EiD5BX,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB;IpEuBhB,KAAK,GAAI,gBAAgB,AoEhBzB,aAAa,ApEqBV,MAAM,EoE5BX,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AoEhBzB,aAAa,ApEqBV,MAAM,EiD5BX,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB;ItEuBtB,KAAK,GAAI,gBAAgB,AsEPzB,aAAa,AtEYV,MAAM,EsE5BX,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AsEPzB,aAAa,AtEYV,MAAM,EiD5BX,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;IvEsBxB,KAAK,GAAI,gBAAgB,AuEFvB,aAAa,AvEOZ,MAAM,EuE5BX,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AuEFvB,aAAa,AvEOZ,MAAM,EiD5BX,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;IvENtB,KAAK,GAAI,gBAAgB,AuE0BvB,aAAa,AvErBZ,MAAM,EuEAX,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AuE0BvB,aAAa,AvErBZ,MAAM,EiD5BX,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;I3E3Dd,KAAK,GAAI,gBAAgB,A2EgErB,gBAAgB,A3E3DjB,MAAM,E2E2CX,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,A2EgErB,gBAAgB,A3E3DjB,MAAM;IALT,AuB+CF,KvB/CO,GAAI,gBAAgB,AkDvB3B,sBAAsB,AlD4BjB,MAAM,EuD5BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AuDuBrB,KAAK,AvDlBN,MAAM,EuD5BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AuDmCrB,OAAO,AvD9BR,MAAM,EuD5BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AuDuCrB,OAAO,AvDlCR,MAAM,EuD5BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AuD2CrB,KAAK,AvDtCN,MAAM,EuD5BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AuD+CrB,IAAI,AvD1CL,MAAM,EuD5BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AuDmDrB,QAAQ,AvD9CT,MAAM,E6D5BX,AtCsEA,YsCtEY,CAYV,cAAc;I7DWd,KAAK,GAAI,gBAAgB,A6DMvB,YAAY,A7DDX,MAAM,E6D5BX,AtCsEA,YsCtEY,CAkCV,aAAa;I7DXb,KAAK,GAAI,gBAAgB,A6DqBvB,oBAAoB,A7DhBnB,MAAM,E+D5BX,AxCsEA,oBwCtEoB,CAGlB,EAAE;I/DoBF,KAAK,GAAI,gBAAgB,A+DEvB,gBAAgB,A/DGf,MAAM,EgE5BX,AzCsEA,+ByCtE+B,CAC7B,iBAAiB;IhEsBjB,KAAK,GAAI,gBAAgB,AgErBvB,gBAAgB,AAMb,SAAS,AhEoBX,MAAM;IALT,AuB+CF,KvB/CO,GuB+CP,YAAY,AvB/CD,gBAAgB,AAMtB,MAAM,E8C7BX,AvBsEA,euBtEe;I9CuBb,KAAK,GAAI,gBAAgB,A8CbzB,KAAK,A9CmBF,MAAM,E8C7BX,AvBsEA,euBtEe;I9CuBb,KAAK,GAAI,gBAAgB,A8CLzB,OAAO,A9CWJ,MAAM,E8C7BX,AvBsEA,euBtEe;I9CuBb,KAAK,GAAI,gBAAgB,A8CDzB,OAAO,A9COJ,MAAM,E8C7BX,AvBsEA,euBtEe;I9CuBb,KAAK,GAAI,gBAAgB,A8CGzB,IAAI,A9CGD,MAAM,E8C7BX,AvBsEA,euBtEe;I9CuBb,KAAK,GAAI,gBAAgB,A8COzB,QAAQ,A9CDL,MAAM,EiD7BX,A1BsEA,Y0BtEY,CACV,EAAE;IjDsBF,KAAK,GiDnBH,CAAC,AjDmBM,gBAAgB,AAMtB,MAAM,EiD7BX,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB;IpEuBhB,KAAK,GAAI,gBAAgB,AoEhBzB,aAAa,ApEsBV,MAAM,EoE7BX,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AoEhBzB,aAAa,ApEsBV,MAAM,EiD7BX,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB;ItEuBtB,KAAK,GAAI,gBAAgB,AsEPzB,aAAa,AtEaV,MAAM,EsE7BX,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AsEPzB,aAAa,AtEaV,MAAM,EiD7BX,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;IvEsBxB,KAAK,GAAI,gBAAgB,AuEFvB,aAAa,AvEQZ,MAAM,EuE7BX,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AuEFvB,aAAa,AvEQZ,MAAM,EiD7BX,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;IvENtB,KAAK,GAAI,gBAAgB,AuE0BvB,aAAa,AvEpBZ,MAAM,EuEDX,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AuE0BvB,aAAa,AvEpBZ,MAAM,EiD7BX,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;I3E3Dd,KAAK,GAAI,gBAAgB,A2EgErB,gBAAgB,A3E1DjB,MAAM,E2E0CX,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,A2EgErB,gBAAgB,A3E1DjB,MAAM;IANT,AuB+CF,KvB/CO,GAAI,gBAAgB,AkDvB3B,sBAAsB,AlD6BjB,MAAM,EuD7BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AuDuBrB,KAAK,AvDjBN,MAAM,EuD7BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AuDmCrB,OAAO,AvD7BR,MAAM,EuD7BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AuDuCrB,OAAO,AvDjCR,MAAM,EuD7BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AuD2CrB,KAAK,AvDrCN,MAAM,EuD7BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AuD+CrB,IAAI,AvDzCL,MAAM,EuD7BX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AuDmDrB,QAAQ,AvD7CT,MAAM,E6D7BX,AtCsEA,YsCtEY,CAYV,cAAc;I7DWd,KAAK,GAAI,gBAAgB,A6DMvB,YAAY,A7DAX,MAAM,E6D7BX,AtCsEA,YsCtEY,CAkCV,aAAa;I7DXb,KAAK,GAAI,gBAAgB,A6DqBvB,oBAAoB,A7DfnB,MAAM,E+D7BX,AxCsEA,oBwCtEoB,CAGlB,EAAE;I/DoBF,KAAK,GAAI,gBAAgB,A+DEvB,gBAAgB,A/DIf,MAAM,EgE7BX,AzCsEA,+ByCtE+B,CAC7B,iBAAiB;IhEsBjB,KAAK,GAAI,gBAAgB,AgErBvB,gBAAgB,AAMb,SAAS,AhEqBX,MAAM;IANT,AuB+CF,KvB/CO,GuB+CP,YAAY,AvB/CD,gBAAgB,AAOtB,MAAM,E8C9BX,AvBsEA,euBtEe;I9CuBb,KAAK,GAAI,gBAAgB,AAOtB,MAAM,A8CpBT,KAAK,EAVP,AvBsEA,euBtEe;I9CuBb,KAAK,GAAI,gBAAgB,AAOtB,MAAM,A8CZT,OAAO,EAlBT,AvBsEA,euBtEe;I9CuBb,KAAK,GAAI,gBAAgB,AAOtB,MAAM,A8CRT,OAAO,EAtBT,AvBsEA,euBtEe;I9CuBb,KAAK,GAAI,gBAAgB,AAOtB,MAAM,A8CJT,IAAI,EA1BN,AvBsEA,euBtEe;I9CuBb,KAAK,GAAI,gBAAgB,AAOtB,MAAM,A8CAT,QAAQ,EG9BV,A1BsEA,Y0BtEY,CACV,EAAE;IjDsBF,KAAK,GiDnBH,CAAC,AjDmBM,gBAAgB,AAOtB,MAAM,EiD9BX,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB;IpEuBhB,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AoEvBT,aAAa,EAPf,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AoEvBT,aAAa,EnBPf,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB;ItEuBtB,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AsEdT,aAAa,EAhBf,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AsEdT,aAAa,ErBhBf,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;IvEsBxB,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AuETP,aAAa,EArBjB,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AuETP,aAAa,EtBrBjB,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;IvENtB,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AuEmBP,aAAa,EArBjB,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AuEmBP,aAAa,EtBjDjB,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;I3E3Dd,KAAK,GAAI,gBAAgB,AAOtB,MAAM,A2EyDL,gBAAgB,EAhBtB,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AAOtB,MAAM,A2EyDL,gBAAgB;I3EhEpB,AuB+CF,KvB/CO,GAAI,gBAAgB,AAOtB,MAAM,AkD9BX,sBAAsB,EKAtB,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AuDgBL,KAAK,EA9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AuD4BL,OAAO,EA1Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AuDgCL,OAAO,EA9Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AuDoCL,KAAK,EAlEX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AuDwCL,IAAI,EAtEV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AuD4CL,QAAQ,EM1Ed,AtCsEA,YsCtEY,CAYV,cAAc;I7DWd,KAAK,GAAI,gBAAgB,AAOtB,MAAM,A6DDP,YAAY,EA7BhB,AtCsEA,YsCtEY,CAkCV,aAAa;I7DXb,KAAK,GAAI,gBAAgB,AAOtB,MAAM,A6DcP,oBAAoB,EE5CxB,AxCsEA,oBwCtEoB,CAGlB,EAAE;I/DoBF,KAAK,GAAI,gBAAgB,AAOtB,MAAM,A+DLP,gBAAgB,ECzBpB,AzCsEA,+ByCtE+B,CAC7B,iBAAiB;IhEsBjB,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AgE5BP,gBAAgB,AAMb,SAAS,ChEsBJ;MACN,KAAK,EhB4HsB,IAAI;MgB3H/B,gBAAgB,EAAE,OAAM;MACpB,YAAY,EAAE,OAAM,GACzB;EuBoCL,AAAA,YAAY,AvBlCT,OAAO,E8CpCV,AvBsEA,euBtEe,CAUb,KAAK,A9C0BJ,OAAO,E8CpCV,AvBsEA,euBtEe,CAkBb,OAAO,A9CkBN,OAAO,E8CpCV,AvBsEA,euBtEe,CAsBb,OAAO,A9CcN,OAAO,E8CpCV,AvBsEA,euBtEe,CA0Bb,IAAI,A9CUH,OAAO,E8CpCV,AvBsEA,euBtEe,CA8Bb,QAAQ,A9CMP,OAAO,EiDpCV,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDgCF,OAAO,EiDpCV,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,ApE6BZ,OAAO,EoEpCV,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,ApE6BZ,OAAO,EiDpCV,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,AtEoBZ,OAAO,EsEpCV,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,AtEoBZ,OAAO,EiDpCV,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,AvEed,OAAO,EuEpCV,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,AvEed,OAAO,EiDpCV,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,AvEbd,OAAO,EuERV,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,AvEbd,OAAO,EiDpCV,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,A3EnDnB,OAAO,E2EmCV,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,A3EnDnB,OAAO,EkDpCV,A3BsEA,sB2BtEsB,AlDoCnB,OAAO,EuDpCV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,AvDVR,OAAO,EuDpCV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,AvDtBV,OAAO,EuDpCV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,AvD1BV,OAAO,EuDpCV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,AvD9BR,OAAO,EuDpCV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,AvDlCP,OAAO,EuDpCV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,AvDtCX,OAAO,E6DpCV,AtCsEA,YsCtEY,CAYV,cAAc,CAiBZ,YAAY,A7DOb,OAAO,E6DpCV,AtCsEA,YsCtEY,CAkCV,aAAa,CAUX,oBAAoB,A7DRrB,OAAO,E+DpCV,AxCsEA,oBwCtEoB,CAGlB,EAAE,CAsBA,gBAAgB,A/DWjB,OAAO,EgEpCV,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,AhE4Bb,OAAO,EuBkCV,AAAA,YAAY,AvBjCT,OAAO,E8CrCV,AvBsEA,euBtEe,C9CqCZ,OAAO,A8C3BR,KAAK,EAVP,AvBsEA,euBtEe,C9CqCZ,OAAO,A8CnBR,OAAO,EAlBT,AvBsEA,euBtEe,C9CqCZ,OAAO,A8CfR,OAAO,EAtBT,AvBsEA,euBtEe,C9CqCZ,OAAO,A8CXR,IAAI,EA1BN,AvBsEA,euBtEe,C9CqCZ,OAAO,A8CPR,QAAQ,EG9BV,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDiCF,OAAO,EiDrCV,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CpEqCf,OAAO,AoE9BR,aAAa,EAPf,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CjDoCD,OAAO,AoE9BR,aAAa,EnBPf,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CtEqCrB,OAAO,AsErBR,aAAa,EAhBf,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CjDoCD,OAAO,AsErBR,aAAa,ErBhBf,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEoCvB,OAAO,AuEhBN,aAAa,EArBjB,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDoCD,OAAO,AuEhBN,aAAa,EtBrBjB,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEQrB,OAAO,AuEYN,aAAa,EArBjB,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDoCD,OAAO,AuEYN,aAAa,EtBjDjB,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3E7Cb,OAAO,A2EkDJ,gBAAgB,EAhBtB,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDoCD,OAAO,A2EkDJ,gBAAgB,E3ElDnB,AuBiCH,OvBjCU,AkDrCV,sBAAsB,EKAtB,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDFhB,OAAO,AuDSJ,KAAK,EA9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDFhB,OAAO,AuDqBJ,OAAO,EA1Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDFhB,OAAO,AuDyBJ,OAAO,EA9Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDFhB,OAAO,AuD6BJ,KAAK,EAlEX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDFhB,OAAO,AuDiCJ,IAAI,EAtEV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDFhB,OAAO,AuDqCJ,QAAQ,EM1Ed,AtCsEA,YsCtEY,CAYV,cAAc,C7DyBb,OAAO,A6DRN,YAAY,EA7BhB,AtCsEA,YsCtEY,CAkCV,aAAa,C7DGZ,OAAO,A6DON,oBAAoB,EE5CxB,AxCsEA,oBwCtEoB,CAGlB,EAAE,C/DkCD,OAAO,A+DZN,gBAAgB,ECzBpB,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,ChEoChB,OAAO,AgEnCN,gBAAgB,AAMb,SAAS;EhE8Bd,AuBgCF,KvBhCO,GuBgCP,YAAY,AvBhCD,gBAAgB,E8CtC3B,AvBsEA,euBtEe;E9CsCb,KAAK,GAAI,gBAAgB,A8C5BzB,KAAK,EAVP,AvBsEA,euBtEe;E9CsCb,KAAK,GAAI,gBAAgB,A8CpBzB,OAAO,EAlBT,AvBsEA,euBtEe;E9CsCb,KAAK,GAAI,gBAAgB,A8ChBzB,OAAO,EAtBT,AvBsEA,euBtEe;E9CsCb,KAAK,GAAI,gBAAgB,A8CZzB,IAAI,EA1BN,AvBsEA,euBtEe;E9CsCb,KAAK,GAAI,gBAAgB,A8CRzB,QAAQ,EG9BV,A1BsEA,Y0BtEY,CACV,EAAE;EjDqCF,KAAK,GiDlCH,CAAC,AjDkCM,gBAAgB,EiDtC3B,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB;EpEsChB,KAAK,GAAI,gBAAgB,AoE/BzB,aAAa,EAPf,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE;EjDqCF,KAAK,GAAI,gBAAgB,AoE/BzB,aAAa,EnBPf,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB;EtEsCtB,KAAK,GAAI,gBAAgB,AsEtBzB,aAAa,EAhBf,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE;EjDqCF,KAAK,GAAI,gBAAgB,AsEtBzB,aAAa,ErBhBf,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;EvEqCxB,KAAK,GAAI,gBAAgB,AuEjBvB,aAAa,EArBjB,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;EjDqCF,KAAK,GAAI,gBAAgB,AuEjBvB,aAAa,EtBrBjB,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;EvEStB,KAAK,GAAI,gBAAgB,AuEWvB,aAAa,EArBjB,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;EjDqCF,KAAK,GAAI,gBAAgB,AuEWvB,aAAa,EtBjDjB,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;E3E5Cd,KAAK,GAAI,gBAAgB,A2EiDrB,gBAAgB,EAhBtB,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;EjDqCF,KAAK,GAAI,gBAAgB,A2EiDrB,gBAAgB;E3EjDpB,AuBgCF,KvBhCO,GAAI,gBAAgB,AkDtC3B,sBAAsB,EKAtB,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDDjB,KAAK,GAAI,gBAAgB,AuDQrB,KAAK,EA9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDDjB,KAAK,GAAI,gBAAgB,AuDoBrB,OAAO,EA1Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDDjB,KAAK,GAAI,gBAAgB,AuDwBrB,OAAO,EA9Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDDjB,KAAK,GAAI,gBAAgB,AuD4BrB,KAAK,EAlEX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDDjB,KAAK,GAAI,gBAAgB,AuDgCrB,IAAI,EAtEV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDDjB,KAAK,GAAI,gBAAgB,AuDoCrB,QAAQ,EM1Ed,AtCsEA,YsCtEY,CAYV,cAAc;E7D0Bd,KAAK,GAAI,gBAAgB,A6DTvB,YAAY,EA7BhB,AtCsEA,YsCtEY,CAkCV,aAAa;E7DIb,KAAK,GAAI,gBAAgB,A6DMvB,oBAAoB,EE5CxB,AxCsEA,oBwCtEoB,CAGlB,EAAE;E/DmCF,KAAK,GAAI,gBAAgB,A+DbvB,gBAAgB,ECzBpB,AzCsEA,+ByCtE+B,CAC7B,iBAAiB;EhEqCjB,KAAK,GAAI,gBAAgB,AgEpCvB,gBAAgB,AAMb,SAAS,ChE8BY;IACxB,gBAAgB,EAAE,IAAK,GACxB;EuB8BH,AAAA,YAAY,AvB7BT,SAAS,E8CzCZ,AvBsEA,euBtEe,C9CyCZ,SAAS,A8C/BV,KAAK,EAVP,AvBsEA,euBtEe,C9CyCZ,SAAS,A8CvBV,OAAO,EAlBT,AvBsEA,euBtEe,C9CyCZ,SAAS,A8CnBV,OAAO,EAtBT,AvBsEA,euBtEe,C9CyCZ,SAAS,A8CfV,IAAI,EA1BN,AvBsEA,euBtEe,C9CyCZ,SAAS,A8CXV,QAAQ,EG9BV,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDqCF,SAAS,EiDzCZ,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CpEyCf,SAAS,AoElCV,aAAa,EAPf,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CjDwCD,SAAS,AoElCV,aAAa,EnBPf,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CtEyCrB,SAAS,AsEzBV,aAAa,EAhBf,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AsEzBV,aAAa,ErBhBf,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEwCvB,SAAS,AuEpBR,aAAa,EArBjB,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDwCD,SAAS,AuEpBR,aAAa,EtBrBjB,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEYrB,SAAS,AuEQR,aAAa,EArBjB,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AuEQR,aAAa,EtBjDjB,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3EzCb,SAAS,A2E8CN,gBAAgB,EAhBtB,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDwCD,SAAS,A2E8CN,gBAAgB,E3E9CnB,AuB6BH,SvB7BY,AkDzCZ,sBAAsB,EKAtB,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDKN,KAAK,EA9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDiBN,OAAO,EA1Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDqBN,OAAO,EA9Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDyBN,KAAK,EAlEX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuD6BN,IAAI,EAtEV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDiCN,QAAQ,EM1Ed,AtCsEA,YsCtEY,CAYV,cAAc,C7D6Bb,SAAS,A6DZR,YAAY,EA7BhB,AtCsEA,YsCtEY,CAkCV,aAAa,C7DOZ,SAAS,A6DGR,oBAAoB,EE5CxB,AxCsEA,oBwCtEoB,CAGlB,EAAE,C/DsCD,SAAS,A+DhBR,gBAAgB,ECzBpB,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,ChEwChB,SAAS,AgEvCR,gBAAgB,AAMb,SAAS,EzC8DhB,AAAA,YAAY,AvB7BT,SAAS,AAIP,MAAM,E8C7CX,AvBsEA,euBtEe,C9CyCZ,SAAS,A8C/BV,KAAK,A9CmCF,MAAM,E8C7CX,AvBsEA,euBtEe,C9CyCZ,SAAS,A8CvBV,OAAO,A9C2BJ,MAAM,E8C7CX,AvBsEA,euBtEe,C9CyCZ,SAAS,A8CnBV,OAAO,A9CuBJ,MAAM,E8C7CX,AvBsEA,euBtEe,C9CyCZ,SAAS,A8CfV,IAAI,A9CmBD,MAAM,E8C7CX,AvBsEA,euBtEe,C9CyCZ,SAAS,A8CXV,QAAQ,A9CeL,MAAM,EiD7CX,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDqCF,SAAS,AAIP,MAAM,EiD7CX,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CpEyCf,SAAS,AoElCV,aAAa,ApEsCV,MAAM,EoE7CX,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CjDwCD,SAAS,AoElCV,aAAa,ApEsCV,MAAM,EiD7CX,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CtEyCrB,SAAS,AsEzBV,aAAa,AtE6BV,MAAM,EsE7CX,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AsEzBV,aAAa,AtE6BV,MAAM,EiD7CX,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEwCvB,SAAS,AuEpBR,aAAa,AvEwBZ,MAAM,EuE7CX,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDwCD,SAAS,AuEpBR,aAAa,AvEwBZ,MAAM,EiD7CX,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEYrB,SAAS,AuEQR,aAAa,AvEJZ,MAAM,EuEjBX,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AuEQR,aAAa,AvEJZ,MAAM,EiD7CX,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3EzCb,SAAS,A2E8CN,gBAAgB,A3E1CjB,MAAM,E2E0BX,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDwCD,SAAS,A2E8CN,gBAAgB,A3E1CjB,MAAM,EAJR,AuB6BH,SvB7BY,AkDzCZ,sBAAsB,AlD6CjB,MAAM,EuD7CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDKN,KAAK,AvDDN,MAAM,EuD7CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDiBN,OAAO,AvDbR,MAAM,EuD7CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDqBN,OAAO,AvDjBR,MAAM,EuD7CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDyBN,KAAK,AvDrBN,MAAM,EuD7CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuD6BN,IAAI,AvDzBL,MAAM,EuD7CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDiCN,QAAQ,AvD7BT,MAAM,E6D7CX,AtCsEA,YsCtEY,CAYV,cAAc,C7D6Bb,SAAS,A6DZR,YAAY,A7DgBX,MAAM,E6D7CX,AtCsEA,YsCtEY,CAkCV,aAAa,C7DOZ,SAAS,A6DGR,oBAAoB,A7DCnB,MAAM,E+D7CX,AxCsEA,oBwCtEoB,CAGlB,EAAE,C/DsCD,SAAS,A+DhBR,gBAAgB,A/DoBf,MAAM,EgE7CX,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,ChEwChB,SAAS,AgEvCR,gBAAgB,AAMb,SAAS,AhEqCX,MAAM,EuByBX,AAAA,YAAY,AvB7BT,SAAS,AAKP,MAAM,E8C9CX,AvBsEA,euBtEe,C9CyCZ,SAAS,A8C/BV,KAAK,A9CoCF,MAAM,E8C9CX,AvBsEA,euBtEe,C9CyCZ,SAAS,A8CvBV,OAAO,A9C4BJ,MAAM,E8C9CX,AvBsEA,euBtEe,C9CyCZ,SAAS,A8CnBV,OAAO,A9CwBJ,MAAM,E8C9CX,AvBsEA,euBtEe,C9CyCZ,SAAS,A8CfV,IAAI,A9CoBD,MAAM,E8C9CX,AvBsEA,euBtEe,C9CyCZ,SAAS,A8CXV,QAAQ,A9CgBL,MAAM,EiD9CX,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDqCF,SAAS,AAKP,MAAM,EiD9CX,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CpEyCf,SAAS,AoElCV,aAAa,ApEuCV,MAAM,EoE9CX,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CjDwCD,SAAS,AoElCV,aAAa,ApEuCV,MAAM,EiD9CX,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CtEyCrB,SAAS,AsEzBV,aAAa,AtE8BV,MAAM,EsE9CX,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AsEzBV,aAAa,AtE8BV,MAAM,EiD9CX,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEwCvB,SAAS,AuEpBR,aAAa,AvEyBZ,MAAM,EuE9CX,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDwCD,SAAS,AuEpBR,aAAa,AvEyBZ,MAAM,EiD9CX,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEYrB,SAAS,AuEQR,aAAa,AvEHZ,MAAM,EuElBX,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AuEQR,aAAa,AvEHZ,MAAM,EiD9CX,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3EzCb,SAAS,A2E8CN,gBAAgB,A3EzCjB,MAAM,E2EyBX,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDwCD,SAAS,A2E8CN,gBAAgB,A3EzCjB,MAAM,EALR,AuB6BH,SvB7BY,AkDzCZ,sBAAsB,AlD8CjB,MAAM,EuD9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDKN,KAAK,AvDAN,MAAM,EuD9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDiBN,OAAO,AvDZR,MAAM,EuD9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDqBN,OAAO,AvDhBR,MAAM,EuD9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDyBN,KAAK,AvDpBN,MAAM,EuD9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuD6BN,IAAI,AvDxBL,MAAM,EuD9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDiCN,QAAQ,AvD5BT,MAAM,E6D9CX,AtCsEA,YsCtEY,CAYV,cAAc,C7D6Bb,SAAS,A6DZR,YAAY,A7DiBX,MAAM,E6D9CX,AtCsEA,YsCtEY,CAkCV,aAAa,C7DOZ,SAAS,A6DGR,oBAAoB,A7DEnB,MAAM,E+D9CX,AxCsEA,oBwCtEoB,CAGlB,EAAE,C/DsCD,SAAS,A+DhBR,gBAAgB,A/DqBf,MAAM,EgE9CX,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,ChEwChB,SAAS,AgEvCR,gBAAgB,AAMb,SAAS,AhEsCX,MAAM,EuBwBX,AAAA,YAAY,AvB7BT,SAAS,AAMP,MAAM,E8C/CX,AvBsEA,euBtEe,C9CyCZ,SAAS,AAMP,MAAM,A8CrCT,KAAK,EAVP,AvBsEA,euBtEe,C9CyCZ,SAAS,AAMP,MAAM,A8C7BT,OAAO,EAlBT,AvBsEA,euBtEe,C9CyCZ,SAAS,AAMP,MAAM,A8CzBT,OAAO,EAtBT,AvBsEA,euBtEe,C9CyCZ,SAAS,AAMP,MAAM,A8CrBT,IAAI,EA1BN,AvBsEA,euBtEe,C9CyCZ,SAAS,AAMP,MAAM,A8CjBT,QAAQ,EG9BV,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDqCF,SAAS,AAMP,MAAM,EiD/CX,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CpEyCf,SAAS,AAMP,MAAM,AoExCT,aAAa,EAPf,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CjDwCD,SAAS,AAMP,MAAM,AoExCT,aAAa,EnBPf,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CtEyCrB,SAAS,AAMP,MAAM,AsE/BT,aAAa,EAhBf,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AAMP,MAAM,AsE/BT,aAAa,ErBhBf,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEwCvB,SAAS,AAMP,MAAM,AuE1BP,aAAa,EArBjB,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDwCD,SAAS,AAMP,MAAM,AuE1BP,aAAa,EtBrBjB,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEYrB,SAAS,AAMP,MAAM,AuEEP,aAAa,EArBjB,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AAMP,MAAM,AuEEP,aAAa,EtBjDjB,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3EzCb,SAAS,AAMP,MAAM,A2EwCL,gBAAgB,EAhBtB,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDwCD,SAAS,AAMP,MAAM,A2EwCL,gBAAgB,E3E9CnB,AuB6BH,SvB7BY,AAMP,MAAM,AkD/CX,sBAAsB,EKAtB,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AAMP,MAAM,AuDDL,KAAK,EA9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AAMP,MAAM,AuDWL,OAAO,EA1Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AAMP,MAAM,AuDeL,OAAO,EA9Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AAMP,MAAM,AuDmBL,KAAK,EAlEX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AAMP,MAAM,AuDuBL,IAAI,EAtEV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AAMP,MAAM,AuD2BL,QAAQ,EM1Ed,AtCsEA,YsCtEY,CAYV,cAAc,C7D6Bb,SAAS,AAMP,MAAM,A6DlBP,YAAY,EA7BhB,AtCsEA,YsCtEY,CAkCV,aAAa,C7DOZ,SAAS,AAMP,MAAM,A6DHP,oBAAoB,EE5CxB,AxCsEA,oBwCtEoB,CAGlB,EAAE,C/DsCD,SAAS,AAMP,MAAM,A+DtBP,gBAAgB,ECzBpB,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,ChEwChB,SAAS,AAMP,MAAM,AgE7CP,gBAAgB,AAMb,SAAS,EzC8DhB,AAAA,YAAY,AvB7BT,SAAS,AAOP,OAAO,E8ChDZ,AvBsEA,euBtEe,C9CyCZ,SAAS,A8C/BV,KAAK,A9CsCF,OAAO,E8ChDZ,AvBsEA,euBtEe,C9CyCZ,SAAS,A8CvBV,OAAO,A9C8BJ,OAAO,E8ChDZ,AvBsEA,euBtEe,C9CyCZ,SAAS,A8CnBV,OAAO,A9C0BJ,OAAO,E8ChDZ,AvBsEA,euBtEe,C9CyCZ,SAAS,A8CfV,IAAI,A9CsBD,OAAO,E8ChDZ,AvBsEA,euBtEe,C9CyCZ,SAAS,A8CXV,QAAQ,A9CkBL,OAAO,EiDhDZ,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDqCF,SAAS,AAOP,OAAO,EiDhDZ,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CpEyCf,SAAS,AoElCV,aAAa,ApEyCV,OAAO,EoEhDZ,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CjDwCD,SAAS,AoElCV,aAAa,ApEyCV,OAAO,EiDhDZ,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CtEyCrB,SAAS,AsEzBV,aAAa,AtEgCV,OAAO,EsEhDZ,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AsEzBV,aAAa,AtEgCV,OAAO,EiDhDZ,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEwCvB,SAAS,AuEpBR,aAAa,AvE2BZ,OAAO,EuEhDZ,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDwCD,SAAS,AuEpBR,aAAa,AvE2BZ,OAAO,EiDhDZ,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEYrB,SAAS,AuEQR,aAAa,AvEDZ,OAAO,EuEpBZ,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AuEQR,aAAa,AvEDZ,OAAO,EiDhDZ,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3EzCb,SAAS,A2E8CN,gBAAgB,A3EvCjB,OAAO,E2EuBZ,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDwCD,SAAS,A2E8CN,gBAAgB,A3EvCjB,OAAO,EAPT,AuB6BH,SvB7BY,AkDzCZ,sBAAsB,AlDgDjB,OAAO,EuDhDZ,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDKN,KAAK,AvDEN,OAAO,EuDhDZ,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDiBN,OAAO,AvDVR,OAAO,EuDhDZ,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDqBN,OAAO,AvDdR,OAAO,EuDhDZ,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDyBN,KAAK,AvDlBN,OAAO,EuDhDZ,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuD6BN,IAAI,AvDtBL,OAAO,EuDhDZ,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDiCN,QAAQ,AvD1BT,OAAO,E6DhDZ,AtCsEA,YsCtEY,CAYV,cAAc,C7D6Bb,SAAS,A6DZR,YAAY,A7DmBX,OAAO,E6DhDZ,AtCsEA,YsCtEY,CAkCV,aAAa,C7DOZ,SAAS,A6DGR,oBAAoB,A7DInB,OAAO,E+DhDZ,AxCsEA,oBwCtEoB,CAGlB,EAAE,C/DsCD,SAAS,A+DhBR,gBAAgB,A/DuBf,OAAO,EgEhDZ,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,ChEwChB,SAAS,AgEvCR,gBAAgB,AAMb,SAAS,AhEwCX,OAAO,EuBsBZ,AAAA,YAAY,AvB7BT,SAAS,AAQP,OAAO,E8CjDZ,AvBsEA,euBtEe,C9CyCZ,SAAS,AAQP,OAAO,A8CvCV,KAAK,EAVP,AvBsEA,euBtEe,C9CyCZ,SAAS,AAQP,OAAO,A8C/BV,OAAO,EAlBT,AvBsEA,euBtEe,C9CyCZ,SAAS,AAQP,OAAO,A8C3BV,OAAO,EAtBT,AvBsEA,euBtEe,C9CyCZ,SAAS,AAQP,OAAO,A8CvBV,IAAI,EA1BN,AvBsEA,euBtEe,C9CyCZ,SAAS,AAQP,OAAO,A8CnBV,QAAQ,EG9BV,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,AjDqCF,SAAS,AAQP,OAAO,EiDjDZ,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,CpEyCf,SAAS,AAQP,OAAO,AoE1CV,aAAa,EAPf,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,CjDwCD,SAAS,AAQP,OAAO,AoE1CV,aAAa,EnBPf,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,CtEyCrB,SAAS,AAQP,OAAO,AsEjCV,aAAa,EAhBf,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AAQP,OAAO,AsEjCV,aAAa,ErBhBf,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEwCvB,SAAS,AAQP,OAAO,AuE5BR,aAAa,EArBjB,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDwCD,SAAS,AAQP,OAAO,AuE5BR,aAAa,EtBrBjB,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEYrB,SAAS,AAQP,OAAO,AuEAR,aAAa,EArBjB,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AAQP,OAAO,AuEAR,aAAa,EtBjDjB,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3EzCb,SAAS,AAQP,OAAO,A2EsCN,gBAAgB,EAhBtB,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDwCD,SAAS,AAQP,OAAO,A2EsCN,gBAAgB,E3E9CnB,AuB6BH,SvB7BY,AAQP,OAAO,AkDjDZ,sBAAsB,EKAtB,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AAQP,OAAO,AuDHN,KAAK,EA9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AAQP,OAAO,AuDSN,OAAO,EA1Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AAQP,OAAO,AuDaN,OAAO,EA9Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AAQP,OAAO,AuDiBN,KAAK,EAlEX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AAQP,OAAO,AuDqBN,IAAI,EAtEV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AAQP,OAAO,AuDyBN,QAAQ,EM1Ed,AtCsEA,YsCtEY,CAYV,cAAc,C7D6Bb,SAAS,AAQP,OAAO,A6DpBR,YAAY,EA7BhB,AtCsEA,YsCtEY,CAkCV,aAAa,C7DOZ,SAAS,AAQP,OAAO,A6DLR,oBAAoB,EE5CxB,AxCsEA,oBwCtEoB,CAGlB,EAAE,C/DsCD,SAAS,AAQP,OAAO,A+DxBR,gBAAgB,ECzBpB,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,ChEwChB,SAAS,AAQP,OAAO,AgE/CR,gBAAgB,AAMb,SAAS,EzC8DhB,AAAA,YAAY,CvB5BT,AAAA,QAAC,AAAA,G8C1CJ,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8ChCF,KAAK,EAVP,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8CxBF,OAAO,EAlBT,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8CpBF,OAAO,EAtBT,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8ChBF,IAAI,EA1BN,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8CZF,QAAQ,EG9BV,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,CjDsCF,AAAA,QAAC,AAAA,GiD1CJ,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,EpE0Cf,AAAA,QAAC,AAAA,CoEnCF,aAAa,EAPf,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CoEnCF,aAAa,EnBPf,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,EtE0CrB,AAAA,QAAC,AAAA,CsE1BF,aAAa,EAhBf,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CsE1BF,aAAa,ErBhBf,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,EvEyCvB,AAAA,QAAC,AAAA,CuErBA,aAAa,EArBjB,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CuErBA,aAAa,EtBrBjB,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,EvEarB,AAAA,QAAC,AAAA,CuEOA,aAAa,EArBjB,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CuEOA,aAAa,EtBjDjB,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,E3ExCb,AAAA,QAAC,AAAA,C2E6CE,gBAAgB,EAhBtB,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,C2E6CE,gBAAgB,G3E7CnB,AAAA,AuB4BH,QvB5BI,AAAA,CkD1CJ,sBAAsB,EKAtB,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDIE,KAAK,EA9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDgBE,OAAO,EA1Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDoBE,OAAO,EA9Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDwBE,KAAK,EAlEX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuD4BE,IAAI,EAtEV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDgCE,QAAQ,EM1Ed,AtCsEA,YsCtEY,CAYV,cAAc,E7D8Bb,AAAA,QAAC,AAAA,C6DbA,YAAY,EA7BhB,AtCsEA,YsCtEY,CAkCV,aAAa,E7DQZ,AAAA,QAAC,AAAA,C6DEA,oBAAoB,EE5CxB,AxCsEA,oBwCtEoB,CAGlB,EAAE,E/DuCD,AAAA,QAAC,AAAA,C+DjBA,gBAAgB,ECzBpB,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,EhEyChB,AAAA,QAAC,AAAA,CgExCA,gBAAgB,AAMb,SAAS,EzC8DhB,AAAA,YAAY,CvB5BT,AAAA,QAAC,AAAA,CAGC,MAAM,E8C7CX,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8ChCF,KAAK,A9CmCF,MAAM,E8C7CX,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8CxBF,OAAO,A9C2BJ,MAAM,E8C7CX,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8CpBF,OAAO,A9CuBJ,MAAM,E8C7CX,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8ChBF,IAAI,A9CmBD,MAAM,E8C7CX,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8CZF,QAAQ,A9CeL,MAAM,EiD7CX,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,CjDsCF,AAAA,QAAC,AAAA,CAGC,MAAM,EiD7CX,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,EpE0Cf,AAAA,QAAC,AAAA,CoEnCF,aAAa,ApEsCV,MAAM,EoE7CX,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CoEnCF,aAAa,ApEsCV,MAAM,EiD7CX,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,EtE0CrB,AAAA,QAAC,AAAA,CsE1BF,aAAa,AtE6BV,MAAM,EsE7CX,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CsE1BF,aAAa,AtE6BV,MAAM,EiD7CX,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,EvEyCvB,AAAA,QAAC,AAAA,CuErBA,aAAa,AvEwBZ,MAAM,EuE7CX,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CuErBA,aAAa,AvEwBZ,MAAM,EiD7CX,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,EvEarB,AAAA,QAAC,AAAA,CuEOA,aAAa,AvEJZ,MAAM,EuEjBX,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CuEOA,aAAa,AvEJZ,MAAM,EiD7CX,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,E3ExCb,AAAA,QAAC,AAAA,C2E6CE,gBAAgB,A3E1CjB,MAAM,E2E0BX,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,C2E6CE,gBAAgB,A3E1CjB,MAAM,GAHR,AAAA,AuB4BH,QvB5BI,AAAA,CkD1CJ,sBAAsB,AlD6CjB,MAAM,EuD7CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDIE,KAAK,AvDDN,MAAM,EuD7CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDgBE,OAAO,AvDbR,MAAM,EuD7CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDoBE,OAAO,AvDjBR,MAAM,EuD7CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDwBE,KAAK,AvDrBN,MAAM,EuD7CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuD4BE,IAAI,AvDzBL,MAAM,EuD7CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDgCE,QAAQ,AvD7BT,MAAM,E6D7CX,AtCsEA,YsCtEY,CAYV,cAAc,E7D8Bb,AAAA,QAAC,AAAA,C6DbA,YAAY,A7DgBX,MAAM,E6D7CX,AtCsEA,YsCtEY,CAkCV,aAAa,E7DQZ,AAAA,QAAC,AAAA,C6DEA,oBAAoB,A7DCnB,MAAM,E+D7CX,AxCsEA,oBwCtEoB,CAGlB,EAAE,E/DuCD,AAAA,QAAC,AAAA,C+DjBA,gBAAgB,A/DoBf,MAAM,EgE7CX,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,EhEyChB,AAAA,QAAC,AAAA,CgExCA,gBAAgB,AAMb,SAAS,AhEqCX,MAAM,EuByBX,AAAA,YAAY,CvB5BT,AAAA,QAAC,AAAA,CAIC,MAAM,E8C9CX,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8ChCF,KAAK,A9CoCF,MAAM,E8C9CX,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8CxBF,OAAO,A9C4BJ,MAAM,E8C9CX,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8CpBF,OAAO,A9CwBJ,MAAM,E8C9CX,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8ChBF,IAAI,A9CoBD,MAAM,E8C9CX,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8CZF,QAAQ,A9CgBL,MAAM,EiD9CX,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,CjDsCF,AAAA,QAAC,AAAA,CAIC,MAAM,EiD9CX,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,EpE0Cf,AAAA,QAAC,AAAA,CoEnCF,aAAa,ApEuCV,MAAM,EoE9CX,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CoEnCF,aAAa,ApEuCV,MAAM,EiD9CX,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,EtE0CrB,AAAA,QAAC,AAAA,CsE1BF,aAAa,AtE8BV,MAAM,EsE9CX,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CsE1BF,aAAa,AtE8BV,MAAM,EiD9CX,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,EvEyCvB,AAAA,QAAC,AAAA,CuErBA,aAAa,AvEyBZ,MAAM,EuE9CX,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CuErBA,aAAa,AvEyBZ,MAAM,EiD9CX,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,EvEarB,AAAA,QAAC,AAAA,CuEOA,aAAa,AvEHZ,MAAM,EuElBX,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CuEOA,aAAa,AvEHZ,MAAM,EiD9CX,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,E3ExCb,AAAA,QAAC,AAAA,C2E6CE,gBAAgB,A3EzCjB,MAAM,E2EyBX,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,C2E6CE,gBAAgB,A3EzCjB,MAAM,GAJR,AAAA,AuB4BH,QvB5BI,AAAA,CkD1CJ,sBAAsB,AlD8CjB,MAAM,EuD9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDIE,KAAK,AvDAN,MAAM,EuD9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDgBE,OAAO,AvDZR,MAAM,EuD9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDoBE,OAAO,AvDhBR,MAAM,EuD9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDwBE,KAAK,AvDpBN,MAAM,EuD9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuD4BE,IAAI,AvDxBL,MAAM,EuD9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDgCE,QAAQ,AvD5BT,MAAM,E6D9CX,AtCsEA,YsCtEY,CAYV,cAAc,E7D8Bb,AAAA,QAAC,AAAA,C6DbA,YAAY,A7DiBX,MAAM,E6D9CX,AtCsEA,YsCtEY,CAkCV,aAAa,E7DQZ,AAAA,QAAC,AAAA,C6DEA,oBAAoB,A7DEnB,MAAM,E+D9CX,AxCsEA,oBwCtEoB,CAGlB,EAAE,E/DuCD,AAAA,QAAC,AAAA,C+DjBA,gBAAgB,A/DqBf,MAAM,EgE9CX,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,EhEyChB,AAAA,QAAC,AAAA,CgExCA,gBAAgB,AAMb,SAAS,AhEsCX,MAAM,EuBwBX,AAAA,YAAY,CvB5BT,AAAA,QAAC,AAAA,CAKC,MAAM,E8C/CX,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,CAKC,MAAM,A8CrCT,KAAK,EAVP,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,CAKC,MAAM,A8C7BT,OAAO,EAlBT,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,CAKC,MAAM,A8CzBT,OAAO,EAtBT,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,CAKC,MAAM,A8CrBT,IAAI,EA1BN,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,CAKC,MAAM,A8CjBT,QAAQ,EG9BV,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,CjDsCF,AAAA,QAAC,AAAA,CAKC,MAAM,EiD/CX,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,EpE0Cf,AAAA,QAAC,AAAA,CAKC,MAAM,AoExCT,aAAa,EAPf,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAKC,MAAM,AoExCT,aAAa,EnBPf,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,EtE0CrB,AAAA,QAAC,AAAA,CAKC,MAAM,AsE/BT,aAAa,EAhBf,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAKC,MAAM,AsE/BT,aAAa,ErBhBf,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,EvEyCvB,AAAA,QAAC,AAAA,CAKC,MAAM,AuE1BP,aAAa,EArBjB,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAKC,MAAM,AuE1BP,aAAa,EtBrBjB,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,EvEarB,AAAA,QAAC,AAAA,CAKC,MAAM,AuEEP,aAAa,EArBjB,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAKC,MAAM,AuEEP,aAAa,EtBjDjB,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,E3ExCb,AAAA,QAAC,AAAA,CAKC,MAAM,A2EwCL,gBAAgB,EAhBtB,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAKC,MAAM,A2EwCL,gBAAgB,G3E7CnB,AAAA,AuB4BH,QvB5BI,AAAA,CAKC,MAAM,AkD/CX,sBAAsB,EKAtB,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CAKC,MAAM,AuDDL,KAAK,EA9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CAKC,MAAM,AuDWL,OAAO,EA1Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CAKC,MAAM,AuDeL,OAAO,EA9Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CAKC,MAAM,AuDmBL,KAAK,EAlEX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CAKC,MAAM,AuDuBL,IAAI,EAtEV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CAKC,MAAM,AuD2BL,QAAQ,EM1Ed,AtCsEA,YsCtEY,CAYV,cAAc,E7D8Bb,AAAA,QAAC,AAAA,CAKC,MAAM,A6DlBP,YAAY,EA7BhB,AtCsEA,YsCtEY,CAkCV,aAAa,E7DQZ,AAAA,QAAC,AAAA,CAKC,MAAM,A6DHP,oBAAoB,EE5CxB,AxCsEA,oBwCtEoB,CAGlB,EAAE,E/DuCD,AAAA,QAAC,AAAA,CAKC,MAAM,A+DtBP,gBAAgB,ECzBpB,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,EhEyChB,AAAA,QAAC,AAAA,CAKC,MAAM,AgE7CP,gBAAgB,AAMb,SAAS,EzC8DhB,AAAA,YAAY,CvB5BT,AAAA,QAAC,AAAA,CAMC,OAAO,E8ChDZ,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8ChCF,KAAK,A9CsCF,OAAO,E8ChDZ,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8CxBF,OAAO,A9C8BJ,OAAO,E8ChDZ,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8CpBF,OAAO,A9C0BJ,OAAO,E8ChDZ,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8ChBF,IAAI,A9CsBD,OAAO,E8ChDZ,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,C8CZF,QAAQ,A9CkBL,OAAO,EiDhDZ,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,CjDsCF,AAAA,QAAC,AAAA,CAMC,OAAO,EiDhDZ,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,EpE0Cf,AAAA,QAAC,AAAA,CoEnCF,aAAa,ApEyCV,OAAO,EoEhDZ,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CoEnCF,aAAa,ApEyCV,OAAO,EiDhDZ,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,EtE0CrB,AAAA,QAAC,AAAA,CsE1BF,aAAa,AtEgCV,OAAO,EsEhDZ,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CsE1BF,aAAa,AtEgCV,OAAO,EiDhDZ,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,EvEyCvB,AAAA,QAAC,AAAA,CuErBA,aAAa,AvE2BZ,OAAO,EuEhDZ,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CuErBA,aAAa,AvE2BZ,OAAO,EiDhDZ,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,EvEarB,AAAA,QAAC,AAAA,CuEOA,aAAa,AvEDZ,OAAO,EuEpBZ,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CuEOA,aAAa,AvEDZ,OAAO,EiDhDZ,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,E3ExCb,AAAA,QAAC,AAAA,C2E6CE,gBAAgB,A3EvCjB,OAAO,E2EuBZ,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,C2E6CE,gBAAgB,A3EvCjB,OAAO,GANT,AAAA,AuB4BH,QvB5BI,AAAA,CkD1CJ,sBAAsB,AlDgDjB,OAAO,EuDhDZ,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDIE,KAAK,AvDEN,OAAO,EuDhDZ,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDgBE,OAAO,AvDVR,OAAO,EuDhDZ,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDoBE,OAAO,AvDdR,OAAO,EuDhDZ,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDwBE,KAAK,AvDlBN,OAAO,EuDhDZ,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuD4BE,IAAI,AvDtBL,OAAO,EuDhDZ,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDgCE,QAAQ,AvD1BT,OAAO,E6DhDZ,AtCsEA,YsCtEY,CAYV,cAAc,E7D8Bb,AAAA,QAAC,AAAA,C6DbA,YAAY,A7DmBX,OAAO,E6DhDZ,AtCsEA,YsCtEY,CAkCV,aAAa,E7DQZ,AAAA,QAAC,AAAA,C6DEA,oBAAoB,A7DInB,OAAO,E+DhDZ,AxCsEA,oBwCtEoB,CAGlB,EAAE,E/DuCD,AAAA,QAAC,AAAA,C+DjBA,gBAAgB,A/DuBf,OAAO,EgEhDZ,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,EhEyChB,AAAA,QAAC,AAAA,CgExCA,gBAAgB,AAMb,SAAS,AhEwCX,OAAO,EuBsBZ,AAAA,YAAY,CvB5BT,AAAA,QAAC,AAAA,CAOC,OAAO,E8CjDZ,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,CAOC,OAAO,A8CvCV,KAAK,EAVP,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,CAOC,OAAO,A8C/BV,OAAO,EAlBT,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,CAOC,OAAO,A8C3BV,OAAO,EAtBT,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,CAOC,OAAO,A8CvBV,IAAI,EA1BN,AvBsEA,euBtEe,E9C0CZ,AAAA,QAAC,AAAA,CAOC,OAAO,A8CnBV,QAAQ,EG9BV,A1BsEA,Y0BtEY,CACV,EAAE,CAGA,CAAC,CjDsCF,AAAA,QAAC,AAAA,CAOC,OAAO,EiDjDZ,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB,EpE0Cf,AAAA,QAAC,AAAA,CAOC,OAAO,AoE1CV,aAAa,EAPf,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAOC,OAAO,AoE1CV,aAAa,EnBPf,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB,EtE0CrB,AAAA,QAAC,AAAA,CAOC,OAAO,AsEjCV,aAAa,EAhBf,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAOC,OAAO,AsEjCV,aAAa,ErBhBf,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,EvEyCvB,AAAA,QAAC,AAAA,CAOC,OAAO,AuE5BR,aAAa,EArBjB,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAOC,OAAO,AuE5BR,aAAa,EtBrBjB,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,EvEarB,AAAA,QAAC,AAAA,CAOC,OAAO,AuEAR,aAAa,EArBjB,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAOC,OAAO,AuEAR,aAAa,EtBjDjB,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,E3ExCb,AAAA,QAAC,AAAA,CAOC,OAAO,A2EsCN,gBAAgB,EAhBtB,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAOC,OAAO,A2EsCN,gBAAgB,G3E7CnB,AAAA,AuB4BH,QvB5BI,AAAA,CAOC,OAAO,AkDjDZ,sBAAsB,EKAtB,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CAOC,OAAO,AuDHN,KAAK,EA9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CAOC,OAAO,AuDSN,OAAO,EA1Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CAOC,OAAO,AuDaN,OAAO,EA9Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CAOC,OAAO,AuDiBN,KAAK,EAlEX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CAOC,OAAO,AuDqBN,IAAI,EAtEV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CAOC,OAAO,AuDyBN,QAAQ,EM1Ed,AtCsEA,YsCtEY,CAYV,cAAc,E7D8Bb,AAAA,QAAC,AAAA,CAOC,OAAO,A6DpBR,YAAY,EA7BhB,AtCsEA,YsCtEY,CAkCV,aAAa,E7DQZ,AAAA,QAAC,AAAA,CAOC,OAAO,A6DLR,oBAAoB,EE5CxB,AxCsEA,oBwCtEoB,CAGlB,EAAE,E/DuCD,AAAA,QAAC,AAAA,CAOC,OAAO,A+DxBR,gBAAgB,ECzBpB,AzCsEA,+ByCtE+B,CAC7B,iBAAiB,EhEyChB,AAAA,QAAC,AAAA,CAOC,OAAO,AgE/CR,gBAAgB,AAMb,SAAS;EhEmCd,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuB2BX,YAAY;EvB3BV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CAUb,KAAK,EAVP,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CjCT,KAAK;E9CiCL,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CAkBb,OAAO,EAlBT,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CzBT,OAAO;E9CyBP,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CAsBb,OAAO,EAtBT,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CrBT,OAAO;E9CqBP,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CA0Bb,IAAI,EA1BN,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CjBT,IAAI;E9CiBJ,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CA8Bb,QAAQ,EA9BV,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CbT,QAAQ;E9CaR,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CAGA,CAAC,EAJL,A1BsEA,Y0BtEY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDvCP,CAAC;EjDuCH,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,EnBPf,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB;EpE2ChB,QAAQ,CAAA,AAAA,QAAC,AAAA,EoEpCT,aAAa;EpEoCb,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EoE3CX,kBAAkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,EAPf,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EoEpCT,aAAa;EpEoCb,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,ErBhBf,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB;EtE2CtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EsE3BT,aAAa;EtE2Bb,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EsE3CX,wBAAwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,EAhBf,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EsE3BT,aAAa;EtE2Bb,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,EtBrBjB,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;EvE0CxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuEtBP,aAAa;EvEsBf,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuE3CX,6BAA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,EArBjB,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EuEtBP,aAAa;EvEsBf,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,EtBjDjB,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;EvEctB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuEMP,aAAa;EvENf,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuEfX,2BAA2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,EArBjB,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EuEMP,aAAa;EvENf,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,E1BvFtB,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;E3EvCd,QAAQ,CAAA,AAAA,QAAC,AAAA,E2E4CL,gBAAgB;E3E5CpB,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E2E4BX,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,EAhBtB,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,E2E4CL,gBAAgB;E3E5CpB,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EkD3CX,sBAAsB;ElD2CpB,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,EA9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDGL,KAAK;EvDHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,EA1Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDeL,OAAO;EvDfX,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,EA9Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDmBL,OAAO;EvDnBX,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,EAlEX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDuBL,KAAK;EvDvBT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,EAtEV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuD2BL,IAAI;EvD3BR,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,EA1Ed,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuD+BL,QAAQ;EvD/BZ,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E6D3CX,YAAY,CAYV,cAAc,CAiBZ,YAAY,EA7BhB,AtCsEA,YsCtEY,CAYV,cAAc;E7D+Bd,QAAQ,CAAA,AAAA,QAAC,AAAA,E6DdP,YAAY;E7Dcd,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E6D3CX,YAAY,CAkCV,aAAa,CAUX,oBAAoB,EA5CxB,AtCsEA,YsCtEY,CAkCV,aAAa;E7DSb,QAAQ,CAAA,AAAA,QAAC,AAAA,E6DCP,oBAAoB;E7DDtB,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E+D3CX,oBAAoB,CAGlB,EAAE,CAsBA,gBAAgB,EAzBpB,AxCsEA,oBwCtEoB,CAGlB,EAAE;E/DwCF,QAAQ,CAAA,AAAA,QAAC,AAAA,E+DlBP,gBAAgB;E/DkBlB,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EgE3CX,+BAA+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,EARhB,AzCsEA,+ByCtE+B,CAC7B,iBAAiB;EhE0CjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgEzCP,gBAAgB,AAMb,SAAS;EhEmCd,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuB2BX,YAAY,AvBzBP,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CAUb,KAAK,A9CmCF,MAAM,E8C7CX,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CjCT,KAAK,A9CmCF,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CAkBb,OAAO,A9C2BJ,MAAM,E8C7CX,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CzBT,OAAO,A9C2BJ,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CAsBb,OAAO,A9CuBJ,MAAM,E8C7CX,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CrBT,OAAO,A9CuBJ,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CA0Bb,IAAI,A9CmBD,MAAM,E8C7CX,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CjBT,IAAI,A9CmBD,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CA8Bb,QAAQ,A9CeL,MAAM,E8C7CX,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CbT,QAAQ,A9CeL,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CAGA,CAAC,AjDyCA,MAAM,EiD7CX,A1BsEA,Y0BtEY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDvCP,CAAC,AjDyCA,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,ApEsCV,MAAM,EiD7CX,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB;EpE2ChB,QAAQ,CAAA,AAAA,QAAC,AAAA,EoEpCT,aAAa,ApEsCV,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EoE3CX,kBAAkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,ApEsCV,MAAM,EoE7CX,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EoEpCT,aAAa,ApEsCV,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,AtE6BV,MAAM,EiD7CX,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB;EtE2CtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EsE3BT,aAAa,AtE6BV,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EsE3CX,wBAAwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,AtE6BV,MAAM,EsE7CX,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EsE3BT,aAAa,AtE6BV,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,AvEwBZ,MAAM,EiD7CX,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;EvE0CxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuEtBP,aAAa,AvEwBZ,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuE3CX,6BAA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,AvEwBZ,MAAM,EuE7CX,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EuEtBP,aAAa,AvEwBZ,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,AvEJZ,MAAM,EiD7CX,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;EvEctB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuEMP,aAAa,AvEJZ,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuEfX,2BAA2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,AvEJZ,MAAM,EuEjBX,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EuEMP,aAAa,AvEJZ,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,A3E1CjB,MAAM,EiD7CX,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;E3EvCd,QAAQ,CAAA,AAAA,QAAC,AAAA,E2E4CL,gBAAgB,A3E1CjB,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E2E4BX,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,A3E1CjB,MAAM,E2E0BX,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,E2E4CL,gBAAgB,A3E1CjB,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EkD3CX,sBAAsB,AlD6CjB,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,AvDDN,MAAM,EuD7CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDGL,KAAK,AvDDN,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,AvDbR,MAAM,EuD7CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDeL,OAAO,AvDbR,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,AvDjBR,MAAM,EuD7CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDmBL,OAAO,AvDjBR,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,AvDrBN,MAAM,EuD7CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDuBL,KAAK,AvDrBN,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,AvDzBL,MAAM,EuD7CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuD2BL,IAAI,AvDzBL,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,AvD7BT,MAAM,EuD7CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuD+BL,QAAQ,AvD7BT,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E6D3CX,YAAY,CAYV,cAAc,CAiBZ,YAAY,A7DgBX,MAAM,E6D7CX,AtCsEA,YsCtEY,CAYV,cAAc;E7D+Bd,QAAQ,CAAA,AAAA,QAAC,AAAA,E6DdP,YAAY,A7DgBX,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E6D3CX,YAAY,CAkCV,aAAa,CAUX,oBAAoB,A7DCnB,MAAM,E6D7CX,AtCsEA,YsCtEY,CAkCV,aAAa;E7DSb,QAAQ,CAAA,AAAA,QAAC,AAAA,E6DCP,oBAAoB,A7DCnB,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E+D3CX,oBAAoB,CAGlB,EAAE,CAsBA,gBAAgB,A/DoBf,MAAM,E+D7CX,AxCsEA,oBwCtEoB,CAGlB,EAAE;E/DwCF,QAAQ,CAAA,AAAA,QAAC,AAAA,E+DlBP,gBAAgB,A/DoBf,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EgE3CX,+BAA+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,AhEqCX,MAAM,EgE7CX,AzCsEA,+ByCtE+B,CAC7B,iBAAiB;EhE0CjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgEzCP,gBAAgB,AAMb,SAAS,AhEqCX,MAAM;EAFT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuB2BX,YAAY,AvBxBP,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CAUb,KAAK,A9CoCF,MAAM,E8C9CX,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CjCT,KAAK,A9CoCF,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CAkBb,OAAO,A9C4BJ,MAAM,E8C9CX,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CzBT,OAAO,A9C4BJ,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CAsBb,OAAO,A9CwBJ,MAAM,E8C9CX,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CrBT,OAAO,A9CwBJ,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CA0Bb,IAAI,A9CoBD,MAAM,E8C9CX,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CjBT,IAAI,A9CoBD,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CA8Bb,QAAQ,A9CgBL,MAAM,E8C9CX,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CbT,QAAQ,A9CgBL,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CAGA,CAAC,AjD0CA,MAAM,EiD9CX,A1BsEA,Y0BtEY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDvCP,CAAC,AjD0CA,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,ApEuCV,MAAM,EiD9CX,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB;EpE2ChB,QAAQ,CAAA,AAAA,QAAC,AAAA,EoEpCT,aAAa,ApEuCV,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EoE3CX,kBAAkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,ApEuCV,MAAM,EoE9CX,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EoEpCT,aAAa,ApEuCV,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,AtE8BV,MAAM,EiD9CX,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB;EtE2CtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EsE3BT,aAAa,AtE8BV,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EsE3CX,wBAAwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,AtE8BV,MAAM,EsE9CX,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EsE3BT,aAAa,AtE8BV,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,AvEyBZ,MAAM,EiD9CX,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;EvE0CxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuEtBP,aAAa,AvEyBZ,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuE3CX,6BAA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,AvEyBZ,MAAM,EuE9CX,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EuEtBP,aAAa,AvEyBZ,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,AvEHZ,MAAM,EiD9CX,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;EvEctB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuEMP,aAAa,AvEHZ,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuEfX,2BAA2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,AvEHZ,MAAM,EuElBX,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EuEMP,aAAa,AvEHZ,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,A3EzCjB,MAAM,EiD9CX,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;E3EvCd,QAAQ,CAAA,AAAA,QAAC,AAAA,E2E4CL,gBAAgB,A3EzCjB,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E2E4BX,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,A3EzCjB,MAAM,E2EyBX,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,E2E4CL,gBAAgB,A3EzCjB,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EkD3CX,sBAAsB,AlD8CjB,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,AvDAN,MAAM,EuD9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDGL,KAAK,AvDAN,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,AvDZR,MAAM,EuD9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDeL,OAAO,AvDZR,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,AvDhBR,MAAM,EuD9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDmBL,OAAO,AvDhBR,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,AvDpBN,MAAM,EuD9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDuBL,KAAK,AvDpBN,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,AvDxBL,MAAM,EuD9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuD2BL,IAAI,AvDxBL,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,AvD5BT,MAAM,EuD9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuD+BL,QAAQ,AvD5BT,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E6D3CX,YAAY,CAYV,cAAc,CAiBZ,YAAY,A7DiBX,MAAM,E6D9CX,AtCsEA,YsCtEY,CAYV,cAAc;E7D+Bd,QAAQ,CAAA,AAAA,QAAC,AAAA,E6DdP,YAAY,A7DiBX,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E6D3CX,YAAY,CAkCV,aAAa,CAUX,oBAAoB,A7DEnB,MAAM,E6D9CX,AtCsEA,YsCtEY,CAkCV,aAAa;E7DSb,QAAQ,CAAA,AAAA,QAAC,AAAA,E6DCP,oBAAoB,A7DEnB,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E+D3CX,oBAAoB,CAGlB,EAAE,CAsBA,gBAAgB,A/DqBf,MAAM,E+D9CX,AxCsEA,oBwCtEoB,CAGlB,EAAE;E/DwCF,QAAQ,CAAA,AAAA,QAAC,AAAA,E+DlBP,gBAAgB,A/DqBf,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EgE3CX,+BAA+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,AhEsCX,MAAM,EgE9CX,AzCsEA,+ByCtE+B,CAC7B,iBAAiB;EhE0CjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgEzCP,gBAAgB,AAMb,SAAS,AhEsCX,MAAM;EAHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuB2BX,YAAY,AvBvBP,MAAM;EAJT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,C9C+CV,MAAM,A8CrCT,KAAK,EAVP,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,A8CrCT,KAAK;E9CiCL,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,C9C+CV,MAAM,A8C7BT,OAAO,EAlBT,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,A8C7BT,OAAO;E9CyBP,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,C9C+CV,MAAM,A8CzBT,OAAO,EAtBT,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,A8CzBT,OAAO;E9CqBP,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,C9C+CV,MAAM,A8CrBT,IAAI,EA1BN,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,A8CrBT,IAAI;E9CiBJ,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,C9C+CV,MAAM,A8CjBT,QAAQ,EA9BV,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,A8CjBT,QAAQ;E9CaR,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CAGA,CAAC,AjD2CA,MAAM,EiD/CX,A1BsEA,Y0BtEY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDvCP,CAAC,AjD2CA,MAAM;EAJT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CmBDJ,kBAAkB,CpE+Cb,MAAM,AoExCT,aAAa,EnBPf,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB;EpE2ChB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AoExCT,aAAa;EpEoCb,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EoE3CX,kBAAkB,CnBAlB,YAAY,CACV,EAAE,CjD8CC,MAAM,AoExCT,aAAa,EAPf,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AoExCT,aAAa;EpEoCb,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CqBDJ,wBAAwB,CtE+CnB,MAAM,AsE/BT,aAAa,ErBhBf,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB;EtE2CtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AsE/BT,aAAa;EtE2Bb,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EsE3CX,wBAAwB,CrBAxB,YAAY,CACV,EAAE,CjD8CC,MAAM,AsE/BT,aAAa,EAhBf,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AsE/BT,aAAa;EtE2Bb,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvE8CrB,MAAM,AuE1BP,aAAa,EtBrBjB,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;EvE0CxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AuE1BP,aAAa;EvEsBf,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuE3CX,6BAA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjD8CC,MAAM,AuE1BP,aAAa,EArBjB,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AuE1BP,aAAa;EvEsBf,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEkBnB,MAAM,AuEEP,aAAa,EtBjDjB,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;EvEctB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AuEEP,aAAa;EvENf,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuEfX,2BAA2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjD8CC,MAAM,AuEEP,aAAa,EArBjB,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AuEEP,aAAa;EvENf,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3EnCX,MAAM,A2EwCL,gBAAgB,E1BvFtB,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;E3EvCd,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,A2EwCL,gBAAgB;E3E5CpB,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E2E4BX,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjD8CC,MAAM,A2EwCL,gBAAgB,EAhBtB,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,A2EwCL,gBAAgB;E3E5CpB,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AkD/CX,sBAAsB;ElD2CpB,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CvDQd,MAAM,AuDDL,KAAK,EA9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AuDDL,KAAK;EvDHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CvDQd,MAAM,AuDWL,OAAO,EA1Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AuDWL,OAAO;EvDfX,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CvDQd,MAAM,AuDeL,OAAO,EA9Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AuDeL,OAAO;EvDnBX,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CvDQd,MAAM,AuDmBL,KAAK,EAlEX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AuDmBL,KAAK;EvDvBT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CvDQd,MAAM,AuDuBL,IAAI,EAtEV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AuDuBL,IAAI;EvD3BR,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CvDQd,MAAM,AuD2BL,QAAQ,EA1Ed,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AuD2BL,QAAQ;EvD/BZ,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E6D3CX,YAAY,CAYV,cAAc,C7DmCX,MAAM,A6DlBP,YAAY,EA7BhB,AtCsEA,YsCtEY,CAYV,cAAc;E7D+Bd,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,A6DlBP,YAAY;E7Dcd,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E6D3CX,YAAY,CAkCV,aAAa,C7DaV,MAAM,A6DHP,oBAAoB,EA5CxB,AtCsEA,YsCtEY,CAkCV,aAAa;E7DSb,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,A6DHP,oBAAoB;E7DDtB,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E+D3CX,oBAAoB,CAGlB,EAAE,C/D4CC,MAAM,A+DtBP,gBAAgB,EAzBpB,AxCsEA,oBwCtEoB,CAGlB,EAAE;E/DwCF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,A+DtBP,gBAAgB;E/DkBlB,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EgE3CX,+BAA+B,CAC7B,iBAAiB,ChE8Cd,MAAM,AgE7CP,gBAAgB,AAMb,SAAS,EARhB,AzCsEA,+ByCtE+B,CAC7B,iBAAiB;EhE0CjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AgE7CP,gBAAgB,AAMb,SAAS;EhEmCd,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuB2BX,YAAY,AvBtBP,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CAUb,KAAK,A9CsCF,OAAO,E8ChDZ,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CjCT,KAAK,A9CsCF,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CAkBb,OAAO,A9C8BJ,OAAO,E8ChDZ,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CzBT,OAAO,A9C8BJ,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CAsBb,OAAO,A9C0BJ,OAAO,E8ChDZ,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CrBT,OAAO,A9C0BJ,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CA0Bb,IAAI,A9CsBD,OAAO,E8ChDZ,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CjBT,IAAI,A9CsBD,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CA8Bb,QAAQ,A9CkBL,OAAO,E8ChDZ,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8CbT,QAAQ,A9CkBL,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CAGA,CAAC,AjD4CA,OAAO,EiDhDZ,A1BsEA,Y0BtEY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDvCP,CAAC,AjD4CA,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,ApEyCV,OAAO,EiDhDZ,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB;EpE2ChB,QAAQ,CAAA,AAAA,QAAC,AAAA,EoEpCT,aAAa,ApEyCV,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EoE3CX,kBAAkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,ApEyCV,OAAO,EoEhDZ,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EoEpCT,aAAa,ApEyCV,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,AtEgCV,OAAO,EiDhDZ,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB;EtE2CtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EsE3BT,aAAa,AtEgCV,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EsE3CX,wBAAwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,AtEgCV,OAAO,EsEhDZ,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EsE3BT,aAAa,AtEgCV,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,AvE2BZ,OAAO,EiDhDZ,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;EvE0CxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuEtBP,aAAa,AvE2BZ,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuE3CX,6BAA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,AvE2BZ,OAAO,EuEhDZ,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EuEtBP,aAAa,AvE2BZ,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,AvEDZ,OAAO,EiDhDZ,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;EvEctB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuEMP,aAAa,AvEDZ,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuEfX,2BAA2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,AvEDZ,OAAO,EuEpBZ,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EuEMP,aAAa,AvEDZ,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,A3EvCjB,OAAO,EiDhDZ,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;E3EvCd,QAAQ,CAAA,AAAA,QAAC,AAAA,E2E4CL,gBAAgB,A3EvCjB,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E2E4BX,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,A3EvCjB,OAAO,E2EuBZ,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,E2E4CL,gBAAgB,A3EvCjB,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EkD3CX,sBAAsB,AlDgDjB,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,AvDEN,OAAO,EuDhDZ,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDGL,KAAK,AvDEN,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,AvDVR,OAAO,EuDhDZ,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDeL,OAAO,AvDVR,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,AvDdR,OAAO,EuDhDZ,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDmBL,OAAO,AvDdR,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,AvDlBN,OAAO,EuDhDZ,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDuBL,KAAK,AvDlBN,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,AvDtBL,OAAO,EuDhDZ,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuD2BL,IAAI,AvDtBL,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,AvD1BT,OAAO,EuDhDZ,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuD+BL,QAAQ,AvD1BT,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E6D3CX,YAAY,CAYV,cAAc,CAiBZ,YAAY,A7DmBX,OAAO,E6DhDZ,AtCsEA,YsCtEY,CAYV,cAAc;E7D+Bd,QAAQ,CAAA,AAAA,QAAC,AAAA,E6DdP,YAAY,A7DmBX,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E6D3CX,YAAY,CAkCV,aAAa,CAUX,oBAAoB,A7DInB,OAAO,E6DhDZ,AtCsEA,YsCtEY,CAkCV,aAAa;E7DSb,QAAQ,CAAA,AAAA,QAAC,AAAA,E6DCP,oBAAoB,A7DInB,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E+D3CX,oBAAoB,CAGlB,EAAE,CAsBA,gBAAgB,A/DuBf,OAAO,E+DhDZ,AxCsEA,oBwCtEoB,CAGlB,EAAE;E/DwCF,QAAQ,CAAA,AAAA,QAAC,AAAA,E+DlBP,gBAAgB,A/DuBf,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EgE3CX,+BAA+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,AhEwCX,OAAO,EgEhDZ,AzCsEA,+ByCtE+B,CAC7B,iBAAiB;EhE0CjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EgEzCP,gBAAgB,AAMb,SAAS,AhEwCX,OAAO;EALV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuB2BX,YAAY,AvBrBP,OAAO;EANV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,C9CiDV,OAAO,A8CvCV,KAAK,EAVP,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,A8CvCV,KAAK;E9CiCL,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,C9CiDV,OAAO,A8C/BV,OAAO,EAlBT,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,A8C/BV,OAAO;E9CyBP,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,C9CiDV,OAAO,A8C3BV,OAAO,EAtBT,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,A8C3BV,OAAO;E9CqBP,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,C9CiDV,OAAO,A8CvBV,IAAI,EA1BN,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,A8CvBV,IAAI;E9CiBJ,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,C9CiDV,OAAO,A8CnBV,QAAQ,EA9BV,AvBsEA,euBtEe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,A8CnBV,QAAQ;E9CaR,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CAGA,CAAC,AjD6CA,OAAO,EiDjDZ,A1BsEA,Y0BtEY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDvCP,CAAC,AjD6CA,OAAO;EANV,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CmBDJ,kBAAkB,CpEiDb,OAAO,AoE1CV,aAAa,EnBPf,A1BsEA,Y0BtEY,CACV,EAAE,CmBDJ,kBAAkB;EpE2ChB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AoE1CV,aAAa;EpEoCb,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EoE3CX,kBAAkB,CnBAlB,YAAY,CACV,EAAE,CjDgDC,OAAO,AoE1CV,aAAa,EAPf,A7CsEA,kB6CtEkB,CnBAlB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AoE1CV,aAAa;EpEoCb,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CqBDJ,wBAAwB,CtEiDnB,OAAO,AsEjCV,aAAa,ErBhBf,A1BsEA,Y0BtEY,CACV,EAAE,CqBDJ,wBAAwB;EtE2CtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AsEjCV,aAAa;EtE2Bb,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EsE3CX,wBAAwB,CrBAxB,YAAY,CACV,EAAE,CjDgDC,OAAO,AsEjCV,aAAa,EAhBf,A/CsEA,wB+CtEwB,CrBAxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AsEjCV,aAAa;EtE2Bb,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEgDrB,OAAO,AuE5BR,aAAa,EtBrBjB,A1BsEA,Y0BtEY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;EvE0CxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AuE5BR,aAAa;EvEsBf,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuE3CX,6BAA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDgDC,OAAO,AuE5BR,aAAa,EArBjB,AhDsEA,6BgDtE6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AuE5BR,aAAa;EvEsBf,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEoBnB,OAAO,AuEAR,aAAa,EtBjDjB,A1BsEA,Y0BtEY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;EvEctB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AuEAR,aAAa;EvENf,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuEfX,2BAA2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDgDC,OAAO,AuEAR,aAAa,EArBjB,AhD0CA,2BgD1C2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AuEAR,aAAa;EvENf,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3EjCX,OAAO,A2EsCN,gBAAgB,E1BvFtB,A1BsEA,Y0BtEY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;E3EvCd,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,A2EsCN,gBAAgB;E3E5CpB,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E2E4BX,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDgDC,OAAO,A2EsCN,gBAAgB,EAhBtB,ApDDA,sBoDCsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,A2EsCN,gBAAgB;E3E5CpB,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AkDjDZ,sBAAsB;ElD2CpB,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CvDUd,OAAO,AuDHN,KAAK,EA9CX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AuDHN,KAAK;EvDHT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CvDUd,OAAO,AuDSN,OAAO,EA1Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AuDSN,OAAO;EvDfX,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CvDUd,OAAO,AuDaN,OAAO,EA9Db,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AuDaN,OAAO;EvDnBX,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CvDUd,OAAO,AuDiBN,KAAK,EAlEX,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AuDiBN,KAAK;EvDvBT,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CvDUd,OAAO,AuDqBN,IAAI,EAtEV,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AuDqBN,IAAI;EvD3BR,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CvDUd,OAAO,AuDyBN,QAAQ,EA1Ed,AhCsEA,iBgCtEiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AuDyBN,QAAQ;EvD/BZ,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E6D3CX,YAAY,CAYV,cAAc,C7DqCX,OAAO,A6DpBR,YAAY,EA7BhB,AtCsEA,YsCtEY,CAYV,cAAc;E7D+Bd,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,A6DpBR,YAAY;E7Dcd,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E6D3CX,YAAY,CAkCV,aAAa,C7DeV,OAAO,A6DLR,oBAAoB,EA5CxB,AtCsEA,YsCtEY,CAkCV,aAAa;E7DSb,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,A6DLR,oBAAoB;E7DDtB,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,E+D3CX,oBAAoB,CAGlB,EAAE,C/D8CC,OAAO,A+DxBR,gBAAgB,EAzBpB,AxCsEA,oBwCtEoB,CAGlB,EAAE;E/DwCF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,A+DxBR,gBAAgB;E/DkBlB,AuB2BF,QvB3BU,CAAA,AAAA,QAAC,AAAA,EgE3CX,+BAA+B,CAC7B,iBAAiB,ChEgDd,OAAO,AgE/CR,gBAAgB,AAMb,SAAS,EARhB,AzCsEA,+ByCtE+B,CAC7B,iBAAiB;EhE0CjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AgE/CR,gBAAgB,AAMb,SAAS,ChEyCH;IACP,gBAAgB,EhBjCE,OAAM;IgBkCpB,YAAY,EhB0GW,OAAM,GgBzGlC;EuBkBL,AvBfE,YuBeU,CvBfV,MAAM,E8CvDR,A9CuDE,e8CvDa,CAUb,KAAK,C9C6CL,MAAM,E8CvDR,A9CuDE,e8CvDa,CAkBb,OAAO,C9CqCP,MAAM,E8CvDR,A9CuDE,e8CvDa,CAsBb,OAAO,C9CiCP,MAAM,E8CvDR,A9CuDE,e8CvDa,CA0Bb,IAAI,C9C6BJ,MAAM,E8CvDR,A9CuDE,e8CvDa,CA8Bb,QAAQ,C9CyBR,MAAM,EiDvDR,AjDuDE,YiDvDU,CACV,EAAE,CAGA,CAAC,CjDmDH,MAAM,EiDvDR,AjDuDE,YiDvDU,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,CpEgDb,MAAM,EoEvDR,ApEuDE,kBoEvDgB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,CpEgDb,MAAM,EiDvDR,AjDuDE,YiDvDU,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,CtEuCb,MAAM,EsEvDR,AtEuDE,wBsEvDsB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,CtEuCb,MAAM,EiDvDR,AjDuDE,YiDvDU,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,CvEkCf,MAAM,EuEvDR,AvEuDE,6BuEvD2B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,CvEkCf,MAAM,EiDvDR,AjDuDE,YiDvDU,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,CvEMf,MAAM,EuE3BR,AvE2BE,2BuE3ByB,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,CvEMf,MAAM,EiDvDR,AjDuDE,YiDvDU,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,C3EhCpB,MAAM,E2EgBR,A3EhBE,sB2EgBoB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,C3EhCpB,MAAM,EkDvDR,AlDuDE,sBkDvDoB,ClDuDpB,MAAM,EuDvDR,AvDuDE,iBuDvDe,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,CvDST,MAAM,EuDvDR,AvDuDE,iBuDvDe,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,CvDHX,MAAM,EuDvDR,AvDuDE,iBuDvDe,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,CvDPX,MAAM,EuDvDR,AvDuDE,iBuDvDe,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,CvDXT,MAAM,EuDvDR,AvDuDE,iBuDvDe,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,CvDfR,MAAM,EuDvDR,AvDuDE,iBuDvDe,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,CvDnBZ,MAAM,E6DvDR,A7DuDE,Y6DvDU,CAYV,cAAc,CAiBZ,YAAY,C7D0Bd,MAAM,E6DvDR,A7DuDE,Y6DvDU,CAkCV,aAAa,CAUX,oBAAoB,C7DWtB,MAAM,E+DvDR,A/DuDE,oB+DvDkB,CAGlB,EAAE,CAsBA,gBAAgB,C/D8BlB,MAAM,EgEvDR,AhEuDE,+BgEvD6B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,ChE+Cd,MAAM,CAAC;IACL,KAAK,EhBvCe,OAAM;IgBwC1B,gBAAgB,EhBkGa,IAAI,GgBjGlC;;AuBgBH,AAAA,YAAY,CAAC;EvBpEX,KAAK,EhByJ0B,IAAI;EgBxJnC,gBAAgB,EhBWM,OAAO;EgBV7B,YAAY,EhByJmB,OAAM,GuCrFtC;EAFD,AAAA,YAAY,AvBhET,MAAM,EuBgET,AAAA,YAAY,AvB/DT,MAAM,CAAC;IACN,KAAK,EhBmJwB,IAAI;IgBlJjC,gBAAgB,EAAE,OAAM;IACpB,YAAY,EAAE,OAAM,GACzB;EuB2DH,AAAA,YAAY,AvB1DT,MAAM,CAAC;IACN,KAAK,EhB8IwB,IAAI;IgB7IjC,gBAAgB,EAAE,OAAM;IACpB,YAAY,EAAE,OAAM,GACzB;EuBsDH,AAAA,YAAY,AvBrDT,OAAO,EuBqDV,AAAA,YAAY,AvBpDT,OAAO;EACR,AuBmDF,KvBnDO,GuBmDP,YAAY,AvBnDD,gBAAgB,CAAC;IACxB,KAAK,EhBuIwB,IAAI;IgBtIjC,gBAAgB,EAAE,OAAM;IACpB,YAAY,EAAE,OAAM,GASzB;IuBuCH,AAAA,YAAY,AvBrDT,OAAO,AAOL,MAAM,EuB8CX,AAAA,YAAY,AvBrDT,OAAO,AAQL,MAAM,EuB6CX,AAAA,YAAY,AvBrDT,OAAO,AASL,MAAM,EuB4CX,AAAA,YAAY,AvBpDT,OAAO,AAML,MAAM,EuB8CX,AAAA,YAAY,AvBpDT,OAAO,AAOL,MAAM,EuB6CX,AAAA,YAAY,AvBpDT,OAAO,AAQL,MAAM;IAPT,AuBmDF,KvBnDO,GuBmDP,YAAY,AvBnDD,gBAAgB,AAKtB,MAAM;IALT,AuBmDF,KvBnDO,GuBmDP,YAAY,AvBnDD,gBAAgB,AAMtB,MAAM;IANT,AuBmDF,KvBnDO,GuBmDP,YAAY,AvBnDD,gBAAgB,AAOtB,MAAM,CAAC;MACN,KAAK,EhBgIsB,IAAI;MgB/H/B,gBAAgB,EAAE,OAAM;MACpB,YAAY,EAAE,OAAM,GACzB;EuBwCL,AAAA,YAAY,AvBtCT,OAAO,EuBsCV,AAAA,YAAY,AvBrCT,OAAO;EACR,AuBoCF,KvBpCO,GuBoCP,YAAY,AvBpCD,gBAAgB,CAAC;IACxB,gBAAgB,EAAE,IAAK,GACxB;EuBkCH,AAAA,YAAY,AvBjCT,SAAS,EuBiCZ,AAAA,YAAY,AvBjCT,SAAS,AAIP,MAAM,EuB6BX,AAAA,YAAY,AvBjCT,SAAS,AAKP,MAAM,EuB4BX,AAAA,YAAY,AvBjCT,SAAS,AAMP,MAAM,EuB2BX,AAAA,YAAY,AvBjCT,SAAS,AAOP,OAAO,EuB0BZ,AAAA,YAAY,AvBjCT,SAAS,AAQP,OAAO,EuByBZ,AAAA,YAAY,CvBhCT,AAAA,QAAC,AAAA,GuBgCJ,AAAA,YAAY,CvBhCT,AAAA,QAAC,AAAA,CAGC,MAAM,EuB6BX,AAAA,YAAY,CvBhCT,AAAA,QAAC,AAAA,CAIC,MAAM,EuB4BX,AAAA,YAAY,CvBhCT,AAAA,QAAC,AAAA,CAKC,MAAM,EuB2BX,AAAA,YAAY,CvBhCT,AAAA,QAAC,AAAA,CAMC,OAAO,EuB0BZ,AAAA,YAAY,CvBhCT,AAAA,QAAC,AAAA,CAOC,OAAO;EANV,AuB+BF,QvB/BU,CAAA,AAAA,QAAC,AAAA,EuB+BX,YAAY;EvB/BV,AuB+BF,QvB/BU,CAAA,AAAA,QAAC,AAAA,EuB+BX,YAAY,AvB7BP,MAAM;EAFT,AuB+BF,QvB/BU,CAAA,AAAA,QAAC,AAAA,EuB+BX,YAAY,AvB5BP,MAAM;EAHT,AuB+BF,QvB/BU,CAAA,AAAA,QAAC,AAAA,EuB+BX,YAAY,AvB3BP,MAAM;EAJT,AuB+BF,QvB/BU,CAAA,AAAA,QAAC,AAAA,EuB+BX,YAAY,AvB1BP,OAAO;EALV,AuB+BF,QvB/BU,CAAA,AAAA,QAAC,AAAA,EuB+BX,YAAY,AvBzBP,OAAO,CAAC;IACP,gBAAgB,EhBhCE,OAAO;IgBiCrB,YAAY,EhB8GW,OAAM,GgB7GlC;EuBsBL,AvBnBE,YuBmBU,CvBnBV,MAAM,CAAC;IACL,KAAK,EhBtCe,OAAO;IgBuC3B,gBAAgB,EhBsGa,IAAI,GgBrGlC;;AuBoBH,AAAA,SAAS,CAAC;EvBxER,KAAK,EhB6J0B,IAAI;EgB5JnC,gBAAgB,EhBYM,OAAO;EgBX7B,YAAY,EhB6JmB,OAAM,GuCrFtC;EAFD,AAAA,SAAS,AvBpEN,MAAM,EuBoET,AAAA,SAAS,AvBnEN,MAAM,CAAC;IACN,KAAK,EhBuJwB,IAAI;IgBtJjC,gBAAgB,EAAE,OAAM;IACpB,YAAY,EAAE,OAAM,GACzB;EuB+DH,AAAA,SAAS,AvB9DN,MAAM,CAAC;IACN,KAAK,EhBkJwB,IAAI;IgBjJjC,gBAAgB,EAAE,OAAM;IACpB,YAAY,EAAE,OAAM,GACzB;EuB0DH,AAAA,SAAS,AvBzDN,OAAO,EuByDV,AAAA,SAAS,AvBxDN,OAAO;EACR,AuBuDF,KvBvDO,GuBuDP,SAAS,AvBvDE,gBAAgB,CAAC;IACxB,KAAK,EhB2IwB,IAAI;IgB1IjC,gBAAgB,EAAE,OAAM;IACpB,YAAY,EAAE,OAAM,GASzB;IuB2CH,AAAA,SAAS,AvBzDN,OAAO,AAOL,MAAM,EuBkDX,AAAA,SAAS,AvBzDN,OAAO,AAQL,MAAM,EuBiDX,AAAA,SAAS,AvBzDN,OAAO,AASL,MAAM,EuBgDX,AAAA,SAAS,AvBxDN,OAAO,AAML,MAAM,EuBkDX,AAAA,SAAS,AvBxDN,OAAO,AAOL,MAAM,EuBiDX,AAAA,SAAS,AvBxDN,OAAO,AAQL,MAAM;IAPT,AuBuDF,KvBvDO,GuBuDP,SAAS,AvBvDE,gBAAgB,AAKtB,MAAM;IALT,AuBuDF,KvBvDO,GuBuDP,SAAS,AvBvDE,gBAAgB,AAMtB,MAAM;IANT,AuBuDF,KvBvDO,GuBuDP,SAAS,AvBvDE,gBAAgB,AAOtB,MAAM,CAAC;MACN,KAAK,EhBoIsB,IAAI;MgBnI/B,gBAAgB,EAAE,OAAM;MACpB,YAAY,EAAE,OAAM,GACzB;EuB4CL,AAAA,SAAS,AvB1CN,OAAO,EuB0CV,AAAA,SAAS,AvBzCN,OAAO;EACR,AuBwCF,KvBxCO,GuBwCP,SAAS,AvBxCE,gBAAgB,CAAC;IACxB,gBAAgB,EAAE,IAAK,GACxB;EuBsCH,AAAA,SAAS,AvBrCN,SAAS,EuBqCZ,AAAA,SAAS,AvBrCN,SAAS,AAIP,MAAM,EuBiCX,AAAA,SAAS,AvBrCN,SAAS,AAKP,MAAM,EuBgCX,AAAA,SAAS,AvBrCN,SAAS,AAMP,MAAM,EuB+BX,AAAA,SAAS,AvBrCN,SAAS,AAOP,OAAO,EuB8BZ,AAAA,SAAS,AvBrCN,SAAS,AAQP,OAAO,EuB6BZ,AAAA,SAAS,CvBpCN,AAAA,QAAC,AAAA,GuBoCJ,AAAA,SAAS,CvBpCN,AAAA,QAAC,AAAA,CAGC,MAAM,EuBiCX,AAAA,SAAS,CvBpCN,AAAA,QAAC,AAAA,CAIC,MAAM,EuBgCX,AAAA,SAAS,CvBpCN,AAAA,QAAC,AAAA,CAKC,MAAM,EuB+BX,AAAA,SAAS,CvBpCN,AAAA,QAAC,AAAA,CAMC,OAAO,EuB8BZ,AAAA,SAAS,CvBpCN,AAAA,QAAC,AAAA,CAOC,OAAO;EANV,AuBmCF,QvBnCU,CAAA,AAAA,QAAC,AAAA,EuBmCX,SAAS;EvBnCP,AuBmCF,QvBnCU,CAAA,AAAA,QAAC,AAAA,EuBmCX,SAAS,AvBjCJ,MAAM;EAFT,AuBmCF,QvBnCU,CAAA,AAAA,QAAC,AAAA,EuBmCX,SAAS,AvBhCJ,MAAM;EAHT,AuBmCF,QvBnCU,CAAA,AAAA,QAAC,AAAA,EuBmCX,SAAS,AvB/BJ,MAAM;EAJT,AuBmCF,QvBnCU,CAAA,AAAA,QAAC,AAAA,EuBmCX,SAAS,AvB9BJ,OAAO;EALV,AuBmCF,QvBnCU,CAAA,AAAA,QAAC,AAAA,EuBmCX,SAAS,AvB7BJ,OAAO,CAAC;IACP,gBAAgB,EhB/BE,OAAO;IgBgCrB,YAAY,EhBkHW,OAAM,GgBjHlC;EuB0BL,AvBvBE,SuBuBO,CvBvBP,MAAM,CAAC;IACL,KAAK,EhBrCe,OAAO;IgBsC3B,gBAAgB,EhB0Ga,IAAI,GgBzGlC;;AuBwBH,AAAA,YAAY,CAAC;EvB5EX,KAAK,EhBiK0B,IAAI;EgBhKnC,gBAAgB,EhBaM,OAAO;EgBZ7B,YAAY,EhBiKmB,OAAM,GuCrFtC;EAFD,AAAA,YAAY,AvBxET,MAAM,EuBwET,AAAA,YAAY,AvBvET,MAAM,CAAC;IACN,KAAK,EhB2JwB,IAAI;IgB1JjC,gBAAgB,EAAE,OAAM;IACpB,YAAY,EAAE,OAAM,GACzB;EuBmEH,AAAA,YAAY,AvBlET,MAAM,CAAC;IACN,KAAK,EhBsJwB,IAAI;IgBrJjC,gBAAgB,EAAE,OAAM;IACpB,YAAY,EAAE,OAAM,GACzB;EuB8DH,AAAA,YAAY,AvB7DT,OAAO,EuB6DV,AAAA,YAAY,AvB5DT,OAAO;EACR,AuB2DF,KvB3DO,GuB2DP,YAAY,AvB3DD,gBAAgB,CAAC;IACxB,KAAK,EhB+IwB,IAAI;IgB9IjC,gBAAgB,EAAE,OAAM;IACpB,YAAY,EAAE,OAAM,GASzB;IuB+CH,AAAA,YAAY,AvB7DT,OAAO,AAOL,MAAM,EuBsDX,AAAA,YAAY,AvB7DT,OAAO,AAQL,MAAM,EuBqDX,AAAA,YAAY,AvB7DT,OAAO,AASL,MAAM,EuBoDX,AAAA,YAAY,AvB5DT,OAAO,AAML,MAAM,EuBsDX,AAAA,YAAY,AvB5DT,OAAO,AAOL,MAAM,EuBqDX,AAAA,YAAY,AvB5DT,OAAO,AAQL,MAAM;IAPT,AuB2DF,KvB3DO,GuB2DP,YAAY,AvB3DD,gBAAgB,AAKtB,MAAM;IALT,AuB2DF,KvB3DO,GuB2DP,YAAY,AvB3DD,gBAAgB,AAMtB,MAAM;IANT,AuB2DF,KvB3DO,GuB2DP,YAAY,AvB3DD,gBAAgB,AAOtB,MAAM,CAAC;MACN,KAAK,EhBwIsB,IAAI;MgBvI/B,gBAAgB,EAAE,OAAM;MACpB,YAAY,EAAE,OAAM,GACzB;EuBgDL,AAAA,YAAY,AvB9CT,OAAO,EuB8CV,AAAA,YAAY,AvB7CT,OAAO;EACR,AuB4CF,KvB5CO,GuB4CP,YAAY,AvB5CD,gBAAgB,CAAC;IACxB,gBAAgB,EAAE,IAAK,GACxB;EuB0CH,AAAA,YAAY,AvBzCT,SAAS,EuByCZ,AAAA,YAAY,AvBzCT,SAAS,AAIP,MAAM,EuBqCX,AAAA,YAAY,AvBzCT,SAAS,AAKP,MAAM,EuBoCX,AAAA,YAAY,AvBzCT,SAAS,AAMP,MAAM,EuBmCX,AAAA,YAAY,AvBzCT,SAAS,AAOP,OAAO,EuBkCZ,AAAA,YAAY,AvBzCT,SAAS,AAQP,OAAO,EuBiCZ,AAAA,YAAY,CvBxCT,AAAA,QAAC,AAAA,GuBwCJ,AAAA,YAAY,CvBxCT,AAAA,QAAC,AAAA,CAGC,MAAM,EuBqCX,AAAA,YAAY,CvBxCT,AAAA,QAAC,AAAA,CAIC,MAAM,EuBoCX,AAAA,YAAY,CvBxCT,AAAA,QAAC,AAAA,CAKC,MAAM,EuBmCX,AAAA,YAAY,CvBxCT,AAAA,QAAC,AAAA,CAMC,OAAO,EuBkCZ,AAAA,YAAY,CvBxCT,AAAA,QAAC,AAAA,CAOC,OAAO;EANV,AuBuCF,QvBvCU,CAAA,AAAA,QAAC,AAAA,EuBuCX,YAAY;EvBvCV,AuBuCF,QvBvCU,CAAA,AAAA,QAAC,AAAA,EuBuCX,YAAY,AvBrCP,MAAM;EAFT,AuBuCF,QvBvCU,CAAA,AAAA,QAAC,AAAA,EuBuCX,YAAY,AvBpCP,MAAM;EAHT,AuBuCF,QvBvCU,CAAA,AAAA,QAAC,AAAA,EuBuCX,YAAY,AvBnCP,MAAM;EAJT,AuBuCF,QvBvCU,CAAA,AAAA,QAAC,AAAA,EuBuCX,YAAY,AvBlCP,OAAO;EALV,AuBuCF,QvBvCU,CAAA,AAAA,QAAC,AAAA,EuBuCX,YAAY,AvBjCP,OAAO,CAAC;IACP,gBAAgB,EhB9BE,OAAO;IgB+BrB,YAAY,EhBsHW,OAAM,GgBrHlC;EuB8BL,AvB3BE,YuB2BU,CvB3BV,MAAM,CAAC;IACL,KAAK,EhBpCe,OAAO;IgBqC3B,gBAAgB,EhB8Ga,IAAI,GgB7GlC;;AuB4BH,AAAA,WAAW,EuBtFX,AvBsFA,euBtFe,CAcb,OAAO,EGdT,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AAIE,OAAO,EARd,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CnBQX,OAAO,AmBDZ,aAAa,EAPf,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CAOG,OAAO,AmBDZ,aAAa,EnBPf,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CrBQjB,OAAO,AqBQZ,aAAa,EAhBf,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CAOG,OAAO,AqBQZ,aAAa,ErBhBf,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CtBOnB,OAAO,AsBaV,aAAa,EArBjB,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CAOG,OAAO,AsBaV,aAAa,EtBrBjB,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CtBrBjB,OAAO,AsByCV,aAAa,EArBjB,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CAOG,OAAO,AsByCV,aAAa,EtBjDjB,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1B1ET,OAAO,A0B+ER,gBAAgB,EAhBtB,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CAOG,OAAO,A0B+ER,gBAAgB,EpBvFtB,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CAWb,OAAO,EAlDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CAeb,OAAO,EMtDb,AtCsFA,YsCtFY,CAYV,cAAc,CAaZ,cAAc,EEzBlB,AxCsFA,oBwCtFoB,CAGlB,EAAE,CASA,YAAY,CxC0EJ;EvBhFV,KAAK,EhBqK0B,IAAI;EgBpKnC,gBAAgB,EhBcM,OAAO;EgBb7B,YAAY,EhBqKmB,OAAM,GuCrFtC;EAFD,AAAA,WAAW,AvB5ER,MAAM,E8CVT,AvBsFA,euBtFe,CAcb,OAAO,A9CJN,MAAM,EiDVT,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AAIE,OAAO,AjDEX,MAAM,EiDVT,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CnBQX,OAAO,AmBDZ,aAAa,ApEGZ,MAAM,EoEVT,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CAOG,OAAO,AmBDZ,aAAa,ApEGZ,MAAM,EiDVT,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CrBQjB,OAAO,AqBQZ,aAAa,AtENZ,MAAM,EsEVT,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CAOG,OAAO,AqBQZ,aAAa,AtENZ,MAAM,EiDVT,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CtBOnB,OAAO,AsBaV,aAAa,AvEXd,MAAM,EuEVT,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CAOG,OAAO,AsBaV,aAAa,AvEXd,MAAM,EiDVT,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CtBrBjB,OAAO,AsByCV,aAAa,AvEvCd,MAAM,EuEkBT,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CAOG,OAAO,AsByCV,aAAa,AvEvCd,MAAM,EiDVT,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1B1ET,OAAO,A0B+ER,gBAAgB,A3E7EnB,MAAM,E2E6DT,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CAOG,OAAO,A0B+ER,gBAAgB,A3E7EnB,MAAM,EuDVT,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CAWb,OAAO,AvDxCV,MAAM,EuDVT,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CAeb,OAAO,AvD5CV,MAAM,E6DVT,AtCsFA,YsCtFY,CAYV,cAAc,CAaZ,cAAc,A7Dff,MAAM,E+DVT,AxCsFA,oBwCtFoB,CAGlB,EAAE,CASA,YAAY,A/DFb,MAAM,EuB4ET,AAAA,WAAW,AvB3ER,MAAM,E8CXT,AvBsFA,euBtFe,C9CWZ,MAAM,A8CGP,OAAO,EGdT,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AjDOF,MAAM,AiDHF,OAAO,EARd,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CpEWf,MAAM,AiDHF,OAAO,AmBDZ,aAAa,EAPf,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CjDUD,MAAM,AiDHF,OAAO,AmBDZ,aAAa,EnBPf,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CtEWrB,MAAM,AiDHF,OAAO,AqBQZ,aAAa,EAhBf,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CjDUD,MAAM,AiDHF,OAAO,AqBQZ,aAAa,ErBhBf,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEUvB,MAAM,AiDHF,OAAO,AsBaV,aAAa,EArBjB,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDUD,MAAM,AiDHF,OAAO,AsBaV,aAAa,EtBrBjB,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvElBrB,MAAM,AiDHF,OAAO,AsByCV,aAAa,EArBjB,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDUD,MAAM,AiDHF,OAAO,AsByCV,aAAa,EtBjDjB,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3EvEb,MAAM,AiDHF,OAAO,A0B+ER,gBAAgB,EAhBtB,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDUD,MAAM,AiDHF,OAAO,A0B+ER,gBAAgB,EpBvFtB,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvD5BhB,MAAM,AuDuCH,OAAO,EAlDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvD5BhB,MAAM,AuD2CH,OAAO,EMtDb,AtCsFA,YsCtFY,CAYV,cAAc,C7DDb,MAAM,A6DcL,cAAc,EEzBlB,AxCsFA,oBwCtFoB,CAGlB,EAAE,C/DQD,MAAM,A+DCL,YAAY,C/DDN;IACN,KAAK,EhB+JwB,IAAI;IgB9JjC,gBAAgB,EAAE,OAAM;IACpB,YAAY,EAAE,OAAM,GACzB;EuBuEH,AAAA,WAAW,AvBtER,MAAM,E8ChBT,AvBsFA,euBtFe,CAcb,OAAO,A9CEN,MAAM,EiDhBT,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AAIE,OAAO,AjDQX,MAAM,EiDhBT,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CnBQX,OAAO,AmBDZ,aAAa,ApESZ,MAAM,EoEhBT,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CAOG,OAAO,AmBDZ,aAAa,ApESZ,MAAM,EiDhBT,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CrBQjB,OAAO,AqBQZ,aAAa,AtEAZ,MAAM,EsEhBT,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CAOG,OAAO,AqBQZ,aAAa,AtEAZ,MAAM,EiDhBT,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CtBOnB,OAAO,AsBaV,aAAa,AvELd,MAAM,EuEhBT,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CAOG,OAAO,AsBaV,aAAa,AvELd,MAAM,EiDhBT,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CtBrBjB,OAAO,AsByCV,aAAa,AvEjCd,MAAM,EuEYT,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CAOG,OAAO,AsByCV,aAAa,AvEjCd,MAAM,EiDhBT,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1B1ET,OAAO,A0B+ER,gBAAgB,A3EvEnB,MAAM,E2EuDT,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CAOG,OAAO,A0B+ER,gBAAgB,A3EvEnB,MAAM,EuDhBT,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CAWb,OAAO,AvDlCV,MAAM,EuDhBT,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CAeb,OAAO,AvDtCV,MAAM,E6DhBT,AtCsFA,YsCtFY,CAYV,cAAc,CAaZ,cAAc,A7DTf,MAAM,E+DhBT,AxCsFA,oBwCtFoB,CAGlB,EAAE,CASA,YAAY,A/DIb,MAAM,CAAC;IACN,KAAK,EhB0JwB,IAAI;IgBzJjC,gBAAgB,EAAE,OAAM;IACpB,YAAY,EAAE,OAAM,GACzB;EuBkEH,AAAA,WAAW,AvBjER,OAAO,E8CrBV,AvBsFA,euBtFe,CAcb,OAAO,A9CON,OAAO,EiDrBV,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AAIE,OAAO,AjDaX,OAAO,EiDrBV,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CnBQX,OAAO,AmBDZ,aAAa,ApEcZ,OAAO,EoErBV,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CAOG,OAAO,AmBDZ,aAAa,ApEcZ,OAAO,EiDrBV,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CrBQjB,OAAO,AqBQZ,aAAa,AtEKZ,OAAO,EsErBV,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CAOG,OAAO,AqBQZ,aAAa,AtEKZ,OAAO,EiDrBV,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CtBOnB,OAAO,AsBaV,aAAa,AvEAd,OAAO,EuErBV,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CAOG,OAAO,AsBaV,aAAa,AvEAd,OAAO,EiDrBV,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CtBrBjB,OAAO,AsByCV,aAAa,AvE5Bd,OAAO,EuEOV,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CAOG,OAAO,AsByCV,aAAa,AvE5Bd,OAAO,EiDrBV,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1B1ET,OAAO,A0B+ER,gBAAgB,A3ElEnB,OAAO,E2EkDV,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CAOG,OAAO,A0B+ER,gBAAgB,A3ElEnB,OAAO,EuDrBV,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CAWb,OAAO,AvD7BV,OAAO,EuDrBV,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CAeb,OAAO,AvDjCV,OAAO,E6DrBV,AtCsFA,YsCtFY,CAYV,cAAc,CAaZ,cAAc,A7DJf,OAAO,E+DrBV,AxCsFA,oBwCtFoB,CAGlB,EAAE,CASA,YAAY,A/DSb,OAAO,EuBiEV,AAAA,WAAW,AvBhER,OAAO,E8CtBV,AvBsFA,euBtFe,C9CsBZ,OAAO,A8CRR,OAAO,EGdT,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AjDkBF,OAAO,AiDdH,OAAO,EARd,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CpEsBf,OAAO,AiDdH,OAAO,AmBDZ,aAAa,EAPf,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CjDqBD,OAAO,AiDdH,OAAO,AmBDZ,aAAa,EnBPf,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CtEsBrB,OAAO,AiDdH,OAAO,AqBQZ,aAAa,EAhBf,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CjDqBD,OAAO,AiDdH,OAAO,AqBQZ,aAAa,ErBhBf,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEqBvB,OAAO,AiDdH,OAAO,AsBaV,aAAa,EArBjB,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDqBD,OAAO,AiDdH,OAAO,AsBaV,aAAa,EtBrBjB,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEPrB,OAAO,AiDdH,OAAO,AsByCV,aAAa,EArBjB,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDqBD,OAAO,AiDdH,OAAO,AsByCV,aAAa,EtBjDjB,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3E5Db,OAAO,AiDdH,OAAO,A0B+ER,gBAAgB,EAhBtB,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDqBD,OAAO,AiDdH,OAAO,A0B+ER,gBAAgB,EpBvFtB,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuD4BJ,OAAO,EAlDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuDgCJ,OAAO,EMtDb,AtCsFA,YsCtFY,CAYV,cAAc,C7DUb,OAAO,A6DGN,cAAc,EEzBlB,AxCsFA,oBwCtFoB,CAGlB,EAAE,C/DmBD,OAAO,A+DVN,YAAY;E/DWd,AuB+DF,KvB/DO,GuB+DP,WAAW,AvB/DA,gBAAgB,E8CvB3B,AvBsFA,euBtFe;E9CuBb,KAAK,GAAI,gBAAgB,A8CTzB,OAAO,EGdT,A1BsFA,Y0BtFY,CACV,EAAE;EjDsBF,KAAK,GiDnBH,CAAC,AjDmBM,gBAAgB,AiDfpB,OAAO,EARd,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB;EpEuBhB,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AmBDZ,aAAa,EAPf,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE;EjDsBF,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AmBDZ,aAAa,EnBPf,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB;EtEuBtB,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AqBQZ,aAAa,EAhBf,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE;EjDsBF,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AqBQZ,aAAa,ErBhBf,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;EvEsBxB,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AsBaV,aAAa,EArBjB,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;EjDsBF,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AsBaV,aAAa,EtBrBjB,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;EvENtB,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AsByCV,aAAa,EArBjB,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;EjDsBF,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AsByCV,aAAa,EtBjDjB,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;E3E3Dd,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,A0B+ER,gBAAgB,EAhBtB,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;EjDsBF,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,A0B+ER,gBAAgB,EpBvFtB,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;EvDhBjB,KAAK,GAAI,gBAAgB,AuD2BrB,OAAO,EAlDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;EvDhBjB,KAAK,GAAI,gBAAgB,AuD+BrB,OAAO,EMtDb,AtCsFA,YsCtFY,CAYV,cAAc;E7DWd,KAAK,GAAI,gBAAgB,A6DEvB,cAAc,EEzBlB,AxCsFA,oBwCtFoB,CAGlB,EAAE;E/DoBF,KAAK,GAAI,gBAAgB,A+DXvB,YAAY,C/DWY;IACxB,KAAK,EhBmJwB,IAAI;IgBlJjC,gBAAgB,EAAE,OAAM;IACpB,YAAY,EAAE,OAAM,GASzB;IuBmDH,AAAA,WAAW,AvBjER,OAAO,AAOL,MAAM,E8C5BX,AvBsFA,euBtFe,CAcb,OAAO,A9CON,OAAO,AAOL,MAAM,EiD5BX,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AAIE,OAAO,AjDaX,OAAO,AAOL,MAAM,EiD5BX,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CnBQX,OAAO,AmBDZ,aAAa,ApEcZ,OAAO,AAOL,MAAM,EoE5BX,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CAOG,OAAO,AmBDZ,aAAa,ApEcZ,OAAO,AAOL,MAAM,EiD5BX,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CrBQjB,OAAO,AqBQZ,aAAa,AtEKZ,OAAO,AAOL,MAAM,EsE5BX,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CAOG,OAAO,AqBQZ,aAAa,AtEKZ,OAAO,AAOL,MAAM,EiD5BX,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CtBOnB,OAAO,AsBaV,aAAa,AvEAd,OAAO,AAOL,MAAM,EuE5BX,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CAOG,OAAO,AsBaV,aAAa,AvEAd,OAAO,AAOL,MAAM,EiD5BX,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CtBrBjB,OAAO,AsByCV,aAAa,AvE5Bd,OAAO,AAOL,MAAM,EuEAX,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CAOG,OAAO,AsByCV,aAAa,AvE5Bd,OAAO,AAOL,MAAM,EiD5BX,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1B1ET,OAAO,A0B+ER,gBAAgB,A3ElEnB,OAAO,AAOL,MAAM,E2E2CX,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CAOG,OAAO,A0B+ER,gBAAgB,A3ElEnB,OAAO,AAOL,MAAM,EuD5BX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CAWb,OAAO,AvD7BV,OAAO,AAOL,MAAM,EuD5BX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CAeb,OAAO,AvDjCV,OAAO,AAOL,MAAM,E6D5BX,AtCsFA,YsCtFY,CAYV,cAAc,CAaZ,cAAc,A7DJf,OAAO,AAOL,MAAM,E+D5BX,AxCsFA,oBwCtFoB,CAGlB,EAAE,CASA,YAAY,A/DSb,OAAO,AAOL,MAAM,EuB0DX,AAAA,WAAW,AvBjER,OAAO,AAQL,MAAM,E8C7BX,AvBsFA,euBtFe,CAcb,OAAO,A9CON,OAAO,AAQL,MAAM,EiD7BX,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AAIE,OAAO,AjDaX,OAAO,AAQL,MAAM,EiD7BX,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CnBQX,OAAO,AmBDZ,aAAa,ApEcZ,OAAO,AAQL,MAAM,EoE7BX,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CAOG,OAAO,AmBDZ,aAAa,ApEcZ,OAAO,AAQL,MAAM,EiD7BX,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CrBQjB,OAAO,AqBQZ,aAAa,AtEKZ,OAAO,AAQL,MAAM,EsE7BX,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CAOG,OAAO,AqBQZ,aAAa,AtEKZ,OAAO,AAQL,MAAM,EiD7BX,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CtBOnB,OAAO,AsBaV,aAAa,AvEAd,OAAO,AAQL,MAAM,EuE7BX,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CAOG,OAAO,AsBaV,aAAa,AvEAd,OAAO,AAQL,MAAM,EiD7BX,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CtBrBjB,OAAO,AsByCV,aAAa,AvE5Bd,OAAO,AAQL,MAAM,EuEDX,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CAOG,OAAO,AsByCV,aAAa,AvE5Bd,OAAO,AAQL,MAAM,EiD7BX,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1B1ET,OAAO,A0B+ER,gBAAgB,A3ElEnB,OAAO,AAQL,MAAM,E2E0CX,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CAOG,OAAO,A0B+ER,gBAAgB,A3ElEnB,OAAO,AAQL,MAAM,EuD7BX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CAWb,OAAO,AvD7BV,OAAO,AAQL,MAAM,EuD7BX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CAeb,OAAO,AvDjCV,OAAO,AAQL,MAAM,E6D7BX,AtCsFA,YsCtFY,CAYV,cAAc,CAaZ,cAAc,A7DJf,OAAO,AAQL,MAAM,E+D7BX,AxCsFA,oBwCtFoB,CAGlB,EAAE,CASA,YAAY,A/DSb,OAAO,AAQL,MAAM,EuByDX,AAAA,WAAW,AvBjER,OAAO,AASL,MAAM,E8C9BX,AvBsFA,euBtFe,CAcb,OAAO,A9CON,OAAO,AASL,MAAM,EiD9BX,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AAIE,OAAO,AjDaX,OAAO,AASL,MAAM,EiD9BX,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CnBQX,OAAO,AmBDZ,aAAa,ApEcZ,OAAO,AASL,MAAM,EoE9BX,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CAOG,OAAO,AmBDZ,aAAa,ApEcZ,OAAO,AASL,MAAM,EiD9BX,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CrBQjB,OAAO,AqBQZ,aAAa,AtEKZ,OAAO,AASL,MAAM,EsE9BX,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CAOG,OAAO,AqBQZ,aAAa,AtEKZ,OAAO,AASL,MAAM,EiD9BX,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CtBOnB,OAAO,AsBaV,aAAa,AvEAd,OAAO,AASL,MAAM,EuE9BX,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CAOG,OAAO,AsBaV,aAAa,AvEAd,OAAO,AASL,MAAM,EiD9BX,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CtBrBjB,OAAO,AsByCV,aAAa,AvE5Bd,OAAO,AASL,MAAM,EuEFX,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CAOG,OAAO,AsByCV,aAAa,AvE5Bd,OAAO,AASL,MAAM,EiD9BX,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1B1ET,OAAO,A0B+ER,gBAAgB,A3ElEnB,OAAO,AASL,MAAM,E2EyCX,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CAOG,OAAO,A0B+ER,gBAAgB,A3ElEnB,OAAO,AASL,MAAM,EuD9BX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CAWb,OAAO,AvD7BV,OAAO,AASL,MAAM,EuD9BX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CAeb,OAAO,AvDjCV,OAAO,AASL,MAAM,E6D9BX,AtCsFA,YsCtFY,CAYV,cAAc,CAaZ,cAAc,A7DJf,OAAO,AASL,MAAM,E+D9BX,AxCsFA,oBwCtFoB,CAGlB,EAAE,CASA,YAAY,A/DSb,OAAO,AASL,MAAM,EuBwDX,AAAA,WAAW,AvBhER,OAAO,AAML,MAAM,E8C5BX,AvBsFA,euBtFe,C9CsBZ,OAAO,A8CRR,OAAO,A9CcJ,MAAM,EiD5BX,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AjDkBF,OAAO,AiDdH,OAAO,AjDoBT,MAAM,EiD5BX,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CpEsBf,OAAO,AiDdH,OAAO,AmBDZ,aAAa,ApEqBV,MAAM,EoE5BX,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CjDqBD,OAAO,AiDdH,OAAO,AmBDZ,aAAa,ApEqBV,MAAM,EiD5BX,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CtEsBrB,OAAO,AiDdH,OAAO,AqBQZ,aAAa,AtEYV,MAAM,EsE5BX,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CjDqBD,OAAO,AiDdH,OAAO,AqBQZ,aAAa,AtEYV,MAAM,EiD5BX,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEqBvB,OAAO,AiDdH,OAAO,AsBaV,aAAa,AvEOZ,MAAM,EuE5BX,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDqBD,OAAO,AiDdH,OAAO,AsBaV,aAAa,AvEOZ,MAAM,EiD5BX,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEPrB,OAAO,AiDdH,OAAO,AsByCV,aAAa,AvErBZ,MAAM,EuEAX,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDqBD,OAAO,AiDdH,OAAO,AsByCV,aAAa,AvErBZ,MAAM,EiD5BX,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3E5Db,OAAO,AiDdH,OAAO,A0B+ER,gBAAgB,A3E3DjB,MAAM,E2E2CX,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDqBD,OAAO,AiDdH,OAAO,A0B+ER,gBAAgB,A3E3DjB,MAAM,EuD5BX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuD4BJ,OAAO,AvDtBR,MAAM,EuD5BX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuDgCJ,OAAO,AvD1BR,MAAM,E6D5BX,AtCsFA,YsCtFY,CAYV,cAAc,C7DUb,OAAO,A6DGN,cAAc,A7DGb,MAAM,E+D5BX,AxCsFA,oBwCtFoB,CAGlB,EAAE,C/DmBD,OAAO,A+DVN,YAAY,A/DgBX,MAAM,EuB0DX,AAAA,WAAW,AvBhER,OAAO,AAOL,MAAM,E8C7BX,AvBsFA,euBtFe,C9CsBZ,OAAO,A8CRR,OAAO,A9CeJ,MAAM,EiD7BX,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AjDkBF,OAAO,AiDdH,OAAO,AjDqBT,MAAM,EiD7BX,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CpEsBf,OAAO,AiDdH,OAAO,AmBDZ,aAAa,ApEsBV,MAAM,EoE7BX,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CjDqBD,OAAO,AiDdH,OAAO,AmBDZ,aAAa,ApEsBV,MAAM,EiD7BX,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CtEsBrB,OAAO,AiDdH,OAAO,AqBQZ,aAAa,AtEaV,MAAM,EsE7BX,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CjDqBD,OAAO,AiDdH,OAAO,AqBQZ,aAAa,AtEaV,MAAM,EiD7BX,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEqBvB,OAAO,AiDdH,OAAO,AsBaV,aAAa,AvEQZ,MAAM,EuE7BX,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDqBD,OAAO,AiDdH,OAAO,AsBaV,aAAa,AvEQZ,MAAM,EiD7BX,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEPrB,OAAO,AiDdH,OAAO,AsByCV,aAAa,AvEpBZ,MAAM,EuEDX,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDqBD,OAAO,AiDdH,OAAO,AsByCV,aAAa,AvEpBZ,MAAM,EiD7BX,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3E5Db,OAAO,AiDdH,OAAO,A0B+ER,gBAAgB,A3E1DjB,MAAM,E2E0CX,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDqBD,OAAO,AiDdH,OAAO,A0B+ER,gBAAgB,A3E1DjB,MAAM,EuD7BX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuD4BJ,OAAO,AvDrBR,MAAM,EuD7BX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AuDgCJ,OAAO,AvDzBR,MAAM,E6D7BX,AtCsFA,YsCtFY,CAYV,cAAc,C7DUb,OAAO,A6DGN,cAAc,A7DIb,MAAM,E+D7BX,AxCsFA,oBwCtFoB,CAGlB,EAAE,C/DmBD,OAAO,A+DVN,YAAY,A/DiBX,MAAM,EuByDX,AAAA,WAAW,AvBhER,OAAO,AAQL,MAAM,E8C9BX,AvBsFA,euBtFe,C9CsBZ,OAAO,AAQL,MAAM,A8ChBT,OAAO,EGdT,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AjDkBF,OAAO,AAQL,MAAM,AiDtBJ,OAAO,EARd,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CpEsBf,OAAO,AAQL,MAAM,AiDtBJ,OAAO,AmBDZ,aAAa,EAPf,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CjDqBD,OAAO,AAQL,MAAM,AiDtBJ,OAAO,AmBDZ,aAAa,EnBPf,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CtEsBrB,OAAO,AAQL,MAAM,AiDtBJ,OAAO,AqBQZ,aAAa,EAhBf,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CjDqBD,OAAO,AAQL,MAAM,AiDtBJ,OAAO,AqBQZ,aAAa,ErBhBf,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEqBvB,OAAO,AAQL,MAAM,AiDtBJ,OAAO,AsBaV,aAAa,EArBjB,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDqBD,OAAO,AAQL,MAAM,AiDtBJ,OAAO,AsBaV,aAAa,EtBrBjB,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEPrB,OAAO,AAQL,MAAM,AiDtBJ,OAAO,AsByCV,aAAa,EArBjB,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDqBD,OAAO,AAQL,MAAM,AiDtBJ,OAAO,AsByCV,aAAa,EtBjDjB,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3E5Db,OAAO,AAQL,MAAM,AiDtBJ,OAAO,A0B+ER,gBAAgB,EAhBtB,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDqBD,OAAO,AAQL,MAAM,AiDtBJ,OAAO,A0B+ER,gBAAgB,EpBvFtB,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AAQL,MAAM,AuDoBL,OAAO,EAlDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDjBhB,OAAO,AAQL,MAAM,AuDwBL,OAAO,EMtDb,AtCsFA,YsCtFY,CAYV,cAAc,C7DUb,OAAO,AAQL,MAAM,A6DLP,cAAc,EEzBlB,AxCsFA,oBwCtFoB,CAGlB,EAAE,C/DmBD,OAAO,AAQL,MAAM,A+DlBP,YAAY;I/DWd,AuB+DF,KvB/DO,GuB+DP,WAAW,AvB/DA,gBAAgB,AAKtB,MAAM,E8C5BX,AvBsFA,euBtFe;I9CuBb,KAAK,GAAI,gBAAgB,A8CTzB,OAAO,A9CcJ,MAAM,EiD5BX,A1BsFA,Y0BtFY,CACV,EAAE;IjDsBF,KAAK,GiDnBH,CAAC,AjDmBM,gBAAgB,AiDfpB,OAAO,AjDoBT,MAAM,EiD5BX,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB;IpEuBhB,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AmBDZ,aAAa,ApEqBV,MAAM,EoE5BX,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AmBDZ,aAAa,ApEqBV,MAAM,EiD5BX,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB;ItEuBtB,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AqBQZ,aAAa,AtEYV,MAAM,EsE5BX,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AqBQZ,aAAa,AtEYV,MAAM,EiD5BX,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;IvEsBxB,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AsBaV,aAAa,AvEOZ,MAAM,EuE5BX,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AsBaV,aAAa,AvEOZ,MAAM,EiD5BX,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;IvENtB,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AsByCV,aAAa,AvErBZ,MAAM,EuEAX,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AsByCV,aAAa,AvErBZ,MAAM,EiD5BX,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;I3E3Dd,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,A0B+ER,gBAAgB,A3E3DjB,MAAM,E2E2CX,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,A0B+ER,gBAAgB,A3E3DjB,MAAM,EuD5BX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AuD2BrB,OAAO,AvDtBR,MAAM,EuD5BX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AuD+BrB,OAAO,AvD1BR,MAAM,E6D5BX,AtCsFA,YsCtFY,CAYV,cAAc;I7DWd,KAAK,GAAI,gBAAgB,A6DEvB,cAAc,A7DGb,MAAM,E+D5BX,AxCsFA,oBwCtFoB,CAGlB,EAAE;I/DoBF,KAAK,GAAI,gBAAgB,A+DXvB,YAAY,A/DgBX,MAAM;IALT,AuB+DF,KvB/DO,GuB+DP,WAAW,AvB/DA,gBAAgB,AAMtB,MAAM,E8C7BX,AvBsFA,euBtFe;I9CuBb,KAAK,GAAI,gBAAgB,A8CTzB,OAAO,A9CeJ,MAAM,EiD7BX,A1BsFA,Y0BtFY,CACV,EAAE;IjDsBF,KAAK,GiDnBH,CAAC,AjDmBM,gBAAgB,AiDfpB,OAAO,AjDqBT,MAAM,EiD7BX,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB;IpEuBhB,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AmBDZ,aAAa,ApEsBV,MAAM,EoE7BX,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AmBDZ,aAAa,ApEsBV,MAAM,EiD7BX,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB;ItEuBtB,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AqBQZ,aAAa,AtEaV,MAAM,EsE7BX,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AqBQZ,aAAa,AtEaV,MAAM,EiD7BX,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;IvEsBxB,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AsBaV,aAAa,AvEQZ,MAAM,EuE7BX,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AsBaV,aAAa,AvEQZ,MAAM,EiD7BX,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;IvENtB,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AsByCV,aAAa,AvEpBZ,MAAM,EuEDX,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,AsByCV,aAAa,AvEpBZ,MAAM,EiD7BX,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;I3E3Dd,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,A0B+ER,gBAAgB,A3E1DjB,MAAM,E2E0CX,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AiDfpB,OAAO,A0B+ER,gBAAgB,A3E1DjB,MAAM,EuD7BX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AuD2BrB,OAAO,AvDrBR,MAAM,EuD7BX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AuD+BrB,OAAO,AvDzBR,MAAM,E6D7BX,AtCsFA,YsCtFY,CAYV,cAAc;I7DWd,KAAK,GAAI,gBAAgB,A6DEvB,cAAc,A7DIb,MAAM,E+D7BX,AxCsFA,oBwCtFoB,CAGlB,EAAE;I/DoBF,KAAK,GAAI,gBAAgB,A+DXvB,YAAY,A/DiBX,MAAM;IANT,AuB+DF,KvB/DO,GuB+DP,WAAW,AvB/DA,gBAAgB,AAOtB,MAAM,E8C9BX,AvBsFA,euBtFe;I9CuBb,KAAK,GAAI,gBAAgB,AAOtB,MAAM,A8ChBT,OAAO,EGdT,A1BsFA,Y0BtFY,CACV,EAAE;IjDsBF,KAAK,GiDnBH,CAAC,AjDmBM,gBAAgB,AAOtB,MAAM,AiDtBJ,OAAO,EARd,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB;IpEuBhB,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AiDtBJ,OAAO,AmBDZ,aAAa,EAPf,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AiDtBJ,OAAO,AmBDZ,aAAa,EnBPf,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB;ItEuBtB,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AiDtBJ,OAAO,AqBQZ,aAAa,EAhBf,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AiDtBJ,OAAO,AqBQZ,aAAa,ErBhBf,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;IvEsBxB,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AiDtBJ,OAAO,AsBaV,aAAa,EArBjB,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AiDtBJ,OAAO,AsBaV,aAAa,EtBrBjB,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;IvENtB,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AiDtBJ,OAAO,AsByCV,aAAa,EArBjB,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AiDtBJ,OAAO,AsByCV,aAAa,EtBjDjB,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;I3E3Dd,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AiDtBJ,OAAO,A0B+ER,gBAAgB,EAhBtB,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;IjDsBF,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AiDtBJ,OAAO,A0B+ER,gBAAgB,EpBvFtB,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AuDoBL,OAAO,EAlDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;IvDhBjB,KAAK,GAAI,gBAAgB,AAOtB,MAAM,AuDwBL,OAAO,EMtDb,AtCsFA,YsCtFY,CAYV,cAAc;I7DWd,KAAK,GAAI,gBAAgB,AAOtB,MAAM,A6DLP,cAAc,EEzBlB,AxCsFA,oBwCtFoB,CAGlB,EAAE;I/DoBF,KAAK,GAAI,gBAAgB,AAOtB,MAAM,A+DlBP,YAAY,C/DkBJ;MACN,KAAK,EhB4IsB,IAAI;MgB3I/B,gBAAgB,EAAE,OAAM;MACpB,YAAY,EAAE,OAAM,GACzB;EuBoDL,AAAA,WAAW,AvBlDR,OAAO,E8CpCV,AvBsFA,euBtFe,CAcb,OAAO,A9CsBN,OAAO,EiDpCV,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AAIE,OAAO,AjD4BX,OAAO,EiDpCV,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CnBQX,OAAO,AmBDZ,aAAa,ApE6BZ,OAAO,EoEpCV,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CAOG,OAAO,AmBDZ,aAAa,ApE6BZ,OAAO,EiDpCV,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CrBQjB,OAAO,AqBQZ,aAAa,AtEoBZ,OAAO,EsEpCV,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CAOG,OAAO,AqBQZ,aAAa,AtEoBZ,OAAO,EiDpCV,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CtBOnB,OAAO,AsBaV,aAAa,AvEed,OAAO,EuEpCV,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CAOG,OAAO,AsBaV,aAAa,AvEed,OAAO,EiDpCV,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CtBrBjB,OAAO,AsByCV,aAAa,AvEbd,OAAO,EuERV,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CAOG,OAAO,AsByCV,aAAa,AvEbd,OAAO,EiDpCV,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1B1ET,OAAO,A0B+ER,gBAAgB,A3EnDnB,OAAO,E2EmCV,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CAOG,OAAO,A0B+ER,gBAAgB,A3EnDnB,OAAO,EuDpCV,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CAWb,OAAO,AvDdV,OAAO,EuDpCV,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CAeb,OAAO,AvDlBV,OAAO,E6DpCV,AtCsFA,YsCtFY,CAYV,cAAc,CAaZ,cAAc,A7DWf,OAAO,E+DpCV,AxCsFA,oBwCtFoB,CAGlB,EAAE,CASA,YAAY,A/DwBb,OAAO,EuBkDV,AAAA,WAAW,AvBjDR,OAAO,E8CrCV,AvBsFA,euBtFe,C9CqCZ,OAAO,A8CvBR,OAAO,EGdT,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AjDiCF,OAAO,AiD7BH,OAAO,EARd,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CpEqCf,OAAO,AiD7BH,OAAO,AmBDZ,aAAa,EAPf,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CjDoCD,OAAO,AiD7BH,OAAO,AmBDZ,aAAa,EnBPf,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CtEqCrB,OAAO,AiD7BH,OAAO,AqBQZ,aAAa,EAhBf,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CjDoCD,OAAO,AiD7BH,OAAO,AqBQZ,aAAa,ErBhBf,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEoCvB,OAAO,AiD7BH,OAAO,AsBaV,aAAa,EArBjB,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDoCD,OAAO,AiD7BH,OAAO,AsBaV,aAAa,EtBrBjB,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEQrB,OAAO,AiD7BH,OAAO,AsByCV,aAAa,EArBjB,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDoCD,OAAO,AiD7BH,OAAO,AsByCV,aAAa,EtBjDjB,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3E7Cb,OAAO,AiD7BH,OAAO,A0B+ER,gBAAgB,EAhBtB,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDoCD,OAAO,AiD7BH,OAAO,A0B+ER,gBAAgB,EpBvFtB,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDFhB,OAAO,AuDaJ,OAAO,EAlDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDFhB,OAAO,AuDiBJ,OAAO,EMtDb,AtCsFA,YsCtFY,CAYV,cAAc,C7DyBb,OAAO,A6DZN,cAAc,EEzBlB,AxCsFA,oBwCtFoB,CAGlB,EAAE,C/DkCD,OAAO,A+DzBN,YAAY;E/D0Bd,AuBgDF,KvBhDO,GuBgDP,WAAW,AvBhDA,gBAAgB,E8CtC3B,AvBsFA,euBtFe;E9CsCb,KAAK,GAAI,gBAAgB,A8CxBzB,OAAO,EGdT,A1BsFA,Y0BtFY,CACV,EAAE;EjDqCF,KAAK,GiDlCH,CAAC,AjDkCM,gBAAgB,AiD9BpB,OAAO,EARd,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB;EpEsChB,KAAK,GAAI,gBAAgB,AiD9BpB,OAAO,AmBDZ,aAAa,EAPf,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE;EjDqCF,KAAK,GAAI,gBAAgB,AiD9BpB,OAAO,AmBDZ,aAAa,EnBPf,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB;EtEsCtB,KAAK,GAAI,gBAAgB,AiD9BpB,OAAO,AqBQZ,aAAa,EAhBf,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE;EjDqCF,KAAK,GAAI,gBAAgB,AiD9BpB,OAAO,AqBQZ,aAAa,ErBhBf,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;EvEqCxB,KAAK,GAAI,gBAAgB,AiD9BpB,OAAO,AsBaV,aAAa,EArBjB,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;EjDqCF,KAAK,GAAI,gBAAgB,AiD9BpB,OAAO,AsBaV,aAAa,EtBrBjB,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;EvEStB,KAAK,GAAI,gBAAgB,AiD9BpB,OAAO,AsByCV,aAAa,EArBjB,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;EjDqCF,KAAK,GAAI,gBAAgB,AiD9BpB,OAAO,AsByCV,aAAa,EtBjDjB,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;E3E5Cd,KAAK,GAAI,gBAAgB,AiD9BpB,OAAO,A0B+ER,gBAAgB,EAhBtB,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;EjDqCF,KAAK,GAAI,gBAAgB,AiD9BpB,OAAO,A0B+ER,gBAAgB,EpBvFtB,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;EvDDjB,KAAK,GAAI,gBAAgB,AuDYrB,OAAO,EAlDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;EvDDjB,KAAK,GAAI,gBAAgB,AuDgBrB,OAAO,EMtDb,AtCsFA,YsCtFY,CAYV,cAAc;E7D0Bd,KAAK,GAAI,gBAAgB,A6DbvB,cAAc,EEzBlB,AxCsFA,oBwCtFoB,CAGlB,EAAE;E/DmCF,KAAK,GAAI,gBAAgB,A+D1BvB,YAAY,C/D0BY;IACxB,gBAAgB,EAAE,IAAK,GACxB;EuB8CH,AAAA,WAAW,AvB7CR,SAAS,E8CzCZ,AvBsFA,euBtFe,C9CyCZ,SAAS,A8C3BV,OAAO,EGdT,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AjDqCF,SAAS,AiDjCL,OAAO,EARd,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CpEyCf,SAAS,AiDjCL,OAAO,AmBDZ,aAAa,EAPf,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,AmBDZ,aAAa,EnBPf,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CtEyCrB,SAAS,AiDjCL,OAAO,AqBQZ,aAAa,EAhBf,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,AqBQZ,aAAa,ErBhBf,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEwCvB,SAAS,AiDjCL,OAAO,AsBaV,aAAa,EArBjB,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,AsBaV,aAAa,EtBrBjB,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEYrB,SAAS,AiDjCL,OAAO,AsByCV,aAAa,EArBjB,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,AsByCV,aAAa,EtBjDjB,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3EzCb,SAAS,AiDjCL,OAAO,A0B+ER,gBAAgB,EAhBtB,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,A0B+ER,gBAAgB,EpBvFtB,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDSN,OAAO,EAlDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDaN,OAAO,EMtDb,AtCsFA,YsCtFY,CAYV,cAAc,C7D6Bb,SAAS,A6DhBR,cAAc,EEzBlB,AxCsFA,oBwCtFoB,CAGlB,EAAE,C/DsCD,SAAS,A+D7BR,YAAY,ExC0EhB,AAAA,WAAW,AvB7CR,SAAS,AAIP,MAAM,E8C7CX,AvBsFA,euBtFe,C9CyCZ,SAAS,A8C3BV,OAAO,A9C+BJ,MAAM,EiD7CX,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AjDqCF,SAAS,AiDjCL,OAAO,AjDqCT,MAAM,EiD7CX,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CpEyCf,SAAS,AiDjCL,OAAO,AmBDZ,aAAa,ApEsCV,MAAM,EoE7CX,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,AmBDZ,aAAa,ApEsCV,MAAM,EiD7CX,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CtEyCrB,SAAS,AiDjCL,OAAO,AqBQZ,aAAa,AtE6BV,MAAM,EsE7CX,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,AqBQZ,aAAa,AtE6BV,MAAM,EiD7CX,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEwCvB,SAAS,AiDjCL,OAAO,AsBaV,aAAa,AvEwBZ,MAAM,EuE7CX,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,AsBaV,aAAa,AvEwBZ,MAAM,EiD7CX,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEYrB,SAAS,AiDjCL,OAAO,AsByCV,aAAa,AvEJZ,MAAM,EuEjBX,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,AsByCV,aAAa,AvEJZ,MAAM,EiD7CX,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3EzCb,SAAS,AiDjCL,OAAO,A0B+ER,gBAAgB,A3E1CjB,MAAM,E2E0BX,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,A0B+ER,gBAAgB,A3E1CjB,MAAM,EuD7CX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDSN,OAAO,AvDLR,MAAM,EuD7CX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDaN,OAAO,AvDTR,MAAM,E6D7CX,AtCsFA,YsCtFY,CAYV,cAAc,C7D6Bb,SAAS,A6DhBR,cAAc,A7DoBb,MAAM,E+D7CX,AxCsFA,oBwCtFoB,CAGlB,EAAE,C/DsCD,SAAS,A+D7BR,YAAY,A/DiCX,MAAM,EuByCX,AAAA,WAAW,AvB7CR,SAAS,AAKP,MAAM,E8C9CX,AvBsFA,euBtFe,C9CyCZ,SAAS,A8C3BV,OAAO,A9CgCJ,MAAM,EiD9CX,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AjDqCF,SAAS,AiDjCL,OAAO,AjDsCT,MAAM,EiD9CX,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CpEyCf,SAAS,AiDjCL,OAAO,AmBDZ,aAAa,ApEuCV,MAAM,EoE9CX,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,AmBDZ,aAAa,ApEuCV,MAAM,EiD9CX,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CtEyCrB,SAAS,AiDjCL,OAAO,AqBQZ,aAAa,AtE8BV,MAAM,EsE9CX,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,AqBQZ,aAAa,AtE8BV,MAAM,EiD9CX,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEwCvB,SAAS,AiDjCL,OAAO,AsBaV,aAAa,AvEyBZ,MAAM,EuE9CX,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,AsBaV,aAAa,AvEyBZ,MAAM,EiD9CX,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEYrB,SAAS,AiDjCL,OAAO,AsByCV,aAAa,AvEHZ,MAAM,EuElBX,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,AsByCV,aAAa,AvEHZ,MAAM,EiD9CX,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3EzCb,SAAS,AiDjCL,OAAO,A0B+ER,gBAAgB,A3EzCjB,MAAM,E2EyBX,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,A0B+ER,gBAAgB,A3EzCjB,MAAM,EuD9CX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDSN,OAAO,AvDJR,MAAM,EuD9CX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDaN,OAAO,AvDRR,MAAM,E6D9CX,AtCsFA,YsCtFY,CAYV,cAAc,C7D6Bb,SAAS,A6DhBR,cAAc,A7DqBb,MAAM,E+D9CX,AxCsFA,oBwCtFoB,CAGlB,EAAE,C/DsCD,SAAS,A+D7BR,YAAY,A/DkCX,MAAM,EuBwCX,AAAA,WAAW,AvB7CR,SAAS,AAMP,MAAM,E8C/CX,AvBsFA,euBtFe,C9CyCZ,SAAS,AAMP,MAAM,A8CjCT,OAAO,EGdT,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AjDqCF,SAAS,AAMP,MAAM,AiDvCJ,OAAO,EARd,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CpEyCf,SAAS,AAMP,MAAM,AiDvCJ,OAAO,AmBDZ,aAAa,EAPf,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CjDwCD,SAAS,AAMP,MAAM,AiDvCJ,OAAO,AmBDZ,aAAa,EnBPf,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CtEyCrB,SAAS,AAMP,MAAM,AiDvCJ,OAAO,AqBQZ,aAAa,EAhBf,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AAMP,MAAM,AiDvCJ,OAAO,AqBQZ,aAAa,ErBhBf,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEwCvB,SAAS,AAMP,MAAM,AiDvCJ,OAAO,AsBaV,aAAa,EArBjB,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDwCD,SAAS,AAMP,MAAM,AiDvCJ,OAAO,AsBaV,aAAa,EtBrBjB,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEYrB,SAAS,AAMP,MAAM,AiDvCJ,OAAO,AsByCV,aAAa,EArBjB,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AAMP,MAAM,AiDvCJ,OAAO,AsByCV,aAAa,EtBjDjB,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3EzCb,SAAS,AAMP,MAAM,AiDvCJ,OAAO,A0B+ER,gBAAgB,EAhBtB,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDwCD,SAAS,AAMP,MAAM,AiDvCJ,OAAO,A0B+ER,gBAAgB,EpBvFtB,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AAMP,MAAM,AuDGL,OAAO,EAlDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AAMP,MAAM,AuDOL,OAAO,EMtDb,AtCsFA,YsCtFY,CAYV,cAAc,C7D6Bb,SAAS,AAMP,MAAM,A6DtBP,cAAc,EEzBlB,AxCsFA,oBwCtFoB,CAGlB,EAAE,C/DsCD,SAAS,AAMP,MAAM,A+DnCP,YAAY,ExC0EhB,AAAA,WAAW,AvB7CR,SAAS,AAOP,OAAO,E8ChDZ,AvBsFA,euBtFe,C9CyCZ,SAAS,A8C3BV,OAAO,A9CkCJ,OAAO,EiDhDZ,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AjDqCF,SAAS,AiDjCL,OAAO,AjDwCT,OAAO,EiDhDZ,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CpEyCf,SAAS,AiDjCL,OAAO,AmBDZ,aAAa,ApEyCV,OAAO,EoEhDZ,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,AmBDZ,aAAa,ApEyCV,OAAO,EiDhDZ,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CtEyCrB,SAAS,AiDjCL,OAAO,AqBQZ,aAAa,AtEgCV,OAAO,EsEhDZ,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,AqBQZ,aAAa,AtEgCV,OAAO,EiDhDZ,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEwCvB,SAAS,AiDjCL,OAAO,AsBaV,aAAa,AvE2BZ,OAAO,EuEhDZ,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,AsBaV,aAAa,AvE2BZ,OAAO,EiDhDZ,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEYrB,SAAS,AiDjCL,OAAO,AsByCV,aAAa,AvEDZ,OAAO,EuEpBZ,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,AsByCV,aAAa,AvEDZ,OAAO,EiDhDZ,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3EzCb,SAAS,AiDjCL,OAAO,A0B+ER,gBAAgB,A3EvCjB,OAAO,E2EuBZ,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDwCD,SAAS,AiDjCL,OAAO,A0B+ER,gBAAgB,A3EvCjB,OAAO,EuDhDZ,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDSN,OAAO,AvDFR,OAAO,EuDhDZ,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AuDaN,OAAO,AvDNR,OAAO,E6DhDZ,AtCsFA,YsCtFY,CAYV,cAAc,C7D6Bb,SAAS,A6DhBR,cAAc,A7DuBb,OAAO,E+DhDZ,AxCsFA,oBwCtFoB,CAGlB,EAAE,C/DsCD,SAAS,A+D7BR,YAAY,A/DoCX,OAAO,EuBsCZ,AAAA,WAAW,AvB7CR,SAAS,AAQP,OAAO,E8CjDZ,AvBsFA,euBtFe,C9CyCZ,SAAS,AAQP,OAAO,A8CnCV,OAAO,EGdT,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,AjDqCF,SAAS,AAQP,OAAO,AiDzCL,OAAO,EARd,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,CpEyCf,SAAS,AAQP,OAAO,AiDzCL,OAAO,AmBDZ,aAAa,EAPf,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,CjDwCD,SAAS,AAQP,OAAO,AiDzCL,OAAO,AmBDZ,aAAa,EnBPf,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,CtEyCrB,SAAS,AAQP,OAAO,AiDzCL,OAAO,AqBQZ,aAAa,EAhBf,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AAQP,OAAO,AiDzCL,OAAO,AqBQZ,aAAa,ErBhBf,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEwCvB,SAAS,AAQP,OAAO,AiDzCL,OAAO,AsBaV,aAAa,EArBjB,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDwCD,SAAS,AAQP,OAAO,AiDzCL,OAAO,AsBaV,aAAa,EtBrBjB,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEYrB,SAAS,AAQP,OAAO,AiDzCL,OAAO,AsByCV,aAAa,EArBjB,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDwCD,SAAS,AAQP,OAAO,AiDzCL,OAAO,AsByCV,aAAa,EtBjDjB,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3EzCb,SAAS,AAQP,OAAO,AiDzCL,OAAO,A0B+ER,gBAAgB,EAhBtB,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDwCD,SAAS,AAQP,OAAO,AiDzCL,OAAO,A0B+ER,gBAAgB,EpBvFtB,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AAQP,OAAO,AuDCN,OAAO,EAlDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,CvDEhB,SAAS,AAQP,OAAO,AuDKN,OAAO,EMtDb,AtCsFA,YsCtFY,CAYV,cAAc,C7D6Bb,SAAS,AAQP,OAAO,A6DxBR,cAAc,EEzBlB,AxCsFA,oBwCtFoB,CAGlB,EAAE,C/DsCD,SAAS,AAQP,OAAO,A+DrCR,YAAY,ExC0EhB,AAAA,WAAW,CvB5CR,AAAA,QAAC,AAAA,G8C1CJ,AvBsFA,euBtFe,E9C0CZ,AAAA,QAAC,AAAA,C8C5BF,OAAO,EGdT,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,CjDsCF,AAAA,QAAC,AAAA,CiDlCG,OAAO,EARd,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,EpE0Cf,AAAA,QAAC,AAAA,CiDlCG,OAAO,AmBDZ,aAAa,EAPf,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,AmBDZ,aAAa,EnBPf,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,EtE0CrB,AAAA,QAAC,AAAA,CiDlCG,OAAO,AqBQZ,aAAa,EAhBf,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,AqBQZ,aAAa,ErBhBf,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,EvEyCvB,AAAA,QAAC,AAAA,CiDlCG,OAAO,AsBaV,aAAa,EArBjB,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,AsBaV,aAAa,EtBrBjB,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,EvEarB,AAAA,QAAC,AAAA,CiDlCG,OAAO,AsByCV,aAAa,EArBjB,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,AsByCV,aAAa,EtBjDjB,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,E3ExCb,AAAA,QAAC,AAAA,CiDlCG,OAAO,A0B+ER,gBAAgB,EAhBtB,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,A0B+ER,gBAAgB,EpBvFtB,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDQE,OAAO,EAlDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDYE,OAAO,EMtDb,AtCsFA,YsCtFY,CAYV,cAAc,E7D8Bb,AAAA,QAAC,AAAA,C6DjBA,cAAc,EEzBlB,AxCsFA,oBwCtFoB,CAGlB,EAAE,E/DuCD,AAAA,QAAC,AAAA,C+D9BA,YAAY,ExC0EhB,AAAA,WAAW,CvB5CR,AAAA,QAAC,AAAA,CAGC,MAAM,E8C7CX,AvBsFA,euBtFe,E9C0CZ,AAAA,QAAC,AAAA,C8C5BF,OAAO,A9C+BJ,MAAM,EiD7CX,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,CjDsCF,AAAA,QAAC,AAAA,CiDlCG,OAAO,AjDqCT,MAAM,EiD7CX,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,EpE0Cf,AAAA,QAAC,AAAA,CiDlCG,OAAO,AmBDZ,aAAa,ApEsCV,MAAM,EoE7CX,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,AmBDZ,aAAa,ApEsCV,MAAM,EiD7CX,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,EtE0CrB,AAAA,QAAC,AAAA,CiDlCG,OAAO,AqBQZ,aAAa,AtE6BV,MAAM,EsE7CX,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,AqBQZ,aAAa,AtE6BV,MAAM,EiD7CX,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,EvEyCvB,AAAA,QAAC,AAAA,CiDlCG,OAAO,AsBaV,aAAa,AvEwBZ,MAAM,EuE7CX,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,AsBaV,aAAa,AvEwBZ,MAAM,EiD7CX,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,EvEarB,AAAA,QAAC,AAAA,CiDlCG,OAAO,AsByCV,aAAa,AvEJZ,MAAM,EuEjBX,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,AsByCV,aAAa,AvEJZ,MAAM,EiD7CX,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,E3ExCb,AAAA,QAAC,AAAA,CiDlCG,OAAO,A0B+ER,gBAAgB,A3E1CjB,MAAM,E2E0BX,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,A0B+ER,gBAAgB,A3E1CjB,MAAM,EuD7CX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDQE,OAAO,AvDLR,MAAM,EuD7CX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDYE,OAAO,AvDTR,MAAM,E6D7CX,AtCsFA,YsCtFY,CAYV,cAAc,E7D8Bb,AAAA,QAAC,AAAA,C6DjBA,cAAc,A7DoBb,MAAM,E+D7CX,AxCsFA,oBwCtFoB,CAGlB,EAAE,E/DuCD,AAAA,QAAC,AAAA,C+D9BA,YAAY,A/DiCX,MAAM,EuByCX,AAAA,WAAW,CvB5CR,AAAA,QAAC,AAAA,CAIC,MAAM,E8C9CX,AvBsFA,euBtFe,E9C0CZ,AAAA,QAAC,AAAA,C8C5BF,OAAO,A9CgCJ,MAAM,EiD9CX,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,CjDsCF,AAAA,QAAC,AAAA,CiDlCG,OAAO,AjDsCT,MAAM,EiD9CX,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,EpE0Cf,AAAA,QAAC,AAAA,CiDlCG,OAAO,AmBDZ,aAAa,ApEuCV,MAAM,EoE9CX,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,AmBDZ,aAAa,ApEuCV,MAAM,EiD9CX,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,EtE0CrB,AAAA,QAAC,AAAA,CiDlCG,OAAO,AqBQZ,aAAa,AtE8BV,MAAM,EsE9CX,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,AqBQZ,aAAa,AtE8BV,MAAM,EiD9CX,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,EvEyCvB,AAAA,QAAC,AAAA,CiDlCG,OAAO,AsBaV,aAAa,AvEyBZ,MAAM,EuE9CX,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,AsBaV,aAAa,AvEyBZ,MAAM,EiD9CX,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,EvEarB,AAAA,QAAC,AAAA,CiDlCG,OAAO,AsByCV,aAAa,AvEHZ,MAAM,EuElBX,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,AsByCV,aAAa,AvEHZ,MAAM,EiD9CX,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,E3ExCb,AAAA,QAAC,AAAA,CiDlCG,OAAO,A0B+ER,gBAAgB,A3EzCjB,MAAM,E2EyBX,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,A0B+ER,gBAAgB,A3EzCjB,MAAM,EuD9CX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDQE,OAAO,AvDJR,MAAM,EuD9CX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDYE,OAAO,AvDRR,MAAM,E6D9CX,AtCsFA,YsCtFY,CAYV,cAAc,E7D8Bb,AAAA,QAAC,AAAA,C6DjBA,cAAc,A7DqBb,MAAM,E+D9CX,AxCsFA,oBwCtFoB,CAGlB,EAAE,E/DuCD,AAAA,QAAC,AAAA,C+D9BA,YAAY,A/DkCX,MAAM,EuBwCX,AAAA,WAAW,CvB5CR,AAAA,QAAC,AAAA,CAKC,MAAM,E8C/CX,AvBsFA,euBtFe,E9C0CZ,AAAA,QAAC,AAAA,CAKC,MAAM,A8CjCT,OAAO,EGdT,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,CjDsCF,AAAA,QAAC,AAAA,CAKC,MAAM,AiDvCJ,OAAO,EARd,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,EpE0Cf,AAAA,QAAC,AAAA,CAKC,MAAM,AiDvCJ,OAAO,AmBDZ,aAAa,EAPf,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAKC,MAAM,AiDvCJ,OAAO,AmBDZ,aAAa,EnBPf,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,EtE0CrB,AAAA,QAAC,AAAA,CAKC,MAAM,AiDvCJ,OAAO,AqBQZ,aAAa,EAhBf,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAKC,MAAM,AiDvCJ,OAAO,AqBQZ,aAAa,ErBhBf,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,EvEyCvB,AAAA,QAAC,AAAA,CAKC,MAAM,AiDvCJ,OAAO,AsBaV,aAAa,EArBjB,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAKC,MAAM,AiDvCJ,OAAO,AsBaV,aAAa,EtBrBjB,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,EvEarB,AAAA,QAAC,AAAA,CAKC,MAAM,AiDvCJ,OAAO,AsByCV,aAAa,EArBjB,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAKC,MAAM,AiDvCJ,OAAO,AsByCV,aAAa,EtBjDjB,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,E3ExCb,AAAA,QAAC,AAAA,CAKC,MAAM,AiDvCJ,OAAO,A0B+ER,gBAAgB,EAhBtB,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAKC,MAAM,AiDvCJ,OAAO,A0B+ER,gBAAgB,EpBvFtB,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CAKC,MAAM,AuDGL,OAAO,EAlDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CAKC,MAAM,AuDOL,OAAO,EMtDb,AtCsFA,YsCtFY,CAYV,cAAc,E7D8Bb,AAAA,QAAC,AAAA,CAKC,MAAM,A6DtBP,cAAc,EEzBlB,AxCsFA,oBwCtFoB,CAGlB,EAAE,E/DuCD,AAAA,QAAC,AAAA,CAKC,MAAM,A+DnCP,YAAY,ExC0EhB,AAAA,WAAW,CvB5CR,AAAA,QAAC,AAAA,CAMC,OAAO,E8ChDZ,AvBsFA,euBtFe,E9C0CZ,AAAA,QAAC,AAAA,C8C5BF,OAAO,A9CkCJ,OAAO,EiDhDZ,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,CjDsCF,AAAA,QAAC,AAAA,CiDlCG,OAAO,AjDwCT,OAAO,EiDhDZ,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,EpE0Cf,AAAA,QAAC,AAAA,CiDlCG,OAAO,AmBDZ,aAAa,ApEyCV,OAAO,EoEhDZ,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,AmBDZ,aAAa,ApEyCV,OAAO,EiDhDZ,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,EtE0CrB,AAAA,QAAC,AAAA,CiDlCG,OAAO,AqBQZ,aAAa,AtEgCV,OAAO,EsEhDZ,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,AqBQZ,aAAa,AtEgCV,OAAO,EiDhDZ,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,EvEyCvB,AAAA,QAAC,AAAA,CiDlCG,OAAO,AsBaV,aAAa,AvE2BZ,OAAO,EuEhDZ,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,AsBaV,aAAa,AvE2BZ,OAAO,EiDhDZ,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,EvEarB,AAAA,QAAC,AAAA,CiDlCG,OAAO,AsByCV,aAAa,AvEDZ,OAAO,EuEpBZ,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,AsByCV,aAAa,AvEDZ,OAAO,EiDhDZ,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,E3ExCb,AAAA,QAAC,AAAA,CiDlCG,OAAO,A0B+ER,gBAAgB,A3EvCjB,OAAO,E2EuBZ,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CiDlCG,OAAO,A0B+ER,gBAAgB,A3EvCjB,OAAO,EuDhDZ,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDQE,OAAO,AvDFR,OAAO,EuDhDZ,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CuDYE,OAAO,AvDNR,OAAO,E6DhDZ,AtCsFA,YsCtFY,CAYV,cAAc,E7D8Bb,AAAA,QAAC,AAAA,C6DjBA,cAAc,A7DuBb,OAAO,E+DhDZ,AxCsFA,oBwCtFoB,CAGlB,EAAE,E/DuCD,AAAA,QAAC,AAAA,C+D9BA,YAAY,A/DoCX,OAAO,EuBsCZ,AAAA,WAAW,CvB5CR,AAAA,QAAC,AAAA,CAOC,OAAO,E8CjDZ,AvBsFA,euBtFe,E9C0CZ,AAAA,QAAC,AAAA,CAOC,OAAO,A8CnCV,OAAO,EGdT,A1BsFA,Y0BtFY,CACV,EAAE,CAGA,CAAC,CjDsCF,AAAA,QAAC,AAAA,CAOC,OAAO,AiDzCL,OAAO,EARd,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB,EpE0Cf,AAAA,QAAC,AAAA,CAOC,OAAO,AiDzCL,OAAO,AmBDZ,aAAa,EAPf,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAOC,OAAO,AiDzCL,OAAO,AmBDZ,aAAa,EnBPf,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB,EtE0CrB,AAAA,QAAC,AAAA,CAOC,OAAO,AiDzCL,OAAO,AqBQZ,aAAa,EAhBf,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAOC,OAAO,AiDzCL,OAAO,AqBQZ,aAAa,ErBhBf,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,EvEyCvB,AAAA,QAAC,AAAA,CAOC,OAAO,AiDzCL,OAAO,AsBaV,aAAa,EArBjB,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAOC,OAAO,AiDzCL,OAAO,AsBaV,aAAa,EtBrBjB,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,EvEarB,AAAA,QAAC,AAAA,CAOC,OAAO,AiDzCL,OAAO,AsByCV,aAAa,EArBjB,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAOC,OAAO,AiDzCL,OAAO,AsByCV,aAAa,EtBjDjB,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,E3ExCb,AAAA,QAAC,AAAA,CAOC,OAAO,AiDzCL,OAAO,A0B+ER,gBAAgB,EAhBtB,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,EjDyCD,AAAA,QAAC,AAAA,CAOC,OAAO,AiDzCL,OAAO,A0B+ER,gBAAgB,EpBvFtB,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CAOC,OAAO,AuDCN,OAAO,EAlDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe,EvDGhB,AAAA,QAAC,AAAA,CAOC,OAAO,AuDKN,OAAO,EMtDb,AtCsFA,YsCtFY,CAYV,cAAc,E7D8Bb,AAAA,QAAC,AAAA,CAOC,OAAO,A6DxBR,cAAc,EEzBlB,AxCsFA,oBwCtFoB,CAGlB,EAAE,E/DuCD,AAAA,QAAC,AAAA,CAOC,OAAO,A+DrCR,YAAY;E/D+Bd,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuB2CX,WAAW;EvB3CT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CAcb,OAAO,EAdT,AvBsFA,euBtFe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8C7BT,OAAO;E9C6BP,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CAGA,CAAC,AAIE,OAAO,EARd,A1BsFA,Y0BtFY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDvCP,CAAC,AAIE,OAAO;EjDmCZ,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CmBDJ,kBAAkB,CnBQX,OAAO,AmBDZ,aAAa,EnBPf,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB;EpE2ChB,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AmBDZ,aAAa;EpEoCb,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EoE3CX,kBAAkB,CnBAlB,YAAY,CACV,EAAE,CAOG,OAAO,AmBDZ,aAAa,EAPf,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AmBDZ,aAAa;EpEoCb,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CqBDJ,wBAAwB,CrBQjB,OAAO,AqBQZ,aAAa,ErBhBf,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB;EtE2CtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AqBQZ,aAAa;EtE2Bb,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EsE3CX,wBAAwB,CrBAxB,YAAY,CACV,EAAE,CAOG,OAAO,AqBQZ,aAAa,EAhBf,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AqBQZ,aAAa;EtE2Bb,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CtBOnB,OAAO,AsBaV,aAAa,EtBrBjB,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;EvE0CxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AsBaV,aAAa;EvEsBf,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuE3CX,6BAA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CAOG,OAAO,AsBaV,aAAa,EArBjB,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AsBaV,aAAa;EvEsBf,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CtBrBjB,OAAO,AsByCV,aAAa,EtBjDjB,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;EvEctB,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AsByCV,aAAa;EvENf,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuEfX,2BAA2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CAOG,OAAO,AsByCV,aAAa,EArBjB,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AsByCV,aAAa;EvENf,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1B1ET,OAAO,A0B+ER,gBAAgB,E1BvFtB,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;E3EvCd,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,A0B+ER,gBAAgB;E3E5CpB,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E2E4BX,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CAOG,OAAO,A0B+ER,gBAAgB,EAhBtB,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,A0B+ER,gBAAgB;E3E5CpB,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAWb,OAAO,EAlDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDOL,OAAO;EvDPX,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAeb,OAAO,EAtDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDWL,OAAO;EvDXX,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E6D3CX,YAAY,CAYV,cAAc,CAaZ,cAAc,EAzBlB,AtCsFA,YsCtFY,CAYV,cAAc;E7D+Bd,QAAQ,CAAA,AAAA,QAAC,AAAA,E6DlBP,cAAc;E7DkBhB,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E+D3CX,oBAAoB,CAGlB,EAAE,CASA,YAAY,EAZhB,AxCsFA,oBwCtFoB,CAGlB,EAAE;E/DwCF,QAAQ,CAAA,AAAA,QAAC,AAAA,E+D/BP,YAAY;E/D+Bd,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuB2CX,WAAW,AvBzCN,MAAM;EAFT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CAcb,OAAO,A9C+BJ,MAAM,E8C7CX,AvBsFA,euBtFe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8C7BT,OAAO,A9C+BJ,MAAM;EAFT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CAGA,CAAC,AAIE,OAAO,AjDqCT,MAAM,EiD7CX,A1BsFA,Y0BtFY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDvCP,CAAC,AAIE,OAAO,AjDqCT,MAAM;EAFT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CmBDJ,kBAAkB,CnBQX,OAAO,AmBDZ,aAAa,ApEsCV,MAAM,EiD7CX,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB;EpE2ChB,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AmBDZ,aAAa,ApEsCV,MAAM;EAFT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EoE3CX,kBAAkB,CnBAlB,YAAY,CACV,EAAE,CAOG,OAAO,AmBDZ,aAAa,ApEsCV,MAAM,EoE7CX,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AmBDZ,aAAa,ApEsCV,MAAM;EAFT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CqBDJ,wBAAwB,CrBQjB,OAAO,AqBQZ,aAAa,AtE6BV,MAAM,EiD7CX,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB;EtE2CtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AqBQZ,aAAa,AtE6BV,MAAM;EAFT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EsE3CX,wBAAwB,CrBAxB,YAAY,CACV,EAAE,CAOG,OAAO,AqBQZ,aAAa,AtE6BV,MAAM,EsE7CX,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AqBQZ,aAAa,AtE6BV,MAAM;EAFT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CtBOnB,OAAO,AsBaV,aAAa,AvEwBZ,MAAM,EiD7CX,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;EvE0CxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AsBaV,aAAa,AvEwBZ,MAAM;EAFT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuE3CX,6BAA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CAOG,OAAO,AsBaV,aAAa,AvEwBZ,MAAM,EuE7CX,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AsBaV,aAAa,AvEwBZ,MAAM;EAFT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CtBrBjB,OAAO,AsByCV,aAAa,AvEJZ,MAAM,EiD7CX,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;EvEctB,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AsByCV,aAAa,AvEJZ,MAAM;EAFT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuEfX,2BAA2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CAOG,OAAO,AsByCV,aAAa,AvEJZ,MAAM,EuEjBX,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AsByCV,aAAa,AvEJZ,MAAM;EAFT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1B1ET,OAAO,A0B+ER,gBAAgB,A3E1CjB,MAAM,EiD7CX,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;E3EvCd,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,A0B+ER,gBAAgB,A3E1CjB,MAAM;EAFT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E2E4BX,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CAOG,OAAO,A0B+ER,gBAAgB,A3E1CjB,MAAM,E2E0BX,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,A0B+ER,gBAAgB,A3E1CjB,MAAM;EAFT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAWb,OAAO,AvDLR,MAAM,EuD7CX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDOL,OAAO,AvDLR,MAAM;EAFT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAeb,OAAO,AvDTR,MAAM,EuD7CX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDWL,OAAO,AvDTR,MAAM;EAFT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E6D3CX,YAAY,CAYV,cAAc,CAaZ,cAAc,A7DoBb,MAAM,E6D7CX,AtCsFA,YsCtFY,CAYV,cAAc;E7D+Bd,QAAQ,CAAA,AAAA,QAAC,AAAA,E6DlBP,cAAc,A7DoBb,MAAM;EAFT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E+D3CX,oBAAoB,CAGlB,EAAE,CASA,YAAY,A/DiCX,MAAM,E+D7CX,AxCsFA,oBwCtFoB,CAGlB,EAAE;E/DwCF,QAAQ,CAAA,AAAA,QAAC,AAAA,E+D/BP,YAAY,A/DiCX,MAAM;EAFT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuB2CX,WAAW,AvBxCN,MAAM;EAHT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CAcb,OAAO,A9CgCJ,MAAM,E8C9CX,AvBsFA,euBtFe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8C7BT,OAAO,A9CgCJ,MAAM;EAHT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CAGA,CAAC,AAIE,OAAO,AjDsCT,MAAM,EiD9CX,A1BsFA,Y0BtFY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDvCP,CAAC,AAIE,OAAO,AjDsCT,MAAM;EAHT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CmBDJ,kBAAkB,CnBQX,OAAO,AmBDZ,aAAa,ApEuCV,MAAM,EiD9CX,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB;EpE2ChB,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AmBDZ,aAAa,ApEuCV,MAAM;EAHT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EoE3CX,kBAAkB,CnBAlB,YAAY,CACV,EAAE,CAOG,OAAO,AmBDZ,aAAa,ApEuCV,MAAM,EoE9CX,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AmBDZ,aAAa,ApEuCV,MAAM;EAHT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CqBDJ,wBAAwB,CrBQjB,OAAO,AqBQZ,aAAa,AtE8BV,MAAM,EiD9CX,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB;EtE2CtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AqBQZ,aAAa,AtE8BV,MAAM;EAHT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EsE3CX,wBAAwB,CrBAxB,YAAY,CACV,EAAE,CAOG,OAAO,AqBQZ,aAAa,AtE8BV,MAAM,EsE9CX,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AqBQZ,aAAa,AtE8BV,MAAM;EAHT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CtBOnB,OAAO,AsBaV,aAAa,AvEyBZ,MAAM,EiD9CX,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;EvE0CxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AsBaV,aAAa,AvEyBZ,MAAM;EAHT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuE3CX,6BAA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CAOG,OAAO,AsBaV,aAAa,AvEyBZ,MAAM,EuE9CX,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AsBaV,aAAa,AvEyBZ,MAAM;EAHT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CtBrBjB,OAAO,AsByCV,aAAa,AvEHZ,MAAM,EiD9CX,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;EvEctB,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AsByCV,aAAa,AvEHZ,MAAM;EAHT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuEfX,2BAA2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CAOG,OAAO,AsByCV,aAAa,AvEHZ,MAAM,EuElBX,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AsByCV,aAAa,AvEHZ,MAAM;EAHT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1B1ET,OAAO,A0B+ER,gBAAgB,A3EzCjB,MAAM,EiD9CX,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;E3EvCd,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,A0B+ER,gBAAgB,A3EzCjB,MAAM;EAHT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E2E4BX,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CAOG,OAAO,A0B+ER,gBAAgB,A3EzCjB,MAAM,E2EyBX,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,A0B+ER,gBAAgB,A3EzCjB,MAAM;EAHT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAWb,OAAO,AvDJR,MAAM,EuD9CX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDOL,OAAO,AvDJR,MAAM;EAHT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAeb,OAAO,AvDRR,MAAM,EuD9CX,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDWL,OAAO,AvDRR,MAAM;EAHT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E6D3CX,YAAY,CAYV,cAAc,CAaZ,cAAc,A7DqBb,MAAM,E6D9CX,AtCsFA,YsCtFY,CAYV,cAAc;E7D+Bd,QAAQ,CAAA,AAAA,QAAC,AAAA,E6DlBP,cAAc,A7DqBb,MAAM;EAHT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E+D3CX,oBAAoB,CAGlB,EAAE,CASA,YAAY,A/DkCX,MAAM,E+D9CX,AxCsFA,oBwCtFoB,CAGlB,EAAE;E/DwCF,QAAQ,CAAA,AAAA,QAAC,AAAA,E+D/BP,YAAY,A/DkCX,MAAM;EAHT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuB2CX,WAAW,AvBvCN,MAAM;EAJT,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,C9C+CV,MAAM,A8CjCT,OAAO,EAdT,AvBsFA,euBtFe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,A8CjCT,OAAO;E9C6BP,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CAGA,CAAC,AjD2CA,MAAM,AiDvCJ,OAAO,EARd,A1BsFA,Y0BtFY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDvCP,CAAC,AjD2CA,MAAM,AiDvCJ,OAAO;EjDmCZ,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CmBDJ,kBAAkB,CpE+Cb,MAAM,AiDvCJ,OAAO,AmBDZ,aAAa,EnBPf,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB;EpE2ChB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AiDvCJ,OAAO,AmBDZ,aAAa;EpEoCb,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EoE3CX,kBAAkB,CnBAlB,YAAY,CACV,EAAE,CjD8CC,MAAM,AiDvCJ,OAAO,AmBDZ,aAAa,EAPf,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AiDvCJ,OAAO,AmBDZ,aAAa;EpEoCb,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CqBDJ,wBAAwB,CtE+CnB,MAAM,AiDvCJ,OAAO,AqBQZ,aAAa,ErBhBf,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB;EtE2CtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AiDvCJ,OAAO,AqBQZ,aAAa;EtE2Bb,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EsE3CX,wBAAwB,CrBAxB,YAAY,CACV,EAAE,CjD8CC,MAAM,AiDvCJ,OAAO,AqBQZ,aAAa,EAhBf,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AiDvCJ,OAAO,AqBQZ,aAAa;EtE2Bb,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvE8CrB,MAAM,AiDvCJ,OAAO,AsBaV,aAAa,EtBrBjB,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;EvE0CxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AiDvCJ,OAAO,AsBaV,aAAa;EvEsBf,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuE3CX,6BAA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjD8CC,MAAM,AiDvCJ,OAAO,AsBaV,aAAa,EArBjB,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AiDvCJ,OAAO,AsBaV,aAAa;EvEsBf,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEkBnB,MAAM,AiDvCJ,OAAO,AsByCV,aAAa,EtBjDjB,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;EvEctB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AiDvCJ,OAAO,AsByCV,aAAa;EvENf,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuEfX,2BAA2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjD8CC,MAAM,AiDvCJ,OAAO,AsByCV,aAAa,EArBjB,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AiDvCJ,OAAO,AsByCV,aAAa;EvENf,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3EnCX,MAAM,AiDvCJ,OAAO,A0B+ER,gBAAgB,E1BvFtB,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;E3EvCd,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AiDvCJ,OAAO,A0B+ER,gBAAgB;E3E5CpB,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E2E4BX,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjD8CC,MAAM,AiDvCJ,OAAO,A0B+ER,gBAAgB,EAhBtB,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AiDvCJ,OAAO,A0B+ER,gBAAgB;E3E5CpB,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CvDQd,MAAM,AuDGL,OAAO,EAlDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AuDGL,OAAO;EvDPX,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CvDQd,MAAM,AuDOL,OAAO,EAtDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,AuDOL,OAAO;EvDXX,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E6D3CX,YAAY,CAYV,cAAc,C7DmCX,MAAM,A6DtBP,cAAc,EAzBlB,AtCsFA,YsCtFY,CAYV,cAAc;E7D+Bd,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,A6DtBP,cAAc;E7DkBhB,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E+D3CX,oBAAoB,CAGlB,EAAE,C/D4CC,MAAM,A+DnCP,YAAY,EAZhB,AxCsFA,oBwCtFoB,CAGlB,EAAE;E/DwCF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAIN,MAAM,A+DnCP,YAAY;E/D+Bd,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuB2CX,WAAW,AvBtCN,OAAO;EALV,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,CAcb,OAAO,A9CkCJ,OAAO,E8ChDZ,AvBsFA,euBtFe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,E8C7BT,OAAO,A9CkCJ,OAAO;EALV,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CAGA,CAAC,AAIE,OAAO,AjDwCT,OAAO,EiDhDZ,A1BsFA,Y0BtFY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDvCP,CAAC,AAIE,OAAO,AjDwCT,OAAO;EALV,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CmBDJ,kBAAkB,CnBQX,OAAO,AmBDZ,aAAa,ApEyCV,OAAO,EiDhDZ,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB;EpE2ChB,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AmBDZ,aAAa,ApEyCV,OAAO;EALV,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EoE3CX,kBAAkB,CnBAlB,YAAY,CACV,EAAE,CAOG,OAAO,AmBDZ,aAAa,ApEyCV,OAAO,EoEhDZ,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AmBDZ,aAAa,ApEyCV,OAAO;EALV,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CqBDJ,wBAAwB,CrBQjB,OAAO,AqBQZ,aAAa,AtEgCV,OAAO,EiDhDZ,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB;EtE2CtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AqBQZ,aAAa,AtEgCV,OAAO;EALV,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EsE3CX,wBAAwB,CrBAxB,YAAY,CACV,EAAE,CAOG,OAAO,AqBQZ,aAAa,AtEgCV,OAAO,EsEhDZ,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AqBQZ,aAAa,AtEgCV,OAAO;EALV,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CtBOnB,OAAO,AsBaV,aAAa,AvE2BZ,OAAO,EiDhDZ,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;EvE0CxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AsBaV,aAAa,AvE2BZ,OAAO;EALV,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuE3CX,6BAA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CAOG,OAAO,AsBaV,aAAa,AvE2BZ,OAAO,EuEhDZ,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AsBaV,aAAa,AvE2BZ,OAAO;EALV,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CtBrBjB,OAAO,AsByCV,aAAa,AvEDZ,OAAO,EiDhDZ,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;EvEctB,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AsByCV,aAAa,AvEDZ,OAAO;EALV,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuEfX,2BAA2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CAOG,OAAO,AsByCV,aAAa,AvEDZ,OAAO,EuEpBZ,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,AsByCV,aAAa,AvEDZ,OAAO;EALV,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1B1ET,OAAO,A0B+ER,gBAAgB,A3EvCjB,OAAO,EiDhDZ,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;E3EvCd,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,A0B+ER,gBAAgB,A3EvCjB,OAAO;EALV,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E2E4BX,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CAOG,OAAO,A0B+ER,gBAAgB,A3EvCjB,OAAO,E2EuBZ,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDnCJ,OAAO,A0B+ER,gBAAgB,A3EvCjB,OAAO;EALV,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAWb,OAAO,AvDFR,OAAO,EuDhDZ,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDOL,OAAO,AvDFR,OAAO;EALV,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CAeb,OAAO,AvDNR,OAAO,EuDhDZ,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EuDWL,OAAO,AvDNR,OAAO;EALV,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E6D3CX,YAAY,CAYV,cAAc,CAaZ,cAAc,A7DuBb,OAAO,E6DhDZ,AtCsFA,YsCtFY,CAYV,cAAc;E7D+Bd,QAAQ,CAAA,AAAA,QAAC,AAAA,E6DlBP,cAAc,A7DuBb,OAAO;EALV,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E+D3CX,oBAAoB,CAGlB,EAAE,CASA,YAAY,A/DoCX,OAAO,E+DhDZ,AxCsFA,oBwCtFoB,CAGlB,EAAE;E/DwCF,QAAQ,CAAA,AAAA,QAAC,AAAA,E+D/BP,YAAY,A/DoCX,OAAO;EALV,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuB2CX,WAAW,AvBrCN,OAAO;EANV,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E8C3CX,eAAe,C9CiDV,OAAO,A8CnCV,OAAO,EAdT,AvBsFA,euBtFe;E9C2Cb,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,A8CnCV,OAAO;E9C6BP,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CAGA,CAAC,AjD6CA,OAAO,AiDzCL,OAAO,EARd,A1BsFA,Y0BtFY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EiDvCP,CAAC,AjD6CA,OAAO,AiDzCL,OAAO;EjDmCZ,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CmBDJ,kBAAkB,CpEiDb,OAAO,AiDzCL,OAAO,AmBDZ,aAAa,EnBPf,A1BsFA,Y0BtFY,CACV,EAAE,CmBDJ,kBAAkB;EpE2ChB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AiDzCL,OAAO,AmBDZ,aAAa;EpEoCb,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EoE3CX,kBAAkB,CnBAlB,YAAY,CACV,EAAE,CjDgDC,OAAO,AiDzCL,OAAO,AmBDZ,aAAa,EAPf,A7CsFA,kB6CtFkB,CnBAlB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AiDzCL,OAAO,AmBDZ,aAAa;EpEoCb,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CqBDJ,wBAAwB,CtEiDnB,OAAO,AiDzCL,OAAO,AqBQZ,aAAa,ErBhBf,A1BsFA,Y0BtFY,CACV,EAAE,CqBDJ,wBAAwB;EtE2CtB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AiDzCL,OAAO,AqBQZ,aAAa;EtE2Bb,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EsE3CX,wBAAwB,CrBAxB,YAAY,CACV,EAAE,CjDgDC,OAAO,AiDzCL,OAAO,AqBQZ,aAAa,EAhBf,A/CsFA,wB+CtFwB,CrBAxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AiDzCL,OAAO,AqBQZ,aAAa;EtE2Bb,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CvEgDrB,OAAO,AiDzCL,OAAO,AsBaV,aAAa,EtBrBjB,A1BsFA,Y0BtFY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;EvE0CxB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AiDzCL,OAAO,AsBaV,aAAa;EvEsBf,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuE3CX,6BAA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CjDgDC,OAAO,AiDzCL,OAAO,AsBaV,aAAa,EArBjB,AhDsFA,6BgDtF6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AiDzCL,OAAO,AsBaV,aAAa;EvEsBf,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CvEoBnB,OAAO,AiDzCL,OAAO,AsByCV,aAAa,EtBjDjB,A1BsFA,Y0BtFY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;EvEctB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AiDzCL,OAAO,AsByCV,aAAa;EvENf,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuEfX,2BAA2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CjDgDC,OAAO,AiDzCL,OAAO,AsByCV,aAAa,EArBjB,AhD0DA,2BgD1D2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AiDzCL,OAAO,AsByCV,aAAa;EvENf,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EiD3CX,YAAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C3EjCX,OAAO,AiDzCL,OAAO,A0B+ER,gBAAgB,E1BvFtB,A1BsFA,Y0BtFY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;E3EvCd,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AiDzCL,OAAO,A0B+ER,gBAAgB;E3E5CpB,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E2E4BX,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CjDgDC,OAAO,AiDzCL,OAAO,A0B+ER,gBAAgB,EAhBtB,ApDeA,sBoDfsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;EjD0CF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AiDzCL,OAAO,A0B+ER,gBAAgB;E3E5CpB,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CvDUd,OAAO,AuDCN,OAAO,EAlDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AuDCN,OAAO;EvDPX,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,EuD3CX,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CvDUd,OAAO,AuDKN,OAAO,EAtDb,AhCsFA,iBgCtFiB,CA2Bf,cAAc,CAYZ,eAAe;EvDIjB,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,AuDKN,OAAO;EvDXX,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E6D3CX,YAAY,CAYV,cAAc,C7DqCX,OAAO,A6DxBR,cAAc,EAzBlB,AtCsFA,YsCtFY,CAYV,cAAc;E7D+Bd,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,A6DxBR,cAAc;E7DkBhB,AuB2CF,QvB3CU,CAAA,AAAA,QAAC,AAAA,E+D3CX,oBAAoB,CAGlB,EAAE,C/D8CC,OAAO,A+DrCR,YAAY,EAZhB,AxCsFA,oBwCtFoB,CAGlB,EAAE;E/DwCF,QAAQ,CAAA,AAAA,QAAC,AAAA,EAMN,OAAO,A+DrCR,YAAY,C/DqCH;IACP,gBAAgB,EhB7BE,OAAO;IgB8BrB,YAAY,EhB0HW,OAAM,GgBzHlC;EuBkCL,AvB/BE,WuB+BS,CvB/BT,MAAM,E8CvDR,A9CuDE,e8CvDa,CAcb,OAAO,C9CyCP,MAAM,EiDvDR,AjDuDE,YiDvDU,CACV,EAAE,CAGA,CAAC,AAIE,OAAO,CjD+CZ,MAAM,EiDvDR,AjDuDE,YiDvDU,CACV,EAAE,CmBDJ,kBAAkB,CnBQX,OAAO,AmBDZ,aAAa,CpEgDb,MAAM,EoEvDR,ApEuDE,kBoEvDgB,CnBAlB,YAAY,CACV,EAAE,CAOG,OAAO,AmBDZ,aAAa,CpEgDb,MAAM,EiDvDR,AjDuDE,YiDvDU,CACV,EAAE,CqBDJ,wBAAwB,CrBQjB,OAAO,AqBQZ,aAAa,CtEuCb,MAAM,EsEvDR,AtEuDE,wBsEvDsB,CrBAxB,YAAY,CACV,EAAE,CAOG,OAAO,AqBQZ,aAAa,CtEuCb,MAAM,EiDvDR,AjDuDE,YiDvDU,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CtBOnB,OAAO,AsBaV,aAAa,CvEkCf,MAAM,EuEvDR,AvEuDE,6BuEvD2B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CAOG,OAAO,AsBaV,aAAa,CvEkCf,MAAM,EiDvDR,AjDuDE,YiDvDU,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CtBrBjB,OAAO,AsByCV,aAAa,CvEMf,MAAM,EuE3BR,AvE2BE,2BuE3ByB,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CAOG,OAAO,AsByCV,aAAa,CvEMf,MAAM,EiDvDR,AjDuDE,YiDvDU,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1B1ET,OAAO,A0B+ER,gBAAgB,C3EhCpB,MAAM,E2EgBR,A3EhBE,sB2EgBoB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CAOG,OAAO,A0B+ER,gBAAgB,C3EhCpB,MAAM,EuDvDR,AvDuDE,iBuDvDe,CA2Bf,cAAc,CAYZ,eAAe,CAWb,OAAO,CvDKX,MAAM,EuDvDR,AvDuDE,iBuDvDe,CA2Bf,cAAc,CAYZ,eAAe,CAeb,OAAO,CvDCX,MAAM,E6DvDR,A7DuDE,Y6DvDU,CAYV,cAAc,CAaZ,cAAc,C7D8BhB,MAAM,E+DvDR,A/DuDE,oB+DvDkB,CAGlB,EAAE,CASA,YAAY,C/D2Cd,MAAM,CAAC;IACL,KAAK,EhBnCe,OAAO;IgBoC3B,gBAAgB,EhBkHa,IAAI,GgBjHlC;;AuBqCH,AAAA,SAAS,CAAC;EACR,KAAK,EvC/EiB,OAAM;EuCgF5B,WAAW,EAAE,MAAO;EACpB,aAAa,EAAE,CAAE,GA8BlB;EAjCD,AAAA,SAAS,EAAT,AAAA,SAAS,AAMN,OAAO,EANV,AAAA,SAAS,AAON,OAAO,EAPV,AAAA,SAAS,CAQN,AAAA,QAAC,AAAA;EACF,AATF,QASU,CAAA,AAAA,QAAC,AAAA,EATX,SAAS,CASc;IACnB,gBAAgB,EAAE,WAAY;IzBrChC,kBAAkB,EyBsCI,IAAI;IzBrClB,UAAU,EyBqCI,IAAI,GACzB;EAZH,AAAA,SAAS,EAAT,AAAA,SAAS,AAcN,MAAM,EAdT,AAAA,SAAS,AAeN,MAAM,EAfT,AAAA,SAAS,AAgBN,OAAO,CAAC;IACP,YAAY,EAAE,WAAY,GAC3B;EAlBH,AAAA,SAAS,AAmBN,MAAM,EAnBT,AAAA,SAAS,AAoBN,MAAM,CAAC;IACN,KAAK,EvChFe,OAAM;IuCiF1B,eAAe,EvC/EK,SAAS;IuCgF7B,gBAAgB,EAAE,WAAY,GAC/B;EAxBH,AAAA,SAAS,CAyBN,AAAA,QAAC,AAAA,CAEC,MAAM,EA3BX,AAAA,SAAS,CAyBN,AAAA,QAAC,AAAA,CAGC,MAAM;EAFT,AA1BF,QA0BU,CAAA,AAAA,QAAC,AAAA,EA1BX,SAAS,AA2BJ,MAAM;EADT,AA1BF,QA0BU,CAAA,AAAA,QAAC,AAAA,EA1BX,SAAS,AA4BJ,MAAM,CAAC;IACN,KAAK,EvC9Gc,OAAO;IuC+G1B,eAAe,EAAE,IAAK,GACvB;;AAQL,AAAA,OAAO,CAAC;EvBvEN,OAAO,EhBkCmB,IAAI,CACJ,IAAI;EgBlC9B,SAAS,EhBZe,IAAI;EgBa5B,WAAW,EhByCe,OAAS;EgBxCnC,aAAa,EhB4Ca,GAAG,GuC2B9B;;AACD,AAAA,OAAO,EuB1IP,AvB0IA,euB1Ie,CAIb,cAAc,EIJhB,A3B0IA,sB2B1IsB,EKAtB,AhC0IA,iBgC1IiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,ChCkGZ;EvB3EN,OAAO,EhBqCmB,GAAG,CACH,IAAI;EgBrC9B,SAAS,EhBXe,IAAI;EgBY5B,WAAW,EhB0Ce,GAAG;EgBzC7B,aAAa,EhB6Ca,GAAG,GuC8B9B;;AACD,AAAA,OAAO,E0B9IP,A1B8IA,Y0B9IY,AAcT,MAAM,CACL,EAAE,CACA,CAAC,EAhBP,A1B8IA,Y0B9IY,AAcT,MAAM,CACL,EAAE,CmBfN,kBAAkB,CAOhB,aAAa,EAPf,A7C8IA,kB6C9IkB,CnBAlB,YAAY,AAcT,MAAM,CACL,EAAE,CmBRJ,aAAa,EnBPf,A1B8IA,Y0B9IY,AAcT,MAAM,CACL,EAAE,CqBfN,wBAAwB,CAgBtB,aAAa,EAhBf,A/C8IA,wB+C9IwB,CrBAxB,YAAY,AAcT,MAAM,CACL,EAAE,CqBCJ,aAAa,ErBhBf,A1B8IA,Y0B9IY,AAcT,MAAM,CACL,EAAE,CsBfN,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,EArBjB,AhD8IA,6BgD9I6B,CAC3B,wBAAwB,CtBD1B,YAAY,AAcT,MAAM,CACL,EAAE,CsBMF,aAAa,EtBrBjB,A1B8IA,Y0B9IY,AAcT,MAAM,CACL,EAAE,CsBaN,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,EArBjB,AhDkHA,2BgDlH2B,CACzB,sBAAsB,CtB7BxB,YAAY,AAcT,MAAM,CACL,EAAE,CsBkCF,aAAa,EtBjDjB,A1B8IA,Y0B9IY,AAcT,MAAM,CACL,EAAE,C0BwDN,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,EAhBtB,ApDuEA,sBoDvEsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,AAcT,MAAM,CACL,EAAE,C0BwEA,gBAAgB,EdvFtB,AtC8IA,YsC9IY,CAYV,cAAc,CACZ,MAAM,EEbV,AxC8IA,oBwC9IoB,CAGlB,EAAE,CASA,YAAY,ECZhB,AzC8IA,+ByC9I+B,CAC7B,iBAAiB,CACf,gBAAgB,CzC4IZ;EvB/EN,OAAO,EhBwCmB,GAAG,CACH,GAAG;EgBxC7B,SAAS,EhBXe,IAAI;EgBY5B,WAAW,EhB0Ce,GAAG;EgBzC7B,aAAa,EhB6Ca,GAAG,GuCiC9B;;AAMD,AAAA,UAAU,E2BtJV,A3BsJA,sB2BtJsB,C3BsJX;EACT,OAAO,EAAE,KAAM;EACf,KAAK,EAAE,IAAK,GACb;;AAGD,AAAa,UAAH,GAAG,UAAU,E2B5JvB,A3B4Ja,sB2B5JS,G3B4JT,UAAU,EAAvB,AAAW,UAAD,G2B5JV,sBAAsB,EAAtB,A3B4JW,sB2B5JW,GAAtB,sBAAsB,C3B4JE;EACtB,UAAU,EAAE,GAAI,GACjB;;AAGD,AAAmB,KAAd,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,CAGH,UAAU,EAHb,AAAA,KAAK,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,C2BjKN,sBAAsB;A3BkKtB,AAAkB,KAAb,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,CAEH,UAAU;AAFb,AADoB,KACf,CAAA,AAAA,IAAC,CAAK,OAAO,AAAZ,C2BlKN,sBAAsB;A3BmKtB,AAAmB,KAAd,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,CACH,UAAU;AADb,AADmB,KACd,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,C2BnKN,sBAAsB,C3BoKR;EACV,KAAK,EAAE,IAAK,GACb;;ACjKH,AAAA,WAAW,CAAC;EACV,OAAO,ExCoxBuB,GAAG,CACH,IAAI;EwCpxBlC,aAAa,ExC0DW,IAAK;EwCzD7B,UAAU,EAAE,IAAK;EACjB,gBAAgB,ExCoxBc,OAAO;EwCnxBrC,aAAa,ExCmGa,GAAG,GwCpF9B;EApBD,AAOI,WAPO,GAOP,EAAE,CAAC;IACH,OAAO,EAAE,YAAa,GAOvB;IAfH,AAUQ,WAVG,GAOP,EAAE,GAGA,EAAE,AAAA,OAAO,CAAC;MACV,OAAO,EAAE,KAA+B;MACxC,OAAO,EAAE,KAAM;MACf,KAAK,ExC6wBqB,IAAI,GwC5wB/B;EAdL,AAiBI,WAjBO,GAiBP,OAAO,CAAC;IACR,KAAK,ExCTgB,OAAO,GwCU7B;;ACrBH,AAAA,WAAW,CAAC;EACV,OAAO,EAAE,YAAa;EACtB,YAAY,EAAE,CAAE;EAChB,MAAM,EzC2DkB,IAAK,CyC3DC,CAAC;EAC/B,aAAa,EzCsGa,GAAG,GyClC9B;EAxED,AAMI,WANO,GAMP,EAAE,CAAC;IACH,OAAO,EAAE,MAAO,GA0BjB;IAjCH,AAQM,WARK,GAMP,EAAE,GAEA,CAAC,E2CXP,A3CWI,kB2CXc,C3CGlB,WAAW,GAMP,EAAE,G2CFJ,aAAa,EEPf,A7CWI,wB6CXoB,C7CGxB,WAAW,GAMP,EAAE,G6COJ,aAAa,EChBf,A9CWI,6B8CXyB,CAC3B,wBAAwB,C9CE1B,WAAW,GAMP,EAAE,G8CYF,aAAa,EAOjB,A9CjBI,2B8CiBuB,CACzB,sBAAsB,C9C1BxB,WAAW,GAMP,EAAE,G8CwCF,aAAa,EIsBjB,AlD5DI,sBkD4DkB,CACpB,YAAY,CAUV,YAAY,ClD/EhB,WAAW,GAMP,EAAE,GkD8EA,gBAAgB;IlDpFtB,AASM,WATK,GAMP,EAAE,GAGA,IAAI,CAAC;MACL,QAAQ,EAAE,QAAS;MACnB,KAAK,EAAE,IAAK;MACZ,OAAO,EzC+Ee,GAAG,CACH,IAAI;MyC/E1B,WAAW,EzC+CS,OAAW;MyC9C/B,eAAe,EAAE,IAAK;MACtB,KAAK,EzCDa,OAAM;MyCExB,gBAAgB,EzCobiB,IAAI;MyCnbrC,MAAM,EAAE,GAAG,CAAC,KAAK,CzCobgB,IAAI;MyCnbrC,WAAW,EAAE,IAAK,GACnB;IAnBL,AAqBQ,WArBG,GAMP,EAAE,AAcD,YAAY,GACT,CAAC,E2CxBT,A3CwBM,kB2CxBY,C3CGlB,WAAW,GAMP,EAAE,AAcD,YAAY,G2ChBf,aAAa,EEPf,A7CwBM,wB6CxBkB,C7CGxB,WAAW,GAMP,EAAE,AAcD,YAAY,G6CPf,aAAa,EChBf,A9CwBM,6B8CxBuB,CAC3B,wBAAwB,C9CE1B,WAAW,GAMP,EAAE,AAcD,YAAY,G8CFb,aAAa,EAOjB,A9CJM,2B8CIqB,CACzB,sBAAsB,C9C1BxB,WAAW,GAMP,EAAE,AAcD,YAAY,G8C0Bb,aAAa,EIsBjB,AlD/CM,sBkD+CgB,CACpB,YAAY,CAUV,YAAY,ClD/EhB,WAAW,GAMP,EAAE,AAcD,YAAY,GkDgEX,gBAAgB;IlDpFtB,AAsBQ,WAtBG,GAMP,EAAE,AAcD,YAAY,GAET,IAAI,CAAC;MACL,WAAW,EAAE,CAAE;MhBXrB,yBAAyB,EzB8FC,GAAG;MyB7F1B,sBAAsB,EzB6FC,GAAG,GyCjFxB;IAzBP,AA4BQ,WA5BG,GAMP,EAAE,AAqBD,WAAW,GACR,CAAC,E2C/BT,A3C+BM,kB2C/BY,C3CGlB,WAAW,GAMP,EAAE,AAqBD,WAAW,G2CvBd,aAAa,EEPf,A7C+BM,wB6C/BkB,C7CGxB,WAAW,GAMP,EAAE,AAqBD,WAAW,G6Cdd,aAAa,EChBf,A9C+BM,6B8C/BuB,CAC3B,wBAAwB,C9CE1B,WAAW,GAMP,EAAE,AAqBD,WAAW,G8CTZ,aAAa,EAOjB,A9CGM,2B8CHqB,CACzB,sBAAsB,C9C1BxB,WAAW,GAMP,EAAE,AAqBD,WAAW,G8CmBZ,aAAa,EIsBjB,AlDxCM,sBkDwCgB,CACpB,YAAY,CAUV,YAAY,ClD/EhB,WAAW,GAMP,EAAE,AAqBD,WAAW,GkDyDV,gBAAgB;IlDpFtB,AA6BQ,WA7BG,GAMP,EAAE,AAqBD,WAAW,GAER,IAAI,CAAC;MhBzBX,0BAA0B,EzBsGA,GAAG;MyBrG1B,uBAAuB,EzBqGA,GAAG,GyC3ExB;EA/BP,AAmCS,WAnCE,GAmCP,EAAE,GAAG,CAAC,AAEL,MAAM,E2CxCX,A3CsCO,kB2CtCW,C3CGlB,WAAW,GAmCP,EAAE,G2C/BJ,aAAa,A3CiCV,MAAM,E6CxCX,A7CsCO,wB6CtCiB,C7CGxB,WAAW,GAmCP,EAAE,G6CtBJ,aAAa,A7CwBV,MAAM,E8CxCX,A9CsCO,6B8CtCsB,CAC3B,wBAAwB,C9CE1B,WAAW,GAmCP,EAAE,G8CjBF,aAAa,A9CmBZ,MAAM,E8CZX,A9CUO,2B8CVoB,CACzB,sBAAsB,C9C1BxB,WAAW,GAmCP,EAAE,G8CWF,aAAa,A9CTZ,MAAM,EkD+BX,AlDjCO,sBkDiCe,CACpB,YAAY,CAUV,YAAY,ClD/EhB,WAAW,GAmCP,EAAE,GkDiDA,gBAAgB,AlD/CjB,MAAM,EArCX,AAmCS,WAnCE,GAmCP,EAAE,GAAG,CAAC,AAGL,MAAM,E2CzCX,A3CsCO,kB2CtCW,C3CGlB,WAAW,GAmCP,EAAE,G2C/BJ,aAAa,A3CkCV,MAAM,E6CzCX,A7CsCO,wB6CtCiB,C7CGxB,WAAW,GAmCP,EAAE,G6CtBJ,aAAa,A7CyBV,MAAM,E8CzCX,A9CsCO,6B8CtCsB,CAC3B,wBAAwB,C9CE1B,WAAW,GAmCP,EAAE,G8CjBF,aAAa,A9CoBZ,MAAM,E8CbX,A9CUO,2B8CVoB,CACzB,sBAAsB,C9C1BxB,WAAW,GAmCP,EAAE,G8CWF,aAAa,A9CRZ,MAAM,EkD8BX,AlDjCO,sBkDiCe,CACpB,YAAY,CAUV,YAAY,ClD/EhB,WAAW,GAmCP,EAAE,GkDiDA,gBAAgB,AlD9CjB,MAAM;EAtCX,AAoCS,WApCE,GAoCP,EAAE,GAAG,IAAI,AACR,MAAM;EArCX,AAoCS,WApCE,GAoCP,EAAE,GAAG,IAAI,AAER,MAAM,CAAC;IACN,OAAO,EAAE,CAAE;IACX,KAAK,EzCPa,OAAM;IyCQxB,gBAAgB,EzC7BG,OAAO;IyC8B1B,YAAY,EzC+ZqB,IAAI,GyC9ZtC;EA3CL,AA8Cc,WA9CH,GA8CP,OAAO,GAAG,CAAC,E2CjDf,A3CiDY,kB2CjDM,C3CGlB,WAAW,GA8CP,OAAO,G2C1CT,aAAa,EEPf,A7CiDY,wB6CjDY,C7CGxB,WAAW,GA8CP,OAAO,G6CjCT,aAAa,EChBf,A9CiDY,6B8CjDiB,CAC3B,wBAAwB,C9CE1B,WAAW,GA8CP,OAAO,G8C5BP,aAAa,EAOjB,A9CqBY,2B8CrBe,CACzB,sBAAsB,C9C1BxB,WAAW,GA8CP,OAAO,G8CAP,aAAa,EIsBjB,AlDtBY,sBkDsBU,CACpB,YAAY,CAUV,YAAY,ClD/EhB,WAAW,GA8CP,OAAO,GkDsCL,gBAAgB,ElDpFtB,AA8Cc,WA9CH,GA8CP,OAAO,GAAG,CAAC,AAGV,MAAM,E2CpDX,A3CiDY,kB2CjDM,C3CGlB,WAAW,GA8CP,OAAO,G2C1CT,aAAa,A3C6CV,MAAM,E6CpDX,A7CiDY,wB6CjDY,C7CGxB,WAAW,GA8CP,OAAO,G6CjCT,aAAa,A7CoCV,MAAM,E8CpDX,A9CiDY,6B8CjDiB,CAC3B,wBAAwB,C9CE1B,WAAW,GA8CP,OAAO,G8C5BP,aAAa,A9C+BZ,MAAM,E8CxBX,A9CqBY,2B8CrBe,CACzB,sBAAsB,C9C1BxB,WAAW,GA8CP,OAAO,G8CAP,aAAa,A9CGZ,MAAM,EkDmBX,AlDtBY,sBkDsBU,CACpB,YAAY,CAUV,YAAY,ClD/EhB,WAAW,GA8CP,OAAO,GkDsCL,gBAAgB,AlDnCjB,MAAM,EAjDX,AA8Cc,WA9CH,GA8CP,OAAO,GAAG,CAAC,AAIV,MAAM,E2CrDX,A3CiDY,kB2CjDM,C3CGlB,WAAW,GA8CP,OAAO,G2C1CT,aAAa,A3C8CV,MAAM,E6CrDX,A7CiDY,wB6CjDY,C7CGxB,WAAW,GA8CP,OAAO,G6CjCT,aAAa,A7CqCV,MAAM,E8CrDX,A9CiDY,6B8CjDiB,CAC3B,wBAAwB,C9CE1B,WAAW,GA8CP,OAAO,G8C5BP,aAAa,A9CgCZ,MAAM,E8CzBX,A9CqBY,2B8CrBe,CACzB,sBAAsB,C9C1BxB,WAAW,GA8CP,OAAO,G8CAP,aAAa,A9CIZ,MAAM,EkDkBX,AlDtBY,sBkDsBU,CACpB,YAAY,CAUV,YAAY,ClD/EhB,WAAW,GA8CP,OAAO,GkDsCL,gBAAgB,AlDlCjB,MAAM;EAlDX,AA+Cc,WA/CH,GA+CP,OAAO,GAAG,IAAI;EA/ClB,AA+Cc,WA/CH,GA+CP,OAAO,GAAG,IAAI,AAEb,MAAM;EAjDX,AA+Cc,WA/CH,GA+CP,OAAO,GAAG,IAAI,AAGb,MAAM,CAAC;IACN,OAAO,EAAE,CAAE;IACX,KAAK,EzCuZ4B,IAAI;IyCtZrC,gBAAgB,EzCvCE,OAAM;IyCwCxB,YAAY,EzCxCM,OAAM;IyCyCxB,MAAM,EAAE,OAAQ,GACjB;EAxDL,AA4DM,WA5DK,GA2DP,SAAS,GACP,IAAI;EA5DV,AA6DU,WA7DC,GA2DP,SAAS,GAEP,IAAI,AAAA,MAAM;EA7DhB,AA8DU,WA9DC,GA2DP,SAAS,GAGP,IAAI,AAAA,MAAM;EA9DhB,AA+DM,WA/DK,GA2DP,SAAS,GAIP,CAAC,E2ClEP,A3CkEI,kB2ClEc;E3CGlB,WAAW,GA2DP,SAAS,G2CvDX,aAAa,EEPf,A7CkEI,wB6ClEoB;E7CGxB,WAAW,GA2DP,SAAS,G6C9CX,aAAa,EChBf,A9CkEI,6B8ClEyB,CAC3B,wBAAwB;E9CE1B,WAAW,GA2DP,SAAS,G8CzCT,aAAa,EAOjB,A9CsCI,2B8CtCuB,CACzB,sBAAsB;E9C1BxB,WAAW,GA2DP,SAAS,G8CbT,aAAa,EIsBjB,AlDLI,sBkDKkB,CACpB,YAAY,CAUV,YAAY;ElD/EhB,WAAW,GA2DP,SAAS,GkDyBP,gBAAgB;ElDpFtB,AAgEO,WAhEI,GA2DP,SAAS,GAKP,CAAC,AAAA,MAAM,E2CnEb,A3CmEI,kB2CnEc;E3CGlB,WAAW,GA2DP,SAAS,G2CvDX,aAAa,A3C4DR,MAAM,E6CnEb,A7CmEI,wB6CnEoB;E7CGxB,WAAW,GA2DP,SAAS,G6C9CX,aAAa,A7CmDR,MAAM,E8CnEb,A9CmEI,6B8CnEyB,CAC3B,wBAAwB;E9CE1B,WAAW,GA2DP,SAAS,G8CzCT,aAAa,A9C8CV,MAAM,E8CvCb,A9CuCI,2B8CvCuB,CACzB,sBAAsB;E9C1BxB,WAAW,GA2DP,SAAS,G8CbT,aAAa,A9CkBV,MAAM,EkDIb,AlDJI,sBkDIkB,CACpB,YAAY,CAUV,YAAY;ElD/EhB,WAAW,GA2DP,SAAS,GkDyBP,gBAAgB,AlDpBf,MAAM;EAhEb,AAiEO,WAjEI,GA2DP,SAAS,GAMP,CAAC,AAAA,MAAM,E2CpEb,A3CoEI,kB2CpEc;E3CGlB,WAAW,GA2DP,SAAS,G2CvDX,aAAa,A3C6DR,MAAM,E6CpEb,A7CoEI,wB6CpEoB;E7CGxB,WAAW,GA2DP,SAAS,G6C9CX,aAAa,A7CoDR,MAAM,E8CpEb,A9CoEI,6B8CpEyB,CAC3B,wBAAwB;E9CE1B,WAAW,GA2DP,SAAS,G8CzCT,aAAa,A9C+CV,MAAM,E8CxCb,A9CwCI,2B8CxCuB,CACzB,sBAAsB;E9C1BxB,WAAW,GA2DP,SAAS,G8CbT,aAAa,A9CmBV,MAAM,EkDGb,AlDHI,sBkDGkB,CACpB,YAAY,CAUV,YAAY;ElD/EhB,WAAW,GA2DP,SAAS,GkDyBP,gBAAgB,AlDnBf,MAAM,CAAC;IACR,KAAK,EzCvDc,OAAO;IyCwD1B,gBAAgB,EzC6YiB,IAAI;IyC5YrC,YAAY,EzC6YqB,IAAI;IyC5YrC,MAAM,EzC+JqB,WAAW,GyC9JvC;;AAQL,AvB7EM,cuB6EQ,GvB9EV,EAAE,GACA,CAAC,EkEJP,AlEII,kBkEJc,C3CiFlB,cAAc,GvB9EV,EAAE,GkEIJ,aAAa,EEPf,ApEII,wBoEJoB,C7CiFxB,cAAc,GvB9EV,EAAE,GoEaJ,aAAa,EChBf,ArEII,6BqEJyB,CAC3B,wBAAwB,C9CgF1B,cAAc,GvB9EV,EAAE,GqEkBF,aAAa,EAOjB,ArExBI,2BqEwBuB,CACzB,sBAAsB,C9CoDxB,cAAc,GvB9EV,EAAE,GqE8CF,aAAa,EIsBjB,AzEnEI,sByEmEkB,CACpB,YAAY,CAUV,YAAY,ClDDhB,cAAc,GvB9EV,EAAE,GyEoFA,gBAAgB;AlDNtB,AvB5EM,cuB4EQ,GvB9EV,EAAE,GAEA,IAAI,CAAC;EACL,OAAO,ElB2Fe,IAAI,CACJ,IAAI;EkB3F1B,SAAS,ElB6CW,IAAI;EkB5CxB,WAAW,ElBkGW,OAAS,GkBjGhC;;AuBwEL,AvBtEQ,cuBsEM,GvB9EV,EAAE,AAOD,YAAY,GACT,CAAC,EkEXT,AlEWM,kBkEXY,C3CiFlB,cAAc,GvB9EV,EAAE,AAOD,YAAY,GkEHf,aAAa,EEPf,ApEWM,wBoEXkB,C7CiFxB,cAAc,GvB9EV,EAAE,AAOD,YAAY,GoEMf,aAAa,EChBf,ArEWM,6BqEXuB,CAC3B,wBAAwB,C9CgF1B,cAAc,GvB9EV,EAAE,AAOD,YAAY,GqEWb,aAAa,EAOjB,ArEjBM,2BqEiBqB,CACzB,sBAAsB,C9CoDxB,cAAc,GvB9EV,EAAE,AAOD,YAAY,GqEuCb,aAAa,EIsBjB,AzE5DM,sByE4DgB,CACpB,YAAY,CAUV,YAAY,ClDDhB,cAAc,GvB9EV,EAAE,AAOD,YAAY,GyE6EX,gBAAgB;AlDNtB,AvBrEQ,cuBqEM,GvB9EV,EAAE,AAOD,YAAY,GAET,IAAI,CAAC;EOGX,yBAAyB,EzB+FC,GAAG;EyB9F1B,sBAAsB,EzB8FC,GAAG,GkBhGxB;;AuBmEP,AvBhEQ,cuBgEM,GvB9EV,EAAE,AAaD,WAAW,GACR,CAAC,EkEjBT,AlEiBM,kBkEjBY,C3CiFlB,cAAc,GvB9EV,EAAE,AAaD,WAAW,GkETd,aAAa,EEPf,ApEiBM,wBoEjBkB,C7CiFxB,cAAc,GvB9EV,EAAE,AAaD,WAAW,GoEAd,aAAa,EChBf,ArEiBM,6BqEjBuB,CAC3B,wBAAwB,C9CgF1B,cAAc,GvB9EV,EAAE,AAaD,WAAW,GqEKZ,aAAa,EAOjB,ArEXM,2BqEWqB,CACzB,sBAAsB,C9CoDxB,cAAc,GvB9EV,EAAE,AAaD,WAAW,GqEiCZ,aAAa,EIsBjB,AzEtDM,sByEsDgB,CACpB,YAAY,CAUV,YAAY,ClDDhB,cAAc,GvB9EV,EAAE,AAaD,WAAW,GyEuEV,gBAAgB;AlDNtB,AvB/DQ,cuB+DM,GvB9EV,EAAE,AAaD,WAAW,GAER,IAAI,CAAC;EOXX,0BAA0B,EzBuGA,GAAG;EyBtG1B,uBAAuB,EzBsGA,GAAG,GkB1FxB;;AuBkEP,AvBlFM,cuBkFQ,GvBnFV,EAAE,GACA,CAAC,EkEJP,AlEII,kBkEJc,C3CsFlB,cAAc,GvBnFV,EAAE,GkEIJ,aAAa,EEPf,ApEII,wBoEJoB,C7CsFxB,cAAc,GvBnFV,EAAE,GoEaJ,aAAa,EChBf,ArEII,6BqEJyB,CAC3B,wBAAwB,C9CqF1B,cAAc,GvBnFV,EAAE,GqEkBF,aAAa,EAOjB,ArExBI,2BqEwBuB,CACzB,sBAAsB,C9CyDxB,cAAc,GvBnFV,EAAE,GqE8CF,aAAa,EIsBjB,AzEnEI,sByEmEkB,CACpB,YAAY,CAUV,YAAY,ClDIhB,cAAc,GvBnFV,EAAE,GyEoFA,gBAAgB;AlDDtB,AvBjFM,cuBiFQ,GvBnFV,EAAE,GAEA,IAAI,CAAC;EACL,OAAO,ElB8Fe,GAAG,CACH,IAAI;EkB9F1B,SAAS,ElB8CW,IAAI;EkB7CxB,WAAW,ElBmGW,GAAG,GkBlG1B;;AuB6EL,AvB3EQ,cuB2EM,GvBnFV,EAAE,AAOD,YAAY,GACT,CAAC,EkEXT,AlEWM,kBkEXY,C3CsFlB,cAAc,GvBnFV,EAAE,AAOD,YAAY,GkEHf,aAAa,EEPf,ApEWM,wBoEXkB,C7CsFxB,cAAc,GvBnFV,EAAE,AAOD,YAAY,GoEMf,aAAa,EChBf,ArEWM,6BqEXuB,CAC3B,wBAAwB,C9CqF1B,cAAc,GvBnFV,EAAE,AAOD,YAAY,GqEWb,aAAa,EAOjB,ArEjBM,2BqEiBqB,CACzB,sBAAsB,C9CyDxB,cAAc,GvBnFV,EAAE,AAOD,YAAY,GqEuCb,aAAa,EIsBjB,AzE5DM,sByE4DgB,CACpB,YAAY,CAUV,YAAY,ClDIhB,cAAc,GvBnFV,EAAE,AAOD,YAAY,GyE6EX,gBAAgB;AlDDtB,AvB1EQ,cuB0EM,GvBnFV,EAAE,AAOD,YAAY,GAET,IAAI,CAAC;EOGX,yBAAyB,EzBgGC,GAAG;EyB/F1B,sBAAsB,EzB+FC,GAAG,GkBjGxB;;AuBwEP,AvBrEQ,cuBqEM,GvBnFV,EAAE,AAaD,WAAW,GACR,CAAC,EkEjBT,AlEiBM,kBkEjBY,C3CsFlB,cAAc,GvBnFV,EAAE,AAaD,WAAW,GkETd,aAAa,EEPf,ApEiBM,wBoEjBkB,C7CsFxB,cAAc,GvBnFV,EAAE,AAaD,WAAW,GoEAd,aAAa,EChBf,ArEiBM,6BqEjBuB,CAC3B,wBAAwB,C9CqF1B,cAAc,GvBnFV,EAAE,AAaD,WAAW,GqEKZ,aAAa,EAOjB,ArEXM,2BqEWqB,CACzB,sBAAsB,C9CyDxB,cAAc,GvBnFV,EAAE,AAaD,WAAW,GqEiCZ,aAAa,EIsBjB,AzEtDM,sByEsDgB,CACpB,YAAY,CAUV,YAAY,ClDIhB,cAAc,GvBnFV,EAAE,AAaD,WAAW,GyEuEV,gBAAgB;AlDDtB,AvBpEQ,cuBoEM,GvBnFV,EAAE,AAaD,WAAW,GAER,IAAI,CAAC;EOXX,0BAA0B,EzBwGA,GAAG;EyBvG1B,uBAAuB,EzBuGA,GAAG,GkB3FxB;;AwBhBP,AAAA,MAAM,EyBJN,AzBIA,eyBJe,AACZ,qBAAqB,EiBDxB,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,C1CxBP;EACL,OAAO,EAAE,MAAO;EAChB,OAAO,EAAE,cAAe;EACxB,SAAS,EAAE,GAAI;EACf,WAAW,EAAE,IAAK;EAClB,WAAW,EAAE,CAAE;EACf,KAAK,E1C+jBuB,IAAI;E0C9jBhC,UAAU,EAAE,MAAO;EACnB,WAAW,EAAE,MAAO;EACpB,cAAc,EAAE,QAAS;EACzB,aAAa,EAAE,KAAM,GActB;EAxBD,AAAA,MAAM,AAeH,MAAM,EyBnBT,AzBIA,eyBJe,AACZ,qBAAqB,AzBkBrB,MAAM,E0CnBT,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,A1CTX,MAAM,CAAC;IACN,OAAO,EAAE,IAAK,GACf;EAGD,AApBF,IAoBM,CApBN,MAAM,EoBJN,ApBIA,eoBJe,CAIb,cAAc,CpBAhB,MAAM,EuBJN,AvBIA,YuBJY,CACV,EAAE,CAGA,CAAC,CvBAL,MAAM,EuBJN,AvBIA,YuBJY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,C1CHf,MAAM,E0CJN,A1CIA,kB0CJkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,C1CHf,MAAM,EuBJN,AvBIA,YuBJY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,C5CZf,MAAM,E4CJN,A5CIA,wB4CJwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,C5CZf,MAAM,EuBJN,AvBIA,YuBJY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,C7CjBjB,MAAM,E6CJN,A7CIA,6B6CJ6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,C7CjBjB,MAAM,EuBJN,AvBIA,YuBJY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,C7C7CjB,MAAM,E6CwBN,A7CxBA,2B6CwB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,C7C7CjB,MAAM,EuBJN,AvBIA,YuBJY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,CjDnFtB,MAAM,EiDmEN,AjDnEA,sBiDmEsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,CjDnFtB,MAAM,EwBJN,AxBIA,sBwBJsB,CxBItB,MAAM,E6BJN,A7BIA,iB6BJiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,C7BpCpB,MAAM,EmCJN,AnCIA,YmCJY,CAYV,cAAc,CACZ,MAAM,CnCTV,MAAM,EmCJN,AnCIA,YmCJY,CAkCV,aAAa,CAUX,oBAAoB,CnCxCxB,MAAM,EqCJN,ArCIA,oBqCJoB,CAGlB,EAAE,CASA,YAAY,CrCRhB,MAAM,EqCJN,ArCIA,oBqCJoB,CAGlB,EAAE,CAsBA,gBAAgB,CrCrBpB,MAAM,EsCJN,AtCIA,+BsCJ+B,CAC7B,iBAAiB,CACf,gBAAgB,CtCEpB,MAAM,EAoBJ,AApBF,IAoBM,CyBxBN,eAAe,AACZ,qBAAqB,ELDxB,ApBIA,eoBJe,CAIb,cAAc,CKJhB,eAAe,AACZ,qBAAqB,EFDxB,AvBIA,YuBJY,CACV,EAAE,CAGA,CAAC,CEJL,eAAe,AACZ,qBAAqB,EFDxB,AvBIA,YuBJY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,CjBPf,eAAe,AACZ,qBAAqB,EiBDxB,A1CIA,kB0CJkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,CjBPf,eAAe,AACZ,qBAAqB,EFDxB,AvBIA,YuBJY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,CnBhBf,eAAe,AACZ,qBAAqB,EmBDxB,A5CIA,wB4CJwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,CnBhBf,eAAe,AACZ,qBAAqB,EFDxB,AvBIA,YuBJY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,CpBrBjB,eAAe,AACZ,qBAAqB,EoBDxB,A7CIA,6B6CJ6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,CpBrBjB,eAAe,AACZ,qBAAqB,EFDxB,AvBIA,YuBJY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,CpBjDjB,eAAe,AACZ,qBAAqB,EoB2BxB,A7CxBA,2B6CwB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,CpBjDjB,eAAe,AACZ,qBAAqB,EFDxB,AvBIA,YuBJY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,CxBvFtB,eAAe,AACZ,qBAAqB,EwBsExB,AjDnEA,sBiDmEsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,CxBvFtB,eAAe,AACZ,qBAAqB,EDDxB,AxBIA,sBwBJsB,CCAtB,eAAe,AACZ,qBAAqB,EIDxB,A7BIA,iB6BJiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,CJxCpB,eAAe,AACZ,qBAAqB,EUDxB,AnCIA,YmCJY,CAYV,cAAc,CACZ,MAAM,CVbV,eAAe,AACZ,qBAAqB,EUDxB,AnCIA,YmCJY,CAkCV,aAAa,CAUX,oBAAoB,CV5CxB,eAAe,AACZ,qBAAqB,EYDxB,ArCIA,oBqCJoB,CAGlB,EAAE,CASA,YAAY,CZZhB,eAAe,AACZ,qBAAqB,EYDxB,ArCIA,oBqCJoB,CAGlB,EAAE,CAsBA,gBAAgB,CZzBpB,eAAe,AACZ,qBAAqB,EaDxB,AtCIA,+BsCJ+B,CAC7B,iBAAiB,CACf,gBAAgB,CbFpB,eAAe,AACZ,qBAAqB,EzBuBtB,AApBF,IAoBM,C0CxBN,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,C1CDlB,IAAI,C0CIE,MAAM,EtB5Bd,ApBIA,eoBJe,CAIb,cAAc,CsBJhB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CtBzBpB,eAAe,CAIb,cAAc,CsBwBR,MAAM,EnB5Bd,AvBIA,YuBJY,CACV,EAAE,CAGA,CAAC,CmBJL,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CnBzBpB,YAAY,CACV,EAAE,CAGA,CAAC,CmBwBG,MAAM,EnB5Bd,AvBIA,YuBJY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,CAMb,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EnB5Bd,AvBIA,YuBJY,CACV,EAAE,CmBDJ,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAlBlB,aAAa,CAqBP,MAAM,EA5Bd,A1CIA,kB0CJkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,CAMb,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CnBzBpB,YAAY,CACV,EAAE,CmBMF,aAAa,CAqBP,MAAM,EnB5Bd,AvBIA,YuBJY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,CFhBf,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CnBzBpB,YAAY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,CFYP,MAAM,EE5Bd,A5CIA,wB4CJwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,CFhBf,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CEzBpB,wBAAwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,CFYP,MAAM,EnB5Bd,AvBIA,YuBJY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,CHrBjB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CnBzBpB,YAAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,CHOT,MAAM,EG5Bd,A7CIA,6B6CJ6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,CHrBjB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CGzBpB,6BAA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,CHOT,MAAM,EnB5Bd,AvBIA,YuBJY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,CHjDjB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CnBzBpB,YAAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,CHrBT,MAAM,EGAd,A7CxBA,2B6CwB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,CHjDjB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CGGpB,2BAA2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,CHrBT,MAAM,EnB5Bd,AvBIA,YuBJY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,CPvFtB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CnBzBpB,YAAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,CP3Dd,MAAM,EO2Cd,AjDnEA,sBiDmEsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,CPvFtB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CO8CpB,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,CP3Dd,MAAM,ElB5Bd,AxBIA,sBwBJsB,CkBAtB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,ClBzBpB,sBAAsB,CkB4Bd,MAAM,Eb5Bd,A7BIA,iB6BJiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,CaxCpB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CbzBpB,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,CaZZ,MAAM,EP5Bd,AnCIA,YmCJY,CAYV,cAAc,CACZ,MAAM,CObV,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CPzBpB,YAAY,CAYV,cAAc,CACZ,MAAM,COeF,MAAM,EP5Bd,AnCIA,YmCJY,CAkCV,aAAa,CAUX,oBAAoB,CO5CxB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CPzBpB,YAAY,CAkCV,aAAa,CAUX,oBAAoB,COhBhB,MAAM,EL5Bd,ArCIA,oBqCJoB,CAGlB,EAAE,CASA,YAAY,CKZhB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CLzBpB,oBAAoB,CAGlB,EAAE,CASA,YAAY,CKgBR,MAAM,EL5Bd,ArCIA,oBqCJoB,CAGlB,EAAE,CAsBA,gBAAgB,CKzBpB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CLzBpB,oBAAoB,CAGlB,EAAE,CAsBA,gBAAgB,CKGZ,MAAM,EJ5Bd,AtCIA,+BsCJ+B,CAC7B,iBAAiB,CACf,gBAAgB,CIFpB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,EA5Bd,A1CIA,kB0CJkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CJzBpB,+BAA+B,CAC7B,iBAAiB,CACf,gBAAgB,CI0BZ,MAAM,C1CJL;IACL,QAAQ,EAAE,QAAS;IACnB,GAAG,EAAE,IAAK,GACX;;AAIH,AAAC,CAAA,AAAA,MAAM,AACJ,MAAM,EADT,AAAA,CAAC,AyB/BD,eAAe,AACZ,qBAAqB,AzB+BrB,MAAM,E0ChCT,A1C+BA,kB0C/BkB,CjBAlB,eAAe,AACZ,qBAAqB,AiBMtB,aAAa,A1CyBZ,MAAM,E4ChCT,A5C+BA,wB4C/BwB,CnBAxB,eAAe,AACZ,qBAAqB,AmBetB,aAAa,A5CgBZ,MAAM,E6ChCT,A7C+BA,6B6C/B6B,CAC3B,wBAAwB,CpBD1B,eAAe,AACZ,qBAAqB,AoBoBpB,aAAa,A7CWd,MAAM,E6CJT,A7CGA,2B6CH2B,CACzB,sBAAsB,CpB7BxB,eAAe,AACZ,qBAAqB,AoBgDpB,aAAa,A7CjBd,MAAM,EiDuCT,AjDxCA,sBiDwCsB,CACpB,YAAY,CAUV,YAAY,CxBlFhB,eAAe,AACZ,qBAAqB,AwBsFlB,gBAAgB,AjDvDnB,MAAM,E0ChCT,A1C+BA,kB0C/BkB,C1C+BjB,MAAM,A0CxBL,aAAa,A1CyBZ,MAAM,E0ChCT,A1C+BA,kB0C/BkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAlBlB,aAAa,AAqBP,MAAM,A1CIX,MAAM,E0ChCT,A1C+BA,kB0C/BkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,C1CMpB,CAAC,A0CHO,MAAM,A1CIX,MAAM,E0ChCT,A1C+BA,kB0C/BkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CEzBpB,wBAAwB,CF4BhB,MAAM,AEZZ,aAAa,A5CgBZ,MAAM,E4ChCT,A5C+BA,wB4C/BwB,CFAxB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,AEZZ,aAAa,A5CgBZ,MAAM,E0ChCT,A1C+BA,kB0C/BkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CGzBpB,6BAA6B,CAC3B,wBAAwB,CH2BlB,MAAM,AGPV,aAAa,A7CWd,MAAM,E6ChCT,A7C+BA,6B6C/B6B,CAC3B,wBAAwB,CHD1B,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,AGPV,aAAa,A7CWd,MAAM,E0ChCT,A1C+BA,kB0C/BkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CGGpB,2BAA2B,CACzB,sBAAsB,CHDhB,MAAM,AGqBV,aAAa,A7CjBd,MAAM,E6CJT,A7CGA,2B6CH2B,CACzB,sBAAsB,CH7BxB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,AGqBV,aAAa,A7CjBd,MAAM,E0ChCT,A1C+BA,kB0C/BkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CO8CpB,sBAAsB,CACpB,YAAY,CAUV,YAAY,CPtDR,MAAM,AO2DR,gBAAgB,AjDvDnB,MAAM,EiDuCT,AjDxCA,sBiDwCsB,CACpB,YAAY,CAUV,YAAY,CPlFhB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,AO2DR,gBAAgB,AjDvDnB,MAAM,E4ChCT,A5C+BA,wB4C/BwB,C5C+BvB,MAAM,A4CfL,aAAa,A5CgBZ,MAAM,E6ChCT,A7C+BA,6B6C/B6B,CAC3B,wBAAwB,C7C8BzB,MAAM,A6CVH,aAAa,A7CWd,MAAM,E6CJT,A7CGA,2B6CH2B,CACzB,sBAAsB,C7CEvB,MAAM,A6CkBH,aAAa,A7CjBd,MAAM,EiDuCT,AjDxCA,sBiDwCsB,CACpB,YAAY,CAUV,YAAY,CjDnDf,MAAM,AiDwDD,gBAAgB,AjDvDnB,MAAM,EADT,AAAC,CAAA,AAAA,MAAM,AAEJ,MAAM,EAFT,AAAA,CAAC,AyB/BD,eAAe,AACZ,qBAAqB,AzBgCrB,MAAM,E0CjCT,A1C+BA,kB0C/BkB,CjBAlB,eAAe,AACZ,qBAAqB,AiBMtB,aAAa,A1C0BZ,MAAM,E4CjCT,A5C+BA,wB4C/BwB,CnBAxB,eAAe,AACZ,qBAAqB,AmBetB,aAAa,A5CiBZ,MAAM,E6CjCT,A7C+BA,6B6C/B6B,CAC3B,wBAAwB,CpBD1B,eAAe,AACZ,qBAAqB,AoBoBpB,aAAa,A7CYd,MAAM,E6CLT,A7CGA,2B6CH2B,CACzB,sBAAsB,CpB7BxB,eAAe,AACZ,qBAAqB,AoBgDpB,aAAa,A7ChBd,MAAM,EiDsCT,AjDxCA,sBiDwCsB,CACpB,YAAY,CAUV,YAAY,CxBlFhB,eAAe,AACZ,qBAAqB,AwBsFlB,gBAAgB,AjDtDnB,MAAM,E0CjCT,A1C+BA,kB0C/BkB,C1C+BjB,MAAM,A0CxBL,aAAa,A1C0BZ,MAAM,E0CjCT,A1C+BA,kB0C/BkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAlBlB,aAAa,AAqBP,MAAM,A1CKX,MAAM,E0CjCT,A1C+BA,kB0C/BkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,C1CMpB,CAAC,A0CHO,MAAM,A1CKX,MAAM,E0CjCT,A1C+BA,kB0C/BkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CEzBpB,wBAAwB,CF4BhB,MAAM,AEZZ,aAAa,A5CiBZ,MAAM,E4CjCT,A5C+BA,wB4C/BwB,CFAxB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,AEZZ,aAAa,A5CiBZ,MAAM,E0CjCT,A1C+BA,kB0C/BkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CGzBpB,6BAA6B,CAC3B,wBAAwB,CH2BlB,MAAM,AGPV,aAAa,A7CYd,MAAM,E6CjCT,A7C+BA,6B6C/B6B,CAC3B,wBAAwB,CHD1B,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,AGPV,aAAa,A7CYd,MAAM,E0CjCT,A1C+BA,kB0C/BkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CGGpB,2BAA2B,CACzB,sBAAsB,CHDhB,MAAM,AGqBV,aAAa,A7ChBd,MAAM,E6CLT,A7CGA,2B6CH2B,CACzB,sBAAsB,CH7BxB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,AGqBV,aAAa,A7ChBd,MAAM,E0CjCT,A1C+BA,kB0C/BkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CO8CpB,sBAAsB,CACpB,YAAY,CAUV,YAAY,CPtDR,MAAM,AO2DR,gBAAgB,AjDtDnB,MAAM,EiDsCT,AjDxCA,sBiDwCsB,CACpB,YAAY,CAUV,YAAY,CPlFhB,kBAAkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,AO2DR,gBAAgB,AjDtDnB,MAAM,E4CjCT,A5C+BA,wB4C/BwB,C5C+BvB,MAAM,A4CfL,aAAa,A5CiBZ,MAAM,E6CjCT,A7C+BA,6B6C/B6B,CAC3B,wBAAwB,C7C8BzB,MAAM,A6CVH,aAAa,A7CYd,MAAM,E6CLT,A7CGA,2B6CH2B,CACzB,sBAAsB,C7CEvB,MAAM,A6CkBH,aAAa,A7ChBd,MAAM,EiDsCT,AjDxCA,sBiDwCsB,CACpB,YAAY,CAUV,YAAY,CjDnDf,MAAM,AiDwDD,gBAAgB,AjDtDnB,MAAM,CAAC;EACN,KAAK,E1CyiBqB,IAAI;E0CxiB9B,eAAe,EAAE,IAAK;EACtB,MAAM,EAAE,OAAQ,GACjB;;AAMH,AAAA,cAAc,E0C3Cd,A1C2CA,kB0C3CkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,C1CeC;ErCxCb,gBAAgB,ELWO,OAAO,G0C+B/B;EAFD,AAAA,cAAc,CrCtCX,AAAA,IAAC,AAAA,CACC,MAAM,E+ENX,A1C2CA,kB0C3CkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,E/EpBjB,AAAA,IAAC,AAAA,C+EuBI,MAAM,A/EtBT,MAAM,EqCqCX,AAAA,cAAc,CrCtCX,AAAA,IAAC,AAAA,CAEC,MAAM,E+EPX,A1C2CA,kB0C3CkB,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,E/EpBjB,AAAA,IAAC,AAAA,C+EuBI,MAAM,A/ErBT,MAAM,CAAC;IACN,gBAAgB,EAAE,OAAM,GACzB;;AqCsCL,AAAA,cAAc,CAAC;ErC5Cb,gBAAgB,ELcM,OAAM,G0CgC7B;EAFD,AAAA,cAAc,CrC1CX,AAAA,IAAC,AAAA,CACC,MAAM,EqCyCX,AAAA,cAAc,CrC1CX,AAAA,IAAC,AAAA,CAEC,MAAM,CAAC;IACN,gBAAgB,EAAE,OAAM,GACzB;;AqC0CL,AAAA,cAAc,EyBnDd,AzBmDA,eyBnDe,AACZ,qBAAqB,AAInB,GAAG,CzB8CO;ErChDb,gBAAgB,ELeM,OAAO,G0CmC9B;EAFD,AAAA,cAAc,CrC9CX,AAAA,IAAC,AAAA,CACC,MAAM,GADR,AAAA,AqC8CH,IrC9CI,AAAA,C8DLJ,eAAe,AACZ,qBAAqB,AAInB,GAAG,A9DCH,MAAM,EqC6CX,AAAA,cAAc,CrC9CX,AAAA,IAAC,AAAA,CAEC,MAAM,GAFR,AAAA,AqC8CH,IrC9CI,AAAA,C8DLJ,eAAe,AACZ,qBAAqB,AAInB,GAAG,A9DEH,MAAM,CAAC;IACN,gBAAgB,EAAE,OAAM,GACzB;;AqC8CL,AAAA,WAAW,CAAC;ErCpDV,gBAAgB,ELgBM,OAAO,G0CsC9B;EAFD,AAAA,WAAW,CrClDR,AAAA,IAAC,AAAA,CACC,MAAM,EqCiDX,AAAA,WAAW,CrClDR,AAAA,IAAC,AAAA,CAEC,MAAM,CAAC;IACN,gBAAgB,EAAE,OAAM,GACzB;;AqCkDL,AAAA,cAAc,EyB3Dd,AzB2DA,eyB3De,AACZ,qBAAqB,AAQnB,QAAQ,CzBkDE;ErCxDb,gBAAgB,ELiBM,OAAO,G0CyC9B;EAFD,AAAA,cAAc,CrCtDX,AAAA,IAAC,AAAA,CACC,MAAM,GADR,AAAA,AqCsDH,IrCtDI,AAAA,C8DLJ,eAAe,AACZ,qBAAqB,AAQnB,QAAQ,A9DHR,MAAM,EqCqDX,AAAA,cAAc,CrCtDX,AAAA,IAAC,AAAA,CAEC,MAAM,GAFR,AAAA,AqCsDH,IrCtDI,AAAA,C8DLJ,eAAe,AACZ,qBAAqB,AAQnB,QAAQ,A9DFR,MAAM,CAAC;IACN,gBAAgB,EAAE,OAAM,GACzB;;AqCsDL,AAAA,aAAa,EyB/Db,AzB+DA,eyB/De,AACZ,qBAAqB,AAYnB,KAAK,CzBkDI;ErC5DZ,gBAAgB,ELkBM,OAAO,G0C4C9B;EAFD,AAAA,aAAa,CrC1DV,AAAA,IAAC,AAAA,CACC,MAAM,GADR,AAAA,AqC0DH,IrC1DI,AAAA,C8DLJ,eAAe,AACZ,qBAAqB,AAYnB,KAAK,A9DPL,MAAM,EqCyDX,AAAA,aAAa,CrC1DV,AAAA,IAAC,AAAA,CAEC,MAAM,GAFR,AAAA,AqC0DH,IrC1DI,AAAA,C8DLJ,eAAe,AACZ,qBAAqB,AAYnB,KAAK,A9DNL,MAAM,CAAC;IACN,gBAAgB,EAAE,OAAM,GACzB;;AsCHL,AAAA,MAAM,CAAC;EACL,OAAO,EAAE,YAAa;EACtB,SAAS,EAAE,IAAK;EAChB,OAAO,EAAE,OAAQ;EACjB,SAAS,E3C2Ce,IAAI;E2C1C5B,WAAW,E3CswBiB,IAAI;E2CrwBhC,KAAK,E3C2vBuB,IAAI;E2C1vBhC,WAAW,E3CqwBiB,CAAC;E2CpwB7B,cAAc,EAAE,MAAO;EACvB,WAAW,EAAE,MAAO;EACpB,UAAU,EAAE,MAAO;EACnB,gBAAgB,E3CHO,OAAO;E2CI9B,aAAa,E3CiwBe,IAAI,G2C1tBjC;EAnDD,AAAA,MAAM,AAeH,MAAM,CAAC;IACN,OAAO,EAAE,IAAK,GACf;EAGD,AApBF,IAoBM,CApBN,MAAM,EmBNN,AnBMA,emBNe,CAIb,cAAc,CnBEhB,MAAM,EsBNN,AtBMA,YsBNY,CACV,EAAE,CAGA,CAAC,CtBEL,MAAM,EsBNN,AtBMA,YsBNY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,CzCDf,MAAM,EyCNN,AzCMA,kByCNkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,CzCDf,MAAM,EsBNN,AtBMA,YsBNY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,C3CVf,MAAM,E2CNN,A3CMA,wB2CNwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,C3CVf,MAAM,EsBNN,AtBMA,YsBNY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,C5CfjB,MAAM,E4CNN,A5CMA,6B4CN6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,C5CfjB,MAAM,EsBNN,AtBMA,YsBNY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,C5C3CjB,MAAM,E4CsBN,A5CtBA,2B4CsB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,C5C3CjB,MAAM,EsBNN,AtBMA,YsBNY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,ChDjFtB,MAAM,EgDiEN,AhDjEA,sBgDiEsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,ChDjFtB,MAAM,EuBNN,AvBMA,sBuBNsB,CvBMtB,MAAM,E4BNN,A5BMA,iB4BNiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,C5BlCpB,MAAM,EkCNN,AlCMA,YkCNY,CAYV,cAAc,CACZ,MAAM,ClCPV,MAAM,EkCNN,AlCMA,YkCNY,CAkCV,aAAa,CAUX,oBAAoB,ClCtCxB,MAAM,EoCNN,ApCMA,oBoCNoB,CAGlB,EAAE,CASA,YAAY,CpCNhB,MAAM,EoCNN,ApCMA,oBoCNoB,CAGlB,EAAE,CAsBA,gBAAgB,CpCnBpB,MAAM,EqCNN,ArCMA,+BqCN+B,CAC7B,iBAAiB,CACf,gBAAgB,CrCIpB,MAAM,CAoBG;IACL,QAAQ,EAAE,QAAS;IACnB,GAAG,EAAE,IAAK,GACX;EAED,AAzBF,OAyBS,CAzBT,MAAM,EsBNN,AtBMA,YsBNY,AAcT,MAAM,CACL,EAAE,CACA,CAAC,CtBVP,MAAM,EsBNN,AtBMA,YsBNY,AAcT,MAAM,CACL,EAAE,CmBfN,kBAAkB,CAOhB,aAAa,CzCDf,MAAM,EyCNN,AzCMA,kByCNkB,CnBAlB,YAAY,AAcT,MAAM,CACL,EAAE,CmBRJ,aAAa,CzCDf,MAAM,EsBNN,AtBMA,YsBNY,AAcT,MAAM,CACL,EAAE,CqBfN,wBAAwB,CAgBtB,aAAa,C3CVf,MAAM,E2CNN,A3CMA,wB2CNwB,CrBAxB,YAAY,AAcT,MAAM,CACL,EAAE,CqBCJ,aAAa,C3CVf,MAAM,EsBNN,AtBMA,YsBNY,AAcT,MAAM,CACL,EAAE,CsBfN,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,C5CfjB,MAAM,E4CNN,A5CMA,6B4CN6B,CAC3B,wBAAwB,CtBD1B,YAAY,AAcT,MAAM,CACL,EAAE,CsBMF,aAAa,C5CfjB,MAAM,EsBNN,AtBMA,YsBNY,AAcT,MAAM,CACL,EAAE,CsBaN,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,C5C3CjB,MAAM,E4CsBN,A5CtBA,2B4CsB2B,CACzB,sBAAsB,CtB7BxB,YAAY,AAcT,MAAM,CACL,EAAE,CsBkCF,aAAa,C5C3CjB,MAAM,EsBNN,AtBMA,YsBNY,AAcT,MAAM,CACL,EAAE,C0BwDN,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,ChDjFtB,MAAM,EgDiEN,AhDjEA,sBgDiEsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,AAcT,MAAM,CACL,EAAE,C0BwEA,gBAAgB,ChDjFtB,MAAM,EkCNN,AlCMA,YkCNY,CAYV,cAAc,CACZ,MAAM,ClCPV,MAAM,EoCNN,ApCMA,oBoCNoB,CAGlB,EAAE,CASA,YAAY,CpCNhB,MAAM,EqCNN,ArCMA,+BqCN+B,CAC7B,iBAAiB,CACf,gBAAgB,CrCIpB,MAAM;EA0BJ,AA1BF,aA0Be,GAAG,IAAI,CA1BtB,MAAM,EmBNN,AnBMA,emBNe;EnBgCb,aAAa,GmB5Bb,cAAc,CnBEhB,MAAM,EsBNN,AtBMA,YsBNY,CACV,EAAE;EtB+BF,aAAa,GsB5BX,CAAC,CtBEL,MAAM,EsBNN,AtBMA,YsBNY,CACV,EAAE,CmBDJ,kBAAkB;EzCgChB,aAAa,GyCzBb,aAAa,CzCDf,MAAM,EyCNN,AzCMA,kByCNkB,CnBAlB,YAAY,CACV,EAAE;EtB+BF,aAAa,GyCzBb,aAAa,CzCDf,MAAM,EsBNN,AtBMA,YsBNY,CACV,EAAE,CqBDJ,wBAAwB;E3CgCtB,aAAa,G2ChBb,aAAa,C3CVf,MAAM,E2CNN,A3CMA,wB2CNwB,CrBAxB,YAAY,CACV,EAAE;EtB+BF,aAAa,G2ChBb,aAAa,C3CVf,MAAM,EsBNN,AtBMA,YsBNY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB;E5C+BxB,aAAa,G4CXX,aAAa,C5CfjB,MAAM,E4CNN,A5CMA,6B4CN6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE;EtB+BF,aAAa,G4CXX,aAAa,C5CfjB,MAAM,EsBNN,AtBMA,YsBNY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB;E5CGtB,aAAa,G4CiBX,aAAa,C5C3CjB,MAAM,E4CsBN,A5CtBA,2B4CsB2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE;EtB+BF,aAAa,G4CiBX,aAAa,C5C3CjB,MAAM,EsBNN,AtBMA,YsBNY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY;EhDlDd,aAAa,GgDuDT,gBAAgB,ChDjFtB,MAAM,EgDiEN,AhDjEA,sBgDiEsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE;EtB+BF,aAAa,GgDuDT,gBAAgB,ChDjFtB,MAAM;EA0BJ,AA1BF,aA0Be,GuBhCf,sBAAsB,CvBMtB,MAAM,E4BNN,A5BMA,iB4BNiB,CA2Bf,cAAc,CAYZ,eAAe;E5BPjB,aAAa,G4BQT,cAAc,C5BlCpB,MAAM,EkCNN,AlCMA,YkCNY,CAYV,cAAc;ElCoBd,aAAa,GkCnBX,MAAM,ClCPV,MAAM,EkCNN,AlCMA,YkCNY,CAkCV,aAAa;ElCFb,aAAa,GkCYX,oBAAoB,ClCtCxB,MAAM,EoCNN,ApCMA,oBoCNoB,CAGlB,EAAE;EpC6BF,aAAa,GoCpBX,YAAY,CpCNhB,MAAM,EoCNN,ApCMA,oBoCNoB,CAGlB,EAAE;EpC6BF,aAAa,GoCPX,gBAAgB,CpCnBpB,MAAM,EqCNN,ArCMA,+BqCN+B,CAC7B,iBAAiB;ErC+BjB,aAAa,GqC9BX,gBAAgB,CrCIpB,MAAM,CA0BmB;IACrB,GAAG,EAAE,CAAE;IACP,OAAO,EAAE,OAAQ,GAClB;EAKD,AAlCF,gBAkCkB,AAAA,OAAO,GAlCzB,MAAM;EAmCJ,AAnCF,UAmCY,GAAG,OAAO,GAAG,CAAC,GAnC1B,MAAM,EyCNN,AzCMA,kByCNkB;EzCyChB,UAAU,GAAG,OAAO,GyClCpB,aAAa,GzCDf,MAAM,E2CNN,A3CMA,wB2CNwB;E3CyCtB,UAAU,GAAG,OAAO,G2CzBpB,aAAa,G3CVf,MAAM,E4CNN,A5CMA,6B4CN6B,CAC3B,wBAAwB;E5CwCxB,UAAU,GAAG,OAAO,G4CpBlB,aAAa,G5CfjB,MAAM,E4CsBN,A5CtBA,2B4CsB2B,CACzB,sBAAsB;E5CYtB,UAAU,GAAG,OAAO,G4CQlB,aAAa,G5C3CjB,MAAM,EgDiEN,AhDjEA,sBgDiEsB,CACpB,YAAY,CAUV,YAAY;EhDzCd,UAAU,GAAG,OAAO,GgD8ChB,gBAAgB,GhDjFtB,MAAM,CAmCyB;IAC3B,KAAK,E3CzBe,OAAM;I2C0B1B,gBAAgB,E3CouBU,IAAI,G2CnuB/B;EAED,AAxCF,gBAwCkB,GAxClB,MAAM,CAwCiB;IACnB,KAAK,EAAE,KAAM,GACd;EAED,AA5CF,gBA4CkB,GA5ClB,MAAM,GAAN,MAAM,CA4CqB;IACvB,YAAY,EAAE,GAAI,GACnB;EAED,AAhDF,UAgDY,GAAG,EAAE,GAAG,CAAC,GAhDrB,MAAM,EyCNN,AzCMA,kByCNkB,CzCsDhB,UAAU,GAAG,EAAE,GyC/Cf,aAAa,GzCDf,MAAM,E2CNN,A3CMA,wB2CNwB,C3CsDtB,UAAU,GAAG,EAAE,G2CtCf,aAAa,G3CVf,MAAM,E4CNN,A5CMA,6B4CN6B,CAC3B,wBAAwB,C5CqDxB,UAAU,GAAG,EAAE,G4CjCb,aAAa,G5CfjB,MAAM,E4CsBN,A5CtBA,2B4CsB2B,CACzB,sBAAsB,C5CyBtB,UAAU,GAAG,EAAE,G4CLb,aAAa,G5C3CjB,MAAM,EgDiEN,AhDjEA,sBgDiEsB,CACpB,YAAY,CAUV,YAAY,ChD5Bd,UAAU,GAAG,EAAE,GgDiCX,gBAAgB,GhDjFtB,MAAM,CAgDoB;IACtB,WAAW,EAAE,GAAI,GAClB;;AAIH,AAAC,CAAA,AAAA,MAAM,AACJ,MAAM,EyC7DT,AzC4DA,kByC5DkB,CzC4DjB,MAAM,AyCrDL,aAAa,AzCsDZ,MAAM,E2C7DT,A3C4DA,wB2C5DwB,C3C4DvB,MAAM,A2C5CL,aAAa,A3C6CZ,MAAM,E4C7DT,A5C4DA,6B4C5D6B,CAC3B,wBAAwB,C5C2DzB,MAAM,A4CvCH,aAAa,A5CwCd,MAAM,E4CjCT,A5CgCA,2B4ChC2B,CACzB,sBAAsB,C5C+BvB,MAAM,A4CXH,aAAa,A5CYd,MAAM,EgDUT,AhDXA,sBgDWsB,CACpB,YAAY,CAUV,YAAY,ChDtBf,MAAM,AgD2BD,gBAAgB,AhD1BnB,MAAM,EADT,AAAC,CAAA,AAAA,MAAM,AAEJ,MAAM,EyC9DT,AzC4DA,kByC5DkB,CzC4DjB,MAAM,AyCrDL,aAAa,AzCuDZ,MAAM,E2C9DT,A3C4DA,wB2C5DwB,C3C4DvB,MAAM,A2C5CL,aAAa,A3C8CZ,MAAM,E4C9DT,A5C4DA,6B4C5D6B,CAC3B,wBAAwB,C5C2DzB,MAAM,A4CvCH,aAAa,A5CyCd,MAAM,E4ClCT,A5CgCA,2B4ChC2B,CACzB,sBAAsB,C5C+BvB,MAAM,A4CXH,aAAa,A5Cad,MAAM,EgDST,AhDXA,sBgDWsB,CACpB,YAAY,CAUV,YAAY,ChDtBf,MAAM,AgD2BD,gBAAgB,AhDzBnB,MAAM,CAAC;EACN,KAAK,E3C0sBqB,IAAI;E2CzsB9B,eAAe,EAAE,IAAK;EACtB,MAAM,EAAE,OAAQ,GACjB;;AC1DH,AAAA,MAAM,CAAC;EACL,OAAO,E5C0mBqB,IAAI;E4CzmBhC,aAAa,E5CuDW,IAAK;E4CtD7B,MAAM,EAAE,qBAAsB;EAC9B,aAAa,E5CiGa,GAAG,G4C1E9B;EA3BD,AAOE,MAPI,CAOJ,EAAE,CAAC;IACD,UAAU,EAAE,CAAE;IAEd,KAAK,EAAE,OAAQ,GAChB;EAXH,AAcE,MAdI,CAcJ,WAAW,CAAC;IACV,WAAW,E5C8lBe,IAAI,G4C7lB/B;EAhBH,AAmBI,MAnBE,GAmBF,CAAC;EAnBL,AAoBI,MApBE,GAoBF,EAAE,CAAC;IACH,aAAa,EAAE,CAAE,GAClB;EAtBH,AAwBQ,MAxBF,GAwBF,CAAC,GAAG,CAAC,CAAC;IACN,UAAU,EAAE,GAAI,GACjB;;AAOH,AAAA,kBAAkB;AAClB,AAAA,kBAAkB,CAAC;EACjB,aAAa,EAAG,IAAc,GAS/B;EAXD,AAKE,kBALgB,CAKhB,MAAM;EAJR,AAIE,kBAJgB,CAIhB,MAAM,CAAC;IACL,QAAQ,EAAE,QAAS;IACnB,GAAG,EAAE,IAAK;IACV,KAAK,EAAE,KAAM;IACb,KAAK,EAAE,OAAQ,GAChB;;AAOH,AAAA,cAAc,CAAC;E7BvDb,gBAAgB,Efqfe,OAAO;EepftC,YAAY,EfqfmB,OAAM;EepfrC,KAAK,Efkf0B,OAAO,G4C3bvC;EAFD,A7BnDE,c6BmDY,C7BnDZ,EAAE,CAAC;IACD,gBAAgB,EAAE,OAAM,GACzB;E6BiDH,A7BhDE,c6BgDY,C7BhDZ,WAAW,CAAC;IACV,KAAK,EAAE,OAAM,GACd;;A6BkDH,AAAA,WAAW,CAAC;E7B3DV,gBAAgB,Efyfe,OAAO;EexftC,YAAY,EfyfmB,OAAM;EexfrC,KAAK,Efsf0B,OAAO,G4C3bvC;EAFD,A7BvDE,W6BuDS,C7BvDT,EAAE,CAAC;IACD,gBAAgB,EAAE,OAAM,GACzB;E6BqDH,A7BpDE,W6BoDS,C7BpDT,WAAW,CAAC;IACV,KAAK,EAAE,OAAM,GACd;;A6BsDH,AAAA,cAAc,CAAC;E7B/Db,gBAAgB,Ef6fe,OAAO;Ee5ftC,YAAY,Ef6fmB,OAAM;Ee5frC,KAAK,Ef0f0B,OAAO,G4C3bvC;EAFD,A7B3DE,c6B2DY,C7B3DZ,EAAE,CAAC;IACD,gBAAgB,EAAE,OAAM,GACzB;E6ByDH,A7BxDE,c6BwDY,C7BxDZ,WAAW,CAAC;IACV,KAAK,EAAE,OAAM,GACd;;A6B0DH,AAAA,aAAa,CAAC;E7BnEZ,gBAAgB,EfigBe,OAAO;EehgBtC,YAAY,EfigBmB,OAAM;EehgBrC,KAAK,Ef8f0B,OAAO,G4C3bvC;EAFD,A7B/DE,a6B+DW,C7B/DX,EAAE,CAAC;IACD,gBAAgB,EAAE,OAAM,GACzB;E6B6DH,A7B5DE,a6B4DW,C7B5DX,WAAW,CAAC;IACV,KAAK,EAAE,OAAM,GACd;;A8BPH,AAAA,MAAM,CAAC;EACL,KAAK,EAAE,KAAM;EACb,SAAS,EAAG,IAAe;EAC3B,WAAW,E7CmzBiB,IAAI;E6ClzBhC,WAAW,EAAE,CAAE;EACf,KAAK,E7CkzBuB,IAAI;E6CjzBhC,WAAW,E7CkzBiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;EG1zBxC,OAAO,E0CSU,GAAE;E1CNnB,MAAM,EAAE,iBAAK,G0CiBd;EAlBD,AAAA,MAAM,AASH,MAAM,EATT,AAAA,MAAM,AAUH,MAAM,CAAC;IACN,KAAK,E7C4yBqB,IAAI;I6C3yB9B,eAAe,EAAE,IAAK;IACtB,MAAM,EAAE,OAAQ;I1CflB,OAAO,E0CgBY,GAAE;I1CbrB,MAAM,EAAE,iBAAK,G0CcZ;;AASH,AAAM,MAAA,AAAA,MAAM,CAAC;EACX,OAAO,EAAE,CAAE;EACX,MAAM,EAAE,OAAQ;EAChB,UAAU,EAAE,WAAY;EACxB,MAAM,EAAE,CAAE;EACV,kBAAkB,EAAE,IAAK,GAC1B;;AC3BD,AAAA,SAAS,AnBKN,OAAO,EmBLV,AAAA,SAAS,AnBMN,MAAM,CAAC;EACN,OAAO,EAAE,GAAI;EACb,OAAO,EAAE,KAAM,GAChB;;AmBTH,AAAA,SAAS,AnBUN,MAAM,CAAC;EACN,KAAK,EAAE,IAAK,GACb;;AmBTH,AAAA,aAAa,CAAC;ElBRZ,OAAO,EAAE,KAAM;EACf,WAAW,EAAE,IAAK;EAClB,YAAY,EAAE,IAAK,GkBQpB;;AACD,AAAA,WAAW,CAAC;EACV,KAAK,EAAE,gBAAiB,GACzB;;AACD,AAAA,UAAU,CAAC;EACT,KAAK,EAAE,eAAgB,GACxB;;AAOD,AAAA,KAAK,CAAC;EACJ,OAAO,EAAE,eAAgB,GAC1B;;AACD,AAAA,KAAK,CAAC;EACJ,OAAO,EAAE,gBAAiB,GAC3B;;AACD,AAAA,UAAU,CAAC;EACT,UAAU,EAAE,MAAO,GACpB;;AACD,AAAA,UAAU,CAAC;E5CzBT,IAAI,EAAE,KAAM;EACZ,KAAK,EAAE,WAAY;EACnB,WAAW,EAAE,IAAK;EAClB,gBAAgB,EAAE,WAAY;EAC9B,MAAM,EAAE,CAAE,G4CuBX;;AAOD,AAAA,OAAO,CAAC;EACN,OAAO,EAAE,eAAgB,GAC1B;;AAMD,AAAA,MAAM,CAAC;EACL,QAAQ,EAAE,KAAM,GACjB;;AGnDD,AAAA,qBAAqB,CAAC;EACpB,QAAQ,EAAE,QAAS,GACpB;;AACD,AAAA,qBAAqB,EAAE,AAAsB,qBAAD,CAAC,CAAC,EAAE,AAAA,6BAA6B,EAAE,AAA8B,6BAAD,CAAC,CAAC,CAAC;EAC7G,UAAU,EAAE,UAAW,GACxB;;AAED,AAAA,6BAA6B,CAAC;EAC5B,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,IAAK;EACZ,OAAO,EAZ8B,IAAI;EAazC,gBAAgB,EDXoB,OAAO,GCY5C;;AFRD,AAAA,mBAAmB,CAAC;EAClB,QAAQ,EAAE,QAAS,GACpB;;AACD,AAAoB,mBAAD,CAAC,CAAC,EAAE,AAA6B,4BAAD,CAAC,CAAC,CAAC;EACpD,UAAU,EAAE,UAAW,GACxB;;AAGD,AAAA,2BAA2B,CAAC;EAC1B,MAAM,ECE4B,GAAG,CAAC,KAAK,CAFX,OAAO;EDCvC,aAAa,ECiB4B,GAAG;EDhB5C,gBAAgB,ECfoB,OAAO;EDgB3C,WAAW,EC6BoB,IAAI;ED5BnC,aAAa,EAAE,QAAS;EACxB,UAAU,EAAC,MAAC;EACZ,WAAW,EAAE,IAAK;EAClB,mBAAmB,EAAE,IAAK;EAC1B,KAAK,ECdyB,OAAO,GDgCtC;EA3BD,AAAA,2BAA2B,AAUxB,MAAM,CAAC;IACN,MAAM,ECPgC,GAAG,CAAC,KAAK,CAHjB,OAAO;IDWrC,UAAU,ECiBwB,IAAI,GDbvC;EACD,AAjBF,mBAiBqB,AAAA,SAAS,CAjB9B,2BAA2B,CAiBM;IAAE,MAAM,EAAE,IAAK,GAAI;EAClD,AAlBF,mBAkBqB,AAAA,IAAK,CAAA,AAAA,SAAS,EAlBnC,2BAA2B,CAkBY;IAAE,WAAW,EAAE,MAAO,GAAI;EAC/D,AAnBF,6BAmB+B,AAAA,4BAA4B,CAnB3D,2BAA2B,EAmBoC,AAnB/D,6BAmB4F,AAAA,+BAA+B,CAnB3H,2BAA2B,CAmBmG;IAC1H,yBAAyB,ECGa,CAAC;IDFvC,0BAA0B,ECEY,CAAC,GDDxC;EACD,AAvBF,6BAuB+B,AAAA,4BAA4B,CAvB3D,2BAA2B,CAuBmC;IAC1D,sBAAsB,ECDgB,CAAC;IDEvC,uBAAuB,ECFe,CAAC,GDGxC;;AAEH,AAAA,+BAA+B,CAAC;EAC9B,KAAK,ECjCgC,OAAO,GDkC7C;;AACD,AAAA,+BAA+B,CAAC;EAC9B,QAAQ,EAAE,QAAS;EACnB,OAAO,EAAE,YAAa;EACtB,KAAK,EAAE,CAAE;EAAE,MAAM,EAAE,CAAE;EAAE,GAAG,EAAE,CAAE;EAAE,MAAM,EAAE,CAAE;EAAE,MAAM,EAAE,IAAK;EACzD,YAAY,EAAE,KAAM;EACpB,YAAY,EAAE,aAAc;EAC5B,YAAY,ECpCoB,OAAO,CDoCc,WAAW,CAAC,WAAW,CAAC,WAAW,GAIzF;EAHC,AAPF,6BAO+B,CAP/B,+BAA+B,CAOG;IAC9B,SAAS,EAAE,cAAM,GAClB;;AAEH,AAAA,6BAA6B,CAAC;EAC5B,QAAQ,EAAE,QAAS;EACnB,MAAM,EAAE,OAAQ,GACjB;;AAGD,AAAA,0CAA0C,CAAC;EACzC,WAAW,EAAE,OAAQ;EACrB,SAAS,EAAE,OAAQ;EACnB,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EACb,OAAO,EAAE,YAAa;EACtB,WAAW,EAAE,OAAQ;EACrB,kBAAkB,EAAE,IAAK;EACzB,OAAO,EAAE,IAAK;EACd,OAAO,EAAE,CAAE,GAIZ;EAbD,AAAA,0CAA0C,AAUvC,SAAS,CAAC;IACT,gBAAgB,ECtE2B,OAAO,GDuEnD;;AAEH,AAAA,mCAAmC,CAAC;EAClC,MAAM,EAAE,cAAe;EACvB,aAAa,EC7C4B,GAAG;ED8C5C,KAAK,ECnEuC,OAAO;EDoEnD,gBAAgB,EC5EuC,OAAO;ED6E9D,OAAO,EAAE,KAAM;EACf,OAAO,EAAE,YAAa;EACtB,WAAW,EAAE,GAAI;EACjB,MAAM,EAAE,KAAM,GACf;;AACD,AAAA,uCAAuC,CAAC;EACtC,MAAM,EAAE,OAAQ,GAEjB;EAHD,AAAA,uCAAuC,AAEpC,IAAK,CAAA,AAAA,MAAM,EAAE;IAAE,OAAO,EAAE,GAAI,GAAI;;AAGnC,AAAA,0BAA0B,CAAC;EACzB,OAAO,EAAE,GAAI,GAgBd;EAjBD,AAEE,0BAFwB,CAExB,KAAK,CAAC;IACJ,MAAM,EC7E0B,GAAG,CAAC,KAAK,CAFX,OAAO;IDgFrC,aAAa,ECxD+B,CAAC;IDyD7C,KAAK,EAAE,IAAK;IACZ,SAAS,EAAE,OAAQ;IACnB,WAAW,EAAE,OAAQ;IACrB,OAAO,EAAE,KAAM,GAQhB;IAhBH,AAEE,0BAFwB,CAExB,KAAK,AAOF,MAAM,CAAC;MACN,MAAM,EAAE,GAAG,CAAC,KAAK,CCtFW,OAAO;MDuFnC,UAAU,EC3DsB,IAAI,GD+DrC;;AAKL,AAAA,4BAA4B,CAAC;EAC3B,KAAK,EAAE,IAAK;EACZ,WAAW,EChGuB,GAAG,CAAC,KAAK,CAFX,OAAO;EDmGvC,YAAY,ECjGsB,GAAG,CAAC,KAAK,CAFX,OAAO;EDoGvC,WAAW,ECpEoB,IAAI;EDqEnC,aAAa,ECnF4B,GAAG;EDoF5C,UAAU,ECxE6B,IAAI;EDyE3C,QAAQ,EAAE,MAAO;EACjB,KAAK,EC9GyB,OAAO,GDiItC;EA3BD,AAAA,4BAA4B,AASzB,4BAA4B,CAAC;IAI5B,UAAU,EC3GsB,GAAG,CAAC,KAAK,CAFX,OAAO;ID8GrC,aAAa,EC/F+B,IAAI;IDgGhD,yBAAyB,ECzFa,CAAC;ID0FvC,0BAA0B,EC1FY,CAAC,GD2FxC;EAjBH,AAAA,4BAA4B,AAkBzB,4BAA4B,EAAE,AAlBjC,+BAkBgE,CAlBhE,4BAA4B,CAkBuC;IAI/D,UAAU,ECvGkC,IAAI;IDwGhD,aAAa,ECrHmB,GAAG,CAAC,KAAK,CAFX,OAAO;IDwHrC,sBAAsB,EClGgB,CAAC;IDmGvC,uBAAuB,ECnGe,CAAC,GDoGxC;;AAEH,AAAA,2BAA2B,CAAC;EAC1B,UAAU,EAAE,IAAK;EACjB,MAAM,EAAE,CAAE;EACV,OAAO,EAAE,CAAE;EACX,WAAW,EAAE,IAAK;EAClB,mBAAmB,EAAE,IAAK,GAK3B;EAVD,AAAA,2BAA2B,AAMxB,IAAK,CAAA,AAAA,mCAAmC,EAAE;IACzC,UAAU,EAAE,IAAK;IACjB,UAAU,EAAC,OAAC,GACb;;AAGH,AAAA,0BAA0B,CAAC;EACzB,MAAM,EAAE,OAAQ;EAChB,OAAO,EAAE,CAAC,CCvGwB,GAAG,GDwGtC;;AACD,AAAA,oCAAoC,CAAC;EACnC,KAAK,ECjJoC,OAAO;EDkJhD,cAAc,EAAE,IAAK,GACtB;;AACD,AAAA,oCAAoC,CAAC;EAAE,gBAAgB,ECzJd,OAAO,GDyJoD;;AACpG,AAAA,uCAAuC,CAAC;EACtC,gBAAgB,EC5J0B,OAAO;ED6JjD,KAAK,ECpHgC,OAAO,GDqH7C;;AAGD,AAAA,8BAA8B,CAAC;EAC7B,MAAM,EAAE,OAAQ;EAChB,WAAW,EAAE,IAAK,GACnB;;AAGD,AACE,mBADiB,AAAA,+BAA+B,CAChD,2BAA2B,CAAC;EAC1B,gBAAgB,EC3K2B,OAAO,GD4KnD;;AAIH,AAAA,2BAA2B,CAAC;EAC1B,OAAO,EAAE,YAAa,GACvB;;AACD,AAAA,+BAA+B,CAAC;EAC9B,KAAK,EAAE,GAAI,GACZ;;AACD,AAAA,6BAA6B,CAAC;EAC5B,KAAK,ECzI+B,IAAI,GD0IzC;;AAED,AAEI,yBAFqB,CACvB,yBAAyB,CACvB,8BAA8B,CAAC;EAAE,YAAY,EAAE,IAAC,GAAyC;;AAF7F,AAGI,yBAHqB,CACvB,yBAAyB,CAEvB,0BAA0B,CAAC;EAAE,YAAY,EAAE,IAAC,GAAyC;;AAHzF,AAKE,yBALuB,CAKvB,0BAA0B,CAAC;EAAE,YAAY,EAAE,IAAC,GAAyC;;AALvF,AAME,yBANuB,CAMvB,8BAA8B,CAAC;EAAE,YAAY,ECjJX,GAAG,GDiJgD;;AAIvF,AACE,mBADiB,CAAA,AAAA,GAAC,CAAD,GAAC,AAAA,EAClB,2BAA2B,CAAC;EAC1B,OAAO,EAAE,YAAa,GACvB;;AAHH,AAIE,mBAJiB,CAAA,AAAA,GAAC,CAAD,GAAC,AAAA,EAIlB,+BAA+B,CAAC;EAC9B,IAAI,EAAE,GAAI;EACV,KAAK,EAAE,OAAQ,GAChB;;AAPH,AAQE,mBARiB,CAAA,AAAA,GAAC,CAAD,GAAC,AAAA,EAQlB,6BAA6B,CAAC;EAC5B,IAAI,EC/J8B,IAAI;EDgKtC,KAAK,EAAE,OAAQ,GAChB;;AAGH,AAGM,4BAHsB,CAAA,AAAA,GAAC,CAAD,GAAC,AAAA,EAC3B,yBAAyB,CACvB,yBAAyB,CACvB,8BAA8B,CAAC;EAAE,aAAa,EAAE,IAAC,GAAyC;;AAHhG,AAIM,4BAJsB,CAAA,AAAA,GAAC,CAAD,GAAC,AAAA,EAC3B,yBAAyB,CACvB,yBAAyB,CAEvB,0BAA0B,CAAC;EAAE,aAAa,EAAE,IAAC,GAAyC;;AAJ5F,AAMI,4BANwB,CAAA,AAAA,GAAC,CAAD,GAAC,AAAA,EAC3B,yBAAyB,CAKvB,0BAA0B,CAAC;EAAE,aAAa,EAAE,IAAC,GAAyC;;AAN1F,AAOI,4BAPwB,CAAA,AAAA,GAAC,CAAD,GAAC,AAAA,EAC3B,yBAAyB,CAMvB,8BAA8B,CAAC;EAAE,aAAa,EC1Kd,GAAG,GD0KmD;;AG7N1F,AAAA,oBAAoB,CAAC;EACnB,MAAM,EAAE,KAAM;EACd,IAAI,EAAE,CAAE;EACR,QAAQ,EAAE,KAAM;EAChB,KAAK,EAAE,CAAE;EACT,GAAG,EAAE,CAAE;EACP,OAAO,EAAE,EAAG,GACb;;AACD,AAAA,mBAAmB,CAAC;EAClB,OAAO,EAAE,EAAG;EACZ,QAAQ,EAAE,KAAM,GAKjB;EAPD,AAAA,mBAAmB,AAIhB,4BAA4B,CAAC;IAC5B,QAAQ,EAAE,QAAS,GACpB;;ACdH,AAAA,mBAAmB,CAAC;EAClB,aAAa,EAAE,GAAI;EACnB,gBAAgB,EAAE,IAAK;EACvB,UAAU,EAAE,aAAc;EAC1B,OAAO,EAAE,IAAK,GACf;;AACD,AAAoB,oBAAA,AAAA,YAAY,CAAC;EAC/B,gBAAgB,EAAO,yBAAO,GAC/B;;ACRD,gBAAgB;AAiBhB,gBAAgB;AGjBhB,AAAA,IAAI,CAAC;EACH,gBAAgB,EAAE,IAAK;EACvB,WAAW,EAAE,GAAI;EACjB,cAAc,EAAE,kBAAmB;EACnC,sBAAsB,EAAE,WAAY,GACrC;;AAED,AAAA,OAAO,CAAC;EACN,aAAa,EAAE,IAAK,GAiBrB;EAlBD,AAGE,OAHK,CAGL,cAAc,CAAC;IACb,aAAa,EAAE,cAAe;IAC9B,OAAO,EAAE,YAAa;IACtB,SAAS,EAAE,IAAK;IAChB,aAAa,EAAE,IAAK;IACpB,cAAc,EAAE,GAAI,GACrB;EATH,AAAA,OAAO,AAWJ,aAAa,CAAC;IACb,aAAa,EAAE,IAAK,GACrB;EAbH,AAAA,OAAO,AAeJ,WAAW,CAAC;IACX,aAAa,EAAE,GAAI,GACpB;;AAGH,AAAA,EAAE,CAAC;EACD,UAAU,EAAE,IAAK;EACjB,MAAM,EAAE,CAAE;EACV,OAAO,EAAE,CAAE,GACZ;;AAED,AACE,EADA,CACA,EAAE,CAAC;EACD,aAAa,EAAE,IAAK,GACrB;;AAGH,AAAA,CAAC,E6BvCD,A7BuCA,kB6BvCkB,CAOhB,aAAa,EEPf,A/BuCA,wB+BvCwB,CAgBtB,aAAa,EChBf,AhCuCA,6BgCvC6B,CAC3B,wBAAwB,CAoBtB,aAAa,EAOjB,AhCWA,2BgCX2B,CACzB,sBAAsB,CAoBpB,aAAa,EIsBjB,ApChCA,sBoCgCsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,CpChDpB;EACA,KAAK,EHvCY,OAAO,GGmDzB;EAbD,AAAA,CAAC,AAGE,MAAM,E6B1CT,A7BuCA,kB6BvCkB,CAOhB,aAAa,A7BmCZ,MAAM,E+B1CT,A/BuCA,wB+BvCwB,CAgBtB,aAAa,A/B0BZ,MAAM,EgC1CT,AhCuCA,6BgCvC6B,CAC3B,wBAAwB,CAoBtB,aAAa,AhCqBd,MAAM,EgCdT,AhCWA,2BgCX2B,CACzB,sBAAsB,CAoBpB,aAAa,AhCPd,MAAM,EoC6BT,ApChCA,sBoCgCsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,ApC7CnB,MAAM,CAAC;IACN,KAAK,EH1CU,OAAO;IG2CtB,eAAe,EAAE,IAAK,GACvB;EANH,AAAA,CAAC,AAQE,MAAM,E6B/CT,A7BuCA,kB6BvCkB,CAOhB,aAAa,A7BwCZ,MAAM,E+B/CT,A/BuCA,wB+BvCwB,CAgBtB,aAAa,A/B+BZ,MAAM,EgC/CT,AhCuCA,6BgCvC6B,CAC3B,wBAAwB,CAoBtB,aAAa,AhC0Bd,MAAM,EgCnBT,AhCWA,2BgCX2B,CACzB,sBAAsB,CAoBpB,aAAa,AhCFd,MAAM,EoCwBT,ApChCA,sBoCgCsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,ApCxCnB,MAAM,CAAC;IACN,KAAK,EH/CU,OAAO;IGgDtB,OAAO,EAAE,IAAK;IACd,eAAe,EAAE,IAAK,GACvB;;AAGH,AAAA,EAAE,EAAE,AAAA,EAAE,EAAE,AAAA,EAAE,EAAE,AAAA,EAAE,EAAE,AAAA,EAAE,EAAE,AAAA,EAAE,CAAC;EACrB,UAAU,EAAE,CAAE,GACf;;AAED,AAAA,CAAC,AACE,WAAW,CAAC;EACX,MAAM,EAAE,CAAE,GACX;;AAGH,kBAAkB,CAAlB,IAAkB;EAChB,AAAA,EAAE;IACA,iBAAiB,EAAE,YAAM;IACzB,SAAS,EAAE,YAAM;EAEnB,AAAA,IAAI;IACF,iBAAiB,EAAE,cAAM;IACzB,SAAS,EAAE,cAAM;;AAIrB,UAAU,CAAV,IAAU;EACR,AAAA,EAAE;IACA,iBAAiB,EAAE,YAAM;IACzB,SAAS,EAAE,YAAM;EAEnB,AAAA,IAAI;IACF,iBAAiB,EAAE,cAAM;IACzB,SAAS,EAAE,cAAM;;AClFrB,AAAA,YAAY,EMAZ,ANAA,eMAe,CAUb,KAAK,EAVP,ANAA,eMAe,CAkBb,OAAO,EAlBT,ANAA,eMAe,CAsBb,OAAO,EAtBT,ANAA,eMAe,CA0Bb,IAAI,EA1BN,ANAA,eMAe,CA8Bb,QAAQ,EG9BV,ATAA,YSAY,CACV,EAAE,CAGA,CAAC,EAJL,ATAA,YSAY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,EAPf,A5BAA,kB4BAkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,EnBPf,ATAA,YSAY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,EAhBf,A9BAA,wB8BAwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,ErBhBf,ATAA,YSAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,EArBjB,A/BAA,6B+BA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,EtBrBjB,ATAA,YSAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,EArBjB,A/B5BA,2B+B4B2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,EtBjDjB,ATAA,YSAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,EAhBtB,AnCvEA,sBmCuEsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,EzBvFtB,AVAA,sBUAsB,EKAtB,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,EA9CX,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,EA1Db,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,EA9Db,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,EAlEX,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,EAtEV,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,EM1Ed,ArBAA,YqBAY,CAYV,cAAc,CAiBZ,YAAY,EA7BhB,ArBAA,YqBAY,CAkCV,aAAa,CAUX,oBAAoB,EE5CxB,AvBAA,oBuBAoB,CAGlB,EAAE,CAsBA,gBAAgB,ECzBpB,AxBAA,+BwBA+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,CxBRH;EACX,gBAAgB,EAAE,OAAM;EACxB,YAAY,EAAE,OAAM,GAWrB;EAbD,AAAA,YAAY,AAIT,MAAM,EMJT,ANAA,eMAe,CAUb,KAAK,ANNJ,MAAM,EMJT,ANAA,eMAe,CAkBb,OAAO,ANdN,MAAM,EMJT,ANAA,eMAe,CAsBb,OAAO,ANlBN,MAAM,EMJT,ANAA,eMAe,CA0Bb,IAAI,ANtBH,MAAM,EMJT,ANAA,eMAe,CA8Bb,QAAQ,AN1BP,MAAM,ESJT,ATAA,YSAY,CACV,EAAE,CAGA,CAAC,ATAF,MAAM,ESJT,ATAA,YSAY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,A5BHZ,MAAM,E4BJT,A5BAA,kB4BAkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,A5BHZ,MAAM,ESJT,ATAA,YSAY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,A9BZZ,MAAM,E8BJT,A9BAA,wB8BAwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,A9BZZ,MAAM,ESJT,ATAA,YSAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,A/BjBd,MAAM,E+BJT,A/BAA,6B+BA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,A/BjBd,MAAM,ESJT,ATAA,YSAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,A/B7Cd,MAAM,E+BwBT,A/B5BA,2B+B4B2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,A/B7Cd,MAAM,ESJT,ATAA,YSAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,AnCnFnB,MAAM,EmCmET,AnCvEA,sBmCuEsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,AnCnFnB,MAAM,EUJT,AVAA,sBUAsB,AVInB,MAAM,EeJT,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,Af1CR,MAAM,EeJT,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,AftDV,MAAM,EeJT,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,Af1DV,MAAM,EeJT,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,Af9DR,MAAM,EeJT,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,AflEP,MAAM,EeJT,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,AftEX,MAAM,EqBJT,ArBAA,YqBAY,CAYV,cAAc,CAiBZ,YAAY,ArBzBb,MAAM,EqBJT,ArBAA,YqBAY,CAkCV,aAAa,CAUX,oBAAoB,ArBxCrB,MAAM,EuBJT,AvBAA,oBuBAoB,CAGlB,EAAE,CAsBA,gBAAgB,AvBrBjB,MAAM,EwBJT,AxBAA,+BwBA+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,AxBJb,MAAM,EAJT,AAAA,YAAY,AAIA,OAAO,EMJnB,ANAA,eMAe,CAUb,KAAK,ANNK,OAAO,EMJnB,ANAA,eMAe,CAkBb,OAAO,ANdG,OAAO,EMJnB,ANAA,eMAe,CAsBb,OAAO,ANlBG,OAAO,EMJnB,ANAA,eMAe,CA0Bb,IAAI,ANtBM,OAAO,EMJnB,ANAA,eMAe,CA8Bb,QAAQ,AN1BE,OAAO,ESJnB,ATAA,YSAY,CACV,EAAE,CAGA,CAAC,ATAO,OAAO,ESJnB,ATAA,YSAY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,A5BHH,OAAO,E4BJnB,A5BAA,kB4BAkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,A5BHH,OAAO,ESJnB,ATAA,YSAY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,A9BZH,OAAO,E8BJnB,A9BAA,wB8BAwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,A9BZH,OAAO,ESJnB,ATAA,YSAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,A/BjBL,OAAO,E+BJnB,A/BAA,6B+BA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,A/BjBL,OAAO,ESJnB,ATAA,YSAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,A/B7CL,OAAO,E+BwBnB,A/B5BA,2B+B4B2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,A/B7CL,OAAO,ESJnB,ATAA,YSAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,AnCnFV,OAAO,EmCmEnB,AnCvEA,sBmCuEsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,AnCnFV,OAAO,EUJnB,AVAA,sBUAsB,AVIV,OAAO,EeJnB,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,Af1CC,OAAO,EeJnB,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,AftDD,OAAO,EeJnB,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,Af1DD,OAAO,EeJnB,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,Af9DC,OAAO,EeJnB,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,AflEE,OAAO,EeJnB,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,AftEF,OAAO,EqBJnB,ArBAA,YqBAY,CAYV,cAAc,CAiBZ,YAAY,ArBzBJ,OAAO,EqBJnB,ArBAA,YqBAY,CAkCV,aAAa,CAUX,oBAAoB,ArBxCZ,OAAO,EuBJnB,AvBAA,oBuBAoB,CAGlB,EAAE,CAsBA,gBAAgB,AvBrBR,OAAO,EwBJnB,AxBAA,+BwBA+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,AxBJJ,OAAO,EAJnB,AAAA,YAAY,AAIU,MAAM,EMJ5B,ANAA,eMAe,CAUb,KAAK,ANNe,MAAM,EMJ5B,ANAA,eMAe,CAkBb,OAAO,ANda,MAAM,EMJ5B,ANAA,eMAe,CAsBb,OAAO,ANlBa,MAAM,EMJ5B,ANAA,eMAe,CA0Bb,IAAI,ANtBgB,MAAM,EMJ5B,ANAA,eMAe,CA8Bb,QAAQ,AN1BY,MAAM,ESJ5B,ATAA,YSAY,CACV,EAAE,CAGA,CAAC,ATAiB,MAAM,ESJ5B,ATAA,YSAY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,A5BHO,MAAM,E4BJ5B,A5BAA,kB4BAkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,A5BHO,MAAM,ESJ5B,ATAA,YSAY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,A9BZO,MAAM,E8BJ5B,A9BAA,wB8BAwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,A9BZO,MAAM,ESJ5B,ATAA,YSAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,A/BjBK,MAAM,E+BJ5B,A/BAA,6B+BA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,A/BjBK,MAAM,ESJ5B,ATAA,YSAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,A/B7CK,MAAM,E+BwB5B,A/B5BA,2B+B4B2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,A/B7CK,MAAM,ESJ5B,ATAA,YSAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,AnCnFA,MAAM,EmCmE5B,AnCvEA,sBmCuEsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,AnCnFA,MAAM,EUJ5B,AVAA,sBUAsB,AVIA,MAAM,EeJ5B,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,Af1CW,MAAM,EeJ5B,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,AftDS,MAAM,EeJ5B,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,Af1DS,MAAM,EeJ5B,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,Af9DW,MAAM,EeJ5B,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,AflEY,MAAM,EeJ5B,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,AftEQ,MAAM,EqBJ5B,ArBAA,YqBAY,CAYV,cAAc,CAiBZ,YAAY,ArBzBM,MAAM,EqBJ5B,ArBAA,YqBAY,CAkCV,aAAa,CAUX,oBAAoB,ArBxCF,MAAM,EuBJ5B,AvBAA,oBuBAoB,CAGlB,EAAE,CAsBA,gBAAgB,AvBrBE,MAAM,EwBJ5B,AxBAA,+BwBA+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,AxBJM,MAAM,EAJ5B,AAAA,YAAY,AAImB,OAAO,AAAA,MAAM,EMJ5C,ANAA,eMAe,CAUb,KAAK,ANNwB,OAAO,AAAA,MAAM,EMJ5C,ANAA,eMAe,CAkBb,OAAO,ANdsB,OAAO,AAAA,MAAM,EMJ5C,ANAA,eMAe,CAsBb,OAAO,ANlBsB,OAAO,AAAA,MAAM,EMJ5C,ANAA,eMAe,CA0Bb,IAAI,ANtByB,OAAO,AAAA,MAAM,EMJ5C,ANAA,eMAe,CA8Bb,QAAQ,AN1BqB,OAAO,AAAA,MAAM,ESJ5C,ATAA,YSAY,CACV,EAAE,CAGA,CAAC,ATA0B,OAAO,AAAA,MAAM,ESJ5C,ATAA,YSAY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,A5BHgB,OAAO,AAAA,MAAM,E4BJ5C,A5BAA,kB4BAkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,A5BHgB,OAAO,AAAA,MAAM,ESJ5C,ATAA,YSAY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,A9BZgB,OAAO,AAAA,MAAM,E8BJ5C,A9BAA,wB8BAwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,A9BZgB,OAAO,AAAA,MAAM,ESJ5C,ATAA,YSAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,A/BjBc,OAAO,AAAA,MAAM,E+BJ5C,A/BAA,6B+BA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,A/BjBc,OAAO,AAAA,MAAM,ESJ5C,ATAA,YSAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,A/B7Cc,OAAO,AAAA,MAAM,E+BwB5C,A/B5BA,2B+B4B2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,A/B7Cc,OAAO,AAAA,MAAM,ESJ5C,ATAA,YSAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,AnCnFS,OAAO,AAAA,MAAM,EmCmE5C,AnCvEA,sBmCuEsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,AnCnFS,OAAO,AAAA,MAAM,EUJ5C,AVAA,sBUAsB,AVIS,OAAO,AAAA,MAAM,EeJ5C,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,Af1CoB,OAAO,AAAA,MAAM,EeJ5C,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,AftDkB,OAAO,AAAA,MAAM,EeJ5C,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,Af1DkB,OAAO,AAAA,MAAM,EeJ5C,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,Af9DoB,OAAO,AAAA,MAAM,EeJ5C,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,AflEqB,OAAO,AAAA,MAAM,EeJ5C,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,AftEiB,OAAO,AAAA,MAAM,EqBJ5C,ArBAA,YqBAY,CAYV,cAAc,CAiBZ,YAAY,ArBzBe,OAAO,AAAA,MAAM,EqBJ5C,ArBAA,YqBAY,CAkCV,aAAa,CAUX,oBAAoB,ArBxCO,OAAO,AAAA,MAAM,EuBJ5C,AvBAA,oBuBAoB,CAGlB,EAAE,CAsBA,gBAAgB,AvBrBW,OAAO,AAAA,MAAM,EwBJ5C,AxBAA,+BwBA+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,AxBJe,OAAO,AAAA,MAAM,CAAC;IACzC,gBAAgB,EAAE,OAAM;IACxB,YAAY,EAAE,OAAM,GACrB;EAPH,AAAA,YAAY,AAST,SAAS,EMTZ,ANAA,eMAe,CAUb,KAAK,ANDJ,SAAS,EMTZ,ANAA,eMAe,CAkBb,OAAO,ANTN,SAAS,EMTZ,ANAA,eMAe,CAsBb,OAAO,ANbN,SAAS,EMTZ,ANAA,eMAe,CA0Bb,IAAI,ANjBH,SAAS,EMTZ,ANAA,eMAe,CA8Bb,QAAQ,ANrBP,SAAS,ESTZ,ATAA,YSAY,CACV,EAAE,CAGA,CAAC,ATKF,SAAS,ESTZ,ATAA,YSAY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,A5BEZ,SAAS,E4BTZ,A5BAA,kB4BAkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,A5BEZ,SAAS,ESTZ,ATAA,YSAY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,A9BPZ,SAAS,E8BTZ,A9BAA,wB8BAwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,A9BPZ,SAAS,ESTZ,ATAA,YSAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,A/BZd,SAAS,E+BTZ,A/BAA,6B+BA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,A/BZd,SAAS,ESTZ,ATAA,YSAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,A/BxCd,SAAS,E+BmBZ,A/B5BA,2B+B4B2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,A/BxCd,SAAS,ESTZ,ATAA,YSAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,AnC9EnB,SAAS,EmC8DZ,AnCvEA,sBmCuEsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,AnC9EnB,SAAS,EUTZ,AVAA,sBUAsB,AVSnB,SAAS,EeTZ,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,AfrCR,SAAS,EeTZ,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,AfjDV,SAAS,EeTZ,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,AfrDV,SAAS,EeTZ,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,AfzDR,SAAS,EeTZ,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,Af7DP,SAAS,EeTZ,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,AfjEX,SAAS,EqBTZ,ArBAA,YqBAY,CAYV,cAAc,CAiBZ,YAAY,ArBpBb,SAAS,EqBTZ,ArBAA,YqBAY,CAkCV,aAAa,CAUX,oBAAoB,ArBnCrB,SAAS,EuBTZ,AvBAA,oBuBAoB,CAGlB,EAAE,CAsBA,gBAAgB,AvBhBjB,SAAS,EwBTZ,AxBAA,+BwBA+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,AxBCb,SAAS,EATZ,AAAA,YAAY,AASG,SAAS,AAAA,MAAM,EMT9B,ANAA,eMAe,CAUb,KAAK,ANDQ,SAAS,AAAA,MAAM,EMT9B,ANAA,eMAe,CAkBb,OAAO,ANTM,SAAS,AAAA,MAAM,EMT9B,ANAA,eMAe,CAsBb,OAAO,ANbM,SAAS,AAAA,MAAM,EMT9B,ANAA,eMAe,CA0Bb,IAAI,ANjBS,SAAS,AAAA,MAAM,EMT9B,ANAA,eMAe,CA8Bb,QAAQ,ANrBK,SAAS,AAAA,MAAM,EST9B,ATAA,YSAY,CACV,EAAE,CAGA,CAAC,ATKU,SAAS,AAAA,MAAM,EST9B,ATAA,YSAY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,A5BEA,SAAS,AAAA,MAAM,E4BT9B,A5BAA,kB4BAkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,A5BEA,SAAS,AAAA,MAAM,EST9B,ATAA,YSAY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,A9BPA,SAAS,AAAA,MAAM,E8BT9B,A9BAA,wB8BAwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,A9BPA,SAAS,AAAA,MAAM,EST9B,ATAA,YSAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,A/BZF,SAAS,AAAA,MAAM,E+BT9B,A/BAA,6B+BA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,A/BZF,SAAS,AAAA,MAAM,EST9B,ATAA,YSAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,A/BxCF,SAAS,AAAA,MAAM,E+BmB9B,A/B5BA,2B+B4B2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,A/BxCF,SAAS,AAAA,MAAM,EST9B,ATAA,YSAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,AnC9EP,SAAS,AAAA,MAAM,EmC8D9B,AnCvEA,sBmCuEsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,AnC9EP,SAAS,AAAA,MAAM,EUT9B,AVAA,sBUAsB,AVSP,SAAS,AAAA,MAAM,EeT9B,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAOb,KAAK,AfrCI,SAAS,AAAA,MAAM,EeT9B,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmBb,OAAO,AfjDE,SAAS,AAAA,MAAM,EeT9B,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAuBb,OAAO,AfrDE,SAAS,AAAA,MAAM,EeT9B,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CA2Bb,KAAK,AfzDI,SAAS,AAAA,MAAM,EeT9B,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CA+Bb,IAAI,Af7DK,SAAS,AAAA,MAAM,EeT9B,AfAA,iBeAiB,CA2Bf,cAAc,CAYZ,eAAe,CAmCb,QAAQ,AfjEC,SAAS,AAAA,MAAM,EqBT9B,ArBAA,YqBAY,CAYV,cAAc,CAiBZ,YAAY,ArBpBD,SAAS,AAAA,MAAM,EqBT9B,ArBAA,YqBAY,CAkCV,aAAa,CAUX,oBAAoB,ArBnCT,SAAS,AAAA,MAAM,EuBT9B,AvBAA,oBuBAoB,CAGlB,EAAE,CAsBA,gBAAgB,AvBhBL,SAAS,AAAA,MAAM,EwBT9B,AxBAA,+BwBA+B,CAC7B,iBAAiB,CACf,gBAAgB,AAMb,SAAS,AxBCD,SAAS,AAAA,MAAM,CAAC;IAC3B,gBAAgB,EAAE,OAAO;IACzB,YAAY,EAAE,OAAO,GACtB;;AAGH,AAAA,SAAS,CAAC;EACR,gBAAgB,EAAE,OAAO;EACzB,YAAY,EJhBK,OAAO;EIiBxB,KAAK,EAAE,OAAM,GAOd;EAVD,AAAA,SAAS,AAKN,MAAM,EALT,AAAA,SAAS,AAKG,OAAO,EALnB,AAAA,SAAS,AAKa,MAAM,EAL5B,AAAA,SAAS,AAKsB,OAAO,AAAA,MAAM,EAL5C,AAAA,SAAS,AAKsC,OAAO,AAAA,MAAM,CAAC;IACzD,gBAAgB,EAAE,OAAO;IACzB,YAAY,EAAE,OAAM;IACpB,KAAK,EAAE,OAAM,GACd;;AAGH,AAAA,MAAM,E0B3BN,A1B2BA,sB0B3BsB,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,C1B7CJ;EACL,YAAY,EJpBY,OAAO;EIqB/B,OAAO,EAAE,YAAa;EACtB,MAAM,EAAE,CAAE,GAsBX;EAzBD,AAOM,MAPA,CAKJ,KAAK,CACH,EAAE,CACA,EAAE,E0BlCR,A1BkCM,sB0BlCgB,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,C1BxCT,KAAK,CACH,EAAE,CACA,EAAE,CAAC;IACD,aAAa,EAAE,GAAI;IACnB,OAAO,EAAE,SAAU;IACnB,UAAU,EAAE,IAAK,GAClB;EAXP,AAiBM,MAjBA,CAeJ,KAAK,CACH,EAAE,CACA,EAAE,E0B5CR,A1B4CM,sB0B5CgB,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,C1B9BT,KAAK,CACH,EAAE,CACA,EAAE,CAAC;IACD,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,wBAAI;IAC1B,OAAO,EAAE,SAAU;IACnB,UAAU,EAAE,IAAK;IACjB,cAAc,EAAE,MAAO,GACxB;;AAKP,AAAA,YAAY,CAAC;EACX,MAAM,EAAE,CAAE,GAKX;EAND,AAGE,YAHU,CAGV,EAAE,CAAC;IACD,OAAO,EAAE,CAAE,GACZ;;AAGH,AAEI,MAFE,AACH,WAAW,CACV,CAAC,EAFL,AAEI,MAFE,AACH,WAAW,C4B/Dd,kBAAkB,CAOhB,aAAa,EAPf,A5BgEI,kB4BhEc,C5B8DlB,MAAM,AACH,WAAW,C4BxDZ,aAAa,E5BuDf,AAEI,MAFE,AACH,WAAW,C8B/Dd,wBAAwB,CAgBtB,aAAa,EAhBf,A9BgEI,wB8BhEoB,C9B8DxB,MAAM,AACH,WAAW,C8B/CZ,aAAa,E9B8Cf,AAEI,MAFE,AACH,WAAW,C+B/Dd,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,EArBjB,A/BgEI,6B+BhEyB,CAC3B,wBAAwB,C/B6D1B,MAAM,AACH,WAAW,C+B1CV,aAAa,E/ByCjB,AAEI,MAFE,AACH,WAAW,C+BnCd,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,EArBjB,A/BoCI,2B+BpCuB,CACzB,sBAAsB,C/BiCxB,MAAM,AACH,WAAW,C+BdV,aAAa,E/BajB,AAEI,MAFE,AACH,WAAW,CmCQd,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,EAhBtB,AnCPI,sBmCOkB,CACpB,YAAY,CAUV,YAAY,CnCpBhB,MAAM,AACH,WAAW,CmCwBR,gBAAgB,CnCvBhB;EACA,KAAK,EJ5DQ,OAAO,GI6DrB;;AAIL,AAAA,IAAI,CAAC;EACH,gBAAgB,EAAE,OAAO;EACzB,KAAK,EAAE,OAAM;EACb,UAAU,EAAE,UAAW,GAaxB;EAhBD,AAMI,IANA,AAKD,WAAW,CACV,KAAK,AACF,MAAM,CAAC;IACN,OAAO,EAAE,IAAK,GACf;EATP,AAMI,IANA,AAKD,WAAW,CACV,KAAK,AAKF,WAAW,AAAA,MAAM,CAAC;IACjB,OAAO,EAAE,EAAG,GACb;;AAKP,AAAA,GAAG,CAAC;EACF,UAAU,EAAE,OAAQ;EACpB,YAAY,EAAE,OAAQ;EACtB,KAAK,EAAE,OAAQ;EACf,WAAW,EAAE,QAAS;EAAQ,WAAW;EACzC,WAAW,EAAE,aAAc;EAAG,yBAAyB;EACvD,WAAW,EAAE,SAAU;EAAO,eAAe;EAC7C,WAAW,EAAE,WAAY;EAAK,aAAa;EAC3C,SAAS,EAAE,UAAW;EAAQ,4BAA4B,EAC3D;;AAED,MAAM,MAAD,MAAM,MAAM,SAAS,EAAE,KAAK;EAC/B,AAAA,MAAM,E0BpGR,A1BoGE,sB0BpGoB,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,C1B4BF;IACJ,UAAU,EAAE,MAAO,GACrB;EAED,AAEQ,WAFG,GACP,EAAE,GACA,EAAE,AAAA,OAAO,CAAC;IACV,OAAO,EAAE,CAAE,GACZ;;AC5GP,AAAA,UAAU,CAAC;EH8DV,OAAO,EAAE,WAAY;EACrB,OAAO,EAAE,YAAa;EACtB,OAAO,EAAE,SAAU;EACnB,OAAO,EAAE,WAAY;EACrB,OAAO,EAAE,IAAK;EAmCb,qBAAqB,EAAE,MAAO;EAC9B,kBAAkB,EAAE,QAAS;EAQ9B,sBAAsB,EG5GG,MAAM;EH6G/B,mBAAmB,EG7GM,MAAM;EH8G/B,kBAAkB,EG9GO,MAAM;EH+G/B,cAAc,EG/GW,MAAM;EAC9B,MAAM,EAAE,KAAM;EACd,KAAK,EAAE,KAAM;EACb,UAAU,EAAE,CAAE;EACd,SAAS,EAAE,CAAE,GACd;;ACPD,AAAA,cAAc,CAAC;EJwQd,gBAAgB,EIvQD,CAAC;EJwQhB,YAAY,EIxQG,CAAC;EJyQhB,aAAa,EIzQE,CAAC;EJ0QhB,SAAS,EI1QM,CAAC;EJ2QhB,QAAQ,EI3QO,CAAC;EJ4QhB,IAAI,EI5QW,CAAC;EJ6DhB,OAAO,EAAE,WAAY;EACrB,OAAO,EAAE,YAAa;EACtB,OAAO,EAAE,SAAU;EACnB,OAAO,EAAE,WAAY;EACrB,OAAO,EAAE,IAAK;EAmCb,qBAAqB,EAAE,MAAO;EAC9B,kBAAkB,EAAE,QAAS;EAQ9B,sBAAsB,EI3GG,MAAM;EJ4G/B,mBAAmB,EI5GM,MAAM;EJ6G/B,kBAAkB,EI7GO,MAAM;EJ8G/B,cAAc,EI9GW,MAAM;EAC9B,UAAU,EAAE,CAAE,GAef;EAnBD,AAME,cANY,CAMZ,YAAY,CAAC;IJkQd,gBAAgB,EIjQC,IAAI;IJkQrB,YAAY,EIlQK,IAAI;IJmQrB,aAAa,EInQI,IAAI;IJoQrB,SAAS,EIpQQ,IAAI;IJqQrB,QAAQ,EIrQS,IAAI;IJsQrB,IAAI,EItQa,IAAI;IAClB,aAAa,EAAE,GAAG,CAAC,KAAK,CNAF,OAAO;IMC7B,OAAO,EAAE,SAAU,GACpB;EAVH,AAYE,cAZY,CAYZ,UAAU,CAAC;IJ4PZ,gBAAgB,EI3PC,CAAC;IJ4PlB,YAAY,EI5PK,CAAC;IJ6PlB,aAAa,EI7PI,CAAC;IJ8PlB,SAAS,EI9PQ,CAAC;IJ+PlB,QAAQ,EI/PS,CAAC;IJgQlB,IAAI,EIhQa,CAAC;IACf,gBAAgB,EAAE,mBAAI;IACtB,MAAM,EAAE,IAAK;IACb,UAAU,EAAE,IAAK;IACjB,QAAQ,EAAE,QAAS,GACpB;;AAGH,MAAM,MAAD,MAAM,MAAM,SAAS,EAAE,KAAK;EAC/B,AACE,cADY,CACZ,YAAY,CAAC;IACX,OAAO,EAAE,QAAS,GACnB;;ACzBL,AAAA,cAAc,CAAC;ELwQd,gBAAgB,EKvQD,IAAI;ELwQnB,YAAY,EKxQG,IAAI;ELyQnB,aAAa,EKzQE,IAAI;EL0QnB,SAAS,EK1QM,IAAI;EL2QnB,QAAQ,EK3QO,IAAI;EL4QnB,IAAI,EK5QW,IAAI;EAClB,gBAAgB,EAAE,OAAO;EACzB,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,OAAM;EAC9B,UAAU,EAAE,IAAK;EACjB,KAAK,EPce,KAAK,GO0H1B;EA7ID,AAOE,cAPY,CAOZ,iBAAiB,CAAC;IAChB,gBAAgB,EAAE,OAAO;IACzB,MAAM,EAAE,IAAK;IACb,aAAa,EAAE,GAAG,CAAC,KAAK,CPEH,OAAO;IOD5B,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO;IAC7B,OAAO,EAAE,GAAI;IACb,KAAK,EAAE,IAAK,GAWb;IAxBH,AAeI,cAfU,CAOZ,iBAAiB,CAQf,2BAA2B,AACxB,MAAM,CAAC;MACN,OAAO,EAAE,IAAK,GACf;IAlBP,AAqBI,cArBU,CAOZ,iBAAiB,CAcf,+BAA+B,CAAC;MAC9B,YAAY,EAAE,GAAI,GACnB;EAvBL,AA2BI,cA3BU,CA0BZ,gBAAgB,CACd,MAAM,CAAC;INsBT,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAIC,IAAI;IACzB,KAAK,EAAE,OAAO;IMzBV,gBAAgB,EAAE,OAAO;IACzB,aAAa,EAAE,GAAG,CAAC,KAAK,CPlBL,OAAO;IOmB1B,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO;IAC7B,OAAO,EAAE,IAAK;IACd,QAAQ,EAAE,QAAS,GAuDpB;IAxFL,AAmCM,cAnCQ,CA0BZ,gBAAgB,CACd,MAAM,CAQJ,MAAM,CAAC;MACL,OAAO,EAAE,KAAM;MACf,SAAS,EAAE,IAAK;MAChB,YAAY,EAAE,IAAK;MACnB,UAAU,EAAE,SAAU,GACvB;IAxCP,AA0CM,cA1CQ,CA0BZ,gBAAgB,CACd,MAAM,CAeJ,KAAK,CAAC;MACJ,SAAS,EAAE,GAAI;MACf,cAAc,EAAE,SAAU,GAiB3B;MA7DP,AA8CQ,cA9CM,CA0BZ,gBAAgB,CACd,MAAM,CAeJ,KAAK,CAIH,EAAE,AACC,MAAM,CAAC;QACN,OAAO,EAAE,IAAK,GACf;MAjDX,AA8CQ,cA9CM,CA0BZ,gBAAgB,CACd,MAAM,CAeJ,KAAK,CAIH,EAAE,AAKC,WAAW,AACT,MAAM,CAAC;QACN,OAAO,EAAE,EAAG,GACb;MAtDb,AA0DQ,cA1DM,CA0BZ,gBAAgB,CACd,MAAM,CAeJ,KAAK,CAgBH,SAAS,CAAC;QACR,KAAK,EP1DI,OAAO,GO2DjB;IA5DT,AA+DM,cA/DQ,CA0BZ,gBAAgB,CACd,MAAM,CAoCJ,sBAAsB,CAAC;MACrB,aAAa,EAAE,GAAI;MACnB,UAAU,EAAU,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAI;MACzC,eAAe,EAAK,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAI;MACzC,kBAAkB,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAI;MACzC,OAAO,EAAE,YAAa;MACtB,MAAM,EAAE,IAAK;MACb,UAAU,EAAE,IAAK;MACjB,QAAQ,EAAE,QAAS;MACnB,KAAK,EAAE,IAAK;MACZ,GAAG,EAAE,GAAI;MACT,KAAK,EAAE,IAAK,GAab;MAvFP,AA+DM,cA/DQ,CA0BZ,gBAAgB,CACd,MAAM,CAoCJ,sBAAsB,AAanB,GAAG,CAAC;QACH,UAAU,EAAE,OAAM,GACnB;MA9ET,AA+DM,cA/DQ,CA0BZ,gBAAgB,CACd,MAAM,CAoCJ,sBAAsB,AAiBnB,QAAQ,CAAC;QACR,UAAU,EAAE,OAAM,GACnB;MAlFT,AA+DM,cA/DQ,CA0BZ,gBAAgB,CACd,MAAM,CAoCJ,sBAAsB,AAqBnB,KAAK,CAAC;QACL,UAAU,EAAE,OAAM,GACnB;EAtFT,AA2FM,cA3FQ,CA0BZ,gBAAgB,CAgEd,sBAAsB,AAgCnB,wBAAwB,CACvB,KAAK,AA/BJ,MAAM,EA5Ff,AA2FM,cA3FQ,CA0BZ,gBAAgB,CAgEd,sBAAsB,AAsCnB,uBAAuB,CACtB,IAAI,AArCH,MAAM,EA5Ff,AA2FM,cA3FQ,CA0BZ,gBAAgB,CAgEd,sBAAsB,AA4CnB,yBAAyB,CACxB,MAAM,AA3CL,MAAM,CAAC;IACN,UAAU,EAAE,OAAO;IACnB,aAAa,EAAE,GAAI;IACnB,OAAO,EAAE,EAAG;IACZ,OAAO,EAAE,YAAa;IACtB,MAAM,EAAE,GAAI;IACZ,IAAI,EAAE,GAAI;IACV,UAAU,EAAE,IAAK;IACjB,QAAQ,EAAE,QAAS;IACnB,GAAG,EAAE,GAAI;IACT,KAAK,EAAE,GAAI,GACZ;EAvGT,AA0GM,cA1GQ,CA0BZ,gBAAgB,CAgEd,sBAAsB,CAgBpB,CAAC,EA1GP,AA0GM,cA1GQ,CA0BZ,gBAAgB,CAgEd,sBAAsB,CyB1F1B,kBAAkB,CAOhB,aAAa,EAPf,AzB0GM,kByB1GY,CzBAlB,cAAc,CA0BZ,gBAAgB,CAgEd,sBAAsB,CyBnFxB,aAAa,EzBPf,AA0GM,cA1GQ,CA0BZ,gBAAgB,CAgEd,sBAAsB,C2B1F1B,wBAAwB,CAgBtB,aAAa,EAhBf,A3B0GM,wB2B1GkB,C3BAxB,cAAc,CA0BZ,gBAAgB,CAgEd,sBAAsB,C2B1ExB,aAAa,E3BhBf,AA0GM,cA1GQ,CA0BZ,gBAAgB,CAgEd,sBAAsB,C4B1F1B,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,EArBjB,A5B0GM,6B4B1GuB,CAC3B,wBAAwB,C5BD1B,cAAc,CA0BZ,gBAAgB,CAgEd,sBAAsB,C4BrEtB,aAAa,E5BrBjB,AA0GM,cA1GQ,CA0BZ,gBAAgB,CAgEd,sBAAsB,C4B9D1B,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,EArBjB,A5B8EM,2B4B9EqB,CACzB,sBAAsB,C5B7BxB,cAAc,CA0BZ,gBAAgB,CAgEd,sBAAsB,C4BzCtB,aAAa,E5BjDjB,AA0GM,cA1GQ,CA0BZ,gBAAgB,CAgEd,sBAAsB,CgCnB1B,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,EAhBtB,AhCmCM,sBgCnCgB,CACpB,YAAY,CAUV,YAAY,ChClFhB,cAAc,CA0BZ,gBAAgB,CAgEd,sBAAsB,CgCHpB,gBAAgB,ChCmBd;INzDN,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAIC,IAAI;IACzB,KAAK,EAAE,OAAO;IMsDR,gBAAgB,EAAE,OAAO;IACzB,aAAa,EAAE,GAAG,CAAC,KAAK,CPjGP,OAAO;IOkGxB,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO;IAC7B,OAAO,EAAE,KAAM;IACf,SAAS,EAAE,IAAK;IAChB,OAAO,EAAE,mBAAoB;IAC7B,QAAQ,EAAE,QAAS;IACnB,cAAc,EAAE,SAAU,GAK3B;IAxHP,AA0GM,cA1GQ,CA0BZ,gBAAgB,CAgEd,sBAAsB,CAgBpB,CAAC,AAWE,MAAM,EArHf,AA0GM,cA1GQ,CA0BZ,gBAAgB,CAgEd,sBAAsB,CyB1F1B,kBAAkB,CAOhB,aAAa,AzB8GN,MAAM,EyBrHf,AzB0GM,kByB1GY,CzBAlB,cAAc,CA0BZ,gBAAgB,CAgEd,sBAAsB,CyBnFxB,aAAa,AzB8GN,MAAM,EArHf,AA0GM,cA1GQ,CA0BZ,gBAAgB,CAgEd,sBAAsB,C2B1F1B,wBAAwB,CAgBtB,aAAa,A3BqGN,MAAM,E2BrHf,A3B0GM,wB2B1GkB,C3BAxB,cAAc,CA0BZ,gBAAgB,CAgEd,sBAAsB,C2B1ExB,aAAa,A3BqGN,MAAM,EArHf,AA0GM,cA1GQ,CA0BZ,gBAAgB,CAgEd,sBAAsB,C4B1F1B,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,A5BgGR,MAAM,E4BrHf,A5B0GM,6B4B1GuB,CAC3B,wBAAwB,C5BD1B,cAAc,CA0BZ,gBAAgB,CAgEd,sBAAsB,C4BrEtB,aAAa,A5BgGR,MAAM,EArHf,AA0GM,cA1GQ,CA0BZ,gBAAgB,CAgEd,sBAAsB,C4B9D1B,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,A5BoER,MAAM,E4BzFf,A5B8EM,2B4B9EqB,CACzB,sBAAsB,C5B7BxB,cAAc,CA0BZ,gBAAgB,CAgEd,sBAAsB,C4BzCtB,aAAa,A5BoER,MAAM,EArHf,AA0GM,cA1GQ,CA0BZ,gBAAgB,CAgEd,sBAAsB,CgCnB1B,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,AhC8Bb,MAAM,EgC9Cf,AhCmCM,sBgCnCgB,CACpB,YAAY,CAUV,YAAY,ChClFhB,cAAc,CA0BZ,gBAAgB,CAgEd,sBAAsB,CgCHpB,gBAAgB,AhC8Bb,MAAM,CAAC;MACN,gBAAgB,EP3GH,OAAO,GO4GrB;;AAwBT,MAAM,MAAD,MAAM,MAAM,SAAS,EAAE,KAAK;EAC/B,AAAA,cAAc,CAAC;IACb,KAAK,EAAE,IAAK,GAab;IAdD,AAII,cAJU,CAGZ,gBAAgB,CACd,MAAM,CAAC;MACL,OAAO,EAAE,IAAK,GACf;IANL,AASM,cATQ,CAGZ,gBAAgB,CAKd,sBAAsB,CACpB,CAAC,EATP,AASM,cATQ,CAGZ,gBAAgB,CAKd,sBAAsB,CyBxJ5B,kBAAkB,CAOhB,aAAa,EAPf,AzByJQ,kByBzJU,CzBgJhB,cAAc,CAGZ,gBAAgB,CAKd,sBAAsB,CyBjJ1B,aAAa,EzByIb,AASM,cATQ,CAGZ,gBAAgB,CAKd,sBAAsB,C2BxJ5B,wBAAwB,CAgBtB,aAAa,EAhBf,A3ByJQ,wB2BzJgB,C3BgJtB,cAAc,CAGZ,gBAAgB,CAKd,sBAAsB,C2BxI1B,aAAa,E3BgIb,AASM,cATQ,CAGZ,gBAAgB,CAKd,sBAAsB,C4BxJ5B,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,EArBjB,A5ByJQ,6B4BzJqB,CAC3B,wBAAwB,C5B+IxB,cAAc,CAGZ,gBAAgB,CAKd,sBAAsB,C4BnIxB,aAAa,E5B2Hf,AASM,cATQ,CAGZ,gBAAgB,CAKd,sBAAsB,C4B5H5B,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,EArBjB,A5B6HQ,2B4B7HmB,CACzB,sBAAsB,C5BmHtB,cAAc,CAGZ,gBAAgB,CAKd,sBAAsB,C4BvGxB,aAAa,E5B+Ff,AASM,cATQ,CAGZ,gBAAgB,CAKd,sBAAsB,CgCjF5B,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,EAhBtB,AhCkFQ,sBgClFc,CACpB,YAAY,CAUV,YAAY,ChC8Dd,cAAc,CAGZ,gBAAgB,CAKd,sBAAsB,CgCjEtB,gBAAgB,ChCkEZ;MACA,OAAO,EAAE,gBAAiB,GAC3B;;AC3JT,AAAA,OAAO,CAAC;ENwQP,gBAAgB,EMvQD,IAAI;ENwQnB,YAAY,EMxQG,IAAI;ENyQnB,aAAa,EMzQE,IAAI;EN0QnB,SAAS,EM1QM,IAAI;EN2QnB,QAAQ,EM3QO,IAAI;EN4QnB,IAAI,EM5QW,IAAI;EN6DnB,OAAO,EAAE,WAAY;EACrB,OAAO,EAAE,YAAa;EACtB,OAAO,EAAE,SAAU;EACnB,OAAO,EAAE,WAAY;EACrB,OAAO,EAAE,IAAK;EAyCb,qBAAqB,EAAE,MAAO;EAC9B,kBAAkB,EAAE,UAAW;EAEhC,sBAAsB,EM3GG,GAAG;EN4G5B,mBAAmB,EM5GM,GAAG;EN6G5B,kBAAkB,EM7GO,GAAG;EN8G5B,cAAc,EM9GW,GAAG;ENuS3B,gBAAgB,EAAE,OAAQ;EAC1B,aAAa,EAAE,OAAQ;EAOxB,uBAAuB,EM9SG,aAAa;EN+SvC,oBAAoB,EM/SM,aAAa;ENgTvC,eAAe,EMhTW,aAAa;EACtC,gBAAgB,ERMK,OAAO;EQL5B,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC,OAAM;EAC/B,MAAM,ERWc,IAAI,GQ0BzB;EA5CD,AASE,OATK,CASL,KAAK,CAAC;IACJ,OAAO,EAAE,YAAa;IACtB,MAAM,EAAE,IAAK;IACb,MAAM,EAAE,IAAK;IACb,KAAK,EAAE,KAAM,GACd;EAdH,AAgBE,OAhBK,CAgBL,WAAW,CAAC;IACV,OAAO,EAAE,YAAa,GA0BvB;IA3CH,AAmBI,OAnBG,CAgBL,WAAW,CAGT,gBAAgB,CAAC;MACf,WAAW,EAAE,GAAG,CAAC,KAAK,CRRH,OAAO;MQS1B,KAAK,EAAE,IAAK,GAqBb;MA1CL,AAuBM,OAvBC,CAgBL,WAAW,CAGT,gBAAgB,CAId,CAAC,EAvBP,AAuBM,OAvBC,CAgBL,WAAW,CAGT,gBAAgB,CwBnBpB,kBAAkB,CAOhB,aAAa,EAPf,AxBuBM,kBwBvBY,CxBAlB,OAAO,CAgBL,WAAW,CAGT,gBAAgB,CwBZlB,aAAa,ExBPf,AAuBM,OAvBC,CAgBL,WAAW,CAGT,gBAAgB,C0BnBpB,wBAAwB,CAgBtB,aAAa,EAhBf,A1BuBM,wB0BvBkB,C1BAxB,OAAO,CAgBL,WAAW,CAGT,gBAAgB,C0BHlB,aAAa,E1BhBf,AAuBM,OAvBC,CAgBL,WAAW,CAGT,gBAAgB,C2BnBpB,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,EArBjB,A3BuBM,6B2BvBuB,CAC3B,wBAAwB,C3BD1B,OAAO,CAgBL,WAAW,CAGT,gBAAgB,C2BEhB,aAAa,E3BrBjB,AAuBM,OAvBC,CAgBL,WAAW,CAGT,gBAAgB,C2BSpB,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,EArBjB,A3BLM,2B2BKqB,CACzB,sBAAsB,C3B7BxB,OAAO,CAgBL,WAAW,CAGT,gBAAgB,C2B8BhB,aAAa,E3BjDjB,AAuBM,OAvBC,CAgBL,WAAW,CAGT,gBAAgB,C+BoDpB,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,EAhBtB,A/BhDM,sB+BgDgB,CACpB,YAAY,CAUV,YAAY,C/BlFhB,OAAO,CAgBL,WAAW,CAGT,gBAAgB,C+BoEd,gBAAgB,C/BhEd;QP0BN,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAIC,IAAI;QACzB,KAAK,EAAE,OAAO;QO7BR,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO;QAC9B,OAAO,EAAE,YAAa;QACtB,WAAW,ERTG,IAAI;QQUlB,OAAO,EAAE,MAAO,GAajB;QAzCP,AAuBM,OAvBC,CAgBL,WAAW,CAGT,gBAAgB,CAId,CAAC,AAOE,MAAM,EA9Bf,AAuBM,OAvBC,CAgBL,WAAW,CAGT,gBAAgB,CwBnBpB,kBAAkB,CAOhB,aAAa,AxBuBN,MAAM,EwB9Bf,AxBuBM,kBwBvBY,CxBAlB,OAAO,CAgBL,WAAW,CAGT,gBAAgB,CwBZlB,aAAa,AxBuBN,MAAM,EA9Bf,AAuBM,OAvBC,CAgBL,WAAW,CAGT,gBAAgB,C0BnBpB,wBAAwB,CAgBtB,aAAa,A1BcN,MAAM,E0B9Bf,A1BuBM,wB0BvBkB,C1BAxB,OAAO,CAgBL,WAAW,CAGT,gBAAgB,C0BHlB,aAAa,A1BcN,MAAM,EA9Bf,AAuBM,OAvBC,CAgBL,WAAW,CAGT,gBAAgB,C2BnBpB,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,A3BSR,MAAM,E2B9Bf,A3BuBM,6B2BvBuB,CAC3B,wBAAwB,C3BD1B,OAAO,CAgBL,WAAW,CAGT,gBAAgB,C2BEhB,aAAa,A3BSR,MAAM,EA9Bf,AAuBM,OAvBC,CAgBL,WAAW,CAGT,gBAAgB,C2BSpB,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,A3BnBR,MAAM,E2BFf,A3BLM,2B2BKqB,CACzB,sBAAsB,C3B7BxB,OAAO,CAgBL,WAAW,CAGT,gBAAgB,C2B8BhB,aAAa,A3BnBR,MAAM,EA9Bf,AAuBM,OAvBC,CAgBL,WAAW,CAGT,gBAAgB,C+BoDpB,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,A/BzDb,MAAM,E+ByCf,A/BhDM,sB+BgDgB,CACpB,YAAY,CAUV,YAAY,C/BlFhB,OAAO,CAgBL,WAAW,CAGT,gBAAgB,C+BoEd,gBAAgB,A/BzDb,MAAM,CAAC;UPmBd,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAIC,IAAI;UACzB,KAAK,EAAE,OAAO;UOtBN,gBAAgB,EAAE,OAAM;UACxB,WAAW,EAAE,GAAG,CAAC,KAAK,CRtBT,OAAO,GQuBrB;QAlCT,AAuBM,OAvBC,CAgBL,WAAW,CAGT,gBAAgB,CAId,CAAC,AAaE,SAAS,EApClB,AAuBM,OAvBC,CAgBL,WAAW,CAGT,gBAAgB,CwBnBpB,kBAAkB,CxBoCT,SAAS,AwB7BhB,aAAa,EAPf,AxBuBM,kBwBvBY,CxBAlB,OAAO,CAgBL,WAAW,CAGT,gBAAgB,CAiBX,SAAS,AwB7BhB,aAAa,ExBPf,AAuBM,OAvBC,CAgBL,WAAW,CAGT,gBAAgB,C0BnBpB,wBAAwB,C1BoCf,SAAS,A0BpBhB,aAAa,EAhBf,A1BuBM,wB0BvBkB,C1BAxB,OAAO,CAgBL,WAAW,CAGT,gBAAgB,CAiBX,SAAS,A0BpBhB,aAAa,E1BhBf,AAuBM,OAvBC,CAgBL,WAAW,CAGT,gBAAgB,C2BnBpB,6BAA6B,CAC3B,wBAAwB,C3BmCjB,SAAS,A2Bfd,aAAa,EArBjB,A3BuBM,6B2BvBuB,CAC3B,wBAAwB,C3BD1B,OAAO,CAgBL,WAAW,CAGT,gBAAgB,CAiBX,SAAS,A2Bfd,aAAa,E3BrBjB,AAuBM,OAvBC,CAgBL,WAAW,CAGT,gBAAgB,C2BSpB,2BAA2B,CACzB,sBAAsB,C3BOf,SAAS,A2Bad,aAAa,EArBjB,A3BLM,2B2BKqB,CACzB,sBAAsB,C3B7BxB,OAAO,CAgBL,WAAW,CAGT,gBAAgB,CAiBX,SAAS,A2Bad,aAAa,E3BjDjB,AAuBM,OAvBC,CAgBL,WAAW,CAGT,gBAAgB,C+BoDpB,sBAAsB,CACpB,YAAY,CAUV,YAAY,C/B9CP,SAAS,A+BmDZ,gBAAgB,EAhBtB,A/BhDM,sB+BgDgB,CACpB,YAAY,CAUV,YAAY,C/BlFhB,OAAO,CAgBL,WAAW,CAGT,gBAAgB,CAiBX,SAAS,A+BmDZ,gBAAgB,C/BnDH;UACT,gBAAgB,EAAE,KAAM;UACxB,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC,KAAM;UAC7B,MAAM,EAAE,OAAQ,GACjB;;AAMT,MAAM,MAAD,MAAM,MAAM,SAAS,EAAE,KAAK;EAG/B,AAAA,OAAO,CAAC;IACN,KAAK,EAAE,IAAK;IACZ,MAAM,EAJc,IAAI,GAiBzB;IAfD,AAIE,OAJK,CAIL,KAAK,CAAC;MACJ,MAAM,EAAE,GAAI,GACb;IANH,AAUM,OAVC,CAQL,WAAW,CACT,gBAAgB,CACd,CAAC,EAVP,AAUM,OAVC,CAQL,WAAW,CACT,gBAAgB,CwB1DtB,kBAAkB,CAOhB,aAAa,EAPf,AxB2DQ,kBwB3DU,CxBiDhB,OAAO,CAQL,WAAW,CACT,gBAAgB,CwBnDpB,aAAa,ExB0Cb,AAUM,OAVC,CAQL,WAAW,CACT,gBAAgB,C0B1DtB,wBAAwB,CAgBtB,aAAa,EAhBf,A1B2DQ,wB0B3DgB,C1BiDtB,OAAO,CAQL,WAAW,CACT,gBAAgB,C0B1CpB,aAAa,E1BiCb,AAUM,OAVC,CAQL,WAAW,CACT,gBAAgB,C2B1DtB,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,EArBjB,A3B2DQ,6B2B3DqB,CAC3B,wBAAwB,C3BgDxB,OAAO,CAQL,WAAW,CACT,gBAAgB,C2BrClB,aAAa,E3B4Bf,AAUM,OAVC,CAQL,WAAW,CACT,gBAAgB,C2B9BtB,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,EArBjB,A3B+BQ,2B2B/BmB,CACzB,sBAAsB,C3BoBtB,OAAO,CAQL,WAAW,CACT,gBAAgB,C2BTlB,aAAa,E3BAf,AAUM,OAVC,CAQL,WAAW,CACT,gBAAgB,C+BatB,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,EAhBtB,A/BZQ,sB+BYc,CACpB,YAAY,CAUV,YAAY,C/BjCd,OAAO,CAQL,WAAW,CACT,gBAAgB,C+B6BhB,gBAAgB,C/B5BZ;MACA,WAAW,EAbG,IAAI,GAcnB;;AC7DT,AAAA,cAAc,CAAC;EPwQd,gBAAgB,EOvQD,CAAC;EPwQhB,YAAY,EOxQG,CAAC;EPyQhB,aAAa,EOzQE,CAAC;EP0QhB,SAAS,EO1QM,CAAC;EP2QhB,QAAQ,EO3QO,CAAC;EP4QhB,IAAI,EO5QW,CAAC;EP6DhB,OAAO,EAAE,WAAY;EACrB,OAAO,EAAE,YAAa;EACtB,OAAO,EAAE,SAAU;EACnB,OAAO,EAAE,WAAY;EACrB,OAAO,EAAE,IAAK;EAyCb,qBAAqB,EAAE,MAAO;EAC9B,kBAAkB,EAAE,UAAW;EAEhC,sBAAsB,EO3GG,GAAG;EP4G5B,mBAAmB,EO5GM,GAAG;EP6G5B,kBAAkB,EO7GO,GAAG;EP8G5B,cAAc,EO9GW,GAAG;EAC3B,SAAS,EAAE,CAAE,GACd;;AAED,MAAM,MAAD,MAAM,MAAM,SAAS,EAAE,KAAK;EAC/B,AAAA,cAAc,CAAC;IP6Ff,qBAAqB,EAAE,MAAO;IAC9B,kBAAkB,EAAE,QAAS;IAQ9B,sBAAsB,EOrGK,MAAM;IPsGjC,mBAAmB,EOtGQ,MAAM;IPuGjC,kBAAkB,EOvGS,MAAM;IPwGjC,cAAc,EOxGa,MAAM,GAC/B;;ACVH,AAAA,eAAe,CAAC;EACd,KAAK,EAAE,KAAM;EACb,UAAU,EAAE,KAAM,GA+BnB;EAjCD,AAIE,eAJa,CAIb,cAAc,CAAC;IAGb,WAAW,EAAE,GAAI,GAClB;;ACRH,AACE,UADQ,CACR,MAAM,CAAC;EACL,WAAW,EAAE,IAAK;EAClB,aAAa,EAAE,CAAE;EACjB,YAAY,EAAE,IAAK;EACnB,aAAa,EAAE,CAAE;EACjB,YAAY,EAAE,IAAK;EACnB,aAAa,EAAE,IAAK,GAKrB;EAZH,AACE,UADQ,CACR,MAAM,AAQH,aAAa,CAAC;IACb,aAAa,EAAE,IAAK,GACrB;;AAXL,AAeI,UAfM,CAcR,iBAAiB,CACf,MAAM,CAAC;EACL,aAAa,EAAE,GAAI;EACnB,aAAa,EAAE,IAAK;EACpB,OAAO,EAAE,IAAK,GACf;;AAnBL,AAsBE,UAtBQ,CAsBR,MAAM,CAAC;EACL,YAAY,EAAE,IAAK,GACpB;;AAxBH,AA0BE,UA1BQ,CA0BR,UAAU,CAAC;EACT,KAAK,EAAE,OAAQ;EACf,MAAM,EAAE,OAAQ;EAChB,SAAS,EAAE,IAAK;EAChB,WAAW,EAAE,IAAK,GACnB;;AAGH,AACE,MADI,CACJ,EAAE,CAAC;EACD,UAAU,EAAE,WAAY,GACzB;;ACrCH,AAAA,qBAAqB,CAAC;EACpB,OAAO,EAAE,KAAM;EACf,aAAa,EAAE,GAAI;EACnB,UAAU,EAAE,IAAK,GAoBlB;EAvBD,AAKE,qBALmB,CAKnB,WAAW,CAAC;IACV,gBAAgB,EAAE,OAAQ;IAC1B,SAAS,EAAE,IAAK;IAChB,MAAM,EAAE,CAAE;IACV,OAAO,EAAE,CAAE,GAaZ;IAtBH,AAWI,qBAXiB,CAKnB,WAAW,CAMT,EAAE,CAAC;MACD,KAAK,EAAE,OAAO;MACd,aAAa,EAAE,CAAE,GAQlB;MArBL,AAgBQ,qBAhBa,CAKnB,WAAW,CAMT,EAAE,AAIC,WAAW,CACV,CAAC,EAhBT,AAgBQ,qBAhBa,CAKnB,WAAW,CAMT,EAAE,AAIC,WAAW,CoBflB,kBAAkB,CAOhB,aAAa,EAPf,ApBgBQ,kBoBhBU,CpBAlB,qBAAqB,CAKnB,WAAW,CAMT,EAAE,AAIC,WAAW,CoBRhB,aAAa,EpBPf,AAgBQ,qBAhBa,CAKnB,WAAW,CAMT,EAAE,AAIC,WAAW,CsBflB,wBAAwB,CAgBtB,aAAa,EAhBf,AtBgBQ,wBsBhBgB,CtBAxB,qBAAqB,CAKnB,WAAW,CAMT,EAAE,AAIC,WAAW,CsBChB,aAAa,EtBhBf,AAgBQ,qBAhBa,CAKnB,WAAW,CAMT,EAAE,AAIC,WAAW,CuBflB,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,EArBjB,AvBgBQ,6BuBhBqB,CAC3B,wBAAwB,CvBD1B,qBAAqB,CAKnB,WAAW,CAMT,EAAE,AAIC,WAAW,CuBMd,aAAa,EvBrBjB,AAgBQ,qBAhBa,CAKnB,WAAW,CAMT,EAAE,AAIC,WAAW,CuBalB,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,EArBjB,AvBZQ,2BuBYmB,CACzB,sBAAsB,CvB7BxB,qBAAqB,CAKnB,WAAW,CAMT,EAAE,AAIC,WAAW,CuBkCd,aAAa,EvBjDjB,AAgBQ,qBAhBa,CAKnB,WAAW,CAMT,EAAE,AAIC,WAAW,C2BwDlB,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,EAhBtB,A3BvDQ,sB2BuDc,CACpB,YAAY,CAUV,YAAY,C3BlFhB,qBAAqB,CAKnB,WAAW,CAMT,EAAE,AAIC,WAAW,C2BwEZ,gBAAgB,C3BvEZ;QACA,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,OAAQ,GACjB;;AAMT,MAAM,MAAD,MAAM,MAAM,SAAS,EAAE,KAAK;EAC/B,AAAA,WAAW,CAAC;IACV,SAAS,EAAE,IAAK;IAChB,WAAW,EAAE,GAAI,GAClB;;AC7BH,AACE,YADU,CACV,EAAE,CAAC;EACD,aAAa,EAAE,IAAK,GAUrB;;ACZH,AAAA,sBAAsB,CAAC;EAKrB,UAAU,EAAE,IAAK,GAClB;;ACND,AAAA,eAAe,AACZ,qBAAqB,CAAC;EAErB,cAAc,EAAE,SAAU,GAa3B;;AChBH,AAAA,UAAU,CAAC;EACT,aAAa,EAAE,IAAK,GAarB;EAdD,AAGE,UAHQ,CAGR,EAAE,CAAC;IACD,cAAc,EAAE,GAAI;IACpB,aAAa,EAAE,GAAG,CAAC,KAAK,ChBGF,OAAO;IgBF7B,aAAa,EAAE,GAAI,GAOpB;IAbH,AAGE,UAHQ,CAGR,EAAE,AAKC,WAAW,CAAC;MACX,cAAc,EAAE,CAAE;MAClB,aAAa,EAAE,IAAK;MACpB,aAAa,EAAE,CAAE,GAClB;;ACZL,AACE,UADQ,CACR,WAAW,CAAC;EhBEZ,qBAAqB,EgBDI,CAAC;EhBE1B,kBAAkB,EgBFO,CAAC;EhBG1B,iBAAiB,EgBHQ,CAAC;EhBI1B,aAAa,EgBJY,CAAC;EhBK1B,eAAe,EAAE,WAAY;EgBJ3B,aAAa,EAAE,GAAI;EACnB,OAAO,EAAE,SAAU;EACnB,MAAM,EAAE,IAAK,GACd;;ACLH,AACE,IADE,CACF,uBAAuB,CAAC;EACtB,UAAU,EAAE,KAAM;EAClB,UAAU,EAAE,KAAM,GAKnB;EARH,AACE,IADE,CACF,uBAAuB,AAIpB,MAAM,CAAC;IACN,OAAO,EAAE,IAAK,GACf;;AAIL,AAAG,GAAA,AAAA,SAAS,CAAC;EACX,UAAU,EAAE,IAAK;EACjB,YAAY,EAAE,IAAK;EACnB,aAAa,EAAE,GAAI,GACpB;;AChBD,AAAA,iBAAiB,CAAC;EAChB,UAAU,EAAE,IAAK;EACjB,MAAM,EAAE,GAAG,CAAC,KAAK,CnBMO,OAAO;EmBL/B,UAAU,EAAE,GAAG,CAAC,KAAK,CnBKG,OAAO;EmBJ/B,MAAM,EAAE,mBAAoB,GAmG7B;EAvGD,AAAA,iBAAiB,AAMd,YAAY,CAAC;IACZ,SAAS,EAAE,KAAM,GAClB;EARH,AAAA,iBAAiB,AAUd,aAAa,CAAC;IACb,SAAS,EAAE,KAAM,GAClB;EAZH,AAAA,iBAAiB,AAcd,YAAY,CAAC;IACZ,SAAS,EAAE,MAAO,GACnB;EAhBH,AAAA,iBAAiB,AAkBd,UAAU,CAAC;IACV,UAAU,EAAE,IAAK;IACjB,MAAM,EAAE,IAAK,GAKd;IAzBH,AAsBI,iBAtBa,AAkBd,UAAU,CAIT,YAAY,CAAC;MACX,OAAO,EAAE,CAAE,GACZ;EAxBL,AA2BE,iBA3Be,CA2Bf,cAAc,CAAC;IjBmChB,OAAO,EAAE,WAAY;IACrB,OAAO,EAAE,YAAa;IACtB,OAAO,EAAE,SAAU;IACnB,OAAO,EAAE,WAAY;IACrB,OAAO,EAAE,IAAK;IAyCb,qBAAqB,EAAE,MAAO;IAC9B,kBAAkB,EAAE,UAAW;IAEhC,sBAAsB,EiBjFK,GAAG;IjBkF9B,mBAAmB,EiBlFQ,GAAG;IjBmF9B,kBAAkB,EiBnFS,GAAG;IjBoF9B,cAAc,EiBpFa,GAAG;IjB6Q7B,gBAAgB,EAAE,OAAQ;IAC1B,aAAa,EAAE,OAAQ;IAOxB,uBAAuB,EiBpRK,aAAa;IjBqRzC,oBAAoB,EiBrRQ,aAAa;IjBsRzC,eAAe,EiBtRa,aAAa;IACtC,aAAa,EAAE,GAAG,CAAC,KAAK,CnBvBF,OAAO;ImBwB7B,OAAO,EAAE,IAAK,GA8Cf;IA9EH,AAkCI,iBAlCa,CA2Bf,cAAc,CAOZ,aAAa,CAAC;MACZ,SAAS,EAAE,IAAK;MAChB,WAAW,EAAE,IAAK,GACnB;IArCL,AAwCM,iBAxCW,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,CAAC;MAGb,WAAW,EAAE,GAAI,GAClB;EA5CP,AAgFE,iBAhFe,CAgFf,YAAY,CAAC;IACX,OAAO,EAAE,IAAK;IACd,QAAQ,EAAE,QAAS,GAgBpB;IAlGH,AAqFM,iBArFW,CAgFf,YAAY,CAIV,kBAAkB,CAChB,aAAa,CAAC;MACZ,SAAS,EAAE,IAAK;MAChB,OAAO,EAAE,MAAO,GACjB;IAxFP,AA0FM,iBA1FW,CAgFf,YAAY,CAIV,kBAAkB,CAMhB,IAAI,CAAC;MACH,KAAK,EAAE,GAAI,GACZ;IA5FP,AA8FM,iBA9FW,CAgFf,YAAY,CAIV,kBAAkB,CAUhB,MAAM,CAAC;MACL,KAAK,EAAE,GAAI,GACZ;EAhGP,AAoGE,iBApGe,CAoGf,WAAW,CAAC;IACV,SAAS,EAAE,IAAK,GACjB;;AAGH,MAAM,MAAD,MAAM,MAAM,SAAS,EAAE,KAAK;EAC/B,AAAA,iBAAiB,CAAC;IAChB,MAAM,EAAE,IAAK,GACd;;AC5GH,AACE,mBADiB,CACjB,2BAA2B,AACxB,MAAM,CAAC;EACN,OAAO,EAAE,IAAK,GACf;;AAJL,AAAA,mBAAmB,AAOhB,kBAAkB,CAAC;EAClB,SAAS,EAAE,KAAM;EACjB,OAAO,EAAE,YAAa,GACvB;;ACVH,AACE,SADO,CACP,aAAa,CAAC;EACZ,aAAa,EAAE,GAAG,CAAC,KAAK,CrBMF,OAAO,GqBiB9B;EAzBH,AACE,SADO,CACP,aAAa,AAGV,WAAW,CAAC;IACX,cAAc,EAAE,UAAW,GAC5B;EANL,AAQI,SARK,CACP,aAAa,CAOX,QAAQ,CAAC;IACP,MAAM,EAAE,IAAK;IACb,KAAK,ErBTQ,OAAO;IqBUpB,MAAM,EAAE,OAAQ;IAChB,OAAO,EAAE,YAAa;IACtB,WAAW,EAAE,IAAK;IAClB,MAAM,EAAE,UAAW;IACnB,OAAO,EAAE,IAAK;IACd,OAAO,EAAE,MAAO,GAQjB;IAxBL,AAQI,SARK,CACP,aAAa,CAOX,QAAQ,CAUL,AAAA,aAAC,CAAD,IAAC,AAAA,EAAoB;MACpB,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO;MAChC,KAAK,ErBTU,OAAO;MqBUtB,MAAM,EAAE,OAAQ;MAChB,aAAa,EAAE,IAAK,GACrB;;AAvBP,AA2BE,SA3BO,CA2BP,cAAc,CAAC;EACb,WAAW,EAAE,IAAK,GACnB;;AA7BH,AAAA,SAAS,AA+BN,WAAW,CAAC;EACX,OAAO,EAAE,YAAa;EACtB,KAAK,EAAE,GAAI,GACZ;;AAlCH,AAAA,SAAS,AAoCN,SAAS,CAAC;EnB0BZ,OAAO,EAAE,WAAY;EACrB,OAAO,EAAE,YAAa;EACtB,OAAO,EAAE,SAAU;EACnB,OAAO,EAAE,WAAY;EACrB,OAAO,EAAE,IAAK;EAyCb,qBAAqB,EAAE,MAAO;EAC9B,kBAAkB,EAAE,UAAW;EAEhC,sBAAsB,EmBxEK,GAAG;EnByE9B,mBAAmB,EmBzEQ,GAAG;EnB0E9B,kBAAkB,EmB1ES,GAAG;EnB2E9B,cAAc,EmB3Ea,GAAG;EAC3B,UAAU,EAAE,IAAK,GAkClB;EAzEH,AAyCI,SAzCK,AAoCN,SAAS,CAKR,aAAa,CAAC;InB+NjB,gBAAgB,EmB9NG,IAAI;InB+NvB,YAAY,EmB/NO,IAAI;InBgOvB,aAAa,EmBhOM,IAAI;InBiOvB,SAAS,EmBjOU,IAAI;InBkOvB,QAAQ,EmBlOW,IAAI;InBmOvB,IAAI,EmBnOe,IAAI;IAClB,aAAa,EAAE,IAAK;IACpB,YAAY,EAAE,GAAG,CAAC,KAAK,CrBpCH,OAAO,GqB2D5B;IAnEL,AA8CM,SA9CG,AAoCN,SAAS,CAKR,aAAa,CAKX,QAAQ,CAAC;MACP,MAAM,EAAE,IAAK;MACb,KAAK,ErB/CM,OAAO;MqBgDlB,MAAM,EAAE,OAAQ;MAChB,OAAO,EAAE,KAAM;MACf,WAAW,EAAE,IAAK;MAClB,MAAM,EAAE,CAAE;MACV,OAAO,EAAE,IAAK;MACd,OAAO,EAAE,cAAe,GAYzB;MAlEP,AA8CM,SA9CG,AAoCN,SAAS,CAKR,aAAa,CAKX,QAAQ,AAUL,YAAY,CAAC;QACZ,WAAW,EAAE,GAAI,GAClB;MA1DT,AA8CM,SA9CG,AAoCN,SAAS,CAKR,aAAa,CAKX,QAAQ,CAcL,AAAA,aAAC,CAAD,IAAC,AAAA,EAAoB;QACpB,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO;QAC/B,KAAK,ErBnDQ,OAAO;QqBoDpB,MAAM,EAAE,OAAQ;QAChB,YAAY,EAAE,IAAK,GACpB;EAjET,AAqEI,SArEK,AAoCN,SAAS,CAiCR,cAAc,CAAC;InBmMlB,gBAAgB,EmBlMG,CAAC;InBmMpB,YAAY,EmBnMO,CAAC;InBoMpB,aAAa,EmBpMM,CAAC;InBqMpB,SAAS,EmBrMU,CAAC;InBsMpB,QAAQ,EmBtMW,CAAC;InBuMpB,IAAI,EmBvMe,CAAC;IACf,OAAO,EAAE,aAAc,GACxB;;ACxEL,AACE,gBADc,CACd,EAAE,EADJ,AACM,gBADU,CACV,EAAE,CAAC;EACL,cAAc,EAAE,IAAK;EACrB,cAAc,EAAE,GAAI,GACrB;;AAJH,AAME,gBANc,CAMd,IAAI,CAAC;EACH,WAAW,EAAE,IAAK;EAClB,aAAa,EAAE,IAAK,GACrB;;AATH,AAYI,gBAZY,AAWb,sBAAsB,CACrB,IAAI,CAAC;EACH,SAAS,EAAE,KAAM,GAClB;;AAdL,AAkBI,gBAlBY,AAiBb,sBAAsB,CACrB,IAAI,CAAC;EACH,SAAS,EAAE,KAAM,GAClB;;ACpBL,AACE,kBADgB,CAChB,eAAe,CAAC;EACd,MAAM,EAAE,GAAI,GAMb;EARH,AAII,kBAJc,CAChB,eAAe,CAGb,IAAI,CAAC;IACH,gBAAgB,EvBJH,OAAO;IuBKpB,MAAM,EAAE,GAAI,GACb;;ACJL,AAAA,mBAAmB,CAAC;EtB2DnB,OAAO,EAAE,WAAY;EACrB,OAAO,EAAE,YAAa;EACtB,OAAO,EAAE,SAAU;EACnB,OAAO,EAAE,WAAY;EACrB,OAAO,EAAE,IAAK;EAgRb,iBAAiB,EsB7UI,MAAM;EtB8U3B,cAAc,EsB9UO,MAAM;EtBgV5B,mBAAmB,EsBhVG,MAAM;EtBiV5B,gBAAgB,EsBjVM,MAAM;EtBkV5B,WAAW,EsBlVW,MAAM;EtB0S3B,gBAAgB,EsBzSS,MAAM;EtB0S/B,aAAa,EsB1SY,MAAM;EtB4ShC,uBAAuB,EsB5SG,MAAM;EtB6ShC,oBAAoB,EsB7SM,MAAM;EtB8ShC,eAAe,EsB9SW,MAAM;EAC/B,UAAU,EAAE,mBAAI;EAChB,MAAM,EAAE,KAAM;EACd,UAAU,EAAE,KAAM,GAWnB;EAjBD,AAAA,mBAAmB,AAQhB,YAAY,CAAC;IACZ,UAAU,EAAE,IAAK;IACjB,MAAM,EAAE,CAAE;IACV,IAAI,EAAE,CAAE;IACR,MAAM,EAAE,CAAE;IACV,QAAQ,EAAE,QAAS;IACnB,KAAK,EAAE,CAAE;IACT,GAAG,EAAE,CAAE,GACR;;AAGH,AAAA,kBAAkB,CAAC;EACjB,UAAU,EAAE,KAAM;EAClB,MAAM,EAAE,GAAG,CAAC,KAAK,CxBhBO,OAAO;EwBiB/B,aAAa,EAAE,GAAI;EACnB,MAAM,EAAE,MAAO;EACf,SAAS,EAAE,GAAI;EACf,OAAO,EAAE,IAAK;EACd,UAAU,EAAE,MAAO,GAmCpB;EA1CD,AAQE,kBARgB,CAQhB,eAAe,CAAC;IACd,aAAa,EAAE,IAAK,GACrB;EAVH,AAWE,kBAXgB,CAWhB,QAAQ,CAAC;IACP,OAAO,EAAE,YAAa;IACtB,SAAS,EAlCE,IAAI;IAmCf,MAAM,EAAE,GAAI;IACZ,QAAQ,EAAE,QAAS;IACnB,KAAK,EAAE,GAAI,GAyBZ;IAzCH,AAiBI,kBAjBc,CAWhB,QAAQ,CAMN,cAAc,CAAC;MAIb,SAAS,EAAE,+BAAgC;MAC3C,gBAAgB,EAAE,WAAY;MAC9B,aAAa,EAAE,QAAS;MACxB,MAAM,EAAE,CAAE;MACV,MAAM,EAAE,QAAS;MACjB,IAAI,EAAE,QAAS;MACf,QAAQ,EAAE,QAAS;MACnB,gBAAgB,EAAE,gBAAiB;MACnC,KAAK,EAAE,OAAQ,GAWhB;MAxCL,AAiBI,kBAjBc,CAWhB,QAAQ,CAMN,cAAc,AAeT,UAAW,CAAA,AAAA,CAAC,EAAb;QAIE,eAAe,EAFG,MAAgB;QAGlC,SAAS,EAAE,aAAM,GAClB;MAtCT,AAiBI,kBAjBc,CAWhB,QAAQ,CAMN,cAAc,AAeT,UAAW,CAAA,AAAA,CAAC,EAAb;QAIE,eAAe,EAFG,MAAgB;QAGlC,SAAS,EAAE,aAAM,GAClB;MAtCT,AAiBI,kBAjBc,CAWhB,QAAQ,CAMN,cAAc,AAeT,UAAW,CAAA,AAAA,CAAC,EAAb;QAIE,eAAe,EAFG,MAAgB;QAGlC,SAAS,EAAE,aAAM,GAClB;MAtCT,AAiBI,kBAjBc,CAWhB,QAAQ,CAMN,cAAc,AAeT,UAAW,CAAA,AAAA,CAAC,EAAb;QAIE,eAAe,EAFG,MAAgB;QAGlC,SAAS,EAAE,cAAM,GAClB;MAtCT,AAiBI,kBAjBc,CAWhB,QAAQ,CAMN,cAAc,AAeT,UAAW,CAAA,AAAA,CAAC,EAAb;QAIE,eAAe,EAFG,MAAgB;QAGlC,SAAS,EAAE,cAAM,GAClB;MAtCT,AAiBI,kBAjBc,CAWhB,QAAQ,CAMN,cAAc,AAeT,UAAW,CAAA,AAAA,CAAC,EAAb;QAIE,eAAe,EAFG,MAAgB;QAGlC,SAAS,EAAE,cAAM,GAClB;MAtCT,AAiBI,kBAjBc,CAWhB,QAAQ,CAMN,cAAc,AAeT,UAAW,CAAA,AAAA,CAAC,EAAb;QAIE,eAAe,EAFG,MAAgB;QAGlC,SAAS,EAAE,cAAM,GAClB;MAtCT,AAiBI,kBAjBc,CAWhB,QAAQ,CAMN,cAAc,AAeT,UAAW,CAAA,AAAA,CAAC,EAAb;QAIE,eAAe,EAFG,MAAgB;QAGlC,SAAS,EAAE,cAAM,GAClB;MAtCT,AAiBI,kBAjBc,CAWhB,QAAQ,CAMN,cAAc,AAeT,UAAW,CAAA,AAAA,CAAC,EAAb;QAIE,eAAe,EAFG,MAAgB;QAGlC,SAAS,EAAE,cAAM,GAClB;MAtCT,AAiBI,kBAjBc,CAWhB,QAAQ,CAMN,cAAc,AAeT,UAAW,CAAA,AAAA,EAAE,EAAd;QAIE,eAAe,EAFG,KAAgB;QAGlC,SAAS,EAAE,cAAM,GAClB;MAtCT,AAiBI,kBAjBc,CAWhB,QAAQ,CAMN,cAAc,AAeT,UAAW,CAAA,AAAA,EAAE,EAAd;QAIE,eAAe,EAFG,MAAgB;QAGlC,SAAS,EAAE,cAAM,GAClB;MAtCT,AAiBI,kBAjBc,CAWhB,QAAQ,CAMN,cAAc,AAeT,UAAW,CAAA,AAAA,EAAE,EAAd;QAIE,eAAe,EAFG,MAAgB;QAGlC,SAAS,EAAE,cAAM,GAClB;;AAMT,UAAU,CAAV,YAAU;EACR,AAAA,EAAE;IACA,gBAAgB,EApEJ,OAAO;EAsErB,AAAA,IAAI;IACF,gBAAgB,EAAE,WAAY;;ACvElC,AAAA,YAAY,CAAC;EACX,aAAa,EAAE,IAAK,GAgDrB;EAjDD,AAGE,YAHU,CAGV,IAAI,CAAC;IACH,SAAS,EAAE,IAAK,GACjB;EALH,AAOE,YAPU,CAOV,kBAAkB,CAAC;IACjB,aAAa,EAAE,IAAK;IACpB,cAAc,EAAE,SAAU,GAC3B;EAVH,AAaI,YAbQ,CAYV,cAAc,CACZ,MAAM,CAAC;IAGL,UAAU,EAAE,MAAO,GACpB;EAjBL,AAoBM,YApBM,CAYV,cAAc,AAOX,MAAM,CACL,MAAM,CAAC;IACL,UAAU,EAAE,OAAQ,GACrB;EAtBP,AAmCI,YAnCQ,CAkCV,aAAa,CACX,mBAAmB,CAAC;IAElB,OAAO,EAAE,MAAO,GAKjB;IA1CL,AAmCI,YAnCQ,CAkCV,aAAa,CACX,mBAAmB,AAIhB,UAAU,CAAC;MACV,KAAK,EAAE,GAAI,GACZ;;AAUP,AACE,YADU,AAAA,UAAU,CACpB,SAAS,CAAC;EACR,WAAW,EAAE,IAAK;EAClB,aAAa,EAAE,IAAK,GAOrB;EAVH,AAKI,YALQ,AAAA,UAAU,CACpB,SAAS,CAIP,gBAAgB,CAAC;IACf,MAAM,EAAE,OAAQ;IAChB,WAAW,EAAE,MAAO;IACpB,WAAW,EAAE,IAAK,GACnB;;AATL,AAYE,YAZU,AAAA,UAAU,CAYpB,iBAAiB,CAAC;EAChB,UAAU,EAAE,mBAAI;EAChB,OAAO,EAAE,IAAK;EACd,aAAa,EAAE,IAAK;EACpB,OAAO,EAAE,IAAK,GAKf;EArBH,AAYE,YAZU,AAAA,UAAU,CAYpB,iBAAiB,AAMd,SAAS,CAAC;IACT,OAAO,EAAE,KAAM,GAChB;;ACvEL,AAAoB,oBAAA,AAAA,YAAY,CAAC;EAC/B,gBAAgB,EAAO,mBAAI,GAC5B;;AAED,AAAA,mBAAmB,CAAC;EAClB,aAAa,EAAE,GAAI;EACnB,gBAAgB,EAAE,IAAK;EACvB,UAAU,EAAE,aAAc;EAC1B,MAAM,EAAE,CAAE;EACV,OAAO,EAAE,CAAE,GACZ;;AAED,AAAA,wBAAwB,CAAC;EACvB,OAAO,EAAE,IAAK;EACd,MAAM,EAAE,IAAK;EACb,SAAS,EAAE,KAAM,GASlB;EAZD,AAKE,wBALsB,CAKtB,aAAa,CAAC;IACZ,aAAa,EAAE,IAAK,GACrB;EAPH,AASE,wBATsB,CAStB,aAAa,CAAC;IACZ,UAAU,EAAE,IAAK,GAClB;;ACvBH,AAAA,oBAAoB,CAAC;EACnB,SAAS,EAAE,IAAK,GA6BjB;EA9BD,AAGE,oBAHkB,CAGlB,EAAE,CAAC;IACD,aAAa,EAAE,GAAI,GAyBpB;IA7BH,AAOM,oBAPc,CAGlB,EAAE,AAGC,MAAM,CACL,YAAY,CAAC;MACX,UAAU,EAAE,OAAQ,GACrB;IATP,AAYI,oBAZgB,CAGlB,EAAE,CASA,YAAY,CAAC;MAIX,UAAU,EAAE,MAAO,GACpB;IAjBL,AAmBI,oBAnBgB,CAGlB,EAAE,CAgBA,eAAe,CAAC;MAEd,OAAO,EAAE,MAAO;MAChB,KAAK,EAAE,GAAI,GACZ;;ACvBL,AAEI,+BAF2B,CAC7B,iBAAiB,CACf,gBAAgB,CAAC;EAIf,aAAa,EAAE,GAAI,GAKpB;;AAXL,AAaI,+BAb2B,CAC7B,iBAAiB,CAYf,UAAU,AACP,UAAU,CAAC;EACV,UAAU,EAAE,MAAO,GACpB;;AChBP,AACE,mBADiB,CACjB,EAAE,CAAC;EACD,UAAU,EAAE,IACb,GAAC;;AAHJ,AAImB,mBAJA,CAIjB,EAAE,AAAA,UAAW,CAAA,AAAA,IAAI,EAAE;EACjB,UAAU,EAAE,IACb,GAAC;;AANJ,AAOkB,mBAPC,CAOjB,EAAE,AAAA,UAAW,CAAA,AAAA,GAAG,EAAE;EAChB,UAAU,EAAE,IACb,GAAC;;AATJ,AAWE,mBAXiB,CAWjB,OAAO,CAAC;EACN,WAAW,EAAE,MAAO,GACrB;;AAbH,AAeE,mBAfiB,CAejB,QAAQ,CAAC;EACP,cAAc,EAAE,GAAI;EACpB,WAAW,EAAE,GAAI,GAClB;;AAlBH,AAoBE,mBApBiB,CAoBjB,wBAAwB,CAAC;EACvB,gBAAgB,EAAE,OAAQ;EAC1B,MAAM,EAAE,cAAe;EACvB,aAAa,EAAE,GAAI;EACnB,KAAK,EAAE,KAAM;EACb,OAAO,EAAE,YAAa;EACtB,SAAS,EAAE,IAAK;EAChB,WAAW,EAAE,MAAO;EACpB,OAAO,EAAE,eAAgB;EACzB,UAAU,EAAE,IAAK;EACjB,cAAc,EAAE,MAAO;EACvB,WAAW,EAAE,MAAO,GACrB;;AAhCH,AAkCE,mBAlCiB,CAkCjB,sBAAsB,CAAC;EACrB,8BAA8B;EAC9B,OAAO,EAAE,eAAgB;EACzB,UAAU,EAAE,IAAK,GAClB;;AAtCH,AAwCE,mBAxCiB,CAwCjB,sBAAsB,CAAC;EACrB,YAAY,EAAE,GAAI,GACnB;;AA1CH,AA4CE,mBA5CiB,CA4CjB,UAAU,CAAC;EACT,KAAK,EAAE,KAAM,GACd;;AA9CH,AA+CE,mBA/CiB,CA+CjB,gBAAgB,CAAC;EACf,KAAK,EAAE,IAAK,GACb;;AAjDH,AAkDE,mBAlDiB,CAkDjB,QAAQ,CAAC;EACP,KAAK,EAAE,GAAI,GACZ;;AApDH,AAsDE,mBAtDiB,CAsDjB,IAAI,CAAC;EACH,cAAc,EAAE,GAAI;EACpB,WAAW,EAAE,GAAI,GAClB;;AAzDH,AA2DE,mBA3DiB,CA2DjB,QAAQ,CAAC;EACP,OAAO,EAAE,OAAQ,GAClB;;AA7DH,AA+DE,mBA/DiB,CA+DjB,gBAAgB,CAAC;EACf,gBAAgB,EAAE,IAAK;EACvB,aAAa,EAAE,GAAI;EACnB,OAAO,EAAE,SAAU,GACpB;;AAnEH,AAqEE,mBArEiB,CAqEjB,kBAAkB,CAAC;EACjB,MAAM,EAAE,cAAe;EACvB,UAAU,EAAE,UAAW;EACvB,aAAa,EAAE,GAAI;EACnB,WAAW,EAAE,QAAS;EAEtB,YAAY,EAAE,QAAS;EACvB,UAAU,EAAE,GAAI,GACjB;;AA7EH,AA+EE,mBA/EiB,CA+EjB,aAAa,CAAC;EACZ,OAAO,EAAE,SAAU,GACpB;;AAjFH,AAmFE,mBAnFiB,CAmFjB,gBAAgB,CAAC;EACf,MAAM,EAAE,cAAe;EACvB,aAAa,EAAE,GAAI;EACnB,aAAa,EAAE,IAAK;EACpB,UAAU,EAAE,IAAK;EACjB,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,GAAI,GACZ;;AA1FH,AA4FE,mBA5FiB,CA4FjB,uBAAuB,CAAC;EACtB,gBAAgB,EAAE,OAAQ;EAC1B,aAAa,EAAE,iBAAkB;EACjC,sBAAsB,EAAE,GAAI;EAC5B,uBAAuB,EAAE,GAAI;EAC7B,WAAW,EAAE,IAAK;EAClB,OAAO,EAAE,QAAS,GACnB;;AAnGH,AAqGyB,mBArGN,CAqGjB,uBAAuB,AAAA,QAAQ,CAAC;EAC9B,OAAO,EAAE,EAAG;EACZ,OAAO,EAAE,KAAM,GAChB;;AAxGH,AA0GyB,mBA1GN,CA0GjB,uBAAuB,AAAA,OAAO,CAAC;EAC7B,KAAK,EAAE,IAAK;EACZ,OAAO,EAAE,EAAG;EACZ,OAAO,EAAE,KAAM,GAChB;;AA9GH,AAgHE,mBAhHiB,CAgHjB,wBAAwB,CAAC;EACvB,KAAK,EAAE,KAAM;EACb,qBAAqB,EACtB;;AAnHH,AAqHE,mBArHiB,CAqHjB,qBAAqB,CAAC;EACpB,KAAK,EAAE,IAAK;EACZ,WAAW,EAAE,+CAAgD;EAC7D,SAAS,EAAE,IAAK,GACjB;;AAzHH,AA2HE,mBA3HiB,CA2HjB,qBAAqB,CAAC;EACpB,gBAAgB,EAAE,OAAQ;EAC1B,OAAO,EAAE,IAAK,GACf;;AA9HH,AAgIE,mBAhIiB,CAgIjB,uBAAuB,CAAC;EACtB,gBAAgB,EAAE,OAAQ;EAC1B,yBAAyB,EAAE,GAAI;EAC/B,0BAA0B,EAAE,GAAI;EAChC,UAAU,EAAE,iBAAkB;EAC9B,WAAW,EAAE,+CAAgD;EAC7D,SAAS,EAAE,IAAK;EAChB,WAAW,EAAE,IAAK;EAClB,OAAO,EAAE,QAAS,GACnB;;AAzIH,AA2IE,mBA3IiB,CA2IjB,cAAc,CAAC;EACb,SAAS,EAAE,IAAK,GACjB;;AA7IH,AA+IE,mBA/IiB,CA+IjB,kBAAkB,CAAC;EACjB,WAAW,EAAE,cAAe;EAC5B,YAAY,EAAE,cAAe;EAC7B,UAAU,EAAE,cAAe;EAC3B,aAAa,EAAE,KAAM;EACrB,KAAK,EAAE,IAAK,GACb;;AArJH,AAsJuD,mBAtJpC,CAsJjB,kBAAkB,CAAC,GAAG,AAAA,gBAAgB,AAAA,UAAW,CAAA,AAAA,IAAI,EAAE;EACrD,gBAAgB,EAAE,IAAK,GACxB;;AAxJH,AAyJE,mBAzJiB,CAyJjB,gBAAgB,CAAC;EACf,aAAa,EAAE,cAAe;EAC9B,OAAO,EAAE,SAAU,GACpB;;AA5JH,AA6JE,mBA7JiB,CA6JjB,YAAY,CAAC;EACX,SAAS,EAAE,IAAK,GACjB;;AA/JH,AAiKE,mBAjKiB,CAiKjB,YAAY,CAAC;EACX,WAAW,EAAE,IAAK;EAClB,UAAU,EAAE,KAAM,GACnB;;AApKH,AAsKE,mBAtKiB,CAsKjB,yBAAyB,CAAC;EACxB,OAAO,EAAE,SAAU,GACpB;;AAxKH,AA0Ke,mBA1KI,CA0KjB,YAAY,CAAC,gBAAgB,CAAC;EAC5B,cAAc,EAAE,MAAO;EACvB,KAAK,EAAE,GAAI,GACZ;;AA7KH,AA+KE,mBA/KiB,CA+KjB,QAAQ,CAAC;EACP,SAAS,EAAE,IAAK;EAChB,MAAM,EAAE,QAAS;EACjB,cAAc,EAAE,MAAO,GACxB;;ACnLH,AAAA,sBAAsB,CAAC;E5BwQtB,gBAAgB,E4BvQD,IAAI;E5BwQnB,YAAY,E4BxQG,IAAI;E5ByQnB,aAAa,E4BzQE,IAAI;E5B0QnB,SAAS,E4B1QM,IAAI;E5B2QnB,QAAQ,E4B3QO,IAAI;E5B4QnB,IAAI,E4B5QW,IAAI;EAClB,WAAW,EAAE,GAAG,CAAC,KAAK,C9BME,OAAO;E8BL/B,QAAQ,EAAE,MAAO,GAwHlB;EA3HD,AAAA,sBAAsB,AAKnB,cAAc,CAAC;IACd,WAAW,EAAE,IAAK,GACnB;EAPH,AASE,sBAToB,CASpB,YAAY,CAAC;IACX,UAAU,EAAE,IAAK;IACjB,QAAQ,EAAE,MAAO;IACjB,KAAK,EAAE,KAAM,GA8Gd;IA1HH,AASE,sBAToB,CASpB,YAAY,AAKT,KAAK,CAAC;MACL,OAAO,EAAE,KAAM,GAChB;IAhBL,AASE,sBAToB,CASpB,YAAY,AAST,OAAO,CAAC;MACP,OAAO,EAAE,IAAK,GACf;IApBL,AAsBI,sBAtBkB,CASpB,YAAY,CAaV,cAAc,CAAC;MACb,aAAa,EAAE,GAAG,CAAC,KAAK,C9BfJ,OAAO;M8BgB3B,SAAS,EAAE,IAAK;MAChB,WAAW,EAAE,GAAI,GAalB;MAtCL,AA2BM,sBA3BgB,CASpB,YAAY,CAaV,cAAc,CAKZ,aAAa,CAAC;QACZ,OAAO,EAAE,YAAa;QACtB,OAAO,EAAE,mBAAoB;QAC7B,KAAK,EAAE,KAAM,GACd;MA/BP,AAiCM,sBAjCgB,CASpB,YAAY,CAaV,cAAc,CAWZ,gBAAgB,CAAC;QACf,MAAM,EAAE,OAAQ;QAChB,KAAK,EAAE,KAAM;QACb,OAAO,EAAE,mBAAoB,GAC9B;IArCP,AAwCI,sBAxCkB,CASpB,YAAY,CA+BV,YAAY,CAAC;MACX,OAAO,EAAE,IAAK,GAwCf;MAjFL,AA2CM,sBA3CgB,CASpB,YAAY,CA+BV,YAAY,CAGV,EAAE,CAAC;QACD,SAAS,EAAE,IAAK;QAChB,aAAa,EAAE,GAAG,CAAC,KAAK,C9BrCN,OAAO;Q8BsCzB,OAAO,EAAE,MAAO,GACjB;MA/CP,AAiDM,sBAjDgB,CASpB,YAAY,CA+BV,YAAY,CASV,EAAE,CAAC;QACD,SAAS,EAAE,IAAK,GACjB;MAnDP,AAqDM,sBArDgB,CASpB,YAAY,CA+BV,YAAY,CAaV,EAAE,CAAC;QACD,SAAS,EAAE,IAAK,GACjB;MAvDP,AAyDM,sBAzDgB,CASpB,YAAY,CA+BV,YAAY,CAiBV,CAAC,CAAC;QACA,aAAa,EAAE,IAAK,GACrB;MA3DP,AA6DM,sBA7DgB,CASpB,YAAY,CA+BV,YAAY,CAqBV,GAAG,CAAC;QACF,aAAa,EAAE,IAAK;QACpB,SAAS,EAAE,IAAK,GACjB;MAhEP,AAkEM,sBAlEgB,CASpB,YAAY,CA+BV,YAAY,CA0BV,EAAE,CAAC;QACD,UAAU,EAAE,IAAK;QACjB,aAAa,EAAE,IAAK;QACpB,WAAW,EAAE,IAAK,GACnB;MAtEP,AAwEM,sBAxEgB,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,CAAC;QAGJ,aAAa,EAAE,IAAK,GAKrB;QAhFP,AA6EQ,sBA7Ec,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,CAKH,IAAI,CAAC;UACH,UAAU,EAAE,IAAK,GAClB;IAIL,MAAM,MAAD,MAAM,MAAM,gBAAgB,EAAE,KAAK,OAAO,SAAS,EAAE,MAAM;MAnFpE,AASE,sBAToB,CASpB,YAAY,CAAC;QA6ET,QAAQ,EAAE,KAAM;QAChB,GAAG,EAHmB,IAAI;QAI1B,MAAM,EAAE,CAAE;QACV,KAAK,EAAE,CAAE;QACT,OAAO,EAAE,IAAK;QACd,WAAW,EAAE,GAAG,CAAC,KAAK,C9BnFF,OAAO,G8BkH9B;IA5BC,MAAM,MAAD,MAAM,MAAM,SAAS,EAAE,KAAK;MA9FrC,AASE,sBAToB,CASpB,YAAY,CAAC;QAwFT,QAAQ,EAAE,KAAM;QAChB,GAAG,EAHmB,IAAI;QAI1B,MAAM,EAAE,CAAE;QACV,KAAK,EAAE,CAAE;QACT,OAAO,EAAE,IAAK;QACd,WAAW,EAAE,GAAG,CAAC,KAAK,C9B9FF,OAAO;Q8B+F3B,KAAK,EAAE,KAAM,GAmBhB;QA1HH,AAyGM,sBAzGgB,CASpB,YAAY,CAgGR,cAAc,CAAC;UACb,SAAS,EAAE,IAAK,GAUjB;UApHP,AA4GQ,sBA5Gc,CASpB,YAAY,CAgGR,cAAc,CAGZ,aAAa,CAAC;YACZ,KAAK,EAAE,KAAM;YACb,OAAO,EAAE,IAAK,GACf;UA/GT,AAiHQ,sBAjHc,CASpB,YAAY,CAgGR,cAAc,CAQZ,gBAAgB,CAAC;YACf,OAAO,EAAE,IAAK,GACf;QAnHT,AAsHM,sBAtHgB,CASpB,YAAY,CA6GR,YAAY,CAAC;UACX,OAAO,EAAE,IAAK,GACf;;ACxHP,AACQ,MADF,CACJ,KAAK,CAAC,EAAE,EDDV,ACCQ,sBDDc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,CCvET,KAAK,CAAC,EAAE,CAAC;EACP,WAAW,EAAE,CAAE,GAKhB;EAPH,AACQ,MADF,CACJ,KAAK,CAAC,EAAE,AAGL,YAAY,EDJjB,ACCQ,sBDDc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,CCvET,KAAK,CAAC,EAAE,AAGL,YAAY,CAAC;IACZ,YAAY,EAAE,CAAE,GACjB;;AANL,AASQ,MATF,CASJ,KAAK,CAAC,EAAE,AACL,YAAY,EDVjB,ACSQ,sBDTc,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,CC/DT,KAAK,CAAC,EAAE,AACL,YAAY,CAAC;EACZ,YAAY,EAAE,CAAE,GACjB;;AAZL,AAgBI,MAhBE,AAeH,cAAc,CACb,YAAY,EDhBhB,ACgBI,sBDhBkB,CASpB,YAAY,CA+BV,YAAY,CAgCV,KAAK,ACzDR,cAAc,CACb,YAAY,CAAC;EACX,SAAS,EAAE,KAAM,GAClB;;AClBL,AACE,kBADgB,CAChB,aAAa,CAAC;EACZ,KAAK,EAAE,IAAK;EACZ,MAAM,EAAE,IAAK;EACb,SAAS,EAAE,IAAK,GACjB;;AALH,AAOE,kBAPgB,CAOhB,aAAa,CAAC;EAEZ,MAAM,EAAE,IAAK;EACb,SAAS,EAAE,IAAK,GACjB;;AAXH,AAaE,kBAbgB,CAahB,QAAQ,AACL,GAAG,CAAC;EACH,OAAO,EAAE,CAAE,GACZ;;AAhBL,AAaE,kBAbgB,CAahB,QAAQ,AAKL,aAAa,CAAC;EACb,SAAS,EAAE,KAAM,GAClB;;AApBL,AAsBI,kBAtBc,CAahB,QAAQ,CASN,wBAAwB,CAAC;EACvB,OAAO,EAAE,IAAK,GA2Bf;EAlDL,AAyBM,kBAzBY,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAAC;IACb,aAAa,EAAE,IAAK,GAQrB;IAlCP,AA4BQ,kBA5BU,CAahB,QAAQ,CASN,wBAAwB,CAGtB,cAAc,CAGZ,MAAM,CAAC;MAGL,SAAS,EAAE,IAAK;MAChB,UAAU,EAAE,UAAW,GACxB;EAjCT,AAoCM,kBApCY,CAahB,QAAQ,CASN,wBAAwB,CActB,oBAAoB,CAAC;IACnB,aAAa,EAAE,GAAI,GAMpB;IA3CP,AAuCQ,kBAvCU,CAahB,QAAQ,CASN,wBAAwB,CActB,oBAAoB,CAGlB,YAAY,CAAC;MACX,OAAO,EAAE,YAAa;MACtB,UAAU,EAAE,UAAW,GACxB;EA1CT,AA6CM,kBA7CY,CAahB,QAAQ,CASN,wBAAwB,CAuBtB,MAAM,CAAC;IACL,SAAS,EAAE,IAAK;IAChB,UAAU,EAAE,MAAO;IACnB,UAAU,EAAE,UAAW,GACxB;;ACjDP,AAAA,WAAW,CAAC;EACV,OAAO,EAAE,KAAM;EACf,SAAS,EAAE,IAAK;EAChB,WAAW,EAAE,GAAI,GAClB;;AAED,MAAM,MAAD,MAAM,MAAM,SAAS,EAAE,KAAK;EAC/B,AAAA,WAAW,CAAC;IACV,SAAS,EAAE,IAAK;IAChB,WAAW,EAAE,GAAI,GAClB;;ACVH,AACmB,wBADK,CACtB,KAAK,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX,GADR,AACyC,wBADjB,CACF,KAAK,CAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,EAAe;EACvC,SAAS,EAAE,KAAM,GAClB;;AAHH,AAKE,wBALsB,CAKtB,eAAe,CAAC;EACd,SAAS,EAAE,KAAM;EACjB,OAAO,EAAE,YAAa;EACtB,YAAY,EAAE,IAAK,GACpB;;AATH,AAWE,wBAXsB,CAWtB,gBAAgB,CAAC;EACf,SAAS,EAAE,GAAI;EACf,MAAM,EAAE,OAAQ,GACjB;;AAdH,AAgBE,wBAhBsB,CAgBtB,aAAa,CAAC;EAEZ,MAAM,EAAE,OAAQ,GACjB;;AAnBH,AAqBE,wBArBsB,CAqBtB,WAAW,CAAC;EACV,UAAU,EAAE,KAAM;EAClB,aAAa,EAAE,GAAI,GACpB;;ACxBH,AAEI,6BAFyB,CAC3B,wBAAwB,CACtB,WAAW,CAAC;EACV,SAAS,EAAE,KAAM,GAClB;;AAJL,AAMI,6BANyB,CAC3B,wBAAwB,CAKtB,WAAW,CAAC;EACV,SAAS,EAAE,KAAM,GAClB;;AARL,AAUI,6BAVyB,CAC3B,wBAAwB,CAStB,eAAe,CAAC;EACd,SAAS,EAAE,KAAM;EACjB,OAAO,EAAE,YAAa;EACtB,YAAY,EAAE,IAAK,GACpB;;AAdL,AAgBI,6BAhByB,CAC3B,wBAAwB,CAetB,gBAAgB,CAAC;EACf,SAAS,EAAE,GAAI;EACf,MAAM,EAAE,OAAQ,GACjB;;AAnBL,AAqBI,6BArByB,CAC3B,wBAAwB,CAoBtB,aAAa,CAAC;EAEZ,MAAM,EAAE,OAAQ,GACjB;;AAIL,AAEI,2BAFuB,CACzB,sBAAsB,CACpB,WAAW,CAAC;EACV,SAAS,EAAE,KAAM,GAClB;;AAJL,AAMI,2BANuB,CACzB,sBAAsB,CAKpB,WAAW,CAAC;EACV,SAAS,EAAE,KAAM,GAClB;;AARL,AAUI,2BAVuB,CACzB,sBAAsB,CASpB,eAAe,CAAC;EACd,SAAS,EAAE,KAAM;EACjB,OAAO,EAAE,YAAa;EACtB,YAAY,EAAE,IAAK,GACpB;;AAdL,AAgBI,2BAhBuB,CACzB,sBAAsB,CAepB,gBAAgB,CAAC;EACf,SAAS,EAAE,GAAI;EACf,MAAM,EAAE,OAAQ,GACjB;;AAnBL,AAqBI,2BArBuB,CACzB,sBAAsB,CAoBpB,aAAa,CAAC;EAEZ,MAAM,EAAE,OAAQ,GACjB;;ACpDL,AACE,sBADoB,CACpB,mBAAmB,CAAC;EAClB,SAAS,EAAE,KAAM,GAClB;;AAHH,AAKE,sBALoB,CAKpB,cAAc,CAAC;EACb,UAAU,EAAE,IAAK;EACjB,cAAc,EAAE,IAAK;EACrB,aAAa,EAAE,IAAK;EACpB,aAAa,EAAE,GAAG,CAAC,KAAK,CpCDF,OAAO,GoCa9B;EArBH,AAYM,sBAZgB,CAKpB,cAAc,CAMZ,MAAM,CACJ,YAAY,CAAC;IACX,KAAK,EAAE,IAAK;IACZ,WAAW,EAAE,IAAK,GACnB;EAfP,AAiBM,sBAjBgB,CAKpB,cAAc,CAMZ,MAAM,CAMJ,aAAa,CAAC;IACZ,KAAK,EAAE,KAAM,GACd;;AAKP,MAAM,MAAD,MAAM,MAAM,SAAS,EAAE,KAAK;EAC/B,AAGM,sBAHgB,CACpB,cAAc,CACZ,MAAM,CACJ,YAAY,CAAC;IACX,KAAK,EAAE,IAAK;IACZ,aAAa,EAAE,IAAK,GACrB;EANP,AAQM,sBARgB,CACpB,cAAc,CACZ,MAAM,CAMJ,aAAa,CAAC;IACZ,KAAK,EAAE,IAAK;IACZ,aAAa,EAAE,IAAK,GACrB;;ACpCT,AACE,yBADuB,CACvB,cAAc,CAAC;EACb,SAAS,EAAE,IAAK,GACjB;;AAHH,AAIE,yBAJuB,CAIvB,aAAa,EAJf,AAIE,yBAJuB,CZAzB,YAAY,CAkCV,aAAa,CACX,mBAAmB,EAnCvB,AYIE,YZJU,CAkCV,aAAa,CYlCf,yBAAyB,CZmCrB,mBAAmB,EYnCvB,AAIE,yBAJuB,CVAzB,oBAAoB,CAGlB,EAAE,CAgBA,eAAe,EAnBnB,AUIE,oBVJkB,CAGlB,EAAE,CUHJ,yBAAyB,CVmBrB,eAAe,CUfH;EACZ,KAAK,EAAE,IAAK,GACb;;AAGH,AACO,mBADY,CACjB,KAAK,AAAA,aAAa,EADpB,AACE,mBADiB,CZTnB,YAAY,CAkCV,aAAa,CYxBb,KAAK,AZyBH,mBAAmB,EAnCvB,AYUE,YZVU,CAkCV,aAAa,CYzBf,mBAAmB,CACjB,KAAK,AZyBH,mBAAmB,EY1BvB,AACE,mBADiB,CVTnB,oBAAoB,CAGlB,EAAE,CUOF,KAAK,AVSH,eAAe,EAnBnB,AUUE,oBVVkB,CAGlB,EAAE,CUMJ,mBAAmB,CACjB,KAAK,AVSH,eAAe,CUTE;EACjB,SAAS,EAAE,KAAM,GAClB;;ACZH,AAEE,wBAFsB,CAEtB,YAAY,CAAC;EACX,SAAS,EAAE,KAAM,GAClB;;AAJH,AAME,wBANsB,CAMtB,WAAW,CAAC;EACV,MAAM,EAAE,KAAM,GACf;;AARH,AAUE,wBAVsB,CAUtB,wBAAwB,A/DGvB,OAAO,E+DbV,AAUE,wBAVsB,CAUtB,wBAAwB,A/DIvB,MAAM,CAAC;EACN,OAAO,EAAE,GAAI;EACb,OAAO,EAAE,KAAM,GAChB;;A+DjBH,AAUE,wBAVsB,CAUtB,wBAAwB,A/DQvB,MAAM,CAAC;EACN,KAAK,EAAE,IAAK,GACb;;A+DpBH,AAaI,wBAboB,CAUtB,wBAAwB,CAGtB,IAAI,EAbR,AAaI,wBAboB,CAUtB,wBAAwB,C5BV1B,eAAe,CAIb,cAAc,EAJhB,A4BaI,e5BbW,C4BAf,wBAAwB,CAUtB,wBAAwB,C5BNxB,cAAc,E4BJhB,AAaI,wBAboB,CAUtB,wBAAwB,CzBV1B,YAAY,CACV,EAAE,CAGA,CAAC,EAJL,AyBaI,YzBbQ,CACV,EAAE,CyBDJ,wBAAwB,CAUtB,wBAAwB,CzBNtB,CAAC,EyBJL,AAaI,wBAboB,CAUtB,wBAAwB,CzBV1B,YAAY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,EnBPf,AyBaI,YzBbQ,CACV,EAAE,CmBDJ,kBAAkB,CMAlB,wBAAwB,CAUtB,wBAAwB,CNHxB,aAAa,EMPf,AAaI,wBAboB,CAUtB,wBAAwB,CNV1B,kBAAkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,EAPf,AMaI,kBNbc,CnBAlB,YAAY,CACV,EAAE,CyBDJ,wBAAwB,CAUtB,wBAAwB,CNHxB,aAAa,EMPf,AAaI,wBAboB,CAUtB,wBAAwB,CzBV1B,YAAY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,ErBhBf,AyBaI,YzBbQ,CACV,EAAE,CqBDJ,wBAAwB,CIAxB,wBAAwB,CAUtB,wBAAwB,CJMxB,aAAa,EIhBf,AAaI,wBAboB,CAUtB,wBAAwB,CJV1B,wBAAwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,EAhBf,AIaI,wBJboB,CrBAxB,YAAY,CACV,EAAE,CyBDJ,wBAAwB,CAUtB,wBAAwB,CJMxB,aAAa,EIhBf,AAaI,wBAboB,CAUtB,wBAAwB,CzBV1B,YAAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,EtBrBjB,AyBaI,YzBbQ,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CGD1B,wBAAwB,CAUtB,wBAAwB,CHWtB,aAAa,EGrBjB,AAaI,wBAboB,CAUtB,wBAAwB,CHV1B,6BAA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,EArBjB,AGaI,6BHbyB,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CyBDJ,wBAAwB,CAUtB,wBAAwB,CHWtB,aAAa,EGrBjB,AAaI,wBAboB,CAUtB,wBAAwB,CzBV1B,YAAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,EtBjDjB,AyBaI,YzBbQ,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CG7BxB,wBAAwB,CAUtB,wBAAwB,CHuCtB,aAAa,EGjDjB,AAaI,wBAboB,CAUtB,wBAAwB,CHkB1B,2BAA2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,EArBjB,AGfI,2BHeuB,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CyBDJ,wBAAwB,CAUtB,wBAAwB,CHuCtB,aAAa,EGjDjB,AAaI,wBAboB,CAUtB,wBAAwB,CzBV1B,YAAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,E1BvFtB,AyBaI,YzBbQ,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CDlFhB,wBAAwB,CAUtB,wBAAwB,CC6EpB,gBAAgB,EDvFtB,AAaI,wBAboB,CAUtB,wBAAwB,CC6D1B,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,EAhBtB,AD1DI,sBC0DkB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,CyBDJ,wBAAwB,CAUtB,wBAAwB,CC6EpB,gBAAgB,EDvFtB,AAaI,wBAboB,CAUtB,wBAAwB,CxBV1B,sBAAsB,EwBAtB,AAaI,wBAboB,CAUtB,wBAAwB,CnBV1B,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,EAxCpB,AmBaI,iBnBba,CA2Bf,cAAc,CAYZ,eAAe,CmBvCnB,wBAAwB,CAUtB,wBAAwB,CnB8BpB,cAAc,EmBxCpB,AAaI,wBAboB,CAUtB,wBAAwB,CbV1B,YAAY,CAYV,cAAc,CACZ,MAAM,EAbV,AaaI,YbbQ,CAYV,cAAc,CaZhB,wBAAwB,CAUtB,wBAAwB,CbGtB,MAAM,EabV,AAaI,wBAboB,CAUtB,wBAAwB,CbV1B,YAAY,CAkCV,aAAa,CAUX,oBAAoB,EA5CxB,AaaI,YbbQ,CAkCV,aAAa,CalCf,wBAAwB,CAUtB,wBAAwB,CbkCtB,oBAAoB,Ea5CxB,AAaI,wBAboB,CAUtB,wBAAwB,CXV1B,oBAAoB,CAGlB,EAAE,CASA,YAAY,EAZhB,AWaI,oBXbgB,CAGlB,EAAE,CWHJ,wBAAwB,CAUtB,wBAAwB,CXEtB,YAAY,EWZhB,AAaI,wBAboB,CAUtB,wBAAwB,CXV1B,oBAAoB,CAGlB,EAAE,CAsBA,gBAAgB,EAzBpB,AWaI,oBXbgB,CAGlB,EAAE,CWHJ,wBAAwB,CAUtB,wBAAwB,CXetB,gBAAgB,EWzBpB,AAaI,wBAboB,CAUtB,wBAAwB,CVV1B,+BAA+B,CAC7B,iBAAiB,CACf,gBAAgB,EAFpB,AUaI,+BVb2B,CAC7B,iBAAiB,CUDnB,wBAAwB,CAUtB,wBAAwB,CVRtB,gBAAgB,CUWX;EACH,UAAU,EAAE,IAAK,GAClB;;ACfL,AACE,mBADiB,CACjB,KAAK,CAAC;EACJ,aAAa,EAAE,IAAK,GACrB;;AAHH,AAKE,mBALiB,CAKjB,WAAW,CAAC;EACV,MAAM,EAAE,KAAM,GACf;;AAPH,AASE,mBATiB,CASjB,wBAAwB,AhEIvB,OAAO,EgEbV,AASE,mBATiB,CASjB,wBAAwB,AhEKvB,MAAM,CAAC;EACN,OAAO,EAAE,GAAI;EACb,OAAO,EAAE,KAAM,GAChB;;AgEjBH,AASE,mBATiB,CASjB,wBAAwB,AhESvB,MAAM,CAAC;EACN,KAAK,EAAE,IAAK,GACb;;AgEpBH,AAYI,mBAZe,CASjB,wBAAwB,CAGtB,IAAI,EAZR,AAYI,mBAZe,CASjB,wBAAwB,C7BT1B,eAAe,CAIb,cAAc,EAJhB,A6BYI,e7BZW,C6BAf,mBAAmB,CASjB,wBAAwB,C7BLxB,cAAc,E6BJhB,AAYI,mBAZe,CASjB,wBAAwB,C1BT1B,YAAY,CACV,EAAE,CAGA,CAAC,EAJL,A0BYI,Y1BZQ,CACV,EAAE,C0BDJ,mBAAmB,CASjB,wBAAwB,C1BLtB,CAAC,E0BJL,AAYI,mBAZe,CASjB,wBAAwB,C1BT1B,YAAY,CACV,EAAE,CmBDJ,kBAAkB,CAOhB,aAAa,EnBPf,A0BYI,Y1BZQ,CACV,EAAE,CmBDJ,kBAAkB,COAlB,mBAAmB,CASjB,wBAAwB,CPFxB,aAAa,EOPf,AAYI,mBAZe,CASjB,wBAAwB,CPT1B,kBAAkB,CnBAlB,YAAY,CACV,EAAE,CmBMF,aAAa,EAPf,AOYI,kBPZc,CnBAlB,YAAY,CACV,EAAE,C0BDJ,mBAAmB,CASjB,wBAAwB,CPFxB,aAAa,EOPf,AAYI,mBAZe,CASjB,wBAAwB,C1BT1B,YAAY,CACV,EAAE,CqBDJ,wBAAwB,CAgBtB,aAAa,ErBhBf,A0BYI,Y1BZQ,CACV,EAAE,CqBDJ,wBAAwB,CKAxB,mBAAmB,CASjB,wBAAwB,CLOxB,aAAa,EKhBf,AAYI,mBAZe,CASjB,wBAAwB,CLT1B,wBAAwB,CrBAxB,YAAY,CACV,EAAE,CqBeF,aAAa,EAhBf,AKYI,wBLZoB,CrBAxB,YAAY,CACV,EAAE,C0BDJ,mBAAmB,CASjB,wBAAwB,CLOxB,aAAa,EKhBf,AAYI,mBAZe,CASjB,wBAAwB,C1BT1B,YAAY,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CAoBtB,aAAa,EtBrBjB,A0BYI,Y1BZQ,CACV,EAAE,CsBDJ,6BAA6B,CAC3B,wBAAwB,CID1B,mBAAmB,CASjB,wBAAwB,CJYtB,aAAa,EIrBjB,AAYI,mBAZe,CASjB,wBAAwB,CJT1B,6BAA6B,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,CsBoBA,aAAa,EArBjB,AIYI,6BJZyB,CAC3B,wBAAwB,CtBD1B,YAAY,CACV,EAAE,C0BDJ,mBAAmB,CASjB,wBAAwB,CJYtB,aAAa,EIrBjB,AAYI,mBAZe,CASjB,wBAAwB,C1BT1B,YAAY,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CAoBpB,aAAa,EtBjDjB,A0BYI,Y1BZQ,CACV,EAAE,CsB2BJ,2BAA2B,CACzB,sBAAsB,CI7BxB,mBAAmB,CASjB,wBAAwB,CJwCtB,aAAa,EIjDjB,AAYI,mBAZe,CASjB,wBAAwB,CJmB1B,2BAA2B,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,CsBgDA,aAAa,EArBjB,AIhBI,2BJgBuB,CACzB,sBAAsB,CtB7BxB,YAAY,CACV,EAAE,C0BDJ,mBAAmB,CASjB,wBAAwB,CJwCtB,aAAa,EIjDjB,AAYI,mBAZe,CASjB,wBAAwB,C1BT1B,YAAY,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,E1BvFtB,A0BYI,Y1BZQ,CACV,EAAE,C0BsEJ,sBAAsB,CACpB,YAAY,CAUV,YAAY,CAlFhB,mBAAmB,CASjB,wBAAwB,CA8EpB,gBAAgB,EAvFtB,AAYI,mBAZe,CASjB,wBAAwB,CA8D1B,sBAAsB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BsFE,gBAAgB,EAhBtB,AA3DI,sBA2DkB,CACpB,YAAY,CAUV,YAAY,C1BlFhB,YAAY,CACV,EAAE,C0BDJ,mBAAmB,CASjB,wBAAwB,CA8EpB,gBAAgB,EAvFtB,AAYI,mBAZe,CASjB,wBAAwB,CzBT1B,sBAAsB,EyBAtB,AAYI,mBAZe,CASjB,wBAAwB,CpBT1B,iBAAiB,CA2Bf,cAAc,CAYZ,eAAe,CACb,cAAc,EAxCpB,AoBYI,iBpBZa,CA2Bf,cAAc,CAYZ,eAAe,CoBvCnB,mBAAmB,CASjB,wBAAwB,CpB+BpB,cAAc,EoBxCpB,AAYI,mBAZe,CASjB,wBAAwB,CdT1B,YAAY,CAYV,cAAc,CACZ,MAAM,EAbV,AcYI,YdZQ,CAYV,cAAc,CcZhB,mBAAmB,CASjB,wBAAwB,CdItB,MAAM,EcbV,AAYI,mBAZe,CASjB,wBAAwB,CdT1B,YAAY,CAkCV,aAAa,CAUX,oBAAoB,EA5CxB,AcYI,YdZQ,CAkCV,aAAa,CclCf,mBAAmB,CASjB,wBAAwB,CdmCtB,oBAAoB,Ec5CxB,AAYI,mBAZe,CASjB,wBAAwB,CZT1B,oBAAoB,CAGlB,EAAE,CASA,YAAY,EAZhB,AYYI,oBZZgB,CAGlB,EAAE,CYHJ,mBAAmB,CASjB,wBAAwB,CZGtB,YAAY,EYZhB,AAYI,mBAZe,CASjB,wBAAwB,CZT1B,oBAAoB,CAGlB,EAAE,CAsBA,gBAAgB,EAzBpB,AYYI,oBZZgB,CAGlB,EAAE,CYHJ,mBAAmB,CASjB,wBAAwB,CZgBtB,gBAAgB,EYzBpB,AAYI,mBAZe,CASjB,wBAAwB,CXT1B,+BAA+B,CAC7B,iBAAiB,CACf,gBAAgB,EAFpB,AWYI,+BXZ2B,CAC7B,iBAAiB,CWDnB,mBAAmB,CASjB,wBAAwB,CXPtB,gBAAgB,CWUX;EACH,KAAK,EAAE,KAAM;EACb,UAAU,EAAE,IAAK,GAClB;;AAIL,AACE,mBADiB,CACjB,IAAI,CAAC;EACH,SAAS,EAAE,KAAM,GAClB;;AAiDH,AACE,sBADoB,CACpB,YAAY,CAAC;ErCVd,OAAO,EAAE,WAAY;EACrB,OAAO,EAAE,YAAa;EACtB,OAAO,EAAE,SAAU;EACnB,OAAO,EAAE,WAAY;EACrB,OAAO,EAAE,IAAK;EAyCb,qBAAqB,EAAE,MAAO;EAC9B,kBAAkB,EAAE,UAAW;EAEhC,sBAAsB,EqCpCK,GAAG;ErCqC9B,mBAAmB,EqCrCQ,GAAG;ErCsC9B,kBAAkB,EqCtCS,GAAG;ErCuC9B,cAAc,EqCvCa,GAAG,GAoB5B;EAvBH,AAKI,sBALkB,CACpB,YAAY,CAIV,WAAW,CAAC;IrC4Lf,gBAAgB,EqC3LG,CAAC;IrC4LpB,YAAY,EqC5LO,CAAC;IrC6LpB,aAAa,EqC7LM,CAAC;IrC8LpB,SAAS,EqC9LU,CAAC;IrC+LpB,QAAQ,EqC/LW,CAAC;IrCgMpB,IAAI,EqChMe,CAAC;IACf,SAAS,EAAE,GAAI;IACf,aAAa,EAAE,IAAK,GACrB;EATL,AAWI,sBAXkB,CACpB,YAAY,CAUV,YAAY,CAAC;IrCsLhB,gBAAgB,EqCrLG,CAAC;IrCsLpB,YAAY,EqCtLO,CAAC;IrCuLpB,aAAa,EqCvLM,CAAC;IrCwLpB,SAAS,EqCxLU,CAAC;IrCyLpB,QAAQ,EqCzLW,CAAC;IrC0LpB,IAAI,EqC1Le,CAAC;IACf,SAAS,EAAE,GAAI;IACf,YAAY,EAAE,IAAK,GAQpB;IAtBL,AAgBM,sBAhBgB,CACpB,YAAY,CAUV,YAAY,CAKV,gBAAgB,CAAC;MAEf,MAAM,EAAE,OAAQ;MAChB,SAAS,EAAE,IAAK;MAChB,YAAY,EAAE,GAAI,GACnB",
+ "names": []
+}
\ No newline at end of file
diff --git a/priv/ember_riak_explorer/dist/assets/ember-riak-explorer.js b/priv/ember_riak_explorer/dist/assets/ember-riak-explorer.js
new file mode 100644
index 0000000..f7a0a32
--- /dev/null
+++ b/priv/ember_riak_explorer/dist/assets/ember-riak-explorer.js
@@ -0,0 +1,43673 @@
+"use strict";
+
+/* jshint ignore:start */
+
+
+
+/* jshint ignore:end */
+
+define('ember-riak-explorer/adapters/application', ['exports', 'ember-data'], function (exports, _emberData) {
+
+ /**
+ * Provides common defaults for other adapters to extend: http://emberjs.com/api/data/classes/DS.Adapter.html
+ *
+ * @class ApplicationAdapter
+ * @namespace Adapters
+ * @extends DS.RESTAdapter
+ */
+ var ApplicationAdapter = _emberData['default'].RESTAdapter.extend({
+ namespace: 'explore'
+ });
+
+ exports['default'] = ApplicationAdapter;
+});
+define('ember-riak-explorer/adapters/bucket-list', ['exports', 'ember-riak-explorer/adapters/application', 'ember-riak-explorer/config/environment'], function (exports, _emberRiakExplorerAdaptersApplication, _emberRiakExplorerConfigEnvironment) {
+
+ /**
+ * @class BucketListAdapter
+ * @namespace Adapters
+ * @extends ApplicationAdapter
+ */
+ exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({
+ /**
+ * Overrides application adapter queryRecord method.
+ * Used to get a bucket types cached bucket list. Please refer to cached lists in the read me for more info on explorer cached lists.
+ *
+ * @method queryRecord
+ * @return {Object} Promise object of the requested bucket list
+ */
+ queryRecord: function queryRecord(store, type, query) {
+ var url = 'explore/clusters/' + query.clusterName + '/bucket_types/' + query.bucketTypeName + '/buckets?start=1&rows=' + _emberRiakExplorerConfigEnvironment['default'].pageSize;
+
+ var promise = this.ajax(url, 'GET').then(function (data) {
+ if (data.buckets) {
+ // Reformat response
+ data.bucketList = data.buckets;
+
+ delete data.buckets;
+ delete data.bucketList.buckets;
+
+ // Use compound key strategy to form id
+ data.bucketList.id = query.clusterName + '/' + query.bucketTypeName + '/bucketList';
+ }
+
+ return data;
+ });
+
+ return promise;
+ }
+ });
+});
+define('ember-riak-explorer/adapters/bucket-type', ['exports', 'ember-riak-explorer/adapters/application', 'ember'], function (exports, _emberRiakExplorerAdaptersApplication, _ember) {
+
+ /**
+ * @class BucketTypeAdapter
+ * @namespace Adapters
+ * @extends ApplicationAdapter
+ */
+ exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({
+ /**
+ * Overrides application adapter query method.
+ * Used to read bucket types from a given cluster.
+ *
+ * @method query
+ * @return {Object} Promise object of the requested bucket type
+ */
+ query: function query(store, type, _query) {
+ var url = 'explore/clusters/' + _query.clusterName + '/bucket_types';
+
+ var promise = this.ajax(url, 'GET').then(function (data) {
+ // Remove any time series table bucket types, they are added by the TableAdapter.
+ // Time series tables are identified by the "ddl" property.
+ data.bucket_types = data.bucket_types.filter(function (bt) {
+ return _ember['default'].isNone(bt.props.ddl);
+ });
+
+ data.bucket_types.forEach(function (bucketType) {
+ // Use compound key strategy to form name/id
+ bucketType.name = bucketType.id;
+ bucketType.id = _query.clusterName + '/' + bucketType.name;
+ });
+
+ return data;
+ });
+
+ return promise;
+ }
+ });
+});
+define('ember-riak-explorer/adapters/bucket', ['exports', 'ember', 'ember-riak-explorer/adapters/application', 'ember-riak-explorer/config/environment'], function (exports, _ember, _emberRiakExplorerAdaptersApplication, _emberRiakExplorerConfigEnvironment) {
+
+ /**
+ * @class BucketAdapter
+ * @namespace Adapters
+ * @extends ApplicationAdapter
+ */
+ exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({
+ /**
+ * Overrides application adapter query method.
+ * Used to read buckets from a given bucket type.
+ * Buckets are read from a cached list, and as a result may be paginated. This is where ${config.pageSize} param comes into play.
+ *
+ * @method query
+ * @return {Object} Promise object of the requested bucket
+ */
+ query: function query(store, type, _query) {
+ var url = 'explore/clusters/' + _query.clusterName + '/bucket_types/' + _query.bucketTypeName + '/buckets?start=1&rows=' + _emberRiakExplorerConfigEnvironment['default'].pageSize;
+
+ var promise = this.ajax(url, 'GET').then(function (data) {
+ if (data.buckets && data.buckets.buckets) {
+ data.buckets = data.buckets.buckets.map(function (bucketName) {
+ // Use compound key strategy to form name/id
+ return {
+ id: _query.clusterName + '/' + _query.bucketTypeName + '/' + bucketName,
+ name: bucketName
+ };
+ });
+ }
+
+ return data;
+ });
+
+ return promise;
+ },
+
+ /**
+ * Overrides application adapter deleteRecord method.
+ * Used to read buckets from a given bucket type.
+ * Buckets are read from a cached list, and as a result may be paginated. This is where ${config.pageSize} param comes into play.
+ *
+ * @method deleteRecord
+ * @return {Object} Promise object of the DELETE request
+ */
+ deleteRecord: function deleteRecord(store, type, snapshot) {
+ var clusterName = snapshot.belongsTo('bucketType').belongsTo('cluster').id;
+ var bucketTypeName = snapshot.belongsTo('bucketType').attr('name');
+ var bucketName = snapshot.attr('name');
+ var url = 'explore/clusters/' + clusterName + '/bucket_types/' + bucketTypeName + '/buckets/' + bucketName;
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+ _ember['default'].$.ajax({
+ type: "DELETE",
+ url: url,
+ success: function success(data, textStatus, jqXHR) {
+ resolve(jqXHR.status);
+ },
+ error: function error(jqXHR, textStatus) {
+ if (jqXHR.status === 202) {
+ resolve(jqXHR.status);
+ } else {
+ reject(textStatus);
+ }
+ }
+ });
+ });
+ }
+ });
+});
+define('ember-riak-explorer/adapters/cluster', ['exports', 'ember-riak-explorer/adapters/application'], function (exports, _emberRiakExplorerAdaptersApplication) {
+
+ /**
+ * @class ClusterAdapter
+ * @namespace Adapters
+ * @extends ApplicationAdapter
+ */
+ exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({
+ /**
+ * Overrides application adapter urlForFindAll method.
+ *
+ * @method urlForFindAll
+ * @return {String} url to use for FindAll method
+ */
+ urlForFindAll: function urlForFindAll(modelName) {
+ return 'explore/clusters';
+ }
+ });
+});
+define('ember-riak-explorer/adapters/config-file', ['exports', 'ember-riak-explorer/adapters/application'], function (exports, _emberRiakExplorerAdaptersApplication) {
+
+ /**
+ * @class ConfigFileAdapter
+ * @namespace Adapters
+ * @extends ApplicationAdapter
+ */
+ exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({
+ /**
+ * Overrides application adapter query method.
+ * Used to read configuration files from a given node
+ *
+ * @method query
+ * @return {Object} Promise object of the requested node config files
+ */
+ query: function query(store, type, _query) {
+ var url = 'explore/clusters/' + _query.clusterName + '/nodes/' + _query.nodeName + '/config/files';
+
+ var promise = this.ajax(url, 'GET').then(function (data) {
+
+ data.files.forEach(function (file) {
+ // Use compound key strategy to form name/id
+ file.name = file.id;
+ file.id = _query.clusterName + '/' + _query.nodeName + '/' + file.name;
+ });
+
+ return data;
+ });
+
+ return promise;
+ }
+ });
+});
+define('ember-riak-explorer/adapters/log-file', ['exports', 'ember-riak-explorer/adapters/application'], function (exports, _emberRiakExplorerAdaptersApplication) {
+
+ /**
+ * @class LogFileAdapter
+ * @namespace Adapters
+ * @extends ApplicationAdapter
+ */
+ exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({
+ /**
+ * Overrides application adapter query method.
+ * Used to read log files from a given node
+ *
+ * @method query
+ * @return {Object} Promise object of the requested node log files
+ */
+ query: function query(store, type, _query) {
+ var url = 'explore/clusters/' + _query.clusterName + '/nodes/' + _query.nodeName + '/log/files';
+
+ var promise = this.ajax(url, 'GET').then(function (data) {
+
+ data.files.forEach(function (file) {
+ // Use compound key strategy to form name/id
+ file.name = file.id;
+ file.id = _query.clusterName + '/' + _query.nodeName + '/' + file.name;
+ });
+
+ return data;
+ });
+
+ return promise;
+ }
+ });
+});
+define('ember-riak-explorer/adapters/node', ['exports', 'ember-riak-explorer/adapters/application'], function (exports, _emberRiakExplorerAdaptersApplication) {
+
+ /**
+ * @class NodeAdapter
+ * @namespace Adapters
+ * @extends ApplicationAdapter
+ */
+ exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({
+ /**
+ * Overrides application adapter query method.
+ * Used to read nodes from a given cluster.
+ *
+ * @method query
+ * @return {Object} Promise object of the requested nodes
+ */
+ query: function query(store, type, _query) {
+ var url = 'explore/clusters/' + _query.clusterName + '/nodes';
+
+ var promise = this.ajax(url, 'GET').then(function (data) {
+ // Use compound key strategy to form name/id
+ data.nodes.forEach(function (node) {
+ node.name = node.id;
+ node.id = _query.clusterName + '/' + node.name;
+ });
+
+ return data;
+ });
+
+ return promise;
+ }
+ });
+});
+define('ember-riak-explorer/adapters/object-list', ['exports', 'ember-riak-explorer/adapters/application', 'ember-riak-explorer/config/environment'], function (exports, _emberRiakExplorerAdaptersApplication, _emberRiakExplorerConfigEnvironment) {
+
+ /**
+ * @class ObjectListAdapter
+ * @namespace Adapters
+ * @extends ApplicationAdapter
+ */
+ exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({
+ /**
+ * Overrides application adapter queryRecord method.
+ * Used to get a buckets cached object list. Please refer to cached lists in the read me for more info on explorer cached lists.
+ *
+ * @method queryRecord
+ * @return {Object} Promise object of the requested bucket list
+ */
+ queryRecord: function queryRecord(store, type, query) {
+ var url = 'explore/clusters/' + query.clusterName + '/bucket_types/' + query.bucketTypeName + '/buckets/' + query.bucketName + '/keys?start=1&rows=' + _emberRiakExplorerConfigEnvironment['default'].pageSize;
+
+ var promise = this.ajax(url, 'GET').then(function (data) {
+ if (data.keys) {
+ data.objectList = data.keys;
+
+ delete data.keys;
+ delete data.objectList.keys;
+
+ data.objectList.id = query.clusterName + '/' + query.bucketTypeName + '/' + query.bucketName + '/objectList';
+ }
+
+ return data;
+ });
+
+ return promise;
+ },
+
+ /**
+ * Overrides application adapter urlForDeleteRecord method.
+ *
+ * @method queryRecord
+ * @return {String} Url string of DELETE request
+ */
+ urlForDeleteRecord: function urlForDeleteRecord(id, modelName, snapshot) {
+ var clusterName = snapshot.belongsTo('bucket').belongsTo('bucketType').belongsTo('cluster').id;
+ var bucketTypeName = snapshot.belongsTo('bucket').belongsTo('bucketType').attr('name');
+ var bucketName = snapshot.belongsTo('bucket').attr('name');
+
+ return 'explore/clusters/' + clusterName + '/bucket_types/' + bucketTypeName + '/buckets/' + bucketName + '/keys';
+ }
+ });
+});
+define('ember-riak-explorer/adapters/riak-object', ['exports', 'ember', 'ember-riak-explorer/adapters/application', 'ember-riak-explorer/config/environment'], function (exports, _ember, _emberRiakExplorerAdaptersApplication, _emberRiakExplorerConfigEnvironment) {
+
+ /**
+ * @class RiakObjectAdapter
+ * @namespace Adapters
+ * @extends ApplicationAdapter
+ */
+ exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({
+ /**
+ * Overrides application adapter query method.
+ * Used to read objects from a given bucket.
+ *
+ * @method query
+ * @return {Object} Promise object of the requested object
+ */
+ query: function query(store, type, _query) {
+ var url = 'explore/clusters/' + _query.clusterName + '/bucket_types/' + _query.bucketTypeName + '/buckets/' + _query.bucketName + '/keys?start=1&rows=' + _emberRiakExplorerConfigEnvironment['default'].pageSize;
+
+ var promise = this.ajax(url, 'GET').then(function (data) {
+ if (data.keys && data.keys.keys) {
+ // Use compound key strategy to form name/id
+ data.riak_objects = data.keys.keys.map(function (key) {
+ return {
+ id: _query.clusterName + '/' + _query.bucketTypeName + '/' + _query.bucketName + '/' + key,
+ name: key
+ };
+ });
+
+ delete data.keys;
+ }
+
+ return data;
+ });
+
+ return promise;
+ },
+
+ /**
+ * Overrides application adapter createRecord method.
+ * Creating a record and updating a record use same api, forward this method to that one
+ *
+ * @method createRecord
+ */
+ createRecord: function createRecord(store, type, snapshot) {
+ return this.updateRecord(store, type, snapshot);
+ },
+
+ /**
+ * Performs a limited 'Delete Bucket' command via the Explorer API.
+ * (This is done as a convenience operation for Devs, since Riak doesn't
+ * currently support a whole-bucket delete.)
+ * To be more precise, the Explorer backend iterates through all the keys
+ * in its Key List cache for that bucket, and issues Delete Object commands
+ * for those keys.
+ *
+ * Limitations:
+ * - This is only available in Development Mode
+ * - Explorer can only delete objects whose keys are in its cache.
+ *
+ * Note: This means that the object list cache must already be populated for a delete action to be taken on the
+ * bucket
+ *
+ * @method deleteRecord
+ * @return {Object} Promise object of the request
+ */
+ deleteRecord: function deleteRecord(store, type, snapshot) {
+ var object = snapshot.record;
+ var clusterUrl = object.get('cluster').get('proxyUrl');
+ var bucketTypeName = object.get('bucketType').get('name');
+ var bucketName = object.get('bucket').get('name');
+ var objectName = object.get('name');
+ var url = clusterUrl + '/types/' + bucketTypeName + '/buckets/' + bucketName + '/keys/' + objectName;
+
+ return _ember['default'].$.ajax({
+ type: "DELETE",
+ url: url,
+ headers: { 'X-Riak-Vclock': object.get('causalContext') }
+ });
+ },
+
+ /**
+ * Overrides application adapter updateRecord method.
+ * Creates new riak object for a given bucket
+ *
+ * @method updateRecord
+ * @return {Object} Promise object of the request
+ */
+ updateRecord: function updateRecord(store, type, snapshot) {
+ var object = snapshot.record;
+ var clusterUrl = object.get('cluster').get('proxyUrl');
+ var bucketTypeName = object.get('bucketType').get('name');
+ var bucketName = object.get('bucket').get('name');
+ var objectName = object.get('name');
+ var url = clusterUrl + '/types/' + bucketTypeName + '/buckets/' + bucketName + '/keys/' + objectName;
+ var headers = {};
+
+ if (object.get('causalContext')) {
+ headers['X-Riak-Vclock'] = object.get('causalContext');
+ }
+ if (object.get('indexes')) {
+ object.get('indexes').forEach(function (index) {
+ headers[index.key] = index.value;
+ });
+ }
+ if (object.get('headersCustom')) {
+ object.get('headersCustom').forEach(function (header) {
+ headers[header.key] = header.value;
+ });
+ }
+
+ return _ember['default'].$.ajax({
+ type: 'PUT',
+ processData: false,
+ contentType: object.get('contentType') || 'application/json',
+ url: url,
+ headers: headers,
+ data: JSON.stringify(object.get('contents'))
+ });
+ }
+ });
+});
+define('ember-riak-explorer/adapters/row-list', ['exports', 'ember-riak-explorer/adapters/application'], function (exports, _emberRiakExplorerAdaptersApplication) {
+
+ /**
+ * @class RowListAdapter
+ * @namespace Adapters
+ * @extends ApplicationAdapter
+ */
+ exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({
+ /**
+ * Overrides application adapter queryRecord method.
+ * Used to get a tables cached row list. Please refer to cached lists in the read me for more info on explorer cached lists.
+ *
+ * @method queryRecord
+ * @return {Object} Promise object of the requested bucket list
+ */
+ queryRecord: function queryRecord(store, type, query) {
+ // TS Tables use same end point as bucket types, differentiated by "ddl" property
+ var url = 'explore/clusters/' + query.clusterName + '/tables/' + query.tableName + '/keys';
+
+ var promise = this.ajax(url, 'GET').then(function (data) {
+ if (data.keys) {
+ data.rowList = data.keys;
+
+ delete data.keys;
+ delete data.rowList.keys;
+
+ // Use compound key strategy to form id
+ data.rowList.id = query.clusterName + '/' + query.tableName + '/rowsList';
+ }
+
+ return data;
+ });
+
+ return promise;
+ }
+ });
+});
+define('ember-riak-explorer/adapters/row', ['exports', 'ember-riak-explorer/adapters/application'], function (exports, _emberRiakExplorerAdaptersApplication) {
+
+ /**
+ * @class RowAdapter
+ * @namespace Adapters
+ * @extends ApplicationAdapter
+ */
+ exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({
+ /**
+ * Overrides application adapter query method.
+ * Used to read table rows from a given time series table
+ *
+ * @method query
+ * @return {Object} Promise object of the requested object
+ */
+ query: function query(store, type, _query) {
+ // TS Tables use same end point as bucket types, differentiated by "ddl" property
+ var url = 'explore/clusters/' + _query.clusterName + '/tables/' + _query.tableName + '/keys';
+
+ var promise = this.ajax(url, 'GET').then(function (data) {
+ if (data.keys && data.keys.keys) {
+ data.rows = data.keys.keys.map(function (rowValue, index) {
+ // Use compound key strategy to form name/id
+ return {
+ value: rowValue,
+ index: index,
+ id: _query.clusterName + '/' + _query.tableName + '/' + index
+ };
+ });
+
+ delete data.keys;
+ }
+
+ return data;
+ });
+
+ return promise;
+ }
+ });
+});
+define('ember-riak-explorer/adapters/search-index', ['exports', 'ember-data'], function (exports, _emberData) {
+
+ /**
+ * @class SearchIndexAdapter
+ * @namespace Adapters
+ * @extends ApplicationAdapter
+ */
+ var SearchIndexAdapter = _emberData['default'].RESTAdapter.extend({
+ /**
+ * Overrides application adapter query method.
+ * Used to read search indexes from a given cluster.
+ *
+ * @method query
+ * @return {Object} Promise object of the requested object
+ */
+ query: function query(store, type, _query) {
+ var url = 'riak/clusters/' + _query.clusterName + '/search/index';
+
+ var promise = this.ajax(url, 'GET').then(function (indexes) {
+ // Use compound key strategy to form id
+ indexes.forEach(function (index) {
+ index.id = _query.clusterName + '/' + index.name;
+ });
+
+ return indexes;
+ });
+
+ return promise;
+ }
+ });
+
+ exports['default'] = SearchIndexAdapter;
+});
+define('ember-riak-explorer/adapters/table', ['exports', 'ember-riak-explorer/adapters/application', 'ember'], function (exports, _emberRiakExplorerAdaptersApplication, _ember) {
+
+ /**
+ * @class TableAdapter
+ * @namespace Adapters
+ * @extends ApplicationAdapter
+ */
+ exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({
+ /**
+ * Overrides application adapter query method.
+ * Used to read tables from a given cluster.
+ *
+ * @method query
+ * @return {Object} Promise object of the requested object
+ */
+ query: function query(store, type, _query) {
+ // TS Tables use same end point as bucket types, differentiated by "ddl" property
+ var url = 'explore/clusters/' + _query.clusterName + '/bucket_types';
+
+ var promise = this.ajax(url, 'GET').then(function (data) {
+
+ // Remove any kv bucket types, they are added by the BucketTypeAdapter.
+ // Time series tables are identified by the "ddl" property.
+ data.tables = data.bucket_types.filter(function (bt) {
+ return _ember['default'].isPresent(bt.props.ddl);
+ });
+
+ delete data.bucket_types;
+
+ // Use compound key strategy to form name/id
+ data.tables.forEach(function (table) {
+ table.name = table.id;
+ table.id = _query.clusterName + '/' + table.name;
+ });
+
+ return data;
+ });
+
+ return promise;
+ }
+ });
+});
+define('ember-riak-explorer/app', ['exports', 'ember', 'ember-riak-explorer/resolver', 'ember-load-initializers', 'ember-riak-explorer/config/environment'], function (exports, _ember, _emberRiakExplorerResolver, _emberLoadInitializers, _emberRiakExplorerConfigEnvironment) {
+
+ var App = undefined;
+
+ _ember['default'].MODEL_FACTORY_INJECTIONS = true;
+
+ App = _ember['default'].Application.extend({
+ modulePrefix: _emberRiakExplorerConfigEnvironment['default'].modulePrefix,
+ podModulePrefix: _emberRiakExplorerConfigEnvironment['default'].podModulePrefix,
+ Resolver: _emberRiakExplorerResolver['default']
+ });
+
+ (0, _emberLoadInitializers['default'])(App, _emberRiakExplorerConfigEnvironment['default'].modulePrefix);
+
+ exports['default'] = App;
+});
+define('ember-riak-explorer/components/alert-component', ['exports', 'ember'], function (exports, _ember) {
+
+ /**
+ Implements Bootstrap alerts, see http://getbootstrap.com/components/#alerts
+
+ By default it is a user dismissible, which can be disabled. Be sure to set the `type` property for proper styling.
+
+ ```hbs
+ {{#alert-component type="success"}}
+ Well done! You successfully read this important alert message.
+ {{/alert-component}}
+ ```
+ @class Alert
+ @namespace Components
+ @extends Ember.Component
+ */
+
+ exports['default'] = _ember['default'].Component.extend({
+ classNameBindings: ['alert'],
+
+ type: 'info',
+
+ /**
+ * A dismissible alert will have a close button in the upper right corner, that the user can click to dismiss
+ * the alert.
+ *
+ * @property dismissible
+ * @type boolean
+ * @default true
+ * @public
+ */
+ dismissible: true,
+
+ /**
+ * This property indicates if the alert is visible. Can be set to change the visibility of the alert box.
+ *
+ * @property visible
+ * @type boolean
+ * @default true
+ * @public
+ */
+ visible: true,
+
+ alert: (function () {
+ if (this.get('visible')) {
+ return 'alert alert-' + this.get('type');
+ }
+ }).property('type', 'visible'),
+
+ onVisibleChange: (function () {
+ if (this.get('visible')) {
+ this.show();
+ } else {
+ this.hide();
+ }
+ }).property('visible'),
+
+ /**
+ * Call to make the alert visible again after it has been hidden
+ *
+ * @method show
+ * @public
+ */
+ show: function show() {
+ this.set('visible', true);
+ },
+
+ /**
+ * Call to hide the alert.
+ *
+ * @method hide
+ * @public
+ */
+ hide: function hide() {
+ this.set('visible', false);
+ },
+
+ actions: {
+ dismiss: function dismiss() {
+ this.hide();
+ }
+ }
+ });
+});
+define('ember-riak-explorer/components/app-version', ['exports', 'ember-cli-app-version/components/app-version', 'ember-riak-explorer/config/environment'], function (exports, _emberCliAppVersionComponentsAppVersion, _emberRiakExplorerConfigEnvironment) {
+
+ var name = _emberRiakExplorerConfigEnvironment['default'].APP.name;
+ var version = _emberRiakExplorerConfigEnvironment['default'].APP.version;
+
+ exports['default'] = _emberCliAppVersionComponentsAppVersion['default'].extend({
+ version: version,
+ name: name
+ });
+});
+define('ember-riak-explorer/components/basic-dropdown', ['exports', 'ember-basic-dropdown/components/basic-dropdown'], function (exports, _emberBasicDropdownComponentsBasicDropdown) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberBasicDropdownComponentsBasicDropdown['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/breadcrumb-component', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ classNames: ['breadcrumb-container'],
+
+ clusterSubSection: null,
+
+ data: null,
+
+ isClusterData: (function () {
+ return this.get('clusterSubSection') === 'data';
+ }).property('clusterSubSection'),
+
+ isClusterOps: (function () {
+ return this.get('clusterSubSection') === 'ops';
+ }).property('clusterSubSection'),
+
+ isClusterQuery: (function () {
+ return this.get('clusterSubSection') === 'query';
+ }).property('clusterSubSection')
+ });
+});
+define('ember-riak-explorer/components/charts/cluster-stat', ['exports', 'ember', 'ember-highcharts/components/high-charts', 'lodash/lodash'], function (exports, _ember, _emberHighchartsComponentsHighCharts, _lodashLodash) {
+ /*globals Highcharts */
+
+ exports['default'] = _emberHighchartsComponentsHighCharts['default'].extend({
+ defaultOptions: {
+ title: {
+ text: 'Cluster Data'
+ },
+ rangeSelector: {
+ buttons: [{
+ count: 1,
+ type: 'minute',
+ text: '1M'
+ }, {
+ count: 5,
+ type: 'minute',
+ text: '5M'
+ }, {
+ count: 10,
+ type: 'minute',
+ text: '10M'
+ }, {
+ count: 30,
+ type: 'minute',
+ text: '30M'
+ }, {
+ type: 'all',
+ text: 'All'
+ }],
+ inputEnabled: false,
+ selected: 0
+ },
+ legend: {
+ enabled: true
+ }
+ },
+
+ cluster: null,
+
+ statToGraph: null,
+
+ content: null,
+
+ chartOptions: null,
+
+ mode: "StockChart",
+
+ getMostRecentData: function getMostRecentData() {
+ var self = this;
+
+ return this.get('cluster').get('nodes').map(function (node) {
+ return {
+ name: node.get('name'),
+ stats: node.get('statsHistory')
+ };
+ });
+ },
+
+ setInitialData: function setInitialData() {
+ var statName = this.get('statToGraph');
+ var options = _lodashLodash['default'].assign(_lodashLodash['default'].cloneDeep(this.defaultOptions), { title: { text: statName } });
+ var data = this.getMostRecentData();
+
+ this.set('chartOptions', options);
+ this.set('content', data.map(function (node) {
+ return {
+ name: node.name,
+ data: node.stats.map(function (stat) {
+ return {
+ x: stat.timestamp,
+ y: stat.stats[statName]
+ };
+ }),
+ type: 'spline',
+ turboThreshold: 0
+ };
+ }));
+ },
+
+ init: function init() {
+ this._super.apply(this, arguments);
+ this.setInitialData();
+ },
+
+ streamNewDataIntoChart: function streamNewDataIntoChart() {
+ var chart = this.get('chart');
+ var allSeries = chart.series.filter(function (node) {
+ return node.name !== 'Navigator';
+ });
+ var data = this.getMostRecentData();
+ var statName = this.get('chartOptions.title.text');
+
+ allSeries.forEach(function (series, index) {
+ var redraw = index + 1 === allSeries.length;
+ var newData = data.findBy('name', series.name);
+
+ series.setData(newData.stats.map(function (stat) {
+ return {
+ x: stat.timestamp,
+ y: stat.stats[statName]
+ };
+ }), redraw);
+ });
+ },
+
+ debouncedObserver: (function () {
+ _ember['default'].run.debounce(this, this.streamNewDataIntoChart, 1000);
+ }).observes('cluster.nodes.@each.stats'),
+
+ switchChart: (function () {
+ var statName = this.get('statToGraph');
+ var currentDisplayedStat = this.get('chartOptions.title.text');
+ var chart = this.get('chart');
+
+ if (statName !== currentDisplayedStat) {
+ this.setInitialData();
+ chart.redraw();
+ }
+ }).observes('statToGraph')
+ });
+});
+define('ember-riak-explorer/components/charts/node-stat', ['exports', 'ember-highcharts/components/high-charts', 'lodash/lodash'], function (exports, _emberHighchartsComponentsHighCharts, _lodashLodash) {
+ /*globals Highcharts */
+
+ exports['default'] = _emberHighchartsComponentsHighCharts['default'].extend({
+ defaultOptions: {
+ title: {
+ text: 'Node Data'
+ },
+ rangeSelector: {
+ buttons: [{
+ count: 1,
+ type: 'minute',
+ text: '1M'
+ }, {
+ count: 5,
+ type: 'minute',
+ text: '5M'
+ }, {
+ count: 10,
+ type: 'minute',
+ text: '10M'
+ }, {
+ count: 30,
+ type: 'minute',
+ text: '30M'
+ }, {
+ type: 'all',
+ text: 'All'
+ }],
+ inputEnabled: false,
+ selected: 0
+ }
+ },
+
+ node: null,
+
+ statToGraph: null,
+
+ content: null,
+
+ chartOptions: null,
+
+ mode: "StockChart",
+
+ setInitialData: function setInitialData() {
+ var statName = this.get('statToGraph');
+ var options = _lodashLodash['default'].assign(_lodashLodash['default'].cloneDeep(this.defaultOptions), { title: { text: statName } });
+ var stats = this.get('node').get('statsHistory');
+
+ this.set('chartOptions', options);
+ this.set('content', [{
+ name: statName,
+ data: stats.map(function (stat) {
+ return {
+ x: stat.timestamp,
+ y: stat.stats[statName]
+ };
+ }),
+ type: 'spline',
+ turboThreshold: 0
+ }]);
+ },
+
+ init: function init() {
+ this._super.apply(this, arguments);
+ this.setInitialData();
+ },
+
+ streamNewDataIntoChart: (function () {
+ var chart = this.get('chart');
+ var series = _lodashLodash['default'].head(chart.series);
+ var stats = this.get('node').get('statsHistory');
+ var statName = this.get('chartOptions.title.text');
+
+ series.setData(stats.map(function (stat) {
+ return {
+ x: stat.timestamp,
+ y: stat.stats[statName]
+ };
+ }));
+ }).observes('node.stats'),
+
+ switchChart: (function () {
+ var statName = this.get('statToGraph');
+ var currentDisplayedStat = this.get('chartOptions.title.text');
+ var chart = this.get('chart');
+
+ if (statName !== currentDisplayedStat) {
+ this.setInitialData();
+ chart.redraw();
+ }
+ }).observes('statToGraph')
+ });
+});
+define('ember-riak-explorer/components/cluster-status-indicator', ['exports', 'ember', 'ember-tooltips/utils/render-tooltip'], function (exports, _ember, _emberTooltipsUtilsRenderTooltip) {
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'span',
+
+ classNames: ['cluster-status-circle'],
+
+ classNameBindings: ['status'],
+
+ status: null,
+
+ tooltipInstance: null,
+
+ toolTipContent: (function () {
+ var message = '';
+ var status = this.get('status');
+
+ switch (status) {
+ case 'ok':
+ message = "All nodes in the cluster are valid and are reachable";
+ break;
+ case 'warning':
+ message = 'Some nodes in the cluster are either invalid and/or are unreachable';
+ break;
+ case 'down':
+ message = 'All nodes in the cluster are either invalid and/or are unreachable';
+ break;
+ default:
+ break;
+ }
+
+ return '' + message + '
';
+ }).property('status'),
+
+ didRender: function didRender() {
+ var toolTipContent = this.get('toolTipContent');
+
+ if (!this.get('tooltipInstance')) {
+ var element = this.$()[0];
+
+ this.set('tooltipInstance', (0, _emberTooltipsUtilsRenderTooltip['default'])(element, {
+ content: toolTipContent,
+ event: 'hover',
+ place: 'right',
+ spacing: 20
+ }));
+ } else {
+ this.get('tooltipInstance').content(toolTipContent);
+ }
+ }
+ });
+});
+define('ember-riak-explorer/components/content-editable', ['exports', 'ember-content-editable/components/content-editable'], function (exports, _emberContentEditableComponentsContentEditable) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberContentEditableComponentsContentEditable['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/dashboard-module/body', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ classNames: ['module-body']
+ });
+});
+define('ember-riak-explorer/components/dashboard-module/container', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ classNames: ['dashboard-module']
+ });
+});
+define('ember-riak-explorer/components/dashboard-module/header', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ classNames: ['module-header'],
+
+ label: null
+ });
+});
+define('ember-riak-explorer/components/dashboard-module/section', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'section',
+
+ title: null
+ });
+});
+define('ember-riak-explorer/components/ember-modal-dialog-positioned-container', ['exports', 'ember-modal-dialog/components/positioned-container'], function (exports, _emberModalDialogComponentsPositionedContainer) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberModalDialogComponentsPositionedContainer['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/ember-wormhole', ['exports', 'ember-wormhole/components/ember-wormhole'], function (exports, _emberWormholeComponentsEmberWormhole) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberWormholeComponentsEmberWormhole['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/form/add-custom-properties', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ properties: [],
+
+ actions: {
+ addNewProperty: function addNewProperty() {
+ this.get('properties').pushObject({
+ key: '',
+ value: ''
+ });
+ },
+
+ removeProperty: function removeProperty(index) {
+ this.get('properties').removeAt(index);
+ }
+ }
+ });
+});
+define('ember-riak-explorer/components/form/explorer-button', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ classNames: ['form-group', 'create-button'],
+
+ type: 'primary',
+
+ label: null,
+
+ actions: {
+ handleButtonClick: function handleButtonClick() {
+ this.sendAction('buttonClick');
+ }
+ }
+ });
+});
+define('ember-riak-explorer/components/form/explorer-input', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ classNames: ['form-group'],
+
+ label: null,
+
+ type: 'text',
+
+ value: null
+ });
+});
+define('ember-riak-explorer/components/high-charts', ['exports', 'ember-highcharts/components/high-charts'], function (exports, _emberHighchartsComponentsHighCharts) {
+ exports['default'] = _emberHighchartsComponentsHighCharts['default'];
+});
+define('ember-riak-explorer/components/hll-editor', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'ul',
+
+ classNames: ['object-content-list'],
+
+ newItem: '',
+
+ contents: [],
+
+ actions: {
+ addElement: function addElement(item) {
+ var trimmedItem = item.trim();
+
+ this.sendAction('addElement', trimmedItem);
+ this.set('newItem', '');
+ }
+ }
+ });
+});
+define('ember-riak-explorer/components/ivy-codemirror', ['exports', 'ivy-codemirror/components/ivy-codemirror'], function (exports, _ivyCodemirrorComponentsIvyCodemirror) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _ivyCodemirrorComponentsIvyCodemirror['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/ivy-tab-list', ['exports', 'ivy-tabs/components/ivy-tab-list'], function (exports, _ivyTabsComponentsIvyTabList) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _ivyTabsComponentsIvyTabList['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/ivy-tab-panel', ['exports', 'ivy-tabs/components/ivy-tab-panel'], function (exports, _ivyTabsComponentsIvyTabPanel) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _ivyTabsComponentsIvyTabPanel['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/ivy-tab', ['exports', 'ivy-tabs/components/ivy-tab'], function (exports, _ivyTabsComponentsIvyTab) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _ivyTabsComponentsIvyTab['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/ivy-tabs', ['exports', 'ivy-tabs/components/ivy-tabs'], function (exports, _ivyTabsComponentsIvyTabs) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _ivyTabsComponentsIvyTabs['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/link/explorer-resource', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'span',
+
+ resourceType: null,
+
+ resourceObj: null,
+
+ linkClass: null
+ });
+});
+define('ember-riak-explorer/components/loading-slider', ['exports', 'ember'], function (exports, _ember) {
+ var Component = _ember['default'].Component;
+ var run = _ember['default'].run;
+ var isBlank = _ember['default'].isBlank;
+ var inject = _ember['default'].inject;
+ var on = _ember['default'].on;
+ exports['default'] = Component.extend({
+ tagName: 'div',
+ classNames: ['loading-slider'],
+ classNameBindings: 'expanding',
+
+ loadingSlider: inject.service(),
+
+ init: function init() {
+ this._super.apply(this, arguments);
+ run.once(this, function () {
+ this.get('loadingSlider').on('startLoading', this, this._startLoading);
+ this.get('loadingSlider').on('endLoading', this, this._endLoading);
+ this.get('loadingSlider').on('changeAttrs', this, this._changeAttrs);
+ });
+ },
+
+ setAttrsThenManage: on('didReceiveAttrs', function () {
+ this.setProperties({
+ isLoading: this.getAttr('isLoading'),
+ duration: this.getAttr('duration'),
+ expanding: this.getAttr('expanding'),
+ speed: this.getAttr('speed'),
+ color: this.getAttr('color')
+ });
+
+ this.manage();
+ }),
+
+ willDestroy: function willDestroy() {
+ run.once(this, function () {
+ this.get('loadingSlider').off('startLoading', this, this._startLoading);
+ this.get('loadingSlider').off('endLoading', this, this._endLoading);
+ this.get('loadingSlider').off('changeAttrs', this, this._changeAttrs);
+ });
+ },
+
+ _startLoading: function _startLoading() {
+ this.set('isLoading', true);
+ this.manage();
+ },
+
+ _endLoading: function _endLoading() {
+ this.set('isLoading', false);
+ },
+
+ _changeAttrs: function _changeAttrs(attrs) {
+ this.setProperties(attrs);
+ this.manage();
+ },
+
+ manage: function manage() {
+ if (isBlank(this.$())) {
+ return;
+ }
+
+ if (this.get('isLoading')) {
+ if (this.get('expanding')) {
+ this.expandingAnimate.call(this);
+ } else {
+ this.animate.call(this);
+ }
+ } else {
+ this.set('isLoaded', true);
+ }
+ },
+
+ animate: function animate() {
+ this.set('isLoaded', false);
+ var self = this,
+ elapsedTime = 0,
+ inner = $(''),
+ outer = this.$(),
+ duration = this.getWithDefault('duration', 300),
+ innerWidth = 0,
+ outerWidth = this.$().width(),
+ stepWidth = Math.round(outerWidth / 50),
+ color = this.get('color');
+
+ outer.append(inner);
+ if (color) {
+ inner.css('background-color', color);
+ }
+
+ var interval = window.setInterval(function () {
+ elapsedTime = elapsedTime + 10;
+ inner.width(innerWidth = innerWidth + stepWidth);
+
+ // slow the animation if we used more than 75% the estimated duration
+ // or 66% of the animation width
+ if (elapsedTime > duration * 0.75 || innerWidth > outerWidth * 0.66) {
+ // don't stop the animation completely
+ if (stepWidth > 1) {
+ stepWidth = stepWidth * 0.97;
+ }
+ }
+
+ if (innerWidth > outerWidth) {
+ run.later(function () {
+ outer.empty();
+ window.clearInterval(interval);
+ }, 50);
+ }
+
+ // the activity has finished
+ if (self.get('isLoaded')) {
+ // start with a sizable pixel step
+ if (stepWidth < 10) {
+ stepWidth = 10;
+ }
+ // accelerate to completion
+ stepWidth = stepWidth + stepWidth;
+ }
+ }, 10);
+ },
+
+ expandingAnimate: function expandingAnimate() {
+ var self = this,
+ outer = this.$(),
+ speed = this.getWithDefault('speed', 1000),
+ colorQueue = this.get('color');
+
+ if ('object' === typeof colorQueue) {
+ (function updateFn() {
+ var color = colorQueue.shift();
+ colorQueue.push(color);
+ self.expandItem.call(self, color);
+ if (!self.get('isLoading')) {
+ outer.empty();
+ } else {
+ window.setTimeout(updateFn, speed);
+ }
+ })();
+ } else {
+ this.expandItem.call(this, colorQueue, true);
+ }
+ },
+
+ expandItem: function expandItem(color, cleanUp) {
+ var self = this,
+ inner = $('').css({ 'background-color': color }),
+ outer = this.$(),
+ innerWidth = 0,
+ outerWidth = outer.width(),
+ stepWidth = Math.round(outerWidth / 50);
+ var ua = window.navigator.userAgent;
+ var ie10 = ua.indexOf("MSIE "),
+ ie11 = ua.indexOf('Trident/'),
+ ieEdge = ua.indexOf('Edge/');
+
+ outer.append(inner);
+
+ var interval = window.setInterval(function () {
+ var step = innerWidth = innerWidth + stepWidth;
+ if (innerWidth > outerWidth) {
+ window.clearInterval(interval);
+ if (cleanUp) {
+ outer.empty();
+ }
+ }
+ if (ie10 > 0 || ie11 > 0 || ieEdge > 0) {
+ inner.css({
+ 'margin': '0 auto',
+ 'width': step
+ });
+ } else {
+ inner.css({
+ 'margin-left': '-' + step / 2 + 'px',
+ 'width': step
+ });
+ }
+ }, 10);
+ },
+
+ didInsertElement: function didInsertElement() {
+ this.$().html('');
+
+ var color = this.get('color');
+ if (color) {
+ this.$('span').css('background-color', color);
+ }
+
+ if (this.get('runManageInitially')) {
+ this._startLoading();
+ }
+ }
+ });
+});
+define('ember-riak-explorer/components/loading-spinner', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ classNames: ['loading-background']
+ });
+});
+define('ember-riak-explorer/components/map-object/contents', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ classNames: ['map-instance']
+ });
+});
+define('ember-riak-explorer/components/map-object/map', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ classNames: ['map-sub-map'],
+
+ showContent: false,
+
+ actions: {
+ subMapToggle: function subMapToggle() {
+ return this.set('showContent', !this.get('showContent'));
+ }
+ }
+ });
+});
+define('ember-riak-explorer/components/map-object/maps', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ classNames: ['map-section', 'maps-list']
+ });
+});
+define('ember-riak-explorer/components/map-object/section', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ classNames: ['map-section']
+ });
+});
+define('ember-riak-explorer/components/map-object/sets', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ classNames: ['map-section', 'map-sub-set']
+ });
+});
+define('ember-riak-explorer/components/modal-dialog-overlay', ['exports', 'ember-modal-dialog/components/modal-dialog-overlay'], function (exports, _emberModalDialogComponentsModalDialogOverlay) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberModalDialogComponentsModalDialogOverlay['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/modal-dialog', ['exports', 'ember-modal-dialog/components/modal-dialog'], function (exports, _emberModalDialogComponentsModalDialog) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberModalDialogComponentsModalDialog['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/new-object-inputs', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ object: {
+ key: null,
+ value: null,
+ contentType: null,
+ type: null
+ }
+ });
+});
+define('ember-riak-explorer/components/pagination-component', ['exports', 'ember'], function (exports, _ember) {
+
+ /**
+ * A pagination UI component. Determines how many links to show, handling click actions on those links,
+ * sending data "up" to be acted upon, and updating selected state.
+ *
+ * @class pagination-component
+ * @extends Ember.Component
+ */
+ exports['default'] = _ember['default'].Component.extend({
+ /**
+ * Sets the class name of the component
+ *
+ * @property classNames
+ * @type Array
+ */
+ classNames: ['pagination-component-container'],
+
+ /**
+ * Stores the number of pagination links the UI could potentially display
+ *
+ * @property numberLinksCount
+ * @type Integer
+ * @default 0
+ */
+ numberLinksCount: 0,
+
+ /**
+ * Stores the current page or chunk that the UI is displaying
+ *
+ * @property currentChunk
+ * @type Integer
+ * @default 1
+ */
+ currentChunk: 1,
+
+ /**
+ * Stores the current page or chunk size
+ *
+ * @property chunkSize
+ * @type Integer
+ * @default 0
+ */
+ chunkSize: 0,
+
+ /**
+ * An array of sequential integers starting at 1. i.e. [1,2,3,4,5,6]
+ * This is used to create the links in the UI as handlebars does not have a "times" helper by default
+ *
+ * @property numberLinks
+ * @type Array
+ * @default []
+ */
+ numberLinks: [],
+
+ /**
+ * Stores the total length of the items on which are being paginated
+ *
+ * @property totalSize
+ * @type Integer
+ * @default 0
+ */
+ totalSize: 0,
+
+ didReceiveAttrs: function didReceiveAttrs() {
+ this.setNumberLinksCount();
+ this.setNumberLinks();
+ },
+
+ /**
+ * Lifecycle method. This is called every time new data is fed into the component.
+ * Current chunk is set on various actions, data is fetched as a result of that action, the component receives new data,
+ * and this method is invoked.
+ *
+ * @method didRender
+ */
+ didRender: function didRender() {
+ this.updateSelectedClass();
+ },
+
+ /**
+ * Figures out what the item range for a given chunk based on the chunk size.
+ * If current chunk is 1 and paginating every ten items, the object returns the range 0-9
+ * If current chunk is 3 and paginating every ten items, the object returns the range 30-39
+ *
+ * @method calculateRequestedRange
+ * @private
+ * @param chunk {String}
+ * @return {Object} Contains low and high properties. i.e. { low: 31, high: 40 }
+ */
+ calculateRequestedRange: function calculateRequestedRange(chunk) {
+ var chunkSize = this.get('chunkSize');
+
+ return {
+ lowIndex: chunk * chunkSize - chunkSize,
+ highIndex: chunk * chunkSize - 1
+ };
+ },
+
+ /**
+ * Determines the total number of links needed to be created given the total length and chunk size.
+ *
+ * @method setNumberLinksCount
+ * @private
+ * @return {Integer}
+ */
+ setNumberLinksCount: function setNumberLinksCount() {
+ var linkCount = Math.ceil(this.get('totalSize') / this.get('chunkSize'));
+
+ return this.set('numberLinksCount', linkCount);
+ },
+
+ setNumberLinks: function setNumberLinks() {
+ // reset numberLinks array
+ this.set('numberLinks', []);
+
+ // We want the loop to be 1 indexed, not 0
+ for (var i = 1; i < this.get('numberLinksCount') + 1; i++) {
+ this.numberLinks.push(i);
+ }
+ },
+
+ /**
+ * Sets the selected class on the current pagination link item in the DOM. Using jQuery to mutate state is not ideal,
+ * but since this state is contained within the component, and because we don't have conditional logic in handlebars,
+ * this is the cleanest way to handle this.
+ *
+ * @method updateSelectedClass
+ * @private
+ */
+ updateSelectedClass: function updateSelectedClass() {
+ var self = this;
+ var numberLinks = this.$().find('.pagination-link.number-link');
+
+ // Remove the selected class
+ numberLinks.removeClass('selected');
+
+ // Add selected to the correct link
+ numberLinks.filter(function (index) {
+ var oneBasedIndex = index + 1;
+
+ return oneBasedIndex === self.get('currentChunk');
+ }).addClass('selected');
+ },
+
+ /**
+ * Determines whether or not the UI should show pagination links. This is used by the handlebars templates.
+ * returns false if there is only one page and pagination is not needed.
+ *
+ * @method shouldShowPaginationLinks
+ * @return {Boolean}
+ */
+ shouldShowPaginationLinks: (function () {
+ return this.get('numberLinksCount') > 1;
+ }).property('numberLinksCount'),
+
+ /**
+ * Determines whether or not the previous button should disabled. This is used by the handlebars templates.
+ * Returns true if the current page is 1, because there is not previous page at that point.
+ *
+ * @method shouldPrevBeDisabled
+ * @return {Boolean}
+ */
+ shouldPrevBeDisabled: (function () {
+ return this.get('currentChunk') <= 1;
+ }).property('currentChunk'),
+
+ /**
+ * Determines whether or not the next button should disabled. This is used by the handlebars templates.
+ * Returns true if the current page is the last item in the list, because there is not previous page at that point.
+ *
+ * @method shouldNextBeDisabled
+ * @return {Boolean}
+ */
+ shouldNextBeDisabled: (function () {
+ return this.numberLinks.length === this.get('currentChunk');
+ }).property('currentChunk'),
+
+ /**
+ * All actions that the pagination component handles. Upon receiving an action, it updates the state of the component
+ * and sends the event "up" for higher level work that it is not aware of.
+ *
+ * @property actions
+ * @type Object
+ */
+ actions: {
+ numberLinkClick: function numberLinkClick(link) {
+ var chunk = link;
+ var requestedRange = this.calculateRequestedRange(chunk);
+
+ this.set('currentChunk', chunk);
+ this.sendAction('sectionRequest', requestedRange.lowIndex, requestedRange.highIndex);
+ },
+
+ prevLinkClick: function prevLinkClick() {
+ if (!this.get('shouldPrevBeDisabled')) {
+ var currentChunk = this.get('currentChunk');
+ var newChunk = currentChunk - 1;
+ var requestedRange = this.calculateRequestedRange(newChunk);
+
+ this.set('currentChunk', newChunk);
+ this.sendAction('sectionRequest', requestedRange.lowIndex, requestedRange.highIndex);
+ }
+ },
+
+ nextLinkClick: function nextLinkClick() {
+ if (!this.get('shouldNextBeDisabled')) {
+ var currentChunk = this.get('currentChunk');
+ var newChunk = currentChunk + 1;
+ var requestedRange = this.calculateRequestedRange(newChunk);
+
+ this.set('currentChunk', newChunk);
+ this.sendAction('sectionRequest', requestedRange.lowIndex, requestedRange.highIndex);
+ }
+ }
+ }
+ });
+});
+define('ember-riak-explorer/components/power-select', ['exports', 'ember-power-select/components/power-select'], function (exports, _emberPowerSelectComponentsPowerSelect) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberPowerSelectComponentsPowerSelect['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/power-select/before-options', ['exports', 'ember-power-select/components/power-select/before-options'], function (exports, _emberPowerSelectComponentsPowerSelectBeforeOptions) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberPowerSelectComponentsPowerSelectBeforeOptions['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/power-select/multiple', ['exports', 'ember-power-select/components/power-select/multiple'], function (exports, _emberPowerSelectComponentsPowerSelectMultiple) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberPowerSelectComponentsPowerSelectMultiple['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/power-select/multiple/selected', ['exports', 'ember-power-select/components/power-select/multiple/selected'], function (exports, _emberPowerSelectComponentsPowerSelectMultipleSelected) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberPowerSelectComponentsPowerSelectMultipleSelected['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/power-select/options', ['exports', 'ember-power-select/components/power-select/options'], function (exports, _emberPowerSelectComponentsPowerSelectOptions) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberPowerSelectComponentsPowerSelectOptions['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/power-select/single', ['exports', 'ember-power-select/components/power-select/single'], function (exports, _emberPowerSelectComponentsPowerSelectSingle) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberPowerSelectComponentsPowerSelectSingle['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/power-select/single/selected', ['exports', 'ember-power-select/components/power-select/single/selected'], function (exports, _emberPowerSelectComponentsPowerSelectSingleSelected) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberPowerSelectComponentsPowerSelectSingleSelected['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/set-editor', ['exports', 'ember', 'ember-riak-explorer/utils/validations'], function (exports, _ember, _emberRiakExplorerUtilsValidations) {
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'ul',
+
+ classNames: ['object-content-list'],
+
+ newItem: '',
+
+ contents: [],
+
+ actions: {
+ addElement: function addElement(item) {
+ var trimmedItem = item.trim();
+ var isValid = _emberRiakExplorerUtilsValidations['default'].isUniqueArrayItem(this.get('contents'), item);
+
+ if (isValid) {
+ this.sendAction('addSetElement', trimmedItem);
+ this.set('newItem', '');
+ } else {
+ this.sendAction('nonUniqueSetElement', trimmedItem);
+ }
+ },
+
+ removeElement: function removeElement(item) {
+ if (_emberRiakExplorerUtilsValidations['default'].itemExistsInArray(this.get('contents'), item)) {
+ this.sendAction('removeSetElement', item);
+ }
+ }
+ }
+ });
+});
+define('ember-riak-explorer/components/side-drawer', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ classNames: ['side-drawer'],
+
+ classNameBindings: ['status'],
+
+ label: null,
+
+ visible: false,
+
+ // Hack to get around inability of css to figure this out
+ setDrawerPanelClass: (function () {
+ if (this.get('visible')) {
+ this.$().parent().removeClass('drawer-closed');
+ } else {
+ this.$().parent().addClass('drawer-closed');
+ }
+ }).observes('visible'),
+
+ status: (function () {
+ return this.get('visible') ? 'open' : 'closed';
+ }).property('visible'),
+
+ actions: {
+ close: function close() {
+ return this.set('visible', false);
+ }
+ }
+ });
+});
+define('ember-riak-explorer/components/table/bucket-props-advanced', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'table',
+
+ classNames: ['key-value-table', 'bucket-props-advanced']
+ });
+});
+define('ember-riak-explorer/components/table/bucket-props-overview', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'table',
+
+ classNames: ['key-value-table', 'bucket-props-overview']
+ });
+});
+define('ember-riak-explorer/components/table/bucket-types', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'table',
+
+ classNames: ['table', 'cluster-table'],
+
+ bucketTypes: null
+ });
+});
+define('ember-riak-explorer/components/table/object-headers', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'table',
+
+ classNames: ['key-value-table']
+ });
+});
+define('ember-riak-explorer/components/table/object-version', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'table',
+
+ classNames: ['key-value-table']
+ });
+});
+define('ember-riak-explorer/components/table/search-indexes', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'table',
+
+ classNames: ['table'],
+
+ indexes: null
+ });
+});
+define('ember-riak-explorer/components/table/table-overview', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'table',
+
+ classNames: ['key-value-table', 'table-overview']
+ });
+});
+define('ember-riak-explorer/components/table/ts-table-reference', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'table',
+
+ classNames: ['key-value-table', 'ts-table-reference'],
+
+ table: null
+ });
+});
+define('ember-riak-explorer/components/table/ts-tables', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'table',
+
+ classNames: ['table', 'cluster-table'],
+
+ bucketTypes: null
+ });
+});
+define('ember-riak-explorer/components/tether-dialog', ['exports', 'ember-modal-dialog/components/tether-dialog'], function (exports, _emberModalDialogComponentsTetherDialog) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberModalDialogComponentsTetherDialog['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/tooltip-on-parent', ['exports', 'ember-tooltips/components/tooltip-on-parent'], function (exports, _emberTooltipsComponentsTooltipOnParent) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberTooltipsComponentsTooltipOnParent['default'];
+ }
+ });
+});
+define('ember-riak-explorer/components/tooltip/bucket-props', ['exports', 'ember', 'ember-tooltips/utils/render-tooltip'], function (exports, _ember, _emberTooltipsUtilsRenderTooltip) {
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'span',
+
+ classNameBindings: ['toolTipClass'],
+
+ itemKey: undefined,
+
+ itemDescription: undefined,
+
+ itemDefaultValue: undefined,
+
+ itemIsEditable: undefined,
+
+ itemSchemaType: undefined,
+
+ tooltipInstance: null,
+
+ shouldRenderToolTip: (function () {
+ var key = this.get('itemKey');
+ var description = this.get('itemDescription');
+ var itemDefault = this.get('itemDefaultValue');
+ var editable = this.get('itemIsEditable');
+ var type = this.get('itemSchemaType');
+
+ return !!(key && (description || itemDefault || editable || type));
+ }).property('itemKey', 'itemDescription', 'itemDefaultValue', 'itemIsEditable', 'itemSchemaType'),
+
+ toolTipClass: (function () {
+ if (this.get('shouldRenderToolTip')) {
+ return 'tooltip-icon bucket-props-tooltip ion-information-circled';
+ }
+ }).property('shouldRenderToolTip'),
+
+ didRender: function didRender() {
+ if (this.get('shouldRenderToolTip')) {
+ var element = this.$()[0];
+ var key = this.get('itemKey');
+ var description = this.get('itemDescription');
+ var itemDefault = this.get('itemDefaultValue');
+ var editable = this.get('itemIsEditable');
+ var type = this.get('itemSchemaType');
+
+ var wrapperStart = '';
+ var ttTitle = '
';
+ var ttDescription = description !== undefined ? '
' : '';
+ var ttItemDefault = itemDefault !== undefined ? '
Default Value: ' + itemDefault + '
' : '';
+ var ttEditable = editable !== undefined ? '
Editable: ' + editable + '
' : '';
+ var ttType = type !== undefined ? '
Type: ' + type + '
' : '';
+ var wrapperEnd = '
';
+
+ var toolTipTemplate = wrapperStart + ttTitle + ttDescription + ttItemDefault + ttEditable + ttType + wrapperEnd;
+
+ this.set('tooltipInstance', (0, _emberTooltipsUtilsRenderTooltip['default'])(element, {
+ content: toolTipTemplate,
+ event: 'hover'
+ }));
+ }
+ }
+ });
+});
+define('ember-riak-explorer/components/tooltip/node-config', ['exports', 'ember', 'ember-tooltips/utils/render-tooltip', 'ember-riak-explorer/utils/riak-help/riak_config'], function (exports, _ember, _emberTooltipsUtilsRenderTooltip, _emberRiakExplorerUtilsRiakHelpRiak_config) {
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'span',
+
+ classNames: ['tooltip-icon', 'node-config-tooltip', 'ion-information-circled'],
+
+ itemKey: null,
+
+ tooltipInstance: null,
+
+ didRender: function didRender() {
+ var key = this.get('itemKey');
+ var info = _emberRiakExplorerUtilsRiakHelpRiak_config['default'][key];
+
+ if (info) {
+ var element = this.$()[0];
+
+ var wrapperStart = '';
+ var title = '
';
+ var desc = info.description.length ? '
' : "";
+ var example = info.example.length ? '
Example: ' + info.example + '
' : "";
+ var internal_key = info.internal_key.length ? '
Internal Key: ' + info.internal_key + '
' : "";
+ var valid = info.valid.length ? '
Valid: ' + info.valid + '
' : "";
+ var wrapperEnd = '
';
+
+ var toolTipTemplate = wrapperStart + title + desc + example + internal_key + valid + wrapperEnd;
+
+ this.set('tooltipInstance', (0, _emberTooltipsUtilsRenderTooltip['default'])(element, {
+ content: toolTipTemplate,
+ event: 'hover',
+ typeClass: 'wide'
+ }));
+ }
+ }
+ });
+});
+define('ember-riak-explorer/components/tooltip/node-stats', ['exports', 'ember', 'ember-tooltips/utils/render-tooltip', 'ember-riak-explorer/utils/riak-help/riak_status'], function (exports, _ember, _emberTooltipsUtilsRenderTooltip, _emberRiakExplorerUtilsRiakHelpRiak_status) {
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'span',
+
+ classNameBindings: ['setClassNames'],
+
+ useIcon: true,
+
+ itemKey: null,
+
+ tooltipInstance: null,
+
+ setClassNames: (function () {
+ return this.get('useIcon') ? 'tooltip-icon node-stats-tooltip ion-information-circled' : 'tooltip-text';
+ }).property('useIcon'),
+
+ didRender: function didRender() {
+ var key = this.get('itemKey');
+ var info = _emberRiakExplorerUtilsRiakHelpRiak_status['default'][key];
+
+ if (info) {
+ var element = this.$()[0];
+
+ var wrapperStart = '';
+ var title = '
';
+ var desc = info.description.length ? '
' : "";
+ var example = info.example.length ? '
Example: ' + info.example + '
' : "";
+ var schema_type = info.json_schema_type.length ? '
Type: ' + info.json_schema_type + '
' : "";
+ var metric_type = info.metric_type.length ? '
Metric Type: ' + info.metric_type + '
' : "";
+ var period = info.period.length ? '
Period: ' + info.period + '
' : "";
+ var scope = info.scope.length ? '
Scope: ' + info.scope + '
' : "";
+ var units = info.units !== 'n/a' ? '
Units: ' + info.units + '
' : "";
+ var wrapperEnd = '
';
+
+ var toolTipTemplate = wrapperStart + title + desc + example + schema_type + metric_type + period + scope + units + wrapperEnd;
+
+ this.set('tooltipInstance', (0, _emberTooltipsUtilsRenderTooltip['default'])(element, {
+ content: toolTipTemplate,
+ event: 'hover',
+ typeClass: 'wide'
+ }));
+ }
+ }
+ });
+});
+define('ember-riak-explorer/components/view-label', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({
+ classNames: ['view-label']
+ });
+});
+define('ember-riak-explorer/components/wrapper-panel', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Component.extend({});
+});
+define('ember-riak-explorer/controllers/application', ['exports', 'ember'], function (exports, _ember) {
+
+ /**
+ * Base controller that sets UI state for all views.
+ *
+ * @class ApplicationController
+ * @namespace Controllers
+ * @extends Ember.Controller
+ */
+ exports['default'] = _ember['default'].Controller.extend({
+ actions: {
+ /**
+ * @method clusterSelected
+ * @param cluster {DS.Model} Expects a cluster model object
+ *
+ * Updates UI when a new cluster has been selected.
+ */
+ clusterSelected: function clusterSelected(cluster) {
+ this.set('currentCluster', cluster);
+ // Default to data view since no cluster overview view
+ this.transitionToRoute('cluster.data', cluster.get('name'));
+ }
+ },
+
+ /**
+ * Current Cluster selected. Used to track sidebar state. Null if no sidebar.
+ *
+ * @property currentCluster
+ * @type {DS.Object} Ember cluster model
+ */
+ currentCluster: null,
+
+ /**
+ * Which subsection of the cluster the UI is currently in.
+ *
+ * @property clusterSubSection
+ * @type {String} Options are "data", "ops", or "query"
+ */
+ clusterSubSection: null,
+
+ /**
+ * Object that holds the current breadcrumb state.
+ *
+ * @property breadCrumbMap
+ * @type {Object}
+ */
+ breadCrumbMap: {},
+
+ /**
+ * Object that holds the current view-label information.
+ *
+ * @property viewLabelMap
+ */
+ viewLabelMap: {},
+
+ /**
+ * Observes routes and will set the cluster sub-section, based on the route name.
+ * Must be updated any time a new route is added to a subsection (code smell).
+ *
+ * @method setClusterSubSection
+ */
+ setClusterSubSection: (function () {
+ switch (this.get('currentPath')) {
+ case 'cluster.data':
+ case 'bucket-type':
+ case 'bucket-type.create':
+ case 'bucket-type.edit':
+ case 'bucket':
+ case 'bucket.create':
+ case 'riak-object':
+ case 'riak-object.create':
+ case 'riak-object.edit':
+ case 'riak-object.counter':
+ case 'riak-object.hll':
+ case 'riak-object.set':
+ case 'riak-object.map':
+ case 'riak-object.map.edit':
+ case 'table':
+ case 'table.create':
+ case 'table.write':
+ this.set('clusterSubSection', 'data');
+ break;
+ case 'cluster.ops':
+ case 'node':
+ case 'log-file':
+ case 'config-file':
+ case 'node.monitoring':
+ this.set('clusterSubSection', 'ops');
+ break;
+ case 'cluster.query':
+ case 'search-index':
+ case 'search-schema':
+ case 'search-schema.edit':
+ case 'search-schema.create':
+ case 'table.query':
+ this.set('clusterSubSection', 'query');
+ break;
+ default:
+ this.set('clusterSubSection', null);
+ break;
+ }
+ }).observes('currentPath'),
+
+ /**
+ * Determines if the UI should show the view-header template.
+ *
+ * @method showViewHeader
+ * @returns Boolean
+ */
+ showViewHeader: (function () {
+ return !!(Object.keys(this.get('breadCrumbMap')).length || Object.keys(this.get('viewLabelMap')).length);
+ }).property('breadCrumbMap', 'viewLabelMap'),
+
+ /**
+ * Observes routes and makes sure that if on the index route, to set the current cluster state
+ * to null.
+ * Since all routes are nested under the index route, this is the only way we can
+ * reliably ensure that this method is called every time the route is visited.
+ *
+ * @method resetIndexState
+ */
+ resetIndexState: (function () {
+ if (this.get('currentPath') === 'index') {
+ this.set('currentCluster', null);
+ this.set('breadCrumbMap', {});
+ this.set('viewLabelMap', {});
+ }
+ }).observes('currentPath')
+ });
+});
+define('ember-riak-explorer/helpers/and', ['exports', 'ember', 'ember-truth-helpers/helpers/and'], function (exports, _ember, _emberTruthHelpersHelpersAnd) {
+
+ var forExport = null;
+
+ if (_ember['default'].Helper) {
+ forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersAnd.andHelper);
+ } else if (_ember['default'].HTMLBars.makeBoundHelper) {
+ forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersAnd.andHelper);
+ }
+
+ exports['default'] = forExport;
+});
+define('ember-riak-explorer/helpers/ember-power-select-option-classes', ['exports', 'ember-power-select/helpers/ember-power-select-option-classes'], function (exports, _emberPowerSelectHelpersEmberPowerSelectOptionClasses) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberPowerSelectHelpersEmberPowerSelectOptionClasses['default'];
+ }
+ });
+ Object.defineProperty(exports, 'emberPowerSelectOptionClasses', {
+ enumerable: true,
+ get: function get() {
+ return _emberPowerSelectHelpersEmberPowerSelectOptionClasses.emberPowerSelectOptionClasses;
+ }
+ });
+});
+define('ember-riak-explorer/helpers/eq', ['exports', 'ember', 'ember-truth-helpers/helpers/equal'], function (exports, _ember, _emberTruthHelpersHelpersEqual) {
+
+ var forExport = null;
+
+ if (_ember['default'].Helper) {
+ forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersEqual.equalHelper);
+ } else if (_ember['default'].HTMLBars.makeBoundHelper) {
+ forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersEqual.equalHelper);
+ }
+
+ exports['default'] = forExport;
+});
+define('ember-riak-explorer/helpers/gt', ['exports', 'ember', 'ember-truth-helpers/helpers/gt'], function (exports, _ember, _emberTruthHelpersHelpersGt) {
+
+ var forExport = null;
+
+ if (_ember['default'].Helper) {
+ forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersGt.gtHelper);
+ } else if (_ember['default'].HTMLBars.makeBoundHelper) {
+ forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersGt.gtHelper);
+ }
+
+ exports['default'] = forExport;
+});
+define('ember-riak-explorer/helpers/gte', ['exports', 'ember', 'ember-truth-helpers/helpers/gte'], function (exports, _ember, _emberTruthHelpersHelpersGte) {
+
+ var forExport = null;
+
+ if (_ember['default'].Helper) {
+ forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersGte.gteHelper);
+ } else if (_ember['default'].HTMLBars.makeBoundHelper) {
+ forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersGte.gteHelper);
+ }
+
+ exports['default'] = forExport;
+});
+define('ember-riak-explorer/helpers/is-array', ['exports', 'ember', 'ember-truth-helpers/helpers/is-array'], function (exports, _ember, _emberTruthHelpersHelpersIsArray) {
+
+ var forExport = null;
+
+ if (_ember['default'].Helper) {
+ forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersIsArray.isArrayHelper);
+ } else if (_ember['default'].HTMLBars.makeBoundHelper) {
+ forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersIsArray.isArrayHelper);
+ }
+
+ exports['default'] = forExport;
+});
+define('ember-riak-explorer/helpers/lt', ['exports', 'ember', 'ember-truth-helpers/helpers/lt'], function (exports, _ember, _emberTruthHelpersHelpersLt) {
+
+ var forExport = null;
+
+ if (_ember['default'].Helper) {
+ forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersLt.ltHelper);
+ } else if (_ember['default'].HTMLBars.makeBoundHelper) {
+ forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersLt.ltHelper);
+ }
+
+ exports['default'] = forExport;
+});
+define('ember-riak-explorer/helpers/lte', ['exports', 'ember', 'ember-truth-helpers/helpers/lte'], function (exports, _ember, _emberTruthHelpersHelpersLte) {
+
+ var forExport = null;
+
+ if (_ember['default'].Helper) {
+ forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersLte.lteHelper);
+ } else if (_ember['default'].HTMLBars.makeBoundHelper) {
+ forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersLte.lteHelper);
+ }
+
+ exports['default'] = forExport;
+});
+define('ember-riak-explorer/helpers/not-eq', ['exports', 'ember', 'ember-truth-helpers/helpers/not-equal'], function (exports, _ember, _emberTruthHelpersHelpersNotEqual) {
+
+ var forExport = null;
+
+ if (_ember['default'].Helper) {
+ forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersNotEqual.notEqualHelper);
+ } else if (_ember['default'].HTMLBars.makeBoundHelper) {
+ forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersNotEqual.notEqualHelper);
+ }
+
+ exports['default'] = forExport;
+});
+define('ember-riak-explorer/helpers/not', ['exports', 'ember', 'ember-truth-helpers/helpers/not'], function (exports, _ember, _emberTruthHelpersHelpersNot) {
+
+ var forExport = null;
+
+ if (_ember['default'].Helper) {
+ forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersNot.notHelper);
+ } else if (_ember['default'].HTMLBars.makeBoundHelper) {
+ forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersNot.notHelper);
+ }
+
+ exports['default'] = forExport;
+});
+define('ember-riak-explorer/helpers/object-length', ['exports', 'ember'], function (exports, _ember) {
+ exports.objectLength = objectLength;
+
+ /**
+ * View helper function used to display the amount of keys in the object.
+ *
+ * @module ObjectLength
+ */
+
+ function objectLength(params) {
+ var object = params[0];
+
+ return Object.keys(object).length;
+ }
+
+ exports['default'] = _ember['default'].Helper.helper(objectLength);
+});
+define('ember-riak-explorer/helpers/or', ['exports', 'ember', 'ember-truth-helpers/helpers/or'], function (exports, _ember, _emberTruthHelpersHelpersOr) {
+
+ var forExport = null;
+
+ if (_ember['default'].Helper) {
+ forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersOr.orHelper);
+ } else if (_ember['default'].HTMLBars.makeBoundHelper) {
+ forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersOr.orHelper);
+ }
+
+ exports['default'] = forExport;
+});
+define('ember-riak-explorer/helpers/pluralize', ['exports', 'ember-inflector/lib/helpers/pluralize'], function (exports, _emberInflectorLibHelpersPluralize) {
+ exports['default'] = _emberInflectorLibHelpersPluralize['default'];
+});
+define('ember-riak-explorer/helpers/singularize', ['exports', 'ember-inflector/lib/helpers/singularize'], function (exports, _emberInflectorLibHelpersSingularize) {
+ exports['default'] = _emberInflectorLibHelpersSingularize['default'];
+});
+define('ember-riak-explorer/helpers/xor', ['exports', 'ember', 'ember-truth-helpers/helpers/xor'], function (exports, _ember, _emberTruthHelpersHelpersXor) {
+
+ var forExport = null;
+
+ if (_ember['default'].Helper) {
+ forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersXor.xorHelper);
+ } else if (_ember['default'].HTMLBars.makeBoundHelper) {
+ forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersXor.xorHelper);
+ }
+
+ exports['default'] = forExport;
+});
+define('ember-riak-explorer/initializers/add-modals-container', ['exports', 'ember-modal-dialog/initializers/add-modals-container'], function (exports, _emberModalDialogInitializersAddModalsContainer) {
+ exports['default'] = {
+ name: 'add-modals-container',
+ initialize: _emberModalDialogInitializersAddModalsContainer['default']
+ };
+});
+define('ember-riak-explorer/initializers/app-version', ['exports', 'ember-cli-app-version/initializer-factory', 'ember-riak-explorer/config/environment'], function (exports, _emberCliAppVersionInitializerFactory, _emberRiakExplorerConfigEnvironment) {
+ exports['default'] = {
+ name: 'App Version',
+ initialize: (0, _emberCliAppVersionInitializerFactory['default'])(_emberRiakExplorerConfigEnvironment['default'].APP.name, _emberRiakExplorerConfigEnvironment['default'].APP.version)
+ };
+});
+define('ember-riak-explorer/initializers/container-debug-adapter', ['exports', 'ember-resolver/container-debug-adapter'], function (exports, _emberResolverContainerDebugAdapter) {
+ exports['default'] = {
+ name: 'container-debug-adapter',
+
+ initialize: function initialize() {
+ var app = arguments[1] || arguments[0];
+
+ app.register('container-debug-adapter:main', _emberResolverContainerDebugAdapter['default']);
+ app.inject('container-debug-adapter:main', 'namespace', 'application:main');
+ }
+ };
+});
+define('ember-riak-explorer/initializers/data-adapter', ['exports', 'ember'], function (exports, _ember) {
+
+ /*
+ This initializer is here to keep backwards compatibility with code depending
+ on the `data-adapter` initializer (before Ember Data was an addon).
+
+ Should be removed for Ember Data 3.x
+ */
+
+ exports['default'] = {
+ name: 'data-adapter',
+ before: 'store',
+ initialize: _ember['default'].K
+ };
+});
+define('ember-riak-explorer/initializers/ember-data', ['exports', 'ember-data/setup-container', 'ember-data/-private/core'], function (exports, _emberDataSetupContainer, _emberDataPrivateCore) {
+
+ /*
+
+ This code initializes Ember-Data onto an Ember application.
+
+ If an Ember.js developer defines a subclass of DS.Store on their application,
+ as `App.StoreService` (or via a module system that resolves to `service:store`)
+ this code will automatically instantiate it and make it available on the
+ router.
+
+ Additionally, after an application's controllers have been injected, they will
+ each have the store made available to them.
+
+ For example, imagine an Ember.js application with the following classes:
+
+ App.StoreService = DS.Store.extend({
+ adapter: 'custom'
+ });
+
+ App.PostsController = Ember.ArrayController.extend({
+ // ...
+ });
+
+ When the application is initialized, `App.ApplicationStore` will automatically be
+ instantiated, and the instance of `App.PostsController` will have its `store`
+ property set to that instance.
+
+ Note that this code will only be run if the `ember-application` package is
+ loaded. If Ember Data is being used in an environment other than a
+ typical application (e.g., node.js where only `ember-runtime` is available),
+ this code will be ignored.
+ */
+
+ exports['default'] = {
+ name: 'ember-data',
+ initialize: _emberDataSetupContainer['default']
+ };
+});
+define('ember-riak-explorer/initializers/ember-tooltips', ['exports', 'ember', 'ember-riak-explorer/config/environment', 'ember-riak-explorer/mixins/components/tooltips'], function (exports, _ember, _emberRiakExplorerConfigEnvironment, _emberRiakExplorerMixinsComponentsTooltips) {
+ exports.initialize = initialize;
+
+ /* This is in the app tree so we can access ENV */
+
+ function initialize() {
+ var defaultOptions = {
+ addTo: ['Component']
+ };
+ var overridingOptions = _emberRiakExplorerConfigEnvironment['default'].tooltips || {};
+ var options = _ember['default'].merge(defaultOptions, overridingOptions);
+
+ /* TODO - Needs test coverage for addTo */
+
+ if (_ember['default'].typeOf(options.addTo) === 'array') {
+ options.addTo.forEach(function (className) {
+ _ember['default'][className].reopen(_emberRiakExplorerMixinsComponentsTooltips['default']);
+ });
+ }
+ }
+
+ exports['default'] = {
+ name: 'ember-tooltips',
+ initialize: initialize
+ };
+});
+define('ember-riak-explorer/initializers/explorer', ['exports'], function (exports) {
+ exports.initialize = initialize;
+
+ function initialize(app) {
+ // inject explorer service into all routes
+ app.inject('route', 'explorer', 'service:explorer');
+ // inject the store into the explorer service
+ app.inject('service:explorer', 'store', 'service:store');
+ }
+
+ exports['default'] = {
+ name: 'explorer',
+ initialize: initialize
+ };
+});
+define('ember-riak-explorer/initializers/export-application-global', ['exports', 'ember', 'ember-riak-explorer/config/environment'], function (exports, _ember, _emberRiakExplorerConfigEnvironment) {
+ exports.initialize = initialize;
+
+ function initialize() {
+ var application = arguments[1] || arguments[0];
+ if (_emberRiakExplorerConfigEnvironment['default'].exportApplicationGlobal !== false) {
+ var value = _emberRiakExplorerConfigEnvironment['default'].exportApplicationGlobal;
+ var globalName;
+
+ if (typeof value === 'string') {
+ globalName = value;
+ } else {
+ globalName = _ember['default'].String.classify(_emberRiakExplorerConfigEnvironment['default'].modulePrefix);
+ }
+
+ if (!window[globalName]) {
+ window[globalName] = application;
+
+ application.reopen({
+ willDestroy: function willDestroy() {
+ this._super.apply(this, arguments);
+ delete window[globalName];
+ }
+ });
+ }
+ }
+ }
+
+ exports['default'] = {
+ name: 'export-application-global',
+
+ initialize: initialize
+ };
+});
+define('ember-riak-explorer/initializers/injectStore', ['exports', 'ember'], function (exports, _ember) {
+
+ /*
+ This initializer is here to keep backwards compatibility with code depending
+ on the `injectStore` initializer (before Ember Data was an addon).
+
+ Should be removed for Ember Data 3.x
+ */
+
+ exports['default'] = {
+ name: 'injectStore',
+ before: 'store',
+ initialize: _ember['default'].K
+ };
+});
+define('ember-riak-explorer/initializers/local-storage-adapter', ['exports', 'ember-local-storage/initializers/local-storage-adapter'], function (exports, _emberLocalStorageInitializersLocalStorageAdapter) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberLocalStorageInitializersLocalStorageAdapter['default'];
+ }
+ });
+ Object.defineProperty(exports, 'initialize', {
+ enumerable: true,
+ get: function get() {
+ return _emberLocalStorageInitializersLocalStorageAdapter.initialize;
+ }
+ });
+});
+define('ember-riak-explorer/initializers/store', ['exports', 'ember'], function (exports, _ember) {
+
+ /*
+ This initializer is here to keep backwards compatibility with code depending
+ on the `store` initializer (before Ember Data was an addon).
+
+ Should be removed for Ember Data 3.x
+ */
+
+ exports['default'] = {
+ name: 'store',
+ after: 'ember-data',
+ initialize: _ember['default'].K
+ };
+});
+define('ember-riak-explorer/initializers/transforms', ['exports', 'ember'], function (exports, _ember) {
+
+ /*
+ This initializer is here to keep backwards compatibility with code depending
+ on the `transforms` initializer (before Ember Data was an addon).
+
+ Should be removed for Ember Data 3.x
+ */
+
+ exports['default'] = {
+ name: 'transforms',
+ before: 'store',
+ initialize: _ember['default'].K
+ };
+});
+define('ember-riak-explorer/initializers/truth-helpers', ['exports', 'ember', 'ember-truth-helpers/utils/register-helper', 'ember-truth-helpers/helpers/and', 'ember-truth-helpers/helpers/or', 'ember-truth-helpers/helpers/equal', 'ember-truth-helpers/helpers/not', 'ember-truth-helpers/helpers/is-array', 'ember-truth-helpers/helpers/not-equal', 'ember-truth-helpers/helpers/gt', 'ember-truth-helpers/helpers/gte', 'ember-truth-helpers/helpers/lt', 'ember-truth-helpers/helpers/lte'], function (exports, _ember, _emberTruthHelpersUtilsRegisterHelper, _emberTruthHelpersHelpersAnd, _emberTruthHelpersHelpersOr, _emberTruthHelpersHelpersEqual, _emberTruthHelpersHelpersNot, _emberTruthHelpersHelpersIsArray, _emberTruthHelpersHelpersNotEqual, _emberTruthHelpersHelpersGt, _emberTruthHelpersHelpersGte, _emberTruthHelpersHelpersLt, _emberTruthHelpersHelpersLte) {
+ exports.initialize = initialize;
+
+ function initialize() /* container, application */{
+
+ // Do not register helpers from Ember 1.13 onwards, starting from 1.13 they
+ // will be auto-discovered.
+ if (_ember['default'].Helper) {
+ return;
+ }
+
+ (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('and', _emberTruthHelpersHelpersAnd.andHelper);
+ (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('or', _emberTruthHelpersHelpersOr.orHelper);
+ (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('eq', _emberTruthHelpersHelpersEqual.equalHelper);
+ (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('not', _emberTruthHelpersHelpersNot.notHelper);
+ (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('is-array', _emberTruthHelpersHelpersIsArray.isArrayHelper);
+ (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('not-eq', _emberTruthHelpersHelpersNotEqual.notEqualHelper);
+ (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('gt', _emberTruthHelpersHelpersGt.gtHelper);
+ (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('gte', _emberTruthHelpersHelpersGte.gteHelper);
+ (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('lt', _emberTruthHelpersHelpersLt.ltHelper);
+ (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('lte', _emberTruthHelpersHelpersLte.lteHelper);
+ }
+
+ exports['default'] = {
+ name: 'truth-helpers',
+ initialize: initialize
+ };
+});
+define("ember-riak-explorer/instance-initializers/ember-data", ["exports", "ember-data/-private/instance-initializers/initialize-store-service"], function (exports, _emberDataPrivateInstanceInitializersInitializeStoreService) {
+ exports["default"] = {
+ name: "ember-data",
+ initialize: _emberDataPrivateInstanceInitializersInitializeStoreService["default"]
+ };
+});
+define('ember-riak-explorer/mixins/component/scroll-reset', ['exports', 'ember'], function (exports, _ember) {
+
+ /**
+ * Mixin meant for components to use.
+ * Scroll reset allows the mixed-in component to easily call for a the window scroll position to go back to the top.
+ *
+ * @module ScrollReset
+ */
+ exports['default'] = _ember['default'].Mixin.create({
+ /**
+ * Moves the window scroll position to 0 when invoked
+ *
+ * @method scrollToTop
+ * @public
+ */
+ scrollToTop: function scrollToTop() {
+ return _ember['default'].$('.view-body').scrollTop(0);
+ }
+ });
+});
+define('ember-riak-explorer/mixins/components/tooltips', ['exports', 'ember-tooltips/mixins/components/tooltips'], function (exports, _emberTooltipsMixinsComponentsTooltips) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberTooltipsMixinsComponentsTooltips['default'];
+ }
+ });
+});
+define('ember-riak-explorer/mixins/controller/modal', ['exports', 'ember'], function (exports, _ember) {
+
+ /**
+ * Mixin meant for controllers to use.
+ * Allows for management of the modal-dialog component (third-party plugin: see 'ember-modal-dialog' in package.json)
+ *
+ * @module Modal
+ */
+ exports['default'] = _ember['default'].Mixin.create({
+ /**
+ * Sets the visibility of the modal
+ *
+ * @property modalVisible
+ * @type {Boolean}
+ */
+ modalVisible: false,
+
+ actions: {
+ /**
+ * Utility method to hide modal
+ *
+ * @method hideModal
+ * @public
+ */
+ hideModal: function hideModal() {
+ this.set('modalVisible', false);
+ },
+
+ /**
+ * Utility method to show modal
+ *
+ * @method showModal
+ * @public
+ */
+ showModal: function showModal() {
+ this.set('modalVisible', true);
+ }
+ }
+ });
+});
+define('ember-riak-explorer/mixins/controller/scroll-reset', ['exports', 'ember'], function (exports, _ember) {
+
+ /**
+ * Mixin meant for controllers to use.
+ * Scroll reset allows the mixed-in component to easily call for a the window scroll position to go back to the top.
+ *
+ * @module ScrollReset
+ */
+ exports['default'] = _ember['default'].Mixin.create({
+ /**
+ * Moves the window scroll position to 0 when invoked
+ *
+ * @method scrollToTop
+ * @public
+ */
+ scrollToTop: function scrollToTop() {
+ return _ember['default'].$('.view-body').scrollTop(0);
+ }
+ });
+});
+define('ember-riak-explorer/mixins/controller/side-drawer', ['exports', 'ember'], function (exports, _ember) {
+
+ /**
+ * Mixin meant for controllers to use.
+ * Controls the side drawer component. Side drawer is used to show additional text and information, such as documentation.
+ *
+ * @module SideDrawer
+ */
+ exports['default'] = _ember['default'].Mixin.create({
+ /**
+ * Sets the visibility of the side drawer
+ *
+ * @property isSideDrawerVisible
+ * @type {Boolean}
+ */
+ isSideDrawerVisible: false,
+
+ actions: {
+ /**
+ * Utility method to hide the side drawer
+ *
+ * @method hideSideDrawer
+ * @public
+ */
+ hideSideDrawer: function hideSideDrawer() {
+ this.set('isSideDrawerVisible', false);
+ },
+
+ /**
+ * Utility method to show the side drawer
+ *
+ * @method showSideDrawer
+ * @public
+ */
+ showSideDrawer: function showSideDrawer() {
+ this.set('isSideDrawerVisible', true);
+ }
+ }
+ });
+});
+define('ember-riak-explorer/mixins/loading-slider', ['exports', 'ember'], function (exports, _ember) {
+ var Mixin = _ember['default'].Mixin;
+ var inject = _ember['default'].inject;
+ var isPresent = _ember['default'].isPresent;
+ exports['default'] = Mixin.create({
+ loadingSlider: inject.service(),
+
+ actions: {
+ loading: function loading() {
+ var loadingSliderService = this.get('loadingSlider');
+ loadingSliderService.startLoading();
+ if (isPresent(this.router)) {
+ this.router.one('didTransition', function () {
+ loadingSliderService.endLoading();
+ });
+ }
+ if (this.get('bubbleLoadingSlider')) {
+ return true;
+ }
+ },
+
+ finished: function finished() {
+ this.get('loadingSlider').endLoading();
+ }
+ }
+ });
+});
+define('ember-riak-explorer/mixins/models/bucket-props', ['exports', 'ember', 'ember-data', 'lodash/lodash', 'ember-riak-explorer/utils/riak-help/bucket_props'], function (exports, _ember, _emberData, _lodashLodash, _emberRiakExplorerUtilsRiakHelpBucket_props) {
+ exports['default'] = _ember['default'].Mixin.create({
+ /**
+ * Hash of key/value pairs, obtained as a result of
+ * an HTTP GET Bucket Properties API call,
+ * or a GET Bucket Type Properties API call
+ *
+ * @property props
+ * @type Hash
+ * @example
+ * { "allow_mult":false, "basic_quorum":false, "write_once": false, ... }
+ */
+ props: _emberData['default'].attr(),
+
+ /**
+ * Returns a capitalized name of the Riak Data Type stored in this bucket
+ * or bucket type (if this is a CRDT type bucket).
+ * @see http://docs.basho.com/riak/latest/dev/using/data-types/
+ * @see http://docs.basho.com/riak/latest/theory/concepts/crdts/
+ *
+ * @method dataTypeName
+ * @return {String|Null} One of: [ 'Map', 'Set', 'Counter', 'HyperLogLog', null ]
+ */
+ dataTypeName: (function () {
+ if (this.get('props')) {
+ var _name = null;
+
+ if (this.get('isCRDT')) {
+ _name = this.get('props').datatype;
+ }
+
+ if (_name === 'hll') {
+ _name = 'HyperLogLog';
+ }
+
+ if (_name) {
+ return _name.capitalize();
+ }
+ }
+ }).property('props'),
+
+ /**
+ * Does this bucket or bucket type have custom pre-commit or post-commit
+ * hooks enabled?
+ * @see http://docs.basho.com/riak/latest/dev/using/commit-hooks/
+ *
+ * @method hasCommitHooks
+ * @return {Boolean}
+ */
+ hasCommitHooks: (function () {
+ if (this.get('props')) {
+ var hasPrecommit = !_ember['default'].isEmpty(this.get('props').precommit);
+ var hasPostcommit = !_ember['default'].isEmpty(this.get('props').postcommit);
+
+ return hasPrecommit || hasPostcommit;
+ }
+ }).property('props'),
+
+ /**
+ * Have Siblings been enabled for this Bucket or Bucket Type?
+ * Returns `false` by default if this is a bucket within the `default`
+ * Bucket Type.
+ * Otherwise (for any user-defined type) returns `true` by default.
+ * @see http://docs.basho.com/riak/latest/dev/using/conflict-resolution/#Siblings
+ *
+ * @method hasSiblings
+ * @return {Boolean}
+ */
+ hasSiblings: (function () {
+ if (this.get('props')) {
+ return this.get('props').allow_mult;
+ }
+ }).property('props'),
+
+ /**
+ * Returns the name of the Search Index associated with this bucket/bucketType
+ *
+ * @property index
+ * @type String
+ */
+ index: (function () {
+ return this.get('cluster').get('searchIndexes').findBy('name', this.get('searchIndexName'));
+ }).property('cluster', 'searchIndexName'),
+
+ /**
+ * Has this Bucket Type been activated via `riak-admin bucket-types activate`?
+ * (Buckets inherit this setting from their parent bucket types.)
+ *
+ * @property isActive
+ * @type Boolean
+ */
+ isActive: (function () {
+ if (this.get('props')) {
+ return this.get('props').active;
+ }
+ }).property('props'),
+
+ /**
+ * Does this bucket store Counter data type objects?
+ *
+ * @method isCounter
+ * @return {Boolean}
+ */
+ isCounter: (function () {
+ return this.get('dataTypeName') === 'Counter';
+ }).property('dataTypeName'),
+
+ /**
+ * Does this bucket type store Riak Data Type objects?
+ * @see http://docs.basho.com/riak/latest/dev/using/data-types/
+ * @see http://docs.basho.com/riak/latest/theory/concepts/crdts/
+ *
+ * @method isCRDT
+ * @return {Boolean}
+ */
+ isCRDT: (function () {
+ if (this.get('props')) {
+ return this.get('props').datatype || false;
+ }
+ }).property('props'),
+
+ /**
+ * Does this bucket store HyperLogLog data type objects?
+ *
+ * @method isHLL
+ * @return {Boolean}
+ */
+ isHLL: (function () {
+ return this.get('dataTypeName') === 'HyperLogLog';
+ }).property('dataTypeName'),
+
+ /**
+ * Has this Bucket Type not been activated via `riak-admin bucket-types activate`?
+ * (Buckets inherit this setting from their parent bucket types.)
+ * Inverse of the isActive method
+ *
+ * @property isInactive
+ * @type Boolean
+ */
+ isInactive: (function () {
+ if (this.get('props')) {
+ return !this.get('props').active;
+ }
+ }).property('props'),
+
+ /**
+ * Has the 'Last Write Wins' optimization been turned on for this bucket?
+ * @see http://docs.basho.com/riak/latest/dev/using/conflict-resolution/#last-write-wins
+ *
+ * @method isLWW
+ * @return {Boolean}
+ */
+ isLWW: (function () {
+ if (this.get('props')) {
+ return this.get('props').last_write_wins;
+ }
+ }).property('props'),
+
+ /**
+ * Does this bucket store Map data type objects?
+ *
+ * @method isMap
+ * @return {Boolean}
+ */
+ isMap: (function () {
+ return this.get('dataTypeName') === 'Map';
+ }).property('dataTypeName'),
+
+ /**
+ * Has a Riak Search index been associated with this bucket type?
+ *
+ * @method isSearchIndexed
+ * @return {Boolean}
+ */
+ isSearchIndexed: (function () {
+ if (this.get('props')) {
+ return _ember['default'].isPresent(this.get('props').search_index) && _ember['default'].isPresent(this.get('index'));
+ }
+ }).property('props'),
+
+ /**
+ * Does this bucket store Set data type objects?
+ *
+ * @method isSet
+ * @return {Boolean}
+ */
+ isSet: (function () {
+ return this.get('dataTypeName') === 'Set';
+ }).property('dataTypeName'),
+
+ /**
+ * Has Strong Consistency been enabled for this bucket type?
+ * @see http://docs.basho.com/riak/latest/dev/advanced/strong-consistency/
+ *
+ * @method isStronglyConsistent
+ * @return {Boolean}
+ */
+ isStronglyConsistent: (function () {
+ if (this.get('props')) {
+ return this.get('props').consistent;
+ }
+ }).property('props'),
+
+ /**
+ * Has the 'Write Once' setting been enabled for this bucket type?
+ * (This feature was introduced in Riak 2.1)
+ * @see http://docs.basho.com/riak/latest/dev/advanced/write-once/
+ *
+ * @method isWriteOnce
+ * @return {Boolean}
+ */
+ isWriteOnce: (function () {
+ if (this.get('props')) {
+ return this.get('props').write_once;
+ }
+ }).property('props'),
+
+ nonEditableProps: (function () {
+ var propsWithHelp = this.get('propsWithHelp');
+
+ if (propsWithHelp) {
+ var _ret = (function () {
+ var nonEditable = {};
+
+ _lodashLodash['default'].forOwn(propsWithHelp, function (value, key) {
+ if (!value.editable) {
+ nonEditable[key] = value;
+ }
+ });
+
+ return {
+ v: nonEditable
+ };
+ })();
+
+ if (typeof _ret === 'object') return _ret.v;
+ }
+ }).property('props'),
+
+ /**
+ * Returns the N value (number of object replicas) setting for this bucket type.
+ * (Default is 3).
+ * @see http://docs.basho.com/riak/latest/dev/advanced/replication-properties/
+ *
+ * @property nVal
+ * @type Number
+ */
+ nVal: (function () {
+ if (this.get('props')) {
+ return this.get('props').n_val;
+ }
+ }).property('props'),
+
+ objectType: (function () {
+ if (this.get('props')) {
+ var type = [];
+
+ if (this.get('isCRDT')) {
+ type.push(this.get('dataTypeName'));
+ } else {
+ type.push('Default');
+ }
+
+ if (this.get('isSearchIndexed')) {
+ type.push('Search Indexed');
+ }
+
+ return type.join(', ');
+ }
+ }).property('props'),
+
+ propsWithHelp: (function () {
+ var props = this.get('props');
+
+ if (props) {
+ var _ret2 = (function () {
+ var propsObj = {};
+
+ // Prepare Objects for merge
+ Object.keys(props).forEach(function (key) {
+ propsObj[key] = {
+ key: key,
+ value: props[key]
+ };
+ });
+
+ // Merges the propsObj and bucketPropsHelp Objects into a single object
+ var merged = _lodashLodash['default'].merge(propsObj, _emberRiakExplorerUtilsRiakHelpBucket_props['default']);
+
+ // Then mutates object to an array
+ var toArray = _lodashLodash['default'].values(merged);
+
+ // Then filters out any props that don't have values
+ var filtered = toArray.filter(function (prop) {
+ return _lodashLodash['default'].has(prop, 'value');
+ });
+
+ // Then sort by name
+ var sorted = _lodashLodash['default'].sortBy(filtered, 'name');
+
+ return {
+ v: sorted
+ };
+ })();
+
+ if (typeof _ret2 === 'object') return _ret2.v;
+ }
+ }).property('props'),
+
+ /**
+ * Returns a hash containing quorum-related settings.
+ * @see http://docs.basho.com/riak/latest/dev/advanced/replication-properties/
+ *
+ * @method quorum
+ * @return {Hash}
+ */
+ quorum: (function () {
+ if (this.get('props')) {
+ return {
+ r: this.get('props').r, // Read quorum
+ w: this.get('props').r, // Write Quorum
+ pr: this.get('props').pr, // Primary Read
+ pw: this.get('props').pw, // Primary Write
+ dw: this.get('props').dw, // Durable Write
+ basic_quorum: this.get('props').basic_quorum,
+ notfound_ok: this.get('props').notfound_ok
+ };
+ }
+ }).property('props'),
+
+ /**
+ * Returns true if this is an Eventually Consistent object type
+ * (versus Strongly Consistent type or a CRDT), and therefore the notion
+ * of 'Quorum' applies.
+ *
+ * @method quorumRelevant
+ * @return {Boolean}
+ */
+ quorumRelevant: (function () {
+ if (this.get('props')) {
+ return !this.get('isStronglyConsistent') && !this.get('isCRDT');
+ }
+ }).property('props'),
+
+ /**
+ * Returns a human-readable description of the conflict resolution strategy
+ * for this bucket type or bucket.
+ *
+ * @method resolutionStrategy
+ * @return {String}
+ */
+ resolutionStrategy: (function () {
+ if (this.get('props')) {
+ var strategy = null;
+
+ switch (true) {
+ case this.get('isStronglyConsistent'):
+ strategy = 'Strongly Consistent';
+ break;
+ case this.get('isCounter'):
+ strategy = 'Convergent, Pairwise Maximum Wins';
+ break;
+ case this.get('isMap'):
+ strategy = 'Convergent, Add/Update Wins Over Remove';
+ break;
+ case this.get('isSet'):
+ strategy = 'Convergent, Add Wins Over Remove';
+ break;
+ case this.get('hasSiblings'):
+ strategy = 'Causal Context (Siblings Enabled)';
+ break;
+ case this.get('isWriteOnce'):
+ strategy = 'n/a (Write-Once Optimized)';
+ break;
+ case this.get('isLWW'):
+ strategy = 'Wall Clock (LastWriteWins enabled)';
+ break;
+ default:
+ strategy = 'Causal Context (Siblings Off, fallback to Wall Clock)';
+ }
+
+ return strategy;
+ }
+ }).property('props'),
+
+ searchIndexHelp: (function () {
+ var searchIndexHelp = _lodashLodash['default'].clone(_emberRiakExplorerUtilsRiakHelpBucket_props['default'].search_index);
+
+ searchIndexHelp.key = 'search_index';
+
+ return searchIndexHelp;
+ }).property('props'),
+
+ /**
+ * Returns the name of the Search Index set on this bucket type or bucket
+ * @see http://docs.basho.com/riak/latest/dev/using/search/
+ *
+ * @method searchIndexName
+ * @return {String|Null}
+ */
+ searchIndexName: (function () {
+ if (this.get('props')) {
+ return this.get('props').search_index;
+ }
+ }).property('props'),
+
+ /**
+ * Returns human-readable warnings related to this bucket's settings.
+ *
+ * @method warnings
+ * @return {Array}
+ */
+ warnings: (function () {
+ if (this.get('props')) {
+ var warnings = [];
+
+ if (this.get('isStronglyConsistent')) {
+ if (this.get('nVal') < 5) {
+ warnings.push('Using Strong Consistency, but n_val < 5!');
+ }
+ if (this.get('isSearchIndexed')) {
+ warnings.push('Combining Strong Consistency with Search. Use cation!');
+ }
+ if (this.get('hasCommitHooks')) {
+ warnings.push('Using commit hooks, but those are ignored for Strongly Consistent data!');
+ }
+ }
+ if (this.get('hasSiblings')) {
+ // Siblings enabled
+ if (!this.get('props').dvv_enabled) {
+ warnings.push('Dotted Version Vectors (dvv_enabled) should be enabled when Siblings are enabled.');
+ }
+ }
+ // Check for default schema inappropriate conditions. Ideally this would be happening on the bucket props model,
+ // but the proper relationships are not set up. This augments that method and does the
+ // appropriate check
+ if (this.get('cluster').get('productionMode') && this.get('isSearchIndexed') && this.get('index').get('schema').get('isDefaultSchema')) {
+ warnings.push('This bucket type is currently using a default schema on indexes in production. ' + 'This can be very harmful, and it is recommended to instead use a custom schema on indexes.');
+ }
+
+ return warnings;
+ }
+ }).property('props', 'cluster', 'index')
+ });
+});
+define('ember-riak-explorer/mixins/models/cached-list-watcher', ['exports', 'ember-data', 'ember'], function (exports, _emberData, _ember) {
+ exports['default'] = _ember['default'].Mixin.create({
+ /**
+ * Has the cached list been loaded from the server?
+ *
+ * @property isListLoaded
+ * @type Boolean
+ * @default false
+ */
+ isListLoaded: _emberData['default'].attr('boolean', { defaultValue: false }),
+
+ /**
+ * Has the cached list been requested to be created on the server?
+ *
+ * @property isListLoaded
+ * @type Boolean
+ * @default false
+ */
+ hasListBeenRequested: _emberData['default'].attr('boolean', { defaultValue: false }),
+
+ /**
+ * Status message to display to the user. Relevant for long-running
+ * server operations such as loading large lists or refreshing cached lists.
+ * Sample messages:
+ *
+ * - 'Requesting cached list...'
+ * - 'Cache not found. Refreshing from a streaming list keys/buckets call...'
+ * @property statusMessage
+ * @type String
+ */
+ statusMessage: _emberData['default'].attr('string', { defaultValue: 'Requesting cached list...' })
+ });
+});
+define('ember-riak-explorer/mixins/models/cached-list', ['exports', 'ember-data', 'ember'], function (exports, _emberData, _ember) {
+ exports['default'] = _ember['default'].Mixin.create({
+ /**
+ * Number of items displayed on the current page of the list
+ * @property count
+ * @type Number
+ * @default 0
+ */
+ count: _emberData['default'].attr('number', { defaultValue: 0 }),
+
+ /**
+ * Timestamp of when the cached list was generated on the server side
+ * @property created
+ */
+ created: _emberData['default'].attr(),
+
+ /**
+ * The index of the first item in the current page, in relation to the entire list
+ * @property firstItemIndex
+ * @type Integer
+ */
+ firstItemIndex: _emberData['default'].attr('number', { defaultValue: 1 }),
+
+ /**
+ * The number of items per page
+ * @property pageSize
+ * @type Integer
+ */
+ pageSize: _emberData['default'].attr('number', { defaultValue: 0 }),
+
+ /**
+ * Total number of items in the cached list on the API side.
+ * @property total
+ * @type Number
+ * @default 0
+ */
+ total: _emberData['default'].attr('number', { defaultValue: 0 }),
+
+ /**
+ * The index of the last item in the current page, in relation to the entire list
+ *
+ * @method lastItemIndex
+ * @returns Integer
+ */
+ lastItemIndex: (function () {
+ return this.get('firstItemIndex') + this.get('count') - 1;
+ }).property('firstItemIndex', 'count'),
+
+ /**
+ * Whether or not the current page has more than 1 item in it
+ *
+ * @method hasMultipleListItems
+ * @returns Boolean
+ */
+ hasMultipleListItems: (function () {
+ return this.get('count') > 1;
+ }).property('count')
+ });
+});
+define('ember-riak-explorer/mixins/models/map-object', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Mixin.create({
+ sortBySubType: function sortBySubType(content) {
+ var self = this;
+
+ var sorted = {
+ registers: {},
+ flags: {},
+ counters: {},
+ sets: {},
+ maps: {}
+ };
+
+ _ember['default'].$.each(content, function (key, value) {
+ if (key.endsWith('_counter')) {
+ sorted.counters[key] = value;
+ }
+
+ if (key.endsWith('_flag')) {
+ sorted.flags[key] = value;
+ }
+
+ if (key.endsWith('_register')) {
+ sorted.registers[key] = value;
+ }
+
+ if (key.endsWith('_set')) {
+ sorted.sets[key] = value;
+ }
+
+ if (key.endsWith('_map')) {
+ sorted.maps[key] = self.sortBySubType(value);
+ }
+ });
+
+ return sorted;
+ },
+
+ contentsSortedBySubType: (function () {
+ if (this.get('bucket').get('isMap')) {
+ return this.sortBySubType(this.get('contents'));
+ }
+ }).property('bucket', 'contents')
+ });
+});
+define('ember-riak-explorer/mixins/models/object-headers', ['exports', 'ember-data', 'ember'], function (exports, _emberData, _ember) {
+ exports['default'] = _ember['default'].Mixin.create({
+ /**
+ * Hash containing an object's metadata/headers.
+ * Divided into three categories:
+ * 1. 'custom' - user-defined custom headers
+ * (in the HTTP API, these start with `x-riak-meta-`).
+ * Stored as an array of headers (simple key/value hashes) for
+ * easy listing on the Edit Object screen.
+ * 2. 'indexes' - Secondary Indexes
+ * Stored as an array of headers (simple key/value hashes) for
+ * easy listing on the Edit Object screen.
+ * 3. 'other' - Standard object metadata (x-riak-vclock, etag, etc).
+ * Stored as a hash of keys/values (not a list, since these are fixed)
+ *
+ * @see http://docs.basho.com/riak/latest/dev/references/http/fetch-object/
+ * @see http://docs.basho.com/riak/latest/dev/references/http/store-object/
+ * @see http://docs.basho.com/riak/latest/dev/references/http/secondary-indexes/
+ *
+ * @property headers
+ * @type Hash
+ */
+ headers: _emberData['default'].attr(),
+
+ /**
+ * Causal context header, used for server-side conflict resolution.
+ * This is opaque to the client; the important thing is to load it
+ * by reading first, before any sort of edit operation to an object.
+ * @see http://docs.basho.com/riak/latest/dev/using/conflict-resolution/#Causal-Context
+ *
+ * @property causalContext
+ * @readOnly
+ * @type String
+ */
+ causalContext: (function () {
+ if (this.get('headers')) {
+ return this.get('headers').other['x-riak-vclock'];
+ }
+ }).property('headers'),
+
+ /**
+ * HTTP Content-Type of the object (see section 14.17 of RFC 2616),
+ * specified by the user when writing the object.
+ * @property contentType
+ * @type String
+ */
+ contentType: (function () {
+ if (this.get('headers')) {
+ return this.get('headers').other['content-type'];
+ }
+ }).property('headers'),
+
+ /**
+ * Last-Modified timestamp.
+ * Useful for conditional GET operations and caching.
+ * @property contentType
+ * @readOnly
+ * @type String
+ */
+ dateLastModified: (function () {
+ if (this.get('headers')) {
+ return this.get('headers').other['last-modified'];
+ }
+ }).property('headers'),
+
+ /**
+ * Date on which this object was loaded from Riak (via an HTTP request).
+ * Used to give the user a sense of when the 'View Object' page was last
+ * refreshed.
+ * @property dateLoaded
+ * @readOnly
+ * @type String
+ */
+ dateLoaded: (function () {
+ if (this.get('headers')) {
+ return this.get('headers').other['date'];
+ }
+ }).property('headers'),
+
+ /**
+ * HTTP Etag (entity tag). Unique identifier for this object and contents.
+ * Useful for conditional GET operations and validation-based caching.
+ * @property dateLoaded
+ * @readOnly
+ * @type String
+ */
+ etag: (function () {
+ if (this.get('headers')) {
+ return this.get('headers').other['etag'];
+ }
+ }).property('headers'),
+
+ /**
+ * List of custom (user-specified) headers.
+ * Mainly useful to "Tag" binary objects and enable Search to index them.
+ * @property headersCustom
+ * @type Array
+ * @example
+ * [ { "x-riak-meta-user_id": "user123" }]
+ */
+ headersCustom: (function () {
+ if (this.get('headers')) {
+ return this.get('headers').custom;
+ }
+ }).property('headers'),
+
+ /**
+ * Re-assembles relevant object headers, such as the causal context and
+ * any user-edited headers like secondary indexes or custom metadata.
+ * Used when saving/updating an object.
+ * @see http://docs.basho.com/riak/latest/dev/references/http/store-object/
+ * @see http://docs.basho.com/riak/latest/dev/references/http/secondary-indexes/
+ *
+ * @method headersForUpdate
+ * @return {Hash} Headers object suitable for a jQuery AJAX PUT request
+ */
+ headersForUpdate: (function () {
+ var _this = this;
+
+ if (this.get('headers')) {
+ var _ret = (function () {
+ // Start with the causal context
+ var headers = {};
+
+ headers['X-Riak-Vclock'] = _this.get('causalContext');
+
+ _this.get('indexes').forEach(function (index) {
+ headers[index.key] = index.value;
+ });
+
+ _this.get('headersCustom').forEach(function (header) {
+ headers[header.key] = header.value;
+ });
+
+ return {
+ v: headers
+ };
+ })();
+
+ if (typeof _ret === 'object') return _ret.v;
+ }
+ }).property('headers'),
+
+ /**
+ * List of user-defined Secondary Indexes for this object.
+ * @see http://docs.basho.com/riak/latest/dev/references/http/secondary-indexes/
+ * @property indexes
+ * @type Array
+ */
+ indexes: (function () {
+ if (this.get('headers')) {
+ return this.get('headers').indexes;
+ }
+ }).property('headers'),
+
+ /**
+ * Has this object been deleted, cluster-side?
+ * Generally only encountered if `delete_mode` is set to 'keep',
+ * or if a tombstone is one of the object's siblings.
+ * @see http://docs.basho.com/riak/latest/ops/advanced/deletion/
+ * @see http://docs.basho.com/riak/latest/dev/references/http/delete-object/
+ *
+ * @property isDeleted
+ * @type String
+ * @readOnly
+ */
+ isDeleted: (function () {
+ if (this.get('headers')) {
+ return this.get('headers').other['x-riak-deleted'];
+ }
+ }).property('headers')
+ });
+});
+define('ember-riak-explorer/mixins/routes/alerts', ['exports', 'ember'], function (exports, _ember) {
+
+ /**
+ * Mixin class that allows routes to render an alert template into the alert outlet.
+ * To be used on route classes only.
+ *
+ * @class WrapperState
+ */
+ exports['default'] = _ember['default'].Mixin.create({
+ /**
+ * Renders the passed template into the alert outlet.
+ * @method showAlert
+ * @argument String
+ */
+ showAlert: function showAlert(templateString) {
+ this.render(templateString, {
+ into: 'application',
+ outlet: 'alert'
+ });
+ },
+
+ /**
+ * Renders and empty template into the alerts outlet. Useful for removing any existing
+ * alerts that are currently in view.
+ * @method removeAlert
+ */
+ removeAlert: function removeAlert() {
+ this.render('alerts.empty', {
+ into: 'application',
+ outlet: 'alert'
+ });
+ }
+ });
+});
+define('ember-riak-explorer/mixins/routes/loading-slider', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Mixin.create({
+ simulateLoad: function simulateLoad() {
+ var controller = this.controllerFor('application');
+
+ controller.set('loading', true);
+
+ setTimeout(function () {
+ controller.set('loading', false);
+ }, 200);
+ },
+
+ actions: {
+ loading: function loading() {
+ var controller = this.controllerFor('application');
+
+ controller.set('loading', true);
+
+ if (this.router) {
+ this.router.one('didTransition', function () {
+ controller.set('loading', false);
+ });
+ }
+ },
+
+ finished: function finished() {
+ this.controllerFor('application').set('loading', false);
+ }
+ }
+ });
+});
+define('ember-riak-explorer/mixins/routes/monitoring', ['exports', 'ember', 'lodash/lodash'], function (exports, _ember, _lodashLodash) {
+ exports['default'] = _ember['default'].Mixin.create({
+ groupedSelectOptions: [{
+ groupName: 'Erlang Resource Usage Metrics',
+ options: ['memory_processes', 'memory_processes_used', 'sys_process_count']
+ }, {
+ groupName: 'Throughput Metrics',
+ options: ['node_gets', 'node_puts', 'vnode_counter_update', 'vnode_map_update', 'consistent_gets', 'search_query_throughput_one', 'search_index_throughtput_one', 'consistent_puts', 'vnode_index_reads']
+ }, {
+ groupName: 'Latency Metrics',
+ options: ['node_get_fsm_time_mean', 'node_put_fsm_time_mean', 'object_counter_merge_time_mean', 'object_set_merge_time_mean', 'object_map_merge_time_mean', 'search_query_latency_median', 'search_index_latency_median', 'consistent_get_time_mean', 'consistent_put_time_mean']
+ }, {
+ groupName: 'General Riak Load/Health Metrics',
+ options: ['node_get_fsm_siblings_mean', 'node_get_fsm_objsize_mean', 'riak_search_vnodeq_mean', 'search_index_fail_one', 'pbc_active', 'pbc_connects', 'read_repairs', 'list_fsm_active', 'node_get_fsm_rejected', 'node_put_fsm_rejected']
+ }],
+
+ setPossibleGraphOptions: function setPossibleGraphOptions(nodeStats) {
+ var groupedStats = this.get('groupedSelectOptions');
+ var existingNodeStats = Object.keys(nodeStats);
+ var possibleOptions = undefined;
+
+ // Remove any groupedStatistics that the nodeStats doesn't contain
+ possibleOptions = groupedStats.map(function (group) {
+ group.options = _lodashLodash['default'].intersection(group.options, existingNodeStats);
+
+ return group;
+ });
+
+ // Add any number metric as a possible graph option
+ possibleOptions.push({
+ groupName: 'All Metrics',
+ options: existingNodeStats.filter(function (stat) {
+ return _lodashLodash['default'].isNumber(nodeStats[stat]);
+ })
+ });
+
+ this.controller.set('availableGraphs', possibleOptions);
+ },
+
+ setDefaultGraph: function setDefaultGraph() {
+ var controller = this.controller;
+ var firstAvailableGraph = _lodashLodash['default'].head(_lodashLodash['default'].head(controller.get('availableGraphs')).options);
+
+ return controller.set('currentGraphs', [firstAvailableGraph]);
+ }
+ });
+});
+define('ember-riak-explorer/mixins/routes/polling', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Mixin.create({
+ startPolling: function startPolling(callback) {
+ var interval = arguments.length <= 1 || arguments[1] === undefined ? 1000 : arguments[1];
+
+ this.set('timer', _ember['default'].run.later(this, function () {
+ callback();
+ }, interval));
+ },
+
+ stopPolling: function stopPolling() {
+ return _ember['default'].run.cancel(this.get('timer'));
+ }
+ });
+});
+define('ember-riak-explorer/mixins/routes/scroll-reset', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Mixin.create({
+ activate: function activate() {
+ this._super();
+ _ember['default'].$('.view-body').scrollTop(0);
+ },
+
+ scrollToTop: function scrollToTop() {
+ return _ember['default'].$('.view-body').scrollTop(0);
+ }
+ });
+});
+define('ember-riak-explorer/mixins/routes/wrapper-state', ['exports', 'ember'], function (exports, _ember) {
+
+ /**
+ * Mixin class that allows routes to set state that is part of the "Global" state,
+ * i.e. state that is part of the GUI chrome. Things like sidebars, headers, footers, etc.
+ * To be included on route classes only.
+ *
+ * @class WrapperState
+ */
+ exports['default'] = _ember['default'].Mixin.create({
+ /**
+ * Passes the current cluster object to the sidebar, for display and logic purposes.
+ * @method setSidebarCluster
+ * @argument Cluster{DS.Store}
+ */
+ setSidebarCluster: function setSidebarCluster(cluster) {
+ this.controllerFor('application').set('currentCluster', cluster);
+ },
+
+ /**
+ * Takes an object with the current breadcrumb state, for display purposes.
+ * @method setBreadCrumbs
+ * @argument Object
+ */
+ setBreadCrumbs: function setBreadCrumbs(breadCrumbMap) {
+ if (!breadCrumbMap) {
+ breadCrumbMap = {};
+ }
+ this.controllerFor('application').set('breadCrumbMap', breadCrumbMap);
+ },
+
+ /**
+ * Takes an object with the current label state, for display purposes.
+ * @method setViewLabel
+ * @argument Object
+ */
+ setViewLabel: function setViewLabel(viewLabelMap) {
+ if (!viewLabelMap) {
+ viewLabelMap = {};
+ }
+ this.controllerFor('application').set('viewLabelMap', viewLabelMap);
+ }
+ });
+});
+define('ember-riak-explorer/models/bucket-list', ['exports', 'ember-data', 'ember-riak-explorer/mixins/models/cached-list'], function (exports, _emberData, _emberRiakExplorerMixinsModelsCachedList) {
+
+ /**
+ * Represents a list of buckets in the current bucket type,
+ * cached by the Explorer API.
+ *
+ * @class BucketList
+ * @extends CachedList
+ * @uses BucketType
+ */
+ var BucketList = _emberData['default'].Model.extend(_emberRiakExplorerMixinsModelsCachedList['default'], {
+ /**
+ * The bucket type that owns this bucket list.
+ * @property bucketType
+ * @type BucketType
+ */
+ bucketType: _emberData['default'].belongsTo('bucket-type')
+ });
+
+ exports['default'] = BucketList;
+});
+define('ember-riak-explorer/models/object-list', ['exports', 'ember-data', 'ember-riak-explorer/mixins/models/cached-list'], function (exports, _emberData, _emberRiakExplorerMixinsModelsCachedList) {
+
+ var ObjectList = _emberData['default'].Model.extend(_emberRiakExplorerMixinsModelsCachedList['default'], {
+ /**
+ * The bucket type that owns this bucket list.
+ * @property bucketType
+ * @type BucketType
+ */
+ bucket: _emberData['default'].belongsTo('bucket')
+
+ /**
+ * Returns true if this list has a nonzero key count.
+ * @method hasKeys
+ * @return {Boolean}
+ */
+ //hasKeys: function() {
+ // return this.get('count') > 0;
+ //}.property('count'),
+
+ /**
+ * Returns whether or not the 'Delete All Keys in Bucket' button
+ * should be displayed to the user.
+ * @method showDeleteKeys
+ * @return {Boolean}
+ */
+ //showDeleteKeys: function() {
+ // return this.get('cluster').get('developmentMode') &&
+ // this.get('hasKeys');
+ //}.property('cluster', 'count')
+ });
+
+ exports['default'] = ObjectList;
+});
+define('ember-riak-explorer/models/row-list', ['exports', 'ember-data', 'ember-riak-explorer/mixins/models/cached-list'], function (exports, _emberData, _emberRiakExplorerMixinsModelsCachedList) {
+
+ /**
+ * Represents a list of rows in the current table,
+ * cached by the Explorer API.
+ *
+ * @class RowsList
+ * @extends CachedList
+ * @uses Table
+ */
+ var RowsList = _emberData['default'].Model.extend(_emberRiakExplorerMixinsModelsCachedList['default'], {
+ /**
+ * The table that owns this rows list.
+ * @property table
+ * @type Table
+ */
+ table: _emberData['default'].belongsTo('table')
+ });
+
+ exports['default'] = RowsList;
+});
+define('ember-riak-explorer/models/row', ['exports', 'ember-data'], function (exports, _emberData) {
+ exports['default'] = _emberData['default'].Model.extend({
+ table: _emberData['default'].belongsTo('table'),
+
+ // The rows index in the cached list.
+ // Don't like coupling it to the cached list, but it is easier to read this than to parse the string id
+ index: _emberData['default'].attr('string'),
+
+ // String representation of the row
+ value: _emberData['default'].attr('string'),
+
+ // array representation of the row
+ parsedValue: (function () {
+ if (this.get('value')) {
+ return JSON.parse(this.get('value'));
+ }
+ }).property('value')
+ });
+});
+define('ember-riak-explorer/pods/bucket-type/controller', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/side-drawer', 'ember-riak-explorer/mixins/controller/modal'], function (exports, _ember, _emberRiakExplorerMixinsControllerSideDrawer, _emberRiakExplorerMixinsControllerModal) {
+ exports['default'] = _ember['default'].Controller.extend(_emberRiakExplorerMixinsControllerSideDrawer['default'], _emberRiakExplorerMixinsControllerModal['default'], {
+ pageSize: null,
+
+ currentBuckets: null,
+
+ showCachedListWarning: true
+ });
+});
+define('ember-riak-explorer/pods/bucket-type/create/controller', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Controller.extend({
+ dataType: 'default',
+
+ dataTypes: ['default', 'counter', 'set', 'map'],
+
+ properties: [],
+
+ showSpinner: false,
+
+ spinnerMessage: 'loading ...',
+
+ errors: [],
+
+ clearState: function clearState() {
+ this.set('showSpinner', false);
+ this.set('dataType', 'default');
+ this.set('properties', []);
+ this.set('errors', []);
+ }
+ });
+});
+define('ember-riak-explorer/pods/bucket-type/create/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/alerts', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesAlerts, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesAlerts['default'], _emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ model: function model(params) {
+ var self = this;
+
+ return this.explorer.getCluster(params.clusterName).then(function (cluster) {
+ return self.store.createRecord('bucket-type', {
+ cluster: cluster,
+ name: ''
+ });
+ });
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ crudAction: 'create bucket type'
+ });
+ this.setViewLabel({
+ preLabel: 'Create Bucket Type'
+ });
+ },
+
+ setupController: function setupController(controller, model) {
+ this._super(controller, model);
+
+ if (model.get('cluster').get('supportsHyperLogLogs')) {
+ controller.get('dataTypes').pushObject('hyperloglog');
+ }
+
+ controller.clearState();
+ },
+
+ prepareBucketType: function prepareBucketType() {
+ var controller = this.controller;
+ var btName = this.currentModel.get('name').trim().replace(/ /g, "_");
+ var btProps = controller.get('properties');
+ var btType = controller.get('dataType');
+ var bucketType = {
+ name: btName,
+ data: {
+ props: {}
+ }
+ };
+
+ btProps.forEach(function (prop) {
+ bucketType.data.props[prop.key] = prop.value;
+ });
+
+ if (btType !== 'default') {
+ if (btType === 'hyperloglog') {
+ bucketType.data.props.datatype = 'hll';
+ } else {
+ bucketType.data.props.datatype = btType;
+ }
+ }
+
+ return bucketType;
+ },
+
+ validatePresenceAndUniquenessOfName: function validatePresenceAndUniquenessOfName() {
+ var controller = this.controller;
+ var bucketType = this.currentModel;
+ var cluster = bucketType.get('cluster');
+ var name = bucketType.get('name').trim().replace(/ /g, "_");
+
+ var isValid = undefined;
+
+ if (_ember['default'].isBlank(name)) {
+ controller.errors.pushObject('Bucket Types must have a name.');
+ isValid = false;
+ } else if (cluster.get('bucketTypes').filterBy('name', name).length > 1) {
+ controller.errors.pushObject('The ' + cluster.get('name') + ' cluster already has a bucket type called "' + name + '".');
+ isValid = false;
+ } else {
+ isValid = true;
+ }
+
+ return isValid;
+ },
+
+ validateProperties: function validateProperties() {
+ var controller = this.controller;
+ var props = controller.get('properties');
+ var errors = controller.get('errors');
+ var invalidProps = props.filter(function (prop) {
+ return _ember['default'].isBlank(prop.key) || _ember['default'].isBlank(prop.value);
+ });
+ var isValid = undefined;
+
+ if (_ember['default'].isPresent(invalidProps)) {
+ errors.pushObject('All properties must contain non-empty keys and values');
+ isValid = false;
+ } else {
+ isValid = true;
+ }
+
+ return isValid;
+ },
+
+ validateBucketType: function validateBucketType() {
+ this.controller.set('errors', []);
+
+ var validName = this.validatePresenceAndUniquenessOfName();
+ var validProps = this.validateProperties();
+
+ return validName && validProps;
+ },
+
+ actions: {
+ createBucketType: function createBucketType() {
+ var _this = this;
+
+ var self = this;
+ var controller = this.controller;
+ var cluster = this.currentModel.get('cluster');
+ var isValid = this.validateBucketType();
+
+ if (isValid) {
+ (function () {
+ controller.set('spinnerMessage', 'Creating Bucket-Type ...');
+ controller.set('showSpinner', true);
+
+ var bucketType = _this.prepareBucketType();
+
+ _this.explorer.createBucketType(cluster.get('name'), bucketType).then(function onSuccess(data) {
+ self.transitionTo('bucket-type', cluster.get('name'), bucketType.name).then(function () {
+ controller.set('showSpinner', false);
+ });
+ }, function onFail(data) {
+ controller.set('showSpinner', false);
+
+ self.render('alerts.error-request-was-not-processed', {
+ into: 'application',
+ outlet: 'alert'
+ });
+ });
+ })();
+ }
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/bucket-type/create/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 5,
+ "column": 6
+ },
+ "end": {
+ "line": 7,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createUnsafeMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "error", ["loc", [null, [6, 12], [6, 23]]]]],
+ locals: ["error"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 9,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "label label-danger");
+ var el3 = dom.createTextNode("Errors");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "errors", ["loc", [null, [5, 14], [5, 20]]]]], [], 0, null, ["loc", [null, [5, 6], [7, 15]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 10,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "danger"], 0, null, ["loc", [null, [2, 2], [9, 22]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 16,
+ "column": 8
+ },
+ "end": {
+ "line": 19,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-close-round");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Cancel\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 14,
+ "column": 4
+ },
+ "end": {
+ "line": 21,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["cluster.data", ["get", "model.cluster.name", ["loc", [null, [16, 34], [16, 52]]]]], ["class", "cancel action-button"], 0, null, ["loc", [null, [16, 8], [19, 20]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 23,
+ "column": 6
+ },
+ "end": {
+ "line": 25,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "loading-spinner", [], ["statusMessage", ["subexpr", "@mut", [["get", "spinnerMessage", ["loc", [null, [24, 40], [24, 54]]]]], [], []]], ["loc", [null, [24, 8], [24, 56]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 35,
+ "column": 14
+ },
+ "end": {
+ "line": 37,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("option");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createAttrMorph(element0, 'value');
+ morphs[1] = dom.createAttrMorph(element0, 'selected');
+ morphs[2] = dom.createMorphAt(element0, 0, 0);
+ return morphs;
+ },
+ statements: [["attribute", "value", ["get", "type", ["loc", [null, [36, 32], [36, 36]]]]], ["attribute", "selected", ["subexpr", "eq", [["get", "dataType", ["loc", [null, [36, 53], [36, 61]]]], ["get", "type", ["loc", [null, [36, 62], [36, 66]]]]], [], ["loc", [null, [36, 48], [36, 68]]]]], ["content", "type", ["loc", [null, [36, 69], [36, 77]]]]],
+ locals: ["type"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 25,
+ "column": 6
+ },
+ "end": {
+ "line": 49,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("form");
+ dom.setAttribute(el1, "class", "bucket-type-create-form");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "form-group name-input");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("label");
+ var el4 = dom.createTextNode("Name");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "form-group type-input");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("label");
+ var el4 = dom.createTextNode("Data Type");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("select");
+ dom.setAttribute(el3, "class", "form-control");
+ var el4 = dom.createTextNode("\n");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode(" ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "form-group create-button");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("button");
+ dom.setAttribute(el3, "class", "btn btn-primary");
+ var el4 = dom.createTextNode("\n Create Bucket Type\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element1 = dom.childAt(fragment, [1]);
+ var element2 = dom.childAt(element1, [3, 3]);
+ var element3 = dom.childAt(element1, [7, 1]);
+ var morphs = new Array(5);
+ morphs[0] = dom.createMorphAt(dom.childAt(element1, [1]), 3, 3);
+ morphs[1] = dom.createAttrMorph(element2, 'onchange');
+ morphs[2] = dom.createMorphAt(element2, 1, 1);
+ morphs[3] = dom.createMorphAt(element1, 5, 5);
+ morphs[4] = dom.createElementMorph(element3);
+ return morphs;
+ },
+ statements: [["inline", "input", [], ["value", ["subexpr", "mut", [["get", "model.name", ["loc", [null, [29, 31], [29, 41]]]]], [], ["loc", [null, [29, 26], [29, 42]]]], "class", "form-control"], ["loc", [null, [29, 12], [29, 65]]]], ["attribute", "onchange", ["subexpr", "action", [["subexpr", "mut", [["get", "dataType", ["loc", [null, [34, 43], [34, 51]]]]], [], ["loc", [null, [34, 38], [34, 52]]]]], ["value", "target.value"], ["loc", [null, [34, 29], [34, 75]]]]], ["block", "each", [["get", "dataTypes", ["loc", [null, [35, 22], [35, 31]]]]], [], 0, null, ["loc", [null, [35, 14], [37, 23]]]], ["inline", "form.add-custom-properties", [], ["properties", ["subexpr", "@mut", [["get", "properties", ["loc", [null, [41, 50], [41, 60]]]]], [], []]], ["loc", [null, [41, 10], [41, 62]]]], ["element", "action", ["createBucketType"], [], ["loc", [null, [44, 44], [44, 73]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 22,
+ "column": 4
+ },
+ "end": {
+ "line": 50,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "showSpinner", ["loc", [null, [23, 12], [23, 23]]]]], [], 0, 1, ["loc", [null, [23, 6], [49, 13]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 13,
+ "column": 2
+ },
+ "end": {
+ "line": 51,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Create Bucket Type Form"], 0, null, ["loc", [null, [14, 4], [21, 32]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [22, 4], [50, 30]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 52,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "bucket-type-create-container");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "errors", ["loc", [null, [1, 6], [1, 12]]]]], [], 0, null, ["loc", [null, [1, 0], [10, 7]]]], ["block", "dashboard-module.container", [], ["class", "medium-width"], 1, null, ["loc", [null, [13, 2], [51, 33]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/bucket-type/edit/controller', ['exports', 'ember', 'lodash/lodash', 'ember-riak-explorer/mixins/controller/scroll-reset'], function (exports, _ember, _lodashLodash, _emberRiakExplorerMixinsControllerScrollReset) {
+ exports['default'] = _ember['default'].Controller.extend(_emberRiakExplorerMixinsControllerScrollReset['default'], {
+ initialProps: {},
+
+ updatedProps: {},
+
+ editableProps: [],
+
+ errors: [],
+
+ nonEditableProps: [],
+
+ convertStringToType: function convertStringToType(string, type) {
+ var methodName = 'is' + _lodashLodash['default'].capitalize(type); // Converts to proper underscore method name (_.isArray, _.isBoolean, etc.)
+ var isValid = true;
+ var convertedValue = null;
+
+ // Set empty arrays
+ if (type === 'array' && _ember['default'].isBlank(string)) {
+ string = '[]';
+ }
+
+ switch (type) {
+ // TODO: Once lodash upgrades, use _.isInteger
+ case 'integer':
+ convertedValue = parseInt(string);
+ if (isNaN(convertedValue)) {
+ isValid = false;
+ }
+ break;
+ case 'array':
+ case 'object':
+ case 'boolean':
+ try {
+ convertedValue = JSON.parse(string);
+ if (!_lodashLodash['default'][methodName](convertedValue)) {
+ isValid = false;
+ }
+ } catch (e) {
+ isValid = false;
+ }
+ break;
+ case 'integer|string':
+ var possibleInt = parseInt(string);
+
+ convertedValue = isNaN(possibleInt) ? string : possibleInt;
+ break;
+ default:
+ convertedValue = string;
+ break;
+ }
+
+ return { valid: isValid, value: convertedValue };
+ },
+
+ getErrorObject: function getErrorObject(propKey) {
+ return this.get('errors').findBy('id', propKey);
+ },
+
+ errorExists: function errorExists(propKey) {
+ return !!this.getErrorObject(propKey);
+ },
+
+ removeError: function removeError(propKey) {
+ var errors = this.get('errors');
+
+ return errors.removeAt(errors.indexOf(this.getErrorObject(propKey)));
+ },
+
+ addError: function addError(prop) {
+ var message = null;
+
+ switch (prop.json_schema_type) {
+ case 'integer':
+ message = 'must be an integer';
+ break;
+ case 'array':
+ message = 'must be an array';
+ break;
+ case 'object':
+ message = 'must be an object';
+ break;
+ case 'string':
+ message = 'must be a string';
+ break;
+ case 'boolean':
+ message = 'must be a boolean';
+ break;
+ case 'integer|string':
+ message = 'must be an integer or string';
+ break;
+ default:
+ break;
+ }
+
+ this.scrollToTop();
+
+ return this.get('errors').pushObject({
+ id: prop.key,
+ message: prop.name + ' ' + message
+ });
+ },
+
+ actions: {
+ changedValue: function changedValue(prop) {
+ var converted = this.convertStringToType(prop.value, prop.json_schema_type);
+
+ if (converted.valid) {
+ if (this.errorExists(prop.key)) {
+ this.removeError(prop.key);
+ }
+
+ if (this.get('initialProps')[prop.key] !== converted.value) {
+ this.updatedProps[prop.key] = converted.value;
+ }
+ } else {
+ if (!this.errorExists(prop.key)) {
+ this.addError(prop);
+ }
+ }
+ }
+ }
+ });
+});
+define('ember-riak-explorer/pods/bucket-type/edit/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/alerts', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state', 'lodash/lodash'], function (exports, _ember, _emberRiakExplorerMixinsRoutesAlerts, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState, _lodashLodash) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesAlerts['default'], _emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ model: function model(params) {
+ return this.explorer.getBucketType(params.clusterName, params.bucketTypeName);
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ bucketType: model,
+ crudAction: 'edit'
+ });
+ this.setViewLabel({
+ preLabel: 'Edit Bucket Type',
+ label: model.get('name')
+ });
+ },
+
+ setupController: function setupController(controller, model) {
+ this._super(controller, model);
+
+ var initialProps = {};
+
+ var props = model.get('propsWithHelp');
+ var editableProps = props.filter(function (prop) {
+ return prop.editable;
+ });
+ var nonEditableProps = props.filter(function (prop) {
+ return !prop.editable;
+ });
+
+ editableProps.forEach(function (prop) {
+ initialProps[prop.key] = prop.value;
+ });
+
+ controller.set('initialProps', initialProps);
+ controller.set('editableProps', editableProps);
+ controller.set('nonEditableProps', nonEditableProps);
+ controller.set('errors', []);
+ },
+
+ actions: {
+ updateBucketType: function updateBucketType() {
+ var controller = this.get('controller');
+ var bucketType = this.currentModel;
+ var updatedProps = controller.get('updatedProps');
+ var self = this;
+
+ this.explorer.updateBucketType(bucketType, updatedProps).then(function onSuccess(data) {
+ self.transitionTo('bucket-type', bucketType.get('cluster').get('name'), bucketType.get('name'));
+ }, function onFail(data) {
+ if (data.responseText) {
+ var errorObj = {
+ id: 'server_error',
+ message: JSON.parse(data.responseText).error
+ };
+
+ controller.get('errors').pushObject(errorObj);
+ } else {
+ self.render('alerts.error-request-was-not-processed', {
+ into: 'application',
+ outlet: 'alert'
+ });
+ }
+ self.scrollToTop();
+ });
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/bucket-type/edit/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 5,
+ "column": 6
+ },
+ "end": {
+ "line": 7,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createUnsafeMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "error.message", ["loc", [null, [6, 12], [6, 31]]]]],
+ locals: ["error"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 9,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("h4");
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "label label-danger");
+ var el4 = dom.createTextNode("Errors");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 3, 3);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "errors", ["loc", [null, [5, 14], [5, 20]]]]], [], 0, null, ["loc", [null, [5, 6], [7, 15]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 10,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "danger"], 0, null, ["loc", [null, [2, 2], [9, 22]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 16,
+ "column": 8
+ },
+ "end": {
+ "line": 19,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-close-round");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Cancel\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 14,
+ "column": 4
+ },
+ "end": {
+ "line": 21,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["bucket-type", ["get", "model.cluster.name", ["loc", [null, [16, 33], [16, 51]]]], ["get", "model.name", ["loc", [null, [16, 52], [16, 62]]]]], ["class", "action-button cancel"], 0, null, ["loc", [null, [16, 8], [19, 20]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 31,
+ "column": 12
+ },
+ "end": {
+ "line": 36,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("Consistent");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 3]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "model.props.consistent", ["loc", [null, [34, 34], [34, 60]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 37,
+ "column": 12
+ },
+ "end": {
+ "line": 42,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("Write Once");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 3]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "model.props.write_once", ["loc", [null, [40, 34], [40, 60]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 43,
+ "column": 12
+ },
+ "end": {
+ "line": 55,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createElement("code");
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element2 = dom.childAt(fragment, [1]);
+ var element3 = dom.childAt(element2, [1]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(element3, 1, 1);
+ morphs[1] = dom.createMorphAt(element3, 3, 3);
+ morphs[2] = dom.createMorphAt(dom.childAt(element2, [3, 0]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "prop.name", ["loc", [null, [46, 18], [46, 31]]]], ["inline", "tooltip.bucket-props", [], ["itemKey", ["subexpr", "@mut", [["get", "prop.key", ["loc", [null, [48, 26], [48, 34]]]]], [], []], "itemDescription", ["subexpr", "@mut", [["get", "prop.description", ["loc", [null, [49, 34], [49, 50]]]]], [], []], "itemDefaultValue", ["subexpr", "@mut", [["get", "prop.default", ["loc", [null, [50, 35], [50, 47]]]]], [], []], "itemSchemaType", ["subexpr", "@mut", [["get", "prop.json_schema_type", ["loc", [null, [51, 33], [51, 54]]]]], [], []]], ["loc", [null, [47, 18], [51, 56]]]], ["content", "prop.value", ["loc", [null, [53, 40], [53, 54]]]]],
+ locals: ["prop"],
+ templates: []
+ };
+ })();
+ var child3 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 66,
+ "column": 14
+ },
+ "end": {
+ "line": 80,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var element1 = dom.childAt(element0, [1]);
+ var morphs = new Array(4);
+ morphs[0] = dom.createElementMorph(element0);
+ morphs[1] = dom.createMorphAt(element1, 1, 1);
+ morphs[2] = dom.createMorphAt(element1, 3, 3);
+ morphs[3] = dom.createMorphAt(dom.childAt(element0, [3]), 1, 1);
+ return morphs;
+ },
+ statements: [["element", "action", ["changedValue", ["get", "prop", ["loc", [null, [67, 44], [67, 48]]]]], ["on", "focusOut"], ["loc", [null, [67, 20], [67, 64]]]], ["content", "prop.name", ["loc", [null, [69, 20], [69, 33]]]], ["inline", "tooltip.bucket-props", [], ["itemKey", ["subexpr", "@mut", [["get", "prop.key", ["loc", [null, [71, 28], [71, 36]]]]], [], []], "itemDescription", ["subexpr", "@mut", [["get", "prop.description", ["loc", [null, [72, 36], [72, 52]]]]], [], []], "itemDefaultValue", ["subexpr", "@mut", [["get", "prop.default", ["loc", [null, [73, 37], [73, 49]]]]], [], []], "itemSchemaType", ["subexpr", "@mut", [["get", "prop.json_schema_type", ["loc", [null, [74, 35], [74, 56]]]]], [], []]], ["loc", [null, [70, 20], [74, 58]]]], ["inline", "input", [], ["value", ["subexpr", "@mut", [["get", "prop.value", ["loc", [null, [77, 34], [77, 44]]]]], [], []], "class", "form-control"], ["loc", [null, [77, 20], [77, 67]]]]],
+ locals: ["prop"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 22,
+ "column": 4
+ },
+ "end": {
+ "line": 89,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("section");
+ dom.setAttribute(el1, "class", "non-editable-props");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "section-title");
+ var el3 = dom.createTextNode("Non-Editable Properties");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("table");
+ dom.setAttribute(el2, "class", "key-value-table");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tbody");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("tr");
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createElement("td");
+ dom.setAttribute(el5, "class", "key");
+ var el6 = dom.createTextNode("Name");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createElement("td");
+ dom.setAttribute(el5, "class", "value");
+ var el6 = dom.createComment("");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode(" ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("section");
+ dom.setAttribute(el1, "class", "non-editable-props");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "section-title");
+ var el3 = dom.createTextNode("Editable Properties");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("form");
+ dom.setAttribute(el2, "id", "some-form");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("table");
+ dom.setAttribute(el3, "class", "key-value-table");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("tbody");
+ var el5 = dom.createTextNode("\n");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createElement("button");
+ dom.setAttribute(el5, "type", "submit");
+ dom.setAttribute(el5, "class", "btn btn-primary");
+ var el6 = dom.createTextNode("\n Update Bucket Type\n ");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element4 = dom.childAt(fragment, [1, 3, 1]);
+ var element5 = dom.childAt(fragment, [3, 3]);
+ var morphs = new Array(6);
+ morphs[0] = dom.createMorphAt(dom.childAt(element4, [1, 3]), 0, 0);
+ morphs[1] = dom.createMorphAt(element4, 3, 3);
+ morphs[2] = dom.createMorphAt(element4, 4, 4);
+ morphs[3] = dom.createMorphAt(element4, 5, 5);
+ morphs[4] = dom.createElementMorph(element5);
+ morphs[5] = dom.createMorphAt(dom.childAt(element5, [1, 1]), 1, 1);
+ return morphs;
+ },
+ statements: [["content", "model.name", ["loc", [null, [29, 32], [29, 46]]]], ["block", "if", [["get", "model.props.consistent", ["loc", [null, [31, 18], [31, 40]]]]], [], 0, null, ["loc", [null, [31, 12], [36, 19]]]], ["block", "if", [["get", "model.props.write_once", ["loc", [null, [37, 18], [37, 40]]]]], [], 1, null, ["loc", [null, [37, 12], [42, 19]]]], ["block", "each", [["get", "nonEditableProps", ["loc", [null, [43, 20], [43, 36]]]]], [], 2, null, ["loc", [null, [43, 12], [55, 21]]]], ["element", "action", ["updateBucketType", ["get", "target", ["loc", [null, [63, 57], [63, 63]]]]], ["on", "submit"], ["loc", [null, [63, 29], [63, 77]]]], ["block", "each", [["get", "editableProps", ["loc", [null, [66, 22], [66, 35]]]]], [], 3, null, ["loc", [null, [66, 14], [80, 23]]]]],
+ locals: [],
+ templates: [child0, child1, child2, child3]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 13,
+ "column": 2
+ },
+ "end": {
+ "line": 90,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Edit Bucket Type"], 0, null, ["loc", [null, [14, 4], [21, 32]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [22, 4], [89, 30]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 91,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "bucket-type-edit-container");
+ dom.setAttribute(el1, "xmlns", "http://www.w3.org/1999/html");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "errors", ["loc", [null, [1, 6], [1, 12]]]]], [], 0, null, ["loc", [null, [1, 0], [10, 7]]]], ["block", "dashboard-module.container", [], ["class", "medium-width"], 1, null, ["loc", [null, [13, 2], [90, 33]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/bucket-type/model', ['exports', 'ember-data', 'ember-riak-explorer/mixins/models/bucket-props', 'ember-riak-explorer/mixins/models/cached-list-watcher'], function (exports, _emberData, _emberRiakExplorerMixinsModelsBucketProps, _emberRiakExplorerMixinsModelsCachedListWatcher) {
+
+ /**
+ * Represents a Riak Bucket Type
+ *
+ * @class BucketType
+ * @extends DS.Model
+ * @constructor
+ * @uses Cluster
+ * @uses BucketProps
+ * @uses BucketList
+ */
+ var BucketType = _emberData['default'].Model.extend(_emberRiakExplorerMixinsModelsBucketProps['default'], _emberRiakExplorerMixinsModelsCachedListWatcher['default'], {
+ bucketList: _emberData['default'].belongsTo('bucket-list'),
+
+ /**
+ * Contains the results of cached bucket lists for this bucket type,
+ * fetched from the API.
+ * @property buckets
+ * @type Bucket
+ */
+ buckets: _emberData['default'].hasMany('bucket'),
+
+ /**
+ * Riak cluster in which this bucket type lives.
+ * @property cluster
+ * @type Cluster
+ * @writeOnce
+ */
+ cluster: _emberData['default'].belongsTo('cluster'),
+
+ /**
+ * Bucket Type name (unique per cluster),
+ * as appears on `riak-admin bucket-type list`
+ * @property name
+ * @type String
+ */
+ name: _emberData['default'].attr('string')
+ });
+
+ exports['default'] = BucketType;
+});
+define('ember-riak-explorer/pods/bucket-type/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/polling', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesPolling, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesPolling['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ bucketsPaging: {
+ size: 10,
+ initialLow: 0,
+ initialHigh: 9
+ },
+
+ model: function model(params) {
+ return this.explorer.getBucketType(params.clusterName, params.bucketTypeName);
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ bucketType: model
+ });
+ this.setViewLabel({
+ preLabel: 'Bucket Type',
+ label: model.get('name')
+ });
+ },
+
+ setupController: function setupController(controller, model) {
+ var page = this.get('bucketsPaging');
+
+ this._super(controller, model);
+ this.controller.set('pageSize', page.size);
+ this.controller.set('currentBuckets', this.bucketsFromRange(page.initialLow, page.initialHigh));
+ },
+
+ bucketsFromRange: function bucketsFromRange(startIndex, endIndex) {
+ return this.currentModel.get('buckets').filter(function (bucket, index) {
+ return index >= startIndex && index <= endIndex;
+ });
+ },
+
+ lookForNewBucketsList: function lookForNewBucketsList() {
+ var self = this;
+ var bucketType = this.currentModel;
+ var page = this.get('bucketsPaging');
+
+ this.explorer.getBucketList(bucketType).then(function (list) {
+ return self.explorer.getBuckets(bucketType);
+ }).then(function (buckets) {
+ self.controller.set('currentBuckets', self.bucketsFromRange(page.initialLow, page.initialHigh));
+ self.stopPolling();
+ });
+ },
+
+ actions: {
+ refreshBucketList: function refreshBucketList(bucketType) {
+ var self = this;
+
+ this.controller.set('modalVisible', false);
+ this.controller.set('showCachedListWarning', false);
+
+ return this.explorer.refreshBucketList(bucketType).then(function () {
+ self.startPolling(self.lookForNewBucketsList.bind(self));
+ });
+ },
+
+ bucketsPageRequest: function bucketsPageRequest(lowIndex, highIndex) {
+ this.controller.set('currentBuckets', this.bucketsFromRange(lowIndex, highIndex));
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/bucket-type/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 5,
+ "column": 6
+ },
+ "end": {
+ "line": 7,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "warning", ["loc", [null, [6, 12], [6, 23]]]]],
+ locals: ["warning"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 9,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("h4");
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "label label-warning");
+ var el4 = dom.createTextNode("WARNINGS");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 3, 3);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "model.warnings", ["loc", [null, [5, 14], [5, 28]]]]], [], 0, null, ["loc", [null, [5, 6], [7, 15]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 10,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "warning"], 0, null, ["loc", [null, [2, 2], [9, 22]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 16,
+ "column": 8
+ },
+ "end": {
+ "line": 19,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-edit");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Edit Bucket Type\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 14,
+ "column": 4
+ },
+ "end": {
+ "line": 21,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["bucket-type.edit", ["get", "model.cluster.name", ["loc", [null, [16, 38], [16, 56]]]], ["get", "model.name", ["loc", [null, [16, 57], [16, 67]]]]], ["class", "action-button edit"], 0, null, ["loc", [null, [16, 8], [19, 20]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 25,
+ "column": 10
+ },
+ "end": {
+ "line": 25,
+ "column": 34
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("Overview");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 26,
+ "column": 10
+ },
+ "end": {
+ "line": 26,
+ "column": 45
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("Advanced Properties");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 24,
+ "column": 8
+ },
+ "end": {
+ "line": 27,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ return morphs;
+ },
+ statements: [["block", "tablist.tab", [], [], 0, null, ["loc", [null, [25, 10], [25, 50]]]], ["block", "tablist.tab", [], [], 1, null, ["loc", [null, [26, 10], [26, 61]]]]],
+ locals: ["tablist"],
+ templates: [child0, child1]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 29,
+ "column": 8
+ },
+ "end": {
+ "line": 31,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "table.bucket-props-overview", [], ["model", ["subexpr", "@mut", [["get", "model", ["loc", [null, [30, 46], [30, 51]]]]], [], []]], ["loc", [null, [30, 10], [30, 53]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 33,
+ "column": 8
+ },
+ "end": {
+ "line": 35,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "table.bucket-props-advanced", [], ["model", ["subexpr", "@mut", [["get", "model", ["loc", [null, [34, 46], [34, 51]]]]], [], []]], ["loc", [null, [34, 10], [34, 53]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 23,
+ "column": 6
+ },
+ "end": {
+ "line": 36,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "tabs.tablist", [], [], 0, null, ["loc", [null, [24, 8], [27, 25]]]], ["block", "tabs.tabpanel", [], [], 1, null, ["loc", [null, [29, 8], [31, 26]]]], ["block", "tabs.tabpanel", [], [], 2, null, ["loc", [null, [33, 8], [35, 26]]]]],
+ locals: ["tabs"],
+ templates: [child0, child1, child2]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 22,
+ "column": 4
+ },
+ "end": {
+ "line": 37,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "ivy-tabs", [], ["on-select", ["subexpr", "action", [["subexpr", "mut", [["get", "selectedIndex", ["loc", [null, [23, 41], [23, 54]]]]], [], ["loc", [null, [23, 36], [23, 55]]]]], [], ["loc", [null, [23, 28], [23, 56]]]], "selected-index", ["subexpr", "@mut", [["get", "selectedIndex", ["loc", [null, [23, 72], [23, 85]]]]], [], []]], 0, null, ["loc", [null, [23, 6], [36, 19]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 13,
+ "column": 2
+ },
+ "end": {
+ "line": 38,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Bucket Type Properties"], 0, null, ["loc", [null, [14, 4], [21, 32]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [22, 4], [37, 30]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 43,
+ "column": 10
+ },
+ "end": {
+ "line": 46,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-plus-circled");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Create New Bucket\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 48,
+ "column": 10
+ },
+ "end": {
+ "line": 53,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("button");
+ dom.setAttribute(el1, "type", "button");
+ dom.setAttribute(el1, "class", "action-button refresh");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "ion-refresh");
+ dom.setAttribute(el2, "aria-hidden", "true");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n Refresh Bucket List Cache\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element6 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element6);
+ return morphs;
+ },
+ statements: [["element", "action", ["showModal"], [], ["loc", [null, [49, 64], [49, 86]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 41,
+ "column": 4
+ },
+ "end": {
+ "line": 55,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element7 = dom.childAt(fragment, [1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(element7, 1, 1);
+ morphs[1] = dom.createMorphAt(element7, 3, 3);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["bucket.create", ["get", "model.cluster.name", ["loc", [null, [43, 37], [43, 55]]]], ["get", "model.name", ["loc", [null, [43, 56], [43, 66]]]]], ["class", "action-button create"], 0, null, ["loc", [null, [43, 10], [46, 22]]]], ["block", "if", [["get", "model.cluster.developmentMode", ["loc", [null, [48, 16], [48, 45]]]]], [], 1, null, ["loc", [null, [48, 10], [53, 17]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 57,
+ "column": 6
+ },
+ "end": {
+ "line": 59,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" No cache list exists\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 59,
+ "column": 6
+ },
+ "end": {
+ "line": 61,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "loading-spinner", [], ["statusMessage", ["subexpr", "@mut", [["get", "model.statusMessage", ["loc", [null, [60, 40], [60, 59]]]]], [], []]], ["loc", [null, [60, 8], [60, 61]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 66,
+ "column": 12
+ },
+ "end": {
+ "line": 68,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "more-info");
+ var el2 = dom.createTextNode("Hide info on explorer cached lists");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element4 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element4);
+ return morphs;
+ },
+ statements: [["element", "action", ["hideSideDrawer"], [], ["loc", [null, [67, 38], [67, 65]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 68,
+ "column": 12
+ },
+ "end": {
+ "line": 70,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "more-info");
+ var el2 = dom.createTextNode("More info on explorer cached lists");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element3 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element3);
+ return morphs;
+ },
+ statements: [["element", "action", ["showSideDrawer"], [], ["loc", [null, [69, 38], [69, 65]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 63,
+ "column": 10
+ },
+ "end": {
+ "line": 71,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" Buckets are read from a cached list and may not represent the current state of the bucket type.\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("br");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "isSideDrawerVisible", ["loc", [null, [66, 18], [66, 37]]]]], [], 0, 1, ["loc", [null, [66, 12], [70, 19]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 62,
+ "column": 8
+ },
+ "end": {
+ "line": 72,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], [], 0, null, ["loc", [null, [63, 10], [71, 30]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 81,
+ "column": 10
+ },
+ "end": {
+ "line": 86,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("Total Buckets");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 3]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "model.buckets.length", ["loc", [null, [84, 32], [84, 56]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 99,
+ "column": 24
+ },
+ "end": {
+ "line": 101,
+ "column": 24
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "bucket.name", ["loc", [null, [100, 26], [100, 41]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 97,
+ "column": 20
+ },
+ "end": {
+ "line": 103,
+ "column": 20
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link.explorer-resource", [], ["resourceType", "bucket", "resourceObj", ["subexpr", "@mut", [["get", "bucket", ["loc", [null, [99, 84], [99, 90]]]]], [], []]], 0, null, ["loc", [null, [99, 24], [101, 51]]]]],
+ locals: ["bucket"],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 92,
+ "column": 16
+ },
+ "end": {
+ "line": 105,
+ "column": 16
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ dom.setAttribute(el1, "class", "button-list");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "currentBuckets", ["loc", [null, [97, 28], [97, 42]]]]], [], 0, null, ["loc", [null, [97, 20], [103, 29]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 91,
+ "column": 14
+ },
+ "end": {
+ "line": 106,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "pagination-component", [], ["chunkSize", ["subexpr", "@mut", [["get", "pageSize", ["loc", [null, [93, 26], [93, 34]]]]], [], []], "totalSize", ["subexpr", "@mut", [["get", "model.buckets.length", ["loc", [null, [94, 26], [94, 46]]]]], [], []], "sectionRequest", "bucketsPageRequest"], 0, null, ["loc", [null, [92, 16], [105, 41]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child3 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 106,
+ "column": 14
+ },
+ "end": {
+ "line": 108,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" No buckets found in bucket type\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 61,
+ "column": 6
+ },
+ "end": {
+ "line": 113,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("table");
+ dom.setAttribute(el1, "class", "key-value-table");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tbody");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("Cached List Created");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value");
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("Buckets");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value");
+ var el5 = dom.createTextNode("\n");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode(" ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element5 = dom.childAt(fragment, [2, 1]);
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(dom.childAt(element5, [1, 3]), 0, 0);
+ morphs[2] = dom.createMorphAt(element5, 3, 3);
+ morphs[3] = dom.createMorphAt(dom.childAt(element5, [5, 3]), 1, 1);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "showCachedListWarning", ["loc", [null, [62, 14], [62, 35]]]]], [], 0, null, ["loc", [null, [62, 8], [72, 15]]]], ["content", "model.bucketList.created", ["loc", [null, [78, 30], [78, 58]]]], ["block", "if", [["get", "model.buckets.length", ["loc", [null, [81, 16], [81, 36]]]]], [], 1, null, ["loc", [null, [81, 10], [86, 17]]]], ["block", "if", [["get", "model.buckets.length", ["loc", [null, [91, 20], [91, 40]]]]], [], 2, 3, ["loc", [null, [91, 14], [108, 21]]]]],
+ locals: [],
+ templates: [child0, child1, child2, child3]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 59,
+ "column": 6
+ },
+ "end": {
+ "line": 113,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "and", [["get", "model.hasListBeenRequested", ["loc", [null, [59, 21], [59, 47]]]], ["subexpr", "not", [["get", "model.isListLoaded", ["loc", [null, [59, 53], [59, 71]]]]], [], ["loc", [null, [59, 48], [59, 72]]]]], [], ["loc", [null, [59, 16], [59, 73]]]]], [], 0, 1, ["loc", [null, [59, 6], [113, 6]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 56,
+ "column": 4
+ },
+ "end": {
+ "line": 114,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "and", [["subexpr", "not", [["get", "model.hasListBeenRequested", ["loc", [null, [57, 22], [57, 48]]]]], [], ["loc", [null, [57, 17], [57, 49]]]], ["subexpr", "not", [["get", "model.isListLoaded", ["loc", [null, [57, 55], [57, 73]]]]], [], ["loc", [null, [57, 50], [57, 74]]]]], [], ["loc", [null, [57, 12], [57, 75]]]]], [], 0, 1, ["loc", [null, [57, 6], [113, 13]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 40,
+ "column": 2
+ },
+ "end": {
+ "line": 115,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Buckets"], 0, null, ["loc", [null, [41, 4], [55, 32]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [56, 4], [114, 30]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child3 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 120,
+ "column": 2
+ },
+ "end": {
+ "line": 143,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "modal-content-container");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("header");
+ dom.setAttribute(el2, "class", "modal-header");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("h3");
+ var el4 = dom.createElement("span");
+ dom.setAttribute(el4, "class", "label label-danger");
+ var el5 = dom.createElement("i");
+ dom.setAttribute(el5, "class", "ion-alert-circled");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode(" Potentially Dangerous Operation");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("section");
+ dom.setAttribute(el2, "class", "modal-body");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("p");
+ var el4 = dom.createTextNode("Creating a new cache list requires making a streaming call, with multiple response messages sent for each\n request.");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("p");
+ var el4 = dom.createTextNode("This can be an expensive operation, and is not recommended if the node is in active use. To\n continue please click the confirm button.");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("footer");
+ dom.setAttribute(el2, "class", "modal-footer");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("button");
+ dom.setAttribute(el3, "class", "btn btn-default");
+ var el4 = dom.createTextNode("Cancel");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("button");
+ dom.setAttribute(el3, "class", "btn btn-primary");
+ var el4 = dom.createTextNode("Confirm");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1, 5]);
+ var element1 = dom.childAt(element0, [1]);
+ var element2 = dom.childAt(element0, [3]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createElementMorph(element1);
+ morphs[1] = dom.createElementMorph(element2);
+ return morphs;
+ },
+ statements: [["element", "action", ["hideModal"], [], ["loc", [null, [139, 40], [139, 62]]]], ["element", "action", ["refreshBucketList", ["get", "model", ["loc", [null, [140, 69], [140, 74]]]]], [], ["loc", [null, [140, 40], [140, 76]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 119,
+ "column": 0
+ },
+ "end": {
+ "line": 144,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "modal-dialog", [], ["close", "hideModal", "translucentOverlay", true], 0, null, ["loc", [null, [120, 2], [143, 19]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child4 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 148,
+ "column": 2
+ },
+ "end": {
+ "line": 152,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "render", ["partials.cached-lists"], [], ["loc", [null, [151, 4], [151, 38]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 147,
+ "column": 0
+ },
+ "end": {
+ "line": 153,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "side-drawer", [], ["label", "Explorer Cached Lists", "visible", ["subexpr", "@mut", [["get", "isSideDrawerVisible", ["loc", [null, [150, 10], [150, 29]]]]], [], []]], 0, null, ["loc", [null, [148, 2], [152, 18]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 153,
+ "column": 19
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket-type/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "bucket-types-container");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element8 = dom.childAt(fragment, [2]);
+ var morphs = new Array(5);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(element8, 1, 1);
+ morphs[2] = dom.createMorphAt(element8, 3, 3);
+ morphs[3] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ morphs[4] = dom.createMorphAt(fragment, 6, 6, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.warnings", ["loc", [null, [1, 6], [1, 20]]]]], [], 0, null, ["loc", [null, [1, 0], [10, 7]]]], ["block", "dashboard-module.container", [], ["class", "medium-width"], 1, null, ["loc", [null, [13, 2], [38, 33]]]], ["block", "dashboard-module.container", [], ["class", "medium-width"], 2, null, ["loc", [null, [40, 2], [115, 33]]]], ["block", "if", [["get", "modalVisible", ["loc", [null, [119, 6], [119, 18]]]]], [], 3, null, ["loc", [null, [119, 0], [144, 7]]]], ["block", "ember-wormhole", [], ["to", "side-drawer-container"], 4, null, ["loc", [null, [147, 0], [153, 19]]]]],
+ locals: [],
+ templates: [child0, child1, child2, child3, child4]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/bucket/controller', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/side-drawer', 'ember-riak-explorer/mixins/controller/modal'], function (exports, _ember, _emberRiakExplorerMixinsControllerSideDrawer, _emberRiakExplorerMixinsControllerModal) {
+ exports['default'] = _ember['default'].Controller.extend(_emberRiakExplorerMixinsControllerSideDrawer['default'], _emberRiakExplorerMixinsControllerModal['default'], {
+ pageSize: null,
+
+ currentObjects: null,
+
+ showCachedListWarning: true
+ });
+});
+define('ember-riak-explorer/pods/bucket/create/controller', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Controller.extend({
+ properties: [],
+
+ showSpinner: false,
+
+ spinnerMessage: 'loading ...',
+
+ errors: [],
+
+ clearState: function clearState() {
+ this.set('showSpinner', false);
+ this.set('properties', []);
+ this.set('errors', []);
+ }
+ });
+});
+define('ember-riak-explorer/pods/bucket/create/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/alerts', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state', 'ember-riak-explorer/utils/validations', 'ember-riak-explorer/utils/riak-object-formatter', 'lodash/lodash'], function (exports, _ember, _emberRiakExplorerMixinsRoutesAlerts, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState, _emberRiakExplorerUtilsValidations, _emberRiakExplorerUtilsRiakObjectFormatter, _lodashLodash) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesAlerts['default'], _emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ model: function model(params) {
+ var self = this;
+
+ return this.explorer.getBucketType(params.clusterName, params.bucketTypeName).then(function (bucketType) {
+ // Create both bucket and riak object
+ var bucket = self.store.createRecord('bucket', {
+ bucketType: bucketType,
+ name: ''
+ });
+
+ var riakObject = self.store.createRecord('riak-object', {
+ bucket: bucket,
+ type: bucketType.get('dataTypeName')
+ });
+
+ return bucket;
+ });
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ bucketType: model.get('bucketType'),
+ crudAction: 'create bucket'
+ });
+ this.setViewLabel({
+ preLabel: 'Create Bucket'
+ });
+ },
+
+ isValidBucket: function isValidBucket(bucket) {
+ var bucketName = bucket.get('name');
+
+ return _emberRiakExplorerUtilsValidations['default'].hasName('bucket', bucketName) && _emberRiakExplorerUtilsValidations['default'].noWhiteSpaceInName('bucket', bucketName);
+ },
+
+ isValidObject: function isValidObject(object) {
+ var objectType = object.get('type');
+ var objectName = object.get('name');
+
+ return _emberRiakExplorerUtilsValidations['default'].hasName('buckets object', objectName) && _emberRiakExplorerUtilsValidations['default'].noWhiteSpaceInName('buckets object', objectName) && _emberRiakExplorerUtilsValidations['default'].objectHasCorrectValueType(objectType, objectName, _emberRiakExplorerUtilsValidations['default'].isJsonParseable(object.get('contents')));
+ },
+
+ isValid: function isValid(bucket, object) {
+ var isValid = undefined;
+
+ try {
+ isValid = this.isValidBucket(bucket) && this.isValidObject(object);
+ } catch (e) {
+ this.controller.get('errors').pushObject(e.message);
+ this.scrollToTop();
+ }
+
+ return isValid;
+ },
+
+ bucketsFirstObject: function bucketsFirstObject(bucket) {
+ return _lodashLodash['default'].head(bucket.get('objects').toArray());
+ },
+
+ actions: {
+ didTransition: function didTransition() {
+ this.controller.set('errors', []);
+ this.controller.set('showSpinner', false);
+ },
+
+ createBucket: function createBucket() {
+ var self = this;
+ var controller = this.controller;
+ var bucket = this.currentModel;
+ var riakObject = this.bucketsFirstObject(bucket);
+ var clusterName = bucket.get('cluster').get('name');
+ var bucketType = bucket.get('bucketType');
+ var bucketTypeName = bucketType.get('name');
+ var bucketName = bucket.get('name');
+ var objectName = riakObject.get('name');
+
+ controller.set('errors', []);
+
+ if (this.isValid(bucket, riakObject)) {
+ var contents = riakObject.set('contents', _emberRiakExplorerUtilsValidations['default'].isJsonParseable(riakObject.get('contents'))); // set contents of the object as the JSON parsed version;
+ var serializedData = _emberRiakExplorerUtilsRiakObjectFormatter['default'].formatRiakObject(riakObject.get('type'), contents);
+ var createBucket = bucketType.get('isCRDT') ? _lodashLodash['default'].partial(this.explorer.createCRDT, clusterName, bucketTypeName, bucketName, objectName, serializedData) : _lodashLodash['default'].bind(riakObject.save, riakObject);
+
+ controller.set('spinnerMessage', 'Creating Bucket-Type ...');
+ controller.set('showSpinner', true);
+
+ // createBucket()
+ createBucket().then(function () {
+ return _ember['default'].RSVP.allSettled([self.explorer.refreshBucketList(bucketType), self.explorer.refreshObjectList(bucket)]);
+ }).then(function onSuccess() {
+ self.transitionTo('bucket', clusterName, bucketTypeName, bucketName);
+ }, function onFail() {
+ controller.set('showSpinner', false);
+ // TODO: Don't use template
+ self.render('alerts.error-request-was-not-processed', {
+ into: 'application',
+ outlet: 'alert'
+ });
+ });
+ }
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/bucket/create/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 5,
+ "column": 6
+ },
+ "end": {
+ "line": 7,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createUnsafeMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "error", ["loc", [null, [6, 12], [6, 23]]]]],
+ locals: ["error"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 9,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "label label-danger");
+ var el3 = dom.createTextNode("Errors");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "errors", ["loc", [null, [5, 14], [5, 20]]]]], [], 0, null, ["loc", [null, [5, 6], [7, 15]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 10,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "danger"], 0, null, ["loc", [null, [2, 2], [9, 22]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 15,
+ "column": 6
+ },
+ "end": {
+ "line": 18,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-close-round");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Cancel\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 13,
+ "column": 2
+ },
+ "end": {
+ "line": 20,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link.explorer-resource", [], ["resourceType", "bucket-type", "resourceObj", ["subexpr", "@mut", [["get", "model.bucketType", ["loc", [null, [15, 71], [15, 87]]]]], [], []], "linkClass", "cancel action-button"], 0, null, ["loc", [null, [15, 6], [18, 33]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 22,
+ "column": 4
+ },
+ "end": {
+ "line": 24,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "loading-spinner", [], ["statusMessage", ["subexpr", "@mut", [["get", "spinnerMessage", ["loc", [null, [23, 38], [23, 52]]]]], [], []]], ["loc", [null, [23, 6], [23, 54]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 25,
+ "column": 6
+ },
+ "end": {
+ "line": 28,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "form.explorer-input", [], ["label", "Name", "value", ["subexpr", "@mut", [["get", "model.name", ["loc", [null, [26, 49], [26, 59]]]]], [], []]], ["loc", [null, [26, 8], [26, 61]]]], ["inline", "form.add-custom-properties", [], ["properties", ["subexpr", "@mut", [["get", "properties", ["loc", [null, [27, 48], [27, 58]]]]], [], []]], ["loc", [null, [27, 8], [27, 60]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 30,
+ "column": 6
+ },
+ "end": {
+ "line": 32,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" In order to be created, a bucket must contain at least one object. Create that first object below.\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 35,
+ "column": 8
+ },
+ "end": {
+ "line": 37,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "new-object-inputs", [], ["object", ["subexpr", "@mut", [["get", "object", ["loc", [null, [36, 37], [36, 43]]]]], [], []]], ["loc", [null, [36, 10], [36, 45]]]]],
+ locals: ["object"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 34,
+ "column": 6
+ },
+ "end": {
+ "line": 38,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "model.objects", ["loc", [null, [35, 16], [35, 29]]]]], [], 0, null, ["loc", [null, [35, 8], [37, 17]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 24,
+ "column": 4
+ },
+ "end": {
+ "line": 41,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.section", [], ["title", "Bucket Info"], 0, null, ["loc", [null, [25, 6], [28, 35]]]], ["block", "alert-component", [], ["type", "info"], 1, null, ["loc", [null, [30, 6], [32, 26]]]], ["block", "dashboard-module.section", [], ["title", "Object Info"], 2, null, ["loc", [null, [34, 6], [38, 35]]]], ["inline", "form.explorer-button", [], ["label", "Create Bucket", "buttonClick", "createBucket"], ["loc", [null, [40, 6], [40, 79]]]]],
+ locals: [],
+ templates: [child0, child1, child2]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 21,
+ "column": 2
+ },
+ "end": {
+ "line": 42,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "showSpinner", ["loc", [null, [22, 10], [22, 21]]]]], [], 0, 1, ["loc", [null, [22, 4], [41, 11]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 12,
+ "column": 0
+ },
+ "end": {
+ "line": 43,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Create Bucket Form"], 0, null, ["loc", [null, [13, 2], [20, 30]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [21, 2], [42, 28]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 44,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "errors", ["loc", [null, [1, 6], [1, 12]]]]], [], 0, null, ["loc", [null, [1, 0], [10, 7]]]], ["block", "dashboard-module.container", [], ["class", "medium-width bucket-create-container"], 1, null, ["loc", [null, [12, 0], [43, 31]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/bucket/model', ['exports', 'ember-data', 'ember-riak-explorer/mixins/models/bucket-props', 'ember-riak-explorer/mixins/models/cached-list-watcher'], function (exports, _emberData, _emberRiakExplorerMixinsModelsBucketProps, _emberRiakExplorerMixinsModelsCachedListWatcher) {
+
+ /**
+ * Represents a Riak Bucket
+ *
+ * @class Bucket
+ * @extends DS.Model
+ * @extends BucketProps
+ * @uses BucketType
+ * @uses ObjectList
+ * @uses Objects
+ */
+ var Bucket = _emberData['default'].Model.extend(_emberRiakExplorerMixinsModelsBucketProps['default'], _emberRiakExplorerMixinsModelsCachedListWatcher['default'], {
+ /**
+ * Riak Bucket Type in which this bucket lives.
+ *
+ * @property bucketType
+ * @type BucketType
+ * @writeOnce
+ */
+ bucketType: _emberData['default'].belongsTo('bucket-type'),
+
+ /**
+ * Contains the results of cached key lists for this bucket,
+ * fetched from the API.
+ *
+ * @property key-list
+ * @type objectList
+ */
+ objectList: _emberData['default'].belongsTo('object-list'),
+
+ objects: _emberData['default'].hasMany('riak-object'),
+
+ /**
+ * Bucket name (unique within a cluster and bucket type)
+ *
+ * @property name
+ * @type String
+ */
+ name: _emberData['default'].attr('string'),
+
+ cluster: (function () {
+ return this.get('bucketType').get('cluster');
+ }).property('bucketType'),
+
+ /**
+ * Returns whether or not the 'Delete All Keys in Bucket' button
+ * should be displayed to the user.
+ * @method allowDelete
+ * @return {Boolean}
+ */
+ allowDelete: (function () {
+ return this.get('cluster').get('developmentMode') && this.get('objectList');
+ }).property('cluster', 'count')
+ });
+
+ exports['default'] = Bucket;
+});
+define('ember-riak-explorer/pods/bucket/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/polling', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesPolling, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesPolling['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ objectsPaging: {
+ size: 10,
+ initialLow: 0,
+ initialHigh: 9
+ },
+
+ model: function model(params) {
+ return this.explorer.getBucket(params.clusterName, params.bucketTypeName, params.bucketName);
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ bucketType: model.get('bucketType'),
+ bucket: model
+ });
+ this.setViewLabel({
+ preLabel: 'Bucket',
+ label: model.get('name')
+ });
+ },
+
+ setupController: function setupController(controller, model) {
+ var page = this.get('objectsPaging');
+
+ this._super(controller, model);
+ this.controller.set('pageSize', page.size);
+ this.controller.set('currentObjects', this.objectsFromRange(page.initialLow, page.initialHigh));
+ },
+
+ objectsFromRange: function objectsFromRange(startIndex, endIndex) {
+ return this.currentModel.get('objects').filter(function (bucket, index) {
+ return index >= startIndex && index <= endIndex;
+ });
+ },
+
+ lookForNewObjectsList: function lookForNewObjectsList() {
+ var self = this;
+ var bucket = this.currentModel;
+ var page = this.get('objectsPaging');
+
+ this.explorer.getObjectList(bucket).then(function () {
+ return self.explorer.getObjects(bucket);
+ }).then(function () {
+ self.controller.set('currentObjects', self.objectsFromRange(page.initialLow, page.initialHigh));
+ self.stopPolling();
+ });
+ },
+
+ actions: {
+ deleteBucket: function deleteBucket(bucket) {
+ var clusterName = bucket.get('bucketType').get('cluster').get('name');
+ var bucketTypeName = bucket.get('bucketType').get('name');
+ var self = this;
+
+ bucket.destroyRecord().then(function () {
+ self.transitionTo('bucket-type', clusterName, bucketTypeName);
+ });
+ },
+
+ refreshObjectList: function refreshObjectList(bucket) {
+ var self = this;
+
+ this.controller.set('modalVisible', false);
+ this.controller.set('showCachedListWarning', false);
+
+ return this.explorer.refreshObjectList(bucket).then(function () {
+ self.startPolling(self.lookForNewObjectsList.bind(self));
+ });
+ },
+
+ objectsPageRequest: function objectsPageRequest(lowIndex, highIndex) {
+ this.controller.set('currentObjects', this.objectsFromRange(lowIndex, highIndex));
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/bucket/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 5,
+ "column": 6
+ },
+ "end": {
+ "line": 7,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "warning", ["loc", [null, [6, 12], [6, 23]]]]],
+ locals: ["warning"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 9,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("h4");
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "label label-warning");
+ var el4 = dom.createTextNode("WARNINGS");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 3, 3);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "model.warnings", ["loc", [null, [5, 14], [5, 28]]]]], [], 0, null, ["loc", [null, [5, 6], [7, 15]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 10,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "warning"], 0, null, ["loc", [null, [2, 2], [9, 22]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 16,
+ "column": 8
+ },
+ "end": {
+ "line": 21,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("button");
+ dom.setAttribute(el1, "type", "button");
+ dom.setAttribute(el1, "class", "action-button delete");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "ion-ios-trash");
+ dom.setAttribute(el2, "aria-hidden", "true");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n Delete Bucket\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element8 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element8);
+ return morphs;
+ },
+ statements: [["element", "action", ["deleteBucket", ["get", "model", ["loc", [null, [17, 85], [17, 90]]]]], [], ["loc", [null, [17, 61], [17, 92]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 14,
+ "column": 4
+ },
+ "end": {
+ "line": 23,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.allowDelete", ["loc", [null, [16, 14], [16, 31]]]]], [], 0, null, ["loc", [null, [16, 8], [21, 15]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 28,
+ "column": 10
+ },
+ "end": {
+ "line": 28,
+ "column": 34
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("Overview");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 29,
+ "column": 10
+ },
+ "end": {
+ "line": 29,
+ "column": 45
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("Advanced Properties");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 27,
+ "column": 8
+ },
+ "end": {
+ "line": 30,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ return morphs;
+ },
+ statements: [["block", "tablist.tab", [], [], 0, null, ["loc", [null, [28, 10], [28, 50]]]], ["block", "tablist.tab", [], [], 1, null, ["loc", [null, [29, 10], [29, 61]]]]],
+ locals: ["tablist"],
+ templates: [child0, child1]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 32,
+ "column": 8
+ },
+ "end": {
+ "line": 34,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "table.bucket-props-overview", [], ["model", ["subexpr", "@mut", [["get", "model", ["loc", [null, [33, 46], [33, 51]]]]], [], []]], ["loc", [null, [33, 10], [33, 53]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 36,
+ "column": 8
+ },
+ "end": {
+ "line": 38,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "table.bucket-props-advanced", [], ["model", ["subexpr", "@mut", [["get", "model", ["loc", [null, [37, 46], [37, 51]]]]], [], []]], ["loc", [null, [37, 10], [37, 53]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 26,
+ "column": 6
+ },
+ "end": {
+ "line": 39,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "tabs.tablist", [], [], 0, null, ["loc", [null, [27, 8], [30, 25]]]], ["block", "tabs.tabpanel", [], [], 1, null, ["loc", [null, [32, 8], [34, 26]]]], ["block", "tabs.tabpanel", [], [], 2, null, ["loc", [null, [36, 8], [38, 26]]]]],
+ locals: ["tabs"],
+ templates: [child0, child1, child2]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 25,
+ "column": 4
+ },
+ "end": {
+ "line": 40,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "ivy-tabs", [], ["on-select", ["subexpr", "action", [["subexpr", "mut", [["get", "selectedIndex", ["loc", [null, [26, 41], [26, 54]]]]], [], ["loc", [null, [26, 36], [26, 55]]]]], [], ["loc", [null, [26, 28], [26, 56]]]], "selected-index", ["subexpr", "@mut", [["get", "selectedIndex", ["loc", [null, [26, 72], [26, 85]]]]], [], []]], 0, null, ["loc", [null, [26, 6], [39, 19]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 13,
+ "column": 2
+ },
+ "end": {
+ "line": 41,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Bucket Properties"], 0, null, ["loc", [null, [14, 4], [23, 32]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [25, 4], [40, 30]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 46,
+ "column": 8
+ },
+ "end": {
+ "line": 49,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-plus-circled");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Create New Object\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 51,
+ "column": 8
+ },
+ "end": {
+ "line": 56,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("button");
+ dom.setAttribute(el1, "type", "button");
+ dom.setAttribute(el1, "class", "action-button refresh");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "ion-refresh");
+ dom.setAttribute(el2, "aria-hidden", "true");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n Refresh Object List Cache\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element6 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element6);
+ return morphs;
+ },
+ statements: [["element", "action", ["showModal"], [], ["loc", [null, [52, 62], [52, 84]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 44,
+ "column": 4
+ },
+ "end": {
+ "line": 58,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element7 = dom.childAt(fragment, [1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(element7, 1, 1);
+ morphs[1] = dom.createMorphAt(element7, 3, 3);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["riak-object.create", ["get", "model.cluster.name", ["loc", [null, [46, 40], [46, 58]]]], ["get", "model.bucketType.name", ["loc", [null, [46, 59], [46, 80]]]], ["get", "model.name", ["loc", [null, [46, 81], [46, 91]]]]], ["class", "action-button create"], 0, null, ["loc", [null, [46, 8], [49, 20]]]], ["block", "if", [["get", "model.cluster.developmentMode", ["loc", [null, [51, 14], [51, 43]]]]], [], 1, null, ["loc", [null, [51, 8], [56, 15]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 60,
+ "column": 6
+ },
+ "end": {
+ "line": 62,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" No cache list exists\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 62,
+ "column": 6
+ },
+ "end": {
+ "line": 64,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "loading-spinner", [], ["statusMessage", ["subexpr", "@mut", [["get", "model.statusMessage", ["loc", [null, [63, 40], [63, 59]]]]], [], []]], ["loc", [null, [63, 8], [63, 61]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 69,
+ "column": 12
+ },
+ "end": {
+ "line": 71,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "more-info");
+ var el2 = dom.createTextNode("Hide info on explorer cached lists");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element4 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element4);
+ return morphs;
+ },
+ statements: [["element", "action", ["hideSideDrawer"], [], ["loc", [null, [70, 38], [70, 65]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 71,
+ "column": 12
+ },
+ "end": {
+ "line": 73,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "more-info");
+ var el2 = dom.createTextNode("More info on explorer cached lists");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element3 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element3);
+ return morphs;
+ },
+ statements: [["element", "action", ["showSideDrawer"], [], ["loc", [null, [72, 38], [72, 65]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 66,
+ "column": 10
+ },
+ "end": {
+ "line": 74,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" Objects are read from a cached list and may not represent the current state of the bucket type.\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("br");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "isSideDrawerVisible", ["loc", [null, [69, 18], [69, 37]]]]], [], 0, 1, ["loc", [null, [69, 12], [73, 19]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 65,
+ "column": 8
+ },
+ "end": {
+ "line": 75,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], [], 0, null, ["loc", [null, [66, 10], [74, 30]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 84,
+ "column": 10
+ },
+ "end": {
+ "line": 89,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("Total Objects");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 3]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "model.objects.length", ["loc", [null, [87, 32], [87, 56]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 102,
+ "column": 24
+ },
+ "end": {
+ "line": 108,
+ "column": 24
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "object.name", ["loc", [null, [107, 26], [107, 41]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 100,
+ "column": 20
+ },
+ "end": {
+ "line": 110,
+ "column": 20
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link-to", [["get", "object.routePath", ["loc", [null, [102, 35], [102, 51]]]], ["get", "object.bucket.bucketType.cluster.name", ["loc", [null, [103, 24], [103, 61]]]], ["get", "object.bucket.bucketType.name", ["loc", [null, [104, 24], [104, 53]]]], ["get", "object.bucket.name", ["loc", [null, [105, 24], [105, 42]]]], ["get", "object.name", ["loc", [null, [106, 24], [106, 35]]]]], [], 0, null, ["loc", [null, [102, 24], [108, 36]]]]],
+ locals: ["object"],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 95,
+ "column": 16
+ },
+ "end": {
+ "line": 112,
+ "column": 16
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ dom.setAttribute(el1, "class", "button-list");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "currentObjects", ["loc", [null, [100, 28], [100, 42]]]]], [], 0, null, ["loc", [null, [100, 20], [110, 29]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 94,
+ "column": 14
+ },
+ "end": {
+ "line": 113,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "pagination-component", [], ["chunkSize", ["subexpr", "@mut", [["get", "pageSize", ["loc", [null, [96, 26], [96, 34]]]]], [], []], "totalSize", ["subexpr", "@mut", [["get", "model.objects.length", ["loc", [null, [97, 26], [97, 46]]]]], [], []], "sectionRequest", "objectsPageRequest"], 0, null, ["loc", [null, [95, 16], [112, 41]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child3 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 113,
+ "column": 14
+ },
+ "end": {
+ "line": 115,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" No objects found in bucket\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 64,
+ "column": 6
+ },
+ "end": {
+ "line": 120,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("table");
+ dom.setAttribute(el1, "class", "key-value-table");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tbody");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("Cached List Created");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value");
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("Objects");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value");
+ var el5 = dom.createTextNode("\n");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode(" ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element5 = dom.childAt(fragment, [2, 1]);
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(dom.childAt(element5, [1, 3]), 0, 0);
+ morphs[2] = dom.createMorphAt(element5, 3, 3);
+ morphs[3] = dom.createMorphAt(dom.childAt(element5, [5, 3]), 1, 1);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "showCachedListWarning", ["loc", [null, [65, 14], [65, 35]]]]], [], 0, null, ["loc", [null, [65, 8], [75, 15]]]], ["content", "model.objectList.created", ["loc", [null, [81, 30], [81, 58]]]], ["block", "if", [["get", "model.objects.length", ["loc", [null, [84, 16], [84, 36]]]]], [], 1, null, ["loc", [null, [84, 10], [89, 17]]]], ["block", "if", [["get", "model.objects.length", ["loc", [null, [94, 20], [94, 40]]]]], [], 2, 3, ["loc", [null, [94, 14], [115, 21]]]]],
+ locals: [],
+ templates: [child0, child1, child2, child3]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 62,
+ "column": 6
+ },
+ "end": {
+ "line": 120,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "and", [["get", "model.hasListBeenRequested", ["loc", [null, [62, 21], [62, 47]]]], ["subexpr", "not", [["get", "model.isListLoaded", ["loc", [null, [62, 53], [62, 71]]]]], [], ["loc", [null, [62, 48], [62, 72]]]]], [], ["loc", [null, [62, 16], [62, 73]]]]], [], 0, 1, ["loc", [null, [62, 6], [120, 6]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 59,
+ "column": 4
+ },
+ "end": {
+ "line": 121,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "and", [["subexpr", "not", [["get", "model.hasListBeenRequested", ["loc", [null, [60, 22], [60, 48]]]]], [], ["loc", [null, [60, 17], [60, 49]]]], ["subexpr", "not", [["get", "model.isListLoaded", ["loc", [null, [60, 55], [60, 73]]]]], [], ["loc", [null, [60, 50], [60, 74]]]]], [], ["loc", [null, [60, 12], [60, 75]]]]], [], 0, 1, ["loc", [null, [60, 6], [120, 13]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 43,
+ "column": 2
+ },
+ "end": {
+ "line": 122,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Objects"], 0, null, ["loc", [null, [44, 4], [58, 32]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [59, 4], [121, 30]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child3 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 128,
+ "column": 2
+ },
+ "end": {
+ "line": 151,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "modal-content-container");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("header");
+ dom.setAttribute(el2, "class", "modal-header");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("h3");
+ var el4 = dom.createElement("span");
+ dom.setAttribute(el4, "class", "label label-danger");
+ var el5 = dom.createElement("i");
+ dom.setAttribute(el5, "class", "ion-alert-circled");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode(" Potentially Dangerous Operation");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("section");
+ dom.setAttribute(el2, "class", "modal-body");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("p");
+ var el4 = dom.createTextNode("Creating a new cache list requires making a streaming call, with multiple response messages sent for each\n request.");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("p");
+ var el4 = dom.createTextNode("This can be an expensive operation, and is not recommended if the node is in active use. To\n continue please click the confirm button.");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("footer");
+ dom.setAttribute(el2, "class", "modal-footer");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("button");
+ dom.setAttribute(el3, "class", "btn btn-default");
+ var el4 = dom.createTextNode("Cancel");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("button");
+ dom.setAttribute(el3, "class", "btn btn-primary");
+ var el4 = dom.createTextNode("Confirm");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1, 5]);
+ var element1 = dom.childAt(element0, [1]);
+ var element2 = dom.childAt(element0, [3]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createElementMorph(element1);
+ morphs[1] = dom.createElementMorph(element2);
+ return morphs;
+ },
+ statements: [["element", "action", ["hideModal"], [], ["loc", [null, [147, 40], [147, 62]]]], ["element", "action", ["refreshObjectList", ["get", "model", ["loc", [null, [148, 69], [148, 74]]]]], [], ["loc", [null, [148, 40], [148, 76]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 127,
+ "column": 0
+ },
+ "end": {
+ "line": 152,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "modal-dialog", [], ["close", "hideModal", "translucentOverlay", true], 0, null, ["loc", [null, [128, 2], [151, 19]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child4 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 156,
+ "column": 2
+ },
+ "end": {
+ "line": 160,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "render", ["partials.cached-lists"], [], ["loc", [null, [159, 4], [159, 38]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 155,
+ "column": 0
+ },
+ "end": {
+ "line": 161,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "side-drawer", [], ["label", "Explorer Cached Lists", "visible", ["subexpr", "@mut", [["get", "isSideDrawerVisible", ["loc", [null, [158, 10], [158, 29]]]]], [], []]], 0, null, ["loc", [null, [156, 2], [160, 18]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 161,
+ "column": 19
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/bucket/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "bucket-types-container");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element9 = dom.childAt(fragment, [2]);
+ var morphs = new Array(5);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(element9, 1, 1);
+ morphs[2] = dom.createMorphAt(element9, 3, 3);
+ morphs[3] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ morphs[4] = dom.createMorphAt(fragment, 6, 6, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.warnings", ["loc", [null, [1, 6], [1, 20]]]]], [], 0, null, ["loc", [null, [1, 0], [10, 7]]]], ["block", "dashboard-module.container", [], ["class", "medium-width"], 1, null, ["loc", [null, [13, 2], [41, 33]]]], ["block", "dashboard-module.container", [], ["class", "medium-width"], 2, null, ["loc", [null, [43, 2], [122, 33]]]], ["block", "if", [["get", "modalVisible", ["loc", [null, [127, 6], [127, 18]]]]], [], 3, null, ["loc", [null, [127, 0], [152, 7]]]], ["block", "ember-wormhole", [], ["to", "side-drawer-container"], 4, null, ["loc", [null, [155, 0], [161, 19]]]]],
+ locals: [],
+ templates: [child0, child1, child2, child3, child4]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/cluster/controller', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Controller.extend({
+ pageSize: null,
+
+ currentPageTables: null,
+
+ currentPageActiveBucketTypes: null,
+
+ currentPageInactiveBucketTypes: null,
+
+ currentPageIndexes: null
+ });
+});
+define('ember-riak-explorer/pods/cluster/data/route', ['exports', 'ember-riak-explorer/pods/cluster/route'], function (exports, _emberRiakExplorerPodsClusterRoute) {
+ exports['default'] = _emberRiakExplorerPodsClusterRoute['default'].extend({
+ afterModel: function afterModel(model, transition) {
+ this._super(model, transition);
+ this.setViewLabel({
+ preLabel: 'Cluster Data',
+ label: model.get('name')
+ });
+ }
+ });
+});
+define("ember-riak-explorer/pods/cluster/data/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 15,
+ "column": 12
+ },
+ "end": {
+ "line": 17,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" On\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 17,
+ "column": 12
+ },
+ "end": {
+ "line": 19,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" Off\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 4,
+ "column": 4
+ },
+ "end": {
+ "line": 33,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("table");
+ dom.setAttribute(el1, "class", "key-value-table");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tbody");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("Status");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value");
+ var el5 = dom.createElement("span");
+ var el6 = dom.createComment("");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("Development Mode");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value");
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("\n");
+ dom.appendChild(el5, el6);
+ var el6 = dom.createComment("");
+ dom.appendChild(el5, el6);
+ var el6 = dom.createTextNode(" ");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("Edition Type");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value");
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("\n ");
+ dom.appendChild(el5, el6);
+ var el6 = dom.createComment("");
+ dom.appendChild(el5, el6);
+ var el6 = dom.createTextNode("\n ");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1, 1]);
+ var element1 = dom.childAt(element0, [1, 3, 0]);
+ var morphs = new Array(4);
+ morphs[0] = dom.createAttrMorph(element1, 'class');
+ morphs[1] = dom.createMorphAt(element1, 0, 0);
+ morphs[2] = dom.createMorphAt(dom.childAt(element0, [3, 3, 1]), 1, 1);
+ morphs[3] = dom.createMorphAt(dom.childAt(element0, [5, 3, 1]), 1, 1);
+ return morphs;
+ },
+ statements: [["attribute", "class", ["concat", ["cluster-status cluster-status-label ", ["get", "model.status", ["loc", [null, [9, 77], [9, 89]]]]]]], ["content", "model.status", ["loc", [null, [9, 93], [9, 109]]]], ["block", "if", [["get", "model.developmentMode", ["loc", [null, [15, 18], [15, 39]]]]], [], 0, 1, ["loc", [null, [15, 12], [19, 19]]]], ["content", "model.riakTypeLong", ["loc", [null, [27, 12], [27, 34]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 34,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["inline", "dashboard-module.header", [], ["label", "Cluster Properties"], ["loc", [null, [3, 4], [3, 58]]]], ["block", "dashboard-module.body", [], [], 0, null, ["loc", [null, [4, 4], [33, 30]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 40,
+ "column": 10
+ },
+ "end": {
+ "line": 43,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-plus-circled");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Create New Table\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 38,
+ "column": 6
+ },
+ "end": {
+ "line": 45,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["table.create", ["get", "model.name", ["loc", [null, [40, 36], [40, 46]]]]], ["class", "action-button create"], 0, null, ["loc", [null, [40, 10], [43, 22]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 48,
+ "column": 10
+ },
+ "end": {
+ "line": 53,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "table.ts-tables", [], ["tables", ["subexpr", "@mut", [["get", "currentPageTables", ["loc", [null, [52, 37], [52, 54]]]]], [], []]], ["loc", [null, [52, 12], [52, 56]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 47,
+ "column": 8
+ },
+ "end": {
+ "line": 54,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "pagination-component", [], ["chunkSize", ["subexpr", "@mut", [["get", "pageSize", ["loc", [null, [49, 20], [49, 28]]]]], [], []], "totalSize", ["subexpr", "@mut", [["get", "model.tables.length", ["loc", [null, [50, 20], [50, 39]]]]], [], []], "sectionRequest", "tablePageRequest"], 0, null, ["loc", [null, [48, 10], [53, 35]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 54,
+ "column": 8
+ },
+ "end": {
+ "line": 56,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("No Time Series tables have been created on this cluster");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 46,
+ "column": 6
+ },
+ "end": {
+ "line": 57,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.tables", ["loc", [null, [47, 14], [47, 26]]]]], [], 0, 1, ["loc", [null, [47, 8], [56, 15]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 37,
+ "column": 4
+ },
+ "end": {
+ "line": 58,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "TS Tables"], 0, null, ["loc", [null, [38, 6], [45, 34]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [46, 6], [57, 32]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 36,
+ "column": 2
+ },
+ "end": {
+ "line": 59,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], ["class", "medium-width"], 0, null, ["loc", [null, [37, 4], [58, 35]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 64,
+ "column": 8
+ },
+ "end": {
+ "line": 67,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-plus-circled");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Create New Bucket Type\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 62,
+ "column": 4
+ },
+ "end": {
+ "line": 69,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["bucket-type.create", ["get", "model.name", ["loc", [null, [64, 40], [64, 50]]]]], ["class", "action-button create"], 0, null, ["loc", [null, [64, 8], [67, 20]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 73,
+ "column": 12
+ },
+ "end": {
+ "line": 73,
+ "column": 47
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("Active Bucket Types");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 74,
+ "column": 12
+ },
+ "end": {
+ "line": 74,
+ "column": 49
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("Inactive Bucket Types");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 72,
+ "column": 10
+ },
+ "end": {
+ "line": 75,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ return morphs;
+ },
+ statements: [["block", "tablist.tab", [], [], 0, null, ["loc", [null, [73, 12], [73, 63]]]], ["block", "tablist.tab", [], [], 1, null, ["loc", [null, [74, 12], [74, 65]]]]],
+ locals: ["tablist"],
+ templates: [child0, child1]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 79,
+ "column": 14
+ },
+ "end": {
+ "line": 84,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "table.bucket-types", [], ["bucketTypes", ["subexpr", "@mut", [["get", "currentPageActiveBucketTypes", ["loc", [null, [83, 49], [83, 77]]]]], [], []]], ["loc", [null, [83, 16], [83, 79]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 78,
+ "column": 12
+ },
+ "end": {
+ "line": 85,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "pagination-component", [], ["chunkSize", ["subexpr", "@mut", [["get", "pageSize", ["loc", [null, [80, 24], [80, 32]]]]], [], []], "totalSize", ["subexpr", "@mut", [["get", "model.activeBucketTypes.length", ["loc", [null, [81, 24], [81, 54]]]]], [], []], "sectionRequest", "activeBucketTypesPageRequest"], 0, null, ["loc", [null, [79, 14], [84, 39]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 85,
+ "column": 12
+ },
+ "end": {
+ "line": 87,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("No bucket types have been activated");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 77,
+ "column": 10
+ },
+ "end": {
+ "line": 88,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.activeBucketTypes", ["loc", [null, [78, 18], [78, 41]]]]], [], 0, 1, ["loc", [null, [78, 12], [87, 19]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 92,
+ "column": 14
+ },
+ "end": {
+ "line": 97,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "table.bucket-types", [], ["bucketTypes", ["subexpr", "@mut", [["get", "currentPageInactiveBucketTypes", ["loc", [null, [96, 49], [96, 79]]]]], [], []]], ["loc", [null, [96, 16], [96, 81]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 91,
+ "column": 12
+ },
+ "end": {
+ "line": 98,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "pagination-component", [], ["chunkSize", ["subexpr", "@mut", [["get", "pageSize", ["loc", [null, [93, 24], [93, 32]]]]], [], []], "totalSize", ["subexpr", "@mut", [["get", "model.inactiveBucketTypes.length", ["loc", [null, [94, 24], [94, 56]]]]], [], []], "sectionRequest", "inactiveBucketTypesPageRequest"], 0, null, ["loc", [null, [92, 14], [97, 39]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 98,
+ "column": 12
+ },
+ "end": {
+ "line": 100,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("No inactive buckets");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 90,
+ "column": 10
+ },
+ "end": {
+ "line": 101,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.inactiveBucketTypes", ["loc", [null, [91, 18], [91, 43]]]]], [], 0, 1, ["loc", [null, [91, 12], [100, 19]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 71,
+ "column": 6
+ },
+ "end": {
+ "line": 102,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "tabs.tablist", [], [], 0, null, ["loc", [null, [72, 10], [75, 27]]]], ["block", "tabs.tabpanel", [], [], 1, null, ["loc", [null, [77, 10], [88, 28]]]], ["block", "tabs.tabpanel", [], [], 2, null, ["loc", [null, [90, 10], [101, 28]]]]],
+ locals: ["tabs"],
+ templates: [child0, child1, child2]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 70,
+ "column": 4
+ },
+ "end": {
+ "line": 103,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "ivy-tabs", [], ["on-select", ["subexpr", "action", [["subexpr", "mut", [["get", "selectedIndex", ["loc", [null, [71, 41], [71, 54]]]]], [], ["loc", [null, [71, 36], [71, 55]]]]], [], ["loc", [null, [71, 28], [71, 56]]]], "selected-index", ["subexpr", "@mut", [["get", "selectedIndex", ["loc", [null, [71, 72], [71, 85]]]]], [], []]], 0, null, ["loc", [null, [71, 6], [102, 19]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 61,
+ "column": 2
+ },
+ "end": {
+ "line": 104,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "KV Bucket Types"], 0, null, ["loc", [null, [62, 4], [69, 32]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [70, 4], [103, 30]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "triple-curlies"
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 108,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/data/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "cluster-information-container");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element2 = dom.childAt(fragment, [0]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(element2, 1, 1);
+ morphs[1] = dom.createMorphAt(element2, 3, 3);
+ morphs[2] = dom.createMorphAt(element2, 5, 5);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], ["class", "medium-width"], 0, null, ["loc", [null, [2, 2], [34, 33]]]], ["block", "if", [["get", "model.isTimeSeries", ["loc", [null, [36, 8], [36, 26]]]]], [], 1, null, ["loc", [null, [36, 2], [59, 9]]]], ["block", "dashboard-module.container", [], ["class", "medium-width"], 2, null, ["loc", [null, [61, 2], [104, 33]]]]],
+ locals: [],
+ templates: [child0, child1, child2]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/cluster/model', ['exports', 'ember-data', 'ember-riak-explorer/config/environment'], function (exports, _emberData, _emberRiakExplorerConfigEnvironment) {
+
+ /**
+ * Represents a Riak cluster as a whole.
+ *
+ * @class Cluster
+ * @extends DS.Model
+ * @constructor
+ * @uses BucketType
+ */
+ var Cluster = _emberData['default'].Model.extend({
+ /**
+ * Bucket types created on the cluster
+ * @property bucketTypes
+ * @type Array
+ */
+ bucketTypes: _emberData['default'].hasMany('bucket-type'),
+
+ /**
+ * Riak nodes assigned to the cluster
+ * @property nodes
+ * @type Array
+ */
+ nodes: _emberData['default'].hasMany('node'),
+
+ /**
+ * Search indexes created on the cluster
+ * @property searchIndexes
+ * @type Array
+ */
+ searchIndexes: _emberData['default'].hasMany('search-index'),
+
+ /**
+ * Search schemas created on the cluster
+ * @property searchSchemas
+ * @type Array
+ */
+ searchSchemas: _emberData['default'].hasMany('search-schema'),
+
+ /**
+ * TS tables created on the cluster
+ * @property tables
+ * @type Array
+ */
+ tables: _emberData['default'].hasMany('table'),
+
+ /**
+ * Is this cluster in Dev Mode? Set in the Explorer config file.
+ * Dev mode allows expensive operations like list keys, delete bucket, etc.
+ * @property developmentMode
+ * @type Boolean
+ * @default false
+ */
+ developmentMode: _emberData['default'].attr('boolean', { defaultValue: false }),
+
+ /**
+ * The Riak Type: either kv_oss, kv_ee, ts_oss, ts_ee, or unavailable
+ * @property riakType
+ * @type String
+ */
+ riakType: _emberData['default'].attr('string', { defaultValue: 'kv_oss' }),
+
+ riakTypeLong: _emberData['default'].attr('string', { defaultValue: 'KV Open Source' }),
+
+ /**
+ * Riak Version
+ * @property riakVersion
+ * @type String
+ */
+ riakVersion: _emberData['default'].attr('string'),
+
+ /**
+ * Returns a list of currently activated bucket types.
+ *
+ * @method activeBucketTypes
+ * @return {Array}
+ */
+ activeBucketTypes: (function () {
+ return this.get('bucketTypes').filterBy('isActive');
+ }).property('bucketTypes'),
+
+ /**
+ * Boolean check to see if the cluster has a Riak version number associated with it
+ *
+ * @method hasVersion
+ * @returns Boolean
+ */
+ hasVersion: (function () {
+ return this.get('riakVersion') && this.get('riakVersion') !== "unavailable";
+ }).property('riakVersion'),
+
+ /**
+ * Boolean check to see if the cluster has a Riak type associated with it
+ *
+ * @method hasType
+ * @returns Boolean
+ */
+ hasType: (function () {
+ var type = this.get('riakType');
+
+ return type && type !== "unavailable";
+ }).property('riakType'),
+
+ /**
+ * Returns a list of un-activated bucket types.
+ *
+ * @method inactiveBucketTypes
+ * @return {Array}
+ */
+ inactiveBucketTypes: (function () {
+ return this.get('bucketTypes').filterBy('isInactive');
+ }).property('bucketTypes'),
+
+ isTimeSeries: (function () {
+ var type = this.get('riakType');
+
+ return type === 'ts_oss' || type === 'ts_ee';
+ }).property('riakType'),
+
+ /**
+ * Boolean test on if the riakType is the open source edition
+ *
+ * @method isOpenSourceEdition
+ * @return Boolean
+ */
+ isOpenSourceEdition: (function () {
+ var type = this.get('riakType');
+
+ return type === 'kv_oss' || type === 'ts_oss';
+ }).property('riakType'),
+
+ /**
+ * Boolean test on if the riakType is the enterprise edition
+ *
+ * @method isEnterpriseEdition
+ * @return Boolean
+ */
+ isEnterpriseEdition: (function () {
+ var type = this.get('riakType');
+
+ return type === 'kv_ee' || type === 'ts_ee';
+ }).property('riakType'),
+
+ /**
+ * Returns the name of the cluster
+ * (As specified in the `riak_explorer.conf` file)
+ * Note: Currently unrelated to the source/datacenter name used by MDC Repl
+ * @method clusterId
+ * @type String
+ */
+ name: (function () {
+ return this.get('id');
+ }).property('id'),
+
+ /**
+ * Returns true if this cluster is in production mode (development_mode=off)
+ * @method productionMode
+ * @type Boolean
+ */
+ productionMode: (function () {
+ return !this.get('developmentMode');
+ }).property('developmentMode'),
+
+ /**
+ * Returns the URL which Explorer uses to forward requests to the cluster.
+ * Used to link to Search schemas, on the Cluster view.
+ * Having the config and url here is hacky, but no good alternatives.
+ * @method proxyUrl
+ * @return {String} URL
+ */
+ proxyUrl: (function () {
+ return 'riak/clusters/' + this.get('name');
+ }).property('name'),
+
+ /**
+ * Calculates cluster status based on node health. If all child nodes are valid and
+ * available, status is "ok". If some child nodes are unavailable or invalid, status is
+ * "warning". If all child nodes are unavailable or invalid, status is "down".
+ *
+ * @method status
+ * @return {String} Status
+ */
+ status: (function () {
+ var nodes = this.get('nodes');
+ var totalNodes = nodes.get('length');
+ var totalHealthyNodes = 0;
+ var totalUnhealthyNodes = 0;
+ var status = null;
+
+ // Calculate how many nodes are healthy/unhealthy
+ nodes.forEach(function (node) {
+ if (node.get('isHealthy')) {
+ totalHealthyNodes++;
+ } else {
+ totalUnhealthyNodes++;
+ }
+ });
+
+ if (totalUnhealthyNodes === totalNodes || totalNodes < 1) {
+ status = 'down';
+ } else if (totalHealthyNodes === totalNodes) {
+ status = 'ok';
+ } else {
+ status = 'warning';
+ }
+
+ return status;
+ }).property('nodes.@each.isHealthy'),
+
+ supportsHyperLogLogs: (function () {
+ var currentVersion = parseFloat(this.get('riakVersion'));
+
+ return currentVersion >= 2.2;
+ }).property('riakVersion'),
+
+ warnings: (function () {
+ var warnings = {};
+
+ if (this.get('productionMode') && this.get('nodes').get('length') < 5) {
+ warnings.insufficientNodes = "For production deployments we recommend using no fewer than 5 nodes, as node " + "failures in smaller clusters can compromise the fault-tolerance of the system.";
+ }
+
+ return warnings;
+ }).property('productionMode', 'nodes')
+ });
+
+ exports['default'] = Cluster;
+});
+define('ember-riak-explorer/pods/cluster/ops/controller', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/modal'], function (exports, _ember, _emberRiakExplorerMixinsControllerModal) {
+ exports['default'] = _ember['default'].Controller.extend(_emberRiakExplorerMixinsControllerModal['default'], {
+ // MDC
+ replActionModalVisible: false,
+
+ availableReplActions: ['Cluster Stats', 'Cluster Manager', 'Fullsync Start', 'Fullsync Stop', 'Fullsync Coordinate', 'Realtime Start', 'Realtime Stop', 'Realtime Stats', 'Replication Connections', 'Replication Clustername'],
+
+ currentlySelectedAction: '',
+
+ currentReplOutput: '',
+
+ // Monitoring
+ newGraphModalVisible: false,
+
+ currentGraphs: [],
+
+ availableGraphs: [],
+
+ actions: {
+ // MDC
+ showReplActionModal: function showReplActionModal() {
+ this.set('replActionModalVisible', true);
+ this.send('showModal');
+ },
+
+ hideReplActionModal: function hideReplActionModal() {
+ this.set('replActionModalVisible', false);
+ this.send('hideModal');
+ },
+
+ cancelReplAction: function cancelReplAction() {
+ this.set('currentlySelectedAction', '');
+ this.set('currentReplOutput', '');
+ this.send('hideReplActionModal');
+ },
+
+ confirmReplAction: function confirmReplAction() {
+ this.send('hideReplActionModal');
+ this.send('getReplicationOutput', this.get('currentlySelectedAction'));
+ },
+
+ warnReplAction: function warnReplAction(action) {
+ this.set('currentlySelectedAction', action);
+ this.set('currentReplOutput', '');
+ this.send('showReplActionModal');
+ },
+
+ // Monitoring
+ showNewGraphModal: function showNewGraphModal() {
+ this.set('newGraphModalVisible', true);
+ this.send('showModal');
+ },
+
+ hideNewGraphModal: function hideNewGraphModal() {
+ this.set('newGraphModalVisible', false);
+ this.send('hideModal');
+ },
+
+ updateGraphName: function updateGraphName(graph, newStat) {
+ return this.set('currentGraphs', this.get('currentGraphs').map(function (graphName) {
+ return graphName === graph ? newStat : graphName;
+ }));
+ },
+
+ addNewGraph: function addNewGraph(graph) {
+ this.get('currentGraphs').pushObject(graph);
+ this.send('hideNewGraphModal');
+ },
+
+ removeGraph: function removeGraph(graph) {
+ this.set('currentGraphs', this.get('currentGraphs').filter(function (graphName) {
+ return graphName !== graph;
+ }));
+ }
+ }
+ });
+});
+define('ember-riak-explorer/pods/cluster/ops/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/monitoring', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state', 'lodash/lodash'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesMonitoring, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState, _lodashLodash) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesMonitoring['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ model: function model(params) {
+ var self = this;
+
+ return this.explorer.getCluster(params.clusterName).then(function (cluster) {
+ return _ember['default'].RSVP.allSettled([cluster, self.explorer.getNodesStats(cluster)]);
+ }).then(function (PromiseArray) {
+ var cluster = PromiseArray[0].value;
+
+ return cluster;
+ });
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model);
+ this.setBreadCrumbs(null);
+ this.setViewLabel({
+ preLabel: 'Cluster Ops',
+ label: model.get('name')
+ });
+ this.simulateLoad();
+ },
+
+ setupController: function setupController(controller, model) {
+ this._super(controller, model);
+
+ if (model.get('nodes').get('length')) {
+ var firstNode = _lodashLodash['default'].head(model.get('nodes').toArray());
+
+ this.setPossibleGraphOptions(firstNode.get('stats'));
+ this.setDefaultGraph();
+ }
+ },
+
+ actions: {
+ // TODO: Move this logic elsewhere
+ getReplicationOutput: function getReplicationOutput(action) {
+ var controller = this.controller;
+ var cluster = this.currentModel;
+ var slug = undefined;
+ var url = undefined;
+
+ // Map action to api slug
+ switch (action) {
+ case 'Cluster Stats':
+ slug = 'repl-clusterstats';
+ break;
+ case 'Cluster Manager':
+ slug = 'repl-clusterstats-cluster_mgr';
+ break;
+ case 'Fullsync Start':
+ slug = 'repl-fullsync-start';
+ break;
+ case 'Fullsync Stop':
+ slug = 'repl-fullsync-stop';
+ break;
+ case 'Fullsync Coordinate':
+ slug = 'repl-clusterstats-fs_coordinate';
+ break;
+ case 'Realtime Start':
+ slug = 'repl-realtime-start';
+ break;
+ case 'Realtime Stop':
+ slug = 'repl-realtime-stop';
+ break;
+ case 'Realtime Stats':
+ slug = 'repl-clusterstats-realtime';
+ break;
+ case 'Replication Connections':
+ slug = 'repl-connections';
+ break;
+ case 'Replication Clustername':
+ slug = 'repl-clustername';
+ break;
+ default:
+ break;
+ }
+
+ url = 'control/clusters/' + cluster.get('name') + '/' + slug;
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+ var request = _ember['default'].$.ajax({
+ url: url,
+ type: 'GET'
+ });
+
+ request.done(function (data) {
+ delete data.links;
+
+ controller.set('currentReplOutput', JSON.stringify(data, null, ' '));
+ resolve(data);
+ });
+
+ request.fail(function (data) {
+ reject(data);
+ });
+ });
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/cluster/ops/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 2
+ },
+ "end": {
+ "line": 7,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "label label-warning");
+ var el3 = dom.createTextNode("WARNING: Insufficient Nodes");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Reference: ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "href", "http://docs.basho.com/riak/latest/ops/building/planning/cluster/#Number-of-Nodes");
+ dom.setAttribute(el2, "target", "_blank");
+ var el3 = dom.createTextNode("Cluster Planning");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "model.warnings.insufficientNodes", ["loc", [null, [5, 7], [5, 43]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 0
+ },
+ "end": {
+ "line": 8,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "warning"], 0, null, ["loc", [null, [3, 2], [7, 22]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 13,
+ "column": 4
+ },
+ "end": {
+ "line": 15,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-label");
+ var el2 = dom.createTextNode("Cluster: ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["content", "model.name", ["loc", [null, [14, 41], [14, 55]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 21,
+ "column": 10
+ },
+ "end": {
+ "line": 21,
+ "column": 36
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("Monitoring");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 23,
+ "column": 12
+ },
+ "end": {
+ "line": 23,
+ "column": 42
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("MDC Operations");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 22,
+ "column": 10
+ },
+ "end": {
+ "line": 24,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["block", "tablist.tab", [], [], 0, null, ["loc", [null, [23, 12], [23, 58]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 25,
+ "column": 10
+ },
+ "end": {
+ "line": 25,
+ "column": 49
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("Individual Node Details");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 20,
+ "column": 8
+ },
+ "end": {
+ "line": 26,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 5, 5, contextualElement);
+ return morphs;
+ },
+ statements: [["block", "tablist.tab", [], [], 0, null, ["loc", [null, [21, 10], [21, 52]]]], ["block", "if", [["subexpr", "and", [["get", "model.developmentMode", ["loc", [null, [22, 21], [22, 42]]]], ["get", "model.isEnterpriseEdition", ["loc", [null, [22, 43], [22, 68]]]]], [], ["loc", [null, [22, 16], [22, 69]]]]], [], 1, null, ["loc", [null, [22, 10], [24, 17]]]], ["block", "tablist.tab", [], [], 2, null, ["loc", [null, [25, 10], [25, 65]]]]],
+ locals: ["tablist"],
+ templates: [child0, child1, child2]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 36,
+ "column": 20
+ },
+ "end": {
+ "line": 44,
+ "column": 20
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "statOption", ["loc", [null, [43, 22], [43, 36]]]]],
+ locals: ["statOption"],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 46,
+ "column": 22
+ },
+ "end": {
+ "line": 48,
+ "column": 22
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" Graph Descritpion\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 31,
+ "column": 12
+ },
+ "end": {
+ "line": 61,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "cluster-graph");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("header");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "header-left");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("span");
+ var el5 = dom.createTextNode("Displayed Graph:");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode(" ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("div");
+ var el5 = dom.createTextNode("\n");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode(" ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "header-right");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("button");
+ dom.setAttribute(el4, "type", "button");
+ dom.setAttribute(el4, "class", "btn btn-danger");
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createElement("span");
+ dom.setAttribute(el5, "class", "ion-ios-trash");
+ dom.setAttribute(el5, "aria-hidden", "true");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("\n Remove Graph\n ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element7 = dom.childAt(fragment, [1]);
+ var element8 = dom.childAt(element7, [1]);
+ var element9 = dom.childAt(element8, [1]);
+ var element10 = dom.childAt(element8, [3, 1]);
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(element9, 3, 3);
+ morphs[1] = dom.createMorphAt(dom.childAt(element9, [5]), 1, 1);
+ morphs[2] = dom.createElementMorph(element10);
+ morphs[3] = dom.createMorphAt(element7, 3, 3);
+ return morphs;
+ },
+ statements: [["block", "power-select", [], ["selected", ["subexpr", "@mut", [["get", "statName", ["loc", [null, [37, 29], [37, 37]]]]], [], []], "options", ["subexpr", "@mut", [["get", "availableGraphs", ["loc", [null, [38, 28], [38, 43]]]]], [], []], "searchEnabled", true, "onchange", ["subexpr", "action", ["updateGraphName", ["get", "statName", ["loc", [null, [40, 55], [40, 63]]]]], [], ["loc", [null, [40, 29], [40, 64]]]], "class", "node-chart-select"], 0, null, ["loc", [null, [36, 20], [44, 37]]]], ["block", "tooltip.node-stats", [], ["itemKey", ["subexpr", "@mut", [["get", "statName", ["loc", [null, [46, 52], [46, 60]]]]], [], []], "useIcon", false], 1, null, ["loc", [null, [46, 22], [48, 45]]]], ["element", "action", ["removeGraph", ["get", "statName", ["loc", [null, [52, 88], [52, 96]]]]], [], ["loc", [null, [52, 65], [52, 98]]]], ["inline", "charts.cluster-stat", [], ["cluster", ["subexpr", "@mut", [["get", "model", ["loc", [null, [59, 46], [59, 51]]]]], [], []], "statToGraph", ["subexpr", "@mut", [["get", "statName", ["loc", [null, [59, 64], [59, 72]]]]], [], []]], ["loc", [null, [59, 16], [59, 74]]]]],
+ locals: ["statName"],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 30,
+ "column": 10
+ },
+ "end": {
+ "line": 69,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "add-new-graph");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("button");
+ dom.setAttribute(el2, "class", "btn btn-primary");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "ion-plus-circled");
+ dom.setAttribute(el3, "aria-hidden", "true");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n Add new graph\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element11 = dom.childAt(fragment, [2, 1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createElementMorph(element11);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "currentGraphs", ["loc", [null, [31, 20], [31, 33]]]]], [], 0, null, ["loc", [null, [31, 12], [61, 21]]]], ["element", "action", ["showNewGraphModal"], [], ["loc", [null, [64, 46], [64, 76]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 69,
+ "column": 10
+ },
+ "end": {
+ "line": 71,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("No nodes detected");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 29,
+ "column": 8
+ },
+ "end": {
+ "line": 72,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.nodes.length", ["loc", [null, [30, 16], [30, 34]]]]], [], 0, 1, ["loc", [null, [30, 10], [71, 17]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 80,
+ "column": 16
+ },
+ "end": {
+ "line": 87,
+ "column": 16
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "replAction", ["loc", [null, [86, 18], [86, 32]]]]],
+ locals: ["replAction"],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 90,
+ "column": 14
+ },
+ "end": {
+ "line": 100,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("label");
+ var el3 = dom.createTextNode("Output");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 3, 3);
+ return morphs;
+ },
+ statements: [["inline", "ivy-codemirror", [], ["mode", "javascript", "theme", "material", "lineWrapping", true, "readOnly", true, "value", ["subexpr", "@mut", [["get", "currentReplOutput", ["loc", [null, [98, 24], [98, 41]]]]], [], []]], ["loc", [null, [93, 18], [98, 43]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 76,
+ "column": 10
+ },
+ "end": {
+ "line": 102,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("form");
+ dom.setAttribute(el1, "class", "mdc-repl");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "form-group repl-action-select");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("label");
+ var el4 = dom.createTextNode("Available Actions");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element6 = dom.childAt(fragment, [1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(dom.childAt(element6, [1]), 3, 3);
+ morphs[1] = dom.createMorphAt(element6, 3, 3);
+ return morphs;
+ },
+ statements: [["block", "power-select", [], ["selected", ["subexpr", "@mut", [["get", "currentlySelectedAction", ["loc", [null, [81, 25], [81, 48]]]]], [], []], "options", ["subexpr", "@mut", [["get", "availableReplActions", ["loc", [null, [82, 24], [82, 44]]]]], [], []], "searchEnabled", false, "onchange", ["subexpr", "action", ["warnReplAction"], [], ["loc", [null, [84, 25], [84, 50]]]]], 0, null, ["loc", [null, [80, 16], [87, 33]]]], ["block", "if", [["get", "currentReplOutput", ["loc", [null, [90, 20], [90, 37]]]]], [], 1, null, ["loc", [null, [90, 14], [100, 21]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 75,
+ "column": 8
+ },
+ "end": {
+ "line": 103,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "tabs.tabpanel", [], [], 0, null, ["loc", [null, [76, 10], [102, 28]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child3 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 114,
+ "column": 20
+ },
+ "end": {
+ "line": 117,
+ "column": 20
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-checkmark-circled");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "node.name", ["loc", [null, [116, 22], [116, 35]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 113,
+ "column": 18
+ },
+ "end": {
+ "line": 118,
+ "column": 18
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["node", ["get", "model.name", ["loc", [null, [114, 38], [114, 48]]]], ["get", "node.name", ["loc", [null, [114, 49], [114, 58]]]]], [], 0, null, ["loc", [null, [114, 20], [117, 32]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 119,
+ "column": 20
+ },
+ "end": {
+ "line": 122,
+ "column": 20
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-alert-circled");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "node.name", ["loc", [null, [121, 22], [121, 35]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 118,
+ "column": 18
+ },
+ "end": {
+ "line": 123,
+ "column": 18
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["node", ["get", "model.name", ["loc", [null, [119, 38], [119, 48]]]], ["get", "node.name", ["loc", [null, [119, 49], [119, 58]]]]], ["class", "danger"], 0, null, ["loc", [null, [119, 20], [122, 32]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 111,
+ "column": 14
+ },
+ "end": {
+ "line": 125,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "node.available", ["loc", [null, [113, 24], [113, 38]]]]], [], 0, 1, ["loc", [null, [113, 18], [123, 25]]]]],
+ locals: ["node"],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 107,
+ "column": 10
+ },
+ "end": {
+ "line": 127,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ dom.setAttribute(el1, "style", "margin-bottom: 30px");
+ var el2 = dom.createTextNode("Select any of the nodes below to dive into node specific details (stats, configuration, monitoring, etc.)");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ dom.setAttribute(el1, "class", "button-list");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "model.nodes", ["loc", [null, [111, 22], [111, 33]]]]], [], 0, null, ["loc", [null, [111, 14], [125, 23]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 127,
+ "column": 10
+ },
+ "end": {
+ "line": 129,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("No nodes detected");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 106,
+ "column": 8
+ },
+ "end": {
+ "line": 130,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.nodes", ["loc", [null, [107, 16], [107, 27]]]]], [], 0, 1, ["loc", [null, [107, 10], [129, 17]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 19,
+ "column": 6
+ },
+ "end": {
+ "line": 131,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "tabs.tablist", [], [], 0, null, ["loc", [null, [20, 8], [26, 25]]]], ["block", "tabs.tabpanel", [], [], 1, null, ["loc", [null, [29, 8], [72, 26]]]], ["block", "if", [["subexpr", "and", [["get", "model.developmentMode", ["loc", [null, [75, 19], [75, 40]]]], ["get", "model.isEnterpriseEdition", ["loc", [null, [75, 41], [75, 66]]]]], [], ["loc", [null, [75, 14], [75, 67]]]]], [], 2, null, ["loc", [null, [75, 8], [103, 15]]]], ["block", "tabs.tabpanel", [], [], 3, null, ["loc", [null, [106, 8], [130, 26]]]]],
+ locals: ["tabs"],
+ templates: [child0, child1, child2, child3]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 16,
+ "column": 4
+ },
+ "end": {
+ "line": 132,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "ivy-tabs", [], ["on-select", ["subexpr", "action", [["subexpr", "mut", [["get", "selectedIndex", ["loc", [null, [19, 41], [19, 54]]]]], [], ["loc", [null, [19, 36], [19, 55]]]]], [], ["loc", [null, [19, 28], [19, 56]]]], "selected-index", ["subexpr", "@mut", [["get", "selectedIndex", ["loc", [null, [19, 72], [19, 85]]]]], [], []]], 0, null, ["loc", [null, [19, 6], [131, 19]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 12,
+ "column": 2
+ },
+ "end": {
+ "line": 133,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], [], 0, null, ["loc", [null, [13, 4], [15, 32]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [16, 4], [132, 30]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 139,
+ "column": 4
+ },
+ "end": {
+ "line": 159,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "modal-content-container");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("header");
+ dom.setAttribute(el2, "class", "modal-header");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("h3");
+ var el4 = dom.createElement("span");
+ dom.setAttribute(el4, "class", "label label-danger");
+ var el5 = dom.createElement("i");
+ dom.setAttribute(el5, "class", "ion-alert-circled");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode(" Potentially Dangerous Operation");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("section");
+ dom.setAttribute(el2, "class", "modal-body");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("p");
+ var el4 = dom.createTextNode("Are you sure you want to perform a ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("strong");
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode(" operation?");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("p");
+ var el4 = dom.createTextNode("MDC replication operations can effect cluster performance and should only be done by a cluster administrator.");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("footer");
+ dom.setAttribute(el2, "class", "modal-footer");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("button");
+ dom.setAttribute(el3, "class", "btn btn-default");
+ var el4 = dom.createTextNode("Cancel");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("button");
+ dom.setAttribute(el3, "class", "btn btn-primary");
+ var el4 = dom.createTextNode("Confirm");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element2 = dom.childAt(fragment, [1]);
+ var element3 = dom.childAt(element2, [5]);
+ var element4 = dom.childAt(element3, [1]);
+ var element5 = dom.childAt(element3, [3]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(dom.childAt(element2, [3, 1, 1]), 0, 0);
+ morphs[1] = dom.createElementMorph(element4);
+ morphs[2] = dom.createElementMorph(element5);
+ return morphs;
+ },
+ statements: [["content", "currentlySelectedAction", ["loc", [null, [150, 56], [150, 83]]]], ["element", "action", ["cancelReplAction"], [], ["loc", [null, [155, 42], [155, 71]]]], ["element", "action", ["confirmReplAction", ["get", "model", ["loc", [null, [156, 71], [156, 76]]]]], [], ["loc", [null, [156, 42], [156, 78]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 138,
+ "column": 2
+ },
+ "end": {
+ "line": 160,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "modal-dialog", [], ["close", "cancelReplAction", "translucentOverlay", true], 0, null, ["loc", [null, [139, 4], [159, 21]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 176,
+ "column": 10
+ },
+ "end": {
+ "line": 183,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "statOption", ["loc", [null, [182, 12], [182, 26]]]]],
+ locals: ["statOption"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 163,
+ "column": 4
+ },
+ "end": {
+ "line": 190,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "modal-content-container");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("header");
+ dom.setAttribute(el2, "class", "modal-header");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("h3");
+ var el4 = dom.createTextNode("New Graph");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("section");
+ dom.setAttribute(el2, "class", "modal-body");
+ dom.setAttribute(el2, "style", "min-width: 300px;");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("p");
+ var el4 = dom.createTextNode("\n Select a new statistic to add it to the dashboard.\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("footer");
+ dom.setAttribute(el2, "class", "modal-footer");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("button");
+ dom.setAttribute(el3, "class", "btn btn-default");
+ var el4 = dom.createTextNode("Cancel");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var element1 = dom.childAt(element0, [5, 1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [3]), 3, 3);
+ morphs[1] = dom.createElementMorph(element1);
+ return morphs;
+ },
+ statements: [["block", "power-select", [], ["selected", "", "options", ["subexpr", "@mut", [["get", "availableGraphs", ["loc", [null, [178, 18], [178, 33]]]]], [], []], "searchEnabled", true, "onchange", ["subexpr", "action", ["addNewGraph"], [], ["loc", [null, [180, 19], [180, 41]]]]], 0, null, ["loc", [null, [176, 10], [183, 27]]]], ["element", "action", ["hideNewGraphModal"], [], ["loc", [null, [187, 42], [187, 72]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 162,
+ "column": 2
+ },
+ "end": {
+ "line": 191,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "modal-dialog", [], ["close", "hideNewGraphModal", "translucentOverlay", true], 0, null, ["loc", [null, [163, 4], [190, 21]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 137,
+ "column": 0
+ },
+ "end": {
+ "line": 192,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "replActionModalVisible", ["loc", [null, [138, 8], [138, 30]]]]], [], 0, null, ["loc", [null, [138, 2], [160, 9]]]], ["block", "if", [["get", "newGraphModalVisible", ["loc", [null, [162, 8], [162, 28]]]]], [], 1, null, ["loc", [null, [162, 2], [191, 9]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 192,
+ "column": 7
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/ops/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "cluster-ops-container");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.warnings.insufficientNodes", ["loc", [null, [2, 6], [2, 38]]]]], [], 0, null, ["loc", [null, [2, 0], [8, 7]]]], ["block", "dashboard-module.container", [], [], 1, null, ["loc", [null, [12, 2], [133, 33]]]], ["block", "if", [["get", "modalVisible", ["loc", [null, [137, 6], [137, 18]]]]], [], 2, null, ["loc", [null, [137, 0], [192, 7]]]]],
+ locals: [],
+ templates: [child0, child1, child2]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/cluster/query/route', ['exports', 'ember-riak-explorer/pods/cluster/route'], function (exports, _emberRiakExplorerPodsClusterRoute) {
+ exports['default'] = _emberRiakExplorerPodsClusterRoute['default'].extend({
+ afterModel: function afterModel(model, transition) {
+ this._super(model, transition);
+ this.setViewLabel({
+ preLabel: 'Cluster Query',
+ label: model.get('name')
+ });
+ }
+ });
+});
+define("ember-riak-explorer/pods/cluster/query/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 6,
+ "column": 10
+ },
+ "end": {
+ "line": 9,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-plus-circled");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Create New Table\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 4,
+ "column": 6
+ },
+ "end": {
+ "line": 11,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["table.create", ["get", "model.name", ["loc", [null, [6, 36], [6, 46]]]]], ["class", "action-button create"], 0, null, ["loc", [null, [6, 10], [9, 22]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 14,
+ "column": 10
+ },
+ "end": {
+ "line": 19,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "table.ts-tables", [], ["tables", ["subexpr", "@mut", [["get", "currentPageTables", ["loc", [null, [18, 37], [18, 54]]]]], [], []]], ["loc", [null, [18, 12], [18, 56]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 13,
+ "column": 8
+ },
+ "end": {
+ "line": 20,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "pagination-component", [], ["chunkSize", ["subexpr", "@mut", [["get", "pageSize", ["loc", [null, [15, 20], [15, 28]]]]], [], []], "totalSize", ["subexpr", "@mut", [["get", "model.tables.length", ["loc", [null, [16, 20], [16, 39]]]]], [], []], "sectionRequest", "tablePageRequest"], 0, null, ["loc", [null, [14, 10], [19, 35]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 20,
+ "column": 8
+ },
+ "end": {
+ "line": 22,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("No Time Series tables have been created on this cluster");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 12,
+ "column": 6
+ },
+ "end": {
+ "line": 23,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.tables", ["loc", [null, [13, 14], [13, 26]]]]], [], 0, 1, ["loc", [null, [13, 8], [22, 15]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 4
+ },
+ "end": {
+ "line": 24,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "TS Tables"], 0, null, ["loc", [null, [4, 6], [11, 34]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [12, 6], [23, 32]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 25,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], ["class", "medium-width"], 0, null, ["loc", [null, [3, 4], [24, 35]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 30,
+ "column": 8
+ },
+ "end": {
+ "line": 33,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-plus-circled");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Create new search schema\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 28,
+ "column": 4
+ },
+ "end": {
+ "line": 35,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["search-schema.create", ["get", "model.name", ["loc", [null, [30, 42], [30, 52]]]]], ["class", "btn btn-small btn-primary"], 0, null, ["loc", [null, [30, 8], [33, 20]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 39,
+ "column": 8
+ },
+ "end": {
+ "line": 44,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "table.search-indexes", [], ["indexes", ["subexpr", "@mut", [["get", "currentPageIndexes", ["loc", [null, [43, 41], [43, 59]]]]], [], []]], ["loc", [null, [43, 10], [43, 61]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 37,
+ "column": 6
+ },
+ "end": {
+ "line": 46,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["block", "pagination-component", [], ["chunkSize", ["subexpr", "@mut", [["get", "pageSize", ["loc", [null, [40, 18], [40, 26]]]]], [], []], "totalSize", ["subexpr", "@mut", [["get", "model.searchIndexes.length", ["loc", [null, [41, 18], [41, 44]]]]], [], []], "sectionRequest", "indexPageRequest"], 0, null, ["loc", [null, [39, 8], [44, 33]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 46,
+ "column": 6
+ },
+ "end": {
+ "line": 48,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("No search indexes found");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 36,
+ "column": 4
+ },
+ "end": {
+ "line": 49,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.searchIndexes", ["loc", [null, [37, 12], [37, 31]]]]], [], 0, 1, ["loc", [null, [37, 6], [48, 13]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 27,
+ "column": 2
+ },
+ "end": {
+ "line": 50,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "KV Bucket Types Schema/Indexes"], 0, null, ["loc", [null, [28, 4], [35, 32]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [36, 4], [49, 30]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "triple-curlies"
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 54,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/cluster/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "cluster-information-container");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [0]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(element0, 1, 1);
+ morphs[1] = dom.createMorphAt(element0, 3, 3);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.isTimeSeries", ["loc", [null, [2, 8], [2, 26]]]]], [], 0, null, ["loc", [null, [2, 2], [25, 9]]]], ["block", "dashboard-module.container", [], ["class", "medium-width"], 1, null, ["loc", [null, [27, 2], [50, 33]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/cluster/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ pageSize: 5,
+
+ model: function model(params) {
+ return this.explorer.getCluster(params.clusterName);
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model);
+ this.setBreadCrumbs(null);
+ this.setViewLabel(null);
+ this.simulateLoad();
+ },
+
+ setupController: function setupController(controller, model) {
+ var lowIndex = 0;
+ var highIndex = this.get('pageSize') - 1;
+
+ this._super(controller, model);
+ this.controller.set('pageSize', this.get('pageSize'));
+ this.controller.set('currentPageTables', this.tablesFromRange(lowIndex, highIndex));
+ this.controller.set('currentPageActiveBucketTypes', this.bucketTypesFromRange('active', lowIndex, highIndex));
+ this.controller.set('currentPageInactiveBucketTypes', this.bucketTypesFromRange('inactive', lowIndex, highIndex));
+ this.controller.set('currentPageIndexes', this.indexesFromRange(lowIndex, highIndex));
+ },
+
+ tablesFromRange: function tablesFromRange(startIndex, endIndex) {
+ return this.currentModel.get('tables').filter(function (table, index) {
+ return index >= startIndex && index <= endIndex;
+ });
+ },
+
+ bucketTypesFromRange: function bucketTypesFromRange(type, startIndex, endIndex) {
+ var filteredType = type + 'BucketTypes';
+
+ return this.currentModel.get(filteredType).filter(function (bucketType, index) {
+ return index >= startIndex && index <= endIndex;
+ });
+ },
+
+ indexesFromRange: function indexesFromRange(startIndex, endIndex) {
+ return this.currentModel.get('searchIndexes').filter(function (searchIndex, index) {
+ return index >= startIndex && index <= endIndex;
+ });
+ },
+
+ actions: {
+ tablePageRequest: function tablePageRequest(lowIndex, highIndex) {
+ this.controller.set('currentPageTables', this.tablesFromRange(lowIndex, highIndex));
+ },
+
+ activeBucketTypesPageRequest: function activeBucketTypesPageRequest(lowIndex, highIndex) {
+ this.controller.set('currentPageActiveBucketTypes', this.bucketTypesFromRange('active', lowIndex, highIndex));
+ },
+
+ inactiveBucketTypesPageRequest: function inactiveBucketTypesPageRequest(lowIndex, highIndex) {
+ this.controller.set('currentPageInactiveBucketTypes', this.bucketTypesFromRange('inactive', lowIndex, highIndex));
+ },
+
+ indexPageRequest: function indexPageRequest(lowIndex, highIndex) {
+ this.controller.set('currentPageIndexes', this.indexesFromRange(lowIndex, highIndex));
+ }
+ }
+ });
+});
+define('ember-riak-explorer/pods/config-file/model', ['exports', 'ember-data'], function (exports, _emberData) {
+ exports['default'] = _emberData['default'].Model.extend({
+ /**
+ * Node the config file belongs to.
+ * @property node
+ * @type DS.Model
+ */
+ node: _emberData['default'].belongsTo('node'),
+
+ /**
+ * Contents of the config file so they can be displayed in the ui.
+ *
+ * @property content
+ * @type String
+ */
+ content: _emberData['default'].attr('string'),
+
+ /**
+ * The name of the file. The actual id is a composite id (i.e. cluster1/node1/file1.log).
+ *
+ * @property name
+ * @type String
+ */
+ name: _emberData['default'].attr('string')
+ });
+});
+define('ember-riak-explorer/pods/config-file/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+
+ model: function model(params) {
+ return this.explorer.getConfigFile(params.clusterName, params.nodeName, params.configName);
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('node').get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('node').get('cluster'),
+ node: model.get('node'),
+ configFile: model
+ });
+ this.setViewLabel({
+ preLabel: 'Config Detail',
+ label: model.get('name')
+ });
+ }
+ });
+});
+define("ember-riak-explorer/pods/config-file/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 4,
+ "column": 4
+ },
+ "end": {
+ "line": 11,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/config-file/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "ivy-codemirror", [], ["mode", "erlang", "theme", "material", "lineWrapping", true, "readOnly", true, "value", ["subexpr", "@mut", [["get", "model.content", ["loc", [null, [10, 14], [10, 27]]]]], [], []]], ["loc", [null, [5, 6], [10, 29]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 12,
+ "column": 6
+ },
+ "end": {
+ "line": 14,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/config-file/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createElement("strong");
+ var el3 = dom.createTextNode("File contains no contents.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 11,
+ "column": 4
+ },
+ "end": {
+ "line": 15,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/config-file/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "info"], 0, null, ["loc", [null, [12, 6], [14, 26]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 2
+ },
+ "end": {
+ "line": 16,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/config-file/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.content", ["loc", [null, [4, 10], [4, 23]]]]], [], 0, 1, ["loc", [null, [4, 4], [15, 11]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 17,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/config-file/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["inline", "dashboard-module.header", [], ["label", "File output"], ["loc", [null, [2, 2], [2, 49]]]], ["block", "dashboard-module.body", [], [], 0, null, ["loc", [null, [3, 2], [16, 28]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 18,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/config-file/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], [], 0, null, ["loc", [null, [1, 0], [17, 31]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/error/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], {
+ setupController: function setupController() {
+ this.simulateLoad();
+ }
+ });
+});
+define('ember-riak-explorer/pods/error/service-not-found/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], {
+ setupController: function setupController() {
+ this.simulateLoad();
+ }
+ });
+});
+define("ember-riak-explorer/pods/error/service-not-found/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 2
+ },
+ "end": {
+ "line": 9,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/error/service-not-found/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("The application was not able to connect to the Riak Explorer API.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("\n Please refer to any documentation in the\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "href", "https://github.com/basho-labs/riak_explorer");
+ var el3 = dom.createTextNode("Github repository");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 10,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/error/service-not-found/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["inline", "dashboard-module.header", [], ["label", "503 Service Unavailable"], ["loc", [null, [2, 2], [2, 61]]]], ["block", "dashboard-module.body", [], [], 0, null, ["loc", [null, [3, 2], [9, 28]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 11,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/error/service-not-found/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], ["class", "medium-width"], 0, null, ["loc", [null, [1, 0], [10, 31]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/pods/error/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 2
+ },
+ "end": {
+ "line": 8,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/error/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Sorry but the page your looking for doesn't exist.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("If you believe this to be a bug, please consider\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "href", "https://github.com/basho-labs/riak-explorer-gui/issues");
+ dom.setAttribute(el2, "target", "_blank");
+ var el3 = dom.createTextNode("\n creating an issue");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(".");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 9,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/error/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["inline", "dashboard-module.header", [], ["label", "Page not found: 404 Error"], ["loc", [null, [2, 2], [2, 63]]]], ["block", "dashboard-module.body", [], [], 0, null, ["loc", [null, [3, 2], [8, 28]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 9,
+ "column": 31
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/error/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], ["class", "small-width"], 0, null, ["loc", [null, [1, 0], [9, 31]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/help/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ model: function model(params) {
+ return null;
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setBreadCrumbs(null);
+ this.setViewLabel({
+ preLabel: 'Help Section'
+ });
+ this.simulateLoad();
+ }
+ });
+});
+define("ember-riak-explorer/pods/help/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 5,
+ "column": 2
+ },
+ "end": {
+ "line": 30,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/help/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("\n Riak Docs:\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "href", "http://docs.basho.com/");
+ dom.setAttribute(el2, "target", "_blank");
+ var el3 = dom.createTextNode("\n docs.basho.com\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("\n Riak mailing list:\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "href", "http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com");
+ dom.setAttribute(el2, "target", "_blank");
+ var el3 = dom.createTextNode("\n lists.basho.com/mailman/listinfo/riak-users_lists.basho.com\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("\n Riak IRC on Freenode:\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "href", "http://irc.lc/freenode/riak");
+ dom.setAttribute(el2, "target", "_blank");
+ var el3 = dom.createTextNode("\n irc.lc/freenode/riak\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 0
+ },
+ "end": {
+ "line": 31,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/help/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["inline", "dashboard-module.header", [], ["label", "Riak Resources"], ["loc", [null, [4, 2], [4, 52]]]], ["block", "dashboard-module.body", [], [], 0, null, ["loc", [null, [5, 2], [30, 28]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 35,
+ "column": 2
+ },
+ "end": {
+ "line": 52,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/help/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("\n Github repository:\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "href", "https://github.com/basho-labs/riak_explorer");
+ dom.setAttribute(el2, "target", "_blank");
+ var el3 = dom.createTextNode("\n github.com/basho-labs/riak_explorer\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("\n Riak Explorer API:\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "href", "http://basho-labs.github.io/riak_explorer/docs/api.html");
+ dom.setAttribute(el2, "target", "_blank");
+ var el3 = dom.createTextNode("\n basho-labs.github.io/riak_explorer/docs/api.html\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 33,
+ "column": 0
+ },
+ "end": {
+ "line": 53,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/help/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["inline", "dashboard-module.header", [], ["label", "Riak Explorer Resources"], ["loc", [null, [34, 2], [34, 61]]]], ["block", "dashboard-module.body", [], [], 0, null, ["loc", [null, [35, 2], [52, 28]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 57,
+ "column": 2
+ },
+ "end": {
+ "line": 77,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/help/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ol");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("a");
+ dom.setAttribute(el3, "href", "http://docs.basho.com/riak/latest/downloads/");
+ dom.setAttribute(el3, "target", "_blank");
+ var el4 = dom.createTextNode("Download");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n and\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("a");
+ dom.setAttribute(el3, "href", "http://docs.basho.com/riak/latest/installing/");
+ dom.setAttribute(el3, "target", "_blank");
+ var el4 = dom.createTextNode("Install");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n Riak, and get a cluster up an running. Our\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("a");
+ dom.setAttribute(el3, "href", "http://docs.basho.com/riak/latest/quickstart/");
+ dom.setAttribute(el3, "target", "_blank");
+ var el4 = dom.createTextNode("five minute install");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n is a great guide to follow if you are unfamiliar with this process.\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("\n Verify the default settings in ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("riak_explorer/etc/riak_explorer.conf");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" will work for your configuration\n (primarily that port 9000 is available on your host, and that the ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("listener");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" variable is pointed at one of the nodes in your cluster).\n Pay special attention to development mode settings, this should be off for use with a production environment to\n prevent accidental key listings.\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("\n Restart the Riak Explorer application and explore!\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 55,
+ "column": 0
+ },
+ "end": {
+ "line": 78,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/help/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["inline", "dashboard-module.header", [], ["label", "Setting up a cluster in Riak Explorer"], ["loc", [null, [56, 2], [56, 75]]]], ["block", "dashboard-module.body", [], [], 0, null, ["loc", [null, [57, 2], [77, 28]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 78,
+ "column": 31
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/help/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["inline", "render", ["alerts.feedback-welcome"], [], ["loc", [null, [1, 0], [1, 36]]]], ["block", "dashboard-module.container", [], ["class", "medium-width"], 0, null, ["loc", [null, [3, 0], [31, 31]]]], ["block", "dashboard-module.container", [], ["class", "medium-width"], 1, null, ["loc", [null, [33, 0], [53, 31]]]], ["block", "dashboard-module.container", [], ["class", "medium-width"], 2, null, ["loc", [null, [55, 0], [78, 31]]]]],
+ locals: [],
+ templates: [child0, child1, child2]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/index/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], {
+ afterModel: function afterModel(clusters, transition) {
+ // If only one cluster, go ahead and go straight to it
+ if (clusters.get('length') === 1) {
+ var clusterName = clusters.get('firstObject').get('name');
+
+ return this.transitionTo('cluster.data', clusterName);
+ }
+ },
+
+ setupController: function setupController() {
+ this.simulateLoad();
+ }
+ });
+});
+define("ember-riak-explorer/pods/index/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 2
+ },
+ "end": {
+ "line": 10,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/index/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Select a cluster from the nav bar on the left to view its information.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("\n Need help? Visit the\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(".\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);
+ return morphs;
+ },
+ statements: [["inline", "link-to", ["help page", "help"], [], ["loc", [null, [8, 6], [8, 36]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 11,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/index/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["inline", "dashboard-module.header", [], ["label", "Welcome to Riak Explorer"], ["loc", [null, [2, 2], [2, 62]]]], ["block", "dashboard-module.body", [], [], 0, null, ["loc", [null, [3, 2], [10, 28]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 12,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/index/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], ["class", "small-width"], 0, null, ["loc", [null, [1, 0], [11, 31]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/log-file/model', ['exports', 'ember-data'], function (exports, _emberData) {
+ exports['default'] = _emberData['default'].Model.extend({
+ /**
+ * Node the log file belongs to.
+ * @property node
+ * @type DS.Model
+ */
+ node: _emberData['default'].belongsTo('node'),
+
+ /**
+ * Contents of the node file so they can be displayed in the ui. will be limited to the amount of
+ * lines specified in this.get('pageSize').
+ *
+ * @property content
+ * @type String
+ */
+ content: _emberData['default'].attr('string'),
+
+ /**
+ * The name of the file. The actual id is a composite id (i.e. cluster1/node1/file1.log).
+ *
+ * @property name
+ * @type String
+ */
+ name: _emberData['default'].attr('string'),
+
+ /**
+ * Tracks the state of whether the model is refetching this.get('content').
+ *
+ * @property isRefreshing
+ * @type Boolean
+ */
+ isRefreshing: _emberData['default'].attr('boolean', { 'default': false }),
+
+ /**
+ * The max number of lines fetched in the request for this.get('content').
+ *
+ * @property pageSize
+ * @type Integer
+ */
+ pageSize: _emberData['default'].attr('number', { 'default': 0 }),
+
+ /**
+ * The total number of lines in the file.
+ *
+ * @property totalLines
+ * @type Integer
+ */
+ totalLines: _emberData['default'].attr('number', { 'default': 0 }),
+
+ /**
+ * Calculates whether there are more lines than the requested page size. Returns a
+ * Boolean Value.
+ *
+ * @method moreLinesThanPageSize
+ * @returns Boolean
+ */
+ moreLinesThanPageSize: (function () {
+ return this.get('pageSize') < this.get('totalLines');
+ }).property('pageSize', 'totalLines')
+ });
+});
+define('ember-riak-explorer/pods/log-file/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ model: function model(params) {
+ return this.explorer.getLogFile(params.clusterName, params.nodeName, params.logName);
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('node').get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('node').get('cluster'),
+ node: model.get('node'),
+ logFile: model
+ });
+ this.setViewLabel({
+ preLabel: 'Log Detail',
+ label: model.get('name')
+ });
+ },
+
+ actions: {
+ refreshLogFile: function refreshLogFile(log) {
+ log.set('isRefreshing', true);
+
+ // TODO: Add functionality to change the amount of lines the log file is tailing
+ this.explorer.getLogFileContents(log).then(function () {
+ // The response back from the server is very fast on a lot of these requests,
+ // so let the animation run for an extra second to give the feedback loop that
+ // the request has gone through.
+ setTimeout(function () {
+ return log.set('isRefreshing', false);
+ }, 1000);
+ });
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/log-file/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 4,
+ "column": 6
+ },
+ "end": {
+ "line": 8,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/log-file/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" File output from\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("code");
+ var el2 = dom.createTextNode("tail -n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "mini-label");
+ var el2 = dom.createTextNode("(");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" total lines)");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ morphs[1] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);
+ return morphs;
+ },
+ statements: [["content", "model.pageSize", ["loc", [null, [6, 20], [6, 38]]]], ["content", "model.totalLines", ["loc", [null, [7, 32], [7, 52]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 8,
+ "column": 6
+ },
+ "end": {
+ "line": 11,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/log-file/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" File output\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "mini-label");
+ var el2 = dom.createTextNode("(");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" total lines)");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["content", "model.totalLines", ["loc", [null, [10, 32], [10, 52]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 19,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/log-file/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "module-label");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "refresh action-button");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "aria-hidden", "true");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n Refresh ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [3, 1]);
+ var element1 = dom.childAt(element0, [1]);
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ morphs[1] = dom.createElementMorph(element0);
+ morphs[2] = dom.createAttrMorph(element1, 'class');
+ morphs[3] = dom.createMorphAt(element0, 3, 3);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.moreLinesThanPageSize", ["loc", [null, [4, 12], [4, 39]]]]], [], 0, 1, ["loc", [null, [4, 6], [11, 13]]]], ["element", "action", ["refreshLogFile", ["get", "model", ["loc", [null, [14, 68], [14, 73]]]]], [], ["loc", [null, [14, 42], [14, 75]]]], ["attribute", "class", ["subexpr", "if", [["get", "model.isRefreshing", ["loc", [null, [15, 25], [15, 43]]]], "ion-refresh", "ion-refresh"], [], ["loc", [null, [15, 20], [15, 73]]]]], ["content", "model.name", ["loc", [null, [16, 16], [16, 30]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 21,
+ "column": 4
+ },
+ "end": {
+ "line": 28,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/log-file/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "ivy-codemirror", [], ["mode", "erlang", "theme", "material", "lineWrapping", true, "readOnly", true, "value", ["subexpr", "@mut", [["get", "model.content", ["loc", [null, [27, 14], [27, 27]]]]], [], []]], ["loc", [null, [22, 6], [27, 29]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 29,
+ "column": 6
+ },
+ "end": {
+ "line": 31,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/log-file/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createElement("strong");
+ var el3 = dom.createTextNode("File contains no contents.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 28,
+ "column": 4
+ },
+ "end": {
+ "line": 32,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/log-file/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "info"], 0, null, ["loc", [null, [29, 6], [31, 26]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 20,
+ "column": 2
+ },
+ "end": {
+ "line": 33,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/log-file/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.content", ["loc", [null, [21, 10], [21, 23]]]]], [], 0, 1, ["loc", [null, [21, 4], [32, 11]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 34,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/log-file/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], [], 0, null, ["loc", [null, [2, 2], [19, 30]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [20, 2], [33, 28]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 35,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/log-file/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], [], 0, null, ["loc", [null, [1, 0], [34, 31]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/node/model', ['exports', 'ember-data', 'lodash/lodash', 'ember-riak-explorer/utils/riak-help/riak_status', 'ember-local-storage'], function (exports, _emberData, _lodashLodash, _emberRiakExplorerUtilsRiakHelpRiak_status, _emberLocalStorage) {
+ exports['default'] = _emberData['default'].Model.extend({
+ init: function init() {
+ this.set('statsHistory', []);
+ },
+
+ /**
+ * Cluster the node belongs to.
+ * @property cluster
+ * @type DS.Model
+ */
+ cluster: _emberData['default'].belongsTo('cluster'),
+
+ /**
+ * The nodes various configuration files
+ * @property configFiles
+ * @type DS.Model
+ */
+ configFiles: _emberData['default'].hasMany('config-file'),
+
+ /**
+ * The nodes various log files
+ * @property logFiles
+ * @type DS.Model
+ */
+ logFiles: _emberData['default'].hasMany('log-file'),
+
+ /**
+ * Whether or not the node is available when pinged.
+ *
+ * @property available
+ * @type Boolean
+ */
+ available: _emberData['default'].attr('boolean', { 'default': false }),
+
+ /**
+ * All the nodes advanced configuration. Stored as an Array of strings.
+ * i.e ["{riak_core,[{cluster_mgr,{"127.0.0.1",8098}}]}", "{riak_repl,[{data_root,"/var/db/riak/riak_repl/"}]}"]
+ *
+ * @property config
+ * @type Object
+ */
+ advancedConfig: _emberData['default'].attr(),
+
+ /**
+ * All the nodes configuration settings. Stored as an Object hashmap.
+ *
+ * @property config
+ * @type Object
+ */
+ config: _emberData['default'].attr(),
+
+ name: _emberData['default'].attr('string'),
+
+ replStatus: _emberData['default'].attr(),
+
+ /**
+ * All the nodes statistics. Stored as an Object hashmap.
+ *
+ * @property stats
+ * @type Object
+ */
+ stats: _emberData['default'].attr(),
+
+ /**
+ * Array of stats property objects with an associated timestamp
+ *
+ * @property statsHistory
+ * @type Array
+ */
+ statsHistory: (0, _emberLocalStorage.storageFor)('node-stats'),
+
+ statsByCategory: _emberData['default'].attr(),
+
+ /**
+ * Whether or not the node's ring file is "valid" or "invalid".
+ *
+ * @property status
+ * @type String
+ */
+ status: _emberData['default'].attr('string', { defaultValue: 'invalid' }),
+
+ /**
+ * Node health is determined by whether or not the node is available and if it's
+ * status is valid
+ *
+ * @method isHealthy
+ * @return Boolean
+ */
+ isHealthy: (function () {
+ return !!(this.get('available') && this.get('status') === 'valid');
+ }).property('available', 'status'),
+
+ logStatHistory: (function () {
+ // Storing a lot of large objects, may want to only store diffs and restore when needed
+ return this.get('statsHistory').pushObject({
+ timestamp: Date.now(),
+ stats: this.get('stats')
+ });
+ }).observes('stats'),
+
+ setStatsByCategory: (function () {
+ var _this = this;
+
+ if (!this.get('statsByCategory')) {
+ var _ret = (function () {
+ var stats = _this.get('stats');
+
+ // Removes any key in NodeStatsHelp that is not found in stats
+ var pruned = _lodashLodash['default'].pick(_emberRiakExplorerUtilsRiakHelpRiak_status['default'], Object.keys(stats));
+
+ // Adds Current Value from stats and merges it with the appropriate key in StatsHelp
+ var merged = _lodashLodash['default'].forEach(pruned, function (value, key) {
+ value.current_value = stats[key];
+
+ // Stringify "disk" property so it can be displayed in the UI
+ if (key === 'disk') {
+ value.current_value = value.current_value.map(function (obj) {
+ return JSON.stringify(obj);
+ });
+ }
+ });
+
+ // Groups all the keys in NodeStatsHelp by category
+ var groupedBy = _lodashLodash['default'].groupBy(merged, 'category');
+
+ // Alpha-sort by category
+ var sorted = {};
+ Object.keys(groupedBy).sort().forEach(function (key) {
+ sorted[key] = groupedBy[key];
+ });
+
+ return {
+ v: _this.set('statsByCategory', sorted)
+ };
+ })();
+
+ if (typeof _ret === 'object') return _ret.v;
+ }
+ }).observes('stats')
+ });
+});
+define('ember-riak-explorer/pods/node/monitoring/controller', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/modal'], function (exports, _ember, _emberRiakExplorerMixinsControllerModal) {
+ exports['default'] = _ember['default'].Controller.extend(_emberRiakExplorerMixinsControllerModal['default'], {
+ currentGraphs: [],
+
+ availableGraphs: [],
+
+ actions: {
+ updateGraphName: function updateGraphName(graph, newStat) {
+ return this.set('currentGraphs', this.get('currentGraphs').map(function (graphName) {
+ return graphName === graph ? newStat : graphName;
+ }));
+ },
+
+ addNewGraph: function addNewGraph(graph) {
+ this.get('currentGraphs').pushObject(graph);
+ this.send('hideModal');
+ },
+
+ removeGraph: function removeGraph(graph) {
+ this.set('currentGraphs', this.get('currentGraphs').filter(function (graphName) {
+ return graphName !== graph;
+ }));
+ }
+ }
+ });
+});
+define('ember-riak-explorer/pods/node/monitoring/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/monitoring', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesMonitoring, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesMonitoring['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ model: function model(params) {
+ return this.explorer.getNode(params.clusterName, params.nodeName);
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ node: model,
+ crudAction: 'monitoring'
+ });
+ this.setViewLabel({
+ preLabel: 'Node Monitoring',
+ label: model.get('name')
+ });
+ },
+
+ setupController: function setupController(controller, model) {
+ this._super(controller, model);
+
+ this.setPossibleGraphOptions(model.get('stats'));
+ this.setDefaultGraph();
+ }
+ });
+});
+define("ember-riak-explorer/pods/node/monitoring/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 6,
+ "column": 8
+ },
+ "end": {
+ "line": 14,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/monitoring/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "statOption", ["loc", [null, [13, 10], [13, 24]]]]],
+ locals: ["statOption"],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 17,
+ "column": 10
+ },
+ "end": {
+ "line": 19,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/monitoring/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" Graph Descritpion\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 4
+ },
+ "end": {
+ "line": 29,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/monitoring/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-label");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("span");
+ var el3 = dom.createTextNode("Displayed Graph:");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("button");
+ dom.setAttribute(el2, "type", "button");
+ dom.setAttribute(el2, "class", "action-button delete");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "ion-ios-trash");
+ dom.setAttribute(el3, "aria-hidden", "true");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n Remove Graph\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element3 = dom.childAt(fragment, [1]);
+ var element4 = dom.childAt(fragment, [3, 1]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(element3, 3, 3);
+ morphs[1] = dom.createMorphAt(dom.childAt(element3, [5]), 1, 1);
+ morphs[2] = dom.createElementMorph(element4);
+ return morphs;
+ },
+ statements: [["block", "power-select", [], ["selected", ["subexpr", "@mut", [["get", "statName", ["loc", [null, [7, 17], [7, 25]]]]], [], []], "options", ["subexpr", "@mut", [["get", "availableGraphs", ["loc", [null, [8, 16], [8, 31]]]]], [], []], "searchEnabled", true, "onchange", ["subexpr", "action", ["updateGraphName", ["get", "statName", ["loc", [null, [10, 43], [10, 51]]]]], [], ["loc", [null, [10, 17], [10, 52]]]], "class", "node-chart-select"], 0, null, ["loc", [null, [6, 8], [14, 25]]]], ["block", "tooltip.node-stats", [], ["itemKey", ["subexpr", "@mut", [["get", "statName", ["loc", [null, [17, 40], [17, 48]]]]], [], []], "useIcon", false], 1, null, ["loc", [null, [17, 10], [19, 33]]]], ["element", "action", ["removeGraph", ["get", "statName", ["loc", [null, [24, 82], [24, 90]]]]], [], ["loc", [null, [24, 59], [24, 92]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 30,
+ "column": 4
+ },
+ "end": {
+ "line": 32,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/monitoring/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "charts.node-stat", [], ["node", ["subexpr", "@mut", [["get", "model", ["loc", [null, [31, 30], [31, 35]]]]], [], []], "statToGraph", ["subexpr", "@mut", [["get", "statName", ["loc", [null, [31, 48], [31, 56]]]]], [], []]], ["loc", [null, [31, 6], [31, 58]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 33,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/monitoring/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], [], 0, null, ["loc", [null, [3, 4], [29, 32]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [30, 4], [32, 30]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 34,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/monitoring/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], [], 0, null, ["loc", [null, [2, 2], [33, 33]]]]],
+ locals: ["statName"],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 39,
+ "column": 2
+ },
+ "end": {
+ "line": 44,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/monitoring/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("button");
+ dom.setAttribute(el1, "class", "btn btn-primary");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "ion-plus-circled");
+ dom.setAttribute(el2, "aria-hidden", "true");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n Add new graph\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element2 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element2);
+ return morphs;
+ },
+ statements: [["element", "action", ["showModal"], [], ["loc", [null, [40, 36], [40, 58]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 38,
+ "column": 0
+ },
+ "end": {
+ "line": 45,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/monitoring/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.body", [], [], 0, null, ["loc", [null, [39, 2], [44, 28]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 62,
+ "column": 8
+ },
+ "end": {
+ "line": 69,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/monitoring/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "statOption", ["loc", [null, [68, 10], [68, 24]]]]],
+ locals: ["statOption"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 49,
+ "column": 2
+ },
+ "end": {
+ "line": 76,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/monitoring/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "modal-content-container");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("header");
+ dom.setAttribute(el2, "class", "modal-header");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("h3");
+ var el4 = dom.createTextNode("New Graph");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("section");
+ dom.setAttribute(el2, "class", "modal-body");
+ dom.setAttribute(el2, "style", "min-width: 300px;");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("p");
+ var el4 = dom.createTextNode("\n Select a new statistic to add it to the dashboard.\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("footer");
+ dom.setAttribute(el2, "class", "modal-footer");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("button");
+ dom.setAttribute(el3, "class", "btn btn-default");
+ var el4 = dom.createTextNode("Cancel");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var element1 = dom.childAt(element0, [5, 1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [3]), 3, 3);
+ morphs[1] = dom.createElementMorph(element1);
+ return morphs;
+ },
+ statements: [["block", "power-select", [], ["selected", "", "options", ["subexpr", "@mut", [["get", "availableGraphs", ["loc", [null, [64, 16], [64, 31]]]]], [], []], "searchEnabled", true, "onchange", ["subexpr", "action", ["addNewGraph"], [], ["loc", [null, [66, 17], [66, 39]]]]], 0, null, ["loc", [null, [62, 8], [69, 25]]]], ["element", "action", ["hideModal"], [], ["loc", [null, [73, 40], [73, 62]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 48,
+ "column": 0
+ },
+ "end": {
+ "line": 77,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/monitoring/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "modal-dialog", [], ["close", "hideModal", "translucentOverlay", true], 0, null, ["loc", [null, [49, 2], [76, 19]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 79,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/monitoring/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "currentGraphs", ["loc", [null, [1, 8], [1, 21]]]]], [], 0, null, ["loc", [null, [1, 0], [34, 9]]]], ["block", "dashboard-module.container", [], ["class", "no-border"], 1, null, ["loc", [null, [38, 0], [45, 31]]]], ["block", "if", [["get", "modalVisible", ["loc", [null, [48, 6], [48, 18]]]]], [], 2, null, ["loc", [null, [48, 0], [77, 7]]]]],
+ locals: [],
+ templates: [child0, child1, child2]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/node/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ model: function model(params) {
+ return this.explorer.getNode(params.clusterName, params.nodeName);
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ node: model
+ });
+ this.setViewLabel({
+ preLabel: 'Node Detail',
+ label: model.get('name')
+ });
+
+ if (model.get('cluster').get('isEnterpriseEdition')) {
+ return this.explorer.getNodeReplicationStatus(model);
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/node/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 8,
+ "column": 10
+ },
+ "end": {
+ "line": 8,
+ "column": 44
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("Replication Status");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 7,
+ "column": 8
+ },
+ "end": {
+ "line": 9,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["block", "tablist.tab", [], [], 0, null, ["loc", [null, [8, 10], [8, 60]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 10,
+ "column": 8
+ },
+ "end": {
+ "line": 10,
+ "column": 37
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("Configuration");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 11,
+ "column": 8
+ },
+ "end": {
+ "line": 11,
+ "column": 34
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("Statistics");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child3 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 12,
+ "column": 8
+ },
+ "end": {
+ "line": 12,
+ "column": 33
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("Log Files");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child4 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 13,
+ "column": 8
+ },
+ "end": {
+ "line": 13,
+ "column": 36
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("Config Files");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 6,
+ "column": 6
+ },
+ "end": {
+ "line": 15,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(6);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);
+ morphs[4] = dom.createMorphAt(fragment, 8, 8, contextualElement);
+ morphs[5] = dom.createMorphAt(fragment, 10, 10, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.cluster.isEnterpriseEdition", ["loc", [null, [7, 14], [7, 47]]]]], [], 0, null, ["loc", [null, [7, 8], [9, 15]]]], ["block", "tablist.tab", [], [], 1, null, ["loc", [null, [10, 8], [10, 53]]]], ["block", "tablist.tab", [], [], 2, null, ["loc", [null, [11, 8], [11, 50]]]], ["block", "tablist.tab", [], [], 3, null, ["loc", [null, [12, 8], [12, 49]]]], ["block", "tablist.tab", [], [], 4, null, ["loc", [null, [13, 8], [13, 52]]]], ["inline", "link-to", ["Monitoring", "node.monitoring", ["get", "model.cluster.name", ["loc", [null, [14, 49], [14, 67]]]], ["get", "model.name", ["loc", [null, [14, 68], [14, 78]]]]], ["class", "ivy-tab"], ["loc", [null, [14, 8], [14, 96]]]]],
+ locals: ["tablist"],
+ templates: [child0, child1, child2, child3, child4]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 22,
+ "column": 12
+ },
+ "end": {
+ "line": 27,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 2,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createElement("code");
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element4 = dom.childAt(fragment, [1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(dom.childAt(element4, [1]), 0, 0);
+ morphs[1] = dom.createMorphAt(dom.childAt(element4, [3, 0]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "statKey", ["loc", [null, [24, 32], [24, 43]]]], ["content", "statValue", ["loc", [null, [25, 40], [25, 53]]]]],
+ locals: ["statKey", "statValue"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 19,
+ "column": 8
+ },
+ "end": {
+ "line": 30,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("table");
+ dom.setAttribute(el1, "class", "key-value-table");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tbody");
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each-in", [["get", "model.replStatus", ["loc", [null, [22, 23], [22, 39]]]]], [], 0, null, ["loc", [null, [22, 12], [27, 24]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 18,
+ "column": 6
+ },
+ "end": {
+ "line": 31,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "tabs.tabpanel", [], [], 0, null, ["loc", [null, [19, 8], [30, 26]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 38,
+ "column": 12
+ },
+ "end": {
+ "line": 40,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createElement("code");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 0]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "advancedItem", ["loc", [null, [39, 24], [39, 40]]]]],
+ locals: ["advancedItem"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 35,
+ "column": 8
+ },
+ "end": {
+ "line": 44,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createTextNode("Advanced");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ dom.setAttribute(el1, "class", "code-list");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createTextNode("General");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "model.advancedConfig", ["loc", [null, [38, 20], [38, 40]]]]], [], 0, null, ["loc", [null, [38, 12], [40, 21]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 48,
+ "column": 10
+ },
+ "end": {
+ "line": 56,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 2,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createElement("code");
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element2 = dom.childAt(fragment, [1]);
+ var element3 = dom.childAt(element2, [1]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(element3, 1, 1);
+ morphs[1] = dom.createMorphAt(element3, 3, 3);
+ morphs[2] = dom.createMorphAt(dom.childAt(element2, [3, 0]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "name", ["loc", [null, [51, 16], [51, 24]]]], ["inline", "tooltip.node-config", [], ["itemKey", ["subexpr", "@mut", [["get", "name", ["loc", [null, [52, 46], [52, 50]]]]], [], []]], ["loc", [null, [52, 16], [52, 52]]]], ["content", "value", ["loc", [null, [54, 38], [54, 47]]]]],
+ locals: ["name", "value"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 34,
+ "column": 6
+ },
+ "end": {
+ "line": 59,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("table");
+ dom.setAttribute(el1, "class", "key-value-table");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tbody");
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2, 1]), 1, 1);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.advancedConfig", ["loc", [null, [35, 14], [35, 34]]]]], [], 0, null, ["loc", [null, [35, 8], [44, 15]]]], ["block", "each-in", [["get", "model.config", ["loc", [null, [48, 21], [48, 33]]]]], [], 1, null, ["loc", [null, [48, 10], [56, 22]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child3 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 68,
+ "column": 14
+ },
+ "end": {
+ "line": 70,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "category", ["loc", [null, [69, 16], [69, 28]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 67,
+ "column": 12
+ },
+ "end": {
+ "line": 71,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 2,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "tablist.tab", [], [], 0, null, ["loc", [null, [68, 14], [70, 30]]]]],
+ locals: ["category", "stats"],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 66,
+ "column": 10
+ },
+ "end": {
+ "line": 72,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "each-in", [["get", "model.statsByCategory", ["loc", [null, [67, 23], [67, 44]]]]], [], 0, null, ["loc", [null, [67, 12], [71, 24]]]]],
+ locals: ["tablist"],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 78,
+ "column": 16
+ },
+ "end": {
+ "line": 88,
+ "column": 16
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var element1 = dom.childAt(element0, [1]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(element1, 1, 1);
+ morphs[1] = dom.createMorphAt(element1, 3, 3);
+ morphs[2] = dom.createMorphAt(dom.childAt(element0, [3, 1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "stat.name", ["loc", [null, [81, 22], [81, 35]]]], ["inline", "tooltip.node-stats", [], ["itemKey", ["subexpr", "@mut", [["get", "stat.name", ["loc", [null, [82, 51], [82, 60]]]]], [], []]], ["loc", [null, [82, 22], [82, 62]]]], ["content", "stat.current_value", ["loc", [null, [85, 28], [85, 50]]]]],
+ locals: ["stat"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 75,
+ "column": 12
+ },
+ "end": {
+ "line": 91,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("table");
+ dom.setAttribute(el1, "class", "key-value-table");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tbody");
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "stats", ["loc", [null, [78, 24], [78, 29]]]]], [], 0, null, ["loc", [null, [78, 16], [88, 25]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 74,
+ "column": 10
+ },
+ "end": {
+ "line": 92,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 2,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "tabs.tabpanel", [], [], 0, null, ["loc", [null, [75, 12], [91, 30]]]]],
+ locals: ["category", "stats"],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 65,
+ "column": 8
+ },
+ "end": {
+ "line": 93,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "tabs.tablist", [], ["class", "capitalize"], 0, null, ["loc", [null, [66, 10], [72, 27]]]], ["block", "each-in", [["get", "model.statsByCategory", ["loc", [null, [74, 21], [74, 42]]]]], [], 1, null, ["loc", [null, [74, 10], [92, 22]]]]],
+ locals: ["tabs"],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 62,
+ "column": 6
+ },
+ "end": {
+ "line": 94,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "ivy-tabs", [], ["on-select", ["subexpr", "action", [["subexpr", "mut", [["get", "nestedSelectedIndex", ["loc", [null, [65, 43], [65, 62]]]]], [], ["loc", [null, [65, 38], [65, 63]]]]], [], ["loc", [null, [65, 30], [65, 64]]]], "selected-index", ["subexpr", "@mut", [["get", "nestedSelectedIndex", ["loc", [null, [65, 80], [65, 99]]]]], [], []], "class", "vertical"], 0, null, ["loc", [null, [65, 8], [93, 21]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child4 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 100,
+ "column": 12
+ },
+ "end": {
+ "line": 104,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["inline", "link-to", [["get", "logFile.name", ["loc", [null, [102, 26], [102, 38]]]], "log-file", ["get", "model.cluster.name", ["loc", [null, [102, 50], [102, 68]]]], ["get", "model.name", ["loc", [null, [102, 69], [102, 79]]]], ["get", "logFile.name", ["loc", [null, [102, 80], [102, 92]]]]], [], ["loc", [null, [102, 16], [102, 94]]]]],
+ locals: ["logFile"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 98,
+ "column": 8
+ },
+ "end": {
+ "line": 106,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ dom.setAttribute(el1, "class", "button-list");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "model.logFiles", ["loc", [null, [100, 20], [100, 34]]]]], [], 0, null, ["loc", [null, [100, 12], [104, 21]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 106,
+ "column": 8
+ },
+ "end": {
+ "line": 108,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" No log files for this node\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 97,
+ "column": 6
+ },
+ "end": {
+ "line": 109,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.logFiles", ["loc", [null, [98, 14], [98, 28]]]]], [], 0, 1, ["loc", [null, [98, 8], [108, 15]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child5 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 115,
+ "column": 12
+ },
+ "end": {
+ "line": 119,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["inline", "link-to", [["get", "configFile.name", ["loc", [null, [117, 26], [117, 41]]]], "config-file", ["get", "model.cluster.name", ["loc", [null, [117, 56], [117, 74]]]], ["get", "model.name", ["loc", [null, [117, 75], [117, 85]]]], ["get", "configFile.name", ["loc", [null, [117, 86], [117, 101]]]]], [], ["loc", [null, [117, 16], [117, 103]]]]],
+ locals: ["configFile"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 113,
+ "column": 8
+ },
+ "end": {
+ "line": 121,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ dom.setAttribute(el1, "class", "button-list");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "model.configFiles", ["loc", [null, [115, 20], [115, 37]]]]], [], 0, null, ["loc", [null, [115, 12], [119, 21]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 121,
+ "column": 8
+ },
+ "end": {
+ "line": 123,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" No config files for this node\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 112,
+ "column": 6
+ },
+ "end": {
+ "line": 124,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.configFiles", ["loc", [null, [113, 14], [113, 31]]]]], [], 0, 1, ["loc", [null, [113, 8], [123, 15]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 5,
+ "column": 4
+ },
+ "end": {
+ "line": 125,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(6);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);
+ morphs[4] = dom.createMorphAt(fragment, 8, 8, contextualElement);
+ morphs[5] = dom.createMorphAt(fragment, 10, 10, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "tabs.tablist", [], [], 0, null, ["loc", [null, [6, 6], [15, 23]]]], ["block", "if", [["get", "model.cluster.isEnterpriseEdition", ["loc", [null, [18, 12], [18, 45]]]]], [], 1, null, ["loc", [null, [18, 6], [31, 13]]]], ["block", "tabs.tabpanel", [], [], 2, null, ["loc", [null, [34, 6], [59, 24]]]], ["block", "tabs.tabpanel", [], [], 3, null, ["loc", [null, [62, 6], [94, 24]]]], ["block", "tabs.tabpanel", [], [], 4, null, ["loc", [null, [97, 6], [109, 24]]]], ["block", "tabs.tabpanel", [], [], 5, null, ["loc", [null, [112, 6], [124, 24]]]]],
+ locals: ["tabs"],
+ templates: [child0, child1, child2, child3, child4, child5]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 2
+ },
+ "end": {
+ "line": 126,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "ivy-tabs", [], ["on-select", ["subexpr", "action", [["subexpr", "mut", [["get", "selectedIndex", ["loc", [null, [5, 39], [5, 52]]]]], [], ["loc", [null, [5, 34], [5, 53]]]]], [], ["loc", [null, [5, 26], [5, 54]]]], "selected-index", ["subexpr", "@mut", [["get", "selectedIndex", ["loc", [null, [5, 70], [5, 83]]]]], [], []]], 0, null, ["loc", [null, [5, 4], [125, 17]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 0
+ },
+ "end": {
+ "line": 127,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.body", [], [], 0, null, ["loc", [null, [3, 2], [126, 28]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 128,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/node/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], [], 0, null, ["loc", [null, [2, 0], [127, 31]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/riak-object/controller', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Controller.extend({
+ loadingMessage: 'Attempting request...',
+
+ showLoadingSpinner: false,
+
+ stringifiedContents: '',
+
+ errors: []
+ });
+});
+define('ember-riak-explorer/pods/riak-object/counter/controller', ['exports', 'ember-riak-explorer/pods/riak-object/controller'], function (exports, _emberRiakExplorerPodsRiakObjectController) {
+ exports['default'] = _emberRiakExplorerPodsRiakObjectController['default'].extend({});
+});
+define('ember-riak-explorer/pods/riak-object/counter/route', ['exports', 'ember-riak-explorer/pods/riak-object/route'], function (exports, _emberRiakExplorerPodsRiakObjectRoute) {
+ exports['default'] = _emberRiakExplorerPodsRiakObjectRoute['default'].extend({
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ bucketType: model.get('bucketType'),
+ bucket: model.get('bucket'),
+ riakObject: model
+ });
+ this.setViewLabel({
+ preLabel: 'Object',
+ label: model.get('name')
+ });
+ },
+
+ actions: {
+ increment: function increment(counter) {
+ var currentValue = counter.get('contents');
+ var newValue = currentValue + 1;
+
+ counter.set('contents', newValue);
+ this.explorer.updateCRDT(counter, { increment: 1 });
+ },
+
+ decrement: function decrement(counter) {
+ var currentValue = counter.get('contents');
+ var newValue = currentValue - 1;
+
+ counter.set('contents', newValue);
+ this.explorer.updateCRDT(counter, { decrement: 1 });
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/riak-object/counter/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 4
+ },
+ "end": {
+ "line": 11,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/counter/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("button");
+ dom.setAttribute(el2, "type", "button");
+ dom.setAttribute(el2, "class", "action-button delete");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "ion-trash-a");
+ dom.setAttribute(el3, "aria-hidden", "true");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n Delete Object\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element4 = dom.childAt(fragment, [1, 1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element4);
+ return morphs;
+ },
+ statements: [["element", "action", ["deleteObject", ["get", "model", ["loc", [null, [6, 34], [6, 39]]]]], [], ["loc", [null, [6, 10], [6, 41]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 12,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/counter/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.isLoaded", ["loc", [null, [3, 10], [3, 24]]]]], [], 0, null, ["loc", [null, [3, 4], [11, 11]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 14,
+ "column": 4
+ },
+ "end": {
+ "line": 16,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/counter/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "loading-spinner", [], ["statusMessage", ["subexpr", "@mut", [["get", "loadingMessage", ["loc", [null, [15, 38], [15, 52]]]]], [], []]], ["loc", [null, [15, 6], [15, 54]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 16,
+ "column": 4
+ },
+ "end": {
+ "line": 40,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/counter/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("table");
+ dom.setAttribute(el1, "class", "key-value-table");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tbody");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("Current Value:");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value counter-value");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createComment("");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("\n Change Value:\n ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value");
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createElement("form");
+ dom.setAttribute(el5, "class", "form-inline");
+ var el6 = dom.createTextNode("\n ");
+ dom.appendChild(el5, el6);
+ var el6 = dom.createElement("button");
+ dom.setAttribute(el6, "type", "button");
+ dom.setAttribute(el6, "class", "btn btn-primary");
+ var el7 = dom.createTextNode("\n ");
+ dom.appendChild(el6, el7);
+ var el7 = dom.createElement("span");
+ dom.setAttribute(el7, "class", "ion-minus-round");
+ dom.setAttribute(el7, "aria-hidden", "true");
+ dom.appendChild(el6, el7);
+ var el7 = dom.createTextNode("\n ");
+ dom.appendChild(el6, el7);
+ dom.appendChild(el5, el6);
+ var el6 = dom.createTextNode("\n ");
+ dom.appendChild(el5, el6);
+ var el6 = dom.createElement("button");
+ dom.setAttribute(el6, "type", "button");
+ dom.setAttribute(el6, "class", "btn btn-primary");
+ var el7 = dom.createTextNode("\n ");
+ dom.appendChild(el6, el7);
+ var el7 = dom.createElement("span");
+ dom.setAttribute(el7, "class", "ion-plus-round");
+ dom.setAttribute(el7, "aria-hidden", "true");
+ dom.appendChild(el6, el7);
+ var el7 = dom.createTextNode("\n ");
+ dom.appendChild(el6, el7);
+ dom.appendChild(el5, el6);
+ var el6 = dom.createTextNode("\n ");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1, 1]);
+ var element1 = dom.childAt(element0, [3, 3, 1]);
+ var element2 = dom.childAt(element1, [1]);
+ var element3 = dom.childAt(element1, [3]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [1, 3, 0]), 0, 0);
+ morphs[1] = dom.createElementMorph(element2);
+ morphs[2] = dom.createElementMorph(element3);
+ return morphs;
+ },
+ statements: [["content", "model.contents", ["loc", [null, [21, 48], [21, 66]]]], ["element", "action", ["decrement", ["get", "model", ["loc", [null, [29, 81], [29, 86]]]]], [], ["loc", [null, [29, 60], [29, 88]]]], ["element", "action", ["increment", ["get", "model", ["loc", [null, [32, 81], [32, 86]]]]], [], ["loc", [null, [32, 60], [32, 88]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 13,
+ "column": 2
+ },
+ "end": {
+ "line": 41,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/counter/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "showLoadingSpinner", ["loc", [null, [14, 10], [14, 28]]]]], [], 0, 1, ["loc", [null, [14, 4], [40, 11]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 42,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/counter/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Object Details"], 0, null, ["loc", [null, [2, 2], [12, 30]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [13, 2], [41, 28]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 42,
+ "column": 31
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/counter/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], ["class", "object-counter-container small-width"], 0, null, ["loc", [null, [1, 0], [42, 31]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/riak-object/create/controller', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = _ember['default'].Controller.extend({
+ properties: [],
+
+ showSpinner: false,
+
+ spinnerMessage: 'loading ...',
+
+ errors: [],
+
+ clearState: function clearState() {
+ this.set('showSpinner', false);
+ this.set('properties', []);
+ this.set('errors', []);
+ }
+ });
+});
+define('ember-riak-explorer/pods/riak-object/create/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/alerts', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state', 'ember-riak-explorer/utils/validations', 'ember-riak-explorer/utils/riak-object-formatter', 'lodash/lodash'], function (exports, _ember, _emberRiakExplorerMixinsRoutesAlerts, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState, _emberRiakExplorerUtilsValidations, _emberRiakExplorerUtilsRiakObjectFormatter, _lodashLodash) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesAlerts['default'], _emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ model: function model(params) {
+ var self = this;
+
+ return this.explorer.getBucket(params.clusterName, params.bucketTypeName, params.bucketName).then(function (bucket) {
+ return self.store.createRecord('riak-object', {
+ bucket: bucket,
+ type: bucket.get('dataTypeName')
+ });
+ });
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ bucketType: model.get('bucketType'),
+ bucket: model.get('bucket'),
+ crudAction: 'create'
+ });
+ this.setViewLabel({
+ preLabel: 'New Object'
+ });
+ },
+
+ isValid: function isValid(object) {
+ var isValid = undefined;
+
+ try {
+ var objectType = object.get('type');
+ var objectName = object.get('name');
+
+ isValid = _emberRiakExplorerUtilsValidations['default'].hasName('buckets object', objectName) && _emberRiakExplorerUtilsValidations['default'].noWhiteSpaceInName('buckets object', objectName) && _emberRiakExplorerUtilsValidations['default'].objectHasCorrectValueType(objectType, objectName, _emberRiakExplorerUtilsValidations['default'].isJsonParseable(object.get('contents')));
+ } catch (e) {
+ this.controller.get('errors').pushObject(e.message);
+ this.scrollToTop();
+ }
+
+ return isValid;
+ },
+
+ actions: {
+ didTransition: function didTransition() {
+ this.controller.set('errors', []);
+ this.controller.set('showSpinner', false);
+ },
+
+ createObject: function createObject() {
+ var self = this;
+ var controller = this.controller;
+ var riakObject = this.currentModel;
+ var clusterName = riakObject.get('cluster').get('name');
+ var bucketType = riakObject.get('bucketType');
+ var bucket = riakObject.get('bucket');
+ var bucketTypeName = bucketType.get('name');
+ var bucketName = bucket.get('name');
+ var objectName = riakObject.get('name');
+
+ controller.set('errors', []);
+
+ if (this.isValid(riakObject)) {
+ var contents = riakObject.set('contents', _emberRiakExplorerUtilsValidations['default'].isJsonParseable(riakObject.get('contents'))); // set contents of the object as the JSON parsed version;
+ var serializedData = _emberRiakExplorerUtilsRiakObjectFormatter['default'].formatRiakObject(riakObject.get('type'), contents);
+ var createObject = bucketType.get('isCRDT') ? _lodashLodash['default'].partial(this.explorer.createCRDT, clusterName, bucketTypeName, bucketName, objectName, serializedData) : _lodashLodash['default'].bind(riakObject.save, riakObject);
+
+ controller.set('spinnerMessage', 'Creating Object ...');
+ controller.set('showSpinner', true);
+
+ // createBucket()
+ createObject().then(function () {
+ return self.explorer.refreshObjectList(bucket);
+ }).then(function onSuccess() {
+ self.transitionTo(riakObject.get('routePath'), clusterName, bucketTypeName, bucketName, objectName);
+ }, function onFail() {
+ controller.set('showSpinner', false);
+ // TODO: Don't use template
+ self.render('alerts.error-request-was-not-processed', {
+ into: 'application',
+ outlet: 'alert'
+ });
+ });
+ }
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/riak-object/create/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 5,
+ "column": 6
+ },
+ "end": {
+ "line": 7,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createUnsafeMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "error", ["loc", [null, [6, 12], [6, 23]]]]],
+ locals: ["error"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 9,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "label label-danger");
+ var el3 = dom.createTextNode("Errors");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "errors", ["loc", [null, [5, 14], [5, 20]]]]], [], 0, null, ["loc", [null, [5, 6], [7, 15]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 10,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "danger"], 0, null, ["loc", [null, [2, 2], [9, 22]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 15,
+ "column": 6
+ },
+ "end": {
+ "line": 18,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-close-round");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Cancel\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 13,
+ "column": 2
+ },
+ "end": {
+ "line": 20,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link.explorer-resource", [], ["resourceType", "bucket", "resourceObj", ["subexpr", "@mut", [["get", "model.bucket", ["loc", [null, [15, 66], [15, 78]]]]], [], []], "linkClass", "cancel action-button"], 0, null, ["loc", [null, [15, 6], [18, 33]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 22,
+ "column": 4
+ },
+ "end": {
+ "line": 24,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "loading-spinner", [], ["statusMessage", ["subexpr", "@mut", [["get", "spinnerMessage", ["loc", [null, [23, 38], [23, 52]]]]], [], []]], ["loc", [null, [23, 6], [23, 54]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 24,
+ "column": 4
+ },
+ "end": {
+ "line": 28,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "new-object-inputs", [], ["object", ["subexpr", "@mut", [["get", "model", ["loc", [null, [25, 33], [25, 38]]]]], [], []]], ["loc", [null, [25, 6], [25, 40]]]], ["inline", "form.explorer-button", [], ["label", "Create Object", "buttonClick", "createObject"], ["loc", [null, [27, 6], [27, 79]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 21,
+ "column": 2
+ },
+ "end": {
+ "line": 29,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "showSpinner", ["loc", [null, [22, 10], [22, 21]]]]], [], 0, 1, ["loc", [null, [22, 4], [28, 11]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 12,
+ "column": 0
+ },
+ "end": {
+ "line": 30,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Create Object Form"], 0, null, ["loc", [null, [13, 2], [20, 30]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [21, 2], [29, 28]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 30,
+ "column": 31
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "errors", ["loc", [null, [1, 6], [1, 12]]]]], [], 0, null, ["loc", [null, [1, 0], [10, 7]]]], ["block", "dashboard-module.container", [], ["class", "small-width bucket-create-container"], 1, null, ["loc", [null, [12, 0], [30, 31]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/riak-object/edit/route', ['exports', 'ember-riak-explorer/pods/riak-object/route'], function (exports, _emberRiakExplorerPodsRiakObjectRoute) {
+ exports['default'] = _emberRiakExplorerPodsRiakObjectRoute['default'].extend({
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ bucketType: model.get('bucketType'),
+ bucket: model.get('bucket'),
+ riakObject: model,
+ crudAction: 'edit'
+ });
+ this.setViewLabel({
+ preLabel: 'Object',
+ label: model.get('name')
+ });
+ },
+
+ actions: {
+ updateObject: function updateObject(object) {
+ var self = this;
+ var controller = this.controller;
+ var clusterName = object.get('cluster').get('name');
+ var bucketTypeName = object.get('bucketType').get('name');
+ var bucketName = object.get('bucket').get('name');
+ var objectName = object.get('name');
+
+ try {
+ object.set('contents', JSON.parse(controller.get('stringifiedContents')));
+ object.save().then(function () {
+ self.transitionTo('riak-object', clusterName, bucketTypeName, bucketName, objectName);
+ });
+ } catch (e) {
+ self.scrollToTop();
+ self.showAlert('alerts.error-must-be-json-parseable');
+ }
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/riak-object/edit/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 4,
+ "column": 6
+ },
+ "end": {
+ "line": 12,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-close-round");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Cancel\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 14,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["riak-object", ["get", "model.cluster.name", ["loc", [null, [5, 6], [5, 24]]]], ["get", "model.bucketType.name", ["loc", [null, [6, 6], [6, 27]]]], ["get", "model.bucket.name", ["loc", [null, [7, 6], [7, 23]]]], ["get", "model.name", ["loc", [null, [8, 6], [8, 16]]]]], ["class", "action-button cancel"], 0, null, ["loc", [null, [4, 6], [12, 18]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 37,
+ "column": 8
+ },
+ "end": {
+ "line": 42,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "form-group content-type");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("label");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element1 = dom.childAt(fragment, [1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(dom.childAt(element1, [1]), 0, 0);
+ morphs[1] = dom.createMorphAt(element1, 3, 3);
+ return morphs;
+ },
+ statements: [["content", "header.key", ["loc", [null, [39, 19], [39, 33]]]], ["inline", "input", [], ["value", ["subexpr", "@mut", [["get", "header.value", ["loc", [null, [40, 26], [40, 38]]]]], [], []], "id", ["subexpr", "@mut", [["get", "header.key", ["loc", [null, [40, 42], [40, 52]]]]], [], []], "class", "form-control"], ["loc", [null, [40, 12], [40, 75]]]]],
+ locals: ["header"],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 46,
+ "column": 8
+ },
+ "end": {
+ "line": 51,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "form-group content-type");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("label");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 0, 0);
+ morphs[1] = dom.createMorphAt(element0, 3, 3);
+ return morphs;
+ },
+ statements: [["content", "header.key", ["loc", [null, [48, 19], [48, 33]]]], ["inline", "input", [], ["value", ["subexpr", "@mut", [["get", "header.value", ["loc", [null, [49, 26], [49, 38]]]]], [], []], "id", ["subexpr", "@mut", [["get", "header.key", ["loc", [null, [49, 42], [49, 52]]]]], [], []], "class", "form-control"], ["loc", [null, [49, 12], [49, 75]]]]],
+ locals: ["header"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 16,
+ "column": 2
+ },
+ "end": {
+ "line": 60,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "update-object-form");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("section");
+ dom.setAttribute(el2, "class", "object-contents");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "section-title");
+ var el4 = dom.createTextNode("Object Contents");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "form-group content-type");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("label");
+ var el5 = dom.createTextNode("Content Type");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "form-group content");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("label");
+ var el5 = dom.createTextNode("Content");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("section");
+ dom.setAttribute(el2, "class", "secondary-indexes");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "section-title");
+ var el4 = dom.createTextNode("Secondary Indexes");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("section");
+ dom.setAttribute(el2, "class", "custom-headers");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "section-title");
+ var el4 = dom.createTextNode("Custom Headers");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("section");
+ dom.setAttribute(el2, "class", "update-object");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("button");
+ dom.setAttribute(el3, "type", "button");
+ dom.setAttribute(el3, "class", "btn btn-primary");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("span");
+ dom.setAttribute(el4, "class", "ion-edit");
+ dom.setAttribute(el4, "aria-hidden", "true");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n Update Object\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element2 = dom.childAt(fragment, [1]);
+ var element3 = dom.childAt(element2, [1]);
+ var element4 = dom.childAt(element2, [7, 1]);
+ var morphs = new Array(5);
+ morphs[0] = dom.createMorphAt(dom.childAt(element3, [3]), 3, 3);
+ morphs[1] = dom.createMorphAt(dom.childAt(element3, [5]), 3, 3);
+ morphs[2] = dom.createMorphAt(dom.childAt(element2, [3]), 3, 3);
+ morphs[3] = dom.createMorphAt(dom.childAt(element2, [5]), 3, 3);
+ morphs[4] = dom.createElementMorph(element4);
+ return morphs;
+ },
+ statements: [["inline", "input", [], ["value", ["subexpr", "@mut", [["get", "model.contentType", ["loc", [null, [22, 24], [22, 41]]]]], [], []], "id", "metadata.contentType", "class", "form-control"], ["loc", [null, [22, 10], [24, 32]]]], ["inline", "ivy-codemirror", [], ["mode", "javascript", "theme", "material", "lineWrapping", true, "value", ["subexpr", "mut", [["get", "stringifiedContents", ["loc", [null, [32, 21], [32, 40]]]]], [], ["loc", [null, [32, 16], [32, 41]]]]], ["loc", [null, [28, 10], [32, 43]]]], ["block", "each", [["get", "model.indexes", ["loc", [null, [37, 16], [37, 29]]]]], [], 0, null, ["loc", [null, [37, 8], [42, 17]]]], ["block", "each", [["get", "model.headersCustom", ["loc", [null, [46, 16], [46, 35]]]]], [], 1, null, ["loc", [null, [46, 8], [51, 17]]]], ["element", "action", ["updateObject", ["get", "model", ["loc", [null, [54, 78], [54, 83]]]]], [], ["loc", [null, [54, 54], [54, 85]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 61,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Object Edit"], 0, null, ["loc", [null, [2, 2], [14, 30]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [16, 2], [60, 28]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 62,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], ["class", "small-width"], 0, null, ["loc", [null, [1, 0], [61, 31]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/riak-object/hll/controller', ['exports', 'ember-riak-explorer/pods/riak-object/controller'], function (exports, _emberRiakExplorerPodsRiakObjectController) {
+ exports['default'] = _emberRiakExplorerPodsRiakObjectController['default'].extend({});
+});
+define('ember-riak-explorer/pods/riak-object/hll/route', ['exports', 'ember-riak-explorer/pods/riak-object/route'], function (exports, _emberRiakExplorerPodsRiakObjectRoute) {
+ exports['default'] = _emberRiakExplorerPodsRiakObjectRoute['default'].extend({
+ actions: {
+ /**
+ * Adds an element to the HLL list.
+ * @event addSetElement
+ * @param {String} item
+ */
+ addElement: function addElement(item) {
+ var self = this;
+ var controller = this.get('controller');
+ var hll = this.currentModel;
+ var clusterName = hll.get('cluster').get('name');
+ var bucketTypeName = hll.get('bucketType').get('name');
+ var bucketName = hll.get('bucket').get('name');
+ var objectName = hll.get('name');
+
+ this.explorer.updateCRDT(hll, { add: item }).then(function () {
+ controller.set('showLoadingSpinner', true);
+
+ return self.explorer.getObject(clusterName, bucketTypeName, bucketName, objectName);
+ }).then(function () {
+ return controller.set('showLoadingSpinner', false);
+ });
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/riak-object/hll/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 13,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/hll/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "class", "action-button raw");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "ion-eye");
+ dom.setAttribute(el3, "aria-hidden", "true");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n View Raw Data\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("button");
+ dom.setAttribute(el2, "type", "button");
+ dom.setAttribute(el2, "class", "action-button delete");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "ion-trash-a");
+ dom.setAttribute(el3, "aria-hidden", "true");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n Delete Object\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element2 = dom.childAt(fragment, [1]);
+ var element3 = dom.childAt(element2, [1]);
+ var element4 = dom.childAt(element2, [3]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createAttrMorph(element3, 'href');
+ morphs[1] = dom.createElementMorph(element4);
+ return morphs;
+ },
+ statements: [["attribute", "href", ["concat", [["get", "model.url", ["loc", [null, [4, 17], [4, 26]]]]]]], ["element", "action", ["deleteObject", ["get", "model", ["loc", [null, [8, 81], [8, 86]]]]], [], ["loc", [null, [8, 57], [8, 88]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 15,
+ "column": 4
+ },
+ "end": {
+ "line": 17,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/hll/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "loading-spinner", [], ["statusMessage", ["subexpr", "@mut", [["get", "loadingMessage", ["loc", [null, [16, 38], [16, 52]]]]], [], []]], ["loc", [null, [16, 6], [16, 54]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 17,
+ "column": 4
+ },
+ "end": {
+ "line": 32,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/hll/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("table");
+ dom.setAttribute(el1, "class", "key-value-table");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tbody");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("Cardinality");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value");
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("Add Item to ");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode(" list");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value");
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1, 1]);
+ var element1 = dom.childAt(element0, [3]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [1, 3]), 0, 0);
+ morphs[1] = dom.createMorphAt(dom.childAt(element1, [1]), 1, 1);
+ morphs[2] = dom.createMorphAt(dom.childAt(element1, [3]), 1, 1);
+ return morphs;
+ },
+ statements: [["content", "model.contents", ["loc", [null, [22, 28], [22, 46]]]], ["content", "model.name", ["loc", [null, [25, 38], [25, 52]]]], ["inline", "hll-editor", [], ["addElement", "addElement"], ["loc", [null, [27, 12], [27, 50]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 14,
+ "column": 2
+ },
+ "end": {
+ "line": 33,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/hll/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "showLoadingSpinner", ["loc", [null, [15, 10], [15, 28]]]]], [], 0, 1, ["loc", [null, [15, 4], [32, 11]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 34,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/hll/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Object Details"], 0, null, ["loc", [null, [2, 2], [13, 30]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [14, 2], [33, 28]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 35,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/hll/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], ["class", "medium-width"], 0, null, ["loc", [null, [1, 0], [34, 31]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/riak-object/map/controller', ['exports', 'ember-riak-explorer/pods/riak-object/controller'], function (exports, _emberRiakExplorerPodsRiakObjectController) {
+ exports['default'] = _emberRiakExplorerPodsRiakObjectController['default'].extend({});
+});
+define('ember-riak-explorer/pods/riak-object/map/edit/route', ['exports', 'ember-riak-explorer/pods/riak-object/route', 'lodash/lodash', 'ember-riak-explorer/utils/validations', 'ember-riak-explorer/utils/riak-object-formatter'], function (exports, _emberRiakExplorerPodsRiakObjectRoute, _lodashLodash, _emberRiakExplorerUtilsValidations, _emberRiakExplorerUtilsRiakObjectFormatter) {
+ exports['default'] = _emberRiakExplorerPodsRiakObjectRoute['default'].extend({
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ bucketType: model.get('bucketType'),
+ bucket: model.get('bucket'),
+ riakObject: model,
+ crudAction: 'edit'
+ });
+ this.setViewLabel({
+ preLabel: 'Object',
+ label: model.get('name')
+ });
+ },
+
+ isValid: function isValid(proposedStringContents) {
+ var errors = this.controller.get('errors');
+ var JSON = undefined;
+ var isObject = undefined;
+ var correctValues = undefined;
+
+ try {
+ JSON = _emberRiakExplorerUtilsValidations['default'].isJsonParseable(proposedStringContents);
+ isObject = _emberRiakExplorerUtilsValidations['default'].isObject(JSON);
+ correctValues = _emberRiakExplorerUtilsValidations['default'].mapHasCorrectKeyNameEndingsAndValues(JSON);
+ } catch (e) {
+ errors.pushObject(e.message);
+ this.scrollToTop();
+ }
+
+ return JSON && isObject && correctValues;
+ },
+
+ actions: {
+ // TODO: Inefficient function
+ // Destroys and then immediately creates new record. Update directly is possible but requires
+ // creating a in memory version of the new map and comparing against the previous version, and creating all the differences
+ // for each field. Replace if performance becomes an issue.
+ updateMap: function updateMap() {
+ var self = this;
+ var map = this.currentModel;
+ var controller = this.controller;
+ var desiredContents = controller.get('stringifiedContents');
+
+ controller.set('errors', []);
+
+ if (this.isValid(desiredContents)) {
+ var _ret = (function () {
+ var clusterName = map.get('cluster').get('name');
+ var bucketTypeName = map.get('bucketType').get('name');
+ var bucketName = map.get('bucket').get('name');
+ var objectName = map.get('name');
+
+ var data = _emberRiakExplorerUtilsRiakObjectFormatter['default'].formatNewMap(JSON.parse(desiredContents));
+ var createNewMap = _lodashLodash['default'].partial(self.explorer.createCRDT, clusterName, bucketTypeName, bucketName, objectName, data);
+
+ controller.set('loadingMessage', 'Updating Map ...');
+ controller.set('showLoadingSpinner', true);
+
+ return {
+ v: map.destroyRecord().then(createNewMap).then(function onSuccess() {
+ self.transitionTo('riak-object.map', clusterName, bucketTypeName, bucketName, objectName);
+ }, function onFail() {
+ controller.set('showLoadingSpinner', false);
+ self.scrollToTop();
+ self.showAlert('alerts.error-request-was-not-processed');
+ })
+ };
+ })();
+
+ if (typeof _ret === 'object') return _ret.v;
+ }
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/riak-object/map/edit/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 5,
+ "column": 6
+ },
+ "end": {
+ "line": 7,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/map/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createUnsafeMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "error", ["loc", [null, [6, 12], [6, 23]]]]],
+ locals: ["error"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 9,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/map/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "label label-danger");
+ var el3 = dom.createTextNode("Errors");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "errors", ["loc", [null, [5, 14], [5, 20]]]]], [], 0, null, ["loc", [null, [5, 6], [7, 15]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 10,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/map/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "danger"], 0, null, ["loc", [null, [2, 2], [9, 22]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 20,
+ "column": 6
+ },
+ "end": {
+ "line": 28,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/map/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-close-round");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Cancel\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 13,
+ "column": 2
+ },
+ "end": {
+ "line": 30,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/map/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("button");
+ dom.setAttribute(el2, "type", "button");
+ dom.setAttribute(el2, "class", "action-button save");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "ion-edit");
+ dom.setAttribute(el3, "aria-hidden", "true");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n Update Map\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var element1 = dom.childAt(element0, [1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createElementMorph(element1);
+ morphs[1] = dom.createMorphAt(element0, 3, 3);
+ return morphs;
+ },
+ statements: [["element", "action", ["updateMap", ["get", "model", ["loc", [null, [15, 76], [15, 81]]]]], [], ["loc", [null, [15, 55], [15, 83]]]], ["block", "link-to", ["riak-object.map", ["get", "model.cluster.name", ["loc", [null, [21, 6], [21, 24]]]], ["get", "model.bucketType.name", ["loc", [null, [22, 6], [22, 27]]]], ["get", "model.bucket.name", ["loc", [null, [23, 6], [23, 23]]]], ["get", "model.name", ["loc", [null, [24, 6], [24, 16]]]]], ["class", "action-button cancel"], 0, null, ["loc", [null, [20, 6], [28, 18]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 32,
+ "column": 4
+ },
+ "end": {
+ "line": 34,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/map/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "loading-spinner", [], ["statusMessage", ["subexpr", "@mut", [["get", "loadingMessage", ["loc", [null, [33, 38], [33, 52]]]]], [], []]], ["loc", [null, [33, 6], [33, 54]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 34,
+ "column": 4
+ },
+ "end": {
+ "line": 40,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/map/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "ivy-codemirror", [], ["mode", "javascript", "theme", "material", "lineWrapping", true, "value", ["subexpr", "mut", [["get", "stringifiedContents", ["loc", [null, [39, 19], [39, 38]]]]], [], ["loc", [null, [39, 14], [39, 39]]]]], ["loc", [null, [35, 6], [39, 41]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 31,
+ "column": 2
+ },
+ "end": {
+ "line": 41,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/map/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "showLoadingSpinner", ["loc", [null, [32, 10], [32, 28]]]]], [], 0, 1, ["loc", [null, [32, 4], [40, 11]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 12,
+ "column": 0
+ },
+ "end": {
+ "line": 42,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/map/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Edit Map"], 0, null, ["loc", [null, [13, 2], [30, 30]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [31, 2], [41, 28]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 42,
+ "column": 31
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/map/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "errors", ["loc", [null, [1, 6], [1, 12]]]]], [], 0, null, ["loc", [null, [1, 0], [10, 7]]]], ["block", "dashboard-module.container", [], ["class", "medium-width"], 1, null, ["loc", [null, [12, 0], [42, 31]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/riak-object/map/route', ['exports', 'ember-riak-explorer/pods/riak-object/route'], function (exports, _emberRiakExplorerPodsRiakObjectRoute) {
+ exports['default'] = _emberRiakExplorerPodsRiakObjectRoute['default'].extend({});
+});
+define("ember-riak-explorer/pods/riak-object/map/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 4,
+ "column": 6
+ },
+ "end": {
+ "line": 12,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/map/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-edit");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Edit Map\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 19,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/map/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("button");
+ dom.setAttribute(el2, "type", "button");
+ dom.setAttribute(el2, "class", "action-button delete");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "ion-trash-a");
+ dom.setAttribute(el3, "aria-hidden", "true");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n Delete Map\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var element1 = dom.childAt(element0, [3]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(element0, 1, 1);
+ morphs[1] = dom.createElementMorph(element1);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["riak-object.map.edit", ["get", "model.cluster.name", ["loc", [null, [5, 8], [5, 26]]]], ["get", "model.bucketType.name", ["loc", [null, [6, 8], [6, 29]]]], ["get", "model.bucket.name", ["loc", [null, [7, 8], [7, 25]]]], ["get", "model.name", ["loc", [null, [8, 8], [8, 18]]]]], ["classNames", "action-button edit"], 0, null, ["loc", [null, [4, 6], [12, 18]]]], ["element", "action", ["deleteObject", ["get", "model", ["loc", [null, [14, 81], [14, 86]]]]], [], ["loc", [null, [14, 57], [14, 88]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 21,
+ "column": 4
+ },
+ "end": {
+ "line": 23,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/map/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "loading-spinner", [], ["statusMessage", ["subexpr", "@mut", [["get", "loadingMessage", ["loc", [null, [22, 38], [22, 52]]]]], [], []]], ["loc", [null, [22, 6], [22, 54]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 23,
+ "column": 4
+ },
+ "end": {
+ "line": 25,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/map/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "map-object.contents", [], ["sortedMap", ["subexpr", "@mut", [["get", "model.contentsSortedBySubType", ["loc", [null, [24, 38], [24, 67]]]]], [], []]], ["loc", [null, [24, 6], [24, 69]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 20,
+ "column": 2
+ },
+ "end": {
+ "line": 26,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/map/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "showLoadingSpinner", ["loc", [null, [21, 10], [21, 28]]]]], [], 0, 1, ["loc", [null, [21, 4], [25, 11]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 27,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/map/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Object Details"], 0, null, ["loc", [null, [2, 2], [19, 30]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [20, 2], [26, 28]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 27,
+ "column": 31
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/map/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], ["class", "medium-width"], 0, null, ["loc", [null, [1, 0], [27, 31]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/riak-object/model', ['exports', 'ember-data', 'ember-riak-explorer/mixins/models/object-headers', 'ember-riak-explorer/mixins/models/map-object'], function (exports, _emberData, _emberRiakExplorerMixinsModelsObjectHeaders, _emberRiakExplorerMixinsModelsMapObject) {
+
+ /**
+ * Represents a plain (non Data Type) Riak Object.
+ *
+ * @class RiakObject
+ * @extends DS.Model
+ * @constructor
+ * @uses Bucket
+ * @uses BucketType
+ * @uses Cluster
+ * @uses ObjectMetadata
+ * @param [key] {String}
+ * @param [bucket] {Bucket}
+ * @param [bucketType] {BucketType}
+ * @param [cluster] {Cluster}
+ * @param [metadata] {ObjectMetadata}
+ * @param [isLoaded] {Boolean} Has this been loaded from server. Default: `false`
+ * @param [rawUrl] {String}
+ * @param [contents] {Object} Object value/payload
+ */
+ exports['default'] = _emberData['default'].Model.extend(_emberRiakExplorerMixinsModelsObjectHeaders['default'], _emberRiakExplorerMixinsModelsMapObject['default'], {
+ /**
+ * Riak Bucket in which this object lives.
+ * @property bucket
+ * @type Bucket
+ * @writeOnce
+ */
+ bucket: _emberData['default'].belongsTo('bucket'),
+
+ /**
+ * The value/contents of the object.
+ * @property contents
+ * @type Object
+ */
+ contents: _emberData['default'].attr(),
+
+ /**
+ * The object's primary key.
+ * @property name
+ * @type String
+ */
+ name: _emberData['default'].attr('string'),
+
+ type: _emberData['default'].attr('string'),
+
+ /**
+ * The URL to fetch the raw contents of the object directly from server.
+ * Used with the 'View Raw' button.
+ * @property rawUrl
+ * @type String
+ * @writeOnce
+ */
+ url: _emberData['default'].attr('string'),
+
+ bucketType: (function () {
+ try {
+ return this.get('bucket').get('bucketType');
+ } catch (e) {
+ return undefined;
+ }
+ }).property('bucket'),
+
+ cluster: (function () {
+ try {
+ return this.get('bucket').get('bucketType').get('cluster');
+ } catch (e) {
+ return undefined;
+ }
+ }).property('bucket'),
+
+ /**
+ * Boolean check to see if the contents should be shown through the UI.
+ *
+ * @method showContents
+ * @return {Boolean}
+ */
+ showContents: (function () {
+ var contentType = this.get('contentType');
+
+ if (contentType) {
+ return contentType.startsWith('plain/text') || contentType.startsWith('application/json') || contentType.startsWith('application/javascript') || contentType.startsWith('application/xml') || contentType.startsWith('multipart/mixed');
+ } else {
+ return false;
+ }
+ }).property('contentType'),
+
+ contentTypeLanguage: (function () {
+ var contentType = this.get('contentType');
+ var language = null;
+
+ if (contentType) {
+ switch (contentType) {
+ case 'application/json':
+ case 'application/javascript':
+ language = 'javascript';
+ break;
+ case 'application/xml':
+ language = 'xml';
+ break;
+ default:
+ language = 'javascript';
+ break;
+ }
+ }
+
+ return language;
+ }).property('contentType'),
+
+ routePath: (function () {
+ var bucket = this.get('bucket');
+ var routePath = null;
+
+ switch (true) {
+ case bucket.get('isCounter'):
+ routePath = 'riak-object.counter';
+ break;
+ case bucket.get('isSet'):
+ routePath = 'riak-object.set';
+ break;
+ case bucket.get('isMap'):
+ routePath = 'riak-object.map';
+ break;
+ case bucket.get('isHLL'):
+ routePath = 'riak-object.hll';
+ break;
+ default:
+ routePath = 'riak-object';
+ break;
+ }
+
+ return routePath;
+ }).property('bucket')
+ });
+});
+define('ember-riak-explorer/pods/riak-object/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/alerts', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesAlerts, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesAlerts['default'], _emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ model: function model(params) {
+ return this.explorer.getObject(params.clusterName, params.bucketTypeName, params.bucketName, params.objectName);
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ bucketType: model.get('bucketType'),
+ bucket: model.get('bucket'),
+ riakObject: model
+ });
+ this.setViewLabel({
+ preLabel: 'Object',
+ label: model.get('name')
+ });
+ },
+
+ setupController: function setupController(controller, model) {
+ this._super(controller, model);
+ controller.set('showLoadingSpinner', false);
+
+ if (model.get('contentTypeLanguage') === 'javascript') {
+ controller.set('stringifiedContents', JSON.stringify(model.get('contents'), null, ' '));
+ }
+ },
+
+ actions: {
+ deleteObject: function deleteObject(object) {
+ var self = this;
+ var controller = this.controller;
+ var clusterName = object.get('cluster').get('name');
+ var bucketTypeName = object.get('bucketType').get('name');
+ var bucketName = object.get('bucket').get('name');
+ var objectList = object.get('bucket').get('objectList');
+
+ controller.set('loadingMessage', 'Deleting Object ...');
+ controller.set('showLoadingSpinner', true);
+
+ object.destroyRecord().then(function onSuccess() {
+ self.transitionTo('bucket', clusterName, bucketTypeName, bucketName);
+ }, function onFail() {
+ controller.set('showLoadingSpinner', false);
+ self.showAlert('alerts.error-request-was-not-processed');
+ });
+ }
+ }
+ });
+});
+define('ember-riak-explorer/pods/riak-object/set/controller', ['exports', 'ember-riak-explorer/pods/riak-object/controller'], function (exports, _emberRiakExplorerPodsRiakObjectController) {
+ exports['default'] = _emberRiakExplorerPodsRiakObjectController['default'].extend({});
+});
+define('ember-riak-explorer/pods/riak-object/set/route', ['exports', 'ember-riak-explorer/pods/riak-object/route'], function (exports, _emberRiakExplorerPodsRiakObjectRoute) {
+ exports['default'] = _emberRiakExplorerPodsRiakObjectRoute['default'].extend({
+ actions: {
+ /**
+ * Adds an element to the set.
+ * @event addSetElement
+ * @param {String} item
+ */
+ addSetElement: function addSetElement(item) {
+ var set = this.currentModel;
+ var contents = set.get('contents');
+
+ this.explorer.updateCRDT(set, { add: item }).then(function () {
+ // TODO: items are alphasorted on load, should these be injected alphabetically???
+ // may not be as obvious to user that the object was inserted. Maybe add loading state?
+ contents.pushObject(item);
+ });
+
+ // Empty out any lingering warnings on success
+ this.removeAlert();
+ },
+
+ /**
+ * Removes specified element from the set.
+ * @event removeSetElement
+ * @param {String} item
+ */
+ removeSetElement: function removeSetElement(item) {
+ var set = this.currentModel;
+ var contents = set.get('contents');
+ var index = contents.indexOf(item);
+
+ this.explorer.updateCRDT(set, { remove: item }).then(function () {
+ contents.removeAt(index, 1);
+ });
+ },
+
+ nonUniqueSetElement: function nonUniqueSetElement() {
+ this.showAlert('alerts.error-set-items-unique');
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/riak-object/set/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 13,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/set/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "class", "action-button raw");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "ion-eye");
+ dom.setAttribute(el3, "aria-hidden", "true");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n View Raw Data\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("button");
+ dom.setAttribute(el2, "type", "button");
+ dom.setAttribute(el2, "class", "action-button delete");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "ion-trash-a");
+ dom.setAttribute(el3, "aria-hidden", "true");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n Delete Object\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element1 = dom.childAt(fragment, [1]);
+ var element2 = dom.childAt(element1, [1]);
+ var element3 = dom.childAt(element1, [3]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createAttrMorph(element2, 'href');
+ morphs[1] = dom.createElementMorph(element3);
+ return morphs;
+ },
+ statements: [["attribute", "href", ["concat", [["get", "model.url", ["loc", [null, [4, 17], [4, 26]]]]]]], ["element", "action", ["deleteObject", ["get", "model", ["loc", [null, [8, 81], [8, 86]]]]], [], ["loc", [null, [8, 57], [8, 88]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 15,
+ "column": 4
+ },
+ "end": {
+ "line": 17,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/set/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "loading-spinner", [], ["statusMessage", ["subexpr", "@mut", [["get", "loadingMessage", ["loc", [null, [16, 38], [16, 52]]]]], [], []]], ["loc", [null, [16, 6], [16, 54]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 17,
+ "column": 4
+ },
+ "end": {
+ "line": 36,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/set/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("table");
+ dom.setAttribute(el1, "class", "key-value-table");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tbody");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("Set Length");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value");
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("Set Items");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value");
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1, 1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [1, 3]), 0, 0);
+ morphs[1] = dom.createMorphAt(dom.childAt(element0, [3, 3]), 1, 1);
+ return morphs;
+ },
+ statements: [["content", "model.contents.length", ["loc", [null, [22, 28], [22, 53]]]], ["inline", "set-editor", [], ["contents", ["subexpr", "@mut", [["get", "model.contents", ["loc", [null, [28, 21], [28, 35]]]]], [], []], "addSetElement", "addSetElement", "removeSetElement", "removeSetElement", "nonUniqueSetElement", "nonUniqueSetElement"], ["loc", [null, [27, 12], [31, 55]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 14,
+ "column": 2
+ },
+ "end": {
+ "line": 37,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/set/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "showLoadingSpinner", ["loc", [null, [15, 10], [15, 28]]]]], [], 0, 1, ["loc", [null, [15, 4], [36, 11]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 38,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/set/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Object Details"], 0, null, ["loc", [null, [2, 2], [13, 30]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [14, 2], [37, 28]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 39,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/set/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], ["class", "medium-width"], 0, null, ["loc", [null, [1, 0], [38, 31]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/pods/riak-object/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 8,
+ "column": 6
+ },
+ "end": {
+ "line": 16,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-edit");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Edit Object\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 22,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "class", "action-button raw");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "ion-eye");
+ dom.setAttribute(el3, "aria-hidden", "true");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n View Raw Data\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("button");
+ dom.setAttribute(el2, "type", "button");
+ dom.setAttribute(el2, "class", "action-button delete");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "ion-trash-a");
+ dom.setAttribute(el3, "aria-hidden", "true");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n Delete Object\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element1 = dom.childAt(fragment, [1]);
+ var element2 = dom.childAt(element1, [1]);
+ var element3 = dom.childAt(element1, [5]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createAttrMorph(element2, 'href');
+ morphs[1] = dom.createMorphAt(element1, 3, 3);
+ morphs[2] = dom.createElementMorph(element3);
+ return morphs;
+ },
+ statements: [["attribute", "href", ["concat", [["get", "model.url", ["loc", [null, [4, 17], [4, 26]]]]]]], ["block", "link-to", ["riak-object.edit", ["get", "model.cluster.name", ["loc", [null, [9, 6], [9, 24]]]], ["get", "model.bucketType.name", ["loc", [null, [10, 6], [10, 27]]]], ["get", "model.bucket.name", ["loc", [null, [11, 6], [11, 23]]]], ["get", "model.name", ["loc", [null, [12, 6], [12, 16]]]]], ["classNames", "action-button edit"], 0, null, ["loc", [null, [8, 6], [16, 18]]]], ["element", "action", ["deleteObject", ["get", "model", ["loc", [null, [17, 81], [17, 86]]]]], [], ["loc", [null, [17, 57], [17, 88]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 24,
+ "column": 4
+ },
+ "end": {
+ "line": 26,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "loading-spinner", [], ["statusMessage", ["subexpr", "@mut", [["get", "loadingMessage", ["loc", [null, [25, 38], [25, 52]]]]], [], []]], ["loc", [null, [25, 6], [25, 54]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 33,
+ "column": 14
+ },
+ "end": {
+ "line": 35,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("code");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "model.contentType", ["loc", [null, [34, 22], [34, 43]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 35,
+ "column": 14
+ },
+ "end": {
+ "line": 37,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("code");
+ var el2 = dom.createTextNode("Undefined");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 44,
+ "column": 16
+ },
+ "end": {
+ "line": 51,
+ "column": 16
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "ivy-codemirror", [], ["mode", ["subexpr", "@mut", [["get", "model.contentTypeLanguage", ["loc", [null, [46, 23], [46, 48]]]]], [], []], "theme", "material", "lineWrapping", true, "readOnly", true, "value", ["subexpr", "@mut", [["get", "stringifiedContents", ["loc", [null, [50, 24], [50, 43]]]]], [], []]], ["loc", [null, [45, 18], [50, 45]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 51,
+ "column": 16
+ },
+ "end": {
+ "line": 53,
+ "column": 16
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("code");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "model.contents", ["loc", [null, [52, 24], [52, 42]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 40,
+ "column": 10
+ },
+ "end": {
+ "line": 56,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("Content");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 3]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "stringifiedContents", ["loc", [null, [44, 22], [44, 41]]]]], [], 0, 1, ["loc", [null, [44, 16], [53, 23]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 26,
+ "column": 4
+ },
+ "end": {
+ "line": 60,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "object-contents");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("table");
+ dom.setAttribute(el2, "class", "key-value-table");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tbody");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("tr");
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createElement("td");
+ dom.setAttribute(el5, "class", "key");
+ var el6 = dom.createTextNode("Content-Type");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createElement("td");
+ dom.setAttribute(el5, "class", "value");
+ var el6 = dom.createTextNode("\n");
+ dom.appendChild(el5, el6);
+ var el6 = dom.createComment("");
+ dom.appendChild(el5, el6);
+ var el6 = dom.createTextNode(" ");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode(" ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1, 1, 1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [1, 3]), 1, 1);
+ morphs[1] = dom.createMorphAt(element0, 3, 3);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.contentType", ["loc", [null, [33, 20], [33, 37]]]]], [], 0, 1, ["loc", [null, [33, 14], [37, 21]]]], ["block", "if", [["get", "model.showContents", ["loc", [null, [40, 16], [40, 34]]]]], [], 2, null, ["loc", [null, [40, 10], [56, 17]]]]],
+ locals: [],
+ templates: [child0, child1, child2]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 23,
+ "column": 2
+ },
+ "end": {
+ "line": 61,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "showLoadingSpinner", ["loc", [null, [24, 10], [24, 28]]]]], [], 0, 1, ["loc", [null, [24, 4], [60, 11]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 62,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Object Contents"], 0, null, ["loc", [null, [2, 2], [22, 30]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [23, 2], [61, 28]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 70,
+ "column": 10
+ },
+ "end": {
+ "line": 70,
+ "column": 33
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("General");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 71,
+ "column": 10
+ },
+ "end": {
+ "line": 71,
+ "column": 43
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("Secondary Indexes");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 72,
+ "column": 10
+ },
+ "end": {
+ "line": 72,
+ "column": 40
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("Custom Headers");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 69,
+ "column": 8
+ },
+ "end": {
+ "line": 73,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 5, 5, contextualElement);
+ return morphs;
+ },
+ statements: [["block", "tablist.tab", [], [], 0, null, ["loc", [null, [70, 10], [70, 49]]]], ["block", "tablist.tab", [], [], 1, null, ["loc", [null, [71, 10], [71, 59]]]], ["block", "tablist.tab", [], [], 2, null, ["loc", [null, [72, 10], [72, 56]]]]],
+ locals: ["tablist"],
+ templates: [child0, child1, child2]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 75,
+ "column": 8
+ },
+ "end": {
+ "line": 77,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "table.object-version", [], ["object", ["subexpr", "@mut", [["get", "model", ["loc", [null, [76, 40], [76, 45]]]]], [], []]], ["loc", [null, [76, 10], [76, 47]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 79,
+ "column": 8
+ },
+ "end": {
+ "line": 81,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "table.object-headers", [], ["headers", ["subexpr", "@mut", [["get", "model.indexes", ["loc", [null, [80, 41], [80, 54]]]]], [], []]], ["loc", [null, [80, 10], [80, 56]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child3 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 83,
+ "column": 8
+ },
+ "end": {
+ "line": 85,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "table.object-headers", [], ["headers", ["subexpr", "@mut", [["get", "model.headersCustom", ["loc", [null, [84, 41], [84, 60]]]]], [], []]], ["loc", [null, [84, 10], [84, 62]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 68,
+ "column": 6
+ },
+ "end": {
+ "line": 86,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "tabs.tablist", [], [], 0, null, ["loc", [null, [69, 8], [73, 25]]]], ["block", "tabs.tabpanel", [], [], 1, null, ["loc", [null, [75, 8], [77, 26]]]], ["block", "tabs.tabpanel", [], [], 2, null, ["loc", [null, [79, 8], [81, 26]]]], ["block", "tabs.tabpanel", [], [], 3, null, ["loc", [null, [83, 8], [85, 26]]]]],
+ locals: ["tabs"],
+ templates: [child0, child1, child2, child3]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 67,
+ "column": 4
+ },
+ "end": {
+ "line": 87,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "ivy-tabs", [], ["on-select", ["subexpr", "action", [["subexpr", "mut", [["get", "selectedIndex", ["loc", [null, [68, 41], [68, 54]]]]], [], ["loc", [null, [68, 36], [68, 55]]]]], [], ["loc", [null, [68, 28], [68, 56]]]], "selected-index", ["subexpr", "@mut", [["get", "selectedIndex", ["loc", [null, [68, 72], [68, 85]]]]], [], []]], 0, null, ["loc", [null, [68, 6], [86, 19]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 65,
+ "column": 2
+ },
+ "end": {
+ "line": 88,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["inline", "dashboard-module.header", [], ["label", "Object Metadata"], ["loc", [null, [66, 4], [66, 55]]]], ["block", "dashboard-module.body", [], [], 0, null, ["loc", [null, [67, 4], [87, 30]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 64,
+ "column": 0
+ },
+ "end": {
+ "line": 89,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], ["class", "medium-width"], 0, null, ["loc", [null, [65, 2], [88, 33]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 93,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/riak-object/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], ["class", "medium-width"], 0, null, ["loc", [null, [1, 0], [62, 31]]]], ["block", "if", [["subexpr", "not", [["get", "showLoadingSpinner", ["loc", [null, [64, 11], [64, 29]]]]], [], ["loc", [null, [64, 6], [64, 30]]]]], [], 1, null, ["loc", [null, [64, 0], [89, 7]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/search-index/model', ['exports', 'ember-data'], function (exports, _emberData) {
+
+ var SearchIndex = _emberData['default'].Model.extend({
+ /**
+ * Riak cluster the search index was created on
+ *
+ * @property cluster
+ * @type {DS.Model} Cluster
+ * @writeOnce
+ */
+ cluster: _emberData['default'].belongsTo('cluster'),
+
+ /**
+ * Schema the search index is using
+ *
+ * @property schema
+ * @type {DS.Model} Search Schema
+ * @writeOnce
+ */
+ schema: _emberData['default'].belongsTo('search-schema'),
+
+ /**
+ * Returns the search index name
+ * @property name
+ * @type String
+ */
+ name: _emberData['default'].attr('string'),
+
+ /**
+ * Returns the search index n value
+ * @property nVal
+ * @type Integer
+ */
+ nVal: _emberData['default'].attr('number', { defaultValue: 3 }),
+
+ /**
+ * Holds the value of the schema name that index is using.
+ * Temporary hack until basho-labs/riak_explorer#89 is completed
+ * @property nVal
+ * @type Integer
+ */
+ schemaRef: _emberData['default'].attr('string'),
+
+ /**
+ * Ember.Array of bucket types on the current cluster using the index
+ * @property bucketTypesUsing
+ * @type {Ember.Array} bucketTypes
+ */
+ bucketTypesUsing: (function () {
+ var bucketTypes = this.get('cluster').get('bucketTypes');
+
+ return bucketTypes.filterBy('index.name', this.get('name'));
+ }).property('cluster.bucketTypes')
+ });
+
+ exports['default'] = SearchIndex;
+});
+define('ember-riak-explorer/pods/search-index/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ model: function model(params) {
+ return this.explorer.getIndex(params.clusterName, params.searchIndexName);
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ searchIndex: model
+ });
+ this.setViewLabel({
+ preLabel: 'Search Index',
+ label: model.get('name')
+ });
+ }
+ });
+});
+define("ember-riak-explorer/pods/search-index/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 17,
+ "column": 10
+ },
+ "end": {
+ "line": 19,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-index/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "model.schema.name", ["loc", [null, [18, 12], [18, 33]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 29,
+ "column": 18
+ },
+ "end": {
+ "line": 31,
+ "column": 18
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-index/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "bucketType.name", ["loc", [null, [30, 20], [30, 39]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 27,
+ "column": 14
+ },
+ "end": {
+ "line": 33,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-index/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link.explorer-resource", [], ["resourceType", "bucket-type", "resourceObj", ["subexpr", "@mut", [["get", "bucketType", ["loc", [null, [29, 83], [29, 93]]]]], [], []], "linkClass", "cluster-resource-link"], 0, null, ["loc", [null, [29, 18], [31, 45]]]]],
+ locals: ["bucketType"],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 25,
+ "column": 10
+ },
+ "end": {
+ "line": 35,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-index/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ dom.setAttribute(el1, "class", "button-list");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "model.bucketTypesUsing", ["loc", [null, [27, 22], [27, 44]]]]], [], 0, null, ["loc", [null, [27, 14], [33, 23]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 35,
+ "column": 10
+ },
+ "end": {
+ "line": 37,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-index/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" None\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 2
+ },
+ "end": {
+ "line": 42,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-index/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("table");
+ dom.setAttribute(el1, "class", "key-value-table");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tbody");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("Name");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value");
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("N Value");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createComment("");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("Schema");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value");
+ var el5 = dom.createTextNode("\n");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode(" ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("Bucket Types Using Index");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value");
+ var el5 = dom.createTextNode("\n");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode(" ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1, 1]);
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [1, 3]), 0, 0);
+ morphs[1] = dom.createMorphAt(dom.childAt(element0, [3, 3, 0]), 0, 0);
+ morphs[2] = dom.createMorphAt(dom.childAt(element0, [5, 3]), 1, 1);
+ morphs[3] = dom.createMorphAt(dom.childAt(element0, [7, 3]), 1, 1);
+ return morphs;
+ },
+ statements: [["content", "model.name", ["loc", [null, [8, 26], [8, 40]]]], ["content", "model.nVal", ["loc", [null, [12, 32], [12, 46]]]], ["block", "link-to", ["search-schema", ["get", "model.cluster.name", ["loc", [null, [17, 37], [17, 55]]]], ["get", "model.schema.name", ["loc", [null, [17, 56], [17, 73]]]]], ["class", "btn btn-small btn-primary"], 0, null, ["loc", [null, [17, 10], [19, 22]]]], ["block", "if", [["get", "model.bucketTypesUsing", ["loc", [null, [25, 16], [25, 38]]]]], [], 1, 2, ["loc", [null, [25, 10], [37, 17]]]]],
+ locals: [],
+ templates: [child0, child1, child2]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 43,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-index/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["inline", "dashboard-module.header", [], ["label", "Index Details"], ["loc", [null, [2, 2], [2, 51]]]], ["block", "dashboard-module.body", [], [], 0, null, ["loc", [null, [3, 2], [42, 28]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 44,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-index/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], ["class", "small-width"], 0, null, ["loc", [null, [1, 0], [43, 31]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/search-schema/create/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/alerts', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesAlerts, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesAlerts['default'], _emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ model: function model(params) {
+ var self = this;
+
+ return this.explorer.getCluster(params.clusterName).then(function (cluster) {
+ return self.store.createRecord('search-schema', { cluster: cluster });
+ });
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ crudAction: 'create schema'
+ });
+ this.setViewLabel({
+ preLabel: 'Create Schema'
+ });
+ },
+
+ actions: {
+ createSchema: function createSchema(clusterName, schemaName, schemaContent) {
+ var self = this;
+ var xmlDoc = null;
+
+ try {
+ xmlDoc = _ember['default'].$.parseXML(schemaContent);
+ } catch (error) {
+ this.showAlert('alerts.error-invalid-xml');
+ return;
+ }
+
+ if (!_ember['default'].$(xmlDoc).find('schema').attr('name')) {
+ this.showAlert('alerts.error-solr-must-have-name');
+ return;
+ }
+
+ if (!_ember['default'].$(xmlDoc).find('schema').attr('version')) {
+ this.showAlert('alerts.error-solr-must-have-version');
+ return;
+ }
+
+ this.explorer.createSchema(clusterName, schemaName, xmlDoc).then(function onSuccess() {
+ // TODO: Need to update this to give better feedback to user on what is going on
+ self.transitionTo('cluster.query', clusterName);
+ }, function onFail() {
+ self.render('alerts.error-schema-not-saved', {
+ into: 'application',
+ outlet: 'alert'
+ });
+ });
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/search-schema/create/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 5,
+ "column": 8
+ },
+ "end": {
+ "line": 8,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-schema/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-close-round");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Cancel\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 4
+ },
+ "end": {
+ "line": 10,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-schema/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["cluster.query", ["get", "model.cluster.name", ["loc", [null, [5, 35], [5, 53]]]]], ["class", "cancel action-button"], 0, null, ["loc", [null, [5, 8], [8, 20]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 12,
+ "column": 4
+ },
+ "end": {
+ "line": 36,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-schema/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("form");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "form-group schema-name");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("label");
+ var el4 = dom.createTextNode("Schema Name");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "form-group schema-content");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("label");
+ var el4 = dom.createTextNode("Schema XML");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "submit-button-container");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("button");
+ dom.setAttribute(el3, "type", "submit");
+ dom.setAttribute(el3, "class", "btn btn-primary");
+ var el4 = dom.createTextNode("\n Create Table\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var element1 = dom.childAt(element0, [5, 1]);
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 3, 3);
+ morphs[1] = dom.createMorphAt(dom.childAt(element0, [3]), 3, 3);
+ morphs[2] = dom.createAttrMorph(element1, 'disabled');
+ morphs[3] = dom.createElementMorph(element1);
+ return morphs;
+ },
+ statements: [["inline", "input", [], ["tabIndex", 1, "value", ["subexpr", "mut", [["get", "model.name", ["loc", [null, [16, 40], [16, 50]]]]], [], ["loc", [null, [16, 35], [16, 51]]]], "class", "form-control"], ["loc", [null, [16, 10], [16, 74]]]], ["inline", "ivy-codemirror", [], ["mode", "xml", "theme", "material", "lineWrapping", true, "autofocus", true, "tabIndex", 2, "value", ["subexpr", "mut", [["get", "model.content", ["loc", [null, [27, 23], [27, 36]]]]], [], ["loc", [null, [27, 18], [27, 37]]]]], ["loc", [null, [21, 10], [27, 39]]]], ["attribute", "disabled", ["get", "isDisabled", ["loc", [null, [31, 67], [31, 77]]]]], ["element", "action", ["createSchema", ["get", "model.cluster.name", ["loc", [null, [31, 104], [31, 122]]]], ["get", "model.name", ["loc", [null, [31, 123], [31, 133]]]], ["get", "model.content", ["loc", [null, [31, 134], [31, 147]]]]], [], ["loc", [null, [31, 80], [31, 149]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 37,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-schema/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "New Schema"], 0, null, ["loc", [null, [3, 4], [10, 32]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [12, 4], [36, 30]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "triple-curlies"
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 39,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-schema/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "search-schema-container search-schema-create-container");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], [], 0, null, ["loc", [null, [2, 2], [37, 33]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/search-schema/edit/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/alerts', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesAlerts, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesAlerts['default'], _emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ model: function model(params) {
+ return this.explorer.getSearchSchema(params.clusterName, params.searchSchemaName);
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ searchSchema: model,
+ crudAction: 'edit'
+ });
+ this.setViewLabel({
+ preLabel: 'Search Schema',
+ label: model.get('name')
+ });
+
+ this.simulateLoad();
+ },
+
+ actions: {
+ updateSchema: function updateSchema(schema) {
+ var clusterName = schema.get('cluster').get('name');
+ var schemaName = schema.get('name');
+ var schemaContent = schema.get('content');
+
+ var xmlDoc = null;
+ var self = this;
+
+ try {
+ xmlDoc = _ember['default'].$.parseXML(schemaContent);
+ } catch (error) {
+ this.render('alerts.error-invalid-xml', {
+ into: 'application',
+ outlet: 'alert'
+ });
+
+ return;
+ }
+
+ this.explorer.updateSchema(schema, xmlDoc).then(function onSuccess() {
+ self.transitionTo('search-schema', clusterName, schemaName);
+ }, function onFail() {
+ self.showAlert('alerts.error-schema-not-saved');
+ });
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/search-schema/edit/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 10,
+ "column": 6
+ },
+ "end": {
+ "line": 13,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-schema/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-close-round");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Cancel\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 15,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-schema/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "update action-button");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "ion-edit");
+ dom.setAttribute(el3, "aria-hidden", "true");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n Update Schema\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [3]);
+ var element1 = dom.childAt(element0, [1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createElementMorph(element1);
+ morphs[1] = dom.createMorphAt(element0, 3, 3);
+ return morphs;
+ },
+ statements: [["element", "action", ["updateSchema", ["get", "model", ["loc", [null, [5, 65], [5, 70]]]]], [], ["loc", [null, [5, 41], [5, 72]]]], ["block", "link-to", ["search-schema", ["get", "model.cluster.name", ["loc", [null, [10, 33], [10, 51]]]], ["get", "model.name", ["loc", [null, [10, 52], [10, 62]]]]], ["class", "cancel action-button"], 0, null, ["loc", [null, [10, 6], [13, 18]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 17,
+ "column": 4
+ },
+ "end": {
+ "line": 25,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-schema/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ dom.setAttribute(el1, "class", "editable");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 1]), 1, 1);
+ return morphs;
+ },
+ statements: [["inline", "content-editable", [], ["value", ["subexpr", "mut", [["get", "model.content", ["loc", [null, [21, 23], [21, 36]]]]], [], ["loc", [null, [21, 18], [21, 37]]]], "type", "html"], ["loc", [null, [20, 10], [22, 25]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 16,
+ "column": 2
+ },
+ "end": {
+ "line": 26,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-schema/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.content", ["loc", [null, [17, 10], [17, 23]]]]], [], 0, null, ["loc", [null, [17, 4], [25, 11]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 27,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-schema/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], [], 0, null, ["loc", [null, [2, 2], [15, 30]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [16, 2], [26, 28]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 28,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-schema/edit/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], [], 0, null, ["loc", [null, [1, 0], [27, 31]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/search-schema/model', ['exports', 'ember-data'], function (exports, _emberData) {
+ exports['default'] = _emberData['default'].Model.extend({
+ /**
+ * Riak cluster the search schema was created on
+ *
+ * @property cluster
+ * @type {DS.Model} Cluster
+ * @writeOnce
+ */
+ cluster: _emberData['default'].belongsTo('cluster'),
+
+ name: _emberData['default'].attr('string'),
+
+ content: _emberData['default'].attr(),
+
+ /**
+ * Boolean check as to whether or not it is the default schema
+ * @method isDefaultSchema
+ * @returns Boolean
+ */
+ isDefaultSchema: (function () {
+ return this.get('name') === '_yz_default';
+ }).property('name'),
+
+ /**
+ * Returns a formatted schema url
+ * @method url
+ * @returns String
+ */
+ url: (function () {
+ var proxyURL = this.get('cluster').get('proxyUrl');
+ var name = this.get('name');
+
+ return proxyURL + '/search/schema/' + name;
+ }).property('name', 'cluster.proxyUrl')
+ });
+});
+define('ember-riak-explorer/pods/search-schema/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ model: function model(params) {
+ return this.explorer.getSearchSchema(params.clusterName, params.searchSchemaName);
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ searchSchema: model
+ });
+ this.setViewLabel({
+ preLabel: 'Search Schema',
+ label: model.get('name')
+ });
+ }
+ });
+});
+define("ember-riak-explorer/pods/search-schema/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 5,
+ "column": 6
+ },
+ "end": {
+ "line": 8,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-schema/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-edit");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Edit Schema\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 15,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-schema/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "target", "_blank");
+ dom.setAttribute(el2, "class", "raw action-button");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "ion-eye");
+ dom.setAttribute(el3, "aria-hidden", "true");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n View Raw\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [3]);
+ var element1 = dom.childAt(element0, [3]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(element0, 1, 1);
+ morphs[1] = dom.createAttrMorph(element1, 'href');
+ return morphs;
+ },
+ statements: [["block", "link-to", ["search-schema.edit", ["get", "model.cluster.name", ["loc", [null, [5, 38], [5, 56]]]], ["get", "model.name", ["loc", [null, [5, 57], [5, 67]]]]], ["class", "edit action-button"], 0, null, ["loc", [null, [5, 6], [8, 18]]]], ["attribute", "href", ["get", "model.url", ["loc", [null, [10, 16], [10, 25]]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 17,
+ "column": 4
+ },
+ "end": {
+ "line": 24,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-schema/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "ivy-codemirror", [], ["mode", "xml", "theme", "material", "lineWrapping", true, "readOnly", true, "value", ["subexpr", "@mut", [["get", "model.content", ["loc", [null, [23, 14], [23, 27]]]]], [], []]], ["loc", [null, [18, 6], [23, 29]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 16,
+ "column": 2
+ },
+ "end": {
+ "line": 25,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-schema/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.content", ["loc", [null, [17, 10], [17, 23]]]]], [], 0, null, ["loc", [null, [17, 4], [24, 11]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 26,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-schema/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], [], 0, null, ["loc", [null, [2, 2], [15, 30]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [16, 2], [25, 28]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 27,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/search-schema/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], [], 0, null, ["loc", [null, [1, 0], [26, 31]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/table/controller', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/side-drawer', 'ember-riak-explorer/mixins/controller/modal'], function (exports, _ember, _emberRiakExplorerMixinsControllerSideDrawer, _emberRiakExplorerMixinsControllerModal) {
+ exports['default'] = _ember['default'].Controller.extend(_emberRiakExplorerMixinsControllerSideDrawer['default'], _emberRiakExplorerMixinsControllerModal['default'], {
+ pageSize: null,
+
+ currentTableRows: null,
+
+ showCachedListWarning: true
+ });
+});
+define('ember-riak-explorer/pods/table/create/controller', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/side-drawer'], function (exports, _ember, _emberRiakExplorerMixinsControllerSideDrawer) {
+ exports['default'] = _ember['default'].Controller.extend(_emberRiakExplorerMixinsControllerSideDrawer['default'], {
+ errors: null,
+
+ exampleTemplate: 'CREATE TABLE GeoCheckin\n(\n region varchar not null,\n state varchar not null,\n time timestamp not null,\n PRIMARY KEY (\n (region, state, quantum(time, 15, \'m\')),\n region, state, time\n )\n)',
+
+ statement: '',
+
+ showSpinner: false,
+
+ isDisabled: true,
+
+ canSubmit: (function () {
+ return this.set('isDisabled', _ember['default'].isBlank(this.get('statement')));
+ }).observes('statement'),
+
+ resetState: function resetState() {
+ this.set('errors', null);
+ this.set('statement', '');
+ },
+
+ actions: {
+ insertTemplate: function insertTemplate() {
+ this.set('statement', this.get('exampleTemplate'));
+ }
+ }
+ });
+});
+define('ember-riak-explorer/pods/table/create/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/alerts', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state', 'ember-riak-explorer/utils/string-helpers', 'lodash/lodash'], function (exports, _ember, _emberRiakExplorerMixinsRoutesAlerts, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState, _emberRiakExplorerUtilsStringHelpers, _lodashLodash) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesAlerts['default'], _emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ model: function model(params) {
+ var self = this;
+
+ return this.explorer.getCluster(params.clusterName).then(function (cluster) {
+ return self.store.createRecord('table', {
+ cluster: cluster,
+ columns: [{ name: '', type: 'varchar' }, { name: '', type: 'varchar' }, { name: '', type: 'varchar' }],
+ partitionKey: [],
+ localKey: []
+ });
+ });
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ crudAction: 'create table'
+ });
+ this.setViewLabel({
+ preLabel: 'Create Table'
+ });
+ this.simulateLoad();
+ },
+
+ setupController: function setupController(controller, model) {
+ this._super(controller, model);
+
+ controller.resetState();
+ },
+
+ validateTableClientSide: function validateTableClientSide(tableName, tableData) {
+ var isValid = true;
+ var controller = this.controller;
+
+ // Check if table name already exists
+ if (this.currentModel.get('cluster').get('tables').filterBy('name', tableName).length) {
+ isValid = false;
+ controller.set('errors', 'A table named \'' + tableName + '\' already exits on the \'' + this.currentModel.get('cluster').get('name') + '\' cluster. Please use a unique name for your table.');
+ }
+
+ return isValid;
+ },
+
+ actions: {
+ createTable: function createTable(table, statement) {
+ var self = this;
+ var controller = this.controller;
+ var clusterName = table.get('cluster').get('name');
+
+ controller.set('errors', null);
+ controller.set('showSpinner', true);
+
+ var formatted = _lodashLodash['default'].trim(statement.replace(/\s\s+/g, ' ') // reduces multiple whitespaces into one
+ .replace(/(\r\n|\n|\r)/gm, ' ') // removes any leftover newlines
+ .replace(/\( /g, '(') // removes any spacing following left parenthesis
+ .replace(/ \)/g, ')')); // removes any spacing preceding right parenthesis
+
+ // Add space before first parenthesis if needed
+ var indexOfFirstParenthesis = formatted.indexOf('(');
+ var indexOfCharacterBeforeFirstParenthesis = indexOfFirstParenthesis - 1;
+ var characterBeforeFirstParenthesis = formatted[indexOfCharacterBeforeFirstParenthesis];
+
+ if (characterBeforeFirstParenthesis !== ' ') {
+ formatted = (0, _emberRiakExplorerUtilsStringHelpers['default'])(formatted, indexOfFirstParenthesis, ' ');
+ }
+
+ var tableName = formatted.split(' ')[2]; // Table name should always come after CREATE TABLE
+
+ var data = {
+ name: tableName,
+ data: { props: { table_def: formatted } }
+ };
+
+ if (this.validateTableClientSide(tableName, data)) {
+ this.explorer.createBucketType(clusterName, data).then(function onSuccess() {
+ self.transitionTo('table', clusterName, tableName).then(function () {
+ controller.set('showSpinner', false);
+ });
+ }, function onFail(error) {
+ self.scrollToTop();
+ controller.set('showSpinner', false);
+
+ try {
+ controller.set('errors', JSON.parse(error.responseText).error.replace(/\s\s+/g, ' ') // reduces multiple whitespaces into one
+ .replace(/<<"/g, '') // removes erlang starting brackets
+ .replace(/">>/g, '')); // removes erlang ending brackets
+ } catch (err) {
+ controller.set('errors', 'Sorry, something went wrong. Your table was not created');
+ }
+ });
+ } else {
+ controller.set('showSpinner', false);
+ }
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/table/create/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 6,
+ "column": 8
+ },
+ "end": {
+ "line": 8,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createUnsafeMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "error", ["loc", [null, [7, 14], [7, 25]]]]],
+ locals: ["error"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 4
+ },
+ "end": {
+ "line": 10,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "label label-danger");
+ var el3 = dom.createTextNode("Errors");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "errors", ["loc", [null, [6, 16], [6, 22]]]]], [], 0, null, ["loc", [null, [6, 8], [8, 17]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 10,
+ "column": 4
+ },
+ "end": {
+ "line": 13,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "label label-danger");
+ var el3 = dom.createTextNode("Error");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "errors", ["loc", [null, [12, 9], [12, 19]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 14,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "is-array", [["get", "errors", ["loc", [null, [3, 20], [3, 26]]]]], [], ["loc", [null, [3, 10], [3, 27]]]]], [], 0, 1, ["loc", [null, [3, 4], [13, 11]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 15,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "danger", "dismissible", false], 0, null, ["loc", [null, [2, 2], [14, 22]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 21,
+ "column": 8
+ },
+ "end": {
+ "line": 24,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-close-round");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Cancel\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 19,
+ "column": 4
+ },
+ "end": {
+ "line": 26,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["cluster.data", ["get", "model.cluster.name", ["loc", [null, [21, 34], [21, 52]]]]], ["class", "cancel action-button"], 0, null, ["loc", [null, [21, 8], [24, 20]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 28,
+ "column": 6
+ },
+ "end": {
+ "line": 30,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "loading-spinner", [], ["statusMessage", "Attempting to create table..."], ["loc", [null, [29, 8], [29, 73]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 36,
+ "column": 12
+ },
+ "end": {
+ "line": 38,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "btn btn-xs btn-info");
+ var el2 = dom.createTextNode("Hide Schema Guidelines");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element1 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element1);
+ return morphs;
+ },
+ statements: [["element", "action", ["hideSideDrawer"], [], ["loc", [null, [37, 48], [37, 75]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 38,
+ "column": 12
+ },
+ "end": {
+ "line": 40,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "btn btn-xs btn-info");
+ var el2 = dom.createTextNode("Schema Guidelines");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element0);
+ return morphs;
+ },
+ statements: [["element", "action", ["showSideDrawer"], [], ["loc", [null, [39, 48], [39, 75]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 30,
+ "column": 6
+ },
+ "end": {
+ "line": 56,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "manually-create");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("label");
+ var el3 = dom.createTextNode("\n Use the editor below to define your table\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "btn btn-xs btn-info");
+ var el4 = dom.createTextNode("Insert Sample Template");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "submit-button-container");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("button");
+ dom.setAttribute(el3, "type", "submit");
+ dom.setAttribute(el3, "class", "btn btn-primary");
+ var el4 = dom.createTextNode("\n Create Table\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element2 = dom.childAt(fragment, [1]);
+ var element3 = dom.childAt(element2, [1]);
+ var element4 = dom.childAt(element3, [1]);
+ var element5 = dom.childAt(element2, [5, 1]);
+ var morphs = new Array(5);
+ morphs[0] = dom.createElementMorph(element4);
+ morphs[1] = dom.createMorphAt(element3, 3, 3);
+ morphs[2] = dom.createMorphAt(element2, 3, 3);
+ morphs[3] = dom.createAttrMorph(element5, 'disabled');
+ morphs[4] = dom.createElementMorph(element5);
+ return morphs;
+ },
+ statements: [["element", "action", ["insertTemplate"], [], ["loc", [null, [34, 46], [34, 73]]]], ["block", "if", [["get", "isSideDrawerVisible", ["loc", [null, [36, 18], [36, 37]]]]], [], 0, 1, ["loc", [null, [36, 12], [40, 19]]]], ["inline", "ivy-codemirror", [], ["mode", "sql", "theme", "material", "lineWrapping", true, "autofocus", true, "value", ["subexpr", "mut", [["get", "statement", ["loc", [null, [48, 23], [48, 32]]]]], [], ["loc", [null, [48, 18], [48, 33]]]]], ["loc", [null, [43, 10], [48, 35]]]], ["attribute", "disabled", ["get", "isDisabled", ["loc", [null, [51, 69], [51, 79]]]]], ["element", "action", ["createTable", ["get", "model", ["loc", [null, [51, 105], [51, 110]]]], ["get", "statement", ["loc", [null, [51, 111], [51, 120]]]]], [], ["loc", [null, [51, 82], [51, 122]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 27,
+ "column": 4
+ },
+ "end": {
+ "line": 57,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "showSpinner", ["loc", [null, [28, 12], [28, 23]]]]], [], 0, 1, ["loc", [null, [28, 6], [56, 13]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 18,
+ "column": 2
+ },
+ "end": {
+ "line": 58,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Table Schema Editor"], 0, null, ["loc", [null, [19, 4], [26, 32]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [27, 4], [57, 30]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 62,
+ "column": 2
+ },
+ "end": {
+ "line": 66,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "render", ["partials.ts-planning-guidelines"], [], ["loc", [null, [65, 4], [65, 48]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 61,
+ "column": 0
+ },
+ "end": {
+ "line": 67,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "side-drawer", [], ["label", "Schema Guidelines", "visible", ["subexpr", "@mut", [["get", "isSideDrawerVisible", ["loc", [null, [64, 10], [64, 29]]]]], [], []]], 0, null, ["loc", [null, [62, 2], [66, 18]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 68,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/create/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "ts-table-container table-create-container");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "errors", ["loc", [null, [1, 6], [1, 12]]]]], [], 0, null, ["loc", [null, [1, 0], [15, 7]]]], ["block", "dashboard-module.container", [], ["class", "medium-width"], 1, null, ["loc", [null, [18, 2], [58, 33]]]], ["block", "ember-wormhole", [], ["to", "side-drawer-container"], 2, null, ["loc", [null, [61, 0], [67, 19]]]]],
+ locals: [],
+ templates: [child0, child1, child2]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/table/model', ['exports', 'ember', 'ember-data', 'ember-riak-explorer/mixins/models/bucket-props', 'ember-riak-explorer/mixins/models/cached-list-watcher', 'lodash/lodash'], function (exports, _ember, _emberData, _emberRiakExplorerMixinsModelsBucketProps, _emberRiakExplorerMixinsModelsCachedListWatcher, _lodashLodash) {
+
+ /**
+ * Represents a Riak TS Table
+ *
+ * @class Table
+ * @extends DS.Model
+ * @uses BucketProps
+ * @uses CachedListWatcher
+ */
+ var Table = _emberData['default'].Model.extend(_emberRiakExplorerMixinsModelsBucketProps['default'], _emberRiakExplorerMixinsModelsCachedListWatcher['default'], {
+ /**
+ * Riak cluster in which this Table lives.
+ * @property cluster
+ * @type Cluster
+ * @writeOnce
+ */
+ cluster: _emberData['default'].belongsTo('cluster'),
+
+ rows: _emberData['default'].hasMany('row'),
+
+ rowsList: _emberData['default'].belongsTo('row-list'),
+
+ columns: _emberData['default'].attr(),
+
+ localKey: _emberData['default'].attr(),
+
+ /**
+ * Table name (unique per cluster),
+ * as appears on `riak-admin bucket-type list`
+ * @property name
+ * @type String
+ */
+ name: _emberData['default'].attr('string'),
+
+ partitionKey: _emberData['default'].attr(),
+
+ hasQuantum: (function () {
+ return _ember['default'].isPresent(this.get('partitionKey').filterBy('quantum'));
+ }).property('partitionKey.@each.quantum'),
+
+ possiblePartitionKeys: (function () {
+ var columnNames = this.get('columns').mapBy('name');
+
+ return columnNames.filter(function (column) {
+ return _ember['default'].isPresent(column);
+ });
+ }).property('partitionKey.@each.quantum'),
+
+ possiblePartitionKeyQuantum: (function () {
+ return this.get('columns').filterBy('type', 'timestamp').mapBy('name');
+ }).property('columns.@each.type'),
+
+ quantumColumnName: (function () {
+ if (this.get('hasQuantum')) {
+ var quantumColumn = _lodashLodash['default'].head(this.get('partitionKey').filterBy('quantum'));
+ var quantumColumnName = _lodashLodash['default'].head(quantumColumn.name.replace('quantum(', '').slice(0, -1).split(','));
+
+ return quantumColumnName;
+ }
+ }).property('hasQuantum'),
+
+ // returns first possible partition key that isn't being used already
+ suggestedPartitionKey: (function () {
+ var possibleKeys = this.get('possiblePartitionKeys');
+ var partitionKeyNames = this.get('partitionKey').mapBy('name');
+
+ return _lodashLodash['default'].head(possibleKeys.filter(function (columnName) {
+ return partitionKeyNames.indexOf(columnName) === -1;
+ }));
+ }).property('possiblePartitionKeys', 'partitionKey.@each.name'),
+
+ // returns first possible partition key that isn't being used already
+ suggestedPartitionKeyQuantum: (function () {
+ var possibleKeys = this.get('possiblePartitionKeyQuantum');
+ var partitionKeyNames = this.get('partitionKey').mapBy('name');
+
+ return _lodashLodash['default'].head(possibleKeys.filter(function (columnName) {
+ return partitionKeyNames.indexOf(columnName) === -1;
+ }));
+ }).property('possiblePartitionKeyQuantum', 'partitionKey.@each.name'),
+
+ rowsSortedByQuantumValues: (function () {
+ var _this = this;
+
+ var self = this;
+
+ if (this.get('hasQuantum')) {
+ var _ret = (function () {
+ var columns = _this.get('columns');
+ var rows = _this.get('rows');
+ var quantumIndex = undefined;
+
+ // Assign Quantum Index
+ columns.forEach(function (column, index) {
+ if (column.name === self.get('quantumColumnName')) {
+ quantumIndex = index;
+ }
+ });
+
+ // Sort rows by Quantum values
+ return {
+ v: rows.toArray().sort(function (a, b) {
+ return a.get('parsedValue')[quantumIndex] - b.get('parsedValue')[quantumIndex];
+ })
+ };
+ })();
+
+ if (typeof _ret === 'object') return _ret.v;
+ } else {
+ return this.get('rows').get('parsedValue');
+ }
+ }).property('hasQuantum', 'rows.@each.parsedValue')
+ });
+
+ exports['default'] = Table;
+});
+define('ember-riak-explorer/pods/table/query/controller', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/side-drawer'], function (exports, _ember, _emberRiakExplorerMixinsControllerSideDrawer) {
+ exports['default'] = _ember['default'].Controller.extend(_emberRiakExplorerMixinsControllerSideDrawer['default'], {
+ example: "",
+
+ query: '',
+
+ result: '',
+
+ resultLength: null,
+
+ isDisabled: true,
+
+ isLoading: false,
+
+ showClear: false,
+
+ canClear: (function () {
+ var result = this.get('result');
+ var canClear = _ember['default'].isPresent(result) && result !== this.get('loadingMessage');
+
+ this.set('showClear', canClear);
+ }).observes('result'),
+
+ canSubmit: (function () {
+ return this.set('isDisabled', _ember['default'].isBlank(this.get('query')));
+ }).observes('query'),
+
+ setLoadingState: (function () {
+ if (this.get('isLoading')) {
+ this.set('resultLength', null);
+ this.set('result', 'Querying...');
+ }
+ }).observes('isLoading'),
+
+ resetResult: function resetResult() {
+ this.set('result', '');
+ this.set('resultLength', null);
+ },
+
+ resetQuery: function resetQuery() {
+ this.set('query', '');
+ },
+
+ resetState: function resetState() {
+ this.resetQuery();
+ this.resetResult();
+ },
+
+ actions: {
+ clear: function clear() {
+ this.resetState();
+ },
+
+ insertExample: function insertExample() {
+ this.set('query', this.get('example'));
+ }
+ }
+ });
+});
+define('ember-riak-explorer/pods/table/query/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ model: function model(params) {
+ return this.explorer.getTable(params.clusterName, params.tableName);
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ table: model,
+ crudAction: 'query table'
+ });
+ this.setViewLabel({
+ preLabel: 'Table',
+ label: model.get('name')
+ });
+ },
+
+ setupController: function setupController(controller, model) {
+ this._super(controller, model);
+
+ this.setExample();
+ controller.resetState();
+ },
+
+ setExample: function setExample() {
+ var _this = this;
+
+ var table = this.currentModel;
+
+ if (table.get('hasQuantum')) {
+ (function () {
+ var controller = _this.controller;
+ var tableName = table.get('name');
+ var partitionKey = table.get('partitionKey');
+ var quantumName = table.get('quantumColumnName');
+ var sampleNames = ["foo", "bar", "Lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", "Aliquam", "sit", "amet", "tincidunt", "felis", "Curabitur", "at", "gravida", "est", "Quisque", "vehicula", "mi", "sed", "libero", "hendrerit", "vel", "mollis", "lorem", "euismod", "Donec", "fringilla", "iaculis", "sem", "vitae", "tincidunt", "lacus", "consectetur", "vitae", "Aliquam", "felis", "magna", "pellentesque", "vitae", "felis"];
+ var example = '';
+
+ // Set Query Base
+ example = 'select * from ' + tableName + ' where ' + quantumName + ' > 1 and ' + quantumName + ' < 9999';
+
+ // Add a comparison for each partition key column that isn't the quantum column
+ partitionKey.filter(function (column) {
+ return !column.quantum;
+ }).mapBy('name').forEach(function (columnName, index) {
+ example += ' and ' + columnName + ' = \'' + sampleNames[index] + '\'';
+ });
+
+ controller.set('example', example);
+ })();
+ }
+ },
+
+ actions: {
+ runQuery: function runQuery(table, query) {
+ var controller = this.controller;
+
+ // Set intermediate state
+ controller.set('isLoading', true);
+
+ // Execute Query
+ this.explorer.queryTable(table, query).then(function onSuccess(data) {
+ if (_ember['default'].isEmpty(data.query.rows)) {
+ controller.set('resultLength', null);
+ controller.set('result', 'No rows found on ' + table.get('name') + ' given the statement: \n\n' + query);
+ } else {
+ var stringifiedData = JSON.stringify(data.query.rows);
+ var formattedStringForEditor = undefined;
+
+ // Adds a line break after each array item
+ // Removes the array surrounding all the results
+ // Adds a space after each comma in the array for better legibility
+ formattedStringForEditor = stringifiedData.replace(/],/g, '],\n');
+ formattedStringForEditor = formattedStringForEditor.substring(1, formattedStringForEditor.length - 1);
+ formattedStringForEditor = formattedStringForEditor.replace(/,/g, ', ');
+
+ controller.set('resultLength', data.query.rows.length);
+ controller.set('result', formattedStringForEditor);
+ }
+ }, function onFail(error) {
+ try {
+ var serverResponse = JSON.parse(error.responseText).error.replace(/\s\s+/g, ' ') // reduces multiple whitespaces into one
+ .replace(/<<"/g, '') // removes erlang starting brackets
+ .replace(/">>/g, ''); // removes erlang ending brackets
+
+ controller.set('result', error.status + ' ' + error.statusText + ' trying to execute query \n\nServer error: ' + serverResponse);
+ } catch (err) {
+ controller.set('result', error.status + ' ' + error.statusText + ' trying to execute query: \n\n' + query);
+ }
+ });
+
+ return false;
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/table/query/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 5,
+ "column": 8
+ },
+ "end": {
+ "line": 8,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-close-round");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Cancel\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 4
+ },
+ "end": {
+ "line": 10,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["table", ["get", "model.cluster.name", ["loc", [null, [5, 27], [5, 45]]]], ["get", "model.name", ["loc", [null, [5, 46], [5, 56]]]]], ["class", "cancel action-button"], 0, null, ["loc", [null, [5, 8], [8, 20]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 22,
+ "column": 10
+ },
+ "end": {
+ "line": 24,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "btn btn-xs btn-info");
+ var el2 = dom.createTextNode("Insert Example Query");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element3 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element3);
+ return morphs;
+ },
+ statements: [["element", "action", ["insertExample"], [], ["loc", [null, [23, 46], [23, 72]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 25,
+ "column": 10
+ },
+ "end": {
+ "line": 27,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "btn btn-xs btn-info");
+ var el2 = dom.createTextNode("Hide Query Guidelines");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element2 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element2);
+ return morphs;
+ },
+ statements: [["element", "action", ["hideSideDrawer"], [], ["loc", [null, [26, 46], [26, 73]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 27,
+ "column": 10
+ },
+ "end": {
+ "line": 29,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "btn btn-xs btn-info");
+ var el2 = dom.createTextNode("Show Query Guidelines");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element1 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element1);
+ return morphs;
+ },
+ statements: [["element", "action", ["showSideDrawer"], [], ["loc", [null, [28, 46], [28, 73]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child3 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 54,
+ "column": 14
+ },
+ "end": {
+ "line": 56,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("small");
+ var el2 = dom.createTextNode("(");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" rows)");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["content", "resultLength", ["loc", [null, [55, 24], [55, 40]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child4 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 58,
+ "column": 14
+ },
+ "end": {
+ "line": 60,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "clear-statement");
+ var el2 = dom.createTextNode("clear");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element0);
+ return morphs;
+ },
+ statements: [["element", "action", ["clear"], [], ["loc", [null, [59, 46], [59, 64]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 12,
+ "column": 4
+ },
+ "end": {
+ "line": 73,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("section");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "section-title");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("section");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("label");
+ var el3 = dom.createTextNode("\n Use the editor on the left to query against the table\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "split-panel");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "left-panel");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("div");
+ dom.setAttribute(el4, "class", "help-block");
+ var el5 = dom.createTextNode("Query");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("div");
+ dom.setAttribute(el4, "class", "submit-button-container");
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createElement("button");
+ dom.setAttribute(el5, "type", "submit");
+ dom.setAttribute(el5, "class", "btn btn-primary");
+ var el6 = dom.createTextNode("\n Run Query\n ");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "right-panel");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("div");
+ dom.setAttribute(el4, "class", "help-block");
+ var el5 = dom.createTextNode("\n Result\n");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("\n");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode(" ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element4 = dom.childAt(fragment, [1]);
+ var element5 = dom.childAt(fragment, [3]);
+ var element6 = dom.childAt(element5, [1]);
+ var element7 = dom.childAt(element5, [3]);
+ var element8 = dom.childAt(element7, [1]);
+ var element9 = dom.childAt(element8, [5, 1]);
+ var element10 = dom.childAt(element7, [3]);
+ var element11 = dom.childAt(element10, [1]);
+ var morphs = new Array(10);
+ morphs[0] = dom.createMorphAt(dom.childAt(element4, [1]), 0, 0);
+ morphs[1] = dom.createMorphAt(element4, 3, 3);
+ morphs[2] = dom.createMorphAt(element6, 1, 1);
+ morphs[3] = dom.createMorphAt(element6, 2, 2);
+ morphs[4] = dom.createMorphAt(element8, 3, 3);
+ morphs[5] = dom.createAttrMorph(element9, 'disabled');
+ morphs[6] = dom.createElementMorph(element9);
+ morphs[7] = dom.createMorphAt(element11, 1, 1);
+ morphs[8] = dom.createMorphAt(element11, 3, 3);
+ morphs[9] = dom.createMorphAt(element10, 3, 3);
+ return morphs;
+ },
+ statements: [["content", "model.name", ["loc", [null, [15, 35], [15, 49]]]], ["inline", "table.ts-table-reference", [], ["table", ["subexpr", "@mut", [["get", "model", ["loc", [null, [16, 41], [16, 46]]]]], [], []]], ["loc", [null, [16, 8], [16, 48]]]], ["block", "if", [["get", "example", ["loc", [null, [22, 16], [22, 23]]]]], [], 0, null, ["loc", [null, [22, 10], [24, 17]]]], ["block", "if", [["get", "isSideDrawerVisible", ["loc", [null, [25, 16], [25, 35]]]]], [], 1, 2, ["loc", [null, [25, 10], [29, 17]]]], ["inline", "ivy-codemirror", [], ["mode", "javascript", "theme", "material", "lineWrapping", true, "autofocus", true, "tabindex", 1, "value", ["subexpr", "mut", [["get", "query", ["loc", [null, [42, 25], [42, 30]]]]], [], ["loc", [null, [42, 20], [42, 31]]]]], ["loc", [null, [36, 12], [42, 33]]]], ["attribute", "disabled", ["get", "isDisabled", ["loc", [null, [45, 71], [45, 81]]]]], ["element", "action", ["runQuery", ["get", "model", ["loc", [null, [45, 104], [45, 109]]]], ["get", "query", ["loc", [null, [45, 110], [45, 115]]]]], [], ["loc", [null, [45, 84], [45, 117]]]], ["block", "if", [["get", "resultLength", ["loc", [null, [54, 20], [54, 32]]]]], [], 3, null, ["loc", [null, [54, 14], [56, 21]]]], ["block", "if", [["get", "showClear", ["loc", [null, [58, 20], [58, 29]]]]], [], 4, null, ["loc", [null, [58, 14], [60, 21]]]], ["inline", "ivy-codemirror", [], ["mode", "javascript", "theme", "material", "readOnly", true, "lineWrapping", true, "value", ["subexpr", "@mut", [["get", "result", ["loc", [null, [68, 20], [68, 26]]]]], [], []]], ["loc", [null, [63, 12], [68, 28]]]]],
+ locals: [],
+ templates: [child0, child1, child2, child3, child4]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 74,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Query Table"], 0, null, ["loc", [null, [3, 4], [10, 32]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [12, 4], [73, 30]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 78,
+ "column": 2
+ },
+ "end": {
+ "line": 82,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "render", ["partials.ts-query-guidelines"], [], ["loc", [null, [81, 4], [81, 45]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 77,
+ "column": 0
+ },
+ "end": {
+ "line": 83,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "side-drawer", [], ["label", "Query Guidelines", "visible", ["subexpr", "@mut", [["get", "isSideDrawerVisible", ["loc", [null, [80, 10], [80, 29]]]]], [], []]], 0, null, ["loc", [null, [78, 2], [82, 18]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes", "wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 85,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/query/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "ts-table-container table-query-container");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 1, 1);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.container", [], [], 0, null, ["loc", [null, [2, 2], [74, 33]]]], ["block", "ember-wormhole", [], ["to", "side-drawer-container"], 1, null, ["loc", [null, [77, 0], [83, 19]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/table/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/polling', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesPolling, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesPolling['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ rowsPaging: {
+ size: 10,
+ initialLow: 0,
+ initialHigh: 9
+ },
+
+ model: function model(params) {
+ return this.explorer.getTable(params.clusterName, params.tableName);
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ table: model
+ });
+ this.setViewLabel({
+ preLabel: 'Table',
+ label: model.get('name')
+ });
+ },
+
+ setupController: function setupController(controller, model) {
+ var page = this.get('rowsPaging');
+
+ this._super(controller, model);
+ this.controller.set('pageSize', page.size);
+ this.controller.set('currentTableRows', this.rowsFromRange(page.initialLow, page.initialHigh));
+ },
+
+ rowsFromRange: function rowsFromRange(startIndex, endIndex) {
+ return this.currentModel.get('rowsSortedByQuantumValues').filter(function (row, index) {
+ return index >= startIndex && index <= endIndex;
+ });
+ },
+
+ lookForNewRowsList: function lookForNewRowsList() {
+ var self = this;
+ var table = this.currentModel;
+ var page = this.get('rowsPaging');
+
+ this.explorer.getTableRowsList(table).then(function () {
+ return self.explorer.getTableRows(table);
+ }).then(function () {
+ self.controller.set('currentTableRows', self.rowsFromRange(page.initialLow, page.initialHigh));
+ self.stopPolling();
+ });
+ },
+
+ actions: {
+ refreshRowsList: function refreshRowsList(table) {
+ var self = this;
+
+ this.controller.set('modalVisible', false);
+ this.controller.set('showCachedListWarning', false);
+
+ return this.explorer.refreshTableRowsList(table).then(function () {
+ self.startPolling(self.lookForNewRowsList.bind(self));
+ });
+ },
+
+ rowsPageRequest: function rowsPageRequest(lowIndex, highIndex) {
+ this.controller.set('currentTableRows', this.rowsFromRange(lowIndex, highIndex));
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/table/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 5,
+ "column": 8
+ },
+ "end": {
+ "line": 7,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "warning", ["loc", [null, [6, 16], [6, 27]]]]],
+ locals: ["warning"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 9,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "label label-warning");
+ var el3 = dom.createTextNode("WARNINGS");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "model.warnings", ["loc", [null, [5, 16], [5, 30]]]]], [], 0, null, ["loc", [null, [5, 8], [7, 17]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 10,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "warning", "dismissible", false], 0, null, ["loc", [null, [2, 2], [9, 22]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 15,
+ "column": 8
+ },
+ "end": {
+ "line": 18,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-plus-circled");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Write Data\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 20,
+ "column": 8
+ },
+ "end": {
+ "line": 26,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-search");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Query Data\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 13,
+ "column": 2
+ },
+ "end": {
+ "line": 28,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element8 = dom.childAt(fragment, [1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(element8, 1, 1);
+ morphs[1] = dom.createMorphAt(element8, 3, 3);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["table.write", ["get", "model.cluster.name", ["loc", [null, [15, 33], [15, 51]]]], ["get", "model.name", ["loc", [null, [15, 52], [15, 62]]]]], ["class", "action-button create"], 0, null, ["loc", [null, [15, 8], [18, 20]]]], ["block", "link-to", ["table.query", ["get", "model.cluster.name", ["loc", [null, [21, 8], [21, 26]]]], ["get", "model.name", ["loc", [null, [22, 8], [22, 18]]]]], ["class", "action-button create"], 1, null, ["loc", [null, [20, 8], [26, 20]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 32,
+ "column": 8
+ },
+ "end": {
+ "line": 32,
+ "column": 32
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("Overview");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 33,
+ "column": 8
+ },
+ "end": {
+ "line": 33,
+ "column": 43
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("Advanced Properties");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 31,
+ "column": 6
+ },
+ "end": {
+ "line": 34,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ return morphs;
+ },
+ statements: [["block", "tablist.tab", [], [], 0, null, ["loc", [null, [32, 8], [32, 48]]]], ["block", "tablist.tab", [], [], 1, null, ["loc", [null, [33, 8], [33, 59]]]]],
+ locals: ["tablist"],
+ templates: [child0, child1]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 36,
+ "column": 6
+ },
+ "end": {
+ "line": 38,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "table.table-overview", [], ["table", ["subexpr", "@mut", [["get", "model", ["loc", [null, [37, 37], [37, 42]]]]], [], []]], ["loc", [null, [37, 8], [37, 44]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 40,
+ "column": 6
+ },
+ "end": {
+ "line": 42,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "table.bucket-props-advanced", [], ["model", ["subexpr", "@mut", [["get", "model", ["loc", [null, [41, 44], [41, 49]]]]], [], []]], ["loc", [null, [41, 8], [41, 51]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 30,
+ "column": 4
+ },
+ "end": {
+ "line": 43,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "tabs.tablist", [], [], 0, null, ["loc", [null, [31, 6], [34, 23]]]], ["block", "tabs.tabpanel", [], [], 1, null, ["loc", [null, [36, 6], [38, 24]]]], ["block", "tabs.tabpanel", [], [], 2, null, ["loc", [null, [40, 6], [42, 24]]]]],
+ locals: ["tabs"],
+ templates: [child0, child1, child2]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 29,
+ "column": 2
+ },
+ "end": {
+ "line": 44,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "ivy-tabs", [], ["on-select", ["subexpr", "action", [["subexpr", "mut", [["get", "selectedIndex", ["loc", [null, [30, 39], [30, 52]]]]], [], ["loc", [null, [30, 34], [30, 53]]]]], [], ["loc", [null, [30, 26], [30, 54]]]], "selected-index", ["subexpr", "@mut", [["get", "selectedIndex", ["loc", [null, [30, 70], [30, 83]]]]], [], []]], 0, null, ["loc", [null, [30, 4], [43, 17]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 12,
+ "column": 0
+ },
+ "end": {
+ "line": 45,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Table Properties"], 0, null, ["loc", [null, [13, 2], [28, 30]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [29, 2], [44, 28]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 50,
+ "column": 8
+ },
+ "end": {
+ "line": 55,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("button");
+ dom.setAttribute(el1, "type", "button");
+ dom.setAttribute(el1, "class", "action-button refresh");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "ion-refresh");
+ dom.setAttribute(el2, "aria-hidden", "true");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n Refresh Rows List Cache\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element7 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element7);
+ return morphs;
+ },
+ statements: [["element", "action", ["showModal"], [], ["loc", [null, [51, 62], [51, 84]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 48,
+ "column": 2
+ },
+ "end": {
+ "line": 57,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.cluster.developmentMode", ["loc", [null, [50, 14], [50, 43]]]]], [], 0, null, ["loc", [null, [50, 8], [55, 15]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 59,
+ "column": 4
+ },
+ "end": {
+ "line": 61,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" No cache list exists\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 61,
+ "column": 4
+ },
+ "end": {
+ "line": 63,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "loading-spinner", [], ["statusMessage", ["subexpr", "@mut", [["get", "model.statusMessage", ["loc", [null, [62, 38], [62, 57]]]]], [], []]], ["loc", [null, [62, 6], [62, 59]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 68,
+ "column": 12
+ },
+ "end": {
+ "line": 70,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "more-info");
+ var el2 = dom.createTextNode("Hide info on explorer cached lists");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element5 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element5);
+ return morphs;
+ },
+ statements: [["element", "action", ["hideSideDrawer"], [], ["loc", [null, [69, 40], [69, 67]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 70,
+ "column": 12
+ },
+ "end": {
+ "line": 72,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "more-info");
+ var el2 = dom.createTextNode("More info on explorer cached lists");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element4 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element4);
+ return morphs;
+ },
+ statements: [["element", "action", ["showSideDrawer"], [], ["loc", [null, [71, 40], [71, 67]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 65,
+ "column": 8
+ },
+ "end": {
+ "line": 73,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" Table rows are read from a cached list and may not represent the current state of the table.\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("br");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "isSideDrawerVisible", ["loc", [null, [68, 18], [68, 37]]]]], [], 0, 1, ["loc", [null, [68, 12], [72, 19]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 64,
+ "column": 6
+ },
+ "end": {
+ "line": 74,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], [], 0, null, ["loc", [null, [65, 8], [73, 28]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 83,
+ "column": 10
+ },
+ "end": {
+ "line": 88,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("Total Rows");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 3]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "model.rows.length", ["loc", [null, [86, 36], [86, 57]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 101,
+ "column": 28
+ },
+ "end": {
+ "line": 103,
+ "column": 28
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("th");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "column.name", ["loc", [null, [102, 36], [102, 51]]]]],
+ locals: ["column"],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 109,
+ "column": 32
+ },
+ "end": {
+ "line": 111,
+ "column": 32
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("td");
+ var el2 = dom.createElement("code");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 0]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "value", ["loc", [null, [110, 46], [110, 55]]]]],
+ locals: ["value"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 107,
+ "column": 26
+ },
+ "end": {
+ "line": 113,
+ "column": 26
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "row.parsedValue", ["loc", [null, [109, 40], [109, 55]]]]], [], 0, null, ["loc", [null, [109, 32], [111, 41]]]]],
+ locals: ["row"],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 94,
+ "column": 18
+ },
+ "end": {
+ "line": 116,
+ "column": 18
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("table");
+ dom.setAttribute(el1, "class", "table");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("thead");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode(" ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tbody");
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element3 = dom.childAt(fragment, [1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(dom.childAt(element3, [1, 1]), 1, 1);
+ morphs[1] = dom.createMorphAt(dom.childAt(element3, [3]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "model.columns", ["loc", [null, [101, 36], [101, 49]]]]], [], 0, null, ["loc", [null, [101, 28], [103, 37]]]], ["block", "each", [["get", "currentTableRows", ["loc", [null, [107, 34], [107, 50]]]]], [], 1, null, ["loc", [null, [107, 26], [113, 35]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 93,
+ "column": 16
+ },
+ "end": {
+ "line": 117,
+ "column": 16
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "pagination-component", [], ["chunkSize", ["subexpr", "@mut", [["get", "pageSize", ["loc", [null, [95, 28], [95, 36]]]]], [], []], "totalSize", ["subexpr", "@mut", [["get", "model.rows.length", ["loc", [null, [96, 28], [96, 45]]]]], [], []], "sectionRequest", "rowsPageRequest"], 0, null, ["loc", [null, [94, 18], [116, 43]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child3 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 117,
+ "column": 16
+ },
+ "end": {
+ "line": 119,
+ "column": 16
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" No rows found in table\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 63,
+ "column": 4
+ },
+ "end": {
+ "line": 125,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("table");
+ dom.setAttribute(el1, "class", "key-value-table");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tbody");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("Cached List Created");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value");
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "key");
+ var el5 = dom.createTextNode("Table Rows");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.setAttribute(el4, "class", "value");
+ var el5 = dom.createTextNode("\n");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode(" ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n ");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element6 = dom.childAt(fragment, [2, 1]);
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(dom.childAt(element6, [1, 3]), 0, 0);
+ morphs[2] = dom.createMorphAt(element6, 3, 3);
+ morphs[3] = dom.createMorphAt(dom.childAt(element6, [5, 3]), 1, 1);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "showCachedListWarning", ["loc", [null, [64, 12], [64, 33]]]]], [], 0, null, ["loc", [null, [64, 6], [74, 13]]]], ["content", "model.rowsList.created", ["loc", [null, [80, 32], [80, 58]]]], ["block", "if", [["get", "model.rows.length", ["loc", [null, [83, 16], [83, 33]]]]], [], 1, null, ["loc", [null, [83, 10], [88, 17]]]], ["block", "if", [["get", "model.rows.length", ["loc", [null, [93, 22], [93, 39]]]]], [], 2, 3, ["loc", [null, [93, 16], [119, 23]]]]],
+ locals: [],
+ templates: [child0, child1, child2, child3]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 61,
+ "column": 4
+ },
+ "end": {
+ "line": 125,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "and", [["get", "model.hasListBeenRequested", ["loc", [null, [61, 19], [61, 45]]]], ["subexpr", "not", [["get", "model.isListLoaded", ["loc", [null, [61, 51], [61, 69]]]]], [], ["loc", [null, [61, 46], [61, 70]]]]], [], ["loc", [null, [61, 14], [61, 71]]]]], [], 0, 1, ["loc", [null, [61, 4], [125, 4]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 58,
+ "column": 2
+ },
+ "end": {
+ "line": 126,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "and", [["subexpr", "not", [["get", "model.hasListBeenRequested", ["loc", [null, [59, 20], [59, 46]]]]], [], ["loc", [null, [59, 15], [59, 47]]]], ["subexpr", "not", [["get", "model.isListLoaded", ["loc", [null, [59, 53], [59, 71]]]]], [], ["loc", [null, [59, 48], [59, 72]]]]], [], ["loc", [null, [59, 10], [59, 73]]]]], [], 0, 1, ["loc", [null, [59, 4], [125, 11]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 47,
+ "column": 0
+ },
+ "end": {
+ "line": 127,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Table Rows"], 0, null, ["loc", [null, [48, 2], [57, 30]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [58, 2], [126, 28]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child3 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 131,
+ "column": 2
+ },
+ "end": {
+ "line": 154,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "modal-content-container");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("header");
+ dom.setAttribute(el2, "class", "modal-header");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("h3");
+ var el4 = dom.createElement("span");
+ dom.setAttribute(el4, "class", "label label-danger");
+ var el5 = dom.createElement("i");
+ dom.setAttribute(el5, "class", "ion-alert-circled");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode(" Potentially Dangerous Operation");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("section");
+ dom.setAttribute(el2, "class", "modal-body");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("p");
+ var el4 = dom.createTextNode("Creating a new cache list requires making a streaming call, with multiple response messages sent for each\n request.");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("p");
+ var el4 = dom.createTextNode("This can be an expensive operation, and is not recommended if the node is in active use. To\n continue please click the confirm button.");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("footer");
+ dom.setAttribute(el2, "class", "modal-footer");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("button");
+ dom.setAttribute(el3, "class", "btn btn-default");
+ var el4 = dom.createTextNode("Cancel");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("button");
+ dom.setAttribute(el3, "class", "btn btn-primary");
+ var el4 = dom.createTextNode("Confirm");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1, 5]);
+ var element1 = dom.childAt(element0, [1]);
+ var element2 = dom.childAt(element0, [3]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createElementMorph(element1);
+ morphs[1] = dom.createElementMorph(element2);
+ return morphs;
+ },
+ statements: [["element", "action", ["hideModal"], [], ["loc", [null, [150, 46], [150, 68]]]], ["element", "action", ["refreshRowsList", ["get", "model", ["loc", [null, [151, 73], [151, 78]]]]], [], ["loc", [null, [151, 46], [151, 80]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 130,
+ "column": 0
+ },
+ "end": {
+ "line": 155,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "modal-dialog", [], ["close", "hideModal", "translucentOverlay", true], 0, null, ["loc", [null, [131, 2], [154, 19]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child4 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 159,
+ "column": 2
+ },
+ "end": {
+ "line": 163,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "render", ["partials.cached-lists"], [], ["loc", [null, [162, 4], [162, 38]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 158,
+ "column": 0
+ },
+ "end": {
+ "line": 164,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "side-drawer", [], ["label", "Explorer Cached Lists", "visible", ["subexpr", "@mut", [["get", "isSideDrawerVisible", ["loc", [null, [161, 10], [161, 29]]]]], [], []]], 0, null, ["loc", [null, [159, 2], [163, 18]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 164,
+ "column": 19
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(5);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);
+ morphs[4] = dom.createMorphAt(fragment, 8, 8, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "model.warnings", ["loc", [null, [1, 6], [1, 20]]]]], [], 0, null, ["loc", [null, [1, 0], [10, 7]]]], ["block", "dashboard-module.container", [], ["class", "medium-width"], 1, null, ["loc", [null, [12, 0], [45, 31]]]], ["block", "dashboard-module.container", [], ["class", "medium-width"], 2, null, ["loc", [null, [47, 0], [127, 31]]]], ["block", "if", [["get", "modalVisible", ["loc", [null, [130, 6], [130, 18]]]]], [], 3, null, ["loc", [null, [130, 0], [155, 7]]]], ["block", "ember-wormhole", [], ["to", "side-drawer-container"], 4, null, ["loc", [null, [158, 0], [164, 19]]]]],
+ locals: [],
+ templates: [child0, child1, child2, child3, child4]
+ };
+ })());
+});
+define('ember-riak-explorer/pods/table/write/controller', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/side-drawer'], function (exports, _ember, _emberRiakExplorerMixinsControllerSideDrawer) {
+ exports['default'] = _ember['default'].Controller.extend(_emberRiakExplorerMixinsControllerSideDrawer['default'], {
+ errors: [],
+
+ example: '',
+
+ writeData: '',
+
+ isDisabled: true,
+
+ successMessage: '',
+
+ canSubmit: (function () {
+ return this.set('isDisabled', _ember['default'].isBlank(this.get('writeData')));
+ }).observes('writeData'),
+
+ clearErrors: function clearErrors() {
+ this.set('errors', []);
+ },
+
+ clearSuccessMessage: function clearSuccessMessage() {
+ this.set('successMessage', '');
+ },
+
+ clearWriteData: function clearWriteData() {
+ this.set('writeData', '');
+ },
+
+ resetState: function resetState() {
+ this.clearErrors();
+ this.clearSuccessMessage();
+ this.clearWriteData();
+ },
+
+ actions: {
+ insertExample: function insertExample() {
+ this.set('writeData', this.get('example'));
+ }
+ }
+ });
+});
+define('ember-riak-explorer/pods/table/write/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state', 'ember-riak-explorer/utils/data-type-checks', 'lodash/lodash'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState, _emberRiakExplorerUtilsDataTypeChecks, _lodashLodash) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {
+ model: function model(params) {
+ return this.explorer.getTable(params.clusterName, params.tableName);
+ },
+
+ afterModel: function afterModel(model, transition) {
+ this.setSidebarCluster(model.get('cluster'));
+ this.setBreadCrumbs({
+ cluster: model.get('cluster'),
+ table: model,
+ crudAction: 'write to table'
+ });
+ this.setViewLabel({
+ preLabel: 'Table',
+ label: model.get('name')
+ });
+ },
+
+ setupController: function setupController(controller, model) {
+ this._super(controller, model);
+
+ this.setExample();
+ controller.resetState();
+ },
+
+ prepareData: function prepareData(stringData) {
+ var isValid = false;
+ var data = null;
+
+ // Wraps the comma separated strings in an array, and replaces any single quotes with double
+ var transformed = '[' + stringData.replace(/'/g, '"') + ']';
+
+ // Convert to actual JSON
+ try {
+ data = JSON.parse(transformed);
+ } catch (e) {
+ isValid = false;
+ }
+
+ // Make sure all child items inside the parent array are arrays
+ if (data) {
+ isValid = data.length === data.filter(function (item) {
+ return _lodashLodash['default'].isArray(item);
+ }).length;
+ }
+
+ if (!isValid) {
+ this.controller.set('errors', ['Submitted Data is not formatted correctly.', 'The editor expects an array for each row you wish to insert, with each array separated by a comma.']);
+ this.scrollToTop();
+ }
+
+ return data;
+ },
+
+ runValidations: function runValidations(data) {
+ return this.validateWriteCoversAllColumns(data) && this.validateWriteUsesCorrectDataTypes(data);
+ },
+
+ setExample: function setExample() {
+ // HERE BE DRAGONS: I apologize for the extremely complicated code, the point of this function is to dynamically
+ // generate 3 sample writes for the user. We have to create a giant string that looks a group of arrays, and type
+ // conversion in js in not ideal. All complicated parts are commented to help clarify
+
+ // Eventual string that will be inserted into the code editor
+ var exampleWrite = '';
+
+ // Each column type with ten possibilies, 3 times. This ensures no matter what how many columns, we can use modulo 10
+ // and generate a relatively unique array input for the given example
+ var exampleTypeMatrix = {
+ boolean: [[true, false, true, false, true, false, true, false, true, false], [true, false, true, false, true, false, true, false, true, false], [true, false, true, false, true, false, true, false, true, false]],
+ double: [[10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 10.0], [20.1, 20.2, 20.3, 20.4, 20.5, 20.6, 20.7, 20.8, 20.9, 20.0], [30.1, 30.2, 30.3, 30.4, 30.5, 30.6, 30.7, 30.8, 30.9, 30.0]],
+ sint64: [[10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]],
+ timestamp: [[1464024810, 1464024811, 1464024812, 1464024813, 1464024814, 1464024815, 1464024816, 1464024817, 1464024818, 1464024819], [1464024820, 1464024821, 1464024822, 1464024823, 1464024824, 1464024825, 1464024826, 1464024827, 1464024828, 1464024829], [1464024830, 1464024831, 1464024832, 1464024833, 1464024834, 1464024835, 1464024836, 1464024837, 1464024838, 1464024839]],
+ varchar: [['\'foo\'', '\'bar\'', '\'Lorem\'', '\'ipsum\'', '\'dolor\'', '\'sit\'', '\'amet\'', '\'consectetur\'', '\'adipiscing\'', '\'elit\''], ['\'Aliquam\'', '\'sit\'', '\'amet\'', '\'tincidunt\'', '\'felis\'', '\'Curabitur\'', '\'at;', '\'gravida\'', '\'est\'', '\'Quisque\''], ['\'vehicula\'', '\'mi\'', '\'sed\'', '\'libero\'', '\'hendrerit\'', '\'vel\'', '\'mollis\'', '\'lorem\'', '\'euismod\'', '\'Donec\'']]
+ };
+ var columns = this.currentModel.get('columns');
+
+ // Creates three sample writes by going through each column and using a sample of that columns type
+ _lodashLodash['default'].times(3, function (timesIndex) {
+ var example = [];
+
+ columns.forEach(function (column, columnIndex) {
+ example.push(exampleTypeMatrix[column.type][timesIndex][columnIndex % 10]);
+ });
+
+ // convert example array to string, gives us the desired formatting and spacing
+ example = example.join(', ');
+
+ if (timesIndex === 0) {
+ exampleWrite = '[' + example + ']';
+ } else {
+ exampleWrite += ', [' + example + ']';
+ }
+ });
+
+ this.controller.set('example', exampleWrite);
+ },
+
+ validateWriteCoversAllColumns: function validateWriteCoversAllColumns(data) {
+ var columnsInTable = this.currentModel.get('columns').length;
+
+ // Checks that each arrays length matches the amount of columns defined in the table
+ var isValid = data.length === data.filter(function (subArray) {
+ return subArray.length === columnsInTable;
+ }).length;
+
+ if (!isValid) {
+ // 'Row column values must be in the same order as defined in the table. Refer to the table columns in the table reference for order.'
+ this.controller.set('errors', ['Submitted Data is not correct. At least one of your arrays length does not match the amount of columns in the table.', 'Row values must be in the same order as columns are defined on the table. Refer to the table definition for correct order.', 'If a table column is optional, and you do not wish to pass a value, use null
as the row array value.']);
+ this.scrollToTop();
+ }
+
+ return isValid;
+ },
+
+ validateWriteUsesCorrectDataTypes: function validateWriteUsesCorrectDataTypes(data) {
+ var tableColumns = this.currentModel.get('columns');
+ var controller = this.controller;
+ var self = this;
+
+ var isValid = data.length === data.filter(function (subArray) {
+ return tableColumns.length === subArray.filter(function (item, index) {
+ var column = tableColumns[index];
+ var isSameType = undefined;
+
+ if (column.optional && item === null) {
+ isSameType = true;
+ } else {
+ switch (column.type) {
+ case 'varchar':
+ isSameType = _lodashLodash['default'].isString(item);
+ break;
+ case 'boolean':
+ isSameType = _lodashLodash['default'].isBoolean(item);
+ break;
+ case 'timestamp':
+ isSameType = (0, _emberRiakExplorerUtilsDataTypeChecks.isInteger)(item) && item > 0;
+ break;
+ case 'sint64':
+ isSameType = (0, _emberRiakExplorerUtilsDataTypeChecks.isInteger)(item);
+ break;
+ case 'double':
+ // Would like to use isFloat, but valid values like 4.0 do not succeed. JS will automatically convert to 4
+ // There are hacks around it, but since we are using JSON.parse/stringifiy, there is too much effort involved
+ isSameType = (0, _emberRiakExplorerUtilsDataTypeChecks.isNumber)(item);
+ break;
+ default:
+ isSameType = false;
+ break;
+ }
+ }
+
+ if (!isSameType) {
+ var errors = controller.get('errors');
+
+ if (!errors.length) {
+ errors.pushObject('Submitted Data is not correct. Incorrect data types submitted:');
+ }
+
+ errors.pushObject('The ' + column.name + ' column expects a type of ' + column.type + ', but instead was passed ' + item);
+ self.scrollToTop();
+ }
+
+ return isSameType;
+ }).length;
+ }).length;
+
+ return isValid;
+ },
+
+ actions: {
+ writeDataToTable: function writeDataToTable(table, data) {
+ this.controller.clearErrors();
+ this.controller.clearSuccessMessage();
+
+ var sanitizedData = this.prepareData(data);
+ var isValid = sanitizedData ? this.runValidations(sanitizedData) : false;
+ var self = this;
+
+ if (isValid) {
+ this.get('explorer').updateTable(table, sanitizedData).then(function onSuccess(data) {
+ var tableName = table.get('name');
+
+ self.controller.clearErrors();
+ self.controller.clearWriteData();
+ self.controller.set('successMessage', 'Your data was saved to the ' + tableName + ' table.');
+ self.scrollToTop();
+ }, function onFail(error) {
+ self.controller.set('errors', 'The server failed to save the data to the table, check that your data is formatted correctly and try again.');
+ self.scrollToTop();
+ });
+ }
+
+ return false;
+ }
+ }
+ });
+});
+define("ember-riak-explorer/pods/table/write/template", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 6,
+ "column": 8
+ },
+ "end": {
+ "line": 8,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/write/template.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createUnsafeMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "error", ["loc", [null, [7, 14], [7, 25]]]]],
+ locals: ["error"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 4
+ },
+ "end": {
+ "line": 10,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/write/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "label label-danger");
+ var el3 = dom.createTextNode("Errors");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "errors", ["loc", [null, [6, 16], [6, 22]]]]], [], 0, null, ["loc", [null, [6, 8], [8, 17]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 10,
+ "column": 4
+ },
+ "end": {
+ "line": 13,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/write/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "label label-danger");
+ var el3 = dom.createTextNode("Error");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "errors", ["loc", [null, [12, 9], [12, 19]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 14,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/write/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "is-array", [["get", "errors", ["loc", [null, [3, 20], [3, 26]]]]], [], ["loc", [null, [3, 10], [3, 27]]]]], [], 0, 1, ["loc", [null, [3, 4], [13, 11]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 15,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/write/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "danger", "dismissible", false], 0, null, ["loc", [null, [2, 2], [14, 22]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 17,
+ "column": 2
+ },
+ "end": {
+ "line": 20,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/write/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "label label-success");
+ var el3 = dom.createTextNode("SUCCESS");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "successMessage", ["loc", [null, [19, 7], [19, 25]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 16,
+ "column": 0
+ },
+ "end": {
+ "line": 21,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/write/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "success"], 0, null, ["loc", [null, [17, 2], [20, 22]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 27,
+ "column": 8
+ },
+ "end": {
+ "line": 30,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/write/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-close-round");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Cancel\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 25,
+ "column": 4
+ },
+ "end": {
+ "line": 32,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/write/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-actions");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["table", ["get", "model.cluster.name", ["loc", [null, [27, 27], [27, 45]]]], ["get", "model.name", ["loc", [null, [27, 46], [27, 56]]]]], ["class", "cancel action-button"], 0, null, ["loc", [null, [27, 8], [30, 20]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 44,
+ "column": 10
+ },
+ "end": {
+ "line": 46,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/write/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "btn btn-xs btn-info");
+ var el2 = dom.createTextNode("Hide Write Guidelines");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element1 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element1);
+ return morphs;
+ },
+ statements: [["element", "action", ["hideSideDrawer"], [], ["loc", [null, [45, 46], [45, 73]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 46,
+ "column": 10
+ },
+ "end": {
+ "line": 48,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/write/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "btn btn-xs btn-info");
+ var el2 = dom.createTextNode("Show Write Guidelines");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element0);
+ return morphs;
+ },
+ statements: [["element", "action", ["showSideDrawer"], [], ["loc", [null, [47, 46], [47, 73]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 33,
+ "column": 4
+ },
+ "end": {
+ "line": 63,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/write/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("section");
+ dom.setAttribute(el1, "class", "table-ref");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "section-title");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("section");
+ dom.setAttribute(el1, "class", "table-editor");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("label");
+ var el3 = dom.createTextNode("\n Use the editor below to write rows to your table\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "btn btn-xs btn-info");
+ var el4 = dom.createTextNode("Insert Example Write");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "submit-button-container");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("button");
+ dom.setAttribute(el3, "type", "submit");
+ dom.setAttribute(el3, "class", "btn btn-primary");
+ var el4 = dom.createTextNode("\n Insert Rows\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element2 = dom.childAt(fragment, [1]);
+ var element3 = dom.childAt(fragment, [3]);
+ var element4 = dom.childAt(element3, [1]);
+ var element5 = dom.childAt(element4, [1]);
+ var element6 = dom.childAt(element3, [5, 1]);
+ var morphs = new Array(7);
+ morphs[0] = dom.createMorphAt(dom.childAt(element2, [1]), 0, 0);
+ morphs[1] = dom.createMorphAt(element2, 3, 3);
+ morphs[2] = dom.createElementMorph(element5);
+ morphs[3] = dom.createMorphAt(element4, 3, 3);
+ morphs[4] = dom.createMorphAt(element3, 3, 3);
+ morphs[5] = dom.createAttrMorph(element6, 'disabled');
+ morphs[6] = dom.createElementMorph(element6);
+ return morphs;
+ },
+ statements: [["content", "model.name", ["loc", [null, [36, 35], [36, 49]]]], ["inline", "table.ts-table-reference", [], ["table", ["subexpr", "@mut", [["get", "model", ["loc", [null, [37, 41], [37, 46]]]]], [], []]], ["loc", [null, [37, 8], [37, 48]]]], ["element", "action", ["insertExample"], [], ["loc", [null, [43, 44], [43, 70]]]], ["block", "if", [["get", "isSideDrawerVisible", ["loc", [null, [44, 16], [44, 35]]]]], [], 0, 1, ["loc", [null, [44, 10], [48, 17]]]], ["inline", "ivy-codemirror", [], ["mode", "javascript", "theme", "material", "lineWrapping", true, "value", ["subexpr", "mut", [["get", "writeData", ["loc", [null, [55, 21], [55, 30]]]]], [], ["loc", [null, [55, 16], [55, 31]]]]], ["loc", [null, [51, 8], [55, 33]]]], ["attribute", "disabled", ["get", "isDisabled", ["loc", [null, [58, 67], [58, 77]]]]], ["element", "action", ["writeDataToTable", ["get", "model", ["loc", [null, [58, 108], [58, 113]]]], ["get", "writeData", ["loc", [null, [58, 114], [58, 123]]]]], [], ["loc", [null, [58, 80], [58, 125]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 24,
+ "column": 2
+ },
+ "end": {
+ "line": 64,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/write/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "dashboard-module.header", [], ["label", "Table Write Editor"], 0, null, ["loc", [null, [25, 4], [32, 32]]]], ["block", "dashboard-module.body", [], [], 1, null, ["loc", [null, [33, 4], [63, 30]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child3 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 68,
+ "column": 2
+ },
+ "end": {
+ "line": 72,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/write/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "render", ["partials.ts-table-write-guidelines"], [], ["loc", [null, [71, 4], [71, 51]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 67,
+ "column": 0
+ },
+ "end": {
+ "line": 73,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/write/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "side-drawer", [], ["label", "Write Guidelines", "visible", ["subexpr", "@mut", [["get", "isSideDrawerVisible", ["loc", [null, [70, 12], [70, 31]]]]], [], []]], 0, null, ["loc", [null, [68, 2], [72, 18]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 73,
+ "column": 19
+ }
+ },
+ "moduleName": "ember-riak-explorer/pods/table/write/template.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "ts-table-container table-write-container");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[2] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);
+ morphs[3] = dom.createMorphAt(fragment, 5, 5, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "errors", ["loc", [null, [1, 6], [1, 12]]]]], [], 0, null, ["loc", [null, [1, 0], [15, 7]]]], ["block", "if", [["get", "successMessage", ["loc", [null, [16, 6], [16, 20]]]]], [], 1, null, ["loc", [null, [16, 0], [21, 7]]]], ["block", "dashboard-module.container", [], ["class", "medium-width"], 2, null, ["loc", [null, [24, 2], [64, 33]]]], ["block", "ember-wormhole", [], ["to", "side-drawer-container"], 3, null, ["loc", [null, [67, 0], [73, 19]]]]],
+ locals: [],
+ templates: [child0, child1, child2, child3]
+ };
+ })());
+});
+define('ember-riak-explorer/resolver', ['exports', 'ember-resolver'], function (exports, _emberResolver) {
+ exports['default'] = _emberResolver['default'];
+});
+define('ember-riak-explorer/router', ['exports', 'ember', 'ember-riak-explorer/config/environment'], function (exports, _ember, _emberRiakExplorerConfigEnvironment) {
+
+ var Router = _ember['default'].Router.extend({
+ location: _emberRiakExplorerConfigEnvironment['default'].locationType
+ });
+
+ Router.map(function () {
+ // Cluster Routes
+ this.route('cluster.ops', { path: '/cluster/:clusterName/ops' });
+ this.route('cluster.data', { path: '/cluster/:clusterName/data' });
+ this.route('cluster.query', { path: '/cluster/:clusterName/query' });
+
+ // Cluster-Data Routes
+ this.route('bucket-type', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName' });
+ this.route('bucket-type.create', { path: '/cluster/:clusterName/data/bucket_type/create' });
+ this.route('bucket-type.edit', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/edit' });
+ this.route('bucket', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/:bucketName' });
+ this.route('bucket.create', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/create' });
+ this.route('riak-object', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/:bucketName/key/:objectName' });
+ this.route('riak-object.create', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/:bucketName/key/create' });
+ this.route('riak-object.edit', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/:bucketName/key/:objectName/edit' });
+ this.route('riak-object.counter', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/:bucketName/counter/:objectName' });
+ this.route('riak-object.hll', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/:bucketName/hll/:objectName' });
+ this.route('riak-object.set', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/:bucketName/set/:objectName' });
+ this.route('riak-object.map', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/:bucketName/map/:objectName' });
+ this.route('riak-object.map.edit', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/:bucketName/map/:objectName/edit' });
+ this.route('table', { path: '/cluster/:clusterName/data/table/:tableName' });
+ this.route('table.query', { path: '/cluster/:clusterName/data/table/:tableName/query' });
+ this.route('table.write', { path: '/cluster/:clusterName/data/table/:tableName/write' });
+ this.route('table.create', { path: '/cluster/:clusterName/data/table/create' });
+
+ // Cluster-Ops Routes
+ this.route('node', { path: '/cluster/:clusterName/ops/nodes/:nodeName/' });
+ this.route('log-file', { path: '/cluster/:clusterName/ops/nodes/:nodeName/logs/:logName' });
+ this.route('config-file', { path: '/cluster/:clusterName/ops/nodes/:nodeName/configs/:configName' });
+ this.route('node.monitoring', { path: '/cluster/:clusterName/ops/nodes/:nodeName/monitoring' });
+
+ // Cluster-Query Routes
+ this.route('search-index', { path: '/cluster/:clusterName/query/index/:searchIndexName' });
+ this.route('search-schema', { path: '/cluster/:clusterName/query/schema/:searchSchemaName' });
+ this.route('search-schema.edit', { path: '/cluster/:clusterName/query/schema/:searchSchemaName/edit' });
+ this.route('search-schema.create', { path: '/cluster/:clusterName/query/schema/create' });
+
+ // Error Routes
+ this.route('error', { path: '*path' }); // Catch all for any unmatched routes
+ this.route('error.service-not-found', { path: '/error/service-not-found' });
+
+ // Misc. Routes
+ this.route('help');
+ });
+
+ exports['default'] = Router;
+});
+define('ember-riak-explorer/routes/application', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset) {
+ exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], {
+ // Load the list of available clusters, for the left nav
+ model: function model() {
+ var self = this;
+
+ return this.explorer.getClusters().then(function onSuccess(clusters) {
+ return clusters;
+ }, function onFail(error) {
+ self.transitionTo('error.service-not-found');
+ });
+ }
+ });
+});
+define('ember-riak-explorer/serializers/application', ['exports', 'ember-data', 'ember'], function (exports, _emberData, _ember) {
+ exports['default'] = _emberData['default'].RESTSerializer.extend(_emberData['default'].EmbeddedRecordsMixin, {
+ /**
+ `keyForAttribute` can be used to define rules for how to convert an
+ attribute name in your model to a key in your JSON.
+ @method keyForAttribute
+ @param {String} key
+ @param {String} method
+ @return {String} normalized key
+ */
+ keyForAttribute: function keyForAttribute(attr, method) {
+ // Riak and Explorer json uses snake case, like 'development_mode'
+ return _ember['default'].String.underscore(attr);
+ },
+
+ normalizeResponse: function normalizeResponse(store, primaryModelClass, payload, id, requestType) {
+ // We are currently not using the "links" object in the payload. Until we do, remove from
+ // payload to keep deprecation warnings from showing up.
+ delete payload.links;
+
+ return this._super(store, primaryModelClass, payload, id, requestType);
+ }
+ });
+});
+define('ember-riak-explorer/serializers/bucket-type', ['exports', 'ember-riak-explorer/serializers/application', 'ember'], function (exports, _emberRiakExplorerSerializersApplication, _ember) {
+ exports['default'] = _emberRiakExplorerSerializersApplication['default'].extend({
+ normalizeResponse: function normalizeResponse(store, primaryModelClass, payload, id, requestType) {
+ var sortBy = _ember['default'].Enumerable.sortBy;
+
+ payload.bucket_types = payload.bucket_types.sortBy('name');
+
+ return this._super(store, primaryModelClass, payload, id, requestType);
+ }
+ });
+});
+define('ember-riak-explorer/serializers/cluster', ['exports', 'ember-riak-explorer/serializers/application', 'ember'], function (exports, _emberRiakExplorerSerializersApplication, _ember) {
+ exports['default'] = _emberRiakExplorerSerializersApplication['default'].extend({
+ normalizeResponse: function normalizeResponse(store, primaryModelClass, payload, id, requestType) {
+ var sortBy = _ember['default'].Enumerable.sortBy;
+
+ payload.clusters = payload.clusters.sortBy('id');
+
+ // convert riak type to be more readable
+ payload.clusters.forEach(function (cluster) {
+ switch (cluster.riak_type) {
+ case 'oss':
+ cluster.riak_type = 'kv_oss';
+ cluster.riak_type_long = 'KV Open Source';
+ break;
+ case 'ee':
+ cluster.riak_type = 'kv_ee';
+ cluster.riak_type_long = 'KV Enterprise Edition';
+ break;
+ case 'ts':
+ cluster.riak_type = 'ts_oss';
+ cluster.riak_type_long = 'TS Open Source';
+ break;
+ case 'ts_ee':
+ cluster.riak_type_long = 'TS Enterprise Edition';
+ break;
+ default:
+ break;
+ }
+ });
+
+ return this._super(store, primaryModelClass, payload, id, requestType);
+ }
+ });
+});
+define('ember-riak-explorer/serializers/config-file', ['exports', 'ember-riak-explorer/serializers/application'], function (exports, _emberRiakExplorerSerializersApplication) {
+ exports['default'] = _emberRiakExplorerSerializersApplication['default'].extend({
+ normalizeResponse: function normalizeResponse(store, primaryModelClass, payload, id, requestType) {
+ var newPayload = {
+ 'config-files': payload.files
+ };
+
+ return this._super(store, primaryModelClass, newPayload, id, requestType);
+ }
+ });
+});
+define('ember-riak-explorer/serializers/log-file', ['exports', 'ember-riak-explorer/serializers/application'], function (exports, _emberRiakExplorerSerializersApplication) {
+ exports['default'] = _emberRiakExplorerSerializersApplication['default'].extend({
+ normalizeResponse: function normalizeResponse(store, primaryModelClass, payload, id, requestType) {
+ var newPayload = {
+ 'log-files': payload.files
+ };
+
+ return this._super(store, primaryModelClass, newPayload, id, requestType);
+ }
+ });
+});
+define('ember-riak-explorer/serializers/node', ['exports', 'ember-riak-explorer/serializers/application', 'ember'], function (exports, _emberRiakExplorerSerializersApplication, _ember) {
+ exports['default'] = _emberRiakExplorerSerializersApplication['default'].extend({
+ normalizeResponse: function normalizeResponse(store, primaryModelClass, payload, id, requestType) {
+ var sortBy = _ember['default'].Enumerable.sortBy;
+
+ payload.nodes = payload.nodes.sortBy('name');
+
+ return this._super(store, primaryModelClass, payload, id, requestType);
+ }
+ });
+});
+define('ember-riak-explorer/serializers/row', ['exports', 'ember-riak-explorer/serializers/application'], function (exports, _emberRiakExplorerSerializersApplication) {
+ exports['default'] = _emberRiakExplorerSerializersApplication['default'].extend({
+ normalize: function normalize(modelClass, resourceHash, prop) {
+ resourceHash.value = resourceHash.value.split(',').join(', ');
+
+ return this._super(modelClass, resourceHash, prop);
+ }
+ });
+});
+define('ember-riak-explorer/serializers/search-index', ['exports', 'ember-riak-explorer/serializers/application'], function (exports, _emberRiakExplorerSerializersApplication) {
+ exports['default'] = _emberRiakExplorerSerializersApplication['default'].extend({
+ normalizeResponse: function normalizeResponse(store, primaryModelClass, payload, id, requestType) {
+ var newPayload = {
+ 'search-indexes': payload
+ };
+
+ return this._super(store, primaryModelClass, newPayload, id, requestType);
+ },
+
+ // TODO: Remove once basho-labs/riak_explorer#89 is completed
+ normalize: function normalize(modelClass, resourceHash, prop) {
+ resourceHash.schema_ref = resourceHash.schema;
+ delete resourceHash.schema;
+
+ return this._super(modelClass, resourceHash, prop);
+ }
+ });
+});
+define('ember-riak-explorer/serializers/table', ['exports', 'ember-riak-explorer/serializers/application', 'ember', 'lodash/lodash'], function (exports, _emberRiakExplorerSerializersApplication, _ember, _lodashLodash) {
+ exports['default'] = _emberRiakExplorerSerializersApplication['default'].extend({
+ normalizeResponse: function normalizeResponse(store, primaryModelClass, payload, id, requestType) {
+ var sortBy = _ember['default'].Enumerable.sortBy;
+
+ // Parse the DDL object into specific properties and then delete the object
+ payload.tables.forEach(function (table) {
+ var ddl = table.props.ddl;
+
+ // Assign table columns
+ // *** Note: They are called 'fields' instead of 'columns' in the response. Docs use 'columns', so that is what we will use
+ table.columns = [];
+ Object.keys(ddl.fields).forEach(function (columnName) {
+ table.columns.push(_lodashLodash['default'].extend({ name: columnName }, ddl.fields[columnName]));
+ });
+
+ // Assign partition key
+ table.partition_key = [];
+ ddl.partition_key.forEach(function (pk) {
+ var isQuanta = pk.indexOf('quantum') > -1;
+
+ // Reformat quantum to have spaces after commas
+ if (isQuanta) {
+ pk = pk.split(',').join(', ');
+ }
+
+ table.partition_key.push({
+ name: pk,
+ quantum: isQuanta
+ });
+ });
+
+ // Assign local key
+ table.local_key = ddl.local_key;
+
+ delete table.props.ddl;
+ });
+
+ payload.tables = payload.tables.sortBy('name');
+
+ return this._super(store, primaryModelClass, payload, id, requestType);
+ }
+ });
+});
+define('ember-riak-explorer/services/ajax', ['exports', 'ember-ajax/services/ajax'], function (exports, _emberAjaxServicesAjax) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberAjaxServicesAjax['default'];
+ }
+ });
+});
+define('ember-riak-explorer/services/explorer', ['exports', 'ember', 'ember-riak-explorer/config/environment', 'ember-riak-explorer/utils/parse-header'], function (exports, _ember, _emberRiakExplorerConfigEnvironment, _emberRiakExplorerUtilsParseHeader) {
+
+ /**
+ * An Ember service responsible for AJAX communication with the Explorer API.
+ *
+ * @class ExplorerService
+ * @extends Ember.Service
+ * @constructor
+ * @uses Bucket
+ * @uses BucketType
+ * @uses BucketProps
+ * @uses Cluster
+ * @uses RiakObject
+ * @uses ObjectMetadata
+ */
+ exports['default'] = _ember['default'].Service.extend({
+ name: 'explorer',
+
+ availableIn: ['controllers', 'routes'],
+
+ /**
+ * Default chunk size for requests that can potentially have large amounts of records
+ * i.e. buckets and keys
+ *
+ * @property pageSize
+ * @type Integer
+ * @default 500
+ */
+ pageSize: _emberRiakExplorerConfigEnvironment['default'].pageSize,
+
+ /**
+ *
+ * @method associateSchemasWithIndexes
+ * @param {DS.Model} cluster
+ */
+ associateSchemasWithIndexes: function associateSchemasWithIndexes(cluster) {
+ var self = this;
+
+ cluster.get('searchIndexes').forEach(function (index) {
+ var schemaName = index.get('schemaRef');
+ var schema = cluster.get('searchSchemas').findBy('name', schemaName);
+
+ if (!schema) {
+ schema = self.store.createRecord('search-schema', {
+ id: cluster.get('name') + '/' + schemaName,
+ cluster: cluster,
+ name: schemaName
+ });
+ }
+
+ index.set('schema', schema);
+ });
+ },
+
+ /**
+ * Checks availability and validity of nodes in a given cluster.
+ *
+ * @method monitorCluster
+ * @param {DS.Model} cluster
+ */
+ monitorCluster: function monitorCluster(cluster) {
+ // Ping each node in cluster
+ this.pingNodes(cluster);
+ // Get status of each node in cluster
+ this.getNodesStatus(cluster);
+ // Get node statistics for historical analysis
+ this.getNodesStats(cluster);
+ },
+
+ /**
+ * Creates a Schema instance
+ *
+ * @method createSchema
+ * @param {String} clusterName
+ * @param {String} schemaName
+ * @param {XML.String} data
+ */
+ createSchema: function createSchema(clusterName, schemaName, data) {
+ var url = 'riak/clusters/' + clusterName + '/search/schema/' + schemaName;
+
+ return _ember['default'].$.ajax({
+ type: 'PUT',
+ url: url,
+ contentType: 'application/xml',
+ processData: false,
+ data: data
+ });
+ },
+
+ createBucketType: function createBucketType(clusterName, bucketType) {
+ var url = 'explore/clusters/' + clusterName + '/bucket_types/' + bucketType.name;
+
+ return _ember['default'].$.ajax({
+ type: 'PUT',
+ url: url,
+ contentType: 'application/json',
+ data: JSON.stringify(bucketType.data)
+ });
+ },
+
+ createCRDT: function createCRDT(clusterName, bucketTypeName, bucketName, objectName, data) {
+ var url = 'riak/clusters/' + clusterName + '/types/' + bucketTypeName + '/buckets/' + bucketName + '/datatypes/' + objectName;
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+ var request = _ember['default'].$.ajax({
+ contentType: 'application/json',
+ type: 'POST',
+ dataType: 'json',
+ url: url,
+ data: JSON.stringify(data)
+ });
+
+ request.done(function (data) {
+ resolve(data);
+ });
+
+ request.fail(function (jqXHR) {
+ if (jqXHR.status === 204) {
+ resolve(jqXHR.status);
+ } else {
+ reject(jqXHR);
+ }
+ });
+ });
+ },
+
+ /**
+ *
+ * @method getBucket
+ * @param {String} clusterName
+ * @param {String} bucketTypeName
+ * @param {String} bucketName
+ * @return {DS.Model} Bucket
+ */
+ getBucket: function getBucket(clusterName, bucketTypeName, bucketName) {
+ var self = this;
+
+ return this.getBucketType(clusterName, bucketTypeName).then(function (bucketType) {
+ return bucketType.get('buckets').findBy('name', bucketName);
+ }).then(function (bucket) {
+ return _ember['default'].RSVP.allSettled([bucket, self.getBucketProps(bucket), self.getObjects(bucket), self.getObjectList(bucket)]);
+ }).then(function (PromiseArray) {
+ var bucket = PromiseArray[0].value;
+
+ return bucket;
+ });
+ },
+
+ /**
+ *
+ * @method getBucketList
+ * @param {DS.Model} bucketType
+ * @return {DS.Model} BucketList
+ */
+ getBucketList: function getBucketList(bucketType) {
+ var clusterName = bucketType.get('cluster').get('name');
+ var bucketTypeName = bucketType.get('name');
+
+ return this.store.queryRecord('bucket-list', { clusterName: clusterName, bucketTypeName: bucketTypeName }).then(function onSuccess(bucketList) {
+ bucketType.set('isListLoaded', true);
+ bucketType.set('bucketList', bucketList);
+
+ return bucketType.get('bucketList');
+ });
+ },
+
+ /**
+ *
+ * @method getBucketProps
+ * @param {DS.Model} bucket
+ * @return {Object} Bucket.props
+ */
+ getBucketProps: function getBucketProps(bucket) {
+ var clusterUrl = bucket.get('bucketType').get('cluster').get('proxyUrl');
+ var bucketTypeName = bucket.get('bucketType').get('name');
+ var bucketName = bucket.get('name');
+ var url = clusterUrl + '/types/' + bucketTypeName + '/buckets/' + bucketName + '/props';
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+ var request = _ember['default'].$.ajax({
+ url: url,
+ type: 'GET'
+ });
+
+ request.done(function (data) {
+ bucket.set('props', data.props);
+
+ resolve(data);
+ });
+
+ request.fail(function (data) {
+ reject(data);
+ });
+ });
+ },
+
+ /**
+ *
+ * @method getBuckets
+ * @param {DS.Model} bucketType
+ * @return {DS.Array} Bucket
+ */
+ getBuckets: function getBuckets(bucketType) {
+ var clusterName = bucketType.get('cluster').get('name');
+ var bucketTypeName = bucketType.get('name');
+
+ return this.store.query('bucket', { clusterName: clusterName, bucketTypeName: bucketTypeName }).then(function (buckets) {
+ bucketType.set('buckets', buckets);
+
+ return bucketType.get('buckets');
+ });
+ },
+
+ /**
+ *
+ * @method getBucketType
+ * @param {String} clusterName
+ * @param {String} bucketTypeName
+ * @return {DS.Model} BucketType
+ */
+ getBucketType: function getBucketType(clusterName, bucketTypeName) {
+ var self = this;
+
+ return this.getCluster(clusterName).then(function (cluster) {
+ return cluster.get('bucketTypes').findBy('name', bucketTypeName);
+ }).then(function (bucketType) {
+ return _ember['default'].RSVP.allSettled([bucketType, self.getBuckets(bucketType), self.getBucketList(bucketType)]);
+ }).then(function (PromiseArray) {
+ var bucketType = PromiseArray[0].value;
+
+ return bucketType;
+ });
+ },
+
+ /**
+ * Returns all the Bucket Types that belong to the specified cluster.
+ *
+ * @method getBucketTypes
+ * @param {DS.Model} cluster
+ * @return {DS.Array} BucketType
+ */
+ getBucketTypes: function getBucketTypes(cluster) {
+ return this.store.query('bucket-type', { clusterName: cluster.get('name') }).then(function (bucketTypes) {
+ cluster.set('bucketTypes', bucketTypes);
+
+ return cluster.get('bucketTypes');
+ });
+ },
+
+ /**
+ * Fetches a given config file and its dependencies
+ *
+ * @method getConfigFile
+ * @param {String} clusterName
+ * @param {String} nodeName
+ * @param {String} configName
+ * @return {DS.Model} ConfigFile
+ */
+ getConfigFile: function getConfigFile(clusterName, nodeName, configName) {
+ var self = this;
+
+ return this.getNode(clusterName, nodeName).then(function (node) {
+ return node.get('configFiles').findBy('name', configName);
+ }).then(function (configFile) {
+ return _ember['default'].RSVP.allSettled([configFile, self.getConfigFileContents(configFile)]);
+ }).then(function (PromiseArray) {
+ var configFile = PromiseArray[0].value;
+
+ return configFile;
+ });
+ },
+
+ /**
+ * Fetches and creates a set of config file for a given node.
+ *
+ * @method getConfigFiles
+ * @param {DS.Model} node
+ * @return {DS.Array} ConfigFile
+ */
+ getConfigFiles: function getConfigFiles(node) {
+ if (_ember['default'].isEmpty(node.get('configFiles'))) {
+ return this.store.query('config-file', { clusterName: node.get('cluster').get('name'), nodeName: node.get('name') }).then(function (configFiles) {
+ node.set('configFiles', configFiles);
+
+ return node.get('configFiles');
+ });
+ } else {
+ return node.get('configFiles');
+ }
+ },
+
+ /**
+ * Fetches and sets a given config files contents
+ *
+ * @method getConfigFileContents
+ * @param {DS.Model} config
+ * @return {DS.Model} ConfigFile
+ */
+ getConfigFileContents: function getConfigFileContents(config) {
+ var clusterName = config.get('node').get('cluster').get('name');
+ var nodeName = config.get('node').get('name');
+ var configName = config.get('name');
+ var url = 'explore/clusters/' + clusterName + '/nodes/' + nodeName + '/config/files/' + configName;
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+ var request = _ember['default'].$.ajax({
+ url: url,
+ type: 'GET',
+ headers: {
+ Accept: "plain/text;"
+ }
+ });
+
+ request.done(function (data) {
+ config.set('content', data);
+
+ resolve(config);
+ });
+
+ request.fail(function (data) {
+ reject(data);
+ });
+ });
+ },
+
+ /**
+ * Creates and returns a Cluster object and initializes it with dependent
+ * data (including all its Bucket Types and Search Indexes).
+ *
+ * @method getCluster
+ * @param {String} clusterName
+ * @return {DS.Model} Cluster
+ */
+ getCluster: function getCluster(clusterName) {
+ var self = this;
+
+ return this.getClusters().then(function (clusters) {
+ return clusters.findBy('name', clusterName);
+ }).then(function (cluster) {
+ return _ember['default'].RSVP.allSettled([cluster, self.getBucketTypes(cluster), self.getIndexes(cluster), self.getNodes(cluster), self.getTables(cluster)]);
+ }).then(function (PromiseArray) {
+ var cluster = PromiseArray[0].value;
+
+ if (!cluster.hasBeenInitialized) {
+ // Create search-schemas from index references
+ self.associateSchemasWithIndexes(cluster);
+
+ // Check on node health of the cluster
+ self.monitorCluster(cluster);
+
+ // Continue to check on node health
+ self.pollCluster(cluster);
+ }
+
+ cluster.hasBeenInitialized = true;
+
+ return cluster;
+ });
+ },
+
+ /**
+ * Fetches all clusters defined in the riak_explorer.conf file
+ *
+ * @method getClusters
+ * @return {DS.Array} Cluster
+ */
+ getClusters: function getClusters() {
+ return this.store.findAll('cluster');
+ },
+
+ /**
+ *
+ * @method getIndex
+ * @param {String} clusterName
+ * @param {String} indexName
+ * @param {DS.Model} SearchIndex
+ */
+ getIndex: function getIndex(clusterName, indexName) {
+ var self = this;
+
+ return this.getCluster(clusterName).then(function (cluster) {
+ return cluster.get('searchIndexes').findBy('name', indexName);
+ });
+ },
+
+ /**
+ * Returns a list of Search Indexes that have been created on this cluster.
+ * @see http://docs.basho.com/riak/latest/dev/references/http/search-index-info/
+ *
+ * @method getIndexes
+ * @param {DS.Model} cluster
+ * @return {DS.Array} SearchIndex
+ */
+ getIndexes: function getIndexes(cluster) {
+ if (_ember['default'].isEmpty(cluster.get('searchIndexes'))) {
+ // If this page was accessed directly
+ // (via a bookmark and not from a link), bucket types are likely
+ // to be not loaded yet. Load them.
+ return this.store.query('search-index', { clusterName: cluster.get('name') }).then(function (indexes) {
+ cluster.set('searchIndexes', indexes);
+
+ cluster.get('searchIndexes');
+ });
+ } else {
+ return cluster.get('searchIndexes');
+ }
+ },
+
+ /**
+ * Fetches a given log file and its dependencies
+ *
+ * @method getLogFile
+ * @param {String} clusterName
+ * @param {String} nodeName
+ * @param {String} logName
+ * @return {DS.Model} LogFile
+ */
+ getLogFile: function getLogFile(clusterName, nodeName, logName) {
+ var self = this;
+
+ return this.getNode(clusterName, nodeName).then(function (node) {
+ return node.get('logFiles').findBy('name', logName);
+ }).then(function (logFile) {
+ return _ember['default'].RSVP.allSettled([logFile, self.getLogFileContents(logFile), self.getLogFileLength(logFile)]);
+ }).then(function (PromiseArray) {
+ var logFile = PromiseArray[0].value;
+
+ return logFile;
+ });
+ },
+
+ /**
+ * Fetches and creates a set of log file for a given node.
+ *
+ * @method getLogFiles
+ * @param {DS.Model} node
+ * @return {DS.Array} LogFile
+ */
+ getLogFiles: function getLogFiles(node) {
+ if (_ember['default'].isEmpty(node.get('logFiles'))) {
+ return this.store.query('log-file', { clusterName: node.get('cluster').get('name'), nodeName: node.get('name') }).then(function (logFiles) {
+ node.set('logFiles', logFiles);
+
+ return node.get('logFiles');
+ });
+ } else {
+ return node.get('logFiles');
+ }
+ },
+
+ /**
+ * Fetches a given log files contents
+ *
+ * @method getLogFileContents
+ * @param {DS.Model} log
+ * @return {DS.Model} LogFile
+ */
+ getLogFileContents: function getLogFileContents(log) {
+ var clusterName = log.get('node').get('cluster').get('name');
+ var nodeName = log.get('node').get('name');
+ var logName = log.get('name');
+ var url = 'explore/clusters/' + clusterName + '/nodes/' + nodeName + '/log/files/' + logName + '?rows=' + this.pageSize;
+ var self = this;
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+ var request = _ember['default'].$.ajax({
+ url: url,
+ type: 'GET',
+ headers: {
+ Accept: "plain/text;"
+ }
+ });
+
+ request.done(function (data) {
+ log.set('content', data);
+ log.set('pageSize', self.pageSize);
+
+ resolve(log);
+ });
+
+ request.fail(function (data) {
+ reject(data);
+ });
+ });
+ },
+
+ /**
+ * Fetches and sets the amount of lines in a given log file
+ *
+ * @method getLogFileLength
+ * @param {DS.Model} log
+ * @return {DS.Model} LogFile
+ */
+ getLogFileLength: function getLogFileLength(log) {
+ var clusterName = log.get('node').get('cluster').get('name');
+ var nodeName = log.get('node').get('name');
+ var logName = log.get('name');
+ var url = 'explore/clusters/' + clusterName + '/nodes/' + nodeName + '/log/files/' + logName;
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+ var request = _ember['default'].$.ajax({
+ url: url,
+ type: 'GET',
+ dataType: 'json'
+ });
+
+ request.done(function (data) {
+ var totalLines = data[logName].total_lines;
+
+ log.set('totalLines', totalLines);
+
+ resolve(log);
+ });
+
+ request.fail(function (data) {
+ reject(data);
+ });
+ });
+ },
+
+ /**
+ * Fetches a given node and all its basic dependencies: stats, configuration, and log files
+ *
+ * @method getNode
+ * @param {String} clusterName
+ * @param {String} nodeName
+ * @return {DS.Model} Node
+ */
+ getNode: function getNode(clusterName, nodeName) {
+ var self = this;
+
+ return this.getCluster(clusterName).then(function (cluster) {
+ return cluster.get('nodes').findBy('name', nodeName);
+ }).then(function (node) {
+ return _ember['default'].RSVP.allSettled([node, self.getNodeStats(node), self.getNodeConfig(node), self.getLogFiles(node), self.getConfigFiles(node)]);
+ }).then(function (PromiseArray) {
+ var node = PromiseArray[0].value;
+
+ return node;
+ });
+ },
+
+ /**
+ * TODO: Make stats own model, flow through ember data
+ * Fetches a given nodes basic configuration stats
+ *
+ * @method getNodeConfig
+ * @param {DS.Model} node
+ * @return {Object} result of the AJAX call
+ */
+ getNodeConfig: function getNodeConfig(node) {
+ var url = 'explore/nodes/' + node.get('name') + '/config';
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+ var request = _ember['default'].$.ajax({
+ url: url,
+ type: 'GET'
+ });
+
+ request.done(function (data) {
+ if (data.config.advanced_config) {
+ var advancedConfig = data.config.advanced_config.map(function (configString) {
+ return configString.split(',').join(', ');
+ });
+
+ node.set('advancedConfig', advancedConfig);
+ }
+
+ if (data.config.config) {
+ (function () {
+ var alphaSortedConfig = {};
+
+ Object.keys(data.config.config).sort().forEach(function (key) {
+ alphaSortedConfig[key] = data.config.config[key];
+ });
+
+ node.set('config', alphaSortedConfig);
+ })();
+ }
+
+ resolve(data);
+ });
+
+ request.fail(function (data) {
+ reject(data);
+ });
+ });
+ },
+
+ /**
+ * Returns the results of a Riak node HTTP ping result.
+ *
+ * @method getNodePing
+ * @param {String} nodeName
+ * @return {Object} result of the AJAX call
+ */
+ getNodePing: function getNodePing(nodeName) {
+ var url = 'riak/nodes/' + nodeName + '/ping';
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+ var request = _ember['default'].$.ajax({
+ url: url,
+ type: 'GET'
+ });
+
+ request.done(function (data) {
+ resolve(data);
+ });
+
+ request.fail(function (data) {
+ reject(data);
+ });
+ });
+ },
+
+ getNodeReplicationStatus: function getNodeReplicationStatus(node) {
+ var url = 'control/nodes/' + node.get('name') + '/status';
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+ var request = _ember['default'].$.ajax({
+ url: url,
+ type: 'GET'
+ });
+
+ request.done(function (data) {
+ var additionalNodeStats = data.status.nodes.findBy('id', node.get('name'));
+
+ delete additionalNodeStats.id;
+ delete data.status.nodes;
+
+ var nodeReplStatus = _ember['default'].merge(data.status, additionalNodeStats);
+
+ node.set('replStatus', nodeReplStatus);
+
+ resolve(data);
+ });
+
+ request.fail(function (data) {
+ reject(data);
+ });
+ });
+ },
+
+ /**
+ * Gets and sets the "status" property of each node in a cluster. Status is detrmined by whether or not
+ * the node's ring file is valid.
+ *
+ * @method getNodesStatus
+ * @param {DS.Model} cluster
+ * @return {Object} result of the AJAX call
+ */
+ getNodesStatus: function getNodesStatus(cluster) {
+ var url = 'control/clusters/' + cluster.get('name') + '/status';
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+ var request = _ember['default'].$.ajax({
+ url: url,
+ type: 'GET'
+ });
+
+ request.done(function (data) {
+ cluster.get('nodes').forEach(function (node) {
+ var nodeName = node.get('name');
+ var nodeStatus = data.status.nodes.findBy('id', nodeName).status;
+
+ node.set('status', nodeStatus);
+ });
+
+ resolve(cluster);
+ });
+
+ request.fail(function (data) {
+ reject(data);
+ });
+ });
+ },
+
+ /**
+ * Returns all reachable nodes for a given cluster id
+ *
+ * @method getNodes
+ * @param {DS.Model} cluster
+ * @return {DS.Array} Node
+ */
+ getNodes: function getNodes(cluster) {
+ if (_ember['default'].isEmpty(cluster.get('nodes'))) {
+ return this.store.query('node', { clusterName: cluster.get('name') }).then(function (nodes) {
+ cluster.set('nodes', nodes);
+
+ cluster.get('nodes');
+ });
+ } else {
+ return cluster.get('nodes');
+ }
+ },
+
+ getNodesStats: function getNodesStats(cluster) {
+ var self = this;
+
+ return _ember['default'].RSVP.allSettled(cluster.get('nodes').map(function (node) {
+ return self.getNodeStats(node);
+ }));
+ },
+
+ /**
+ * TODO: Make stats own model, flow through ember data
+ * Gets and sets the node stats property. Returns the node model object.
+ *
+ * @method getNodeStats
+ * @param {DS.Model} node
+ * @return {DS.Model} Node
+ */
+ getNodeStats: function getNodeStats(node) {
+ var url = 'riak/nodes/' + node.get('name') + '/stats';
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+ var request = _ember['default'].$.ajax({
+ url: url,
+ type: 'GET'
+ });
+
+ request.done(function (data) {
+ node.set('stats', data);
+
+ resolve(node);
+ });
+
+ request.fail(function (data) {
+ reject(data);
+ });
+ });
+ },
+
+ getObject: function getObject(clusterName, bucketTypeName, bucketName, objectName) {
+ var self = this;
+
+ return this.getBucket(clusterName, bucketTypeName, bucketName).then(function (bucket) {
+ return bucket.get('objects').findBy('name', objectName);
+ }).then(function (riakObject) {
+ return _ember['default'].RSVP.allSettled([riakObject, self.getObjectContents(riakObject)]);
+ }).then(function (PromiseArray) {
+ var riakObject = PromiseArray[0].value;
+
+ return riakObject;
+ });
+ },
+
+ // TODO: This can probably be ported over to be used the adapter findRecord
+ // method once moved over to ED 2.0 using the 'include' object
+ // Ref: https://github.com/emberjs/data/pull/3976
+ getObjectContents: function getObjectContents(object) {
+ var clusterUrl = object.get('cluster').get('proxyUrl');
+ var bucketTypeName = object.get('bucketType').get('name');
+ var bucketName = object.get('bucket').get('name');
+ var objectName = object.get('name');
+ var isCRDT = !!object.get('bucket').get('isCRDT');
+ var url = isCRDT ? clusterUrl + '/types/' + bucketTypeName + '/buckets/' + bucketName + '/datatypes/' + objectName : clusterUrl + '/types/' + bucketTypeName + '/buckets/' + bucketName + '/keys/' + objectName;
+ var xhrOptions = {
+ url: url,
+ type: 'GET',
+ cache: false,
+ headers: { 'Accept': '*/*, multipart/mixed' },
+ processData: !isCRDT
+ };
+
+ if (isCRDT) {
+ xhrOptions.dataType = 'json';
+ }
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+ var request = _ember['default'].$.ajax(xhrOptions);
+
+ request.done(function (data, textStatus, jqXHR) {
+ var headerObj = (0, _emberRiakExplorerUtilsParseHeader['default'])(jqXHR.getAllResponseHeaders());
+ var type = isCRDT ? data.type : 'default';
+ var content = isCRDT ? data.value : data;
+
+ object.set('headers', headerObj);
+ object.set('type', type);
+ object.set('contents', content);
+ object.set('url', url);
+
+ resolve(object);
+ });
+
+ request.fail(function (data) {
+ reject(data);
+ });
+ });
+ },
+
+ /**
+ *
+ * @method getObjectList
+ * @param {DS.Model} bucket
+ * @return {DS.Model} ObjectList
+ */
+ getObjectList: function getObjectList(bucket) {
+ var clusterName = bucket.get('cluster').get('name');
+ var bucketTypeName = bucket.get('bucketType').get('name');
+ var bucketName = bucket.get('name');
+ var self = this;
+
+ return this.store.queryRecord('object-list', { clusterName: clusterName, bucketTypeName: bucketTypeName, bucketName: bucketName }).then(function onSuccess(objectList) {
+ bucket.set('isListLoaded', true);
+ bucket.set('objectList', objectList);
+
+ return bucket.get('objectList');
+ });
+ },
+
+ /**
+ *
+ * @method getObjects
+ * @param {DS.Model} bucket
+ * @return {DS.Array} RiakObject
+ */
+ getObjects: function getObjects(bucket) {
+ var clusterName = bucket.get('cluster').get('name');
+ var bucketTypeName = bucket.get('bucketType').get('name');
+ var bucketName = bucket.get('name');
+
+ return this.store.query('riak-object', { clusterName: clusterName, bucketTypeName: bucketTypeName, bucketName: bucketName }).then(function (objects) {
+ bucket.set('objects', objects);
+
+ return bucket.get('objects');
+ });
+ },
+
+ /**
+ *
+ * @method getSearchSchema
+ * @param {String} clusterName
+ * @param {String} schemaName
+ * @return {DS.Model} SearchSchema
+ */
+ getSearchSchema: function getSearchSchema(clusterName, schemaName) {
+ var self = this;
+
+ return this.getCluster(clusterName).then(function (cluster) {
+ return cluster.get('searchSchemas').findBy('name', schemaName);
+ }).then(function (schema) {
+ return _ember['default'].RSVP.allSettled([schema, self.getSearchSchemaContent(schema)]);
+ }).then(function (PromiseArray) {
+ var schema = PromiseArray[0].value;
+
+ return schema;
+ });
+ },
+
+ /**
+ *
+ * @method getSearchSchemaContent
+ * @param {DS.Model} schema
+ * @return {String} schema.content
+ */
+ getSearchSchemaContent: function getSearchSchemaContent(schema) {
+ var url = schema.get('url');
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+ var request = _ember['default'].$.ajax({
+ url: url,
+ type: 'GET',
+ dataType: 'xml'
+ });
+
+ request.done(function (data) {
+ var xmlString = new XMLSerializer().serializeToString(data);
+ schema.set('content', xmlString);
+
+ resolve(schema.get('content'));
+ });
+
+ request.fail(function (data) {
+ reject(data);
+ });
+ });
+ },
+
+ /**
+ *
+ * @method getTab;e
+ * @param {String} clusterName
+ * @param {String} tableName
+ * @return {DS.Model} Table
+ */
+ getTable: function getTable(clusterName, tableName) {
+ var self = this;
+
+ return this.getCluster(clusterName).then(function (cluster) {
+ return cluster.get('tables').findBy('name', tableName);
+ }).then(function (table) {
+ return _ember['default'].RSVP.allSettled([table, self.getTableRows(table), self.getTableRowsList(table)]);
+ }).then(function (PromiseArray) {
+ var table = PromiseArray[0].value;
+
+ return table;
+ });
+ },
+
+ getTableRows: function getTableRows(table) {
+ var clusterName = table.get('cluster').get('name');
+ var tableName = table.get('name');
+
+ return this.store.query('row', { clusterName: clusterName, tableName: tableName }).then(function (rows) {
+ table.set('rows', rows);
+
+ return table.get('rows');
+ });
+ },
+
+ getTableRowsList: function getTableRowsList(table) {
+ var cluster = table.get('cluster');
+ var clusterName = table.get('cluster').get('name');
+ var tableName = table.get('name');
+
+ return this.store.queryRecord('row-list', { clusterName: clusterName, tableName: tableName }).then(function onSuccess(list) {
+ table.set('isListLoaded', true);
+ table.set('rowsList', list);
+
+ return table.get('rowsList');
+ });
+ },
+
+ /**
+ * Returns all the TS Tables that belong to the specified cluster.
+ *
+ * @method getTables
+ * @param {DS.Model} cluster
+ * @return {DS.Array} Table
+ */
+ getTables: function getTables(cluster) {
+ return this.store.query('table', { clusterName: cluster.get('name') }).then(function (tables) {
+ cluster.set('tables', tables);
+
+ return cluster.get('tables');
+ });
+ },
+
+ /**
+ * Pings all nodes in a given cluster and sets the nodes status
+ *
+ * @method getNodes
+ * @param {DS.Model} cluster
+ */
+ pingNodes: function pingNodes(cluster) {
+ var self = this;
+
+ this.getNodes(cluster).then(function (nodes) {
+ nodes.forEach(function (node) {
+ var nodeName = node.get('name');
+
+ self.getNodePing(nodeName).then(function onSuccess(data) {
+ node.set('available', true);
+ }, function onFail(data) {
+ node.set('available', false);
+ });
+ });
+ });
+ },
+
+ /**
+ * Checks node health in a given cluster, every 10 seconds
+ *
+ * @method pollCluster
+ * @param {DS.Model} cluster
+ */
+ pollCluster: function pollCluster(cluster) {
+ var self = this;
+
+ // This check makes sure that only one cluster can be polled at any given time
+ if (!this._clusterRef || cluster.get('name') !== this._clusterRef.get('name')) {
+ this._clusterRef = cluster;
+ }
+
+ _ember['default'].run.later(this, function () {
+ self.monitorCluster(this._clusterRef);
+ self.pollCluster(this._clusterRef);
+ }, 10000);
+ },
+
+ queryTable: function queryTable(table, data) {
+ var clusterName = table.get('cluster').get('name');
+ var url = 'explore/clusters/' + clusterName + '/tables/query';
+
+ return _ember['default'].$.ajax({
+ type: 'POST',
+ url: url,
+ data: data
+ });
+ },
+
+ /**
+ *
+ * @method refreshBucketList
+ * @param {DS.Model} bucketType
+ */
+ refreshBucketList: function refreshBucketList(bucketType) {
+ var clusterName = bucketType.get('cluster').get('name');
+ var bucketTypeName = bucketType.get('name');
+ var url = 'explore/clusters/' + clusterName + '/bucket_types/' + bucketTypeName + '/refresh_buckets/source/riak_kv';
+
+ // Setup state from request
+ bucketType.set('isListLoaded', false);
+ bucketType.set('hasListBeenRequested', true);
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+ var request = _ember['default'].$.ajax({
+ url: url,
+ type: 'POST'
+ });
+
+ request.done(function (data) {
+ resolve(data);
+ });
+
+ request.fail(function (jqXHR) {
+ if (jqXHR.status === 202) {
+ resolve(jqXHR.status);
+ } else {
+ bucketType.set('hasListBeenRequested', false); // Since the request failed, set value to false
+ reject(jqXHR);
+ }
+ });
+ });
+ },
+
+ /**
+ *
+ * @method refreshObjectList
+ * @param {DS.Model} bucket
+ */
+ refreshObjectList: function refreshObjectList(bucket) {
+ var clusterName = bucket.get('cluster').get('name');
+ var bucketTypeName = bucket.get('bucketType').get('name');
+ var bucketName = bucket.get('name');
+ var url = 'explore/clusters/' + clusterName + '/bucket_types/' + bucketTypeName + '/buckets/' + bucketName + '/refresh_keys/source/riak_kv';
+
+ // Setup state from request
+ bucket.set('isListLoaded', false);
+ bucket.set('hasListBeenRequested', true);
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+ var request = _ember['default'].$.ajax({
+ url: url,
+ type: 'POST'
+ });
+
+ request.done(function (data) {
+ resolve(data);
+ });
+
+ request.fail(function (jqXHR) {
+ if (jqXHR.status === 202) {
+ resolve(jqXHR.status);
+ } else {
+ bucket.set('hasListBeenRequested', false); // Since the request failed, set value to false
+ reject(jqXHR);
+ }
+ });
+ });
+ },
+
+ refreshTableRowsList: function refreshTableRowsList(table) {
+ var clusterName = table.get('cluster').get('name');
+ var tableName = table.get('name');
+ var url = 'explore/clusters/' + clusterName + '/tables/' + tableName + '/refresh_keys/source/riak_kv';
+
+ // Setup state from request
+ table.set('isListLoaded', false);
+ table.set('hasListBeenRequested', true);
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+ var request = _ember['default'].$.ajax({
+ url: url,
+ type: 'POST'
+ });
+
+ request.done(function (data) {
+ resolve(data);
+ });
+
+ request.fail(function (jqXHR) {
+ if (jqXHR.status === 202) {
+ resolve(jqXHR.status);
+ } else {
+ table.set('hasListBeenRequested', false); // Since the request failed, set value to false
+ reject(jqXHR);
+ }
+ });
+ });
+ },
+
+ updateBucketType: function updateBucketType(bucketType, props) {
+ var clusterName = bucketType.get('cluster').get('name');
+ var bucketTypeName = bucketType.get('name');
+ var data = { props: props };
+ var url = 'explore/clusters/' + clusterName + '/bucket_types/' + bucketTypeName;
+
+ return _ember['default'].$.ajax({
+ type: 'PUT',
+ url: url,
+ contentType: 'application/json',
+ data: JSON.stringify(data)
+ });
+ },
+
+ /**
+ * Performs an update AJAX operation to the Riak Object
+ *
+ * @method updateDataType
+ * @param {DS.Model} object
+ * @param {String} operation
+ */
+ updateCRDT: function updateCRDT(object, operation) {
+ var clusterUrl = object.get('cluster').get('proxyUrl');
+ var bucketTypeName = object.get('bucketType').get('name');
+ var bucketName = object.get('bucket').get('name');
+ var objectName = object.get('name');
+ var url = clusterUrl + '/types/' + bucketTypeName + '/buckets/' + bucketName + '/datatypes/' + objectName;
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+ var request = _ember['default'].$.ajax({
+ contentType: 'application/json',
+ type: 'POST',
+ dataType: 'json',
+ url: url,
+ data: JSON.stringify(operation)
+ });
+
+ request.done(function (data) {
+ resolve(data);
+ });
+
+ request.fail(function (jqXHR) {
+ if (jqXHR.status === 204) {
+ resolve(jqXHR.status);
+ } else {
+ reject(jqXHR);
+ }
+ });
+ });
+ },
+
+ /**
+ *
+ * @method updateSchema
+ * @param {DS.Model} schema
+ * @param {XML.String} data
+ */
+ updateSchema: function updateSchema(schema, data) {
+ return _ember['default'].$.ajax({
+ type: 'PUT',
+ url: schema.get('url'),
+ contentType: 'application/xml',
+ processData: false,
+ data: data
+ });
+ },
+
+ updateTable: function updateTable(table, data) {
+ var clusterName = table.get('cluster').get('name');
+ var tableName = table.get('name');
+ var url = 'explore/clusters/' + clusterName + '/tables/' + tableName;
+
+ return _ember['default'].$.ajax({
+ type: 'PUT',
+ url: url,
+ contentType: 'application/json',
+ data: JSON.stringify(data)
+ });
+ }
+ });
+});
+define('ember-riak-explorer/services/loading-slider', ['exports', 'ember'], function (exports, _ember) {
+ var Service = _ember['default'].Service;
+ var Evented = _ember['default'].Evented;
+ exports['default'] = Service.extend(Evented, {
+ startLoading: function startLoading() {
+ this.trigger('startLoading');
+ },
+
+ endLoading: function endLoading() {
+ this.trigger('endLoading');
+ },
+
+ changeAttrs: function changeAttrs(attrs) {
+ this.trigger('changeAttrs', attrs);
+ }
+ });
+});
+define('ember-riak-explorer/services/modal-dialog', ['exports', 'ember-modal-dialog/services/modal-dialog'], function (exports, _emberModalDialogServicesModalDialog) {
+ exports['default'] = _emberModalDialogServicesModalDialog['default'];
+});
+define('ember-riak-explorer/storages/node-stats', ['exports', 'ember-local-storage/session/array'], function (exports, _emberLocalStorageSessionArray) {
+
+ var Storage = _emberLocalStorageSessionArray['default'].extend();
+
+ exports['default'] = Storage;
+});
+define("ember-riak-explorer/templates/alerts/empty", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["empty-body"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 1,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/alerts/empty.hbs"
+ },
+ isEmpty: true,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/templates/alerts/error-invalid-xml", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes", "wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 4,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/alerts/error-invalid-xml.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "label label-danger");
+ var el3 = dom.createTextNode("ERROR");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Invalid XML. Please check and make sure schema is valid xml.\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 4,
+ "column": 20
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/alerts/error-invalid-xml.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "danger", "dismissible", false], 0, null, ["loc", [null, [1, 0], [4, 20]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/alerts/error-must-be-json-parseable", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes", "wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 5,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/alerts/error-must-be-json-parseable.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "label label-danger");
+ var el3 = dom.createTextNode("ERROR");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Invalid JSON, must be parseable. Make sure to wrap any keys in double quotes. You can use a linter at\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("a");
+ dom.setAttribute(el1, "href", "http://jsonlint.com/");
+ dom.setAttribute(el1, "target", "_blank");
+ var el2 = dom.createTextNode("JSONLint");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode(".\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 5,
+ "column": 20
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/alerts/error-must-be-json-parseable.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "danger", "dismissible", false], 0, null, ["loc", [null, [1, 0], [5, 20]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/alerts/error-request-was-not-processed", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes", "wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 5,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/alerts/error-request-was-not-processed.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "label label-danger");
+ var el3 = dom.createTextNode("ERROR");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Sorry but your request was not processed correctly. If the problem persists,\n try submitting an issue to the ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("a");
+ dom.setAttribute(el1, "href", "https://github.com/basho-labs/riak_explorer");
+ dom.setAttribute(el1, "target", "_blank");
+ var el2 = dom.createTextNode("Explorer Github Repo");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode(".\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 5,
+ "column": 20
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/alerts/error-request-was-not-processed.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "danger"], 0, null, ["loc", [null, [1, 0], [5, 20]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/alerts/error-schema-not-saved", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes", "wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 4,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/alerts/error-schema-not-saved.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "label label-danger");
+ var el3 = dom.createTextNode("ERROR");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Something went wrong, schema was not saved.\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 6,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/alerts/error-schema-not-saved.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "danger", "dismissible", false], 0, null, ["loc", [null, [1, 0], [4, 20]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/alerts/error-set-items-unique", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes", "wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 4,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/alerts/error-set-items-unique.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "label label-danger");
+ var el3 = dom.createTextNode("ERROR");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Set items must be ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("strong");
+ var el2 = dom.createTextNode("unique");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode(" binary values.\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 4,
+ "column": 20
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/alerts/error-set-items-unique.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "danger"], 0, null, ["loc", [null, [1, 0], [4, 20]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/alerts/error-solr-must-have-name", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes", "wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 4,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/alerts/error-solr-must-have-name.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "label label-danger");
+ var el3 = dom.createTextNode("ERROR");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Solr requires that the schema tag has a name attribute. Please update your xml.\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 4,
+ "column": 20
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/alerts/error-solr-must-have-name.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "danger", "dismissible", false], 0, null, ["loc", [null, [1, 0], [4, 20]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/alerts/error-solr-must-have-version", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes", "wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 4,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/alerts/error-solr-must-have-version.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "label label-danger");
+ var el3 = dom.createTextNode("ERROR");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Solr requires that the schema tag has a version attribute. Please update your xml.\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 4,
+ "column": 20
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/alerts/error-solr-must-have-version.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "danger", "dismissible", false], 0, null, ["loc", [null, [1, 0], [4, 20]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/alerts/feedback-welcome", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 7,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/alerts/feedback-welcome.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createTextNode("Feedback or suggestions welcome!");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("\n If you have any questions or pain points using Riak Explorer,\n please open up an ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "href", "https://github.com/basho-labs/riak_explorer/issues");
+ dom.setAttribute(el2, "target", "_blank");
+ var el3 = dom.createTextNode("issue on Github");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(".\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 9,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/alerts/feedback-welcome.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "alert-component", [], ["type", "info", "dismissible", false], 0, null, ["loc", [null, [1, 0], [7, 20]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/application", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 7,
+ "column": 6
+ },
+ "end": {
+ "line": 17,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/application.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-ios-keypad");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "cluster.name", ["loc", [null, [16, 8], [16, 24]]]]],
+ locals: ["cluster"],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 24,
+ "column": 14
+ },
+ "end": {
+ "line": 26,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/application.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "currentCluster.riakVersion", ["loc", [null, [25, 20], [25, 50]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 27,
+ "column": 14
+ },
+ "end": {
+ "line": 29,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/application.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "currentCluster.riakTypeLong", ["loc", [null, [28, 20], [28, 51]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 30,
+ "column": 14
+ },
+ "end": {
+ "line": 32,
+ "column": 14
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/application.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ dom.setAttribute(el1, "class", "dev-mode");
+ var el2 = dom.createTextNode("Dev mode");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child3 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 37,
+ "column": 12
+ },
+ "end": {
+ "line": 40,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/application.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-ios-cloud");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Data\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child4 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 41,
+ "column": 12
+ },
+ "end": {
+ "line": 44,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/application.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-ios-pulse-strong");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Ops\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child5 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 45,
+ "column": 12
+ },
+ "end": {
+ "line": 48,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/application.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-ios-search-strong");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Query\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 19,
+ "column": 6
+ },
+ "end": {
+ "line": 51,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/application.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "current-cluster");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("header");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "title");
+ var el4 = dom.createTextNode("Cluster: ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("ul");
+ dom.setAttribute(el3, "class", "meta list-inline");
+ var el4 = dom.createTextNode("\n");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode(" ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("nav");
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element1 = dom.childAt(fragment, [1]);
+ var element2 = dom.childAt(element1, [1]);
+ var element3 = dom.childAt(element2, [3]);
+ var element4 = dom.childAt(element1, [3]);
+ var morphs = new Array(9);
+ morphs[0] = dom.createMorphAt(dom.childAt(element2, [1]), 1, 1);
+ morphs[1] = dom.createMorphAt(element3, 1, 1);
+ morphs[2] = dom.createMorphAt(element3, 2, 2);
+ morphs[3] = dom.createMorphAt(element3, 3, 3);
+ morphs[4] = dom.createMorphAt(element2, 5, 5);
+ morphs[5] = dom.createAttrMorph(element4, 'class');
+ morphs[6] = dom.createMorphAt(element4, 1, 1);
+ morphs[7] = dom.createMorphAt(element4, 2, 2);
+ morphs[8] = dom.createMorphAt(element4, 3, 3);
+ return morphs;
+ },
+ statements: [["content", "currentCluster.name", ["loc", [null, [22, 40], [22, 63]]]], ["block", "if", [["get", "currentCluster.hasVersion", ["loc", [null, [24, 20], [24, 45]]]]], [], 0, null, ["loc", [null, [24, 14], [26, 21]]]], ["block", "if", [["get", "currentCluster.hasType", ["loc", [null, [27, 20], [27, 42]]]]], [], 1, null, ["loc", [null, [27, 14], [29, 21]]]], ["block", "if", [["get", "currentCluster.developmentMode", ["loc", [null, [30, 20], [30, 50]]]]], [], 2, null, ["loc", [null, [30, 14], [32, 21]]]], ["inline", "cluster-status-indicator", [], ["status", ["subexpr", "@mut", [["get", "currentCluster.status", ["loc", [null, [34, 46], [34, 67]]]]], [], []]], ["loc", [null, [34, 12], [34, 69]]]], ["attribute", "class", ["concat", ["cluster-section-links current-section-is-", ["get", "clusterSubSection", ["loc", [null, [36, 65], [36, 82]]]]]]], ["block", "link-to", ["cluster.data", ["get", "currentCluster.name", ["loc", [null, [37, 38], [37, 57]]]]], ["class", "data"], 3, null, ["loc", [null, [37, 12], [40, 24]]]], ["block", "link-to", ["cluster.ops", ["get", "currentCluster.name", ["loc", [null, [41, 37], [41, 56]]]]], ["class", "ops"], 4, null, ["loc", [null, [41, 12], [44, 24]]]], ["block", "link-to", ["cluster.query", ["get", "currentCluster.name", ["loc", [null, [45, 39], [45, 58]]]]], ["class", "query"], 5, null, ["loc", [null, [45, 12], [48, 24]]]]],
+ locals: [],
+ templates: [child0, child1, child2, child3, child4, child5]
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 54,
+ "column": 6
+ },
+ "end": {
+ "line": 64,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/application.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "view-header");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(element0, 1, 1);
+ morphs[1] = dom.createMorphAt(element0, 3, 3);
+ return morphs;
+ },
+ statements: [["inline", "breadcrumb-component", [], ["clusterSubSection", ["subexpr", "@mut", [["get", "clusterSubSection", ["loc", [null, [57, 28], [57, 45]]]]], [], []], "data", ["subexpr", "@mut", [["get", "breadCrumbMap", ["loc", [null, [58, 15], [58, 28]]]]], [], []]], ["loc", [null, [56, 10], [58, 30]]]], ["inline", "view-label", [], ["pre-label", ["subexpr", "@mut", [["get", "viewLabelMap.preLabel", ["loc", [null, [61, 20], [61, 41]]]]], [], []], "label", ["subexpr", "@mut", [["get", "viewLabelMap.label", ["loc", [null, [62, 16], [62, 34]]]]], [], []]], ["loc", [null, [60, 10], [62, 36]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 73,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/application.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "app-panel");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "wrapper-panel");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "sidebar-panel");
+ var el4 = dom.createTextNode("\n");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode(" ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "results-panel");
+ var el4 = dom.createTextNode("\n");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("div");
+ dom.setAttribute(el4, "class", "view-body");
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "id", "side-drawer-container");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element5 = dom.childAt(fragment, [2]);
+ var element6 = dom.childAt(element5, [3]);
+ var element7 = dom.childAt(element6, [1]);
+ var element8 = dom.childAt(element6, [3]);
+ var element9 = dom.childAt(element8, [3]);
+ var morphs = new Array(7);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(element5, 1, 1);
+ morphs[2] = dom.createMorphAt(element7, 1, 1);
+ morphs[3] = dom.createMorphAt(element7, 3, 3);
+ morphs[4] = dom.createMorphAt(element8, 1, 1);
+ morphs[5] = dom.createMorphAt(element9, 1, 1);
+ morphs[6] = dom.createMorphAt(element9, 3, 3);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["inline", "loading-slider", [], ["isLoading", ["subexpr", "@mut", [["get", "loading", ["loc", [null, [1, 27], [1, 34]]]]], [], []]], ["loc", [null, [1, 0], [1, 36]]]], ["inline", "render", ["partials.topbar"], [], ["loc", [null, [4, 2], [4, 30]]]], ["block", "power-select", [], ["class", "cluster-selector", "searchEnabled", false, "selected", ["subexpr", "@mut", [["get", "currentCluster", ["loc", [null, [10, 15], [10, 29]]]]], [], []], "placeholder", "Select Cluster", "options", ["subexpr", "@mut", [["get", "model", ["loc", [null, [12, 14], [12, 19]]]]], [], []], "onchange", ["subexpr", "action", ["clusterSelected"], [], ["loc", [null, [13, 15], [13, 41]]]]], 0, null, ["loc", [null, [7, 6], [17, 23]]]], ["block", "if", [["get", "currentCluster", ["loc", [null, [19, 12], [19, 26]]]]], [], 1, null, ["loc", [null, [19, 6], [51, 13]]]], ["block", "if", [["get", "showViewHeader", ["loc", [null, [54, 12], [54, 26]]]]], [], 2, null, ["loc", [null, [54, 6], [64, 13]]]], ["inline", "outlet", ["alert"], [], ["loc", [null, [67, 8], [67, 26]]]], ["content", "outlet", ["loc", [null, [68, 8], [68, 18]]]]],
+ locals: [],
+ templates: [child0, child1, child2]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/alert-component", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 4,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/alert-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("button");
+ dom.setAttribute(el1, "type", "button");
+ dom.setAttribute(el1, "class", "close");
+ dom.setAttribute(el1, "aria-label", "Close");
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "aria-hidden", "true");
+ var el3 = dom.createTextNode("×");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element0);
+ return morphs;
+ },
+ statements: [["element", "action", ["dismiss"], [], ["loc", [null, [3, 59], [3, 79]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 6,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/alert-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "dismissible", ["loc", [null, [2, 8], [2, 19]]]]], [], 0, null, ["loc", [null, [2, 2], [4, 9]]]], ["content", "yield", ["loc", [null, [5, 2], [5, 11]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 8,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/alert-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "visible", ["loc", [null, [1, 6], [1, 13]]]]], [], 0, null, ["loc", [null, [1, 0], [6, 7]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/breadcrumb-component", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 4
+ },
+ "end": {
+ "line": 5,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["inline", "link-to", ["data", "cluster.data", ["get", "data.cluster.name", ["loc", [null, [4, 42], [4, 59]]]]], [], ["loc", [null, [4, 10], [4, 61]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 12,
+ "column": 6
+ },
+ "end": {
+ "line": 16,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["inline", "link-to", [["get", "data.bucket.name", ["loc", [null, [14, 20], [14, 36]]]], "bucket", ["get", "data.cluster.name", ["loc", [null, [14, 46], [14, 63]]]], ["get", "data.bucketType.name", ["loc", [null, [14, 64], [14, 84]]]], ["get", "data.bucket.name", ["loc", [null, [14, 85], [14, 101]]]]], [], ["loc", [null, [14, 10], [14, 103]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 19,
+ "column": 8
+ },
+ "end": {
+ "line": 23,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["inline", "link-to", [["get", "data.riakObject.name", ["loc", [null, [21, 22], [21, 42]]]], "riak-object.counter", ["get", "data.cluster.name", ["loc", [null, [21, 65], [21, 82]]]], ["get", "data.bucketType.name", ["loc", [null, [21, 83], [21, 103]]]], ["get", "data.bucket.name", ["loc", [null, [21, 104], [21, 120]]]], ["get", "data.riakObject.name", ["loc", [null, [21, 121], [21, 141]]]]], [], ["loc", [null, [21, 12], [21, 143]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 23,
+ "column": 8
+ },
+ "end": {
+ "line": 27,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["inline", "link-to", [["get", "data.riakObject.name", ["loc", [null, [25, 22], [25, 42]]]], "riak-object.hll", ["get", "data.cluster.name", ["loc", [null, [25, 61], [25, 78]]]], ["get", "data.bucketType.name", ["loc", [null, [25, 79], [25, 99]]]], ["get", "data.bucket.name", ["loc", [null, [25, 100], [25, 116]]]], ["get", "data.riakObject.name", ["loc", [null, [25, 117], [25, 137]]]]], [], ["loc", [null, [25, 12], [25, 139]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 27,
+ "column": 8
+ },
+ "end": {
+ "line": 31,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["inline", "link-to", [["get", "data.riakObject.name", ["loc", [null, [29, 22], [29, 42]]]], "riak-object.set", ["get", "data.cluster.name", ["loc", [null, [29, 61], [29, 78]]]], ["get", "data.bucketType.name", ["loc", [null, [29, 79], [29, 99]]]], ["get", "data.bucket.name", ["loc", [null, [29, 100], [29, 116]]]], ["get", "data.riakObject.name", ["loc", [null, [29, 117], [29, 137]]]]], [], ["loc", [null, [29, 12], [29, 139]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 31,
+ "column": 8
+ },
+ "end": {
+ "line": 35,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["inline", "link-to", [["get", "data.riakObject.name", ["loc", [null, [33, 22], [33, 42]]]], "riak-object.map", ["get", "data.cluster.name", ["loc", [null, [33, 61], [33, 78]]]], ["get", "data.bucketType.name", ["loc", [null, [33, 79], [33, 99]]]], ["get", "data.bucket.name", ["loc", [null, [33, 100], [33, 116]]]], ["get", "data.riakObject.name", ["loc", [null, [33, 117], [33, 137]]]]], [], ["loc", [null, [33, 12], [33, 139]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 35,
+ "column": 8
+ },
+ "end": {
+ "line": 39,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["inline", "link-to", [["get", "data.riakObject.name", ["loc", [null, [37, 22], [37, 42]]]], "riak-object", ["get", "data.cluster.name", ["loc", [null, [37, 57], [37, 74]]]], ["get", "data.bucketType.name", ["loc", [null, [37, 75], [37, 95]]]], ["get", "data.bucket.name", ["loc", [null, [37, 96], [37, 112]]]], ["get", "data.riakObject.name", ["loc", [null, [37, 113], [37, 133]]]]], [], ["loc", [null, [37, 12], [37, 135]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 31,
+ "column": 8
+ },
+ "end": {
+ "line": 39,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "eq", [["get", "data.riakObject.type", ["loc", [null, [31, 22], [31, 42]]]], "map"], [], ["loc", [null, [31, 18], [31, 49]]]]], [], 0, 1, ["loc", [null, [31, 8], [39, 8]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 27,
+ "column": 8
+ },
+ "end": {
+ "line": 39,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "eq", [["get", "data.riakObject.type", ["loc", [null, [27, 22], [27, 42]]]], "set"], [], ["loc", [null, [27, 18], [27, 49]]]]], [], 0, 1, ["loc", [null, [27, 8], [39, 8]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 23,
+ "column": 8
+ },
+ "end": {
+ "line": 39,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "eq", [["get", "data.riakObject.type", ["loc", [null, [23, 22], [23, 42]]]], "hll"], [], ["loc", [null, [23, 18], [23, 49]]]]], [], 0, 1, ["loc", [null, [23, 8], [39, 8]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 18,
+ "column": 6
+ },
+ "end": {
+ "line": 40,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "eq", [["get", "data.riakObject.type", ["loc", [null, [19, 18], [19, 38]]]], "counter"], [], ["loc", [null, [19, 14], [19, 49]]]]], [], 0, 1, ["loc", [null, [19, 8], [39, 15]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 7,
+ "column": 4
+ },
+ "end": {
+ "line": 41,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 5, 5, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["inline", "link-to", [["get", "data.bucketType.name", ["loc", [null, [9, 18], [9, 38]]]], "bucket-type", ["get", "data.cluster.name", ["loc", [null, [9, 53], [9, 70]]]], ["get", "data.bucketType.name", ["loc", [null, [9, 71], [9, 91]]]]], [], ["loc", [null, [9, 8], [9, 93]]]], ["block", "if", [["get", "data.bucket", ["loc", [null, [12, 12], [12, 23]]]]], [], 0, null, ["loc", [null, [12, 6], [16, 13]]]], ["block", "if", [["get", "data.riakObject", ["loc", [null, [18, 12], [18, 27]]]]], [], 1, null, ["loc", [null, [18, 6], [40, 13]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 43,
+ "column": 4
+ },
+ "end": {
+ "line": 47,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["inline", "link-to", [["get", "data.table.name", ["loc", [null, [45, 18], [45, 33]]]], "table", ["get", "data.cluster.name", ["loc", [null, [45, 42], [45, 59]]]], ["get", "data.table.name", ["loc", [null, [45, 60], [45, 75]]]]], [], ["loc", [null, [45, 8], [45, 77]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child3 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 49,
+ "column": 4
+ },
+ "end": {
+ "line": 51,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "data.crudAction", ["loc", [null, [50, 10], [50, 29]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 52,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "data.cluster", ["loc", [null, [3, 10], [3, 22]]]]], [], 0, null, ["loc", [null, [3, 4], [5, 11]]]], ["block", "if", [["get", "data.bucketType", ["loc", [null, [7, 10], [7, 25]]]]], [], 1, null, ["loc", [null, [7, 4], [41, 11]]]], ["block", "if", [["get", "data.table", ["loc", [null, [43, 10], [43, 20]]]]], [], 2, null, ["loc", [null, [43, 4], [47, 11]]]], ["block", "if", [["get", "data.crudAction", ["loc", [null, [49, 10], [49, 25]]]]], [], 3, null, ["loc", [null, [49, 4], [51, 11]]]]],
+ locals: [],
+ templates: [child0, child1, child2, child3]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 55,
+ "column": 4
+ },
+ "end": {
+ "line": 57,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["inline", "link-to", ["ops", "cluster.ops", ["get", "data.cluster.name", ["loc", [null, [56, 40], [56, 57]]]]], [], ["loc", [null, [56, 10], [56, 59]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 59,
+ "column": 4
+ },
+ "end": {
+ "line": 63,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["inline", "link-to", [["get", "data.node.name", ["loc", [null, [61, 18], [61, 32]]]], "node", ["get", "data.cluster.name", ["loc", [null, [61, 40], [61, 57]]]], ["get", "data.node.name", ["loc", [null, [61, 58], [61, 72]]]]], [], ["loc", [null, [61, 8], [61, 74]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 65,
+ "column": 4
+ },
+ "end": {
+ "line": 69,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["inline", "link-to", [["get", "data.logFile.name", ["loc", [null, [67, 18], [67, 35]]]], "log-file", ["get", "data.cluster.name", ["loc", [null, [67, 47], [67, 64]]]], ["get", "data.node.name", ["loc", [null, [67, 65], [67, 79]]]], ["get", "data.logFile.name", ["loc", [null, [67, 80], [67, 97]]]]], [], ["loc", [null, [67, 8], [67, 99]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child3 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 71,
+ "column": 4
+ },
+ "end": {
+ "line": 75,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["inline", "link-to", [["get", "data.configFile.name", ["loc", [null, [73, 18], [73, 38]]]], "config-file", ["get", "data.cluster.name", ["loc", [null, [73, 53], [73, 70]]]], ["get", "data.node.name", ["loc", [null, [73, 71], [73, 85]]]], ["get", "data.configFile.name", ["loc", [null, [73, 86], [73, 106]]]]], [], ["loc", [null, [73, 8], [73, 108]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child4 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 77,
+ "column": 4
+ },
+ "end": {
+ "line": 79,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "data.crudAction", ["loc", [null, [78, 10], [78, 29]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 54,
+ "column": 2
+ },
+ "end": {
+ "line": 80,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(5);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);
+ morphs[4] = dom.createMorphAt(fragment, 8, 8, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "data.cluster", ["loc", [null, [55, 10], [55, 22]]]]], [], 0, null, ["loc", [null, [55, 4], [57, 11]]]], ["block", "if", [["get", "data.node", ["loc", [null, [59, 10], [59, 19]]]]], [], 1, null, ["loc", [null, [59, 4], [63, 11]]]], ["block", "if", [["get", "data.logFile", ["loc", [null, [65, 10], [65, 22]]]]], [], 2, null, ["loc", [null, [65, 4], [69, 11]]]], ["block", "if", [["get", "data.configFile", ["loc", [null, [71, 10], [71, 25]]]]], [], 3, null, ["loc", [null, [71, 4], [75, 11]]]], ["block", "if", [["get", "data.crudAction", ["loc", [null, [77, 10], [77, 25]]]]], [], 4, null, ["loc", [null, [77, 4], [79, 11]]]]],
+ locals: [],
+ templates: [child0, child1, child2, child3, child4]
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 83,
+ "column": 4
+ },
+ "end": {
+ "line": 85,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["inline", "link-to", ["query", "cluster.query", ["get", "data.cluster.name", ["loc", [null, [84, 44], [84, 61]]]]], [], ["loc", [null, [84, 10], [84, 63]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 87,
+ "column": 4
+ },
+ "end": {
+ "line": 89,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["inline", "link-to", [["get", "data.searchIndex.name", ["loc", [null, [88, 20], [88, 41]]]], "search-index", ["get", "data.cluster.name", ["loc", [null, [88, 57], [88, 74]]]], ["get", "data.searchIndex.name", ["loc", [null, [88, 75], [88, 96]]]]], [], ["loc", [null, [88, 10], [88, 98]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 91,
+ "column": 4
+ },
+ "end": {
+ "line": 93,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["inline", "link-to", [["get", "data.searchSchema.name", ["loc", [null, [92, 20], [92, 42]]]], "search-schema", ["get", "data.cluster.name", ["loc", [null, [92, 59], [92, 76]]]], ["get", "data.searchSchema.name", ["loc", [null, [92, 77], [92, 99]]]]], [], ["loc", [null, [92, 10], [92, 101]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child3 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 95,
+ "column": 4
+ },
+ "end": {
+ "line": 99,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["inline", "link-to", [["get", "data.table.name", ["loc", [null, [97, 18], [97, 33]]]], "table", ["get", "data.cluster.name", ["loc", [null, [97, 42], [97, 59]]]], ["get", "data.table.name", ["loc", [null, [97, 60], [97, 75]]]]], [], ["loc", [null, [97, 8], [97, 77]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child4 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 101,
+ "column": 4
+ },
+ "end": {
+ "line": 103,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "data.crudAction", ["loc", [null, [102, 10], [102, 29]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 82,
+ "column": 2
+ },
+ "end": {
+ "line": 104,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(5);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);
+ morphs[4] = dom.createMorphAt(fragment, 8, 8, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "data.cluster", ["loc", [null, [83, 10], [83, 22]]]]], [], 0, null, ["loc", [null, [83, 4], [85, 11]]]], ["block", "if", [["get", "data.searchIndex", ["loc", [null, [87, 10], [87, 26]]]]], [], 1, null, ["loc", [null, [87, 4], [89, 11]]]], ["block", "if", [["get", "data.searchSchema", ["loc", [null, [91, 10], [91, 27]]]]], [], 2, null, ["loc", [null, [91, 4], [93, 11]]]], ["block", "if", [["get", "data.table", ["loc", [null, [95, 10], [95, 20]]]]], [], 3, null, ["loc", [null, [95, 4], [99, 11]]]], ["block", "if", [["get", "data.crudAction", ["loc", [null, [101, 10], [101, 25]]]]], [], 4, null, ["loc", [null, [101, 4], [103, 11]]]]],
+ locals: [],
+ templates: [child0, child1, child2, child3, child4]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "triple-curlies"
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 106,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/breadcrumb-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("ol");
+ dom.setAttribute(el1, "class", "breadcrumb");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [0]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(element0, 1, 1);
+ morphs[1] = dom.createMorphAt(element0, 3, 3);
+ morphs[2] = dom.createMorphAt(element0, 5, 5);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "isClusterData", ["loc", [null, [2, 8], [2, 21]]]]], [], 0, null, ["loc", [null, [2, 2], [52, 9]]]], ["block", "if", [["get", "isClusterOps", ["loc", [null, [54, 8], [54, 20]]]]], [], 1, null, ["loc", [null, [54, 2], [80, 9]]]], ["block", "if", [["get", "isClusterQuery", ["loc", [null, [82, 8], [82, 22]]]]], [], 2, null, ["loc", [null, [82, 2], [104, 9]]]]],
+ locals: [],
+ templates: [child0, child1, child2]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/charts/cluster-stat", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 2,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/charts/cluster-stat.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [1, 0], [1, 9]]]]],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/charts/node-stat", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 2,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/charts/node-stat.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [1, 0], [1, 9]]]]],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/cluster-status-indicator", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 2,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/cluster-status-indicator.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [1, 0], [1, 9]]]]],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/dashboard-module/body", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 2,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/dashboard-module/body.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [1, 0], [1, 9]]]]],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/dashboard-module/container", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 2,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/dashboard-module/container.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [1, 0], [1, 9]]]]],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/dashboard-module/header", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "triple-curlies"
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 3,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/dashboard-module/header.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "module-label");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "label", ["loc", [null, [2, 28], [2, 37]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 5,
+ "column": 9
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/dashboard-module/header.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "label", ["loc", [null, [1, 6], [1, 11]]]]], [], 0, null, ["loc", [null, [1, 0], [3, 7]]]], ["content", "yield", ["loc", [null, [5, 0], [5, 9]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/dashboard-module/section", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "triple-curlies"
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 3,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/dashboard-module/section.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "section-title");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "title", ["loc", [null, [2, 29], [2, 38]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 6,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/dashboard-module/section.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "title", ["loc", [null, [1, 6], [1, 11]]]]], [], 0, null, ["loc", [null, [1, 0], [3, 7]]]], ["content", "yield", ["loc", [null, [5, 0], [5, 9]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/form/add-custom-properties", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 0
+ },
+ "end": {
+ "line": 18,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/form/add-custom-properties.hbs"
+ },
+ isEmpty: false,
+ arity: 2,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "property-container");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "form-group property-input");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("label");
+ var el4 = dom.createTextNode("Property Key");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "form-group property-input");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("label");
+ var el4 = dom.createTextNode("Property Value");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "remove-property label label-danger");
+ var el3 = dom.createTextNode("\n remove\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var element1 = dom.childAt(element0, [5]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 3, 3);
+ morphs[1] = dom.createMorphAt(dom.childAt(element0, [3]), 3, 3);
+ morphs[2] = dom.createElementMorph(element1);
+ return morphs;
+ },
+ statements: [["inline", "input", [], ["value", ["subexpr", "@mut", [["get", "property.key", ["loc", [null, [7, 20], [7, 32]]]]], [], []], "class", "form-control"], ["loc", [null, [7, 6], [7, 55]]]], ["inline", "input", [], ["value", ["subexpr", "@mut", [["get", "property.value", ["loc", [null, [11, 20], [11, 34]]]]], [], []], "class", "form-control"], ["loc", [null, [11, 6], [11, 57]]]], ["element", "action", ["removeProperty", ["get", "index", ["loc", [null, [14, 79], [14, 84]]]]], [], ["loc", [null, [14, 53], [14, 86]]]]],
+ locals: ["property", "index"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes", "wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 25,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/form/add-custom-properties.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("label");
+ var el2 = dom.createTextNode("Custom Properties");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "form-group add-property");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("span");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "ion-plus-circled");
+ dom.setAttribute(el3, "aria-hidden", "true");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n Add property\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element2 = dom.childAt(fragment, [4, 1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ morphs[1] = dom.createElementMorph(element2);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "properties", ["loc", [null, [3, 8], [3, 18]]]]], [], 0, null, ["loc", [null, [3, 0], [18, 9]]]], ["element", "action", ["addNewProperty"], [], ["loc", [null, [21, 8], [21, 35]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/form/explorer-button", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "modifiers",
+ "modifiers": ["action"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 4,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/form/explorer-button.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("button");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [0]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createAttrMorph(element0, 'class');
+ morphs[1] = dom.createElementMorph(element0);
+ morphs[2] = dom.createMorphAt(element0, 1, 1);
+ return morphs;
+ },
+ statements: [["attribute", "class", ["concat", ["btn btn-", ["get", "type", ["loc", [null, [1, 25], [1, 29]]]]]]], ["element", "action", ["handleButtonClick"], [], ["loc", [null, [1, 33], [1, 63]]]], ["content", "label", ["loc", [null, [2, 2], [2, 11]]]]],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/form/explorer-input", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 3,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/form/explorer-input.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("label");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "label", ["loc", [null, [2, 9], [2, 18]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 6,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/form/explorer-input.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "label", ["loc", [null, [1, 6], [1, 11]]]]], [], 0, null, ["loc", [null, [1, 0], [3, 7]]]], ["inline", "input", [], ["type", ["subexpr", "@mut", [["get", "type", ["loc", [null, [5, 13], [5, 17]]]]], [], []], "value", ["subexpr", "mut", [["get", "value", ["loc", [null, [5, 29], [5, 34]]]]], [], ["loc", [null, [5, 24], [5, 35]]]], "class", "form-control"], ["loc", [null, [5, 0], [5, 58]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/high-charts", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 2,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/high-charts.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [1, 0], [1, 9]]]]],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/hll-editor", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 9,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/hll-editor.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("button");
+ dom.setAttribute(el2, "type", "button");
+ dom.setAttribute(el2, "class", "button-add-item");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "ion-plus-round");
+ dom.setAttribute(el3, "aria-hidden", "true");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n Add Item\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [0]);
+ var element1 = dom.childAt(element0, [3]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(element0, 1, 1);
+ morphs[1] = dom.createElementMorph(element1);
+ return morphs;
+ },
+ statements: [["inline", "input", [], ["value", ["subexpr", "mut", [["get", "newItem", ["loc", [null, [2, 21], [2, 28]]]]], [], ["loc", [null, [2, 16], [2, 29]]]], "class", "input-add-item"], ["loc", [null, [2, 2], [2, 54]]]], ["element", "action", ["addElement", ["get", "newItem", ["loc", [null, [3, 70], [3, 77]]]]], [], ["loc", [null, [3, 48], [3, 79]]]]],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/link/explorer-resource", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 4,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/link/explorer-resource.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [3, 4], [3, 13]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 5,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/link/explorer-resource.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["bucket-type", ["get", "resourceObj.name", ["loc", [null, [2, 27], [2, 43]]]]], [], 0, null, ["loc", [null, [2, 2], [4, 14]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 8,
+ "column": 2
+ },
+ "end": {
+ "line": 10,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/link/explorer-resource.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [9, 4], [9, 13]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 7,
+ "column": 0
+ },
+ "end": {
+ "line": 11,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/link/explorer-resource.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["bucket-type", ["get", "resourceObj.cluster.name", ["loc", [null, [8, 27], [8, 51]]]], ["get", "resourceObj.name", ["loc", [null, [8, 52], [8, 68]]]]], ["class", ["subexpr", "@mut", [["get", "linkClass", ["loc", [null, [8, 75], [8, 84]]]]], [], []]], 0, null, ["loc", [null, [8, 2], [10, 14]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 14,
+ "column": 2
+ },
+ "end": {
+ "line": 16,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/link/explorer-resource.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [15, 4], [15, 13]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 13,
+ "column": 0
+ },
+ "end": {
+ "line": 17,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/link/explorer-resource.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["bucket", ["get", "resourceObj.cluster.name", ["loc", [null, [14, 22], [14, 46]]]], ["get", "resourceObj.bucketType.name", ["loc", [null, [14, 47], [14, 74]]]], ["get", "resourceObj.name", ["loc", [null, [14, 75], [14, 91]]]]], ["class", ["subexpr", "@mut", [["get", "linkClass", ["loc", [null, [14, 98], [14, 107]]]]], [], []]], 0, null, ["loc", [null, [14, 2], [16, 14]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child3 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 20,
+ "column": 2
+ },
+ "end": {
+ "line": 22,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/link/explorer-resource.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [21, 4], [21, 13]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 19,
+ "column": 0
+ },
+ "end": {
+ "line": 23,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/link/explorer-resource.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["search-index", ["get", "resourceObj.cluster.name", ["loc", [null, [20, 28], [20, 52]]]], ["get", "resourceObj.name", ["loc", [null, [20, 53], [20, 69]]]]], ["class", ["subexpr", "@mut", [["get", "linkClass", ["loc", [null, [20, 76], [20, 85]]]]], [], []]], 0, null, ["loc", [null, [20, 2], [22, 14]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 25,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/link/explorer-resource.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "eq", [["get", "resourceType", ["loc", [null, [1, 10], [1, 22]]]], "cluster"], [], ["loc", [null, [1, 6], [1, 33]]]]], [], 0, null, ["loc", [null, [1, 0], [5, 7]]]], ["block", "if", [["subexpr", "eq", [["get", "resourceType", ["loc", [null, [7, 10], [7, 22]]]], "bucket-type"], [], ["loc", [null, [7, 6], [7, 37]]]]], [], 1, null, ["loc", [null, [7, 0], [11, 7]]]], ["block", "if", [["subexpr", "eq", [["get", "resourceType", ["loc", [null, [13, 10], [13, 22]]]], "bucket"], [], ["loc", [null, [13, 6], [13, 32]]]]], [], 2, null, ["loc", [null, [13, 0], [17, 7]]]], ["block", "if", [["subexpr", "eq", [["get", "resourceType", ["loc", [null, [19, 10], [19, 22]]]], "index"], [], ["loc", [null, [19, 6], [19, 31]]]]], [], 3, null, ["loc", [null, [19, 0], [23, 7]]]]],
+ locals: [],
+ templates: [child0, child1, child2, child3]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/loading-spinner", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 6,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/loading-spinner.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "status-message");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);
+ return morphs;
+ },
+ statements: [["content", "statusMessage", ["loc", [null, [4, 6], [4, 23]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "triple-curlies"
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 26,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/loading-spinner.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "loading-container");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "spinner");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "spinner-blade");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "spinner-blade");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "spinner-blade");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "spinner-blade");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "spinner-blade");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "spinner-blade");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "spinner-blade");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "spinner-blade");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "spinner-blade");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "spinner-blade");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "spinner-blade");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("div");
+ dom.setAttribute(el3, "class", "spinner-blade");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n\n\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "statusMessage", ["loc", [null, [2, 8], [2, 21]]]]], [], 0, null, ["loc", [null, [2, 2], [6, 9]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/map-object/contents", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 7,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/contents.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "map-object.maps", [], ["title", ["subexpr", "@mut", [["get", "type", ["loc", [null, [4, 10], [4, 14]]]]], [], []], "maps", ["subexpr", "@mut", [["get", "contents", ["loc", [null, [5, 9], [5, 17]]]]], [], []]], ["loc", [null, [3, 4], [5, 19]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 7,
+ "column": 2
+ },
+ "end": {
+ "line": 13,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/contents.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "map-object.sets", [], ["title", ["subexpr", "@mut", [["get", "type", ["loc", [null, [9, 10], [9, 14]]]]], [], []], "map", ["subexpr", "@mut", [["get", "map", ["loc", [null, [10, 8], [10, 11]]]]], [], []], "sets", ["subexpr", "@mut", [["get", "contents", ["loc", [null, [11, 9], [11, 17]]]]], [], []], "removeField", ["subexpr", "@mut", [["get", "removeField", ["loc", [null, [12, 16], [12, 27]]]]], [], []]], ["loc", [null, [8, 4], [12, 29]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 13,
+ "column": 2
+ },
+ "end": {
+ "line": 21,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/contents.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "map-object.section", [], ["title", ["subexpr", "@mut", [["get", "type", ["loc", [null, [15, 10], [15, 14]]]]], [], []], "map", ["subexpr", "@mut", [["get", "map", ["loc", [null, [16, 8], [16, 11]]]]], [], []], "items", ["subexpr", "@mut", [["get", "contents", ["loc", [null, [17, 10], [17, 18]]]]], [], []]], ["loc", [null, [14, 4], [17, 20]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 7,
+ "column": 2
+ },
+ "end": {
+ "line": 21,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/contents.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "eq", [["get", "type", ["loc", [null, [7, 16], [7, 20]]]], "sets"], [], ["loc", [null, [7, 12], [7, 28]]]]], [], 0, 1, ["loc", [null, [7, 2], [21, 2]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 22,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/contents.hbs"
+ },
+ isEmpty: false,
+ arity: 2,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "eq", [["get", "type", ["loc", [null, [2, 12], [2, 16]]]], "maps"], [], ["loc", [null, [2, 8], [2, 24]]]]], [], 0, 1, ["loc", [null, [2, 2], [21, 9]]]]],
+ locals: ["type", "contents"],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 22,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/contents.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "each-in", [["get", "sortedMap", ["loc", [null, [1, 11], [1, 20]]]]], [], 0, null, ["loc", [null, [1, 0], [22, 12]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/map-object/map", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 6,
+ "column": 6
+ },
+ "end": {
+ "line": 9,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/map.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-ios-minus");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "toggle-text");
+ var el2 = dom.createTextNode("hide contents");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 9,
+ "column": 6
+ },
+ "end": {
+ "line": 12,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/map.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-ios-plus");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "toggle-text");
+ var el2 = dom.createTextNode("view contents");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "triple-curlies"
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 21,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/map.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "map-item");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "map-name");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "expand-contents");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("code");
+ var el5 = dom.createTextNode("\n");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode(" ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [0]);
+ var element1 = dom.childAt(element0, [1]);
+ var element2 = dom.childAt(element1, [3, 1]);
+ var element3 = dom.childAt(element0, [3]);
+ var morphs = new Array(6);
+ morphs[0] = dom.createAttrMorph(element0, 'id');
+ morphs[1] = dom.createMorphAt(element1, 1, 1);
+ morphs[2] = dom.createElementMorph(element2);
+ morphs[3] = dom.createMorphAt(element2, 1, 1);
+ morphs[4] = dom.createAttrMorph(element3, 'class');
+ morphs[5] = dom.createMorphAt(element3, 1, 1);
+ return morphs;
+ },
+ statements: [["attribute", "id", ["get", "name", ["loc", [null, [1, 27], [1, 31]]]]], ["content", "name", ["loc", [null, [3, 4], [3, 12]]]], ["element", "action", ["subMapToggle"], [], ["loc", [null, [5, 10], [5, 35]]]], ["block", "if", [["get", "showContent", ["loc", [null, [6, 12], [6, 23]]]]], [], 0, 1, ["loc", [null, [6, 6], [12, 13]]]], ["attribute", "class", ["subexpr", "if", [["get", "showContent", ["loc", [null, [16, 18], [16, 29]]]], "sub-map-contents expanded", "sub-map-contents"], [], ["loc", [null, [16, 13], [16, 78]]]]], ["inline", "map-object.contents", [], ["sortedMap", ["subexpr", "@mut", [["get", "value", ["loc", [null, [17, 36], [17, 41]]]]], [], []]], ["loc", [null, [17, 4], [17, 43]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/map-object/maps", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 6,
+ "column": 0
+ },
+ "end": {
+ "line": 8,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/maps.hbs"
+ },
+ isEmpty: false,
+ arity: 2,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "map-object.map", [], ["name", ["subexpr", "@mut", [["get", "name", ["loc", [null, [7, 24], [7, 28]]]]], [], []], "value", ["subexpr", "@mut", [["get", "value", ["loc", [null, [7, 35], [7, 40]]]]], [], []]], ["loc", [null, [7, 2], [7, 42]]]]],
+ locals: ["name", "value"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes", "wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 8,
+ "column": 12
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/maps.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("h4");
+ dom.setAttribute(el1, "class", "map-section-title");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "badge");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [0]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(element0, 1, 1);
+ morphs[1] = dom.createMorphAt(dom.childAt(element0, [3]), 0, 0);
+ morphs[2] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["content", "title", ["loc", [null, [2, 2], [2, 11]]]], ["inline", "object-length", [["get", "maps", ["loc", [null, [3, 38], [3, 42]]]]], [], ["loc", [null, [3, 22], [3, 44]]]], ["block", "each-in", [["get", "maps", ["loc", [null, [6, 11], [6, 15]]]]], [], 0, null, ["loc", [null, [6, 0], [8, 12]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/map-object/section", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 12,
+ "column": 8
+ },
+ "end": {
+ "line": 16,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/section.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("button");
+ dom.setAttribute(el1, "type", "button");
+ dom.setAttribute(el1, "class", "delete-button");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "ion-trash-a");
+ dom.setAttribute(el2, "aria-hidden", "true");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element4 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element4);
+ return morphs;
+ },
+ statements: [["element", "action", ["removeField", ["get", "map", ["loc", [null, [13, 77], [13, 80]]]], ["get", "name", ["loc", [null, [13, 81], [13, 85]]]], ["get", "value", ["loc", [null, [13, 86], [13, 91]]]]], [], ["loc", [null, [13, 54], [13, 93]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 17,
+ "column": 8
+ },
+ "end": {
+ "line": 21,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/section.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("button");
+ dom.setAttribute(el1, "type", "button");
+ dom.setAttribute(el1, "class", "edit-button");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "ion-edit");
+ dom.setAttribute(el2, "aria-hidden", "true");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element3 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createElementMorph(element3);
+ return morphs;
+ },
+ statements: [["element", "action", ["editField", ["get", "map", ["loc", [null, [18, 73], [18, 76]]]], ["get", "name", ["loc", [null, [18, 77], [18, 81]]]], ["get", "value", ["loc", [null, [18, 82], [18, 87]]]]], [], ["loc", [null, [18, 52], [18, 89]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 7,
+ "column": 2
+ },
+ "end": {
+ "line": 24,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/section.hbs"
+ },
+ isEmpty: false,
+ arity: 2,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ dom.setAttribute(el1, "class", "item-instance");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element5 = dom.childAt(fragment, [1]);
+ var element6 = dom.childAt(element5, [3]);
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(dom.childAt(element5, [1]), 0, 0);
+ morphs[1] = dom.createMorphAt(dom.childAt(element6, [1]), 0, 0);
+ morphs[2] = dom.createMorphAt(element6, 3, 3);
+ morphs[3] = dom.createMorphAt(element6, 4, 4);
+ return morphs;
+ },
+ statements: [["content", "name", ["loc", [null, [9, 22], [9, 30]]]], ["content", "value", ["loc", [null, [11, 14], [11, 23]]]], ["block", "if", [["get", "removeField", ["loc", [null, [12, 14], [12, 25]]]]], [], 0, null, ["loc", [null, [12, 8], [16, 15]]]], ["block", "if", [["get", "editField", ["loc", [null, [17, 14], [17, 23]]]]], [], 1, null, ["loc", [null, [17, 8], [21, 15]]]]],
+ locals: ["name", "value"],
+ templates: [child0, child1]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 27,
+ "column": 2
+ },
+ "end": {
+ "line": 47,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/section.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ dom.setAttribute(el1, "class", "add-instance");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("button");
+ dom.setAttribute(el3, "type", "button");
+ dom.setAttribute(el3, "class", "add-instance-button");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("span");
+ dom.setAttribute(el4, "class", "ion-plus-round");
+ dom.setAttribute(el4, "aria-hidden", "true");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n Add ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var element1 = dom.childAt(element0, [3]);
+ var element2 = dom.childAt(element1, [3]);
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 1, 1);
+ morphs[1] = dom.createMorphAt(element1, 1, 1);
+ morphs[2] = dom.createElementMorph(element2);
+ morphs[3] = dom.createMorphAt(element2, 3, 3);
+ return morphs;
+ },
+ statements: [["inline", "input", [], ["value", ["subexpr", "@mut", [["get", "fieldToAddName", ["loc", [null, [31, 14], [31, 28]]]]], [], []], "class", "add-instance-input", "placeholder", "field name"], ["loc", [null, [30, 8], [33, 34]]]], ["inline", "input", [], ["value", ["subexpr", "@mut", [["get", "fieldToAddValue", ["loc", [null, [37, 14], [37, 29]]]]], [], []], "class", "add-instance-input make-room", "placeholder", "value"], ["loc", [null, [36, 8], [39, 29]]]], ["element", "action", ["addField", ["get", "map", ["loc", [null, [41, 78], [41, 81]]]]], [], ["loc", [null, [41, 58], [41, 83]]]], ["content", "title", ["loc", [null, [43, 14], [43, 23]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 49,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/section.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("h4");
+ dom.setAttribute(el1, "class", "map-section-title");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "badge");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("table");
+ dom.setAttribute(el1, "class", "key-value-table");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tbody");
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element7 = dom.childAt(fragment, [0]);
+ var element8 = dom.childAt(fragment, [2]);
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(element7, 1, 1);
+ morphs[1] = dom.createMorphAt(dom.childAt(element7, [3]), 0, 0);
+ morphs[2] = dom.createMorphAt(dom.childAt(element8, [1]), 1, 1);
+ morphs[3] = dom.createMorphAt(element8, 3, 3);
+ return morphs;
+ },
+ statements: [["content", "title", ["loc", [null, [2, 2], [2, 11]]]], ["inline", "object-length", [["get", "items", ["loc", [null, [3, 38], [3, 43]]]]], [], ["loc", [null, [3, 22], [3, 45]]]], ["block", "each-in", [["get", "items", ["loc", [null, [7, 13], [7, 18]]]]], [], 0, null, ["loc", [null, [7, 2], [24, 14]]]], ["block", "if", [["get", "addField", ["loc", [null, [27, 8], [27, 16]]]]], [], 1, null, ["loc", [null, [27, 2], [47, 9]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/map-object/sets", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 12,
+ "column": 10
+ },
+ "end": {
+ "line": 18,
+ "column": 10
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/sets.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 1]), 1, 1);
+ return morphs;
+ },
+ statements: [["content", "setItem", ["loc", [null, [15, 16], [15, 27]]]]],
+ locals: ["setItem"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 7,
+ "column": 2
+ },
+ "end": {
+ "line": 32,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/sets.hbs"
+ },
+ isEmpty: false,
+ arity: 2,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ dom.setAttribute(el1, "class", "item-instance");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("ul");
+ dom.setAttribute(el3, "class", "object-content-list");
+ var el4 = dom.createTextNode("\n");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode(" ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 0, 0);
+ morphs[1] = dom.createMorphAt(dom.childAt(element0, [3, 1]), 1, 1);
+ return morphs;
+ },
+ statements: [["content", "name", ["loc", [null, [9, 22], [9, 30]]]], ["block", "each", [["get", "value", ["loc", [null, [12, 18], [12, 23]]]]], [], 0, null, ["loc", [null, [12, 10], [18, 19]]]]],
+ locals: ["name", "value"],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 55,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/map-object/sets.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("h4");
+ dom.setAttribute(el1, "class", "map-section-title");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "badge");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("table");
+ dom.setAttribute(el1, "class", "key-value-table");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tbody");
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element1 = dom.childAt(fragment, [0]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(element1, 1, 1);
+ morphs[1] = dom.createMorphAt(dom.childAt(element1, [3]), 0, 0);
+ morphs[2] = dom.createMorphAt(dom.childAt(fragment, [2, 1]), 1, 1);
+ return morphs;
+ },
+ statements: [["content", "title", ["loc", [null, [2, 2], [2, 11]]]], ["inline", "object-length", [["get", "sets", ["loc", [null, [3, 38], [3, 42]]]]], [], ["loc", [null, [3, 22], [3, 44]]]], ["block", "each-in", [["get", "sets", ["loc", [null, [7, 13], [7, 17]]]]], [], 0, null, ["loc", [null, [7, 2], [32, 14]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define('ember-riak-explorer/templates/components/modal-dialog', ['exports', 'ember-modal-dialog/templates/components/modal-dialog'], function (exports, _emberModalDialogTemplatesComponentsModalDialog) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberModalDialogTemplatesComponentsModalDialog['default'];
+ }
+ });
+});
+define("ember-riak-explorer/templates/components/new-object-inputs", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 6,
+ "column": 2
+ },
+ "end": {
+ "line": 8,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/new-object-inputs.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "input", [], ["type", "number", "value", ["subexpr", "@mut", [["get", "object.contents", ["loc", [null, [7, 32], [7, 47]]]]], [], []], "class", "form-control"], ["loc", [null, [7, 4], [7, 70]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 8,
+ "column": 2
+ },
+ "end": {
+ "line": 15,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/new-object-inputs.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ dom.setAttribute(el1, "class", "help-block");
+ var el2 = dom.createTextNode("The set value must be entered as a valid javascript array. All array values should be strings. (i.e. ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("['foo', 'bar', 'baz']");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(")");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "ivy-codemirror", [], ["mode", "javascript", "theme", "material", "lineWrapping", true, "value", ["subexpr", "mut", [["get", "object.contents", ["loc", [null, [13, 15], [13, 30]]]]], [], ["loc", [null, [13, 10], [13, 31]]]]], ["loc", [null, [9, 4], [13, 33]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 15,
+ "column": 2
+ },
+ "end": {
+ "line": 22,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/new-object-inputs.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ dom.setAttribute(el1, "class", "help-block");
+ var el2 = dom.createTextNode("The map value must be entered as a javascript object and be valid json.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "ivy-codemirror", [], ["mode", "javascript", "theme", "material", "lineWrapping", true, "value", ["subexpr", "mut", [["get", "object.contents", ["loc", [null, [20, 15], [20, 30]]]]], [], ["loc", [null, [20, 10], [20, 31]]]]], ["loc", [null, [16, 4], [20, 33]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 22,
+ "column": 2
+ },
+ "end": {
+ "line": 29,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/new-object-inputs.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ dom.setAttribute(el1, "class", "help-block");
+ var el2 = dom.createTextNode("The HLL object must be given a list to calculate cardinality from. The list must be entered as a valid javascript array. All array values should be strings. (i.e. ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("['foo', 'bar', 'baz']");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(")");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "ivy-codemirror", [], ["mode", "javascript", "theme", "material", "lineWrapping", true, "value", ["subexpr", "mut", [["get", "object.contents", ["loc", [null, [27, 15], [27, 30]]]]], [], ["loc", [null, [27, 10], [27, 31]]]]], ["loc", [null, [23, 4], [27, 33]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 29,
+ "column": 2
+ },
+ "end": {
+ "line": 35,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/new-object-inputs.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "ivy-codemirror", [], ["mode", "javascript", "theme", "material", "lineWrapping", true, "value", ["subexpr", "mut", [["get", "object.contents", ["loc", [null, [34, 15], [34, 30]]]]], [], ["loc", [null, [34, 10], [34, 31]]]]], ["loc", [null, [30, 4], [34, 33]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 22,
+ "column": 2
+ },
+ "end": {
+ "line": 35,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/new-object-inputs.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "eq", [["get", "object.type", ["loc", [null, [22, 16], [22, 27]]]], "HyperLogLog"], [], ["loc", [null, [22, 12], [22, 42]]]]], [], 0, 1, ["loc", [null, [22, 2], [35, 2]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 15,
+ "column": 2
+ },
+ "end": {
+ "line": 35,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/new-object-inputs.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "eq", [["get", "object.type", ["loc", [null, [15, 16], [15, 27]]]], "Map"], [], ["loc", [null, [15, 12], [15, 34]]]]], [], 0, 1, ["loc", [null, [15, 2], [35, 2]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 8,
+ "column": 2
+ },
+ "end": {
+ "line": 35,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/new-object-inputs.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "eq", [["get", "object.type", ["loc", [null, [8, 16], [8, 27]]]], "Set"], [], ["loc", [null, [8, 12], [8, 34]]]]], [], 0, 1, ["loc", [null, [8, 2], [35, 2]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 38,
+ "column": 0
+ },
+ "end": {
+ "line": 40,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/new-object-inputs.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "form.explorer-input", [], ["label", "Content Type", "value", ["subexpr", "@mut", [["get", "object.contentType", ["loc", [null, [39, 51], [39, 69]]]]], [], []]], ["loc", [null, [39, 2], [39, 71]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 40,
+ "column": 7
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/new-object-inputs.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "form-group");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("label");
+ var el3 = dom.createTextNode("Value");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2]), 3, 3);
+ morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["inline", "form.explorer-input", [], ["label", "Key", "value", ["subexpr", "@mut", [["get", "object.name", ["loc", [null, [1, 40], [1, 51]]]]], [], []]], ["loc", [null, [1, 0], [1, 53]]]], ["block", "if", [["subexpr", "eq", [["get", "object.type", ["loc", [null, [6, 12], [6, 23]]]], "Counter"], [], ["loc", [null, [6, 8], [6, 34]]]]], [], 0, 1, ["loc", [null, [6, 2], [35, 9]]]], ["block", "if", [["subexpr", "eq", [["get", "object.type", ["loc", [null, [38, 10], [38, 21]]]], "Default"], [], ["loc", [null, [38, 6], [38, 32]]]]], [], 2, null, ["loc", [null, [38, 0], [40, 7]]]]],
+ locals: [],
+ templates: [child0, child1, child2]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/pagination-component", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 16,
+ "column": 6
+ },
+ "end": {
+ "line": 18,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/pagination-component.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ dom.setAttribute(el1, "class", "pagination-link number-link");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createElementMorph(element0);
+ morphs[1] = dom.createMorphAt(element0, 0, 0);
+ return morphs;
+ },
+ statements: [["element", "action", ["numberLinkClick", ["get", "link", ["loc", [null, [17, 75], [17, 79]]]]], [], ["loc", [null, [17, 48], [17, 81]]]], ["content", "link", ["loc", [null, [17, 82], [17, 90]]]]],
+ locals: ["link"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 6,
+ "column": 2
+ },
+ "end": {
+ "line": 20,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/pagination-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ dom.setAttribute(el1, "class", "pagination-links");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ dom.setAttribute(el2, "class", "pagination-link text-link");
+ var el3 = dom.createTextNode("\n Prev\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ dom.setAttribute(el2, "class", "pagination-link text-link");
+ var el3 = dom.createTextNode("\n Next\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element1 = dom.childAt(fragment, [1]);
+ var element2 = dom.childAt(element1, [1]);
+ var element3 = dom.childAt(element1, [3]);
+ var morphs = new Array(5);
+ morphs[0] = dom.createAttrMorph(element2, 'disabled');
+ morphs[1] = dom.createElementMorph(element2);
+ morphs[2] = dom.createAttrMorph(element3, 'disabled');
+ morphs[3] = dom.createElementMorph(element3);
+ morphs[4] = dom.createMorphAt(element1, 5, 5);
+ return morphs;
+ },
+ statements: [["attribute", "disabled", ["subexpr", "if", [["get", "shouldPrevBeDisabled", ["loc", [null, [8, 58], [8, 78]]]], "disabled"], [], ["loc", [null, [8, 53], [8, 91]]]]], ["element", "action", ["prevLinkClick"], [], ["loc", [null, [8, 92], [8, 118]]]], ["attribute", "disabled", ["subexpr", "if", [["get", "shouldNextBeDisabled", ["loc", [null, [12, 58], [12, 78]]]], "disabled"], [], ["loc", [null, [12, 53], [12, 91]]]]], ["element", "action", ["nextLinkClick"], [], ["loc", [null, [12, 92], [12, 118]]]], ["block", "each", [["get", "numberLinks", ["loc", [null, [16, 14], [16, 25]]]]], [], 0, null, ["loc", [null, [16, 6], [18, 15]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 22,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/pagination-component.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "pagination-content");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "pagination-links-container");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 1, 1);
+ morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [2, 2], [2, 11]]]], ["block", "if", [["get", "shouldShowPaginationLinks", ["loc", [null, [6, 8], [6, 33]]]]], [], 0, null, ["loc", [null, [6, 2], [20, 9]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/set-editor", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 9,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/set-editor.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("button");
+ dom.setAttribute(el2, "type", "button");
+ dom.setAttribute(el2, "class", "remove-item");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "ion-trash-a");
+ dom.setAttribute(el3, "aria-hidden", "true");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var element1 = dom.childAt(element0, [3]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 0, 0);
+ morphs[1] = dom.createElementMorph(element1);
+ return morphs;
+ },
+ statements: [["content", "item", ["loc", [null, [3, 10], [3, 18]]]], ["element", "action", ["removeElement", ["get", "item", ["loc", [null, [5, 31], [5, 35]]]]], [], ["loc", [null, [5, 6], [5, 37]]]]],
+ locals: ["item"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 17,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/set-editor.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("button");
+ dom.setAttribute(el2, "type", "button");
+ dom.setAttribute(el2, "class", "button-add-item");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "ion-plus-round");
+ dom.setAttribute(el3, "aria-hidden", "true");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n Add Item\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element2 = dom.childAt(fragment, [1]);
+ var element3 = dom.childAt(element2, [3]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(element2, 1, 1);
+ morphs[2] = dom.createElementMorph(element3);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "contents", ["loc", [null, [1, 8], [1, 16]]]]], [], 0, null, ["loc", [null, [1, 0], [9, 9]]]], ["inline", "input", [], ["value", ["subexpr", "mut", [["get", "newItem", ["loc", [null, [11, 21], [11, 28]]]]], [], ["loc", [null, [11, 16], [11, 29]]]], "class", "input-add-item"], ["loc", [null, [11, 2], [11, 54]]]], ["element", "action", ["addElement", ["get", "newItem", ["loc", [null, [12, 70], [12, 77]]]]], [], ["loc", [null, [12, 48], [12, 79]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/side-drawer", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 11,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/side-drawer.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "drawer-header");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "drawer-label");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "close-container");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("span");
+ dom.setAttribute(el3, "class", "ion-close-round");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "drawer-body");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [0]);
+ var element1 = dom.childAt(element0, [3]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 0, 0);
+ morphs[1] = dom.createElementMorph(element1);
+ morphs[2] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);
+ return morphs;
+ },
+ statements: [["content", "label", ["loc", [null, [2, 28], [2, 37]]]], ["element", "action", ["close"], [], ["loc", [null, [4, 32], [4, 50]]]], ["content", "yield", ["loc", [null, [10, 2], [10, 11]]]]],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/table/bucket-props-advanced", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 5,
+ "column": 8
+ },
+ "end": {
+ "line": 7,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/bucket-props-advanced.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "prop.name", ["loc", [null, [6, 10], [6, 23]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 9,
+ "column": 8
+ },
+ "end": {
+ "line": 11,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/bucket-props-advanced.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "prop.key", ["loc", [null, [10, 10], [10, 22]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 4,
+ "column": 6
+ },
+ "end": {
+ "line": 12,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/bucket-props-advanced.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "prop.name", ["loc", [null, [5, 14], [5, 23]]]]], [], 0, null, ["loc", [null, [5, 8], [7, 15]]]], ["block", "if", [["subexpr", "not", [["get", "prop.name", ["loc", [null, [9, 19], [9, 28]]]]], [], ["loc", [null, [9, 14], [9, 29]]]]], [], 1, null, ["loc", [null, [9, 8], [11, 15]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 23,
+ "column": 8
+ },
+ "end": {
+ "line": 25,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/bucket-props-advanced.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" [");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("]\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "prop.value", ["loc", [null, [24, 11], [24, 25]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 25,
+ "column": 8
+ },
+ "end": {
+ "line": 27,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/bucket-props-advanced.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "prop.value", ["loc", [null, [26, 10], [26, 24]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 31,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/bucket-props-advanced.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("\n");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode(" ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var element1 = dom.childAt(element0, [1]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(element1, 1, 1);
+ morphs[1] = dom.createMorphAt(element1, 3, 3);
+ morphs[2] = dom.createMorphAt(dom.childAt(element0, [3, 1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "if", [["subexpr", "or", [["get", "prop.name", ["loc", [null, [4, 16], [4, 25]]]], ["get", "prop.key", ["loc", [null, [4, 26], [4, 34]]]]], [], ["loc", [null, [4, 12], [4, 35]]]]], [], 0, null, ["loc", [null, [4, 6], [12, 13]]]], ["inline", "tooltip.bucket-props", [], ["itemKey", ["subexpr", "@mut", [["get", "prop.key", ["loc", [null, [15, 14], [15, 22]]]]], [], []], "itemDescription", ["subexpr", "@mut", [["get", "prop.description", ["loc", [null, [16, 22], [16, 38]]]]], [], []], "itemDefaultValue", ["subexpr", "@mut", [["get", "prop.default", ["loc", [null, [17, 23], [17, 35]]]]], [], []], "itemIsEditable", ["subexpr", "@mut", [["get", "prop.editable", ["loc", [null, [18, 21], [18, 34]]]]], [], []], "itemSchemaType", ["subexpr", "@mut", [["get", "prop.json_schema_type", ["loc", [null, [19, 21], [19, 42]]]]], [], []]], ["loc", [null, [14, 6], [19, 44]]]], ["block", "if", [["subexpr", "is-array", [["get", "prop.value", ["loc", [null, [23, 24], [23, 34]]]]], [], ["loc", [null, [23, 14], [23, 35]]]]], [], 1, 2, ["loc", [null, [23, 8], [27, 15]]]]],
+ locals: ["prop"],
+ templates: [child0, child1, child2]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 31,
+ "column": 9
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/bucket-props-advanced.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "model.propsWithHelp", ["loc", [null, [1, 8], [1, 27]]]]], [], 0, null, ["loc", [null, [1, 0], [31, 9]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/table/bucket-props-overview", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 10,
+ "column": 4
+ },
+ "end": {
+ "line": 12,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/bucket-props-overview.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "label label-success");
+ var el2 = dom.createTextNode("Active");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 12,
+ "column": 4
+ },
+ "end": {
+ "line": 14,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/bucket-props-overview.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "label label-default");
+ var el2 = dom.createTextNode("Inactive");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 25,
+ "column": 4
+ },
+ "end": {
+ "line": 34,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/bucket-props-overview.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("br");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n R: ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode(", W: ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode(",\n PR: ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode(", PW: ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode(",\n DW: ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("small");
+ var el2 = dom.createTextNode("\n (basic_quorum: ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(",\n notfound_ok: ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(")\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [13]);
+ var morphs = new Array(7);
+ morphs[0] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 5, 5, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 7, 7, contextualElement);
+ morphs[3] = dom.createMorphAt(fragment, 9, 9, contextualElement);
+ morphs[4] = dom.createMorphAt(fragment, 11, 11, contextualElement);
+ morphs[5] = dom.createMorphAt(element0, 1, 1);
+ morphs[6] = dom.createMorphAt(element0, 3, 3);
+ return morphs;
+ },
+ statements: [["content", "model.quorum.r", ["loc", [null, [27, 9], [27, 27]]]], ["content", "model.quorum.w", ["loc", [null, [27, 32], [27, 50]]]], ["content", "model.quorum.pr", ["loc", [null, [28, 10], [28, 29]]]], ["content", "model.quorum.pw", ["loc", [null, [28, 35], [28, 54]]]], ["content", "model.quorum.dw", ["loc", [null, [29, 10], [29, 29]]]], ["content", "model.quorum.basic_quorum", ["loc", [null, [31, 23], [31, 52]]]], ["content", "model.quorum.basic_quorum", ["loc", [null, [32, 21], [32, 50]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child3 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 50,
+ "column": 6
+ },
+ "end": {
+ "line": 52,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/bucket-props-overview.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "model.index.name", ["loc", [null, [51, 8], [51, 28]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 49,
+ "column": 4
+ },
+ "end": {
+ "line": 53,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/bucket-props-overview.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["search-index", ["get", "model.index.cluster.name", ["loc", [null, [50, 32], [50, 56]]]], ["get", "model.index.name", ["loc", [null, [50, 57], [50, 73]]]]], ["class", "btn btn-primary"], 0, null, ["loc", [null, [50, 6], [52, 18]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child4 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 53,
+ "column": 4
+ },
+ "end": {
+ "line": 55,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/bucket-props-overview.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" n/a (not being indexed)\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 58,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/bucket-props-overview.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("Object Type");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("Activated");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("Conflict Res. Strategy");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createElement("code");
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("Quorum");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("N_Val: ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode(" ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element1 = dom.childAt(fragment, [6, 3, 1]);
+ var element2 = dom.childAt(fragment, [8]);
+ var element3 = dom.childAt(element2, [1]);
+ var morphs = new Array(8);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0, 3]), 1, 1);
+ morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2, 3]), 1, 1);
+ morphs[2] = dom.createMorphAt(dom.childAt(fragment, [4, 3, 0]), 0, 0);
+ morphs[3] = dom.createMorphAt(element1, 1, 1);
+ morphs[4] = dom.createMorphAt(element1, 3, 3);
+ morphs[5] = dom.createMorphAt(element3, 1, 1);
+ morphs[6] = dom.createMorphAt(element3, 3, 3);
+ morphs[7] = dom.createMorphAt(dom.childAt(element2, [3]), 1, 1);
+ return morphs;
+ },
+ statements: [["content", "model.objectType", ["loc", [null, [4, 4], [4, 24]]]], ["block", "if", [["get", "model.isActive", ["loc", [null, [10, 10], [10, 24]]]]], [], 0, 1, ["loc", [null, [10, 4], [14, 11]]]], ["content", "model.resolutionStrategy", ["loc", [null, [19, 26], [19, 54]]]], ["content", "model.nVal", ["loc", [null, [24, 17], [24, 31]]]], ["block", "if", [["get", "model.quorumRelevant", ["loc", [null, [25, 10], [25, 30]]]]], [], 2, null, ["loc", [null, [25, 4], [34, 11]]]], ["content", "model.searchIndexHelp.name", ["loc", [null, [40, 4], [40, 34]]]], ["inline", "tooltip.bucket-props", [], ["itemKey", ["subexpr", "@mut", [["get", "model.searchIndexHelp.key", ["loc", [null, [42, 12], [42, 37]]]]], [], []], "itemDescription", ["subexpr", "@mut", [["get", "model.searchIndexHelp.description", ["loc", [null, [43, 20], [43, 53]]]]], [], []], "itemDefaultValue", ["subexpr", "@mut", [["get", "model.searchIndexHelp.default", ["loc", [null, [44, 21], [44, 50]]]]], [], []], "itemIsEditable", ["subexpr", "@mut", [["get", "model.searchIndexHelp.editable", ["loc", [null, [45, 19], [45, 49]]]]], [], []], "itemSchemaType", ["subexpr", "@mut", [["get", "model.searchIndexHelp.json_schema_type", ["loc", [null, [46, 19], [46, 57]]]]], [], []]], ["loc", [null, [41, 4], [46, 59]]]], ["block", "if", [["get", "model.index", ["loc", [null, [49, 10], [49, 21]]]]], [], 3, 4, ["loc", [null, [49, 4], [55, 11]]]]],
+ locals: [],
+ templates: [child0, child1, child2, child3, child4]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/table/bucket-types", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 13,
+ "column": 6
+ },
+ "end": {
+ "line": 15,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/bucket-types.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "bucketType.name", ["loc", [null, [14, 8], [14, 27]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 10,
+ "column": 0
+ },
+ "end": {
+ "line": 27,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/bucket-types.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 1, 1);
+ morphs[1] = dom.createMorphAt(dom.childAt(element0, [3]), 1, 1);
+ morphs[2] = dom.createMorphAt(dom.childAt(element0, [5, 1]), 0, 0);
+ morphs[3] = dom.createMorphAt(dom.childAt(element0, [7, 1]), 0, 0);
+ return morphs;
+ },
+ statements: [["block", "link.explorer-resource", [], ["resourceType", "bucket-type", "resourceObj", ["subexpr", "@mut", [["get", "bucketType", ["loc", [null, [13, 71], [13, 81]]]]], [], []], "linkClass", "cluster-resource-link"], 0, null, ["loc", [null, [13, 6], [15, 33]]]], ["content", "bucketType.objectType", ["loc", [null, [18, 6], [18, 31]]]], ["content", "bucketType.nVal", ["loc", [null, [21, 12], [21, 31]]]], ["content", "bucketType.resolutionStrategy", ["loc", [null, [24, 12], [24, 45]]]]],
+ locals: ["bucketType"],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 30,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/bucket-types.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("thead");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tr");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("th");
+ dom.setAttribute(el3, "class", "name");
+ var el4 = dom.createTextNode("Name");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("th");
+ dom.setAttribute(el3, "class", "object-type");
+ var el4 = dom.createTextNode("Object Type");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("th");
+ dom.setAttribute(el3, "class", "n-val");
+ var el4 = dom.createTextNode("n_val");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("th");
+ dom.setAttribute(el3, "class", "res-stategy");
+ var el4 = dom.createTextNode("Conflict Res. Strategy");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tbody");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "bucketTypes", ["loc", [null, [10, 8], [10, 19]]]]], [], 0, null, ["loc", [null, [10, 0], [27, 9]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/table/object-headers", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 0
+ },
+ "end": {
+ "line": 7,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/object-headers.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createElement("code");
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 0, 0);
+ morphs[1] = dom.createMorphAt(dom.childAt(element0, [3, 0]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "header.key", ["loc", [null, [4, 20], [4, 34]]]], ["content", "header.value", ["loc", [null, [5, 28], [5, 44]]]]],
+ locals: ["header"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 9,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/object-headers.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("tbody");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "headers", ["loc", [null, [2, 8], [2, 15]]]]], [], 0, null, ["loc", [null, [2, 0], [7, 9]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/table/object-version", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 14,
+ "column": 8
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/object-version.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("tbody");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tr");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("td");
+ dom.setAttribute(el3, "class", "key");
+ var el4 = dom.createTextNode("Last Modified:");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("td");
+ dom.setAttribute(el3, "class", "value");
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tr");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("td");
+ dom.setAttribute(el3, "class", "key");
+ var el4 = dom.createTextNode("Etag:");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("td");
+ dom.setAttribute(el3, "class", "value");
+ var el4 = dom.createElement("code");
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tr");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("td");
+ dom.setAttribute(el3, "class", "key");
+ var el4 = dom.createTextNode("Causal Context:");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("td");
+ dom.setAttribute(el3, "class", "value");
+ var el4 = dom.createElement("code");
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [0]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [1, 3]), 0, 0);
+ morphs[1] = dom.createMorphAt(dom.childAt(element0, [3, 3, 0]), 0, 0);
+ morphs[2] = dom.createMorphAt(dom.childAt(element0, [5, 3, 0]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "object.dateLastModified", ["loc", [null, [4, 20], [4, 47]]]], ["content", "object.etag", ["loc", [null, [8, 26], [8, 41]]]], ["content", "object.causalContext", ["loc", [null, [12, 26], [12, 50]]]]],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/table/search-indexes", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 12,
+ "column": 6
+ },
+ "end": {
+ "line": 14,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/search-indexes.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "index.name", ["loc", [null, [13, 8], [13, 22]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 17,
+ "column": 6
+ },
+ "end": {
+ "line": 19,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/search-indexes.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "index.schema.name", ["loc", [null, [18, 8], [18, 29]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 9,
+ "column": 0
+ },
+ "end": {
+ "line": 23,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/search-indexes.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ var el3 = dom.createElement("code");
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 1, 1);
+ morphs[1] = dom.createMorphAt(dom.childAt(element0, [3]), 1, 1);
+ morphs[2] = dom.createMorphAt(dom.childAt(element0, [5, 0]), 0, 0);
+ return morphs;
+ },
+ statements: [["block", "link.explorer-resource", [], ["resourceType", "index", "resourceObj", ["subexpr", "@mut", [["get", "index", ["loc", [null, [12, 65], [12, 70]]]]], [], []], "linkClass", "cluster-resource-link"], 0, null, ["loc", [null, [12, 6], [14, 33]]]], ["block", "link-to", ["search-schema", ["get", "index.cluster.name", ["loc", [null, [17, 33], [17, 51]]]], ["get", "index.schema.name", ["loc", [null, [17, 52], [17, 69]]]]], ["class", "btn btn-small btn-primary"], 1, null, ["loc", [null, [17, 6], [19, 18]]]], ["content", "index.nVal", ["loc", [null, [21, 14], [21, 28]]]]],
+ locals: ["index"],
+ templates: [child0, child1]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 23,
+ "column": 0
+ },
+ "end": {
+ "line": 25,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/search-indexes.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" No indexes found.\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 27,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/search-indexes.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("thead");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tr");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("th");
+ var el4 = dom.createTextNode("Index");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("th");
+ var el4 = dom.createTextNode("Schema");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("th");
+ var el4 = dom.createTextNode("n_val");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tbody");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "indexes", ["loc", [null, [9, 8], [9, 15]]]]], [], 0, 1, ["loc", [null, [9, 0], [25, 9]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/table/table-overview", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 9,
+ "column": 4
+ },
+ "end": {
+ "line": 11,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/table-overview.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "label label-success");
+ var el2 = dom.createTextNode("Active");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 11,
+ "column": 4
+ },
+ "end": {
+ "line": 13,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/table-overview.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "label label-default");
+ var el2 = dom.createTextNode("Inactive");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 20,
+ "column": 30
+ },
+ "end": {
+ "line": 20,
+ "column": 105
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/table-overview.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "item");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "key.name", ["loc", [null, [20, 86], [20, 98]]]]],
+ locals: ["key"],
+ templates: []
+ };
+ })();
+ var child3 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 27,
+ "column": 30
+ },
+ "end": {
+ "line": 27,
+ "column": 96
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/table-overview.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "item");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "key", ["loc", [null, [27, 82], [27, 89]]]]],
+ locals: ["key"],
+ templates: []
+ };
+ })();
+ var child4 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 44,
+ "column": 6
+ },
+ "end": {
+ "line": 51,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/table-overview.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ var el3 = dom.createElement("code");
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ var el3 = dom.createElement("code");
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ var el3 = dom.createElement("code");
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ var el3 = dom.createElement("code");
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(4);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [1, 0]), 0, 0);
+ morphs[1] = dom.createMorphAt(dom.childAt(element0, [3, 0]), 0, 0);
+ morphs[2] = dom.createMorphAt(dom.childAt(element0, [5, 0]), 0, 0);
+ morphs[3] = dom.createMorphAt(dom.childAt(element0, [7, 0]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "column.name", ["loc", [null, [46, 20], [46, 35]]]], ["content", "column.type", ["loc", [null, [47, 20], [47, 35]]]], ["content", "column.position", ["loc", [null, [48, 20], [48, 39]]]], ["content", "column.optional", ["loc", [null, [49, 20], [49, 39]]]]],
+ locals: ["column"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 57,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/table-overview.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("Table Name");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("Activated");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("Partition Key");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ dom.setAttribute(el3, "class", "comma-list");
+ var el4 = dom.createTextNode("[");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("]");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("Local Key");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ dom.setAttribute(el3, "class", "comma-list");
+ var el4 = dom.createTextNode("[");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("]");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "key");
+ var el3 = dom.createTextNode("Columns");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ dom.setAttribute(el2, "class", "value");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("table");
+ dom.setAttribute(el3, "class", "table");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("thead");
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createElement("tr");
+ var el6 = dom.createTextNode("\n ");
+ dom.appendChild(el5, el6);
+ var el6 = dom.createElement("th");
+ var el7 = dom.createTextNode("Name");
+ dom.appendChild(el6, el7);
+ dom.appendChild(el5, el6);
+ var el6 = dom.createTextNode("\n ");
+ dom.appendChild(el5, el6);
+ var el6 = dom.createElement("th");
+ var el7 = dom.createTextNode("Type");
+ dom.appendChild(el6, el7);
+ dom.appendChild(el5, el6);
+ var el6 = dom.createTextNode("\n ");
+ dom.appendChild(el5, el6);
+ var el6 = dom.createElement("th");
+ var el7 = dom.createTextNode("position");
+ dom.appendChild(el6, el7);
+ dom.appendChild(el5, el6);
+ var el6 = dom.createTextNode("\n ");
+ dom.appendChild(el5, el6);
+ var el6 = dom.createElement("th");
+ var el7 = dom.createTextNode("optional");
+ dom.appendChild(el6, el7);
+ dom.appendChild(el5, el6);
+ var el6 = dom.createTextNode("\n ");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("\n ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("tbody");
+ var el5 = dom.createTextNode("\n");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode(" ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(5);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0, 3]), 0, 0);
+ morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2, 3]), 1, 1);
+ morphs[2] = dom.createMorphAt(dom.childAt(fragment, [4, 3, 1]), 1, 1);
+ morphs[3] = dom.createMorphAt(dom.childAt(fragment, [6, 3, 1]), 1, 1);
+ morphs[4] = dom.createMorphAt(dom.childAt(fragment, [8, 3, 1, 3]), 1, 1);
+ return morphs;
+ },
+ statements: [["content", "table.name", ["loc", [null, [3, 20], [3, 34]]]], ["block", "if", [["get", "table.isActive", ["loc", [null, [9, 10], [9, 24]]]]], [], 0, 1, ["loc", [null, [9, 4], [13, 11]]]], ["block", "each", [["get", "table.partitionKey", ["loc", [null, [20, 38], [20, 56]]]]], [], 2, null, ["loc", [null, [20, 30], [20, 114]]]], ["block", "each", [["get", "table.localKey", ["loc", [null, [27, 38], [27, 52]]]]], [], 3, null, ["loc", [null, [27, 30], [27, 105]]]], ["block", "each", [["get", "table.columns", ["loc", [null, [44, 14], [44, 27]]]]], [], 4, null, ["loc", [null, [44, 6], [51, 15]]]]],
+ locals: [],
+ templates: [child0, child1, child2, child3, child4]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/table/ts-table-reference", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 5,
+ "column": 32
+ },
+ "end": {
+ "line": 5,
+ "column": 113
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/ts-table-reference.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "item");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "column.name", ["loc", [null, [5, 91], [5, 106]]]]],
+ locals: ["column"],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 11,
+ "column": 32
+ },
+ "end": {
+ "line": 11,
+ "column": 104
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/ts-table-reference.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "item");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "column", ["loc", [null, [11, 87], [11, 97]]]]],
+ locals: ["column"],
+ templates: []
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 18,
+ "column": 98
+ },
+ "end": {
+ "line": 18,
+ "column": 131
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/ts-table-reference.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(", optional");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 18,
+ "column": 9
+ },
+ "end": {
+ "line": 18,
+ "column": 151
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/ts-table-reference.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "item");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("(");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("em");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(")");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [0]);
+ var element1 = dom.childAt(element0, [2]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(element0, 0, 0);
+ morphs[1] = dom.createMorphAt(element1, 0, 0);
+ morphs[2] = dom.createMorphAt(element1, 1, 1);
+ return morphs;
+ },
+ statements: [["content", "column.name", ["loc", [null, [18, 63], [18, 78]]]], ["content", "column.type", ["loc", [null, [18, 83], [18, 98]]]], ["block", "if", [["get", "column.optional", ["loc", [null, [18, 104], [18, 119]]]]], [], 0, null, ["loc", [null, [18, 98], [18, 138]]]]],
+ locals: ["column"],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 24,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/ts-table-reference.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("tbody");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tr");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("td");
+ dom.setAttribute(el3, "class", "key");
+ var el4 = dom.createTextNode("Primary Key");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("td");
+ dom.setAttribute(el3, "class", "value");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("code");
+ dom.setAttribute(el4, "class", "comma-list");
+ var el5 = dom.createTextNode("[");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("]");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tr");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("td");
+ dom.setAttribute(el3, "class", "key");
+ var el4 = dom.createTextNode("Local Key");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("td");
+ dom.setAttribute(el3, "class", "value");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("code");
+ dom.setAttribute(el4, "class", "comma-list");
+ var el5 = dom.createTextNode("[");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("]");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tr");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("td");
+ dom.setAttribute(el3, "class", "key");
+ var el4 = dom.createTextNode("Table Columns");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("td");
+ dom.setAttribute(el3, "class", "value");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("code");
+ dom.setAttribute(el4, "class", "comma-list");
+ var el5 = dom.createTextNode("\n [");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createComment("");
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode("]\n ");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element2 = dom.childAt(fragment, [0]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(dom.childAt(element2, [1, 3, 1]), 1, 1);
+ morphs[1] = dom.createMorphAt(dom.childAt(element2, [3, 3, 1]), 1, 1);
+ morphs[2] = dom.createMorphAt(dom.childAt(element2, [5, 3, 1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "table.partitionKey", ["loc", [null, [5, 40], [5, 58]]]]], [], 0, null, ["loc", [null, [5, 32], [5, 122]]]], ["block", "each", [["get", "table.localKey", ["loc", [null, [11, 40], [11, 54]]]]], [], 1, null, ["loc", [null, [11, 32], [11, 113]]]], ["block", "each", [["get", "table.columns", ["loc", [null, [18, 17], [18, 30]]]]], [], 2, null, ["loc", [null, [18, 9], [18, 160]]]]],
+ locals: [],
+ templates: [child0, child1, child2]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/table/ts-tables", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 12,
+ "column": 6
+ },
+ "end": {
+ "line": 14,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/ts-tables.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "table.name", ["loc", [null, [13, 8], [13, 22]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 20,
+ "column": 32
+ },
+ "end": {
+ "line": 20,
+ "column": 111
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/ts-tables.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "item");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "field.name", ["loc", [null, [20, 90], [20, 104]]]]],
+ locals: ["field"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 9,
+ "column": 0
+ },
+ "end": {
+ "line": 23,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/ts-tables.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tr");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("td");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ dom.setAttribute(el3, "class", "comma-list");
+ var el4 = dom.createTextNode("[");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("]");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 1, 1);
+ morphs[1] = dom.createMorphAt(dom.childAt(element0, [3, 1]), 0, 0);
+ morphs[2] = dom.createMorphAt(dom.childAt(element0, [5, 1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["table", ["get", "table.cluster.name", ["loc", [null, [12, 25], [12, 43]]]], ["get", "table.name", ["loc", [null, [12, 44], [12, 54]]]]], ["class", "cluster-resource-link"], 0, null, ["loc", [null, [12, 6], [14, 18]]]], ["content", "table.nVal", ["loc", [null, [17, 12], [17, 26]]]], ["block", "each", [["get", "table.partitionKey", ["loc", [null, [20, 40], [20, 58]]]]], [], 1, null, ["loc", [null, [20, 32], [20, 120]]]]],
+ locals: ["table"],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 26,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/table/ts-tables.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("thead");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tr");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("th");
+ dom.setAttribute(el3, "class", "name");
+ var el4 = dom.createTextNode("Name");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("th");
+ dom.setAttribute(el3, "class", "n-val");
+ var el4 = dom.createTextNode("n_val");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("th");
+ dom.setAttribute(el3, "class", "partition-key");
+ var el4 = dom.createTextNode("Partition Key");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("tbody");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "tables", ["loc", [null, [9, 8], [9, 14]]]]], [], 0, null, ["loc", [null, [9, 0], [23, 9]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define('ember-riak-explorer/templates/components/tether-dialog', ['exports', 'ember-modal-dialog/templates/components/tether-dialog'], function (exports, _emberModalDialogTemplatesComponentsTetherDialog) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberModalDialogTemplatesComponentsTetherDialog['default'];
+ }
+ });
+});
+define("ember-riak-explorer/templates/components/tooltip/bucket-props", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 2,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/tooltip/bucket-props.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [1, 0], [1, 9]]]]],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/tooltip/node-config", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 2,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/tooltip/node-config.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [1, 0], [1, 9]]]]],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/tooltip/node-stats", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 2,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/tooltip/node-stats.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [1, 0], [1, 9]]]]],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/view-label", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 0
+ },
+ "end": {
+ "line": 2,
+ "column": 30
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/view-label.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["content", "pre-label", ["loc", [null, [2, 17], [2, 30]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 37
+ },
+ "end": {
+ "line": 2,
+ "column": 61
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/view-label.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(": ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["content", "label", ["loc", [null, [2, 52], [2, 61]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 5,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/view-label.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "pre-label", ["loc", [null, [2, 6], [2, 15]]]]], [], 0, null, ["loc", [null, [2, 0], [2, 37]]]], ["block", "if", [["get", "label", ["loc", [null, [2, 43], [2, 48]]]]], [], 1, null, ["loc", [null, [2, 37], [2, 68]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/components/wrapper-panel", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "triple-curlies"
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 6,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/components/wrapper-panel.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "wrapper-panel");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("div");
+ dom.setAttribute(el2, "class", "row");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0, 1]), 1, 1);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [3, 4], [3, 13]]]]],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/templates/partials/cached-lists", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 29,
+ "column": 4
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/partials/cached-lists.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("h3");
+ var el2 = dom.createTextNode("What are these?");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "alert alert-info");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("ul");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("li");
+ var el4 = dom.createTextNode("\n Cached lists are files saved to disk that represent all items at the time that list was created.\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("li");
+ var el4 = dom.createTextNode("\n Creating these lists are extremely expensive operations, and are only allowed in development mode.\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("li");
+ var el4 = dom.createTextNode("\n Because these lists are cached, they may not reflect the current state of the cluster.\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("\n Listing all instances of a resource (i.e all buckets, keys, table rows, etc.) in Riak requires making a streaming\n call, with multiple response messages sent for each request. Anytime a streaming call is made in Explorer, that\n response is saved to disk and time-stamped. Explorer then reads from the most current copy to\n populate these collections.\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("\n Streaming calls are expensive operations, and in some cases have the ability to bring a node(s) down. Due to this,\n cached\n lists can only be created when a cluster is in develoment mode. Even in development mode, proceed with caution when\n requesting a new list.\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/templates/partials/topbar", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 4,
+ "column": 2
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/partials/topbar.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("img");
+ dom.setAttribute(el1, "src", "assets/images/sample_logo.png");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 8,
+ "column": 6
+ },
+ "end": {
+ "line": 11,
+ "column": 6
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/partials/topbar.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ion-help-circled");
+ dom.setAttribute(el1, "aria-hidden", "true");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n Help Section\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "triple-curlies"
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 15,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/partials/topbar.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("nav");
+ dom.setAttribute(el1, "class", "topbar");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("ul");
+ dom.setAttribute(el2, "class", "topbar-nav");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("li");
+ dom.setAttribute(el3, "class", "topbar-nav-item");
+ var el4 = dom.createTextNode("\n");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createComment("");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode(" ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [0]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(element0, 1, 1);
+ morphs[1] = dom.createMorphAt(dom.childAt(element0, [3, 1]), 1, 1);
+ return morphs;
+ },
+ statements: [["block", "link-to", ["application"], ["class", "logo"], 0, null, ["loc", [null, [2, 2], [4, 14]]]], ["block", "link-to", ["help"], [], 1, null, ["loc", [null, [8, 6], [11, 18]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })());
+});
+define("ember-riak-explorer/templates/partials/ts-planning-guidelines", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 184,
+ "column": 226
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/partials/ts-planning-guidelines.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "alert alert-info");
+ var el2 = dom.createTextNode("The information below is pulled from \"Planning Your Riak TS Table\" in the ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "href", "http://docs.basho.com/riak/ts/1.3.0/using/planning/");
+ dom.setAttribute(el2, "target", "_blank");
+ var el3 = dom.createTextNode("Basho Docs");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("This page provides a basic overview of what you’ll need and some guidelines/limitations. For a deeper dive into planning and designing Riak TS tables, check out ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "target", "_blank");
+ dom.setAttribute(el2, "href", "http://docs.basho.com/riak/ts/1.3.0/learn-about/tablearchitecture/");
+ var el3 = dom.createTextNode("Table Architecture");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(".");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Riak TS tables are closely tied to SQL tables. If you are unfamiliar with SQL or would like to know more about how Riak TS integrates SQL, check out ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "target", "_blank");
+ dom.setAttribute(el2, "href", "http://docs.basho.com/riak/ts/1.3.0/learn-about/sqlriakts/");
+ var el3 = dom.createTextNode("SQL for Riak TS");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(".");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h2");
+ var el2 = dom.createTextNode("Anatomy of a Schema");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("In order to create a working Riak TS table, you'll need to plan your table out. Once created, your table cannot be changed. Here is an example Riak TS ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("CREATE TABLE");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" statement (broken across many lines for clarity):");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("CREATE TABLE GeoCheckin\n(\n region VARCHAR not null,\n state VARCHAR not null,\n time TIMESTAMP not null,\n weather VARCHAR not null,\n temperature DOUBLE,\n PRIMARY KEY (\n (region, state, QUANTUM(time, 15, 'm')),\n region, state, time\n )\n)");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("While the keywords appear in all uppercase letters here, they can be specified using lowercase or uppercase letters as they are not case sensitive.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createTextNode("Column Definitions");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Column definitions are the lines preceding the ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("PRIMARY KEY");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" in the example. Column definitions define the structure of the data. They are comprised of three parts: a column name, a data type, and (optionally) an inline constraint.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("column_name data_type [NOT NULL],");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Column names (");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("region");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(", ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("state");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(", etc) must be ASCII strings, in addition to having the correct case. If column names need to contain spaces or punctuation they can be double quoted.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Any column names specified as part of the primary key must be defined as ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("NOT NULL");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(".");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("The column definitions for the keys can be specified in any order in the ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("CREATE TABLE");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" statement. For instance both are correct:");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createElement("strong");
+ var el3 = dom.createTextNode("A.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("CREATE TABLE GeoCheckin\n(\n region VARCHAR NOT NULL,\n state VARCHAR NOT NULL,\n time TIMESTAMP NOT NULL,\n weather VARCHAR NOT NULL,\n temperature DOUBLE,\n PRIMARY KEY (\n (region, state, QUANTUM(time, 15, 'm')),\n region, state, time\n )\n)");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createElement("strong");
+ var el3 = dom.createTextNode("B.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("CREATE TABLE GeoCheckin\n(\n time TIMESTAMP NOT NULL,\n state VARCHAR NOT NULL,\n weather VARCHAR NOT NULL,\n region VARCHAR NOT NULL,\n temperature DOUBLE,\n PRIMARY KEY (\n (region, state, QUANTUM(time, 15, 'm')),\n region, state, time\n )\n)");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("The data types in column definitions are limited. Valid types are:");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("VARCHAR");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" - Any string content is valid, including Unicode. Can only be compared using strict equality, and will not be typecast (e.g., to an integer) for comparison purposes. Use single quotes to delimit varchar strings.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("BOOLEAN");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" - ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("true");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" or ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("false");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" (any case)");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("TIMESTAMP");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" - Timestamps are integer values expressing [UNIX epoch time in UTC][epoch] in milliseconds. Zero is not a valid timestamp.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("SINT64");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" - Signed 64-bit integer");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("DOUBLE");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" - This type does not comply with its IEEE specification: ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("NaN");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" (not a number) and ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("INF");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" (infinity) cannot be used.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h3");
+ var el2 = dom.createTextNode("Primary Key");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("The ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("PRIMARY KEY");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" describes both the partition key and local key. The partition key is a prefix of the local key, consisting of one or more column names. The local key must begin with the same column names as the partition key, but may also contain additional column names.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("CREATE TABLE GeoCheckin\n(\n region VARCHAR NOT NULL,\n state VARCHAR NOT NULL,\n time TIMESTAMP NOT NULL,\n weather VARCHAR NOT NULL,\n temperature DOUBLE,\n PRIMARY KEY (\n (region, state, QUANTUM(time, 15, 'm')), <-- PARTITION KEY\n region, state, time <-- LOCAL KEY\n )\n)");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("The column definitions for the ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("PRIMARY KEY");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" can be specified in any order in the ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("CREATE TABLE");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" statement. For instance both are correct:");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createElement("strong");
+ var el3 = dom.createTextNode("A.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("CREATE TABLE GeoCheckin\n(\n region VARCHAR NOT NULL,\n state VARCHAR NOT NULL,\n time TIMESTAMP NOT NULL,\n weather VARCHAR NOT NULL,\n temperature DOUBLE,\n PRIMARY KEY (\n (region, state, QUANTUM(time, 15, 'm')),\n region, state, time\n )\n)");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createElement("strong");
+ var el3 = dom.createTextNode("B.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("CREATE TABLE GeoCheckin\n(\n region VARCHAR NOT NULL,\n state VARCHAR NOT NULL,\n time TIMESTAMP NOT NULL,\n weather VARCHAR NOT NULL,\n temperature DOUBLE,\n PRIMARY KEY (\n (state, region, QUANTUM(time, 15, 'm')),\n state, region, time\n )\n)");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createTextNode("Partition Key");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("The partition key is the first element of the primary key, and is defined as a list of column names and quantum in parentheses. The partition key must have at least one column name and a quantum.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("The quantum is used to colocate data on one of the partition key's timestamp columns:");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("PRIMARY KEY (\n (region, state, QUANTUM(time, 1, 's')),\n ...\n)");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Only one quantum function may be specified and it must be the last element of the partition key.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("The quantum function takes 3 parameters:");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("the name of a column in the table definition of type ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("TIMESTAMP");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("a quantity as a positive integer, greater than zero.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("a unit of time:\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("ul");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("li");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("'d'");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode(" - days");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("li");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("'h'");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode(" - hours");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("li");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("'m'");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode(" - minutes");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("li");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("'s'");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ var el5 = dom.createTextNode(" - seconds");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("A general guideline to get you started if you are not sure how best to structure your partition key is to first choose a column name that represents a class or type of data, and then choose a second column name represents is a more specific instance(s) of the class/type.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createTextNode("Local Key");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("The local key comes after the partition key. It must first contain the same column names in the same order as the partition key. This ensures that the same column names determining your data's partition also dictate the sorting of the data within that partition.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("The local key may also contain additional column names so long as they come after the column names present in the partition key. For example:");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("PRIMARY KEY (\n (region, state, QUANTUM(time, 15, 'm')),\n region, state, time, weather, temperature\n)");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h2");
+ var el2 = dom.createTextNode("Schema Discovery");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("After creating a table, its schema can be discovered with the ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("DESCRIBE");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" statement:");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("DESCRIBE GeoCheckin");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("The ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("DESCRIBE");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" statement will return the following:");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createElement("strong");
+ var el4 = dom.createTextNode("Column");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(", column name;");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createElement("strong");
+ var el4 = dom.createTextNode("Type");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(", data type;");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createElement("strong");
+ var el4 = dom.createTextNode("Is Null");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(", ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("em");
+ var el4 = dom.createTextNode("true");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" if the column is optional, ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("em");
+ var el4 = dom.createTextNode("false");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" otherwise;");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createElement("strong");
+ var el4 = dom.createTextNode("Primary Key");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(", position of this column in the primary key, or blank if it does not appear in the key;");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createElement("strong");
+ var el4 = dom.createTextNode("Local Key");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(", position of this column in the local key, or blank if it does not appear in the key.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h2");
+ var el2 = dom.createTextNode("More information");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Still unsure how best to structure your Riak TS table? Check out our ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "href", "http://docs.basho.com/riak/ts/1.3.0/learn-about/bestpractices/");
+ dom.setAttribute(el2, "target", "_blank");
+ var el3 = dom.createTextNode("best practice recommendations");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(".");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Confused about column definition, primary key, etc? Check out ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "href", "http://docs.basho.com/riak/ts/1.3.0/learn-about/tablearchitecture/");
+ dom.setAttribute(el2, "target", "_blank");
+ var el3 = dom.createTextNode("Table Architecture");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" for an in-depth explanation of TS tables.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/templates/partials/ts-query-guidelines", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 237,
+ "column": 62
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/partials/ts-query-guidelines.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "alert alert-info");
+ var el2 = dom.createTextNode("\n For more information on querying, check out our ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "target", "_blank");
+ dom.setAttribute(el2, "href", "http://docs.basho.com/riak/ts/1.3.0/using/querying/");
+ dom.setAttribute(el2, "target", "_blank");
+ var el3 = dom.createTextNode("docs");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(".\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h2");
+ var el2 = dom.createTextNode("Basic Querying");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("You query data via columns. There are three categories of column, each with a different set of rules for valid queries. Query columns are based on rows in your TS table.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("CREATE TABLE tab2\n(\n a SINT64 NOT NULL,\n b TIMESTAMP NOT NULL,\n c BOOLEAN NOT NULL,\n PRIMARY KEY(\n (a, QUANTUM(b, 1, 's'))<-Partition Key, a,b,c<-Local Key\n )\n)");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h3");
+ var el2 = dom.createTextNode("Partition Key");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("All queries must cover the partition key.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("The query must use greater than and less than (>, >=, <, <=).");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("The timestamp in the partition key is an integer (in milliseconds) that must be compared either as a fully-enclosed range or as an exact match.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("Valid: ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("time > 1449864277000 and time < 1449864290000");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("Invalid: ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("time > 1449864277000");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("Invalid: ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("time > 1449864277000 or time < 1449864290000");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h3");
+ var el2 = dom.createTextNode("Local Key");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Column names that are in the local key but not in the partition key are not required for the query.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("PRIMARY KEY ((a,b),a,b,c)");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Here 'c' is in the local key only so does not have to be in the query.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Column names from the local key must be compared using strict equality against literal values. No ranges are permitted, ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("!=");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" must not be used, and ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("or");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" will not work.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("Valid: ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("country_code = 'uk'");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("Invalid: ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("(country_code = 'uk' or country_code = 'de')");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("Invalid: ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("country_code != 'se'");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("Invalid: ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("temperature < 85.0");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h3");
+ var el2 = dom.createTextNode("Column Definitions");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "href", "http://docs.basho.com/riak/ts/1.3.0/using/planning/#column-definitions");
+ dom.setAttribute(el2, "target", "_blank");
+ var el3 = dom.createTextNode("Column definitions");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" may be queried with unbounded ranges, ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("!=");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(", and ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("or");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" comparisons.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h3");
+ var el2 = dom.createTextNode("General Guidelines");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Before you begin querying, there are some guidelines to keep in mind.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("Columns may not be compared against other columns in the query.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("When using ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("or");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(", you must surround the expression with parentheses or your query will return an error.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Basic queries return the full range of values between two given times for an instance within a class or type of data. To demonstrate, we'll use the same example table, in which the ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("state");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" is an instance within the ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("region");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(":");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("CREATE TABLE GeoCheckin\n(\n region VARCHAR NOT NULL,\n state VARCHAR NOT NULL,\n time TIMESTAMP NOT NULL,\n weather VARCHAR NOT NULL,\n temperature DOUBLE,\n PRIMARY KEY (\n (region, state, QUANTUM(time, 15, 'm')),\n region, state, time\n )\n)");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Your query must include all components of the partition key. If any part of the partition key is missing, you will get an error.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h2");
+ var el2 = dom.createTextNode("Advanced Querying By Column");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h3");
+ var el2 = dom.createTextNode("Select Query");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("You can select particular columns from the data to query:");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("select weather, temperature from GeoCheckin where time > 1234560 and time < 1234569 and region = 'South Atlantic' and state = 'South Carolina'");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h3");
+ var el2 = dom.createTextNode("Extended Query");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("You can extend the query beyond the primary key and use secondary columns to filter results. In this example, we are extending our query to filter based on ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("temperature");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(":");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("select weather, temperature from GeoCheckin where time > 1234560 and time < 1234569 and region = 'South Atlantic' and state = 'South Carolina' and temperature > 27.0");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("You can also use ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("or");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" when querying against column values, such as ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("temperature");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" in our example. Note that the parentheses are required:");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("select weather, temperature from GeoCheckin where time > 1234560 and time < 1234569 and region = 'South Atlantic' and state = 'South Carolina' and (temperature > 27.0 or temperature < 0.0)");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("You cannot use ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("or");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" between two complete clauses, since keys cannot be specified twice.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h3");
+ var el2 = dom.createTextNode("SQL Injection");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("When querying with user-supplied data, it is essential that you protect against SQL injection. Please verify the user-supplied data before constructing queries.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h2");
+ var el2 = dom.createTextNode("SQL Support");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("A small subset of SQL is supported. The following operators are supported for each data type:");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("table");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("thead");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("=");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("!=");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("<");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("<=");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode(">=");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("tbody");
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("varchar");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("boolean");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("sint64");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("double");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("tr");
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("timestamp");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ var el4 = dom.createElement("td");
+ var el5 = dom.createElement("code");
+ var el6 = dom.createTextNode("x");
+ dom.appendChild(el5, el6);
+ dom.appendChild(el4, el5);
+ dom.appendChild(el3, el4);
+ var el4 = dom.createTextNode("\n ");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode("\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h3");
+ var el2 = dom.createTextNode("Limitations");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("Column to column comparisons are not currently supported.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("Secondary indexing (2i) will not work with Riak TS.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("Riak Search will not work with Riak TS.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("Queries are limited by the number of quanta they can span when specifying the time limits.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createTextNode("Quanta query range");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("A query covering more than a certain number of quanta (5 by default) will generate too many sub-queries and the query system will refuse to run it. Assuming a default quantum of 15 minutes, the maximum query time range is 75 minutes.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("In the below example we set a quantum of 15s:");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("CREATE TABLE GeoCheckin\n(\n geohash VARCHAR NOT NULL,\n location VARCHAR NOT NULL,\n user VARCHAR NOT NULL,\n time TIMESTAMP NOT NULL,\n weather VARCHAR NOT NULL,\n temperature VARCHAR,\n PRIMARY KEY(\n (location, user, QUANTUM(time, 15, 's')),\n location, user, time\n )\n)");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("The maximum time range we can query is 60s, anything beyond will fail.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("See the Data Modeling section in ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "href", "http://docs.basho.com/riak/ts/1.3.0/learn-about/tablearchitecture/");
+ dom.setAttribute(el2, "target", "_blank");
+ var el3 = dom.createTextNode("Table Architecture");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" for more information.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createTextNode("Leap seconds and quantum boundaries");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("\n Periodically ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "href", "https://en.wikipedia.org/wiki/Leap_second");
+ dom.setAttribute(el2, "target", "_blank");
+ var el3 = dom.createTextNode("leap seconds");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n are announced. These are inserted at the end of one day (in UTC).\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("UNIX treats them as one double-length second. For example, at the end of 1998 a second was added:");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("Date Time of day UNIX time\n1998-12-31 23:59:58 915148798\n1998-12-31 23:59:59 915148799\n1998-12-31 23:59:60 915148800 <== Artificial leap second\n1999-01-01 00:00:00 915148800");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Effectively, there is no way in the UNIX time scheme to differentiate an event that occurred during the extra second at the end of 1998 to something that occurred the first second of 1999.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Similarly, Riak TS would treat ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("915148800");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" as the start of a new time quantum, and any data points which a client added for that second would be considered to be in the first time quantum in 1999.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("The data is not lost, but a query against 1998 time quanta will not produce those data points despite the fact that some of the events flagged as ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("915148800");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" technically occurred in 1998.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h2");
+ var el2 = dom.createTextNode("Querying Tables");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h3");
+ var el2 = dom.createTextNode("Query a table with SQL");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Query a table by issuing a SQL statement against the table. Your query MUST include a 'where' clause with all components.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h3");
+ var el2 = dom.createTextNode("Query a table definition");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("You can now query a table definition with the ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("DESCRIBE");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" table query which returns the table's information in rows and columns.");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("For example:");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("DESCRIBE GeoCheckin");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("Returns:");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("pre");
+ var el2 = dom.createTextNode("Column | Type | Is Null | Partition Key | Local Key\nregion | varchar | false | 1 | 1\nstate | varchar | false | 2 | 2\ntime | timestamp | false | 3 | 3\nweather | varchar | false | null | null\ntemperature | double | false | null | null");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/templates/partials/ts-table-write-guidelines", ["exports"], function (exports) {
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 43,
+ "column": 0
+ }
+ },
+ "moduleName": "ember-riak-explorer/templates/partials/ts-table-write-guidelines.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "alert alert-info");
+ var el2 = dom.createTextNode("\n For more information on writing data to tables, check out our ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "href", "http://docs.basho.com/riak/ts/1.3.0/using/writingdata/");
+ dom.setAttribute(el2, "target", "_blank");
+ var el3 = dom.createTextNode("docs");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(".\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createTextNode("Table Write Editor");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("Each row you wish to insert should be represented as an array of column values, separated by a comma");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("Row column values must be in the same order as defined in the table. Refer to the table columns in the table\n reference for order.\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("If a table column is optional, and you do not wish to pass a value for that write instance, use ");
+ dom.appendChild(el2, el3);
+ var el3 = dom.createElement("code");
+ var el4 = dom.createTextNode("null");
+ dom.appendChild(el3, el4);
+ dom.appendChild(el2, el3);
+ var el3 = dom.createTextNode(" as the array value.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createTextNode("General Guidelines");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("Batches should not be too large. Our testing revealed 100 rows per write as a sweet spot, but you should expect\n different results depending on your hardware and schema.\n ");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("Writes will assume that columns are in the same order as they’ve been declared in the table.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("li");
+ var el3 = dom.createTextNode("Timestamps should be in Unix epoch/UTC milliseconds.");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("h4");
+ var el2 = dom.createTextNode("Tuning batches");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("\n Batches of data from a single write are packaged for delivery to each destination server as a performance\n optimization. For Enterprise customers using ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "href", "http://docs.basho.com/riak/ts/1.3.0/using/mdc/");
+ dom.setAttribute(el2, "target", "_blank");
+ var el3 = dom.createTextNode("MDC");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(",\n those batches are sent to the remote cluster via realtime sync.\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("\n It is possible to specify an approximate largest-batch size for tuning purposes. By default, batches have a soft cap\n size of 1MB of data, which we’ve found to be a reasonable size to avoid network congestion.\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("p");
+ var el2 = dom.createTextNode("\n If you want to adjust that value, the configuration parameter ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("timeseries_max_batch_size");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" under ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("code");
+ var el3 = dom.createTextNode("riak_kv");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n in ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("a");
+ dom.setAttribute(el2, "href", "http://docs.basho.com/riak/kv/2.1.4/configuring/reference/#the-advanced-config-file");
+ dom.setAttribute(el2, "target", "_blank");
+ var el3 = dom.createTextNode("advanced.config");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n can be defined. The value is in bytes.\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ember-riak-explorer/utils/data-type-checks", ["exports"], function (exports) {
+ exports.isNumber = isNumber;
+ exports.isInteger = isInteger;
+ exports.isFloat = isFloat;
+
+ function isNumber(n) {
+ return !isNaN(parseFloat(n)) && isFinite(n);
+ }
+
+ function isInteger(n) {
+ return isNumber(n) && n === +n && n === (n | 0);
+ }
+
+ function isFloat(n) {
+ return isNumber(n) && n === +n && (n !== (n | 0) || n === (n | 0));
+ }
+});
+define('ember-riak-explorer/utils/parse-header', ['exports'], function (exports) {
+ exports['default'] = parseHeaderString;
+ /**
+ * Parses the raw AJAX headers string and returns it as a usable hash.
+ *
+ * XmlHttpRequest's getAllResponseHeaders() method returns a string of response
+ * headers according to the format described here:
+ * http://www.w3.org/TR/XMLHttpRequest/#the-getallresponseheaders-method
+ *
+ * Which we then have to parse. Like savages.
+ *
+ * @method parseHeaderString
+ * @param {String} headerString
+ * @return {Hash} headers
+ */
+
+ function parseHeaderString(headerString) {
+ var other_headers = {};
+ var indexes = [];
+ var custom = [];
+
+ var headerLines = headerString.split("\r\n");
+
+ for (var i = 0; i < headerLines.length; i++) {
+ var headerLine = headerLines[i];
+
+ // Can't use split() here because it does the wrong thing
+ // if the header value has the string ": " in it.
+ var index = headerLine.indexOf(': ');
+ if (index > 0) {
+ var key = headerLine.substring(0, index).toLowerCase();
+ var val = headerLine.substring(index + 2);
+ var header = {
+ key: key,
+ value: val
+ };
+
+ if (key.startsWith('x-riak-meta')) {
+ custom.push(header);
+ } else if (key.startsWith('x-riak-index')) {
+ indexes.push(header);
+ } else {
+ other_headers[key] = val;
+ }
+ }
+ }
+
+ return {
+ other: other_headers,
+ indexes: indexes,
+ custom: custom
+ };
+ }
+});
+define('ember-riak-explorer/utils/render-tooltip', ['exports', 'ember-tooltips/utils/render-tooltip'], function (exports, _emberTooltipsUtilsRenderTooltip) {
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberTooltipsUtilsRenderTooltip['default'];
+ }
+ });
+});
+define("ember-riak-explorer/utils/riak-help/bucket_props", ["exports"], function (exports) {
+ exports["default"] = {
+ "active": {
+ "default": true,
+ "description": "Has this bucket type been activated?",
+ "editable": false,
+ "json_schema_type": "boolean",
+ "name": "Activated"
+ },
+ "allow_mult": {
+ "default": true,
+ "description": "Are siblings (multiple object versions) created during write conflicts that cannot be automatically resolved?",
+ "editable": true,
+ "json_schema_type": "boolean",
+ "name": "Siblings Enabled"
+ },
+ "backend": {
+ "default": "*",
+ "description": "Name of the custom backend (specified in Riak config) to use for this bucket.",
+ "editable": true,
+ "json_schema_type": "string",
+ "name": "Custom Data Backend"
+ },
+ "basic_quorum": {
+ "default": false,
+ "description": "The Basic Quorum optimization will short-circuit fetches where the majority of replicas report that the key is not found. Only used when notfound_ok is set to false, to reduce latency in read-heavy cases.",
+ "editable": true,
+ "json_schema_type": "boolean",
+ "name": "Basic Quorum"
+ },
+ "big_vclock": {
+ "default": 50,
+ "description": "If the length of the vector clock list is larger than this value, the list will be pruned.",
+ "editable": true,
+ "json_schema_type": "integer",
+ "name": "Big VClock Pruning"
+ },
+ "chash_keyfun": {
+ "default": {
+ "fun": "chash_std_keyfun",
+ "mod": "riak_core_util"
+ },
+ "description": "(Deprecated) Consistent Hashing function",
+ "editable": false,
+ "json_schema_type": "object",
+ "name": "Consistent Hash Function"
+ },
+ "claimant": {
+ "default": "riak@127.0.0.1",
+ "description": "The id of the node responsible for processing cluster-wide operations (such as adding or removing nodes, creating bucket types, or re-distributing partitions).",
+ "editable": false,
+ "json_schema_type": "string",
+ "name": "Claimant Node"
+ },
+ "datatype": {
+ "default": "*",
+ "description": "Has this bucket been created to store Riak Data Types (CRDTs)?",
+ "editable": false,
+ "json_schema_type": "string",
+ "name": "Data Type (CRDT)",
+ "valid_options": [["counter", "Counter"], ["map", "Map"], ["set", "Set"]]
+ },
+ "dvv_enabled": {
+ "default": "false",
+ "description": "Are Dotted Version Vectors used for conflict resolution instead of the older mechanism, Vector Clocks? Should be set to true if using Siblings.",
+ "editable": true,
+ "json_schema_type": "boolean",
+ "name": "DVV Enabled"
+ },
+ "dw": {
+ "default": "quorum",
+ "description": "The number of replicas which must be not only acknowledged by the receiving virtual node, but also acknowledged as received by the backend for the write to be deemed successful.",
+ "editable": true,
+ "json_schema_type": "integer|string",
+ "name": "Durable Write Quorum"
+ },
+ "last_write_wins": {
+ "default": "false",
+ "description": "Code shortcut - if true, Riak will ignore Causal Context (Vclocks or DVVs) and only use the timestamp to resolve write conflicts. Only useful if you don't anticipate concurrent writes/edits to the same object (and even then, use 'write_once' instead).",
+ "editable": true,
+ "json_schema_type": "boolean",
+ "name": "Last Write Wins (LWW)"
+ },
+ "linkfun": {
+ "default": {
+ "fun": "mapreduce_linkfun",
+ "mod": "riak_kv_wm_link_walker"
+ },
+ "description": "(Deprecated) Link walking function",
+ "editable": false,
+ "json_schema_type": "object",
+ "name": "Link Walking"
+ },
+ "n_val": {
+ "default": 3,
+ "description": "The number of copies of each object to be stored in the cluster.",
+ "editable": true,
+ "json_schema_type": "integer",
+ "name": "Number of Replicas (N_Val)"
+ },
+ "name": {
+ "default": "*",
+ "description": "Bucket or Bucket Type name (id)",
+ "json_schema_type": "string",
+ "editable": false,
+ "name": "Name"
+ },
+ "notfound_ok": {
+ "default": true,
+ "description": "If set to true, if the first virtual node to respond doesn't have a copy of the object, Riak will deem the failure authoritative and immediately return a NotFound error to the client. If set to false, instructs the coordinating node to wait for something other than a NotFound error before reporting a value.",
+ "editable": true,
+ "json_schema_type": "boolean",
+ "name": "Not Found OK"
+ },
+ "old_vclock": {
+ "default": 86400,
+ "description": "If a vector clock entry is older than this value (in milliseconds), it will be pruned. Default: 86400 milliseconds (one day).",
+ "editable": true,
+ "json_schema_type": "integer",
+ "name": "Old VClock Pruning"
+ },
+ "postcommit": {
+ "default": [],
+ "description": "A list of custom Erlang post-commit functions to be called after an object is written, immediately before the calling process is notified of the successful write. Each function runs in a separate process, in parallel. All are executed for each create, update, or delete.",
+ "editable": true,
+ "json_schema_type": "array",
+ "name": "Post-Commit Hooks"
+ },
+ "pr": {
+ "default": 0,
+ "description": "How many primary partitions must respond to a Read request in order to report success to the client. Setting it to a non-zero value increases consistency, at the cost of availability and tolerance for unavailable nodes.",
+ "editable": true,
+ "json_schema_type": "integer|string",
+ "name": "Primary Read Quorum"
+ },
+ "precommit": {
+ "default": [],
+ "description": "A list of custom Erlang pre-commit functions to be called before an object is written. Riak stops evaluating pre-commit hooks when a hook function fails the commit, and prevents the object from being written.",
+ "editable": true,
+ "json_schema_type": "array",
+ "name": "Pre-Commit Hooks"
+ },
+ "pw": {
+ "default": 0,
+ "description": "How many primary partitions must respond to a Write request in order to report success to the client. Setting it to a non-zero value increases consistency, at the cost of availability and tolerance for unavailable nodes.",
+ "editable": true,
+ "json_schema_type": "integer|string",
+ "name": "Primary Write Quorum"
+ },
+ "r": {
+ "default": "quorum",
+ "description": "The number of vnodes which must respond to a read (R) request before a response is returned to a client.",
+ "editable": true,
+ "json_schema_type": "integer|string",
+ "name": "Read Quorum"
+ },
+ "repl": {
+ "default": "*",
+ "description": "Has Multi Data Center Replication been enabled for this bucket?",
+ "editable": true,
+ "json_schema_type": "boolean|string",
+ "name": "Per-Bucket MDC Replication",
+ "valid_options": [[true, "Both Realtime and Fullsync"], [false, "Not replicated"], ["fullsync", "Fullsync Only"], ["realtime", "Realtime Only"]]
+ },
+ "rw": {
+ "default": "quorum",
+ "description": "(Deprecated) Was used as a delete quorum parameter for when R and W values are undefined.",
+ "editable": true,
+ "json_schema_type": "integer|string",
+ "name": "Delete Quorum"
+ },
+ "search": {
+ "default": false,
+ "description": "(Deprecated) Is Legacy Riak Search (v1.4 and earlier) indexing enabled?",
+ "editable": true,
+ "json_schema_type": "boolean",
+ "name": "Legacy Search Enabled"
+ },
+ "search_index": {
+ "default": "*",
+ "description": "Name (id) of the Search index that Solr will be using to index objects in this bucket.",
+ "editable": true,
+ "json_schema_type": "string",
+ "name": "Search Index Name"
+ },
+ "small_vclock": {
+ "default": 50,
+ "description": "If the length of the vector clock list is smaller than this value, the list's entries will not be pruned.",
+ "editable": true,
+ "json_schema_type": "integer",
+ "name": "Small VClock Pruning"
+ },
+ "w": {
+ "default": "quorum",
+ "description": "The number of vnodes which must respond to a write (W) request before a response is returned to a client.",
+ "editable": true,
+ "json_schema_type": "integer|string",
+ "name": "Write Quorum"
+ },
+ "write_once": {
+ "default": "false",
+ "description": "Write-optimized (for immutable data only) setting enabled for this bucket?",
+ "editable": true,
+ "json_schema_type": "boolean",
+ "name": "Write-Optimized"
+ },
+ "young_vclock": {
+ "default": 20,
+ "description": "If a vector clock entry is younger than this value (in milliseconds), it will not be pruned.",
+ "editable": true,
+ "json_schema_type": "integer",
+ "name": "Young VClock Pruning"
+ }
+ };
+});
+define("ember-riak-explorer/utils/riak-help/riak_config", ["exports"], function (exports) {
+ exports["default"] = {
+ "anti_entropy": {
+ "default": "active",
+ "description": "How Riak will repair out-of-sync keys. Some features require\nthis to be set to 'active', including search.\n* active: out-of-sync keys will be repaired in the background\n* passive: out-of-sync keys are only repaired on read\n* active-debug: like active, but outputs verbose debugging\ninformation",
+ "example": "passive",
+ "internal_key": "riak_kv.anti_entropy",
+ "valid": ["active", "passive", "active-debug"]
+ },
+ "anti_entropy.bloomfilter": {
+ "default": "on",
+ "description": "Each database .sst table file can include an optional \"bloom\nfilter\" that is highly effective in shortcutting data queries that\nare destined to not find the requested key. The Bloom filter\ntypically increases the size of an .sst table file by about\n2%.",
+ "example": "",
+ "internal_key": "riak_kv.anti_entropy_leveldb_opts.use_bloomfilter",
+ "valid": ["on", "off"]
+ },
+ "anti_entropy.concurrency_limit": {
+ "default": "2",
+ "description": "Limit how many AAE exchanges or builds can happen concurrently.",
+ "example": "",
+ "internal_key": "riak_kv.anti_entropy_concurrency",
+ "valid": "an integer"
+ },
+ "anti_entropy.data_dir": {
+ "default": "$(platform_data_dir)/anti_entropy",
+ "description": "The directory where AAE hash trees are stored.",
+ "example": "",
+ "internal_key": "riak_kv.anti_entropy_data_dir",
+ "valid": "the path to a directory"
+ },
+ "anti_entropy.max_open_files": {
+ "default": "20",
+ "description": "",
+ "example": "",
+ "internal_key": "riak_kv.anti_entropy_leveldb_opts.max_open_files",
+ "valid": "an integer"
+ },
+ "anti_entropy.throttle": {
+ "default": "on",
+ "description": "Whether the distributed throttle for active anti-entropy is\nenabled.",
+ "example": "",
+ "internal_key": "riak_kv.aae_throttle_kill_switch",
+ "valid": ["on", "off"]
+ },
+ "anti_entropy.tree.build_limit.number": {
+ "default": "1",
+ "description": "Restrict how fast AAE can build hash trees. Building the tree\nfor a given partition requires a full scan over that partition's\ndata. Once built, trees stay built until they are expired.\n* .number is the number of builds\n* .per_timespan is the amount of time in which that .number of builds\noccurs\nDefault is 1 build per hour.",
+ "example": "",
+ "internal_key": "riak_kv.anti_entropy_build_limit",
+ "valid": "an integer"
+ },
+ "anti_entropy.tree.build_limit.per_timespan": {
+ "default": "",
+ "description": "",
+ "example": "",
+ "internal_key": "",
+ "valid": ""
+ },
+ "anti_entropy.tree.expiry": {
+ "default": "1w",
+ "description": "Determine how often hash trees are expired after being built.\nPeriodically expiring a hash tree ensures the on-disk hash tree\ndata stays consistent with the actual k/v backend data. It also\nhelps Riak identify silent disk failures and bit rot. However,\nexpiration is not needed for normal AAE operation and should be\ninfrequent for performance reasons. The time is specified in\nmilliseconds.",
+ "example": "",
+ "internal_key": "riak_kv.anti_entropy_expire",
+ "valid": "a time duration with units, e.g. '10s' for 10 seconds"
+ },
+ "anti_entropy.trigger_interval": {
+ "default": "15s",
+ "description": "The tick determines how often the AAE manager looks for work\nto do (building/expiring trees, triggering exchanges, etc).\nThe default is every 15 seconds. Lowering this value will\nspeedup the rate that all replicas are synced across the cluster.\nIncreasing the value is not recommended.",
+ "example": "",
+ "internal_key": "riak_kv.anti_entropy_tick",
+ "valid": "a time duration with units, e.g. '10s' for 10 seconds"
+ },
+ "anti_entropy.use_background_manager": {
+ "default": "off",
+ "description": "Whether to use the background manager to limit AAE tree\nrebuilds. This will help to prevent system response degradation\nunder times of heavy load from multiple background tasks that\ncontend for the same resources.\nSee also:\n background_manager",
+ "example": "",
+ "internal_key": "riak_kv.aae_use_background_manager",
+ "valid": ["on", "off"]
+ },
+ "anti_entropy.write_buffer_size": {
+ "default": "4MB",
+ "description": "The LevelDB options used by AAE to generate the LevelDB-backed\non-disk hashtrees.\nSee also:\n leveldb.write_buffer_size",
+ "example": "",
+ "internal_key": "riak_kv.anti_entropy_leveldb_opts.write_buffer_size",
+ "valid": "a byte size with units, e.g. 10GB"
+ },
+ "background_manager": {
+ "default": "off",
+ "description": "Whether to enable the background manager globally. When\nenabled, participating Riak subsystems will coordinate access to\nshared resources. This will help to prevent system response\ndegradation under times of heavy load from multiple background\ntasks. Specific subsystems may also have their own controls over\nuse of the background manager.",
+ "example": "",
+ "internal_key": "riak_core.use_background_manager",
+ "valid": ["on", "off"]
+ },
+ "bitcask.data_root": {
+ "default": "$(platform_data_dir)/bitcask",
+ "description": "A path under which bitcask data files will be stored.",
+ "example": "$(platform_data_dir)/bitcask",
+ "internal_key": "bitcask.data_root",
+ "valid": "the path to a directory"
+ },
+ "bitcask.expiry": {
+ "default": "off",
+ "description": "By default, Bitcask keeps all of your data around. If your\ndata has limited time-value, or if for space reasons you need to\npurge data, you can set the `expiry` option. If you needed to\npurge data automatically after 1 day, set the value to `1d`.\nDefault is: `off` which disables automatic expiration",
+ "example": "",
+ "internal_key": "bitcask.expiry_secs",
+ "valid": "the text 'off', or a time duration with units, e.g. '10s' for 10 seconds"
+ },
+ "bitcask.expiry.grace_time": {
+ "default": "",
+ "description": "By default, Bitcask will trigger a merge whenever a data file\ncontains an expired key. This may result in excessive merging under\nsome usage patterns. To prevent this you can set the\n`bitcask.expiry.grace_time` option. Bitcask will defer triggering\na merge solely for key expiry by the configured number of\nseconds. Setting this to `1h` effectively limits each cask to\nmerging for expiry once per hour.\nDefault is: `0`",
+ "example": "",
+ "internal_key": "bitcask.expiry_grace_time",
+ "valid": "a time duration with units, e.g. '10s' for 10 seconds"
+ },
+ "bitcask.fold.max_age": {
+ "default": "unlimited",
+ "description": "Fold keys thresholds will reuse the keydir if another fold was\nstarted less than `fold.max_age` ago and there were less than\n`fold.max_puts` updates. Otherwise it will wait until all current\nfold keys complete and then start. Set either option to unlimited\nto disable.",
+ "example": "",
+ "internal_key": "bitcask.max_fold_age",
+ "valid": "the text 'off', or a time duration with units, e.g. '10s' for 10 seconds"
+ },
+ "bitcask.fold.max_puts": {
+ "default": "0",
+ "description": "Fold keys thresholds will reuse the keydir if another fold was\nstarted less than `fold.max_age` ago and there were less than\n`fold.max_puts` updates. Otherwise it will wait until all current\nfold keys complete and then start. Set either option to unlimited\nto disable.",
+ "example": "",
+ "internal_key": "bitcask.max_fold_puts",
+ "valid": "an integer"
+ },
+ "bitcask.hintfile_checksums": {
+ "default": "strict",
+ "description": "Require the CRC to be present at the end of hintfiles.\nSetting this to `allow_missing` runs Bitcask in a backward\ncompatible mode where old hint files will still be accepted without\nCRC signatures.",
+ "example": "",
+ "internal_key": "bitcask.require_hint_crc",
+ "valid": ["strict", "allow_missing"]
+ },
+ "bitcask.io_mode": {
+ "default": "erlang",
+ "description": "Configure how Bitcask writes data to disk.\nerlang: Erlang's built-in file API\nnif: Direct calls to the POSIX C API\nThe NIF mode provides higher throughput for certain\nworkloads, but has the potential to negatively impact\nthe Erlang VM, leading to higher worst-case latencies\nand possible throughput collapse.",
+ "example": "erlang",
+ "internal_key": "bitcask.io_mode",
+ "valid": ["erlang", "nif"]
+ },
+ "bitcask.max_file_size": {
+ "default": "2GB",
+ "description": "Describes the maximum permitted size for any single data file\nin the Bitcask directory. If a write causes the current file to\nexceed this size threshold then that file is closed, and a new file\nis opened for writes.",
+ "example": "",
+ "internal_key": "bitcask.max_file_size",
+ "valid": "a byte size with units, e.g. 10GB"
+ },
+ "bitcask.max_merge_size": {
+ "default": "100GB",
+ "description": "Maximum amount of data to merge in one go in the Bitcask backend.",
+ "example": "",
+ "internal_key": "riak_kv.bitcask_max_merge_size",
+ "valid": "a byte size with units, e.g. 10GB"
+ },
+ "bitcask.merge.policy": {
+ "default": "always",
+ "description": "Lets you specify when during the day merge operations are\nallowed to be triggered. Valid options are:\n* `always` (default) No restrictions\n* `never` Merge will never be attempted\n* `window` Hours during which merging is permitted, where\n`bitcask.merge.window.start` and `bitcask.merge.window.end` are\nintegers between 0 and 23.\nIf merging has a significant impact on performance of your cluster,\nor your cluster has quiet periods in which little storage activity\noccurs, you may want to change this setting from the default.",
+ "example": "",
+ "internal_key": "bitcask.merge_window",
+ "valid": ["always", "never", "window"]
+ },
+ "bitcask.merge.thresholds.dead_bytes": {
+ "default": "128MB",
+ "description": "Describes the minimum amount of data occupied by dead keys in\na file to cause it to be included in the merge. Increasing the\nvalue will cause fewer files to be merged, decreasing the value\nwill cause more files to be merged.\nDefault is: 128MB",
+ "example": "",
+ "internal_key": "bitcask.dead_bytes_threshold",
+ "valid": "a byte size with units, e.g. 10GB"
+ },
+ "bitcask.merge.thresholds.fragmentation": {
+ "default": "40",
+ "description": "Describes what ratio of dead keys to total keys in a file will\ncause it to be included in the merge. The value of this setting is\na percentage (0-100). For example, if a data file contains 4 dead\nkeys and 6 live keys, it will be included in the merge at the\ndefault ratio. Increasing the value will cause fewer files to be\nmerged, decreasing the value will cause more files to be merged.\nDefault is: `40`",
+ "example": "",
+ "internal_key": "bitcask.frag_threshold",
+ "valid": "an integer"
+ },
+ "bitcask.merge.thresholds.small_file": {
+ "default": "10MB",
+ "description": "Describes the minimum size a file must have to be _excluded_\nfrom the merge. Files smaller than the threshold will be\nincluded. Increasing the value will cause _more_ files to be\nmerged, decreasing the value will cause _fewer_ files to be merged.\nDefault is: 10MB",
+ "example": "",
+ "internal_key": "bitcask.small_file_threshold",
+ "valid": "a byte size with units, e.g. 10GB"
+ },
+ "bitcask.merge.triggers.dead_bytes": {
+ "default": "512MB",
+ "description": "Describes how much data stored for dead keys in a single file\nwill trigger merging. The value is in bytes. If a file meets or\nexceeds the trigger value for dead bytes, merge will be\ntriggered. Increasing the value will cause merging to occur less\noften, whereas decreasing the value will cause merging to happen\nmore often.\nWhen either of these constraints are met by any file in the\ndirectory, Bitcask will attempt to merge files.\nDefault is: 512MB",
+ "example": "",
+ "internal_key": "bitcask.dead_bytes_merge_trigger",
+ "valid": "a byte size with units, e.g. 10GB"
+ },
+ "bitcask.merge.triggers.fragmentation": {
+ "default": "60",
+ "description": "Describes what ratio of dead keys to total keys in a file will\ntrigger merging. The value of this setting is a percentage\n(0-100). For example, if a data file contains 6 dead keys and 4\nlive keys, then merge will be triggered at the default\nsetting. Increasing this value will cause merging to occur less\noften, whereas decreasing the value will cause merging to happen\nmore often.\nDefault is: `60`",
+ "example": "",
+ "internal_key": "bitcask.frag_merge_trigger",
+ "valid": "an integer"
+ },
+ "bitcask.merge.window.end": {
+ "default": "23",
+ "description": "Lets you specify when during the day merge operations are\nallowed to be triggered. Valid options are:\n* `always` (default) No restrictions\n* `never` Merge will never be attempted\n* `window` Hours during which merging is permitted, where\n`bitcask.merge.window.start` and `bitcask.merge.window.end` are\nintegers between 0 and 23.\nIf merging has a significant impact on performance of your cluster,\nor your cluster has quiet periods in which little storage activity\noccurs, you may want to change this setting from the default.",
+ "example": "",
+ "internal_key": "bitcask.merge_window",
+ "valid": "an integer"
+ },
+ "bitcask.merge.window.start": {
+ "default": "0",
+ "description": "Lets you specify when during the day merge operations are\nallowed to be triggered. Valid options are:\n* `always` (default) No restrictions\n* `never` Merge will never be attempted\n* `window` Hours during which merging is permitted, where\n`bitcask.merge.window.start` and `bitcask.merge.window.end` are\nintegers between 0 and 23.\nIf merging has a significant impact on performance of your cluster,\nor your cluster has quiet periods in which little storage activity\noccurs, you may want to change this setting from the default.",
+ "example": "",
+ "internal_key": "bitcask.merge_window",
+ "valid": "an integer"
+ },
+ "bitcask.merge_check_interval": {
+ "default": "3m",
+ "description": "Time in between the checks that trigger Bitcask merges.",
+ "example": "",
+ "internal_key": "riak_kv.bitcask_merge_check_interval",
+ "valid": "a time duration with units, e.g. '10s' for 10 seconds"
+ },
+ "bitcask.merge_check_jitter": {
+ "default": "30%",
+ "description": "Jitter used to randomize the time in between the checks that trigger\nBitcask merges.",
+ "example": "",
+ "internal_key": "riak_kv.bitcask_merge_check_jitter",
+ "valid": "text"
+ },
+ "bitcask.open_timeout": {
+ "default": "4s",
+ "description": "Specifies the maximum time Bitcask will block on startup while\nattempting to create or open the data directory. You generally need\nnot change this value. If for some reason the timeout is exceeded\non open you'll see a log message of the form: \"Failed to start\nbitcask backend: .... \" Only then should you consider a longer\ntimeout.",
+ "example": "",
+ "internal_key": "bitcask.open_timeout",
+ "valid": "a time duration with units, e.g. '10s' for 10 seconds"
+ },
+ "bitcask.sync.strategy": {
+ "default": "none",
+ "description": "Changes the durability of writes by specifying when to\nsynchronize data to disk. The default setting protects against data\nloss in the event of application failure (process death) but leaves\nopen a small window wherein data could be lost in the event of\ncomplete system failure (e.g. hardware, O/S, power).\nThe default mode, `none`, writes data into operating system buffers\nwhich which will be written to the disks when those buffers are\nflushed by the operating system. If the system fails (power loss,\ncrash, etc.) before before those buffers are flushed to stable\nstorage that data is lost.\nThis is prevented by the setting `o_sync` which forces the\noperating system to flush to stable storage at every write. The\neffect of flushing each write is better durability, however write\nthroughput will suffer as each write will have to wait for the\nwrite to complete.\nAvailable Sync Strategies:\n* `none` - (default) Lets the operating system manage syncing\nwrites.\n* `o_sync` - Uses the O_SYNC flag which forces syncs on every\nwrite.\n* `interval` - Riak will force Bitcask to sync every\n`bitcask.sync.interval` seconds.",
+ "example": "",
+ "internal_key": "bitcask.sync_strategy",
+ "valid": ["none", "o_sync", "interval"]
+ },
+ "buckets.default.allow_mult": {
+ "default": "false",
+ "description": "Whether or not siblings are allowed, by default, for untyped buckets.\nNote: See Vector Clocks for a discussion of sibling resolution.",
+ "example": "",
+ "internal_key": "riak_core.default_bucket_props.allow_mult",
+ "valid": [true, false]
+ },
+ "buckets.default.basic_quorum": {
+ "default": "false",
+ "description": "Whether not-founds will invoke the \"basic quorum\"\noptimization. This setting will short-circuit fetches where the\nmajority of replicas report that the key is not found. Only used\nwhen notfound_ok = false.",
+ "example": "",
+ "internal_key": "riak_core.default_bucket_props.basic_quorum",
+ "valid": [true, false]
+ },
+ "buckets.default.dw": {
+ "default": "quorum",
+ "description": "The number of replicas which must reply to a write request,\nindicating that the write was committed to durable storage.",
+ "example": "",
+ "internal_key": "riak_core.default_bucket_props.dw",
+ "valid": "an integer, or a symbolic quorum value (one of: 'quorum', 'all')"
+ },
+ "buckets.default.last_write_wins": {
+ "default": "false",
+ "description": "Whether conflicting writes resolve via timestamp.",
+ "example": "",
+ "internal_key": "riak_core.default_bucket_props.last_write_wins",
+ "valid": [true, false]
+ },
+ "buckets.default.merge_strategy": {
+ "default": "1",
+ "description": "The strategy used when merging objects that potentially have\nconflicts.\n* 2: Riak 2.0 typed bucket default - reduces sibling creation through additional\nmetadata on each sibling (also known as dotted version vectors)\n* 1: Riak 1.4, default buckets, and earlier default - may duplicate siblings\nfrom interleaved writes (sibling explosion.)",
+ "example": "",
+ "internal_key": "riak_core.default_bucket_props.dvv_enabled",
+ "valid": ["1", "2"]
+ },
+ "buckets.default.n_val": {
+ "default": "3",
+ "description": "The number of replicas stored. Note: See Replication\nProperties for further discussion.\nhttp://docs.basho.com/riak/latest/dev/advanced/cap-controls/",
+ "example": "",
+ "internal_key": "riak_core.default_bucket_props.n_val",
+ "valid": "an integer"
+ },
+ "buckets.default.notfound_ok": {
+ "default": "true",
+ "description": "Whether not-founds will count toward a quorum of reads.",
+ "example": "",
+ "internal_key": "riak_core.default_bucket_props.notfound_ok",
+ "valid": [true, false]
+ },
+ "buckets.default.pr": {
+ "default": "0",
+ "description": "The number of primary replicas (non-fallback) that must reply\nto a read request.",
+ "example": "",
+ "internal_key": "riak_core.default_bucket_props.pr",
+ "valid": "an integer, or a symbolic quorum value (one of: 'quorum', 'all')"
+ },
+ "buckets.default.pw": {
+ "default": "0",
+ "description": "The number of primary replicas (non-fallback) which must reply\nto a write request.",
+ "example": "",
+ "internal_key": "riak_core.default_bucket_props.pw",
+ "valid": "an integer, or a symbolic quorum value (one of: 'quorum', 'all')"
+ },
+ "buckets.default.r": {
+ "default": "quorum",
+ "description": "The number of replicas which must reply to a read request.",
+ "example": "",
+ "internal_key": "riak_core.default_bucket_props.r",
+ "valid": "an integer, or a symbolic quorum value (one of: 'quorum', 'all')"
+ },
+ "buckets.default.rw": {
+ "default": "quorum",
+ "description": "The number of replicas which must reply to a delete request.",
+ "example": "",
+ "internal_key": "riak_core.default_bucket_props.rw",
+ "valid": "an integer, or a symbolic quorum value (one of: 'quorum', 'all')"
+ },
+ "buckets.default.w": {
+ "default": "quorum",
+ "description": "The number of replicas which must reply to a write request,\nindicating that the write was received.",
+ "example": "",
+ "internal_key": "riak_core.default_bucket_props.w",
+ "valid": "an integer, or a symbolic quorum value (one of: 'quorum', 'all')"
+ },
+ "check_crl": {
+ "default": "on",
+ "description": "Whether to check the CRL of a client certificate. This defaults to\non but some CAs may not maintain or define a CRL, so this can be disabled\nif no CRL is available.",
+ "example": "",
+ "internal_key": "riak_api.check_crl",
+ "valid": ["on", "off"]
+ },
+ "datatypes.compression_level": {
+ "default": "1",
+ "description": "Whether serialized datatypes will use compression, and at what\nlevel. When an integer, this refers to the aggressiveness (and\nslowness) of compression, on a scale from 0 to 9. 'on' is\nequivalent to 6, 'off' is equivalent to 0.",
+ "example": "",
+ "internal_key": "riak_dt.binary_compression",
+ "valid": "an integer"
+ },
+ "distributed_cookie": {
+ "default": "riak",
+ "description": "Cookie for distributed node communication. All nodes in the\nsame cluster should use the same cookie or they will not be able to\ncommunicate.",
+ "example": "riak",
+ "internal_key": "vm_args.-setcookie",
+ "valid": "text"
+ },
+ "dtrace": {
+ "default": "off",
+ "description": "DTrace support Do not enable 'dtrace' unless your Erlang/OTP\nruntime is compiled to support DTrace. DTrace is available in\nR15B01 (supported by the Erlang/OTP official source package) and in\nR14B04 via a custom source repository & branch.",
+ "example": "off",
+ "internal_key": "riak_core.dtrace_support",
+ "valid": ["on", "off"]
+ },
+ "erlang.K": {
+ "default": "on",
+ "description": "Enables or disables the kernel poll functionality if the\nemulator supports it. If the emulator does not support kernel poll,\nand the K flag is passed to the emulator, a warning is issued at\nstartup.\nSimilar information at: http://erlang.org/doc/man/erl.html",
+ "example": "",
+ "internal_key": "vm_args.+K",
+ "valid": ["on", "off"]
+ },
+ "erlang.W": {
+ "default": "w",
+ "description": "Sets the mapping of warning messages for error_logger.\nMessages sent to the error logger using one of the warning\nroutines can be mapped either to errors (default), warnings\n(w - default), or info reports (i).",
+ "example": "",
+ "internal_key": "vm_args.+W",
+ "valid": "text"
+ },
+ "erlang.async_threads": {
+ "default": "64",
+ "description": "Sets the number of threads in async thread pool, valid range\nis 0-1024. If thread support is available, the default is 64.\nMore information at: http://erlang.org/doc/man/erl.html",
+ "example": "64",
+ "internal_key": "vm_args.+A",
+ "valid": "an integer"
+ },
+ "erlang.crash_dump": {
+ "default": "./log/erl_crash.dump",
+ "description": "Set the location of crash dumps",
+ "example": "",
+ "internal_key": "vm_args.-env ERL_CRASH_DUMP",
+ "valid": "the path to a file"
+ },
+ "erlang.distribution_buffer_size": {
+ "default": "32MB",
+ "description": "For nodes with many busy_dist_port events, Basho recommends\nraising the sender-side network distribution buffer size.\n32MB may not be sufficient for some workloads and is a suggested\nstarting point. Erlangers may know this as +zdbbl.\nThe Erlang/OTP default is 1024 (1 megabyte).\nSee: http://www.erlang.org/doc/man/erl.html#%2bzdbbl",
+ "example": "",
+ "internal_key": "vm_args.+zdbbl",
+ "valid": "a byte size with units, e.g. 10GB"
+ },
+ "erlang.fullsweep_after": {
+ "default": "0",
+ "description": "A non-negative integer which indicates how many times\ngenerational garbage collections can be done without forcing a\nfullsweep collection. In low-memory systems (especially without\nvirtual memory), setting the value to 0 can help to conserve\nmemory.\nMore information at:\nhttp://www.erlang.org/doc/man/erlang.html#system_flag-2",
+ "example": "",
+ "internal_key": "vm_args.-env ERL_FULLSWEEP_AFTER",
+ "valid": "an integer"
+ },
+ "erlang.max_ets_tables": {
+ "default": "256000",
+ "description": "Raise the ETS table limit",
+ "example": "",
+ "internal_key": "vm_args.+e",
+ "valid": "an integer"
+ },
+ "erlang.max_ports": {
+ "default": "65536",
+ "description": "The number of concurrent ports/sockets\nValid range is 1024-134217727",
+ "example": "65536",
+ "internal_key": "vm_args.+Q",
+ "valid": "an integer"
+ },
+ "erlang.process_limit": {
+ "default": "256000",
+ "description": "Raise the default erlang process limit",
+ "example": "",
+ "internal_key": "vm_args.+P",
+ "valid": "an integer"
+ },
+ "erlang.schedulers.compaction_of_load": {
+ "default": "false",
+ "description": "Enable or disable scheduler compaction of load. By default\nscheduler compaction of load is enabled. When enabled, load\nbalancing will strive for a load distribution which causes as many\nscheduler threads as possible to be fully loaded (i.e., not run out\nof work). This is accomplished by migrating load (e.g. runnable\nprocesses) into a smaller set of schedulers when schedulers\nfrequently run out of work. When disabled, the frequency with which\nschedulers run out of work will not be taken into account by the\nload balancing logic.\nMore information: http://www.erlang.org/doc/man/erl.html#+scl",
+ "example": "",
+ "internal_key": "vm_args.+scl",
+ "valid": [true, false]
+ },
+ "erlang.schedulers.force_wakeup_interval": {
+ "default": "500",
+ "description": "Set scheduler forced wakeup interval. All run queues will be\nscanned each Interval milliseconds. While there are sleeping\nschedulers in the system, one scheduler will be woken for each\nnon-empty run queue found. An Interval of zero disables this\nfeature, which also is the default.\nThis feature is a workaround for lengthy executing native code, and\nnative code that do not bump reductions properly.\nMore information: http://www.erlang.org/doc/man/erl.html#+sfwi",
+ "example": "",
+ "internal_key": "vm_args.+sfwi",
+ "valid": "an integer"
+ },
+ "erlang.smp": {
+ "default": "enable",
+ "description": "Starts the Erlang runtime system with SMP support\nenabled. This may fail if no runtime system with SMP support is\navailable. The 'auto' setting starts the Erlang runtime system with\nSMP support enabled if it is available and more than one logical\nprocessor are detected. -smp disable starts a runtime system\nwithout SMP support.\nNOTE: The runtime system with SMP support will not be available on\nall supported platforms. See also the erlang.schedulers settings.\nNOTE: Some native extensions (NIFs) require use of the SMP\nemulator.\nMore information at: http://erlang.org/doc/man/erl.html",
+ "example": "",
+ "internal_key": "vm_args.-smp",
+ "valid": ["enable", "auto", "disable"]
+ },
+ "handoff.inbound": {
+ "default": "on",
+ "description": "Enables/disables inbound handoff transfers for this node. If you\nturn this setting off at runtime with riak-admin, it will kill any\ninbound handoffs currently running.",
+ "example": "",
+ "internal_key": "riak_core.disable_inbound_handoff",
+ "valid": ["on", "off"]
+ },
+ "handoff.ip": {
+ "default": "127.0.0.1",
+ "description": "handoff.ip is the network address that Riak binds to for\nintra-cluster data handoff.",
+ "example": "",
+ "internal_key": "riak_core.handoff_ip",
+ "valid": "text"
+ },
+ "handoff.max_rejects": {
+ "default": "6",
+ "description": "The maximum number of times that a secondary system like Riak\nSearch 2.0 can block handoff of primary key-value data. The\napproximate maximum duration handoff of a vnode can be blocked for\ncan be determined by multiplying this number by the value of\n\"vnode_management_timer\". To prevent handoff from ever being\nblocked by a secondary system set this value to 0.\nSee also:\n vnode_management_timer",
+ "example": "",
+ "internal_key": "riak_kv.handoff_rejected_max",
+ "valid": "an integer"
+ },
+ "handoff.outbound": {
+ "default": "on",
+ "description": "Enables/disables outbound handoff transfers for this node. If you\nturn this setting off at runtime with riak-admin, it will kill any\noutbound handoffs currently running.",
+ "example": "",
+ "internal_key": "riak_core.disable_outbound_handoff",
+ "valid": ["on", "off"]
+ },
+ "handoff.port": {
+ "default": "8099",
+ "description": "handoff.port is the TCP port that Riak uses for\nintra-cluster data handoff.",
+ "example": "",
+ "internal_key": "riak_core.handoff_port",
+ "valid": "an integer"
+ },
+ "handoff.use_background_manager": {
+ "default": "off",
+ "description": "Whether to use the background manager to limit KV handoff.\nThis will help to prevent system response degradation under times\nof heavy load from multiple background tasks that contend for the\nsame resources.\nSee also:\n background_manager",
+ "example": "",
+ "internal_key": "riak_kv.handoff_use_background_manager",
+ "valid": ["on", "off"]
+ },
+ "honor_cipher_order": {
+ "default": "on",
+ "description": "Whether to prefer the order in which the server lists its\nciphers. When set to 'off', the client's preferred cipher order\ndictates which cipher is chosen.",
+ "example": "",
+ "internal_key": "riak_api.honor_cipher_order",
+ "valid": ["on", "off"]
+ },
+ "javascript.hook_pool_size": {
+ "default": "2",
+ "description": "How many JavaScript virtual machines are available for\nexecuting pre-commit hook functions.",
+ "example": "",
+ "internal_key": "riak_kv.hook_js_vm_count",
+ "valid": "an integer"
+ },
+ "javascript.map_pool_size": {
+ "default": "8",
+ "description": "How many JavaScript virtual machines are available for\nexecuting map functions.",
+ "example": "",
+ "internal_key": "riak_kv.map_js_vm_count",
+ "valid": "an integer"
+ },
+ "javascript.maximum_heap_size": {
+ "default": "8MB",
+ "description": "The maximum amount of memory allocated to each JavaScript\nvirtual machine.",
+ "example": "",
+ "internal_key": "riak_kv.js_max_vm_mem",
+ "valid": "a byte size with units, e.g. 10GB"
+ },
+ "javascript.maximum_stack_size": {
+ "default": "16MB",
+ "description": "The maximum amount of thread stack memory to allocate\nto each JavaScript virtual machine.",
+ "example": "",
+ "internal_key": "riak_kv.js_thread_stack",
+ "valid": "a byte size with units, e.g. 10GB"
+ },
+ "javascript.reduce_pool_size": {
+ "default": "6",
+ "description": "How many JavaScript virtual machines are available for\nexecuting reduce functions.",
+ "example": "",
+ "internal_key": "riak_kv.reduce_js_vm_count",
+ "valid": "an integer"
+ },
+ "leveldb.block.restart_interval": {
+ "default": "16",
+ "description": "Defines the key count threshold for a new key entry in the key\nindex for a block. Most deployments should leave this parameter\nalone.",
+ "example": "",
+ "internal_key": "eleveldb.block_restart_interval",
+ "valid": "an integer"
+ },
+ "leveldb.block.size": {
+ "default": "4KB",
+ "description": "Defines the size threshold for a block / chunk of data within\none .sst table file. Each new block gets an index entry in the .sst\ntable file's master index.",
+ "example": "",
+ "internal_key": "eleveldb.sst_block_size",
+ "valid": "a byte size with units, e.g. 10GB"
+ },
+ "leveldb.block.size_steps": {
+ "default": "16",
+ "description": "Defines the number of incremental adjustments to attempt\nbetween the block.size value and the maximum block.size for an .sst\ntable file. Value of zero disables the underlying dynamic\nblock_size feature.\nSee also:\n leveldb.block.size",
+ "example": "",
+ "internal_key": "eleveldb.block_size_steps",
+ "valid": "an integer"
+ },
+ "leveldb.block_cache_threshold": {
+ "default": "32MB",
+ "description": "Defines the limit where block cache memory can no longer be\nreleased in favor of the page cache. This has no impact with\nregard to release in favor of file cache. The value is per\nvnode.",
+ "example": "",
+ "internal_key": "eleveldb.block_cache_threshold",
+ "valid": "a byte size with units, e.g. 10GB"
+ },
+ "leveldb.bloomfilter": {
+ "default": "on",
+ "description": "Each database .sst table file can include an optional \"bloom\nfilter\" that is highly effective in shortcutting data queries that\nare destined to not find the requested key. The Bloom filter\ntypically increases the size of an .sst table file by about\n2%.",
+ "example": "",
+ "internal_key": "eleveldb.use_bloomfilter",
+ "valid": ["on", "off"]
+ },
+ "leveldb.compaction.trigger.tombstone_count": {
+ "default": "1000",
+ "description": "Controls when a background compaction initiates solely\ndue to the number of delete tombstones within an individual\n.sst table file. Value of 'off' disables the feature.",
+ "example": "",
+ "internal_key": "eleveldb.delete_threshold",
+ "valid": "an integer"
+ },
+ "leveldb.compression": {
+ "default": "on",
+ "description": "Enables or disables the compression of data on disk.\nEnabling (default) saves disk space. Disabling may reduce read\nlatency but increase overall disk activity. Option can be\nchanged at any time, but will not impact data on disk until\nnext time a file requires compaction.",
+ "example": "",
+ "internal_key": "eleveldb.compression",
+ "valid": ["on", "off"]
+ },
+ "leveldb.data_root": {
+ "default": "$(platform_data_dir)/leveldb",
+ "description": "Where LevelDB will store its data.",
+ "example": "",
+ "internal_key": "eleveldb.data_root",
+ "valid": "the path to a directory"
+ },
+ "leveldb.fadvise_willneed": {
+ "default": "false",
+ "description": "Option to override LevelDB's use of fadvise(DONTNEED) with\nfadvise(WILLNEED) instead. WILLNEED can reduce disk activity on\nsystems where physical memory exceeds the database size.",
+ "example": "",
+ "internal_key": "eleveldb.fadvise_willneed",
+ "valid": [true, false]
+ },
+ "leveldb.limited_developer_mem": {
+ "default": "off",
+ "description": "limited_developer_mem is a Riak specific option that is used\nwhen a developer is testing a high number of vnodes and/or several\nVMs on a machine with limited physical memory. Do NOT use this\noption if making performance measurements. This option overwrites\nvalues given to write_buffer_size_min and write_buffer_size_max.",
+ "example": "",
+ "internal_key": "eleveldb.limited_developer_mem",
+ "valid": ["on", "off"]
+ },
+ "leveldb.maximum_memory.percent": {
+ "default": "70",
+ "description": "This parameter defines the percentage of total server memory\nto assign to LevelDB. LevelDB will dynamically adjust its internal\ncache sizes to stay within this size. The memory size can\nalternately be assigned as a byte count via leveldb.maximum_memory\ninstead.\nSee also:\n leveldb.maximum_memory",
+ "example": "70",
+ "internal_key": "eleveldb.total_leveldb_mem_percent",
+ "valid": "an integer"
+ },
+ "leveldb.sync_on_write": {
+ "default": "off",
+ "description": "Whether LevelDB will flush after every write. Note: If you are\nfamiliar with fsync, this is analagous to calling fsync after every\nwrite.",
+ "example": "",
+ "internal_key": "eleveldb.sync",
+ "valid": ["on", "off"]
+ },
+ "leveldb.threads": {
+ "default": "71",
+ "description": "The number of worker threads performing LevelDB operations.",
+ "example": "",
+ "internal_key": "eleveldb.eleveldb_threads",
+ "valid": "an integer"
+ },
+ "leveldb.tiered": {
+ "default": "off",
+ "description": "leveldb can be configured to use different mounts for\ndifferent levels. This tiered option defaults to off, but you can\nconfigure it to trigger at levels 1-6. If you do this, anything\nstored at the chosen level or greater will be stored on\nleveldb.tiered.mounts.slow, while everything at the levels below will\nbe stored on leveldb.tiered.mounts.fast\nLevels 3 or 4 are recommended settings.\nWARNING: There is no dynamic reallocation of leveldb\ndata across mounts. If you change this setting without manually\nmoving the level files to the correct mounts, leveldb will act in\nan unexpected state.\nSee also:\n leveldb.tiered.mounts.fast\n leveldb.tiered.mounts.slow",
+ "example": "",
+ "internal_key": "eleveldb.tiered_slow_level",
+ "valid": "an integer, or the string \"off\""
+ },
+ "leveldb.verify_checksums": {
+ "default": "on",
+ "description": "Enables or disables the verification of the data fetched from\nLevelDB against internal checksums.",
+ "example": "",
+ "internal_key": "eleveldb.verify_checksums",
+ "valid": ["on", "off"]
+ },
+ "leveldb.verify_compaction": {
+ "default": "on",
+ "description": "Enables or disables the verification of LevelDB data during\ncompaction.",
+ "example": "",
+ "internal_key": "eleveldb.verify_compaction",
+ "valid": ["on", "off"]
+ },
+ "leveldb.write_buffer_size_max": {
+ "default": "60MB",
+ "description": "Each vnode first stores new key/value data in a memory based\nwrite buffer. This write buffer is in parallel to the recovery log\nmentioned in the \"sync\" parameter. Riak creates each vnode with a\nrandomly sized write buffer for performance reasons. The random\nsize is somewhere between write_buffer_size_min and\nwrite_buffer_size_max.",
+ "example": "",
+ "internal_key": "eleveldb.write_buffer_size_max",
+ "valid": "a byte size with units, e.g. 10GB"
+ },
+ "leveldb.write_buffer_size_min": {
+ "default": "30MB",
+ "description": "Each vnode first stores new key/value data in a memory based\nwrite buffer. This write buffer is in parallel to the recovery log\nmentioned in the \"sync\" parameter. Riak creates each vnode with a\nrandomly sized write buffer for performance reasons. The random\nsize is somewhere between write_buffer_size_min and\nwrite_buffer_size_max.\nSee also:\n leveldb.sync",
+ "example": "",
+ "internal_key": "eleveldb.write_buffer_size_min",
+ "valid": "a byte size with units, e.g. 10GB"
+ },
+ "listener.http.internal": {
+ "default": "127.0.0.1:8098",
+ "description": "listener.http. is an IP address and TCP port that the Riak\nHTTP interface will bind.",
+ "example": "0.0.0.0:8098",
+ "internal_key": "riak_api.http",
+ "valid": "an IP/port pair, e.g. 127.0.0.1:10011"
+ },
+ "listener.protobuf.internal": {
+ "default": "127.0.0.1:8087",
+ "description": "listener.protobuf. is an IP address and TCP port that the Riak\nProtocol Buffers interface will bind.",
+ "example": "0.0.0.0:8087",
+ "internal_key": "riak_api.pb",
+ "valid": "an IP/port pair, e.g. 127.0.0.1:10011"
+ },
+ "log.console": {
+ "default": "file",
+ "description": "Where to emit the default log messages (typically at 'info'\nseverity):\noff: disabled\nfile: the file specified by log.console.file\nconsole: to standard output (seen when using `riak attach-direct`)\nboth: log.console.file and standard out.",
+ "example": "file",
+ "internal_key": "lager.handlers",
+ "valid": ["off", "file", "console", "both"]
+ },
+ "log.console.file": {
+ "default": "$(platform_log_dir)/console.log",
+ "description": "When 'log.console' is set to 'file' or 'both', the file where\nconsole messages will be logged.",
+ "example": "$(platform_log_dir)/console.log",
+ "internal_key": "lager.handlers",
+ "valid": "the path to a file"
+ },
+ "log.console.level": {
+ "default": "info",
+ "description": "The severity level of the console log, default is 'info'.",
+ "example": "info",
+ "internal_key": "lager.handlers",
+ "valid": ["debug", "info", "notice", "warning", "error", "critical", "alert", "emergency", "none"]
+ },
+ "log.crash": {
+ "default": "on",
+ "description": "Whether to enable the crash log.",
+ "example": "on",
+ "internal_key": "lager.crash_log",
+ "valid": ["on", "off"]
+ },
+ "log.crash.file": {
+ "default": "$(platform_log_dir)/crash.log",
+ "description": "If the crash log is enabled, the file where its messages will\nbe written.",
+ "example": "$(platform_log_dir)/crash.log",
+ "internal_key": "lager.crash_log",
+ "valid": "the path to a file"
+ },
+ "log.crash.maximum_message_size": {
+ "default": "64KB",
+ "description": "Maximum size in bytes of individual messages in the crash log",
+ "example": "64KB",
+ "internal_key": "lager.crash_log_msg_size",
+ "valid": "a byte size with units, e.g. 10GB"
+ },
+ "log.crash.rotation": {
+ "default": "$D0",
+ "description": "The schedule on which to rotate the crash log. For more\ninformation see:\nhttps://github.com/basho/lager/blob/master/README.md#internal-log-rotation",
+ "example": "$D0",
+ "internal_key": "lager.crash_log_date",
+ "valid": "text"
+ },
+ "log.crash.rotation.keep": {
+ "default": "5",
+ "description": "The number of rotated crash logs to keep. When set to\n'current', only the current open log file is kept.",
+ "example": "5",
+ "internal_key": "lager.crash_log_count",
+ "valid": "an integer"
+ },
+ "log.crash.size": {
+ "default": "10MB",
+ "description": "Maximum size of the crash log in bytes, before it is rotated",
+ "example": "10MB",
+ "internal_key": "lager.crash_log_size",
+ "valid": "a byte size with units, e.g. 10GB"
+ },
+ "log.error.file": {
+ "default": "$(platform_log_dir)/error.log",
+ "description": "The file where error messages will be logged.",
+ "example": "$(platform_log_dir)/error.log",
+ "internal_key": "lager.handlers",
+ "valid": "the path to a file"
+ },
+ "log.error.messages_per_second": {
+ "default": "100",
+ "description": "Maximum number of error_logger messages to handle in a second",
+ "example": "",
+ "internal_key": "lager.error_logger_hwm",
+ "valid": "an integer"
+ },
+ "log.error.redirect": {
+ "default": "on",
+ "description": "Whether to redirect error_logger messages into lager -\ndefaults to true",
+ "example": "",
+ "internal_key": "lager.error_logger_redirect",
+ "valid": ["on", "off"]
+ },
+ "log.syslog": {
+ "default": "off",
+ "description": "When set to 'on', enables log output to syslog.",
+ "example": "off",
+ "internal_key": "lager.handlers",
+ "valid": ["on", "off"]
+ },
+ "log.syslog.facility": {
+ "default": "daemon",
+ "description": "Syslog facility to log entries from Riak.",
+ "example": "",
+ "internal_key": "lager.handlers",
+ "valid": ["kern", "user", "mail", "daemon", "auth", "syslog", "lpr", "news", "uucp", "clock", "authpriv", "ftp", "cron", "local0", "local1", "local2", "local3", "local4", "local5", "local6", "local7"]
+ },
+ "log.syslog.ident": {
+ "default": "riak",
+ "description": "When set to 'on', enables log output to syslog.",
+ "example": "",
+ "internal_key": "lager.handlers",
+ "valid": "text"
+ },
+ "log.syslog.level": {
+ "default": "info",
+ "description": "The severity level at which to log entries to syslog, default is 'info'.",
+ "example": "",
+ "internal_key": "lager.handlers",
+ "valid": ["debug", "info", "notice", "warning", "error", "critical", "alert", "emergency", "none"]
+ },
+ "max_concurrent_requests": {
+ "default": "50000",
+ "description": "The maximum number of concurrent requests of each type (get or\nput) that is allowed. Setting this value to infinite disables\noverload protection. The 'erlang.process_limit' should be at least\n3 times more than this setting.\nSee also:\n erlang.process_limit",
+ "example": "",
+ "internal_key": "riak_kv.fsm_limit",
+ "valid": "an integer"
+ },
+ "metadata_cache_size": {
+ "default": "off",
+ "description": "Controls the size of the metadata cache for each vnode. Set to\n'off' to disable the cache. This shouldn't be necessary on-disk\nbased backends, but can help performance in some cases (i.e. memory\nbackend, data fits in block cache, etc). Note that this is the size\nof the ETS table, rather than the actual data, to keep the size\ncalculation simple, thus more space may be used than the simple\nsize * vnode_count calculation would imply.\nCaution: Do not use without extensive benchmarking.\ndisabled by default, 256KB is a reasonable value",
+ "example": "",
+ "internal_key": "riak_kv.vnode_md_cache_size",
+ "valid": "a byte size with units, e.g. 10GB, or the string \"off\""
+ },
+ "nodename": {
+ "default": "riak@127.0.0.1",
+ "description": "Name of the Erlang node",
+ "example": "riak@127.0.0.1",
+ "internal_key": "vm_args.-name",
+ "valid": "text"
+ },
+ "object.format": {
+ "default": "1",
+ "description": "Controls which binary representation of a riak value is stored\non disk.\n* 0: Original erlang:term_to_binary format. Higher space overhead. (Obsolete)\n* 1: New format for more compact storage of small values.",
+ "example": "1",
+ "internal_key": "riak_kv.object_format",
+ "valid": ["0", "1"]
+ },
+ "object.siblings.maximum": {
+ "default": "100",
+ "description": "Writing an object with more than this number of siblings will\nsend a failure to the client.",
+ "example": "100",
+ "internal_key": "riak_kv.max_siblings",
+ "valid": "an integer"
+ },
+ "object.siblings.warning_threshold": {
+ "default": "25",
+ "description": "Writing an object with more than this number of siblings will\ngenerate a warning in the logs.",
+ "example": "25",
+ "internal_key": "riak_kv.warn_siblings",
+ "valid": "an integer"
+ },
+ "object.size.maximum": {
+ "default": "50MB",
+ "description": "Writing an object bigger than this will send a failure to the\nclient.",
+ "example": "50MB",
+ "internal_key": "riak_kv.max_object_size",
+ "valid": "a byte size with units, e.g. 10GB"
+ },
+ "object.size.warning_threshold": {
+ "default": "5MB",
+ "description": "Reading or writing objects bigger than this size will write a\nwarning in the logs.",
+ "example": "5MB",
+ "internal_key": "riak_kv.warn_object_size",
+ "valid": "a byte size with units, e.g. 10GB"
+ },
+ "platform_bin_dir": {
+ "default": "./bin",
+ "description": "Platform-specific installation paths (substituted by rebar)",
+ "example": "./bin",
+ "internal_key": "riak_core.platform_bin_dir",
+ "valid": "the path to a directory"
+ },
+ "platform_data_dir": {
+ "default": "./data",
+ "description": "Platform-specific installation paths (substituted by rebar)",
+ "example": "./data",
+ "internal_key": "riak_core.platform_data_dir",
+ "valid": "the path to a directory"
+ },
+ "platform_etc_dir": {
+ "default": "./etc",
+ "description": "Platform-specific installation paths (substituted by rebar)",
+ "example": "./etc",
+ "internal_key": "riak_core.platform_etc_dir",
+ "valid": "the path to a directory"
+ },
+ "platform_lib_dir": {
+ "default": "./lib",
+ "description": "Platform-specific installation paths (substituted by rebar)",
+ "example": "./lib",
+ "internal_key": "riak_core.platform_lib_dir",
+ "valid": "the path to a directory"
+ },
+ "platform_log_dir": {
+ "default": "./log",
+ "description": "Platform-specific installation paths (substituted by rebar)",
+ "example": "./log",
+ "internal_key": "riak_core.platform_log_dir",
+ "valid": "the path to a directory"
+ },
+ "protobuf.backlog": {
+ "default": "128",
+ "description": "The maximum length to which the queue of pending connections\nmay grow. If set, it must be an integer > 0. If you anticipate a\nhuge number of connections being initialized *simultaneously*, set\nthis number higher.",
+ "example": "",
+ "internal_key": "riak_api.pb_backlog",
+ "valid": "an integer"
+ },
+ "protobuf.nagle": {
+ "default": "off",
+ "description": "Turns off Nagle's algorithm for Protocol Buffers\nconnections. This is equivalent to setting the TCP_NODELAY option\non the socket.",
+ "example": "",
+ "internal_key": "riak_api.disable_pb_nagle",
+ "valid": ["on", "off"]
+ },
+ "retry_put_coordinator_failure": {
+ "default": "on",
+ "description": "If forwarding to a replica-local coordinator on PUT fails,\nthis setting will retry the operation when set to 'on'.\n* on = Riak 2.0 behavior (strongly recommended)\n* off = Riak 1.x behavior",
+ "example": "",
+ "internal_key": "riak_kv.retry_put_coordinator_failure",
+ "valid": ["on", "off"]
+ },
+ "riak_control": {
+ "default": "off",
+ "description": "Set to 'off' to disable the admin panel.",
+ "example": "off",
+ "internal_key": "riak_control.enabled",
+ "valid": ["on", "off"]
+ },
+ "riak_control.auth.mode": {
+ "default": "off",
+ "description": "Authentication mode used for access to the admin panel.",
+ "example": "off",
+ "internal_key": "riak_control.auth",
+ "valid": ["off", "userlist"]
+ },
+ "ring.state_dir": {
+ "default": "$(platform_data_dir)/ring",
+ "description": "Default location of ringstate",
+ "example": "",
+ "internal_key": "riak_core.ring_state_dir",
+ "valid": "the path to a directory"
+ },
+ "ring_size": {
+ "default": "64",
+ "description": "Number of partitions in the cluster (only valid when first\ncreating the cluster). Must be a power of 2, minimum 8 and maximum\n1024.",
+ "example": "128",
+ "internal_key": "riak_core.ring_creation_size",
+ "valid": "an integer"
+ },
+ "runtime_health.thresholds.busy_ports": {
+ "default": "2",
+ "description": "The threshold at which to warn about the number of ports that\nare overly busy. Ports with full input buffers count toward this\nthreshold.",
+ "example": "",
+ "internal_key": "riak_sysmon.port_limit",
+ "valid": "an integer"
+ },
+ "runtime_health.thresholds.busy_processes": {
+ "default": "30",
+ "description": "The threshold at which to warn about the number of processes\nthat are overly busy. Processes with large heaps or that take a\nlong time to garbage collect will count toward this threshold.",
+ "example": "",
+ "internal_key": "riak_sysmon.process_limit",
+ "valid": "an integer"
+ },
+ "runtime_health.triggers.distribution_port": {
+ "default": "on",
+ "description": "Whether distribution ports with full input buffers will be\ncounted as busy. Distribution ports connect Riak nodes within a\nsingle cluster.\nSee also:\n runtime_health.thresholds.busy_ports",
+ "example": "",
+ "internal_key": "riak_sysmon.busy_dist_port",
+ "valid": ["on", "off"]
+ },
+ "runtime_health.triggers.port": {
+ "default": "on",
+ "description": "Whether ports with full input buffers will be counted as\nbusy. Ports can represent open files or network sockets.\nSee also:\n runtime_health.thresholds.busy_ports",
+ "example": "",
+ "internal_key": "riak_sysmon.busy_port",
+ "valid": ["on", "off"]
+ },
+ "runtime_health.triggers.process.garbage_collection": {
+ "default": "off",
+ "description": "A process will become busy when it exceeds this amount of time\ndoing garbage collection.\nNOTE: Enabling this setting can cause performance problems on\nmulti-core systems.\nSee also:\n runtime_health.thresholds.busy_processes",
+ "example": "",
+ "internal_key": "riak_sysmon.gc_ms_limit",
+ "valid": "the text 'off', or a time duration with units, e.g. '10s' for 10 seconds"
+ },
+ "runtime_health.triggers.process.heap_size": {
+ "default": "160444000",
+ "description": "A process will become busy when its heap exceeds this size.\nSee also:\n runtime_health.thresholds.busy_processes",
+ "example": "",
+ "internal_key": "riak_sysmon.heap_word_limit",
+ "valid": "a byte size with units, e.g. 10GB"
+ },
+ "runtime_health.triggers.process.long_schedule": {
+ "default": "off",
+ "description": "A process will become busy when it exceeds this amount of time\nduring a single process scheduling & execution cycle.",
+ "example": "",
+ "internal_key": "riak_sysmon.schedule_ms_limit",
+ "valid": "the text 'off', or a time duration with units, e.g. '10s' for 10 seconds"
+ },
+ "sasl": {
+ "default": "off",
+ "description": "Whether to enable Erlang's built-in error logger.",
+ "example": "",
+ "internal_key": "sasl.sasl_error_logger",
+ "valid": ["on", "off"]
+ },
+ "search": {
+ "default": "off",
+ "description": "To enable Search set this 'on'.",
+ "example": "on",
+ "internal_key": "yokozuna.enabled",
+ "valid": ["on", "off"]
+ },
+ "search.anti_entropy.data_dir": {
+ "default": "$(platform_data_dir)/yz_anti_entropy",
+ "description": "The directory where Search's Active Anti-Entropy data files\nare stored",
+ "example": "",
+ "internal_key": "yokozuna.anti_entropy_data_dir",
+ "valid": "the path to a directory"
+ },
+ "search.root_dir": {
+ "default": "$(platform_data_dir)/yz",
+ "description": "The root directory for Search, under which index data and\nconfiguration is stored.",
+ "example": "",
+ "internal_key": "yokozuna.root_dir",
+ "valid": "the path to a directory"
+ },
+ "search.solr.jmx_port": {
+ "default": "8985",
+ "description": "The port number which Solr JMX binds to.\nNOTE: Binds on every interface.",
+ "example": "8985",
+ "internal_key": "yokozuna.solr_jmx_port",
+ "valid": "an integer"
+ },
+ "search.solr.jvm_options": {
+ "default": "-d64 -Xms1g -Xmx1g -XX:+UseStringCache -XX:+UseCompressedOops",
+ "description": "The options to pass to the Solr JVM. Non-standard options,\ni.e. -XX, may not be portable across JVM implementations.\nE.g. -XX:+UseCompressedStrings",
+ "example": "-d64 -Xms1g -Xmx1g -XX:+UseStringCache -XX:+UseCompressedOops",
+ "internal_key": "yokozuna.solr_jvm_opts",
+ "valid": "text"
+ },
+ "search.solr.port": {
+ "default": "8093",
+ "description": "The port number which Solr binds to.\nNOTE: Binds on every interface.",
+ "example": "8093",
+ "internal_key": "yokozuna.solr_port",
+ "valid": "an integer"
+ },
+ "search.solr.start_timeout": {
+ "default": "30s",
+ "description": "How long Riak will wait for Solr to start. The start sequence\nwill be tried twice. If both attempts timeout, then the Riak node\nwill be shutdown. This may need to be increased as more data is\nindexed and Solr takes longer to start. Values lower than 1s will\nbe rounded up to the minimum 1s.",
+ "example": "30s",
+ "internal_key": "yokozuna.solr_startup_wait",
+ "valid": "a time duration with units, e.g. '10s' for 10 seconds"
+ },
+ "secure_referer_check": {
+ "default": "on",
+ "description": "Measures were added to Riak 1.2 to counteract cross-site\nscripting and request-forgery attacks. Some reverse-proxies cannot\nremove the Referer header and make serving data directly from Riak\nimpossible. Turning secure_referer_check = off disables this\nsecurity check.",
+ "example": "",
+ "internal_key": "riak_kv.secure_referer_check",
+ "valid": ["on", "off"]
+ },
+ "storage_backend": {
+ "default": "bitcask",
+ "description": "Specifies the storage engine used for Riak's key-value data\nand secondary indexes (if supported).",
+ "example": "bitcask",
+ "internal_key": "riak_kv.storage_backend",
+ "valid": ["bitcask", "leveldb", "memory", "multi", "prefix_multi"]
+ },
+ "strong_consistency": {
+ "default": "off",
+ "description": "Enable consensus subsystem. Set to 'on' to enable the\nconsensus subsystem used for strongly consistent Riak operations.",
+ "example": "",
+ "internal_key": "riak_core.enable_consensus",
+ "valid": ["on", "off"]
+ },
+ "tls_protocols.sslv3": {
+ "default": "off",
+ "description": "Determine which SSL/TLS versions are allowed. By default only TLS 1.2\nis allowed, but other versions can be enabled if clients don't support the\nlatest TLS standard. It is *strongly* recommended that SSLv3 is not enabled\nunless absolutely necessary. More than one protocol can be enabled at once.",
+ "example": "",
+ "internal_key": "riak_api.tls_protocols",
+ "valid": ["on", "off"]
+ },
+ "tls_protocols.tlsv1": {
+ "default": "off",
+ "description": "Determine which SSL/TLS versions are allowed. By default only TLS 1.2\nis allowed, but other versions can be enabled if clients don't support the\nlatest TLS standard. It is *strongly* recommended that SSLv3 is not enabled\nunless absolutely necessary. More than one protocol can be enabled at once.",
+ "example": "",
+ "internal_key": "riak_api.tls_protocols",
+ "valid": ["on", "off"]
+ },
+ "tls_protocols.tlsv1.1": {
+ "default": "off",
+ "description": "Determine which SSL/TLS versions are allowed. By default only TLS 1.2\nis allowed, but other versions can be enabled if clients don't support the\nlatest TLS standard. It is *strongly* recommended that SSLv3 is not enabled\nunless absolutely necessary. More than one protocol can be enabled at once.",
+ "example": "",
+ "internal_key": "riak_api.tls_protocols",
+ "valid": ["on", "off"]
+ },
+ "tls_protocols.tlsv1.2": {
+ "default": "on",
+ "description": "Determine which SSL/TLS versions are allowed. By default only TLS 1.2\nis allowed, but other versions can be enabled if clients don't support the\nlatest TLS standard. It is *strongly* recommended that SSLv3 is not enabled\nunless absolutely necessary. More than one protocol can be enabled at once.",
+ "example": "",
+ "internal_key": "riak_api.tls_protocols",
+ "valid": ["on", "off"]
+ },
+ "transfer_limit": {
+ "default": "2",
+ "description": "Number of concurrent node-to-node transfers allowed.",
+ "example": "",
+ "internal_key": "riak_core.handoff_concurrency",
+ "valid": "an integer"
+ },
+ "vnode_management_timer": {
+ "default": "10s",
+ "description": "Interval of time between vnode management\nactivities. Modifying this will change the amount of time between\nattemps to trigger handoff between this node and any other member\nof the cluster.",
+ "example": "",
+ "internal_key": "riak_core.vnode_management_timer",
+ "valid": "a time duration with units, e.g. '10s' for 10 seconds"
+ }
+ };
+});
+define("ember-riak-explorer/utils/riak-help/riak_status",["exports"],function(exports){exports["default"] = {"asn1_version":{"category":"versions","concern":"config","description":"","example":"2.0.3","json_schema_type":"string","metric_type":"nominal","name":"asn1_version","period":"current","scope":"config","units":"n/a"},"basho_stats_version":{"category":"versions","concern":"config","description":"[Basho Stats](http://github.com/basho/basho_stats)","example":"1.0.3","json_schema_type":"string","metric_type":"nominal","name":"basho_stats_version","period":"current","scope":"config","units":"n/a"},"bitcask_version":{"category":"versions","concern":"config","description":"[Bitcask](http://github.com/basho/bitcask)","example":"1.7.2","json_schema_type":"string","metric_type":"nominal","name":"bitcask_version","period":"current","scope":"config","units":"n/a"},"clique_version":{"category":"versions","concern":"config","description":"","example":"0.3.2-0-ge332c8f","json_schema_type":"string","metric_type":"nominal","name":"clique_version","period":"current","scope":"config","units":"n/a"},"cluster_info_version":{"category":"versions","concern":"config","description":"[Cluster Information](http://github.com/basho/cluster_info)","example":"2.0.3-0-g76c73fc","json_schema_type":"string","metric_type":"nominal","name":"cluster_info_version","period":"current","scope":"config","units":"n/a"},"compiler_version":{"category":"versions","concern":"config","description":"[Erlang Compiler](http://erlang.org/doc/apps/compiler/)","example":"4.9.3","json_schema_type":"string","metric_type":"nominal","name":"compiler_version","period":"current","scope":"config","units":"n/a"},"connected_nodes":{"category":"cluster state","concern":"core","description":"A list of the nodes that this node is aware of at this time","example":"[]","json_schema_type":"array","metric_type":"nominal","name":"connected_nodes","period":"current","scope":"cluster","units":"n/a"},"consistent_get_objsize_100":{"category":"object size","concern":"strong_consistency","description":"100th-percentile object size for strongly consistent GETs on this node in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_get_objsize_100","period":"1 minute","scope":"node","units":"bytes"},"consistent_get_objsize_95":{"category":"object size","concern":"strong_consistency","description":"95th-percentile object size for strongly consistent GETs on this node in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_get_objsize_95","period":"1 minute","scope":"node","units":"bytes"},"consistent_get_objsize_99":{"category":"object size","concern":"strong_consistency","description":"99th-percentile object size for strongly consistent GETs on this node in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_get_objsize_99","period":"1 minute","scope":"node","units":"bytes"},"consistent_get_objsize_mean":{"category":"object size","concern":"strong_consistency","description":"Mean object size for strongly consistent GETs on this node in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_get_objsize_mean","period":"1 minute","scope":"node","units":"bytes"},"consistent_get_objsize_median":{"category":"object size","concern":"strong_consistency","description":"Median object size for strongly consistent GETs on this node in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_get_objsize_median","period":"1 minute","scope":"node","units":"bytes"},"consistent_get_time_100":{"category":"latency","concern":"strong_consistency","description":"100th-percentile time between reception of client GETs to strongly consistent keys and subsequent response","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_get_time_100","period":"1 minute","scope":"node","units":"microseconds"},"consistent_get_time_95":{"category":"latency","concern":"strong_consistency","description":"95th-percentile time between reception of client GETs to strongly consistent keys and subsequent response","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_get_time_95","period":"1 minute","scope":"node","units":"microseconds"},"consistent_get_time_99":{"category":"latency","concern":"strong_consistency","description":"99th-percentile time between reception of client GETs to strongly consistent keys and subsequent response","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_get_time_99","period":"1 minute","scope":"node","units":"microseconds"},"consistent_get_time_mean":{"category":"latency","concern":"strong_consistency","description":"Mean time between reception of client GETs to strongly consistent keys and subsequent response","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_get_time_mean","period":"1 minute","scope":"node","units":"microseconds"},"consistent_get_time_median":{"category":"latency","concern":"strong_consistency","description":"Median time between reception of client GETs to strongly consistent keys and subsequent response","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_get_time_median","period":"1 minute","scope":"node","units":"microseconds"},"consistent_gets":{"category":"throughput - read","concern":"strong_consistency","description":"Consistent reads on this node","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_gets","period":"1 minute","scope":"node","units":"operations"},"consistent_gets_total":{"category":"throughput - read","concern":"strong_consistency","description":"Total number of strongly consistent GETs coordinated by this node","example":"0","json_schema_type":"number","metric_type":"summary","name":"consistent_gets_total","period":"since start","scope":"node","units":"operations"},"consistent_put_objsize_100":{"category":"object size","concern":"strong_consistency","description":"100th-percentile object size for strongly consistent PUTs on this node in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_put_objsize_100","period":"1 minute","scope":"node","units":"bytes"},"consistent_put_objsize_95":{"category":"object size","concern":"strong_consistency","description":"95th-percentile object size for strongly consistent PUTs on this node in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_put_objsize_95","period":"1 minute","scope":"node","units":"bytes"},"consistent_put_objsize_99":{"category":"object size","concern":"strong_consistency","description":"99th-percentile object size for strongly consistent PUTs on this node in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_put_objsize_99","period":"1 minute","scope":"node","units":"bytes"},"consistent_put_objsize_mean":{"category":"object size","concern":"strong_consistency","description":"Mean object size for strongly consistent PUTs on this node in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_put_objsize_mean","period":"1 minute","scope":"node","units":"bytes"},"consistent_put_objsize_median":{"category":"object size","concern":"strong_consistency","description":"Median object size for strongly consistent PUTs on this node in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_put_objsize_median","period":"1 minute","scope":"node","units":"bytes"},"consistent_put_time_100":{"category":"latency","concern":"strong_consistency","description":"100th-percentile time between reception of client PUTs to strongly consistent keys and subsequent response","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_put_time_100","period":"1 minute","scope":"node","units":"microseconds"},"consistent_put_time_95":{"category":"latency","concern":"strong_consistency","description":"95th-percentile time between reception of client PUTs to strongly consistent keys and subsequent response","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_put_time_95","period":"1 minute","scope":"node","units":"microseconds"},"consistent_put_time_99":{"category":"latency","concern":"strong_consistency","description":"99th-percentile time between reception of client PUTs to strongly consistent keys and subsequent response","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_put_time_99","period":"1 minute","scope":"node","units":"microseconds"},"consistent_put_time_mean":{"category":"latency","concern":"strong_consistency","description":"Mean time between reception of client PUTs to strongly consistent keys and subsequent response","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_put_time_mean","period":"1 minute","scope":"node","units":"microseconds"},"consistent_put_time_median":{"category":"latency","concern":"strong_consistency","description":"Median time between reception of client PUTs to strongly consistent keys and subsequent response","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_put_time_median","period":"1 minute","scope":"node","units":"microseconds"},"consistent_puts":{"category":"throughput - write","concern":"strong_consistency","description":"Consistent writes on this node","example":"0","json_schema_type":"number","metric_type":"interval","name":"consistent_puts","period":"1 minute","scope":"node","units":"operations"},"consistent_puts_total":{"category":"throughput - write","concern":"strong_consistency","description":"Total number of strongly consistent PUTs coordinated by this node","example":"0","json_schema_type":"number","metric_type":"summary","name":"consistent_puts_total","period":"since start","scope":"node","units":"operations"},"converge_delay_last":{"category":"latency","concern":"core","description":"Last observed histogram value in milliseconds describing time taken for the ring to converge after ring changes","example":"0","json_schema_type":"number","metric_type":"interval","name":"converge_delay_last","period":"?","scope":"node","units":"milliseconds"},"converge_delay_max":{"category":"latency","concern":"core","description":"Maximum time in milliseconds describing time taken for the ring to converge after ring changes","example":"0","json_schema_type":"number","metric_type":"interval","name":"converge_delay_max","period":"?","scope":"node","units":"milliseconds"},"converge_delay_mean":{"category":"latency","concern":"core","description":"Mean time in milliseconds describing time taken for the ring to converge after ring changes","example":"0","json_schema_type":"number","metric_type":"interval","name":"converge_delay_mean","period":"?","scope":"node","units":"milliseconds"},"converge_delay_min":{"category":"latency","concern":"core","description":"Minimum time in milliseconds describing time taken for the ring to converge after ring changes","example":"0","json_schema_type":"number","metric_type":"interval","name":"converge_delay_min","period":"?","scope":"node","units":"milliseconds"},"coord_redirs_total":{"category":"load","concern":"core","description":"Total number of requests this node has redirected to other nodes for coordination","example":"0","json_schema_type":"number","metric_type":"summary","name":"coord_redirs_total","period":"since start","scope":"node","units":"redirects"},"counter_actor_counts_100":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"counter_actor_counts_100","period":"1 minute","scope":"node","units":"?"},"counter_actor_counts_95":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"counter_actor_counts_95","period":"1 minute","scope":"node","units":"?"},"counter_actor_counts_99":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"counter_actor_counts_99","period":"1 minute","scope":"node","units":"?"},"counter_actor_counts_mean":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"counter_actor_counts_mean","period":"1 minute","scope":"node","units":"?"},"counter_actor_counts_median":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"counter_actor_counts_median","period":"1 minute","scope":"node","units":"?"},"cpu_avg1":{"category":"load","concern":"resources","description":"The average number of active processes for the last 1 minute (equivalent to top(1) command's load average when divided by 256())","example":"1198","json_schema_type":"number","metric_type":"interval","name":"cpu_avg1","period":"1 minute","scope":"erlang vm","units":"processes"},"cpu_avg15":{"category":"load","concern":"resources","description":"The average number of active processes for the last 15 minutes (equivalent to top(1) command's load average when divided by 256())","example":"1083","json_schema_type":"number","metric_type":"interval","name":"cpu_avg15","period":"15 minutes","scope":"erlang vm","units":"processes"},"cpu_avg5":{"category":"load","concern":"resources","description":"The average number of active processes for the last 5 minutes (equivalent to top(1) command's load average when divided by 256())","example":"1190","json_schema_type":"number","metric_type":"interval","name":"cpu_avg5","period":"5 minutes","scope":"erlang vm","units":"processes"},"cpu_nprocs":{"category":"load","concern":"resources","description":"Number of operating system processes","example":"375","json_schema_type":"number","metric_type":"interval","name":"cpu_nprocs","period":"current","scope":"erlang vm","units":"processes"},"crypto_version":{"category":"versions","concern":"config","description":"[Erlang crypto](http://erlang.org/doc/apps/crypto/)","example":"3.1","json_schema_type":"string","metric_type":"nominal","name":"crypto_version","period":"current","scope":"config","units":"n/a"},"disk":{"category":"usage","concern":"resources","description":"Information about the disk, taken from Erlang's disksup module. Reported as [{\"ID\",KBytes_Used,Percent_Util}].","example":"[{\"/\", 487401624, 96}]","json_schema_type":"array","metric_type":"nominal","name":"disk","period":"current","scope":"node","units":"n/a"},"dropped_vnode_requests_total":{"category":"load","concern":"core","description":"Total number of requests dropped by local vnodes since the node was started","example":"0","json_schema_type":"number","metric_type":"summary","name":"dropped_vnode_requests_total","period":"since start","scope":"node","units":"requests"},"eleveldb_version":{"category":"versions","concern":"config","description":"","example":"2.1.10-0-g0537ca9","json_schema_type":"string","metric_type":"nominal","name":"eleveldb_version","period":"current","scope":"config","units":"n/a"},"erlang_js_version":{"category":"versions","concern":"config","description":"[Erlang JS](http://github.com/basho/erlang_js)","example":"1.3.0-0-g07467d8","json_schema_type":"string","metric_type":"nominal","name":"erlang_js_version","period":"current","scope":"config","units":"n/a"},"erlydtl_version":{"category":"versions","concern":"config","description":"[ErlyDTL](http://github.com/erlydtl/erlydtl)","example":"0.7.0","json_schema_type":"string","metric_type":"nominal","name":"erlydtl_version","period":"current","scope":"config","units":"n/a"},"executing_mappers":{"category":"load","concern":"core","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"executing_mappers","period":"current","scope":"node","units":"mappers"},"exometer_core_version":{"category":"versions","concern":"config","description":"","example":"1.0.0-basho2-0-gb47a5d6","json_schema_type":"string","metric_type":"nominal","name":"exometer_core_version","period":"current","scope":"config","units":"n/a"},"goldrush_version":{"category":"versions","concern":"config","description":"[Goldrush](http://github.com/DeadZen/goldrush)","example":"0.1.7","json_schema_type":"string","metric_type":"nominal","name":"goldrush_version","period":"current","scope":"config","units":"n/a"},"gossip_received":{"category":"load","concern":"core","description":"Number of gossip messages received in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"gossip_received","period":"1 minute","scope":"node","units":"messages"},"handoff_timeouts":{"category":"load","concern":"core","description":"Total number of handoff timeouts encountered by this node since it was started","example":"0","json_schema_type":"number","metric_type":"interval","name":"handoff_timeouts","period":"since start","scope":"node","units":"timeouts"},"ibrowse_version":{"category":"versions","concern":"config","description":"","example":"4.0.2","json_schema_type":"string","metric_type":"nominal","name":"ibrowse_version","period":"current","scope":"config","units":"n/a"},"ignored_gossip_total":{"category":"load","concern":"core","description":"Total number of ignored gossip messages since node was started","example":"0","json_schema_type":"number","metric_type":"summary","name":"ignored_gossip_total","period":"since start","scope":"node","units":"messages"},"index_fsm_active":{"category":"load","concern":"secondary_index","description":"Number of active Secondary Index FSMs","example":"0","json_schema_type":"number","metric_type":"interval","name":"index_fsm_active","period":"current","scope":"node","units":"finite state machines"},"index_fsm_create":{"category":"load","concern":"secondary_index","description":"Number of Secondary Index query FSMs created in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"index_fsm_create","period":"1 minute","scope":"node","units":"finite state machines"},"index_fsm_create_error":{"category":"errors","concern":"secondary_index","description":"Number of Secondary Index query FSM creation errors in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"index_fsm_create_error","period":"1 minute","scope":"node","units":"errors"},"inets_version":{"category":"versions","concern":"config","description":"[inets](http://erlang.org/doc/apps/inets/)","example":"5.9.6","json_schema_type":"string","metric_type":"nominal","name":"inets_version","period":"current","scope":"config","units":"n/a"},"kernel_version":{"category":"versions","concern":"config","description":"[Kernel](http://erlang.org/doc/apps/kernel/)","example":"2.16.3","json_schema_type":"string","metric_type":"nominal","name":"kernel_version","period":"current","scope":"config","units":"n/a"},"lager_version":{"category":"versions","concern":"config","description":"[Lager](http://github.com/DeadZen/lager)","example":"2.1.1","json_schema_type":"string","metric_type":"nominal","name":"lager_version","period":"current","scope":"config","units":"n/a"},"late_put_fsm_coordinator_ack":{"category":"load","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"late_put_fsm_coordinator_ack","period":"?","scope":"node","units":"?"},"leveldb_read_block_error":{"category":"errors","concern":"kv","description":"The number of LevelDB read block errors. Will read as undefined if LevelDB is not being used.","example":"undefined","json_schema_type":"number","metric_type":"interval","name":"leveldb_read_block_error","period":"since start","scope":"node","units":"errors"},"list_fsm_active":{"category":"load","concern":"kv","description":"Number of active Keylisting FSMs","example":"0","json_schema_type":"number","metric_type":"interval","name":"list_fsm_active","period":"current","scope":"node","units":"finite state machines"},"list_fsm_create":{"category":"load","concern":"kv","description":"Number of Keylisting FSMs created in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"list_fsm_create","period":"1 minute","scope":"node","units":"finite state machines"},"list_fsm_create_error":{"category":"errors","concern":"kv","description":"Number of Keylisting FSM creation errors in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"list_fsm_create_error","period":"1 minute","scope":"node","units":"errors"},"list_fsm_create_error_total":{"category":"errors","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"list_fsm_create_error_total","period":"since start","scope":"node","units":"errors"},"list_fsm_create_total":{"category":"load","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"list_fsm_create_total","period":"since start","scope":"node","units":"finite state machines"},"map_actor_counts_100":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"map_actor_counts_100","period":"1 minute","scope":"node","units":"?"},"map_actor_counts_95":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"map_actor_counts_95","period":"1 minute","scope":"node","units":"?"},"map_actor_counts_99":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"map_actor_counts_99","period":"1 minute","scope":"node","units":"?"},"map_actor_counts_mean":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"map_actor_counts_mean","period":"1 minute","scope":"node","units":"?"},"map_actor_counts_median":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"map_actor_counts_median","period":"1 minute","scope":"node","units":"?"},"mem_allocated":{"category":"load","concern":"resources","description":"Total memory allocated for this node","example":"7147700224","json_schema_type":"number","metric_type":"summary","name":"mem_allocated","period":"current","scope":"erlang vm","units":"bytes"},"mem_total":{"category":"load","concern":"resources","description":"Total available system memory","example":"7278239744","json_schema_type":"number","metric_type":"summary","name":"mem_total","period":"current","scope":"erlang vm","units":"bytes"},"memory_atom":{"category":"load","concern":"resources","description":"Total amount of memory currently allocated for atom storage","example":"654217","json_schema_type":"number","metric_type":"summary","name":"memory_atom","period":"current","scope":"erlang vm","units":"bytes"},"memory_atom_used":{"category":"load","concern":"resources","description":"Total amount of memory currently used for atom storage","example":"626645","json_schema_type":"number","metric_type":"summary","name":"memory_atom_used","period":"current","scope":"erlang vm","units":"bytes"},"memory_binary":{"category":"load","concern":"resources","description":"Total amount of memory used for binaries","example":"678248","json_schema_type":"number","metric_type":"summary","name":"memory_binary","period":"current","scope":"erlang vm","units":"bytes"},"memory_code":{"category":"load","concern":"resources","description":"Total amount of memory allocated for Erlang code","example":"14133818","json_schema_type":"number","metric_type":"summary","name":"memory_code","period":"current","scope":"erlang vm","units":"bytes"},"memory_ets":{"category":"load","concern":"resources","description":"Total memory allocated for Erlang Term Storage","example":"7834360","json_schema_type":"number","metric_type":"summary","name":"memory_ets","period":"current","scope":"erlang vm","units":"bytes"},"memory_processes":{"category":"load","concern":"resources","description":"Total amount of memory allocated for Erlang processes (in bytes)","example":"45176432","json_schema_type":"number","metric_type":"summary","name":"memory_processes","period":"current","scope":"erlang vm","units":"bytes"},"memory_processes_used":{"category":"load","concern":"resources","description":"Total amount of memory used by Erlang processes (in bytes)","example":"45174592","json_schema_type":"number","metric_type":"summary","name":"memory_processes_used","period":"current","scope":"erlang vm","units":"bytes"},"memory_system":{"category":"load","concern":"resources","description":"Total allocated memory that is not directly related to an Erlang process","example":"41938336","json_schema_type":"number","metric_type":"summary","name":"memory_system","period":"current","scope":"erlang vm","units":"bytes"},"memory_total":{"category":"load","concern":"resources","description":"Total allocated memory (sum of processes and system)","example":"87114768","json_schema_type":"number","metric_type":"summary","name":"memory_total","period":"current","scope":"erlang vm","units":"bytes"},"merge_index_version":{"category":"versions","concern":"config","description":"[Merge Index](http://github.com/basho/merge_index)","example":"2.0.1-0-g0c8f77c","json_schema_type":"string","metric_type":"nominal","name":"merge_index_version","period":"current","scope":"config","units":"n/a"},"mochiweb_version":{"category":"versions","concern":"config","description":"[MochiWeb](http://github.com/basho/mochiweb)","example":"2.9.0","json_schema_type":"string","metric_type":"nominal","name":"mochiweb_version","period":"current","scope":"config","units":"n/a"},"node_get_fsm_active":{"category":"load","concern":"kv","description":"Number of active GET FSMs","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_active","period":"current","scope":"node","units":"finite state machines"},"node_get_fsm_active_60s":{"category":"load","concern":"kv","description":"Number of GET FSMs active in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_active_60s","period":"1 minute","scope":"node","units":"finite state machines"},"node_get_fsm_counter_objsize_100":{"category":"object size","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_counter_objsize_100","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_counter_objsize_95":{"category":"object size","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_counter_objsize_95","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_counter_objsize_99":{"category":"object size","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_counter_objsize_99","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_counter_objsize_mean":{"category":"object size","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_counter_objsize_mean","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_counter_objsize_median":{"category":"object size","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_counter_objsize_median","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_counter_siblings_100":{"category":"siblings","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_counter_siblings_100","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_counter_siblings_95":{"category":"siblings","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_counter_siblings_95","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_counter_siblings_99":{"category":"siblings","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_counter_siblings_99","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_counter_siblings_mean":{"category":"siblings","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_counter_siblings_mean","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_counter_siblings_median":{"category":"siblings","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_counter_siblings_median","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_counter_time_100":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_counter_time_100","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_counter_time_95":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_counter_time_95","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_counter_time_99":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_counter_time_99","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_counter_time_mean":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_counter_time_mean","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_counter_time_median":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_counter_time_median","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_errors":{"category":"errors","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_errors","period":"1 minute","scope":"node","units":"errors"},"node_get_fsm_errors_total":{"category":"errors","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"node_get_fsm_errors_total","period":"since start","scope":"node","units":"errors"},"node_get_fsm_in_rate":{"category":"load","concern":"kv","description":"Average number of GET FSMs enqueued by Sidejob's overload protection","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_in_rate","period":"current","scope":"node","units":"finite state machines"},"node_get_fsm_map_objsize_100":{"category":"object size","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_map_objsize_100","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_map_objsize_95":{"category":"object size","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_map_objsize_95","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_map_objsize_99":{"category":"object size","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_map_objsize_99","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_map_objsize_mean":{"category":"object size","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_map_objsize_mean","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_map_objsize_median":{"category":"object size","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_map_objsize_median","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_map_siblings_100":{"category":"siblings","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_map_siblings_100","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_map_siblings_95":{"category":"siblings","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_map_siblings_95","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_map_siblings_99":{"category":"siblings","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_map_siblings_99","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_map_siblings_mean":{"category":"siblings","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_map_siblings_mean","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_map_siblings_median":{"category":"siblings","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_map_siblings_median","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_map_time_100":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_map_time_100","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_map_time_95":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_map_time_95","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_map_time_99":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_map_time_99","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_map_time_mean":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_map_time_mean","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_map_time_median":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_map_time_median","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_objsize_100":{"category":"object size","concern":"kv","description":"100th percentile object size encountered by this node within the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_objsize_100","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_objsize_95":{"category":"object size","concern":"kv","description":"95th percentile object size encountered by this node within the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_objsize_95","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_objsize_99":{"category":"object size","concern":"kv","description":"99th percentile object size encountered by this node within the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_objsize_99","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_objsize_mean":{"category":"object size","concern":"kv","description":"Mean object size encountered by this node within the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_objsize_mean","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_objsize_median":{"category":"object size","concern":"kv","description":"Median object size encountered by this node within the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_objsize_median","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_out_rate":{"category":"load","concern":"kv","description":"Average number of GET FSMs dequeued by Sidejob's overload protection","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_out_rate","period":"current","scope":"node","units":"finite state machines"},"node_get_fsm_rejected":{"category":"load","concern":"kv","description":"Number of GET FSMs actively being rejected by Sidejob's overload protection","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_rejected","period":"current","scope":"node","units":"rejections"},"node_get_fsm_rejected_60s":{"category":"load","concern":"kv","description":"Number of GET FSMs rejected by Sidejob's overload protection in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_rejected_60s","period":"1 minute","scope":"node","units":"rejections"},"node_get_fsm_rejected_total":{"category":"load","concern":"kv","description":"Total number of GET FSMs rejected by Sidejob's overload protection","example":"0","json_schema_type":"number","metric_type":"summary","name":"node_get_fsm_rejected_total","period":"since start","scope":"node","units":"rejections"},"node_get_fsm_set_objsize_100":{"category":"object size","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_set_objsize_100","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_set_objsize_95":{"category":"object size","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_set_objsize_95","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_set_objsize_99":{"category":"object size","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_set_objsize_99","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_set_objsize_mean":{"category":"object size","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_set_objsize_mean","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_set_objsize_median":{"category":"object size","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_set_objsize_median","period":"1 minute","scope":"node","units":"bytes"},"node_get_fsm_set_siblings_100":{"category":"siblings","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_set_siblings_100","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_set_siblings_95":{"category":"siblings","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_set_siblings_95","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_set_siblings_99":{"category":"siblings","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_set_siblings_99","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_set_siblings_mean":{"category":"siblings","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_set_siblings_mean","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_set_siblings_median":{"category":"siblings","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_set_siblings_median","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_set_time_100":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_set_time_100","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_set_time_95":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_set_time_95","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_set_time_99":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_set_time_99","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_set_time_mean":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_set_time_mean","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_set_time_median":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_set_time_median","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_siblings_100":{"category":"siblings","concern":"kv","description":"100th percentile of siblings encountered during all GET operations by this node within the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_siblings_100","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_siblings_95":{"category":"siblings","concern":"kv","description":"95th percentile of siblings encountered during all GET operations by this node within the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_siblings_95","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_siblings_99":{"category":"siblings","concern":"kv","description":"99th percentile of siblings encountered during all GET operations by this node within the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_siblings_99","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_siblings_mean":{"category":"siblings","concern":"kv","description":"Mean number of siblings encountered during all GET operations by this node within the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_siblings_mean","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_siblings_median":{"category":"siblings","concern":"kv","description":"Median number of siblings encountered during all GET operations by this node within the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_siblings_median","period":"1 minute","scope":"node","units":"siblings"},"node_get_fsm_time_100":{"category":"latency","concern":"kv","description":"100th percentile time between reception of client GET request and subsequent response to client","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_time_100","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_time_95":{"category":"latency","concern":"kv","description":"95th percentile time between reception of client GET request and subsequent response to client","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_time_95","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_time_99":{"category":"latency","concern":"kv","description":"99th percentile time between reception of client GET request and subsequent response to client","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_time_99","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_time_mean":{"category":"latency","concern":"kv","description":"Mean time between reception of client GET request and subsequent response to client","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_time_mean","period":"1 minute","scope":"node","units":"microseconds"},"node_get_fsm_time_median":{"category":"latency","concern":"kv","description":"Median time between reception of client GET request and subsequent response to client","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_get_fsm_time_median","period":"1 minute","scope":"node","units":"microseconds"},"node_gets":{"category":"throughput - read","concern":"kv","description":"Reads coordinated by this node","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_gets","period":"1 minute","scope":"node","units":"operations"},"node_gets_counter":{"category":"throughput - read","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_gets_counter","period":"1 minute","scope":"node","units":"operations"},"node_gets_counter_total":{"category":"throughput - read","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"node_gets_counter_total","period":"since start","scope":"node","units":"operations"},"node_gets_map":{"category":"throughput - read","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_gets_map","period":"1 minute","scope":"node","units":"operations"},"node_gets_map_total":{"category":"throughput - read","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"node_gets_map_total","period":"since start","scope":"node","units":"operations"},"node_gets_set":{"category":"throughput - read","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_gets_set","period":"1 minute","scope":"node","units":"operations"},"node_gets_set_total":{"category":"throughput - read","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"node_gets_set_total","period":"since start","scope":"node","units":"operations"},"node_gets_total":{"category":"throughput - read","concern":"kv","description":"Total number of GETs coordinated by this node, including GETs to non-local vnodes","example":"0","json_schema_type":"number","metric_type":"summary","name":"node_gets_total","period":"since start","scope":"node","units":"operations"},"node_put_fsm_active":{"category":"load","concern":"kv","description":"Number of active PUT FSMs","example":"0","json_schema_type":"number","metric_type":"summary","name":"node_put_fsm_active","period":"current","scope":"node","units":"finite state machines"},"node_put_fsm_active_60s":{"category":"load","concern":"kv","description":"Number of PUT FSMs active in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_active_60s","period":"1 minute","scope":"node","units":"finite state machines"},"node_put_fsm_counter_time_100":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_counter_time_100","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_counter_time_95":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_counter_time_95","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_counter_time_99":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_counter_time_99","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_counter_time_mean":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_counter_time_mean","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_counter_time_median":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_counter_time_median","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_in_rate":{"category":"load","concern":"kv","description":"Average number of PUT FSMs enqueued by Sidejob's overload protection","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_in_rate","period":"since start","scope":"node","units":"finite state machines"},"node_put_fsm_map_time_100":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_map_time_100","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_map_time_95":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_map_time_95","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_map_time_99":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_map_time_99","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_map_time_mean":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_map_time_mean","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_map_time_median":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_map_time_median","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_out_rate":{"category":"load","concern":"kv","description":"Average number of PUT FSMs dequeued by Sidejob's overload protection","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_out_rate","period":"since start","scope":"node","units":"finite state machines"},"node_put_fsm_rejected":{"category":"load","concern":"kv","description":"Number of PUT FSMs actively being rejected by Sidejob's overload protection","example":"0","json_schema_type":"number","metric_type":"summary","name":"node_put_fsm_rejected","period":"current","scope":"node","units":"rejections"},"node_put_fsm_rejected_60s":{"category":"load","concern":"kv","description":"Number of PUT FSMs rejected by Sidejob's overload protection in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_rejected_60s","period":"1 minute","scope":"node","units":"rejections"},"node_put_fsm_rejected_total":{"category":"load","concern":"kv","description":"Total number of PUT FSMs rejected by Sidejob's overload protection","example":"0","json_schema_type":"number","metric_type":"summary","name":"node_put_fsm_rejected_total","period":"since start","scope":"node","units":"rejections"},"node_put_fsm_set_time_100":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_set_time_100","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_set_time_95":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_set_time_95","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_set_time_99":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_set_time_99","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_set_time_mean":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_set_time_mean","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_set_time_median":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_set_time_median","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_time_100":{"category":"latency","concern":"kv","description":"100th percentile time between reception of client PUT request and subsequent response to client","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_time_100","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_time_95":{"category":"latency","concern":"kv","description":"95th percentile time between reception of client PUT request and subsequent response to client","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_time_95","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_time_99":{"category":"latency","concern":"kv","description":"99th percentile time between reception of client PUT request and subsequent response to client","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_time_99","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_time_mean":{"category":"latency","concern":"kv","description":"Mean time between reception of client PUT request and subsequent response to client","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_time_mean","period":"1 minute","scope":"node","units":"microseconds"},"node_put_fsm_time_median":{"category":"latency","concern":"kv","description":"Median time between reception of client PUT request and subsequent response to client","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_put_fsm_time_median","period":"1 minute","scope":"node","units":"microseconds"},"node_puts":{"category":"throughput - write","concern":"kv","description":"Writes coordinated by this node","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_puts","period":"1 minute","scope":"node","units":"operations"},"node_puts_counter":{"category":"throughput - write","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_puts_counter","period":"1 minute","scope":"node","units":"operations"},"node_puts_counter_total":{"category":"throughput - write","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"node_puts_counter_total","period":"since start","scope":"node","units":"operations"},"node_puts_map":{"category":"throughput - write","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_puts_map","period":"1 minute","scope":"node","units":"operations"},"node_puts_map_total":{"category":"throughput - write","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"node_puts_map_total","period":"since start","scope":"node","units":"operations"},"node_puts_set":{"category":"throughput - write","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"node_puts_set","period":"1 minute","scope":"node","units":"operations"},"node_puts_set_total":{"category":"throughput - write","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"node_puts_set_total","period":"since start","scope":"node","units":"operations"},"node_puts_total":{"category":"throughput - write","concern":"kv","description":"Total number of PUTs coordinated by this node, including PUTs to non-local vnodes","example":"0","json_schema_type":"number","metric_type":"summary","name":"node_puts_total","period":"since start","scope":"node","units":"operations"},"nodename":{"category":"config","concern":"config","description":"The name this node uses to identify itself","example":"'riak@127.0.0.1'","json_schema_type":"string","metric_type":"nominal","name":"nodename","period":"since start","scope":"node","units":"n/a"},"object_counter_merge":{"category":"load","concern":"crdt","description":"Number of Update Counter operations performed during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_counter_merge","period":"1 minute","scope":"node","units":"operations"},"object_counter_merge_time_100":{"category":"latency","concern":"crdt","description":"100th-percentile latency for an Update Counter operation during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_counter_merge_time_100","period":"1 minute","scope":"node","units":"microseconds"},"object_counter_merge_time_95":{"category":"latency","concern":"crdt","description":"95th-percentile latency for an Update Counter operation during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_counter_merge_time_95","period":"1 minute","scope":"node","units":"microseconds"},"object_counter_merge_time_99":{"category":"latency","concern":"crdt","description":"99th-percentile latency for an Update Counter operation during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_counter_merge_time_99","period":"1 minute","scope":"node","units":"microseconds"},"object_counter_merge_time_mean":{"category":"latency","concern":"crdt","description":"Mean latency for an Update Counter operation during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_counter_merge_time_mean","period":"1 minute","scope":"node","units":"microseconds"},"object_counter_merge_time_median":{"category":"latency","concern":"crdt","description":"Median latency for an Update Counter operation during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_counter_merge_time_median","period":"1 minute","scope":"node","units":"microseconds"},"object_counter_merge_total":{"category":"load","concern":"crdt","description":"Total number of Update Counter operations performed since node start","example":"0","json_schema_type":"number","metric_type":"summary","name":"object_counter_merge_total","period":"since start","scope":"node","units":"operations"},"object_map_merge":{"category":"load","concern":"crdt","description":"Number of Update Map operations performed during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_map_merge","period":"1 minute","scope":"node","units":"operations"},"object_map_merge_time_100":{"category":"latency","concern":"crdt","description":"100th-percentile latency for an Update Map operation during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_map_merge_time_100","period":"1 minute","scope":"node","units":"microseconds"},"object_map_merge_time_95":{"category":"latency","concern":"crdt","description":"95th-percentile latency for an Update Map operation during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_map_merge_time_95","period":"1 minute","scope":"node","units":"microseconds"},"object_map_merge_time_99":{"category":"latency","concern":"crdt","description":"99th-percentile latency for an Update Map operation during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_map_merge_time_99","period":"1 minute","scope":"node","units":"microseconds"},"object_map_merge_time_mean":{"category":"latency","concern":"crdt","description":"Mean latency for an Update Map operation during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_map_merge_time_mean","period":"1 minute","scope":"node","units":"microseconds"},"object_map_merge_time_median":{"category":"latency","concern":"crdt","description":"Median latency for an Update Map operation during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_map_merge_time_median","period":"1 minute","scope":"node","units":"microseconds"},"object_map_merge_total":{"category":"load","concern":"crdt","description":"Total number of Update Map operations since node start","example":"0","json_schema_type":"number","metric_type":"summary","name":"object_map_merge_total","period":"since start","scope":"node","units":"operations"},"object_merge":{"category":"load","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_merge","period":"1 minute","scope":"node","units":"operations"},"object_merge_time_100":{"category":"latency","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_merge_time_100","period":"1 minute","scope":"node","units":"microseconds"},"object_merge_time_95":{"category":"latency","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_merge_time_95","period":"1 minute","scope":"node","units":"microseconds"},"object_merge_time_99":{"category":"latency","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_merge_time_99","period":"1 minute","scope":"node","units":"microseconds"},"object_merge_time_mean":{"category":"latency","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_merge_time_mean","period":"1 minute","scope":"node","units":"microseconds"},"object_merge_time_median":{"category":"latency","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_merge_time_median","period":"1 minute","scope":"node","units":"microseconds"},"object_merge_total":{"category":"load","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"object_merge_total","period":"since start","scope":"node","units":"operations"},"object_set_merge":{"category":"load","concern":"crdt","description":"Number of Update Set operations perfomed during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_set_merge","period":"1 minute","scope":"node","units":"operations"},"object_set_merge_time_100":{"category":"latency","concern":"crdt","description":"100th-percentile latency for an Update Set operations during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_set_merge_time_100","period":"1 minute","scope":"node","units":"microseconds"},"object_set_merge_time_95":{"category":"latency","concern":"crdt","description":"95th-percentile latency for an Update Set operations during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_set_merge_time_95","period":"1 minute","scope":"node","units":"microseconds"},"object_set_merge_time_99":{"category":"latency","concern":"crdt","description":"99th-percentile latency for an Update Set operations during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_set_merge_time_99","period":"1 minute","scope":"node","units":"microseconds"},"object_set_merge_time_mean":{"category":"latency","concern":"crdt","description":"Mean latency for an Update Set operations during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_set_merge_time_mean","period":"1 minute","scope":"node","units":"microseconds"},"object_set_merge_time_median":{"category":"latency","concern":"crdt","description":"Median latency for an Update Set operations during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"object_set_merge_time_median","period":"1 minute","scope":"node","units":"microseconds"},"object_set_merge_total":{"category":"load","concern":"crdt","description":"Total number of Update Set operations since node start","example":"0","json_schema_type":"number","metric_type":"summary","name":"object_set_merge_total","period":"since start","scope":"node","units":"operations"},"os_mon_version":{"category":"versions","concern":"config","description":"[Erlang Operating System Monitor](http://erlang.org/doc/apps/os_mon/)","example":"2.2.13","json_schema_type":"string","metric_type":"nominal","name":"os_mon_version","period":"current","scope":"config","units":"n/a"},"pbc_active":{"category":"load","concern":"core","description":"Number of active Protocol Buffers connections","example":"0","json_schema_type":"number","metric_type":"summary","name":"pbc_active","period":"current","scope":"node","units":"connections"},"pbc_connects":{"category":"load","concern":"core","description":"Number of Protocol Buffers connections made in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"pbc_connects","period":"1 minute","scope":"node","units":"connections"},"pbc_connects_total":{"category":"load","concern":"core","description":"Total number of Protocol Buffers connections made","example":"0","json_schema_type":"number","metric_type":"summary","name":"pbc_connects_total","period":"since start","scope":"node","units":"connections"},"pbkdf2_version":{"category":"versions","concern":"config","description":"","example":"2.0.0-0-g7076584","json_schema_type":"string","metric_type":"nominal","name":"pbkdf2_version","period":"current","scope":"config","units":"n/a"},"pipeline_active":{"category":"load","concern":"map/reduce","description":"The number of Map/Reduce pipelines active in the last 60 seconds","example":"0","json_schema_type":"number","metric_type":"interval","name":"pipeline_active","period":"1 minute","scope":"node","units":"pipelines"},"pipeline_create_count":{"category":"load","concern":"map/reduce","description":"The total number of Map/Reduce pipelines created since the node was started","example":"0","json_schema_type":"number","metric_type":"summary","name":"pipeline_create_count","period":"since start","scope":"node","units":"pipelines"},"pipeline_create_error_count":{"category":"errors","concern":"map/reduce","description":"The total number of Map/Reduce pipeline creation errors since the node was started","example":"0","json_schema_type":"number","metric_type":"summary","name":"pipeline_create_error_count","period":"since start","scope":"node","units":"errors"},"pipeline_create_error_one":{"category":"errors","concern":"map/reduce","description":"The number of Map/Reduce pipeline creation errors in the last 60 seconds","example":"0","json_schema_type":"number","metric_type":"interval","name":"pipeline_create_error_one","period":"1 minute","scope":"node","units":"errors"},"pipeline_create_one":{"category":"load","concern":"map/reduce","description":"The number of Map/Reduce pipelines created in the last 60 seconds","example":"0","json_schema_type":"number","metric_type":"interval","name":"pipeline_create_one","period":"1 minute","scope":"node","units":"pipelines"},"poolboy_version":{"category":"versions","concern":"config","description":"","example":"0.8.1p3-0-g8bb45fb","json_schema_type":"string","metric_type":"nominal","name":"poolboy_version","period":"current","scope":"config","units":"n/a"},"postcommit_fail":{"category":"errors","concern":"kv","description":"Total number of post-commit hook failures","example":"0","json_schema_type":"number","metric_type":"interval","name":"postcommit_fail","period":"since start","scope":"node","units":"failures"},"precommit_fail":{"category":"errors","concern":"kv","description":"Total number of pre-commit hook failures","example":"0","json_schema_type":"number","metric_type":"interval","name":"precommit_fail","period":"since start","scope":"node","units":"failures"},"protobuffs_version":{"category":"versions","concern":"config","description":"","example":"0.8.1p5-0-gf88fc3c","json_schema_type":"string","metric_type":"nominal","name":"protobuffs_version","period":"current","scope":"config","units":"n/a"},"public_key_version":{"category":"versions","concern":"config","description":"[Erlang Public Key](http://erlang.org/doc/apps/public_key/)","example":"0.2","json_schema_type":"string","metric_type":"nominal","name":"public_key_version","period":"current","scope":"config","units":"n/a"},"read_repairs":{"category":"load","concern":"kv","description":"Number of read repair operations this node has coordinated in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"read_repairs","period":"1 minute","scope":"node","units":"repairs"},"read_repairs_counter":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"read_repairs_counter","period":"1 minute","scope":"node","units":"repairs"},"read_repairs_counter_total":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"read_repairs_counter_total","period":"since start","scope":"node","units":"repairs"},"read_repairs_fallback_notfound_count":{"category":"load","concern":"kv","description":"Total number of read repair operations performed on fallback vnodes due to missing replicas","example":"undefined","json_schema_type":"number","metric_type":"summary","name":"read_repairs_fallback_notfound_count","period":"since start","scope":"node","units":"repairs"},"read_repairs_fallback_notfound_one":{"category":"load","concern":"kv","description":"Number of read repair operations performed on fallback vnodes in the last minute due to missing replicas","example":"undefined","json_schema_type":"number","metric_type":"interval","name":"read_repairs_fallback_notfound_one","period":"1 minute","scope":"node","units":"repairs"},"read_repairs_fallback_outofdate_count":{"category":"load","concern":"kv","description":"Total number of read repair operations performed on fallback vnodes due to stale replicas","example":"undefined","json_schema_type":"number","metric_type":"summary","name":"read_repairs_fallback_outofdate_count","period":"since start","scope":"node","units":"repairs"},"read_repairs_fallback_outofdate_one":{"category":"load","concern":"kv","description":"Number of read repair operations performed on fallback vnodes in the last minute due to stale replicas","example":"undefined","json_schema_type":"number","metric_type":"interval","name":"read_repairs_fallback_outofdate_one","period":"1 minute","scope":"node","units":"repairs"},"read_repairs_map":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"read_repairs_map","period":"1 minute","scope":"node","units":"repairs"},"read_repairs_map_total":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"read_repairs_map_total","period":"since start","scope":"node","units":"repairs"},"read_repairs_primary_notfound_count":{"category":"load","concern":"kv","description":"Total number of read repair operations performed on primary vnodes due to missing replicas","example":"undefined","json_schema_type":"number","metric_type":"summary","name":"read_repairs_primary_notfound_count","period":"since start","scope":"node","units":"repairs"},"read_repairs_primary_notfound_one":{"category":"load","concern":"kv","description":"Number of read repair operations performed on primary vnodes in the last minute due to missing replicas","example":"undefined","json_schema_type":"number","metric_type":"interval","name":"read_repairs_primary_notfound_one","period":"1 minute","scope":"node","units":"repairs"},"read_repairs_primary_outofdate_count":{"category":"load","concern":"kv","description":"Total number of read repair operations performed on primary vnodes due to stale replicas","example":"undefined","json_schema_type":"number","metric_type":"summary","name":"read_repairs_primary_outofdate_count","period":"since start","scope":"node","units":"repairs"},"read_repairs_primary_outofdate_one":{"category":"load","concern":"kv","description":"Number of read repair operations performed on primary vnodes in the last minute due to stale replicas","example":"undefined","json_schema_type":"number","metric_type":"interval","name":"read_repairs_primary_outofdate_one","period":"1 minute","scope":"node","units":"repairs"},"read_repairs_set":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"read_repairs_set","period":"1 minute","scope":"node","units":"repairs"},"read_repairs_set_total":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"read_repairs_set_total","period":"since start","scope":"node","units":"repairs"},"read_repairs_total":{"category":"load","concern":"kv","description":"Total number of Read Repairs this node has coordinated","example":"0","json_schema_type":"number","metric_type":"summary","name":"read_repairs_total","period":"since start","scope":"node","units":"repairs"},"rebalance_delay_last":{"category":"ring activity","concern":"kv","description":"Last observed histogram value in milliseconds describing time taken for the ring to converge after ring changes","example":"0","json_schema_type":"number","metric_type":"interval","name":"rebalance_delay_last","period":"?","scope":"node","units":"milliseconds"},"rebalance_delay_max":{"category":"ring activity","concern":"kv","description":"Maximum time in milliseconds taken to calculate partition rebalance during a cluster membership change","example":"0","json_schema_type":"number","metric_type":"interval","name":"rebalance_delay_max","period":"?","scope":"node","units":"milliseconds"},"rebalance_delay_mean":{"category":"ring activity","concern":"kv","description":"Mean time in milliseconds describing time taken for the ring to converge after ring changes","example":"0","json_schema_type":"number","metric_type":"interval","name":"rebalance_delay_mean","period":"?","scope":"node","units":"milliseconds"},"rebalance_delay_min":{"category":"ring activity","concern":"kv","description":"Minimum time in milliseconds taken to calculate partition rebalance during a cluster membership change","example":"0","json_schema_type":"number","metric_type":"interval","name":"rebalance_delay_min","period":"?","scope":"node","units":"milliseconds"},"rejected_handoffs":{"category":"load","concern":"kv","description":"Total number of ownership handoff operations rejected by the node since it was started","example":"0","json_schema_type":"number","metric_type":"interval","name":"rejected_handoffs","period":"since start","scope":"node","units":"rejections"},"riak_api_version":{"category":"versions","concern":"config","description":"[Riak API](http://github.com/basho/riak_api)","example":"2.1.2-0-gd8d510f","json_schema_type":"string","metric_type":"nominal","name":"riak_api_version","period":"current","scope":"config","units":"n/a"},"riak_auth_mods_version":{"category":"versions","concern":"config","description":"","example":"2.1.0-0-g31b8b30","json_schema_type":"string","metric_type":"nominal","name":"riak_auth_mods_version","period":"current","scope":"config","units":"n/a"},"riak_control_version":{"category":"versions","concern":"config","description":"[Riak Control](http://github.com/basho/riak_control)","example":"2.1.2-0-gab3f924","json_schema_type":"string","metric_type":"nominal","name":"riak_control_version","period":"current","scope":"config","units":"n/a"},"riak_core_stat_ts":{"category":"meta","concern":"core","description":"The last time (in Epoch time) Riak Core stats were generated","example":"","json_schema_type":"string","metric_type":"summary","name":"riak_core_stat_ts","period":"current","scope":"node","units":"n/a"},"riak_core_version":{"category":"versions","concern":"config","description":"[Riak Core](http://github.com/basho/riak_core)","example":"2.1.5-0-gb02ab53","json_schema_type":"string","metric_type":"nominal","name":"riak_core_version","period":"current","scope":"config","units":"n/a"},"riak_dt_version":{"category":"versions","concern":"config","description":"","example":"2.1.1-0-ga2986bc","json_schema_type":"string","metric_type":"nominal","name":"riak_dt_version","period":"current","scope":"config","units":"n/a"},"riak_kv_stat_ts":{"category":"meta","concern":"core","description":"The last time Riak KV stats were generated.","example":"","json_schema_type":"string","metric_type":"summary","name":"riak_kv_stat_ts","period":"current","scope":"node","units":"n/a"},"riak_kv_version":{"category":"versions","concern":"config","description":"[Riak KV](http://github.com/basho/riak_kv)","example":"2.1.2-0-gf969bba","json_schema_type":"string","metric_type":"nominal","name":"riak_kv_version","period":"current","scope":"config","units":"n/a"},"riak_kv_vnodeq_max":{"category":"load","concern":"kv","description":"Max queue size of all local Riak KV virtual nodes in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"riak_kv_vnodeq_max","period":"1 minute","scope":"vnode","units":"queue size"},"riak_kv_vnodeq_mean":{"category":"load","concern":"kv","description":"Mean queue size of all local Riak KV virtual nodes in the last minute","example":"0.0","json_schema_type":"number","metric_type":"interval","name":"riak_kv_vnodeq_mean","period":"1 minute","scope":"vnode","units":"queue size"},"riak_kv_vnodeq_median":{"category":"load","concern":"kv","description":"Median queue size of all local Riak KV virtual nodes in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"riak_kv_vnodeq_median","period":"1 minute","scope":"vnode","units":"queue size"},"riak_kv_vnodeq_min":{"category":"load","concern":"kv","description":"Minimum queue size of all local Riak KV virtual nodes in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"riak_kv_vnodeq_min","period":"1 minute","scope":"vnode","units":"queue size"},"riak_kv_vnodeq_total":{"category":"load","concern":"kv","description":"Total queue size of all local Riak KV virtual nodes in the last minute","example":"0","json_schema_type":"number","metric_type":"summary","name":"riak_kv_vnodeq_total","period":"since start","scope":"vnode","units":"queue size"},"riak_kv_vnodes_running":{"category":"load","concern":"kv","description":"Number of local Riak KV virtual nodes running","example":"64","json_schema_type":"number","metric_type":"interval","name":"riak_kv_vnodes_running","period":"current","scope":"vnode","units":"queue size"},"riak_pb_version":{"category":"versions","concern":"config","description":"","example":"2.1.0.2-0-g620bc70","json_schema_type":"string","metric_type":"nominal","name":"riak_pb_version","period":"current","scope":"config","units":"n/a"},"riak_pipe_stat_ts":{"category":"meta","concern":"core","description":"The last time Riak Pipe stats were generated.","example":"","json_schema_type":"string","metric_type":"summary","name":"riak_pipe_stat_ts","period":"current","scope":"node","units":"n/a"},"riak_pipe_version":{"category":"versions","concern":"config","description":"[Riak Pipe](http://github.com/basho/riak_pipe)","example":"2.1.1-0-gb1ac2cf","json_schema_type":"string","metric_type":"nominal","name":"riak_pipe_version","period":"current","scope":"config","units":"n/a"},"riak_pipe_vnodeq_max":{"category":"load","concern":"core","description":"Max queue size of local Riak Pipe virtual nodes in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"riak_pipe_vnodeq_max","period":"1 minute","scope":"vnode","units":"queue size"},"riak_pipe_vnodeq_mean":{"category":"load","concern":"core","description":"Mean queue size of local Riak Pipe virtual nodes in the last minute","example":"0.0","json_schema_type":"number","metric_type":"interval","name":"riak_pipe_vnodeq_mean","period":"1 minute","scope":"vnode","units":"queue size"},"riak_pipe_vnodeq_median":{"category":"load","concern":"core","description":"Median queue size of local Riak Pipe virtual nodes in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"riak_pipe_vnodeq_median","period":"1 minute","scope":"vnode","units":"queue size"},"riak_pipe_vnodeq_min":{"category":"load","concern":"core","description":"Minimum queue size of local Riak Pipe virtual nodes in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"riak_pipe_vnodeq_min","period":"1 minute","scope":"vnode","units":"queue size"},"riak_pipe_vnodeq_total":{"category":"load","concern":"core","description":"Total queue size of all local Riak Pipe virtual nodes in the last minute","example":"0","json_schema_type":"number","metric_type":"summary","name":"riak_pipe_vnodeq_total","period":"since start","scope":"vnode","units":"queue size"},"riak_pipe_vnodes_running":{"category":"load","concern":"core","description":"Number of local Riak Pipe virtual nodes running","example":"64","json_schema_type":"number","metric_type":"summary","name":"riak_pipe_vnodes_running","period":"current","scope":"vnode","units":"vnodes"},"riak_search_version":{"category":"versions","concern":"config","description":"[Riak Search](http://github.com/basho/riak_search)","example":"2.1.1-0-gffe2113","json_schema_type":"string","metric_type":"nominal","name":"riak_search_version","period":"current","scope":"config","units":"n/a"},"riak_search_vnodeq_max":{"category":"load","concern":"search","description":"Maximum number of unprocessed messages all virtual node (vnode) message queues in the Riak Search subsystem have received on this node in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"riak_search_vnodeq_max","period":"1 minute","scope":"vnode","units":"messages"},"riak_search_vnodeq_mean":{"category":"load","concern":"search","description":"Mean number of unprocessed messages all vnode message queues in the Riak Search subsystem have received on this node in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"riak_search_vnodeq_mean","period":"1 minute","scope":"vnode","units":"messages"},"riak_search_vnodeq_median":{"category":"load","concern":"search","description":"Median number of unprocessed messages all vnode message queues in the Riak Search subsystem have received on this node in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"riak_search_vnodeq_median","period":"1 minute","scope":"vnode","units":"messages"},"riak_search_vnodeq_min":{"category":"load","concern":"search","description":"Minimum number of unprocessed messages all vnode message queues in the Riak Search subsystem have received on this node in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"riak_search_vnodeq_min","period":"1 minute","scope":"vnode","units":"messages"},"riak_search_vnodeq_total":{"category":"load","concern":"search","description":"Total number of unprocessed messages all vnode message queues in the Riak Search subsystem have received on this node since it was started","example":"0","json_schema_type":"number","metric_type":"summary","name":"riak_search_vnodeq_total","period":"since start","scope":"vnode","units":"messages"},"riak_search_vnodes_running":{"category":"load","concern":"search","description":"Total number of vnodes currently running in the Riak Search subsystem","example":"0","json_schema_type":"number","metric_type":"summary","name":"riak_search_vnodes_running","period":"current","scope":"vnode","units":"vnodes"},"riak_sysmon_version":{"category":"versions","concern":"config","description":"[Riak System Monitor](http://github.com/basho/riak_sysmon)","example":"2.0.0","json_schema_type":"string","metric_type":"nominal","name":"riak_sysmon_version","period":"current","scope":"config","units":"n/a"},"ring_creation_size":{"category":"cluster state","concern":"core","description":"Ring size this cluster was created with","example":"64","json_schema_type":"number","metric_type":"nominal","name":"ring_creation_size","period":"since start","scope":"cluster","units":"n/a"},"ring_members":{"category":"cluster state","concern":"core","description":"List of nodes that are members of the ring","example":"['riak@127.0.0.1']","json_schema_type":"array","metric_type":"nominal","name":"ring_members","period":"current","scope":"cluster","units":"n/a"},"ring_num_partitions":{"category":"cluster state","concern":"core","description":"The number of partitions in the ring","example":"64","json_schema_type":"number","metric_type":"nominal","name":"ring_num_partitions","period":"current","scope":"cluster","units":"n/a"},"ring_ownership":{"category":"cluster state","concern":"core","description":"List of all nodes in the ring and their associated partition ownership","example":"[{'riak@127.0.0.1', 64}]","json_schema_type":"array","metric_type":"nominal","name":"ring_ownership","period":"current","scope":"cluster","units":"n/a"},"rings_reconciled":{"category":"ring activity","concern":"core","description":"Number of ring reconciliation operations in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"rings_reconciled","period":"1 minute","scope":"node","units":"operations"},"rings_reconciled_total":{"category":"ring activity","concern":"core","description":"Total number of ring reconciliation operations since node was started","example":"0","json_schema_type":"number","metric_type":"summary","name":"rings_reconciled_total","period":"since start","scope":"node","units":"operations"},"runtime_tools_version":{"category":"versions","concern":"config","description":"[Erlang Runtime Tools](http://erlang.org/doc/apps/runtime_tools/)","example":"1.8.12","json_schema_type":"string","metric_type":"nominal","name":"runtime_tools_version","period":"current","scope":"config","units":"n/a"},"sasl_version":{"category":"versions","concern":"config","description":"[SASL](http://erlang.org/doc/apps/sasl/)","example":"2.3.3","json_schema_type":"string","metric_type":"nominal","name":"sasl_version","period":"current","scope":"config","units":"n/a"},"search_index_fail_count":{"category":"errors","concern":"search","description":"Total number of 'Failed to index document' errors encountered by Search since node start","example":"0","json_schema_type":"number","metric_type":"summary","name":"search_index_fail_count","period":"since start","scope":"node","units":"failures"},"search_index_fail_one":{"category":"errors","concern":"search","description":"Number of 'Failed to index document' errors encountered by Search during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"search_index_fail_one","period":"1 minute","scope":"node","units":"failures"},"search_index_latency_95":{"category":"latency","concern":"search","description":"95th-percentile Search document indexing latency during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"search_index_latency_95","period":"1 minute","scope":"node","units":"microseconds"},"search_index_latency_99":{"category":"latency","concern":"search","description":"99th-percentile Search document indexing latency during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"search_index_latency_99","period":"1 minute","scope":"node","units":"microseconds"},"search_index_latency_999":{"category":"latency","concern":"search","description":"999th-percentile Search document indexing latency during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"search_index_latency_999","period":"1 minute","scope":"node","units":"microseconds"},"search_index_latency_max":{"category":"latency","concern":"search","description":"Max Search document indexing latency during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"search_index_latency_max","period":"1 minute","scope":"node","units":"microseconds"},"search_index_latency_mean":{"category":"latency","concern":"search","description":"Mean Search document indexing latency during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"search_index_latency_mean","period":"1 minute","scope":"node","units":"microseconds"},"search_index_latency_median":{"category":"latency","concern":"search","description":"Median Search document indexing latency during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"search_index_latency_median","period":"1 minute","scope":"node","units":"microseconds"},"search_index_latency_min":{"category":"latency","concern":"search","description":"Min Search document indexing latency during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"search_index_latency_min","period":"1 minute","scope":"node","units":"microseconds"},"search_index_throughput_count":{"category":"throughput - search","concern":"search","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"search_index_throughput_count","period":"since start","scope":"node","units":"operations"},"search_index_throughput_one":{"category":"throughput - search","concern":"search","description":"Number of documents indexed by Search during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"search_index_throughput_one","period":"1 minute","scope":"node","units":"operations"},"search_query_fail_count":{"category":"errors","concern":"search","description":"Total number of failed Search queries since node start","example":"0","json_schema_type":"number","metric_type":"summary","name":"search_query_fail_count","period":"since start","scope":"node","units":"failures"},"search_query_fail_one":{"category":"errors","concern":"search","description":"Number of failed Search queries during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"search_query_fail_one","period":"1 minute","scope":"node","units":"failures"},"search_query_latency_95":{"category":"latency","concern":"search","description":"95th-percentile Search query latency during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"search_query_latency_95","period":"1 minute","scope":"node","units":"microseconds"},"search_query_latency_99":{"category":"latency","concern":"search","description":"99th-percentile Search query latency during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"search_query_latency_99","period":"1 minute","scope":"node","units":"microseconds"},"search_query_latency_999":{"category":"latency","concern":"search","description":"999th-percentile Search query latency during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"search_query_latency_999","period":"1 minute","scope":"node","units":"microseconds"},"search_query_latency_max":{"category":"latency","concern":"search","description":"Max Search query latency during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"search_query_latency_max","period":"1 minute","scope":"node","units":"microseconds"},"search_query_latency_mean":{"category":"latency","concern":"search","description":"Mean Search query latency during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"search_query_latency_mean","period":"1 minute","scope":"node","units":"microseconds"},"search_query_latency_median":{"category":"latency","concern":"search","description":"Median Search query latency during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"search_query_latency_median","period":"1 minute","scope":"node","units":"microseconds"},"search_query_latency_min":{"category":"latency","concern":"search","description":"Min Search query latency during the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"search_query_latency_min","period":"1 minute","scope":"node","units":"microseconds"},"search_query_throughput_count":{"category":"throughput - search","concern":"search","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"search_query_throughput_count","period":"since start","scope":"node","units":"operations"},"search_query_throughput_one":{"category":"throughput - search","concern":"search","description":"Search queries on the node","example":"0","json_schema_type":"number","metric_type":"interval","name":"search_query_throughput_one","period":"1 minute","scope":"node","units":"operations"},"set_actor_counts_100":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"set_actor_counts_100","period":"1 minute","scope":"node","units":"counts"},"set_actor_counts_95":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"set_actor_counts_95","period":"1 minute","scope":"node","units":"counts"},"set_actor_counts_99":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"set_actor_counts_99","period":"1 minute","scope":"node","units":"counts"},"set_actor_counts_mean":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"set_actor_counts_mean","period":"1 minute","scope":"node","units":"counts"},"set_actor_counts_median":{"category":"load","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"set_actor_counts_median","period":"1 minute","scope":"node","units":"counts"},"sidejob_version":{"category":"versions","concern":"config","description":"[Sidejob](http://github.com/basho/sidejob)","example":"2.0.0-0-gc5aabba","json_schema_type":"string","metric_type":"nominal","name":"sidejob_version","period":"current","scope":"config","units":"n/a"},"skipped_read_repairs":{"category":"load","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"skipped_read_repairs","period":"1 minute","scope":"node","units":"repairs"},"skipped_read_repairs_total":{"category":"load","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"skipped_read_repairs_total","period":"since start","scope":"node","units":"repairs"},"ssl_version":{"category":"versions","concern":"config","description":"[Erlang Secure Sockets Layer (SSL)](http://erlang.org/doc/apps/ssl/)","example":"5.3.1","json_schema_type":"string","metric_type":"nominal","name":"ssl_version","period":"current","scope":"config","units":"n/a"},"stdlib_version":{"category":"versions","concern":"config","description":"[Standard Library](http://erlang.org/doc/apps/stdlib/)","example":"1.19.3","json_schema_type":"string","metric_type":"nominal","name":"stdlib_version","period":"current","scope":"config","units":"n/a"},"storage_backend":{"category":"config","concern":"config","description":"The storage backend currently in use.","example":"riak_kv_bitcask_backend","json_schema_type":"string","metric_type":"nominal","name":"storage_backend","period":"since start","scope":"config","units":"n/a"},"syntax_tools_version":{"category":"versions","concern":"config","description":"[Erlang Syntax Tools](http://www.erlang.org/doc/apps/syntax_tools/)","example":"1.6.11","json_schema_type":"string","metric_type":"nominal","name":"syntax_tools_version","period":"current","scope":"config","units":"n/a"},"sys_driver_version":{"category":"versions","concern":"config","description":"String representing the Erlang driver version in use by the runtime system","example":"2.2","json_schema_type":"string","metric_type":"nominal","name":"sys_driver_version","period":"current","scope":"config","units":"n/a"},"sys_global_heaps_size":{"category":"config","concern":"config","description":"Current size of the shared global heap","example":"deprecated","json_schema_type":"string","metric_type":"nominal","name":"sys_global_heaps_size","period":"current","scope":"config","units":"n/a"},"sys_heap_type":{"category":"config","concern":"config","description":"String representing the heap type in use (one of private, shared, hybrid)","example":"private","json_schema_type":"string","metric_type":"nominal","name":"sys_heap_type","period":"current","scope":"config","units":"n/a"},"sys_logical_processors":{"category":"config","concern":"config","description":"Number of logical processors available on the system","example":"8","json_schema_type":"number","metric_type":"nominal","name":"sys_logical_processors","period":"current","scope":"config","units":"n/a"},"sys_monitor_count":{"category":"config","concern":"config","description":"","example":"504","json_schema_type":"number","metric_type":"nominal","name":"sys_monitor_count","period":"current","scope":"config","units":"n/a"},"sys_otp_release":{"category":"config","concern":"config","description":"Erlang OTP release version in use on the node","example":"R16B02_basho8","json_schema_type":"string","metric_type":"nominal","name":"sys_otp_release","period":"since start","scope":"config","units":"n/a"},"sys_port_count":{"category":"config","concern":"config","description":"","example":"98","json_schema_type":"number","metric_type":"nominal","name":"sys_port_count","period":"current","scope":"config","units":"n/a"},"sys_process_count":{"category":"load","concern":"resources","description":"Number of processes currently running in the Erlang VM","example":"1666","json_schema_type":"number","metric_type":"nominal","name":"sys_process_count","period":"current","scope":"config","units":"processes"},"sys_smp_support":{"category":"config","concern":"config","description":"Boolean value representing whether symmetric multi-processing (SMP) is available","example":"true","json_schema_type":"boolean","metric_type":"nominal","name":"sys_smp_support","period":"since start","scope":"config","units":"n/a"},"sys_system_architecture":{"category":"config","concern":"config","description":"The node operating system and hardware architecture","example":"x86_64-apple-darwin12.4.0","json_schema_type":"string","metric_type":"nominal","name":"sys_system_architecture","period":"since start","scope":"config","units":"n/a"},"sys_system_version":{"category":"config","concern":"config","description":"Detailed Erlang version information","example":"Erlang R16B02_basho8 (erts-5.10.3) [source] [64-bit] [smp:8:8] [async-threads:64] [kernel-poll:true] [frame-pointer] [dtrace]","json_schema_type":"string","metric_type":"nominal","name":"sys_system_version","period":"since start","scope":"config","units":"n/a"},"sys_thread_pool_size":{"category":"config","concern":"config","description":"Number of threads in the asynchronous thread pool","example":"64","json_schema_type":"number","metric_type":"nominal","name":"sys_thread_pool_size","period":"current","scope":"config","units":"threads"},"sys_threads_enabled":{"category":"config","concern":"config","description":"Boolean value representing whether threads are enabled","example":"true","json_schema_type":"boolean","metric_type":"nominal","name":"sys_threads_enabled","period":"current","scope":"config","units":"n/a"},"sys_wordsize":{"category":"config","concern":"config","description":"Size of Erlang term words in bytes as an integer, for examples, on 32-bit architectures 4 is returned and on 64-bit architectures 8 is returned","example":"8","json_schema_type":"number","metric_type":"nominal","name":"sys_wordsize","period":"since start","scope":"config","units":"bytes"},"vnode_counter_update":{"category":"config","concern":"crdt","description":"Counter Data Type update operations coordinated by local vnodes","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_counter_update","period":"1 minute","scope":"vnode","units":"operations"},"vnode_counter_update_time_100":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_counter_update_time_100","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_counter_update_time_95":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_counter_update_time_95","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_counter_update_time_99":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_counter_update_time_99","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_counter_update_time_mean":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_counter_update_time_mean","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_counter_update_time_median":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_counter_update_time_median","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_counter_update_total":{"category":"throughput - write","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"vnode_counter_update_total","period":"since start","scope":"vnode","units":"operations"},"vnode_get_fsm_time_100":{"category":"latency","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_get_fsm_time_100","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_get_fsm_time_95":{"category":"latency","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_get_fsm_time_95","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_get_fsm_time_99":{"category":"latency","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_get_fsm_time_99","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_get_fsm_time_mean":{"category":"latency","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_get_fsm_time_mean","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_get_fsm_time_median":{"category":"latency","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_get_fsm_time_median","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_gets":{"category":"throughput - read","concern":"kv","description":"Number of GET operations coordinated by local vnodes on this node in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_gets","period":"1 minute","scope":"vnode","units":"operations"},"vnode_gets_total":{"category":"throughput - read","concern":"kv","description":"Total number of GETs coordinated by local vnodes","example":"0","json_schema_type":"number","metric_type":"summary","name":"vnode_gets_total","period":"since start","scope":"vnode","units":"operations"},"vnode_index_deletes":{"category":"throughput - 2i","concern":"secondary_index","description":"Number of local replicas participating in secondary index deletes in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_index_deletes","period":"1 minute","scope":"vnode","units":"operations"},"vnode_index_deletes_postings":{"category":"throughput - 2i","concern":"secondary_index","description":"Number of individual secondary index values deleted in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_index_deletes_postings","period":"1 minute","scope":"vnode","units":"operations"},"vnode_index_deletes_postings_total":{"category":"throughput - 2i","concern":"secondary_index","description":"Total number of individual secondary index values deleted","example":"0","json_schema_type":"number","metric_type":"summary","name":"vnode_index_deletes_postings_total","period":"since start","scope":"vnode","units":"operations"},"vnode_index_deletes_total":{"category":"throughput - 2i","concern":"secondary_index","description":"Total number of local replicas participating in secondary index deletes","example":"0","json_schema_type":"number","metric_type":"summary","name":"vnode_index_deletes_total","period":"since start","scope":"vnode","units":"operations"},"vnode_index_reads":{"category":"throughput - 2i","concern":"secondary_index","description":"Number of local replicas participating in secondary index reads","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_index_reads","period":"1 minute","scope":"vnode","units":"operations"},"vnode_index_reads_total":{"category":"throughput - 2i","concern":"secondary_index","description":"Total number of local replicas participating in secondary index reads","example":"0","json_schema_type":"number","metric_type":"summary","name":"vnode_index_reads_total","period":"since start","scope":"vnode","units":"operations"},"vnode_index_refreshes":{"category":"throughput - 2i","concern":"secondary_index","description":"Number of secondary indexes refreshed on this node during secondary index anti-entropy in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_index_refreshes","period":"1 minute","scope":"vnode","units":"operations"},"vnode_index_refreshes_total":{"category":"throughput - 2i","concern":"secondary_index","description":"Total number of indexes refreshed during secondary index anti-entropy","example":"0","json_schema_type":"number","metric_type":"summary","name":"vnode_index_refreshes_total","period":"since start","scope":"vnode","units":"operations"},"vnode_index_writes":{"category":"throughput - 2i","concern":"secondary_index","description":"Number of local replicas participating in secondary index writes in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_index_writes","period":"1 minute","scope":"vnode","units":"operations"},"vnode_index_writes_postings":{"category":"throughput - 2i","concern":"secondary_index","description":"Number of individual secondary index values written in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_index_writes_postings","period":"1 minute","scope":"vnode","units":"operations"},"vnode_index_writes_postings_total":{"category":"throughput - 2i","concern":"secondary_index","description":"Total number of individual secondary index values written","example":"0","json_schema_type":"number","metric_type":"summary","name":"vnode_index_writes_postings_total","period":"since start","scope":"vnode","units":"operations"},"vnode_index_writes_total":{"category":"throughput - 2i","concern":"secondary_index","description":"Total number of local replicas participating in secondary index writes","example":"0","json_schema_type":"number","metric_type":"summary","name":"vnode_index_writes_total","period":"since start","scope":"vnode","units":"operations"},"vnode_map_update":{"category":"throughput - write","concern":"crdt","description":"Map Data Type update operations coordinated by local vnodes","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_map_update","period":"1 minute","scope":"vnode","units":"operations"},"vnode_map_update_time_100":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_map_update_time_100","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_map_update_time_95":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_map_update_time_95","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_map_update_time_99":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_map_update_time_99","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_map_update_time_mean":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_map_update_time_mean","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_map_update_time_median":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_map_update_time_median","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_map_update_total":{"category":"throughput - write","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"vnode_map_update_total","period":"since start","scope":"vnode","units":"operations"},"vnode_put_fsm_time_100":{"category":"latency","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_put_fsm_time_100","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_put_fsm_time_95":{"category":"latency","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_put_fsm_time_95","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_put_fsm_time_99":{"category":"latency","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_put_fsm_time_99","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_put_fsm_time_mean":{"category":"latency","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_put_fsm_time_mean","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_put_fsm_time_median":{"category":"latency","concern":"kv","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_put_fsm_time_median","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_puts":{"category":"throughput - write","concern":"kv","description":"Number of PUT operations coordinated by local vnodes on this node in the last minute","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_puts","period":"1 minute","scope":"vnode","units":"operations"},"vnode_puts_total":{"category":"throughput - write","concern":"kv","description":"Total number of PUTS coordinated by local vnodes","example":"0","json_schema_type":"number","metric_type":"summary","name":"vnode_puts_total","period":"since start","scope":"vnode","units":"operations"},"vnode_set_update":{"category":"throughput - write","concern":"crdt","description":"Set Data Type update operations coordinated by local vnodes","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_set_update","period":"1 minute","scope":"vnode","units":"operations"},"vnode_set_update_time_100":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_set_update_time_100","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_set_update_time_95":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_set_update_time_95","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_set_update_time_99":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_set_update_time_99","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_set_update_time_mean":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_set_update_time_mean","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_set_update_time_median":{"category":"latency","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"vnode_set_update_time_median","period":"1 minute","scope":"vnode","units":"microseconds"},"vnode_set_update_total":{"category":"throughput - write","concern":"crdt","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"vnode_set_update_total","period":"since start","scope":"vnode","units":"operations"},"webmachine_version":{"category":"versions","concern":"config","description":"[Webmachine](http://github.com/basho/webmachine)","example":"1.10.8-0-g7677c24","json_schema_type":"string","metric_type":"nominal","name":"webmachine_version","period":"current","scope":"config","units":"n/a"},"write_once_merge":{"category":"load","concern":"write_once","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"write_once_merge","period":"1 minute","scope":"node","units":"operations"},"write_once_put_objsize_100":{"category":"object size","concern":"write_once","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"write_once_put_objsize_100","period":"1 minute","scope":"node","units":"bytes"},"write_once_put_objsize_95":{"category":"object size","concern":"write_once","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"write_once_put_objsize_95","period":"1 minute","scope":"node","units":"bytes"},"write_once_put_objsize_99":{"category":"object size","concern":"write_once","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"write_once_put_objsize_99","period":"1 minute","scope":"node","units":"bytes"},"write_once_put_objsize_mean":{"category":"object size","concern":"write_once","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"write_once_put_objsize_mean","period":"1 minute","scope":"node","units":"bytes"},"write_once_put_objsize_median":{"category":"object size","concern":"write_once","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"write_once_put_objsize_median","period":"1 minute","scope":"node","units":"bytes"},"write_once_put_time_100":{"category":"latency","concern":"write_once","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"write_once_put_time_100","period":"1 minute","scope":"node","units":"microseconds"},"write_once_put_time_95":{"category":"latency","concern":"write_once","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"write_once_put_time_95","period":"1 minute","scope":"node","units":"microseconds"},"write_once_put_time_99":{"category":"latency","concern":"write_once","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"write_once_put_time_99","period":"1 minute","scope":"node","units":"microseconds"},"write_once_put_time_mean":{"category":"latency","concern":"write_once","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"write_once_put_time_mean","period":"1 minute","scope":"node","units":"microseconds"},"write_once_put_time_median":{"category":"latency","concern":"write_once","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"write_once_put_time_median","period":"1 minute","scope":"node","units":"microseconds"},"write_once_puts":{"category":"throughput - write","concern":"write_once","description":"","example":"0","json_schema_type":"number","metric_type":"interval","name":"write_once_puts","period":"1 minute","scope":"node","units":"operations"},"write_once_puts_total":{"category":"throughput - write","concern":"write_once","description":"","example":"0","json_schema_type":"number","metric_type":"summary","name":"write_once_puts_total","period":"since start","scope":"node","units":"operations"},"xmerl_version":{"category":"versions","concern":"config","description":"","example":"1.3.4","json_schema_type":"string","metric_type":"nominal","name":"xmerl_version","period":"current","scope":"config","units":"n/a"},"yokozuna_version":{"category":"versions","concern":"config","description":"","example":"2.1.2-0-g3520d11","json_schema_type":"string","metric_type":"nominal","name":"yokozuna_version","period":"current","scope":"config","units":"n/a"}};});
+define('ember-riak-explorer/utils/riak-object-formatter', ['exports'], function (exports) {
+ exports.formatNewMap = formatNewMap;
+ exports.formatRiakObject = formatRiakObject;
+
+ function formatNewMap(map) {
+ var formatted = { "update": {} };
+
+ Object.keys(map).forEach(function (key) {
+ switch (true) {
+ case key.endsWith('_counter'):
+ case key.endsWith('_register'):
+ formatted.update[key] = map[key];
+ break;
+ case key.endsWith('_flag'):
+ formatted.update[key] = map[key] ? "enable" : "disable";
+ break;
+ case key.endsWith('_set'):
+ formatted.update[key] = { "add_all": map[key] };
+ break;
+ case key.endsWith('_map'):
+ // recursively call this function again
+ formatted.update[key] = formatNewMap(map[key]);
+ break;
+ default:
+ break;
+ }
+ });
+
+ return formatted;
+ }
+
+ function formatRiakObject(type, value) {
+ var formatted = {};
+
+ switch (type) {
+ case 'Counter':
+ formatted["increment"] = value;
+ break;
+ case 'Set':
+ case 'HyperLogLog':
+ formatted["add_all"] = value;
+ break;
+ case 'Map':
+ formatted = formatNewMap(value);
+ break;
+ }
+
+ return formatted;
+ }
+});
+define("ember-riak-explorer/utils/string-helpers", ["exports"], function (exports) {
+ exports["default"] = insert;
+ // function inserts the string value (third parameter) before the specified integer index (second parameter) in the
+ // string str (first parameter), and then returns the new string without changing str!
+ // i.e insert("foo baz", 4, "bar ") => "foo bar baz";
+
+ function insert(str, index, value) {
+ return str.substr(0, index) + value + str.substr(index);
+ }
+});
+define('ember-riak-explorer/utils/validations', ['exports', 'ember', 'lodash/lodash'], function (exports, _ember, _lodashLodash) {
+
+ var Validations = {
+ // Arrays
+ isUniqueArrayItem: function isUniqueArrayItem(array, item) {
+ return _ember['default'].isPresent(item) && _lodashLodash['default'].indexOf(array, item) === -1;
+ },
+
+ itemExistsInArray: function itemExistsInArray(array, item) {
+ return _lodashLodash['default'].indexOf(array, item) > -1;
+ },
+
+ // Strings
+ containsWhiteSpace: function containsWhiteSpace(string) {
+ return string.indexOf(' ') >= 0;
+ },
+
+ noWhiteSpace: function noWhiteSpace(string) {
+ return !Validations.containsWhiteSpace(string);
+ },
+
+ isJsonParseable: function isJsonParseable(string) {
+ var isJSON = undefined;
+ var stringWithSingleQuotesReplacedWithDouble = string.replace(/'/g, '"');
+
+ try {
+ isJSON = JSON.parse(stringWithSingleQuotesReplacedWithDouble);
+ } catch (e) {
+ throw new Error('Invalid JSON, must be parseable. You can lint your JSON at JSONLint .');
+ }
+
+ return isJSON;
+ },
+
+ // Resources (Cluster, BucketType, Bucket, Object)
+ hasName: function hasName(resourceType, name) {
+ var hasName = _ember['default'].isPresent(name);
+
+ if (!hasName) {
+ throw new Error('The ' + resourceType + ' must be given a name.');
+ }
+
+ return hasName;
+ },
+
+ noWhiteSpaceInName: function noWhiteSpaceInName(resourceType, name) {
+ var noWhiteSpace = Validations.noWhiteSpace(name);
+
+ if (!noWhiteSpace) {
+ throw new Error('The ' + resourceType + ' name can not contain any whitespace.');
+ }
+
+ return noWhiteSpace;
+ },
+
+ // Objects
+ isObject: function isObject(data) {
+ var isObject = _lodashLodash['default'].isPlainObject(data);
+
+ if (!isObject) {
+ throw new Error('Data provided is not a javascript object.');
+ }
+
+ return isObject;
+ },
+
+ // Map CRDTs
+ mapKeyHasCorrectNameEndingAndValue: function mapKeyHasCorrectNameEndingAndValue(key, value) {
+ var objectHasCorrectValue = Validations.objectHasCorrectValueType;
+ var valid = undefined;
+
+ switch (true) {
+ case key.endsWith('_counter'):
+ valid = objectHasCorrectValue('Counter', key, value);
+ break;
+ case key.endsWith('_register'):
+ valid = objectHasCorrectValue('Register', key, value);
+ break;
+ case key.endsWith('_flag'):
+ valid = objectHasCorrectValue('Flag', key, value);
+ break;
+ case key.endsWith('_set'):
+ valid = objectHasCorrectValue('Set', key, value);
+ break;
+ case key.endsWith('_map'):
+ valid = objectHasCorrectValue('Map', key, value);
+ break;
+ default:
+ valid = false;
+ throw new Error('The "' + key + '" property is not named correctly. The property must end with \'_counter\', \'_register\', \'_flag\', \'_set\', or \'_map\' based on the desired type.');
+ }
+
+ return valid;
+ },
+
+ mapHasCorrectKeyNameEndingsAndValues: function mapHasCorrectKeyNameEndingsAndValues(map) {
+ var hasCorrectEnding = Validations.mapKeyHasCorrectNameEndingAndValue;
+
+ var invalidKeys = Object.keys(map).filter(function (key) {
+ return !hasCorrectEnding(key, map[key]);
+ });
+
+ return _ember['default'].isEmpty(invalidKeys);
+ },
+
+ // Set CRDT's
+ setHasCorrectValues: function setHasCorrectValues(setName, array) {
+ return _ember['default'].isEmpty(array.filter(function (item) {
+ var validItem = _lodashLodash['default'].isString(item);
+
+ if (!validItem) {
+ throw new Error('All items in the "' + setName + '" array must be string values');
+ }
+
+ return !validItem; // Filter is finding non valid items, so remove any valid items
+ }));
+ },
+
+ // CRDT's
+ objectHasCorrectValueType: function objectHasCorrectValueType(type, objectName, value) {
+ var valid = undefined;
+
+ switch (type) {
+ case 'Counter':
+ valid = _lodashLodash['default'].isNumber(value);
+ break;
+ case 'Register':
+ valid = _lodashLodash['default'].isString(value);
+ break;
+ case 'Flag':
+ valid = _lodashLodash['default'].isBoolean(value);
+ break;
+ case 'Set':
+ case 'HyperLogLog':
+ valid = _lodashLodash['default'].isArray(value) && Validations.setHasCorrectValues(objectName, value);
+ break;
+ case 'Map':
+ valid = _lodashLodash['default'].isPlainObject(value) && Validations.mapHasCorrectKeyNameEndingsAndValues(value);
+ break;
+ default:
+ valid = _lodashLodash['default'].isPlainObject(value);
+ break;
+ }
+
+ if (!valid) {
+ throw new Error(Validations.errorMessageForType(type, objectName));
+ }
+
+ return valid;
+ },
+
+ errorMessageForType: function errorMessageForType(type, objectName) {
+ var message = undefined;
+
+ switch (type) {
+ case 'Counter':
+ message = 'The value of "' + objectName + '" must be a number.';
+ break;
+ case 'Register':
+ message = 'The value of "' + objectName + '" must be a string.';
+ break;
+ case 'Flag':
+ message = 'The value of "' + objectName + '" must be a boolean.';
+ break;
+ case 'Set':
+ message = 'The value of "' + objectName + '" must be an array.';
+ break;
+ case 'Map':
+ message = 'The value of "' + objectName + '" must be a javascript object.';
+ break;
+ default:
+ message = 'The value of "' + objectName + '" is incorrect, please check the input to make sure it is the correct type';
+ }
+
+ return message;
+ }
+ };
+
+ exports['default'] = Validations;
+});
+/* jshint ignore:start */
+
+
+
+/* jshint ignore:end */
+
+/* jshint ignore:start */
+
+define('ember-riak-explorer/config/environment', ['ember'], function(Ember) {
+ var prefix = 'ember-riak-explorer';
+/* jshint ignore:start */
+
+try {
+ var metaName = prefix + '/config/environment';
+ var rawConfig = Ember['default'].$('meta[name="' + metaName + '"]').attr('content');
+ var config = JSON.parse(unescape(rawConfig));
+
+ return { 'default': config };
+}
+catch(err) {
+ throw new Error('Could not read config from meta tag with name "' + metaName + '".');
+}
+
+/* jshint ignore:end */
+
+});
+
+/* jshint ignore:end */
+
+/* jshint ignore:start */
+
+if (!runningTests) {
+ require("ember-riak-explorer/app")["default"].create({"name":"ember-riak-explorer","version":"0.2.0+e5fff7ee"});
+}
+
+/* jshint ignore:end */
+//# sourceMappingURL=ember-riak-explorer.map
\ No newline at end of file
diff --git a/priv/ember_riak_explorer/dist/assets/ember-riak-explorer.map b/priv/ember_riak_explorer/dist/assets/ember-riak-explorer.map
new file mode 100644
index 0000000..8edff19
--- /dev/null
+++ b/priv/ember_riak_explorer/dist/assets/ember-riak-explorer.map
@@ -0,0 +1 @@
+{"version":3,"sources":["vendor/ember-cli/app-prefix.js","ember-riak-explorer/adapters/application.js","ember-riak-explorer/adapters/bucket-list.js","ember-riak-explorer/adapters/bucket-type.js","ember-riak-explorer/adapters/bucket.js","ember-riak-explorer/adapters/cluster.js","ember-riak-explorer/adapters/config-file.js","ember-riak-explorer/adapters/log-file.js","ember-riak-explorer/adapters/node.js","ember-riak-explorer/adapters/object-list.js","ember-riak-explorer/adapters/riak-object.js","ember-riak-explorer/adapters/row-list.js","ember-riak-explorer/adapters/row.js","ember-riak-explorer/adapters/search-index.js","ember-riak-explorer/adapters/table.js","ember-riak-explorer/app.js","ember-riak-explorer/components/alert-component.js","ember-riak-explorer/components/app-version.js","ember-riak-explorer/components/basic-dropdown.js","ember-riak-explorer/components/breadcrumb-component.js","ember-riak-explorer/components/charts/cluster-stat.js","ember-riak-explorer/components/charts/node-stat.js","ember-riak-explorer/components/cluster-status-indicator.js","ember-riak-explorer/components/content-editable.js","ember-riak-explorer/components/dashboard-module/body.js","ember-riak-explorer/components/dashboard-module/container.js","ember-riak-explorer/components/dashboard-module/header.js","ember-riak-explorer/components/dashboard-module/section.js","ember-riak-explorer/components/ember-modal-dialog-positioned-container.js","ember-riak-explorer/components/ember-wormhole.js","ember-riak-explorer/components/form/add-custom-properties.js","ember-riak-explorer/components/form/explorer-button.js","ember-riak-explorer/components/form/explorer-input.js","ember-riak-explorer/components/high-charts.js","ember-riak-explorer/components/hll-editor.js","ember-riak-explorer/components/ivy-codemirror.js","ember-riak-explorer/components/ivy-tab-list.js","ember-riak-explorer/components/ivy-tab-panel.js","ember-riak-explorer/components/ivy-tab.js","ember-riak-explorer/components/ivy-tabs.js","ember-riak-explorer/components/link/explorer-resource.js","ember-riak-explorer/components/loading-slider.js","ember-riak-explorer/components/loading-spinner.js","ember-riak-explorer/components/map-object/contents.js","ember-riak-explorer/components/map-object/map.js","ember-riak-explorer/components/map-object/maps.js","ember-riak-explorer/components/map-object/section.js","ember-riak-explorer/components/map-object/sets.js","ember-riak-explorer/components/modal-dialog-overlay.js","ember-riak-explorer/components/modal-dialog.js","ember-riak-explorer/components/new-object-inputs.js","ember-riak-explorer/components/pagination-component.js","ember-riak-explorer/components/power-select.js","ember-riak-explorer/components/power-select/before-options.js","ember-riak-explorer/components/power-select/multiple.js","ember-riak-explorer/components/power-select/multiple/selected.js","ember-riak-explorer/components/power-select/options.js","ember-riak-explorer/components/power-select/single.js","ember-riak-explorer/components/power-select/single/selected.js","ember-riak-explorer/components/set-editor.js","ember-riak-explorer/components/side-drawer.js","ember-riak-explorer/components/table/bucket-props-advanced.js","ember-riak-explorer/components/table/bucket-props-overview.js","ember-riak-explorer/components/table/bucket-types.js","ember-riak-explorer/components/table/object-headers.js","ember-riak-explorer/components/table/object-version.js","ember-riak-explorer/components/table/search-indexes.js","ember-riak-explorer/components/table/table-overview.js","ember-riak-explorer/components/table/ts-table-reference.js","ember-riak-explorer/components/table/ts-tables.js","ember-riak-explorer/components/tether-dialog.js","ember-riak-explorer/components/tooltip-on-parent.js","ember-riak-explorer/components/tooltip/bucket-props.js","ember-riak-explorer/components/tooltip/node-config.js","ember-riak-explorer/components/tooltip/node-stats.js","ember-riak-explorer/components/view-label.js","ember-riak-explorer/components/wrapper-panel.js","ember-riak-explorer/controllers/application.js","ember-riak-explorer/helpers/and.js","ember-riak-explorer/helpers/ember-power-select-option-classes.js","ember-riak-explorer/helpers/eq.js","ember-riak-explorer/helpers/gt.js","ember-riak-explorer/helpers/gte.js","ember-riak-explorer/helpers/is-array.js","ember-riak-explorer/helpers/lt.js","ember-riak-explorer/helpers/lte.js","ember-riak-explorer/helpers/not-eq.js","ember-riak-explorer/helpers/not.js","ember-riak-explorer/helpers/object-length.js","ember-riak-explorer/helpers/or.js","ember-riak-explorer/helpers/pluralize.js","ember-riak-explorer/helpers/singularize.js","ember-riak-explorer/helpers/xor.js","ember-riak-explorer/initializers/add-modals-container.js","ember-riak-explorer/initializers/app-version.js","ember-riak-explorer/initializers/container-debug-adapter.js","ember-riak-explorer/initializers/data-adapter.js","ember-riak-explorer/initializers/ember-data.js","ember-riak-explorer/initializers/ember-tooltips.js","ember-riak-explorer/initializers/explorer.js","ember-riak-explorer/initializers/export-application-global.js","ember-riak-explorer/initializers/injectStore.js","ember-riak-explorer/initializers/local-storage-adapter.js","ember-riak-explorer/initializers/store.js","ember-riak-explorer/initializers/transforms.js","ember-riak-explorer/initializers/truth-helpers.js","ember-riak-explorer/instance-initializers/ember-data.js","ember-riak-explorer/mixins/component/scroll-reset.js","ember-riak-explorer/mixins/components/tooltips.js","ember-riak-explorer/mixins/controller/modal.js","ember-riak-explorer/mixins/controller/scroll-reset.js","ember-riak-explorer/mixins/controller/side-drawer.js","ember-riak-explorer/mixins/loading-slider.js","ember-riak-explorer/mixins/models/bucket-props.js","ember-riak-explorer/mixins/models/cached-list-watcher.js","ember-riak-explorer/mixins/models/cached-list.js","ember-riak-explorer/mixins/models/map-object.js","ember-riak-explorer/mixins/models/object-headers.js","ember-riak-explorer/mixins/routes/alerts.js","ember-riak-explorer/mixins/routes/loading-slider.js","ember-riak-explorer/mixins/routes/monitoring.js","ember-riak-explorer/mixins/routes/polling.js","ember-riak-explorer/mixins/routes/scroll-reset.js","ember-riak-explorer/mixins/routes/wrapper-state.js","ember-riak-explorer/models/bucket-list.js","ember-riak-explorer/models/object-list.js","ember-riak-explorer/models/row-list.js","ember-riak-explorer/models/row.js","ember-riak-explorer/pods/bucket-type/controller.js","ember-riak-explorer/pods/bucket-type/create/controller.js","ember-riak-explorer/pods/bucket-type/create/route.js","ember-riak-explorer/pods/bucket-type/create/template.js","ember-riak-explorer/pods/bucket-type/edit/controller.js","ember-riak-explorer/pods/bucket-type/edit/route.js","ember-riak-explorer/pods/bucket-type/edit/template.js","ember-riak-explorer/pods/bucket-type/model.js","ember-riak-explorer/pods/bucket-type/route.js","ember-riak-explorer/pods/bucket-type/template.js","ember-riak-explorer/pods/bucket/controller.js","ember-riak-explorer/pods/bucket/create/controller.js","ember-riak-explorer/pods/bucket/create/route.js","ember-riak-explorer/pods/bucket/create/template.js","ember-riak-explorer/pods/bucket/model.js","ember-riak-explorer/pods/bucket/route.js","ember-riak-explorer/pods/bucket/template.js","ember-riak-explorer/pods/cluster/controller.js","ember-riak-explorer/pods/cluster/data/route.js","ember-riak-explorer/pods/cluster/data/template.js","ember-riak-explorer/pods/cluster/model.js","ember-riak-explorer/pods/cluster/ops/controller.js","ember-riak-explorer/pods/cluster/ops/route.js","ember-riak-explorer/pods/cluster/ops/template.js","ember-riak-explorer/pods/cluster/query/route.js","ember-riak-explorer/pods/cluster/query/template.js","ember-riak-explorer/pods/cluster/route.js","ember-riak-explorer/pods/config-file/model.js","ember-riak-explorer/pods/config-file/route.js","ember-riak-explorer/pods/config-file/template.js","ember-riak-explorer/pods/error/route.js","ember-riak-explorer/pods/error/service-not-found/route.js","ember-riak-explorer/pods/error/service-not-found/template.js","ember-riak-explorer/pods/error/template.js","ember-riak-explorer/pods/help/route.js","ember-riak-explorer/pods/help/template.js","ember-riak-explorer/pods/index/route.js","ember-riak-explorer/pods/index/template.js","ember-riak-explorer/pods/log-file/model.js","ember-riak-explorer/pods/log-file/route.js","ember-riak-explorer/pods/log-file/template.js","ember-riak-explorer/pods/node/model.js","ember-riak-explorer/pods/node/monitoring/controller.js","ember-riak-explorer/pods/node/monitoring/route.js","ember-riak-explorer/pods/node/monitoring/template.js","ember-riak-explorer/pods/node/route.js","ember-riak-explorer/pods/node/template.js","ember-riak-explorer/pods/riak-object/controller.js","ember-riak-explorer/pods/riak-object/counter/controller.js","ember-riak-explorer/pods/riak-object/counter/route.js","ember-riak-explorer/pods/riak-object/counter/template.js","ember-riak-explorer/pods/riak-object/create/controller.js","ember-riak-explorer/pods/riak-object/create/route.js","ember-riak-explorer/pods/riak-object/create/template.js","ember-riak-explorer/pods/riak-object/edit/route.js","ember-riak-explorer/pods/riak-object/edit/template.js","ember-riak-explorer/pods/riak-object/hll/controller.js","ember-riak-explorer/pods/riak-object/hll/route.js","ember-riak-explorer/pods/riak-object/hll/template.js","ember-riak-explorer/pods/riak-object/map/controller.js","ember-riak-explorer/pods/riak-object/map/edit/route.js","ember-riak-explorer/pods/riak-object/map/edit/template.js","ember-riak-explorer/pods/riak-object/map/route.js","ember-riak-explorer/pods/riak-object/map/template.js","ember-riak-explorer/pods/riak-object/model.js","ember-riak-explorer/pods/riak-object/route.js","ember-riak-explorer/pods/riak-object/set/controller.js","ember-riak-explorer/pods/riak-object/set/route.js","ember-riak-explorer/pods/riak-object/set/template.js","ember-riak-explorer/pods/riak-object/template.js","ember-riak-explorer/pods/search-index/model.js","ember-riak-explorer/pods/search-index/route.js","ember-riak-explorer/pods/search-index/template.js","ember-riak-explorer/pods/search-schema/create/route.js","ember-riak-explorer/pods/search-schema/create/template.js","ember-riak-explorer/pods/search-schema/edit/route.js","ember-riak-explorer/pods/search-schema/edit/template.js","ember-riak-explorer/pods/search-schema/model.js","ember-riak-explorer/pods/search-schema/route.js","ember-riak-explorer/pods/search-schema/template.js","ember-riak-explorer/pods/table/controller.js","ember-riak-explorer/pods/table/create/controller.js","ember-riak-explorer/pods/table/create/route.js","ember-riak-explorer/pods/table/create/template.js","ember-riak-explorer/pods/table/model.js","ember-riak-explorer/pods/table/query/controller.js","ember-riak-explorer/pods/table/query/route.js","ember-riak-explorer/pods/table/query/template.js","ember-riak-explorer/pods/table/route.js","ember-riak-explorer/pods/table/template.js","ember-riak-explorer/pods/table/write/controller.js","ember-riak-explorer/pods/table/write/route.js","ember-riak-explorer/pods/table/write/template.js","ember-riak-explorer/resolver.js","ember-riak-explorer/router.js","ember-riak-explorer/routes/application.js","ember-riak-explorer/serializers/application.js","ember-riak-explorer/serializers/bucket-type.js","ember-riak-explorer/serializers/cluster.js","ember-riak-explorer/serializers/config-file.js","ember-riak-explorer/serializers/log-file.js","ember-riak-explorer/serializers/node.js","ember-riak-explorer/serializers/row.js","ember-riak-explorer/serializers/search-index.js","ember-riak-explorer/serializers/table.js","ember-riak-explorer/services/ajax.js","ember-riak-explorer/services/explorer.js","ember-riak-explorer/services/loading-slider.js","ember-riak-explorer/services/modal-dialog.js","ember-riak-explorer/storages/node-stats.js","ember-riak-explorer/templates/alerts/empty.js","ember-riak-explorer/templates/alerts/error-invalid-xml.js","ember-riak-explorer/templates/alerts/error-must-be-json-parseable.js","ember-riak-explorer/templates/alerts/error-request-was-not-processed.js","ember-riak-explorer/templates/alerts/error-schema-not-saved.js","ember-riak-explorer/templates/alerts/error-set-items-unique.js","ember-riak-explorer/templates/alerts/error-solr-must-have-name.js","ember-riak-explorer/templates/alerts/error-solr-must-have-version.js","ember-riak-explorer/templates/alerts/feedback-welcome.js","ember-riak-explorer/templates/application.js","ember-riak-explorer/templates/components/alert-component.js","ember-riak-explorer/templates/components/breadcrumb-component.js","ember-riak-explorer/templates/components/charts/cluster-stat.js","ember-riak-explorer/templates/components/charts/node-stat.js","ember-riak-explorer/templates/components/cluster-status-indicator.js","ember-riak-explorer/templates/components/dashboard-module/body.js","ember-riak-explorer/templates/components/dashboard-module/container.js","ember-riak-explorer/templates/components/dashboard-module/header.js","ember-riak-explorer/templates/components/dashboard-module/section.js","ember-riak-explorer/templates/components/form/add-custom-properties.js","ember-riak-explorer/templates/components/form/explorer-button.js","ember-riak-explorer/templates/components/form/explorer-input.js","ember-riak-explorer/templates/components/high-charts.js","ember-riak-explorer/templates/components/hll-editor.js","ember-riak-explorer/templates/components/link/explorer-resource.js","ember-riak-explorer/templates/components/loading-spinner.js","ember-riak-explorer/templates/components/map-object/contents.js","ember-riak-explorer/templates/components/map-object/map.js","ember-riak-explorer/templates/components/map-object/maps.js","ember-riak-explorer/templates/components/map-object/section.js","ember-riak-explorer/templates/components/map-object/sets.js","ember-riak-explorer/templates/components/modal-dialog.js","ember-riak-explorer/templates/components/new-object-inputs.js","ember-riak-explorer/templates/components/pagination-component.js","ember-riak-explorer/templates/components/set-editor.js","ember-riak-explorer/templates/components/side-drawer.js","ember-riak-explorer/templates/components/table/bucket-props-advanced.js","ember-riak-explorer/templates/components/table/bucket-props-overview.js","ember-riak-explorer/templates/components/table/bucket-types.js","ember-riak-explorer/templates/components/table/object-headers.js","ember-riak-explorer/templates/components/table/object-version.js","ember-riak-explorer/templates/components/table/search-indexes.js","ember-riak-explorer/templates/components/table/table-overview.js","ember-riak-explorer/templates/components/table/ts-table-reference.js","ember-riak-explorer/templates/components/table/ts-tables.js","ember-riak-explorer/templates/components/tether-dialog.js","ember-riak-explorer/templates/components/tooltip/bucket-props.js","ember-riak-explorer/templates/components/tooltip/node-config.js","ember-riak-explorer/templates/components/tooltip/node-stats.js","ember-riak-explorer/templates/components/view-label.js","ember-riak-explorer/templates/components/wrapper-panel.js","ember-riak-explorer/templates/partials/cached-lists.js","ember-riak-explorer/templates/partials/topbar.js","ember-riak-explorer/templates/partials/ts-planning-guidelines.js","ember-riak-explorer/templates/partials/ts-query-guidelines.js","ember-riak-explorer/templates/partials/ts-table-write-guidelines.js","ember-riak-explorer/utils/data-type-checks.js","ember-riak-explorer/utils/parse-header.js","ember-riak-explorer/utils/render-tooltip.js","ember-riak-explorer/utils/riak-help/bucket_props.js","ember-riak-explorer/utils/riak-help/riak_config.js","ember-riak-explorer/utils/riak-help/riak_status.js","ember-riak-explorer/utils/riak-object-formatter.js","ember-riak-explorer/utils/string-helpers.js","ember-riak-explorer/utils/validations.js","vendor/ember-cli/app-suffix.js","vendor/ember-cli/app-config.js","vendor/ember-cli/app-boot.js"],"sourcesContent":["\"use strict\";\n\n/* jshint ignore:start */\n\n\n\n/* jshint ignore:end */\n","define('ember-riak-explorer/adapters/application', ['exports', 'ember-data'], function (exports, _emberData) {\n\n /**\n * Provides common defaults for other adapters to extend: http://emberjs.com/api/data/classes/DS.Adapter.html\n * \n * @class ApplicationAdapter\n * @namespace Adapters\n * @extends DS.RESTAdapter\n */\n var ApplicationAdapter = _emberData['default'].RESTAdapter.extend({\n namespace: 'explore'\n });\n\n exports['default'] = ApplicationAdapter;\n});","define('ember-riak-explorer/adapters/bucket-list', ['exports', 'ember-riak-explorer/adapters/application', 'ember-riak-explorer/config/environment'], function (exports, _emberRiakExplorerAdaptersApplication, _emberRiakExplorerConfigEnvironment) {\n\n /**\n * @class BucketListAdapter\n * @namespace Adapters\n * @extends ApplicationAdapter\n */\n exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({\n /**\n * Overrides application adapter queryRecord method.\n * Used to get a bucket types cached bucket list. Please refer to cached lists in the read me for more info on explorer cached lists.\n *\n * @method queryRecord\n * @return {Object} Promise object of the requested bucket list\n */\n queryRecord: function queryRecord(store, type, query) {\n var url = 'explore/clusters/' + query.clusterName + '/bucket_types/' + query.bucketTypeName + '/buckets?start=1&rows=' + _emberRiakExplorerConfigEnvironment['default'].pageSize;\n\n var promise = this.ajax(url, 'GET').then(function (data) {\n if (data.buckets) {\n // Reformat response\n data.bucketList = data.buckets;\n\n delete data.buckets;\n delete data.bucketList.buckets;\n\n // Use compound key strategy to form id\n data.bucketList.id = query.clusterName + '/' + query.bucketTypeName + '/bucketList';\n }\n\n return data;\n });\n\n return promise;\n }\n });\n});","define('ember-riak-explorer/adapters/bucket-type', ['exports', 'ember-riak-explorer/adapters/application', 'ember'], function (exports, _emberRiakExplorerAdaptersApplication, _ember) {\n\n /**\n * @class BucketTypeAdapter\n * @namespace Adapters\n * @extends ApplicationAdapter\n */\n exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({\n /**\n * Overrides application adapter query method.\n * Used to read bucket types from a given cluster.\n *\n * @method query\n * @return {Object} Promise object of the requested bucket type\n */\n query: function query(store, type, _query) {\n var url = 'explore/clusters/' + _query.clusterName + '/bucket_types';\n\n var promise = this.ajax(url, 'GET').then(function (data) {\n // Remove any time series table bucket types, they are added by the TableAdapter.\n // Time series tables are identified by the \"ddl\" property.\n data.bucket_types = data.bucket_types.filter(function (bt) {\n return _ember['default'].isNone(bt.props.ddl);\n });\n\n data.bucket_types.forEach(function (bucketType) {\n // Use compound key strategy to form name/id\n bucketType.name = bucketType.id;\n bucketType.id = _query.clusterName + '/' + bucketType.name;\n });\n\n return data;\n });\n\n return promise;\n }\n });\n});","define('ember-riak-explorer/adapters/bucket', ['exports', 'ember', 'ember-riak-explorer/adapters/application', 'ember-riak-explorer/config/environment'], function (exports, _ember, _emberRiakExplorerAdaptersApplication, _emberRiakExplorerConfigEnvironment) {\n\n /**\n * @class BucketAdapter\n * @namespace Adapters\n * @extends ApplicationAdapter\n */\n exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({\n /**\n * Overrides application adapter query method.\n * Used to read buckets from a given bucket type.\n * Buckets are read from a cached list, and as a result may be paginated. This is where ${config.pageSize} param comes into play.\n *\n * @method query\n * @return {Object} Promise object of the requested bucket\n */\n query: function query(store, type, _query) {\n var url = 'explore/clusters/' + _query.clusterName + '/bucket_types/' + _query.bucketTypeName + '/buckets?start=1&rows=' + _emberRiakExplorerConfigEnvironment['default'].pageSize;\n\n var promise = this.ajax(url, 'GET').then(function (data) {\n if (data.buckets && data.buckets.buckets) {\n data.buckets = data.buckets.buckets.map(function (bucketName) {\n // Use compound key strategy to form name/id\n return {\n id: _query.clusterName + '/' + _query.bucketTypeName + '/' + bucketName,\n name: bucketName\n };\n });\n }\n\n return data;\n });\n\n return promise;\n },\n\n /**\n * Overrides application adapter deleteRecord method.\n * Used to read buckets from a given bucket type.\n * Buckets are read from a cached list, and as a result may be paginated. This is where ${config.pageSize} param comes into play.\n *\n * @method deleteRecord\n * @return {Object} Promise object of the DELETE request\n */\n deleteRecord: function deleteRecord(store, type, snapshot) {\n var clusterName = snapshot.belongsTo('bucketType').belongsTo('cluster').id;\n var bucketTypeName = snapshot.belongsTo('bucketType').attr('name');\n var bucketName = snapshot.attr('name');\n var url = 'explore/clusters/' + clusterName + '/bucket_types/' + bucketTypeName + '/buckets/' + bucketName;\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n _ember['default'].$.ajax({\n type: \"DELETE\",\n url: url,\n success: function success(data, textStatus, jqXHR) {\n resolve(jqXHR.status);\n },\n error: function error(jqXHR, textStatus) {\n if (jqXHR.status === 202) {\n resolve(jqXHR.status);\n } else {\n reject(textStatus);\n }\n }\n });\n });\n }\n });\n});","define('ember-riak-explorer/adapters/cluster', ['exports', 'ember-riak-explorer/adapters/application'], function (exports, _emberRiakExplorerAdaptersApplication) {\n\n /**\n * @class ClusterAdapter\n * @namespace Adapters\n * @extends ApplicationAdapter\n */\n exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({\n /**\n * Overrides application adapter urlForFindAll method.\n *\n * @method urlForFindAll\n * @return {String} url to use for FindAll method\n */\n urlForFindAll: function urlForFindAll(modelName) {\n return 'explore/clusters';\n }\n });\n});","define('ember-riak-explorer/adapters/config-file', ['exports', 'ember-riak-explorer/adapters/application'], function (exports, _emberRiakExplorerAdaptersApplication) {\n\n /**\n * @class ConfigFileAdapter\n * @namespace Adapters\n * @extends ApplicationAdapter\n */\n exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({\n /**\n * Overrides application adapter query method.\n * Used to read configuration files from a given node\n *\n * @method query\n * @return {Object} Promise object of the requested node config files\n */\n query: function query(store, type, _query) {\n var url = 'explore/clusters/' + _query.clusterName + '/nodes/' + _query.nodeName + '/config/files';\n\n var promise = this.ajax(url, 'GET').then(function (data) {\n\n data.files.forEach(function (file) {\n // Use compound key strategy to form name/id\n file.name = file.id;\n file.id = _query.clusterName + '/' + _query.nodeName + '/' + file.name;\n });\n\n return data;\n });\n\n return promise;\n }\n });\n});","define('ember-riak-explorer/adapters/log-file', ['exports', 'ember-riak-explorer/adapters/application'], function (exports, _emberRiakExplorerAdaptersApplication) {\n\n /**\n * @class LogFileAdapter\n * @namespace Adapters\n * @extends ApplicationAdapter\n */\n exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({\n /**\n * Overrides application adapter query method.\n * Used to read log files from a given node\n *\n * @method query\n * @return {Object} Promise object of the requested node log files\n */\n query: function query(store, type, _query) {\n var url = 'explore/clusters/' + _query.clusterName + '/nodes/' + _query.nodeName + '/log/files';\n\n var promise = this.ajax(url, 'GET').then(function (data) {\n\n data.files.forEach(function (file) {\n // Use compound key strategy to form name/id\n file.name = file.id;\n file.id = _query.clusterName + '/' + _query.nodeName + '/' + file.name;\n });\n\n return data;\n });\n\n return promise;\n }\n });\n});","define('ember-riak-explorer/adapters/node', ['exports', 'ember-riak-explorer/adapters/application'], function (exports, _emberRiakExplorerAdaptersApplication) {\n\n /**\n * @class NodeAdapter\n * @namespace Adapters\n * @extends ApplicationAdapter\n */\n exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({\n /**\n * Overrides application adapter query method.\n * Used to read nodes from a given cluster.\n *\n * @method query\n * @return {Object} Promise object of the requested nodes\n */\n query: function query(store, type, _query) {\n var url = 'explore/clusters/' + _query.clusterName + '/nodes';\n\n var promise = this.ajax(url, 'GET').then(function (data) {\n // Use compound key strategy to form name/id\n data.nodes.forEach(function (node) {\n node.name = node.id;\n node.id = _query.clusterName + '/' + node.name;\n });\n\n return data;\n });\n\n return promise;\n }\n });\n});","define('ember-riak-explorer/adapters/object-list', ['exports', 'ember-riak-explorer/adapters/application', 'ember-riak-explorer/config/environment'], function (exports, _emberRiakExplorerAdaptersApplication, _emberRiakExplorerConfigEnvironment) {\n\n /**\n * @class ObjectListAdapter\n * @namespace Adapters\n * @extends ApplicationAdapter\n */\n exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({\n /**\n * Overrides application adapter queryRecord method.\n * Used to get a buckets cached object list. Please refer to cached lists in the read me for more info on explorer cached lists.\n *\n * @method queryRecord\n * @return {Object} Promise object of the requested bucket list\n */\n queryRecord: function queryRecord(store, type, query) {\n var url = 'explore/clusters/' + query.clusterName + '/bucket_types/' + query.bucketTypeName + '/buckets/' + query.bucketName + '/keys?start=1&rows=' + _emberRiakExplorerConfigEnvironment['default'].pageSize;\n\n var promise = this.ajax(url, 'GET').then(function (data) {\n if (data.keys) {\n data.objectList = data.keys;\n\n delete data.keys;\n delete data.objectList.keys;\n\n data.objectList.id = query.clusterName + '/' + query.bucketTypeName + '/' + query.bucketName + '/objectList';\n }\n\n return data;\n });\n\n return promise;\n },\n\n /**\n * Overrides application adapter urlForDeleteRecord method.\n *\n * @method queryRecord\n * @return {String} Url string of DELETE request\n */\n urlForDeleteRecord: function urlForDeleteRecord(id, modelName, snapshot) {\n var clusterName = snapshot.belongsTo('bucket').belongsTo('bucketType').belongsTo('cluster').id;\n var bucketTypeName = snapshot.belongsTo('bucket').belongsTo('bucketType').attr('name');\n var bucketName = snapshot.belongsTo('bucket').attr('name');\n\n return 'explore/clusters/' + clusterName + '/bucket_types/' + bucketTypeName + '/buckets/' + bucketName + '/keys';\n }\n });\n});","define('ember-riak-explorer/adapters/riak-object', ['exports', 'ember', 'ember-riak-explorer/adapters/application', 'ember-riak-explorer/config/environment'], function (exports, _ember, _emberRiakExplorerAdaptersApplication, _emberRiakExplorerConfigEnvironment) {\n\n /**\n * @class RiakObjectAdapter\n * @namespace Adapters\n * @extends ApplicationAdapter\n */\n exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({\n /**\n * Overrides application adapter query method.\n * Used to read objects from a given bucket.\n *\n * @method query\n * @return {Object} Promise object of the requested object\n */\n query: function query(store, type, _query) {\n var url = 'explore/clusters/' + _query.clusterName + '/bucket_types/' + _query.bucketTypeName + '/buckets/' + _query.bucketName + '/keys?start=1&rows=' + _emberRiakExplorerConfigEnvironment['default'].pageSize;\n\n var promise = this.ajax(url, 'GET').then(function (data) {\n if (data.keys && data.keys.keys) {\n // Use compound key strategy to form name/id\n data.riak_objects = data.keys.keys.map(function (key) {\n return {\n id: _query.clusterName + '/' + _query.bucketTypeName + '/' + _query.bucketName + '/' + key,\n name: key\n };\n });\n\n delete data.keys;\n }\n\n return data;\n });\n\n return promise;\n },\n\n /**\n * Overrides application adapter createRecord method.\n * Creating a record and updating a record use same api, forward this method to that one\n *\n * @method createRecord\n */\n createRecord: function createRecord(store, type, snapshot) {\n return this.updateRecord(store, type, snapshot);\n },\n\n /**\n * Performs a limited 'Delete Bucket' command via the Explorer API.\n * (This is done as a convenience operation for Devs, since Riak doesn't\n * currently support a whole-bucket delete.)\n * To be more precise, the Explorer backend iterates through all the keys\n * in its Key List cache for that bucket, and issues Delete Object commands\n * for those keys.\n *\n * Limitations:\n * - This is only available in Development Mode\n * - Explorer can only delete objects whose keys are in its cache.\n *\n * Note: This means that the object list cache must already be populated for a delete action to be taken on the\n * bucket\n *\n * @method deleteRecord\n * @return {Object} Promise object of the request\n */\n deleteRecord: function deleteRecord(store, type, snapshot) {\n var object = snapshot.record;\n var clusterUrl = object.get('cluster').get('proxyUrl');\n var bucketTypeName = object.get('bucketType').get('name');\n var bucketName = object.get('bucket').get('name');\n var objectName = object.get('name');\n var url = clusterUrl + '/types/' + bucketTypeName + '/buckets/' + bucketName + '/keys/' + objectName;\n\n return _ember['default'].$.ajax({\n type: \"DELETE\",\n url: url,\n headers: { 'X-Riak-Vclock': object.get('causalContext') }\n });\n },\n\n /**\n * Overrides application adapter updateRecord method.\n * Creates new riak object for a given bucket\n *\n * @method updateRecord\n * @return {Object} Promise object of the request\n */\n updateRecord: function updateRecord(store, type, snapshot) {\n var object = snapshot.record;\n var clusterUrl = object.get('cluster').get('proxyUrl');\n var bucketTypeName = object.get('bucketType').get('name');\n var bucketName = object.get('bucket').get('name');\n var objectName = object.get('name');\n var url = clusterUrl + '/types/' + bucketTypeName + '/buckets/' + bucketName + '/keys/' + objectName;\n var headers = {};\n\n if (object.get('causalContext')) {\n headers['X-Riak-Vclock'] = object.get('causalContext');\n }\n if (object.get('indexes')) {\n object.get('indexes').forEach(function (index) {\n headers[index.key] = index.value;\n });\n }\n if (object.get('headersCustom')) {\n object.get('headersCustom').forEach(function (header) {\n headers[header.key] = header.value;\n });\n }\n\n return _ember['default'].$.ajax({\n type: 'PUT',\n processData: false,\n contentType: object.get('contentType') || 'application/json',\n url: url,\n headers: headers,\n data: JSON.stringify(object.get('contents'))\n });\n }\n });\n});","define('ember-riak-explorer/adapters/row-list', ['exports', 'ember-riak-explorer/adapters/application'], function (exports, _emberRiakExplorerAdaptersApplication) {\n\n /**\n * @class RowListAdapter\n * @namespace Adapters\n * @extends ApplicationAdapter\n */\n exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({\n /**\n * Overrides application adapter queryRecord method.\n * Used to get a tables cached row list. Please refer to cached lists in the read me for more info on explorer cached lists.\n *\n * @method queryRecord\n * @return {Object} Promise object of the requested bucket list\n */\n queryRecord: function queryRecord(store, type, query) {\n // TS Tables use same end point as bucket types, differentiated by \"ddl\" property\n var url = 'explore/clusters/' + query.clusterName + '/tables/' + query.tableName + '/keys';\n\n var promise = this.ajax(url, 'GET').then(function (data) {\n if (data.keys) {\n data.rowList = data.keys;\n\n delete data.keys;\n delete data.rowList.keys;\n\n // Use compound key strategy to form id\n data.rowList.id = query.clusterName + '/' + query.tableName + '/rowsList';\n }\n\n return data;\n });\n\n return promise;\n }\n });\n});","define('ember-riak-explorer/adapters/row', ['exports', 'ember-riak-explorer/adapters/application'], function (exports, _emberRiakExplorerAdaptersApplication) {\n\n /**\n * @class RowAdapter\n * @namespace Adapters\n * @extends ApplicationAdapter\n */\n exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({\n /**\n * Overrides application adapter query method.\n * Used to read table rows from a given time series table\n *\n * @method query\n * @return {Object} Promise object of the requested object\n */\n query: function query(store, type, _query) {\n // TS Tables use same end point as bucket types, differentiated by \"ddl\" property\n var url = 'explore/clusters/' + _query.clusterName + '/tables/' + _query.tableName + '/keys';\n\n var promise = this.ajax(url, 'GET').then(function (data) {\n if (data.keys && data.keys.keys) {\n data.rows = data.keys.keys.map(function (rowValue, index) {\n // Use compound key strategy to form name/id\n return {\n value: rowValue,\n index: index,\n id: _query.clusterName + '/' + _query.tableName + '/' + index\n };\n });\n\n delete data.keys;\n }\n\n return data;\n });\n\n return promise;\n }\n });\n});","define('ember-riak-explorer/adapters/search-index', ['exports', 'ember-data'], function (exports, _emberData) {\n\n /**\n * @class SearchIndexAdapter\n * @namespace Adapters\n * @extends ApplicationAdapter\n */\n var SearchIndexAdapter = _emberData['default'].RESTAdapter.extend({\n /**\n * Overrides application adapter query method.\n * Used to read search indexes from a given cluster.\n *\n * @method query\n * @return {Object} Promise object of the requested object\n */\n query: function query(store, type, _query) {\n var url = 'riak/clusters/' + _query.clusterName + '/search/index';\n\n var promise = this.ajax(url, 'GET').then(function (indexes) {\n // Use compound key strategy to form id\n indexes.forEach(function (index) {\n index.id = _query.clusterName + '/' + index.name;\n });\n\n return indexes;\n });\n\n return promise;\n }\n });\n\n exports['default'] = SearchIndexAdapter;\n});","define('ember-riak-explorer/adapters/table', ['exports', 'ember-riak-explorer/adapters/application', 'ember'], function (exports, _emberRiakExplorerAdaptersApplication, _ember) {\n\n /**\n * @class TableAdapter\n * @namespace Adapters\n * @extends ApplicationAdapter\n */\n exports['default'] = _emberRiakExplorerAdaptersApplication['default'].extend({\n /**\n * Overrides application adapter query method.\n * Used to read tables from a given cluster.\n *\n * @method query\n * @return {Object} Promise object of the requested object\n */\n query: function query(store, type, _query) {\n // TS Tables use same end point as bucket types, differentiated by \"ddl\" property\n var url = 'explore/clusters/' + _query.clusterName + '/bucket_types';\n\n var promise = this.ajax(url, 'GET').then(function (data) {\n\n // Remove any kv bucket types, they are added by the BucketTypeAdapter.\n // Time series tables are identified by the \"ddl\" property.\n data.tables = data.bucket_types.filter(function (bt) {\n return _ember['default'].isPresent(bt.props.ddl);\n });\n\n delete data.bucket_types;\n\n // Use compound key strategy to form name/id\n data.tables.forEach(function (table) {\n table.name = table.id;\n table.id = _query.clusterName + '/' + table.name;\n });\n\n return data;\n });\n\n return promise;\n }\n });\n});","define('ember-riak-explorer/app', ['exports', 'ember', 'ember-riak-explorer/resolver', 'ember-load-initializers', 'ember-riak-explorer/config/environment'], function (exports, _ember, _emberRiakExplorerResolver, _emberLoadInitializers, _emberRiakExplorerConfigEnvironment) {\n\n var App = undefined;\n\n _ember['default'].MODEL_FACTORY_INJECTIONS = true;\n\n App = _ember['default'].Application.extend({\n modulePrefix: _emberRiakExplorerConfigEnvironment['default'].modulePrefix,\n podModulePrefix: _emberRiakExplorerConfigEnvironment['default'].podModulePrefix,\n Resolver: _emberRiakExplorerResolver['default']\n });\n\n (0, _emberLoadInitializers['default'])(App, _emberRiakExplorerConfigEnvironment['default'].modulePrefix);\n\n exports['default'] = App;\n});","define('ember-riak-explorer/components/alert-component', ['exports', 'ember'], function (exports, _ember) {\n\n /**\n Implements Bootstrap alerts, see http://getbootstrap.com/components/#alerts\n \n By default it is a user dismissible, which can be disabled. Be sure to set the `type` property for proper styling.\n \n ```hbs\n {{#alert-component type=\"success\"}}\n Well done! You successfully read this important alert message.\n {{/alert-component}}\n ```\n @class Alert\n @namespace Components\n @extends Ember.Component\n */\n\n exports['default'] = _ember['default'].Component.extend({\n classNameBindings: ['alert'],\n\n type: 'info',\n\n /**\n * A dismissible alert will have a close button in the upper right corner, that the user can click to dismiss\n * the alert.\n *\n * @property dismissible\n * @type boolean\n * @default true\n * @public\n */\n dismissible: true,\n\n /**\n * This property indicates if the alert is visible. Can be set to change the visibility of the alert box.\n *\n * @property visible\n * @type boolean\n * @default true\n * @public\n */\n visible: true,\n\n alert: (function () {\n if (this.get('visible')) {\n return 'alert alert-' + this.get('type');\n }\n }).property('type', 'visible'),\n\n onVisibleChange: (function () {\n if (this.get('visible')) {\n this.show();\n } else {\n this.hide();\n }\n }).property('visible'),\n\n /**\n * Call to make the alert visible again after it has been hidden\n *\n * @method show\n * @public\n */\n show: function show() {\n this.set('visible', true);\n },\n\n /**\n * Call to hide the alert.\n *\n * @method hide\n * @public\n */\n hide: function hide() {\n this.set('visible', false);\n },\n\n actions: {\n dismiss: function dismiss() {\n this.hide();\n }\n }\n });\n});","define('ember-riak-explorer/components/app-version', ['exports', 'ember-cli-app-version/components/app-version', 'ember-riak-explorer/config/environment'], function (exports, _emberCliAppVersionComponentsAppVersion, _emberRiakExplorerConfigEnvironment) {\n\n var name = _emberRiakExplorerConfigEnvironment['default'].APP.name;\n var version = _emberRiakExplorerConfigEnvironment['default'].APP.version;\n\n exports['default'] = _emberCliAppVersionComponentsAppVersion['default'].extend({\n version: version,\n name: name\n });\n});","define('ember-riak-explorer/components/basic-dropdown', ['exports', 'ember-basic-dropdown/components/basic-dropdown'], function (exports, _emberBasicDropdownComponentsBasicDropdown) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberBasicDropdownComponentsBasicDropdown['default'];\n }\n });\n});","define('ember-riak-explorer/components/breadcrumb-component', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n classNames: ['breadcrumb-container'],\n\n clusterSubSection: null,\n\n data: null,\n\n isClusterData: (function () {\n return this.get('clusterSubSection') === 'data';\n }).property('clusterSubSection'),\n\n isClusterOps: (function () {\n return this.get('clusterSubSection') === 'ops';\n }).property('clusterSubSection'),\n\n isClusterQuery: (function () {\n return this.get('clusterSubSection') === 'query';\n }).property('clusterSubSection')\n });\n});","define('ember-riak-explorer/components/charts/cluster-stat', ['exports', 'ember', 'ember-highcharts/components/high-charts', 'lodash/lodash'], function (exports, _ember, _emberHighchartsComponentsHighCharts, _lodashLodash) {\n /*globals Highcharts */\n\n exports['default'] = _emberHighchartsComponentsHighCharts['default'].extend({\n defaultOptions: {\n title: {\n text: 'Cluster Data'\n },\n rangeSelector: {\n buttons: [{\n count: 1,\n type: 'minute',\n text: '1M'\n }, {\n count: 5,\n type: 'minute',\n text: '5M'\n }, {\n count: 10,\n type: 'minute',\n text: '10M'\n }, {\n count: 30,\n type: 'minute',\n text: '30M'\n }, {\n type: 'all',\n text: 'All'\n }],\n inputEnabled: false,\n selected: 0\n },\n legend: {\n enabled: true\n }\n },\n\n cluster: null,\n\n statToGraph: null,\n\n content: null,\n\n chartOptions: null,\n\n mode: \"StockChart\",\n\n getMostRecentData: function getMostRecentData() {\n var self = this;\n\n return this.get('cluster').get('nodes').map(function (node) {\n return {\n name: node.get('name'),\n stats: node.get('statsHistory')\n };\n });\n },\n\n setInitialData: function setInitialData() {\n var statName = this.get('statToGraph');\n var options = _lodashLodash['default'].assign(_lodashLodash['default'].cloneDeep(this.defaultOptions), { title: { text: statName } });\n var data = this.getMostRecentData();\n\n this.set('chartOptions', options);\n this.set('content', data.map(function (node) {\n return {\n name: node.name,\n data: node.stats.map(function (stat) {\n return {\n x: stat.timestamp,\n y: stat.stats[statName]\n };\n }),\n type: 'spline',\n turboThreshold: 0\n };\n }));\n },\n\n init: function init() {\n this._super.apply(this, arguments);\n this.setInitialData();\n },\n\n streamNewDataIntoChart: function streamNewDataIntoChart() {\n var chart = this.get('chart');\n var allSeries = chart.series.filter(function (node) {\n return node.name !== 'Navigator';\n });\n var data = this.getMostRecentData();\n var statName = this.get('chartOptions.title.text');\n\n allSeries.forEach(function (series, index) {\n var redraw = index + 1 === allSeries.length;\n var newData = data.findBy('name', series.name);\n\n series.setData(newData.stats.map(function (stat) {\n return {\n x: stat.timestamp,\n y: stat.stats[statName]\n };\n }), redraw);\n });\n },\n\n debouncedObserver: (function () {\n _ember['default'].run.debounce(this, this.streamNewDataIntoChart, 1000);\n }).observes('cluster.nodes.@each.stats'),\n\n switchChart: (function () {\n var statName = this.get('statToGraph');\n var currentDisplayedStat = this.get('chartOptions.title.text');\n var chart = this.get('chart');\n\n if (statName !== currentDisplayedStat) {\n this.setInitialData();\n chart.redraw();\n }\n }).observes('statToGraph')\n });\n});","define('ember-riak-explorer/components/charts/node-stat', ['exports', 'ember-highcharts/components/high-charts', 'lodash/lodash'], function (exports, _emberHighchartsComponentsHighCharts, _lodashLodash) {\n /*globals Highcharts */\n\n exports['default'] = _emberHighchartsComponentsHighCharts['default'].extend({\n defaultOptions: {\n title: {\n text: 'Node Data'\n },\n rangeSelector: {\n buttons: [{\n count: 1,\n type: 'minute',\n text: '1M'\n }, {\n count: 5,\n type: 'minute',\n text: '5M'\n }, {\n count: 10,\n type: 'minute',\n text: '10M'\n }, {\n count: 30,\n type: 'minute',\n text: '30M'\n }, {\n type: 'all',\n text: 'All'\n }],\n inputEnabled: false,\n selected: 0\n }\n },\n\n node: null,\n\n statToGraph: null,\n\n content: null,\n\n chartOptions: null,\n\n mode: \"StockChart\",\n\n setInitialData: function setInitialData() {\n var statName = this.get('statToGraph');\n var options = _lodashLodash['default'].assign(_lodashLodash['default'].cloneDeep(this.defaultOptions), { title: { text: statName } });\n var stats = this.get('node').get('statsHistory');\n\n this.set('chartOptions', options);\n this.set('content', [{\n name: statName,\n data: stats.map(function (stat) {\n return {\n x: stat.timestamp,\n y: stat.stats[statName]\n };\n }),\n type: 'spline',\n turboThreshold: 0\n }]);\n },\n\n init: function init() {\n this._super.apply(this, arguments);\n this.setInitialData();\n },\n\n streamNewDataIntoChart: (function () {\n var chart = this.get('chart');\n var series = _lodashLodash['default'].head(chart.series);\n var stats = this.get('node').get('statsHistory');\n var statName = this.get('chartOptions.title.text');\n\n series.setData(stats.map(function (stat) {\n return {\n x: stat.timestamp,\n y: stat.stats[statName]\n };\n }));\n }).observes('node.stats'),\n\n switchChart: (function () {\n var statName = this.get('statToGraph');\n var currentDisplayedStat = this.get('chartOptions.title.text');\n var chart = this.get('chart');\n\n if (statName !== currentDisplayedStat) {\n this.setInitialData();\n chart.redraw();\n }\n }).observes('statToGraph')\n });\n});","define('ember-riak-explorer/components/cluster-status-indicator', ['exports', 'ember', 'ember-tooltips/utils/render-tooltip'], function (exports, _ember, _emberTooltipsUtilsRenderTooltip) {\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'span',\n\n classNames: ['cluster-status-circle'],\n\n classNameBindings: ['status'],\n\n status: null,\n\n tooltipInstance: null,\n\n toolTipContent: (function () {\n var message = '';\n var status = this.get('status');\n\n switch (status) {\n case 'ok':\n message = \"All nodes in the cluster are valid and are reachable\";\n break;\n case 'warning':\n message = 'Some nodes in the cluster are either invalid and/or are unreachable';\n break;\n case 'down':\n message = 'All nodes in the cluster are either invalid and/or are unreachable';\n break;\n default:\n break;\n }\n\n return '' + message + '
';\n }).property('status'),\n\n didRender: function didRender() {\n var toolTipContent = this.get('toolTipContent');\n\n if (!this.get('tooltipInstance')) {\n var element = this.$()[0];\n\n this.set('tooltipInstance', (0, _emberTooltipsUtilsRenderTooltip['default'])(element, {\n content: toolTipContent,\n event: 'hover',\n place: 'right',\n spacing: 20\n }));\n } else {\n this.get('tooltipInstance').content(toolTipContent);\n }\n }\n });\n});","define('ember-riak-explorer/components/content-editable', ['exports', 'ember-content-editable/components/content-editable'], function (exports, _emberContentEditableComponentsContentEditable) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberContentEditableComponentsContentEditable['default'];\n }\n });\n});","define('ember-riak-explorer/components/dashboard-module/body', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n classNames: ['module-body']\n });\n});","define('ember-riak-explorer/components/dashboard-module/container', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n classNames: ['dashboard-module']\n });\n});","define('ember-riak-explorer/components/dashboard-module/header', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n classNames: ['module-header'],\n\n label: null\n });\n});","define('ember-riak-explorer/components/dashboard-module/section', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'section',\n\n title: null\n });\n});","define('ember-riak-explorer/components/ember-modal-dialog-positioned-container', ['exports', 'ember-modal-dialog/components/positioned-container'], function (exports, _emberModalDialogComponentsPositionedContainer) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberModalDialogComponentsPositionedContainer['default'];\n }\n });\n});","define('ember-riak-explorer/components/ember-wormhole', ['exports', 'ember-wormhole/components/ember-wormhole'], function (exports, _emberWormholeComponentsEmberWormhole) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberWormholeComponentsEmberWormhole['default'];\n }\n });\n});","define('ember-riak-explorer/components/form/add-custom-properties', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n properties: [],\n\n actions: {\n addNewProperty: function addNewProperty() {\n this.get('properties').pushObject({\n key: '',\n value: ''\n });\n },\n\n removeProperty: function removeProperty(index) {\n this.get('properties').removeAt(index);\n }\n }\n });\n});","define('ember-riak-explorer/components/form/explorer-button', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n classNames: ['form-group', 'create-button'],\n\n type: 'primary',\n\n label: null,\n\n actions: {\n handleButtonClick: function handleButtonClick() {\n this.sendAction('buttonClick');\n }\n }\n });\n});","define('ember-riak-explorer/components/form/explorer-input', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n classNames: ['form-group'],\n\n label: null,\n\n type: 'text',\n\n value: null\n });\n});","define('ember-riak-explorer/components/high-charts', ['exports', 'ember-highcharts/components/high-charts'], function (exports, _emberHighchartsComponentsHighCharts) {\n exports['default'] = _emberHighchartsComponentsHighCharts['default'];\n});","define('ember-riak-explorer/components/hll-editor', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'ul',\n\n classNames: ['object-content-list'],\n\n newItem: '',\n\n contents: [],\n\n actions: {\n addElement: function addElement(item) {\n var trimmedItem = item.trim();\n\n this.sendAction('addElement', trimmedItem);\n this.set('newItem', '');\n }\n }\n });\n});","define('ember-riak-explorer/components/ivy-codemirror', ['exports', 'ivy-codemirror/components/ivy-codemirror'], function (exports, _ivyCodemirrorComponentsIvyCodemirror) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _ivyCodemirrorComponentsIvyCodemirror['default'];\n }\n });\n});","define('ember-riak-explorer/components/ivy-tab-list', ['exports', 'ivy-tabs/components/ivy-tab-list'], function (exports, _ivyTabsComponentsIvyTabList) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _ivyTabsComponentsIvyTabList['default'];\n }\n });\n});","define('ember-riak-explorer/components/ivy-tab-panel', ['exports', 'ivy-tabs/components/ivy-tab-panel'], function (exports, _ivyTabsComponentsIvyTabPanel) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _ivyTabsComponentsIvyTabPanel['default'];\n }\n });\n});","define('ember-riak-explorer/components/ivy-tab', ['exports', 'ivy-tabs/components/ivy-tab'], function (exports, _ivyTabsComponentsIvyTab) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _ivyTabsComponentsIvyTab['default'];\n }\n });\n});","define('ember-riak-explorer/components/ivy-tabs', ['exports', 'ivy-tabs/components/ivy-tabs'], function (exports, _ivyTabsComponentsIvyTabs) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _ivyTabsComponentsIvyTabs['default'];\n }\n });\n});","define('ember-riak-explorer/components/link/explorer-resource', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'span',\n\n resourceType: null,\n\n resourceObj: null,\n\n linkClass: null\n });\n});","define('ember-riak-explorer/components/loading-slider', ['exports', 'ember'], function (exports, _ember) {\n var Component = _ember['default'].Component;\n var run = _ember['default'].run;\n var isBlank = _ember['default'].isBlank;\n var inject = _ember['default'].inject;\n var on = _ember['default'].on;\n exports['default'] = Component.extend({\n tagName: 'div',\n classNames: ['loading-slider'],\n classNameBindings: 'expanding',\n\n loadingSlider: inject.service(),\n\n init: function init() {\n this._super.apply(this, arguments);\n run.once(this, function () {\n this.get('loadingSlider').on('startLoading', this, this._startLoading);\n this.get('loadingSlider').on('endLoading', this, this._endLoading);\n this.get('loadingSlider').on('changeAttrs', this, this._changeAttrs);\n });\n },\n\n setAttrsThenManage: on('didReceiveAttrs', function () {\n this.setProperties({\n isLoading: this.getAttr('isLoading'),\n duration: this.getAttr('duration'),\n expanding: this.getAttr('expanding'),\n speed: this.getAttr('speed'),\n color: this.getAttr('color')\n });\n\n this.manage();\n }),\n\n willDestroy: function willDestroy() {\n run.once(this, function () {\n this.get('loadingSlider').off('startLoading', this, this._startLoading);\n this.get('loadingSlider').off('endLoading', this, this._endLoading);\n this.get('loadingSlider').off('changeAttrs', this, this._changeAttrs);\n });\n },\n\n _startLoading: function _startLoading() {\n this.set('isLoading', true);\n this.manage();\n },\n\n _endLoading: function _endLoading() {\n this.set('isLoading', false);\n },\n\n _changeAttrs: function _changeAttrs(attrs) {\n this.setProperties(attrs);\n this.manage();\n },\n\n manage: function manage() {\n if (isBlank(this.$())) {\n return;\n }\n\n if (this.get('isLoading')) {\n if (this.get('expanding')) {\n this.expandingAnimate.call(this);\n } else {\n this.animate.call(this);\n }\n } else {\n this.set('isLoaded', true);\n }\n },\n\n animate: function animate() {\n this.set('isLoaded', false);\n var self = this,\n elapsedTime = 0,\n inner = $(''),\n outer = this.$(),\n duration = this.getWithDefault('duration', 300),\n innerWidth = 0,\n outerWidth = this.$().width(),\n stepWidth = Math.round(outerWidth / 50),\n color = this.get('color');\n\n outer.append(inner);\n if (color) {\n inner.css('background-color', color);\n }\n\n var interval = window.setInterval(function () {\n elapsedTime = elapsedTime + 10;\n inner.width(innerWidth = innerWidth + stepWidth);\n\n // slow the animation if we used more than 75% the estimated duration\n // or 66% of the animation width\n if (elapsedTime > duration * 0.75 || innerWidth > outerWidth * 0.66) {\n // don't stop the animation completely\n if (stepWidth > 1) {\n stepWidth = stepWidth * 0.97;\n }\n }\n\n if (innerWidth > outerWidth) {\n run.later(function () {\n outer.empty();\n window.clearInterval(interval);\n }, 50);\n }\n\n // the activity has finished\n if (self.get('isLoaded')) {\n // start with a sizable pixel step\n if (stepWidth < 10) {\n stepWidth = 10;\n }\n // accelerate to completion\n stepWidth = stepWidth + stepWidth;\n }\n }, 10);\n },\n\n expandingAnimate: function expandingAnimate() {\n var self = this,\n outer = this.$(),\n speed = this.getWithDefault('speed', 1000),\n colorQueue = this.get('color');\n\n if ('object' === typeof colorQueue) {\n (function updateFn() {\n var color = colorQueue.shift();\n colorQueue.push(color);\n self.expandItem.call(self, color);\n if (!self.get('isLoading')) {\n outer.empty();\n } else {\n window.setTimeout(updateFn, speed);\n }\n })();\n } else {\n this.expandItem.call(this, colorQueue, true);\n }\n },\n\n expandItem: function expandItem(color, cleanUp) {\n var self = this,\n inner = $('').css({ 'background-color': color }),\n outer = this.$(),\n innerWidth = 0,\n outerWidth = outer.width(),\n stepWidth = Math.round(outerWidth / 50);\n var ua = window.navigator.userAgent;\n var ie10 = ua.indexOf(\"MSIE \"),\n ie11 = ua.indexOf('Trident/'),\n ieEdge = ua.indexOf('Edge/');\n\n outer.append(inner);\n\n var interval = window.setInterval(function () {\n var step = innerWidth = innerWidth + stepWidth;\n if (innerWidth > outerWidth) {\n window.clearInterval(interval);\n if (cleanUp) {\n outer.empty();\n }\n }\n if (ie10 > 0 || ie11 > 0 || ieEdge > 0) {\n inner.css({\n 'margin': '0 auto',\n 'width': step\n });\n } else {\n inner.css({\n 'margin-left': '-' + step / 2 + 'px',\n 'width': step\n });\n }\n }, 10);\n },\n\n didInsertElement: function didInsertElement() {\n this.$().html('');\n\n var color = this.get('color');\n if (color) {\n this.$('span').css('background-color', color);\n }\n\n if (this.get('runManageInitially')) {\n this._startLoading();\n }\n }\n });\n});","define('ember-riak-explorer/components/loading-spinner', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n classNames: ['loading-background']\n });\n});","define('ember-riak-explorer/components/map-object/contents', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n classNames: ['map-instance']\n });\n});","define('ember-riak-explorer/components/map-object/map', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n classNames: ['map-sub-map'],\n\n showContent: false,\n\n actions: {\n subMapToggle: function subMapToggle() {\n return this.set('showContent', !this.get('showContent'));\n }\n }\n });\n});","define('ember-riak-explorer/components/map-object/maps', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n classNames: ['map-section', 'maps-list']\n });\n});","define('ember-riak-explorer/components/map-object/section', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n classNames: ['map-section']\n });\n});","define('ember-riak-explorer/components/map-object/sets', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n classNames: ['map-section', 'map-sub-set']\n });\n});","define('ember-riak-explorer/components/modal-dialog-overlay', ['exports', 'ember-modal-dialog/components/modal-dialog-overlay'], function (exports, _emberModalDialogComponentsModalDialogOverlay) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberModalDialogComponentsModalDialogOverlay['default'];\n }\n });\n});","define('ember-riak-explorer/components/modal-dialog', ['exports', 'ember-modal-dialog/components/modal-dialog'], function (exports, _emberModalDialogComponentsModalDialog) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberModalDialogComponentsModalDialog['default'];\n }\n });\n});","define('ember-riak-explorer/components/new-object-inputs', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n object: {\n key: null,\n value: null,\n contentType: null,\n type: null\n }\n });\n});","define('ember-riak-explorer/components/pagination-component', ['exports', 'ember'], function (exports, _ember) {\n\n /**\n * A pagination UI component. Determines how many links to show, handling click actions on those links,\n * sending data \"up\" to be acted upon, and updating selected state.\n *\n * @class pagination-component\n * @extends Ember.Component\n */\n exports['default'] = _ember['default'].Component.extend({\n /**\n * Sets the class name of the component\n *\n * @property classNames\n * @type Array\n */\n classNames: ['pagination-component-container'],\n\n /**\n * Stores the number of pagination links the UI could potentially display\n *\n * @property numberLinksCount\n * @type Integer\n * @default 0\n */\n numberLinksCount: 0,\n\n /**\n * Stores the current page or chunk that the UI is displaying\n *\n * @property currentChunk\n * @type Integer\n * @default 1\n */\n currentChunk: 1,\n\n /**\n * Stores the current page or chunk size\n *\n * @property chunkSize\n * @type Integer\n * @default 0\n */\n chunkSize: 0,\n\n /**\n * An array of sequential integers starting at 1. i.e. [1,2,3,4,5,6]\n * This is used to create the links in the UI as handlebars does not have a \"times\" helper by default\n *\n * @property numberLinks\n * @type Array\n * @default []\n */\n numberLinks: [],\n\n /**\n * Stores the total length of the items on which are being paginated\n *\n * @property totalSize\n * @type Integer\n * @default 0\n */\n totalSize: 0,\n\n didReceiveAttrs: function didReceiveAttrs() {\n this.setNumberLinksCount();\n this.setNumberLinks();\n },\n\n /**\n * Lifecycle method. This is called every time new data is fed into the component.\n * Current chunk is set on various actions, data is fetched as a result of that action, the component receives new data,\n * and this method is invoked.\n *\n * @method didRender\n */\n didRender: function didRender() {\n this.updateSelectedClass();\n },\n\n /**\n * Figures out what the item range for a given chunk based on the chunk size.\n * If current chunk is 1 and paginating every ten items, the object returns the range 0-9\n * If current chunk is 3 and paginating every ten items, the object returns the range 30-39\n *\n * @method calculateRequestedRange\n * @private\n * @param chunk {String}\n * @return {Object} Contains low and high properties. i.e. { low: 31, high: 40 }\n */\n calculateRequestedRange: function calculateRequestedRange(chunk) {\n var chunkSize = this.get('chunkSize');\n\n return {\n lowIndex: chunk * chunkSize - chunkSize,\n highIndex: chunk * chunkSize - 1\n };\n },\n\n /**\n * Determines the total number of links needed to be created given the total length and chunk size.\n *\n * @method setNumberLinksCount\n * @private\n * @return {Integer}\n */\n setNumberLinksCount: function setNumberLinksCount() {\n var linkCount = Math.ceil(this.get('totalSize') / this.get('chunkSize'));\n\n return this.set('numberLinksCount', linkCount);\n },\n\n setNumberLinks: function setNumberLinks() {\n // reset numberLinks array\n this.set('numberLinks', []);\n\n // We want the loop to be 1 indexed, not 0\n for (var i = 1; i < this.get('numberLinksCount') + 1; i++) {\n this.numberLinks.push(i);\n }\n },\n\n /**\n * Sets the selected class on the current pagination link item in the DOM. Using jQuery to mutate state is not ideal,\n * but since this state is contained within the component, and because we don't have conditional logic in handlebars,\n * this is the cleanest way to handle this.\n *\n * @method updateSelectedClass\n * @private\n */\n updateSelectedClass: function updateSelectedClass() {\n var self = this;\n var numberLinks = this.$().find('.pagination-link.number-link');\n\n // Remove the selected class\n numberLinks.removeClass('selected');\n\n // Add selected to the correct link\n numberLinks.filter(function (index) {\n var oneBasedIndex = index + 1;\n\n return oneBasedIndex === self.get('currentChunk');\n }).addClass('selected');\n },\n\n /**\n * Determines whether or not the UI should show pagination links. This is used by the handlebars templates.\n * returns false if there is only one page and pagination is not needed.\n *\n * @method shouldShowPaginationLinks\n * @return {Boolean}\n */\n shouldShowPaginationLinks: (function () {\n return this.get('numberLinksCount') > 1;\n }).property('numberLinksCount'),\n\n /**\n * Determines whether or not the previous button should disabled. This is used by the handlebars templates.\n * Returns true if the current page is 1, because there is not previous page at that point.\n *\n * @method shouldPrevBeDisabled\n * @return {Boolean}\n */\n shouldPrevBeDisabled: (function () {\n return this.get('currentChunk') <= 1;\n }).property('currentChunk'),\n\n /**\n * Determines whether or not the next button should disabled. This is used by the handlebars templates.\n * Returns true if the current page is the last item in the list, because there is not previous page at that point.\n *\n * @method shouldNextBeDisabled\n * @return {Boolean}\n */\n shouldNextBeDisabled: (function () {\n return this.numberLinks.length === this.get('currentChunk');\n }).property('currentChunk'),\n\n /**\n * All actions that the pagination component handles. Upon receiving an action, it updates the state of the component\n * and sends the event \"up\" for higher level work that it is not aware of.\n *\n * @property actions\n * @type Object\n */\n actions: {\n numberLinkClick: function numberLinkClick(link) {\n var chunk = link;\n var requestedRange = this.calculateRequestedRange(chunk);\n\n this.set('currentChunk', chunk);\n this.sendAction('sectionRequest', requestedRange.lowIndex, requestedRange.highIndex);\n },\n\n prevLinkClick: function prevLinkClick() {\n if (!this.get('shouldPrevBeDisabled')) {\n var currentChunk = this.get('currentChunk');\n var newChunk = currentChunk - 1;\n var requestedRange = this.calculateRequestedRange(newChunk);\n\n this.set('currentChunk', newChunk);\n this.sendAction('sectionRequest', requestedRange.lowIndex, requestedRange.highIndex);\n }\n },\n\n nextLinkClick: function nextLinkClick() {\n if (!this.get('shouldNextBeDisabled')) {\n var currentChunk = this.get('currentChunk');\n var newChunk = currentChunk + 1;\n var requestedRange = this.calculateRequestedRange(newChunk);\n\n this.set('currentChunk', newChunk);\n this.sendAction('sectionRequest', requestedRange.lowIndex, requestedRange.highIndex);\n }\n }\n }\n });\n});","define('ember-riak-explorer/components/power-select', ['exports', 'ember-power-select/components/power-select'], function (exports, _emberPowerSelectComponentsPowerSelect) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberPowerSelectComponentsPowerSelect['default'];\n }\n });\n});","define('ember-riak-explorer/components/power-select/before-options', ['exports', 'ember-power-select/components/power-select/before-options'], function (exports, _emberPowerSelectComponentsPowerSelectBeforeOptions) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberPowerSelectComponentsPowerSelectBeforeOptions['default'];\n }\n });\n});","define('ember-riak-explorer/components/power-select/multiple', ['exports', 'ember-power-select/components/power-select/multiple'], function (exports, _emberPowerSelectComponentsPowerSelectMultiple) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberPowerSelectComponentsPowerSelectMultiple['default'];\n }\n });\n});","define('ember-riak-explorer/components/power-select/multiple/selected', ['exports', 'ember-power-select/components/power-select/multiple/selected'], function (exports, _emberPowerSelectComponentsPowerSelectMultipleSelected) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberPowerSelectComponentsPowerSelectMultipleSelected['default'];\n }\n });\n});","define('ember-riak-explorer/components/power-select/options', ['exports', 'ember-power-select/components/power-select/options'], function (exports, _emberPowerSelectComponentsPowerSelectOptions) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberPowerSelectComponentsPowerSelectOptions['default'];\n }\n });\n});","define('ember-riak-explorer/components/power-select/single', ['exports', 'ember-power-select/components/power-select/single'], function (exports, _emberPowerSelectComponentsPowerSelectSingle) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberPowerSelectComponentsPowerSelectSingle['default'];\n }\n });\n});","define('ember-riak-explorer/components/power-select/single/selected', ['exports', 'ember-power-select/components/power-select/single/selected'], function (exports, _emberPowerSelectComponentsPowerSelectSingleSelected) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberPowerSelectComponentsPowerSelectSingleSelected['default'];\n }\n });\n});","define('ember-riak-explorer/components/set-editor', ['exports', 'ember', 'ember-riak-explorer/utils/validations'], function (exports, _ember, _emberRiakExplorerUtilsValidations) {\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'ul',\n\n classNames: ['object-content-list'],\n\n newItem: '',\n\n contents: [],\n\n actions: {\n addElement: function addElement(item) {\n var trimmedItem = item.trim();\n var isValid = _emberRiakExplorerUtilsValidations['default'].isUniqueArrayItem(this.get('contents'), item);\n\n if (isValid) {\n this.sendAction('addSetElement', trimmedItem);\n this.set('newItem', '');\n } else {\n this.sendAction('nonUniqueSetElement', trimmedItem);\n }\n },\n\n removeElement: function removeElement(item) {\n if (_emberRiakExplorerUtilsValidations['default'].itemExistsInArray(this.get('contents'), item)) {\n this.sendAction('removeSetElement', item);\n }\n }\n }\n });\n});","define('ember-riak-explorer/components/side-drawer', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n classNames: ['side-drawer'],\n\n classNameBindings: ['status'],\n\n label: null,\n\n visible: false,\n\n // Hack to get around inability of css to figure this out\n setDrawerPanelClass: (function () {\n if (this.get('visible')) {\n this.$().parent().removeClass('drawer-closed');\n } else {\n this.$().parent().addClass('drawer-closed');\n }\n }).observes('visible'),\n\n status: (function () {\n return this.get('visible') ? 'open' : 'closed';\n }).property('visible'),\n\n actions: {\n close: function close() {\n return this.set('visible', false);\n }\n }\n });\n});","define('ember-riak-explorer/components/table/bucket-props-advanced', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'table',\n\n classNames: ['key-value-table', 'bucket-props-advanced']\n });\n});","define('ember-riak-explorer/components/table/bucket-props-overview', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'table',\n\n classNames: ['key-value-table', 'bucket-props-overview']\n });\n});","define('ember-riak-explorer/components/table/bucket-types', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'table',\n\n classNames: ['table', 'cluster-table'],\n\n bucketTypes: null\n });\n});","define('ember-riak-explorer/components/table/object-headers', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'table',\n\n classNames: ['key-value-table']\n });\n});","define('ember-riak-explorer/components/table/object-version', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'table',\n\n classNames: ['key-value-table']\n });\n});","define('ember-riak-explorer/components/table/search-indexes', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'table',\n\n classNames: ['table'],\n\n indexes: null\n });\n});","define('ember-riak-explorer/components/table/table-overview', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'table',\n\n classNames: ['key-value-table', 'table-overview']\n });\n});","define('ember-riak-explorer/components/table/ts-table-reference', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'table',\n\n classNames: ['key-value-table', 'ts-table-reference'],\n\n table: null\n });\n});","define('ember-riak-explorer/components/table/ts-tables', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'table',\n\n classNames: ['table', 'cluster-table'],\n\n bucketTypes: null\n });\n});","define('ember-riak-explorer/components/tether-dialog', ['exports', 'ember-modal-dialog/components/tether-dialog'], function (exports, _emberModalDialogComponentsTetherDialog) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberModalDialogComponentsTetherDialog['default'];\n }\n });\n});","define('ember-riak-explorer/components/tooltip-on-parent', ['exports', 'ember-tooltips/components/tooltip-on-parent'], function (exports, _emberTooltipsComponentsTooltipOnParent) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberTooltipsComponentsTooltipOnParent['default'];\n }\n });\n});","define('ember-riak-explorer/components/tooltip/bucket-props', ['exports', 'ember', 'ember-tooltips/utils/render-tooltip'], function (exports, _ember, _emberTooltipsUtilsRenderTooltip) {\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'span',\n\n classNameBindings: ['toolTipClass'],\n\n itemKey: undefined,\n\n itemDescription: undefined,\n\n itemDefaultValue: undefined,\n\n itemIsEditable: undefined,\n\n itemSchemaType: undefined,\n\n tooltipInstance: null,\n\n shouldRenderToolTip: (function () {\n var key = this.get('itemKey');\n var description = this.get('itemDescription');\n var itemDefault = this.get('itemDefaultValue');\n var editable = this.get('itemIsEditable');\n var type = this.get('itemSchemaType');\n\n return !!(key && (description || itemDefault || editable || type));\n }).property('itemKey', 'itemDescription', 'itemDefaultValue', 'itemIsEditable', 'itemSchemaType'),\n\n toolTipClass: (function () {\n if (this.get('shouldRenderToolTip')) {\n return 'tooltip-icon bucket-props-tooltip ion-information-circled';\n }\n }).property('shouldRenderToolTip'),\n\n didRender: function didRender() {\n if (this.get('shouldRenderToolTip')) {\n var element = this.$()[0];\n var key = this.get('itemKey');\n var description = this.get('itemDescription');\n var itemDefault = this.get('itemDefaultValue');\n var editable = this.get('itemIsEditable');\n var type = this.get('itemSchemaType');\n\n var wrapperStart = '';\n var ttTitle = '
';\n var ttDescription = description !== undefined ? '
' : '';\n var ttItemDefault = itemDefault !== undefined ? '
Default Value: ' + itemDefault + '
' : '';\n var ttEditable = editable !== undefined ? '
Editable: ' + editable + '
' : '';\n var ttType = type !== undefined ? '
Type: ' + type + '
' : '';\n var wrapperEnd = '
';\n\n var toolTipTemplate = wrapperStart + ttTitle + ttDescription + ttItemDefault + ttEditable + ttType + wrapperEnd;\n\n this.set('tooltipInstance', (0, _emberTooltipsUtilsRenderTooltip['default'])(element, {\n content: toolTipTemplate,\n event: 'hover'\n }));\n }\n }\n });\n});","define('ember-riak-explorer/components/tooltip/node-config', ['exports', 'ember', 'ember-tooltips/utils/render-tooltip', 'ember-riak-explorer/utils/riak-help/riak_config'], function (exports, _ember, _emberTooltipsUtilsRenderTooltip, _emberRiakExplorerUtilsRiakHelpRiak_config) {\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'span',\n\n classNames: ['tooltip-icon', 'node-config-tooltip', 'ion-information-circled'],\n\n itemKey: null,\n\n tooltipInstance: null,\n\n didRender: function didRender() {\n var key = this.get('itemKey');\n var info = _emberRiakExplorerUtilsRiakHelpRiak_config['default'][key];\n\n if (info) {\n var element = this.$()[0];\n\n var wrapperStart = '';\n var title = '
';\n var desc = info.description.length ? '
' : \"\";\n var example = info.example.length ? '
Example: ' + info.example + '
' : \"\";\n var internal_key = info.internal_key.length ? '
Internal Key: ' + info.internal_key + '
' : \"\";\n var valid = info.valid.length ? '
Valid: ' + info.valid + '
' : \"\";\n var wrapperEnd = '
';\n\n var toolTipTemplate = wrapperStart + title + desc + example + internal_key + valid + wrapperEnd;\n\n this.set('tooltipInstance', (0, _emberTooltipsUtilsRenderTooltip['default'])(element, {\n content: toolTipTemplate,\n event: 'hover',\n typeClass: 'wide'\n }));\n }\n }\n });\n});","define('ember-riak-explorer/components/tooltip/node-stats', ['exports', 'ember', 'ember-tooltips/utils/render-tooltip', 'ember-riak-explorer/utils/riak-help/riak_status'], function (exports, _ember, _emberTooltipsUtilsRenderTooltip, _emberRiakExplorerUtilsRiakHelpRiak_status) {\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'span',\n\n classNameBindings: ['setClassNames'],\n\n useIcon: true,\n\n itemKey: null,\n\n tooltipInstance: null,\n\n setClassNames: (function () {\n return this.get('useIcon') ? 'tooltip-icon node-stats-tooltip ion-information-circled' : 'tooltip-text';\n }).property('useIcon'),\n\n didRender: function didRender() {\n var key = this.get('itemKey');\n var info = _emberRiakExplorerUtilsRiakHelpRiak_status['default'][key];\n\n if (info) {\n var element = this.$()[0];\n\n var wrapperStart = '';\n var title = '
';\n var desc = info.description.length ? '
' : \"\";\n var example = info.example.length ? '
Example: ' + info.example + '
' : \"\";\n var schema_type = info.json_schema_type.length ? '
Type: ' + info.json_schema_type + '
' : \"\";\n var metric_type = info.metric_type.length ? '
Metric Type: ' + info.metric_type + '
' : \"\";\n var period = info.period.length ? '
Period: ' + info.period + '
' : \"\";\n var scope = info.scope.length ? '
Scope: ' + info.scope + '
' : \"\";\n var units = info.units !== 'n/a' ? '
Units: ' + info.units + '
' : \"\";\n var wrapperEnd = '
';\n\n var toolTipTemplate = wrapperStart + title + desc + example + schema_type + metric_type + period + scope + units + wrapperEnd;\n\n this.set('tooltipInstance', (0, _emberTooltipsUtilsRenderTooltip['default'])(element, {\n content: toolTipTemplate,\n event: 'hover',\n typeClass: 'wide'\n }));\n }\n }\n });\n});","define('ember-riak-explorer/components/view-label', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({\n classNames: ['view-label']\n });\n});","define('ember-riak-explorer/components/wrapper-panel', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Component.extend({});\n});","define('ember-riak-explorer/controllers/application', ['exports', 'ember'], function (exports, _ember) {\n\n /**\n * Base controller that sets UI state for all views.\n *\n * @class ApplicationController\n * @namespace Controllers\n * @extends Ember.Controller\n */\n exports['default'] = _ember['default'].Controller.extend({\n actions: {\n /**\n * @method clusterSelected\n * @param cluster {DS.Model} Expects a cluster model object\n *\n * Updates UI when a new cluster has been selected.\n */\n clusterSelected: function clusterSelected(cluster) {\n this.set('currentCluster', cluster);\n // Default to data view since no cluster overview view\n this.transitionToRoute('cluster.data', cluster.get('name'));\n }\n },\n\n /**\n * Current Cluster selected. Used to track sidebar state. Null if no sidebar.\n *\n * @property currentCluster\n * @type {DS.Object} Ember cluster model\n */\n currentCluster: null,\n\n /**\n * Which subsection of the cluster the UI is currently in.\n *\n * @property clusterSubSection\n * @type {String} Options are \"data\", \"ops\", or \"query\"\n */\n clusterSubSection: null,\n\n /**\n * Object that holds the current breadcrumb state.\n *\n * @property breadCrumbMap\n * @type {Object}\n */\n breadCrumbMap: {},\n\n /**\n * Object that holds the current view-label information.\n *\n * @property viewLabelMap\n */\n viewLabelMap: {},\n\n /**\n * Observes routes and will set the cluster sub-section, based on the route name.\n * Must be updated any time a new route is added to a subsection (code smell).\n *\n * @method setClusterSubSection\n */\n setClusterSubSection: (function () {\n switch (this.get('currentPath')) {\n case 'cluster.data':\n case 'bucket-type':\n case 'bucket-type.create':\n case 'bucket-type.edit':\n case 'bucket':\n case 'bucket.create':\n case 'riak-object':\n case 'riak-object.create':\n case 'riak-object.edit':\n case 'riak-object.counter':\n case 'riak-object.hll':\n case 'riak-object.set':\n case 'riak-object.map':\n case 'riak-object.map.edit':\n case 'table':\n case 'table.create':\n case 'table.write':\n this.set('clusterSubSection', 'data');\n break;\n case 'cluster.ops':\n case 'node':\n case 'log-file':\n case 'config-file':\n case 'node.monitoring':\n this.set('clusterSubSection', 'ops');\n break;\n case 'cluster.query':\n case 'search-index':\n case 'search-schema':\n case 'search-schema.edit':\n case 'search-schema.create':\n case 'table.query':\n this.set('clusterSubSection', 'query');\n break;\n default:\n this.set('clusterSubSection', null);\n break;\n }\n }).observes('currentPath'),\n\n /**\n * Determines if the UI should show the view-header template.\n *\n * @method showViewHeader\n * @returns Boolean\n */\n showViewHeader: (function () {\n return !!(Object.keys(this.get('breadCrumbMap')).length || Object.keys(this.get('viewLabelMap')).length);\n }).property('breadCrumbMap', 'viewLabelMap'),\n\n /**\n * Observes routes and makes sure that if on the index route, to set the current cluster state\n * to null.\n * Since all routes are nested under the index route, this is the only way we can\n * reliably ensure that this method is called every time the route is visited.\n *\n * @method resetIndexState\n */\n resetIndexState: (function () {\n if (this.get('currentPath') === 'index') {\n this.set('currentCluster', null);\n this.set('breadCrumbMap', {});\n this.set('viewLabelMap', {});\n }\n }).observes('currentPath')\n });\n});","define('ember-riak-explorer/helpers/and', ['exports', 'ember', 'ember-truth-helpers/helpers/and'], function (exports, _ember, _emberTruthHelpersHelpersAnd) {\n\n var forExport = null;\n\n if (_ember['default'].Helper) {\n forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersAnd.andHelper);\n } else if (_ember['default'].HTMLBars.makeBoundHelper) {\n forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersAnd.andHelper);\n }\n\n exports['default'] = forExport;\n});","define('ember-riak-explorer/helpers/ember-power-select-option-classes', ['exports', 'ember-power-select/helpers/ember-power-select-option-classes'], function (exports, _emberPowerSelectHelpersEmberPowerSelectOptionClasses) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberPowerSelectHelpersEmberPowerSelectOptionClasses['default'];\n }\n });\n Object.defineProperty(exports, 'emberPowerSelectOptionClasses', {\n enumerable: true,\n get: function get() {\n return _emberPowerSelectHelpersEmberPowerSelectOptionClasses.emberPowerSelectOptionClasses;\n }\n });\n});","define('ember-riak-explorer/helpers/eq', ['exports', 'ember', 'ember-truth-helpers/helpers/equal'], function (exports, _ember, _emberTruthHelpersHelpersEqual) {\n\n var forExport = null;\n\n if (_ember['default'].Helper) {\n forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersEqual.equalHelper);\n } else if (_ember['default'].HTMLBars.makeBoundHelper) {\n forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersEqual.equalHelper);\n }\n\n exports['default'] = forExport;\n});","define('ember-riak-explorer/helpers/gt', ['exports', 'ember', 'ember-truth-helpers/helpers/gt'], function (exports, _ember, _emberTruthHelpersHelpersGt) {\n\n var forExport = null;\n\n if (_ember['default'].Helper) {\n forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersGt.gtHelper);\n } else if (_ember['default'].HTMLBars.makeBoundHelper) {\n forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersGt.gtHelper);\n }\n\n exports['default'] = forExport;\n});","define('ember-riak-explorer/helpers/gte', ['exports', 'ember', 'ember-truth-helpers/helpers/gte'], function (exports, _ember, _emberTruthHelpersHelpersGte) {\n\n var forExport = null;\n\n if (_ember['default'].Helper) {\n forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersGte.gteHelper);\n } else if (_ember['default'].HTMLBars.makeBoundHelper) {\n forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersGte.gteHelper);\n }\n\n exports['default'] = forExport;\n});","define('ember-riak-explorer/helpers/is-array', ['exports', 'ember', 'ember-truth-helpers/helpers/is-array'], function (exports, _ember, _emberTruthHelpersHelpersIsArray) {\n\n var forExport = null;\n\n if (_ember['default'].Helper) {\n forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersIsArray.isArrayHelper);\n } else if (_ember['default'].HTMLBars.makeBoundHelper) {\n forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersIsArray.isArrayHelper);\n }\n\n exports['default'] = forExport;\n});","define('ember-riak-explorer/helpers/lt', ['exports', 'ember', 'ember-truth-helpers/helpers/lt'], function (exports, _ember, _emberTruthHelpersHelpersLt) {\n\n var forExport = null;\n\n if (_ember['default'].Helper) {\n forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersLt.ltHelper);\n } else if (_ember['default'].HTMLBars.makeBoundHelper) {\n forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersLt.ltHelper);\n }\n\n exports['default'] = forExport;\n});","define('ember-riak-explorer/helpers/lte', ['exports', 'ember', 'ember-truth-helpers/helpers/lte'], function (exports, _ember, _emberTruthHelpersHelpersLte) {\n\n var forExport = null;\n\n if (_ember['default'].Helper) {\n forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersLte.lteHelper);\n } else if (_ember['default'].HTMLBars.makeBoundHelper) {\n forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersLte.lteHelper);\n }\n\n exports['default'] = forExport;\n});","define('ember-riak-explorer/helpers/not-eq', ['exports', 'ember', 'ember-truth-helpers/helpers/not-equal'], function (exports, _ember, _emberTruthHelpersHelpersNotEqual) {\n\n var forExport = null;\n\n if (_ember['default'].Helper) {\n forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersNotEqual.notEqualHelper);\n } else if (_ember['default'].HTMLBars.makeBoundHelper) {\n forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersNotEqual.notEqualHelper);\n }\n\n exports['default'] = forExport;\n});","define('ember-riak-explorer/helpers/not', ['exports', 'ember', 'ember-truth-helpers/helpers/not'], function (exports, _ember, _emberTruthHelpersHelpersNot) {\n\n var forExport = null;\n\n if (_ember['default'].Helper) {\n forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersNot.notHelper);\n } else if (_ember['default'].HTMLBars.makeBoundHelper) {\n forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersNot.notHelper);\n }\n\n exports['default'] = forExport;\n});","define('ember-riak-explorer/helpers/object-length', ['exports', 'ember'], function (exports, _ember) {\n exports.objectLength = objectLength;\n\n /**\n * View helper function used to display the amount of keys in the object.\n * \n * @module ObjectLength\n */\n\n function objectLength(params) {\n var object = params[0];\n\n return Object.keys(object).length;\n }\n\n exports['default'] = _ember['default'].Helper.helper(objectLength);\n});","define('ember-riak-explorer/helpers/or', ['exports', 'ember', 'ember-truth-helpers/helpers/or'], function (exports, _ember, _emberTruthHelpersHelpersOr) {\n\n var forExport = null;\n\n if (_ember['default'].Helper) {\n forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersOr.orHelper);\n } else if (_ember['default'].HTMLBars.makeBoundHelper) {\n forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersOr.orHelper);\n }\n\n exports['default'] = forExport;\n});","define('ember-riak-explorer/helpers/pluralize', ['exports', 'ember-inflector/lib/helpers/pluralize'], function (exports, _emberInflectorLibHelpersPluralize) {\n exports['default'] = _emberInflectorLibHelpersPluralize['default'];\n});","define('ember-riak-explorer/helpers/singularize', ['exports', 'ember-inflector/lib/helpers/singularize'], function (exports, _emberInflectorLibHelpersSingularize) {\n exports['default'] = _emberInflectorLibHelpersSingularize['default'];\n});","define('ember-riak-explorer/helpers/xor', ['exports', 'ember', 'ember-truth-helpers/helpers/xor'], function (exports, _ember, _emberTruthHelpersHelpersXor) {\n\n var forExport = null;\n\n if (_ember['default'].Helper) {\n forExport = _ember['default'].Helper.helper(_emberTruthHelpersHelpersXor.xorHelper);\n } else if (_ember['default'].HTMLBars.makeBoundHelper) {\n forExport = _ember['default'].HTMLBars.makeBoundHelper(_emberTruthHelpersHelpersXor.xorHelper);\n }\n\n exports['default'] = forExport;\n});","define('ember-riak-explorer/initializers/add-modals-container', ['exports', 'ember-modal-dialog/initializers/add-modals-container'], function (exports, _emberModalDialogInitializersAddModalsContainer) {\n exports['default'] = {\n name: 'add-modals-container',\n initialize: _emberModalDialogInitializersAddModalsContainer['default']\n };\n});","define('ember-riak-explorer/initializers/app-version', ['exports', 'ember-cli-app-version/initializer-factory', 'ember-riak-explorer/config/environment'], function (exports, _emberCliAppVersionInitializerFactory, _emberRiakExplorerConfigEnvironment) {\n exports['default'] = {\n name: 'App Version',\n initialize: (0, _emberCliAppVersionInitializerFactory['default'])(_emberRiakExplorerConfigEnvironment['default'].APP.name, _emberRiakExplorerConfigEnvironment['default'].APP.version)\n };\n});","define('ember-riak-explorer/initializers/container-debug-adapter', ['exports', 'ember-resolver/container-debug-adapter'], function (exports, _emberResolverContainerDebugAdapter) {\n exports['default'] = {\n name: 'container-debug-adapter',\n\n initialize: function initialize() {\n var app = arguments[1] || arguments[0];\n\n app.register('container-debug-adapter:main', _emberResolverContainerDebugAdapter['default']);\n app.inject('container-debug-adapter:main', 'namespace', 'application:main');\n }\n };\n});","define('ember-riak-explorer/initializers/data-adapter', ['exports', 'ember'], function (exports, _ember) {\n\n /*\n This initializer is here to keep backwards compatibility with code depending\n on the `data-adapter` initializer (before Ember Data was an addon).\n \n Should be removed for Ember Data 3.x\n */\n\n exports['default'] = {\n name: 'data-adapter',\n before: 'store',\n initialize: _ember['default'].K\n };\n});","define('ember-riak-explorer/initializers/ember-data', ['exports', 'ember-data/setup-container', 'ember-data/-private/core'], function (exports, _emberDataSetupContainer, _emberDataPrivateCore) {\n\n /*\n \n This code initializes Ember-Data onto an Ember application.\n \n If an Ember.js developer defines a subclass of DS.Store on their application,\n as `App.StoreService` (or via a module system that resolves to `service:store`)\n this code will automatically instantiate it and make it available on the\n router.\n \n Additionally, after an application's controllers have been injected, they will\n each have the store made available to them.\n \n For example, imagine an Ember.js application with the following classes:\n \n App.StoreService = DS.Store.extend({\n adapter: 'custom'\n });\n \n App.PostsController = Ember.ArrayController.extend({\n // ...\n });\n \n When the application is initialized, `App.ApplicationStore` will automatically be\n instantiated, and the instance of `App.PostsController` will have its `store`\n property set to that instance.\n \n Note that this code will only be run if the `ember-application` package is\n loaded. If Ember Data is being used in an environment other than a\n typical application (e.g., node.js where only `ember-runtime` is available),\n this code will be ignored.\n */\n\n exports['default'] = {\n name: 'ember-data',\n initialize: _emberDataSetupContainer['default']\n };\n});","define('ember-riak-explorer/initializers/ember-tooltips', ['exports', 'ember', 'ember-riak-explorer/config/environment', 'ember-riak-explorer/mixins/components/tooltips'], function (exports, _ember, _emberRiakExplorerConfigEnvironment, _emberRiakExplorerMixinsComponentsTooltips) {\n exports.initialize = initialize;\n\n /* This is in the app tree so we can access ENV */\n\n function initialize() {\n var defaultOptions = {\n addTo: ['Component']\n };\n var overridingOptions = _emberRiakExplorerConfigEnvironment['default'].tooltips || {};\n var options = _ember['default'].merge(defaultOptions, overridingOptions);\n\n /* TODO - Needs test coverage for addTo */\n\n if (_ember['default'].typeOf(options.addTo) === 'array') {\n options.addTo.forEach(function (className) {\n _ember['default'][className].reopen(_emberRiakExplorerMixinsComponentsTooltips['default']);\n });\n }\n }\n\n exports['default'] = {\n name: 'ember-tooltips',\n initialize: initialize\n };\n});","define('ember-riak-explorer/initializers/explorer', ['exports'], function (exports) {\n exports.initialize = initialize;\n\n function initialize(app) {\n // inject explorer service into all routes\n app.inject('route', 'explorer', 'service:explorer');\n // inject the store into the explorer service\n app.inject('service:explorer', 'store', 'service:store');\n }\n\n exports['default'] = {\n name: 'explorer',\n initialize: initialize\n };\n});","define('ember-riak-explorer/initializers/export-application-global', ['exports', 'ember', 'ember-riak-explorer/config/environment'], function (exports, _ember, _emberRiakExplorerConfigEnvironment) {\n exports.initialize = initialize;\n\n function initialize() {\n var application = arguments[1] || arguments[0];\n if (_emberRiakExplorerConfigEnvironment['default'].exportApplicationGlobal !== false) {\n var value = _emberRiakExplorerConfigEnvironment['default'].exportApplicationGlobal;\n var globalName;\n\n if (typeof value === 'string') {\n globalName = value;\n } else {\n globalName = _ember['default'].String.classify(_emberRiakExplorerConfigEnvironment['default'].modulePrefix);\n }\n\n if (!window[globalName]) {\n window[globalName] = application;\n\n application.reopen({\n willDestroy: function willDestroy() {\n this._super.apply(this, arguments);\n delete window[globalName];\n }\n });\n }\n }\n }\n\n exports['default'] = {\n name: 'export-application-global',\n\n initialize: initialize\n };\n});","define('ember-riak-explorer/initializers/injectStore', ['exports', 'ember'], function (exports, _ember) {\n\n /*\n This initializer is here to keep backwards compatibility with code depending\n on the `injectStore` initializer (before Ember Data was an addon).\n \n Should be removed for Ember Data 3.x\n */\n\n exports['default'] = {\n name: 'injectStore',\n before: 'store',\n initialize: _ember['default'].K\n };\n});","define('ember-riak-explorer/initializers/local-storage-adapter', ['exports', 'ember-local-storage/initializers/local-storage-adapter'], function (exports, _emberLocalStorageInitializersLocalStorageAdapter) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberLocalStorageInitializersLocalStorageAdapter['default'];\n }\n });\n Object.defineProperty(exports, 'initialize', {\n enumerable: true,\n get: function get() {\n return _emberLocalStorageInitializersLocalStorageAdapter.initialize;\n }\n });\n});","define('ember-riak-explorer/initializers/store', ['exports', 'ember'], function (exports, _ember) {\n\n /*\n This initializer is here to keep backwards compatibility with code depending\n on the `store` initializer (before Ember Data was an addon).\n \n Should be removed for Ember Data 3.x\n */\n\n exports['default'] = {\n name: 'store',\n after: 'ember-data',\n initialize: _ember['default'].K\n };\n});","define('ember-riak-explorer/initializers/transforms', ['exports', 'ember'], function (exports, _ember) {\n\n /*\n This initializer is here to keep backwards compatibility with code depending\n on the `transforms` initializer (before Ember Data was an addon).\n \n Should be removed for Ember Data 3.x\n */\n\n exports['default'] = {\n name: 'transforms',\n before: 'store',\n initialize: _ember['default'].K\n };\n});","define('ember-riak-explorer/initializers/truth-helpers', ['exports', 'ember', 'ember-truth-helpers/utils/register-helper', 'ember-truth-helpers/helpers/and', 'ember-truth-helpers/helpers/or', 'ember-truth-helpers/helpers/equal', 'ember-truth-helpers/helpers/not', 'ember-truth-helpers/helpers/is-array', 'ember-truth-helpers/helpers/not-equal', 'ember-truth-helpers/helpers/gt', 'ember-truth-helpers/helpers/gte', 'ember-truth-helpers/helpers/lt', 'ember-truth-helpers/helpers/lte'], function (exports, _ember, _emberTruthHelpersUtilsRegisterHelper, _emberTruthHelpersHelpersAnd, _emberTruthHelpersHelpersOr, _emberTruthHelpersHelpersEqual, _emberTruthHelpersHelpersNot, _emberTruthHelpersHelpersIsArray, _emberTruthHelpersHelpersNotEqual, _emberTruthHelpersHelpersGt, _emberTruthHelpersHelpersGte, _emberTruthHelpersHelpersLt, _emberTruthHelpersHelpersLte) {\n exports.initialize = initialize;\n\n function initialize() /* container, application */{\n\n // Do not register helpers from Ember 1.13 onwards, starting from 1.13 they\n // will be auto-discovered.\n if (_ember['default'].Helper) {\n return;\n }\n\n (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('and', _emberTruthHelpersHelpersAnd.andHelper);\n (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('or', _emberTruthHelpersHelpersOr.orHelper);\n (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('eq', _emberTruthHelpersHelpersEqual.equalHelper);\n (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('not', _emberTruthHelpersHelpersNot.notHelper);\n (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('is-array', _emberTruthHelpersHelpersIsArray.isArrayHelper);\n (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('not-eq', _emberTruthHelpersHelpersNotEqual.notEqualHelper);\n (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('gt', _emberTruthHelpersHelpersGt.gtHelper);\n (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('gte', _emberTruthHelpersHelpersGte.gteHelper);\n (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('lt', _emberTruthHelpersHelpersLt.ltHelper);\n (0, _emberTruthHelpersUtilsRegisterHelper.registerHelper)('lte', _emberTruthHelpersHelpersLte.lteHelper);\n }\n\n exports['default'] = {\n name: 'truth-helpers',\n initialize: initialize\n };\n});","define(\"ember-riak-explorer/instance-initializers/ember-data\", [\"exports\", \"ember-data/-private/instance-initializers/initialize-store-service\"], function (exports, _emberDataPrivateInstanceInitializersInitializeStoreService) {\n exports[\"default\"] = {\n name: \"ember-data\",\n initialize: _emberDataPrivateInstanceInitializersInitializeStoreService[\"default\"]\n };\n});","define('ember-riak-explorer/mixins/component/scroll-reset', ['exports', 'ember'], function (exports, _ember) {\n\n /**\n * Mixin meant for components to use.\n * Scroll reset allows the mixed-in component to easily call for a the window scroll position to go back to the top.\n *\n * @module ScrollReset\n */\n exports['default'] = _ember['default'].Mixin.create({\n /**\n * Moves the window scroll position to 0 when invoked\n *\n * @method scrollToTop\n * @public\n */\n scrollToTop: function scrollToTop() {\n return _ember['default'].$('.view-body').scrollTop(0);\n }\n });\n});","define('ember-riak-explorer/mixins/components/tooltips', ['exports', 'ember-tooltips/mixins/components/tooltips'], function (exports, _emberTooltipsMixinsComponentsTooltips) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberTooltipsMixinsComponentsTooltips['default'];\n }\n });\n});","define('ember-riak-explorer/mixins/controller/modal', ['exports', 'ember'], function (exports, _ember) {\n\n /**\n * Mixin meant for controllers to use.\n * Allows for management of the modal-dialog component (third-party plugin: see 'ember-modal-dialog' in package.json)\n *\n * @module Modal\n */\n exports['default'] = _ember['default'].Mixin.create({\n /**\n * Sets the visibility of the modal\n *\n * @property modalVisible\n * @type {Boolean}\n */\n modalVisible: false,\n\n actions: {\n /**\n * Utility method to hide modal\n *\n * @method hideModal\n * @public\n */\n hideModal: function hideModal() {\n this.set('modalVisible', false);\n },\n\n /**\n * Utility method to show modal\n *\n * @method showModal\n * @public\n */\n showModal: function showModal() {\n this.set('modalVisible', true);\n }\n }\n });\n});","define('ember-riak-explorer/mixins/controller/scroll-reset', ['exports', 'ember'], function (exports, _ember) {\n\n /**\n * Mixin meant for controllers to use.\n * Scroll reset allows the mixed-in component to easily call for a the window scroll position to go back to the top.\n *\n * @module ScrollReset\n */\n exports['default'] = _ember['default'].Mixin.create({\n /**\n * Moves the window scroll position to 0 when invoked\n *\n * @method scrollToTop\n * @public\n */\n scrollToTop: function scrollToTop() {\n return _ember['default'].$('.view-body').scrollTop(0);\n }\n });\n});","define('ember-riak-explorer/mixins/controller/side-drawer', ['exports', 'ember'], function (exports, _ember) {\n\n /**\n * Mixin meant for controllers to use.\n * Controls the side drawer component. Side drawer is used to show additional text and information, such as documentation.\n *\n * @module SideDrawer\n */\n exports['default'] = _ember['default'].Mixin.create({\n /**\n * Sets the visibility of the side drawer\n *\n * @property isSideDrawerVisible\n * @type {Boolean}\n */\n isSideDrawerVisible: false,\n\n actions: {\n /**\n * Utility method to hide the side drawer\n *\n * @method hideSideDrawer\n * @public\n */\n hideSideDrawer: function hideSideDrawer() {\n this.set('isSideDrawerVisible', false);\n },\n\n /**\n * Utility method to show the side drawer\n *\n * @method showSideDrawer\n * @public\n */\n showSideDrawer: function showSideDrawer() {\n this.set('isSideDrawerVisible', true);\n }\n }\n });\n});","define('ember-riak-explorer/mixins/loading-slider', ['exports', 'ember'], function (exports, _ember) {\n var Mixin = _ember['default'].Mixin;\n var inject = _ember['default'].inject;\n var isPresent = _ember['default'].isPresent;\n exports['default'] = Mixin.create({\n loadingSlider: inject.service(),\n\n actions: {\n loading: function loading() {\n var loadingSliderService = this.get('loadingSlider');\n loadingSliderService.startLoading();\n if (isPresent(this.router)) {\n this.router.one('didTransition', function () {\n loadingSliderService.endLoading();\n });\n }\n if (this.get('bubbleLoadingSlider')) {\n return true;\n }\n },\n\n finished: function finished() {\n this.get('loadingSlider').endLoading();\n }\n }\n });\n});","define('ember-riak-explorer/mixins/models/bucket-props', ['exports', 'ember', 'ember-data', 'lodash/lodash', 'ember-riak-explorer/utils/riak-help/bucket_props'], function (exports, _ember, _emberData, _lodashLodash, _emberRiakExplorerUtilsRiakHelpBucket_props) {\n exports['default'] = _ember['default'].Mixin.create({\n /**\n * Hash of key/value pairs, obtained as a result of\n * an HTTP GET Bucket Properties API call,\n * or a GET Bucket Type Properties API call\n *\n * @property props\n * @type Hash\n * @example\n * { \"allow_mult\":false, \"basic_quorum\":false, \"write_once\": false, ... }\n */\n props: _emberData['default'].attr(),\n\n /**\n * Returns a capitalized name of the Riak Data Type stored in this bucket\n * or bucket type (if this is a CRDT type bucket).\n * @see http://docs.basho.com/riak/latest/dev/using/data-types/\n * @see http://docs.basho.com/riak/latest/theory/concepts/crdts/\n *\n * @method dataTypeName\n * @return {String|Null} One of: [ 'Map', 'Set', 'Counter', 'HyperLogLog', null ]\n */\n dataTypeName: (function () {\n if (this.get('props')) {\n var _name = null;\n\n if (this.get('isCRDT')) {\n _name = this.get('props').datatype;\n }\n\n if (_name === 'hll') {\n _name = 'HyperLogLog';\n }\n\n if (_name) {\n return _name.capitalize();\n }\n }\n }).property('props'),\n\n /**\n * Does this bucket or bucket type have custom pre-commit or post-commit\n * hooks enabled?\n * @see http://docs.basho.com/riak/latest/dev/using/commit-hooks/\n *\n * @method hasCommitHooks\n * @return {Boolean}\n */\n hasCommitHooks: (function () {\n if (this.get('props')) {\n var hasPrecommit = !_ember['default'].isEmpty(this.get('props').precommit);\n var hasPostcommit = !_ember['default'].isEmpty(this.get('props').postcommit);\n\n return hasPrecommit || hasPostcommit;\n }\n }).property('props'),\n\n /**\n * Have Siblings been enabled for this Bucket or Bucket Type?\n * Returns `false` by default if this is a bucket within the `default`\n * Bucket Type.\n * Otherwise (for any user-defined type) returns `true` by default.\n * @see http://docs.basho.com/riak/latest/dev/using/conflict-resolution/#Siblings\n *\n * @method hasSiblings\n * @return {Boolean}\n */\n hasSiblings: (function () {\n if (this.get('props')) {\n return this.get('props').allow_mult;\n }\n }).property('props'),\n\n /**\n * Returns the name of the Search Index associated with this bucket/bucketType\n *\n * @property index\n * @type String\n */\n index: (function () {\n return this.get('cluster').get('searchIndexes').findBy('name', this.get('searchIndexName'));\n }).property('cluster', 'searchIndexName'),\n\n /**\n * Has this Bucket Type been activated via `riak-admin bucket-types activate`?\n * (Buckets inherit this setting from their parent bucket types.)\n *\n * @property isActive\n * @type Boolean\n */\n isActive: (function () {\n if (this.get('props')) {\n return this.get('props').active;\n }\n }).property('props'),\n\n /**\n * Does this bucket store Counter data type objects?\n *\n * @method isCounter\n * @return {Boolean}\n */\n isCounter: (function () {\n return this.get('dataTypeName') === 'Counter';\n }).property('dataTypeName'),\n\n /**\n * Does this bucket type store Riak Data Type objects?\n * @see http://docs.basho.com/riak/latest/dev/using/data-types/\n * @see http://docs.basho.com/riak/latest/theory/concepts/crdts/\n *\n * @method isCRDT\n * @return {Boolean}\n */\n isCRDT: (function () {\n if (this.get('props')) {\n return this.get('props').datatype || false;\n }\n }).property('props'),\n\n /**\n * Does this bucket store HyperLogLog data type objects?\n *\n * @method isHLL\n * @return {Boolean}\n */\n isHLL: (function () {\n return this.get('dataTypeName') === 'HyperLogLog';\n }).property('dataTypeName'),\n\n /**\n * Has this Bucket Type not been activated via `riak-admin bucket-types activate`?\n * (Buckets inherit this setting from their parent bucket types.)\n * Inverse of the isActive method\n *\n * @property isInactive\n * @type Boolean\n */\n isInactive: (function () {\n if (this.get('props')) {\n return !this.get('props').active;\n }\n }).property('props'),\n\n /**\n * Has the 'Last Write Wins' optimization been turned on for this bucket?\n * @see http://docs.basho.com/riak/latest/dev/using/conflict-resolution/#last-write-wins\n *\n * @method isLWW\n * @return {Boolean}\n */\n isLWW: (function () {\n if (this.get('props')) {\n return this.get('props').last_write_wins;\n }\n }).property('props'),\n\n /**\n * Does this bucket store Map data type objects?\n *\n * @method isMap\n * @return {Boolean}\n */\n isMap: (function () {\n return this.get('dataTypeName') === 'Map';\n }).property('dataTypeName'),\n\n /**\n * Has a Riak Search index been associated with this bucket type?\n *\n * @method isSearchIndexed\n * @return {Boolean}\n */\n isSearchIndexed: (function () {\n if (this.get('props')) {\n return _ember['default'].isPresent(this.get('props').search_index) && _ember['default'].isPresent(this.get('index'));\n }\n }).property('props'),\n\n /**\n * Does this bucket store Set data type objects?\n *\n * @method isSet\n * @return {Boolean}\n */\n isSet: (function () {\n return this.get('dataTypeName') === 'Set';\n }).property('dataTypeName'),\n\n /**\n * Has Strong Consistency been enabled for this bucket type?\n * @see http://docs.basho.com/riak/latest/dev/advanced/strong-consistency/\n *\n * @method isStronglyConsistent\n * @return {Boolean}\n */\n isStronglyConsistent: (function () {\n if (this.get('props')) {\n return this.get('props').consistent;\n }\n }).property('props'),\n\n /**\n * Has the 'Write Once' setting been enabled for this bucket type?\n * (This feature was introduced in Riak 2.1)\n * @see http://docs.basho.com/riak/latest/dev/advanced/write-once/\n *\n * @method isWriteOnce\n * @return {Boolean}\n */\n isWriteOnce: (function () {\n if (this.get('props')) {\n return this.get('props').write_once;\n }\n }).property('props'),\n\n nonEditableProps: (function () {\n var propsWithHelp = this.get('propsWithHelp');\n\n if (propsWithHelp) {\n var _ret = (function () {\n var nonEditable = {};\n\n _lodashLodash['default'].forOwn(propsWithHelp, function (value, key) {\n if (!value.editable) {\n nonEditable[key] = value;\n }\n });\n\n return {\n v: nonEditable\n };\n })();\n\n if (typeof _ret === 'object') return _ret.v;\n }\n }).property('props'),\n\n /**\n * Returns the N value (number of object replicas) setting for this bucket type.\n * (Default is 3).\n * @see http://docs.basho.com/riak/latest/dev/advanced/replication-properties/\n *\n * @property nVal\n * @type Number\n */\n nVal: (function () {\n if (this.get('props')) {\n return this.get('props').n_val;\n }\n }).property('props'),\n\n objectType: (function () {\n if (this.get('props')) {\n var type = [];\n\n if (this.get('isCRDT')) {\n type.push(this.get('dataTypeName'));\n } else {\n type.push('Default');\n }\n\n if (this.get('isSearchIndexed')) {\n type.push('Search Indexed');\n }\n\n return type.join(', ');\n }\n }).property('props'),\n\n propsWithHelp: (function () {\n var props = this.get('props');\n\n if (props) {\n var _ret2 = (function () {\n var propsObj = {};\n\n // Prepare Objects for merge\n Object.keys(props).forEach(function (key) {\n propsObj[key] = {\n key: key,\n value: props[key]\n };\n });\n\n // Merges the propsObj and bucketPropsHelp Objects into a single object\n var merged = _lodashLodash['default'].merge(propsObj, _emberRiakExplorerUtilsRiakHelpBucket_props['default']);\n\n // Then mutates object to an array\n var toArray = _lodashLodash['default'].values(merged);\n\n // Then filters out any props that don't have values\n var filtered = toArray.filter(function (prop) {\n return _lodashLodash['default'].has(prop, 'value');\n });\n\n // Then sort by name\n var sorted = _lodashLodash['default'].sortBy(filtered, 'name');\n\n return {\n v: sorted\n };\n })();\n\n if (typeof _ret2 === 'object') return _ret2.v;\n }\n }).property('props'),\n\n /**\n * Returns a hash containing quorum-related settings.\n * @see http://docs.basho.com/riak/latest/dev/advanced/replication-properties/\n *\n * @method quorum\n * @return {Hash}\n */\n quorum: (function () {\n if (this.get('props')) {\n return {\n r: this.get('props').r, // Read quorum\n w: this.get('props').r, // Write Quorum\n pr: this.get('props').pr, // Primary Read\n pw: this.get('props').pw, // Primary Write\n dw: this.get('props').dw, // Durable Write\n basic_quorum: this.get('props').basic_quorum,\n notfound_ok: this.get('props').notfound_ok\n };\n }\n }).property('props'),\n\n /**\n * Returns true if this is an Eventually Consistent object type\n * (versus Strongly Consistent type or a CRDT), and therefore the notion\n * of 'Quorum' applies.\n *\n * @method quorumRelevant\n * @return {Boolean}\n */\n quorumRelevant: (function () {\n if (this.get('props')) {\n return !this.get('isStronglyConsistent') && !this.get('isCRDT');\n }\n }).property('props'),\n\n /**\n * Returns a human-readable description of the conflict resolution strategy\n * for this bucket type or bucket.\n *\n * @method resolutionStrategy\n * @return {String}\n */\n resolutionStrategy: (function () {\n if (this.get('props')) {\n var strategy = null;\n\n switch (true) {\n case this.get('isStronglyConsistent'):\n strategy = 'Strongly Consistent';\n break;\n case this.get('isCounter'):\n strategy = 'Convergent, Pairwise Maximum Wins';\n break;\n case this.get('isMap'):\n strategy = 'Convergent, Add/Update Wins Over Remove';\n break;\n case this.get('isSet'):\n strategy = 'Convergent, Add Wins Over Remove';\n break;\n case this.get('hasSiblings'):\n strategy = 'Causal Context (Siblings Enabled)';\n break;\n case this.get('isWriteOnce'):\n strategy = 'n/a (Write-Once Optimized)';\n break;\n case this.get('isLWW'):\n strategy = 'Wall Clock (LastWriteWins enabled)';\n break;\n default:\n strategy = 'Causal Context (Siblings Off, fallback to Wall Clock)';\n }\n\n return strategy;\n }\n }).property('props'),\n\n searchIndexHelp: (function () {\n var searchIndexHelp = _lodashLodash['default'].clone(_emberRiakExplorerUtilsRiakHelpBucket_props['default'].search_index);\n\n searchIndexHelp.key = 'search_index';\n\n return searchIndexHelp;\n }).property('props'),\n\n /**\n * Returns the name of the Search Index set on this bucket type or bucket\n * @see http://docs.basho.com/riak/latest/dev/using/search/\n *\n * @method searchIndexName\n * @return {String|Null}\n */\n searchIndexName: (function () {\n if (this.get('props')) {\n return this.get('props').search_index;\n }\n }).property('props'),\n\n /**\n * Returns human-readable warnings related to this bucket's settings.\n *\n * @method warnings\n * @return {Array}\n */\n warnings: (function () {\n if (this.get('props')) {\n var warnings = [];\n\n if (this.get('isStronglyConsistent')) {\n if (this.get('nVal') < 5) {\n warnings.push('Using Strong Consistency, but n_val < 5!');\n }\n if (this.get('isSearchIndexed')) {\n warnings.push('Combining Strong Consistency with Search. Use cation!');\n }\n if (this.get('hasCommitHooks')) {\n warnings.push('Using commit hooks, but those are ignored for Strongly Consistent data!');\n }\n }\n if (this.get('hasSiblings')) {\n // Siblings enabled\n if (!this.get('props').dvv_enabled) {\n warnings.push('Dotted Version Vectors (dvv_enabled) should be enabled when Siblings are enabled.');\n }\n }\n // Check for default schema inappropriate conditions. Ideally this would be happening on the bucket props model,\n // but the proper relationships are not set up. This augments that method and does the\n // appropriate check\n if (this.get('cluster').get('productionMode') && this.get('isSearchIndexed') && this.get('index').get('schema').get('isDefaultSchema')) {\n warnings.push('This bucket type is currently using a default schema on indexes in production. ' + 'This can be very harmful, and it is recommended to instead use a custom schema on indexes.');\n }\n\n return warnings;\n }\n }).property('props', 'cluster', 'index')\n });\n});","define('ember-riak-explorer/mixins/models/cached-list-watcher', ['exports', 'ember-data', 'ember'], function (exports, _emberData, _ember) {\n exports['default'] = _ember['default'].Mixin.create({\n /**\n * Has the cached list been loaded from the server?\n *\n * @property isListLoaded\n * @type Boolean\n * @default false\n */\n isListLoaded: _emberData['default'].attr('boolean', { defaultValue: false }),\n\n /**\n * Has the cached list been requested to be created on the server?\n *\n * @property isListLoaded\n * @type Boolean\n * @default false\n */\n hasListBeenRequested: _emberData['default'].attr('boolean', { defaultValue: false }),\n\n /**\n * Status message to display to the user. Relevant for long-running\n * server operations such as loading large lists or refreshing cached lists.\n * Sample messages:\n *\n * - 'Requesting cached list...'\n * - 'Cache not found. Refreshing from a streaming list keys/buckets call...'\n * @property statusMessage\n * @type String\n */\n statusMessage: _emberData['default'].attr('string', { defaultValue: 'Requesting cached list...' })\n });\n});","define('ember-riak-explorer/mixins/models/cached-list', ['exports', 'ember-data', 'ember'], function (exports, _emberData, _ember) {\n exports['default'] = _ember['default'].Mixin.create({\n /**\n * Number of items displayed on the current page of the list\n * @property count\n * @type Number\n * @default 0\n */\n count: _emberData['default'].attr('number', { defaultValue: 0 }),\n\n /**\n * Timestamp of when the cached list was generated on the server side\n * @property created\n */\n created: _emberData['default'].attr(),\n\n /**\n * The index of the first item in the current page, in relation to the entire list\n * @property firstItemIndex\n * @type Integer\n */\n firstItemIndex: _emberData['default'].attr('number', { defaultValue: 1 }),\n\n /**\n * The number of items per page\n * @property pageSize\n * @type Integer\n */\n pageSize: _emberData['default'].attr('number', { defaultValue: 0 }),\n\n /**\n * Total number of items in the cached list on the API side.\n * @property total\n * @type Number\n * @default 0\n */\n total: _emberData['default'].attr('number', { defaultValue: 0 }),\n\n /**\n * The index of the last item in the current page, in relation to the entire list\n *\n * @method lastItemIndex\n * @returns Integer\n */\n lastItemIndex: (function () {\n return this.get('firstItemIndex') + this.get('count') - 1;\n }).property('firstItemIndex', 'count'),\n\n /**\n * Whether or not the current page has more than 1 item in it\n *\n * @method hasMultipleListItems\n * @returns Boolean\n */\n hasMultipleListItems: (function () {\n return this.get('count') > 1;\n }).property('count')\n });\n});","define('ember-riak-explorer/mixins/models/map-object', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Mixin.create({\n sortBySubType: function sortBySubType(content) {\n var self = this;\n\n var sorted = {\n registers: {},\n flags: {},\n counters: {},\n sets: {},\n maps: {}\n };\n\n _ember['default'].$.each(content, function (key, value) {\n if (key.endsWith('_counter')) {\n sorted.counters[key] = value;\n }\n\n if (key.endsWith('_flag')) {\n sorted.flags[key] = value;\n }\n\n if (key.endsWith('_register')) {\n sorted.registers[key] = value;\n }\n\n if (key.endsWith('_set')) {\n sorted.sets[key] = value;\n }\n\n if (key.endsWith('_map')) {\n sorted.maps[key] = self.sortBySubType(value);\n }\n });\n\n return sorted;\n },\n\n contentsSortedBySubType: (function () {\n if (this.get('bucket').get('isMap')) {\n return this.sortBySubType(this.get('contents'));\n }\n }).property('bucket', 'contents')\n });\n});","define('ember-riak-explorer/mixins/models/object-headers', ['exports', 'ember-data', 'ember'], function (exports, _emberData, _ember) {\n exports['default'] = _ember['default'].Mixin.create({\n /**\n * Hash containing an object's metadata/headers.\n * Divided into three categories:\n * 1. 'custom' - user-defined custom headers\n * (in the HTTP API, these start with `x-riak-meta-`).\n * Stored as an array of headers (simple key/value hashes) for\n * easy listing on the Edit Object screen.\n * 2. 'indexes' - Secondary Indexes\n * Stored as an array of headers (simple key/value hashes) for\n * easy listing on the Edit Object screen.\n * 3. 'other' - Standard object metadata (x-riak-vclock, etag, etc).\n * Stored as a hash of keys/values (not a list, since these are fixed)\n *\n * @see http://docs.basho.com/riak/latest/dev/references/http/fetch-object/\n * @see http://docs.basho.com/riak/latest/dev/references/http/store-object/\n * @see http://docs.basho.com/riak/latest/dev/references/http/secondary-indexes/\n *\n * @property headers\n * @type Hash\n */\n headers: _emberData['default'].attr(),\n\n /**\n * Causal context header, used for server-side conflict resolution.\n * This is opaque to the client; the important thing is to load it\n * by reading first, before any sort of edit operation to an object.\n * @see http://docs.basho.com/riak/latest/dev/using/conflict-resolution/#Causal-Context\n *\n * @property causalContext\n * @readOnly\n * @type String\n */\n causalContext: (function () {\n if (this.get('headers')) {\n return this.get('headers').other['x-riak-vclock'];\n }\n }).property('headers'),\n\n /**\n * HTTP Content-Type of the object (see section 14.17 of RFC 2616),\n * specified by the user when writing the object.\n * @property contentType\n * @type String\n */\n contentType: (function () {\n if (this.get('headers')) {\n return this.get('headers').other['content-type'];\n }\n }).property('headers'),\n\n /**\n * Last-Modified timestamp.\n * Useful for conditional GET operations and caching.\n * @property contentType\n * @readOnly\n * @type String\n */\n dateLastModified: (function () {\n if (this.get('headers')) {\n return this.get('headers').other['last-modified'];\n }\n }).property('headers'),\n\n /**\n * Date on which this object was loaded from Riak (via an HTTP request).\n * Used to give the user a sense of when the 'View Object' page was last\n * refreshed.\n * @property dateLoaded\n * @readOnly\n * @type String\n */\n dateLoaded: (function () {\n if (this.get('headers')) {\n return this.get('headers').other['date'];\n }\n }).property('headers'),\n\n /**\n * HTTP Etag (entity tag). Unique identifier for this object and contents.\n * Useful for conditional GET operations and validation-based caching.\n * @property dateLoaded\n * @readOnly\n * @type String\n */\n etag: (function () {\n if (this.get('headers')) {\n return this.get('headers').other['etag'];\n }\n }).property('headers'),\n\n /**\n * List of custom (user-specified) headers.\n * Mainly useful to \"Tag\" binary objects and enable Search to index them.\n * @property headersCustom\n * @type Array\n * @example\n * [ { \"x-riak-meta-user_id\": \"user123\" }]\n */\n headersCustom: (function () {\n if (this.get('headers')) {\n return this.get('headers').custom;\n }\n }).property('headers'),\n\n /**\n * Re-assembles relevant object headers, such as the causal context and\n * any user-edited headers like secondary indexes or custom metadata.\n * Used when saving/updating an object.\n * @see http://docs.basho.com/riak/latest/dev/references/http/store-object/\n * @see http://docs.basho.com/riak/latest/dev/references/http/secondary-indexes/\n *\n * @method headersForUpdate\n * @return {Hash} Headers object suitable for a jQuery AJAX PUT request\n */\n headersForUpdate: (function () {\n var _this = this;\n\n if (this.get('headers')) {\n var _ret = (function () {\n // Start with the causal context\n var headers = {};\n\n headers['X-Riak-Vclock'] = _this.get('causalContext');\n\n _this.get('indexes').forEach(function (index) {\n headers[index.key] = index.value;\n });\n\n _this.get('headersCustom').forEach(function (header) {\n headers[header.key] = header.value;\n });\n\n return {\n v: headers\n };\n })();\n\n if (typeof _ret === 'object') return _ret.v;\n }\n }).property('headers'),\n\n /**\n * List of user-defined Secondary Indexes for this object.\n * @see http://docs.basho.com/riak/latest/dev/references/http/secondary-indexes/\n * @property indexes\n * @type Array\n */\n indexes: (function () {\n if (this.get('headers')) {\n return this.get('headers').indexes;\n }\n }).property('headers'),\n\n /**\n * Has this object been deleted, cluster-side?\n * Generally only encountered if `delete_mode` is set to 'keep',\n * or if a tombstone is one of the object's siblings.\n * @see http://docs.basho.com/riak/latest/ops/advanced/deletion/\n * @see http://docs.basho.com/riak/latest/dev/references/http/delete-object/\n *\n * @property isDeleted\n * @type String\n * @readOnly\n */\n isDeleted: (function () {\n if (this.get('headers')) {\n return this.get('headers').other['x-riak-deleted'];\n }\n }).property('headers')\n });\n});","define('ember-riak-explorer/mixins/routes/alerts', ['exports', 'ember'], function (exports, _ember) {\n\n /**\n * Mixin class that allows routes to render an alert template into the alert outlet.\n * To be used on route classes only.\n *\n * @class WrapperState\n */\n exports['default'] = _ember['default'].Mixin.create({\n /**\n * Renders the passed template into the alert outlet.\n * @method showAlert\n * @argument String\n */\n showAlert: function showAlert(templateString) {\n this.render(templateString, {\n into: 'application',\n outlet: 'alert'\n });\n },\n\n /**\n * Renders and empty template into the alerts outlet. Useful for removing any existing\n * alerts that are currently in view.\n * @method removeAlert\n */\n removeAlert: function removeAlert() {\n this.render('alerts.empty', {\n into: 'application',\n outlet: 'alert'\n });\n }\n });\n});","define('ember-riak-explorer/mixins/routes/loading-slider', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Mixin.create({\n simulateLoad: function simulateLoad() {\n var controller = this.controllerFor('application');\n\n controller.set('loading', true);\n\n setTimeout(function () {\n controller.set('loading', false);\n }, 200);\n },\n\n actions: {\n loading: function loading() {\n var controller = this.controllerFor('application');\n\n controller.set('loading', true);\n\n if (this.router) {\n this.router.one('didTransition', function () {\n controller.set('loading', false);\n });\n }\n },\n\n finished: function finished() {\n this.controllerFor('application').set('loading', false);\n }\n }\n });\n});","define('ember-riak-explorer/mixins/routes/monitoring', ['exports', 'ember', 'lodash/lodash'], function (exports, _ember, _lodashLodash) {\n exports['default'] = _ember['default'].Mixin.create({\n groupedSelectOptions: [{\n groupName: 'Erlang Resource Usage Metrics',\n options: ['memory_processes', 'memory_processes_used', 'sys_process_count']\n }, {\n groupName: 'Throughput Metrics',\n options: ['node_gets', 'node_puts', 'vnode_counter_update', 'vnode_map_update', 'consistent_gets', 'search_query_throughput_one', 'search_index_throughtput_one', 'consistent_puts', 'vnode_index_reads']\n }, {\n groupName: 'Latency Metrics',\n options: ['node_get_fsm_time_mean', 'node_put_fsm_time_mean', 'object_counter_merge_time_mean', 'object_set_merge_time_mean', 'object_map_merge_time_mean', 'search_query_latency_median', 'search_index_latency_median', 'consistent_get_time_mean', 'consistent_put_time_mean']\n }, {\n groupName: 'General Riak Load/Health Metrics',\n options: ['node_get_fsm_siblings_mean', 'node_get_fsm_objsize_mean', 'riak_search_vnodeq_mean', 'search_index_fail_one', 'pbc_active', 'pbc_connects', 'read_repairs', 'list_fsm_active', 'node_get_fsm_rejected', 'node_put_fsm_rejected']\n }],\n\n setPossibleGraphOptions: function setPossibleGraphOptions(nodeStats) {\n var groupedStats = this.get('groupedSelectOptions');\n var existingNodeStats = Object.keys(nodeStats);\n var possibleOptions = undefined;\n\n // Remove any groupedStatistics that the nodeStats doesn't contain\n possibleOptions = groupedStats.map(function (group) {\n group.options = _lodashLodash['default'].intersection(group.options, existingNodeStats);\n\n return group;\n });\n\n // Add any number metric as a possible graph option\n possibleOptions.push({\n groupName: 'All Metrics',\n options: existingNodeStats.filter(function (stat) {\n return _lodashLodash['default'].isNumber(nodeStats[stat]);\n })\n });\n\n this.controller.set('availableGraphs', possibleOptions);\n },\n\n setDefaultGraph: function setDefaultGraph() {\n var controller = this.controller;\n var firstAvailableGraph = _lodashLodash['default'].head(_lodashLodash['default'].head(controller.get('availableGraphs')).options);\n\n return controller.set('currentGraphs', [firstAvailableGraph]);\n }\n });\n});","define('ember-riak-explorer/mixins/routes/polling', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Mixin.create({\n startPolling: function startPolling(callback) {\n var interval = arguments.length <= 1 || arguments[1] === undefined ? 1000 : arguments[1];\n\n this.set('timer', _ember['default'].run.later(this, function () {\n callback();\n }, interval));\n },\n\n stopPolling: function stopPolling() {\n return _ember['default'].run.cancel(this.get('timer'));\n }\n });\n});","define('ember-riak-explorer/mixins/routes/scroll-reset', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Mixin.create({\n activate: function activate() {\n this._super();\n _ember['default'].$('.view-body').scrollTop(0);\n },\n\n scrollToTop: function scrollToTop() {\n return _ember['default'].$('.view-body').scrollTop(0);\n }\n });\n});","define('ember-riak-explorer/mixins/routes/wrapper-state', ['exports', 'ember'], function (exports, _ember) {\n\n /**\n * Mixin class that allows routes to set state that is part of the \"Global\" state,\n * i.e. state that is part of the GUI chrome. Things like sidebars, headers, footers, etc.\n * To be included on route classes only.\n *\n * @class WrapperState\n */\n exports['default'] = _ember['default'].Mixin.create({\n /**\n * Passes the current cluster object to the sidebar, for display and logic purposes.\n * @method setSidebarCluster\n * @argument Cluster{DS.Store}\n */\n setSidebarCluster: function setSidebarCluster(cluster) {\n this.controllerFor('application').set('currentCluster', cluster);\n },\n\n /**\n * Takes an object with the current breadcrumb state, for display purposes.\n * @method setBreadCrumbs\n * @argument Object\n */\n setBreadCrumbs: function setBreadCrumbs(breadCrumbMap) {\n if (!breadCrumbMap) {\n breadCrumbMap = {};\n }\n this.controllerFor('application').set('breadCrumbMap', breadCrumbMap);\n },\n\n /**\n * Takes an object with the current label state, for display purposes.\n * @method setViewLabel\n * @argument Object\n */\n setViewLabel: function setViewLabel(viewLabelMap) {\n if (!viewLabelMap) {\n viewLabelMap = {};\n }\n this.controllerFor('application').set('viewLabelMap', viewLabelMap);\n }\n });\n});","define('ember-riak-explorer/models/bucket-list', ['exports', 'ember-data', 'ember-riak-explorer/mixins/models/cached-list'], function (exports, _emberData, _emberRiakExplorerMixinsModelsCachedList) {\n\n /**\n * Represents a list of buckets in the current bucket type,\n * cached by the Explorer API.\n *\n * @class BucketList\n * @extends CachedList\n * @uses BucketType\n */\n var BucketList = _emberData['default'].Model.extend(_emberRiakExplorerMixinsModelsCachedList['default'], {\n /**\n * The bucket type that owns this bucket list.\n * @property bucketType\n * @type BucketType\n */\n bucketType: _emberData['default'].belongsTo('bucket-type')\n });\n\n exports['default'] = BucketList;\n});","define('ember-riak-explorer/models/object-list', ['exports', 'ember-data', 'ember-riak-explorer/mixins/models/cached-list'], function (exports, _emberData, _emberRiakExplorerMixinsModelsCachedList) {\n\n var ObjectList = _emberData['default'].Model.extend(_emberRiakExplorerMixinsModelsCachedList['default'], {\n /**\n * The bucket type that owns this bucket list.\n * @property bucketType\n * @type BucketType\n */\n bucket: _emberData['default'].belongsTo('bucket')\n\n /**\n * Returns true if this list has a nonzero key count.\n * @method hasKeys\n * @return {Boolean}\n */\n //hasKeys: function() {\n // return this.get('count') > 0;\n //}.property('count'),\n\n /**\n * Returns whether or not the 'Delete All Keys in Bucket' button\n * should be displayed to the user.\n * @method showDeleteKeys\n * @return {Boolean}\n */\n //showDeleteKeys: function() {\n // return this.get('cluster').get('developmentMode') &&\n // this.get('hasKeys');\n //}.property('cluster', 'count')\n });\n\n exports['default'] = ObjectList;\n});","define('ember-riak-explorer/models/row-list', ['exports', 'ember-data', 'ember-riak-explorer/mixins/models/cached-list'], function (exports, _emberData, _emberRiakExplorerMixinsModelsCachedList) {\n\n /**\n * Represents a list of rows in the current table,\n * cached by the Explorer API.\n *\n * @class RowsList\n * @extends CachedList\n * @uses Table\n */\n var RowsList = _emberData['default'].Model.extend(_emberRiakExplorerMixinsModelsCachedList['default'], {\n /**\n * The table that owns this rows list.\n * @property table\n * @type Table\n */\n table: _emberData['default'].belongsTo('table')\n });\n\n exports['default'] = RowsList;\n});","define('ember-riak-explorer/models/row', ['exports', 'ember-data'], function (exports, _emberData) {\n exports['default'] = _emberData['default'].Model.extend({\n table: _emberData['default'].belongsTo('table'),\n\n // The rows index in the cached list.\n // Don't like coupling it to the cached list, but it is easier to read this than to parse the string id\n index: _emberData['default'].attr('string'),\n\n // String representation of the row\n value: _emberData['default'].attr('string'),\n\n // array representation of the row\n parsedValue: (function () {\n if (this.get('value')) {\n return JSON.parse(this.get('value'));\n }\n }).property('value')\n });\n});","define('ember-riak-explorer/pods/bucket-type/controller', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/side-drawer', 'ember-riak-explorer/mixins/controller/modal'], function (exports, _ember, _emberRiakExplorerMixinsControllerSideDrawer, _emberRiakExplorerMixinsControllerModal) {\n exports['default'] = _ember['default'].Controller.extend(_emberRiakExplorerMixinsControllerSideDrawer['default'], _emberRiakExplorerMixinsControllerModal['default'], {\n pageSize: null,\n\n currentBuckets: null,\n\n showCachedListWarning: true\n });\n});","define('ember-riak-explorer/pods/bucket-type/create/controller', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Controller.extend({\n dataType: 'default',\n\n dataTypes: ['default', 'counter', 'set', 'map'],\n\n properties: [],\n\n showSpinner: false,\n\n spinnerMessage: 'loading ...',\n\n errors: [],\n\n clearState: function clearState() {\n this.set('showSpinner', false);\n this.set('dataType', 'default');\n this.set('properties', []);\n this.set('errors', []);\n }\n });\n});","define('ember-riak-explorer/pods/bucket-type/create/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/alerts', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesAlerts, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesAlerts['default'], _emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n model: function model(params) {\n var self = this;\n\n return this.explorer.getCluster(params.clusterName).then(function (cluster) {\n return self.store.createRecord('bucket-type', {\n cluster: cluster,\n name: ''\n });\n });\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n crudAction: 'create bucket type'\n });\n this.setViewLabel({\n preLabel: 'Create Bucket Type'\n });\n },\n\n setupController: function setupController(controller, model) {\n this._super(controller, model);\n\n if (model.get('cluster').get('supportsHyperLogLogs')) {\n controller.get('dataTypes').pushObject('hyperloglog');\n }\n\n controller.clearState();\n },\n\n prepareBucketType: function prepareBucketType() {\n var controller = this.controller;\n var btName = this.currentModel.get('name').trim().replace(/ /g, \"_\");\n var btProps = controller.get('properties');\n var btType = controller.get('dataType');\n var bucketType = {\n name: btName,\n data: {\n props: {}\n }\n };\n\n btProps.forEach(function (prop) {\n bucketType.data.props[prop.key] = prop.value;\n });\n\n if (btType !== 'default') {\n if (btType === 'hyperloglog') {\n bucketType.data.props.datatype = 'hll';\n } else {\n bucketType.data.props.datatype = btType;\n }\n }\n\n return bucketType;\n },\n\n validatePresenceAndUniquenessOfName: function validatePresenceAndUniquenessOfName() {\n var controller = this.controller;\n var bucketType = this.currentModel;\n var cluster = bucketType.get('cluster');\n var name = bucketType.get('name').trim().replace(/ /g, \"_\");\n\n var isValid = undefined;\n\n if (_ember['default'].isBlank(name)) {\n controller.errors.pushObject('Bucket Types must have a name.');\n isValid = false;\n } else if (cluster.get('bucketTypes').filterBy('name', name).length > 1) {\n controller.errors.pushObject('The ' + cluster.get('name') + ' cluster already has a bucket type called \"' + name + '\".');\n isValid = false;\n } else {\n isValid = true;\n }\n\n return isValid;\n },\n\n validateProperties: function validateProperties() {\n var controller = this.controller;\n var props = controller.get('properties');\n var errors = controller.get('errors');\n var invalidProps = props.filter(function (prop) {\n return _ember['default'].isBlank(prop.key) || _ember['default'].isBlank(prop.value);\n });\n var isValid = undefined;\n\n if (_ember['default'].isPresent(invalidProps)) {\n errors.pushObject('All properties must contain non-empty keys and values');\n isValid = false;\n } else {\n isValid = true;\n }\n\n return isValid;\n },\n\n validateBucketType: function validateBucketType() {\n this.controller.set('errors', []);\n\n var validName = this.validatePresenceAndUniquenessOfName();\n var validProps = this.validateProperties();\n\n return validName && validProps;\n },\n\n actions: {\n createBucketType: function createBucketType() {\n var _this = this;\n\n var self = this;\n var controller = this.controller;\n var cluster = this.currentModel.get('cluster');\n var isValid = this.validateBucketType();\n\n if (isValid) {\n (function () {\n controller.set('spinnerMessage', 'Creating Bucket-Type ...');\n controller.set('showSpinner', true);\n\n var bucketType = _this.prepareBucketType();\n\n _this.explorer.createBucketType(cluster.get('name'), bucketType).then(function onSuccess(data) {\n self.transitionTo('bucket-type', cluster.get('name'), bucketType.name).then(function () {\n controller.set('showSpinner', false);\n });\n }, function onFail(data) {\n controller.set('showSpinner', false);\n\n self.render('alerts.error-request-was-not-processed', {\n into: 'application',\n outlet: 'alert'\n });\n });\n })();\n }\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/bucket-type/create/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 5,\n \"column\": 6\n },\n \"end\": {\n \"line\": 7,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/create/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createUnsafeMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"error\", [\"loc\", [null, [6, 12], [6, 23]]]]],\n locals: [\"error\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 9,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"label label-danger\");\n var el3 = dom.createTextNode(\"Errors\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"errors\", [\"loc\", [null, [5, 14], [5, 20]]]]], [], 0, null, [\"loc\", [null, [5, 6], [7, 15]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 10,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"danger\"], 0, null, [\"loc\", [null, [2, 2], [9, 22]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 16,\n \"column\": 8\n },\n \"end\": {\n \"line\": 19,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-close-round\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Cancel\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 14,\n \"column\": 4\n },\n \"end\": {\n \"line\": 21,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"cluster.data\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [16, 34], [16, 52]]]]], [\"class\", \"cancel action-button\"], 0, null, [\"loc\", [null, [16, 8], [19, 20]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 23,\n \"column\": 6\n },\n \"end\": {\n \"line\": 25,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"loading-spinner\", [], [\"statusMessage\", [\"subexpr\", \"@mut\", [[\"get\", \"spinnerMessage\", [\"loc\", [null, [24, 40], [24, 54]]]]], [], []]], [\"loc\", [null, [24, 8], [24, 56]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 35,\n \"column\": 14\n },\n \"end\": {\n \"line\": 37,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/create/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"option\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(3);\n morphs[0] = dom.createAttrMorph(element0, 'value');\n morphs[1] = dom.createAttrMorph(element0, 'selected');\n morphs[2] = dom.createMorphAt(element0, 0, 0);\n return morphs;\n },\n statements: [[\"attribute\", \"value\", [\"get\", \"type\", [\"loc\", [null, [36, 32], [36, 36]]]]], [\"attribute\", \"selected\", [\"subexpr\", \"eq\", [[\"get\", \"dataType\", [\"loc\", [null, [36, 53], [36, 61]]]], [\"get\", \"type\", [\"loc\", [null, [36, 62], [36, 66]]]]], [], [\"loc\", [null, [36, 48], [36, 68]]]]], [\"content\", \"type\", [\"loc\", [null, [36, 69], [36, 77]]]]],\n locals: [\"type\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 25,\n \"column\": 6\n },\n \"end\": {\n \"line\": 49,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"form\");\n dom.setAttribute(el1, \"class\", \"bucket-type-create-form\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"form-group name-input\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"label\");\n var el4 = dom.createTextNode(\"Name\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"form-group type-input\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"label\");\n var el4 = dom.createTextNode(\"Data Type\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"select\");\n dom.setAttribute(el3, \"class\", \"form-control\");\n var el4 = dom.createTextNode(\"\\n\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\" \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"form-group create-button\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"button\");\n dom.setAttribute(el3, \"class\", \"btn btn-primary\");\n var el4 = dom.createTextNode(\"\\n Create Bucket Type\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element1 = dom.childAt(fragment, [1]);\n var element2 = dom.childAt(element1, [3, 3]);\n var element3 = dom.childAt(element1, [7, 1]);\n var morphs = new Array(5);\n morphs[0] = dom.createMorphAt(dom.childAt(element1, [1]), 3, 3);\n morphs[1] = dom.createAttrMorph(element2, 'onchange');\n morphs[2] = dom.createMorphAt(element2, 1, 1);\n morphs[3] = dom.createMorphAt(element1, 5, 5);\n morphs[4] = dom.createElementMorph(element3);\n return morphs;\n },\n statements: [[\"inline\", \"input\", [], [\"value\", [\"subexpr\", \"mut\", [[\"get\", \"model.name\", [\"loc\", [null, [29, 31], [29, 41]]]]], [], [\"loc\", [null, [29, 26], [29, 42]]]], \"class\", \"form-control\"], [\"loc\", [null, [29, 12], [29, 65]]]], [\"attribute\", \"onchange\", [\"subexpr\", \"action\", [[\"subexpr\", \"mut\", [[\"get\", \"dataType\", [\"loc\", [null, [34, 43], [34, 51]]]]], [], [\"loc\", [null, [34, 38], [34, 52]]]]], [\"value\", \"target.value\"], [\"loc\", [null, [34, 29], [34, 75]]]]], [\"block\", \"each\", [[\"get\", \"dataTypes\", [\"loc\", [null, [35, 22], [35, 31]]]]], [], 0, null, [\"loc\", [null, [35, 14], [37, 23]]]], [\"inline\", \"form.add-custom-properties\", [], [\"properties\", [\"subexpr\", \"@mut\", [[\"get\", \"properties\", [\"loc\", [null, [41, 50], [41, 60]]]]], [], []]], [\"loc\", [null, [41, 10], [41, 62]]]], [\"element\", \"action\", [\"createBucketType\"], [], [\"loc\", [null, [44, 44], [44, 73]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 22,\n \"column\": 4\n },\n \"end\": {\n \"line\": 50,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"showSpinner\", [\"loc\", [null, [23, 12], [23, 23]]]]], [], 0, 1, [\"loc\", [null, [23, 6], [49, 13]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 13,\n \"column\": 2\n },\n \"end\": {\n \"line\": 51,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Create Bucket Type Form\"], 0, null, [\"loc\", [null, [14, 4], [21, 32]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [22, 4], [50, 30]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 52,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"bucket-type-create-container\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"errors\", [\"loc\", [null, [1, 6], [1, 12]]]]], [], 0, null, [\"loc\", [null, [1, 0], [10, 7]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 1, null, [\"loc\", [null, [13, 2], [51, 33]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })());\n});","define('ember-riak-explorer/pods/bucket-type/edit/controller', ['exports', 'ember', 'lodash/lodash', 'ember-riak-explorer/mixins/controller/scroll-reset'], function (exports, _ember, _lodashLodash, _emberRiakExplorerMixinsControllerScrollReset) {\n exports['default'] = _ember['default'].Controller.extend(_emberRiakExplorerMixinsControllerScrollReset['default'], {\n initialProps: {},\n\n updatedProps: {},\n\n editableProps: [],\n\n errors: [],\n\n nonEditableProps: [],\n\n convertStringToType: function convertStringToType(string, type) {\n var methodName = 'is' + _lodashLodash['default'].capitalize(type); // Converts to proper underscore method name (_.isArray, _.isBoolean, etc.)\n var isValid = true;\n var convertedValue = null;\n\n // Set empty arrays\n if (type === 'array' && _ember['default'].isBlank(string)) {\n string = '[]';\n }\n\n switch (type) {\n // TODO: Once lodash upgrades, use _.isInteger\n case 'integer':\n convertedValue = parseInt(string);\n if (isNaN(convertedValue)) {\n isValid = false;\n }\n break;\n case 'array':\n case 'object':\n case 'boolean':\n try {\n convertedValue = JSON.parse(string);\n if (!_lodashLodash['default'][methodName](convertedValue)) {\n isValid = false;\n }\n } catch (e) {\n isValid = false;\n }\n break;\n case 'integer|string':\n var possibleInt = parseInt(string);\n\n convertedValue = isNaN(possibleInt) ? string : possibleInt;\n break;\n default:\n convertedValue = string;\n break;\n }\n\n return { valid: isValid, value: convertedValue };\n },\n\n getErrorObject: function getErrorObject(propKey) {\n return this.get('errors').findBy('id', propKey);\n },\n\n errorExists: function errorExists(propKey) {\n return !!this.getErrorObject(propKey);\n },\n\n removeError: function removeError(propKey) {\n var errors = this.get('errors');\n\n return errors.removeAt(errors.indexOf(this.getErrorObject(propKey)));\n },\n\n addError: function addError(prop) {\n var message = null;\n\n switch (prop.json_schema_type) {\n case 'integer':\n message = 'must be an integer';\n break;\n case 'array':\n message = 'must be an array';\n break;\n case 'object':\n message = 'must be an object';\n break;\n case 'string':\n message = 'must be a string';\n break;\n case 'boolean':\n message = 'must be a boolean';\n break;\n case 'integer|string':\n message = 'must be an integer or string';\n break;\n default:\n break;\n }\n\n this.scrollToTop();\n\n return this.get('errors').pushObject({\n id: prop.key,\n message: prop.name + ' ' + message\n });\n },\n\n actions: {\n changedValue: function changedValue(prop) {\n var converted = this.convertStringToType(prop.value, prop.json_schema_type);\n\n if (converted.valid) {\n if (this.errorExists(prop.key)) {\n this.removeError(prop.key);\n }\n\n if (this.get('initialProps')[prop.key] !== converted.value) {\n this.updatedProps[prop.key] = converted.value;\n }\n } else {\n if (!this.errorExists(prop.key)) {\n this.addError(prop);\n }\n }\n }\n }\n });\n});","define('ember-riak-explorer/pods/bucket-type/edit/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/alerts', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state', 'lodash/lodash'], function (exports, _ember, _emberRiakExplorerMixinsRoutesAlerts, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState, _lodashLodash) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesAlerts['default'], _emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n model: function model(params) {\n return this.explorer.getBucketType(params.clusterName, params.bucketTypeName);\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n bucketType: model,\n crudAction: 'edit'\n });\n this.setViewLabel({\n preLabel: 'Edit Bucket Type',\n label: model.get('name')\n });\n },\n\n setupController: function setupController(controller, model) {\n this._super(controller, model);\n\n var initialProps = {};\n\n var props = model.get('propsWithHelp');\n var editableProps = props.filter(function (prop) {\n return prop.editable;\n });\n var nonEditableProps = props.filter(function (prop) {\n return !prop.editable;\n });\n\n editableProps.forEach(function (prop) {\n initialProps[prop.key] = prop.value;\n });\n\n controller.set('initialProps', initialProps);\n controller.set('editableProps', editableProps);\n controller.set('nonEditableProps', nonEditableProps);\n controller.set('errors', []);\n },\n\n actions: {\n updateBucketType: function updateBucketType() {\n var controller = this.get('controller');\n var bucketType = this.currentModel;\n var updatedProps = controller.get('updatedProps');\n var self = this;\n\n this.explorer.updateBucketType(bucketType, updatedProps).then(function onSuccess(data) {\n self.transitionTo('bucket-type', bucketType.get('cluster').get('name'), bucketType.get('name'));\n }, function onFail(data) {\n if (data.responseText) {\n var errorObj = {\n id: 'server_error',\n message: JSON.parse(data.responseText).error\n };\n\n controller.get('errors').pushObject(errorObj);\n } else {\n self.render('alerts.error-request-was-not-processed', {\n into: 'application',\n outlet: 'alert'\n });\n }\n self.scrollToTop();\n });\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/bucket-type/edit/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 5,\n \"column\": 6\n },\n \"end\": {\n \"line\": 7,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createUnsafeMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"error.message\", [\"loc\", [null, [6, 12], [6, 31]]]]],\n locals: [\"error\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 9,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"h4\");\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"label label-danger\");\n var el4 = dom.createTextNode(\"Errors\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 3, 3);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"errors\", [\"loc\", [null, [5, 14], [5, 20]]]]], [], 0, null, [\"loc\", [null, [5, 6], [7, 15]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 10,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"danger\"], 0, null, [\"loc\", [null, [2, 2], [9, 22]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 16,\n \"column\": 8\n },\n \"end\": {\n \"line\": 19,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-close-round\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Cancel\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 14,\n \"column\": 4\n },\n \"end\": {\n \"line\": 21,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"bucket-type\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [16, 33], [16, 51]]]], [\"get\", \"model.name\", [\"loc\", [null, [16, 52], [16, 62]]]]], [\"class\", \"action-button cancel\"], 0, null, [\"loc\", [null, [16, 8], [19, 20]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 31,\n \"column\": 12\n },\n \"end\": {\n \"line\": 36,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"Consistent\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 3]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"model.props.consistent\", [\"loc\", [null, [34, 34], [34, 60]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 37,\n \"column\": 12\n },\n \"end\": {\n \"line\": 42,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"Write Once\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 3]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"model.props.write_once\", [\"loc\", [null, [40, 34], [40, 60]]]]],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 43,\n \"column\": 12\n },\n \"end\": {\n \"line\": 55,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element2 = dom.childAt(fragment, [1]);\n var element3 = dom.childAt(element2, [1]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(element3, 1, 1);\n morphs[1] = dom.createMorphAt(element3, 3, 3);\n morphs[2] = dom.createMorphAt(dom.childAt(element2, [3, 0]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"prop.name\", [\"loc\", [null, [46, 18], [46, 31]]]], [\"inline\", \"tooltip.bucket-props\", [], [\"itemKey\", [\"subexpr\", \"@mut\", [[\"get\", \"prop.key\", [\"loc\", [null, [48, 26], [48, 34]]]]], [], []], \"itemDescription\", [\"subexpr\", \"@mut\", [[\"get\", \"prop.description\", [\"loc\", [null, [49, 34], [49, 50]]]]], [], []], \"itemDefaultValue\", [\"subexpr\", \"@mut\", [[\"get\", \"prop.default\", [\"loc\", [null, [50, 35], [50, 47]]]]], [], []], \"itemSchemaType\", [\"subexpr\", \"@mut\", [[\"get\", \"prop.json_schema_type\", [\"loc\", [null, [51, 33], [51, 54]]]]], [], []]], [\"loc\", [null, [47, 18], [51, 56]]]], [\"content\", \"prop.value\", [\"loc\", [null, [53, 40], [53, 54]]]]],\n locals: [\"prop\"],\n templates: []\n };\n })();\n var child3 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 66,\n \"column\": 14\n },\n \"end\": {\n \"line\": 80,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var element1 = dom.childAt(element0, [1]);\n var morphs = new Array(4);\n morphs[0] = dom.createElementMorph(element0);\n morphs[1] = dom.createMorphAt(element1, 1, 1);\n morphs[2] = dom.createMorphAt(element1, 3, 3);\n morphs[3] = dom.createMorphAt(dom.childAt(element0, [3]), 1, 1);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"changedValue\", [\"get\", \"prop\", [\"loc\", [null, [67, 44], [67, 48]]]]], [\"on\", \"focusOut\"], [\"loc\", [null, [67, 20], [67, 64]]]], [\"content\", \"prop.name\", [\"loc\", [null, [69, 20], [69, 33]]]], [\"inline\", \"tooltip.bucket-props\", [], [\"itemKey\", [\"subexpr\", \"@mut\", [[\"get\", \"prop.key\", [\"loc\", [null, [71, 28], [71, 36]]]]], [], []], \"itemDescription\", [\"subexpr\", \"@mut\", [[\"get\", \"prop.description\", [\"loc\", [null, [72, 36], [72, 52]]]]], [], []], \"itemDefaultValue\", [\"subexpr\", \"@mut\", [[\"get\", \"prop.default\", [\"loc\", [null, [73, 37], [73, 49]]]]], [], []], \"itemSchemaType\", [\"subexpr\", \"@mut\", [[\"get\", \"prop.json_schema_type\", [\"loc\", [null, [74, 35], [74, 56]]]]], [], []]], [\"loc\", [null, [70, 20], [74, 58]]]], [\"inline\", \"input\", [], [\"value\", [\"subexpr\", \"@mut\", [[\"get\", \"prop.value\", [\"loc\", [null, [77, 34], [77, 44]]]]], [], []], \"class\", \"form-control\"], [\"loc\", [null, [77, 20], [77, 67]]]]],\n locals: [\"prop\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 22,\n \"column\": 4\n },\n \"end\": {\n \"line\": 89,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"section\");\n dom.setAttribute(el1, \"class\", \"non-editable-props\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"section-title\");\n var el3 = dom.createTextNode(\"Non-Editable Properties\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"table\");\n dom.setAttribute(el2, \"class\", \"key-value-table\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tbody\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"tr\");\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n var el5 = dom.createElement(\"td\");\n dom.setAttribute(el5, \"class\", \"key\");\n var el6 = dom.createTextNode(\"Name\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n var el5 = dom.createElement(\"td\");\n dom.setAttribute(el5, \"class\", \"value\");\n var el6 = dom.createComment(\"\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\" \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"section\");\n dom.setAttribute(el1, \"class\", \"non-editable-props\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"section-title\");\n var el3 = dom.createTextNode(\"Editable Properties\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"form\");\n dom.setAttribute(el2, \"id\", \"some-form\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"table\");\n dom.setAttribute(el3, \"class\", \"key-value-table\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"tbody\");\n var el5 = dom.createTextNode(\"\\n\");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n var el5 = dom.createElement(\"button\");\n dom.setAttribute(el5, \"type\", \"submit\");\n dom.setAttribute(el5, \"class\", \"btn btn-primary\");\n var el6 = dom.createTextNode(\"\\n Update Bucket Type\\n \");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element4 = dom.childAt(fragment, [1, 3, 1]);\n var element5 = dom.childAt(fragment, [3, 3]);\n var morphs = new Array(6);\n morphs[0] = dom.createMorphAt(dom.childAt(element4, [1, 3]), 0, 0);\n morphs[1] = dom.createMorphAt(element4, 3, 3);\n morphs[2] = dom.createMorphAt(element4, 4, 4);\n morphs[3] = dom.createMorphAt(element4, 5, 5);\n morphs[4] = dom.createElementMorph(element5);\n morphs[5] = dom.createMorphAt(dom.childAt(element5, [1, 1]), 1, 1);\n return morphs;\n },\n statements: [[\"content\", \"model.name\", [\"loc\", [null, [29, 32], [29, 46]]]], [\"block\", \"if\", [[\"get\", \"model.props.consistent\", [\"loc\", [null, [31, 18], [31, 40]]]]], [], 0, null, [\"loc\", [null, [31, 12], [36, 19]]]], [\"block\", \"if\", [[\"get\", \"model.props.write_once\", [\"loc\", [null, [37, 18], [37, 40]]]]], [], 1, null, [\"loc\", [null, [37, 12], [42, 19]]]], [\"block\", \"each\", [[\"get\", \"nonEditableProps\", [\"loc\", [null, [43, 20], [43, 36]]]]], [], 2, null, [\"loc\", [null, [43, 12], [55, 21]]]], [\"element\", \"action\", [\"updateBucketType\", [\"get\", \"target\", [\"loc\", [null, [63, 57], [63, 63]]]]], [\"on\", \"submit\"], [\"loc\", [null, [63, 29], [63, 77]]]], [\"block\", \"each\", [[\"get\", \"editableProps\", [\"loc\", [null, [66, 22], [66, 35]]]]], [], 3, null, [\"loc\", [null, [66, 14], [80, 23]]]]],\n locals: [],\n templates: [child0, child1, child2, child3]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 13,\n \"column\": 2\n },\n \"end\": {\n \"line\": 90,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Edit Bucket Type\"], 0, null, [\"loc\", [null, [14, 4], [21, 32]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [22, 4], [89, 30]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 91,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"bucket-type-edit-container\");\n dom.setAttribute(el1, \"xmlns\", \"http://www.w3.org/1999/html\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"errors\", [\"loc\", [null, [1, 6], [1, 12]]]]], [], 0, null, [\"loc\", [null, [1, 0], [10, 7]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 1, null, [\"loc\", [null, [13, 2], [90, 33]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })());\n});","define('ember-riak-explorer/pods/bucket-type/model', ['exports', 'ember-data', 'ember-riak-explorer/mixins/models/bucket-props', 'ember-riak-explorer/mixins/models/cached-list-watcher'], function (exports, _emberData, _emberRiakExplorerMixinsModelsBucketProps, _emberRiakExplorerMixinsModelsCachedListWatcher) {\n\n /**\n * Represents a Riak Bucket Type\n *\n * @class BucketType\n * @extends DS.Model\n * @constructor\n * @uses Cluster\n * @uses BucketProps\n * @uses BucketList\n */\n var BucketType = _emberData['default'].Model.extend(_emberRiakExplorerMixinsModelsBucketProps['default'], _emberRiakExplorerMixinsModelsCachedListWatcher['default'], {\n bucketList: _emberData['default'].belongsTo('bucket-list'),\n\n /**\n * Contains the results of cached bucket lists for this bucket type,\n * fetched from the API.\n * @property buckets\n * @type Bucket\n */\n buckets: _emberData['default'].hasMany('bucket'),\n\n /**\n * Riak cluster in which this bucket type lives.\n * @property cluster\n * @type Cluster\n * @writeOnce\n */\n cluster: _emberData['default'].belongsTo('cluster'),\n\n /**\n * Bucket Type name (unique per cluster),\n * as appears on `riak-admin bucket-type list`\n * @property name\n * @type String\n */\n name: _emberData['default'].attr('string')\n });\n\n exports['default'] = BucketType;\n});","define('ember-riak-explorer/pods/bucket-type/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/polling', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesPolling, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesPolling['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n bucketsPaging: {\n size: 10,\n initialLow: 0,\n initialHigh: 9\n },\n\n model: function model(params) {\n return this.explorer.getBucketType(params.clusterName, params.bucketTypeName);\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n bucketType: model\n });\n this.setViewLabel({\n preLabel: 'Bucket Type',\n label: model.get('name')\n });\n },\n\n setupController: function setupController(controller, model) {\n var page = this.get('bucketsPaging');\n\n this._super(controller, model);\n this.controller.set('pageSize', page.size);\n this.controller.set('currentBuckets', this.bucketsFromRange(page.initialLow, page.initialHigh));\n },\n\n bucketsFromRange: function bucketsFromRange(startIndex, endIndex) {\n return this.currentModel.get('buckets').filter(function (bucket, index) {\n return index >= startIndex && index <= endIndex;\n });\n },\n\n lookForNewBucketsList: function lookForNewBucketsList() {\n var self = this;\n var bucketType = this.currentModel;\n var page = this.get('bucketsPaging');\n\n this.explorer.getBucketList(bucketType).then(function (list) {\n return self.explorer.getBuckets(bucketType);\n }).then(function (buckets) {\n self.controller.set('currentBuckets', self.bucketsFromRange(page.initialLow, page.initialHigh));\n self.stopPolling();\n });\n },\n\n actions: {\n refreshBucketList: function refreshBucketList(bucketType) {\n var self = this;\n\n this.controller.set('modalVisible', false);\n this.controller.set('showCachedListWarning', false);\n\n return this.explorer.refreshBucketList(bucketType).then(function () {\n self.startPolling(self.lookForNewBucketsList.bind(self));\n });\n },\n\n bucketsPageRequest: function bucketsPageRequest(lowIndex, highIndex) {\n this.controller.set('currentBuckets', this.bucketsFromRange(lowIndex, highIndex));\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/bucket-type/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 5,\n \"column\": 6\n },\n \"end\": {\n \"line\": 7,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"warning\", [\"loc\", [null, [6, 12], [6, 23]]]]],\n locals: [\"warning\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 9,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"h4\");\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"label label-warning\");\n var el4 = dom.createTextNode(\"WARNINGS\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 3, 3);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"model.warnings\", [\"loc\", [null, [5, 14], [5, 28]]]]], [], 0, null, [\"loc\", [null, [5, 6], [7, 15]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 10,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"warning\"], 0, null, [\"loc\", [null, [2, 2], [9, 22]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 16,\n \"column\": 8\n },\n \"end\": {\n \"line\": 19,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-edit\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Edit Bucket Type\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 14,\n \"column\": 4\n },\n \"end\": {\n \"line\": 21,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"bucket-type.edit\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [16, 38], [16, 56]]]], [\"get\", \"model.name\", [\"loc\", [null, [16, 57], [16, 67]]]]], [\"class\", \"action-button edit\"], 0, null, [\"loc\", [null, [16, 8], [19, 20]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 25,\n \"column\": 10\n },\n \"end\": {\n \"line\": 25,\n \"column\": 34\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"Overview\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 26,\n \"column\": 10\n },\n \"end\": {\n \"line\": 26,\n \"column\": 45\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"Advanced Properties\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 24,\n \"column\": 8\n },\n \"end\": {\n \"line\": 27,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n return morphs;\n },\n statements: [[\"block\", \"tablist.tab\", [], [], 0, null, [\"loc\", [null, [25, 10], [25, 50]]]], [\"block\", \"tablist.tab\", [], [], 1, null, [\"loc\", [null, [26, 10], [26, 61]]]]],\n locals: [\"tablist\"],\n templates: [child0, child1]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 29,\n \"column\": 8\n },\n \"end\": {\n \"line\": 31,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"table.bucket-props-overview\", [], [\"model\", [\"subexpr\", \"@mut\", [[\"get\", \"model\", [\"loc\", [null, [30, 46], [30, 51]]]]], [], []]], [\"loc\", [null, [30, 10], [30, 53]]]]],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 33,\n \"column\": 8\n },\n \"end\": {\n \"line\": 35,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"table.bucket-props-advanced\", [], [\"model\", [\"subexpr\", \"@mut\", [[\"get\", \"model\", [\"loc\", [null, [34, 46], [34, 51]]]]], [], []]], [\"loc\", [null, [34, 10], [34, 53]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 23,\n \"column\": 6\n },\n \"end\": {\n \"line\": 36,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"tabs.tablist\", [], [], 0, null, [\"loc\", [null, [24, 8], [27, 25]]]], [\"block\", \"tabs.tabpanel\", [], [], 1, null, [\"loc\", [null, [29, 8], [31, 26]]]], [\"block\", \"tabs.tabpanel\", [], [], 2, null, [\"loc\", [null, [33, 8], [35, 26]]]]],\n locals: [\"tabs\"],\n templates: [child0, child1, child2]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 22,\n \"column\": 4\n },\n \"end\": {\n \"line\": 37,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"ivy-tabs\", [], [\"on-select\", [\"subexpr\", \"action\", [[\"subexpr\", \"mut\", [[\"get\", \"selectedIndex\", [\"loc\", [null, [23, 41], [23, 54]]]]], [], [\"loc\", [null, [23, 36], [23, 55]]]]], [], [\"loc\", [null, [23, 28], [23, 56]]]], \"selected-index\", [\"subexpr\", \"@mut\", [[\"get\", \"selectedIndex\", [\"loc\", [null, [23, 72], [23, 85]]]]], [], []]], 0, null, [\"loc\", [null, [23, 6], [36, 19]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 13,\n \"column\": 2\n },\n \"end\": {\n \"line\": 38,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Bucket Type Properties\"], 0, null, [\"loc\", [null, [14, 4], [21, 32]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [22, 4], [37, 30]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 43,\n \"column\": 10\n },\n \"end\": {\n \"line\": 46,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-plus-circled\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Create New Bucket\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 48,\n \"column\": 10\n },\n \"end\": {\n \"line\": 53,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"button\");\n dom.setAttribute(el1, \"type\", \"button\");\n dom.setAttribute(el1, \"class\", \"action-button refresh\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"ion-refresh\");\n dom.setAttribute(el2, \"aria-hidden\", \"true\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n Refresh Bucket List Cache\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element6 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element6);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"showModal\"], [], [\"loc\", [null, [49, 64], [49, 86]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 41,\n \"column\": 4\n },\n \"end\": {\n \"line\": 55,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element7 = dom.childAt(fragment, [1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(element7, 1, 1);\n morphs[1] = dom.createMorphAt(element7, 3, 3);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"bucket.create\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [43, 37], [43, 55]]]], [\"get\", \"model.name\", [\"loc\", [null, [43, 56], [43, 66]]]]], [\"class\", \"action-button create\"], 0, null, [\"loc\", [null, [43, 10], [46, 22]]]], [\"block\", \"if\", [[\"get\", \"model.cluster.developmentMode\", [\"loc\", [null, [48, 16], [48, 45]]]]], [], 1, null, [\"loc\", [null, [48, 10], [53, 17]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 57,\n \"column\": 6\n },\n \"end\": {\n \"line\": 59,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" No cache list exists\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 59,\n \"column\": 6\n },\n \"end\": {\n \"line\": 61,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"loading-spinner\", [], [\"statusMessage\", [\"subexpr\", \"@mut\", [[\"get\", \"model.statusMessage\", [\"loc\", [null, [60, 40], [60, 59]]]]], [], []]], [\"loc\", [null, [60, 8], [60, 61]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 66,\n \"column\": 12\n },\n \"end\": {\n \"line\": 68,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"more-info\");\n var el2 = dom.createTextNode(\"Hide info on explorer cached lists\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element4 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element4);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"hideSideDrawer\"], [], [\"loc\", [null, [67, 38], [67, 65]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 68,\n \"column\": 12\n },\n \"end\": {\n \"line\": 70,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"more-info\");\n var el2 = dom.createTextNode(\"More info on explorer cached lists\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element3 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element3);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"showSideDrawer\"], [], [\"loc\", [null, [69, 38], [69, 65]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 63,\n \"column\": 10\n },\n \"end\": {\n \"line\": 71,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" Buckets are read from a cached list and may not represent the current state of the bucket type.\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"br\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"isSideDrawerVisible\", [\"loc\", [null, [66, 18], [66, 37]]]]], [], 0, 1, [\"loc\", [null, [66, 12], [70, 19]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 62,\n \"column\": 8\n },\n \"end\": {\n \"line\": 72,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [], 0, null, [\"loc\", [null, [63, 10], [71, 30]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 81,\n \"column\": 10\n },\n \"end\": {\n \"line\": 86,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"Total Buckets\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 3]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"model.buckets.length\", [\"loc\", [null, [84, 32], [84, 56]]]]],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 99,\n \"column\": 24\n },\n \"end\": {\n \"line\": 101,\n \"column\": 24\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"bucket.name\", [\"loc\", [null, [100, 26], [100, 41]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 97,\n \"column\": 20\n },\n \"end\": {\n \"line\": 103,\n \"column\": 20\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link.explorer-resource\", [], [\"resourceType\", \"bucket\", \"resourceObj\", [\"subexpr\", \"@mut\", [[\"get\", \"bucket\", [\"loc\", [null, [99, 84], [99, 90]]]]], [], []]], 0, null, [\"loc\", [null, [99, 24], [101, 51]]]]],\n locals: [\"bucket\"],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 92,\n \"column\": 16\n },\n \"end\": {\n \"line\": 105,\n \"column\": 16\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n dom.setAttribute(el1, \"class\", \"button-list\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"currentBuckets\", [\"loc\", [null, [97, 28], [97, 42]]]]], [], 0, null, [\"loc\", [null, [97, 20], [103, 29]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 91,\n \"column\": 14\n },\n \"end\": {\n \"line\": 106,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"pagination-component\", [], [\"chunkSize\", [\"subexpr\", \"@mut\", [[\"get\", \"pageSize\", [\"loc\", [null, [93, 26], [93, 34]]]]], [], []], \"totalSize\", [\"subexpr\", \"@mut\", [[\"get\", \"model.buckets.length\", [\"loc\", [null, [94, 26], [94, 46]]]]], [], []], \"sectionRequest\", \"bucketsPageRequest\"], 0, null, [\"loc\", [null, [92, 16], [105, 41]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child3 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 106,\n \"column\": 14\n },\n \"end\": {\n \"line\": 108,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" No buckets found in bucket type\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 61,\n \"column\": 6\n },\n \"end\": {\n \"line\": 113,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"table\");\n dom.setAttribute(el1, \"class\", \"key-value-table\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tbody\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"Cached List Created\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value\");\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"Buckets\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value\");\n var el5 = dom.createTextNode(\"\\n\");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\" \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element5 = dom.childAt(fragment, [2, 1]);\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(dom.childAt(element5, [1, 3]), 0, 0);\n morphs[2] = dom.createMorphAt(element5, 3, 3);\n morphs[3] = dom.createMorphAt(dom.childAt(element5, [5, 3]), 1, 1);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"showCachedListWarning\", [\"loc\", [null, [62, 14], [62, 35]]]]], [], 0, null, [\"loc\", [null, [62, 8], [72, 15]]]], [\"content\", \"model.bucketList.created\", [\"loc\", [null, [78, 30], [78, 58]]]], [\"block\", \"if\", [[\"get\", \"model.buckets.length\", [\"loc\", [null, [81, 16], [81, 36]]]]], [], 1, null, [\"loc\", [null, [81, 10], [86, 17]]]], [\"block\", \"if\", [[\"get\", \"model.buckets.length\", [\"loc\", [null, [91, 20], [91, 40]]]]], [], 2, 3, [\"loc\", [null, [91, 14], [108, 21]]]]],\n locals: [],\n templates: [child0, child1, child2, child3]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 59,\n \"column\": 6\n },\n \"end\": {\n \"line\": 113,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"and\", [[\"get\", \"model.hasListBeenRequested\", [\"loc\", [null, [59, 21], [59, 47]]]], [\"subexpr\", \"not\", [[\"get\", \"model.isListLoaded\", [\"loc\", [null, [59, 53], [59, 71]]]]], [], [\"loc\", [null, [59, 48], [59, 72]]]]], [], [\"loc\", [null, [59, 16], [59, 73]]]]], [], 0, 1, [\"loc\", [null, [59, 6], [113, 6]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 56,\n \"column\": 4\n },\n \"end\": {\n \"line\": 114,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"and\", [[\"subexpr\", \"not\", [[\"get\", \"model.hasListBeenRequested\", [\"loc\", [null, [57, 22], [57, 48]]]]], [], [\"loc\", [null, [57, 17], [57, 49]]]], [\"subexpr\", \"not\", [[\"get\", \"model.isListLoaded\", [\"loc\", [null, [57, 55], [57, 73]]]]], [], [\"loc\", [null, [57, 50], [57, 74]]]]], [], [\"loc\", [null, [57, 12], [57, 75]]]]], [], 0, 1, [\"loc\", [null, [57, 6], [113, 13]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 40,\n \"column\": 2\n },\n \"end\": {\n \"line\": 115,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Buckets\"], 0, null, [\"loc\", [null, [41, 4], [55, 32]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [56, 4], [114, 30]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child3 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 120,\n \"column\": 2\n },\n \"end\": {\n \"line\": 143,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"modal-content-container\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"header\");\n dom.setAttribute(el2, \"class\", \"modal-header\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"h3\");\n var el4 = dom.createElement(\"span\");\n dom.setAttribute(el4, \"class\", \"label label-danger\");\n var el5 = dom.createElement(\"i\");\n dom.setAttribute(el5, \"class\", \"ion-alert-circled\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\" Potentially Dangerous Operation\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"section\");\n dom.setAttribute(el2, \"class\", \"modal-body\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"p\");\n var el4 = dom.createTextNode(\"Creating a new cache list requires making a streaming call, with multiple response messages sent for each\\n request.\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"p\");\n var el4 = dom.createTextNode(\"This can be an expensive operation, and is not recommended if the node is in active use. To\\n continue please click the confirm button.\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"footer\");\n dom.setAttribute(el2, \"class\", \"modal-footer\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"button\");\n dom.setAttribute(el3, \"class\", \"btn btn-default\");\n var el4 = dom.createTextNode(\"Cancel\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"button\");\n dom.setAttribute(el3, \"class\", \"btn btn-primary\");\n var el4 = dom.createTextNode(\"Confirm\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1, 5]);\n var element1 = dom.childAt(element0, [1]);\n var element2 = dom.childAt(element0, [3]);\n var morphs = new Array(2);\n morphs[0] = dom.createElementMorph(element1);\n morphs[1] = dom.createElementMorph(element2);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"hideModal\"], [], [\"loc\", [null, [139, 40], [139, 62]]]], [\"element\", \"action\", [\"refreshBucketList\", [\"get\", \"model\", [\"loc\", [null, [140, 69], [140, 74]]]]], [], [\"loc\", [null, [140, 40], [140, 76]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 119,\n \"column\": 0\n },\n \"end\": {\n \"line\": 144,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"modal-dialog\", [], [\"close\", \"hideModal\", \"translucentOverlay\", true], 0, null, [\"loc\", [null, [120, 2], [143, 19]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child4 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 148,\n \"column\": 2\n },\n \"end\": {\n \"line\": 152,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"render\", [\"partials.cached-lists\"], [], [\"loc\", [null, [151, 4], [151, 38]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 147,\n \"column\": 0\n },\n \"end\": {\n \"line\": 153,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"side-drawer\", [], [\"label\", \"Explorer Cached Lists\", \"visible\", [\"subexpr\", \"@mut\", [[\"get\", \"isSideDrawerVisible\", [\"loc\", [null, [150, 10], [150, 29]]]]], [], []]], 0, null, [\"loc\", [null, [148, 2], [152, 18]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 153,\n \"column\": 19\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket-type/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"bucket-types-container\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element8 = dom.childAt(fragment, [2]);\n var morphs = new Array(5);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(element8, 1, 1);\n morphs[2] = dom.createMorphAt(element8, 3, 3);\n morphs[3] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n morphs[4] = dom.createMorphAt(fragment, 6, 6, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.warnings\", [\"loc\", [null, [1, 6], [1, 20]]]]], [], 0, null, [\"loc\", [null, [1, 0], [10, 7]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 1, null, [\"loc\", [null, [13, 2], [38, 33]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 2, null, [\"loc\", [null, [40, 2], [115, 33]]]], [\"block\", \"if\", [[\"get\", \"modalVisible\", [\"loc\", [null, [119, 6], [119, 18]]]]], [], 3, null, [\"loc\", [null, [119, 0], [144, 7]]]], [\"block\", \"ember-wormhole\", [], [\"to\", \"side-drawer-container\"], 4, null, [\"loc\", [null, [147, 0], [153, 19]]]]],\n locals: [],\n templates: [child0, child1, child2, child3, child4]\n };\n })());\n});","define('ember-riak-explorer/pods/bucket/controller', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/side-drawer', 'ember-riak-explorer/mixins/controller/modal'], function (exports, _ember, _emberRiakExplorerMixinsControllerSideDrawer, _emberRiakExplorerMixinsControllerModal) {\n exports['default'] = _ember['default'].Controller.extend(_emberRiakExplorerMixinsControllerSideDrawer['default'], _emberRiakExplorerMixinsControllerModal['default'], {\n pageSize: null,\n\n currentObjects: null,\n\n showCachedListWarning: true\n });\n});","define('ember-riak-explorer/pods/bucket/create/controller', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Controller.extend({\n properties: [],\n\n showSpinner: false,\n\n spinnerMessage: 'loading ...',\n\n errors: [],\n\n clearState: function clearState() {\n this.set('showSpinner', false);\n this.set('properties', []);\n this.set('errors', []);\n }\n });\n});","define('ember-riak-explorer/pods/bucket/create/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/alerts', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state', 'ember-riak-explorer/utils/validations', 'ember-riak-explorer/utils/riak-object-formatter', 'lodash/lodash'], function (exports, _ember, _emberRiakExplorerMixinsRoutesAlerts, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState, _emberRiakExplorerUtilsValidations, _emberRiakExplorerUtilsRiakObjectFormatter, _lodashLodash) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesAlerts['default'], _emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n model: function model(params) {\n var self = this;\n\n return this.explorer.getBucketType(params.clusterName, params.bucketTypeName).then(function (bucketType) {\n // Create both bucket and riak object\n var bucket = self.store.createRecord('bucket', {\n bucketType: bucketType,\n name: ''\n });\n\n var riakObject = self.store.createRecord('riak-object', {\n bucket: bucket,\n type: bucketType.get('dataTypeName')\n });\n\n return bucket;\n });\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n bucketType: model.get('bucketType'),\n crudAction: 'create bucket'\n });\n this.setViewLabel({\n preLabel: 'Create Bucket'\n });\n },\n\n isValidBucket: function isValidBucket(bucket) {\n var bucketName = bucket.get('name');\n\n return _emberRiakExplorerUtilsValidations['default'].hasName('bucket', bucketName) && _emberRiakExplorerUtilsValidations['default'].noWhiteSpaceInName('bucket', bucketName);\n },\n\n isValidObject: function isValidObject(object) {\n var objectType = object.get('type');\n var objectName = object.get('name');\n\n return _emberRiakExplorerUtilsValidations['default'].hasName('buckets object', objectName) && _emberRiakExplorerUtilsValidations['default'].noWhiteSpaceInName('buckets object', objectName) && _emberRiakExplorerUtilsValidations['default'].objectHasCorrectValueType(objectType, objectName, _emberRiakExplorerUtilsValidations['default'].isJsonParseable(object.get('contents')));\n },\n\n isValid: function isValid(bucket, object) {\n var isValid = undefined;\n\n try {\n isValid = this.isValidBucket(bucket) && this.isValidObject(object);\n } catch (e) {\n this.controller.get('errors').pushObject(e.message);\n this.scrollToTop();\n }\n\n return isValid;\n },\n\n bucketsFirstObject: function bucketsFirstObject(bucket) {\n return _lodashLodash['default'].head(bucket.get('objects').toArray());\n },\n\n actions: {\n didTransition: function didTransition() {\n this.controller.set('errors', []);\n this.controller.set('showSpinner', false);\n },\n\n createBucket: function createBucket() {\n var self = this;\n var controller = this.controller;\n var bucket = this.currentModel;\n var riakObject = this.bucketsFirstObject(bucket);\n var clusterName = bucket.get('cluster').get('name');\n var bucketType = bucket.get('bucketType');\n var bucketTypeName = bucketType.get('name');\n var bucketName = bucket.get('name');\n var objectName = riakObject.get('name');\n\n controller.set('errors', []);\n\n if (this.isValid(bucket, riakObject)) {\n var contents = riakObject.set('contents', _emberRiakExplorerUtilsValidations['default'].isJsonParseable(riakObject.get('contents'))); // set contents of the object as the JSON parsed version;\n var serializedData = _emberRiakExplorerUtilsRiakObjectFormatter['default'].formatRiakObject(riakObject.get('type'), contents);\n var createBucket = bucketType.get('isCRDT') ? _lodashLodash['default'].partial(this.explorer.createCRDT, clusterName, bucketTypeName, bucketName, objectName, serializedData) : _lodashLodash['default'].bind(riakObject.save, riakObject);\n\n controller.set('spinnerMessage', 'Creating Bucket-Type ...');\n controller.set('showSpinner', true);\n\n // createBucket()\n createBucket().then(function () {\n return _ember['default'].RSVP.allSettled([self.explorer.refreshBucketList(bucketType), self.explorer.refreshObjectList(bucket)]);\n }).then(function onSuccess() {\n self.transitionTo('bucket', clusterName, bucketTypeName, bucketName);\n }, function onFail() {\n controller.set('showSpinner', false);\n // TODO: Don't use template\n self.render('alerts.error-request-was-not-processed', {\n into: 'application',\n outlet: 'alert'\n });\n });\n }\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/bucket/create/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 5,\n \"column\": 6\n },\n \"end\": {\n \"line\": 7,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/create/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createUnsafeMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"error\", [\"loc\", [null, [6, 12], [6, 23]]]]],\n locals: [\"error\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 9,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"label label-danger\");\n var el3 = dom.createTextNode(\"Errors\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"errors\", [\"loc\", [null, [5, 14], [5, 20]]]]], [], 0, null, [\"loc\", [null, [5, 6], [7, 15]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 10,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"danger\"], 0, null, [\"loc\", [null, [2, 2], [9, 22]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 15,\n \"column\": 6\n },\n \"end\": {\n \"line\": 18,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-close-round\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Cancel\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 13,\n \"column\": 2\n },\n \"end\": {\n \"line\": 20,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link.explorer-resource\", [], [\"resourceType\", \"bucket-type\", \"resourceObj\", [\"subexpr\", \"@mut\", [[\"get\", \"model.bucketType\", [\"loc\", [null, [15, 71], [15, 87]]]]], [], []], \"linkClass\", \"cancel action-button\"], 0, null, [\"loc\", [null, [15, 6], [18, 33]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 22,\n \"column\": 4\n },\n \"end\": {\n \"line\": 24,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"loading-spinner\", [], [\"statusMessage\", [\"subexpr\", \"@mut\", [[\"get\", \"spinnerMessage\", [\"loc\", [null, [23, 38], [23, 52]]]]], [], []]], [\"loc\", [null, [23, 6], [23, 54]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 25,\n \"column\": 6\n },\n \"end\": {\n \"line\": 28,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"form.explorer-input\", [], [\"label\", \"Name\", \"value\", [\"subexpr\", \"@mut\", [[\"get\", \"model.name\", [\"loc\", [null, [26, 49], [26, 59]]]]], [], []]], [\"loc\", [null, [26, 8], [26, 61]]]], [\"inline\", \"form.add-custom-properties\", [], [\"properties\", [\"subexpr\", \"@mut\", [[\"get\", \"properties\", [\"loc\", [null, [27, 48], [27, 58]]]]], [], []]], [\"loc\", [null, [27, 8], [27, 60]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 30,\n \"column\": 6\n },\n \"end\": {\n \"line\": 32,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" In order to be created, a bucket must contain at least one object. Create that first object below.\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 35,\n \"column\": 8\n },\n \"end\": {\n \"line\": 37,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/create/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"new-object-inputs\", [], [\"object\", [\"subexpr\", \"@mut\", [[\"get\", \"object\", [\"loc\", [null, [36, 37], [36, 43]]]]], [], []]], [\"loc\", [null, [36, 10], [36, 45]]]]],\n locals: [\"object\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 34,\n \"column\": 6\n },\n \"end\": {\n \"line\": 38,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"model.objects\", [\"loc\", [null, [35, 16], [35, 29]]]]], [], 0, null, [\"loc\", [null, [35, 8], [37, 17]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 24,\n \"column\": 4\n },\n \"end\": {\n \"line\": 41,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.section\", [], [\"title\", \"Bucket Info\"], 0, null, [\"loc\", [null, [25, 6], [28, 35]]]], [\"block\", \"alert-component\", [], [\"type\", \"info\"], 1, null, [\"loc\", [null, [30, 6], [32, 26]]]], [\"block\", \"dashboard-module.section\", [], [\"title\", \"Object Info\"], 2, null, [\"loc\", [null, [34, 6], [38, 35]]]], [\"inline\", \"form.explorer-button\", [], [\"label\", \"Create Bucket\", \"buttonClick\", \"createBucket\"], [\"loc\", [null, [40, 6], [40, 79]]]]],\n locals: [],\n templates: [child0, child1, child2]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 21,\n \"column\": 2\n },\n \"end\": {\n \"line\": 42,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"showSpinner\", [\"loc\", [null, [22, 10], [22, 21]]]]], [], 0, 1, [\"loc\", [null, [22, 4], [41, 11]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 12,\n \"column\": 0\n },\n \"end\": {\n \"line\": 43,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Create Bucket Form\"], 0, null, [\"loc\", [null, [13, 2], [20, 30]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [21, 2], [42, 28]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 44,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"errors\", [\"loc\", [null, [1, 6], [1, 12]]]]], [], 0, null, [\"loc\", [null, [1, 0], [10, 7]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width bucket-create-container\"], 1, null, [\"loc\", [null, [12, 0], [43, 31]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })());\n});","define('ember-riak-explorer/pods/bucket/model', ['exports', 'ember-data', 'ember-riak-explorer/mixins/models/bucket-props', 'ember-riak-explorer/mixins/models/cached-list-watcher'], function (exports, _emberData, _emberRiakExplorerMixinsModelsBucketProps, _emberRiakExplorerMixinsModelsCachedListWatcher) {\n\n /**\n * Represents a Riak Bucket\n *\n * @class Bucket\n * @extends DS.Model\n * @extends BucketProps\n * @uses BucketType\n * @uses ObjectList\n * @uses Objects\n */\n var Bucket = _emberData['default'].Model.extend(_emberRiakExplorerMixinsModelsBucketProps['default'], _emberRiakExplorerMixinsModelsCachedListWatcher['default'], {\n /**\n * Riak Bucket Type in which this bucket lives.\n *\n * @property bucketType\n * @type BucketType\n * @writeOnce\n */\n bucketType: _emberData['default'].belongsTo('bucket-type'),\n\n /**\n * Contains the results of cached key lists for this bucket,\n * fetched from the API.\n *\n * @property key-list\n * @type objectList\n */\n objectList: _emberData['default'].belongsTo('object-list'),\n\n objects: _emberData['default'].hasMany('riak-object'),\n\n /**\n * Bucket name (unique within a cluster and bucket type)\n *\n * @property name\n * @type String\n */\n name: _emberData['default'].attr('string'),\n\n cluster: (function () {\n return this.get('bucketType').get('cluster');\n }).property('bucketType'),\n\n /**\n * Returns whether or not the 'Delete All Keys in Bucket' button\n * should be displayed to the user.\n * @method allowDelete\n * @return {Boolean}\n */\n allowDelete: (function () {\n return this.get('cluster').get('developmentMode') && this.get('objectList');\n }).property('cluster', 'count')\n });\n\n exports['default'] = Bucket;\n});","define('ember-riak-explorer/pods/bucket/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/polling', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesPolling, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesPolling['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n objectsPaging: {\n size: 10,\n initialLow: 0,\n initialHigh: 9\n },\n\n model: function model(params) {\n return this.explorer.getBucket(params.clusterName, params.bucketTypeName, params.bucketName);\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n bucketType: model.get('bucketType'),\n bucket: model\n });\n this.setViewLabel({\n preLabel: 'Bucket',\n label: model.get('name')\n });\n },\n\n setupController: function setupController(controller, model) {\n var page = this.get('objectsPaging');\n\n this._super(controller, model);\n this.controller.set('pageSize', page.size);\n this.controller.set('currentObjects', this.objectsFromRange(page.initialLow, page.initialHigh));\n },\n\n objectsFromRange: function objectsFromRange(startIndex, endIndex) {\n return this.currentModel.get('objects').filter(function (bucket, index) {\n return index >= startIndex && index <= endIndex;\n });\n },\n\n lookForNewObjectsList: function lookForNewObjectsList() {\n var self = this;\n var bucket = this.currentModel;\n var page = this.get('objectsPaging');\n\n this.explorer.getObjectList(bucket).then(function () {\n return self.explorer.getObjects(bucket);\n }).then(function () {\n self.controller.set('currentObjects', self.objectsFromRange(page.initialLow, page.initialHigh));\n self.stopPolling();\n });\n },\n\n actions: {\n deleteBucket: function deleteBucket(bucket) {\n var clusterName = bucket.get('bucketType').get('cluster').get('name');\n var bucketTypeName = bucket.get('bucketType').get('name');\n var self = this;\n\n bucket.destroyRecord().then(function () {\n self.transitionTo('bucket-type', clusterName, bucketTypeName);\n });\n },\n\n refreshObjectList: function refreshObjectList(bucket) {\n var self = this;\n\n this.controller.set('modalVisible', false);\n this.controller.set('showCachedListWarning', false);\n\n return this.explorer.refreshObjectList(bucket).then(function () {\n self.startPolling(self.lookForNewObjectsList.bind(self));\n });\n },\n\n objectsPageRequest: function objectsPageRequest(lowIndex, highIndex) {\n this.controller.set('currentObjects', this.objectsFromRange(lowIndex, highIndex));\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/bucket/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 5,\n \"column\": 6\n },\n \"end\": {\n \"line\": 7,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"warning\", [\"loc\", [null, [6, 12], [6, 23]]]]],\n locals: [\"warning\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 9,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"h4\");\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"label label-warning\");\n var el4 = dom.createTextNode(\"WARNINGS\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 3, 3);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"model.warnings\", [\"loc\", [null, [5, 14], [5, 28]]]]], [], 0, null, [\"loc\", [null, [5, 6], [7, 15]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 10,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"warning\"], 0, null, [\"loc\", [null, [2, 2], [9, 22]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 16,\n \"column\": 8\n },\n \"end\": {\n \"line\": 21,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"button\");\n dom.setAttribute(el1, \"type\", \"button\");\n dom.setAttribute(el1, \"class\", \"action-button delete\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"ion-ios-trash\");\n dom.setAttribute(el2, \"aria-hidden\", \"true\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n Delete Bucket\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element8 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element8);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"deleteBucket\", [\"get\", \"model\", [\"loc\", [null, [17, 85], [17, 90]]]]], [], [\"loc\", [null, [17, 61], [17, 92]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 14,\n \"column\": 4\n },\n \"end\": {\n \"line\": 23,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.allowDelete\", [\"loc\", [null, [16, 14], [16, 31]]]]], [], 0, null, [\"loc\", [null, [16, 8], [21, 15]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 28,\n \"column\": 10\n },\n \"end\": {\n \"line\": 28,\n \"column\": 34\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"Overview\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 29,\n \"column\": 10\n },\n \"end\": {\n \"line\": 29,\n \"column\": 45\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"Advanced Properties\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 27,\n \"column\": 8\n },\n \"end\": {\n \"line\": 30,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n return morphs;\n },\n statements: [[\"block\", \"tablist.tab\", [], [], 0, null, [\"loc\", [null, [28, 10], [28, 50]]]], [\"block\", \"tablist.tab\", [], [], 1, null, [\"loc\", [null, [29, 10], [29, 61]]]]],\n locals: [\"tablist\"],\n templates: [child0, child1]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 32,\n \"column\": 8\n },\n \"end\": {\n \"line\": 34,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"table.bucket-props-overview\", [], [\"model\", [\"subexpr\", \"@mut\", [[\"get\", \"model\", [\"loc\", [null, [33, 46], [33, 51]]]]], [], []]], [\"loc\", [null, [33, 10], [33, 53]]]]],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 36,\n \"column\": 8\n },\n \"end\": {\n \"line\": 38,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"table.bucket-props-advanced\", [], [\"model\", [\"subexpr\", \"@mut\", [[\"get\", \"model\", [\"loc\", [null, [37, 46], [37, 51]]]]], [], []]], [\"loc\", [null, [37, 10], [37, 53]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 26,\n \"column\": 6\n },\n \"end\": {\n \"line\": 39,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"tabs.tablist\", [], [], 0, null, [\"loc\", [null, [27, 8], [30, 25]]]], [\"block\", \"tabs.tabpanel\", [], [], 1, null, [\"loc\", [null, [32, 8], [34, 26]]]], [\"block\", \"tabs.tabpanel\", [], [], 2, null, [\"loc\", [null, [36, 8], [38, 26]]]]],\n locals: [\"tabs\"],\n templates: [child0, child1, child2]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 25,\n \"column\": 4\n },\n \"end\": {\n \"line\": 40,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"ivy-tabs\", [], [\"on-select\", [\"subexpr\", \"action\", [[\"subexpr\", \"mut\", [[\"get\", \"selectedIndex\", [\"loc\", [null, [26, 41], [26, 54]]]]], [], [\"loc\", [null, [26, 36], [26, 55]]]]], [], [\"loc\", [null, [26, 28], [26, 56]]]], \"selected-index\", [\"subexpr\", \"@mut\", [[\"get\", \"selectedIndex\", [\"loc\", [null, [26, 72], [26, 85]]]]], [], []]], 0, null, [\"loc\", [null, [26, 6], [39, 19]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 13,\n \"column\": 2\n },\n \"end\": {\n \"line\": 41,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Bucket Properties\"], 0, null, [\"loc\", [null, [14, 4], [23, 32]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [25, 4], [40, 30]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 46,\n \"column\": 8\n },\n \"end\": {\n \"line\": 49,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-plus-circled\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Create New Object\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 51,\n \"column\": 8\n },\n \"end\": {\n \"line\": 56,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"button\");\n dom.setAttribute(el1, \"type\", \"button\");\n dom.setAttribute(el1, \"class\", \"action-button refresh\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"ion-refresh\");\n dom.setAttribute(el2, \"aria-hidden\", \"true\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n Refresh Object List Cache\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element6 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element6);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"showModal\"], [], [\"loc\", [null, [52, 62], [52, 84]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 44,\n \"column\": 4\n },\n \"end\": {\n \"line\": 58,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element7 = dom.childAt(fragment, [1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(element7, 1, 1);\n morphs[1] = dom.createMorphAt(element7, 3, 3);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"riak-object.create\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [46, 40], [46, 58]]]], [\"get\", \"model.bucketType.name\", [\"loc\", [null, [46, 59], [46, 80]]]], [\"get\", \"model.name\", [\"loc\", [null, [46, 81], [46, 91]]]]], [\"class\", \"action-button create\"], 0, null, [\"loc\", [null, [46, 8], [49, 20]]]], [\"block\", \"if\", [[\"get\", \"model.cluster.developmentMode\", [\"loc\", [null, [51, 14], [51, 43]]]]], [], 1, null, [\"loc\", [null, [51, 8], [56, 15]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 60,\n \"column\": 6\n },\n \"end\": {\n \"line\": 62,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" No cache list exists\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 62,\n \"column\": 6\n },\n \"end\": {\n \"line\": 64,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"loading-spinner\", [], [\"statusMessage\", [\"subexpr\", \"@mut\", [[\"get\", \"model.statusMessage\", [\"loc\", [null, [63, 40], [63, 59]]]]], [], []]], [\"loc\", [null, [63, 8], [63, 61]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 69,\n \"column\": 12\n },\n \"end\": {\n \"line\": 71,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"more-info\");\n var el2 = dom.createTextNode(\"Hide info on explorer cached lists\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element4 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element4);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"hideSideDrawer\"], [], [\"loc\", [null, [70, 38], [70, 65]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 71,\n \"column\": 12\n },\n \"end\": {\n \"line\": 73,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"more-info\");\n var el2 = dom.createTextNode(\"More info on explorer cached lists\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element3 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element3);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"showSideDrawer\"], [], [\"loc\", [null, [72, 38], [72, 65]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 66,\n \"column\": 10\n },\n \"end\": {\n \"line\": 74,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" Objects are read from a cached list and may not represent the current state of the bucket type.\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"br\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"isSideDrawerVisible\", [\"loc\", [null, [69, 18], [69, 37]]]]], [], 0, 1, [\"loc\", [null, [69, 12], [73, 19]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 65,\n \"column\": 8\n },\n \"end\": {\n \"line\": 75,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [], 0, null, [\"loc\", [null, [66, 10], [74, 30]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 84,\n \"column\": 10\n },\n \"end\": {\n \"line\": 89,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"Total Objects\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 3]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"model.objects.length\", [\"loc\", [null, [87, 32], [87, 56]]]]],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 102,\n \"column\": 24\n },\n \"end\": {\n \"line\": 108,\n \"column\": 24\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"object.name\", [\"loc\", [null, [107, 26], [107, 41]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 100,\n \"column\": 20\n },\n \"end\": {\n \"line\": 110,\n \"column\": 20\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [[\"get\", \"object.routePath\", [\"loc\", [null, [102, 35], [102, 51]]]], [\"get\", \"object.bucket.bucketType.cluster.name\", [\"loc\", [null, [103, 24], [103, 61]]]], [\"get\", \"object.bucket.bucketType.name\", [\"loc\", [null, [104, 24], [104, 53]]]], [\"get\", \"object.bucket.name\", [\"loc\", [null, [105, 24], [105, 42]]]], [\"get\", \"object.name\", [\"loc\", [null, [106, 24], [106, 35]]]]], [], 0, null, [\"loc\", [null, [102, 24], [108, 36]]]]],\n locals: [\"object\"],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 95,\n \"column\": 16\n },\n \"end\": {\n \"line\": 112,\n \"column\": 16\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n dom.setAttribute(el1, \"class\", \"button-list\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"currentObjects\", [\"loc\", [null, [100, 28], [100, 42]]]]], [], 0, null, [\"loc\", [null, [100, 20], [110, 29]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 94,\n \"column\": 14\n },\n \"end\": {\n \"line\": 113,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"pagination-component\", [], [\"chunkSize\", [\"subexpr\", \"@mut\", [[\"get\", \"pageSize\", [\"loc\", [null, [96, 26], [96, 34]]]]], [], []], \"totalSize\", [\"subexpr\", \"@mut\", [[\"get\", \"model.objects.length\", [\"loc\", [null, [97, 26], [97, 46]]]]], [], []], \"sectionRequest\", \"objectsPageRequest\"], 0, null, [\"loc\", [null, [95, 16], [112, 41]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child3 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 113,\n \"column\": 14\n },\n \"end\": {\n \"line\": 115,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" No objects found in bucket\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 64,\n \"column\": 6\n },\n \"end\": {\n \"line\": 120,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"table\");\n dom.setAttribute(el1, \"class\", \"key-value-table\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tbody\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"Cached List Created\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value\");\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"Objects\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value\");\n var el5 = dom.createTextNode(\"\\n\");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\" \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element5 = dom.childAt(fragment, [2, 1]);\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(dom.childAt(element5, [1, 3]), 0, 0);\n morphs[2] = dom.createMorphAt(element5, 3, 3);\n morphs[3] = dom.createMorphAt(dom.childAt(element5, [5, 3]), 1, 1);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"showCachedListWarning\", [\"loc\", [null, [65, 14], [65, 35]]]]], [], 0, null, [\"loc\", [null, [65, 8], [75, 15]]]], [\"content\", \"model.objectList.created\", [\"loc\", [null, [81, 30], [81, 58]]]], [\"block\", \"if\", [[\"get\", \"model.objects.length\", [\"loc\", [null, [84, 16], [84, 36]]]]], [], 1, null, [\"loc\", [null, [84, 10], [89, 17]]]], [\"block\", \"if\", [[\"get\", \"model.objects.length\", [\"loc\", [null, [94, 20], [94, 40]]]]], [], 2, 3, [\"loc\", [null, [94, 14], [115, 21]]]]],\n locals: [],\n templates: [child0, child1, child2, child3]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 62,\n \"column\": 6\n },\n \"end\": {\n \"line\": 120,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"and\", [[\"get\", \"model.hasListBeenRequested\", [\"loc\", [null, [62, 21], [62, 47]]]], [\"subexpr\", \"not\", [[\"get\", \"model.isListLoaded\", [\"loc\", [null, [62, 53], [62, 71]]]]], [], [\"loc\", [null, [62, 48], [62, 72]]]]], [], [\"loc\", [null, [62, 16], [62, 73]]]]], [], 0, 1, [\"loc\", [null, [62, 6], [120, 6]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 59,\n \"column\": 4\n },\n \"end\": {\n \"line\": 121,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"and\", [[\"subexpr\", \"not\", [[\"get\", \"model.hasListBeenRequested\", [\"loc\", [null, [60, 22], [60, 48]]]]], [], [\"loc\", [null, [60, 17], [60, 49]]]], [\"subexpr\", \"not\", [[\"get\", \"model.isListLoaded\", [\"loc\", [null, [60, 55], [60, 73]]]]], [], [\"loc\", [null, [60, 50], [60, 74]]]]], [], [\"loc\", [null, [60, 12], [60, 75]]]]], [], 0, 1, [\"loc\", [null, [60, 6], [120, 13]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 43,\n \"column\": 2\n },\n \"end\": {\n \"line\": 122,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Objects\"], 0, null, [\"loc\", [null, [44, 4], [58, 32]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [59, 4], [121, 30]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child3 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 128,\n \"column\": 2\n },\n \"end\": {\n \"line\": 151,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"modal-content-container\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"header\");\n dom.setAttribute(el2, \"class\", \"modal-header\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"h3\");\n var el4 = dom.createElement(\"span\");\n dom.setAttribute(el4, \"class\", \"label label-danger\");\n var el5 = dom.createElement(\"i\");\n dom.setAttribute(el5, \"class\", \"ion-alert-circled\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\" Potentially Dangerous Operation\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"section\");\n dom.setAttribute(el2, \"class\", \"modal-body\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"p\");\n var el4 = dom.createTextNode(\"Creating a new cache list requires making a streaming call, with multiple response messages sent for each\\n request.\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"p\");\n var el4 = dom.createTextNode(\"This can be an expensive operation, and is not recommended if the node is in active use. To\\n continue please click the confirm button.\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"footer\");\n dom.setAttribute(el2, \"class\", \"modal-footer\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"button\");\n dom.setAttribute(el3, \"class\", \"btn btn-default\");\n var el4 = dom.createTextNode(\"Cancel\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"button\");\n dom.setAttribute(el3, \"class\", \"btn btn-primary\");\n var el4 = dom.createTextNode(\"Confirm\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1, 5]);\n var element1 = dom.childAt(element0, [1]);\n var element2 = dom.childAt(element0, [3]);\n var morphs = new Array(2);\n morphs[0] = dom.createElementMorph(element1);\n morphs[1] = dom.createElementMorph(element2);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"hideModal\"], [], [\"loc\", [null, [147, 40], [147, 62]]]], [\"element\", \"action\", [\"refreshObjectList\", [\"get\", \"model\", [\"loc\", [null, [148, 69], [148, 74]]]]], [], [\"loc\", [null, [148, 40], [148, 76]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 127,\n \"column\": 0\n },\n \"end\": {\n \"line\": 152,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"modal-dialog\", [], [\"close\", \"hideModal\", \"translucentOverlay\", true], 0, null, [\"loc\", [null, [128, 2], [151, 19]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child4 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 156,\n \"column\": 2\n },\n \"end\": {\n \"line\": 160,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"render\", [\"partials.cached-lists\"], [], [\"loc\", [null, [159, 4], [159, 38]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 155,\n \"column\": 0\n },\n \"end\": {\n \"line\": 161,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"side-drawer\", [], [\"label\", \"Explorer Cached Lists\", \"visible\", [\"subexpr\", \"@mut\", [[\"get\", \"isSideDrawerVisible\", [\"loc\", [null, [158, 10], [158, 29]]]]], [], []]], 0, null, [\"loc\", [null, [156, 2], [160, 18]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 161,\n \"column\": 19\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/bucket/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"bucket-types-container\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element9 = dom.childAt(fragment, [2]);\n var morphs = new Array(5);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(element9, 1, 1);\n morphs[2] = dom.createMorphAt(element9, 3, 3);\n morphs[3] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n morphs[4] = dom.createMorphAt(fragment, 6, 6, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.warnings\", [\"loc\", [null, [1, 6], [1, 20]]]]], [], 0, null, [\"loc\", [null, [1, 0], [10, 7]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 1, null, [\"loc\", [null, [13, 2], [41, 33]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 2, null, [\"loc\", [null, [43, 2], [122, 33]]]], [\"block\", \"if\", [[\"get\", \"modalVisible\", [\"loc\", [null, [127, 6], [127, 18]]]]], [], 3, null, [\"loc\", [null, [127, 0], [152, 7]]]], [\"block\", \"ember-wormhole\", [], [\"to\", \"side-drawer-container\"], 4, null, [\"loc\", [null, [155, 0], [161, 19]]]]],\n locals: [],\n templates: [child0, child1, child2, child3, child4]\n };\n })());\n});","define('ember-riak-explorer/pods/cluster/controller', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Controller.extend({\n pageSize: null,\n\n currentPageTables: null,\n\n currentPageActiveBucketTypes: null,\n\n currentPageInactiveBucketTypes: null,\n\n currentPageIndexes: null\n });\n});","define('ember-riak-explorer/pods/cluster/data/route', ['exports', 'ember-riak-explorer/pods/cluster/route'], function (exports, _emberRiakExplorerPodsClusterRoute) {\n exports['default'] = _emberRiakExplorerPodsClusterRoute['default'].extend({\n afterModel: function afterModel(model, transition) {\n this._super(model, transition);\n this.setViewLabel({\n preLabel: 'Cluster Data',\n label: model.get('name')\n });\n }\n });\n});","define(\"ember-riak-explorer/pods/cluster/data/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 15,\n \"column\": 12\n },\n \"end\": {\n \"line\": 17,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" On\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 17,\n \"column\": 12\n },\n \"end\": {\n \"line\": 19,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" Off\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 4,\n \"column\": 4\n },\n \"end\": {\n \"line\": 33,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"table\");\n dom.setAttribute(el1, \"class\", \"key-value-table\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tbody\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"Status\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value\");\n var el5 = dom.createElement(\"span\");\n var el6 = dom.createComment(\"\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"Development Mode\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value\");\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"\\n\");\n dom.appendChild(el5, el6);\n var el6 = dom.createComment(\"\");\n dom.appendChild(el5, el6);\n var el6 = dom.createTextNode(\" \");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"Edition Type\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value\");\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"\\n \");\n dom.appendChild(el5, el6);\n var el6 = dom.createComment(\"\");\n dom.appendChild(el5, el6);\n var el6 = dom.createTextNode(\"\\n \");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1, 1]);\n var element1 = dom.childAt(element0, [1, 3, 0]);\n var morphs = new Array(4);\n morphs[0] = dom.createAttrMorph(element1, 'class');\n morphs[1] = dom.createMorphAt(element1, 0, 0);\n morphs[2] = dom.createMorphAt(dom.childAt(element0, [3, 3, 1]), 1, 1);\n morphs[3] = dom.createMorphAt(dom.childAt(element0, [5, 3, 1]), 1, 1);\n return morphs;\n },\n statements: [[\"attribute\", \"class\", [\"concat\", [\"cluster-status cluster-status-label \", [\"get\", \"model.status\", [\"loc\", [null, [9, 77], [9, 89]]]]]]], [\"content\", \"model.status\", [\"loc\", [null, [9, 93], [9, 109]]]], [\"block\", \"if\", [[\"get\", \"model.developmentMode\", [\"loc\", [null, [15, 18], [15, 39]]]]], [], 0, 1, [\"loc\", [null, [15, 12], [19, 19]]]], [\"content\", \"model.riakTypeLong\", [\"loc\", [null, [27, 12], [27, 34]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 34,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"inline\", \"dashboard-module.header\", [], [\"label\", \"Cluster Properties\"], [\"loc\", [null, [3, 4], [3, 58]]]], [\"block\", \"dashboard-module.body\", [], [], 0, null, [\"loc\", [null, [4, 4], [33, 30]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 40,\n \"column\": 10\n },\n \"end\": {\n \"line\": 43,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-plus-circled\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Create New Table\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 38,\n \"column\": 6\n },\n \"end\": {\n \"line\": 45,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"table.create\", [\"get\", \"model.name\", [\"loc\", [null, [40, 36], [40, 46]]]]], [\"class\", \"action-button create\"], 0, null, [\"loc\", [null, [40, 10], [43, 22]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 48,\n \"column\": 10\n },\n \"end\": {\n \"line\": 53,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"table.ts-tables\", [], [\"tables\", [\"subexpr\", \"@mut\", [[\"get\", \"currentPageTables\", [\"loc\", [null, [52, 37], [52, 54]]]]], [], []]], [\"loc\", [null, [52, 12], [52, 56]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 47,\n \"column\": 8\n },\n \"end\": {\n \"line\": 54,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"pagination-component\", [], [\"chunkSize\", [\"subexpr\", \"@mut\", [[\"get\", \"pageSize\", [\"loc\", [null, [49, 20], [49, 28]]]]], [], []], \"totalSize\", [\"subexpr\", \"@mut\", [[\"get\", \"model.tables.length\", [\"loc\", [null, [50, 20], [50, 39]]]]], [], []], \"sectionRequest\", \"tablePageRequest\"], 0, null, [\"loc\", [null, [48, 10], [53, 35]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 54,\n \"column\": 8\n },\n \"end\": {\n \"line\": 56,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"No Time Series tables have been created on this cluster\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 46,\n \"column\": 6\n },\n \"end\": {\n \"line\": 57,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.tables\", [\"loc\", [null, [47, 14], [47, 26]]]]], [], 0, 1, [\"loc\", [null, [47, 8], [56, 15]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 37,\n \"column\": 4\n },\n \"end\": {\n \"line\": 58,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"TS Tables\"], 0, null, [\"loc\", [null, [38, 6], [45, 34]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [46, 6], [57, 32]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 36,\n \"column\": 2\n },\n \"end\": {\n \"line\": 59,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 0, null, [\"loc\", [null, [37, 4], [58, 35]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 64,\n \"column\": 8\n },\n \"end\": {\n \"line\": 67,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-plus-circled\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Create New Bucket Type\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 62,\n \"column\": 4\n },\n \"end\": {\n \"line\": 69,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"bucket-type.create\", [\"get\", \"model.name\", [\"loc\", [null, [64, 40], [64, 50]]]]], [\"class\", \"action-button create\"], 0, null, [\"loc\", [null, [64, 8], [67, 20]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 73,\n \"column\": 12\n },\n \"end\": {\n \"line\": 73,\n \"column\": 47\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"Active Bucket Types\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 74,\n \"column\": 12\n },\n \"end\": {\n \"line\": 74,\n \"column\": 49\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"Inactive Bucket Types\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 72,\n \"column\": 10\n },\n \"end\": {\n \"line\": 75,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n return morphs;\n },\n statements: [[\"block\", \"tablist.tab\", [], [], 0, null, [\"loc\", [null, [73, 12], [73, 63]]]], [\"block\", \"tablist.tab\", [], [], 1, null, [\"loc\", [null, [74, 12], [74, 65]]]]],\n locals: [\"tablist\"],\n templates: [child0, child1]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 79,\n \"column\": 14\n },\n \"end\": {\n \"line\": 84,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"table.bucket-types\", [], [\"bucketTypes\", [\"subexpr\", \"@mut\", [[\"get\", \"currentPageActiveBucketTypes\", [\"loc\", [null, [83, 49], [83, 77]]]]], [], []]], [\"loc\", [null, [83, 16], [83, 79]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 78,\n \"column\": 12\n },\n \"end\": {\n \"line\": 85,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"pagination-component\", [], [\"chunkSize\", [\"subexpr\", \"@mut\", [[\"get\", \"pageSize\", [\"loc\", [null, [80, 24], [80, 32]]]]], [], []], \"totalSize\", [\"subexpr\", \"@mut\", [[\"get\", \"model.activeBucketTypes.length\", [\"loc\", [null, [81, 24], [81, 54]]]]], [], []], \"sectionRequest\", \"activeBucketTypesPageRequest\"], 0, null, [\"loc\", [null, [79, 14], [84, 39]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 85,\n \"column\": 12\n },\n \"end\": {\n \"line\": 87,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"No bucket types have been activated\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 77,\n \"column\": 10\n },\n \"end\": {\n \"line\": 88,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.activeBucketTypes\", [\"loc\", [null, [78, 18], [78, 41]]]]], [], 0, 1, [\"loc\", [null, [78, 12], [87, 19]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 92,\n \"column\": 14\n },\n \"end\": {\n \"line\": 97,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"table.bucket-types\", [], [\"bucketTypes\", [\"subexpr\", \"@mut\", [[\"get\", \"currentPageInactiveBucketTypes\", [\"loc\", [null, [96, 49], [96, 79]]]]], [], []]], [\"loc\", [null, [96, 16], [96, 81]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 91,\n \"column\": 12\n },\n \"end\": {\n \"line\": 98,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"pagination-component\", [], [\"chunkSize\", [\"subexpr\", \"@mut\", [[\"get\", \"pageSize\", [\"loc\", [null, [93, 24], [93, 32]]]]], [], []], \"totalSize\", [\"subexpr\", \"@mut\", [[\"get\", \"model.inactiveBucketTypes.length\", [\"loc\", [null, [94, 24], [94, 56]]]]], [], []], \"sectionRequest\", \"inactiveBucketTypesPageRequest\"], 0, null, [\"loc\", [null, [92, 14], [97, 39]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 98,\n \"column\": 12\n },\n \"end\": {\n \"line\": 100,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"No inactive buckets\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 90,\n \"column\": 10\n },\n \"end\": {\n \"line\": 101,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.inactiveBucketTypes\", [\"loc\", [null, [91, 18], [91, 43]]]]], [], 0, 1, [\"loc\", [null, [91, 12], [100, 19]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 71,\n \"column\": 6\n },\n \"end\": {\n \"line\": 102,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"tabs.tablist\", [], [], 0, null, [\"loc\", [null, [72, 10], [75, 27]]]], [\"block\", \"tabs.tabpanel\", [], [], 1, null, [\"loc\", [null, [77, 10], [88, 28]]]], [\"block\", \"tabs.tabpanel\", [], [], 2, null, [\"loc\", [null, [90, 10], [101, 28]]]]],\n locals: [\"tabs\"],\n templates: [child0, child1, child2]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 70,\n \"column\": 4\n },\n \"end\": {\n \"line\": 103,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"ivy-tabs\", [], [\"on-select\", [\"subexpr\", \"action\", [[\"subexpr\", \"mut\", [[\"get\", \"selectedIndex\", [\"loc\", [null, [71, 41], [71, 54]]]]], [], [\"loc\", [null, [71, 36], [71, 55]]]]], [], [\"loc\", [null, [71, 28], [71, 56]]]], \"selected-index\", [\"subexpr\", \"@mut\", [[\"get\", \"selectedIndex\", [\"loc\", [null, [71, 72], [71, 85]]]]], [], []]], 0, null, [\"loc\", [null, [71, 6], [102, 19]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 61,\n \"column\": 2\n },\n \"end\": {\n \"line\": 104,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"KV Bucket Types\"], 0, null, [\"loc\", [null, [62, 4], [69, 32]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [70, 4], [103, 30]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"triple-curlies\"\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 108,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/data/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"cluster-information-container\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element2 = dom.childAt(fragment, [0]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(element2, 1, 1);\n morphs[1] = dom.createMorphAt(element2, 3, 3);\n morphs[2] = dom.createMorphAt(element2, 5, 5);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 0, null, [\"loc\", [null, [2, 2], [34, 33]]]], [\"block\", \"if\", [[\"get\", \"model.isTimeSeries\", [\"loc\", [null, [36, 8], [36, 26]]]]], [], 1, null, [\"loc\", [null, [36, 2], [59, 9]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 2, null, [\"loc\", [null, [61, 2], [104, 33]]]]],\n locals: [],\n templates: [child0, child1, child2]\n };\n })());\n});","define('ember-riak-explorer/pods/cluster/model', ['exports', 'ember-data', 'ember-riak-explorer/config/environment'], function (exports, _emberData, _emberRiakExplorerConfigEnvironment) {\n\n /**\n * Represents a Riak cluster as a whole.\n *\n * @class Cluster\n * @extends DS.Model\n * @constructor\n * @uses BucketType\n */\n var Cluster = _emberData['default'].Model.extend({\n /**\n * Bucket types created on the cluster\n * @property bucketTypes\n * @type Array\n */\n bucketTypes: _emberData['default'].hasMany('bucket-type'),\n\n /**\n * Riak nodes assigned to the cluster\n * @property nodes\n * @type Array\n */\n nodes: _emberData['default'].hasMany('node'),\n\n /**\n * Search indexes created on the cluster\n * @property searchIndexes\n * @type Array\n */\n searchIndexes: _emberData['default'].hasMany('search-index'),\n\n /**\n * Search schemas created on the cluster\n * @property searchSchemas\n * @type Array\n */\n searchSchemas: _emberData['default'].hasMany('search-schema'),\n\n /**\n * TS tables created on the cluster\n * @property tables\n * @type Array\n */\n tables: _emberData['default'].hasMany('table'),\n\n /**\n * Is this cluster in Dev Mode? Set in the Explorer config file.\n * Dev mode allows expensive operations like list keys, delete bucket, etc.\n * @property developmentMode\n * @type Boolean\n * @default false\n */\n developmentMode: _emberData['default'].attr('boolean', { defaultValue: false }),\n\n /**\n * The Riak Type: either kv_oss, kv_ee, ts_oss, ts_ee, or unavailable\n * @property riakType\n * @type String\n */\n riakType: _emberData['default'].attr('string', { defaultValue: 'kv_oss' }),\n\n riakTypeLong: _emberData['default'].attr('string', { defaultValue: 'KV Open Source' }),\n\n /**\n * Riak Version\n * @property riakVersion\n * @type String\n */\n riakVersion: _emberData['default'].attr('string'),\n\n /**\n * Returns a list of currently activated bucket types.\n *\n * @method activeBucketTypes\n * @return {Array}\n */\n activeBucketTypes: (function () {\n return this.get('bucketTypes').filterBy('isActive');\n }).property('bucketTypes'),\n\n /**\n * Boolean check to see if the cluster has a Riak version number associated with it\n *\n * @method hasVersion\n * @returns Boolean\n */\n hasVersion: (function () {\n return this.get('riakVersion') && this.get('riakVersion') !== \"unavailable\";\n }).property('riakVersion'),\n\n /**\n * Boolean check to see if the cluster has a Riak type associated with it\n *\n * @method hasType\n * @returns Boolean\n */\n hasType: (function () {\n var type = this.get('riakType');\n\n return type && type !== \"unavailable\";\n }).property('riakType'),\n\n /**\n * Returns a list of un-activated bucket types.\n *\n * @method inactiveBucketTypes\n * @return {Array}\n */\n inactiveBucketTypes: (function () {\n return this.get('bucketTypes').filterBy('isInactive');\n }).property('bucketTypes'),\n\n isTimeSeries: (function () {\n var type = this.get('riakType');\n\n return type === 'ts_oss' || type === 'ts_ee';\n }).property('riakType'),\n\n /**\n * Boolean test on if the riakType is the open source edition\n *\n * @method isOpenSourceEdition\n * @return Boolean\n */\n isOpenSourceEdition: (function () {\n var type = this.get('riakType');\n\n return type === 'kv_oss' || type === 'ts_oss';\n }).property('riakType'),\n\n /**\n * Boolean test on if the riakType is the enterprise edition\n *\n * @method isEnterpriseEdition\n * @return Boolean\n */\n isEnterpriseEdition: (function () {\n var type = this.get('riakType');\n\n return type === 'kv_ee' || type === 'ts_ee';\n }).property('riakType'),\n\n /**\n * Returns the name of the cluster\n * (As specified in the `riak_explorer.conf` file)\n * Note: Currently unrelated to the source/datacenter name used by MDC Repl\n * @method clusterId\n * @type String\n */\n name: (function () {\n return this.get('id');\n }).property('id'),\n\n /**\n * Returns true if this cluster is in production mode (development_mode=off)\n * @method productionMode\n * @type Boolean\n */\n productionMode: (function () {\n return !this.get('developmentMode');\n }).property('developmentMode'),\n\n /**\n * Returns the URL which Explorer uses to forward requests to the cluster.\n * Used to link to Search schemas, on the Cluster view.\n * Having the config and url here is hacky, but no good alternatives.\n * @method proxyUrl\n * @return {String} URL\n */\n proxyUrl: (function () {\n return 'riak/clusters/' + this.get('name');\n }).property('name'),\n\n /**\n * Calculates cluster status based on node health. If all child nodes are valid and\n * available, status is \"ok\". If some child nodes are unavailable or invalid, status is\n * \"warning\". If all child nodes are unavailable or invalid, status is \"down\".\n *\n * @method status\n * @return {String} Status\n */\n status: (function () {\n var nodes = this.get('nodes');\n var totalNodes = nodes.get('length');\n var totalHealthyNodes = 0;\n var totalUnhealthyNodes = 0;\n var status = null;\n\n // Calculate how many nodes are healthy/unhealthy\n nodes.forEach(function (node) {\n if (node.get('isHealthy')) {\n totalHealthyNodes++;\n } else {\n totalUnhealthyNodes++;\n }\n });\n\n if (totalUnhealthyNodes === totalNodes || totalNodes < 1) {\n status = 'down';\n } else if (totalHealthyNodes === totalNodes) {\n status = 'ok';\n } else {\n status = 'warning';\n }\n\n return status;\n }).property('nodes.@each.isHealthy'),\n\n supportsHyperLogLogs: (function () {\n var currentVersion = parseFloat(this.get('riakVersion'));\n\n return currentVersion >= 2.2;\n }).property('riakVersion'),\n\n warnings: (function () {\n var warnings = {};\n\n if (this.get('productionMode') && this.get('nodes').get('length') < 5) {\n warnings.insufficientNodes = \"For production deployments we recommend using no fewer than 5 nodes, as node \" + \"failures in smaller clusters can compromise the fault-tolerance of the system.\";\n }\n\n return warnings;\n }).property('productionMode', 'nodes')\n });\n\n exports['default'] = Cluster;\n});","define('ember-riak-explorer/pods/cluster/ops/controller', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/modal'], function (exports, _ember, _emberRiakExplorerMixinsControllerModal) {\n exports['default'] = _ember['default'].Controller.extend(_emberRiakExplorerMixinsControllerModal['default'], {\n // MDC\n replActionModalVisible: false,\n\n availableReplActions: ['Cluster Stats', 'Cluster Manager', 'Fullsync Start', 'Fullsync Stop', 'Fullsync Coordinate', 'Realtime Start', 'Realtime Stop', 'Realtime Stats', 'Replication Connections', 'Replication Clustername'],\n\n currentlySelectedAction: '',\n\n currentReplOutput: '',\n\n // Monitoring\n newGraphModalVisible: false,\n\n currentGraphs: [],\n\n availableGraphs: [],\n\n actions: {\n // MDC\n showReplActionModal: function showReplActionModal() {\n this.set('replActionModalVisible', true);\n this.send('showModal');\n },\n\n hideReplActionModal: function hideReplActionModal() {\n this.set('replActionModalVisible', false);\n this.send('hideModal');\n },\n\n cancelReplAction: function cancelReplAction() {\n this.set('currentlySelectedAction', '');\n this.set('currentReplOutput', '');\n this.send('hideReplActionModal');\n },\n\n confirmReplAction: function confirmReplAction() {\n this.send('hideReplActionModal');\n this.send('getReplicationOutput', this.get('currentlySelectedAction'));\n },\n\n warnReplAction: function warnReplAction(action) {\n this.set('currentlySelectedAction', action);\n this.set('currentReplOutput', '');\n this.send('showReplActionModal');\n },\n\n // Monitoring\n showNewGraphModal: function showNewGraphModal() {\n this.set('newGraphModalVisible', true);\n this.send('showModal');\n },\n\n hideNewGraphModal: function hideNewGraphModal() {\n this.set('newGraphModalVisible', false);\n this.send('hideModal');\n },\n\n updateGraphName: function updateGraphName(graph, newStat) {\n return this.set('currentGraphs', this.get('currentGraphs').map(function (graphName) {\n return graphName === graph ? newStat : graphName;\n }));\n },\n\n addNewGraph: function addNewGraph(graph) {\n this.get('currentGraphs').pushObject(graph);\n this.send('hideNewGraphModal');\n },\n\n removeGraph: function removeGraph(graph) {\n this.set('currentGraphs', this.get('currentGraphs').filter(function (graphName) {\n return graphName !== graph;\n }));\n }\n }\n });\n});","define('ember-riak-explorer/pods/cluster/ops/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/monitoring', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state', 'lodash/lodash'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesMonitoring, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState, _lodashLodash) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesMonitoring['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n model: function model(params) {\n var self = this;\n\n return this.explorer.getCluster(params.clusterName).then(function (cluster) {\n return _ember['default'].RSVP.allSettled([cluster, self.explorer.getNodesStats(cluster)]);\n }).then(function (PromiseArray) {\n var cluster = PromiseArray[0].value;\n\n return cluster;\n });\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model);\n this.setBreadCrumbs(null);\n this.setViewLabel({\n preLabel: 'Cluster Ops',\n label: model.get('name')\n });\n this.simulateLoad();\n },\n\n setupController: function setupController(controller, model) {\n this._super(controller, model);\n\n if (model.get('nodes').get('length')) {\n var firstNode = _lodashLodash['default'].head(model.get('nodes').toArray());\n\n this.setPossibleGraphOptions(firstNode.get('stats'));\n this.setDefaultGraph();\n }\n },\n\n actions: {\n // TODO: Move this logic elsewhere\n getReplicationOutput: function getReplicationOutput(action) {\n var controller = this.controller;\n var cluster = this.currentModel;\n var slug = undefined;\n var url = undefined;\n\n // Map action to api slug\n switch (action) {\n case 'Cluster Stats':\n slug = 'repl-clusterstats';\n break;\n case 'Cluster Manager':\n slug = 'repl-clusterstats-cluster_mgr';\n break;\n case 'Fullsync Start':\n slug = 'repl-fullsync-start';\n break;\n case 'Fullsync Stop':\n slug = 'repl-fullsync-stop';\n break;\n case 'Fullsync Coordinate':\n slug = 'repl-clusterstats-fs_coordinate';\n break;\n case 'Realtime Start':\n slug = 'repl-realtime-start';\n break;\n case 'Realtime Stop':\n slug = 'repl-realtime-stop';\n break;\n case 'Realtime Stats':\n slug = 'repl-clusterstats-realtime';\n break;\n case 'Replication Connections':\n slug = 'repl-connections';\n break;\n case 'Replication Clustername':\n slug = 'repl-clustername';\n break;\n default:\n break;\n }\n\n url = 'control/clusters/' + cluster.get('name') + '/' + slug;\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n var request = _ember['default'].$.ajax({\n url: url,\n type: 'GET'\n });\n\n request.done(function (data) {\n delete data.links;\n\n controller.set('currentReplOutput', JSON.stringify(data, null, ' '));\n resolve(data);\n });\n\n request.fail(function (data) {\n reject(data);\n });\n });\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/cluster/ops/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 2\n },\n \"end\": {\n \"line\": 7,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"label label-warning\");\n var el3 = dom.createTextNode(\"WARNING: Insufficient Nodes\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Reference: \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"href\", \"http://docs.basho.com/riak/latest/ops/building/planning/cluster/#Number-of-Nodes\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n var el3 = dom.createTextNode(\"Cluster Planning\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"model.warnings.insufficientNodes\", [\"loc\", [null, [5, 7], [5, 43]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 0\n },\n \"end\": {\n \"line\": 8,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"warning\"], 0, null, [\"loc\", [null, [3, 2], [7, 22]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 13,\n \"column\": 4\n },\n \"end\": {\n \"line\": 15,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-label\");\n var el2 = dom.createTextNode(\"Cluster: \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"content\", \"model.name\", [\"loc\", [null, [14, 41], [14, 55]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 21,\n \"column\": 10\n },\n \"end\": {\n \"line\": 21,\n \"column\": 36\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"Monitoring\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 23,\n \"column\": 12\n },\n \"end\": {\n \"line\": 23,\n \"column\": 42\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"MDC Operations\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 22,\n \"column\": 10\n },\n \"end\": {\n \"line\": 24,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"block\", \"tablist.tab\", [], [], 0, null, [\"loc\", [null, [23, 12], [23, 58]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 25,\n \"column\": 10\n },\n \"end\": {\n \"line\": 25,\n \"column\": 49\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"Individual Node Details\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 20,\n \"column\": 8\n },\n \"end\": {\n \"line\": 26,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 5, 5, contextualElement);\n return morphs;\n },\n statements: [[\"block\", \"tablist.tab\", [], [], 0, null, [\"loc\", [null, [21, 10], [21, 52]]]], [\"block\", \"if\", [[\"subexpr\", \"and\", [[\"get\", \"model.developmentMode\", [\"loc\", [null, [22, 21], [22, 42]]]], [\"get\", \"model.isEnterpriseEdition\", [\"loc\", [null, [22, 43], [22, 68]]]]], [], [\"loc\", [null, [22, 16], [22, 69]]]]], [], 1, null, [\"loc\", [null, [22, 10], [24, 17]]]], [\"block\", \"tablist.tab\", [], [], 2, null, [\"loc\", [null, [25, 10], [25, 65]]]]],\n locals: [\"tablist\"],\n templates: [child0, child1, child2]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 36,\n \"column\": 20\n },\n \"end\": {\n \"line\": 44,\n \"column\": 20\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"statOption\", [\"loc\", [null, [43, 22], [43, 36]]]]],\n locals: [\"statOption\"],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 46,\n \"column\": 22\n },\n \"end\": {\n \"line\": 48,\n \"column\": 22\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" Graph Descritpion\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 31,\n \"column\": 12\n },\n \"end\": {\n \"line\": 61,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"cluster-graph\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"header\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"header-left\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"span\");\n var el5 = dom.createTextNode(\"Displayed Graph:\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\" \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"div\");\n var el5 = dom.createTextNode(\"\\n\");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\" \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"header-right\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"button\");\n dom.setAttribute(el4, \"type\", \"button\");\n dom.setAttribute(el4, \"class\", \"btn btn-danger\");\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n var el5 = dom.createElement(\"span\");\n dom.setAttribute(el5, \"class\", \"ion-ios-trash\");\n dom.setAttribute(el5, \"aria-hidden\", \"true\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"\\n Remove Graph\\n \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element7 = dom.childAt(fragment, [1]);\n var element8 = dom.childAt(element7, [1]);\n var element9 = dom.childAt(element8, [1]);\n var element10 = dom.childAt(element8, [3, 1]);\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(element9, 3, 3);\n morphs[1] = dom.createMorphAt(dom.childAt(element9, [5]), 1, 1);\n morphs[2] = dom.createElementMorph(element10);\n morphs[3] = dom.createMorphAt(element7, 3, 3);\n return morphs;\n },\n statements: [[\"block\", \"power-select\", [], [\"selected\", [\"subexpr\", \"@mut\", [[\"get\", \"statName\", [\"loc\", [null, [37, 29], [37, 37]]]]], [], []], \"options\", [\"subexpr\", \"@mut\", [[\"get\", \"availableGraphs\", [\"loc\", [null, [38, 28], [38, 43]]]]], [], []], \"searchEnabled\", true, \"onchange\", [\"subexpr\", \"action\", [\"updateGraphName\", [\"get\", \"statName\", [\"loc\", [null, [40, 55], [40, 63]]]]], [], [\"loc\", [null, [40, 29], [40, 64]]]], \"class\", \"node-chart-select\"], 0, null, [\"loc\", [null, [36, 20], [44, 37]]]], [\"block\", \"tooltip.node-stats\", [], [\"itemKey\", [\"subexpr\", \"@mut\", [[\"get\", \"statName\", [\"loc\", [null, [46, 52], [46, 60]]]]], [], []], \"useIcon\", false], 1, null, [\"loc\", [null, [46, 22], [48, 45]]]], [\"element\", \"action\", [\"removeGraph\", [\"get\", \"statName\", [\"loc\", [null, [52, 88], [52, 96]]]]], [], [\"loc\", [null, [52, 65], [52, 98]]]], [\"inline\", \"charts.cluster-stat\", [], [\"cluster\", [\"subexpr\", \"@mut\", [[\"get\", \"model\", [\"loc\", [null, [59, 46], [59, 51]]]]], [], []], \"statToGraph\", [\"subexpr\", \"@mut\", [[\"get\", \"statName\", [\"loc\", [null, [59, 64], [59, 72]]]]], [], []]], [\"loc\", [null, [59, 16], [59, 74]]]]],\n locals: [\"statName\"],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 30,\n \"column\": 10\n },\n \"end\": {\n \"line\": 69,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"add-new-graph\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"button\");\n dom.setAttribute(el2, \"class\", \"btn btn-primary\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"ion-plus-circled\");\n dom.setAttribute(el3, \"aria-hidden\", \"true\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n Add new graph\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element11 = dom.childAt(fragment, [2, 1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createElementMorph(element11);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"currentGraphs\", [\"loc\", [null, [31, 20], [31, 33]]]]], [], 0, null, [\"loc\", [null, [31, 12], [61, 21]]]], [\"element\", \"action\", [\"showNewGraphModal\"], [], [\"loc\", [null, [64, 46], [64, 76]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 69,\n \"column\": 10\n },\n \"end\": {\n \"line\": 71,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"No nodes detected\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 29,\n \"column\": 8\n },\n \"end\": {\n \"line\": 72,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.nodes.length\", [\"loc\", [null, [30, 16], [30, 34]]]]], [], 0, 1, [\"loc\", [null, [30, 10], [71, 17]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 80,\n \"column\": 16\n },\n \"end\": {\n \"line\": 87,\n \"column\": 16\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"replAction\", [\"loc\", [null, [86, 18], [86, 32]]]]],\n locals: [\"replAction\"],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 90,\n \"column\": 14\n },\n \"end\": {\n \"line\": 100,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"label\");\n var el3 = dom.createTextNode(\"Output\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 3, 3);\n return morphs;\n },\n statements: [[\"inline\", \"ivy-codemirror\", [], [\"mode\", \"javascript\", \"theme\", \"material\", \"lineWrapping\", true, \"readOnly\", true, \"value\", [\"subexpr\", \"@mut\", [[\"get\", \"currentReplOutput\", [\"loc\", [null, [98, 24], [98, 41]]]]], [], []]], [\"loc\", [null, [93, 18], [98, 43]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 76,\n \"column\": 10\n },\n \"end\": {\n \"line\": 102,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"form\");\n dom.setAttribute(el1, \"class\", \"mdc-repl\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"form-group repl-action-select\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"label\");\n var el4 = dom.createTextNode(\"Available Actions\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element6 = dom.childAt(fragment, [1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(dom.childAt(element6, [1]), 3, 3);\n morphs[1] = dom.createMorphAt(element6, 3, 3);\n return morphs;\n },\n statements: [[\"block\", \"power-select\", [], [\"selected\", [\"subexpr\", \"@mut\", [[\"get\", \"currentlySelectedAction\", [\"loc\", [null, [81, 25], [81, 48]]]]], [], []], \"options\", [\"subexpr\", \"@mut\", [[\"get\", \"availableReplActions\", [\"loc\", [null, [82, 24], [82, 44]]]]], [], []], \"searchEnabled\", false, \"onchange\", [\"subexpr\", \"action\", [\"warnReplAction\"], [], [\"loc\", [null, [84, 25], [84, 50]]]]], 0, null, [\"loc\", [null, [80, 16], [87, 33]]]], [\"block\", \"if\", [[\"get\", \"currentReplOutput\", [\"loc\", [null, [90, 20], [90, 37]]]]], [], 1, null, [\"loc\", [null, [90, 14], [100, 21]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 75,\n \"column\": 8\n },\n \"end\": {\n \"line\": 103,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"tabs.tabpanel\", [], [], 0, null, [\"loc\", [null, [76, 10], [102, 28]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child3 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 114,\n \"column\": 20\n },\n \"end\": {\n \"line\": 117,\n \"column\": 20\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-checkmark-circled\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"node.name\", [\"loc\", [null, [116, 22], [116, 35]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 113,\n \"column\": 18\n },\n \"end\": {\n \"line\": 118,\n \"column\": 18\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"node\", [\"get\", \"model.name\", [\"loc\", [null, [114, 38], [114, 48]]]], [\"get\", \"node.name\", [\"loc\", [null, [114, 49], [114, 58]]]]], [], 0, null, [\"loc\", [null, [114, 20], [117, 32]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 119,\n \"column\": 20\n },\n \"end\": {\n \"line\": 122,\n \"column\": 20\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-alert-circled\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"node.name\", [\"loc\", [null, [121, 22], [121, 35]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 118,\n \"column\": 18\n },\n \"end\": {\n \"line\": 123,\n \"column\": 18\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"node\", [\"get\", \"model.name\", [\"loc\", [null, [119, 38], [119, 48]]]], [\"get\", \"node.name\", [\"loc\", [null, [119, 49], [119, 58]]]]], [\"class\", \"danger\"], 0, null, [\"loc\", [null, [119, 20], [122, 32]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 111,\n \"column\": 14\n },\n \"end\": {\n \"line\": 125,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"node.available\", [\"loc\", [null, [113, 24], [113, 38]]]]], [], 0, 1, [\"loc\", [null, [113, 18], [123, 25]]]]],\n locals: [\"node\"],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 107,\n \"column\": 10\n },\n \"end\": {\n \"line\": 127,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n dom.setAttribute(el1, \"style\", \"margin-bottom: 30px\");\n var el2 = dom.createTextNode(\"Select any of the nodes below to dive into node specific details (stats, configuration, monitoring, etc.)\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n dom.setAttribute(el1, \"class\", \"button-list\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"model.nodes\", [\"loc\", [null, [111, 22], [111, 33]]]]], [], 0, null, [\"loc\", [null, [111, 14], [125, 23]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 127,\n \"column\": 10\n },\n \"end\": {\n \"line\": 129,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"No nodes detected\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 106,\n \"column\": 8\n },\n \"end\": {\n \"line\": 130,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.nodes\", [\"loc\", [null, [107, 16], [107, 27]]]]], [], 0, 1, [\"loc\", [null, [107, 10], [129, 17]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 19,\n \"column\": 6\n },\n \"end\": {\n \"line\": 131,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"tabs.tablist\", [], [], 0, null, [\"loc\", [null, [20, 8], [26, 25]]]], [\"block\", \"tabs.tabpanel\", [], [], 1, null, [\"loc\", [null, [29, 8], [72, 26]]]], [\"block\", \"if\", [[\"subexpr\", \"and\", [[\"get\", \"model.developmentMode\", [\"loc\", [null, [75, 19], [75, 40]]]], [\"get\", \"model.isEnterpriseEdition\", [\"loc\", [null, [75, 41], [75, 66]]]]], [], [\"loc\", [null, [75, 14], [75, 67]]]]], [], 2, null, [\"loc\", [null, [75, 8], [103, 15]]]], [\"block\", \"tabs.tabpanel\", [], [], 3, null, [\"loc\", [null, [106, 8], [130, 26]]]]],\n locals: [\"tabs\"],\n templates: [child0, child1, child2, child3]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 16,\n \"column\": 4\n },\n \"end\": {\n \"line\": 132,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"ivy-tabs\", [], [\"on-select\", [\"subexpr\", \"action\", [[\"subexpr\", \"mut\", [[\"get\", \"selectedIndex\", [\"loc\", [null, [19, 41], [19, 54]]]]], [], [\"loc\", [null, [19, 36], [19, 55]]]]], [], [\"loc\", [null, [19, 28], [19, 56]]]], \"selected-index\", [\"subexpr\", \"@mut\", [[\"get\", \"selectedIndex\", [\"loc\", [null, [19, 72], [19, 85]]]]], [], []]], 0, null, [\"loc\", [null, [19, 6], [131, 19]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 12,\n \"column\": 2\n },\n \"end\": {\n \"line\": 133,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [], 0, null, [\"loc\", [null, [13, 4], [15, 32]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [16, 4], [132, 30]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 139,\n \"column\": 4\n },\n \"end\": {\n \"line\": 159,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"modal-content-container\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"header\");\n dom.setAttribute(el2, \"class\", \"modal-header\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"h3\");\n var el4 = dom.createElement(\"span\");\n dom.setAttribute(el4, \"class\", \"label label-danger\");\n var el5 = dom.createElement(\"i\");\n dom.setAttribute(el5, \"class\", \"ion-alert-circled\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\" Potentially Dangerous Operation\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"section\");\n dom.setAttribute(el2, \"class\", \"modal-body\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"p\");\n var el4 = dom.createTextNode(\"Are you sure you want to perform a \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"strong\");\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\" operation?\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"p\");\n var el4 = dom.createTextNode(\"MDC replication operations can effect cluster performance and should only be done by a cluster administrator.\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"footer\");\n dom.setAttribute(el2, \"class\", \"modal-footer\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"button\");\n dom.setAttribute(el3, \"class\", \"btn btn-default\");\n var el4 = dom.createTextNode(\"Cancel\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"button\");\n dom.setAttribute(el3, \"class\", \"btn btn-primary\");\n var el4 = dom.createTextNode(\"Confirm\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element2 = dom.childAt(fragment, [1]);\n var element3 = dom.childAt(element2, [5]);\n var element4 = dom.childAt(element3, [1]);\n var element5 = dom.childAt(element3, [3]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(dom.childAt(element2, [3, 1, 1]), 0, 0);\n morphs[1] = dom.createElementMorph(element4);\n morphs[2] = dom.createElementMorph(element5);\n return morphs;\n },\n statements: [[\"content\", \"currentlySelectedAction\", [\"loc\", [null, [150, 56], [150, 83]]]], [\"element\", \"action\", [\"cancelReplAction\"], [], [\"loc\", [null, [155, 42], [155, 71]]]], [\"element\", \"action\", [\"confirmReplAction\", [\"get\", \"model\", [\"loc\", [null, [156, 71], [156, 76]]]]], [], [\"loc\", [null, [156, 42], [156, 78]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 138,\n \"column\": 2\n },\n \"end\": {\n \"line\": 160,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"modal-dialog\", [], [\"close\", \"cancelReplAction\", \"translucentOverlay\", true], 0, null, [\"loc\", [null, [139, 4], [159, 21]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 176,\n \"column\": 10\n },\n \"end\": {\n \"line\": 183,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"statOption\", [\"loc\", [null, [182, 12], [182, 26]]]]],\n locals: [\"statOption\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 163,\n \"column\": 4\n },\n \"end\": {\n \"line\": 190,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"modal-content-container\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"header\");\n dom.setAttribute(el2, \"class\", \"modal-header\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"h3\");\n var el4 = dom.createTextNode(\"New Graph\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"section\");\n dom.setAttribute(el2, \"class\", \"modal-body\");\n dom.setAttribute(el2, \"style\", \"min-width: 300px;\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"p\");\n var el4 = dom.createTextNode(\"\\n Select a new statistic to add it to the dashboard.\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"footer\");\n dom.setAttribute(el2, \"class\", \"modal-footer\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"button\");\n dom.setAttribute(el3, \"class\", \"btn btn-default\");\n var el4 = dom.createTextNode(\"Cancel\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var element1 = dom.childAt(element0, [5, 1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [3]), 3, 3);\n morphs[1] = dom.createElementMorph(element1);\n return morphs;\n },\n statements: [[\"block\", \"power-select\", [], [\"selected\", \"\", \"options\", [\"subexpr\", \"@mut\", [[\"get\", \"availableGraphs\", [\"loc\", [null, [178, 18], [178, 33]]]]], [], []], \"searchEnabled\", true, \"onchange\", [\"subexpr\", \"action\", [\"addNewGraph\"], [], [\"loc\", [null, [180, 19], [180, 41]]]]], 0, null, [\"loc\", [null, [176, 10], [183, 27]]]], [\"element\", \"action\", [\"hideNewGraphModal\"], [], [\"loc\", [null, [187, 42], [187, 72]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 162,\n \"column\": 2\n },\n \"end\": {\n \"line\": 191,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"modal-dialog\", [], [\"close\", \"hideNewGraphModal\", \"translucentOverlay\", true], 0, null, [\"loc\", [null, [163, 4], [190, 21]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 137,\n \"column\": 0\n },\n \"end\": {\n \"line\": 192,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"replActionModalVisible\", [\"loc\", [null, [138, 8], [138, 30]]]]], [], 0, null, [\"loc\", [null, [138, 2], [160, 9]]]], [\"block\", \"if\", [[\"get\", \"newGraphModalVisible\", [\"loc\", [null, [162, 8], [162, 28]]]]], [], 1, null, [\"loc\", [null, [162, 2], [191, 9]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 192,\n \"column\": 7\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/ops/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"cluster-ops-container\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.warnings.insufficientNodes\", [\"loc\", [null, [2, 6], [2, 38]]]]], [], 0, null, [\"loc\", [null, [2, 0], [8, 7]]]], [\"block\", \"dashboard-module.container\", [], [], 1, null, [\"loc\", [null, [12, 2], [133, 33]]]], [\"block\", \"if\", [[\"get\", \"modalVisible\", [\"loc\", [null, [137, 6], [137, 18]]]]], [], 2, null, [\"loc\", [null, [137, 0], [192, 7]]]]],\n locals: [],\n templates: [child0, child1, child2]\n };\n })());\n});","define('ember-riak-explorer/pods/cluster/query/route', ['exports', 'ember-riak-explorer/pods/cluster/route'], function (exports, _emberRiakExplorerPodsClusterRoute) {\n exports['default'] = _emberRiakExplorerPodsClusterRoute['default'].extend({\n afterModel: function afterModel(model, transition) {\n this._super(model, transition);\n this.setViewLabel({\n preLabel: 'Cluster Query',\n label: model.get('name')\n });\n }\n });\n});","define(\"ember-riak-explorer/pods/cluster/query/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 6,\n \"column\": 10\n },\n \"end\": {\n \"line\": 9,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-plus-circled\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Create New Table\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 4,\n \"column\": 6\n },\n \"end\": {\n \"line\": 11,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"table.create\", [\"get\", \"model.name\", [\"loc\", [null, [6, 36], [6, 46]]]]], [\"class\", \"action-button create\"], 0, null, [\"loc\", [null, [6, 10], [9, 22]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 14,\n \"column\": 10\n },\n \"end\": {\n \"line\": 19,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"table.ts-tables\", [], [\"tables\", [\"subexpr\", \"@mut\", [[\"get\", \"currentPageTables\", [\"loc\", [null, [18, 37], [18, 54]]]]], [], []]], [\"loc\", [null, [18, 12], [18, 56]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 13,\n \"column\": 8\n },\n \"end\": {\n \"line\": 20,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"pagination-component\", [], [\"chunkSize\", [\"subexpr\", \"@mut\", [[\"get\", \"pageSize\", [\"loc\", [null, [15, 20], [15, 28]]]]], [], []], \"totalSize\", [\"subexpr\", \"@mut\", [[\"get\", \"model.tables.length\", [\"loc\", [null, [16, 20], [16, 39]]]]], [], []], \"sectionRequest\", \"tablePageRequest\"], 0, null, [\"loc\", [null, [14, 10], [19, 35]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 20,\n \"column\": 8\n },\n \"end\": {\n \"line\": 22,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"No Time Series tables have been created on this cluster\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 12,\n \"column\": 6\n },\n \"end\": {\n \"line\": 23,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.tables\", [\"loc\", [null, [13, 14], [13, 26]]]]], [], 0, 1, [\"loc\", [null, [13, 8], [22, 15]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 4\n },\n \"end\": {\n \"line\": 24,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"TS Tables\"], 0, null, [\"loc\", [null, [4, 6], [11, 34]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [12, 6], [23, 32]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 25,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 0, null, [\"loc\", [null, [3, 4], [24, 35]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 30,\n \"column\": 8\n },\n \"end\": {\n \"line\": 33,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-plus-circled\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Create new search schema\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 28,\n \"column\": 4\n },\n \"end\": {\n \"line\": 35,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"search-schema.create\", [\"get\", \"model.name\", [\"loc\", [null, [30, 42], [30, 52]]]]], [\"class\", \"btn btn-small btn-primary\"], 0, null, [\"loc\", [null, [30, 8], [33, 20]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 39,\n \"column\": 8\n },\n \"end\": {\n \"line\": 44,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"table.search-indexes\", [], [\"indexes\", [\"subexpr\", \"@mut\", [[\"get\", \"currentPageIndexes\", [\"loc\", [null, [43, 41], [43, 59]]]]], [], []]], [\"loc\", [null, [43, 10], [43, 61]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 37,\n \"column\": 6\n },\n \"end\": {\n \"line\": 46,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"block\", \"pagination-component\", [], [\"chunkSize\", [\"subexpr\", \"@mut\", [[\"get\", \"pageSize\", [\"loc\", [null, [40, 18], [40, 26]]]]], [], []], \"totalSize\", [\"subexpr\", \"@mut\", [[\"get\", \"model.searchIndexes.length\", [\"loc\", [null, [41, 18], [41, 44]]]]], [], []], \"sectionRequest\", \"indexPageRequest\"], 0, null, [\"loc\", [null, [39, 8], [44, 33]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 46,\n \"column\": 6\n },\n \"end\": {\n \"line\": 48,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"No search indexes found\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 36,\n \"column\": 4\n },\n \"end\": {\n \"line\": 49,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.searchIndexes\", [\"loc\", [null, [37, 12], [37, 31]]]]], [], 0, 1, [\"loc\", [null, [37, 6], [48, 13]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 27,\n \"column\": 2\n },\n \"end\": {\n \"line\": 50,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"KV Bucket Types Schema/Indexes\"], 0, null, [\"loc\", [null, [28, 4], [35, 32]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [36, 4], [49, 30]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"triple-curlies\"\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 54,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/cluster/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"cluster-information-container\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [0]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(element0, 1, 1);\n morphs[1] = dom.createMorphAt(element0, 3, 3);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.isTimeSeries\", [\"loc\", [null, [2, 8], [2, 26]]]]], [], 0, null, [\"loc\", [null, [2, 2], [25, 9]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 1, null, [\"loc\", [null, [27, 2], [50, 33]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })());\n});","define('ember-riak-explorer/pods/cluster/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n pageSize: 5,\n\n model: function model(params) {\n return this.explorer.getCluster(params.clusterName);\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model);\n this.setBreadCrumbs(null);\n this.setViewLabel(null);\n this.simulateLoad();\n },\n\n setupController: function setupController(controller, model) {\n var lowIndex = 0;\n var highIndex = this.get('pageSize') - 1;\n\n this._super(controller, model);\n this.controller.set('pageSize', this.get('pageSize'));\n this.controller.set('currentPageTables', this.tablesFromRange(lowIndex, highIndex));\n this.controller.set('currentPageActiveBucketTypes', this.bucketTypesFromRange('active', lowIndex, highIndex));\n this.controller.set('currentPageInactiveBucketTypes', this.bucketTypesFromRange('inactive', lowIndex, highIndex));\n this.controller.set('currentPageIndexes', this.indexesFromRange(lowIndex, highIndex));\n },\n\n tablesFromRange: function tablesFromRange(startIndex, endIndex) {\n return this.currentModel.get('tables').filter(function (table, index) {\n return index >= startIndex && index <= endIndex;\n });\n },\n\n bucketTypesFromRange: function bucketTypesFromRange(type, startIndex, endIndex) {\n var filteredType = type + 'BucketTypes';\n\n return this.currentModel.get(filteredType).filter(function (bucketType, index) {\n return index >= startIndex && index <= endIndex;\n });\n },\n\n indexesFromRange: function indexesFromRange(startIndex, endIndex) {\n return this.currentModel.get('searchIndexes').filter(function (searchIndex, index) {\n return index >= startIndex && index <= endIndex;\n });\n },\n\n actions: {\n tablePageRequest: function tablePageRequest(lowIndex, highIndex) {\n this.controller.set('currentPageTables', this.tablesFromRange(lowIndex, highIndex));\n },\n\n activeBucketTypesPageRequest: function activeBucketTypesPageRequest(lowIndex, highIndex) {\n this.controller.set('currentPageActiveBucketTypes', this.bucketTypesFromRange('active', lowIndex, highIndex));\n },\n\n inactiveBucketTypesPageRequest: function inactiveBucketTypesPageRequest(lowIndex, highIndex) {\n this.controller.set('currentPageInactiveBucketTypes', this.bucketTypesFromRange('inactive', lowIndex, highIndex));\n },\n\n indexPageRequest: function indexPageRequest(lowIndex, highIndex) {\n this.controller.set('currentPageIndexes', this.indexesFromRange(lowIndex, highIndex));\n }\n }\n });\n});","define('ember-riak-explorer/pods/config-file/model', ['exports', 'ember-data'], function (exports, _emberData) {\n exports['default'] = _emberData['default'].Model.extend({\n /**\n * Node the config file belongs to.\n * @property node\n * @type DS.Model\n */\n node: _emberData['default'].belongsTo('node'),\n\n /**\n * Contents of the config file so they can be displayed in the ui.\n *\n * @property content\n * @type String\n */\n content: _emberData['default'].attr('string'),\n\n /**\n * The name of the file. The actual id is a composite id (i.e. cluster1/node1/file1.log).\n *\n * @property name\n * @type String\n */\n name: _emberData['default'].attr('string')\n });\n});","define('ember-riak-explorer/pods/config-file/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n\n model: function model(params) {\n return this.explorer.getConfigFile(params.clusterName, params.nodeName, params.configName);\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('node').get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('node').get('cluster'),\n node: model.get('node'),\n configFile: model\n });\n this.setViewLabel({\n preLabel: 'Config Detail',\n label: model.get('name')\n });\n }\n });\n});","define(\"ember-riak-explorer/pods/config-file/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 4,\n \"column\": 4\n },\n \"end\": {\n \"line\": 11,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/config-file/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"ivy-codemirror\", [], [\"mode\", \"erlang\", \"theme\", \"material\", \"lineWrapping\", true, \"readOnly\", true, \"value\", [\"subexpr\", \"@mut\", [[\"get\", \"model.content\", [\"loc\", [null, [10, 14], [10, 27]]]]], [], []]], [\"loc\", [null, [5, 6], [10, 29]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 12,\n \"column\": 6\n },\n \"end\": {\n \"line\": 14,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/config-file/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createElement(\"strong\");\n var el3 = dom.createTextNode(\"File contains no contents.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 11,\n \"column\": 4\n },\n \"end\": {\n \"line\": 15,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/config-file/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"info\"], 0, null, [\"loc\", [null, [12, 6], [14, 26]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 2\n },\n \"end\": {\n \"line\": 16,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/config-file/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.content\", [\"loc\", [null, [4, 10], [4, 23]]]]], [], 0, 1, [\"loc\", [null, [4, 4], [15, 11]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 17,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/config-file/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"inline\", \"dashboard-module.header\", [], [\"label\", \"File output\"], [\"loc\", [null, [2, 2], [2, 49]]]], [\"block\", \"dashboard-module.body\", [], [], 0, null, [\"loc\", [null, [3, 2], [16, 28]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 18,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/config-file/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [], 0, null, [\"loc\", [null, [1, 0], [17, 31]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define('ember-riak-explorer/pods/error/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], {\n setupController: function setupController() {\n this.simulateLoad();\n }\n });\n});","define('ember-riak-explorer/pods/error/service-not-found/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], {\n setupController: function setupController() {\n this.simulateLoad();\n }\n });\n});","define(\"ember-riak-explorer/pods/error/service-not-found/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 2\n },\n \"end\": {\n \"line\": 9,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/error/service-not-found/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"The application was not able to connect to the Riak Explorer API.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"\\n Please refer to any documentation in the\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"href\", \"https://github.com/basho-labs/riak_explorer\");\n var el3 = dom.createTextNode(\"Github repository\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 10,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/error/service-not-found/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"inline\", \"dashboard-module.header\", [], [\"label\", \"503 Service Unavailable\"], [\"loc\", [null, [2, 2], [2, 61]]]], [\"block\", \"dashboard-module.body\", [], [], 0, null, [\"loc\", [null, [3, 2], [9, 28]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 11,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/error/service-not-found/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 0, null, [\"loc\", [null, [1, 0], [10, 31]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/pods/error/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 2\n },\n \"end\": {\n \"line\": 8,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/error/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Sorry but the page your looking for doesn't exist.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"If you believe this to be a bug, please consider\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"href\", \"https://github.com/basho-labs/riak-explorer-gui/issues\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n var el3 = dom.createTextNode(\"\\n creating an issue\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\".\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 9,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/error/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"inline\", \"dashboard-module.header\", [], [\"label\", \"Page not found: 404 Error\"], [\"loc\", [null, [2, 2], [2, 63]]]], [\"block\", \"dashboard-module.body\", [], [], 0, null, [\"loc\", [null, [3, 2], [8, 28]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 9,\n \"column\": 31\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/error/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [\"class\", \"small-width\"], 0, null, [\"loc\", [null, [1, 0], [9, 31]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define('ember-riak-explorer/pods/help/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n model: function model(params) {\n return null;\n },\n\n afterModel: function afterModel(model, transition) {\n this.setBreadCrumbs(null);\n this.setViewLabel({\n preLabel: 'Help Section'\n });\n this.simulateLoad();\n }\n });\n});","define(\"ember-riak-explorer/pods/help/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 5,\n \"column\": 2\n },\n \"end\": {\n \"line\": 30,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/help/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"\\n Riak Docs:\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"href\", \"http://docs.basho.com/\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n var el3 = dom.createTextNode(\"\\n docs.basho.com\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"\\n Riak mailing list:\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"href\", \"http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n var el3 = dom.createTextNode(\"\\n lists.basho.com/mailman/listinfo/riak-users_lists.basho.com\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"\\n Riak IRC on Freenode:\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"href\", \"http://irc.lc/freenode/riak\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n var el3 = dom.createTextNode(\"\\n irc.lc/freenode/riak\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 0\n },\n \"end\": {\n \"line\": 31,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/help/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"inline\", \"dashboard-module.header\", [], [\"label\", \"Riak Resources\"], [\"loc\", [null, [4, 2], [4, 52]]]], [\"block\", \"dashboard-module.body\", [], [], 0, null, [\"loc\", [null, [5, 2], [30, 28]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 35,\n \"column\": 2\n },\n \"end\": {\n \"line\": 52,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/help/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"\\n Github repository:\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"href\", \"https://github.com/basho-labs/riak_explorer\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n var el3 = dom.createTextNode(\"\\n github.com/basho-labs/riak_explorer\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"\\n Riak Explorer API:\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"href\", \"http://basho-labs.github.io/riak_explorer/docs/api.html\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n var el3 = dom.createTextNode(\"\\n basho-labs.github.io/riak_explorer/docs/api.html\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 33,\n \"column\": 0\n },\n \"end\": {\n \"line\": 53,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/help/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"inline\", \"dashboard-module.header\", [], [\"label\", \"Riak Explorer Resources\"], [\"loc\", [null, [34, 2], [34, 61]]]], [\"block\", \"dashboard-module.body\", [], [], 0, null, [\"loc\", [null, [35, 2], [52, 28]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 57,\n \"column\": 2\n },\n \"end\": {\n \"line\": 77,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/help/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ol\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"a\");\n dom.setAttribute(el3, \"href\", \"http://docs.basho.com/riak/latest/downloads/\");\n dom.setAttribute(el3, \"target\", \"_blank\");\n var el4 = dom.createTextNode(\"Download\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n and\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"a\");\n dom.setAttribute(el3, \"href\", \"http://docs.basho.com/riak/latest/installing/\");\n dom.setAttribute(el3, \"target\", \"_blank\");\n var el4 = dom.createTextNode(\"Install\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n Riak, and get a cluster up an running. Our\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"a\");\n dom.setAttribute(el3, \"href\", \"http://docs.basho.com/riak/latest/quickstart/\");\n dom.setAttribute(el3, \"target\", \"_blank\");\n var el4 = dom.createTextNode(\"five minute install\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n is a great guide to follow if you are unfamiliar with this process.\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"\\n Verify the default settings in \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"riak_explorer/etc/riak_explorer.conf\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" will work for your configuration\\n (primarily that port 9000 is available on your host, and that the \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"listener\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" variable is pointed at one of the nodes in your cluster).\\n Pay special attention to development mode settings, this should be off for use with a production environment to\\n prevent accidental key listings.\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"\\n Restart the Riak Explorer application and explore!\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 55,\n \"column\": 0\n },\n \"end\": {\n \"line\": 78,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/help/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"inline\", \"dashboard-module.header\", [], [\"label\", \"Setting up a cluster in Riak Explorer\"], [\"loc\", [null, [56, 2], [56, 75]]]], [\"block\", \"dashboard-module.body\", [], [], 0, null, [\"loc\", [null, [57, 2], [77, 28]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 78,\n \"column\": 31\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/help/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"inline\", \"render\", [\"alerts.feedback-welcome\"], [], [\"loc\", [null, [1, 0], [1, 36]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 0, null, [\"loc\", [null, [3, 0], [31, 31]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 1, null, [\"loc\", [null, [33, 0], [53, 31]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 2, null, [\"loc\", [null, [55, 0], [78, 31]]]]],\n locals: [],\n templates: [child0, child1, child2]\n };\n })());\n});","define('ember-riak-explorer/pods/index/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], {\n afterModel: function afterModel(clusters, transition) {\n // If only one cluster, go ahead and go straight to it\n if (clusters.get('length') === 1) {\n var clusterName = clusters.get('firstObject').get('name');\n\n return this.transitionTo('cluster.data', clusterName);\n }\n },\n\n setupController: function setupController() {\n this.simulateLoad();\n }\n });\n});","define(\"ember-riak-explorer/pods/index/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 2\n },\n \"end\": {\n \"line\": 10,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/index/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Select a cluster from the nav bar on the left to view its information.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"\\n Need help? Visit the\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\".\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [\"help page\", \"help\"], [], [\"loc\", [null, [8, 6], [8, 36]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 11,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/index/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"inline\", \"dashboard-module.header\", [], [\"label\", \"Welcome to Riak Explorer\"], [\"loc\", [null, [2, 2], [2, 62]]]], [\"block\", \"dashboard-module.body\", [], [], 0, null, [\"loc\", [null, [3, 2], [10, 28]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 12,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/index/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [\"class\", \"small-width\"], 0, null, [\"loc\", [null, [1, 0], [11, 31]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define('ember-riak-explorer/pods/log-file/model', ['exports', 'ember-data'], function (exports, _emberData) {\n exports['default'] = _emberData['default'].Model.extend({\n /**\n * Node the log file belongs to.\n * @property node\n * @type DS.Model\n */\n node: _emberData['default'].belongsTo('node'),\n\n /**\n * Contents of the node file so they can be displayed in the ui. will be limited to the amount of\n * lines specified in this.get('pageSize').\n *\n * @property content\n * @type String\n */\n content: _emberData['default'].attr('string'),\n\n /**\n * The name of the file. The actual id is a composite id (i.e. cluster1/node1/file1.log).\n *\n * @property name\n * @type String\n */\n name: _emberData['default'].attr('string'),\n\n /**\n * Tracks the state of whether the model is refetching this.get('content').\n *\n * @property isRefreshing\n * @type Boolean\n */\n isRefreshing: _emberData['default'].attr('boolean', { 'default': false }),\n\n /**\n * The max number of lines fetched in the request for this.get('content').\n *\n * @property pageSize\n * @type Integer\n */\n pageSize: _emberData['default'].attr('number', { 'default': 0 }),\n\n /**\n * The total number of lines in the file.\n *\n * @property totalLines\n * @type Integer\n */\n totalLines: _emberData['default'].attr('number', { 'default': 0 }),\n\n /**\n * Calculates whether there are more lines than the requested page size. Returns a\n * Boolean Value.\n *\n * @method moreLinesThanPageSize\n * @returns Boolean\n */\n moreLinesThanPageSize: (function () {\n return this.get('pageSize') < this.get('totalLines');\n }).property('pageSize', 'totalLines')\n });\n});","define('ember-riak-explorer/pods/log-file/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n model: function model(params) {\n return this.explorer.getLogFile(params.clusterName, params.nodeName, params.logName);\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('node').get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('node').get('cluster'),\n node: model.get('node'),\n logFile: model\n });\n this.setViewLabel({\n preLabel: 'Log Detail',\n label: model.get('name')\n });\n },\n\n actions: {\n refreshLogFile: function refreshLogFile(log) {\n log.set('isRefreshing', true);\n\n // TODO: Add functionality to change the amount of lines the log file is tailing\n this.explorer.getLogFileContents(log).then(function () {\n // The response back from the server is very fast on a lot of these requests,\n // so let the animation run for an extra second to give the feedback loop that\n // the request has gone through.\n setTimeout(function () {\n return log.set('isRefreshing', false);\n }, 1000);\n });\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/log-file/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 4,\n \"column\": 6\n },\n \"end\": {\n \"line\": 8,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/log-file/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" File output from\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"code\");\n var el2 = dom.createTextNode(\"tail -n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"mini-label\");\n var el2 = dom.createTextNode(\"(\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" total lines)\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n morphs[1] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);\n return morphs;\n },\n statements: [[\"content\", \"model.pageSize\", [\"loc\", [null, [6, 20], [6, 38]]]], [\"content\", \"model.totalLines\", [\"loc\", [null, [7, 32], [7, 52]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 8,\n \"column\": 6\n },\n \"end\": {\n \"line\": 11,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/log-file/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" File output\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"mini-label\");\n var el2 = dom.createTextNode(\"(\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" total lines)\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"content\", \"model.totalLines\", [\"loc\", [null, [10, 32], [10, 52]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 19,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/log-file/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"module-label\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"refresh action-button\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"aria-hidden\", \"true\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n Refresh \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [3, 1]);\n var element1 = dom.childAt(element0, [1]);\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n morphs[1] = dom.createElementMorph(element0);\n morphs[2] = dom.createAttrMorph(element1, 'class');\n morphs[3] = dom.createMorphAt(element0, 3, 3);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.moreLinesThanPageSize\", [\"loc\", [null, [4, 12], [4, 39]]]]], [], 0, 1, [\"loc\", [null, [4, 6], [11, 13]]]], [\"element\", \"action\", [\"refreshLogFile\", [\"get\", \"model\", [\"loc\", [null, [14, 68], [14, 73]]]]], [], [\"loc\", [null, [14, 42], [14, 75]]]], [\"attribute\", \"class\", [\"subexpr\", \"if\", [[\"get\", \"model.isRefreshing\", [\"loc\", [null, [15, 25], [15, 43]]]], \"ion-refresh\", \"ion-refresh\"], [], [\"loc\", [null, [15, 20], [15, 73]]]]], [\"content\", \"model.name\", [\"loc\", [null, [16, 16], [16, 30]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 21,\n \"column\": 4\n },\n \"end\": {\n \"line\": 28,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/log-file/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"ivy-codemirror\", [], [\"mode\", \"erlang\", \"theme\", \"material\", \"lineWrapping\", true, \"readOnly\", true, \"value\", [\"subexpr\", \"@mut\", [[\"get\", \"model.content\", [\"loc\", [null, [27, 14], [27, 27]]]]], [], []]], [\"loc\", [null, [22, 6], [27, 29]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 29,\n \"column\": 6\n },\n \"end\": {\n \"line\": 31,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/log-file/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createElement(\"strong\");\n var el3 = dom.createTextNode(\"File contains no contents.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 28,\n \"column\": 4\n },\n \"end\": {\n \"line\": 32,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/log-file/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"info\"], 0, null, [\"loc\", [null, [29, 6], [31, 26]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 20,\n \"column\": 2\n },\n \"end\": {\n \"line\": 33,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/log-file/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.content\", [\"loc\", [null, [21, 10], [21, 23]]]]], [], 0, 1, [\"loc\", [null, [21, 4], [32, 11]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 34,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/log-file/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [], 0, null, [\"loc\", [null, [2, 2], [19, 30]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [20, 2], [33, 28]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 35,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/log-file/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [], 0, null, [\"loc\", [null, [1, 0], [34, 31]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define('ember-riak-explorer/pods/node/model', ['exports', 'ember-data', 'lodash/lodash', 'ember-riak-explorer/utils/riak-help/riak_status', 'ember-local-storage'], function (exports, _emberData, _lodashLodash, _emberRiakExplorerUtilsRiakHelpRiak_status, _emberLocalStorage) {\n exports['default'] = _emberData['default'].Model.extend({\n init: function init() {\n this.set('statsHistory', []);\n },\n\n /**\n * Cluster the node belongs to.\n * @property cluster\n * @type DS.Model\n */\n cluster: _emberData['default'].belongsTo('cluster'),\n\n /**\n * The nodes various configuration files\n * @property configFiles\n * @type DS.Model\n */\n configFiles: _emberData['default'].hasMany('config-file'),\n\n /**\n * The nodes various log files\n * @property logFiles\n * @type DS.Model\n */\n logFiles: _emberData['default'].hasMany('log-file'),\n\n /**\n * Whether or not the node is available when pinged.\n *\n * @property available\n * @type Boolean\n */\n available: _emberData['default'].attr('boolean', { 'default': false }),\n\n /**\n * All the nodes advanced configuration. Stored as an Array of strings.\n * i.e [\"{riak_core,[{cluster_mgr,{\"127.0.0.1\",8098}}]}\", \"{riak_repl,[{data_root,\"/var/db/riak/riak_repl/\"}]}\"]\n *\n * @property config\n * @type Object\n */\n advancedConfig: _emberData['default'].attr(),\n\n /**\n * All the nodes configuration settings. Stored as an Object hashmap.\n *\n * @property config\n * @type Object\n */\n config: _emberData['default'].attr(),\n\n name: _emberData['default'].attr('string'),\n\n replStatus: _emberData['default'].attr(),\n\n /**\n * All the nodes statistics. Stored as an Object hashmap.\n *\n * @property stats\n * @type Object\n */\n stats: _emberData['default'].attr(),\n\n /**\n * Array of stats property objects with an associated timestamp\n *\n * @property statsHistory\n * @type Array\n */\n statsHistory: (0, _emberLocalStorage.storageFor)('node-stats'),\n\n statsByCategory: _emberData['default'].attr(),\n\n /**\n * Whether or not the node's ring file is \"valid\" or \"invalid\".\n *\n * @property status\n * @type String\n */\n status: _emberData['default'].attr('string', { defaultValue: 'invalid' }),\n\n /**\n * Node health is determined by whether or not the node is available and if it's\n * status is valid\n *\n * @method isHealthy\n * @return Boolean\n */\n isHealthy: (function () {\n return !!(this.get('available') && this.get('status') === 'valid');\n }).property('available', 'status'),\n\n logStatHistory: (function () {\n // Storing a lot of large objects, may want to only store diffs and restore when needed\n return this.get('statsHistory').pushObject({\n timestamp: Date.now(),\n stats: this.get('stats')\n });\n }).observes('stats'),\n\n setStatsByCategory: (function () {\n var _this = this;\n\n if (!this.get('statsByCategory')) {\n var _ret = (function () {\n var stats = _this.get('stats');\n\n // Removes any key in NodeStatsHelp that is not found in stats\n var pruned = _lodashLodash['default'].pick(_emberRiakExplorerUtilsRiakHelpRiak_status['default'], Object.keys(stats));\n\n // Adds Current Value from stats and merges it with the appropriate key in StatsHelp\n var merged = _lodashLodash['default'].forEach(pruned, function (value, key) {\n value.current_value = stats[key];\n\n // Stringify \"disk\" property so it can be displayed in the UI\n if (key === 'disk') {\n value.current_value = value.current_value.map(function (obj) {\n return JSON.stringify(obj);\n });\n }\n });\n\n // Groups all the keys in NodeStatsHelp by category\n var groupedBy = _lodashLodash['default'].groupBy(merged, 'category');\n\n // Alpha-sort by category\n var sorted = {};\n Object.keys(groupedBy).sort().forEach(function (key) {\n sorted[key] = groupedBy[key];\n });\n\n return {\n v: _this.set('statsByCategory', sorted)\n };\n })();\n\n if (typeof _ret === 'object') return _ret.v;\n }\n }).observes('stats')\n });\n});","define('ember-riak-explorer/pods/node/monitoring/controller', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/modal'], function (exports, _ember, _emberRiakExplorerMixinsControllerModal) {\n exports['default'] = _ember['default'].Controller.extend(_emberRiakExplorerMixinsControllerModal['default'], {\n currentGraphs: [],\n\n availableGraphs: [],\n\n actions: {\n updateGraphName: function updateGraphName(graph, newStat) {\n return this.set('currentGraphs', this.get('currentGraphs').map(function (graphName) {\n return graphName === graph ? newStat : graphName;\n }));\n },\n\n addNewGraph: function addNewGraph(graph) {\n this.get('currentGraphs').pushObject(graph);\n this.send('hideModal');\n },\n\n removeGraph: function removeGraph(graph) {\n this.set('currentGraphs', this.get('currentGraphs').filter(function (graphName) {\n return graphName !== graph;\n }));\n }\n }\n });\n});","define('ember-riak-explorer/pods/node/monitoring/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/monitoring', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesMonitoring, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesMonitoring['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n model: function model(params) {\n return this.explorer.getNode(params.clusterName, params.nodeName);\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n node: model,\n crudAction: 'monitoring'\n });\n this.setViewLabel({\n preLabel: 'Node Monitoring',\n label: model.get('name')\n });\n },\n\n setupController: function setupController(controller, model) {\n this._super(controller, model);\n\n this.setPossibleGraphOptions(model.get('stats'));\n this.setDefaultGraph();\n }\n });\n});","define(\"ember-riak-explorer/pods/node/monitoring/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 6,\n \"column\": 8\n },\n \"end\": {\n \"line\": 14,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/monitoring/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"statOption\", [\"loc\", [null, [13, 10], [13, 24]]]]],\n locals: [\"statOption\"],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 17,\n \"column\": 10\n },\n \"end\": {\n \"line\": 19,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/monitoring/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" Graph Descritpion\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 4\n },\n \"end\": {\n \"line\": 29,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/monitoring/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-label\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"span\");\n var el3 = dom.createTextNode(\"Displayed Graph:\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"button\");\n dom.setAttribute(el2, \"type\", \"button\");\n dom.setAttribute(el2, \"class\", \"action-button delete\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"ion-ios-trash\");\n dom.setAttribute(el3, \"aria-hidden\", \"true\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n Remove Graph\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element3 = dom.childAt(fragment, [1]);\n var element4 = dom.childAt(fragment, [3, 1]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(element3, 3, 3);\n morphs[1] = dom.createMorphAt(dom.childAt(element3, [5]), 1, 1);\n morphs[2] = dom.createElementMorph(element4);\n return morphs;\n },\n statements: [[\"block\", \"power-select\", [], [\"selected\", [\"subexpr\", \"@mut\", [[\"get\", \"statName\", [\"loc\", [null, [7, 17], [7, 25]]]]], [], []], \"options\", [\"subexpr\", \"@mut\", [[\"get\", \"availableGraphs\", [\"loc\", [null, [8, 16], [8, 31]]]]], [], []], \"searchEnabled\", true, \"onchange\", [\"subexpr\", \"action\", [\"updateGraphName\", [\"get\", \"statName\", [\"loc\", [null, [10, 43], [10, 51]]]]], [], [\"loc\", [null, [10, 17], [10, 52]]]], \"class\", \"node-chart-select\"], 0, null, [\"loc\", [null, [6, 8], [14, 25]]]], [\"block\", \"tooltip.node-stats\", [], [\"itemKey\", [\"subexpr\", \"@mut\", [[\"get\", \"statName\", [\"loc\", [null, [17, 40], [17, 48]]]]], [], []], \"useIcon\", false], 1, null, [\"loc\", [null, [17, 10], [19, 33]]]], [\"element\", \"action\", [\"removeGraph\", [\"get\", \"statName\", [\"loc\", [null, [24, 82], [24, 90]]]]], [], [\"loc\", [null, [24, 59], [24, 92]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 30,\n \"column\": 4\n },\n \"end\": {\n \"line\": 32,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/monitoring/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"charts.node-stat\", [], [\"node\", [\"subexpr\", \"@mut\", [[\"get\", \"model\", [\"loc\", [null, [31, 30], [31, 35]]]]], [], []], \"statToGraph\", [\"subexpr\", \"@mut\", [[\"get\", \"statName\", [\"loc\", [null, [31, 48], [31, 56]]]]], [], []]], [\"loc\", [null, [31, 6], [31, 58]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 33,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/monitoring/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [], 0, null, [\"loc\", [null, [3, 4], [29, 32]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [30, 4], [32, 30]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 34,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/monitoring/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [], 0, null, [\"loc\", [null, [2, 2], [33, 33]]]]],\n locals: [\"statName\"],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 39,\n \"column\": 2\n },\n \"end\": {\n \"line\": 44,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/monitoring/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"button\");\n dom.setAttribute(el1, \"class\", \"btn btn-primary\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"ion-plus-circled\");\n dom.setAttribute(el2, \"aria-hidden\", \"true\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n Add new graph\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element2 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element2);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"showModal\"], [], [\"loc\", [null, [40, 36], [40, 58]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 38,\n \"column\": 0\n },\n \"end\": {\n \"line\": 45,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/monitoring/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.body\", [], [], 0, null, [\"loc\", [null, [39, 2], [44, 28]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 62,\n \"column\": 8\n },\n \"end\": {\n \"line\": 69,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/monitoring/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"statOption\", [\"loc\", [null, [68, 10], [68, 24]]]]],\n locals: [\"statOption\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 49,\n \"column\": 2\n },\n \"end\": {\n \"line\": 76,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/monitoring/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"modal-content-container\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"header\");\n dom.setAttribute(el2, \"class\", \"modal-header\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"h3\");\n var el4 = dom.createTextNode(\"New Graph\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"section\");\n dom.setAttribute(el2, \"class\", \"modal-body\");\n dom.setAttribute(el2, \"style\", \"min-width: 300px;\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"p\");\n var el4 = dom.createTextNode(\"\\n Select a new statistic to add it to the dashboard.\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"footer\");\n dom.setAttribute(el2, \"class\", \"modal-footer\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"button\");\n dom.setAttribute(el3, \"class\", \"btn btn-default\");\n var el4 = dom.createTextNode(\"Cancel\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var element1 = dom.childAt(element0, [5, 1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [3]), 3, 3);\n morphs[1] = dom.createElementMorph(element1);\n return morphs;\n },\n statements: [[\"block\", \"power-select\", [], [\"selected\", \"\", \"options\", [\"subexpr\", \"@mut\", [[\"get\", \"availableGraphs\", [\"loc\", [null, [64, 16], [64, 31]]]]], [], []], \"searchEnabled\", true, \"onchange\", [\"subexpr\", \"action\", [\"addNewGraph\"], [], [\"loc\", [null, [66, 17], [66, 39]]]]], 0, null, [\"loc\", [null, [62, 8], [69, 25]]]], [\"element\", \"action\", [\"hideModal\"], [], [\"loc\", [null, [73, 40], [73, 62]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 48,\n \"column\": 0\n },\n \"end\": {\n \"line\": 77,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/monitoring/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"modal-dialog\", [], [\"close\", \"hideModal\", \"translucentOverlay\", true], 0, null, [\"loc\", [null, [49, 2], [76, 19]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 79,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/monitoring/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"currentGraphs\", [\"loc\", [null, [1, 8], [1, 21]]]]], [], 0, null, [\"loc\", [null, [1, 0], [34, 9]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"no-border\"], 1, null, [\"loc\", [null, [38, 0], [45, 31]]]], [\"block\", \"if\", [[\"get\", \"modalVisible\", [\"loc\", [null, [48, 6], [48, 18]]]]], [], 2, null, [\"loc\", [null, [48, 0], [77, 7]]]]],\n locals: [],\n templates: [child0, child1, child2]\n };\n })());\n});","define('ember-riak-explorer/pods/node/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n model: function model(params) {\n return this.explorer.getNode(params.clusterName, params.nodeName);\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n node: model\n });\n this.setViewLabel({\n preLabel: 'Node Detail',\n label: model.get('name')\n });\n\n if (model.get('cluster').get('isEnterpriseEdition')) {\n return this.explorer.getNodeReplicationStatus(model);\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/node/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 8,\n \"column\": 10\n },\n \"end\": {\n \"line\": 8,\n \"column\": 44\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"Replication Status\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 7,\n \"column\": 8\n },\n \"end\": {\n \"line\": 9,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"block\", \"tablist.tab\", [], [], 0, null, [\"loc\", [null, [8, 10], [8, 60]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 10,\n \"column\": 8\n },\n \"end\": {\n \"line\": 10,\n \"column\": 37\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"Configuration\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 11,\n \"column\": 8\n },\n \"end\": {\n \"line\": 11,\n \"column\": 34\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"Statistics\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child3 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 12,\n \"column\": 8\n },\n \"end\": {\n \"line\": 12,\n \"column\": 33\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"Log Files\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child4 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 13,\n \"column\": 8\n },\n \"end\": {\n \"line\": 13,\n \"column\": 36\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"Config Files\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 6,\n \"column\": 6\n },\n \"end\": {\n \"line\": 15,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(6);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);\n morphs[4] = dom.createMorphAt(fragment, 8, 8, contextualElement);\n morphs[5] = dom.createMorphAt(fragment, 10, 10, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.cluster.isEnterpriseEdition\", [\"loc\", [null, [7, 14], [7, 47]]]]], [], 0, null, [\"loc\", [null, [7, 8], [9, 15]]]], [\"block\", \"tablist.tab\", [], [], 1, null, [\"loc\", [null, [10, 8], [10, 53]]]], [\"block\", \"tablist.tab\", [], [], 2, null, [\"loc\", [null, [11, 8], [11, 50]]]], [\"block\", \"tablist.tab\", [], [], 3, null, [\"loc\", [null, [12, 8], [12, 49]]]], [\"block\", \"tablist.tab\", [], [], 4, null, [\"loc\", [null, [13, 8], [13, 52]]]], [\"inline\", \"link-to\", [\"Monitoring\", \"node.monitoring\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [14, 49], [14, 67]]]], [\"get\", \"model.name\", [\"loc\", [null, [14, 68], [14, 78]]]]], [\"class\", \"ivy-tab\"], [\"loc\", [null, [14, 8], [14, 96]]]]],\n locals: [\"tablist\"],\n templates: [child0, child1, child2, child3, child4]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 22,\n \"column\": 12\n },\n \"end\": {\n \"line\": 27,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 2,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element4 = dom.childAt(fragment, [1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(dom.childAt(element4, [1]), 0, 0);\n morphs[1] = dom.createMorphAt(dom.childAt(element4, [3, 0]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"statKey\", [\"loc\", [null, [24, 32], [24, 43]]]], [\"content\", \"statValue\", [\"loc\", [null, [25, 40], [25, 53]]]]],\n locals: [\"statKey\", \"statValue\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 19,\n \"column\": 8\n },\n \"end\": {\n \"line\": 30,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"table\");\n dom.setAttribute(el1, \"class\", \"key-value-table\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tbody\");\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each-in\", [[\"get\", \"model.replStatus\", [\"loc\", [null, [22, 23], [22, 39]]]]], [], 0, null, [\"loc\", [null, [22, 12], [27, 24]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 18,\n \"column\": 6\n },\n \"end\": {\n \"line\": 31,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"tabs.tabpanel\", [], [], 0, null, [\"loc\", [null, [19, 8], [30, 26]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 38,\n \"column\": 12\n },\n \"end\": {\n \"line\": 40,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 0]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"advancedItem\", [\"loc\", [null, [39, 24], [39, 40]]]]],\n locals: [\"advancedItem\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 35,\n \"column\": 8\n },\n \"end\": {\n \"line\": 44,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createTextNode(\"Advanced\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n dom.setAttribute(el1, \"class\", \"code-list\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createTextNode(\"General\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"model.advancedConfig\", [\"loc\", [null, [38, 20], [38, 40]]]]], [], 0, null, [\"loc\", [null, [38, 12], [40, 21]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 48,\n \"column\": 10\n },\n \"end\": {\n \"line\": 56,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 2,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element2 = dom.childAt(fragment, [1]);\n var element3 = dom.childAt(element2, [1]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(element3, 1, 1);\n morphs[1] = dom.createMorphAt(element3, 3, 3);\n morphs[2] = dom.createMorphAt(dom.childAt(element2, [3, 0]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"name\", [\"loc\", [null, [51, 16], [51, 24]]]], [\"inline\", \"tooltip.node-config\", [], [\"itemKey\", [\"subexpr\", \"@mut\", [[\"get\", \"name\", [\"loc\", [null, [52, 46], [52, 50]]]]], [], []]], [\"loc\", [null, [52, 16], [52, 52]]]], [\"content\", \"value\", [\"loc\", [null, [54, 38], [54, 47]]]]],\n locals: [\"name\", \"value\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 34,\n \"column\": 6\n },\n \"end\": {\n \"line\": 59,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"table\");\n dom.setAttribute(el1, \"class\", \"key-value-table\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tbody\");\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2, 1]), 1, 1);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.advancedConfig\", [\"loc\", [null, [35, 14], [35, 34]]]]], [], 0, null, [\"loc\", [null, [35, 8], [44, 15]]]], [\"block\", \"each-in\", [[\"get\", \"model.config\", [\"loc\", [null, [48, 21], [48, 33]]]]], [], 1, null, [\"loc\", [null, [48, 10], [56, 22]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child3 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 68,\n \"column\": 14\n },\n \"end\": {\n \"line\": 70,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"category\", [\"loc\", [null, [69, 16], [69, 28]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 67,\n \"column\": 12\n },\n \"end\": {\n \"line\": 71,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 2,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"tablist.tab\", [], [], 0, null, [\"loc\", [null, [68, 14], [70, 30]]]]],\n locals: [\"category\", \"stats\"],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 66,\n \"column\": 10\n },\n \"end\": {\n \"line\": 72,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"each-in\", [[\"get\", \"model.statsByCategory\", [\"loc\", [null, [67, 23], [67, 44]]]]], [], 0, null, [\"loc\", [null, [67, 12], [71, 24]]]]],\n locals: [\"tablist\"],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 78,\n \"column\": 16\n },\n \"end\": {\n \"line\": 88,\n \"column\": 16\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var element1 = dom.childAt(element0, [1]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(element1, 1, 1);\n morphs[1] = dom.createMorphAt(element1, 3, 3);\n morphs[2] = dom.createMorphAt(dom.childAt(element0, [3, 1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"stat.name\", [\"loc\", [null, [81, 22], [81, 35]]]], [\"inline\", \"tooltip.node-stats\", [], [\"itemKey\", [\"subexpr\", \"@mut\", [[\"get\", \"stat.name\", [\"loc\", [null, [82, 51], [82, 60]]]]], [], []]], [\"loc\", [null, [82, 22], [82, 62]]]], [\"content\", \"stat.current_value\", [\"loc\", [null, [85, 28], [85, 50]]]]],\n locals: [\"stat\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 75,\n \"column\": 12\n },\n \"end\": {\n \"line\": 91,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"table\");\n dom.setAttribute(el1, \"class\", \"key-value-table\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tbody\");\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"stats\", [\"loc\", [null, [78, 24], [78, 29]]]]], [], 0, null, [\"loc\", [null, [78, 16], [88, 25]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 74,\n \"column\": 10\n },\n \"end\": {\n \"line\": 92,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 2,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"tabs.tabpanel\", [], [], 0, null, [\"loc\", [null, [75, 12], [91, 30]]]]],\n locals: [\"category\", \"stats\"],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 65,\n \"column\": 8\n },\n \"end\": {\n \"line\": 93,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"tabs.tablist\", [], [\"class\", \"capitalize\"], 0, null, [\"loc\", [null, [66, 10], [72, 27]]]], [\"block\", \"each-in\", [[\"get\", \"model.statsByCategory\", [\"loc\", [null, [74, 21], [74, 42]]]]], [], 1, null, [\"loc\", [null, [74, 10], [92, 22]]]]],\n locals: [\"tabs\"],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 62,\n \"column\": 6\n },\n \"end\": {\n \"line\": 94,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"ivy-tabs\", [], [\"on-select\", [\"subexpr\", \"action\", [[\"subexpr\", \"mut\", [[\"get\", \"nestedSelectedIndex\", [\"loc\", [null, [65, 43], [65, 62]]]]], [], [\"loc\", [null, [65, 38], [65, 63]]]]], [], [\"loc\", [null, [65, 30], [65, 64]]]], \"selected-index\", [\"subexpr\", \"@mut\", [[\"get\", \"nestedSelectedIndex\", [\"loc\", [null, [65, 80], [65, 99]]]]], [], []], \"class\", \"vertical\"], 0, null, [\"loc\", [null, [65, 8], [93, 21]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child4 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 100,\n \"column\": 12\n },\n \"end\": {\n \"line\": 104,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [[\"get\", \"logFile.name\", [\"loc\", [null, [102, 26], [102, 38]]]], \"log-file\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [102, 50], [102, 68]]]], [\"get\", \"model.name\", [\"loc\", [null, [102, 69], [102, 79]]]], [\"get\", \"logFile.name\", [\"loc\", [null, [102, 80], [102, 92]]]]], [], [\"loc\", [null, [102, 16], [102, 94]]]]],\n locals: [\"logFile\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 98,\n \"column\": 8\n },\n \"end\": {\n \"line\": 106,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n dom.setAttribute(el1, \"class\", \"button-list\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"model.logFiles\", [\"loc\", [null, [100, 20], [100, 34]]]]], [], 0, null, [\"loc\", [null, [100, 12], [104, 21]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 106,\n \"column\": 8\n },\n \"end\": {\n \"line\": 108,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" No log files for this node\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 97,\n \"column\": 6\n },\n \"end\": {\n \"line\": 109,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.logFiles\", [\"loc\", [null, [98, 14], [98, 28]]]]], [], 0, 1, [\"loc\", [null, [98, 8], [108, 15]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child5 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 115,\n \"column\": 12\n },\n \"end\": {\n \"line\": 119,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [[\"get\", \"configFile.name\", [\"loc\", [null, [117, 26], [117, 41]]]], \"config-file\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [117, 56], [117, 74]]]], [\"get\", \"model.name\", [\"loc\", [null, [117, 75], [117, 85]]]], [\"get\", \"configFile.name\", [\"loc\", [null, [117, 86], [117, 101]]]]], [], [\"loc\", [null, [117, 16], [117, 103]]]]],\n locals: [\"configFile\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 113,\n \"column\": 8\n },\n \"end\": {\n \"line\": 121,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n dom.setAttribute(el1, \"class\", \"button-list\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"model.configFiles\", [\"loc\", [null, [115, 20], [115, 37]]]]], [], 0, null, [\"loc\", [null, [115, 12], [119, 21]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 121,\n \"column\": 8\n },\n \"end\": {\n \"line\": 123,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" No config files for this node\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 112,\n \"column\": 6\n },\n \"end\": {\n \"line\": 124,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.configFiles\", [\"loc\", [null, [113, 14], [113, 31]]]]], [], 0, 1, [\"loc\", [null, [113, 8], [123, 15]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 5,\n \"column\": 4\n },\n \"end\": {\n \"line\": 125,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(6);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);\n morphs[4] = dom.createMorphAt(fragment, 8, 8, contextualElement);\n morphs[5] = dom.createMorphAt(fragment, 10, 10, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"tabs.tablist\", [], [], 0, null, [\"loc\", [null, [6, 6], [15, 23]]]], [\"block\", \"if\", [[\"get\", \"model.cluster.isEnterpriseEdition\", [\"loc\", [null, [18, 12], [18, 45]]]]], [], 1, null, [\"loc\", [null, [18, 6], [31, 13]]]], [\"block\", \"tabs.tabpanel\", [], [], 2, null, [\"loc\", [null, [34, 6], [59, 24]]]], [\"block\", \"tabs.tabpanel\", [], [], 3, null, [\"loc\", [null, [62, 6], [94, 24]]]], [\"block\", \"tabs.tabpanel\", [], [], 4, null, [\"loc\", [null, [97, 6], [109, 24]]]], [\"block\", \"tabs.tabpanel\", [], [], 5, null, [\"loc\", [null, [112, 6], [124, 24]]]]],\n locals: [\"tabs\"],\n templates: [child0, child1, child2, child3, child4, child5]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 2\n },\n \"end\": {\n \"line\": 126,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"ivy-tabs\", [], [\"on-select\", [\"subexpr\", \"action\", [[\"subexpr\", \"mut\", [[\"get\", \"selectedIndex\", [\"loc\", [null, [5, 39], [5, 52]]]]], [], [\"loc\", [null, [5, 34], [5, 53]]]]], [], [\"loc\", [null, [5, 26], [5, 54]]]], \"selected-index\", [\"subexpr\", \"@mut\", [[\"get\", \"selectedIndex\", [\"loc\", [null, [5, 70], [5, 83]]]]], [], []]], 0, null, [\"loc\", [null, [5, 4], [125, 17]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 0\n },\n \"end\": {\n \"line\": 127,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.body\", [], [], 0, null, [\"loc\", [null, [3, 2], [126, 28]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 128,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/node/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [], 0, null, [\"loc\", [null, [2, 0], [127, 31]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define('ember-riak-explorer/pods/riak-object/controller', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Controller.extend({\n loadingMessage: 'Attempting request...',\n\n showLoadingSpinner: false,\n\n stringifiedContents: '',\n\n errors: []\n });\n});","define('ember-riak-explorer/pods/riak-object/counter/controller', ['exports', 'ember-riak-explorer/pods/riak-object/controller'], function (exports, _emberRiakExplorerPodsRiakObjectController) {\n exports['default'] = _emberRiakExplorerPodsRiakObjectController['default'].extend({});\n});","define('ember-riak-explorer/pods/riak-object/counter/route', ['exports', 'ember-riak-explorer/pods/riak-object/route'], function (exports, _emberRiakExplorerPodsRiakObjectRoute) {\n exports['default'] = _emberRiakExplorerPodsRiakObjectRoute['default'].extend({\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n bucketType: model.get('bucketType'),\n bucket: model.get('bucket'),\n riakObject: model\n });\n this.setViewLabel({\n preLabel: 'Object',\n label: model.get('name')\n });\n },\n\n actions: {\n increment: function increment(counter) {\n var currentValue = counter.get('contents');\n var newValue = currentValue + 1;\n\n counter.set('contents', newValue);\n this.explorer.updateCRDT(counter, { increment: 1 });\n },\n\n decrement: function decrement(counter) {\n var currentValue = counter.get('contents');\n var newValue = currentValue - 1;\n\n counter.set('contents', newValue);\n this.explorer.updateCRDT(counter, { decrement: 1 });\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/riak-object/counter/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 4\n },\n \"end\": {\n \"line\": 11,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/counter/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"button\");\n dom.setAttribute(el2, \"type\", \"button\");\n dom.setAttribute(el2, \"class\", \"action-button delete\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"ion-trash-a\");\n dom.setAttribute(el3, \"aria-hidden\", \"true\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n Delete Object\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element4 = dom.childAt(fragment, [1, 1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element4);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"deleteObject\", [\"get\", \"model\", [\"loc\", [null, [6, 34], [6, 39]]]]], [], [\"loc\", [null, [6, 10], [6, 41]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 12,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/counter/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.isLoaded\", [\"loc\", [null, [3, 10], [3, 24]]]]], [], 0, null, [\"loc\", [null, [3, 4], [11, 11]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 14,\n \"column\": 4\n },\n \"end\": {\n \"line\": 16,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/counter/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"loading-spinner\", [], [\"statusMessage\", [\"subexpr\", \"@mut\", [[\"get\", \"loadingMessage\", [\"loc\", [null, [15, 38], [15, 52]]]]], [], []]], [\"loc\", [null, [15, 6], [15, 54]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 16,\n \"column\": 4\n },\n \"end\": {\n \"line\": 40,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/counter/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"table\");\n dom.setAttribute(el1, \"class\", \"key-value-table\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tbody\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"Current Value:\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value counter-value\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createComment(\"\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"\\n Change Value:\\n \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value\");\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n var el5 = dom.createElement(\"form\");\n dom.setAttribute(el5, \"class\", \"form-inline\");\n var el6 = dom.createTextNode(\"\\n \");\n dom.appendChild(el5, el6);\n var el6 = dom.createElement(\"button\");\n dom.setAttribute(el6, \"type\", \"button\");\n dom.setAttribute(el6, \"class\", \"btn btn-primary\");\n var el7 = dom.createTextNode(\"\\n \");\n dom.appendChild(el6, el7);\n var el7 = dom.createElement(\"span\");\n dom.setAttribute(el7, \"class\", \"ion-minus-round\");\n dom.setAttribute(el7, \"aria-hidden\", \"true\");\n dom.appendChild(el6, el7);\n var el7 = dom.createTextNode(\"\\n \");\n dom.appendChild(el6, el7);\n dom.appendChild(el5, el6);\n var el6 = dom.createTextNode(\"\\n \");\n dom.appendChild(el5, el6);\n var el6 = dom.createElement(\"button\");\n dom.setAttribute(el6, \"type\", \"button\");\n dom.setAttribute(el6, \"class\", \"btn btn-primary\");\n var el7 = dom.createTextNode(\"\\n \");\n dom.appendChild(el6, el7);\n var el7 = dom.createElement(\"span\");\n dom.setAttribute(el7, \"class\", \"ion-plus-round\");\n dom.setAttribute(el7, \"aria-hidden\", \"true\");\n dom.appendChild(el6, el7);\n var el7 = dom.createTextNode(\"\\n \");\n dom.appendChild(el6, el7);\n dom.appendChild(el5, el6);\n var el6 = dom.createTextNode(\"\\n \");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1, 1]);\n var element1 = dom.childAt(element0, [3, 3, 1]);\n var element2 = dom.childAt(element1, [1]);\n var element3 = dom.childAt(element1, [3]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [1, 3, 0]), 0, 0);\n morphs[1] = dom.createElementMorph(element2);\n morphs[2] = dom.createElementMorph(element3);\n return morphs;\n },\n statements: [[\"content\", \"model.contents\", [\"loc\", [null, [21, 48], [21, 66]]]], [\"element\", \"action\", [\"decrement\", [\"get\", \"model\", [\"loc\", [null, [29, 81], [29, 86]]]]], [], [\"loc\", [null, [29, 60], [29, 88]]]], [\"element\", \"action\", [\"increment\", [\"get\", \"model\", [\"loc\", [null, [32, 81], [32, 86]]]]], [], [\"loc\", [null, [32, 60], [32, 88]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 13,\n \"column\": 2\n },\n \"end\": {\n \"line\": 41,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/counter/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"showLoadingSpinner\", [\"loc\", [null, [14, 10], [14, 28]]]]], [], 0, 1, [\"loc\", [null, [14, 4], [40, 11]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 42,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/counter/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Object Details\"], 0, null, [\"loc\", [null, [2, 2], [12, 30]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [13, 2], [41, 28]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 42,\n \"column\": 31\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/counter/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [\"class\", \"object-counter-container small-width\"], 0, null, [\"loc\", [null, [1, 0], [42, 31]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define('ember-riak-explorer/pods/riak-object/create/controller', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = _ember['default'].Controller.extend({\n properties: [],\n\n showSpinner: false,\n\n spinnerMessage: 'loading ...',\n\n errors: [],\n\n clearState: function clearState() {\n this.set('showSpinner', false);\n this.set('properties', []);\n this.set('errors', []);\n }\n });\n});","define('ember-riak-explorer/pods/riak-object/create/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/alerts', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state', 'ember-riak-explorer/utils/validations', 'ember-riak-explorer/utils/riak-object-formatter', 'lodash/lodash'], function (exports, _ember, _emberRiakExplorerMixinsRoutesAlerts, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState, _emberRiakExplorerUtilsValidations, _emberRiakExplorerUtilsRiakObjectFormatter, _lodashLodash) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesAlerts['default'], _emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n model: function model(params) {\n var self = this;\n\n return this.explorer.getBucket(params.clusterName, params.bucketTypeName, params.bucketName).then(function (bucket) {\n return self.store.createRecord('riak-object', {\n bucket: bucket,\n type: bucket.get('dataTypeName')\n });\n });\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n bucketType: model.get('bucketType'),\n bucket: model.get('bucket'),\n crudAction: 'create'\n });\n this.setViewLabel({\n preLabel: 'New Object'\n });\n },\n\n isValid: function isValid(object) {\n var isValid = undefined;\n\n try {\n var objectType = object.get('type');\n var objectName = object.get('name');\n\n isValid = _emberRiakExplorerUtilsValidations['default'].hasName('buckets object', objectName) && _emberRiakExplorerUtilsValidations['default'].noWhiteSpaceInName('buckets object', objectName) && _emberRiakExplorerUtilsValidations['default'].objectHasCorrectValueType(objectType, objectName, _emberRiakExplorerUtilsValidations['default'].isJsonParseable(object.get('contents')));\n } catch (e) {\n this.controller.get('errors').pushObject(e.message);\n this.scrollToTop();\n }\n\n return isValid;\n },\n\n actions: {\n didTransition: function didTransition() {\n this.controller.set('errors', []);\n this.controller.set('showSpinner', false);\n },\n\n createObject: function createObject() {\n var self = this;\n var controller = this.controller;\n var riakObject = this.currentModel;\n var clusterName = riakObject.get('cluster').get('name');\n var bucketType = riakObject.get('bucketType');\n var bucket = riakObject.get('bucket');\n var bucketTypeName = bucketType.get('name');\n var bucketName = bucket.get('name');\n var objectName = riakObject.get('name');\n\n controller.set('errors', []);\n\n if (this.isValid(riakObject)) {\n var contents = riakObject.set('contents', _emberRiakExplorerUtilsValidations['default'].isJsonParseable(riakObject.get('contents'))); // set contents of the object as the JSON parsed version;\n var serializedData = _emberRiakExplorerUtilsRiakObjectFormatter['default'].formatRiakObject(riakObject.get('type'), contents);\n var createObject = bucketType.get('isCRDT') ? _lodashLodash['default'].partial(this.explorer.createCRDT, clusterName, bucketTypeName, bucketName, objectName, serializedData) : _lodashLodash['default'].bind(riakObject.save, riakObject);\n\n controller.set('spinnerMessage', 'Creating Object ...');\n controller.set('showSpinner', true);\n\n // createBucket()\n createObject().then(function () {\n return self.explorer.refreshObjectList(bucket);\n }).then(function onSuccess() {\n self.transitionTo(riakObject.get('routePath'), clusterName, bucketTypeName, bucketName, objectName);\n }, function onFail() {\n controller.set('showSpinner', false);\n // TODO: Don't use template\n self.render('alerts.error-request-was-not-processed', {\n into: 'application',\n outlet: 'alert'\n });\n });\n }\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/riak-object/create/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 5,\n \"column\": 6\n },\n \"end\": {\n \"line\": 7,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/create/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createUnsafeMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"error\", [\"loc\", [null, [6, 12], [6, 23]]]]],\n locals: [\"error\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 9,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"label label-danger\");\n var el3 = dom.createTextNode(\"Errors\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"errors\", [\"loc\", [null, [5, 14], [5, 20]]]]], [], 0, null, [\"loc\", [null, [5, 6], [7, 15]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 10,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"danger\"], 0, null, [\"loc\", [null, [2, 2], [9, 22]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 15,\n \"column\": 6\n },\n \"end\": {\n \"line\": 18,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-close-round\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Cancel\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 13,\n \"column\": 2\n },\n \"end\": {\n \"line\": 20,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link.explorer-resource\", [], [\"resourceType\", \"bucket\", \"resourceObj\", [\"subexpr\", \"@mut\", [[\"get\", \"model.bucket\", [\"loc\", [null, [15, 66], [15, 78]]]]], [], []], \"linkClass\", \"cancel action-button\"], 0, null, [\"loc\", [null, [15, 6], [18, 33]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 22,\n \"column\": 4\n },\n \"end\": {\n \"line\": 24,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"loading-spinner\", [], [\"statusMessage\", [\"subexpr\", \"@mut\", [[\"get\", \"spinnerMessage\", [\"loc\", [null, [23, 38], [23, 52]]]]], [], []]], [\"loc\", [null, [23, 6], [23, 54]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 24,\n \"column\": 4\n },\n \"end\": {\n \"line\": 28,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"new-object-inputs\", [], [\"object\", [\"subexpr\", \"@mut\", [[\"get\", \"model\", [\"loc\", [null, [25, 33], [25, 38]]]]], [], []]], [\"loc\", [null, [25, 6], [25, 40]]]], [\"inline\", \"form.explorer-button\", [], [\"label\", \"Create Object\", \"buttonClick\", \"createObject\"], [\"loc\", [null, [27, 6], [27, 79]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 21,\n \"column\": 2\n },\n \"end\": {\n \"line\": 29,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"showSpinner\", [\"loc\", [null, [22, 10], [22, 21]]]]], [], 0, 1, [\"loc\", [null, [22, 4], [28, 11]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 12,\n \"column\": 0\n },\n \"end\": {\n \"line\": 30,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Create Object Form\"], 0, null, [\"loc\", [null, [13, 2], [20, 30]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [21, 2], [29, 28]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 30,\n \"column\": 31\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"errors\", [\"loc\", [null, [1, 6], [1, 12]]]]], [], 0, null, [\"loc\", [null, [1, 0], [10, 7]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"small-width bucket-create-container\"], 1, null, [\"loc\", [null, [12, 0], [30, 31]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })());\n});","define('ember-riak-explorer/pods/riak-object/edit/route', ['exports', 'ember-riak-explorer/pods/riak-object/route'], function (exports, _emberRiakExplorerPodsRiakObjectRoute) {\n exports['default'] = _emberRiakExplorerPodsRiakObjectRoute['default'].extend({\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n bucketType: model.get('bucketType'),\n bucket: model.get('bucket'),\n riakObject: model,\n crudAction: 'edit'\n });\n this.setViewLabel({\n preLabel: 'Object',\n label: model.get('name')\n });\n },\n\n actions: {\n updateObject: function updateObject(object) {\n var self = this;\n var controller = this.controller;\n var clusterName = object.get('cluster').get('name');\n var bucketTypeName = object.get('bucketType').get('name');\n var bucketName = object.get('bucket').get('name');\n var objectName = object.get('name');\n\n try {\n object.set('contents', JSON.parse(controller.get('stringifiedContents')));\n object.save().then(function () {\n self.transitionTo('riak-object', clusterName, bucketTypeName, bucketName, objectName);\n });\n } catch (e) {\n self.scrollToTop();\n self.showAlert('alerts.error-must-be-json-parseable');\n }\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/riak-object/edit/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 4,\n \"column\": 6\n },\n \"end\": {\n \"line\": 12,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-close-round\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Cancel\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 14,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"riak-object\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [5, 6], [5, 24]]]], [\"get\", \"model.bucketType.name\", [\"loc\", [null, [6, 6], [6, 27]]]], [\"get\", \"model.bucket.name\", [\"loc\", [null, [7, 6], [7, 23]]]], [\"get\", \"model.name\", [\"loc\", [null, [8, 6], [8, 16]]]]], [\"class\", \"action-button cancel\"], 0, null, [\"loc\", [null, [4, 6], [12, 18]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 37,\n \"column\": 8\n },\n \"end\": {\n \"line\": 42,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"form-group content-type\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"label\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element1 = dom.childAt(fragment, [1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(dom.childAt(element1, [1]), 0, 0);\n morphs[1] = dom.createMorphAt(element1, 3, 3);\n return morphs;\n },\n statements: [[\"content\", \"header.key\", [\"loc\", [null, [39, 19], [39, 33]]]], [\"inline\", \"input\", [], [\"value\", [\"subexpr\", \"@mut\", [[\"get\", \"header.value\", [\"loc\", [null, [40, 26], [40, 38]]]]], [], []], \"id\", [\"subexpr\", \"@mut\", [[\"get\", \"header.key\", [\"loc\", [null, [40, 42], [40, 52]]]]], [], []], \"class\", \"form-control\"], [\"loc\", [null, [40, 12], [40, 75]]]]],\n locals: [\"header\"],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 46,\n \"column\": 8\n },\n \"end\": {\n \"line\": 51,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"form-group content-type\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"label\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 0, 0);\n morphs[1] = dom.createMorphAt(element0, 3, 3);\n return morphs;\n },\n statements: [[\"content\", \"header.key\", [\"loc\", [null, [48, 19], [48, 33]]]], [\"inline\", \"input\", [], [\"value\", [\"subexpr\", \"@mut\", [[\"get\", \"header.value\", [\"loc\", [null, [49, 26], [49, 38]]]]], [], []], \"id\", [\"subexpr\", \"@mut\", [[\"get\", \"header.key\", [\"loc\", [null, [49, 42], [49, 52]]]]], [], []], \"class\", \"form-control\"], [\"loc\", [null, [49, 12], [49, 75]]]]],\n locals: [\"header\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 16,\n \"column\": 2\n },\n \"end\": {\n \"line\": 60,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"update-object-form\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"section\");\n dom.setAttribute(el2, \"class\", \"object-contents\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"section-title\");\n var el4 = dom.createTextNode(\"Object Contents\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"form-group content-type\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"label\");\n var el5 = dom.createTextNode(\"Content Type\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"form-group content\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"label\");\n var el5 = dom.createTextNode(\"Content\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"section\");\n dom.setAttribute(el2, \"class\", \"secondary-indexes\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"section-title\");\n var el4 = dom.createTextNode(\"Secondary Indexes\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"section\");\n dom.setAttribute(el2, \"class\", \"custom-headers\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"section-title\");\n var el4 = dom.createTextNode(\"Custom Headers\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"section\");\n dom.setAttribute(el2, \"class\", \"update-object\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"button\");\n dom.setAttribute(el3, \"type\", \"button\");\n dom.setAttribute(el3, \"class\", \"btn btn-primary\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"span\");\n dom.setAttribute(el4, \"class\", \"ion-edit\");\n dom.setAttribute(el4, \"aria-hidden\", \"true\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n Update Object\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element2 = dom.childAt(fragment, [1]);\n var element3 = dom.childAt(element2, [1]);\n var element4 = dom.childAt(element2, [7, 1]);\n var morphs = new Array(5);\n morphs[0] = dom.createMorphAt(dom.childAt(element3, [3]), 3, 3);\n morphs[1] = dom.createMorphAt(dom.childAt(element3, [5]), 3, 3);\n morphs[2] = dom.createMorphAt(dom.childAt(element2, [3]), 3, 3);\n morphs[3] = dom.createMorphAt(dom.childAt(element2, [5]), 3, 3);\n morphs[4] = dom.createElementMorph(element4);\n return morphs;\n },\n statements: [[\"inline\", \"input\", [], [\"value\", [\"subexpr\", \"@mut\", [[\"get\", \"model.contentType\", [\"loc\", [null, [22, 24], [22, 41]]]]], [], []], \"id\", \"metadata.contentType\", \"class\", \"form-control\"], [\"loc\", [null, [22, 10], [24, 32]]]], [\"inline\", \"ivy-codemirror\", [], [\"mode\", \"javascript\", \"theme\", \"material\", \"lineWrapping\", true, \"value\", [\"subexpr\", \"mut\", [[\"get\", \"stringifiedContents\", [\"loc\", [null, [32, 21], [32, 40]]]]], [], [\"loc\", [null, [32, 16], [32, 41]]]]], [\"loc\", [null, [28, 10], [32, 43]]]], [\"block\", \"each\", [[\"get\", \"model.indexes\", [\"loc\", [null, [37, 16], [37, 29]]]]], [], 0, null, [\"loc\", [null, [37, 8], [42, 17]]]], [\"block\", \"each\", [[\"get\", \"model.headersCustom\", [\"loc\", [null, [46, 16], [46, 35]]]]], [], 1, null, [\"loc\", [null, [46, 8], [51, 17]]]], [\"element\", \"action\", [\"updateObject\", [\"get\", \"model\", [\"loc\", [null, [54, 78], [54, 83]]]]], [], [\"loc\", [null, [54, 54], [54, 85]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 61,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Object Edit\"], 0, null, [\"loc\", [null, [2, 2], [14, 30]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [16, 2], [60, 28]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 62,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [\"class\", \"small-width\"], 0, null, [\"loc\", [null, [1, 0], [61, 31]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define('ember-riak-explorer/pods/riak-object/hll/controller', ['exports', 'ember-riak-explorer/pods/riak-object/controller'], function (exports, _emberRiakExplorerPodsRiakObjectController) {\n exports['default'] = _emberRiakExplorerPodsRiakObjectController['default'].extend({});\n});","define('ember-riak-explorer/pods/riak-object/hll/route', ['exports', 'ember-riak-explorer/pods/riak-object/route'], function (exports, _emberRiakExplorerPodsRiakObjectRoute) {\n exports['default'] = _emberRiakExplorerPodsRiakObjectRoute['default'].extend({\n actions: {\n /**\n * Adds an element to the HLL list.\n * @event addSetElement\n * @param {String} item\n */\n addElement: function addElement(item) {\n var self = this;\n var controller = this.get('controller');\n var hll = this.currentModel;\n var clusterName = hll.get('cluster').get('name');\n var bucketTypeName = hll.get('bucketType').get('name');\n var bucketName = hll.get('bucket').get('name');\n var objectName = hll.get('name');\n\n this.explorer.updateCRDT(hll, { add: item }).then(function () {\n controller.set('showLoadingSpinner', true);\n\n return self.explorer.getObject(clusterName, bucketTypeName, bucketName, objectName);\n }).then(function () {\n return controller.set('showLoadingSpinner', false);\n });\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/riak-object/hll/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 13,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/hll/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"class\", \"action-button raw\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"ion-eye\");\n dom.setAttribute(el3, \"aria-hidden\", \"true\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n View Raw Data\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"button\");\n dom.setAttribute(el2, \"type\", \"button\");\n dom.setAttribute(el2, \"class\", \"action-button delete\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"ion-trash-a\");\n dom.setAttribute(el3, \"aria-hidden\", \"true\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n Delete Object\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element2 = dom.childAt(fragment, [1]);\n var element3 = dom.childAt(element2, [1]);\n var element4 = dom.childAt(element2, [3]);\n var morphs = new Array(2);\n morphs[0] = dom.createAttrMorph(element3, 'href');\n morphs[1] = dom.createElementMorph(element4);\n return morphs;\n },\n statements: [[\"attribute\", \"href\", [\"concat\", [[\"get\", \"model.url\", [\"loc\", [null, [4, 17], [4, 26]]]]]]], [\"element\", \"action\", [\"deleteObject\", [\"get\", \"model\", [\"loc\", [null, [8, 81], [8, 86]]]]], [], [\"loc\", [null, [8, 57], [8, 88]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 15,\n \"column\": 4\n },\n \"end\": {\n \"line\": 17,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/hll/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"loading-spinner\", [], [\"statusMessage\", [\"subexpr\", \"@mut\", [[\"get\", \"loadingMessage\", [\"loc\", [null, [16, 38], [16, 52]]]]], [], []]], [\"loc\", [null, [16, 6], [16, 54]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 17,\n \"column\": 4\n },\n \"end\": {\n \"line\": 32,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/hll/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"table\");\n dom.setAttribute(el1, \"class\", \"key-value-table\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tbody\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"Cardinality\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value\");\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"Add Item to \");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\" list\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value\");\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1, 1]);\n var element1 = dom.childAt(element0, [3]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [1, 3]), 0, 0);\n morphs[1] = dom.createMorphAt(dom.childAt(element1, [1]), 1, 1);\n morphs[2] = dom.createMorphAt(dom.childAt(element1, [3]), 1, 1);\n return morphs;\n },\n statements: [[\"content\", \"model.contents\", [\"loc\", [null, [22, 28], [22, 46]]]], [\"content\", \"model.name\", [\"loc\", [null, [25, 38], [25, 52]]]], [\"inline\", \"hll-editor\", [], [\"addElement\", \"addElement\"], [\"loc\", [null, [27, 12], [27, 50]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 14,\n \"column\": 2\n },\n \"end\": {\n \"line\": 33,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/hll/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"showLoadingSpinner\", [\"loc\", [null, [15, 10], [15, 28]]]]], [], 0, 1, [\"loc\", [null, [15, 4], [32, 11]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 34,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/hll/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Object Details\"], 0, null, [\"loc\", [null, [2, 2], [13, 30]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [14, 2], [33, 28]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 35,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/hll/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 0, null, [\"loc\", [null, [1, 0], [34, 31]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define('ember-riak-explorer/pods/riak-object/map/controller', ['exports', 'ember-riak-explorer/pods/riak-object/controller'], function (exports, _emberRiakExplorerPodsRiakObjectController) {\n exports['default'] = _emberRiakExplorerPodsRiakObjectController['default'].extend({});\n});","define('ember-riak-explorer/pods/riak-object/map/edit/route', ['exports', 'ember-riak-explorer/pods/riak-object/route', 'lodash/lodash', 'ember-riak-explorer/utils/validations', 'ember-riak-explorer/utils/riak-object-formatter'], function (exports, _emberRiakExplorerPodsRiakObjectRoute, _lodashLodash, _emberRiakExplorerUtilsValidations, _emberRiakExplorerUtilsRiakObjectFormatter) {\n exports['default'] = _emberRiakExplorerPodsRiakObjectRoute['default'].extend({\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n bucketType: model.get('bucketType'),\n bucket: model.get('bucket'),\n riakObject: model,\n crudAction: 'edit'\n });\n this.setViewLabel({\n preLabel: 'Object',\n label: model.get('name')\n });\n },\n\n isValid: function isValid(proposedStringContents) {\n var errors = this.controller.get('errors');\n var JSON = undefined;\n var isObject = undefined;\n var correctValues = undefined;\n\n try {\n JSON = _emberRiakExplorerUtilsValidations['default'].isJsonParseable(proposedStringContents);\n isObject = _emberRiakExplorerUtilsValidations['default'].isObject(JSON);\n correctValues = _emberRiakExplorerUtilsValidations['default'].mapHasCorrectKeyNameEndingsAndValues(JSON);\n } catch (e) {\n errors.pushObject(e.message);\n this.scrollToTop();\n }\n\n return JSON && isObject && correctValues;\n },\n\n actions: {\n // TODO: Inefficient function\n // Destroys and then immediately creates new record. Update directly is possible but requires\n // creating a in memory version of the new map and comparing against the previous version, and creating all the differences\n // for each field. Replace if performance becomes an issue.\n updateMap: function updateMap() {\n var self = this;\n var map = this.currentModel;\n var controller = this.controller;\n var desiredContents = controller.get('stringifiedContents');\n\n controller.set('errors', []);\n\n if (this.isValid(desiredContents)) {\n var _ret = (function () {\n var clusterName = map.get('cluster').get('name');\n var bucketTypeName = map.get('bucketType').get('name');\n var bucketName = map.get('bucket').get('name');\n var objectName = map.get('name');\n\n var data = _emberRiakExplorerUtilsRiakObjectFormatter['default'].formatNewMap(JSON.parse(desiredContents));\n var createNewMap = _lodashLodash['default'].partial(self.explorer.createCRDT, clusterName, bucketTypeName, bucketName, objectName, data);\n\n controller.set('loadingMessage', 'Updating Map ...');\n controller.set('showLoadingSpinner', true);\n\n return {\n v: map.destroyRecord().then(createNewMap).then(function onSuccess() {\n self.transitionTo('riak-object.map', clusterName, bucketTypeName, bucketName, objectName);\n }, function onFail() {\n controller.set('showLoadingSpinner', false);\n self.scrollToTop();\n self.showAlert('alerts.error-request-was-not-processed');\n })\n };\n })();\n\n if (typeof _ret === 'object') return _ret.v;\n }\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/riak-object/map/edit/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 5,\n \"column\": 6\n },\n \"end\": {\n \"line\": 7,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/map/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createUnsafeMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"error\", [\"loc\", [null, [6, 12], [6, 23]]]]],\n locals: [\"error\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 9,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/map/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"label label-danger\");\n var el3 = dom.createTextNode(\"Errors\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"errors\", [\"loc\", [null, [5, 14], [5, 20]]]]], [], 0, null, [\"loc\", [null, [5, 6], [7, 15]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 10,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/map/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"danger\"], 0, null, [\"loc\", [null, [2, 2], [9, 22]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 20,\n \"column\": 6\n },\n \"end\": {\n \"line\": 28,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/map/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-close-round\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Cancel\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 13,\n \"column\": 2\n },\n \"end\": {\n \"line\": 30,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/map/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"button\");\n dom.setAttribute(el2, \"type\", \"button\");\n dom.setAttribute(el2, \"class\", \"action-button save\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"ion-edit\");\n dom.setAttribute(el3, \"aria-hidden\", \"true\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n Update Map\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var element1 = dom.childAt(element0, [1]);\n var morphs = new Array(2);\n morphs[0] = dom.createElementMorph(element1);\n morphs[1] = dom.createMorphAt(element0, 3, 3);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"updateMap\", [\"get\", \"model\", [\"loc\", [null, [15, 76], [15, 81]]]]], [], [\"loc\", [null, [15, 55], [15, 83]]]], [\"block\", \"link-to\", [\"riak-object.map\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [21, 6], [21, 24]]]], [\"get\", \"model.bucketType.name\", [\"loc\", [null, [22, 6], [22, 27]]]], [\"get\", \"model.bucket.name\", [\"loc\", [null, [23, 6], [23, 23]]]], [\"get\", \"model.name\", [\"loc\", [null, [24, 6], [24, 16]]]]], [\"class\", \"action-button cancel\"], 0, null, [\"loc\", [null, [20, 6], [28, 18]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 32,\n \"column\": 4\n },\n \"end\": {\n \"line\": 34,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/map/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"loading-spinner\", [], [\"statusMessage\", [\"subexpr\", \"@mut\", [[\"get\", \"loadingMessage\", [\"loc\", [null, [33, 38], [33, 52]]]]], [], []]], [\"loc\", [null, [33, 6], [33, 54]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 34,\n \"column\": 4\n },\n \"end\": {\n \"line\": 40,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/map/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"ivy-codemirror\", [], [\"mode\", \"javascript\", \"theme\", \"material\", \"lineWrapping\", true, \"value\", [\"subexpr\", \"mut\", [[\"get\", \"stringifiedContents\", [\"loc\", [null, [39, 19], [39, 38]]]]], [], [\"loc\", [null, [39, 14], [39, 39]]]]], [\"loc\", [null, [35, 6], [39, 41]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 31,\n \"column\": 2\n },\n \"end\": {\n \"line\": 41,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/map/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"showLoadingSpinner\", [\"loc\", [null, [32, 10], [32, 28]]]]], [], 0, 1, [\"loc\", [null, [32, 4], [40, 11]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 12,\n \"column\": 0\n },\n \"end\": {\n \"line\": 42,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/map/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Edit Map\"], 0, null, [\"loc\", [null, [13, 2], [30, 30]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [31, 2], [41, 28]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 42,\n \"column\": 31\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/map/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"errors\", [\"loc\", [null, [1, 6], [1, 12]]]]], [], 0, null, [\"loc\", [null, [1, 0], [10, 7]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 1, null, [\"loc\", [null, [12, 0], [42, 31]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })());\n});","define('ember-riak-explorer/pods/riak-object/map/route', ['exports', 'ember-riak-explorer/pods/riak-object/route'], function (exports, _emberRiakExplorerPodsRiakObjectRoute) {\n exports['default'] = _emberRiakExplorerPodsRiakObjectRoute['default'].extend({});\n});","define(\"ember-riak-explorer/pods/riak-object/map/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 4,\n \"column\": 6\n },\n \"end\": {\n \"line\": 12,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/map/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-edit\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Edit Map\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 19,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/map/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"button\");\n dom.setAttribute(el2, \"type\", \"button\");\n dom.setAttribute(el2, \"class\", \"action-button delete\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"ion-trash-a\");\n dom.setAttribute(el3, \"aria-hidden\", \"true\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n Delete Map\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var element1 = dom.childAt(element0, [3]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(element0, 1, 1);\n morphs[1] = dom.createElementMorph(element1);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"riak-object.map.edit\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [5, 8], [5, 26]]]], [\"get\", \"model.bucketType.name\", [\"loc\", [null, [6, 8], [6, 29]]]], [\"get\", \"model.bucket.name\", [\"loc\", [null, [7, 8], [7, 25]]]], [\"get\", \"model.name\", [\"loc\", [null, [8, 8], [8, 18]]]]], [\"classNames\", \"action-button edit\"], 0, null, [\"loc\", [null, [4, 6], [12, 18]]]], [\"element\", \"action\", [\"deleteObject\", [\"get\", \"model\", [\"loc\", [null, [14, 81], [14, 86]]]]], [], [\"loc\", [null, [14, 57], [14, 88]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 21,\n \"column\": 4\n },\n \"end\": {\n \"line\": 23,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/map/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"loading-spinner\", [], [\"statusMessage\", [\"subexpr\", \"@mut\", [[\"get\", \"loadingMessage\", [\"loc\", [null, [22, 38], [22, 52]]]]], [], []]], [\"loc\", [null, [22, 6], [22, 54]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 23,\n \"column\": 4\n },\n \"end\": {\n \"line\": 25,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/map/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"map-object.contents\", [], [\"sortedMap\", [\"subexpr\", \"@mut\", [[\"get\", \"model.contentsSortedBySubType\", [\"loc\", [null, [24, 38], [24, 67]]]]], [], []]], [\"loc\", [null, [24, 6], [24, 69]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 20,\n \"column\": 2\n },\n \"end\": {\n \"line\": 26,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/map/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"showLoadingSpinner\", [\"loc\", [null, [21, 10], [21, 28]]]]], [], 0, 1, [\"loc\", [null, [21, 4], [25, 11]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 27,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/map/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Object Details\"], 0, null, [\"loc\", [null, [2, 2], [19, 30]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [20, 2], [26, 28]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 27,\n \"column\": 31\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/map/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 0, null, [\"loc\", [null, [1, 0], [27, 31]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define('ember-riak-explorer/pods/riak-object/model', ['exports', 'ember-data', 'ember-riak-explorer/mixins/models/object-headers', 'ember-riak-explorer/mixins/models/map-object'], function (exports, _emberData, _emberRiakExplorerMixinsModelsObjectHeaders, _emberRiakExplorerMixinsModelsMapObject) {\n\n /**\n * Represents a plain (non Data Type) Riak Object.\n *\n * @class RiakObject\n * @extends DS.Model\n * @constructor\n * @uses Bucket\n * @uses BucketType\n * @uses Cluster\n * @uses ObjectMetadata\n * @param [key] {String}\n * @param [bucket] {Bucket}\n * @param [bucketType] {BucketType}\n * @param [cluster] {Cluster}\n * @param [metadata] {ObjectMetadata}\n * @param [isLoaded] {Boolean} Has this been loaded from server. Default: `false`\n * @param [rawUrl] {String}\n * @param [contents] {Object} Object value/payload\n */\n exports['default'] = _emberData['default'].Model.extend(_emberRiakExplorerMixinsModelsObjectHeaders['default'], _emberRiakExplorerMixinsModelsMapObject['default'], {\n /**\n * Riak Bucket in which this object lives.\n * @property bucket\n * @type Bucket\n * @writeOnce\n */\n bucket: _emberData['default'].belongsTo('bucket'),\n\n /**\n * The value/contents of the object.\n * @property contents\n * @type Object\n */\n contents: _emberData['default'].attr(),\n\n /**\n * The object's primary key.\n * @property name\n * @type String\n */\n name: _emberData['default'].attr('string'),\n\n type: _emberData['default'].attr('string'),\n\n /**\n * The URL to fetch the raw contents of the object directly from server.\n * Used with the 'View Raw' button.\n * @property rawUrl\n * @type String\n * @writeOnce\n */\n url: _emberData['default'].attr('string'),\n\n bucketType: (function () {\n try {\n return this.get('bucket').get('bucketType');\n } catch (e) {\n return undefined;\n }\n }).property('bucket'),\n\n cluster: (function () {\n try {\n return this.get('bucket').get('bucketType').get('cluster');\n } catch (e) {\n return undefined;\n }\n }).property('bucket'),\n\n /**\n * Boolean check to see if the contents should be shown through the UI.\n *\n * @method showContents\n * @return {Boolean}\n */\n showContents: (function () {\n var contentType = this.get('contentType');\n\n if (contentType) {\n return contentType.startsWith('plain/text') || contentType.startsWith('application/json') || contentType.startsWith('application/javascript') || contentType.startsWith('application/xml') || contentType.startsWith('multipart/mixed');\n } else {\n return false;\n }\n }).property('contentType'),\n\n contentTypeLanguage: (function () {\n var contentType = this.get('contentType');\n var language = null;\n\n if (contentType) {\n switch (contentType) {\n case 'application/json':\n case 'application/javascript':\n language = 'javascript';\n break;\n case 'application/xml':\n language = 'xml';\n break;\n default:\n language = 'javascript';\n break;\n }\n }\n\n return language;\n }).property('contentType'),\n\n routePath: (function () {\n var bucket = this.get('bucket');\n var routePath = null;\n\n switch (true) {\n case bucket.get('isCounter'):\n routePath = 'riak-object.counter';\n break;\n case bucket.get('isSet'):\n routePath = 'riak-object.set';\n break;\n case bucket.get('isMap'):\n routePath = 'riak-object.map';\n break;\n case bucket.get('isHLL'):\n routePath = 'riak-object.hll';\n break;\n default:\n routePath = 'riak-object';\n break;\n }\n\n return routePath;\n }).property('bucket')\n });\n});","define('ember-riak-explorer/pods/riak-object/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/alerts', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesAlerts, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesAlerts['default'], _emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n model: function model(params) {\n return this.explorer.getObject(params.clusterName, params.bucketTypeName, params.bucketName, params.objectName);\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n bucketType: model.get('bucketType'),\n bucket: model.get('bucket'),\n riakObject: model\n });\n this.setViewLabel({\n preLabel: 'Object',\n label: model.get('name')\n });\n },\n\n setupController: function setupController(controller, model) {\n this._super(controller, model);\n controller.set('showLoadingSpinner', false);\n\n if (model.get('contentTypeLanguage') === 'javascript') {\n controller.set('stringifiedContents', JSON.stringify(model.get('contents'), null, ' '));\n }\n },\n\n actions: {\n deleteObject: function deleteObject(object) {\n var self = this;\n var controller = this.controller;\n var clusterName = object.get('cluster').get('name');\n var bucketTypeName = object.get('bucketType').get('name');\n var bucketName = object.get('bucket').get('name');\n var objectList = object.get('bucket').get('objectList');\n\n controller.set('loadingMessage', 'Deleting Object ...');\n controller.set('showLoadingSpinner', true);\n\n object.destroyRecord().then(function onSuccess() {\n self.transitionTo('bucket', clusterName, bucketTypeName, bucketName);\n }, function onFail() {\n controller.set('showLoadingSpinner', false);\n self.showAlert('alerts.error-request-was-not-processed');\n });\n }\n }\n });\n});","define('ember-riak-explorer/pods/riak-object/set/controller', ['exports', 'ember-riak-explorer/pods/riak-object/controller'], function (exports, _emberRiakExplorerPodsRiakObjectController) {\n exports['default'] = _emberRiakExplorerPodsRiakObjectController['default'].extend({});\n});","define('ember-riak-explorer/pods/riak-object/set/route', ['exports', 'ember-riak-explorer/pods/riak-object/route'], function (exports, _emberRiakExplorerPodsRiakObjectRoute) {\n exports['default'] = _emberRiakExplorerPodsRiakObjectRoute['default'].extend({\n actions: {\n /**\n * Adds an element to the set.\n * @event addSetElement\n * @param {String} item\n */\n addSetElement: function addSetElement(item) {\n var set = this.currentModel;\n var contents = set.get('contents');\n\n this.explorer.updateCRDT(set, { add: item }).then(function () {\n // TODO: items are alphasorted on load, should these be injected alphabetically???\n // may not be as obvious to user that the object was inserted. Maybe add loading state?\n contents.pushObject(item);\n });\n\n // Empty out any lingering warnings on success\n this.removeAlert();\n },\n\n /**\n * Removes specified element from the set.\n * @event removeSetElement\n * @param {String} item\n */\n removeSetElement: function removeSetElement(item) {\n var set = this.currentModel;\n var contents = set.get('contents');\n var index = contents.indexOf(item);\n\n this.explorer.updateCRDT(set, { remove: item }).then(function () {\n contents.removeAt(index, 1);\n });\n },\n\n nonUniqueSetElement: function nonUniqueSetElement() {\n this.showAlert('alerts.error-set-items-unique');\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/riak-object/set/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 13,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/set/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"class\", \"action-button raw\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"ion-eye\");\n dom.setAttribute(el3, \"aria-hidden\", \"true\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n View Raw Data\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"button\");\n dom.setAttribute(el2, \"type\", \"button\");\n dom.setAttribute(el2, \"class\", \"action-button delete\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"ion-trash-a\");\n dom.setAttribute(el3, \"aria-hidden\", \"true\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n Delete Object\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element1 = dom.childAt(fragment, [1]);\n var element2 = dom.childAt(element1, [1]);\n var element3 = dom.childAt(element1, [3]);\n var morphs = new Array(2);\n morphs[0] = dom.createAttrMorph(element2, 'href');\n morphs[1] = dom.createElementMorph(element3);\n return morphs;\n },\n statements: [[\"attribute\", \"href\", [\"concat\", [[\"get\", \"model.url\", [\"loc\", [null, [4, 17], [4, 26]]]]]]], [\"element\", \"action\", [\"deleteObject\", [\"get\", \"model\", [\"loc\", [null, [8, 81], [8, 86]]]]], [], [\"loc\", [null, [8, 57], [8, 88]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 15,\n \"column\": 4\n },\n \"end\": {\n \"line\": 17,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/set/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"loading-spinner\", [], [\"statusMessage\", [\"subexpr\", \"@mut\", [[\"get\", \"loadingMessage\", [\"loc\", [null, [16, 38], [16, 52]]]]], [], []]], [\"loc\", [null, [16, 6], [16, 54]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 17,\n \"column\": 4\n },\n \"end\": {\n \"line\": 36,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/set/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"table\");\n dom.setAttribute(el1, \"class\", \"key-value-table\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tbody\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"Set Length\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value\");\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"Set Items\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value\");\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1, 1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [1, 3]), 0, 0);\n morphs[1] = dom.createMorphAt(dom.childAt(element0, [3, 3]), 1, 1);\n return morphs;\n },\n statements: [[\"content\", \"model.contents.length\", [\"loc\", [null, [22, 28], [22, 53]]]], [\"inline\", \"set-editor\", [], [\"contents\", [\"subexpr\", \"@mut\", [[\"get\", \"model.contents\", [\"loc\", [null, [28, 21], [28, 35]]]]], [], []], \"addSetElement\", \"addSetElement\", \"removeSetElement\", \"removeSetElement\", \"nonUniqueSetElement\", \"nonUniqueSetElement\"], [\"loc\", [null, [27, 12], [31, 55]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 14,\n \"column\": 2\n },\n \"end\": {\n \"line\": 37,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/set/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"showLoadingSpinner\", [\"loc\", [null, [15, 10], [15, 28]]]]], [], 0, 1, [\"loc\", [null, [15, 4], [36, 11]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 38,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/set/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Object Details\"], 0, null, [\"loc\", [null, [2, 2], [13, 30]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [14, 2], [37, 28]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 39,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/set/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 0, null, [\"loc\", [null, [1, 0], [38, 31]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/pods/riak-object/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 8,\n \"column\": 6\n },\n \"end\": {\n \"line\": 16,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-edit\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Edit Object\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 22,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"class\", \"action-button raw\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"ion-eye\");\n dom.setAttribute(el3, \"aria-hidden\", \"true\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n View Raw Data\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"button\");\n dom.setAttribute(el2, \"type\", \"button\");\n dom.setAttribute(el2, \"class\", \"action-button delete\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"ion-trash-a\");\n dom.setAttribute(el3, \"aria-hidden\", \"true\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n Delete Object\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element1 = dom.childAt(fragment, [1]);\n var element2 = dom.childAt(element1, [1]);\n var element3 = dom.childAt(element1, [5]);\n var morphs = new Array(3);\n morphs[0] = dom.createAttrMorph(element2, 'href');\n morphs[1] = dom.createMorphAt(element1, 3, 3);\n morphs[2] = dom.createElementMorph(element3);\n return morphs;\n },\n statements: [[\"attribute\", \"href\", [\"concat\", [[\"get\", \"model.url\", [\"loc\", [null, [4, 17], [4, 26]]]]]]], [\"block\", \"link-to\", [\"riak-object.edit\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [9, 6], [9, 24]]]], [\"get\", \"model.bucketType.name\", [\"loc\", [null, [10, 6], [10, 27]]]], [\"get\", \"model.bucket.name\", [\"loc\", [null, [11, 6], [11, 23]]]], [\"get\", \"model.name\", [\"loc\", [null, [12, 6], [12, 16]]]]], [\"classNames\", \"action-button edit\"], 0, null, [\"loc\", [null, [8, 6], [16, 18]]]], [\"element\", \"action\", [\"deleteObject\", [\"get\", \"model\", [\"loc\", [null, [17, 81], [17, 86]]]]], [], [\"loc\", [null, [17, 57], [17, 88]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 24,\n \"column\": 4\n },\n \"end\": {\n \"line\": 26,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"loading-spinner\", [], [\"statusMessage\", [\"subexpr\", \"@mut\", [[\"get\", \"loadingMessage\", [\"loc\", [null, [25, 38], [25, 52]]]]], [], []]], [\"loc\", [null, [25, 6], [25, 54]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 33,\n \"column\": 14\n },\n \"end\": {\n \"line\": 35,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"code\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"model.contentType\", [\"loc\", [null, [34, 22], [34, 43]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 35,\n \"column\": 14\n },\n \"end\": {\n \"line\": 37,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"code\");\n var el2 = dom.createTextNode(\"Undefined\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 44,\n \"column\": 16\n },\n \"end\": {\n \"line\": 51,\n \"column\": 16\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"ivy-codemirror\", [], [\"mode\", [\"subexpr\", \"@mut\", [[\"get\", \"model.contentTypeLanguage\", [\"loc\", [null, [46, 23], [46, 48]]]]], [], []], \"theme\", \"material\", \"lineWrapping\", true, \"readOnly\", true, \"value\", [\"subexpr\", \"@mut\", [[\"get\", \"stringifiedContents\", [\"loc\", [null, [50, 24], [50, 43]]]]], [], []]], [\"loc\", [null, [45, 18], [50, 45]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 51,\n \"column\": 16\n },\n \"end\": {\n \"line\": 53,\n \"column\": 16\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"code\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"model.contents\", [\"loc\", [null, [52, 24], [52, 42]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 40,\n \"column\": 10\n },\n \"end\": {\n \"line\": 56,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"Content\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 3]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"stringifiedContents\", [\"loc\", [null, [44, 22], [44, 41]]]]], [], 0, 1, [\"loc\", [null, [44, 16], [53, 23]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 26,\n \"column\": 4\n },\n \"end\": {\n \"line\": 60,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"object-contents\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"table\");\n dom.setAttribute(el2, \"class\", \"key-value-table\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tbody\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"tr\");\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n var el5 = dom.createElement(\"td\");\n dom.setAttribute(el5, \"class\", \"key\");\n var el6 = dom.createTextNode(\"Content-Type\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n var el5 = dom.createElement(\"td\");\n dom.setAttribute(el5, \"class\", \"value\");\n var el6 = dom.createTextNode(\"\\n\");\n dom.appendChild(el5, el6);\n var el6 = dom.createComment(\"\");\n dom.appendChild(el5, el6);\n var el6 = dom.createTextNode(\" \");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\" \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1, 1, 1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [1, 3]), 1, 1);\n morphs[1] = dom.createMorphAt(element0, 3, 3);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.contentType\", [\"loc\", [null, [33, 20], [33, 37]]]]], [], 0, 1, [\"loc\", [null, [33, 14], [37, 21]]]], [\"block\", \"if\", [[\"get\", \"model.showContents\", [\"loc\", [null, [40, 16], [40, 34]]]]], [], 2, null, [\"loc\", [null, [40, 10], [56, 17]]]]],\n locals: [],\n templates: [child0, child1, child2]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 23,\n \"column\": 2\n },\n \"end\": {\n \"line\": 61,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"showLoadingSpinner\", [\"loc\", [null, [24, 10], [24, 28]]]]], [], 0, 1, [\"loc\", [null, [24, 4], [60, 11]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 62,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Object Contents\"], 0, null, [\"loc\", [null, [2, 2], [22, 30]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [23, 2], [61, 28]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 70,\n \"column\": 10\n },\n \"end\": {\n \"line\": 70,\n \"column\": 33\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"General\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 71,\n \"column\": 10\n },\n \"end\": {\n \"line\": 71,\n \"column\": 43\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"Secondary Indexes\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 72,\n \"column\": 10\n },\n \"end\": {\n \"line\": 72,\n \"column\": 40\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"Custom Headers\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 69,\n \"column\": 8\n },\n \"end\": {\n \"line\": 73,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 5, 5, contextualElement);\n return morphs;\n },\n statements: [[\"block\", \"tablist.tab\", [], [], 0, null, [\"loc\", [null, [70, 10], [70, 49]]]], [\"block\", \"tablist.tab\", [], [], 1, null, [\"loc\", [null, [71, 10], [71, 59]]]], [\"block\", \"tablist.tab\", [], [], 2, null, [\"loc\", [null, [72, 10], [72, 56]]]]],\n locals: [\"tablist\"],\n templates: [child0, child1, child2]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 75,\n \"column\": 8\n },\n \"end\": {\n \"line\": 77,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"table.object-version\", [], [\"object\", [\"subexpr\", \"@mut\", [[\"get\", \"model\", [\"loc\", [null, [76, 40], [76, 45]]]]], [], []]], [\"loc\", [null, [76, 10], [76, 47]]]]],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 79,\n \"column\": 8\n },\n \"end\": {\n \"line\": 81,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"table.object-headers\", [], [\"headers\", [\"subexpr\", \"@mut\", [[\"get\", \"model.indexes\", [\"loc\", [null, [80, 41], [80, 54]]]]], [], []]], [\"loc\", [null, [80, 10], [80, 56]]]]],\n locals: [],\n templates: []\n };\n })();\n var child3 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 83,\n \"column\": 8\n },\n \"end\": {\n \"line\": 85,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"table.object-headers\", [], [\"headers\", [\"subexpr\", \"@mut\", [[\"get\", \"model.headersCustom\", [\"loc\", [null, [84, 41], [84, 60]]]]], [], []]], [\"loc\", [null, [84, 10], [84, 62]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 68,\n \"column\": 6\n },\n \"end\": {\n \"line\": 86,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"tabs.tablist\", [], [], 0, null, [\"loc\", [null, [69, 8], [73, 25]]]], [\"block\", \"tabs.tabpanel\", [], [], 1, null, [\"loc\", [null, [75, 8], [77, 26]]]], [\"block\", \"tabs.tabpanel\", [], [], 2, null, [\"loc\", [null, [79, 8], [81, 26]]]], [\"block\", \"tabs.tabpanel\", [], [], 3, null, [\"loc\", [null, [83, 8], [85, 26]]]]],\n locals: [\"tabs\"],\n templates: [child0, child1, child2, child3]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 67,\n \"column\": 4\n },\n \"end\": {\n \"line\": 87,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"ivy-tabs\", [], [\"on-select\", [\"subexpr\", \"action\", [[\"subexpr\", \"mut\", [[\"get\", \"selectedIndex\", [\"loc\", [null, [68, 41], [68, 54]]]]], [], [\"loc\", [null, [68, 36], [68, 55]]]]], [], [\"loc\", [null, [68, 28], [68, 56]]]], \"selected-index\", [\"subexpr\", \"@mut\", [[\"get\", \"selectedIndex\", [\"loc\", [null, [68, 72], [68, 85]]]]], [], []]], 0, null, [\"loc\", [null, [68, 6], [86, 19]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 65,\n \"column\": 2\n },\n \"end\": {\n \"line\": 88,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"inline\", \"dashboard-module.header\", [], [\"label\", \"Object Metadata\"], [\"loc\", [null, [66, 4], [66, 55]]]], [\"block\", \"dashboard-module.body\", [], [], 0, null, [\"loc\", [null, [67, 4], [87, 30]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 64,\n \"column\": 0\n },\n \"end\": {\n \"line\": 89,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 0, null, [\"loc\", [null, [65, 2], [88, 33]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 93,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/riak-object/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 0, null, [\"loc\", [null, [1, 0], [62, 31]]]], [\"block\", \"if\", [[\"subexpr\", \"not\", [[\"get\", \"showLoadingSpinner\", [\"loc\", [null, [64, 11], [64, 29]]]]], [], [\"loc\", [null, [64, 6], [64, 30]]]]], [], 1, null, [\"loc\", [null, [64, 0], [89, 7]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })());\n});","define('ember-riak-explorer/pods/search-index/model', ['exports', 'ember-data'], function (exports, _emberData) {\n\n var SearchIndex = _emberData['default'].Model.extend({\n /**\n * Riak cluster the search index was created on\n *\n * @property cluster\n * @type {DS.Model} Cluster\n * @writeOnce\n */\n cluster: _emberData['default'].belongsTo('cluster'),\n\n /**\n * Schema the search index is using\n *\n * @property schema\n * @type {DS.Model} Search Schema\n * @writeOnce\n */\n schema: _emberData['default'].belongsTo('search-schema'),\n\n /**\n * Returns the search index name\n * @property name\n * @type String\n */\n name: _emberData['default'].attr('string'),\n\n /**\n * Returns the search index n value\n * @property nVal\n * @type Integer\n */\n nVal: _emberData['default'].attr('number', { defaultValue: 3 }),\n\n /**\n * Holds the value of the schema name that index is using.\n * Temporary hack until basho-labs/riak_explorer#89 is completed\n * @property nVal\n * @type Integer\n */\n schemaRef: _emberData['default'].attr('string'),\n\n /**\n * Ember.Array of bucket types on the current cluster using the index\n * @property bucketTypesUsing\n * @type {Ember.Array} bucketTypes\n */\n bucketTypesUsing: (function () {\n var bucketTypes = this.get('cluster').get('bucketTypes');\n\n return bucketTypes.filterBy('index.name', this.get('name'));\n }).property('cluster.bucketTypes')\n });\n\n exports['default'] = SearchIndex;\n});","define('ember-riak-explorer/pods/search-index/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n model: function model(params) {\n return this.explorer.getIndex(params.clusterName, params.searchIndexName);\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n searchIndex: model\n });\n this.setViewLabel({\n preLabel: 'Search Index',\n label: model.get('name')\n });\n }\n });\n});","define(\"ember-riak-explorer/pods/search-index/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 17,\n \"column\": 10\n },\n \"end\": {\n \"line\": 19,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-index/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"model.schema.name\", [\"loc\", [null, [18, 12], [18, 33]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 29,\n \"column\": 18\n },\n \"end\": {\n \"line\": 31,\n \"column\": 18\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-index/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"bucketType.name\", [\"loc\", [null, [30, 20], [30, 39]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 27,\n \"column\": 14\n },\n \"end\": {\n \"line\": 33,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-index/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link.explorer-resource\", [], [\"resourceType\", \"bucket-type\", \"resourceObj\", [\"subexpr\", \"@mut\", [[\"get\", \"bucketType\", [\"loc\", [null, [29, 83], [29, 93]]]]], [], []], \"linkClass\", \"cluster-resource-link\"], 0, null, [\"loc\", [null, [29, 18], [31, 45]]]]],\n locals: [\"bucketType\"],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 25,\n \"column\": 10\n },\n \"end\": {\n \"line\": 35,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-index/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n dom.setAttribute(el1, \"class\", \"button-list\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"model.bucketTypesUsing\", [\"loc\", [null, [27, 22], [27, 44]]]]], [], 0, null, [\"loc\", [null, [27, 14], [33, 23]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 35,\n \"column\": 10\n },\n \"end\": {\n \"line\": 37,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-index/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" None\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 2\n },\n \"end\": {\n \"line\": 42,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-index/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"table\");\n dom.setAttribute(el1, \"class\", \"key-value-table\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tbody\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"Name\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value\");\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"N Value\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createComment(\"\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"Schema\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value\");\n var el5 = dom.createTextNode(\"\\n\");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\" \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"Bucket Types Using Index\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value\");\n var el5 = dom.createTextNode(\"\\n\");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\" \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1, 1]);\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [1, 3]), 0, 0);\n morphs[1] = dom.createMorphAt(dom.childAt(element0, [3, 3, 0]), 0, 0);\n morphs[2] = dom.createMorphAt(dom.childAt(element0, [5, 3]), 1, 1);\n morphs[3] = dom.createMorphAt(dom.childAt(element0, [7, 3]), 1, 1);\n return morphs;\n },\n statements: [[\"content\", \"model.name\", [\"loc\", [null, [8, 26], [8, 40]]]], [\"content\", \"model.nVal\", [\"loc\", [null, [12, 32], [12, 46]]]], [\"block\", \"link-to\", [\"search-schema\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [17, 37], [17, 55]]]], [\"get\", \"model.schema.name\", [\"loc\", [null, [17, 56], [17, 73]]]]], [\"class\", \"btn btn-small btn-primary\"], 0, null, [\"loc\", [null, [17, 10], [19, 22]]]], [\"block\", \"if\", [[\"get\", \"model.bucketTypesUsing\", [\"loc\", [null, [25, 16], [25, 38]]]]], [], 1, 2, [\"loc\", [null, [25, 10], [37, 17]]]]],\n locals: [],\n templates: [child0, child1, child2]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 43,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-index/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"inline\", \"dashboard-module.header\", [], [\"label\", \"Index Details\"], [\"loc\", [null, [2, 2], [2, 51]]]], [\"block\", \"dashboard-module.body\", [], [], 0, null, [\"loc\", [null, [3, 2], [42, 28]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 44,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-index/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [\"class\", \"small-width\"], 0, null, [\"loc\", [null, [1, 0], [43, 31]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define('ember-riak-explorer/pods/search-schema/create/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/alerts', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesAlerts, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesAlerts['default'], _emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n model: function model(params) {\n var self = this;\n\n return this.explorer.getCluster(params.clusterName).then(function (cluster) {\n return self.store.createRecord('search-schema', { cluster: cluster });\n });\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n crudAction: 'create schema'\n });\n this.setViewLabel({\n preLabel: 'Create Schema'\n });\n },\n\n actions: {\n createSchema: function createSchema(clusterName, schemaName, schemaContent) {\n var self = this;\n var xmlDoc = null;\n\n try {\n xmlDoc = _ember['default'].$.parseXML(schemaContent);\n } catch (error) {\n this.showAlert('alerts.error-invalid-xml');\n return;\n }\n\n if (!_ember['default'].$(xmlDoc).find('schema').attr('name')) {\n this.showAlert('alerts.error-solr-must-have-name');\n return;\n }\n\n if (!_ember['default'].$(xmlDoc).find('schema').attr('version')) {\n this.showAlert('alerts.error-solr-must-have-version');\n return;\n }\n\n this.explorer.createSchema(clusterName, schemaName, xmlDoc).then(function onSuccess() {\n // TODO: Need to update this to give better feedback to user on what is going on\n self.transitionTo('cluster.query', clusterName);\n }, function onFail() {\n self.render('alerts.error-schema-not-saved', {\n into: 'application',\n outlet: 'alert'\n });\n });\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/search-schema/create/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 5,\n \"column\": 8\n },\n \"end\": {\n \"line\": 8,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-schema/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-close-round\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Cancel\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 4\n },\n \"end\": {\n \"line\": 10,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-schema/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"cluster.query\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [5, 35], [5, 53]]]]], [\"class\", \"cancel action-button\"], 0, null, [\"loc\", [null, [5, 8], [8, 20]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 12,\n \"column\": 4\n },\n \"end\": {\n \"line\": 36,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-schema/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"form\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"form-group schema-name\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"label\");\n var el4 = dom.createTextNode(\"Schema Name\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"form-group schema-content\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"label\");\n var el4 = dom.createTextNode(\"Schema XML\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"submit-button-container\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"button\");\n dom.setAttribute(el3, \"type\", \"submit\");\n dom.setAttribute(el3, \"class\", \"btn btn-primary\");\n var el4 = dom.createTextNode(\"\\n Create Table\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var element1 = dom.childAt(element0, [5, 1]);\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 3, 3);\n morphs[1] = dom.createMorphAt(dom.childAt(element0, [3]), 3, 3);\n morphs[2] = dom.createAttrMorph(element1, 'disabled');\n morphs[3] = dom.createElementMorph(element1);\n return morphs;\n },\n statements: [[\"inline\", \"input\", [], [\"tabIndex\", 1, \"value\", [\"subexpr\", \"mut\", [[\"get\", \"model.name\", [\"loc\", [null, [16, 40], [16, 50]]]]], [], [\"loc\", [null, [16, 35], [16, 51]]]], \"class\", \"form-control\"], [\"loc\", [null, [16, 10], [16, 74]]]], [\"inline\", \"ivy-codemirror\", [], [\"mode\", \"xml\", \"theme\", \"material\", \"lineWrapping\", true, \"autofocus\", true, \"tabIndex\", 2, \"value\", [\"subexpr\", \"mut\", [[\"get\", \"model.content\", [\"loc\", [null, [27, 23], [27, 36]]]]], [], [\"loc\", [null, [27, 18], [27, 37]]]]], [\"loc\", [null, [21, 10], [27, 39]]]], [\"attribute\", \"disabled\", [\"get\", \"isDisabled\", [\"loc\", [null, [31, 67], [31, 77]]]]], [\"element\", \"action\", [\"createSchema\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [31, 104], [31, 122]]]], [\"get\", \"model.name\", [\"loc\", [null, [31, 123], [31, 133]]]], [\"get\", \"model.content\", [\"loc\", [null, [31, 134], [31, 147]]]]], [], [\"loc\", [null, [31, 80], [31, 149]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 37,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-schema/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"New Schema\"], 0, null, [\"loc\", [null, [3, 4], [10, 32]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [12, 4], [36, 30]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"triple-curlies\"\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 39,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-schema/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"search-schema-container search-schema-create-container\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [], 0, null, [\"loc\", [null, [2, 2], [37, 33]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define('ember-riak-explorer/pods/search-schema/edit/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/alerts', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesAlerts, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesAlerts['default'], _emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n model: function model(params) {\n return this.explorer.getSearchSchema(params.clusterName, params.searchSchemaName);\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n searchSchema: model,\n crudAction: 'edit'\n });\n this.setViewLabel({\n preLabel: 'Search Schema',\n label: model.get('name')\n });\n\n this.simulateLoad();\n },\n\n actions: {\n updateSchema: function updateSchema(schema) {\n var clusterName = schema.get('cluster').get('name');\n var schemaName = schema.get('name');\n var schemaContent = schema.get('content');\n\n var xmlDoc = null;\n var self = this;\n\n try {\n xmlDoc = _ember['default'].$.parseXML(schemaContent);\n } catch (error) {\n this.render('alerts.error-invalid-xml', {\n into: 'application',\n outlet: 'alert'\n });\n\n return;\n }\n\n this.explorer.updateSchema(schema, xmlDoc).then(function onSuccess() {\n self.transitionTo('search-schema', clusterName, schemaName);\n }, function onFail() {\n self.showAlert('alerts.error-schema-not-saved');\n });\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/search-schema/edit/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 10,\n \"column\": 6\n },\n \"end\": {\n \"line\": 13,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-schema/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-close-round\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Cancel\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 15,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-schema/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"update action-button\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"ion-edit\");\n dom.setAttribute(el3, \"aria-hidden\", \"true\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n Update Schema\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [3]);\n var element1 = dom.childAt(element0, [1]);\n var morphs = new Array(2);\n morphs[0] = dom.createElementMorph(element1);\n morphs[1] = dom.createMorphAt(element0, 3, 3);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"updateSchema\", [\"get\", \"model\", [\"loc\", [null, [5, 65], [5, 70]]]]], [], [\"loc\", [null, [5, 41], [5, 72]]]], [\"block\", \"link-to\", [\"search-schema\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [10, 33], [10, 51]]]], [\"get\", \"model.name\", [\"loc\", [null, [10, 52], [10, 62]]]]], [\"class\", \"cancel action-button\"], 0, null, [\"loc\", [null, [10, 6], [13, 18]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 17,\n \"column\": 4\n },\n \"end\": {\n \"line\": 25,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-schema/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n dom.setAttribute(el1, \"class\", \"editable\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 1]), 1, 1);\n return morphs;\n },\n statements: [[\"inline\", \"content-editable\", [], [\"value\", [\"subexpr\", \"mut\", [[\"get\", \"model.content\", [\"loc\", [null, [21, 23], [21, 36]]]]], [], [\"loc\", [null, [21, 18], [21, 37]]]], \"type\", \"html\"], [\"loc\", [null, [20, 10], [22, 25]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 16,\n \"column\": 2\n },\n \"end\": {\n \"line\": 26,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-schema/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.content\", [\"loc\", [null, [17, 10], [17, 23]]]]], [], 0, null, [\"loc\", [null, [17, 4], [25, 11]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 27,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-schema/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [], 0, null, [\"loc\", [null, [2, 2], [15, 30]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [16, 2], [26, 28]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 28,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-schema/edit/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [], 0, null, [\"loc\", [null, [1, 0], [27, 31]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define('ember-riak-explorer/pods/search-schema/model', ['exports', 'ember-data'], function (exports, _emberData) {\n exports['default'] = _emberData['default'].Model.extend({\n /**\n * Riak cluster the search schema was created on\n *\n * @property cluster\n * @type {DS.Model} Cluster\n * @writeOnce\n */\n cluster: _emberData['default'].belongsTo('cluster'),\n\n name: _emberData['default'].attr('string'),\n\n content: _emberData['default'].attr(),\n\n /**\n * Boolean check as to whether or not it is the default schema\n * @method isDefaultSchema\n * @returns Boolean\n */\n isDefaultSchema: (function () {\n return this.get('name') === '_yz_default';\n }).property('name'),\n\n /**\n * Returns a formatted schema url\n * @method url\n * @returns String\n */\n url: (function () {\n var proxyURL = this.get('cluster').get('proxyUrl');\n var name = this.get('name');\n\n return proxyURL + '/search/schema/' + name;\n }).property('name', 'cluster.proxyUrl')\n });\n});","define('ember-riak-explorer/pods/search-schema/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n model: function model(params) {\n return this.explorer.getSearchSchema(params.clusterName, params.searchSchemaName);\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n searchSchema: model\n });\n this.setViewLabel({\n preLabel: 'Search Schema',\n label: model.get('name')\n });\n }\n });\n});","define(\"ember-riak-explorer/pods/search-schema/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 5,\n \"column\": 6\n },\n \"end\": {\n \"line\": 8,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-schema/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-edit\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Edit Schema\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 15,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-schema/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n dom.setAttribute(el2, \"class\", \"raw action-button\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"ion-eye\");\n dom.setAttribute(el3, \"aria-hidden\", \"true\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n View Raw\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [3]);\n var element1 = dom.childAt(element0, [3]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(element0, 1, 1);\n morphs[1] = dom.createAttrMorph(element1, 'href');\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"search-schema.edit\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [5, 38], [5, 56]]]], [\"get\", \"model.name\", [\"loc\", [null, [5, 57], [5, 67]]]]], [\"class\", \"edit action-button\"], 0, null, [\"loc\", [null, [5, 6], [8, 18]]]], [\"attribute\", \"href\", [\"get\", \"model.url\", [\"loc\", [null, [10, 16], [10, 25]]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 17,\n \"column\": 4\n },\n \"end\": {\n \"line\": 24,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-schema/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"ivy-codemirror\", [], [\"mode\", \"xml\", \"theme\", \"material\", \"lineWrapping\", true, \"readOnly\", true, \"value\", [\"subexpr\", \"@mut\", [[\"get\", \"model.content\", [\"loc\", [null, [23, 14], [23, 27]]]]], [], []]], [\"loc\", [null, [18, 6], [23, 29]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 16,\n \"column\": 2\n },\n \"end\": {\n \"line\": 25,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-schema/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.content\", [\"loc\", [null, [17, 10], [17, 23]]]]], [], 0, null, [\"loc\", [null, [17, 4], [24, 11]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 26,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-schema/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [], 0, null, [\"loc\", [null, [2, 2], [15, 30]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [16, 2], [25, 28]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 27,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/search-schema/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [], 0, null, [\"loc\", [null, [1, 0], [26, 31]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define('ember-riak-explorer/pods/table/controller', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/side-drawer', 'ember-riak-explorer/mixins/controller/modal'], function (exports, _ember, _emberRiakExplorerMixinsControllerSideDrawer, _emberRiakExplorerMixinsControllerModal) {\n exports['default'] = _ember['default'].Controller.extend(_emberRiakExplorerMixinsControllerSideDrawer['default'], _emberRiakExplorerMixinsControllerModal['default'], {\n pageSize: null,\n\n currentTableRows: null,\n\n showCachedListWarning: true\n });\n});","define('ember-riak-explorer/pods/table/create/controller', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/side-drawer'], function (exports, _ember, _emberRiakExplorerMixinsControllerSideDrawer) {\n exports['default'] = _ember['default'].Controller.extend(_emberRiakExplorerMixinsControllerSideDrawer['default'], {\n errors: null,\n\n exampleTemplate: 'CREATE TABLE GeoCheckin\\n(\\n region varchar not null,\\n state varchar not null,\\n time timestamp not null,\\n PRIMARY KEY (\\n (region, state, quantum(time, 15, \\'m\\')),\\n region, state, time\\n )\\n)',\n\n statement: '',\n\n showSpinner: false,\n\n isDisabled: true,\n\n canSubmit: (function () {\n return this.set('isDisabled', _ember['default'].isBlank(this.get('statement')));\n }).observes('statement'),\n\n resetState: function resetState() {\n this.set('errors', null);\n this.set('statement', '');\n },\n\n actions: {\n insertTemplate: function insertTemplate() {\n this.set('statement', this.get('exampleTemplate'));\n }\n }\n });\n});","define('ember-riak-explorer/pods/table/create/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/alerts', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state', 'ember-riak-explorer/utils/string-helpers', 'lodash/lodash'], function (exports, _ember, _emberRiakExplorerMixinsRoutesAlerts, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState, _emberRiakExplorerUtilsStringHelpers, _lodashLodash) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesAlerts['default'], _emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n model: function model(params) {\n var self = this;\n\n return this.explorer.getCluster(params.clusterName).then(function (cluster) {\n return self.store.createRecord('table', {\n cluster: cluster,\n columns: [{ name: '', type: 'varchar' }, { name: '', type: 'varchar' }, { name: '', type: 'varchar' }],\n partitionKey: [],\n localKey: []\n });\n });\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n crudAction: 'create table'\n });\n this.setViewLabel({\n preLabel: 'Create Table'\n });\n this.simulateLoad();\n },\n\n setupController: function setupController(controller, model) {\n this._super(controller, model);\n\n controller.resetState();\n },\n\n validateTableClientSide: function validateTableClientSide(tableName, tableData) {\n var isValid = true;\n var controller = this.controller;\n\n // Check if table name already exists\n if (this.currentModel.get('cluster').get('tables').filterBy('name', tableName).length) {\n isValid = false;\n controller.set('errors', 'A table named \\'' + tableName + '\\' already exits on the \\'' + this.currentModel.get('cluster').get('name') + '\\' cluster. Please use a unique name for your table.');\n }\n\n return isValid;\n },\n\n actions: {\n createTable: function createTable(table, statement) {\n var self = this;\n var controller = this.controller;\n var clusterName = table.get('cluster').get('name');\n\n controller.set('errors', null);\n controller.set('showSpinner', true);\n\n var formatted = _lodashLodash['default'].trim(statement.replace(/\\s\\s+/g, ' ') // reduces multiple whitespaces into one\n .replace(/(\\r\\n|\\n|\\r)/gm, ' ') // removes any leftover newlines\n .replace(/\\( /g, '(') // removes any spacing following left parenthesis\n .replace(/ \\)/g, ')')); // removes any spacing preceding right parenthesis\n\n // Add space before first parenthesis if needed\n var indexOfFirstParenthesis = formatted.indexOf('(');\n var indexOfCharacterBeforeFirstParenthesis = indexOfFirstParenthesis - 1;\n var characterBeforeFirstParenthesis = formatted[indexOfCharacterBeforeFirstParenthesis];\n\n if (characterBeforeFirstParenthesis !== ' ') {\n formatted = (0, _emberRiakExplorerUtilsStringHelpers['default'])(formatted, indexOfFirstParenthesis, ' ');\n }\n\n var tableName = formatted.split(' ')[2]; // Table name should always come after CREATE TABLE\n\n var data = {\n name: tableName,\n data: { props: { table_def: formatted } }\n };\n\n if (this.validateTableClientSide(tableName, data)) {\n this.explorer.createBucketType(clusterName, data).then(function onSuccess() {\n self.transitionTo('table', clusterName, tableName).then(function () {\n controller.set('showSpinner', false);\n });\n }, function onFail(error) {\n self.scrollToTop();\n controller.set('showSpinner', false);\n\n try {\n controller.set('errors', JSON.parse(error.responseText).error.replace(/\\s\\s+/g, ' ') // reduces multiple whitespaces into one\n .replace(/<<\"/g, '') // removes erlang starting brackets\n .replace(/\">>/g, '')); // removes erlang ending brackets\n } catch (err) {\n controller.set('errors', 'Sorry, something went wrong. Your table was not created');\n }\n });\n } else {\n controller.set('showSpinner', false);\n }\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/table/create/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 6,\n \"column\": 8\n },\n \"end\": {\n \"line\": 8,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/create/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createUnsafeMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"error\", [\"loc\", [null, [7, 14], [7, 25]]]]],\n locals: [\"error\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 4\n },\n \"end\": {\n \"line\": 10,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"label label-danger\");\n var el3 = dom.createTextNode(\"Errors\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"errors\", [\"loc\", [null, [6, 16], [6, 22]]]]], [], 0, null, [\"loc\", [null, [6, 8], [8, 17]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 10,\n \"column\": 4\n },\n \"end\": {\n \"line\": 13,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"label label-danger\");\n var el3 = dom.createTextNode(\"Error\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"errors\", [\"loc\", [null, [12, 9], [12, 19]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 14,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"is-array\", [[\"get\", \"errors\", [\"loc\", [null, [3, 20], [3, 26]]]]], [], [\"loc\", [null, [3, 10], [3, 27]]]]], [], 0, 1, [\"loc\", [null, [3, 4], [13, 11]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 15,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"danger\", \"dismissible\", false], 0, null, [\"loc\", [null, [2, 2], [14, 22]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 21,\n \"column\": 8\n },\n \"end\": {\n \"line\": 24,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-close-round\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Cancel\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 19,\n \"column\": 4\n },\n \"end\": {\n \"line\": 26,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"cluster.data\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [21, 34], [21, 52]]]]], [\"class\", \"cancel action-button\"], 0, null, [\"loc\", [null, [21, 8], [24, 20]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 28,\n \"column\": 6\n },\n \"end\": {\n \"line\": 30,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"loading-spinner\", [], [\"statusMessage\", \"Attempting to create table...\"], [\"loc\", [null, [29, 8], [29, 73]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 36,\n \"column\": 12\n },\n \"end\": {\n \"line\": 38,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"btn btn-xs btn-info\");\n var el2 = dom.createTextNode(\"Hide Schema Guidelines\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element1 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element1);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"hideSideDrawer\"], [], [\"loc\", [null, [37, 48], [37, 75]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 38,\n \"column\": 12\n },\n \"end\": {\n \"line\": 40,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"btn btn-xs btn-info\");\n var el2 = dom.createTextNode(\"Schema Guidelines\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element0);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"showSideDrawer\"], [], [\"loc\", [null, [39, 48], [39, 75]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 30,\n \"column\": 6\n },\n \"end\": {\n \"line\": 56,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"manually-create\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"label\");\n var el3 = dom.createTextNode(\"\\n Use the editor below to define your table\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"btn btn-xs btn-info\");\n var el4 = dom.createTextNode(\"Insert Sample Template\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"submit-button-container\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"button\");\n dom.setAttribute(el3, \"type\", \"submit\");\n dom.setAttribute(el3, \"class\", \"btn btn-primary\");\n var el4 = dom.createTextNode(\"\\n Create Table\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element2 = dom.childAt(fragment, [1]);\n var element3 = dom.childAt(element2, [1]);\n var element4 = dom.childAt(element3, [1]);\n var element5 = dom.childAt(element2, [5, 1]);\n var morphs = new Array(5);\n morphs[0] = dom.createElementMorph(element4);\n morphs[1] = dom.createMorphAt(element3, 3, 3);\n morphs[2] = dom.createMorphAt(element2, 3, 3);\n morphs[3] = dom.createAttrMorph(element5, 'disabled');\n morphs[4] = dom.createElementMorph(element5);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"insertTemplate\"], [], [\"loc\", [null, [34, 46], [34, 73]]]], [\"block\", \"if\", [[\"get\", \"isSideDrawerVisible\", [\"loc\", [null, [36, 18], [36, 37]]]]], [], 0, 1, [\"loc\", [null, [36, 12], [40, 19]]]], [\"inline\", \"ivy-codemirror\", [], [\"mode\", \"sql\", \"theme\", \"material\", \"lineWrapping\", true, \"autofocus\", true, \"value\", [\"subexpr\", \"mut\", [[\"get\", \"statement\", [\"loc\", [null, [48, 23], [48, 32]]]]], [], [\"loc\", [null, [48, 18], [48, 33]]]]], [\"loc\", [null, [43, 10], [48, 35]]]], [\"attribute\", \"disabled\", [\"get\", \"isDisabled\", [\"loc\", [null, [51, 69], [51, 79]]]]], [\"element\", \"action\", [\"createTable\", [\"get\", \"model\", [\"loc\", [null, [51, 105], [51, 110]]]], [\"get\", \"statement\", [\"loc\", [null, [51, 111], [51, 120]]]]], [], [\"loc\", [null, [51, 82], [51, 122]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 27,\n \"column\": 4\n },\n \"end\": {\n \"line\": 57,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"showSpinner\", [\"loc\", [null, [28, 12], [28, 23]]]]], [], 0, 1, [\"loc\", [null, [28, 6], [56, 13]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 18,\n \"column\": 2\n },\n \"end\": {\n \"line\": 58,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Table Schema Editor\"], 0, null, [\"loc\", [null, [19, 4], [26, 32]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [27, 4], [57, 30]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 62,\n \"column\": 2\n },\n \"end\": {\n \"line\": 66,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"render\", [\"partials.ts-planning-guidelines\"], [], [\"loc\", [null, [65, 4], [65, 48]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 61,\n \"column\": 0\n },\n \"end\": {\n \"line\": 67,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"side-drawer\", [], [\"label\", \"Schema Guidelines\", \"visible\", [\"subexpr\", \"@mut\", [[\"get\", \"isSideDrawerVisible\", [\"loc\", [null, [64, 10], [64, 29]]]]], [], []]], 0, null, [\"loc\", [null, [62, 2], [66, 18]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 68,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/create/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"ts-table-container table-create-container\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"errors\", [\"loc\", [null, [1, 6], [1, 12]]]]], [], 0, null, [\"loc\", [null, [1, 0], [15, 7]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 1, null, [\"loc\", [null, [18, 2], [58, 33]]]], [\"block\", \"ember-wormhole\", [], [\"to\", \"side-drawer-container\"], 2, null, [\"loc\", [null, [61, 0], [67, 19]]]]],\n locals: [],\n templates: [child0, child1, child2]\n };\n })());\n});","define('ember-riak-explorer/pods/table/model', ['exports', 'ember', 'ember-data', 'ember-riak-explorer/mixins/models/bucket-props', 'ember-riak-explorer/mixins/models/cached-list-watcher', 'lodash/lodash'], function (exports, _ember, _emberData, _emberRiakExplorerMixinsModelsBucketProps, _emberRiakExplorerMixinsModelsCachedListWatcher, _lodashLodash) {\n\n /**\n * Represents a Riak TS Table\n *\n * @class Table\n * @extends DS.Model\n * @uses BucketProps\n * @uses CachedListWatcher\n */\n var Table = _emberData['default'].Model.extend(_emberRiakExplorerMixinsModelsBucketProps['default'], _emberRiakExplorerMixinsModelsCachedListWatcher['default'], {\n /**\n * Riak cluster in which this Table lives.\n * @property cluster\n * @type Cluster\n * @writeOnce\n */\n cluster: _emberData['default'].belongsTo('cluster'),\n\n rows: _emberData['default'].hasMany('row'),\n\n rowsList: _emberData['default'].belongsTo('row-list'),\n\n columns: _emberData['default'].attr(),\n\n localKey: _emberData['default'].attr(),\n\n /**\n * Table name (unique per cluster),\n * as appears on `riak-admin bucket-type list`\n * @property name\n * @type String\n */\n name: _emberData['default'].attr('string'),\n\n partitionKey: _emberData['default'].attr(),\n\n hasQuantum: (function () {\n return _ember['default'].isPresent(this.get('partitionKey').filterBy('quantum'));\n }).property('partitionKey.@each.quantum'),\n\n possiblePartitionKeys: (function () {\n var columnNames = this.get('columns').mapBy('name');\n\n return columnNames.filter(function (column) {\n return _ember['default'].isPresent(column);\n });\n }).property('partitionKey.@each.quantum'),\n\n possiblePartitionKeyQuantum: (function () {\n return this.get('columns').filterBy('type', 'timestamp').mapBy('name');\n }).property('columns.@each.type'),\n\n quantumColumnName: (function () {\n if (this.get('hasQuantum')) {\n var quantumColumn = _lodashLodash['default'].head(this.get('partitionKey').filterBy('quantum'));\n var quantumColumnName = _lodashLodash['default'].head(quantumColumn.name.replace('quantum(', '').slice(0, -1).split(','));\n\n return quantumColumnName;\n }\n }).property('hasQuantum'),\n\n // returns first possible partition key that isn't being used already\n suggestedPartitionKey: (function () {\n var possibleKeys = this.get('possiblePartitionKeys');\n var partitionKeyNames = this.get('partitionKey').mapBy('name');\n\n return _lodashLodash['default'].head(possibleKeys.filter(function (columnName) {\n return partitionKeyNames.indexOf(columnName) === -1;\n }));\n }).property('possiblePartitionKeys', 'partitionKey.@each.name'),\n\n // returns first possible partition key that isn't being used already\n suggestedPartitionKeyQuantum: (function () {\n var possibleKeys = this.get('possiblePartitionKeyQuantum');\n var partitionKeyNames = this.get('partitionKey').mapBy('name');\n\n return _lodashLodash['default'].head(possibleKeys.filter(function (columnName) {\n return partitionKeyNames.indexOf(columnName) === -1;\n }));\n }).property('possiblePartitionKeyQuantum', 'partitionKey.@each.name'),\n\n rowsSortedByQuantumValues: (function () {\n var _this = this;\n\n var self = this;\n\n if (this.get('hasQuantum')) {\n var _ret = (function () {\n var columns = _this.get('columns');\n var rows = _this.get('rows');\n var quantumIndex = undefined;\n\n // Assign Quantum Index\n columns.forEach(function (column, index) {\n if (column.name === self.get('quantumColumnName')) {\n quantumIndex = index;\n }\n });\n\n // Sort rows by Quantum values\n return {\n v: rows.toArray().sort(function (a, b) {\n return a.get('parsedValue')[quantumIndex] - b.get('parsedValue')[quantumIndex];\n })\n };\n })();\n\n if (typeof _ret === 'object') return _ret.v;\n } else {\n return this.get('rows').get('parsedValue');\n }\n }).property('hasQuantum', 'rows.@each.parsedValue')\n });\n\n exports['default'] = Table;\n});","define('ember-riak-explorer/pods/table/query/controller', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/side-drawer'], function (exports, _ember, _emberRiakExplorerMixinsControllerSideDrawer) {\n exports['default'] = _ember['default'].Controller.extend(_emberRiakExplorerMixinsControllerSideDrawer['default'], {\n example: \"\",\n\n query: '',\n\n result: '',\n\n resultLength: null,\n\n isDisabled: true,\n\n isLoading: false,\n\n showClear: false,\n\n canClear: (function () {\n var result = this.get('result');\n var canClear = _ember['default'].isPresent(result) && result !== this.get('loadingMessage');\n\n this.set('showClear', canClear);\n }).observes('result'),\n\n canSubmit: (function () {\n return this.set('isDisabled', _ember['default'].isBlank(this.get('query')));\n }).observes('query'),\n\n setLoadingState: (function () {\n if (this.get('isLoading')) {\n this.set('resultLength', null);\n this.set('result', 'Querying...');\n }\n }).observes('isLoading'),\n\n resetResult: function resetResult() {\n this.set('result', '');\n this.set('resultLength', null);\n },\n\n resetQuery: function resetQuery() {\n this.set('query', '');\n },\n\n resetState: function resetState() {\n this.resetQuery();\n this.resetResult();\n },\n\n actions: {\n clear: function clear() {\n this.resetState();\n },\n\n insertExample: function insertExample() {\n this.set('query', this.get('example'));\n }\n }\n });\n});","define('ember-riak-explorer/pods/table/query/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n model: function model(params) {\n return this.explorer.getTable(params.clusterName, params.tableName);\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n table: model,\n crudAction: 'query table'\n });\n this.setViewLabel({\n preLabel: 'Table',\n label: model.get('name')\n });\n },\n\n setupController: function setupController(controller, model) {\n this._super(controller, model);\n\n this.setExample();\n controller.resetState();\n },\n\n setExample: function setExample() {\n var _this = this;\n\n var table = this.currentModel;\n\n if (table.get('hasQuantum')) {\n (function () {\n var controller = _this.controller;\n var tableName = table.get('name');\n var partitionKey = table.get('partitionKey');\n var quantumName = table.get('quantumColumnName');\n var sampleNames = [\"foo\", \"bar\", \"Lorem\", \"ipsum\", \"dolor\", \"sit\", \"amet\", \"consectetur\", \"adipiscing\", \"elit\", \"Aliquam\", \"sit\", \"amet\", \"tincidunt\", \"felis\", \"Curabitur\", \"at\", \"gravida\", \"est\", \"Quisque\", \"vehicula\", \"mi\", \"sed\", \"libero\", \"hendrerit\", \"vel\", \"mollis\", \"lorem\", \"euismod\", \"Donec\", \"fringilla\", \"iaculis\", \"sem\", \"vitae\", \"tincidunt\", \"lacus\", \"consectetur\", \"vitae\", \"Aliquam\", \"felis\", \"magna\", \"pellentesque\", \"vitae\", \"felis\"];\n var example = '';\n\n // Set Query Base\n example = 'select * from ' + tableName + ' where ' + quantumName + ' > 1 and ' + quantumName + ' < 9999';\n\n // Add a comparison for each partition key column that isn't the quantum column\n partitionKey.filter(function (column) {\n return !column.quantum;\n }).mapBy('name').forEach(function (columnName, index) {\n example += ' and ' + columnName + ' = \\'' + sampleNames[index] + '\\'';\n });\n\n controller.set('example', example);\n })();\n }\n },\n\n actions: {\n runQuery: function runQuery(table, query) {\n var controller = this.controller;\n\n // Set intermediate state\n controller.set('isLoading', true);\n\n // Execute Query\n this.explorer.queryTable(table, query).then(function onSuccess(data) {\n if (_ember['default'].isEmpty(data.query.rows)) {\n controller.set('resultLength', null);\n controller.set('result', 'No rows found on ' + table.get('name') + ' given the statement: \\n\\n' + query);\n } else {\n var stringifiedData = JSON.stringify(data.query.rows);\n var formattedStringForEditor = undefined;\n\n // Adds a line break after each array item\n // Removes the array surrounding all the results\n // Adds a space after each comma in the array for better legibility\n formattedStringForEditor = stringifiedData.replace(/],/g, '],\\n');\n formattedStringForEditor = formattedStringForEditor.substring(1, formattedStringForEditor.length - 1);\n formattedStringForEditor = formattedStringForEditor.replace(/,/g, ', ');\n\n controller.set('resultLength', data.query.rows.length);\n controller.set('result', formattedStringForEditor);\n }\n }, function onFail(error) {\n try {\n var serverResponse = JSON.parse(error.responseText).error.replace(/\\s\\s+/g, ' ') // reduces multiple whitespaces into one\n .replace(/<<\"/g, '') // removes erlang starting brackets\n .replace(/\">>/g, ''); // removes erlang ending brackets\n\n controller.set('result', error.status + ' ' + error.statusText + ' trying to execute query \\n\\nServer error: ' + serverResponse);\n } catch (err) {\n controller.set('result', error.status + ' ' + error.statusText + ' trying to execute query: \\n\\n' + query);\n }\n });\n\n return false;\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/table/query/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 5,\n \"column\": 8\n },\n \"end\": {\n \"line\": 8,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-close-round\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Cancel\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 4\n },\n \"end\": {\n \"line\": 10,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"table\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [5, 27], [5, 45]]]], [\"get\", \"model.name\", [\"loc\", [null, [5, 46], [5, 56]]]]], [\"class\", \"cancel action-button\"], 0, null, [\"loc\", [null, [5, 8], [8, 20]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 22,\n \"column\": 10\n },\n \"end\": {\n \"line\": 24,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"btn btn-xs btn-info\");\n var el2 = dom.createTextNode(\"Insert Example Query\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element3 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element3);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"insertExample\"], [], [\"loc\", [null, [23, 46], [23, 72]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 25,\n \"column\": 10\n },\n \"end\": {\n \"line\": 27,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"btn btn-xs btn-info\");\n var el2 = dom.createTextNode(\"Hide Query Guidelines\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element2 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element2);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"hideSideDrawer\"], [], [\"loc\", [null, [26, 46], [26, 73]]]]],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 27,\n \"column\": 10\n },\n \"end\": {\n \"line\": 29,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"btn btn-xs btn-info\");\n var el2 = dom.createTextNode(\"Show Query Guidelines\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element1 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element1);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"showSideDrawer\"], [], [\"loc\", [null, [28, 46], [28, 73]]]]],\n locals: [],\n templates: []\n };\n })();\n var child3 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 54,\n \"column\": 14\n },\n \"end\": {\n \"line\": 56,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"small\");\n var el2 = dom.createTextNode(\"(\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" rows)\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"content\", \"resultLength\", [\"loc\", [null, [55, 24], [55, 40]]]]],\n locals: [],\n templates: []\n };\n })();\n var child4 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 58,\n \"column\": 14\n },\n \"end\": {\n \"line\": 60,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"clear-statement\");\n var el2 = dom.createTextNode(\"clear\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element0);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"clear\"], [], [\"loc\", [null, [59, 46], [59, 64]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 12,\n \"column\": 4\n },\n \"end\": {\n \"line\": 73,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"section\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"section-title\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"section\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"label\");\n var el3 = dom.createTextNode(\"\\n Use the editor on the left to query against the table\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"split-panel\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"left-panel\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"div\");\n dom.setAttribute(el4, \"class\", \"help-block\");\n var el5 = dom.createTextNode(\"Query\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"div\");\n dom.setAttribute(el4, \"class\", \"submit-button-container\");\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n var el5 = dom.createElement(\"button\");\n dom.setAttribute(el5, \"type\", \"submit\");\n dom.setAttribute(el5, \"class\", \"btn btn-primary\");\n var el6 = dom.createTextNode(\"\\n Run Query\\n \");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"right-panel\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"div\");\n dom.setAttribute(el4, \"class\", \"help-block\");\n var el5 = dom.createTextNode(\"\\n Result\\n\");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"\\n\");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\" \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element4 = dom.childAt(fragment, [1]);\n var element5 = dom.childAt(fragment, [3]);\n var element6 = dom.childAt(element5, [1]);\n var element7 = dom.childAt(element5, [3]);\n var element8 = dom.childAt(element7, [1]);\n var element9 = dom.childAt(element8, [5, 1]);\n var element10 = dom.childAt(element7, [3]);\n var element11 = dom.childAt(element10, [1]);\n var morphs = new Array(10);\n morphs[0] = dom.createMorphAt(dom.childAt(element4, [1]), 0, 0);\n morphs[1] = dom.createMorphAt(element4, 3, 3);\n morphs[2] = dom.createMorphAt(element6, 1, 1);\n morphs[3] = dom.createMorphAt(element6, 2, 2);\n morphs[4] = dom.createMorphAt(element8, 3, 3);\n morphs[5] = dom.createAttrMorph(element9, 'disabled');\n morphs[6] = dom.createElementMorph(element9);\n morphs[7] = dom.createMorphAt(element11, 1, 1);\n morphs[8] = dom.createMorphAt(element11, 3, 3);\n morphs[9] = dom.createMorphAt(element10, 3, 3);\n return morphs;\n },\n statements: [[\"content\", \"model.name\", [\"loc\", [null, [15, 35], [15, 49]]]], [\"inline\", \"table.ts-table-reference\", [], [\"table\", [\"subexpr\", \"@mut\", [[\"get\", \"model\", [\"loc\", [null, [16, 41], [16, 46]]]]], [], []]], [\"loc\", [null, [16, 8], [16, 48]]]], [\"block\", \"if\", [[\"get\", \"example\", [\"loc\", [null, [22, 16], [22, 23]]]]], [], 0, null, [\"loc\", [null, [22, 10], [24, 17]]]], [\"block\", \"if\", [[\"get\", \"isSideDrawerVisible\", [\"loc\", [null, [25, 16], [25, 35]]]]], [], 1, 2, [\"loc\", [null, [25, 10], [29, 17]]]], [\"inline\", \"ivy-codemirror\", [], [\"mode\", \"javascript\", \"theme\", \"material\", \"lineWrapping\", true, \"autofocus\", true, \"tabindex\", 1, \"value\", [\"subexpr\", \"mut\", [[\"get\", \"query\", [\"loc\", [null, [42, 25], [42, 30]]]]], [], [\"loc\", [null, [42, 20], [42, 31]]]]], [\"loc\", [null, [36, 12], [42, 33]]]], [\"attribute\", \"disabled\", [\"get\", \"isDisabled\", [\"loc\", [null, [45, 71], [45, 81]]]]], [\"element\", \"action\", [\"runQuery\", [\"get\", \"model\", [\"loc\", [null, [45, 104], [45, 109]]]], [\"get\", \"query\", [\"loc\", [null, [45, 110], [45, 115]]]]], [], [\"loc\", [null, [45, 84], [45, 117]]]], [\"block\", \"if\", [[\"get\", \"resultLength\", [\"loc\", [null, [54, 20], [54, 32]]]]], [], 3, null, [\"loc\", [null, [54, 14], [56, 21]]]], [\"block\", \"if\", [[\"get\", \"showClear\", [\"loc\", [null, [58, 20], [58, 29]]]]], [], 4, null, [\"loc\", [null, [58, 14], [60, 21]]]], [\"inline\", \"ivy-codemirror\", [], [\"mode\", \"javascript\", \"theme\", \"material\", \"readOnly\", true, \"lineWrapping\", true, \"value\", [\"subexpr\", \"@mut\", [[\"get\", \"result\", [\"loc\", [null, [68, 20], [68, 26]]]]], [], []]], [\"loc\", [null, [63, 12], [68, 28]]]]],\n locals: [],\n templates: [child0, child1, child2, child3, child4]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 74,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Query Table\"], 0, null, [\"loc\", [null, [3, 4], [10, 32]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [12, 4], [73, 30]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 78,\n \"column\": 2\n },\n \"end\": {\n \"line\": 82,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"render\", [\"partials.ts-query-guidelines\"], [], [\"loc\", [null, [81, 4], [81, 45]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 77,\n \"column\": 0\n },\n \"end\": {\n \"line\": 83,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"side-drawer\", [], [\"label\", \"Query Guidelines\", \"visible\", [\"subexpr\", \"@mut\", [[\"get\", \"isSideDrawerVisible\", [\"loc\", [null, [80, 10], [80, 29]]]]], [], []]], 0, null, [\"loc\", [null, [78, 2], [82, 18]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\", \"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 85,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/query/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"ts-table-container table-query-container\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 1, 1);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.container\", [], [], 0, null, [\"loc\", [null, [2, 2], [74, 33]]]], [\"block\", \"ember-wormhole\", [], [\"to\", \"side-drawer-container\"], 1, null, [\"loc\", [null, [77, 0], [83, 19]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })());\n});","define('ember-riak-explorer/pods/table/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/polling', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesPolling, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesPolling['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n rowsPaging: {\n size: 10,\n initialLow: 0,\n initialHigh: 9\n },\n\n model: function model(params) {\n return this.explorer.getTable(params.clusterName, params.tableName);\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n table: model\n });\n this.setViewLabel({\n preLabel: 'Table',\n label: model.get('name')\n });\n },\n\n setupController: function setupController(controller, model) {\n var page = this.get('rowsPaging');\n\n this._super(controller, model);\n this.controller.set('pageSize', page.size);\n this.controller.set('currentTableRows', this.rowsFromRange(page.initialLow, page.initialHigh));\n },\n\n rowsFromRange: function rowsFromRange(startIndex, endIndex) {\n return this.currentModel.get('rowsSortedByQuantumValues').filter(function (row, index) {\n return index >= startIndex && index <= endIndex;\n });\n },\n\n lookForNewRowsList: function lookForNewRowsList() {\n var self = this;\n var table = this.currentModel;\n var page = this.get('rowsPaging');\n\n this.explorer.getTableRowsList(table).then(function () {\n return self.explorer.getTableRows(table);\n }).then(function () {\n self.controller.set('currentTableRows', self.rowsFromRange(page.initialLow, page.initialHigh));\n self.stopPolling();\n });\n },\n\n actions: {\n refreshRowsList: function refreshRowsList(table) {\n var self = this;\n\n this.controller.set('modalVisible', false);\n this.controller.set('showCachedListWarning', false);\n\n return this.explorer.refreshTableRowsList(table).then(function () {\n self.startPolling(self.lookForNewRowsList.bind(self));\n });\n },\n\n rowsPageRequest: function rowsPageRequest(lowIndex, highIndex) {\n this.controller.set('currentTableRows', this.rowsFromRange(lowIndex, highIndex));\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/table/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 5,\n \"column\": 8\n },\n \"end\": {\n \"line\": 7,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"warning\", [\"loc\", [null, [6, 16], [6, 27]]]]],\n locals: [\"warning\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 9,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"label label-warning\");\n var el3 = dom.createTextNode(\"WARNINGS\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"model.warnings\", [\"loc\", [null, [5, 16], [5, 30]]]]], [], 0, null, [\"loc\", [null, [5, 8], [7, 17]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 10,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"warning\", \"dismissible\", false], 0, null, [\"loc\", [null, [2, 2], [9, 22]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 15,\n \"column\": 8\n },\n \"end\": {\n \"line\": 18,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-plus-circled\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Write Data\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 20,\n \"column\": 8\n },\n \"end\": {\n \"line\": 26,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-search\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Query Data\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 13,\n \"column\": 2\n },\n \"end\": {\n \"line\": 28,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element8 = dom.childAt(fragment, [1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(element8, 1, 1);\n morphs[1] = dom.createMorphAt(element8, 3, 3);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"table.write\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [15, 33], [15, 51]]]], [\"get\", \"model.name\", [\"loc\", [null, [15, 52], [15, 62]]]]], [\"class\", \"action-button create\"], 0, null, [\"loc\", [null, [15, 8], [18, 20]]]], [\"block\", \"link-to\", [\"table.query\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [21, 8], [21, 26]]]], [\"get\", \"model.name\", [\"loc\", [null, [22, 8], [22, 18]]]]], [\"class\", \"action-button create\"], 1, null, [\"loc\", [null, [20, 8], [26, 20]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 32,\n \"column\": 8\n },\n \"end\": {\n \"line\": 32,\n \"column\": 32\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"Overview\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 33,\n \"column\": 8\n },\n \"end\": {\n \"line\": 33,\n \"column\": 43\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"Advanced Properties\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 31,\n \"column\": 6\n },\n \"end\": {\n \"line\": 34,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n return morphs;\n },\n statements: [[\"block\", \"tablist.tab\", [], [], 0, null, [\"loc\", [null, [32, 8], [32, 48]]]], [\"block\", \"tablist.tab\", [], [], 1, null, [\"loc\", [null, [33, 8], [33, 59]]]]],\n locals: [\"tablist\"],\n templates: [child0, child1]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 36,\n \"column\": 6\n },\n \"end\": {\n \"line\": 38,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"table.table-overview\", [], [\"table\", [\"subexpr\", \"@mut\", [[\"get\", \"model\", [\"loc\", [null, [37, 37], [37, 42]]]]], [], []]], [\"loc\", [null, [37, 8], [37, 44]]]]],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 40,\n \"column\": 6\n },\n \"end\": {\n \"line\": 42,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"table.bucket-props-advanced\", [], [\"model\", [\"subexpr\", \"@mut\", [[\"get\", \"model\", [\"loc\", [null, [41, 44], [41, 49]]]]], [], []]], [\"loc\", [null, [41, 8], [41, 51]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 30,\n \"column\": 4\n },\n \"end\": {\n \"line\": 43,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"tabs.tablist\", [], [], 0, null, [\"loc\", [null, [31, 6], [34, 23]]]], [\"block\", \"tabs.tabpanel\", [], [], 1, null, [\"loc\", [null, [36, 6], [38, 24]]]], [\"block\", \"tabs.tabpanel\", [], [], 2, null, [\"loc\", [null, [40, 6], [42, 24]]]]],\n locals: [\"tabs\"],\n templates: [child0, child1, child2]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 29,\n \"column\": 2\n },\n \"end\": {\n \"line\": 44,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"ivy-tabs\", [], [\"on-select\", [\"subexpr\", \"action\", [[\"subexpr\", \"mut\", [[\"get\", \"selectedIndex\", [\"loc\", [null, [30, 39], [30, 52]]]]], [], [\"loc\", [null, [30, 34], [30, 53]]]]], [], [\"loc\", [null, [30, 26], [30, 54]]]], \"selected-index\", [\"subexpr\", \"@mut\", [[\"get\", \"selectedIndex\", [\"loc\", [null, [30, 70], [30, 83]]]]], [], []]], 0, null, [\"loc\", [null, [30, 4], [43, 17]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 12,\n \"column\": 0\n },\n \"end\": {\n \"line\": 45,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Table Properties\"], 0, null, [\"loc\", [null, [13, 2], [28, 30]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [29, 2], [44, 28]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 50,\n \"column\": 8\n },\n \"end\": {\n \"line\": 55,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"button\");\n dom.setAttribute(el1, \"type\", \"button\");\n dom.setAttribute(el1, \"class\", \"action-button refresh\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"ion-refresh\");\n dom.setAttribute(el2, \"aria-hidden\", \"true\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n Refresh Rows List Cache\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element7 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element7);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"showModal\"], [], [\"loc\", [null, [51, 62], [51, 84]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 48,\n \"column\": 2\n },\n \"end\": {\n \"line\": 57,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.cluster.developmentMode\", [\"loc\", [null, [50, 14], [50, 43]]]]], [], 0, null, [\"loc\", [null, [50, 8], [55, 15]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 59,\n \"column\": 4\n },\n \"end\": {\n \"line\": 61,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" No cache list exists\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 61,\n \"column\": 4\n },\n \"end\": {\n \"line\": 63,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"loading-spinner\", [], [\"statusMessage\", [\"subexpr\", \"@mut\", [[\"get\", \"model.statusMessage\", [\"loc\", [null, [62, 38], [62, 57]]]]], [], []]], [\"loc\", [null, [62, 6], [62, 59]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 68,\n \"column\": 12\n },\n \"end\": {\n \"line\": 70,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"more-info\");\n var el2 = dom.createTextNode(\"Hide info on explorer cached lists\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element5 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element5);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"hideSideDrawer\"], [], [\"loc\", [null, [69, 40], [69, 67]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 70,\n \"column\": 12\n },\n \"end\": {\n \"line\": 72,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"more-info\");\n var el2 = dom.createTextNode(\"More info on explorer cached lists\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element4 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element4);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"showSideDrawer\"], [], [\"loc\", [null, [71, 40], [71, 67]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 65,\n \"column\": 8\n },\n \"end\": {\n \"line\": 73,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" Table rows are read from a cached list and may not represent the current state of the table.\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"br\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"isSideDrawerVisible\", [\"loc\", [null, [68, 18], [68, 37]]]]], [], 0, 1, [\"loc\", [null, [68, 12], [72, 19]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 64,\n \"column\": 6\n },\n \"end\": {\n \"line\": 74,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [], 0, null, [\"loc\", [null, [65, 8], [73, 28]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 83,\n \"column\": 10\n },\n \"end\": {\n \"line\": 88,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"Total Rows\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 3]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"model.rows.length\", [\"loc\", [null, [86, 36], [86, 57]]]]],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 101,\n \"column\": 28\n },\n \"end\": {\n \"line\": 103,\n \"column\": 28\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"th\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"column.name\", [\"loc\", [null, [102, 36], [102, 51]]]]],\n locals: [\"column\"],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 109,\n \"column\": 32\n },\n \"end\": {\n \"line\": 111,\n \"column\": 32\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"td\");\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 0]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"value\", [\"loc\", [null, [110, 46], [110, 55]]]]],\n locals: [\"value\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 107,\n \"column\": 26\n },\n \"end\": {\n \"line\": 113,\n \"column\": 26\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"row.parsedValue\", [\"loc\", [null, [109, 40], [109, 55]]]]], [], 0, null, [\"loc\", [null, [109, 32], [111, 41]]]]],\n locals: [\"row\"],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 94,\n \"column\": 18\n },\n \"end\": {\n \"line\": 116,\n \"column\": 18\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"table\");\n dom.setAttribute(el1, \"class\", \"table\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"thead\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\" \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tbody\");\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element3 = dom.childAt(fragment, [1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(dom.childAt(element3, [1, 1]), 1, 1);\n morphs[1] = dom.createMorphAt(dom.childAt(element3, [3]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"model.columns\", [\"loc\", [null, [101, 36], [101, 49]]]]], [], 0, null, [\"loc\", [null, [101, 28], [103, 37]]]], [\"block\", \"each\", [[\"get\", \"currentTableRows\", [\"loc\", [null, [107, 34], [107, 50]]]]], [], 1, null, [\"loc\", [null, [107, 26], [113, 35]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 93,\n \"column\": 16\n },\n \"end\": {\n \"line\": 117,\n \"column\": 16\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"pagination-component\", [], [\"chunkSize\", [\"subexpr\", \"@mut\", [[\"get\", \"pageSize\", [\"loc\", [null, [95, 28], [95, 36]]]]], [], []], \"totalSize\", [\"subexpr\", \"@mut\", [[\"get\", \"model.rows.length\", [\"loc\", [null, [96, 28], [96, 45]]]]], [], []], \"sectionRequest\", \"rowsPageRequest\"], 0, null, [\"loc\", [null, [94, 18], [116, 43]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child3 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 117,\n \"column\": 16\n },\n \"end\": {\n \"line\": 119,\n \"column\": 16\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" No rows found in table\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 63,\n \"column\": 4\n },\n \"end\": {\n \"line\": 125,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"table\");\n dom.setAttribute(el1, \"class\", \"key-value-table\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tbody\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"Cached List Created\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value\");\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"key\");\n var el5 = dom.createTextNode(\"Table Rows\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.setAttribute(el4, \"class\", \"value\");\n var el5 = dom.createTextNode(\"\\n\");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\" \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element6 = dom.childAt(fragment, [2, 1]);\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(dom.childAt(element6, [1, 3]), 0, 0);\n morphs[2] = dom.createMorphAt(element6, 3, 3);\n morphs[3] = dom.createMorphAt(dom.childAt(element6, [5, 3]), 1, 1);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"showCachedListWarning\", [\"loc\", [null, [64, 12], [64, 33]]]]], [], 0, null, [\"loc\", [null, [64, 6], [74, 13]]]], [\"content\", \"model.rowsList.created\", [\"loc\", [null, [80, 32], [80, 58]]]], [\"block\", \"if\", [[\"get\", \"model.rows.length\", [\"loc\", [null, [83, 16], [83, 33]]]]], [], 1, null, [\"loc\", [null, [83, 10], [88, 17]]]], [\"block\", \"if\", [[\"get\", \"model.rows.length\", [\"loc\", [null, [93, 22], [93, 39]]]]], [], 2, 3, [\"loc\", [null, [93, 16], [119, 23]]]]],\n locals: [],\n templates: [child0, child1, child2, child3]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 61,\n \"column\": 4\n },\n \"end\": {\n \"line\": 125,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"and\", [[\"get\", \"model.hasListBeenRequested\", [\"loc\", [null, [61, 19], [61, 45]]]], [\"subexpr\", \"not\", [[\"get\", \"model.isListLoaded\", [\"loc\", [null, [61, 51], [61, 69]]]]], [], [\"loc\", [null, [61, 46], [61, 70]]]]], [], [\"loc\", [null, [61, 14], [61, 71]]]]], [], 0, 1, [\"loc\", [null, [61, 4], [125, 4]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 58,\n \"column\": 2\n },\n \"end\": {\n \"line\": 126,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"and\", [[\"subexpr\", \"not\", [[\"get\", \"model.hasListBeenRequested\", [\"loc\", [null, [59, 20], [59, 46]]]]], [], [\"loc\", [null, [59, 15], [59, 47]]]], [\"subexpr\", \"not\", [[\"get\", \"model.isListLoaded\", [\"loc\", [null, [59, 53], [59, 71]]]]], [], [\"loc\", [null, [59, 48], [59, 72]]]]], [], [\"loc\", [null, [59, 10], [59, 73]]]]], [], 0, 1, [\"loc\", [null, [59, 4], [125, 11]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 47,\n \"column\": 0\n },\n \"end\": {\n \"line\": 127,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Table Rows\"], 0, null, [\"loc\", [null, [48, 2], [57, 30]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [58, 2], [126, 28]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child3 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 131,\n \"column\": 2\n },\n \"end\": {\n \"line\": 154,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"modal-content-container\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"header\");\n dom.setAttribute(el2, \"class\", \"modal-header\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"h3\");\n var el4 = dom.createElement(\"span\");\n dom.setAttribute(el4, \"class\", \"label label-danger\");\n var el5 = dom.createElement(\"i\");\n dom.setAttribute(el5, \"class\", \"ion-alert-circled\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\" Potentially Dangerous Operation\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"section\");\n dom.setAttribute(el2, \"class\", \"modal-body\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"p\");\n var el4 = dom.createTextNode(\"Creating a new cache list requires making a streaming call, with multiple response messages sent for each\\n request.\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"p\");\n var el4 = dom.createTextNode(\"This can be an expensive operation, and is not recommended if the node is in active use. To\\n continue please click the confirm button.\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"footer\");\n dom.setAttribute(el2, \"class\", \"modal-footer\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"button\");\n dom.setAttribute(el3, \"class\", \"btn btn-default\");\n var el4 = dom.createTextNode(\"Cancel\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"button\");\n dom.setAttribute(el3, \"class\", \"btn btn-primary\");\n var el4 = dom.createTextNode(\"Confirm\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1, 5]);\n var element1 = dom.childAt(element0, [1]);\n var element2 = dom.childAt(element0, [3]);\n var morphs = new Array(2);\n morphs[0] = dom.createElementMorph(element1);\n morphs[1] = dom.createElementMorph(element2);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"hideModal\"], [], [\"loc\", [null, [150, 46], [150, 68]]]], [\"element\", \"action\", [\"refreshRowsList\", [\"get\", \"model\", [\"loc\", [null, [151, 73], [151, 78]]]]], [], [\"loc\", [null, [151, 46], [151, 80]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 130,\n \"column\": 0\n },\n \"end\": {\n \"line\": 155,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"modal-dialog\", [], [\"close\", \"hideModal\", \"translucentOverlay\", true], 0, null, [\"loc\", [null, [131, 2], [154, 19]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child4 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 159,\n \"column\": 2\n },\n \"end\": {\n \"line\": 163,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"render\", [\"partials.cached-lists\"], [], [\"loc\", [null, [162, 4], [162, 38]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 158,\n \"column\": 0\n },\n \"end\": {\n \"line\": 164,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"side-drawer\", [], [\"label\", \"Explorer Cached Lists\", \"visible\", [\"subexpr\", \"@mut\", [[\"get\", \"isSideDrawerVisible\", [\"loc\", [null, [161, 10], [161, 29]]]]], [], []]], 0, null, [\"loc\", [null, [159, 2], [163, 18]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 164,\n \"column\": 19\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(5);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);\n morphs[4] = dom.createMorphAt(fragment, 8, 8, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"model.warnings\", [\"loc\", [null, [1, 6], [1, 20]]]]], [], 0, null, [\"loc\", [null, [1, 0], [10, 7]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 1, null, [\"loc\", [null, [12, 0], [45, 31]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 2, null, [\"loc\", [null, [47, 0], [127, 31]]]], [\"block\", \"if\", [[\"get\", \"modalVisible\", [\"loc\", [null, [130, 6], [130, 18]]]]], [], 3, null, [\"loc\", [null, [130, 0], [155, 7]]]], [\"block\", \"ember-wormhole\", [], [\"to\", \"side-drawer-container\"], 4, null, [\"loc\", [null, [158, 0], [164, 19]]]]],\n locals: [],\n templates: [child0, child1, child2, child3, child4]\n };\n })());\n});","define('ember-riak-explorer/pods/table/write/controller', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/side-drawer'], function (exports, _ember, _emberRiakExplorerMixinsControllerSideDrawer) {\n exports['default'] = _ember['default'].Controller.extend(_emberRiakExplorerMixinsControllerSideDrawer['default'], {\n errors: [],\n\n example: '',\n\n writeData: '',\n\n isDisabled: true,\n\n successMessage: '',\n\n canSubmit: (function () {\n return this.set('isDisabled', _ember['default'].isBlank(this.get('writeData')));\n }).observes('writeData'),\n\n clearErrors: function clearErrors() {\n this.set('errors', []);\n },\n\n clearSuccessMessage: function clearSuccessMessage() {\n this.set('successMessage', '');\n },\n\n clearWriteData: function clearWriteData() {\n this.set('writeData', '');\n },\n\n resetState: function resetState() {\n this.clearErrors();\n this.clearSuccessMessage();\n this.clearWriteData();\n },\n\n actions: {\n insertExample: function insertExample() {\n this.set('writeData', this.get('example'));\n }\n }\n });\n});","define('ember-riak-explorer/pods/table/write/route', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset', 'ember-riak-explorer/mixins/routes/wrapper-state', 'ember-riak-explorer/utils/data-type-checks', 'lodash/lodash'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset, _emberRiakExplorerMixinsRoutesWrapperState, _emberRiakExplorerUtilsDataTypeChecks, _lodashLodash) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], _emberRiakExplorerMixinsRoutesWrapperState['default'], {\n model: function model(params) {\n return this.explorer.getTable(params.clusterName, params.tableName);\n },\n\n afterModel: function afterModel(model, transition) {\n this.setSidebarCluster(model.get('cluster'));\n this.setBreadCrumbs({\n cluster: model.get('cluster'),\n table: model,\n crudAction: 'write to table'\n });\n this.setViewLabel({\n preLabel: 'Table',\n label: model.get('name')\n });\n },\n\n setupController: function setupController(controller, model) {\n this._super(controller, model);\n\n this.setExample();\n controller.resetState();\n },\n\n prepareData: function prepareData(stringData) {\n var isValid = false;\n var data = null;\n\n // Wraps the comma separated strings in an array, and replaces any single quotes with double\n var transformed = '[' + stringData.replace(/'/g, '\"') + ']';\n\n // Convert to actual JSON\n try {\n data = JSON.parse(transformed);\n } catch (e) {\n isValid = false;\n }\n\n // Make sure all child items inside the parent array are arrays\n if (data) {\n isValid = data.length === data.filter(function (item) {\n return _lodashLodash['default'].isArray(item);\n }).length;\n }\n\n if (!isValid) {\n this.controller.set('errors', ['Submitted Data is not formatted correctly.', 'The editor expects an array for each row you wish to insert, with each array separated by a comma.']);\n this.scrollToTop();\n }\n\n return data;\n },\n\n runValidations: function runValidations(data) {\n return this.validateWriteCoversAllColumns(data) && this.validateWriteUsesCorrectDataTypes(data);\n },\n\n setExample: function setExample() {\n // HERE BE DRAGONS: I apologize for the extremely complicated code, the point of this function is to dynamically\n // generate 3 sample writes for the user. We have to create a giant string that looks a group of arrays, and type\n // conversion in js in not ideal. All complicated parts are commented to help clarify\n\n // Eventual string that will be inserted into the code editor\n var exampleWrite = '';\n\n // Each column type with ten possibilies, 3 times. This ensures no matter what how many columns, we can use modulo 10\n // and generate a relatively unique array input for the given example\n var exampleTypeMatrix = {\n boolean: [[true, false, true, false, true, false, true, false, true, false], [true, false, true, false, true, false, true, false, true, false], [true, false, true, false, true, false, true, false, true, false]],\n double: [[10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 10.0], [20.1, 20.2, 20.3, 20.4, 20.5, 20.6, 20.7, 20.8, 20.9, 20.0], [30.1, 30.2, 30.3, 30.4, 30.5, 30.6, 30.7, 30.8, 30.9, 30.0]],\n sint64: [[10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]],\n timestamp: [[1464024810, 1464024811, 1464024812, 1464024813, 1464024814, 1464024815, 1464024816, 1464024817, 1464024818, 1464024819], [1464024820, 1464024821, 1464024822, 1464024823, 1464024824, 1464024825, 1464024826, 1464024827, 1464024828, 1464024829], [1464024830, 1464024831, 1464024832, 1464024833, 1464024834, 1464024835, 1464024836, 1464024837, 1464024838, 1464024839]],\n varchar: [['\\'foo\\'', '\\'bar\\'', '\\'Lorem\\'', '\\'ipsum\\'', '\\'dolor\\'', '\\'sit\\'', '\\'amet\\'', '\\'consectetur\\'', '\\'adipiscing\\'', '\\'elit\\''], ['\\'Aliquam\\'', '\\'sit\\'', '\\'amet\\'', '\\'tincidunt\\'', '\\'felis\\'', '\\'Curabitur\\'', '\\'at;', '\\'gravida\\'', '\\'est\\'', '\\'Quisque\\''], ['\\'vehicula\\'', '\\'mi\\'', '\\'sed\\'', '\\'libero\\'', '\\'hendrerit\\'', '\\'vel\\'', '\\'mollis\\'', '\\'lorem\\'', '\\'euismod\\'', '\\'Donec\\'']]\n };\n var columns = this.currentModel.get('columns');\n\n // Creates three sample writes by going through each column and using a sample of that columns type\n _lodashLodash['default'].times(3, function (timesIndex) {\n var example = [];\n\n columns.forEach(function (column, columnIndex) {\n example.push(exampleTypeMatrix[column.type][timesIndex][columnIndex % 10]);\n });\n\n // convert example array to string, gives us the desired formatting and spacing\n example = example.join(', ');\n\n if (timesIndex === 0) {\n exampleWrite = '[' + example + ']';\n } else {\n exampleWrite += ', [' + example + ']';\n }\n });\n\n this.controller.set('example', exampleWrite);\n },\n\n validateWriteCoversAllColumns: function validateWriteCoversAllColumns(data) {\n var columnsInTable = this.currentModel.get('columns').length;\n\n // Checks that each arrays length matches the amount of columns defined in the table\n var isValid = data.length === data.filter(function (subArray) {\n return subArray.length === columnsInTable;\n }).length;\n\n if (!isValid) {\n // 'Row column values must be in the same order as defined in the table. Refer to the table columns in the table reference for order.'\n this.controller.set('errors', ['Submitted Data is not correct. At least one of your arrays length does not match the amount of columns in the table.', 'Row values must be in the same order as columns are defined on the table. Refer to the table definition for correct order.', 'If a table column is optional, and you do not wish to pass a value, use null
as the row array value.']);\n this.scrollToTop();\n }\n\n return isValid;\n },\n\n validateWriteUsesCorrectDataTypes: function validateWriteUsesCorrectDataTypes(data) {\n var tableColumns = this.currentModel.get('columns');\n var controller = this.controller;\n var self = this;\n\n var isValid = data.length === data.filter(function (subArray) {\n return tableColumns.length === subArray.filter(function (item, index) {\n var column = tableColumns[index];\n var isSameType = undefined;\n\n if (column.optional && item === null) {\n isSameType = true;\n } else {\n switch (column.type) {\n case 'varchar':\n isSameType = _lodashLodash['default'].isString(item);\n break;\n case 'boolean':\n isSameType = _lodashLodash['default'].isBoolean(item);\n break;\n case 'timestamp':\n isSameType = (0, _emberRiakExplorerUtilsDataTypeChecks.isInteger)(item) && item > 0;\n break;\n case 'sint64':\n isSameType = (0, _emberRiakExplorerUtilsDataTypeChecks.isInteger)(item);\n break;\n case 'double':\n // Would like to use isFloat, but valid values like 4.0 do not succeed. JS will automatically convert to 4\n // There are hacks around it, but since we are using JSON.parse/stringifiy, there is too much effort involved\n isSameType = (0, _emberRiakExplorerUtilsDataTypeChecks.isNumber)(item);\n break;\n default:\n isSameType = false;\n break;\n }\n }\n\n if (!isSameType) {\n var errors = controller.get('errors');\n\n if (!errors.length) {\n errors.pushObject('Submitted Data is not correct. Incorrect data types submitted:');\n }\n\n errors.pushObject('The ' + column.name + ' column expects a type of ' + column.type + ', but instead was passed ' + item);\n self.scrollToTop();\n }\n\n return isSameType;\n }).length;\n }).length;\n\n return isValid;\n },\n\n actions: {\n writeDataToTable: function writeDataToTable(table, data) {\n this.controller.clearErrors();\n this.controller.clearSuccessMessage();\n\n var sanitizedData = this.prepareData(data);\n var isValid = sanitizedData ? this.runValidations(sanitizedData) : false;\n var self = this;\n\n if (isValid) {\n this.get('explorer').updateTable(table, sanitizedData).then(function onSuccess(data) {\n var tableName = table.get('name');\n\n self.controller.clearErrors();\n self.controller.clearWriteData();\n self.controller.set('successMessage', 'Your data was saved to the ' + tableName + ' table.');\n self.scrollToTop();\n }, function onFail(error) {\n self.controller.set('errors', 'The server failed to save the data to the table, check that your data is formatted correctly and try again.');\n self.scrollToTop();\n });\n }\n\n return false;\n }\n }\n });\n});","define(\"ember-riak-explorer/pods/table/write/template\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 6,\n \"column\": 8\n },\n \"end\": {\n \"line\": 8,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/write/template.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createUnsafeMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"error\", [\"loc\", [null, [7, 14], [7, 25]]]]],\n locals: [\"error\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 4\n },\n \"end\": {\n \"line\": 10,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/write/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"label label-danger\");\n var el3 = dom.createTextNode(\"Errors\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"errors\", [\"loc\", [null, [6, 16], [6, 22]]]]], [], 0, null, [\"loc\", [null, [6, 8], [8, 17]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 10,\n \"column\": 4\n },\n \"end\": {\n \"line\": 13,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/write/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"label label-danger\");\n var el3 = dom.createTextNode(\"Error\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"errors\", [\"loc\", [null, [12, 9], [12, 19]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 14,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/write/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"is-array\", [[\"get\", \"errors\", [\"loc\", [null, [3, 20], [3, 26]]]]], [], [\"loc\", [null, [3, 10], [3, 27]]]]], [], 0, 1, [\"loc\", [null, [3, 4], [13, 11]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 15,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/write/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"danger\", \"dismissible\", false], 0, null, [\"loc\", [null, [2, 2], [14, 22]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 17,\n \"column\": 2\n },\n \"end\": {\n \"line\": 20,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/write/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"label label-success\");\n var el3 = dom.createTextNode(\"SUCCESS\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [3]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"successMessage\", [\"loc\", [null, [19, 7], [19, 25]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 16,\n \"column\": 0\n },\n \"end\": {\n \"line\": 21,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/write/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"success\"], 0, null, [\"loc\", [null, [17, 2], [20, 22]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 27,\n \"column\": 8\n },\n \"end\": {\n \"line\": 30,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/write/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-close-round\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Cancel\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 25,\n \"column\": 4\n },\n \"end\": {\n \"line\": 32,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/write/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-actions\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"table\", [\"get\", \"model.cluster.name\", [\"loc\", [null, [27, 27], [27, 45]]]], [\"get\", \"model.name\", [\"loc\", [null, [27, 46], [27, 56]]]]], [\"class\", \"cancel action-button\"], 0, null, [\"loc\", [null, [27, 8], [30, 20]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 44,\n \"column\": 10\n },\n \"end\": {\n \"line\": 46,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/write/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"btn btn-xs btn-info\");\n var el2 = dom.createTextNode(\"Hide Write Guidelines\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element1 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element1);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"hideSideDrawer\"], [], [\"loc\", [null, [45, 46], [45, 73]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 46,\n \"column\": 10\n },\n \"end\": {\n \"line\": 48,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/write/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"btn btn-xs btn-info\");\n var el2 = dom.createTextNode(\"Show Write Guidelines\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element0);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"showSideDrawer\"], [], [\"loc\", [null, [47, 46], [47, 73]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 33,\n \"column\": 4\n },\n \"end\": {\n \"line\": 63,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/write/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"section\");\n dom.setAttribute(el1, \"class\", \"table-ref\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"section-title\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"section\");\n dom.setAttribute(el1, \"class\", \"table-editor\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"label\");\n var el3 = dom.createTextNode(\"\\n Use the editor below to write rows to your table\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"btn btn-xs btn-info\");\n var el4 = dom.createTextNode(\"Insert Example Write\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"submit-button-container\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"button\");\n dom.setAttribute(el3, \"type\", \"submit\");\n dom.setAttribute(el3, \"class\", \"btn btn-primary\");\n var el4 = dom.createTextNode(\"\\n Insert Rows\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element2 = dom.childAt(fragment, [1]);\n var element3 = dom.childAt(fragment, [3]);\n var element4 = dom.childAt(element3, [1]);\n var element5 = dom.childAt(element4, [1]);\n var element6 = dom.childAt(element3, [5, 1]);\n var morphs = new Array(7);\n morphs[0] = dom.createMorphAt(dom.childAt(element2, [1]), 0, 0);\n morphs[1] = dom.createMorphAt(element2, 3, 3);\n morphs[2] = dom.createElementMorph(element5);\n morphs[3] = dom.createMorphAt(element4, 3, 3);\n morphs[4] = dom.createMorphAt(element3, 3, 3);\n morphs[5] = dom.createAttrMorph(element6, 'disabled');\n morphs[6] = dom.createElementMorph(element6);\n return morphs;\n },\n statements: [[\"content\", \"model.name\", [\"loc\", [null, [36, 35], [36, 49]]]], [\"inline\", \"table.ts-table-reference\", [], [\"table\", [\"subexpr\", \"@mut\", [[\"get\", \"model\", [\"loc\", [null, [37, 41], [37, 46]]]]], [], []]], [\"loc\", [null, [37, 8], [37, 48]]]], [\"element\", \"action\", [\"insertExample\"], [], [\"loc\", [null, [43, 44], [43, 70]]]], [\"block\", \"if\", [[\"get\", \"isSideDrawerVisible\", [\"loc\", [null, [44, 16], [44, 35]]]]], [], 0, 1, [\"loc\", [null, [44, 10], [48, 17]]]], [\"inline\", \"ivy-codemirror\", [], [\"mode\", \"javascript\", \"theme\", \"material\", \"lineWrapping\", true, \"value\", [\"subexpr\", \"mut\", [[\"get\", \"writeData\", [\"loc\", [null, [55, 21], [55, 30]]]]], [], [\"loc\", [null, [55, 16], [55, 31]]]]], [\"loc\", [null, [51, 8], [55, 33]]]], [\"attribute\", \"disabled\", [\"get\", \"isDisabled\", [\"loc\", [null, [58, 67], [58, 77]]]]], [\"element\", \"action\", [\"writeDataToTable\", [\"get\", \"model\", [\"loc\", [null, [58, 108], [58, 113]]]], [\"get\", \"writeData\", [\"loc\", [null, [58, 114], [58, 123]]]]], [], [\"loc\", [null, [58, 80], [58, 125]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 24,\n \"column\": 2\n },\n \"end\": {\n \"line\": 64,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/write/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"dashboard-module.header\", [], [\"label\", \"Table Write Editor\"], 0, null, [\"loc\", [null, [25, 4], [32, 32]]]], [\"block\", \"dashboard-module.body\", [], [], 1, null, [\"loc\", [null, [33, 4], [63, 30]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child3 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 68,\n \"column\": 2\n },\n \"end\": {\n \"line\": 72,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/write/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"render\", [\"partials.ts-table-write-guidelines\"], [], [\"loc\", [null, [71, 4], [71, 51]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 67,\n \"column\": 0\n },\n \"end\": {\n \"line\": 73,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/write/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"side-drawer\", [], [\"label\", \"Write Guidelines\", \"visible\", [\"subexpr\", \"@mut\", [[\"get\", \"isSideDrawerVisible\", [\"loc\", [null, [70, 12], [70, 31]]]]], [], []]], 0, null, [\"loc\", [null, [68, 2], [72, 18]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 73,\n \"column\": 19\n }\n },\n \"moduleName\": \"ember-riak-explorer/pods/table/write/template.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"ts-table-container table-write-container\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[2] = dom.createMorphAt(dom.childAt(fragment, [3]), 1, 1);\n morphs[3] = dom.createMorphAt(fragment, 5, 5, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"errors\", [\"loc\", [null, [1, 6], [1, 12]]]]], [], 0, null, [\"loc\", [null, [1, 0], [15, 7]]]], [\"block\", \"if\", [[\"get\", \"successMessage\", [\"loc\", [null, [16, 6], [16, 20]]]]], [], 1, null, [\"loc\", [null, [16, 0], [21, 7]]]], [\"block\", \"dashboard-module.container\", [], [\"class\", \"medium-width\"], 2, null, [\"loc\", [null, [24, 2], [64, 33]]]], [\"block\", \"ember-wormhole\", [], [\"to\", \"side-drawer-container\"], 3, null, [\"loc\", [null, [67, 0], [73, 19]]]]],\n locals: [],\n templates: [child0, child1, child2, child3]\n };\n })());\n});","define('ember-riak-explorer/resolver', ['exports', 'ember-resolver'], function (exports, _emberResolver) {\n exports['default'] = _emberResolver['default'];\n});","define('ember-riak-explorer/router', ['exports', 'ember', 'ember-riak-explorer/config/environment'], function (exports, _ember, _emberRiakExplorerConfigEnvironment) {\n\n var Router = _ember['default'].Router.extend({\n location: _emberRiakExplorerConfigEnvironment['default'].locationType\n });\n\n Router.map(function () {\n // Cluster Routes\n this.route('cluster.ops', { path: '/cluster/:clusterName/ops' });\n this.route('cluster.data', { path: '/cluster/:clusterName/data' });\n this.route('cluster.query', { path: '/cluster/:clusterName/query' });\n\n // Cluster-Data Routes\n this.route('bucket-type', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName' });\n this.route('bucket-type.create', { path: '/cluster/:clusterName/data/bucket_type/create' });\n this.route('bucket-type.edit', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/edit' });\n this.route('bucket', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/:bucketName' });\n this.route('bucket.create', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/create' });\n this.route('riak-object', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/:bucketName/key/:objectName' });\n this.route('riak-object.create', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/:bucketName/key/create' });\n this.route('riak-object.edit', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/:bucketName/key/:objectName/edit' });\n this.route('riak-object.counter', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/:bucketName/counter/:objectName' });\n this.route('riak-object.hll', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/:bucketName/hll/:objectName' });\n this.route('riak-object.set', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/:bucketName/set/:objectName' });\n this.route('riak-object.map', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/:bucketName/map/:objectName' });\n this.route('riak-object.map.edit', { path: '/cluster/:clusterName/data/bucket_type/:bucketTypeName/bucket/:bucketName/map/:objectName/edit' });\n this.route('table', { path: '/cluster/:clusterName/data/table/:tableName' });\n this.route('table.query', { path: '/cluster/:clusterName/data/table/:tableName/query' });\n this.route('table.write', { path: '/cluster/:clusterName/data/table/:tableName/write' });\n this.route('table.create', { path: '/cluster/:clusterName/data/table/create' });\n\n // Cluster-Ops Routes\n this.route('node', { path: '/cluster/:clusterName/ops/nodes/:nodeName/' });\n this.route('log-file', { path: '/cluster/:clusterName/ops/nodes/:nodeName/logs/:logName' });\n this.route('config-file', { path: '/cluster/:clusterName/ops/nodes/:nodeName/configs/:configName' });\n this.route('node.monitoring', { path: '/cluster/:clusterName/ops/nodes/:nodeName/monitoring' });\n\n // Cluster-Query Routes\n this.route('search-index', { path: '/cluster/:clusterName/query/index/:searchIndexName' });\n this.route('search-schema', { path: '/cluster/:clusterName/query/schema/:searchSchemaName' });\n this.route('search-schema.edit', { path: '/cluster/:clusterName/query/schema/:searchSchemaName/edit' });\n this.route('search-schema.create', { path: '/cluster/:clusterName/query/schema/create' });\n\n // Error Routes\n this.route('error', { path: '*path' }); // Catch all for any unmatched routes\n this.route('error.service-not-found', { path: '/error/service-not-found' });\n\n // Misc. Routes\n this.route('help');\n });\n\n exports['default'] = Router;\n});","define('ember-riak-explorer/routes/application', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'ember-riak-explorer/mixins/routes/scroll-reset'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _emberRiakExplorerMixinsRoutesScrollReset) {\n exports['default'] = _ember['default'].Route.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default'], _emberRiakExplorerMixinsRoutesScrollReset['default'], {\n // Load the list of available clusters, for the left nav\n model: function model() {\n var self = this;\n\n return this.explorer.getClusters().then(function onSuccess(clusters) {\n return clusters;\n }, function onFail(error) {\n self.transitionTo('error.service-not-found');\n });\n }\n });\n});","define('ember-riak-explorer/serializers/application', ['exports', 'ember-data', 'ember'], function (exports, _emberData, _ember) {\n exports['default'] = _emberData['default'].RESTSerializer.extend(_emberData['default'].EmbeddedRecordsMixin, {\n /**\n `keyForAttribute` can be used to define rules for how to convert an\n attribute name in your model to a key in your JSON.\n @method keyForAttribute\n @param {String} key\n @param {String} method\n @return {String} normalized key\n */\n keyForAttribute: function keyForAttribute(attr, method) {\n // Riak and Explorer json uses snake case, like 'development_mode'\n return _ember['default'].String.underscore(attr);\n },\n\n normalizeResponse: function normalizeResponse(store, primaryModelClass, payload, id, requestType) {\n // We are currently not using the \"links\" object in the payload. Until we do, remove from\n // payload to keep deprecation warnings from showing up.\n delete payload.links;\n\n return this._super(store, primaryModelClass, payload, id, requestType);\n }\n });\n});","define('ember-riak-explorer/serializers/bucket-type', ['exports', 'ember-riak-explorer/serializers/application', 'ember'], function (exports, _emberRiakExplorerSerializersApplication, _ember) {\n exports['default'] = _emberRiakExplorerSerializersApplication['default'].extend({\n normalizeResponse: function normalizeResponse(store, primaryModelClass, payload, id, requestType) {\n var sortBy = _ember['default'].Enumerable.sortBy;\n\n payload.bucket_types = payload.bucket_types.sortBy('name');\n\n return this._super(store, primaryModelClass, payload, id, requestType);\n }\n });\n});","define('ember-riak-explorer/serializers/cluster', ['exports', 'ember-riak-explorer/serializers/application', 'ember'], function (exports, _emberRiakExplorerSerializersApplication, _ember) {\n exports['default'] = _emberRiakExplorerSerializersApplication['default'].extend({\n normalizeResponse: function normalizeResponse(store, primaryModelClass, payload, id, requestType) {\n var sortBy = _ember['default'].Enumerable.sortBy;\n\n payload.clusters = payload.clusters.sortBy('id');\n\n // convert riak type to be more readable\n payload.clusters.forEach(function (cluster) {\n switch (cluster.riak_type) {\n case 'oss':\n cluster.riak_type = 'kv_oss';\n cluster.riak_type_long = 'KV Open Source';\n break;\n case 'ee':\n cluster.riak_type = 'kv_ee';\n cluster.riak_type_long = 'KV Enterprise Edition';\n break;\n case 'ts':\n cluster.riak_type = 'ts_oss';\n cluster.riak_type_long = 'TS Open Source';\n break;\n case 'ts_ee':\n cluster.riak_type_long = 'TS Enterprise Edition';\n break;\n default:\n break;\n }\n });\n\n return this._super(store, primaryModelClass, payload, id, requestType);\n }\n });\n});","define('ember-riak-explorer/serializers/config-file', ['exports', 'ember-riak-explorer/serializers/application'], function (exports, _emberRiakExplorerSerializersApplication) {\n exports['default'] = _emberRiakExplorerSerializersApplication['default'].extend({\n normalizeResponse: function normalizeResponse(store, primaryModelClass, payload, id, requestType) {\n var newPayload = {\n 'config-files': payload.files\n };\n\n return this._super(store, primaryModelClass, newPayload, id, requestType);\n }\n });\n});","define('ember-riak-explorer/serializers/log-file', ['exports', 'ember-riak-explorer/serializers/application'], function (exports, _emberRiakExplorerSerializersApplication) {\n exports['default'] = _emberRiakExplorerSerializersApplication['default'].extend({\n normalizeResponse: function normalizeResponse(store, primaryModelClass, payload, id, requestType) {\n var newPayload = {\n 'log-files': payload.files\n };\n\n return this._super(store, primaryModelClass, newPayload, id, requestType);\n }\n });\n});","define('ember-riak-explorer/serializers/node', ['exports', 'ember-riak-explorer/serializers/application', 'ember'], function (exports, _emberRiakExplorerSerializersApplication, _ember) {\n exports['default'] = _emberRiakExplorerSerializersApplication['default'].extend({\n normalizeResponse: function normalizeResponse(store, primaryModelClass, payload, id, requestType) {\n var sortBy = _ember['default'].Enumerable.sortBy;\n\n payload.nodes = payload.nodes.sortBy('name');\n\n return this._super(store, primaryModelClass, payload, id, requestType);\n }\n });\n});","define('ember-riak-explorer/serializers/row', ['exports', 'ember-riak-explorer/serializers/application'], function (exports, _emberRiakExplorerSerializersApplication) {\n exports['default'] = _emberRiakExplorerSerializersApplication['default'].extend({\n normalize: function normalize(modelClass, resourceHash, prop) {\n resourceHash.value = resourceHash.value.split(',').join(', ');\n\n return this._super(modelClass, resourceHash, prop);\n }\n });\n});","define('ember-riak-explorer/serializers/search-index', ['exports', 'ember-riak-explorer/serializers/application'], function (exports, _emberRiakExplorerSerializersApplication) {\n exports['default'] = _emberRiakExplorerSerializersApplication['default'].extend({\n normalizeResponse: function normalizeResponse(store, primaryModelClass, payload, id, requestType) {\n var newPayload = {\n 'search-indexes': payload\n };\n\n return this._super(store, primaryModelClass, newPayload, id, requestType);\n },\n\n // TODO: Remove once basho-labs/riak_explorer#89 is completed\n normalize: function normalize(modelClass, resourceHash, prop) {\n resourceHash.schema_ref = resourceHash.schema;\n delete resourceHash.schema;\n\n return this._super(modelClass, resourceHash, prop);\n }\n });\n});","define('ember-riak-explorer/serializers/table', ['exports', 'ember-riak-explorer/serializers/application', 'ember', 'lodash/lodash'], function (exports, _emberRiakExplorerSerializersApplication, _ember, _lodashLodash) {\n exports['default'] = _emberRiakExplorerSerializersApplication['default'].extend({\n normalizeResponse: function normalizeResponse(store, primaryModelClass, payload, id, requestType) {\n var sortBy = _ember['default'].Enumerable.sortBy;\n\n // Parse the DDL object into specific properties and then delete the object\n payload.tables.forEach(function (table) {\n var ddl = table.props.ddl;\n\n // Assign table columns\n // *** Note: They are called 'fields' instead of 'columns' in the response. Docs use 'columns', so that is what we will use\n table.columns = [];\n Object.keys(ddl.fields).forEach(function (columnName) {\n table.columns.push(_lodashLodash['default'].extend({ name: columnName }, ddl.fields[columnName]));\n });\n\n // Assign partition key\n table.partition_key = [];\n ddl.partition_key.forEach(function (pk) {\n var isQuanta = pk.indexOf('quantum') > -1;\n\n // Reformat quantum to have spaces after commas\n if (isQuanta) {\n pk = pk.split(',').join(', ');\n }\n\n table.partition_key.push({\n name: pk,\n quantum: isQuanta\n });\n });\n\n // Assign local key\n table.local_key = ddl.local_key;\n\n delete table.props.ddl;\n });\n\n payload.tables = payload.tables.sortBy('name');\n\n return this._super(store, primaryModelClass, payload, id, requestType);\n }\n });\n});","define('ember-riak-explorer/services/ajax', ['exports', 'ember-ajax/services/ajax'], function (exports, _emberAjaxServicesAjax) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberAjaxServicesAjax['default'];\n }\n });\n});","define('ember-riak-explorer/services/explorer', ['exports', 'ember', 'ember-riak-explorer/config/environment', 'ember-riak-explorer/utils/parse-header'], function (exports, _ember, _emberRiakExplorerConfigEnvironment, _emberRiakExplorerUtilsParseHeader) {\n\n /**\n * An Ember service responsible for AJAX communication with the Explorer API.\n *\n * @class ExplorerService\n * @extends Ember.Service\n * @constructor\n * @uses Bucket\n * @uses BucketType\n * @uses BucketProps\n * @uses Cluster\n * @uses RiakObject\n * @uses ObjectMetadata\n */\n exports['default'] = _ember['default'].Service.extend({\n name: 'explorer',\n\n availableIn: ['controllers', 'routes'],\n\n /**\n * Default chunk size for requests that can potentially have large amounts of records\n * i.e. buckets and keys\n *\n * @property pageSize\n * @type Integer\n * @default 500\n */\n pageSize: _emberRiakExplorerConfigEnvironment['default'].pageSize,\n\n /**\n *\n * @method associateSchemasWithIndexes\n * @param {DS.Model} cluster\n */\n associateSchemasWithIndexes: function associateSchemasWithIndexes(cluster) {\n var self = this;\n\n cluster.get('searchIndexes').forEach(function (index) {\n var schemaName = index.get('schemaRef');\n var schema = cluster.get('searchSchemas').findBy('name', schemaName);\n\n if (!schema) {\n schema = self.store.createRecord('search-schema', {\n id: cluster.get('name') + '/' + schemaName,\n cluster: cluster,\n name: schemaName\n });\n }\n\n index.set('schema', schema);\n });\n },\n\n /**\n * Checks availability and validity of nodes in a given cluster.\n *\n * @method monitorCluster\n * @param {DS.Model} cluster\n */\n monitorCluster: function monitorCluster(cluster) {\n // Ping each node in cluster\n this.pingNodes(cluster);\n // Get status of each node in cluster\n this.getNodesStatus(cluster);\n // Get node statistics for historical analysis\n this.getNodesStats(cluster);\n },\n\n /**\n * Creates a Schema instance\n *\n * @method createSchema\n * @param {String} clusterName\n * @param {String} schemaName\n * @param {XML.String} data\n */\n createSchema: function createSchema(clusterName, schemaName, data) {\n var url = 'riak/clusters/' + clusterName + '/search/schema/' + schemaName;\n\n return _ember['default'].$.ajax({\n type: 'PUT',\n url: url,\n contentType: 'application/xml',\n processData: false,\n data: data\n });\n },\n\n createBucketType: function createBucketType(clusterName, bucketType) {\n var url = 'explore/clusters/' + clusterName + '/bucket_types/' + bucketType.name;\n\n return _ember['default'].$.ajax({\n type: 'PUT',\n url: url,\n contentType: 'application/json',\n data: JSON.stringify(bucketType.data)\n });\n },\n\n createCRDT: function createCRDT(clusterName, bucketTypeName, bucketName, objectName, data) {\n var url = 'riak/clusters/' + clusterName + '/types/' + bucketTypeName + '/buckets/' + bucketName + '/datatypes/' + objectName;\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n var request = _ember['default'].$.ajax({\n contentType: 'application/json',\n type: 'POST',\n dataType: 'json',\n url: url,\n data: JSON.stringify(data)\n });\n\n request.done(function (data) {\n resolve(data);\n });\n\n request.fail(function (jqXHR) {\n if (jqXHR.status === 204) {\n resolve(jqXHR.status);\n } else {\n reject(jqXHR);\n }\n });\n });\n },\n\n /**\n *\n * @method getBucket\n * @param {String} clusterName\n * @param {String} bucketTypeName\n * @param {String} bucketName\n * @return {DS.Model} Bucket\n */\n getBucket: function getBucket(clusterName, bucketTypeName, bucketName) {\n var self = this;\n\n return this.getBucketType(clusterName, bucketTypeName).then(function (bucketType) {\n return bucketType.get('buckets').findBy('name', bucketName);\n }).then(function (bucket) {\n return _ember['default'].RSVP.allSettled([bucket, self.getBucketProps(bucket), self.getObjects(bucket), self.getObjectList(bucket)]);\n }).then(function (PromiseArray) {\n var bucket = PromiseArray[0].value;\n\n return bucket;\n });\n },\n\n /**\n *\n * @method getBucketList\n * @param {DS.Model} bucketType\n * @return {DS.Model} BucketList\n */\n getBucketList: function getBucketList(bucketType) {\n var clusterName = bucketType.get('cluster').get('name');\n var bucketTypeName = bucketType.get('name');\n\n return this.store.queryRecord('bucket-list', { clusterName: clusterName, bucketTypeName: bucketTypeName }).then(function onSuccess(bucketList) {\n bucketType.set('isListLoaded', true);\n bucketType.set('bucketList', bucketList);\n\n return bucketType.get('bucketList');\n });\n },\n\n /**\n *\n * @method getBucketProps\n * @param {DS.Model} bucket\n * @return {Object} Bucket.props\n */\n getBucketProps: function getBucketProps(bucket) {\n var clusterUrl = bucket.get('bucketType').get('cluster').get('proxyUrl');\n var bucketTypeName = bucket.get('bucketType').get('name');\n var bucketName = bucket.get('name');\n var url = clusterUrl + '/types/' + bucketTypeName + '/buckets/' + bucketName + '/props';\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n var request = _ember['default'].$.ajax({\n url: url,\n type: 'GET'\n });\n\n request.done(function (data) {\n bucket.set('props', data.props);\n\n resolve(data);\n });\n\n request.fail(function (data) {\n reject(data);\n });\n });\n },\n\n /**\n *\n * @method getBuckets\n * @param {DS.Model} bucketType\n * @return {DS.Array} Bucket\n */\n getBuckets: function getBuckets(bucketType) {\n var clusterName = bucketType.get('cluster').get('name');\n var bucketTypeName = bucketType.get('name');\n\n return this.store.query('bucket', { clusterName: clusterName, bucketTypeName: bucketTypeName }).then(function (buckets) {\n bucketType.set('buckets', buckets);\n\n return bucketType.get('buckets');\n });\n },\n\n /**\n *\n * @method getBucketType\n * @param {String} clusterName\n * @param {String} bucketTypeName\n * @return {DS.Model} BucketType\n */\n getBucketType: function getBucketType(clusterName, bucketTypeName) {\n var self = this;\n\n return this.getCluster(clusterName).then(function (cluster) {\n return cluster.get('bucketTypes').findBy('name', bucketTypeName);\n }).then(function (bucketType) {\n return _ember['default'].RSVP.allSettled([bucketType, self.getBuckets(bucketType), self.getBucketList(bucketType)]);\n }).then(function (PromiseArray) {\n var bucketType = PromiseArray[0].value;\n\n return bucketType;\n });\n },\n\n /**\n * Returns all the Bucket Types that belong to the specified cluster.\n *\n * @method getBucketTypes\n * @param {DS.Model} cluster\n * @return {DS.Array} BucketType\n */\n getBucketTypes: function getBucketTypes(cluster) {\n return this.store.query('bucket-type', { clusterName: cluster.get('name') }).then(function (bucketTypes) {\n cluster.set('bucketTypes', bucketTypes);\n\n return cluster.get('bucketTypes');\n });\n },\n\n /**\n * Fetches a given config file and its dependencies\n *\n * @method getConfigFile\n * @param {String} clusterName\n * @param {String} nodeName\n * @param {String} configName\n * @return {DS.Model} ConfigFile\n */\n getConfigFile: function getConfigFile(clusterName, nodeName, configName) {\n var self = this;\n\n return this.getNode(clusterName, nodeName).then(function (node) {\n return node.get('configFiles').findBy('name', configName);\n }).then(function (configFile) {\n return _ember['default'].RSVP.allSettled([configFile, self.getConfigFileContents(configFile)]);\n }).then(function (PromiseArray) {\n var configFile = PromiseArray[0].value;\n\n return configFile;\n });\n },\n\n /**\n * Fetches and creates a set of config file for a given node.\n *\n * @method getConfigFiles\n * @param {DS.Model} node\n * @return {DS.Array} ConfigFile\n */\n getConfigFiles: function getConfigFiles(node) {\n if (_ember['default'].isEmpty(node.get('configFiles'))) {\n return this.store.query('config-file', { clusterName: node.get('cluster').get('name'), nodeName: node.get('name') }).then(function (configFiles) {\n node.set('configFiles', configFiles);\n\n return node.get('configFiles');\n });\n } else {\n return node.get('configFiles');\n }\n },\n\n /**\n * Fetches and sets a given config files contents\n *\n * @method getConfigFileContents\n * @param {DS.Model} config\n * @return {DS.Model} ConfigFile\n */\n getConfigFileContents: function getConfigFileContents(config) {\n var clusterName = config.get('node').get('cluster').get('name');\n var nodeName = config.get('node').get('name');\n var configName = config.get('name');\n var url = 'explore/clusters/' + clusterName + '/nodes/' + nodeName + '/config/files/' + configName;\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n var request = _ember['default'].$.ajax({\n url: url,\n type: 'GET',\n headers: {\n Accept: \"plain/text;\"\n }\n });\n\n request.done(function (data) {\n config.set('content', data);\n\n resolve(config);\n });\n\n request.fail(function (data) {\n reject(data);\n });\n });\n },\n\n /**\n * Creates and returns a Cluster object and initializes it with dependent\n * data (including all its Bucket Types and Search Indexes).\n *\n * @method getCluster\n * @param {String} clusterName\n * @return {DS.Model} Cluster\n */\n getCluster: function getCluster(clusterName) {\n var self = this;\n\n return this.getClusters().then(function (clusters) {\n return clusters.findBy('name', clusterName);\n }).then(function (cluster) {\n return _ember['default'].RSVP.allSettled([cluster, self.getBucketTypes(cluster), self.getIndexes(cluster), self.getNodes(cluster), self.getTables(cluster)]);\n }).then(function (PromiseArray) {\n var cluster = PromiseArray[0].value;\n\n if (!cluster.hasBeenInitialized) {\n // Create search-schemas from index references\n self.associateSchemasWithIndexes(cluster);\n\n // Check on node health of the cluster\n self.monitorCluster(cluster);\n\n // Continue to check on node health\n self.pollCluster(cluster);\n }\n\n cluster.hasBeenInitialized = true;\n\n return cluster;\n });\n },\n\n /**\n * Fetches all clusters defined in the riak_explorer.conf file\n *\n * @method getClusters\n * @return {DS.Array} Cluster\n */\n getClusters: function getClusters() {\n return this.store.findAll('cluster');\n },\n\n /**\n *\n * @method getIndex\n * @param {String} clusterName\n * @param {String} indexName\n * @param {DS.Model} SearchIndex\n */\n getIndex: function getIndex(clusterName, indexName) {\n var self = this;\n\n return this.getCluster(clusterName).then(function (cluster) {\n return cluster.get('searchIndexes').findBy('name', indexName);\n });\n },\n\n /**\n * Returns a list of Search Indexes that have been created on this cluster.\n * @see http://docs.basho.com/riak/latest/dev/references/http/search-index-info/\n *\n * @method getIndexes\n * @param {DS.Model} cluster\n * @return {DS.Array} SearchIndex\n */\n getIndexes: function getIndexes(cluster) {\n if (_ember['default'].isEmpty(cluster.get('searchIndexes'))) {\n // If this page was accessed directly\n // (via a bookmark and not from a link), bucket types are likely\n // to be not loaded yet. Load them.\n return this.store.query('search-index', { clusterName: cluster.get('name') }).then(function (indexes) {\n cluster.set('searchIndexes', indexes);\n\n cluster.get('searchIndexes');\n });\n } else {\n return cluster.get('searchIndexes');\n }\n },\n\n /**\n * Fetches a given log file and its dependencies\n *\n * @method getLogFile\n * @param {String} clusterName\n * @param {String} nodeName\n * @param {String} logName\n * @return {DS.Model} LogFile\n */\n getLogFile: function getLogFile(clusterName, nodeName, logName) {\n var self = this;\n\n return this.getNode(clusterName, nodeName).then(function (node) {\n return node.get('logFiles').findBy('name', logName);\n }).then(function (logFile) {\n return _ember['default'].RSVP.allSettled([logFile, self.getLogFileContents(logFile), self.getLogFileLength(logFile)]);\n }).then(function (PromiseArray) {\n var logFile = PromiseArray[0].value;\n\n return logFile;\n });\n },\n\n /**\n * Fetches and creates a set of log file for a given node.\n *\n * @method getLogFiles\n * @param {DS.Model} node\n * @return {DS.Array} LogFile\n */\n getLogFiles: function getLogFiles(node) {\n if (_ember['default'].isEmpty(node.get('logFiles'))) {\n return this.store.query('log-file', { clusterName: node.get('cluster').get('name'), nodeName: node.get('name') }).then(function (logFiles) {\n node.set('logFiles', logFiles);\n\n return node.get('logFiles');\n });\n } else {\n return node.get('logFiles');\n }\n },\n\n /**\n * Fetches a given log files contents\n *\n * @method getLogFileContents\n * @param {DS.Model} log\n * @return {DS.Model} LogFile\n */\n getLogFileContents: function getLogFileContents(log) {\n var clusterName = log.get('node').get('cluster').get('name');\n var nodeName = log.get('node').get('name');\n var logName = log.get('name');\n var url = 'explore/clusters/' + clusterName + '/nodes/' + nodeName + '/log/files/' + logName + '?rows=' + this.pageSize;\n var self = this;\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n var request = _ember['default'].$.ajax({\n url: url,\n type: 'GET',\n headers: {\n Accept: \"plain/text;\"\n }\n });\n\n request.done(function (data) {\n log.set('content', data);\n log.set('pageSize', self.pageSize);\n\n resolve(log);\n });\n\n request.fail(function (data) {\n reject(data);\n });\n });\n },\n\n /**\n * Fetches and sets the amount of lines in a given log file\n *\n * @method getLogFileLength\n * @param {DS.Model} log\n * @return {DS.Model} LogFile\n */\n getLogFileLength: function getLogFileLength(log) {\n var clusterName = log.get('node').get('cluster').get('name');\n var nodeName = log.get('node').get('name');\n var logName = log.get('name');\n var url = 'explore/clusters/' + clusterName + '/nodes/' + nodeName + '/log/files/' + logName;\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n var request = _ember['default'].$.ajax({\n url: url,\n type: 'GET',\n dataType: 'json'\n });\n\n request.done(function (data) {\n var totalLines = data[logName].total_lines;\n\n log.set('totalLines', totalLines);\n\n resolve(log);\n });\n\n request.fail(function (data) {\n reject(data);\n });\n });\n },\n\n /**\n * Fetches a given node and all its basic dependencies: stats, configuration, and log files\n *\n * @method getNode\n * @param {String} clusterName\n * @param {String} nodeName\n * @return {DS.Model} Node\n */\n getNode: function getNode(clusterName, nodeName) {\n var self = this;\n\n return this.getCluster(clusterName).then(function (cluster) {\n return cluster.get('nodes').findBy('name', nodeName);\n }).then(function (node) {\n return _ember['default'].RSVP.allSettled([node, self.getNodeStats(node), self.getNodeConfig(node), self.getLogFiles(node), self.getConfigFiles(node)]);\n }).then(function (PromiseArray) {\n var node = PromiseArray[0].value;\n\n return node;\n });\n },\n\n /**\n * TODO: Make stats own model, flow through ember data\n * Fetches a given nodes basic configuration stats\n *\n * @method getNodeConfig\n * @param {DS.Model} node\n * @return {Object} result of the AJAX call\n */\n getNodeConfig: function getNodeConfig(node) {\n var url = 'explore/nodes/' + node.get('name') + '/config';\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n var request = _ember['default'].$.ajax({\n url: url,\n type: 'GET'\n });\n\n request.done(function (data) {\n if (data.config.advanced_config) {\n var advancedConfig = data.config.advanced_config.map(function (configString) {\n return configString.split(',').join(', ');\n });\n\n node.set('advancedConfig', advancedConfig);\n }\n\n if (data.config.config) {\n (function () {\n var alphaSortedConfig = {};\n\n Object.keys(data.config.config).sort().forEach(function (key) {\n alphaSortedConfig[key] = data.config.config[key];\n });\n\n node.set('config', alphaSortedConfig);\n })();\n }\n\n resolve(data);\n });\n\n request.fail(function (data) {\n reject(data);\n });\n });\n },\n\n /**\n * Returns the results of a Riak node HTTP ping result.\n *\n * @method getNodePing\n * @param {String} nodeName\n * @return {Object} result of the AJAX call\n */\n getNodePing: function getNodePing(nodeName) {\n var url = 'riak/nodes/' + nodeName + '/ping';\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n var request = _ember['default'].$.ajax({\n url: url,\n type: 'GET'\n });\n\n request.done(function (data) {\n resolve(data);\n });\n\n request.fail(function (data) {\n reject(data);\n });\n });\n },\n\n getNodeReplicationStatus: function getNodeReplicationStatus(node) {\n var url = 'control/nodes/' + node.get('name') + '/status';\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n var request = _ember['default'].$.ajax({\n url: url,\n type: 'GET'\n });\n\n request.done(function (data) {\n var additionalNodeStats = data.status.nodes.findBy('id', node.get('name'));\n\n delete additionalNodeStats.id;\n delete data.status.nodes;\n\n var nodeReplStatus = _ember['default'].merge(data.status, additionalNodeStats);\n\n node.set('replStatus', nodeReplStatus);\n\n resolve(data);\n });\n\n request.fail(function (data) {\n reject(data);\n });\n });\n },\n\n /**\n * Gets and sets the \"status\" property of each node in a cluster. Status is detrmined by whether or not\n * the node's ring file is valid.\n *\n * @method getNodesStatus\n * @param {DS.Model} cluster\n * @return {Object} result of the AJAX call\n */\n getNodesStatus: function getNodesStatus(cluster) {\n var url = 'control/clusters/' + cluster.get('name') + '/status';\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n var request = _ember['default'].$.ajax({\n url: url,\n type: 'GET'\n });\n\n request.done(function (data) {\n cluster.get('nodes').forEach(function (node) {\n var nodeName = node.get('name');\n var nodeStatus = data.status.nodes.findBy('id', nodeName).status;\n\n node.set('status', nodeStatus);\n });\n\n resolve(cluster);\n });\n\n request.fail(function (data) {\n reject(data);\n });\n });\n },\n\n /**\n * Returns all reachable nodes for a given cluster id\n *\n * @method getNodes\n * @param {DS.Model} cluster\n * @return {DS.Array} Node\n */\n getNodes: function getNodes(cluster) {\n if (_ember['default'].isEmpty(cluster.get('nodes'))) {\n return this.store.query('node', { clusterName: cluster.get('name') }).then(function (nodes) {\n cluster.set('nodes', nodes);\n\n cluster.get('nodes');\n });\n } else {\n return cluster.get('nodes');\n }\n },\n\n getNodesStats: function getNodesStats(cluster) {\n var self = this;\n\n return _ember['default'].RSVP.allSettled(cluster.get('nodes').map(function (node) {\n return self.getNodeStats(node);\n }));\n },\n\n /**\n * TODO: Make stats own model, flow through ember data\n * Gets and sets the node stats property. Returns the node model object.\n *\n * @method getNodeStats\n * @param {DS.Model} node\n * @return {DS.Model} Node\n */\n getNodeStats: function getNodeStats(node) {\n var url = 'riak/nodes/' + node.get('name') + '/stats';\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n var request = _ember['default'].$.ajax({\n url: url,\n type: 'GET'\n });\n\n request.done(function (data) {\n node.set('stats', data);\n\n resolve(node);\n });\n\n request.fail(function (data) {\n reject(data);\n });\n });\n },\n\n getObject: function getObject(clusterName, bucketTypeName, bucketName, objectName) {\n var self = this;\n\n return this.getBucket(clusterName, bucketTypeName, bucketName).then(function (bucket) {\n return bucket.get('objects').findBy('name', objectName);\n }).then(function (riakObject) {\n return _ember['default'].RSVP.allSettled([riakObject, self.getObjectContents(riakObject)]);\n }).then(function (PromiseArray) {\n var riakObject = PromiseArray[0].value;\n\n return riakObject;\n });\n },\n\n // TODO: This can probably be ported over to be used the adapter findRecord\n // method once moved over to ED 2.0 using the 'include' object\n // Ref: https://github.com/emberjs/data/pull/3976\n getObjectContents: function getObjectContents(object) {\n var clusterUrl = object.get('cluster').get('proxyUrl');\n var bucketTypeName = object.get('bucketType').get('name');\n var bucketName = object.get('bucket').get('name');\n var objectName = object.get('name');\n var isCRDT = !!object.get('bucket').get('isCRDT');\n var url = isCRDT ? clusterUrl + '/types/' + bucketTypeName + '/buckets/' + bucketName + '/datatypes/' + objectName : clusterUrl + '/types/' + bucketTypeName + '/buckets/' + bucketName + '/keys/' + objectName;\n var xhrOptions = {\n url: url,\n type: 'GET',\n cache: false,\n headers: { 'Accept': '*/*, multipart/mixed' },\n processData: !isCRDT\n };\n\n if (isCRDT) {\n xhrOptions.dataType = 'json';\n }\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n var request = _ember['default'].$.ajax(xhrOptions);\n\n request.done(function (data, textStatus, jqXHR) {\n var headerObj = (0, _emberRiakExplorerUtilsParseHeader['default'])(jqXHR.getAllResponseHeaders());\n var type = isCRDT ? data.type : 'default';\n var content = isCRDT ? data.value : data;\n\n object.set('headers', headerObj);\n object.set('type', type);\n object.set('contents', content);\n object.set('url', url);\n\n resolve(object);\n });\n\n request.fail(function (data) {\n reject(data);\n });\n });\n },\n\n /**\n *\n * @method getObjectList\n * @param {DS.Model} bucket\n * @return {DS.Model} ObjectList\n */\n getObjectList: function getObjectList(bucket) {\n var clusterName = bucket.get('cluster').get('name');\n var bucketTypeName = bucket.get('bucketType').get('name');\n var bucketName = bucket.get('name');\n var self = this;\n\n return this.store.queryRecord('object-list', { clusterName: clusterName, bucketTypeName: bucketTypeName, bucketName: bucketName }).then(function onSuccess(objectList) {\n bucket.set('isListLoaded', true);\n bucket.set('objectList', objectList);\n\n return bucket.get('objectList');\n });\n },\n\n /**\n *\n * @method getObjects\n * @param {DS.Model} bucket\n * @return {DS.Array} RiakObject\n */\n getObjects: function getObjects(bucket) {\n var clusterName = bucket.get('cluster').get('name');\n var bucketTypeName = bucket.get('bucketType').get('name');\n var bucketName = bucket.get('name');\n\n return this.store.query('riak-object', { clusterName: clusterName, bucketTypeName: bucketTypeName, bucketName: bucketName }).then(function (objects) {\n bucket.set('objects', objects);\n\n return bucket.get('objects');\n });\n },\n\n /**\n *\n * @method getSearchSchema\n * @param {String} clusterName\n * @param {String} schemaName\n * @return {DS.Model} SearchSchema\n */\n getSearchSchema: function getSearchSchema(clusterName, schemaName) {\n var self = this;\n\n return this.getCluster(clusterName).then(function (cluster) {\n return cluster.get('searchSchemas').findBy('name', schemaName);\n }).then(function (schema) {\n return _ember['default'].RSVP.allSettled([schema, self.getSearchSchemaContent(schema)]);\n }).then(function (PromiseArray) {\n var schema = PromiseArray[0].value;\n\n return schema;\n });\n },\n\n /**\n *\n * @method getSearchSchemaContent\n * @param {DS.Model} schema\n * @return {String} schema.content\n */\n getSearchSchemaContent: function getSearchSchemaContent(schema) {\n var url = schema.get('url');\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n var request = _ember['default'].$.ajax({\n url: url,\n type: 'GET',\n dataType: 'xml'\n });\n\n request.done(function (data) {\n var xmlString = new XMLSerializer().serializeToString(data);\n schema.set('content', xmlString);\n\n resolve(schema.get('content'));\n });\n\n request.fail(function (data) {\n reject(data);\n });\n });\n },\n\n /**\n *\n * @method getTab;e\n * @param {String} clusterName\n * @param {String} tableName\n * @return {DS.Model} Table\n */\n getTable: function getTable(clusterName, tableName) {\n var self = this;\n\n return this.getCluster(clusterName).then(function (cluster) {\n return cluster.get('tables').findBy('name', tableName);\n }).then(function (table) {\n return _ember['default'].RSVP.allSettled([table, self.getTableRows(table), self.getTableRowsList(table)]);\n }).then(function (PromiseArray) {\n var table = PromiseArray[0].value;\n\n return table;\n });\n },\n\n getTableRows: function getTableRows(table) {\n var clusterName = table.get('cluster').get('name');\n var tableName = table.get('name');\n\n return this.store.query('row', { clusterName: clusterName, tableName: tableName }).then(function (rows) {\n table.set('rows', rows);\n\n return table.get('rows');\n });\n },\n\n getTableRowsList: function getTableRowsList(table) {\n var cluster = table.get('cluster');\n var clusterName = table.get('cluster').get('name');\n var tableName = table.get('name');\n\n return this.store.queryRecord('row-list', { clusterName: clusterName, tableName: tableName }).then(function onSuccess(list) {\n table.set('isListLoaded', true);\n table.set('rowsList', list);\n\n return table.get('rowsList');\n });\n },\n\n /**\n * Returns all the TS Tables that belong to the specified cluster.\n *\n * @method getTables\n * @param {DS.Model} cluster\n * @return {DS.Array} Table\n */\n getTables: function getTables(cluster) {\n return this.store.query('table', { clusterName: cluster.get('name') }).then(function (tables) {\n cluster.set('tables', tables);\n\n return cluster.get('tables');\n });\n },\n\n /**\n * Pings all nodes in a given cluster and sets the nodes status\n *\n * @method getNodes\n * @param {DS.Model} cluster\n */\n pingNodes: function pingNodes(cluster) {\n var self = this;\n\n this.getNodes(cluster).then(function (nodes) {\n nodes.forEach(function (node) {\n var nodeName = node.get('name');\n\n self.getNodePing(nodeName).then(function onSuccess(data) {\n node.set('available', true);\n }, function onFail(data) {\n node.set('available', false);\n });\n });\n });\n },\n\n /**\n * Checks node health in a given cluster, every 10 seconds\n *\n * @method pollCluster\n * @param {DS.Model} cluster\n */\n pollCluster: function pollCluster(cluster) {\n var self = this;\n\n // This check makes sure that only one cluster can be polled at any given time\n if (!this._clusterRef || cluster.get('name') !== this._clusterRef.get('name')) {\n this._clusterRef = cluster;\n }\n\n _ember['default'].run.later(this, function () {\n self.monitorCluster(this._clusterRef);\n self.pollCluster(this._clusterRef);\n }, 10000);\n },\n\n queryTable: function queryTable(table, data) {\n var clusterName = table.get('cluster').get('name');\n var url = 'explore/clusters/' + clusterName + '/tables/query';\n\n return _ember['default'].$.ajax({\n type: 'POST',\n url: url,\n data: data\n });\n },\n\n /**\n *\n * @method refreshBucketList\n * @param {DS.Model} bucketType\n */\n refreshBucketList: function refreshBucketList(bucketType) {\n var clusterName = bucketType.get('cluster').get('name');\n var bucketTypeName = bucketType.get('name');\n var url = 'explore/clusters/' + clusterName + '/bucket_types/' + bucketTypeName + '/refresh_buckets/source/riak_kv';\n\n // Setup state from request\n bucketType.set('isListLoaded', false);\n bucketType.set('hasListBeenRequested', true);\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n var request = _ember['default'].$.ajax({\n url: url,\n type: 'POST'\n });\n\n request.done(function (data) {\n resolve(data);\n });\n\n request.fail(function (jqXHR) {\n if (jqXHR.status === 202) {\n resolve(jqXHR.status);\n } else {\n bucketType.set('hasListBeenRequested', false); // Since the request failed, set value to false\n reject(jqXHR);\n }\n });\n });\n },\n\n /**\n *\n * @method refreshObjectList\n * @param {DS.Model} bucket\n */\n refreshObjectList: function refreshObjectList(bucket) {\n var clusterName = bucket.get('cluster').get('name');\n var bucketTypeName = bucket.get('bucketType').get('name');\n var bucketName = bucket.get('name');\n var url = 'explore/clusters/' + clusterName + '/bucket_types/' + bucketTypeName + '/buckets/' + bucketName + '/refresh_keys/source/riak_kv';\n\n // Setup state from request\n bucket.set('isListLoaded', false);\n bucket.set('hasListBeenRequested', true);\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n var request = _ember['default'].$.ajax({\n url: url,\n type: 'POST'\n });\n\n request.done(function (data) {\n resolve(data);\n });\n\n request.fail(function (jqXHR) {\n if (jqXHR.status === 202) {\n resolve(jqXHR.status);\n } else {\n bucket.set('hasListBeenRequested', false); // Since the request failed, set value to false\n reject(jqXHR);\n }\n });\n });\n },\n\n refreshTableRowsList: function refreshTableRowsList(table) {\n var clusterName = table.get('cluster').get('name');\n var tableName = table.get('name');\n var url = 'explore/clusters/' + clusterName + '/tables/' + tableName + '/refresh_keys/source/riak_kv';\n\n // Setup state from request\n table.set('isListLoaded', false);\n table.set('hasListBeenRequested', true);\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n var request = _ember['default'].$.ajax({\n url: url,\n type: 'POST'\n });\n\n request.done(function (data) {\n resolve(data);\n });\n\n request.fail(function (jqXHR) {\n if (jqXHR.status === 202) {\n resolve(jqXHR.status);\n } else {\n table.set('hasListBeenRequested', false); // Since the request failed, set value to false\n reject(jqXHR);\n }\n });\n });\n },\n\n updateBucketType: function updateBucketType(bucketType, props) {\n var clusterName = bucketType.get('cluster').get('name');\n var bucketTypeName = bucketType.get('name');\n var data = { props: props };\n var url = 'explore/clusters/' + clusterName + '/bucket_types/' + bucketTypeName;\n\n return _ember['default'].$.ajax({\n type: 'PUT',\n url: url,\n contentType: 'application/json',\n data: JSON.stringify(data)\n });\n },\n\n /**\n * Performs an update AJAX operation to the Riak Object\n *\n * @method updateDataType\n * @param {DS.Model} object\n * @param {String} operation\n */\n updateCRDT: function updateCRDT(object, operation) {\n var clusterUrl = object.get('cluster').get('proxyUrl');\n var bucketTypeName = object.get('bucketType').get('name');\n var bucketName = object.get('bucket').get('name');\n var objectName = object.get('name');\n var url = clusterUrl + '/types/' + bucketTypeName + '/buckets/' + bucketName + '/datatypes/' + objectName;\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n var request = _ember['default'].$.ajax({\n contentType: 'application/json',\n type: 'POST',\n dataType: 'json',\n url: url,\n data: JSON.stringify(operation)\n });\n\n request.done(function (data) {\n resolve(data);\n });\n\n request.fail(function (jqXHR) {\n if (jqXHR.status === 204) {\n resolve(jqXHR.status);\n } else {\n reject(jqXHR);\n }\n });\n });\n },\n\n /**\n *\n * @method updateSchema\n * @param {DS.Model} schema\n * @param {XML.String} data\n */\n updateSchema: function updateSchema(schema, data) {\n return _ember['default'].$.ajax({\n type: 'PUT',\n url: schema.get('url'),\n contentType: 'application/xml',\n processData: false,\n data: data\n });\n },\n\n updateTable: function updateTable(table, data) {\n var clusterName = table.get('cluster').get('name');\n var tableName = table.get('name');\n var url = 'explore/clusters/' + clusterName + '/tables/' + tableName;\n\n return _ember['default'].$.ajax({\n type: 'PUT',\n url: url,\n contentType: 'application/json',\n data: JSON.stringify(data)\n });\n }\n });\n});","define('ember-riak-explorer/services/loading-slider', ['exports', 'ember'], function (exports, _ember) {\n var Service = _ember['default'].Service;\n var Evented = _ember['default'].Evented;\n exports['default'] = Service.extend(Evented, {\n startLoading: function startLoading() {\n this.trigger('startLoading');\n },\n\n endLoading: function endLoading() {\n this.trigger('endLoading');\n },\n\n changeAttrs: function changeAttrs(attrs) {\n this.trigger('changeAttrs', attrs);\n }\n });\n});","define('ember-riak-explorer/services/modal-dialog', ['exports', 'ember-modal-dialog/services/modal-dialog'], function (exports, _emberModalDialogServicesModalDialog) {\n exports['default'] = _emberModalDialogServicesModalDialog['default'];\n});","define('ember-riak-explorer/storages/node-stats', ['exports', 'ember-local-storage/session/array'], function (exports, _emberLocalStorageSessionArray) {\n\n var Storage = _emberLocalStorageSessionArray['default'].extend();\n\n exports['default'] = Storage;\n});","define(\"ember-riak-explorer/templates/alerts/empty\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"empty-body\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 1,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/alerts/empty.hbs\"\n },\n isEmpty: true,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/templates/alerts/error-invalid-xml\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\", \"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 4,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/alerts/error-invalid-xml.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"label label-danger\");\n var el3 = dom.createTextNode(\"ERROR\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Invalid XML. Please check and make sure schema is valid xml.\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 4,\n \"column\": 20\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/alerts/error-invalid-xml.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"danger\", \"dismissible\", false], 0, null, [\"loc\", [null, [1, 0], [4, 20]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/alerts/error-must-be-json-parseable\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\", \"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 5,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/alerts/error-must-be-json-parseable.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"label label-danger\");\n var el3 = dom.createTextNode(\"ERROR\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Invalid JSON, must be parseable. Make sure to wrap any keys in double quotes. You can use a linter at\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"a\");\n dom.setAttribute(el1, \"href\", \"http://jsonlint.com/\");\n dom.setAttribute(el1, \"target\", \"_blank\");\n var el2 = dom.createTextNode(\"JSONLint\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\".\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 5,\n \"column\": 20\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/alerts/error-must-be-json-parseable.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"danger\", \"dismissible\", false], 0, null, [\"loc\", [null, [1, 0], [5, 20]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/alerts/error-request-was-not-processed\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\", \"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 5,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/alerts/error-request-was-not-processed.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"label label-danger\");\n var el3 = dom.createTextNode(\"ERROR\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Sorry but your request was not processed correctly. If the problem persists,\\n try submitting an issue to the \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"a\");\n dom.setAttribute(el1, \"href\", \"https://github.com/basho-labs/riak_explorer\");\n dom.setAttribute(el1, \"target\", \"_blank\");\n var el2 = dom.createTextNode(\"Explorer Github Repo\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\".\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 5,\n \"column\": 20\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/alerts/error-request-was-not-processed.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"danger\"], 0, null, [\"loc\", [null, [1, 0], [5, 20]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/alerts/error-schema-not-saved\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\", \"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 4,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/alerts/error-schema-not-saved.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"label label-danger\");\n var el3 = dom.createTextNode(\"ERROR\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Something went wrong, schema was not saved.\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 6,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/alerts/error-schema-not-saved.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"danger\", \"dismissible\", false], 0, null, [\"loc\", [null, [1, 0], [4, 20]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/alerts/error-set-items-unique\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\", \"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 4,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/alerts/error-set-items-unique.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"label label-danger\");\n var el3 = dom.createTextNode(\"ERROR\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Set items must be \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"strong\");\n var el2 = dom.createTextNode(\"unique\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\" binary values.\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 4,\n \"column\": 20\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/alerts/error-set-items-unique.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"danger\"], 0, null, [\"loc\", [null, [1, 0], [4, 20]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/alerts/error-solr-must-have-name\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\", \"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 4,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/alerts/error-solr-must-have-name.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"label label-danger\");\n var el3 = dom.createTextNode(\"ERROR\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Solr requires that the schema tag has a name attribute. Please update your xml.\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 4,\n \"column\": 20\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/alerts/error-solr-must-have-name.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"danger\", \"dismissible\", false], 0, null, [\"loc\", [null, [1, 0], [4, 20]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/alerts/error-solr-must-have-version\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\", \"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 4,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/alerts/error-solr-must-have-version.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"label label-danger\");\n var el3 = dom.createTextNode(\"ERROR\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Solr requires that the schema tag has a version attribute. Please update your xml.\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 4,\n \"column\": 20\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/alerts/error-solr-must-have-version.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"danger\", \"dismissible\", false], 0, null, [\"loc\", [null, [1, 0], [4, 20]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/alerts/feedback-welcome\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 7,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/alerts/feedback-welcome.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createTextNode(\"Feedback or suggestions welcome!\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"\\n If you have any questions or pain points using Riak Explorer,\\n please open up an \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"href\", \"https://github.com/basho-labs/riak_explorer/issues\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n var el3 = dom.createTextNode(\"issue on Github\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\".\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 9,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/alerts/feedback-welcome.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"alert-component\", [], [\"type\", \"info\", \"dismissible\", false], 0, null, [\"loc\", [null, [1, 0], [7, 20]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/application\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 7,\n \"column\": 6\n },\n \"end\": {\n \"line\": 17,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/application.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-ios-keypad\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"cluster.name\", [\"loc\", [null, [16, 8], [16, 24]]]]],\n locals: [\"cluster\"],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 24,\n \"column\": 14\n },\n \"end\": {\n \"line\": 26,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/application.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"currentCluster.riakVersion\", [\"loc\", [null, [25, 20], [25, 50]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 27,\n \"column\": 14\n },\n \"end\": {\n \"line\": 29,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/application.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"currentCluster.riakTypeLong\", [\"loc\", [null, [28, 20], [28, 51]]]]],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 30,\n \"column\": 14\n },\n \"end\": {\n \"line\": 32,\n \"column\": 14\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/application.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n dom.setAttribute(el1, \"class\", \"dev-mode\");\n var el2 = dom.createTextNode(\"Dev mode\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child3 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 37,\n \"column\": 12\n },\n \"end\": {\n \"line\": 40,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/application.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-ios-cloud\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Data\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child4 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 41,\n \"column\": 12\n },\n \"end\": {\n \"line\": 44,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/application.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-ios-pulse-strong\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Ops\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child5 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 45,\n \"column\": 12\n },\n \"end\": {\n \"line\": 48,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/application.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-ios-search-strong\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Query\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 19,\n \"column\": 6\n },\n \"end\": {\n \"line\": 51,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/application.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"current-cluster\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"header\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"title\");\n var el4 = dom.createTextNode(\"Cluster: \");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"ul\");\n dom.setAttribute(el3, \"class\", \"meta list-inline\");\n var el4 = dom.createTextNode(\"\\n\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\" \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"nav\");\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element1 = dom.childAt(fragment, [1]);\n var element2 = dom.childAt(element1, [1]);\n var element3 = dom.childAt(element2, [3]);\n var element4 = dom.childAt(element1, [3]);\n var morphs = new Array(9);\n morphs[0] = dom.createMorphAt(dom.childAt(element2, [1]), 1, 1);\n morphs[1] = dom.createMorphAt(element3, 1, 1);\n morphs[2] = dom.createMorphAt(element3, 2, 2);\n morphs[3] = dom.createMorphAt(element3, 3, 3);\n morphs[4] = dom.createMorphAt(element2, 5, 5);\n morphs[5] = dom.createAttrMorph(element4, 'class');\n morphs[6] = dom.createMorphAt(element4, 1, 1);\n morphs[7] = dom.createMorphAt(element4, 2, 2);\n morphs[8] = dom.createMorphAt(element4, 3, 3);\n return morphs;\n },\n statements: [[\"content\", \"currentCluster.name\", [\"loc\", [null, [22, 40], [22, 63]]]], [\"block\", \"if\", [[\"get\", \"currentCluster.hasVersion\", [\"loc\", [null, [24, 20], [24, 45]]]]], [], 0, null, [\"loc\", [null, [24, 14], [26, 21]]]], [\"block\", \"if\", [[\"get\", \"currentCluster.hasType\", [\"loc\", [null, [27, 20], [27, 42]]]]], [], 1, null, [\"loc\", [null, [27, 14], [29, 21]]]], [\"block\", \"if\", [[\"get\", \"currentCluster.developmentMode\", [\"loc\", [null, [30, 20], [30, 50]]]]], [], 2, null, [\"loc\", [null, [30, 14], [32, 21]]]], [\"inline\", \"cluster-status-indicator\", [], [\"status\", [\"subexpr\", \"@mut\", [[\"get\", \"currentCluster.status\", [\"loc\", [null, [34, 46], [34, 67]]]]], [], []]], [\"loc\", [null, [34, 12], [34, 69]]]], [\"attribute\", \"class\", [\"concat\", [\"cluster-section-links current-section-is-\", [\"get\", \"clusterSubSection\", [\"loc\", [null, [36, 65], [36, 82]]]]]]], [\"block\", \"link-to\", [\"cluster.data\", [\"get\", \"currentCluster.name\", [\"loc\", [null, [37, 38], [37, 57]]]]], [\"class\", \"data\"], 3, null, [\"loc\", [null, [37, 12], [40, 24]]]], [\"block\", \"link-to\", [\"cluster.ops\", [\"get\", \"currentCluster.name\", [\"loc\", [null, [41, 37], [41, 56]]]]], [\"class\", \"ops\"], 4, null, [\"loc\", [null, [41, 12], [44, 24]]]], [\"block\", \"link-to\", [\"cluster.query\", [\"get\", \"currentCluster.name\", [\"loc\", [null, [45, 39], [45, 58]]]]], [\"class\", \"query\"], 5, null, [\"loc\", [null, [45, 12], [48, 24]]]]],\n locals: [],\n templates: [child0, child1, child2, child3, child4, child5]\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 54,\n \"column\": 6\n },\n \"end\": {\n \"line\": 64,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/application.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"view-header\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(element0, 1, 1);\n morphs[1] = dom.createMorphAt(element0, 3, 3);\n return morphs;\n },\n statements: [[\"inline\", \"breadcrumb-component\", [], [\"clusterSubSection\", [\"subexpr\", \"@mut\", [[\"get\", \"clusterSubSection\", [\"loc\", [null, [57, 28], [57, 45]]]]], [], []], \"data\", [\"subexpr\", \"@mut\", [[\"get\", \"breadCrumbMap\", [\"loc\", [null, [58, 15], [58, 28]]]]], [], []]], [\"loc\", [null, [56, 10], [58, 30]]]], [\"inline\", \"view-label\", [], [\"pre-label\", [\"subexpr\", \"@mut\", [[\"get\", \"viewLabelMap.preLabel\", [\"loc\", [null, [61, 20], [61, 41]]]]], [], []], \"label\", [\"subexpr\", \"@mut\", [[\"get\", \"viewLabelMap.label\", [\"loc\", [null, [62, 16], [62, 34]]]]], [], []]], [\"loc\", [null, [60, 10], [62, 36]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 73,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/application.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"app-panel\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"wrapper-panel\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"sidebar-panel\");\n var el4 = dom.createTextNode(\"\\n\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\" \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"results-panel\");\n var el4 = dom.createTextNode(\"\\n\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"div\");\n dom.setAttribute(el4, \"class\", \"view-body\");\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"id\", \"side-drawer-container\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element5 = dom.childAt(fragment, [2]);\n var element6 = dom.childAt(element5, [3]);\n var element7 = dom.childAt(element6, [1]);\n var element8 = dom.childAt(element6, [3]);\n var element9 = dom.childAt(element8, [3]);\n var morphs = new Array(7);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(element5, 1, 1);\n morphs[2] = dom.createMorphAt(element7, 1, 1);\n morphs[3] = dom.createMorphAt(element7, 3, 3);\n morphs[4] = dom.createMorphAt(element8, 1, 1);\n morphs[5] = dom.createMorphAt(element9, 1, 1);\n morphs[6] = dom.createMorphAt(element9, 3, 3);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"inline\", \"loading-slider\", [], [\"isLoading\", [\"subexpr\", \"@mut\", [[\"get\", \"loading\", [\"loc\", [null, [1, 27], [1, 34]]]]], [], []]], [\"loc\", [null, [1, 0], [1, 36]]]], [\"inline\", \"render\", [\"partials.topbar\"], [], [\"loc\", [null, [4, 2], [4, 30]]]], [\"block\", \"power-select\", [], [\"class\", \"cluster-selector\", \"searchEnabled\", false, \"selected\", [\"subexpr\", \"@mut\", [[\"get\", \"currentCluster\", [\"loc\", [null, [10, 15], [10, 29]]]]], [], []], \"placeholder\", \"Select Cluster\", \"options\", [\"subexpr\", \"@mut\", [[\"get\", \"model\", [\"loc\", [null, [12, 14], [12, 19]]]]], [], []], \"onchange\", [\"subexpr\", \"action\", [\"clusterSelected\"], [], [\"loc\", [null, [13, 15], [13, 41]]]]], 0, null, [\"loc\", [null, [7, 6], [17, 23]]]], [\"block\", \"if\", [[\"get\", \"currentCluster\", [\"loc\", [null, [19, 12], [19, 26]]]]], [], 1, null, [\"loc\", [null, [19, 6], [51, 13]]]], [\"block\", \"if\", [[\"get\", \"showViewHeader\", [\"loc\", [null, [54, 12], [54, 26]]]]], [], 2, null, [\"loc\", [null, [54, 6], [64, 13]]]], [\"inline\", \"outlet\", [\"alert\"], [], [\"loc\", [null, [67, 8], [67, 26]]]], [\"content\", \"outlet\", [\"loc\", [null, [68, 8], [68, 18]]]]],\n locals: [],\n templates: [child0, child1, child2]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/alert-component\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 4,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/alert-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"button\");\n dom.setAttribute(el1, \"type\", \"button\");\n dom.setAttribute(el1, \"class\", \"close\");\n dom.setAttribute(el1, \"aria-label\", \"Close\");\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"aria-hidden\", \"true\");\n var el3 = dom.createTextNode(\"×\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element0);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"dismiss\"], [], [\"loc\", [null, [3, 59], [3, 79]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 6,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/alert-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"dismissible\", [\"loc\", [null, [2, 8], [2, 19]]]]], [], 0, null, [\"loc\", [null, [2, 2], [4, 9]]]], [\"content\", \"yield\", [\"loc\", [null, [5, 2], [5, 11]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 8,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/alert-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"visible\", [\"loc\", [null, [1, 6], [1, 13]]]]], [], 0, null, [\"loc\", [null, [1, 0], [6, 7]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/breadcrumb-component\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 4\n },\n \"end\": {\n \"line\": 5,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [\"data\", \"cluster.data\", [\"get\", \"data.cluster.name\", [\"loc\", [null, [4, 42], [4, 59]]]]], [], [\"loc\", [null, [4, 10], [4, 61]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 12,\n \"column\": 6\n },\n \"end\": {\n \"line\": 16,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [[\"get\", \"data.bucket.name\", [\"loc\", [null, [14, 20], [14, 36]]]], \"bucket\", [\"get\", \"data.cluster.name\", [\"loc\", [null, [14, 46], [14, 63]]]], [\"get\", \"data.bucketType.name\", [\"loc\", [null, [14, 64], [14, 84]]]], [\"get\", \"data.bucket.name\", [\"loc\", [null, [14, 85], [14, 101]]]]], [], [\"loc\", [null, [14, 10], [14, 103]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 19,\n \"column\": 8\n },\n \"end\": {\n \"line\": 23,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [[\"get\", \"data.riakObject.name\", [\"loc\", [null, [21, 22], [21, 42]]]], \"riak-object.counter\", [\"get\", \"data.cluster.name\", [\"loc\", [null, [21, 65], [21, 82]]]], [\"get\", \"data.bucketType.name\", [\"loc\", [null, [21, 83], [21, 103]]]], [\"get\", \"data.bucket.name\", [\"loc\", [null, [21, 104], [21, 120]]]], [\"get\", \"data.riakObject.name\", [\"loc\", [null, [21, 121], [21, 141]]]]], [], [\"loc\", [null, [21, 12], [21, 143]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 23,\n \"column\": 8\n },\n \"end\": {\n \"line\": 27,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [[\"get\", \"data.riakObject.name\", [\"loc\", [null, [25, 22], [25, 42]]]], \"riak-object.hll\", [\"get\", \"data.cluster.name\", [\"loc\", [null, [25, 61], [25, 78]]]], [\"get\", \"data.bucketType.name\", [\"loc\", [null, [25, 79], [25, 99]]]], [\"get\", \"data.bucket.name\", [\"loc\", [null, [25, 100], [25, 116]]]], [\"get\", \"data.riakObject.name\", [\"loc\", [null, [25, 117], [25, 137]]]]], [], [\"loc\", [null, [25, 12], [25, 139]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 27,\n \"column\": 8\n },\n \"end\": {\n \"line\": 31,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [[\"get\", \"data.riakObject.name\", [\"loc\", [null, [29, 22], [29, 42]]]], \"riak-object.set\", [\"get\", \"data.cluster.name\", [\"loc\", [null, [29, 61], [29, 78]]]], [\"get\", \"data.bucketType.name\", [\"loc\", [null, [29, 79], [29, 99]]]], [\"get\", \"data.bucket.name\", [\"loc\", [null, [29, 100], [29, 116]]]], [\"get\", \"data.riakObject.name\", [\"loc\", [null, [29, 117], [29, 137]]]]], [], [\"loc\", [null, [29, 12], [29, 139]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 31,\n \"column\": 8\n },\n \"end\": {\n \"line\": 35,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [[\"get\", \"data.riakObject.name\", [\"loc\", [null, [33, 22], [33, 42]]]], \"riak-object.map\", [\"get\", \"data.cluster.name\", [\"loc\", [null, [33, 61], [33, 78]]]], [\"get\", \"data.bucketType.name\", [\"loc\", [null, [33, 79], [33, 99]]]], [\"get\", \"data.bucket.name\", [\"loc\", [null, [33, 100], [33, 116]]]], [\"get\", \"data.riakObject.name\", [\"loc\", [null, [33, 117], [33, 137]]]]], [], [\"loc\", [null, [33, 12], [33, 139]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 35,\n \"column\": 8\n },\n \"end\": {\n \"line\": 39,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [[\"get\", \"data.riakObject.name\", [\"loc\", [null, [37, 22], [37, 42]]]], \"riak-object\", [\"get\", \"data.cluster.name\", [\"loc\", [null, [37, 57], [37, 74]]]], [\"get\", \"data.bucketType.name\", [\"loc\", [null, [37, 75], [37, 95]]]], [\"get\", \"data.bucket.name\", [\"loc\", [null, [37, 96], [37, 112]]]], [\"get\", \"data.riakObject.name\", [\"loc\", [null, [37, 113], [37, 133]]]]], [], [\"loc\", [null, [37, 12], [37, 135]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 31,\n \"column\": 8\n },\n \"end\": {\n \"line\": 39,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"eq\", [[\"get\", \"data.riakObject.type\", [\"loc\", [null, [31, 22], [31, 42]]]], \"map\"], [], [\"loc\", [null, [31, 18], [31, 49]]]]], [], 0, 1, [\"loc\", [null, [31, 8], [39, 8]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 27,\n \"column\": 8\n },\n \"end\": {\n \"line\": 39,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"eq\", [[\"get\", \"data.riakObject.type\", [\"loc\", [null, [27, 22], [27, 42]]]], \"set\"], [], [\"loc\", [null, [27, 18], [27, 49]]]]], [], 0, 1, [\"loc\", [null, [27, 8], [39, 8]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 23,\n \"column\": 8\n },\n \"end\": {\n \"line\": 39,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"eq\", [[\"get\", \"data.riakObject.type\", [\"loc\", [null, [23, 22], [23, 42]]]], \"hll\"], [], [\"loc\", [null, [23, 18], [23, 49]]]]], [], 0, 1, [\"loc\", [null, [23, 8], [39, 8]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 18,\n \"column\": 6\n },\n \"end\": {\n \"line\": 40,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"eq\", [[\"get\", \"data.riakObject.type\", [\"loc\", [null, [19, 18], [19, 38]]]], \"counter\"], [], [\"loc\", [null, [19, 14], [19, 49]]]]], [], 0, 1, [\"loc\", [null, [19, 8], [39, 15]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 7,\n \"column\": 4\n },\n \"end\": {\n \"line\": 41,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 5, 5, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [[\"get\", \"data.bucketType.name\", [\"loc\", [null, [9, 18], [9, 38]]]], \"bucket-type\", [\"get\", \"data.cluster.name\", [\"loc\", [null, [9, 53], [9, 70]]]], [\"get\", \"data.bucketType.name\", [\"loc\", [null, [9, 71], [9, 91]]]]], [], [\"loc\", [null, [9, 8], [9, 93]]]], [\"block\", \"if\", [[\"get\", \"data.bucket\", [\"loc\", [null, [12, 12], [12, 23]]]]], [], 0, null, [\"loc\", [null, [12, 6], [16, 13]]]], [\"block\", \"if\", [[\"get\", \"data.riakObject\", [\"loc\", [null, [18, 12], [18, 27]]]]], [], 1, null, [\"loc\", [null, [18, 6], [40, 13]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 43,\n \"column\": 4\n },\n \"end\": {\n \"line\": 47,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [[\"get\", \"data.table.name\", [\"loc\", [null, [45, 18], [45, 33]]]], \"table\", [\"get\", \"data.cluster.name\", [\"loc\", [null, [45, 42], [45, 59]]]], [\"get\", \"data.table.name\", [\"loc\", [null, [45, 60], [45, 75]]]]], [], [\"loc\", [null, [45, 8], [45, 77]]]]],\n locals: [],\n templates: []\n };\n })();\n var child3 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 49,\n \"column\": 4\n },\n \"end\": {\n \"line\": 51,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"data.crudAction\", [\"loc\", [null, [50, 10], [50, 29]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 52,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"data.cluster\", [\"loc\", [null, [3, 10], [3, 22]]]]], [], 0, null, [\"loc\", [null, [3, 4], [5, 11]]]], [\"block\", \"if\", [[\"get\", \"data.bucketType\", [\"loc\", [null, [7, 10], [7, 25]]]]], [], 1, null, [\"loc\", [null, [7, 4], [41, 11]]]], [\"block\", \"if\", [[\"get\", \"data.table\", [\"loc\", [null, [43, 10], [43, 20]]]]], [], 2, null, [\"loc\", [null, [43, 4], [47, 11]]]], [\"block\", \"if\", [[\"get\", \"data.crudAction\", [\"loc\", [null, [49, 10], [49, 25]]]]], [], 3, null, [\"loc\", [null, [49, 4], [51, 11]]]]],\n locals: [],\n templates: [child0, child1, child2, child3]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 55,\n \"column\": 4\n },\n \"end\": {\n \"line\": 57,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [\"ops\", \"cluster.ops\", [\"get\", \"data.cluster.name\", [\"loc\", [null, [56, 40], [56, 57]]]]], [], [\"loc\", [null, [56, 10], [56, 59]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 59,\n \"column\": 4\n },\n \"end\": {\n \"line\": 63,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [[\"get\", \"data.node.name\", [\"loc\", [null, [61, 18], [61, 32]]]], \"node\", [\"get\", \"data.cluster.name\", [\"loc\", [null, [61, 40], [61, 57]]]], [\"get\", \"data.node.name\", [\"loc\", [null, [61, 58], [61, 72]]]]], [], [\"loc\", [null, [61, 8], [61, 74]]]]],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 65,\n \"column\": 4\n },\n \"end\": {\n \"line\": 69,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [[\"get\", \"data.logFile.name\", [\"loc\", [null, [67, 18], [67, 35]]]], \"log-file\", [\"get\", \"data.cluster.name\", [\"loc\", [null, [67, 47], [67, 64]]]], [\"get\", \"data.node.name\", [\"loc\", [null, [67, 65], [67, 79]]]], [\"get\", \"data.logFile.name\", [\"loc\", [null, [67, 80], [67, 97]]]]], [], [\"loc\", [null, [67, 8], [67, 99]]]]],\n locals: [],\n templates: []\n };\n })();\n var child3 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 71,\n \"column\": 4\n },\n \"end\": {\n \"line\": 75,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [[\"get\", \"data.configFile.name\", [\"loc\", [null, [73, 18], [73, 38]]]], \"config-file\", [\"get\", \"data.cluster.name\", [\"loc\", [null, [73, 53], [73, 70]]]], [\"get\", \"data.node.name\", [\"loc\", [null, [73, 71], [73, 85]]]], [\"get\", \"data.configFile.name\", [\"loc\", [null, [73, 86], [73, 106]]]]], [], [\"loc\", [null, [73, 8], [73, 108]]]]],\n locals: [],\n templates: []\n };\n })();\n var child4 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 77,\n \"column\": 4\n },\n \"end\": {\n \"line\": 79,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"data.crudAction\", [\"loc\", [null, [78, 10], [78, 29]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 54,\n \"column\": 2\n },\n \"end\": {\n \"line\": 80,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(5);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);\n morphs[4] = dom.createMorphAt(fragment, 8, 8, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"data.cluster\", [\"loc\", [null, [55, 10], [55, 22]]]]], [], 0, null, [\"loc\", [null, [55, 4], [57, 11]]]], [\"block\", \"if\", [[\"get\", \"data.node\", [\"loc\", [null, [59, 10], [59, 19]]]]], [], 1, null, [\"loc\", [null, [59, 4], [63, 11]]]], [\"block\", \"if\", [[\"get\", \"data.logFile\", [\"loc\", [null, [65, 10], [65, 22]]]]], [], 2, null, [\"loc\", [null, [65, 4], [69, 11]]]], [\"block\", \"if\", [[\"get\", \"data.configFile\", [\"loc\", [null, [71, 10], [71, 25]]]]], [], 3, null, [\"loc\", [null, [71, 4], [75, 11]]]], [\"block\", \"if\", [[\"get\", \"data.crudAction\", [\"loc\", [null, [77, 10], [77, 25]]]]], [], 4, null, [\"loc\", [null, [77, 4], [79, 11]]]]],\n locals: [],\n templates: [child0, child1, child2, child3, child4]\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 83,\n \"column\": 4\n },\n \"end\": {\n \"line\": 85,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [\"query\", \"cluster.query\", [\"get\", \"data.cluster.name\", [\"loc\", [null, [84, 44], [84, 61]]]]], [], [\"loc\", [null, [84, 10], [84, 63]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 87,\n \"column\": 4\n },\n \"end\": {\n \"line\": 89,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [[\"get\", \"data.searchIndex.name\", [\"loc\", [null, [88, 20], [88, 41]]]], \"search-index\", [\"get\", \"data.cluster.name\", [\"loc\", [null, [88, 57], [88, 74]]]], [\"get\", \"data.searchIndex.name\", [\"loc\", [null, [88, 75], [88, 96]]]]], [], [\"loc\", [null, [88, 10], [88, 98]]]]],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 91,\n \"column\": 4\n },\n \"end\": {\n \"line\": 93,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [[\"get\", \"data.searchSchema.name\", [\"loc\", [null, [92, 20], [92, 42]]]], \"search-schema\", [\"get\", \"data.cluster.name\", [\"loc\", [null, [92, 59], [92, 76]]]], [\"get\", \"data.searchSchema.name\", [\"loc\", [null, [92, 77], [92, 99]]]]], [], [\"loc\", [null, [92, 10], [92, 101]]]]],\n locals: [],\n templates: []\n };\n })();\n var child3 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 95,\n \"column\": 4\n },\n \"end\": {\n \"line\": 99,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"inline\", \"link-to\", [[\"get\", \"data.table.name\", [\"loc\", [null, [97, 18], [97, 33]]]], \"table\", [\"get\", \"data.cluster.name\", [\"loc\", [null, [97, 42], [97, 59]]]], [\"get\", \"data.table.name\", [\"loc\", [null, [97, 60], [97, 75]]]]], [], [\"loc\", [null, [97, 8], [97, 77]]]]],\n locals: [],\n templates: []\n };\n })();\n var child4 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 101,\n \"column\": 4\n },\n \"end\": {\n \"line\": 103,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"data.crudAction\", [\"loc\", [null, [102, 10], [102, 29]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 82,\n \"column\": 2\n },\n \"end\": {\n \"line\": 104,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(5);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);\n morphs[4] = dom.createMorphAt(fragment, 8, 8, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"data.cluster\", [\"loc\", [null, [83, 10], [83, 22]]]]], [], 0, null, [\"loc\", [null, [83, 4], [85, 11]]]], [\"block\", \"if\", [[\"get\", \"data.searchIndex\", [\"loc\", [null, [87, 10], [87, 26]]]]], [], 1, null, [\"loc\", [null, [87, 4], [89, 11]]]], [\"block\", \"if\", [[\"get\", \"data.searchSchema\", [\"loc\", [null, [91, 10], [91, 27]]]]], [], 2, null, [\"loc\", [null, [91, 4], [93, 11]]]], [\"block\", \"if\", [[\"get\", \"data.table\", [\"loc\", [null, [95, 10], [95, 20]]]]], [], 3, null, [\"loc\", [null, [95, 4], [99, 11]]]], [\"block\", \"if\", [[\"get\", \"data.crudAction\", [\"loc\", [null, [101, 10], [101, 25]]]]], [], 4, null, [\"loc\", [null, [101, 4], [103, 11]]]]],\n locals: [],\n templates: [child0, child1, child2, child3, child4]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"triple-curlies\"\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 106,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/breadcrumb-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"ol\");\n dom.setAttribute(el1, \"class\", \"breadcrumb\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [0]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(element0, 1, 1);\n morphs[1] = dom.createMorphAt(element0, 3, 3);\n morphs[2] = dom.createMorphAt(element0, 5, 5);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"isClusterData\", [\"loc\", [null, [2, 8], [2, 21]]]]], [], 0, null, [\"loc\", [null, [2, 2], [52, 9]]]], [\"block\", \"if\", [[\"get\", \"isClusterOps\", [\"loc\", [null, [54, 8], [54, 20]]]]], [], 1, null, [\"loc\", [null, [54, 2], [80, 9]]]], [\"block\", \"if\", [[\"get\", \"isClusterQuery\", [\"loc\", [null, [82, 8], [82, 22]]]]], [], 2, null, [\"loc\", [null, [82, 2], [104, 9]]]]],\n locals: [],\n templates: [child0, child1, child2]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/charts/cluster-stat\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 2,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/charts/cluster-stat.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [1, 0], [1, 9]]]]],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/charts/node-stat\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 2,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/charts/node-stat.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [1, 0], [1, 9]]]]],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/cluster-status-indicator\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 2,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/cluster-status-indicator.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [1, 0], [1, 9]]]]],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/dashboard-module/body\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 2,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/dashboard-module/body.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [1, 0], [1, 9]]]]],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/dashboard-module/container\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 2,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/dashboard-module/container.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [1, 0], [1, 9]]]]],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/dashboard-module/header\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"triple-curlies\"\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 3,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/dashboard-module/header.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"module-label\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"label\", [\"loc\", [null, [2, 28], [2, 37]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 5,\n \"column\": 9\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/dashboard-module/header.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"label\", [\"loc\", [null, [1, 6], [1, 11]]]]], [], 0, null, [\"loc\", [null, [1, 0], [3, 7]]]], [\"content\", \"yield\", [\"loc\", [null, [5, 0], [5, 9]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/dashboard-module/section\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"triple-curlies\"\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 3,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/dashboard-module/section.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"section-title\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"title\", [\"loc\", [null, [2, 29], [2, 38]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 6,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/dashboard-module/section.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"title\", [\"loc\", [null, [1, 6], [1, 11]]]]], [], 0, null, [\"loc\", [null, [1, 0], [3, 7]]]], [\"content\", \"yield\", [\"loc\", [null, [5, 0], [5, 9]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/form/add-custom-properties\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 0\n },\n \"end\": {\n \"line\": 18,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/form/add-custom-properties.hbs\"\n },\n isEmpty: false,\n arity: 2,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"property-container\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"form-group property-input\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"label\");\n var el4 = dom.createTextNode(\"Property Key\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"form-group property-input\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"label\");\n var el4 = dom.createTextNode(\"Property Value\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"remove-property label label-danger\");\n var el3 = dom.createTextNode(\"\\n remove\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var element1 = dom.childAt(element0, [5]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 3, 3);\n morphs[1] = dom.createMorphAt(dom.childAt(element0, [3]), 3, 3);\n morphs[2] = dom.createElementMorph(element1);\n return morphs;\n },\n statements: [[\"inline\", \"input\", [], [\"value\", [\"subexpr\", \"@mut\", [[\"get\", \"property.key\", [\"loc\", [null, [7, 20], [7, 32]]]]], [], []], \"class\", \"form-control\"], [\"loc\", [null, [7, 6], [7, 55]]]], [\"inline\", \"input\", [], [\"value\", [\"subexpr\", \"@mut\", [[\"get\", \"property.value\", [\"loc\", [null, [11, 20], [11, 34]]]]], [], []], \"class\", \"form-control\"], [\"loc\", [null, [11, 6], [11, 57]]]], [\"element\", \"action\", [\"removeProperty\", [\"get\", \"index\", [\"loc\", [null, [14, 79], [14, 84]]]]], [], [\"loc\", [null, [14, 53], [14, 86]]]]],\n locals: [\"property\", \"index\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\", \"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 25,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/form/add-custom-properties.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"label\");\n var el2 = dom.createTextNode(\"Custom Properties\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"form-group add-property\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"span\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"ion-plus-circled\");\n dom.setAttribute(el3, \"aria-hidden\", \"true\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n Add property\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element2 = dom.childAt(fragment, [4, 1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n morphs[1] = dom.createElementMorph(element2);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"properties\", [\"loc\", [null, [3, 8], [3, 18]]]]], [], 0, null, [\"loc\", [null, [3, 0], [18, 9]]]], [\"element\", \"action\", [\"addNewProperty\"], [], [\"loc\", [null, [21, 8], [21, 35]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/form/explorer-button\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"modifiers\",\n \"modifiers\": [\"action\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 4,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/form/explorer-button.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"button\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [0]);\n var morphs = new Array(3);\n morphs[0] = dom.createAttrMorph(element0, 'class');\n morphs[1] = dom.createElementMorph(element0);\n morphs[2] = dom.createMorphAt(element0, 1, 1);\n return morphs;\n },\n statements: [[\"attribute\", \"class\", [\"concat\", [\"btn btn-\", [\"get\", \"type\", [\"loc\", [null, [1, 25], [1, 29]]]]]]], [\"element\", \"action\", [\"handleButtonClick\"], [], [\"loc\", [null, [1, 33], [1, 63]]]], [\"content\", \"label\", [\"loc\", [null, [2, 2], [2, 11]]]]],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/form/explorer-input\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 3,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/form/explorer-input.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"label\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"label\", [\"loc\", [null, [2, 9], [2, 18]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 6,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/form/explorer-input.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"label\", [\"loc\", [null, [1, 6], [1, 11]]]]], [], 0, null, [\"loc\", [null, [1, 0], [3, 7]]]], [\"inline\", \"input\", [], [\"type\", [\"subexpr\", \"@mut\", [[\"get\", \"type\", [\"loc\", [null, [5, 13], [5, 17]]]]], [], []], \"value\", [\"subexpr\", \"mut\", [[\"get\", \"value\", [\"loc\", [null, [5, 29], [5, 34]]]]], [], [\"loc\", [null, [5, 24], [5, 35]]]], \"class\", \"form-control\"], [\"loc\", [null, [5, 0], [5, 58]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/high-charts\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 2,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/high-charts.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [1, 0], [1, 9]]]]],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/hll-editor\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 9,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/hll-editor.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"button\");\n dom.setAttribute(el2, \"type\", \"button\");\n dom.setAttribute(el2, \"class\", \"button-add-item\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"ion-plus-round\");\n dom.setAttribute(el3, \"aria-hidden\", \"true\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n Add Item\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [0]);\n var element1 = dom.childAt(element0, [3]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(element0, 1, 1);\n morphs[1] = dom.createElementMorph(element1);\n return morphs;\n },\n statements: [[\"inline\", \"input\", [], [\"value\", [\"subexpr\", \"mut\", [[\"get\", \"newItem\", [\"loc\", [null, [2, 21], [2, 28]]]]], [], [\"loc\", [null, [2, 16], [2, 29]]]], \"class\", \"input-add-item\"], [\"loc\", [null, [2, 2], [2, 54]]]], [\"element\", \"action\", [\"addElement\", [\"get\", \"newItem\", [\"loc\", [null, [3, 70], [3, 77]]]]], [], [\"loc\", [null, [3, 48], [3, 79]]]]],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/link/explorer-resource\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 4,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/link/explorer-resource.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [3, 4], [3, 13]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 5,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/link/explorer-resource.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"bucket-type\", [\"get\", \"resourceObj.name\", [\"loc\", [null, [2, 27], [2, 43]]]]], [], 0, null, [\"loc\", [null, [2, 2], [4, 14]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 8,\n \"column\": 2\n },\n \"end\": {\n \"line\": 10,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/link/explorer-resource.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [9, 4], [9, 13]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 7,\n \"column\": 0\n },\n \"end\": {\n \"line\": 11,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/link/explorer-resource.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"bucket-type\", [\"get\", \"resourceObj.cluster.name\", [\"loc\", [null, [8, 27], [8, 51]]]], [\"get\", \"resourceObj.name\", [\"loc\", [null, [8, 52], [8, 68]]]]], [\"class\", [\"subexpr\", \"@mut\", [[\"get\", \"linkClass\", [\"loc\", [null, [8, 75], [8, 84]]]]], [], []]], 0, null, [\"loc\", [null, [8, 2], [10, 14]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 14,\n \"column\": 2\n },\n \"end\": {\n \"line\": 16,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/link/explorer-resource.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [15, 4], [15, 13]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 13,\n \"column\": 0\n },\n \"end\": {\n \"line\": 17,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/link/explorer-resource.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"bucket\", [\"get\", \"resourceObj.cluster.name\", [\"loc\", [null, [14, 22], [14, 46]]]], [\"get\", \"resourceObj.bucketType.name\", [\"loc\", [null, [14, 47], [14, 74]]]], [\"get\", \"resourceObj.name\", [\"loc\", [null, [14, 75], [14, 91]]]]], [\"class\", [\"subexpr\", \"@mut\", [[\"get\", \"linkClass\", [\"loc\", [null, [14, 98], [14, 107]]]]], [], []]], 0, null, [\"loc\", [null, [14, 2], [16, 14]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child3 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 20,\n \"column\": 2\n },\n \"end\": {\n \"line\": 22,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/link/explorer-resource.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [21, 4], [21, 13]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 19,\n \"column\": 0\n },\n \"end\": {\n \"line\": 23,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/link/explorer-resource.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"search-index\", [\"get\", \"resourceObj.cluster.name\", [\"loc\", [null, [20, 28], [20, 52]]]], [\"get\", \"resourceObj.name\", [\"loc\", [null, [20, 53], [20, 69]]]]], [\"class\", [\"subexpr\", \"@mut\", [[\"get\", \"linkClass\", [\"loc\", [null, [20, 76], [20, 85]]]]], [], []]], 0, null, [\"loc\", [null, [20, 2], [22, 14]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 25,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/link/explorer-resource.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n morphs[3] = dom.createMorphAt(fragment, 6, 6, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"eq\", [[\"get\", \"resourceType\", [\"loc\", [null, [1, 10], [1, 22]]]], \"cluster\"], [], [\"loc\", [null, [1, 6], [1, 33]]]]], [], 0, null, [\"loc\", [null, [1, 0], [5, 7]]]], [\"block\", \"if\", [[\"subexpr\", \"eq\", [[\"get\", \"resourceType\", [\"loc\", [null, [7, 10], [7, 22]]]], \"bucket-type\"], [], [\"loc\", [null, [7, 6], [7, 37]]]]], [], 1, null, [\"loc\", [null, [7, 0], [11, 7]]]], [\"block\", \"if\", [[\"subexpr\", \"eq\", [[\"get\", \"resourceType\", [\"loc\", [null, [13, 10], [13, 22]]]], \"bucket\"], [], [\"loc\", [null, [13, 6], [13, 32]]]]], [], 2, null, [\"loc\", [null, [13, 0], [17, 7]]]], [\"block\", \"if\", [[\"subexpr\", \"eq\", [[\"get\", \"resourceType\", [\"loc\", [null, [19, 10], [19, 22]]]], \"index\"], [], [\"loc\", [null, [19, 6], [19, 31]]]]], [], 3, null, [\"loc\", [null, [19, 0], [23, 7]]]]],\n locals: [],\n templates: [child0, child1, child2, child3]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/loading-spinner\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 6,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/loading-spinner.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"status-message\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 1, 1);\n return morphs;\n },\n statements: [[\"content\", \"statusMessage\", [\"loc\", [null, [4, 6], [4, 23]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"triple-curlies\"\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 26,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/loading-spinner.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"loading-container\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"spinner\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"spinner-blade\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"spinner-blade\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"spinner-blade\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"spinner-blade\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"spinner-blade\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"spinner-blade\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"spinner-blade\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"spinner-blade\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"spinner-blade\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"spinner-blade\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"spinner-blade\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"div\");\n dom.setAttribute(el3, \"class\", \"spinner-blade\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\\n\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"statusMessage\", [\"loc\", [null, [2, 8], [2, 21]]]]], [], 0, null, [\"loc\", [null, [2, 2], [6, 9]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/map-object/contents\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 7,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/contents.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"map-object.maps\", [], [\"title\", [\"subexpr\", \"@mut\", [[\"get\", \"type\", [\"loc\", [null, [4, 10], [4, 14]]]]], [], []], \"maps\", [\"subexpr\", \"@mut\", [[\"get\", \"contents\", [\"loc\", [null, [5, 9], [5, 17]]]]], [], []]], [\"loc\", [null, [3, 4], [5, 19]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 7,\n \"column\": 2\n },\n \"end\": {\n \"line\": 13,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/contents.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"map-object.sets\", [], [\"title\", [\"subexpr\", \"@mut\", [[\"get\", \"type\", [\"loc\", [null, [9, 10], [9, 14]]]]], [], []], \"map\", [\"subexpr\", \"@mut\", [[\"get\", \"map\", [\"loc\", [null, [10, 8], [10, 11]]]]], [], []], \"sets\", [\"subexpr\", \"@mut\", [[\"get\", \"contents\", [\"loc\", [null, [11, 9], [11, 17]]]]], [], []], \"removeField\", [\"subexpr\", \"@mut\", [[\"get\", \"removeField\", [\"loc\", [null, [12, 16], [12, 27]]]]], [], []]], [\"loc\", [null, [8, 4], [12, 29]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 13,\n \"column\": 2\n },\n \"end\": {\n \"line\": 21,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/contents.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"map-object.section\", [], [\"title\", [\"subexpr\", \"@mut\", [[\"get\", \"type\", [\"loc\", [null, [15, 10], [15, 14]]]]], [], []], \"map\", [\"subexpr\", \"@mut\", [[\"get\", \"map\", [\"loc\", [null, [16, 8], [16, 11]]]]], [], []], \"items\", [\"subexpr\", \"@mut\", [[\"get\", \"contents\", [\"loc\", [null, [17, 10], [17, 18]]]]], [], []]], [\"loc\", [null, [14, 4], [17, 20]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 7,\n \"column\": 2\n },\n \"end\": {\n \"line\": 21,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/contents.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"eq\", [[\"get\", \"type\", [\"loc\", [null, [7, 16], [7, 20]]]], \"sets\"], [], [\"loc\", [null, [7, 12], [7, 28]]]]], [], 0, 1, [\"loc\", [null, [7, 2], [21, 2]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 22,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/contents.hbs\"\n },\n isEmpty: false,\n arity: 2,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"eq\", [[\"get\", \"type\", [\"loc\", [null, [2, 12], [2, 16]]]], \"maps\"], [], [\"loc\", [null, [2, 8], [2, 24]]]]], [], 0, 1, [\"loc\", [null, [2, 2], [21, 9]]]]],\n locals: [\"type\", \"contents\"],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 22,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/contents.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"each-in\", [[\"get\", \"sortedMap\", [\"loc\", [null, [1, 11], [1, 20]]]]], [], 0, null, [\"loc\", [null, [1, 0], [22, 12]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/map-object/map\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 6,\n \"column\": 6\n },\n \"end\": {\n \"line\": 9,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/map.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-ios-minus\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"toggle-text\");\n var el2 = dom.createTextNode(\"hide contents\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 9,\n \"column\": 6\n },\n \"end\": {\n \"line\": 12,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/map.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-ios-plus\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"toggle-text\");\n var el2 = dom.createTextNode(\"view contents\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"triple-curlies\"\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 21,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/map.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"map-item\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"map-name\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"expand-contents\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"code\");\n var el5 = dom.createTextNode(\"\\n\");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\" \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [0]);\n var element1 = dom.childAt(element0, [1]);\n var element2 = dom.childAt(element1, [3, 1]);\n var element3 = dom.childAt(element0, [3]);\n var morphs = new Array(6);\n morphs[0] = dom.createAttrMorph(element0, 'id');\n morphs[1] = dom.createMorphAt(element1, 1, 1);\n morphs[2] = dom.createElementMorph(element2);\n morphs[3] = dom.createMorphAt(element2, 1, 1);\n morphs[4] = dom.createAttrMorph(element3, 'class');\n morphs[5] = dom.createMorphAt(element3, 1, 1);\n return morphs;\n },\n statements: [[\"attribute\", \"id\", [\"get\", \"name\", [\"loc\", [null, [1, 27], [1, 31]]]]], [\"content\", \"name\", [\"loc\", [null, [3, 4], [3, 12]]]], [\"element\", \"action\", [\"subMapToggle\"], [], [\"loc\", [null, [5, 10], [5, 35]]]], [\"block\", \"if\", [[\"get\", \"showContent\", [\"loc\", [null, [6, 12], [6, 23]]]]], [], 0, 1, [\"loc\", [null, [6, 6], [12, 13]]]], [\"attribute\", \"class\", [\"subexpr\", \"if\", [[\"get\", \"showContent\", [\"loc\", [null, [16, 18], [16, 29]]]], \"sub-map-contents expanded\", \"sub-map-contents\"], [], [\"loc\", [null, [16, 13], [16, 78]]]]], [\"inline\", \"map-object.contents\", [], [\"sortedMap\", [\"subexpr\", \"@mut\", [[\"get\", \"value\", [\"loc\", [null, [17, 36], [17, 41]]]]], [], []]], [\"loc\", [null, [17, 4], [17, 43]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/map-object/maps\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 6,\n \"column\": 0\n },\n \"end\": {\n \"line\": 8,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/maps.hbs\"\n },\n isEmpty: false,\n arity: 2,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"map-object.map\", [], [\"name\", [\"subexpr\", \"@mut\", [[\"get\", \"name\", [\"loc\", [null, [7, 24], [7, 28]]]]], [], []], \"value\", [\"subexpr\", \"@mut\", [[\"get\", \"value\", [\"loc\", [null, [7, 35], [7, 40]]]]], [], []]], [\"loc\", [null, [7, 2], [7, 42]]]]],\n locals: [\"name\", \"value\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\", \"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 8,\n \"column\": 12\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/maps.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"h4\");\n dom.setAttribute(el1, \"class\", \"map-section-title\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"badge\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [0]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(element0, 1, 1);\n morphs[1] = dom.createMorphAt(dom.childAt(element0, [3]), 0, 0);\n morphs[2] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"content\", \"title\", [\"loc\", [null, [2, 2], [2, 11]]]], [\"inline\", \"object-length\", [[\"get\", \"maps\", [\"loc\", [null, [3, 38], [3, 42]]]]], [], [\"loc\", [null, [3, 22], [3, 44]]]], [\"block\", \"each-in\", [[\"get\", \"maps\", [\"loc\", [null, [6, 11], [6, 15]]]]], [], 0, null, [\"loc\", [null, [6, 0], [8, 12]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/map-object/section\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 12,\n \"column\": 8\n },\n \"end\": {\n \"line\": 16,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/section.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"button\");\n dom.setAttribute(el1, \"type\", \"button\");\n dom.setAttribute(el1, \"class\", \"delete-button\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"ion-trash-a\");\n dom.setAttribute(el2, \"aria-hidden\", \"true\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element4 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element4);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"removeField\", [\"get\", \"map\", [\"loc\", [null, [13, 77], [13, 80]]]], [\"get\", \"name\", [\"loc\", [null, [13, 81], [13, 85]]]], [\"get\", \"value\", [\"loc\", [null, [13, 86], [13, 91]]]]], [], [\"loc\", [null, [13, 54], [13, 93]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 17,\n \"column\": 8\n },\n \"end\": {\n \"line\": 21,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/section.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"button\");\n dom.setAttribute(el1, \"type\", \"button\");\n dom.setAttribute(el1, \"class\", \"edit-button\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"ion-edit\");\n dom.setAttribute(el2, \"aria-hidden\", \"true\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element3 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createElementMorph(element3);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"editField\", [\"get\", \"map\", [\"loc\", [null, [18, 73], [18, 76]]]], [\"get\", \"name\", [\"loc\", [null, [18, 77], [18, 81]]]], [\"get\", \"value\", [\"loc\", [null, [18, 82], [18, 87]]]]], [], [\"loc\", [null, [18, 52], [18, 89]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 7,\n \"column\": 2\n },\n \"end\": {\n \"line\": 24,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/section.hbs\"\n },\n isEmpty: false,\n arity: 2,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n dom.setAttribute(el1, \"class\", \"item-instance\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element5 = dom.childAt(fragment, [1]);\n var element6 = dom.childAt(element5, [3]);\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(dom.childAt(element5, [1]), 0, 0);\n morphs[1] = dom.createMorphAt(dom.childAt(element6, [1]), 0, 0);\n morphs[2] = dom.createMorphAt(element6, 3, 3);\n morphs[3] = dom.createMorphAt(element6, 4, 4);\n return morphs;\n },\n statements: [[\"content\", \"name\", [\"loc\", [null, [9, 22], [9, 30]]]], [\"content\", \"value\", [\"loc\", [null, [11, 14], [11, 23]]]], [\"block\", \"if\", [[\"get\", \"removeField\", [\"loc\", [null, [12, 14], [12, 25]]]]], [], 0, null, [\"loc\", [null, [12, 8], [16, 15]]]], [\"block\", \"if\", [[\"get\", \"editField\", [\"loc\", [null, [17, 14], [17, 23]]]]], [], 1, null, [\"loc\", [null, [17, 8], [21, 15]]]]],\n locals: [\"name\", \"value\"],\n templates: [child0, child1]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 27,\n \"column\": 2\n },\n \"end\": {\n \"line\": 47,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/section.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n dom.setAttribute(el1, \"class\", \"add-instance\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"button\");\n dom.setAttribute(el3, \"type\", \"button\");\n dom.setAttribute(el3, \"class\", \"add-instance-button\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"span\");\n dom.setAttribute(el4, \"class\", \"ion-plus-round\");\n dom.setAttribute(el4, \"aria-hidden\", \"true\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n Add \");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var element1 = dom.childAt(element0, [3]);\n var element2 = dom.childAt(element1, [3]);\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 1, 1);\n morphs[1] = dom.createMorphAt(element1, 1, 1);\n morphs[2] = dom.createElementMorph(element2);\n morphs[3] = dom.createMorphAt(element2, 3, 3);\n return morphs;\n },\n statements: [[\"inline\", \"input\", [], [\"value\", [\"subexpr\", \"@mut\", [[\"get\", \"fieldToAddName\", [\"loc\", [null, [31, 14], [31, 28]]]]], [], []], \"class\", \"add-instance-input\", \"placeholder\", \"field name\"], [\"loc\", [null, [30, 8], [33, 34]]]], [\"inline\", \"input\", [], [\"value\", [\"subexpr\", \"@mut\", [[\"get\", \"fieldToAddValue\", [\"loc\", [null, [37, 14], [37, 29]]]]], [], []], \"class\", \"add-instance-input make-room\", \"placeholder\", \"value\"], [\"loc\", [null, [36, 8], [39, 29]]]], [\"element\", \"action\", [\"addField\", [\"get\", \"map\", [\"loc\", [null, [41, 78], [41, 81]]]]], [], [\"loc\", [null, [41, 58], [41, 83]]]], [\"content\", \"title\", [\"loc\", [null, [43, 14], [43, 23]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 49,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/section.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"h4\");\n dom.setAttribute(el1, \"class\", \"map-section-title\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"badge\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"table\");\n dom.setAttribute(el1, \"class\", \"key-value-table\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tbody\");\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element7 = dom.childAt(fragment, [0]);\n var element8 = dom.childAt(fragment, [2]);\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(element7, 1, 1);\n morphs[1] = dom.createMorphAt(dom.childAt(element7, [3]), 0, 0);\n morphs[2] = dom.createMorphAt(dom.childAt(element8, [1]), 1, 1);\n morphs[3] = dom.createMorphAt(element8, 3, 3);\n return morphs;\n },\n statements: [[\"content\", \"title\", [\"loc\", [null, [2, 2], [2, 11]]]], [\"inline\", \"object-length\", [[\"get\", \"items\", [\"loc\", [null, [3, 38], [3, 43]]]]], [], [\"loc\", [null, [3, 22], [3, 45]]]], [\"block\", \"each-in\", [[\"get\", \"items\", [\"loc\", [null, [7, 13], [7, 18]]]]], [], 0, null, [\"loc\", [null, [7, 2], [24, 14]]]], [\"block\", \"if\", [[\"get\", \"addField\", [\"loc\", [null, [27, 8], [27, 16]]]]], [], 1, null, [\"loc\", [null, [27, 2], [47, 9]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/map-object/sets\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 12,\n \"column\": 10\n },\n \"end\": {\n \"line\": 18,\n \"column\": 10\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/sets.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 1]), 1, 1);\n return morphs;\n },\n statements: [[\"content\", \"setItem\", [\"loc\", [null, [15, 16], [15, 27]]]]],\n locals: [\"setItem\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 7,\n \"column\": 2\n },\n \"end\": {\n \"line\": 32,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/sets.hbs\"\n },\n isEmpty: false,\n arity: 2,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n dom.setAttribute(el1, \"class\", \"item-instance\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"ul\");\n dom.setAttribute(el3, \"class\", \"object-content-list\");\n var el4 = dom.createTextNode(\"\\n\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\" \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 0, 0);\n morphs[1] = dom.createMorphAt(dom.childAt(element0, [3, 1]), 1, 1);\n return morphs;\n },\n statements: [[\"content\", \"name\", [\"loc\", [null, [9, 22], [9, 30]]]], [\"block\", \"each\", [[\"get\", \"value\", [\"loc\", [null, [12, 18], [12, 23]]]]], [], 0, null, [\"loc\", [null, [12, 10], [18, 19]]]]],\n locals: [\"name\", \"value\"],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 55,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/map-object/sets.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"h4\");\n dom.setAttribute(el1, \"class\", \"map-section-title\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"badge\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"table\");\n dom.setAttribute(el1, \"class\", \"key-value-table\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tbody\");\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element1 = dom.childAt(fragment, [0]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(element1, 1, 1);\n morphs[1] = dom.createMorphAt(dom.childAt(element1, [3]), 0, 0);\n morphs[2] = dom.createMorphAt(dom.childAt(fragment, [2, 1]), 1, 1);\n return morphs;\n },\n statements: [[\"content\", \"title\", [\"loc\", [null, [2, 2], [2, 11]]]], [\"inline\", \"object-length\", [[\"get\", \"sets\", [\"loc\", [null, [3, 38], [3, 42]]]]], [], [\"loc\", [null, [3, 22], [3, 44]]]], [\"block\", \"each-in\", [[\"get\", \"sets\", [\"loc\", [null, [7, 13], [7, 17]]]]], [], 0, null, [\"loc\", [null, [7, 2], [32, 14]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define('ember-riak-explorer/templates/components/modal-dialog', ['exports', 'ember-modal-dialog/templates/components/modal-dialog'], function (exports, _emberModalDialogTemplatesComponentsModalDialog) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberModalDialogTemplatesComponentsModalDialog['default'];\n }\n });\n});","define(\"ember-riak-explorer/templates/components/new-object-inputs\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 6,\n \"column\": 2\n },\n \"end\": {\n \"line\": 8,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/new-object-inputs.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"input\", [], [\"type\", \"number\", \"value\", [\"subexpr\", \"@mut\", [[\"get\", \"object.contents\", [\"loc\", [null, [7, 32], [7, 47]]]]], [], []], \"class\", \"form-control\"], [\"loc\", [null, [7, 4], [7, 70]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 8,\n \"column\": 2\n },\n \"end\": {\n \"line\": 15,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/new-object-inputs.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n dom.setAttribute(el1, \"class\", \"help-block\");\n var el2 = dom.createTextNode(\"The set value must be entered as a valid javascript array. All array values should be strings. (i.e. \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"['foo', 'bar', 'baz']\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\")\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"ivy-codemirror\", [], [\"mode\", \"javascript\", \"theme\", \"material\", \"lineWrapping\", true, \"value\", [\"subexpr\", \"mut\", [[\"get\", \"object.contents\", [\"loc\", [null, [13, 15], [13, 30]]]]], [], [\"loc\", [null, [13, 10], [13, 31]]]]], [\"loc\", [null, [9, 4], [13, 33]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 15,\n \"column\": 2\n },\n \"end\": {\n \"line\": 22,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/new-object-inputs.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n dom.setAttribute(el1, \"class\", \"help-block\");\n var el2 = dom.createTextNode(\"The map value must be entered as a javascript object and be valid json.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"ivy-codemirror\", [], [\"mode\", \"javascript\", \"theme\", \"material\", \"lineWrapping\", true, \"value\", [\"subexpr\", \"mut\", [[\"get\", \"object.contents\", [\"loc\", [null, [20, 15], [20, 30]]]]], [], [\"loc\", [null, [20, 10], [20, 31]]]]], [\"loc\", [null, [16, 4], [20, 33]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 22,\n \"column\": 2\n },\n \"end\": {\n \"line\": 29,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/new-object-inputs.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n dom.setAttribute(el1, \"class\", \"help-block\");\n var el2 = dom.createTextNode(\"The HLL object must be given a list to calculate cardinality from. The list must be entered as a valid javascript array. All array values should be strings. (i.e. \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"['foo', 'bar', 'baz']\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\")\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"ivy-codemirror\", [], [\"mode\", \"javascript\", \"theme\", \"material\", \"lineWrapping\", true, \"value\", [\"subexpr\", \"mut\", [[\"get\", \"object.contents\", [\"loc\", [null, [27, 15], [27, 30]]]]], [], [\"loc\", [null, [27, 10], [27, 31]]]]], [\"loc\", [null, [23, 4], [27, 33]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 29,\n \"column\": 2\n },\n \"end\": {\n \"line\": 35,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/new-object-inputs.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"ivy-codemirror\", [], [\"mode\", \"javascript\", \"theme\", \"material\", \"lineWrapping\", true, \"value\", [\"subexpr\", \"mut\", [[\"get\", \"object.contents\", [\"loc\", [null, [34, 15], [34, 30]]]]], [], [\"loc\", [null, [34, 10], [34, 31]]]]], [\"loc\", [null, [30, 4], [34, 33]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 22,\n \"column\": 2\n },\n \"end\": {\n \"line\": 35,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/new-object-inputs.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"eq\", [[\"get\", \"object.type\", [\"loc\", [null, [22, 16], [22, 27]]]], \"HyperLogLog\"], [], [\"loc\", [null, [22, 12], [22, 42]]]]], [], 0, 1, [\"loc\", [null, [22, 2], [35, 2]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 15,\n \"column\": 2\n },\n \"end\": {\n \"line\": 35,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/new-object-inputs.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"eq\", [[\"get\", \"object.type\", [\"loc\", [null, [15, 16], [15, 27]]]], \"Map\"], [], [\"loc\", [null, [15, 12], [15, 34]]]]], [], 0, 1, [\"loc\", [null, [15, 2], [35, 2]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 8,\n \"column\": 2\n },\n \"end\": {\n \"line\": 35,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/new-object-inputs.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"eq\", [[\"get\", \"object.type\", [\"loc\", [null, [8, 16], [8, 27]]]], \"Set\"], [], [\"loc\", [null, [8, 12], [8, 34]]]]], [], 0, 1, [\"loc\", [null, [8, 2], [35, 2]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 38,\n \"column\": 0\n },\n \"end\": {\n \"line\": 40,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/new-object-inputs.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"form.explorer-input\", [], [\"label\", \"Content Type\", \"value\", [\"subexpr\", \"@mut\", [[\"get\", \"object.contentType\", [\"loc\", [null, [39, 51], [39, 69]]]]], [], []]], [\"loc\", [null, [39, 2], [39, 71]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 40,\n \"column\": 7\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/new-object-inputs.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"form-group\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"label\");\n var el3 = dom.createTextNode(\"Value\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2]), 3, 3);\n morphs[2] = dom.createMorphAt(fragment, 4, 4, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"inline\", \"form.explorer-input\", [], [\"label\", \"Key\", \"value\", [\"subexpr\", \"@mut\", [[\"get\", \"object.name\", [\"loc\", [null, [1, 40], [1, 51]]]]], [], []]], [\"loc\", [null, [1, 0], [1, 53]]]], [\"block\", \"if\", [[\"subexpr\", \"eq\", [[\"get\", \"object.type\", [\"loc\", [null, [6, 12], [6, 23]]]], \"Counter\"], [], [\"loc\", [null, [6, 8], [6, 34]]]]], [], 0, 1, [\"loc\", [null, [6, 2], [35, 9]]]], [\"block\", \"if\", [[\"subexpr\", \"eq\", [[\"get\", \"object.type\", [\"loc\", [null, [38, 10], [38, 21]]]], \"Default\"], [], [\"loc\", [null, [38, 6], [38, 32]]]]], [], 2, null, [\"loc\", [null, [38, 0], [40, 7]]]]],\n locals: [],\n templates: [child0, child1, child2]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/pagination-component\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 16,\n \"column\": 6\n },\n \"end\": {\n \"line\": 18,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/pagination-component.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n dom.setAttribute(el1, \"class\", \"pagination-link number-link\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(2);\n morphs[0] = dom.createElementMorph(element0);\n morphs[1] = dom.createMorphAt(element0, 0, 0);\n return morphs;\n },\n statements: [[\"element\", \"action\", [\"numberLinkClick\", [\"get\", \"link\", [\"loc\", [null, [17, 75], [17, 79]]]]], [], [\"loc\", [null, [17, 48], [17, 81]]]], [\"content\", \"link\", [\"loc\", [null, [17, 82], [17, 90]]]]],\n locals: [\"link\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 6,\n \"column\": 2\n },\n \"end\": {\n \"line\": 20,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/pagination-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n dom.setAttribute(el1, \"class\", \"pagination-links\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n dom.setAttribute(el2, \"class\", \"pagination-link text-link\");\n var el3 = dom.createTextNode(\"\\n Prev\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n dom.setAttribute(el2, \"class\", \"pagination-link text-link\");\n var el3 = dom.createTextNode(\"\\n Next\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element1 = dom.childAt(fragment, [1]);\n var element2 = dom.childAt(element1, [1]);\n var element3 = dom.childAt(element1, [3]);\n var morphs = new Array(5);\n morphs[0] = dom.createAttrMorph(element2, 'disabled');\n morphs[1] = dom.createElementMorph(element2);\n morphs[2] = dom.createAttrMorph(element3, 'disabled');\n morphs[3] = dom.createElementMorph(element3);\n morphs[4] = dom.createMorphAt(element1, 5, 5);\n return morphs;\n },\n statements: [[\"attribute\", \"disabled\", [\"subexpr\", \"if\", [[\"get\", \"shouldPrevBeDisabled\", [\"loc\", [null, [8, 58], [8, 78]]]], \"disabled\"], [], [\"loc\", [null, [8, 53], [8, 91]]]]], [\"element\", \"action\", [\"prevLinkClick\"], [], [\"loc\", [null, [8, 92], [8, 118]]]], [\"attribute\", \"disabled\", [\"subexpr\", \"if\", [[\"get\", \"shouldNextBeDisabled\", [\"loc\", [null, [12, 58], [12, 78]]]], \"disabled\"], [], [\"loc\", [null, [12, 53], [12, 91]]]]], [\"element\", \"action\", [\"nextLinkClick\"], [], [\"loc\", [null, [12, 92], [12, 118]]]], [\"block\", \"each\", [[\"get\", \"numberLinks\", [\"loc\", [null, [16, 14], [16, 25]]]]], [], 0, null, [\"loc\", [null, [16, 6], [18, 15]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 22,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/pagination-component.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"pagination-content\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"pagination-links-container\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 1, 1);\n morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [2, 2], [2, 11]]]], [\"block\", \"if\", [[\"get\", \"shouldShowPaginationLinks\", [\"loc\", [null, [6, 8], [6, 33]]]]], [], 0, null, [\"loc\", [null, [6, 2], [20, 9]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/set-editor\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 9,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/set-editor.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"button\");\n dom.setAttribute(el2, \"type\", \"button\");\n dom.setAttribute(el2, \"class\", \"remove-item\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"ion-trash-a\");\n dom.setAttribute(el3, \"aria-hidden\", \"true\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var element1 = dom.childAt(element0, [3]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 0, 0);\n morphs[1] = dom.createElementMorph(element1);\n return morphs;\n },\n statements: [[\"content\", \"item\", [\"loc\", [null, [3, 10], [3, 18]]]], [\"element\", \"action\", [\"removeElement\", [\"get\", \"item\", [\"loc\", [null, [5, 31], [5, 35]]]]], [], [\"loc\", [null, [5, 6], [5, 37]]]]],\n locals: [\"item\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 17,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/set-editor.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"button\");\n dom.setAttribute(el2, \"type\", \"button\");\n dom.setAttribute(el2, \"class\", \"button-add-item\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"ion-plus-round\");\n dom.setAttribute(el3, \"aria-hidden\", \"true\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n Add Item\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element2 = dom.childAt(fragment, [1]);\n var element3 = dom.childAt(element2, [3]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(element2, 1, 1);\n morphs[2] = dom.createElementMorph(element3);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"contents\", [\"loc\", [null, [1, 8], [1, 16]]]]], [], 0, null, [\"loc\", [null, [1, 0], [9, 9]]]], [\"inline\", \"input\", [], [\"value\", [\"subexpr\", \"mut\", [[\"get\", \"newItem\", [\"loc\", [null, [11, 21], [11, 28]]]]], [], [\"loc\", [null, [11, 16], [11, 29]]]], \"class\", \"input-add-item\"], [\"loc\", [null, [11, 2], [11, 54]]]], [\"element\", \"action\", [\"addElement\", [\"get\", \"newItem\", [\"loc\", [null, [12, 70], [12, 77]]]]], [], [\"loc\", [null, [12, 48], [12, 79]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/side-drawer\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 11,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/side-drawer.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"drawer-header\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"drawer-label\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"close-container\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"span\");\n dom.setAttribute(el3, \"class\", \"ion-close-round\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"drawer-body\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [0]);\n var element1 = dom.childAt(element0, [3]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 0, 0);\n morphs[1] = dom.createElementMorph(element1);\n morphs[2] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);\n return morphs;\n },\n statements: [[\"content\", \"label\", [\"loc\", [null, [2, 28], [2, 37]]]], [\"element\", \"action\", [\"close\"], [], [\"loc\", [null, [4, 32], [4, 50]]]], [\"content\", \"yield\", [\"loc\", [null, [10, 2], [10, 11]]]]],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/table/bucket-props-advanced\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 5,\n \"column\": 8\n },\n \"end\": {\n \"line\": 7,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/bucket-props-advanced.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"prop.name\", [\"loc\", [null, [6, 10], [6, 23]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 9,\n \"column\": 8\n },\n \"end\": {\n \"line\": 11,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/bucket-props-advanced.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"prop.key\", [\"loc\", [null, [10, 10], [10, 22]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 4,\n \"column\": 6\n },\n \"end\": {\n \"line\": 12,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/bucket-props-advanced.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"prop.name\", [\"loc\", [null, [5, 14], [5, 23]]]]], [], 0, null, [\"loc\", [null, [5, 8], [7, 15]]]], [\"block\", \"if\", [[\"subexpr\", \"not\", [[\"get\", \"prop.name\", [\"loc\", [null, [9, 19], [9, 28]]]]], [], [\"loc\", [null, [9, 14], [9, 29]]]]], [], 1, null, [\"loc\", [null, [9, 8], [11, 15]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 23,\n \"column\": 8\n },\n \"end\": {\n \"line\": 25,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/bucket-props-advanced.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" [\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"]\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"prop.value\", [\"loc\", [null, [24, 11], [24, 25]]]]],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 25,\n \"column\": 8\n },\n \"end\": {\n \"line\": 27,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/bucket-props-advanced.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"prop.value\", [\"loc\", [null, [26, 10], [26, 24]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 31,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/bucket-props-advanced.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"\\n\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\" \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var element1 = dom.childAt(element0, [1]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(element1, 1, 1);\n morphs[1] = dom.createMorphAt(element1, 3, 3);\n morphs[2] = dom.createMorphAt(dom.childAt(element0, [3, 1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"subexpr\", \"or\", [[\"get\", \"prop.name\", [\"loc\", [null, [4, 16], [4, 25]]]], [\"get\", \"prop.key\", [\"loc\", [null, [4, 26], [4, 34]]]]], [], [\"loc\", [null, [4, 12], [4, 35]]]]], [], 0, null, [\"loc\", [null, [4, 6], [12, 13]]]], [\"inline\", \"tooltip.bucket-props\", [], [\"itemKey\", [\"subexpr\", \"@mut\", [[\"get\", \"prop.key\", [\"loc\", [null, [15, 14], [15, 22]]]]], [], []], \"itemDescription\", [\"subexpr\", \"@mut\", [[\"get\", \"prop.description\", [\"loc\", [null, [16, 22], [16, 38]]]]], [], []], \"itemDefaultValue\", [\"subexpr\", \"@mut\", [[\"get\", \"prop.default\", [\"loc\", [null, [17, 23], [17, 35]]]]], [], []], \"itemIsEditable\", [\"subexpr\", \"@mut\", [[\"get\", \"prop.editable\", [\"loc\", [null, [18, 21], [18, 34]]]]], [], []], \"itemSchemaType\", [\"subexpr\", \"@mut\", [[\"get\", \"prop.json_schema_type\", [\"loc\", [null, [19, 21], [19, 42]]]]], [], []]], [\"loc\", [null, [14, 6], [19, 44]]]], [\"block\", \"if\", [[\"subexpr\", \"is-array\", [[\"get\", \"prop.value\", [\"loc\", [null, [23, 24], [23, 34]]]]], [], [\"loc\", [null, [23, 14], [23, 35]]]]], [], 1, 2, [\"loc\", [null, [23, 8], [27, 15]]]]],\n locals: [\"prop\"],\n templates: [child0, child1, child2]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 31,\n \"column\": 9\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/bucket-props-advanced.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"model.propsWithHelp\", [\"loc\", [null, [1, 8], [1, 27]]]]], [], 0, null, [\"loc\", [null, [1, 0], [31, 9]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/table/bucket-props-overview\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 10,\n \"column\": 4\n },\n \"end\": {\n \"line\": 12,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/bucket-props-overview.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"label label-success\");\n var el2 = dom.createTextNode(\"Active\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 12,\n \"column\": 4\n },\n \"end\": {\n \"line\": 14,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/bucket-props-overview.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"label label-default\");\n var el2 = dom.createTextNode(\"Inactive\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 25,\n \"column\": 4\n },\n \"end\": {\n \"line\": 34,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/bucket-props-overview.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"br\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n R: \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\", W: \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\",\\n PR: \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\", PW: \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\",\\n DW: \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"small\");\n var el2 = dom.createTextNode(\"\\n (basic_quorum: \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\",\\n notfound_ok: \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\")\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [13]);\n var morphs = new Array(7);\n morphs[0] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 5, 5, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 7, 7, contextualElement);\n morphs[3] = dom.createMorphAt(fragment, 9, 9, contextualElement);\n morphs[4] = dom.createMorphAt(fragment, 11, 11, contextualElement);\n morphs[5] = dom.createMorphAt(element0, 1, 1);\n morphs[6] = dom.createMorphAt(element0, 3, 3);\n return morphs;\n },\n statements: [[\"content\", \"model.quorum.r\", [\"loc\", [null, [27, 9], [27, 27]]]], [\"content\", \"model.quorum.w\", [\"loc\", [null, [27, 32], [27, 50]]]], [\"content\", \"model.quorum.pr\", [\"loc\", [null, [28, 10], [28, 29]]]], [\"content\", \"model.quorum.pw\", [\"loc\", [null, [28, 35], [28, 54]]]], [\"content\", \"model.quorum.dw\", [\"loc\", [null, [29, 10], [29, 29]]]], [\"content\", \"model.quorum.basic_quorum\", [\"loc\", [null, [31, 23], [31, 52]]]], [\"content\", \"model.quorum.basic_quorum\", [\"loc\", [null, [32, 21], [32, 50]]]]],\n locals: [],\n templates: []\n };\n })();\n var child3 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 50,\n \"column\": 6\n },\n \"end\": {\n \"line\": 52,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/bucket-props-overview.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"model.index.name\", [\"loc\", [null, [51, 8], [51, 28]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 49,\n \"column\": 4\n },\n \"end\": {\n \"line\": 53,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/bucket-props-overview.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"search-index\", [\"get\", \"model.index.cluster.name\", [\"loc\", [null, [50, 32], [50, 56]]]], [\"get\", \"model.index.name\", [\"loc\", [null, [50, 57], [50, 73]]]]], [\"class\", \"btn btn-primary\"], 0, null, [\"loc\", [null, [50, 6], [52, 18]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child4 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 53,\n \"column\": 4\n },\n \"end\": {\n \"line\": 55,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/bucket-props-overview.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" n/a (not being indexed)\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 58,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/bucket-props-overview.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"Object Type\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"Activated\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"Conflict Res. Strategy\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"Quorum\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"N_Val: \");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\" \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element1 = dom.childAt(fragment, [6, 3, 1]);\n var element2 = dom.childAt(fragment, [8]);\n var element3 = dom.childAt(element2, [1]);\n var morphs = new Array(8);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0, 3]), 1, 1);\n morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2, 3]), 1, 1);\n morphs[2] = dom.createMorphAt(dom.childAt(fragment, [4, 3, 0]), 0, 0);\n morphs[3] = dom.createMorphAt(element1, 1, 1);\n morphs[4] = dom.createMorphAt(element1, 3, 3);\n morphs[5] = dom.createMorphAt(element3, 1, 1);\n morphs[6] = dom.createMorphAt(element3, 3, 3);\n morphs[7] = dom.createMorphAt(dom.childAt(element2, [3]), 1, 1);\n return morphs;\n },\n statements: [[\"content\", \"model.objectType\", [\"loc\", [null, [4, 4], [4, 24]]]], [\"block\", \"if\", [[\"get\", \"model.isActive\", [\"loc\", [null, [10, 10], [10, 24]]]]], [], 0, 1, [\"loc\", [null, [10, 4], [14, 11]]]], [\"content\", \"model.resolutionStrategy\", [\"loc\", [null, [19, 26], [19, 54]]]], [\"content\", \"model.nVal\", [\"loc\", [null, [24, 17], [24, 31]]]], [\"block\", \"if\", [[\"get\", \"model.quorumRelevant\", [\"loc\", [null, [25, 10], [25, 30]]]]], [], 2, null, [\"loc\", [null, [25, 4], [34, 11]]]], [\"content\", \"model.searchIndexHelp.name\", [\"loc\", [null, [40, 4], [40, 34]]]], [\"inline\", \"tooltip.bucket-props\", [], [\"itemKey\", [\"subexpr\", \"@mut\", [[\"get\", \"model.searchIndexHelp.key\", [\"loc\", [null, [42, 12], [42, 37]]]]], [], []], \"itemDescription\", [\"subexpr\", \"@mut\", [[\"get\", \"model.searchIndexHelp.description\", [\"loc\", [null, [43, 20], [43, 53]]]]], [], []], \"itemDefaultValue\", [\"subexpr\", \"@mut\", [[\"get\", \"model.searchIndexHelp.default\", [\"loc\", [null, [44, 21], [44, 50]]]]], [], []], \"itemIsEditable\", [\"subexpr\", \"@mut\", [[\"get\", \"model.searchIndexHelp.editable\", [\"loc\", [null, [45, 19], [45, 49]]]]], [], []], \"itemSchemaType\", [\"subexpr\", \"@mut\", [[\"get\", \"model.searchIndexHelp.json_schema_type\", [\"loc\", [null, [46, 19], [46, 57]]]]], [], []]], [\"loc\", [null, [41, 4], [46, 59]]]], [\"block\", \"if\", [[\"get\", \"model.index\", [\"loc\", [null, [49, 10], [49, 21]]]]], [], 3, 4, [\"loc\", [null, [49, 4], [55, 11]]]]],\n locals: [],\n templates: [child0, child1, child2, child3, child4]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/table/bucket-types\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 13,\n \"column\": 6\n },\n \"end\": {\n \"line\": 15,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/bucket-types.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"bucketType.name\", [\"loc\", [null, [14, 8], [14, 27]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 10,\n \"column\": 0\n },\n \"end\": {\n \"line\": 27,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/bucket-types.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 1, 1);\n morphs[1] = dom.createMorphAt(dom.childAt(element0, [3]), 1, 1);\n morphs[2] = dom.createMorphAt(dom.childAt(element0, [5, 1]), 0, 0);\n morphs[3] = dom.createMorphAt(dom.childAt(element0, [7, 1]), 0, 0);\n return morphs;\n },\n statements: [[\"block\", \"link.explorer-resource\", [], [\"resourceType\", \"bucket-type\", \"resourceObj\", [\"subexpr\", \"@mut\", [[\"get\", \"bucketType\", [\"loc\", [null, [13, 71], [13, 81]]]]], [], []], \"linkClass\", \"cluster-resource-link\"], 0, null, [\"loc\", [null, [13, 6], [15, 33]]]], [\"content\", \"bucketType.objectType\", [\"loc\", [null, [18, 6], [18, 31]]]], [\"content\", \"bucketType.nVal\", [\"loc\", [null, [21, 12], [21, 31]]]], [\"content\", \"bucketType.resolutionStrategy\", [\"loc\", [null, [24, 12], [24, 45]]]]],\n locals: [\"bucketType\"],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 30,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/bucket-types.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"thead\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tr\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"th\");\n dom.setAttribute(el3, \"class\", \"name\");\n var el4 = dom.createTextNode(\"Name\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"th\");\n dom.setAttribute(el3, \"class\", \"object-type\");\n var el4 = dom.createTextNode(\"Object Type\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"th\");\n dom.setAttribute(el3, \"class\", \"n-val\");\n var el4 = dom.createTextNode(\"n_val\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"th\");\n dom.setAttribute(el3, \"class\", \"res-stategy\");\n var el4 = dom.createTextNode(\"Conflict Res. Strategy\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tbody\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"bucketTypes\", [\"loc\", [null, [10, 8], [10, 19]]]]], [], 0, null, [\"loc\", [null, [10, 0], [27, 9]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/table/object-headers\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 0\n },\n \"end\": {\n \"line\": 7,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/object-headers.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 0, 0);\n morphs[1] = dom.createMorphAt(dom.childAt(element0, [3, 0]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"header.key\", [\"loc\", [null, [4, 20], [4, 34]]]], [\"content\", \"header.value\", [\"loc\", [null, [5, 28], [5, 44]]]]],\n locals: [\"header\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 9,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/object-headers.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"tbody\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"headers\", [\"loc\", [null, [2, 8], [2, 15]]]]], [], 0, null, [\"loc\", [null, [2, 0], [7, 9]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/table/object-version\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 14,\n \"column\": 8\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/object-version.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"tbody\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tr\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"td\");\n dom.setAttribute(el3, \"class\", \"key\");\n var el4 = dom.createTextNode(\"Last Modified:\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"td\");\n dom.setAttribute(el3, \"class\", \"value\");\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tr\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"td\");\n dom.setAttribute(el3, \"class\", \"key\");\n var el4 = dom.createTextNode(\"Etag:\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"td\");\n dom.setAttribute(el3, \"class\", \"value\");\n var el4 = dom.createElement(\"code\");\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tr\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"td\");\n dom.setAttribute(el3, \"class\", \"key\");\n var el4 = dom.createTextNode(\"Causal Context:\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"td\");\n dom.setAttribute(el3, \"class\", \"value\");\n var el4 = dom.createElement(\"code\");\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [0]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [1, 3]), 0, 0);\n morphs[1] = dom.createMorphAt(dom.childAt(element0, [3, 3, 0]), 0, 0);\n morphs[2] = dom.createMorphAt(dom.childAt(element0, [5, 3, 0]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"object.dateLastModified\", [\"loc\", [null, [4, 20], [4, 47]]]], [\"content\", \"object.etag\", [\"loc\", [null, [8, 26], [8, 41]]]], [\"content\", \"object.causalContext\", [\"loc\", [null, [12, 26], [12, 50]]]]],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/table/search-indexes\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 12,\n \"column\": 6\n },\n \"end\": {\n \"line\": 14,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/search-indexes.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"index.name\", [\"loc\", [null, [13, 8], [13, 22]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 17,\n \"column\": 6\n },\n \"end\": {\n \"line\": 19,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/search-indexes.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"index.schema.name\", [\"loc\", [null, [18, 8], [18, 29]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 9,\n \"column\": 0\n },\n \"end\": {\n \"line\": 23,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/search-indexes.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 1, 1);\n morphs[1] = dom.createMorphAt(dom.childAt(element0, [3]), 1, 1);\n morphs[2] = dom.createMorphAt(dom.childAt(element0, [5, 0]), 0, 0);\n return morphs;\n },\n statements: [[\"block\", \"link.explorer-resource\", [], [\"resourceType\", \"index\", \"resourceObj\", [\"subexpr\", \"@mut\", [[\"get\", \"index\", [\"loc\", [null, [12, 65], [12, 70]]]]], [], []], \"linkClass\", \"cluster-resource-link\"], 0, null, [\"loc\", [null, [12, 6], [14, 33]]]], [\"block\", \"link-to\", [\"search-schema\", [\"get\", \"index.cluster.name\", [\"loc\", [null, [17, 33], [17, 51]]]], [\"get\", \"index.schema.name\", [\"loc\", [null, [17, 52], [17, 69]]]]], [\"class\", \"btn btn-small btn-primary\"], 1, null, [\"loc\", [null, [17, 6], [19, 18]]]], [\"content\", \"index.nVal\", [\"loc\", [null, [21, 14], [21, 28]]]]],\n locals: [\"index\"],\n templates: [child0, child1]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 23,\n \"column\": 0\n },\n \"end\": {\n \"line\": 25,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/search-indexes.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" No indexes found.\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 27,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/search-indexes.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"thead\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tr\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"th\");\n var el4 = dom.createTextNode(\"Index\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"th\");\n var el4 = dom.createTextNode(\"Schema\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"th\");\n var el4 = dom.createTextNode(\"n_val\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tbody\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"indexes\", [\"loc\", [null, [9, 8], [9, 15]]]]], [], 0, 1, [\"loc\", [null, [9, 0], [25, 9]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/table/table-overview\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 9,\n \"column\": 4\n },\n \"end\": {\n \"line\": 11,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/table-overview.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"label label-success\");\n var el2 = dom.createTextNode(\"Active\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 11,\n \"column\": 4\n },\n \"end\": {\n \"line\": 13,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/table-overview.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"label label-default\");\n var el2 = dom.createTextNode(\"Inactive\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child2 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 20,\n \"column\": 30\n },\n \"end\": {\n \"line\": 20,\n \"column\": 105\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/table-overview.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"item\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"key.name\", [\"loc\", [null, [20, 86], [20, 98]]]]],\n locals: [\"key\"],\n templates: []\n };\n })();\n var child3 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 27,\n \"column\": 30\n },\n \"end\": {\n \"line\": 27,\n \"column\": 96\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/table-overview.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"item\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"key\", [\"loc\", [null, [27, 82], [27, 89]]]]],\n locals: [\"key\"],\n templates: []\n };\n })();\n var child4 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 44,\n \"column\": 6\n },\n \"end\": {\n \"line\": 51,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/table-overview.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(4);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [1, 0]), 0, 0);\n morphs[1] = dom.createMorphAt(dom.childAt(element0, [3, 0]), 0, 0);\n morphs[2] = dom.createMorphAt(dom.childAt(element0, [5, 0]), 0, 0);\n morphs[3] = dom.createMorphAt(dom.childAt(element0, [7, 0]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"column.name\", [\"loc\", [null, [46, 20], [46, 35]]]], [\"content\", \"column.type\", [\"loc\", [null, [47, 20], [47, 35]]]], [\"content\", \"column.position\", [\"loc\", [null, [48, 20], [48, 39]]]], [\"content\", \"column.optional\", [\"loc\", [null, [49, 20], [49, 39]]]]],\n locals: [\"column\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 57,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/table-overview.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"Table Name\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"Activated\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"Partition Key\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n dom.setAttribute(el3, \"class\", \"comma-list\");\n var el4 = dom.createTextNode(\"[\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"]\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"Local Key\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n dom.setAttribute(el3, \"class\", \"comma-list\");\n var el4 = dom.createTextNode(\"[\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"]\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"key\");\n var el3 = dom.createTextNode(\"Columns\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n dom.setAttribute(el2, \"class\", \"value\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"table\");\n dom.setAttribute(el3, \"class\", \"table\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"thead\");\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n var el5 = dom.createElement(\"tr\");\n var el6 = dom.createTextNode(\"\\n \");\n dom.appendChild(el5, el6);\n var el6 = dom.createElement(\"th\");\n var el7 = dom.createTextNode(\"Name\");\n dom.appendChild(el6, el7);\n dom.appendChild(el5, el6);\n var el6 = dom.createTextNode(\"\\n \");\n dom.appendChild(el5, el6);\n var el6 = dom.createElement(\"th\");\n var el7 = dom.createTextNode(\"Type\");\n dom.appendChild(el6, el7);\n dom.appendChild(el5, el6);\n var el6 = dom.createTextNode(\"\\n \");\n dom.appendChild(el5, el6);\n var el6 = dom.createElement(\"th\");\n var el7 = dom.createTextNode(\"position\");\n dom.appendChild(el6, el7);\n dom.appendChild(el5, el6);\n var el6 = dom.createTextNode(\"\\n \");\n dom.appendChild(el5, el6);\n var el6 = dom.createElement(\"th\");\n var el7 = dom.createTextNode(\"optional\");\n dom.appendChild(el6, el7);\n dom.appendChild(el5, el6);\n var el6 = dom.createTextNode(\"\\n \");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"\\n \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"tbody\");\n var el5 = dom.createTextNode(\"\\n\");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\" \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(5);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0, 3]), 0, 0);\n morphs[1] = dom.createMorphAt(dom.childAt(fragment, [2, 3]), 1, 1);\n morphs[2] = dom.createMorphAt(dom.childAt(fragment, [4, 3, 1]), 1, 1);\n morphs[3] = dom.createMorphAt(dom.childAt(fragment, [6, 3, 1]), 1, 1);\n morphs[4] = dom.createMorphAt(dom.childAt(fragment, [8, 3, 1, 3]), 1, 1);\n return morphs;\n },\n statements: [[\"content\", \"table.name\", [\"loc\", [null, [3, 20], [3, 34]]]], [\"block\", \"if\", [[\"get\", \"table.isActive\", [\"loc\", [null, [9, 10], [9, 24]]]]], [], 0, 1, [\"loc\", [null, [9, 4], [13, 11]]]], [\"block\", \"each\", [[\"get\", \"table.partitionKey\", [\"loc\", [null, [20, 38], [20, 56]]]]], [], 2, null, [\"loc\", [null, [20, 30], [20, 114]]]], [\"block\", \"each\", [[\"get\", \"table.localKey\", [\"loc\", [null, [27, 38], [27, 52]]]]], [], 3, null, [\"loc\", [null, [27, 30], [27, 105]]]], [\"block\", \"each\", [[\"get\", \"table.columns\", [\"loc\", [null, [44, 14], [44, 27]]]]], [], 4, null, [\"loc\", [null, [44, 6], [51, 15]]]]],\n locals: [],\n templates: [child0, child1, child2, child3, child4]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/table/ts-table-reference\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 5,\n \"column\": 32\n },\n \"end\": {\n \"line\": 5,\n \"column\": 113\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/ts-table-reference.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"item\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"column.name\", [\"loc\", [null, [5, 91], [5, 106]]]]],\n locals: [\"column\"],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 11,\n \"column\": 32\n },\n \"end\": {\n \"line\": 11,\n \"column\": 104\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/ts-table-reference.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"item\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"column\", [\"loc\", [null, [11, 87], [11, 97]]]]],\n locals: [\"column\"],\n templates: []\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 18,\n \"column\": 98\n },\n \"end\": {\n \"line\": 18,\n \"column\": 131\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/ts-table-reference.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\", optional\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 18,\n \"column\": 9\n },\n \"end\": {\n \"line\": 18,\n \"column\": 151\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/ts-table-reference.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"item\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"(\");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"em\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\")\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [0]);\n var element1 = dom.childAt(element0, [2]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(element0, 0, 0);\n morphs[1] = dom.createMorphAt(element1, 0, 0);\n morphs[2] = dom.createMorphAt(element1, 1, 1);\n return morphs;\n },\n statements: [[\"content\", \"column.name\", [\"loc\", [null, [18, 63], [18, 78]]]], [\"content\", \"column.type\", [\"loc\", [null, [18, 83], [18, 98]]]], [\"block\", \"if\", [[\"get\", \"column.optional\", [\"loc\", [null, [18, 104], [18, 119]]]]], [], 0, null, [\"loc\", [null, [18, 98], [18, 138]]]]],\n locals: [\"column\"],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 24,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/ts-table-reference.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"tbody\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tr\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"td\");\n dom.setAttribute(el3, \"class\", \"key\");\n var el4 = dom.createTextNode(\"Primary Key\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"td\");\n dom.setAttribute(el3, \"class\", \"value\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"code\");\n dom.setAttribute(el4, \"class\", \"comma-list\");\n var el5 = dom.createTextNode(\"[\");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"]\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tr\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"td\");\n dom.setAttribute(el3, \"class\", \"key\");\n var el4 = dom.createTextNode(\"Local Key\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"td\");\n dom.setAttribute(el3, \"class\", \"value\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"code\");\n dom.setAttribute(el4, \"class\", \"comma-list\");\n var el5 = dom.createTextNode(\"[\");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"]\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tr\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"td\");\n dom.setAttribute(el3, \"class\", \"key\");\n var el4 = dom.createTextNode(\"Table Columns\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"td\");\n dom.setAttribute(el3, \"class\", \"value\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"code\");\n dom.setAttribute(el4, \"class\", \"comma-list\");\n var el5 = dom.createTextNode(\"\\n [\");\n dom.appendChild(el4, el5);\n var el5 = dom.createComment(\"\");\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\"]\\n \");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element2 = dom.childAt(fragment, [0]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(dom.childAt(element2, [1, 3, 1]), 1, 1);\n morphs[1] = dom.createMorphAt(dom.childAt(element2, [3, 3, 1]), 1, 1);\n morphs[2] = dom.createMorphAt(dom.childAt(element2, [5, 3, 1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"table.partitionKey\", [\"loc\", [null, [5, 40], [5, 58]]]]], [], 0, null, [\"loc\", [null, [5, 32], [5, 122]]]], [\"block\", \"each\", [[\"get\", \"table.localKey\", [\"loc\", [null, [11, 40], [11, 54]]]]], [], 1, null, [\"loc\", [null, [11, 32], [11, 113]]]], [\"block\", \"each\", [[\"get\", \"table.columns\", [\"loc\", [null, [18, 17], [18, 30]]]]], [], 2, null, [\"loc\", [null, [18, 9], [18, 160]]]]],\n locals: [],\n templates: [child0, child1, child2]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/table/ts-tables\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 12,\n \"column\": 6\n },\n \"end\": {\n \"line\": 14,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/ts-tables.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"table.name\", [\"loc\", [null, [13, 8], [13, 22]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 20,\n \"column\": 32\n },\n \"end\": {\n \"line\": 20,\n \"column\": 111\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/ts-tables.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"item\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"field.name\", [\"loc\", [null, [20, 90], [20, 104]]]]],\n locals: [\"field\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 9,\n \"column\": 0\n },\n \"end\": {\n \"line\": 23,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/ts-tables.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tr\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"td\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n dom.setAttribute(el3, \"class\", \"comma-list\");\n var el4 = dom.createTextNode(\"[\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"]\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(dom.childAt(element0, [1]), 1, 1);\n morphs[1] = dom.createMorphAt(dom.childAt(element0, [3, 1]), 0, 0);\n morphs[2] = dom.createMorphAt(dom.childAt(element0, [5, 1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"table\", [\"get\", \"table.cluster.name\", [\"loc\", [null, [12, 25], [12, 43]]]], [\"get\", \"table.name\", [\"loc\", [null, [12, 44], [12, 54]]]]], [\"class\", \"cluster-resource-link\"], 0, null, [\"loc\", [null, [12, 6], [14, 18]]]], [\"content\", \"table.nVal\", [\"loc\", [null, [17, 12], [17, 26]]]], [\"block\", \"each\", [[\"get\", \"table.partitionKey\", [\"loc\", [null, [20, 40], [20, 58]]]]], [], 1, null, [\"loc\", [null, [20, 32], [20, 120]]]]],\n locals: [\"table\"],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 26,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/table/ts-tables.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"thead\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tr\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"th\");\n dom.setAttribute(el3, \"class\", \"name\");\n var el4 = dom.createTextNode(\"Name\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"th\");\n dom.setAttribute(el3, \"class\", \"n-val\");\n var el4 = dom.createTextNode(\"n_val\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"th\");\n dom.setAttribute(el3, \"class\", \"partition-key\");\n var el4 = dom.createTextNode(\"Partition Key\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"tbody\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [2]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"tables\", [\"loc\", [null, [9, 8], [9, 14]]]]], [], 0, null, [\"loc\", [null, [9, 0], [23, 9]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define('ember-riak-explorer/templates/components/tether-dialog', ['exports', 'ember-modal-dialog/templates/components/tether-dialog'], function (exports, _emberModalDialogTemplatesComponentsTetherDialog) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberModalDialogTemplatesComponentsTetherDialog['default'];\n }\n });\n});","define(\"ember-riak-explorer/templates/components/tooltip/bucket-props\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 2,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/tooltip/bucket-props.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [1, 0], [1, 9]]]]],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/tooltip/node-config\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 2,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/tooltip/node-config.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [1, 0], [1, 9]]]]],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/tooltip/node-stats\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 2,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/tooltip/node-stats.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [1, 0], [1, 9]]]]],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/view-label\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 0\n },\n \"end\": {\n \"line\": 2,\n \"column\": 30\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/view-label.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"content\", \"pre-label\", [\"loc\", [null, [2, 17], [2, 30]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 37\n },\n \"end\": {\n \"line\": 2,\n \"column\": 61\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/view-label.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\": \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"content\", \"label\", [\"loc\", [null, [2, 52], [2, 61]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 5,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/view-label.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"pre-label\", [\"loc\", [null, [2, 6], [2, 15]]]]], [], 0, null, [\"loc\", [null, [2, 0], [2, 37]]]], [\"block\", \"if\", [[\"get\", \"label\", [\"loc\", [null, [2, 43], [2, 48]]]]], [], 1, null, [\"loc\", [null, [2, 37], [2, 68]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })());\n});","define(\"ember-riak-explorer/templates/components/wrapper-panel\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"triple-curlies\"\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 6,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/components/wrapper-panel.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"wrapper-panel\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"div\");\n dom.setAttribute(el2, \"class\", \"row\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [0, 1]), 1, 1);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [3, 4], [3, 13]]]]],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/templates/partials/cached-lists\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 29,\n \"column\": 4\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/partials/cached-lists.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"h3\");\n var el2 = dom.createTextNode(\"What are these?\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"alert alert-info\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"ul\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"li\");\n var el4 = dom.createTextNode(\"\\n Cached lists are files saved to disk that represent all items at the time that list was created.\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"li\");\n var el4 = dom.createTextNode(\"\\n Creating these lists are extremely expensive operations, and are only allowed in development mode.\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"li\");\n var el4 = dom.createTextNode(\"\\n Because these lists are cached, they may not reflect the current state of the cluster.\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"\\n Listing all instances of a resource (i.e all buckets, keys, table rows, etc.) in Riak requires making a streaming\\n call, with multiple response messages sent for each request. Anytime a streaming call is made in Explorer, that\\n response is saved to disk and time-stamped. Explorer then reads from the most current copy to\\n populate these collections.\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"\\n Streaming calls are expensive operations, and in some cases have the ability to bring a node(s) down. Due to this,\\n cached\\n lists can only be created when a cluster is in develoment mode. Even in development mode, proceed with caution when\\n requesting a new list.\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/templates/partials/topbar\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 4,\n \"column\": 2\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/partials/topbar.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"img\");\n dom.setAttribute(el1, \"src\", \"assets/images/sample_logo.png\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 8,\n \"column\": 6\n },\n \"end\": {\n \"line\": 11,\n \"column\": 6\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/partials/topbar.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ion-help-circled\");\n dom.setAttribute(el1, \"aria-hidden\", \"true\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n Help Section\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"triple-curlies\"\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 15,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/partials/topbar.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"nav\");\n dom.setAttribute(el1, \"class\", \"topbar\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"ul\");\n dom.setAttribute(el2, \"class\", \"topbar-nav\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"li\");\n dom.setAttribute(el3, \"class\", \"topbar-nav-item\");\n var el4 = dom.createTextNode(\"\\n\");\n dom.appendChild(el3, el4);\n var el4 = dom.createComment(\"\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\" \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [0]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(element0, 1, 1);\n morphs[1] = dom.createMorphAt(dom.childAt(element0, [3, 1]), 1, 1);\n return morphs;\n },\n statements: [[\"block\", \"link-to\", [\"application\"], [\"class\", \"logo\"], 0, null, [\"loc\", [null, [2, 2], [4, 14]]]], [\"block\", \"link-to\", [\"help\"], [], 1, null, [\"loc\", [null, [8, 6], [11, 18]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })());\n});","define(\"ember-riak-explorer/templates/partials/ts-planning-guidelines\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 184,\n \"column\": 226\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/partials/ts-planning-guidelines.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"alert alert-info\");\n var el2 = dom.createTextNode(\"The information below is pulled from \\\"Planning Your Riak TS Table\\\" in the \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"href\", \"http://docs.basho.com/riak/ts/1.3.0/using/planning/\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n var el3 = dom.createTextNode(\"Basho Docs\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"This page provides a basic overview of what you’ll need and some guidelines/limitations. For a deeper dive into planning and designing Riak TS tables, check out \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n dom.setAttribute(el2, \"href\", \"http://docs.basho.com/riak/ts/1.3.0/learn-about/tablearchitecture/\");\n var el3 = dom.createTextNode(\"Table Architecture\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\".\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Riak TS tables are closely tied to SQL tables. If you are unfamiliar with SQL or would like to know more about how Riak TS integrates SQL, check out \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n dom.setAttribute(el2, \"href\", \"http://docs.basho.com/riak/ts/1.3.0/learn-about/sqlriakts/\");\n var el3 = dom.createTextNode(\"SQL for Riak TS\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\".\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h2\");\n var el2 = dom.createTextNode(\"Anatomy of a Schema\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"In order to create a working Riak TS table, you'll need to plan your table out. Once created, your table cannot be changed. Here is an example Riak TS \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"CREATE TABLE\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" statement (broken across many lines for clarity):\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"CREATE TABLE GeoCheckin\\n(\\n region VARCHAR not null,\\n state VARCHAR not null,\\n time TIMESTAMP not null,\\n weather VARCHAR not null,\\n temperature DOUBLE,\\n PRIMARY KEY (\\n (region, state, QUANTUM(time, 15, 'm')),\\n region, state, time\\n )\\n)\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"While the keywords appear in all uppercase letters here, they can be specified using lowercase or uppercase letters as they are not case sensitive.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createTextNode(\"Column Definitions\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Column definitions are the lines preceding the \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"PRIMARY KEY\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" in the example. Column definitions define the structure of the data. They are comprised of three parts: a column name, a data type, and (optionally) an inline constraint.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"column_name data_type [NOT NULL],\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Column names (\");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"region\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\", \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"state\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\", etc) must be ASCII strings, in addition to having the correct case. If column names need to contain spaces or punctuation they can be double quoted.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Any column names specified as part of the primary key must be defined as \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"NOT NULL\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\".\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"The column definitions for the keys can be specified in any order in the \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"CREATE TABLE\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" statement. For instance both are correct:\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createElement(\"strong\");\n var el3 = dom.createTextNode(\"A.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"CREATE TABLE GeoCheckin\\n(\\n region VARCHAR NOT NULL,\\n state VARCHAR NOT NULL,\\n time TIMESTAMP NOT NULL,\\n weather VARCHAR NOT NULL,\\n temperature DOUBLE,\\n PRIMARY KEY (\\n (region, state, QUANTUM(time, 15, 'm')),\\n region, state, time\\n )\\n)\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createElement(\"strong\");\n var el3 = dom.createTextNode(\"B.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"CREATE TABLE GeoCheckin\\n(\\n time TIMESTAMP NOT NULL,\\n state VARCHAR NOT NULL,\\n weather VARCHAR NOT NULL,\\n region VARCHAR NOT NULL,\\n temperature DOUBLE,\\n PRIMARY KEY (\\n (region, state, QUANTUM(time, 15, 'm')),\\n region, state, time\\n )\\n)\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"The data types in column definitions are limited. Valid types are:\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"VARCHAR\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" - Any string content is valid, including Unicode. Can only be compared using strict equality, and will not be typecast (e.g., to an integer) for comparison purposes. Use single quotes to delimit varchar strings.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"BOOLEAN\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" - \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"true\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" or \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"false\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" (any case)\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"TIMESTAMP\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" - Timestamps are integer values expressing [UNIX epoch time in UTC][epoch] in milliseconds. Zero is not a valid timestamp.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"SINT64\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" - Signed 64-bit integer\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"DOUBLE\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" - This type does not comply with its IEEE specification: \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"NaN\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" (not a number) and \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"INF\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" (infinity) cannot be used.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h3\");\n var el2 = dom.createTextNode(\"Primary Key\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"The \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"PRIMARY KEY\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" describes both the partition key and local key. The partition key is a prefix of the local key, consisting of one or more column names. The local key must begin with the same column names as the partition key, but may also contain additional column names.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"CREATE TABLE GeoCheckin\\n(\\n region VARCHAR NOT NULL,\\n state VARCHAR NOT NULL,\\n time TIMESTAMP NOT NULL,\\n weather VARCHAR NOT NULL,\\n temperature DOUBLE,\\n PRIMARY KEY (\\n (region, state, QUANTUM(time, 15, 'm')), <-- PARTITION KEY\\n region, state, time <-- LOCAL KEY\\n )\\n)\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"The column definitions for the \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"PRIMARY KEY\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" can be specified in any order in the \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"CREATE TABLE\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" statement. For instance both are correct:\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createElement(\"strong\");\n var el3 = dom.createTextNode(\"A.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"CREATE TABLE GeoCheckin\\n(\\n region VARCHAR NOT NULL,\\n state VARCHAR NOT NULL,\\n time TIMESTAMP NOT NULL,\\n weather VARCHAR NOT NULL,\\n temperature DOUBLE,\\n PRIMARY KEY (\\n (region, state, QUANTUM(time, 15, 'm')),\\n region, state, time\\n )\\n)\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createElement(\"strong\");\n var el3 = dom.createTextNode(\"B.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"CREATE TABLE GeoCheckin\\n(\\n region VARCHAR NOT NULL,\\n state VARCHAR NOT NULL,\\n time TIMESTAMP NOT NULL,\\n weather VARCHAR NOT NULL,\\n temperature DOUBLE,\\n PRIMARY KEY (\\n (state, region, QUANTUM(time, 15, 'm')),\\n state, region, time\\n )\\n)\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createTextNode(\"Partition Key\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"The partition key is the first element of the primary key, and is defined as a list of column names and quantum in parentheses. The partition key must have at least one column name and a quantum.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"The quantum is used to colocate data on one of the partition key's timestamp columns:\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"PRIMARY KEY (\\n (region, state, QUANTUM(time, 1, 's')),\\n ...\\n)\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Only one quantum function may be specified and it must be the last element of the partition key.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"The quantum function takes 3 parameters:\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"the name of a column in the table definition of type \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"TIMESTAMP\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"a quantity as a positive integer, greater than zero.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"a unit of time:\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"ul\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"li\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"'d'\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\" - days\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"li\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"'h'\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\" - hours\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"li\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"'m'\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\" - minutes\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"li\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"'s'\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n var el5 = dom.createTextNode(\" - seconds\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"A general guideline to get you started if you are not sure how best to structure your partition key is to first choose a column name that represents a class or type of data, and then choose a second column name represents is a more specific instance(s) of the class/type.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createTextNode(\"Local Key\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"The local key comes after the partition key. It must first contain the same column names in the same order as the partition key. This ensures that the same column names determining your data's partition also dictate the sorting of the data within that partition.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"The local key may also contain additional column names so long as they come after the column names present in the partition key. For example:\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"PRIMARY KEY (\\n (region, state, QUANTUM(time, 15, 'm')),\\n region, state, time, weather, temperature\\n)\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h2\");\n var el2 = dom.createTextNode(\"Schema Discovery\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"After creating a table, its schema can be discovered with the \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"DESCRIBE\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" statement:\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"DESCRIBE GeoCheckin\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"The \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"DESCRIBE\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" statement will return the following:\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createElement(\"strong\");\n var el4 = dom.createTextNode(\"Column\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\", column name;\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createElement(\"strong\");\n var el4 = dom.createTextNode(\"Type\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\", data type;\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createElement(\"strong\");\n var el4 = dom.createTextNode(\"Is Null\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\", \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"em\");\n var el4 = dom.createTextNode(\"true\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" if the column is optional, \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"em\");\n var el4 = dom.createTextNode(\"false\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" otherwise;\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createElement(\"strong\");\n var el4 = dom.createTextNode(\"Primary Key\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\", position of this column in the primary key, or blank if it does not appear in the key;\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createElement(\"strong\");\n var el4 = dom.createTextNode(\"Local Key\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\", position of this column in the local key, or blank if it does not appear in the key.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h2\");\n var el2 = dom.createTextNode(\"More information\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Still unsure how best to structure your Riak TS table? Check out our \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"href\", \"http://docs.basho.com/riak/ts/1.3.0/learn-about/bestpractices/\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n var el3 = dom.createTextNode(\"best practice recommendations\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\".\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Confused about column definition, primary key, etc? Check out \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"href\", \"http://docs.basho.com/riak/ts/1.3.0/learn-about/tablearchitecture/\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n var el3 = dom.createTextNode(\"Table Architecture\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" for an in-depth explanation of TS tables.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/templates/partials/ts-query-guidelines\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 237,\n \"column\": 62\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/partials/ts-query-guidelines.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"alert alert-info\");\n var el2 = dom.createTextNode(\"\\n For more information on querying, check out our \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n dom.setAttribute(el2, \"href\", \"http://docs.basho.com/riak/ts/1.3.0/using/querying/\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n var el3 = dom.createTextNode(\"docs\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\".\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h2\");\n var el2 = dom.createTextNode(\"Basic Querying\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"You query data via columns. There are three categories of column, each with a different set of rules for valid queries. Query columns are based on rows in your TS table.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"CREATE TABLE tab2\\n(\\n a SINT64 NOT NULL,\\n b TIMESTAMP NOT NULL,\\n c BOOLEAN NOT NULL,\\n PRIMARY KEY(\\n (a, QUANTUM(b, 1, 's'))<-Partition Key, a,b,c<-Local Key\\n )\\n)\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h3\");\n var el2 = dom.createTextNode(\"Partition Key\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"All queries must cover the partition key.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"The query must use greater than and less than (>, >=, <, <=).\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"The timestamp in the partition key is an integer (in milliseconds) that must be compared either as a fully-enclosed range or as an exact match.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"Valid: \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"time > 1449864277000 and time < 1449864290000\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"Invalid: \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"time > 1449864277000\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"Invalid: \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"time > 1449864277000 or time < 1449864290000\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h3\");\n var el2 = dom.createTextNode(\"Local Key\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Column names that are in the local key but not in the partition key are not required for the query.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"PRIMARY KEY ((a,b),a,b,c)\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Here 'c' is in the local key only so does not have to be in the query.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Column names from the local key must be compared using strict equality against literal values. No ranges are permitted, \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"!=\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" must not be used, and \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"or\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" will not work.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"Valid: \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"country_code = 'uk'\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"Invalid: \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"(country_code = 'uk' or country_code = 'de')\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"Invalid: \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"country_code != 'se'\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"Invalid: \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"temperature < 85.0\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h3\");\n var el2 = dom.createTextNode(\"Column Definitions\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"href\", \"http://docs.basho.com/riak/ts/1.3.0/using/planning/#column-definitions\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n var el3 = dom.createTextNode(\"Column definitions\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" may be queried with unbounded ranges, \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"!=\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\", and \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"or\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" comparisons.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h3\");\n var el2 = dom.createTextNode(\"General Guidelines\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Before you begin querying, there are some guidelines to keep in mind.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"Columns may not be compared against other columns in the query.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"When using \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"or\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\", you must surround the expression with parentheses or your query will return an error.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Basic queries return the full range of values between two given times for an instance within a class or type of data. To demonstrate, we'll use the same example table, in which the \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"state\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" is an instance within the \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"region\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\":\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"CREATE TABLE GeoCheckin\\n(\\n region VARCHAR NOT NULL,\\n state VARCHAR NOT NULL,\\n time TIMESTAMP NOT NULL,\\n weather VARCHAR NOT NULL,\\n temperature DOUBLE,\\n PRIMARY KEY (\\n (region, state, QUANTUM(time, 15, 'm')),\\n region, state, time\\n )\\n)\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Your query must include all components of the partition key. If any part of the partition key is missing, you will get an error.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h2\");\n var el2 = dom.createTextNode(\"Advanced Querying By Column\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h3\");\n var el2 = dom.createTextNode(\"Select Query\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"You can select particular columns from the data to query:\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"select weather, temperature from GeoCheckin where time > 1234560 and time < 1234569 and region = 'South Atlantic' and state = 'South Carolina'\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h3\");\n var el2 = dom.createTextNode(\"Extended Query\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"You can extend the query beyond the primary key and use secondary columns to filter results. In this example, we are extending our query to filter based on \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"temperature\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\":\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"select weather, temperature from GeoCheckin where time > 1234560 and time < 1234569 and region = 'South Atlantic' and state = 'South Carolina' and temperature > 27.0\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"You can also use \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"or\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" when querying against column values, such as \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"temperature\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" in our example. Note that the parentheses are required:\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"select weather, temperature from GeoCheckin where time > 1234560 and time < 1234569 and region = 'South Atlantic' and state = 'South Carolina' and (temperature > 27.0 or temperature < 0.0)\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"You cannot use \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"or\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" between two complete clauses, since keys cannot be specified twice.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h3\");\n var el2 = dom.createTextNode(\"SQL Injection\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"When querying with user-supplied data, it is essential that you protect against SQL injection. Please verify the user-supplied data before constructing queries.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h2\");\n var el2 = dom.createTextNode(\"SQL Support\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"A small subset of SQL is supported. The following operators are supported for each data type:\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"table\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"thead\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"=\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"!=\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"<\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"<=\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\">=\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"tbody\");\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"varchar\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"boolean\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"sint64\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"double\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"tr\");\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"timestamp\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n var el4 = dom.createElement(\"td\");\n var el5 = dom.createElement(\"code\");\n var el6 = dom.createTextNode(\"x\");\n dom.appendChild(el5, el6);\n dom.appendChild(el4, el5);\n dom.appendChild(el3, el4);\n var el4 = dom.createTextNode(\"\\n \");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\"\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h3\");\n var el2 = dom.createTextNode(\"Limitations\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"Column to column comparisons are not currently supported.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"Secondary indexing (2i) will not work with Riak TS.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"Riak Search will not work with Riak TS.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"Queries are limited by the number of quanta they can span when specifying the time limits.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createTextNode(\"Quanta query range\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"A query covering more than a certain number of quanta (5 by default) will generate too many sub-queries and the query system will refuse to run it. Assuming a default quantum of 15 minutes, the maximum query time range is 75 minutes.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"In the below example we set a quantum of 15s:\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"CREATE TABLE GeoCheckin\\n(\\n geohash VARCHAR NOT NULL,\\n location VARCHAR NOT NULL,\\n user VARCHAR NOT NULL,\\n time TIMESTAMP NOT NULL,\\n weather VARCHAR NOT NULL,\\n temperature VARCHAR,\\n PRIMARY KEY(\\n (location, user, QUANTUM(time, 15, 's')),\\n location, user, time\\n )\\n)\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"The maximum time range we can query is 60s, anything beyond will fail.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"See the Data Modeling section in \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"href\", \"http://docs.basho.com/riak/ts/1.3.0/learn-about/tablearchitecture/\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n var el3 = dom.createTextNode(\"Table Architecture\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" for more information.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createTextNode(\"Leap seconds and quantum boundaries\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"\\n Periodically \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"href\", \"https://en.wikipedia.org/wiki/Leap_second\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n var el3 = dom.createTextNode(\"leap seconds\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n are announced. These are inserted at the end of one day (in UTC).\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"UNIX treats them as one double-length second. For example, at the end of 1998 a second was added:\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"Date Time of day UNIX time\\n1998-12-31 23:59:58 915148798\\n1998-12-31 23:59:59 915148799\\n1998-12-31 23:59:60 915148800 <== Artificial leap second\\n1999-01-01 00:00:00 915148800\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Effectively, there is no way in the UNIX time scheme to differentiate an event that occurred during the extra second at the end of 1998 to something that occurred the first second of 1999.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Similarly, Riak TS would treat \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"915148800\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" as the start of a new time quantum, and any data points which a client added for that second would be considered to be in the first time quantum in 1999.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"The data is not lost, but a query against 1998 time quanta will not produce those data points despite the fact that some of the events flagged as \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"915148800\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" technically occurred in 1998.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h2\");\n var el2 = dom.createTextNode(\"Querying Tables\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h3\");\n var el2 = dom.createTextNode(\"Query a table with SQL\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Query a table by issuing a SQL statement against the table. Your query MUST include a 'where' clause with all components.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h3\");\n var el2 = dom.createTextNode(\"Query a table definition\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"You can now query a table definition with the \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"DESCRIBE\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" table query which returns the table's information in rows and columns.\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"For example:\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"DESCRIBE GeoCheckin\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"Returns:\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"pre\");\n var el2 = dom.createTextNode(\"Column | Type | Is Null | Partition Key | Local Key\\nregion | varchar | false | 1 | 1\\nstate | varchar | false | 2 | 2\\ntime | timestamp | false | 3 | 3\\nweather | varchar | false | null | null\\ntemperature | double | false | null | null\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/templates/partials/ts-table-write-guidelines\", [\"exports\"], function (exports) {\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 43,\n \"column\": 0\n }\n },\n \"moduleName\": \"ember-riak-explorer/templates/partials/ts-table-write-guidelines.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"alert alert-info\");\n var el2 = dom.createTextNode(\"\\n For more information on writing data to tables, check out our \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"href\", \"http://docs.basho.com/riak/ts/1.3.0/using/writingdata/\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n var el3 = dom.createTextNode(\"docs\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\".\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createTextNode(\"Table Write Editor\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"Each row you wish to insert should be represented as an array of column values, separated by a comma\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"Row column values must be in the same order as defined in the table. Refer to the table columns in the table\\n reference for order.\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"If a table column is optional, and you do not wish to pass a value for that write instance, use \");\n dom.appendChild(el2, el3);\n var el3 = dom.createElement(\"code\");\n var el4 = dom.createTextNode(\"null\");\n dom.appendChild(el3, el4);\n dom.appendChild(el2, el3);\n var el3 = dom.createTextNode(\" as the array value.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createTextNode(\"General Guidelines\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"Batches should not be too large. Our testing revealed 100 rows per write as a sweet spot, but you should expect\\n different results depending on your hardware and schema.\\n \");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"Writes will assume that columns are in the same order as they’ve been declared in the table.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"li\");\n var el3 = dom.createTextNode(\"Timestamps should be in Unix epoch/UTC milliseconds.\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"h4\");\n var el2 = dom.createTextNode(\"Tuning batches\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"\\n Batches of data from a single write are packaged for delivery to each destination server as a performance\\n optimization. For Enterprise customers using \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"href\", \"http://docs.basho.com/riak/ts/1.3.0/using/mdc/\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n var el3 = dom.createTextNode(\"MDC\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\",\\n those batches are sent to the remote cluster via realtime sync.\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"\\n It is possible to specify an approximate largest-batch size for tuning purposes. By default, batches have a soft cap\\n size of 1MB of data, which we’ve found to be a reasonable size to avoid network congestion.\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"p\");\n var el2 = dom.createTextNode(\"\\n If you want to adjust that value, the configuration parameter \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"timeseries_max_batch_size\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" under \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"code\");\n var el3 = dom.createTextNode(\"riak_kv\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n in \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"a\");\n dom.setAttribute(el2, \"href\", \"http://docs.basho.com/riak/kv/2.1.4/configuring/reference/#the-advanced-config-file\");\n dom.setAttribute(el2, \"target\", \"_blank\");\n var el3 = dom.createTextNode(\"advanced.config\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n can be defined. The value is in bytes.\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ember-riak-explorer/utils/data-type-checks\", [\"exports\"], function (exports) {\n exports.isNumber = isNumber;\n exports.isInteger = isInteger;\n exports.isFloat = isFloat;\n\n function isNumber(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n }\n\n function isInteger(n) {\n return isNumber(n) && n === +n && n === (n | 0);\n }\n\n function isFloat(n) {\n return isNumber(n) && n === +n && (n !== (n | 0) || n === (n | 0));\n }\n});","define('ember-riak-explorer/utils/parse-header', ['exports'], function (exports) {\n exports['default'] = parseHeaderString;\n /**\n * Parses the raw AJAX headers string and returns it as a usable hash.\n *\n * XmlHttpRequest's getAllResponseHeaders() method returns a string of response\n * headers according to the format described here:\n * http://www.w3.org/TR/XMLHttpRequest/#the-getallresponseheaders-method\n *\n * Which we then have to parse. Like savages.\n *\n * @method parseHeaderString\n * @param {String} headerString\n * @return {Hash} headers\n */\n\n function parseHeaderString(headerString) {\n var other_headers = {};\n var indexes = [];\n var custom = [];\n\n var headerLines = headerString.split(\"\\r\\n\");\n\n for (var i = 0; i < headerLines.length; i++) {\n var headerLine = headerLines[i];\n\n // Can't use split() here because it does the wrong thing\n // if the header value has the string \": \" in it.\n var index = headerLine.indexOf(': ');\n if (index > 0) {\n var key = headerLine.substring(0, index).toLowerCase();\n var val = headerLine.substring(index + 2);\n var header = {\n key: key,\n value: val\n };\n\n if (key.startsWith('x-riak-meta')) {\n custom.push(header);\n } else if (key.startsWith('x-riak-index')) {\n indexes.push(header);\n } else {\n other_headers[key] = val;\n }\n }\n }\n\n return {\n other: other_headers,\n indexes: indexes,\n custom: custom\n };\n }\n});","define('ember-riak-explorer/utils/render-tooltip', ['exports', 'ember-tooltips/utils/render-tooltip'], function (exports, _emberTooltipsUtilsRenderTooltip) {\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberTooltipsUtilsRenderTooltip['default'];\n }\n });\n});","define(\"ember-riak-explorer/utils/riak-help/bucket_props\", [\"exports\"], function (exports) {\n exports[\"default\"] = {\n \"active\": {\n \"default\": true,\n \"description\": \"Has this bucket type been activated?\",\n \"editable\": false,\n \"json_schema_type\": \"boolean\",\n \"name\": \"Activated\"\n },\n \"allow_mult\": {\n \"default\": true,\n \"description\": \"Are siblings (multiple object versions) created during write conflicts that cannot be automatically resolved?\",\n \"editable\": true,\n \"json_schema_type\": \"boolean\",\n \"name\": \"Siblings Enabled\"\n },\n \"backend\": {\n \"default\": \"*\",\n \"description\": \"Name of the custom backend (specified in Riak config) to use for this bucket.\",\n \"editable\": true,\n \"json_schema_type\": \"string\",\n \"name\": \"Custom Data Backend\"\n },\n \"basic_quorum\": {\n \"default\": false,\n \"description\": \"The Basic Quorum optimization will short-circuit fetches where the majority of replicas report that the key is not found. Only used when notfound_ok is set to false, to reduce latency in read-heavy cases.\",\n \"editable\": true,\n \"json_schema_type\": \"boolean\",\n \"name\": \"Basic Quorum\"\n },\n \"big_vclock\": {\n \"default\": 50,\n \"description\": \"If the length of the vector clock list is larger than this value, the list will be pruned.\",\n \"editable\": true,\n \"json_schema_type\": \"integer\",\n \"name\": \"Big VClock Pruning\"\n },\n \"chash_keyfun\": {\n \"default\": {\n \"fun\": \"chash_std_keyfun\",\n \"mod\": \"riak_core_util\"\n },\n \"description\": \"(Deprecated) Consistent Hashing function\",\n \"editable\": false,\n \"json_schema_type\": \"object\",\n \"name\": \"Consistent Hash Function\"\n },\n \"claimant\": {\n \"default\": \"riak@127.0.0.1\",\n \"description\": \"The id of the node responsible for processing cluster-wide operations (such as adding or removing nodes, creating bucket types, or re-distributing partitions).\",\n \"editable\": false,\n \"json_schema_type\": \"string\",\n \"name\": \"Claimant Node\"\n },\n \"datatype\": {\n \"default\": \"*\",\n \"description\": \"Has this bucket been created to store Riak Data Types (CRDTs)?\",\n \"editable\": false,\n \"json_schema_type\": \"string\",\n \"name\": \"Data Type (CRDT)\",\n \"valid_options\": [[\"counter\", \"Counter\"], [\"map\", \"Map\"], [\"set\", \"Set\"]]\n },\n \"dvv_enabled\": {\n \"default\": \"false\",\n \"description\": \"Are Dotted Version Vectors used for conflict resolution instead of the older mechanism, Vector Clocks? Should be set to true if using Siblings.\",\n \"editable\": true,\n \"json_schema_type\": \"boolean\",\n \"name\": \"DVV Enabled\"\n },\n \"dw\": {\n \"default\": \"quorum\",\n \"description\": \"The number of replicas which must be not only acknowledged by the receiving virtual node, but also acknowledged as received by the backend for the write to be deemed successful.\",\n \"editable\": true,\n \"json_schema_type\": \"integer|string\",\n \"name\": \"Durable Write Quorum\"\n },\n \"last_write_wins\": {\n \"default\": \"false\",\n \"description\": \"Code shortcut - if true, Riak will ignore Causal Context (Vclocks or DVVs) and only use the timestamp to resolve write conflicts. Only useful if you don't anticipate concurrent writes/edits to the same object (and even then, use 'write_once' instead).\",\n \"editable\": true,\n \"json_schema_type\": \"boolean\",\n \"name\": \"Last Write Wins (LWW)\"\n },\n \"linkfun\": {\n \"default\": {\n \"fun\": \"mapreduce_linkfun\",\n \"mod\": \"riak_kv_wm_link_walker\"\n },\n \"description\": \"(Deprecated) Link walking function\",\n \"editable\": false,\n \"json_schema_type\": \"object\",\n \"name\": \"Link Walking\"\n },\n \"n_val\": {\n \"default\": 3,\n \"description\": \"The number of copies of each object to be stored in the cluster.\",\n \"editable\": true,\n \"json_schema_type\": \"integer\",\n \"name\": \"Number of Replicas (N_Val)\"\n },\n \"name\": {\n \"default\": \"*\",\n \"description\": \"Bucket or Bucket Type name (id)\",\n \"json_schema_type\": \"string\",\n \"editable\": false,\n \"name\": \"Name\"\n },\n \"notfound_ok\": {\n \"default\": true,\n \"description\": \"If set to true, if the first virtual node to respond doesn't have a copy of the object, Riak will deem the failure authoritative and immediately return a NotFound error to the client. If set to false, instructs the coordinating node to wait for something other than a NotFound error before reporting a value.\",\n \"editable\": true,\n \"json_schema_type\": \"boolean\",\n \"name\": \"Not Found OK\"\n },\n \"old_vclock\": {\n \"default\": 86400,\n \"description\": \"If a vector clock entry is older than this value (in milliseconds), it will be pruned. Default: 86400 milliseconds (one day).\",\n \"editable\": true,\n \"json_schema_type\": \"integer\",\n \"name\": \"Old VClock Pruning\"\n },\n \"postcommit\": {\n \"default\": [],\n \"description\": \"A list of custom Erlang post-commit functions to be called after an object is written, immediately before the calling process is notified of the successful write. Each function runs in a separate process, in parallel. All are executed for each create, update, or delete.\",\n \"editable\": true,\n \"json_schema_type\": \"array\",\n \"name\": \"Post-Commit Hooks\"\n },\n \"pr\": {\n \"default\": 0,\n \"description\": \"How many primary partitions must respond to a Read request in order to report success to the client. Setting it to a non-zero value increases consistency, at the cost of availability and tolerance for unavailable nodes.\",\n \"editable\": true,\n \"json_schema_type\": \"integer|string\",\n \"name\": \"Primary Read Quorum\"\n },\n \"precommit\": {\n \"default\": [],\n \"description\": \"A list of custom Erlang pre-commit functions to be called before an object is written. Riak stops evaluating pre-commit hooks when a hook function fails the commit, and prevents the object from being written.\",\n \"editable\": true,\n \"json_schema_type\": \"array\",\n \"name\": \"Pre-Commit Hooks\"\n },\n \"pw\": {\n \"default\": 0,\n \"description\": \"How many primary partitions must respond to a Write request in order to report success to the client. Setting it to a non-zero value increases consistency, at the cost of availability and tolerance for unavailable nodes.\",\n \"editable\": true,\n \"json_schema_type\": \"integer|string\",\n \"name\": \"Primary Write Quorum\"\n },\n \"r\": {\n \"default\": \"quorum\",\n \"description\": \"The number of vnodes which must respond to a read (R) request before a response is returned to a client.\",\n \"editable\": true,\n \"json_schema_type\": \"integer|string\",\n \"name\": \"Read Quorum\"\n },\n \"repl\": {\n \"default\": \"*\",\n \"description\": \"Has Multi Data Center Replication been enabled for this bucket?\",\n \"editable\": true,\n \"json_schema_type\": \"boolean|string\",\n \"name\": \"Per-Bucket MDC Replication\",\n \"valid_options\": [[true, \"Both Realtime and Fullsync\"], [false, \"Not replicated\"], [\"fullsync\", \"Fullsync Only\"], [\"realtime\", \"Realtime Only\"]]\n },\n \"rw\": {\n \"default\": \"quorum\",\n \"description\": \"(Deprecated) Was used as a delete quorum parameter for when R and W values are undefined.\",\n \"editable\": true,\n \"json_schema_type\": \"integer|string\",\n \"name\": \"Delete Quorum\"\n },\n \"search\": {\n \"default\": false,\n \"description\": \"(Deprecated) Is Legacy Riak Search (v1.4 and earlier) indexing enabled?\",\n \"editable\": true,\n \"json_schema_type\": \"boolean\",\n \"name\": \"Legacy Search Enabled\"\n },\n \"search_index\": {\n \"default\": \"*\",\n \"description\": \"Name (id) of the Search index that Solr will be using to index objects in this bucket.\",\n \"editable\": true,\n \"json_schema_type\": \"string\",\n \"name\": \"Search Index Name\"\n },\n \"small_vclock\": {\n \"default\": 50,\n \"description\": \"If the length of the vector clock list is smaller than this value, the list's entries will not be pruned.\",\n \"editable\": true,\n \"json_schema_type\": \"integer\",\n \"name\": \"Small VClock Pruning\"\n },\n \"w\": {\n \"default\": \"quorum\",\n \"description\": \"The number of vnodes which must respond to a write (W) request before a response is returned to a client.\",\n \"editable\": true,\n \"json_schema_type\": \"integer|string\",\n \"name\": \"Write Quorum\"\n },\n \"write_once\": {\n \"default\": \"false\",\n \"description\": \"Write-optimized (for immutable data only) setting enabled for this bucket?\",\n \"editable\": true,\n \"json_schema_type\": \"boolean\",\n \"name\": \"Write-Optimized\"\n },\n \"young_vclock\": {\n \"default\": 20,\n \"description\": \"If a vector clock entry is younger than this value (in milliseconds), it will not be pruned.\",\n \"editable\": true,\n \"json_schema_type\": \"integer\",\n \"name\": \"Young VClock Pruning\"\n }\n };\n});","define(\"ember-riak-explorer/utils/riak-help/riak_config\", [\"exports\"], function (exports) {\n exports[\"default\"] = {\n \"anti_entropy\": {\n \"default\": \"active\",\n \"description\": \"How Riak will repair out-of-sync keys. Some features require\\nthis to be set to 'active', including search.\\n* active: out-of-sync keys will be repaired in the background\\n* passive: out-of-sync keys are only repaired on read\\n* active-debug: like active, but outputs verbose debugging\\ninformation\",\n \"example\": \"passive\",\n \"internal_key\": \"riak_kv.anti_entropy\",\n \"valid\": [\"active\", \"passive\", \"active-debug\"]\n },\n \"anti_entropy.bloomfilter\": {\n \"default\": \"on\",\n \"description\": \"Each database .sst table file can include an optional \\\"bloom\\nfilter\\\" that is highly effective in shortcutting data queries that\\nare destined to not find the requested key. The Bloom filter\\ntypically increases the size of an .sst table file by about\\n2%.\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.anti_entropy_leveldb_opts.use_bloomfilter\",\n \"valid\": [\"on\", \"off\"]\n },\n \"anti_entropy.concurrency_limit\": {\n \"default\": \"2\",\n \"description\": \"Limit how many AAE exchanges or builds can happen concurrently.\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.anti_entropy_concurrency\",\n \"valid\": \"an integer\"\n },\n \"anti_entropy.data_dir\": {\n \"default\": \"$(platform_data_dir)/anti_entropy\",\n \"description\": \"The directory where AAE hash trees are stored.\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.anti_entropy_data_dir\",\n \"valid\": \"the path to a directory\"\n },\n \"anti_entropy.max_open_files\": {\n \"default\": \"20\",\n \"description\": \"\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.anti_entropy_leveldb_opts.max_open_files\",\n \"valid\": \"an integer\"\n },\n \"anti_entropy.throttle\": {\n \"default\": \"on\",\n \"description\": \"Whether the distributed throttle for active anti-entropy is\\nenabled.\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.aae_throttle_kill_switch\",\n \"valid\": [\"on\", \"off\"]\n },\n \"anti_entropy.tree.build_limit.number\": {\n \"default\": \"1\",\n \"description\": \"Restrict how fast AAE can build hash trees. Building the tree\\nfor a given partition requires a full scan over that partition's\\ndata. Once built, trees stay built until they are expired.\\n* .number is the number of builds\\n* .per_timespan is the amount of time in which that .number of builds\\noccurs\\nDefault is 1 build per hour.\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.anti_entropy_build_limit\",\n \"valid\": \"an integer\"\n },\n \"anti_entropy.tree.build_limit.per_timespan\": {\n \"default\": \"\",\n \"description\": \"\",\n \"example\": \"\",\n \"internal_key\": \"\",\n \"valid\": \"\"\n },\n \"anti_entropy.tree.expiry\": {\n \"default\": \"1w\",\n \"description\": \"Determine how often hash trees are expired after being built.\\nPeriodically expiring a hash tree ensures the on-disk hash tree\\ndata stays consistent with the actual k/v backend data. It also\\nhelps Riak identify silent disk failures and bit rot. However,\\nexpiration is not needed for normal AAE operation and should be\\ninfrequent for performance reasons. The time is specified in\\nmilliseconds.\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.anti_entropy_expire\",\n \"valid\": \"a time duration with units, e.g. '10s' for 10 seconds\"\n },\n \"anti_entropy.trigger_interval\": {\n \"default\": \"15s\",\n \"description\": \"The tick determines how often the AAE manager looks for work\\nto do (building/expiring trees, triggering exchanges, etc).\\nThe default is every 15 seconds. Lowering this value will\\nspeedup the rate that all replicas are synced across the cluster.\\nIncreasing the value is not recommended.\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.anti_entropy_tick\",\n \"valid\": \"a time duration with units, e.g. '10s' for 10 seconds\"\n },\n \"anti_entropy.use_background_manager\": {\n \"default\": \"off\",\n \"description\": \"Whether to use the background manager to limit AAE tree\\nrebuilds. This will help to prevent system response degradation\\nunder times of heavy load from multiple background tasks that\\ncontend for the same resources.\\nSee also:\\n background_manager\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.aae_use_background_manager\",\n \"valid\": [\"on\", \"off\"]\n },\n \"anti_entropy.write_buffer_size\": {\n \"default\": \"4MB\",\n \"description\": \"The LevelDB options used by AAE to generate the LevelDB-backed\\non-disk hashtrees.\\nSee also:\\n leveldb.write_buffer_size\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.anti_entropy_leveldb_opts.write_buffer_size\",\n \"valid\": \"a byte size with units, e.g. 10GB\"\n },\n \"background_manager\": {\n \"default\": \"off\",\n \"description\": \"Whether to enable the background manager globally. When\\nenabled, participating Riak subsystems will coordinate access to\\nshared resources. This will help to prevent system response\\ndegradation under times of heavy load from multiple background\\ntasks. Specific subsystems may also have their own controls over\\nuse of the background manager.\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.use_background_manager\",\n \"valid\": [\"on\", \"off\"]\n },\n \"bitcask.data_root\": {\n \"default\": \"$(platform_data_dir)/bitcask\",\n \"description\": \"A path under which bitcask data files will be stored.\",\n \"example\": \"$(platform_data_dir)/bitcask\",\n \"internal_key\": \"bitcask.data_root\",\n \"valid\": \"the path to a directory\"\n },\n \"bitcask.expiry\": {\n \"default\": \"off\",\n \"description\": \"By default, Bitcask keeps all of your data around. If your\\ndata has limited time-value, or if for space reasons you need to\\npurge data, you can set the `expiry` option. If you needed to\\npurge data automatically after 1 day, set the value to `1d`.\\nDefault is: `off` which disables automatic expiration\",\n \"example\": \"\",\n \"internal_key\": \"bitcask.expiry_secs\",\n \"valid\": \"the text 'off', or a time duration with units, e.g. '10s' for 10 seconds\"\n },\n \"bitcask.expiry.grace_time\": {\n \"default\": \"\",\n \"description\": \"By default, Bitcask will trigger a merge whenever a data file\\ncontains an expired key. This may result in excessive merging under\\nsome usage patterns. To prevent this you can set the\\n`bitcask.expiry.grace_time` option. Bitcask will defer triggering\\na merge solely for key expiry by the configured number of\\nseconds. Setting this to `1h` effectively limits each cask to\\nmerging for expiry once per hour.\\nDefault is: `0`\",\n \"example\": \"\",\n \"internal_key\": \"bitcask.expiry_grace_time\",\n \"valid\": \"a time duration with units, e.g. '10s' for 10 seconds\"\n },\n \"bitcask.fold.max_age\": {\n \"default\": \"unlimited\",\n \"description\": \"Fold keys thresholds will reuse the keydir if another fold was\\nstarted less than `fold.max_age` ago and there were less than\\n`fold.max_puts` updates. Otherwise it will wait until all current\\nfold keys complete and then start. Set either option to unlimited\\nto disable.\",\n \"example\": \"\",\n \"internal_key\": \"bitcask.max_fold_age\",\n \"valid\": \"the text 'off', or a time duration with units, e.g. '10s' for 10 seconds\"\n },\n \"bitcask.fold.max_puts\": {\n \"default\": \"0\",\n \"description\": \"Fold keys thresholds will reuse the keydir if another fold was\\nstarted less than `fold.max_age` ago and there were less than\\n`fold.max_puts` updates. Otherwise it will wait until all current\\nfold keys complete and then start. Set either option to unlimited\\nto disable.\",\n \"example\": \"\",\n \"internal_key\": \"bitcask.max_fold_puts\",\n \"valid\": \"an integer\"\n },\n \"bitcask.hintfile_checksums\": {\n \"default\": \"strict\",\n \"description\": \"Require the CRC to be present at the end of hintfiles.\\nSetting this to `allow_missing` runs Bitcask in a backward\\ncompatible mode where old hint files will still be accepted without\\nCRC signatures.\",\n \"example\": \"\",\n \"internal_key\": \"bitcask.require_hint_crc\",\n \"valid\": [\"strict\", \"allow_missing\"]\n },\n \"bitcask.io_mode\": {\n \"default\": \"erlang\",\n \"description\": \"Configure how Bitcask writes data to disk.\\nerlang: Erlang's built-in file API\\nnif: Direct calls to the POSIX C API\\nThe NIF mode provides higher throughput for certain\\nworkloads, but has the potential to negatively impact\\nthe Erlang VM, leading to higher worst-case latencies\\nand possible throughput collapse.\",\n \"example\": \"erlang\",\n \"internal_key\": \"bitcask.io_mode\",\n \"valid\": [\"erlang\", \"nif\"]\n },\n \"bitcask.max_file_size\": {\n \"default\": \"2GB\",\n \"description\": \"Describes the maximum permitted size for any single data file\\nin the Bitcask directory. If a write causes the current file to\\nexceed this size threshold then that file is closed, and a new file\\nis opened for writes.\",\n \"example\": \"\",\n \"internal_key\": \"bitcask.max_file_size\",\n \"valid\": \"a byte size with units, e.g. 10GB\"\n },\n \"bitcask.max_merge_size\": {\n \"default\": \"100GB\",\n \"description\": \"Maximum amount of data to merge in one go in the Bitcask backend.\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.bitcask_max_merge_size\",\n \"valid\": \"a byte size with units, e.g. 10GB\"\n },\n \"bitcask.merge.policy\": {\n \"default\": \"always\",\n \"description\": \"Lets you specify when during the day merge operations are\\nallowed to be triggered. Valid options are:\\n* `always` (default) No restrictions\\n* `never` Merge will never be attempted\\n* `window` Hours during which merging is permitted, where\\n`bitcask.merge.window.start` and `bitcask.merge.window.end` are\\nintegers between 0 and 23.\\nIf merging has a significant impact on performance of your cluster,\\nor your cluster has quiet periods in which little storage activity\\noccurs, you may want to change this setting from the default.\",\n \"example\": \"\",\n \"internal_key\": \"bitcask.merge_window\",\n \"valid\": [\"always\", \"never\", \"window\"]\n },\n \"bitcask.merge.thresholds.dead_bytes\": {\n \"default\": \"128MB\",\n \"description\": \"Describes the minimum amount of data occupied by dead keys in\\na file to cause it to be included in the merge. Increasing the\\nvalue will cause fewer files to be merged, decreasing the value\\nwill cause more files to be merged.\\nDefault is: 128MB\",\n \"example\": \"\",\n \"internal_key\": \"bitcask.dead_bytes_threshold\",\n \"valid\": \"a byte size with units, e.g. 10GB\"\n },\n \"bitcask.merge.thresholds.fragmentation\": {\n \"default\": \"40\",\n \"description\": \"Describes what ratio of dead keys to total keys in a file will\\ncause it to be included in the merge. The value of this setting is\\na percentage (0-100). For example, if a data file contains 4 dead\\nkeys and 6 live keys, it will be included in the merge at the\\ndefault ratio. Increasing the value will cause fewer files to be\\nmerged, decreasing the value will cause more files to be merged.\\nDefault is: `40`\",\n \"example\": \"\",\n \"internal_key\": \"bitcask.frag_threshold\",\n \"valid\": \"an integer\"\n },\n \"bitcask.merge.thresholds.small_file\": {\n \"default\": \"10MB\",\n \"description\": \"Describes the minimum size a file must have to be _excluded_\\nfrom the merge. Files smaller than the threshold will be\\nincluded. Increasing the value will cause _more_ files to be\\nmerged, decreasing the value will cause _fewer_ files to be merged.\\nDefault is: 10MB\",\n \"example\": \"\",\n \"internal_key\": \"bitcask.small_file_threshold\",\n \"valid\": \"a byte size with units, e.g. 10GB\"\n },\n \"bitcask.merge.triggers.dead_bytes\": {\n \"default\": \"512MB\",\n \"description\": \"Describes how much data stored for dead keys in a single file\\nwill trigger merging. The value is in bytes. If a file meets or\\nexceeds the trigger value for dead bytes, merge will be\\ntriggered. Increasing the value will cause merging to occur less\\noften, whereas decreasing the value will cause merging to happen\\nmore often.\\nWhen either of these constraints are met by any file in the\\ndirectory, Bitcask will attempt to merge files.\\nDefault is: 512MB\",\n \"example\": \"\",\n \"internal_key\": \"bitcask.dead_bytes_merge_trigger\",\n \"valid\": \"a byte size with units, e.g. 10GB\"\n },\n \"bitcask.merge.triggers.fragmentation\": {\n \"default\": \"60\",\n \"description\": \"Describes what ratio of dead keys to total keys in a file will\\ntrigger merging. The value of this setting is a percentage\\n(0-100). For example, if a data file contains 6 dead keys and 4\\nlive keys, then merge will be triggered at the default\\nsetting. Increasing this value will cause merging to occur less\\noften, whereas decreasing the value will cause merging to happen\\nmore often.\\nDefault is: `60`\",\n \"example\": \"\",\n \"internal_key\": \"bitcask.frag_merge_trigger\",\n \"valid\": \"an integer\"\n },\n \"bitcask.merge.window.end\": {\n \"default\": \"23\",\n \"description\": \"Lets you specify when during the day merge operations are\\nallowed to be triggered. Valid options are:\\n* `always` (default) No restrictions\\n* `never` Merge will never be attempted\\n* `window` Hours during which merging is permitted, where\\n`bitcask.merge.window.start` and `bitcask.merge.window.end` are\\nintegers between 0 and 23.\\nIf merging has a significant impact on performance of your cluster,\\nor your cluster has quiet periods in which little storage activity\\noccurs, you may want to change this setting from the default.\",\n \"example\": \"\",\n \"internal_key\": \"bitcask.merge_window\",\n \"valid\": \"an integer\"\n },\n \"bitcask.merge.window.start\": {\n \"default\": \"0\",\n \"description\": \"Lets you specify when during the day merge operations are\\nallowed to be triggered. Valid options are:\\n* `always` (default) No restrictions\\n* `never` Merge will never be attempted\\n* `window` Hours during which merging is permitted, where\\n`bitcask.merge.window.start` and `bitcask.merge.window.end` are\\nintegers between 0 and 23.\\nIf merging has a significant impact on performance of your cluster,\\nor your cluster has quiet periods in which little storage activity\\noccurs, you may want to change this setting from the default.\",\n \"example\": \"\",\n \"internal_key\": \"bitcask.merge_window\",\n \"valid\": \"an integer\"\n },\n \"bitcask.merge_check_interval\": {\n \"default\": \"3m\",\n \"description\": \"Time in between the checks that trigger Bitcask merges.\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.bitcask_merge_check_interval\",\n \"valid\": \"a time duration with units, e.g. '10s' for 10 seconds\"\n },\n \"bitcask.merge_check_jitter\": {\n \"default\": \"30%\",\n \"description\": \"Jitter used to randomize the time in between the checks that trigger\\nBitcask merges.\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.bitcask_merge_check_jitter\",\n \"valid\": \"text\"\n },\n \"bitcask.open_timeout\": {\n \"default\": \"4s\",\n \"description\": \"Specifies the maximum time Bitcask will block on startup while\\nattempting to create or open the data directory. You generally need\\nnot change this value. If for some reason the timeout is exceeded\\non open you'll see a log message of the form: \\\"Failed to start\\nbitcask backend: .... \\\" Only then should you consider a longer\\ntimeout.\",\n \"example\": \"\",\n \"internal_key\": \"bitcask.open_timeout\",\n \"valid\": \"a time duration with units, e.g. '10s' for 10 seconds\"\n },\n \"bitcask.sync.strategy\": {\n \"default\": \"none\",\n \"description\": \"Changes the durability of writes by specifying when to\\nsynchronize data to disk. The default setting protects against data\\nloss in the event of application failure (process death) but leaves\\nopen a small window wherein data could be lost in the event of\\ncomplete system failure (e.g. hardware, O/S, power).\\nThe default mode, `none`, writes data into operating system buffers\\nwhich which will be written to the disks when those buffers are\\nflushed by the operating system. If the system fails (power loss,\\ncrash, etc.) before before those buffers are flushed to stable\\nstorage that data is lost.\\nThis is prevented by the setting `o_sync` which forces the\\noperating system to flush to stable storage at every write. The\\neffect of flushing each write is better durability, however write\\nthroughput will suffer as each write will have to wait for the\\nwrite to complete.\\nAvailable Sync Strategies:\\n* `none` - (default) Lets the operating system manage syncing\\nwrites.\\n* `o_sync` - Uses the O_SYNC flag which forces syncs on every\\nwrite.\\n* `interval` - Riak will force Bitcask to sync every\\n`bitcask.sync.interval` seconds.\",\n \"example\": \"\",\n \"internal_key\": \"bitcask.sync_strategy\",\n \"valid\": [\"none\", \"o_sync\", \"interval\"]\n },\n \"buckets.default.allow_mult\": {\n \"default\": \"false\",\n \"description\": \"Whether or not siblings are allowed, by default, for untyped buckets.\\nNote: See Vector Clocks for a discussion of sibling resolution.\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.default_bucket_props.allow_mult\",\n \"valid\": [true, false]\n },\n \"buckets.default.basic_quorum\": {\n \"default\": \"false\",\n \"description\": \"Whether not-founds will invoke the \\\"basic quorum\\\"\\noptimization. This setting will short-circuit fetches where the\\nmajority of replicas report that the key is not found. Only used\\nwhen notfound_ok = false.\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.default_bucket_props.basic_quorum\",\n \"valid\": [true, false]\n },\n \"buckets.default.dw\": {\n \"default\": \"quorum\",\n \"description\": \"The number of replicas which must reply to a write request,\\nindicating that the write was committed to durable storage.\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.default_bucket_props.dw\",\n \"valid\": \"an integer, or a symbolic quorum value (one of: 'quorum', 'all')\"\n },\n \"buckets.default.last_write_wins\": {\n \"default\": \"false\",\n \"description\": \"Whether conflicting writes resolve via timestamp.\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.default_bucket_props.last_write_wins\",\n \"valid\": [true, false]\n },\n \"buckets.default.merge_strategy\": {\n \"default\": \"1\",\n \"description\": \"The strategy used when merging objects that potentially have\\nconflicts.\\n* 2: Riak 2.0 typed bucket default - reduces sibling creation through additional\\nmetadata on each sibling (also known as dotted version vectors)\\n* 1: Riak 1.4, default buckets, and earlier default - may duplicate siblings\\nfrom interleaved writes (sibling explosion.)\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.default_bucket_props.dvv_enabled\",\n \"valid\": [\"1\", \"2\"]\n },\n \"buckets.default.n_val\": {\n \"default\": \"3\",\n \"description\": \"The number of replicas stored. Note: See Replication\\nProperties for further discussion.\\nhttp://docs.basho.com/riak/latest/dev/advanced/cap-controls/\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.default_bucket_props.n_val\",\n \"valid\": \"an integer\"\n },\n \"buckets.default.notfound_ok\": {\n \"default\": \"true\",\n \"description\": \"Whether not-founds will count toward a quorum of reads.\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.default_bucket_props.notfound_ok\",\n \"valid\": [true, false]\n },\n \"buckets.default.pr\": {\n \"default\": \"0\",\n \"description\": \"The number of primary replicas (non-fallback) that must reply\\nto a read request.\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.default_bucket_props.pr\",\n \"valid\": \"an integer, or a symbolic quorum value (one of: 'quorum', 'all')\"\n },\n \"buckets.default.pw\": {\n \"default\": \"0\",\n \"description\": \"The number of primary replicas (non-fallback) which must reply\\nto a write request.\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.default_bucket_props.pw\",\n \"valid\": \"an integer, or a symbolic quorum value (one of: 'quorum', 'all')\"\n },\n \"buckets.default.r\": {\n \"default\": \"quorum\",\n \"description\": \"The number of replicas which must reply to a read request.\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.default_bucket_props.r\",\n \"valid\": \"an integer, or a symbolic quorum value (one of: 'quorum', 'all')\"\n },\n \"buckets.default.rw\": {\n \"default\": \"quorum\",\n \"description\": \"The number of replicas which must reply to a delete request.\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.default_bucket_props.rw\",\n \"valid\": \"an integer, or a symbolic quorum value (one of: 'quorum', 'all')\"\n },\n \"buckets.default.w\": {\n \"default\": \"quorum\",\n \"description\": \"The number of replicas which must reply to a write request,\\nindicating that the write was received.\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.default_bucket_props.w\",\n \"valid\": \"an integer, or a symbolic quorum value (one of: 'quorum', 'all')\"\n },\n \"check_crl\": {\n \"default\": \"on\",\n \"description\": \"Whether to check the CRL of a client certificate. This defaults to\\non but some CAs may not maintain or define a CRL, so this can be disabled\\nif no CRL is available.\",\n \"example\": \"\",\n \"internal_key\": \"riak_api.check_crl\",\n \"valid\": [\"on\", \"off\"]\n },\n \"datatypes.compression_level\": {\n \"default\": \"1\",\n \"description\": \"Whether serialized datatypes will use compression, and at what\\nlevel. When an integer, this refers to the aggressiveness (and\\nslowness) of compression, on a scale from 0 to 9. 'on' is\\nequivalent to 6, 'off' is equivalent to 0.\",\n \"example\": \"\",\n \"internal_key\": \"riak_dt.binary_compression\",\n \"valid\": \"an integer\"\n },\n \"distributed_cookie\": {\n \"default\": \"riak\",\n \"description\": \"Cookie for distributed node communication. All nodes in the\\nsame cluster should use the same cookie or they will not be able to\\ncommunicate.\",\n \"example\": \"riak\",\n \"internal_key\": \"vm_args.-setcookie\",\n \"valid\": \"text\"\n },\n \"dtrace\": {\n \"default\": \"off\",\n \"description\": \"DTrace support Do not enable 'dtrace' unless your Erlang/OTP\\nruntime is compiled to support DTrace. DTrace is available in\\nR15B01 (supported by the Erlang/OTP official source package) and in\\nR14B04 via a custom source repository & branch.\",\n \"example\": \"off\",\n \"internal_key\": \"riak_core.dtrace_support\",\n \"valid\": [\"on\", \"off\"]\n },\n \"erlang.K\": {\n \"default\": \"on\",\n \"description\": \"Enables or disables the kernel poll functionality if the\\nemulator supports it. If the emulator does not support kernel poll,\\nand the K flag is passed to the emulator, a warning is issued at\\nstartup.\\nSimilar information at: http://erlang.org/doc/man/erl.html\",\n \"example\": \"\",\n \"internal_key\": \"vm_args.+K\",\n \"valid\": [\"on\", \"off\"]\n },\n \"erlang.W\": {\n \"default\": \"w\",\n \"description\": \"Sets the mapping of warning messages for error_logger.\\nMessages sent to the error logger using one of the warning\\nroutines can be mapped either to errors (default), warnings\\n(w - default), or info reports (i).\",\n \"example\": \"\",\n \"internal_key\": \"vm_args.+W\",\n \"valid\": \"text\"\n },\n \"erlang.async_threads\": {\n \"default\": \"64\",\n \"description\": \"Sets the number of threads in async thread pool, valid range\\nis 0-1024. If thread support is available, the default is 64.\\nMore information at: http://erlang.org/doc/man/erl.html\",\n \"example\": \"64\",\n \"internal_key\": \"vm_args.+A\",\n \"valid\": \"an integer\"\n },\n \"erlang.crash_dump\": {\n \"default\": \"./log/erl_crash.dump\",\n \"description\": \"Set the location of crash dumps\",\n \"example\": \"\",\n \"internal_key\": \"vm_args.-env ERL_CRASH_DUMP\",\n \"valid\": \"the path to a file\"\n },\n \"erlang.distribution_buffer_size\": {\n \"default\": \"32MB\",\n \"description\": \"For nodes with many busy_dist_port events, Basho recommends\\nraising the sender-side network distribution buffer size.\\n32MB may not be sufficient for some workloads and is a suggested\\nstarting point. Erlangers may know this as +zdbbl.\\nThe Erlang/OTP default is 1024 (1 megabyte).\\nSee: http://www.erlang.org/doc/man/erl.html#%2bzdbbl\",\n \"example\": \"\",\n \"internal_key\": \"vm_args.+zdbbl\",\n \"valid\": \"a byte size with units, e.g. 10GB\"\n },\n \"erlang.fullsweep_after\": {\n \"default\": \"0\",\n \"description\": \"A non-negative integer which indicates how many times\\ngenerational garbage collections can be done without forcing a\\nfullsweep collection. In low-memory systems (especially without\\nvirtual memory), setting the value to 0 can help to conserve\\nmemory.\\nMore information at:\\nhttp://www.erlang.org/doc/man/erlang.html#system_flag-2\",\n \"example\": \"\",\n \"internal_key\": \"vm_args.-env ERL_FULLSWEEP_AFTER\",\n \"valid\": \"an integer\"\n },\n \"erlang.max_ets_tables\": {\n \"default\": \"256000\",\n \"description\": \"Raise the ETS table limit\",\n \"example\": \"\",\n \"internal_key\": \"vm_args.+e\",\n \"valid\": \"an integer\"\n },\n \"erlang.max_ports\": {\n \"default\": \"65536\",\n \"description\": \"The number of concurrent ports/sockets\\nValid range is 1024-134217727\",\n \"example\": \"65536\",\n \"internal_key\": \"vm_args.+Q\",\n \"valid\": \"an integer\"\n },\n \"erlang.process_limit\": {\n \"default\": \"256000\",\n \"description\": \"Raise the default erlang process limit\",\n \"example\": \"\",\n \"internal_key\": \"vm_args.+P\",\n \"valid\": \"an integer\"\n },\n \"erlang.schedulers.compaction_of_load\": {\n \"default\": \"false\",\n \"description\": \"Enable or disable scheduler compaction of load. By default\\nscheduler compaction of load is enabled. When enabled, load\\nbalancing will strive for a load distribution which causes as many\\nscheduler threads as possible to be fully loaded (i.e., not run out\\nof work). This is accomplished by migrating load (e.g. runnable\\nprocesses) into a smaller set of schedulers when schedulers\\nfrequently run out of work. When disabled, the frequency with which\\nschedulers run out of work will not be taken into account by the\\nload balancing logic.\\nMore information: http://www.erlang.org/doc/man/erl.html#+scl\",\n \"example\": \"\",\n \"internal_key\": \"vm_args.+scl\",\n \"valid\": [true, false]\n },\n \"erlang.schedulers.force_wakeup_interval\": {\n \"default\": \"500\",\n \"description\": \"Set scheduler forced wakeup interval. All run queues will be\\nscanned each Interval milliseconds. While there are sleeping\\nschedulers in the system, one scheduler will be woken for each\\nnon-empty run queue found. An Interval of zero disables this\\nfeature, which also is the default.\\nThis feature is a workaround for lengthy executing native code, and\\nnative code that do not bump reductions properly.\\nMore information: http://www.erlang.org/doc/man/erl.html#+sfwi\",\n \"example\": \"\",\n \"internal_key\": \"vm_args.+sfwi\",\n \"valid\": \"an integer\"\n },\n \"erlang.smp\": {\n \"default\": \"enable\",\n \"description\": \"Starts the Erlang runtime system with SMP support\\nenabled. This may fail if no runtime system with SMP support is\\navailable. The 'auto' setting starts the Erlang runtime system with\\nSMP support enabled if it is available and more than one logical\\nprocessor are detected. -smp disable starts a runtime system\\nwithout SMP support.\\nNOTE: The runtime system with SMP support will not be available on\\nall supported platforms. See also the erlang.schedulers settings.\\nNOTE: Some native extensions (NIFs) require use of the SMP\\nemulator.\\nMore information at: http://erlang.org/doc/man/erl.html\",\n \"example\": \"\",\n \"internal_key\": \"vm_args.-smp\",\n \"valid\": [\"enable\", \"auto\", \"disable\"]\n },\n \"handoff.inbound\": {\n \"default\": \"on\",\n \"description\": \"Enables/disables inbound handoff transfers for this node. If you\\nturn this setting off at runtime with riak-admin, it will kill any\\ninbound handoffs currently running.\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.disable_inbound_handoff\",\n \"valid\": [\"on\", \"off\"]\n },\n \"handoff.ip\": {\n \"default\": \"127.0.0.1\",\n \"description\": \"handoff.ip is the network address that Riak binds to for\\nintra-cluster data handoff.\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.handoff_ip\",\n \"valid\": \"text\"\n },\n \"handoff.max_rejects\": {\n \"default\": \"6\",\n \"description\": \"The maximum number of times that a secondary system like Riak\\nSearch 2.0 can block handoff of primary key-value data. The\\napproximate maximum duration handoff of a vnode can be blocked for\\ncan be determined by multiplying this number by the value of\\n\\\"vnode_management_timer\\\". To prevent handoff from ever being\\nblocked by a secondary system set this value to 0.\\nSee also:\\n vnode_management_timer\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.handoff_rejected_max\",\n \"valid\": \"an integer\"\n },\n \"handoff.outbound\": {\n \"default\": \"on\",\n \"description\": \"Enables/disables outbound handoff transfers for this node. If you\\nturn this setting off at runtime with riak-admin, it will kill any\\noutbound handoffs currently running.\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.disable_outbound_handoff\",\n \"valid\": [\"on\", \"off\"]\n },\n \"handoff.port\": {\n \"default\": \"8099\",\n \"description\": \"handoff.port is the TCP port that Riak uses for\\nintra-cluster data handoff.\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.handoff_port\",\n \"valid\": \"an integer\"\n },\n \"handoff.use_background_manager\": {\n \"default\": \"off\",\n \"description\": \"Whether to use the background manager to limit KV handoff.\\nThis will help to prevent system response degradation under times\\nof heavy load from multiple background tasks that contend for the\\nsame resources.\\nSee also:\\n background_manager\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.handoff_use_background_manager\",\n \"valid\": [\"on\", \"off\"]\n },\n \"honor_cipher_order\": {\n \"default\": \"on\",\n \"description\": \"Whether to prefer the order in which the server lists its\\nciphers. When set to 'off', the client's preferred cipher order\\ndictates which cipher is chosen.\",\n \"example\": \"\",\n \"internal_key\": \"riak_api.honor_cipher_order\",\n \"valid\": [\"on\", \"off\"]\n },\n \"javascript.hook_pool_size\": {\n \"default\": \"2\",\n \"description\": \"How many JavaScript virtual machines are available for\\nexecuting pre-commit hook functions.\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.hook_js_vm_count\",\n \"valid\": \"an integer\"\n },\n \"javascript.map_pool_size\": {\n \"default\": \"8\",\n \"description\": \"How many JavaScript virtual machines are available for\\nexecuting map functions.\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.map_js_vm_count\",\n \"valid\": \"an integer\"\n },\n \"javascript.maximum_heap_size\": {\n \"default\": \"8MB\",\n \"description\": \"The maximum amount of memory allocated to each JavaScript\\nvirtual machine.\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.js_max_vm_mem\",\n \"valid\": \"a byte size with units, e.g. 10GB\"\n },\n \"javascript.maximum_stack_size\": {\n \"default\": \"16MB\",\n \"description\": \"The maximum amount of thread stack memory to allocate\\nto each JavaScript virtual machine.\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.js_thread_stack\",\n \"valid\": \"a byte size with units, e.g. 10GB\"\n },\n \"javascript.reduce_pool_size\": {\n \"default\": \"6\",\n \"description\": \"How many JavaScript virtual machines are available for\\nexecuting reduce functions.\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.reduce_js_vm_count\",\n \"valid\": \"an integer\"\n },\n \"leveldb.block.restart_interval\": {\n \"default\": \"16\",\n \"description\": \"Defines the key count threshold for a new key entry in the key\\nindex for a block. Most deployments should leave this parameter\\nalone.\",\n \"example\": \"\",\n \"internal_key\": \"eleveldb.block_restart_interval\",\n \"valid\": \"an integer\"\n },\n \"leveldb.block.size\": {\n \"default\": \"4KB\",\n \"description\": \"Defines the size threshold for a block / chunk of data within\\none .sst table file. Each new block gets an index entry in the .sst\\ntable file's master index.\",\n \"example\": \"\",\n \"internal_key\": \"eleveldb.sst_block_size\",\n \"valid\": \"a byte size with units, e.g. 10GB\"\n },\n \"leveldb.block.size_steps\": {\n \"default\": \"16\",\n \"description\": \"Defines the number of incremental adjustments to attempt\\nbetween the block.size value and the maximum block.size for an .sst\\ntable file. Value of zero disables the underlying dynamic\\nblock_size feature.\\nSee also:\\n leveldb.block.size\",\n \"example\": \"\",\n \"internal_key\": \"eleveldb.block_size_steps\",\n \"valid\": \"an integer\"\n },\n \"leveldb.block_cache_threshold\": {\n \"default\": \"32MB\",\n \"description\": \"Defines the limit where block cache memory can no longer be\\nreleased in favor of the page cache. This has no impact with\\nregard to release in favor of file cache. The value is per\\nvnode.\",\n \"example\": \"\",\n \"internal_key\": \"eleveldb.block_cache_threshold\",\n \"valid\": \"a byte size with units, e.g. 10GB\"\n },\n \"leveldb.bloomfilter\": {\n \"default\": \"on\",\n \"description\": \"Each database .sst table file can include an optional \\\"bloom\\nfilter\\\" that is highly effective in shortcutting data queries that\\nare destined to not find the requested key. The Bloom filter\\ntypically increases the size of an .sst table file by about\\n2%.\",\n \"example\": \"\",\n \"internal_key\": \"eleveldb.use_bloomfilter\",\n \"valid\": [\"on\", \"off\"]\n },\n \"leveldb.compaction.trigger.tombstone_count\": {\n \"default\": \"1000\",\n \"description\": \"Controls when a background compaction initiates solely\\ndue to the number of delete tombstones within an individual\\n.sst table file. Value of 'off' disables the feature.\",\n \"example\": \"\",\n \"internal_key\": \"eleveldb.delete_threshold\",\n \"valid\": \"an integer\"\n },\n \"leveldb.compression\": {\n \"default\": \"on\",\n \"description\": \"Enables or disables the compression of data on disk.\\nEnabling (default) saves disk space. Disabling may reduce read\\nlatency but increase overall disk activity. Option can be\\nchanged at any time, but will not impact data on disk until\\nnext time a file requires compaction.\",\n \"example\": \"\",\n \"internal_key\": \"eleveldb.compression\",\n \"valid\": [\"on\", \"off\"]\n },\n \"leveldb.data_root\": {\n \"default\": \"$(platform_data_dir)/leveldb\",\n \"description\": \"Where LevelDB will store its data.\",\n \"example\": \"\",\n \"internal_key\": \"eleveldb.data_root\",\n \"valid\": \"the path to a directory\"\n },\n \"leveldb.fadvise_willneed\": {\n \"default\": \"false\",\n \"description\": \"Option to override LevelDB's use of fadvise(DONTNEED) with\\nfadvise(WILLNEED) instead. WILLNEED can reduce disk activity on\\nsystems where physical memory exceeds the database size.\",\n \"example\": \"\",\n \"internal_key\": \"eleveldb.fadvise_willneed\",\n \"valid\": [true, false]\n },\n \"leveldb.limited_developer_mem\": {\n \"default\": \"off\",\n \"description\": \"limited_developer_mem is a Riak specific option that is used\\nwhen a developer is testing a high number of vnodes and/or several\\nVMs on a machine with limited physical memory. Do NOT use this\\noption if making performance measurements. This option overwrites\\nvalues given to write_buffer_size_min and write_buffer_size_max.\",\n \"example\": \"\",\n \"internal_key\": \"eleveldb.limited_developer_mem\",\n \"valid\": [\"on\", \"off\"]\n },\n \"leveldb.maximum_memory.percent\": {\n \"default\": \"70\",\n \"description\": \"This parameter defines the percentage of total server memory\\nto assign to LevelDB. LevelDB will dynamically adjust its internal\\ncache sizes to stay within this size. The memory size can\\nalternately be assigned as a byte count via leveldb.maximum_memory\\ninstead.\\nSee also:\\n leveldb.maximum_memory\",\n \"example\": \"70\",\n \"internal_key\": \"eleveldb.total_leveldb_mem_percent\",\n \"valid\": \"an integer\"\n },\n \"leveldb.sync_on_write\": {\n \"default\": \"off\",\n \"description\": \"Whether LevelDB will flush after every write. Note: If you are\\nfamiliar with fsync, this is analagous to calling fsync after every\\nwrite.\",\n \"example\": \"\",\n \"internal_key\": \"eleveldb.sync\",\n \"valid\": [\"on\", \"off\"]\n },\n \"leveldb.threads\": {\n \"default\": \"71\",\n \"description\": \"The number of worker threads performing LevelDB operations.\",\n \"example\": \"\",\n \"internal_key\": \"eleveldb.eleveldb_threads\",\n \"valid\": \"an integer\"\n },\n \"leveldb.tiered\": {\n \"default\": \"off\",\n \"description\": \"leveldb can be configured to use different mounts for\\ndifferent levels. This tiered option defaults to off, but you can\\nconfigure it to trigger at levels 1-6. If you do this, anything\\nstored at the chosen level or greater will be stored on\\nleveldb.tiered.mounts.slow, while everything at the levels below will\\nbe stored on leveldb.tiered.mounts.fast\\nLevels 3 or 4 are recommended settings.\\nWARNING: There is no dynamic reallocation of leveldb\\ndata across mounts. If you change this setting without manually\\nmoving the level files to the correct mounts, leveldb will act in\\nan unexpected state.\\nSee also:\\n leveldb.tiered.mounts.fast\\n leveldb.tiered.mounts.slow\",\n \"example\": \"\",\n \"internal_key\": \"eleveldb.tiered_slow_level\",\n \"valid\": \"an integer, or the string \\\"off\\\"\"\n },\n \"leveldb.verify_checksums\": {\n \"default\": \"on\",\n \"description\": \"Enables or disables the verification of the data fetched from\\nLevelDB against internal checksums.\",\n \"example\": \"\",\n \"internal_key\": \"eleveldb.verify_checksums\",\n \"valid\": [\"on\", \"off\"]\n },\n \"leveldb.verify_compaction\": {\n \"default\": \"on\",\n \"description\": \"Enables or disables the verification of LevelDB data during\\ncompaction.\",\n \"example\": \"\",\n \"internal_key\": \"eleveldb.verify_compaction\",\n \"valid\": [\"on\", \"off\"]\n },\n \"leveldb.write_buffer_size_max\": {\n \"default\": \"60MB\",\n \"description\": \"Each vnode first stores new key/value data in a memory based\\nwrite buffer. This write buffer is in parallel to the recovery log\\nmentioned in the \\\"sync\\\" parameter. Riak creates each vnode with a\\nrandomly sized write buffer for performance reasons. The random\\nsize is somewhere between write_buffer_size_min and\\nwrite_buffer_size_max.\",\n \"example\": \"\",\n \"internal_key\": \"eleveldb.write_buffer_size_max\",\n \"valid\": \"a byte size with units, e.g. 10GB\"\n },\n \"leveldb.write_buffer_size_min\": {\n \"default\": \"30MB\",\n \"description\": \"Each vnode first stores new key/value data in a memory based\\nwrite buffer. This write buffer is in parallel to the recovery log\\nmentioned in the \\\"sync\\\" parameter. Riak creates each vnode with a\\nrandomly sized write buffer for performance reasons. The random\\nsize is somewhere between write_buffer_size_min and\\nwrite_buffer_size_max.\\nSee also:\\n leveldb.sync\",\n \"example\": \"\",\n \"internal_key\": \"eleveldb.write_buffer_size_min\",\n \"valid\": \"a byte size with units, e.g. 10GB\"\n },\n \"listener.http.internal\": {\n \"default\": \"127.0.0.1:8098\",\n \"description\": \"listener.http. is an IP address and TCP port that the Riak\\nHTTP interface will bind.\",\n \"example\": \"0.0.0.0:8098\",\n \"internal_key\": \"riak_api.http\",\n \"valid\": \"an IP/port pair, e.g. 127.0.0.1:10011\"\n },\n \"listener.protobuf.internal\": {\n \"default\": \"127.0.0.1:8087\",\n \"description\": \"listener.protobuf. is an IP address and TCP port that the Riak\\nProtocol Buffers interface will bind.\",\n \"example\": \"0.0.0.0:8087\",\n \"internal_key\": \"riak_api.pb\",\n \"valid\": \"an IP/port pair, e.g. 127.0.0.1:10011\"\n },\n \"log.console\": {\n \"default\": \"file\",\n \"description\": \"Where to emit the default log messages (typically at 'info'\\nseverity):\\noff: disabled\\nfile: the file specified by log.console.file\\nconsole: to standard output (seen when using `riak attach-direct`)\\nboth: log.console.file and standard out.\",\n \"example\": \"file\",\n \"internal_key\": \"lager.handlers\",\n \"valid\": [\"off\", \"file\", \"console\", \"both\"]\n },\n \"log.console.file\": {\n \"default\": \"$(platform_log_dir)/console.log\",\n \"description\": \"When 'log.console' is set to 'file' or 'both', the file where\\nconsole messages will be logged.\",\n \"example\": \"$(platform_log_dir)/console.log\",\n \"internal_key\": \"lager.handlers\",\n \"valid\": \"the path to a file\"\n },\n \"log.console.level\": {\n \"default\": \"info\",\n \"description\": \"The severity level of the console log, default is 'info'.\",\n \"example\": \"info\",\n \"internal_key\": \"lager.handlers\",\n \"valid\": [\"debug\", \"info\", \"notice\", \"warning\", \"error\", \"critical\", \"alert\", \"emergency\", \"none\"]\n },\n \"log.crash\": {\n \"default\": \"on\",\n \"description\": \"Whether to enable the crash log.\",\n \"example\": \"on\",\n \"internal_key\": \"lager.crash_log\",\n \"valid\": [\"on\", \"off\"]\n },\n \"log.crash.file\": {\n \"default\": \"$(platform_log_dir)/crash.log\",\n \"description\": \"If the crash log is enabled, the file where its messages will\\nbe written.\",\n \"example\": \"$(platform_log_dir)/crash.log\",\n \"internal_key\": \"lager.crash_log\",\n \"valid\": \"the path to a file\"\n },\n \"log.crash.maximum_message_size\": {\n \"default\": \"64KB\",\n \"description\": \"Maximum size in bytes of individual messages in the crash log\",\n \"example\": \"64KB\",\n \"internal_key\": \"lager.crash_log_msg_size\",\n \"valid\": \"a byte size with units, e.g. 10GB\"\n },\n \"log.crash.rotation\": {\n \"default\": \"$D0\",\n \"description\": \"The schedule on which to rotate the crash log. For more\\ninformation see:\\nhttps://github.com/basho/lager/blob/master/README.md#internal-log-rotation\",\n \"example\": \"$D0\",\n \"internal_key\": \"lager.crash_log_date\",\n \"valid\": \"text\"\n },\n \"log.crash.rotation.keep\": {\n \"default\": \"5\",\n \"description\": \"The number of rotated crash logs to keep. When set to\\n'current', only the current open log file is kept.\",\n \"example\": \"5\",\n \"internal_key\": \"lager.crash_log_count\",\n \"valid\": \"an integer\"\n },\n \"log.crash.size\": {\n \"default\": \"10MB\",\n \"description\": \"Maximum size of the crash log in bytes, before it is rotated\",\n \"example\": \"10MB\",\n \"internal_key\": \"lager.crash_log_size\",\n \"valid\": \"a byte size with units, e.g. 10GB\"\n },\n \"log.error.file\": {\n \"default\": \"$(platform_log_dir)/error.log\",\n \"description\": \"The file where error messages will be logged.\",\n \"example\": \"$(platform_log_dir)/error.log\",\n \"internal_key\": \"lager.handlers\",\n \"valid\": \"the path to a file\"\n },\n \"log.error.messages_per_second\": {\n \"default\": \"100\",\n \"description\": \"Maximum number of error_logger messages to handle in a second\",\n \"example\": \"\",\n \"internal_key\": \"lager.error_logger_hwm\",\n \"valid\": \"an integer\"\n },\n \"log.error.redirect\": {\n \"default\": \"on\",\n \"description\": \"Whether to redirect error_logger messages into lager -\\ndefaults to true\",\n \"example\": \"\",\n \"internal_key\": \"lager.error_logger_redirect\",\n \"valid\": [\"on\", \"off\"]\n },\n \"log.syslog\": {\n \"default\": \"off\",\n \"description\": \"When set to 'on', enables log output to syslog.\",\n \"example\": \"off\",\n \"internal_key\": \"lager.handlers\",\n \"valid\": [\"on\", \"off\"]\n },\n \"log.syslog.facility\": {\n \"default\": \"daemon\",\n \"description\": \"Syslog facility to log entries from Riak.\",\n \"example\": \"\",\n \"internal_key\": \"lager.handlers\",\n \"valid\": [\"kern\", \"user\", \"mail\", \"daemon\", \"auth\", \"syslog\", \"lpr\", \"news\", \"uucp\", \"clock\", \"authpriv\", \"ftp\", \"cron\", \"local0\", \"local1\", \"local2\", \"local3\", \"local4\", \"local5\", \"local6\", \"local7\"]\n },\n \"log.syslog.ident\": {\n \"default\": \"riak\",\n \"description\": \"When set to 'on', enables log output to syslog.\",\n \"example\": \"\",\n \"internal_key\": \"lager.handlers\",\n \"valid\": \"text\"\n },\n \"log.syslog.level\": {\n \"default\": \"info\",\n \"description\": \"The severity level at which to log entries to syslog, default is 'info'.\",\n \"example\": \"\",\n \"internal_key\": \"lager.handlers\",\n \"valid\": [\"debug\", \"info\", \"notice\", \"warning\", \"error\", \"critical\", \"alert\", \"emergency\", \"none\"]\n },\n \"max_concurrent_requests\": {\n \"default\": \"50000\",\n \"description\": \"The maximum number of concurrent requests of each type (get or\\nput) that is allowed. Setting this value to infinite disables\\noverload protection. The 'erlang.process_limit' should be at least\\n3 times more than this setting.\\nSee also:\\n erlang.process_limit\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.fsm_limit\",\n \"valid\": \"an integer\"\n },\n \"metadata_cache_size\": {\n \"default\": \"off\",\n \"description\": \"Controls the size of the metadata cache for each vnode. Set to\\n'off' to disable the cache. This shouldn't be necessary on-disk\\nbased backends, but can help performance in some cases (i.e. memory\\nbackend, data fits in block cache, etc). Note that this is the size\\nof the ETS table, rather than the actual data, to keep the size\\ncalculation simple, thus more space may be used than the simple\\nsize * vnode_count calculation would imply.\\nCaution: Do not use without extensive benchmarking.\\ndisabled by default, 256KB is a reasonable value\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.vnode_md_cache_size\",\n \"valid\": \"a byte size with units, e.g. 10GB, or the string \\\"off\\\"\"\n },\n \"nodename\": {\n \"default\": \"riak@127.0.0.1\",\n \"description\": \"Name of the Erlang node\",\n \"example\": \"riak@127.0.0.1\",\n \"internal_key\": \"vm_args.-name\",\n \"valid\": \"text\"\n },\n \"object.format\": {\n \"default\": \"1\",\n \"description\": \"Controls which binary representation of a riak value is stored\\non disk.\\n* 0: Original erlang:term_to_binary format. Higher space overhead. (Obsolete)\\n* 1: New format for more compact storage of small values.\",\n \"example\": \"1\",\n \"internal_key\": \"riak_kv.object_format\",\n \"valid\": [\"0\", \"1\"]\n },\n \"object.siblings.maximum\": {\n \"default\": \"100\",\n \"description\": \"Writing an object with more than this number of siblings will\\nsend a failure to the client.\",\n \"example\": \"100\",\n \"internal_key\": \"riak_kv.max_siblings\",\n \"valid\": \"an integer\"\n },\n \"object.siblings.warning_threshold\": {\n \"default\": \"25\",\n \"description\": \"Writing an object with more than this number of siblings will\\ngenerate a warning in the logs.\",\n \"example\": \"25\",\n \"internal_key\": \"riak_kv.warn_siblings\",\n \"valid\": \"an integer\"\n },\n \"object.size.maximum\": {\n \"default\": \"50MB\",\n \"description\": \"Writing an object bigger than this will send a failure to the\\nclient.\",\n \"example\": \"50MB\",\n \"internal_key\": \"riak_kv.max_object_size\",\n \"valid\": \"a byte size with units, e.g. 10GB\"\n },\n \"object.size.warning_threshold\": {\n \"default\": \"5MB\",\n \"description\": \"Reading or writing objects bigger than this size will write a\\nwarning in the logs.\",\n \"example\": \"5MB\",\n \"internal_key\": \"riak_kv.warn_object_size\",\n \"valid\": \"a byte size with units, e.g. 10GB\"\n },\n \"platform_bin_dir\": {\n \"default\": \"./bin\",\n \"description\": \"Platform-specific installation paths (substituted by rebar)\",\n \"example\": \"./bin\",\n \"internal_key\": \"riak_core.platform_bin_dir\",\n \"valid\": \"the path to a directory\"\n },\n \"platform_data_dir\": {\n \"default\": \"./data\",\n \"description\": \"Platform-specific installation paths (substituted by rebar)\",\n \"example\": \"./data\",\n \"internal_key\": \"riak_core.platform_data_dir\",\n \"valid\": \"the path to a directory\"\n },\n \"platform_etc_dir\": {\n \"default\": \"./etc\",\n \"description\": \"Platform-specific installation paths (substituted by rebar)\",\n \"example\": \"./etc\",\n \"internal_key\": \"riak_core.platform_etc_dir\",\n \"valid\": \"the path to a directory\"\n },\n \"platform_lib_dir\": {\n \"default\": \"./lib\",\n \"description\": \"Platform-specific installation paths (substituted by rebar)\",\n \"example\": \"./lib\",\n \"internal_key\": \"riak_core.platform_lib_dir\",\n \"valid\": \"the path to a directory\"\n },\n \"platform_log_dir\": {\n \"default\": \"./log\",\n \"description\": \"Platform-specific installation paths (substituted by rebar)\",\n \"example\": \"./log\",\n \"internal_key\": \"riak_core.platform_log_dir\",\n \"valid\": \"the path to a directory\"\n },\n \"protobuf.backlog\": {\n \"default\": \"128\",\n \"description\": \"The maximum length to which the queue of pending connections\\nmay grow. If set, it must be an integer > 0. If you anticipate a\\nhuge number of connections being initialized *simultaneously*, set\\nthis number higher.\",\n \"example\": \"\",\n \"internal_key\": \"riak_api.pb_backlog\",\n \"valid\": \"an integer\"\n },\n \"protobuf.nagle\": {\n \"default\": \"off\",\n \"description\": \"Turns off Nagle's algorithm for Protocol Buffers\\nconnections. This is equivalent to setting the TCP_NODELAY option\\non the socket.\",\n \"example\": \"\",\n \"internal_key\": \"riak_api.disable_pb_nagle\",\n \"valid\": [\"on\", \"off\"]\n },\n \"retry_put_coordinator_failure\": {\n \"default\": \"on\",\n \"description\": \"If forwarding to a replica-local coordinator on PUT fails,\\nthis setting will retry the operation when set to 'on'.\\n* on = Riak 2.0 behavior (strongly recommended)\\n* off = Riak 1.x behavior\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.retry_put_coordinator_failure\",\n \"valid\": [\"on\", \"off\"]\n },\n \"riak_control\": {\n \"default\": \"off\",\n \"description\": \"Set to 'off' to disable the admin panel.\",\n \"example\": \"off\",\n \"internal_key\": \"riak_control.enabled\",\n \"valid\": [\"on\", \"off\"]\n },\n \"riak_control.auth.mode\": {\n \"default\": \"off\",\n \"description\": \"Authentication mode used for access to the admin panel.\",\n \"example\": \"off\",\n \"internal_key\": \"riak_control.auth\",\n \"valid\": [\"off\", \"userlist\"]\n },\n \"ring.state_dir\": {\n \"default\": \"$(platform_data_dir)/ring\",\n \"description\": \"Default location of ringstate\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.ring_state_dir\",\n \"valid\": \"the path to a directory\"\n },\n \"ring_size\": {\n \"default\": \"64\",\n \"description\": \"Number of partitions in the cluster (only valid when first\\ncreating the cluster). Must be a power of 2, minimum 8 and maximum\\n1024.\",\n \"example\": \"128\",\n \"internal_key\": \"riak_core.ring_creation_size\",\n \"valid\": \"an integer\"\n },\n \"runtime_health.thresholds.busy_ports\": {\n \"default\": \"2\",\n \"description\": \"The threshold at which to warn about the number of ports that\\nare overly busy. Ports with full input buffers count toward this\\nthreshold.\",\n \"example\": \"\",\n \"internal_key\": \"riak_sysmon.port_limit\",\n \"valid\": \"an integer\"\n },\n \"runtime_health.thresholds.busy_processes\": {\n \"default\": \"30\",\n \"description\": \"The threshold at which to warn about the number of processes\\nthat are overly busy. Processes with large heaps or that take a\\nlong time to garbage collect will count toward this threshold.\",\n \"example\": \"\",\n \"internal_key\": \"riak_sysmon.process_limit\",\n \"valid\": \"an integer\"\n },\n \"runtime_health.triggers.distribution_port\": {\n \"default\": \"on\",\n \"description\": \"Whether distribution ports with full input buffers will be\\ncounted as busy. Distribution ports connect Riak nodes within a\\nsingle cluster.\\nSee also:\\n runtime_health.thresholds.busy_ports\",\n \"example\": \"\",\n \"internal_key\": \"riak_sysmon.busy_dist_port\",\n \"valid\": [\"on\", \"off\"]\n },\n \"runtime_health.triggers.port\": {\n \"default\": \"on\",\n \"description\": \"Whether ports with full input buffers will be counted as\\nbusy. Ports can represent open files or network sockets.\\nSee also:\\n runtime_health.thresholds.busy_ports\",\n \"example\": \"\",\n \"internal_key\": \"riak_sysmon.busy_port\",\n \"valid\": [\"on\", \"off\"]\n },\n \"runtime_health.triggers.process.garbage_collection\": {\n \"default\": \"off\",\n \"description\": \"A process will become busy when it exceeds this amount of time\\ndoing garbage collection.\\nNOTE: Enabling this setting can cause performance problems on\\nmulti-core systems.\\nSee also:\\n runtime_health.thresholds.busy_processes\",\n \"example\": \"\",\n \"internal_key\": \"riak_sysmon.gc_ms_limit\",\n \"valid\": \"the text 'off', or a time duration with units, e.g. '10s' for 10 seconds\"\n },\n \"runtime_health.triggers.process.heap_size\": {\n \"default\": \"160444000\",\n \"description\": \"A process will become busy when its heap exceeds this size.\\nSee also:\\n runtime_health.thresholds.busy_processes\",\n \"example\": \"\",\n \"internal_key\": \"riak_sysmon.heap_word_limit\",\n \"valid\": \"a byte size with units, e.g. 10GB\"\n },\n \"runtime_health.triggers.process.long_schedule\": {\n \"default\": \"off\",\n \"description\": \"A process will become busy when it exceeds this amount of time\\nduring a single process scheduling & execution cycle.\",\n \"example\": \"\",\n \"internal_key\": \"riak_sysmon.schedule_ms_limit\",\n \"valid\": \"the text 'off', or a time duration with units, e.g. '10s' for 10 seconds\"\n },\n \"sasl\": {\n \"default\": \"off\",\n \"description\": \"Whether to enable Erlang's built-in error logger.\",\n \"example\": \"\",\n \"internal_key\": \"sasl.sasl_error_logger\",\n \"valid\": [\"on\", \"off\"]\n },\n \"search\": {\n \"default\": \"off\",\n \"description\": \"To enable Search set this 'on'.\",\n \"example\": \"on\",\n \"internal_key\": \"yokozuna.enabled\",\n \"valid\": [\"on\", \"off\"]\n },\n \"search.anti_entropy.data_dir\": {\n \"default\": \"$(platform_data_dir)/yz_anti_entropy\",\n \"description\": \"The directory where Search's Active Anti-Entropy data files\\nare stored\",\n \"example\": \"\",\n \"internal_key\": \"yokozuna.anti_entropy_data_dir\",\n \"valid\": \"the path to a directory\"\n },\n \"search.root_dir\": {\n \"default\": \"$(platform_data_dir)/yz\",\n \"description\": \"The root directory for Search, under which index data and\\nconfiguration is stored.\",\n \"example\": \"\",\n \"internal_key\": \"yokozuna.root_dir\",\n \"valid\": \"the path to a directory\"\n },\n \"search.solr.jmx_port\": {\n \"default\": \"8985\",\n \"description\": \"The port number which Solr JMX binds to.\\nNOTE: Binds on every interface.\",\n \"example\": \"8985\",\n \"internal_key\": \"yokozuna.solr_jmx_port\",\n \"valid\": \"an integer\"\n },\n \"search.solr.jvm_options\": {\n \"default\": \"-d64 -Xms1g -Xmx1g -XX:+UseStringCache -XX:+UseCompressedOops\",\n \"description\": \"The options to pass to the Solr JVM. Non-standard options,\\ni.e. -XX, may not be portable across JVM implementations.\\nE.g. -XX:+UseCompressedStrings\",\n \"example\": \"-d64 -Xms1g -Xmx1g -XX:+UseStringCache -XX:+UseCompressedOops\",\n \"internal_key\": \"yokozuna.solr_jvm_opts\",\n \"valid\": \"text\"\n },\n \"search.solr.port\": {\n \"default\": \"8093\",\n \"description\": \"The port number which Solr binds to.\\nNOTE: Binds on every interface.\",\n \"example\": \"8093\",\n \"internal_key\": \"yokozuna.solr_port\",\n \"valid\": \"an integer\"\n },\n \"search.solr.start_timeout\": {\n \"default\": \"30s\",\n \"description\": \"How long Riak will wait for Solr to start. The start sequence\\nwill be tried twice. If both attempts timeout, then the Riak node\\nwill be shutdown. This may need to be increased as more data is\\nindexed and Solr takes longer to start. Values lower than 1s will\\nbe rounded up to the minimum 1s.\",\n \"example\": \"30s\",\n \"internal_key\": \"yokozuna.solr_startup_wait\",\n \"valid\": \"a time duration with units, e.g. '10s' for 10 seconds\"\n },\n \"secure_referer_check\": {\n \"default\": \"on\",\n \"description\": \"Measures were added to Riak 1.2 to counteract cross-site\\nscripting and request-forgery attacks. Some reverse-proxies cannot\\nremove the Referer header and make serving data directly from Riak\\nimpossible. Turning secure_referer_check = off disables this\\nsecurity check.\",\n \"example\": \"\",\n \"internal_key\": \"riak_kv.secure_referer_check\",\n \"valid\": [\"on\", \"off\"]\n },\n \"storage_backend\": {\n \"default\": \"bitcask\",\n \"description\": \"Specifies the storage engine used for Riak's key-value data\\nand secondary indexes (if supported).\",\n \"example\": \"bitcask\",\n \"internal_key\": \"riak_kv.storage_backend\",\n \"valid\": [\"bitcask\", \"leveldb\", \"memory\", \"multi\", \"prefix_multi\"]\n },\n \"strong_consistency\": {\n \"default\": \"off\",\n \"description\": \"Enable consensus subsystem. Set to 'on' to enable the\\nconsensus subsystem used for strongly consistent Riak operations.\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.enable_consensus\",\n \"valid\": [\"on\", \"off\"]\n },\n \"tls_protocols.sslv3\": {\n \"default\": \"off\",\n \"description\": \"Determine which SSL/TLS versions are allowed. By default only TLS 1.2\\nis allowed, but other versions can be enabled if clients don't support the\\nlatest TLS standard. It is *strongly* recommended that SSLv3 is not enabled\\nunless absolutely necessary. More than one protocol can be enabled at once.\",\n \"example\": \"\",\n \"internal_key\": \"riak_api.tls_protocols\",\n \"valid\": [\"on\", \"off\"]\n },\n \"tls_protocols.tlsv1\": {\n \"default\": \"off\",\n \"description\": \"Determine which SSL/TLS versions are allowed. By default only TLS 1.2\\nis allowed, but other versions can be enabled if clients don't support the\\nlatest TLS standard. It is *strongly* recommended that SSLv3 is not enabled\\nunless absolutely necessary. More than one protocol can be enabled at once.\",\n \"example\": \"\",\n \"internal_key\": \"riak_api.tls_protocols\",\n \"valid\": [\"on\", \"off\"]\n },\n \"tls_protocols.tlsv1.1\": {\n \"default\": \"off\",\n \"description\": \"Determine which SSL/TLS versions are allowed. By default only TLS 1.2\\nis allowed, but other versions can be enabled if clients don't support the\\nlatest TLS standard. It is *strongly* recommended that SSLv3 is not enabled\\nunless absolutely necessary. More than one protocol can be enabled at once.\",\n \"example\": \"\",\n \"internal_key\": \"riak_api.tls_protocols\",\n \"valid\": [\"on\", \"off\"]\n },\n \"tls_protocols.tlsv1.2\": {\n \"default\": \"on\",\n \"description\": \"Determine which SSL/TLS versions are allowed. By default only TLS 1.2\\nis allowed, but other versions can be enabled if clients don't support the\\nlatest TLS standard. It is *strongly* recommended that SSLv3 is not enabled\\nunless absolutely necessary. More than one protocol can be enabled at once.\",\n \"example\": \"\",\n \"internal_key\": \"riak_api.tls_protocols\",\n \"valid\": [\"on\", \"off\"]\n },\n \"transfer_limit\": {\n \"default\": \"2\",\n \"description\": \"Number of concurrent node-to-node transfers allowed.\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.handoff_concurrency\",\n \"valid\": \"an integer\"\n },\n \"vnode_management_timer\": {\n \"default\": \"10s\",\n \"description\": \"Interval of time between vnode management\\nactivities. Modifying this will change the amount of time between\\nattemps to trigger handoff between this node and any other member\\nof the cluster.\",\n \"example\": \"\",\n \"internal_key\": \"riak_core.vnode_management_timer\",\n \"valid\": \"a time duration with units, e.g. '10s' for 10 seconds\"\n }\n };\n});","define(\"ember-riak-explorer/utils/riak-help/riak_status\",[\"exports\"],function(exports){exports[\"default\"] = {\"asn1_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"\",\"example\":\"2.0.3\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"asn1_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"basho_stats_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Basho Stats](http://github.com/basho/basho_stats)\",\"example\":\"1.0.3\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"basho_stats_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"bitcask_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Bitcask](http://github.com/basho/bitcask)\",\"example\":\"1.7.2\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"bitcask_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"clique_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"\",\"example\":\"0.3.2-0-ge332c8f\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"clique_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"cluster_info_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Cluster Information](http://github.com/basho/cluster_info)\",\"example\":\"2.0.3-0-g76c73fc\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"cluster_info_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"compiler_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Erlang Compiler](http://erlang.org/doc/apps/compiler/)\",\"example\":\"4.9.3\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"compiler_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"connected_nodes\":{\"category\":\"cluster state\",\"concern\":\"core\",\"description\":\"A list of the nodes that this node is aware of at this time\",\"example\":\"[]\",\"json_schema_type\":\"array\",\"metric_type\":\"nominal\",\"name\":\"connected_nodes\",\"period\":\"current\",\"scope\":\"cluster\",\"units\":\"n/a\"},\"consistent_get_objsize_100\":{\"category\":\"object size\",\"concern\":\"strong_consistency\",\"description\":\"100th-percentile object size for strongly consistent GETs on this node in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_get_objsize_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"consistent_get_objsize_95\":{\"category\":\"object size\",\"concern\":\"strong_consistency\",\"description\":\"95th-percentile object size for strongly consistent GETs on this node in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_get_objsize_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"consistent_get_objsize_99\":{\"category\":\"object size\",\"concern\":\"strong_consistency\",\"description\":\"99th-percentile object size for strongly consistent GETs on this node in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_get_objsize_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"consistent_get_objsize_mean\":{\"category\":\"object size\",\"concern\":\"strong_consistency\",\"description\":\"Mean object size for strongly consistent GETs on this node in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_get_objsize_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"consistent_get_objsize_median\":{\"category\":\"object size\",\"concern\":\"strong_consistency\",\"description\":\"Median object size for strongly consistent GETs on this node in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_get_objsize_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"consistent_get_time_100\":{\"category\":\"latency\",\"concern\":\"strong_consistency\",\"description\":\"100th-percentile time between reception of client GETs to strongly consistent keys and subsequent response\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_get_time_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"consistent_get_time_95\":{\"category\":\"latency\",\"concern\":\"strong_consistency\",\"description\":\"95th-percentile time between reception of client GETs to strongly consistent keys and subsequent response\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_get_time_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"consistent_get_time_99\":{\"category\":\"latency\",\"concern\":\"strong_consistency\",\"description\":\"99th-percentile time between reception of client GETs to strongly consistent keys and subsequent response\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_get_time_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"consistent_get_time_mean\":{\"category\":\"latency\",\"concern\":\"strong_consistency\",\"description\":\"Mean time between reception of client GETs to strongly consistent keys and subsequent response\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_get_time_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"consistent_get_time_median\":{\"category\":\"latency\",\"concern\":\"strong_consistency\",\"description\":\"Median time between reception of client GETs to strongly consistent keys and subsequent response\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_get_time_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"consistent_gets\":{\"category\":\"throughput - read\",\"concern\":\"strong_consistency\",\"description\":\"Consistent reads on this node\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_gets\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"consistent_gets_total\":{\"category\":\"throughput - read\",\"concern\":\"strong_consistency\",\"description\":\"Total number of strongly consistent GETs coordinated by this node\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"consistent_gets_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"operations\"},\"consistent_put_objsize_100\":{\"category\":\"object size\",\"concern\":\"strong_consistency\",\"description\":\"100th-percentile object size for strongly consistent PUTs on this node in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_put_objsize_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"consistent_put_objsize_95\":{\"category\":\"object size\",\"concern\":\"strong_consistency\",\"description\":\"95th-percentile object size for strongly consistent PUTs on this node in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_put_objsize_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"consistent_put_objsize_99\":{\"category\":\"object size\",\"concern\":\"strong_consistency\",\"description\":\"99th-percentile object size for strongly consistent PUTs on this node in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_put_objsize_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"consistent_put_objsize_mean\":{\"category\":\"object size\",\"concern\":\"strong_consistency\",\"description\":\"Mean object size for strongly consistent PUTs on this node in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_put_objsize_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"consistent_put_objsize_median\":{\"category\":\"object size\",\"concern\":\"strong_consistency\",\"description\":\"Median object size for strongly consistent PUTs on this node in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_put_objsize_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"consistent_put_time_100\":{\"category\":\"latency\",\"concern\":\"strong_consistency\",\"description\":\"100th-percentile time between reception of client PUTs to strongly consistent keys and subsequent response\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_put_time_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"consistent_put_time_95\":{\"category\":\"latency\",\"concern\":\"strong_consistency\",\"description\":\"95th-percentile time between reception of client PUTs to strongly consistent keys and subsequent response\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_put_time_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"consistent_put_time_99\":{\"category\":\"latency\",\"concern\":\"strong_consistency\",\"description\":\"99th-percentile time between reception of client PUTs to strongly consistent keys and subsequent response\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_put_time_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"consistent_put_time_mean\":{\"category\":\"latency\",\"concern\":\"strong_consistency\",\"description\":\"Mean time between reception of client PUTs to strongly consistent keys and subsequent response\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_put_time_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"consistent_put_time_median\":{\"category\":\"latency\",\"concern\":\"strong_consistency\",\"description\":\"Median time between reception of client PUTs to strongly consistent keys and subsequent response\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_put_time_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"consistent_puts\":{\"category\":\"throughput - write\",\"concern\":\"strong_consistency\",\"description\":\"Consistent writes on this node\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"consistent_puts\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"consistent_puts_total\":{\"category\":\"throughput - write\",\"concern\":\"strong_consistency\",\"description\":\"Total number of strongly consistent PUTs coordinated by this node\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"consistent_puts_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"operations\"},\"converge_delay_last\":{\"category\":\"latency\",\"concern\":\"core\",\"description\":\"Last observed histogram value in milliseconds describing time taken for the ring to converge after ring changes\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"converge_delay_last\",\"period\":\"?\",\"scope\":\"node\",\"units\":\"milliseconds\"},\"converge_delay_max\":{\"category\":\"latency\",\"concern\":\"core\",\"description\":\"Maximum time in milliseconds describing time taken for the ring to converge after ring changes\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"converge_delay_max\",\"period\":\"?\",\"scope\":\"node\",\"units\":\"milliseconds\"},\"converge_delay_mean\":{\"category\":\"latency\",\"concern\":\"core\",\"description\":\"Mean time in milliseconds describing time taken for the ring to converge after ring changes\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"converge_delay_mean\",\"period\":\"?\",\"scope\":\"node\",\"units\":\"milliseconds\"},\"converge_delay_min\":{\"category\":\"latency\",\"concern\":\"core\",\"description\":\"Minimum time in milliseconds describing time taken for the ring to converge after ring changes\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"converge_delay_min\",\"period\":\"?\",\"scope\":\"node\",\"units\":\"milliseconds\"},\"coord_redirs_total\":{\"category\":\"load\",\"concern\":\"core\",\"description\":\"Total number of requests this node has redirected to other nodes for coordination\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"coord_redirs_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"redirects\"},\"counter_actor_counts_100\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"counter_actor_counts_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"?\"},\"counter_actor_counts_95\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"counter_actor_counts_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"?\"},\"counter_actor_counts_99\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"counter_actor_counts_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"?\"},\"counter_actor_counts_mean\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"counter_actor_counts_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"?\"},\"counter_actor_counts_median\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"counter_actor_counts_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"?\"},\"cpu_avg1\":{\"category\":\"load\",\"concern\":\"resources\",\"description\":\"The average number of active processes for the last 1 minute (equivalent to top(1) command's load average when divided by 256())\",\"example\":\"1198\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"cpu_avg1\",\"period\":\"1 minute\",\"scope\":\"erlang vm\",\"units\":\"processes\"},\"cpu_avg15\":{\"category\":\"load\",\"concern\":\"resources\",\"description\":\"The average number of active processes for the last 15 minutes (equivalent to top(1) command's load average when divided by 256())\",\"example\":\"1083\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"cpu_avg15\",\"period\":\"15 minutes\",\"scope\":\"erlang vm\",\"units\":\"processes\"},\"cpu_avg5\":{\"category\":\"load\",\"concern\":\"resources\",\"description\":\"The average number of active processes for the last 5 minutes (equivalent to top(1) command's load average when divided by 256())\",\"example\":\"1190\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"cpu_avg5\",\"period\":\"5 minutes\",\"scope\":\"erlang vm\",\"units\":\"processes\"},\"cpu_nprocs\":{\"category\":\"load\",\"concern\":\"resources\",\"description\":\"Number of operating system processes\",\"example\":\"375\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"cpu_nprocs\",\"period\":\"current\",\"scope\":\"erlang vm\",\"units\":\"processes\"},\"crypto_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Erlang crypto](http://erlang.org/doc/apps/crypto/)\",\"example\":\"3.1\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"crypto_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"disk\":{\"category\":\"usage\",\"concern\":\"resources\",\"description\":\"Information about the disk, taken from Erlang's disksup module. Reported as [{\\\"ID\\\",KBytes_Used,Percent_Util}].\",\"example\":\"[{\\\"/\\\", 487401624, 96}]\",\"json_schema_type\":\"array\",\"metric_type\":\"nominal\",\"name\":\"disk\",\"period\":\"current\",\"scope\":\"node\",\"units\":\"n/a\"},\"dropped_vnode_requests_total\":{\"category\":\"load\",\"concern\":\"core\",\"description\":\"Total number of requests dropped by local vnodes since the node was started\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"dropped_vnode_requests_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"requests\"},\"eleveldb_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"\",\"example\":\"2.1.10-0-g0537ca9\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"eleveldb_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"erlang_js_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Erlang JS](http://github.com/basho/erlang_js)\",\"example\":\"1.3.0-0-g07467d8\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"erlang_js_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"erlydtl_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[ErlyDTL](http://github.com/erlydtl/erlydtl)\",\"example\":\"0.7.0\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"erlydtl_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"executing_mappers\":{\"category\":\"load\",\"concern\":\"core\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"executing_mappers\",\"period\":\"current\",\"scope\":\"node\",\"units\":\"mappers\"},\"exometer_core_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"\",\"example\":\"1.0.0-basho2-0-gb47a5d6\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"exometer_core_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"goldrush_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Goldrush](http://github.com/DeadZen/goldrush)\",\"example\":\"0.1.7\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"goldrush_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"gossip_received\":{\"category\":\"load\",\"concern\":\"core\",\"description\":\"Number of gossip messages received in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"gossip_received\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"messages\"},\"handoff_timeouts\":{\"category\":\"load\",\"concern\":\"core\",\"description\":\"Total number of handoff timeouts encountered by this node since it was started\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"handoff_timeouts\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"timeouts\"},\"ibrowse_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"\",\"example\":\"4.0.2\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"ibrowse_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"ignored_gossip_total\":{\"category\":\"load\",\"concern\":\"core\",\"description\":\"Total number of ignored gossip messages since node was started\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"ignored_gossip_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"messages\"},\"index_fsm_active\":{\"category\":\"load\",\"concern\":\"secondary_index\",\"description\":\"Number of active Secondary Index FSMs\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"index_fsm_active\",\"period\":\"current\",\"scope\":\"node\",\"units\":\"finite state machines\"},\"index_fsm_create\":{\"category\":\"load\",\"concern\":\"secondary_index\",\"description\":\"Number of Secondary Index query FSMs created in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"index_fsm_create\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"finite state machines\"},\"index_fsm_create_error\":{\"category\":\"errors\",\"concern\":\"secondary_index\",\"description\":\"Number of Secondary Index query FSM creation errors in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"index_fsm_create_error\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"errors\"},\"inets_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[inets](http://erlang.org/doc/apps/inets/)\",\"example\":\"5.9.6\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"inets_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"kernel_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Kernel](http://erlang.org/doc/apps/kernel/)\",\"example\":\"2.16.3\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"kernel_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"lager_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Lager](http://github.com/DeadZen/lager)\",\"example\":\"2.1.1\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"lager_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"late_put_fsm_coordinator_ack\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"late_put_fsm_coordinator_ack\",\"period\":\"?\",\"scope\":\"node\",\"units\":\"?\"},\"leveldb_read_block_error\":{\"category\":\"errors\",\"concern\":\"kv\",\"description\":\"The number of LevelDB read block errors. Will read as undefined if LevelDB is not being used.\",\"example\":\"undefined\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"leveldb_read_block_error\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"errors\"},\"list_fsm_active\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Number of active Keylisting FSMs\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"list_fsm_active\",\"period\":\"current\",\"scope\":\"node\",\"units\":\"finite state machines\"},\"list_fsm_create\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Number of Keylisting FSMs created in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"list_fsm_create\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"finite state machines\"},\"list_fsm_create_error\":{\"category\":\"errors\",\"concern\":\"kv\",\"description\":\"Number of Keylisting FSM creation errors in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"list_fsm_create_error\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"errors\"},\"list_fsm_create_error_total\":{\"category\":\"errors\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"list_fsm_create_error_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"errors\"},\"list_fsm_create_total\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"list_fsm_create_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"finite state machines\"},\"map_actor_counts_100\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"map_actor_counts_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"?\"},\"map_actor_counts_95\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"map_actor_counts_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"?\"},\"map_actor_counts_99\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"map_actor_counts_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"?\"},\"map_actor_counts_mean\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"map_actor_counts_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"?\"},\"map_actor_counts_median\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"map_actor_counts_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"?\"},\"mem_allocated\":{\"category\":\"load\",\"concern\":\"resources\",\"description\":\"Total memory allocated for this node\",\"example\":\"7147700224\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"mem_allocated\",\"period\":\"current\",\"scope\":\"erlang vm\",\"units\":\"bytes\"},\"mem_total\":{\"category\":\"load\",\"concern\":\"resources\",\"description\":\"Total available system memory\",\"example\":\"7278239744\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"mem_total\",\"period\":\"current\",\"scope\":\"erlang vm\",\"units\":\"bytes\"},\"memory_atom\":{\"category\":\"load\",\"concern\":\"resources\",\"description\":\"Total amount of memory currently allocated for atom storage\",\"example\":\"654217\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"memory_atom\",\"period\":\"current\",\"scope\":\"erlang vm\",\"units\":\"bytes\"},\"memory_atom_used\":{\"category\":\"load\",\"concern\":\"resources\",\"description\":\"Total amount of memory currently used for atom storage\",\"example\":\"626645\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"memory_atom_used\",\"period\":\"current\",\"scope\":\"erlang vm\",\"units\":\"bytes\"},\"memory_binary\":{\"category\":\"load\",\"concern\":\"resources\",\"description\":\"Total amount of memory used for binaries\",\"example\":\"678248\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"memory_binary\",\"period\":\"current\",\"scope\":\"erlang vm\",\"units\":\"bytes\"},\"memory_code\":{\"category\":\"load\",\"concern\":\"resources\",\"description\":\"Total amount of memory allocated for Erlang code\",\"example\":\"14133818\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"memory_code\",\"period\":\"current\",\"scope\":\"erlang vm\",\"units\":\"bytes\"},\"memory_ets\":{\"category\":\"load\",\"concern\":\"resources\",\"description\":\"Total memory allocated for Erlang Term Storage\",\"example\":\"7834360\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"memory_ets\",\"period\":\"current\",\"scope\":\"erlang vm\",\"units\":\"bytes\"},\"memory_processes\":{\"category\":\"load\",\"concern\":\"resources\",\"description\":\"Total amount of memory allocated for Erlang processes (in bytes)\",\"example\":\"45176432\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"memory_processes\",\"period\":\"current\",\"scope\":\"erlang vm\",\"units\":\"bytes\"},\"memory_processes_used\":{\"category\":\"load\",\"concern\":\"resources\",\"description\":\"Total amount of memory used by Erlang processes (in bytes)\",\"example\":\"45174592\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"memory_processes_used\",\"period\":\"current\",\"scope\":\"erlang vm\",\"units\":\"bytes\"},\"memory_system\":{\"category\":\"load\",\"concern\":\"resources\",\"description\":\"Total allocated memory that is not directly related to an Erlang process\",\"example\":\"41938336\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"memory_system\",\"period\":\"current\",\"scope\":\"erlang vm\",\"units\":\"bytes\"},\"memory_total\":{\"category\":\"load\",\"concern\":\"resources\",\"description\":\"Total allocated memory (sum of processes and system)\",\"example\":\"87114768\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"memory_total\",\"period\":\"current\",\"scope\":\"erlang vm\",\"units\":\"bytes\"},\"merge_index_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Merge Index](http://github.com/basho/merge_index)\",\"example\":\"2.0.1-0-g0c8f77c\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"merge_index_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"mochiweb_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[MochiWeb](http://github.com/basho/mochiweb)\",\"example\":\"2.9.0\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"mochiweb_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"node_get_fsm_active\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Number of active GET FSMs\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_active\",\"period\":\"current\",\"scope\":\"node\",\"units\":\"finite state machines\"},\"node_get_fsm_active_60s\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Number of GET FSMs active in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_active_60s\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"finite state machines\"},\"node_get_fsm_counter_objsize_100\":{\"category\":\"object size\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_counter_objsize_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_counter_objsize_95\":{\"category\":\"object size\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_counter_objsize_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_counter_objsize_99\":{\"category\":\"object size\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_counter_objsize_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_counter_objsize_mean\":{\"category\":\"object size\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_counter_objsize_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_counter_objsize_median\":{\"category\":\"object size\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_counter_objsize_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_counter_siblings_100\":{\"category\":\"siblings\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_counter_siblings_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_counter_siblings_95\":{\"category\":\"siblings\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_counter_siblings_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_counter_siblings_99\":{\"category\":\"siblings\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_counter_siblings_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_counter_siblings_mean\":{\"category\":\"siblings\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_counter_siblings_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_counter_siblings_median\":{\"category\":\"siblings\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_counter_siblings_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_counter_time_100\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_counter_time_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_counter_time_95\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_counter_time_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_counter_time_99\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_counter_time_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_counter_time_mean\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_counter_time_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_counter_time_median\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_counter_time_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_errors\":{\"category\":\"errors\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_errors\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"errors\"},\"node_get_fsm_errors_total\":{\"category\":\"errors\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"node_get_fsm_errors_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"errors\"},\"node_get_fsm_in_rate\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Average number of GET FSMs enqueued by Sidejob's overload protection\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_in_rate\",\"period\":\"current\",\"scope\":\"node\",\"units\":\"finite state machines\"},\"node_get_fsm_map_objsize_100\":{\"category\":\"object size\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_map_objsize_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_map_objsize_95\":{\"category\":\"object size\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_map_objsize_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_map_objsize_99\":{\"category\":\"object size\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_map_objsize_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_map_objsize_mean\":{\"category\":\"object size\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_map_objsize_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_map_objsize_median\":{\"category\":\"object size\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_map_objsize_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_map_siblings_100\":{\"category\":\"siblings\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_map_siblings_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_map_siblings_95\":{\"category\":\"siblings\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_map_siblings_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_map_siblings_99\":{\"category\":\"siblings\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_map_siblings_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_map_siblings_mean\":{\"category\":\"siblings\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_map_siblings_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_map_siblings_median\":{\"category\":\"siblings\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_map_siblings_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_map_time_100\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_map_time_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_map_time_95\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_map_time_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_map_time_99\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_map_time_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_map_time_mean\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_map_time_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_map_time_median\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_map_time_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_objsize_100\":{\"category\":\"object size\",\"concern\":\"kv\",\"description\":\"100th percentile object size encountered by this node within the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_objsize_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_objsize_95\":{\"category\":\"object size\",\"concern\":\"kv\",\"description\":\"95th percentile object size encountered by this node within the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_objsize_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_objsize_99\":{\"category\":\"object size\",\"concern\":\"kv\",\"description\":\"99th percentile object size encountered by this node within the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_objsize_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_objsize_mean\":{\"category\":\"object size\",\"concern\":\"kv\",\"description\":\"Mean object size encountered by this node within the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_objsize_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_objsize_median\":{\"category\":\"object size\",\"concern\":\"kv\",\"description\":\"Median object size encountered by this node within the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_objsize_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_out_rate\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Average number of GET FSMs dequeued by Sidejob's overload protection\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_out_rate\",\"period\":\"current\",\"scope\":\"node\",\"units\":\"finite state machines\"},\"node_get_fsm_rejected\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Number of GET FSMs actively being rejected by Sidejob's overload protection\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_rejected\",\"period\":\"current\",\"scope\":\"node\",\"units\":\"rejections\"},\"node_get_fsm_rejected_60s\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Number of GET FSMs rejected by Sidejob's overload protection in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_rejected_60s\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"rejections\"},\"node_get_fsm_rejected_total\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Total number of GET FSMs rejected by Sidejob's overload protection\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"node_get_fsm_rejected_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"rejections\"},\"node_get_fsm_set_objsize_100\":{\"category\":\"object size\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_set_objsize_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_set_objsize_95\":{\"category\":\"object size\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_set_objsize_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_set_objsize_99\":{\"category\":\"object size\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_set_objsize_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_set_objsize_mean\":{\"category\":\"object size\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_set_objsize_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_set_objsize_median\":{\"category\":\"object size\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_set_objsize_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"node_get_fsm_set_siblings_100\":{\"category\":\"siblings\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_set_siblings_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_set_siblings_95\":{\"category\":\"siblings\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_set_siblings_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_set_siblings_99\":{\"category\":\"siblings\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_set_siblings_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_set_siblings_mean\":{\"category\":\"siblings\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_set_siblings_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_set_siblings_median\":{\"category\":\"siblings\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_set_siblings_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_set_time_100\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_set_time_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_set_time_95\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_set_time_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_set_time_99\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_set_time_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_set_time_mean\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_set_time_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_set_time_median\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_set_time_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_siblings_100\":{\"category\":\"siblings\",\"concern\":\"kv\",\"description\":\"100th percentile of siblings encountered during all GET operations by this node within the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_siblings_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_siblings_95\":{\"category\":\"siblings\",\"concern\":\"kv\",\"description\":\"95th percentile of siblings encountered during all GET operations by this node within the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_siblings_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_siblings_99\":{\"category\":\"siblings\",\"concern\":\"kv\",\"description\":\"99th percentile of siblings encountered during all GET operations by this node within the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_siblings_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_siblings_mean\":{\"category\":\"siblings\",\"concern\":\"kv\",\"description\":\"Mean number of siblings encountered during all GET operations by this node within the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_siblings_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_siblings_median\":{\"category\":\"siblings\",\"concern\":\"kv\",\"description\":\"Median number of siblings encountered during all GET operations by this node within the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_siblings_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"siblings\"},\"node_get_fsm_time_100\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"100th percentile time between reception of client GET request and subsequent response to client\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_time_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_time_95\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"95th percentile time between reception of client GET request and subsequent response to client\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_time_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_time_99\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"99th percentile time between reception of client GET request and subsequent response to client\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_time_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_time_mean\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"Mean time between reception of client GET request and subsequent response to client\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_time_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_get_fsm_time_median\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"Median time between reception of client GET request and subsequent response to client\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_get_fsm_time_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_gets\":{\"category\":\"throughput - read\",\"concern\":\"kv\",\"description\":\"Reads coordinated by this node\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_gets\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"node_gets_counter\":{\"category\":\"throughput - read\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_gets_counter\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"node_gets_counter_total\":{\"category\":\"throughput - read\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"node_gets_counter_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"operations\"},\"node_gets_map\":{\"category\":\"throughput - read\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_gets_map\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"node_gets_map_total\":{\"category\":\"throughput - read\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"node_gets_map_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"operations\"},\"node_gets_set\":{\"category\":\"throughput - read\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_gets_set\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"node_gets_set_total\":{\"category\":\"throughput - read\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"node_gets_set_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"operations\"},\"node_gets_total\":{\"category\":\"throughput - read\",\"concern\":\"kv\",\"description\":\"Total number of GETs coordinated by this node, including GETs to non-local vnodes\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"node_gets_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"operations\"},\"node_put_fsm_active\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Number of active PUT FSMs\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"node_put_fsm_active\",\"period\":\"current\",\"scope\":\"node\",\"units\":\"finite state machines\"},\"node_put_fsm_active_60s\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Number of PUT FSMs active in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_active_60s\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"finite state machines\"},\"node_put_fsm_counter_time_100\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_counter_time_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_counter_time_95\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_counter_time_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_counter_time_99\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_counter_time_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_counter_time_mean\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_counter_time_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_counter_time_median\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_counter_time_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_in_rate\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Average number of PUT FSMs enqueued by Sidejob's overload protection\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_in_rate\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"finite state machines\"},\"node_put_fsm_map_time_100\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_map_time_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_map_time_95\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_map_time_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_map_time_99\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_map_time_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_map_time_mean\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_map_time_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_map_time_median\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_map_time_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_out_rate\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Average number of PUT FSMs dequeued by Sidejob's overload protection\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_out_rate\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"finite state machines\"},\"node_put_fsm_rejected\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Number of PUT FSMs actively being rejected by Sidejob's overload protection\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"node_put_fsm_rejected\",\"period\":\"current\",\"scope\":\"node\",\"units\":\"rejections\"},\"node_put_fsm_rejected_60s\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Number of PUT FSMs rejected by Sidejob's overload protection in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_rejected_60s\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"rejections\"},\"node_put_fsm_rejected_total\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Total number of PUT FSMs rejected by Sidejob's overload protection\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"node_put_fsm_rejected_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"rejections\"},\"node_put_fsm_set_time_100\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_set_time_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_set_time_95\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_set_time_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_set_time_99\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_set_time_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_set_time_mean\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_set_time_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_set_time_median\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_set_time_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_time_100\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"100th percentile time between reception of client PUT request and subsequent response to client\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_time_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_time_95\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"95th percentile time between reception of client PUT request and subsequent response to client\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_time_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_time_99\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"99th percentile time between reception of client PUT request and subsequent response to client\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_time_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_time_mean\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"Mean time between reception of client PUT request and subsequent response to client\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_time_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_put_fsm_time_median\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"Median time between reception of client PUT request and subsequent response to client\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_put_fsm_time_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"node_puts\":{\"category\":\"throughput - write\",\"concern\":\"kv\",\"description\":\"Writes coordinated by this node\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_puts\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"node_puts_counter\":{\"category\":\"throughput - write\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_puts_counter\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"node_puts_counter_total\":{\"category\":\"throughput - write\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"node_puts_counter_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"operations\"},\"node_puts_map\":{\"category\":\"throughput - write\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_puts_map\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"node_puts_map_total\":{\"category\":\"throughput - write\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"node_puts_map_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"operations\"},\"node_puts_set\":{\"category\":\"throughput - write\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"node_puts_set\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"node_puts_set_total\":{\"category\":\"throughput - write\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"node_puts_set_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"operations\"},\"node_puts_total\":{\"category\":\"throughput - write\",\"concern\":\"kv\",\"description\":\"Total number of PUTs coordinated by this node, including PUTs to non-local vnodes\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"node_puts_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"operations\"},\"nodename\":{\"category\":\"config\",\"concern\":\"config\",\"description\":\"The name this node uses to identify itself\",\"example\":\"'riak@127.0.0.1'\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"nodename\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"n/a\"},\"object_counter_merge\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"Number of Update Counter operations performed during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_counter_merge\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"object_counter_merge_time_100\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"100th-percentile latency for an Update Counter operation during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_counter_merge_time_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_counter_merge_time_95\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"95th-percentile latency for an Update Counter operation during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_counter_merge_time_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_counter_merge_time_99\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"99th-percentile latency for an Update Counter operation during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_counter_merge_time_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_counter_merge_time_mean\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"Mean latency for an Update Counter operation during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_counter_merge_time_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_counter_merge_time_median\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"Median latency for an Update Counter operation during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_counter_merge_time_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_counter_merge_total\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"Total number of Update Counter operations performed since node start\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"object_counter_merge_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"operations\"},\"object_map_merge\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"Number of Update Map operations performed during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_map_merge\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"object_map_merge_time_100\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"100th-percentile latency for an Update Map operation during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_map_merge_time_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_map_merge_time_95\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"95th-percentile latency for an Update Map operation during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_map_merge_time_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_map_merge_time_99\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"99th-percentile latency for an Update Map operation during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_map_merge_time_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_map_merge_time_mean\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"Mean latency for an Update Map operation during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_map_merge_time_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_map_merge_time_median\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"Median latency for an Update Map operation during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_map_merge_time_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_map_merge_total\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"Total number of Update Map operations since node start\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"object_map_merge_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"operations\"},\"object_merge\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_merge\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"object_merge_time_100\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_merge_time_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_merge_time_95\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_merge_time_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_merge_time_99\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_merge_time_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_merge_time_mean\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_merge_time_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_merge_time_median\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_merge_time_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_merge_total\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"object_merge_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"operations\"},\"object_set_merge\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"Number of Update Set operations perfomed during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_set_merge\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"object_set_merge_time_100\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"100th-percentile latency for an Update Set operations during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_set_merge_time_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_set_merge_time_95\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"95th-percentile latency for an Update Set operations during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_set_merge_time_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_set_merge_time_99\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"99th-percentile latency for an Update Set operations during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_set_merge_time_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_set_merge_time_mean\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"Mean latency for an Update Set operations during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_set_merge_time_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_set_merge_time_median\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"Median latency for an Update Set operations during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"object_set_merge_time_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"object_set_merge_total\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"Total number of Update Set operations since node start\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"object_set_merge_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"operations\"},\"os_mon_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Erlang Operating System Monitor](http://erlang.org/doc/apps/os_mon/)\",\"example\":\"2.2.13\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"os_mon_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"pbc_active\":{\"category\":\"load\",\"concern\":\"core\",\"description\":\"Number of active Protocol Buffers connections\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"pbc_active\",\"period\":\"current\",\"scope\":\"node\",\"units\":\"connections\"},\"pbc_connects\":{\"category\":\"load\",\"concern\":\"core\",\"description\":\"Number of Protocol Buffers connections made in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"pbc_connects\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"connections\"},\"pbc_connects_total\":{\"category\":\"load\",\"concern\":\"core\",\"description\":\"Total number of Protocol Buffers connections made\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"pbc_connects_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"connections\"},\"pbkdf2_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"\",\"example\":\"2.0.0-0-g7076584\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"pbkdf2_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"pipeline_active\":{\"category\":\"load\",\"concern\":\"map/reduce\",\"description\":\"The number of Map/Reduce pipelines active in the last 60 seconds\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"pipeline_active\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"pipelines\"},\"pipeline_create_count\":{\"category\":\"load\",\"concern\":\"map/reduce\",\"description\":\"The total number of Map/Reduce pipelines created since the node was started\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"pipeline_create_count\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"pipelines\"},\"pipeline_create_error_count\":{\"category\":\"errors\",\"concern\":\"map/reduce\",\"description\":\"The total number of Map/Reduce pipeline creation errors since the node was started\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"pipeline_create_error_count\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"errors\"},\"pipeline_create_error_one\":{\"category\":\"errors\",\"concern\":\"map/reduce\",\"description\":\"The number of Map/Reduce pipeline creation errors in the last 60 seconds\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"pipeline_create_error_one\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"errors\"},\"pipeline_create_one\":{\"category\":\"load\",\"concern\":\"map/reduce\",\"description\":\"The number of Map/Reduce pipelines created in the last 60 seconds\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"pipeline_create_one\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"pipelines\"},\"poolboy_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"\",\"example\":\"0.8.1p3-0-g8bb45fb\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"poolboy_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"postcommit_fail\":{\"category\":\"errors\",\"concern\":\"kv\",\"description\":\"Total number of post-commit hook failures\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"postcommit_fail\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"failures\"},\"precommit_fail\":{\"category\":\"errors\",\"concern\":\"kv\",\"description\":\"Total number of pre-commit hook failures\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"precommit_fail\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"failures\"},\"protobuffs_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"\",\"example\":\"0.8.1p5-0-gf88fc3c\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"protobuffs_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"public_key_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Erlang Public Key](http://erlang.org/doc/apps/public_key/)\",\"example\":\"0.2\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"public_key_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"read_repairs\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Number of read repair operations this node has coordinated in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"read_repairs\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"repairs\"},\"read_repairs_counter\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"read_repairs_counter\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"repairs\"},\"read_repairs_counter_total\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"read_repairs_counter_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"repairs\"},\"read_repairs_fallback_notfound_count\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Total number of read repair operations performed on fallback vnodes due to missing replicas\",\"example\":\"undefined\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"read_repairs_fallback_notfound_count\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"repairs\"},\"read_repairs_fallback_notfound_one\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Number of read repair operations performed on fallback vnodes in the last minute due to missing replicas\",\"example\":\"undefined\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"read_repairs_fallback_notfound_one\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"repairs\"},\"read_repairs_fallback_outofdate_count\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Total number of read repair operations performed on fallback vnodes due to stale replicas\",\"example\":\"undefined\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"read_repairs_fallback_outofdate_count\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"repairs\"},\"read_repairs_fallback_outofdate_one\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Number of read repair operations performed on fallback vnodes in the last minute due to stale replicas\",\"example\":\"undefined\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"read_repairs_fallback_outofdate_one\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"repairs\"},\"read_repairs_map\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"read_repairs_map\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"repairs\"},\"read_repairs_map_total\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"read_repairs_map_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"repairs\"},\"read_repairs_primary_notfound_count\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Total number of read repair operations performed on primary vnodes due to missing replicas\",\"example\":\"undefined\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"read_repairs_primary_notfound_count\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"repairs\"},\"read_repairs_primary_notfound_one\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Number of read repair operations performed on primary vnodes in the last minute due to missing replicas\",\"example\":\"undefined\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"read_repairs_primary_notfound_one\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"repairs\"},\"read_repairs_primary_outofdate_count\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Total number of read repair operations performed on primary vnodes due to stale replicas\",\"example\":\"undefined\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"read_repairs_primary_outofdate_count\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"repairs\"},\"read_repairs_primary_outofdate_one\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Number of read repair operations performed on primary vnodes in the last minute due to stale replicas\",\"example\":\"undefined\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"read_repairs_primary_outofdate_one\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"repairs\"},\"read_repairs_set\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"read_repairs_set\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"repairs\"},\"read_repairs_set_total\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"read_repairs_set_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"repairs\"},\"read_repairs_total\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Total number of Read Repairs this node has coordinated\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"read_repairs_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"repairs\"},\"rebalance_delay_last\":{\"category\":\"ring activity\",\"concern\":\"kv\",\"description\":\"Last observed histogram value in milliseconds describing time taken for the ring to converge after ring changes\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"rebalance_delay_last\",\"period\":\"?\",\"scope\":\"node\",\"units\":\"milliseconds\"},\"rebalance_delay_max\":{\"category\":\"ring activity\",\"concern\":\"kv\",\"description\":\"Maximum time in milliseconds taken to calculate partition rebalance during a cluster membership change\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"rebalance_delay_max\",\"period\":\"?\",\"scope\":\"node\",\"units\":\"milliseconds\"},\"rebalance_delay_mean\":{\"category\":\"ring activity\",\"concern\":\"kv\",\"description\":\"Mean time in milliseconds describing time taken for the ring to converge after ring changes\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"rebalance_delay_mean\",\"period\":\"?\",\"scope\":\"node\",\"units\":\"milliseconds\"},\"rebalance_delay_min\":{\"category\":\"ring activity\",\"concern\":\"kv\",\"description\":\"Minimum time in milliseconds taken to calculate partition rebalance during a cluster membership change\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"rebalance_delay_min\",\"period\":\"?\",\"scope\":\"node\",\"units\":\"milliseconds\"},\"rejected_handoffs\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Total number of ownership handoff operations rejected by the node since it was started\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"rejected_handoffs\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"rejections\"},\"riak_api_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Riak API](http://github.com/basho/riak_api)\",\"example\":\"2.1.2-0-gd8d510f\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"riak_api_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"riak_auth_mods_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"\",\"example\":\"2.1.0-0-g31b8b30\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"riak_auth_mods_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"riak_control_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Riak Control](http://github.com/basho/riak_control)\",\"example\":\"2.1.2-0-gab3f924\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"riak_control_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"riak_core_stat_ts\":{\"category\":\"meta\",\"concern\":\"core\",\"description\":\"The last time (in Epoch time) Riak Core stats were generated\",\"example\":\"\",\"json_schema_type\":\"string\",\"metric_type\":\"summary\",\"name\":\"riak_core_stat_ts\",\"period\":\"current\",\"scope\":\"node\",\"units\":\"n/a\"},\"riak_core_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Riak Core](http://github.com/basho/riak_core)\",\"example\":\"2.1.5-0-gb02ab53\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"riak_core_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"riak_dt_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"\",\"example\":\"2.1.1-0-ga2986bc\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"riak_dt_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"riak_kv_stat_ts\":{\"category\":\"meta\",\"concern\":\"core\",\"description\":\"The last time Riak KV stats were generated.\",\"example\":\"\",\"json_schema_type\":\"string\",\"metric_type\":\"summary\",\"name\":\"riak_kv_stat_ts\",\"period\":\"current\",\"scope\":\"node\",\"units\":\"n/a\"},\"riak_kv_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Riak KV](http://github.com/basho/riak_kv)\",\"example\":\"2.1.2-0-gf969bba\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"riak_kv_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"riak_kv_vnodeq_max\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Max queue size of all local Riak KV virtual nodes in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"riak_kv_vnodeq_max\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"queue size\"},\"riak_kv_vnodeq_mean\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Mean queue size of all local Riak KV virtual nodes in the last minute\",\"example\":\"0.0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"riak_kv_vnodeq_mean\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"queue size\"},\"riak_kv_vnodeq_median\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Median queue size of all local Riak KV virtual nodes in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"riak_kv_vnodeq_median\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"queue size\"},\"riak_kv_vnodeq_min\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Minimum queue size of all local Riak KV virtual nodes in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"riak_kv_vnodeq_min\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"queue size\"},\"riak_kv_vnodeq_total\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Total queue size of all local Riak KV virtual nodes in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"riak_kv_vnodeq_total\",\"period\":\"since start\",\"scope\":\"vnode\",\"units\":\"queue size\"},\"riak_kv_vnodes_running\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"Number of local Riak KV virtual nodes running\",\"example\":\"64\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"riak_kv_vnodes_running\",\"period\":\"current\",\"scope\":\"vnode\",\"units\":\"queue size\"},\"riak_pb_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"\",\"example\":\"2.1.0.2-0-g620bc70\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"riak_pb_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"riak_pipe_stat_ts\":{\"category\":\"meta\",\"concern\":\"core\",\"description\":\"The last time Riak Pipe stats were generated.\",\"example\":\"\",\"json_schema_type\":\"string\",\"metric_type\":\"summary\",\"name\":\"riak_pipe_stat_ts\",\"period\":\"current\",\"scope\":\"node\",\"units\":\"n/a\"},\"riak_pipe_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Riak Pipe](http://github.com/basho/riak_pipe)\",\"example\":\"2.1.1-0-gb1ac2cf\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"riak_pipe_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"riak_pipe_vnodeq_max\":{\"category\":\"load\",\"concern\":\"core\",\"description\":\"Max queue size of local Riak Pipe virtual nodes in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"riak_pipe_vnodeq_max\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"queue size\"},\"riak_pipe_vnodeq_mean\":{\"category\":\"load\",\"concern\":\"core\",\"description\":\"Mean queue size of local Riak Pipe virtual nodes in the last minute\",\"example\":\"0.0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"riak_pipe_vnodeq_mean\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"queue size\"},\"riak_pipe_vnodeq_median\":{\"category\":\"load\",\"concern\":\"core\",\"description\":\"Median queue size of local Riak Pipe virtual nodes in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"riak_pipe_vnodeq_median\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"queue size\"},\"riak_pipe_vnodeq_min\":{\"category\":\"load\",\"concern\":\"core\",\"description\":\"Minimum queue size of local Riak Pipe virtual nodes in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"riak_pipe_vnodeq_min\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"queue size\"},\"riak_pipe_vnodeq_total\":{\"category\":\"load\",\"concern\":\"core\",\"description\":\"Total queue size of all local Riak Pipe virtual nodes in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"riak_pipe_vnodeq_total\",\"period\":\"since start\",\"scope\":\"vnode\",\"units\":\"queue size\"},\"riak_pipe_vnodes_running\":{\"category\":\"load\",\"concern\":\"core\",\"description\":\"Number of local Riak Pipe virtual nodes running\",\"example\":\"64\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"riak_pipe_vnodes_running\",\"period\":\"current\",\"scope\":\"vnode\",\"units\":\"vnodes\"},\"riak_search_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Riak Search](http://github.com/basho/riak_search)\",\"example\":\"2.1.1-0-gffe2113\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"riak_search_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"riak_search_vnodeq_max\":{\"category\":\"load\",\"concern\":\"search\",\"description\":\"Maximum number of unprocessed messages all virtual node (vnode) message queues in the Riak Search subsystem have received on this node in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"riak_search_vnodeq_max\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"messages\"},\"riak_search_vnodeq_mean\":{\"category\":\"load\",\"concern\":\"search\",\"description\":\"Mean number of unprocessed messages all vnode message queues in the Riak Search subsystem have received on this node in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"riak_search_vnodeq_mean\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"messages\"},\"riak_search_vnodeq_median\":{\"category\":\"load\",\"concern\":\"search\",\"description\":\"Median number of unprocessed messages all vnode message queues in the Riak Search subsystem have received on this node in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"riak_search_vnodeq_median\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"messages\"},\"riak_search_vnodeq_min\":{\"category\":\"load\",\"concern\":\"search\",\"description\":\"Minimum number of unprocessed messages all vnode message queues in the Riak Search subsystem have received on this node in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"riak_search_vnodeq_min\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"messages\"},\"riak_search_vnodeq_total\":{\"category\":\"load\",\"concern\":\"search\",\"description\":\"Total number of unprocessed messages all vnode message queues in the Riak Search subsystem have received on this node since it was started\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"riak_search_vnodeq_total\",\"period\":\"since start\",\"scope\":\"vnode\",\"units\":\"messages\"},\"riak_search_vnodes_running\":{\"category\":\"load\",\"concern\":\"search\",\"description\":\"Total number of vnodes currently running in the Riak Search subsystem\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"riak_search_vnodes_running\",\"period\":\"current\",\"scope\":\"vnode\",\"units\":\"vnodes\"},\"riak_sysmon_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Riak System Monitor](http://github.com/basho/riak_sysmon)\",\"example\":\"2.0.0\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"riak_sysmon_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"ring_creation_size\":{\"category\":\"cluster state\",\"concern\":\"core\",\"description\":\"Ring size this cluster was created with\",\"example\":\"64\",\"json_schema_type\":\"number\",\"metric_type\":\"nominal\",\"name\":\"ring_creation_size\",\"period\":\"since start\",\"scope\":\"cluster\",\"units\":\"n/a\"},\"ring_members\":{\"category\":\"cluster state\",\"concern\":\"core\",\"description\":\"List of nodes that are members of the ring\",\"example\":\"['riak@127.0.0.1']\",\"json_schema_type\":\"array\",\"metric_type\":\"nominal\",\"name\":\"ring_members\",\"period\":\"current\",\"scope\":\"cluster\",\"units\":\"n/a\"},\"ring_num_partitions\":{\"category\":\"cluster state\",\"concern\":\"core\",\"description\":\"The number of partitions in the ring\",\"example\":\"64\",\"json_schema_type\":\"number\",\"metric_type\":\"nominal\",\"name\":\"ring_num_partitions\",\"period\":\"current\",\"scope\":\"cluster\",\"units\":\"n/a\"},\"ring_ownership\":{\"category\":\"cluster state\",\"concern\":\"core\",\"description\":\"List of all nodes in the ring and their associated partition ownership\",\"example\":\"[{'riak@127.0.0.1', 64}]\",\"json_schema_type\":\"array\",\"metric_type\":\"nominal\",\"name\":\"ring_ownership\",\"period\":\"current\",\"scope\":\"cluster\",\"units\":\"n/a\"},\"rings_reconciled\":{\"category\":\"ring activity\",\"concern\":\"core\",\"description\":\"Number of ring reconciliation operations in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"rings_reconciled\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"rings_reconciled_total\":{\"category\":\"ring activity\",\"concern\":\"core\",\"description\":\"Total number of ring reconciliation operations since node was started\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"rings_reconciled_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"operations\"},\"runtime_tools_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Erlang Runtime Tools](http://erlang.org/doc/apps/runtime_tools/)\",\"example\":\"1.8.12\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"runtime_tools_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"sasl_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[SASL](http://erlang.org/doc/apps/sasl/)\",\"example\":\"2.3.3\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"sasl_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"search_index_fail_count\":{\"category\":\"errors\",\"concern\":\"search\",\"description\":\"Total number of 'Failed to index document' errors encountered by Search since node start\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"search_index_fail_count\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"failures\"},\"search_index_fail_one\":{\"category\":\"errors\",\"concern\":\"search\",\"description\":\"Number of 'Failed to index document' errors encountered by Search during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"search_index_fail_one\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"failures\"},\"search_index_latency_95\":{\"category\":\"latency\",\"concern\":\"search\",\"description\":\"95th-percentile Search document indexing latency during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"search_index_latency_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"search_index_latency_99\":{\"category\":\"latency\",\"concern\":\"search\",\"description\":\"99th-percentile Search document indexing latency during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"search_index_latency_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"search_index_latency_999\":{\"category\":\"latency\",\"concern\":\"search\",\"description\":\"999th-percentile Search document indexing latency during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"search_index_latency_999\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"search_index_latency_max\":{\"category\":\"latency\",\"concern\":\"search\",\"description\":\"Max Search document indexing latency during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"search_index_latency_max\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"search_index_latency_mean\":{\"category\":\"latency\",\"concern\":\"search\",\"description\":\"Mean Search document indexing latency during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"search_index_latency_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"search_index_latency_median\":{\"category\":\"latency\",\"concern\":\"search\",\"description\":\"Median Search document indexing latency during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"search_index_latency_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"search_index_latency_min\":{\"category\":\"latency\",\"concern\":\"search\",\"description\":\"Min Search document indexing latency during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"search_index_latency_min\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"search_index_throughput_count\":{\"category\":\"throughput - search\",\"concern\":\"search\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"search_index_throughput_count\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"operations\"},\"search_index_throughput_one\":{\"category\":\"throughput - search\",\"concern\":\"search\",\"description\":\"Number of documents indexed by Search during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"search_index_throughput_one\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"search_query_fail_count\":{\"category\":\"errors\",\"concern\":\"search\",\"description\":\"Total number of failed Search queries since node start\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"search_query_fail_count\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"failures\"},\"search_query_fail_one\":{\"category\":\"errors\",\"concern\":\"search\",\"description\":\"Number of failed Search queries during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"search_query_fail_one\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"failures\"},\"search_query_latency_95\":{\"category\":\"latency\",\"concern\":\"search\",\"description\":\"95th-percentile Search query latency during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"search_query_latency_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"search_query_latency_99\":{\"category\":\"latency\",\"concern\":\"search\",\"description\":\"99th-percentile Search query latency during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"search_query_latency_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"search_query_latency_999\":{\"category\":\"latency\",\"concern\":\"search\",\"description\":\"999th-percentile Search query latency during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"search_query_latency_999\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"search_query_latency_max\":{\"category\":\"latency\",\"concern\":\"search\",\"description\":\"Max Search query latency during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"search_query_latency_max\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"search_query_latency_mean\":{\"category\":\"latency\",\"concern\":\"search\",\"description\":\"Mean Search query latency during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"search_query_latency_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"search_query_latency_median\":{\"category\":\"latency\",\"concern\":\"search\",\"description\":\"Median Search query latency during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"search_query_latency_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"search_query_latency_min\":{\"category\":\"latency\",\"concern\":\"search\",\"description\":\"Min Search query latency during the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"search_query_latency_min\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"search_query_throughput_count\":{\"category\":\"throughput - search\",\"concern\":\"search\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"search_query_throughput_count\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"operations\"},\"search_query_throughput_one\":{\"category\":\"throughput - search\",\"concern\":\"search\",\"description\":\"Search queries on the node\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"search_query_throughput_one\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"set_actor_counts_100\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"set_actor_counts_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"counts\"},\"set_actor_counts_95\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"set_actor_counts_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"counts\"},\"set_actor_counts_99\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"set_actor_counts_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"counts\"},\"set_actor_counts_mean\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"set_actor_counts_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"counts\"},\"set_actor_counts_median\":{\"category\":\"load\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"set_actor_counts_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"counts\"},\"sidejob_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Sidejob](http://github.com/basho/sidejob)\",\"example\":\"2.0.0-0-gc5aabba\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"sidejob_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"skipped_read_repairs\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"skipped_read_repairs\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"repairs\"},\"skipped_read_repairs_total\":{\"category\":\"load\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"skipped_read_repairs_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"repairs\"},\"ssl_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Erlang Secure Sockets Layer (SSL)](http://erlang.org/doc/apps/ssl/)\",\"example\":\"5.3.1\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"ssl_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"stdlib_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Standard Library](http://erlang.org/doc/apps/stdlib/)\",\"example\":\"1.19.3\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"stdlib_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"storage_backend\":{\"category\":\"config\",\"concern\":\"config\",\"description\":\"The storage backend currently in use.\",\"example\":\"riak_kv_bitcask_backend\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"storage_backend\",\"period\":\"since start\",\"scope\":\"config\",\"units\":\"n/a\"},\"syntax_tools_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Erlang Syntax Tools](http://www.erlang.org/doc/apps/syntax_tools/)\",\"example\":\"1.6.11\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"syntax_tools_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"sys_driver_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"String representing the Erlang driver version in use by the runtime system\",\"example\":\"2.2\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"sys_driver_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"sys_global_heaps_size\":{\"category\":\"config\",\"concern\":\"config\",\"description\":\"Current size of the shared global heap\",\"example\":\"deprecated\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"sys_global_heaps_size\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"sys_heap_type\":{\"category\":\"config\",\"concern\":\"config\",\"description\":\"String representing the heap type in use (one of private, shared, hybrid)\",\"example\":\"private\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"sys_heap_type\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"sys_logical_processors\":{\"category\":\"config\",\"concern\":\"config\",\"description\":\"Number of logical processors available on the system\",\"example\":\"8\",\"json_schema_type\":\"number\",\"metric_type\":\"nominal\",\"name\":\"sys_logical_processors\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"sys_monitor_count\":{\"category\":\"config\",\"concern\":\"config\",\"description\":\"\",\"example\":\"504\",\"json_schema_type\":\"number\",\"metric_type\":\"nominal\",\"name\":\"sys_monitor_count\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"sys_otp_release\":{\"category\":\"config\",\"concern\":\"config\",\"description\":\"Erlang OTP release version in use on the node\",\"example\":\"R16B02_basho8\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"sys_otp_release\",\"period\":\"since start\",\"scope\":\"config\",\"units\":\"n/a\"},\"sys_port_count\":{\"category\":\"config\",\"concern\":\"config\",\"description\":\"\",\"example\":\"98\",\"json_schema_type\":\"number\",\"metric_type\":\"nominal\",\"name\":\"sys_port_count\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"sys_process_count\":{\"category\":\"load\",\"concern\":\"resources\",\"description\":\"Number of processes currently running in the Erlang VM\",\"example\":\"1666\",\"json_schema_type\":\"number\",\"metric_type\":\"nominal\",\"name\":\"sys_process_count\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"processes\"},\"sys_smp_support\":{\"category\":\"config\",\"concern\":\"config\",\"description\":\"Boolean value representing whether symmetric multi-processing (SMP) is available\",\"example\":\"true\",\"json_schema_type\":\"boolean\",\"metric_type\":\"nominal\",\"name\":\"sys_smp_support\",\"period\":\"since start\",\"scope\":\"config\",\"units\":\"n/a\"},\"sys_system_architecture\":{\"category\":\"config\",\"concern\":\"config\",\"description\":\"The node operating system and hardware architecture\",\"example\":\"x86_64-apple-darwin12.4.0\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"sys_system_architecture\",\"period\":\"since start\",\"scope\":\"config\",\"units\":\"n/a\"},\"sys_system_version\":{\"category\":\"config\",\"concern\":\"config\",\"description\":\"Detailed Erlang version information\",\"example\":\"Erlang R16B02_basho8 (erts-5.10.3) [source] [64-bit] [smp:8:8] [async-threads:64] [kernel-poll:true] [frame-pointer] [dtrace]\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"sys_system_version\",\"period\":\"since start\",\"scope\":\"config\",\"units\":\"n/a\"},\"sys_thread_pool_size\":{\"category\":\"config\",\"concern\":\"config\",\"description\":\"Number of threads in the asynchronous thread pool\",\"example\":\"64\",\"json_schema_type\":\"number\",\"metric_type\":\"nominal\",\"name\":\"sys_thread_pool_size\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"threads\"},\"sys_threads_enabled\":{\"category\":\"config\",\"concern\":\"config\",\"description\":\"Boolean value representing whether threads are enabled\",\"example\":\"true\",\"json_schema_type\":\"boolean\",\"metric_type\":\"nominal\",\"name\":\"sys_threads_enabled\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"sys_wordsize\":{\"category\":\"config\",\"concern\":\"config\",\"description\":\"Size of Erlang term words in bytes as an integer, for examples, on 32-bit architectures 4 is returned and on 64-bit architectures 8 is returned\",\"example\":\"8\",\"json_schema_type\":\"number\",\"metric_type\":\"nominal\",\"name\":\"sys_wordsize\",\"period\":\"since start\",\"scope\":\"config\",\"units\":\"bytes\"},\"vnode_counter_update\":{\"category\":\"config\",\"concern\":\"crdt\",\"description\":\"Counter Data Type update operations coordinated by local vnodes\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_counter_update\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_counter_update_time_100\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_counter_update_time_100\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_counter_update_time_95\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_counter_update_time_95\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_counter_update_time_99\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_counter_update_time_99\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_counter_update_time_mean\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_counter_update_time_mean\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_counter_update_time_median\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_counter_update_time_median\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_counter_update_total\":{\"category\":\"throughput - write\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"vnode_counter_update_total\",\"period\":\"since start\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_get_fsm_time_100\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_get_fsm_time_100\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_get_fsm_time_95\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_get_fsm_time_95\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_get_fsm_time_99\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_get_fsm_time_99\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_get_fsm_time_mean\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_get_fsm_time_mean\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_get_fsm_time_median\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_get_fsm_time_median\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_gets\":{\"category\":\"throughput - read\",\"concern\":\"kv\",\"description\":\"Number of GET operations coordinated by local vnodes on this node in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_gets\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_gets_total\":{\"category\":\"throughput - read\",\"concern\":\"kv\",\"description\":\"Total number of GETs coordinated by local vnodes\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"vnode_gets_total\",\"period\":\"since start\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_index_deletes\":{\"category\":\"throughput - 2i\",\"concern\":\"secondary_index\",\"description\":\"Number of local replicas participating in secondary index deletes in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_index_deletes\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_index_deletes_postings\":{\"category\":\"throughput - 2i\",\"concern\":\"secondary_index\",\"description\":\"Number of individual secondary index values deleted in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_index_deletes_postings\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_index_deletes_postings_total\":{\"category\":\"throughput - 2i\",\"concern\":\"secondary_index\",\"description\":\"Total number of individual secondary index values deleted\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"vnode_index_deletes_postings_total\",\"period\":\"since start\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_index_deletes_total\":{\"category\":\"throughput - 2i\",\"concern\":\"secondary_index\",\"description\":\"Total number of local replicas participating in secondary index deletes\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"vnode_index_deletes_total\",\"period\":\"since start\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_index_reads\":{\"category\":\"throughput - 2i\",\"concern\":\"secondary_index\",\"description\":\"Number of local replicas participating in secondary index reads\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_index_reads\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_index_reads_total\":{\"category\":\"throughput - 2i\",\"concern\":\"secondary_index\",\"description\":\"Total number of local replicas participating in secondary index reads\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"vnode_index_reads_total\",\"period\":\"since start\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_index_refreshes\":{\"category\":\"throughput - 2i\",\"concern\":\"secondary_index\",\"description\":\"Number of secondary indexes refreshed on this node during secondary index anti-entropy in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_index_refreshes\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_index_refreshes_total\":{\"category\":\"throughput - 2i\",\"concern\":\"secondary_index\",\"description\":\"Total number of indexes refreshed during secondary index anti-entropy\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"vnode_index_refreshes_total\",\"period\":\"since start\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_index_writes\":{\"category\":\"throughput - 2i\",\"concern\":\"secondary_index\",\"description\":\"Number of local replicas participating in secondary index writes in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_index_writes\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_index_writes_postings\":{\"category\":\"throughput - 2i\",\"concern\":\"secondary_index\",\"description\":\"Number of individual secondary index values written in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_index_writes_postings\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_index_writes_postings_total\":{\"category\":\"throughput - 2i\",\"concern\":\"secondary_index\",\"description\":\"Total number of individual secondary index values written\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"vnode_index_writes_postings_total\",\"period\":\"since start\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_index_writes_total\":{\"category\":\"throughput - 2i\",\"concern\":\"secondary_index\",\"description\":\"Total number of local replicas participating in secondary index writes\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"vnode_index_writes_total\",\"period\":\"since start\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_map_update\":{\"category\":\"throughput - write\",\"concern\":\"crdt\",\"description\":\"Map Data Type update operations coordinated by local vnodes\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_map_update\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_map_update_time_100\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_map_update_time_100\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_map_update_time_95\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_map_update_time_95\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_map_update_time_99\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_map_update_time_99\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_map_update_time_mean\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_map_update_time_mean\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_map_update_time_median\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_map_update_time_median\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_map_update_total\":{\"category\":\"throughput - write\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"vnode_map_update_total\",\"period\":\"since start\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_put_fsm_time_100\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_put_fsm_time_100\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_put_fsm_time_95\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_put_fsm_time_95\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_put_fsm_time_99\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_put_fsm_time_99\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_put_fsm_time_mean\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_put_fsm_time_mean\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_put_fsm_time_median\":{\"category\":\"latency\",\"concern\":\"kv\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_put_fsm_time_median\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_puts\":{\"category\":\"throughput - write\",\"concern\":\"kv\",\"description\":\"Number of PUT operations coordinated by local vnodes on this node in the last minute\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_puts\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_puts_total\":{\"category\":\"throughput - write\",\"concern\":\"kv\",\"description\":\"Total number of PUTS coordinated by local vnodes\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"vnode_puts_total\",\"period\":\"since start\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_set_update\":{\"category\":\"throughput - write\",\"concern\":\"crdt\",\"description\":\"Set Data Type update operations coordinated by local vnodes\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_set_update\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"operations\"},\"vnode_set_update_time_100\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_set_update_time_100\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_set_update_time_95\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_set_update_time_95\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_set_update_time_99\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_set_update_time_99\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_set_update_time_mean\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_set_update_time_mean\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_set_update_time_median\":{\"category\":\"latency\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"vnode_set_update_time_median\",\"period\":\"1 minute\",\"scope\":\"vnode\",\"units\":\"microseconds\"},\"vnode_set_update_total\":{\"category\":\"throughput - write\",\"concern\":\"crdt\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"vnode_set_update_total\",\"period\":\"since start\",\"scope\":\"vnode\",\"units\":\"operations\"},\"webmachine_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"[Webmachine](http://github.com/basho/webmachine)\",\"example\":\"1.10.8-0-g7677c24\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"webmachine_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"write_once_merge\":{\"category\":\"load\",\"concern\":\"write_once\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"write_once_merge\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"write_once_put_objsize_100\":{\"category\":\"object size\",\"concern\":\"write_once\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"write_once_put_objsize_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"write_once_put_objsize_95\":{\"category\":\"object size\",\"concern\":\"write_once\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"write_once_put_objsize_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"write_once_put_objsize_99\":{\"category\":\"object size\",\"concern\":\"write_once\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"write_once_put_objsize_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"write_once_put_objsize_mean\":{\"category\":\"object size\",\"concern\":\"write_once\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"write_once_put_objsize_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"write_once_put_objsize_median\":{\"category\":\"object size\",\"concern\":\"write_once\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"write_once_put_objsize_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"bytes\"},\"write_once_put_time_100\":{\"category\":\"latency\",\"concern\":\"write_once\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"write_once_put_time_100\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"write_once_put_time_95\":{\"category\":\"latency\",\"concern\":\"write_once\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"write_once_put_time_95\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"write_once_put_time_99\":{\"category\":\"latency\",\"concern\":\"write_once\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"write_once_put_time_99\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"write_once_put_time_mean\":{\"category\":\"latency\",\"concern\":\"write_once\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"write_once_put_time_mean\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"write_once_put_time_median\":{\"category\":\"latency\",\"concern\":\"write_once\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"write_once_put_time_median\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"microseconds\"},\"write_once_puts\":{\"category\":\"throughput - write\",\"concern\":\"write_once\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"interval\",\"name\":\"write_once_puts\",\"period\":\"1 minute\",\"scope\":\"node\",\"units\":\"operations\"},\"write_once_puts_total\":{\"category\":\"throughput - write\",\"concern\":\"write_once\",\"description\":\"\",\"example\":\"0\",\"json_schema_type\":\"number\",\"metric_type\":\"summary\",\"name\":\"write_once_puts_total\",\"period\":\"since start\",\"scope\":\"node\",\"units\":\"operations\"},\"xmerl_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"\",\"example\":\"1.3.4\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"xmerl_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"},\"yokozuna_version\":{\"category\":\"versions\",\"concern\":\"config\",\"description\":\"\",\"example\":\"2.1.2-0-g3520d11\",\"json_schema_type\":\"string\",\"metric_type\":\"nominal\",\"name\":\"yokozuna_version\",\"period\":\"current\",\"scope\":\"config\",\"units\":\"n/a\"}};});","define('ember-riak-explorer/utils/riak-object-formatter', ['exports'], function (exports) {\n exports.formatNewMap = formatNewMap;\n exports.formatRiakObject = formatRiakObject;\n\n function formatNewMap(map) {\n var formatted = { \"update\": {} };\n\n Object.keys(map).forEach(function (key) {\n switch (true) {\n case key.endsWith('_counter'):\n case key.endsWith('_register'):\n formatted.update[key] = map[key];\n break;\n case key.endsWith('_flag'):\n formatted.update[key] = map[key] ? \"enable\" : \"disable\";\n break;\n case key.endsWith('_set'):\n formatted.update[key] = { \"add_all\": map[key] };\n break;\n case key.endsWith('_map'):\n // recursively call this function again\n formatted.update[key] = formatNewMap(map[key]);\n break;\n default:\n break;\n }\n });\n\n return formatted;\n }\n\n function formatRiakObject(type, value) {\n var formatted = {};\n\n switch (type) {\n case 'Counter':\n formatted[\"increment\"] = value;\n break;\n case 'Set':\n case 'HyperLogLog':\n formatted[\"add_all\"] = value;\n break;\n case 'Map':\n formatted = formatNewMap(value);\n break;\n }\n\n return formatted;\n }\n});","define(\"ember-riak-explorer/utils/string-helpers\", [\"exports\"], function (exports) {\n exports[\"default\"] = insert;\n // function inserts the string value (third parameter) before the specified integer index (second parameter) in the\n // string str (first parameter), and then returns the new string without changing str!\n // i.e insert(\"foo baz\", 4, \"bar \") => \"foo bar baz\";\n\n function insert(str, index, value) {\n return str.substr(0, index) + value + str.substr(index);\n }\n});","define('ember-riak-explorer/utils/validations', ['exports', 'ember', 'lodash/lodash'], function (exports, _ember, _lodashLodash) {\n\n var Validations = {\n // Arrays\n isUniqueArrayItem: function isUniqueArrayItem(array, item) {\n return _ember['default'].isPresent(item) && _lodashLodash['default'].indexOf(array, item) === -1;\n },\n\n itemExistsInArray: function itemExistsInArray(array, item) {\n return _lodashLodash['default'].indexOf(array, item) > -1;\n },\n\n // Strings\n containsWhiteSpace: function containsWhiteSpace(string) {\n return string.indexOf(' ') >= 0;\n },\n\n noWhiteSpace: function noWhiteSpace(string) {\n return !Validations.containsWhiteSpace(string);\n },\n\n isJsonParseable: function isJsonParseable(string) {\n var isJSON = undefined;\n var stringWithSingleQuotesReplacedWithDouble = string.replace(/'/g, '\"');\n\n try {\n isJSON = JSON.parse(stringWithSingleQuotesReplacedWithDouble);\n } catch (e) {\n throw new Error('Invalid JSON, must be parseable. You can lint your JSON at JSONLint .');\n }\n\n return isJSON;\n },\n\n // Resources (Cluster, BucketType, Bucket, Object)\n hasName: function hasName(resourceType, name) {\n var hasName = _ember['default'].isPresent(name);\n\n if (!hasName) {\n throw new Error('The ' + resourceType + ' must be given a name.');\n }\n\n return hasName;\n },\n\n noWhiteSpaceInName: function noWhiteSpaceInName(resourceType, name) {\n var noWhiteSpace = Validations.noWhiteSpace(name);\n\n if (!noWhiteSpace) {\n throw new Error('The ' + resourceType + ' name can not contain any whitespace.');\n }\n\n return noWhiteSpace;\n },\n\n // Objects\n isObject: function isObject(data) {\n var isObject = _lodashLodash['default'].isPlainObject(data);\n\n if (!isObject) {\n throw new Error('Data provided is not a javascript object.');\n }\n\n return isObject;\n },\n\n // Map CRDTs\n mapKeyHasCorrectNameEndingAndValue: function mapKeyHasCorrectNameEndingAndValue(key, value) {\n var objectHasCorrectValue = Validations.objectHasCorrectValueType;\n var valid = undefined;\n\n switch (true) {\n case key.endsWith('_counter'):\n valid = objectHasCorrectValue('Counter', key, value);\n break;\n case key.endsWith('_register'):\n valid = objectHasCorrectValue('Register', key, value);\n break;\n case key.endsWith('_flag'):\n valid = objectHasCorrectValue('Flag', key, value);\n break;\n case key.endsWith('_set'):\n valid = objectHasCorrectValue('Set', key, value);\n break;\n case key.endsWith('_map'):\n valid = objectHasCorrectValue('Map', key, value);\n break;\n default:\n valid = false;\n throw new Error('The \"' + key + '\" property is not named correctly. The property must end with \\'_counter\\', \\'_register\\', \\'_flag\\', \\'_set\\', or \\'_map\\' based on the desired type.');\n }\n\n return valid;\n },\n\n mapHasCorrectKeyNameEndingsAndValues: function mapHasCorrectKeyNameEndingsAndValues(map) {\n var hasCorrectEnding = Validations.mapKeyHasCorrectNameEndingAndValue;\n\n var invalidKeys = Object.keys(map).filter(function (key) {\n return !hasCorrectEnding(key, map[key]);\n });\n\n return _ember['default'].isEmpty(invalidKeys);\n },\n\n // Set CRDT's\n setHasCorrectValues: function setHasCorrectValues(setName, array) {\n return _ember['default'].isEmpty(array.filter(function (item) {\n var validItem = _lodashLodash['default'].isString(item);\n\n if (!validItem) {\n throw new Error('All items in the \"' + setName + '\" array must be string values');\n }\n\n return !validItem; // Filter is finding non valid items, so remove any valid items\n }));\n },\n\n // CRDT's\n objectHasCorrectValueType: function objectHasCorrectValueType(type, objectName, value) {\n var valid = undefined;\n\n switch (type) {\n case 'Counter':\n valid = _lodashLodash['default'].isNumber(value);\n break;\n case 'Register':\n valid = _lodashLodash['default'].isString(value);\n break;\n case 'Flag':\n valid = _lodashLodash['default'].isBoolean(value);\n break;\n case 'Set':\n case 'HyperLogLog':\n valid = _lodashLodash['default'].isArray(value) && Validations.setHasCorrectValues(objectName, value);\n break;\n case 'Map':\n valid = _lodashLodash['default'].isPlainObject(value) && Validations.mapHasCorrectKeyNameEndingsAndValues(value);\n break;\n default:\n valid = _lodashLodash['default'].isPlainObject(value);\n break;\n }\n\n if (!valid) {\n throw new Error(Validations.errorMessageForType(type, objectName));\n }\n\n return valid;\n },\n\n errorMessageForType: function errorMessageForType(type, objectName) {\n var message = undefined;\n\n switch (type) {\n case 'Counter':\n message = 'The value of \"' + objectName + '\" must be a number.';\n break;\n case 'Register':\n message = 'The value of \"' + objectName + '\" must be a string.';\n break;\n case 'Flag':\n message = 'The value of \"' + objectName + '\" must be a boolean.';\n break;\n case 'Set':\n message = 'The value of \"' + objectName + '\" must be an array.';\n break;\n case 'Map':\n message = 'The value of \"' + objectName + '\" must be a javascript object.';\n break;\n default:\n message = 'The value of \"' + objectName + '\" is incorrect, please check the input to make sure it is the correct type';\n }\n\n return message;\n }\n };\n\n exports['default'] = Validations;\n});","/* jshint ignore:start */\n\n\n\n/* jshint ignore:end */\n","/* jshint ignore:start */\n\ndefine('ember-riak-explorer/config/environment', ['ember'], function(Ember) {\n var prefix = 'ember-riak-explorer';\n/* jshint ignore:start */\n\ntry {\n var metaName = prefix + '/config/environment';\n var rawConfig = Ember['default'].$('meta[name=\"' + metaName + '\"]').attr('content');\n var config = JSON.parse(unescape(rawConfig));\n\n return { 'default': config };\n}\ncatch(err) {\n throw new Error('Could not read config from meta tag with name \"' + metaName + '\".');\n}\n\n/* jshint ignore:end */\n\n});\n\n/* jshint ignore:end */\n","/* jshint ignore:start */\n\nif (!runningTests) {\n require(\"ember-riak-explorer/app\")[\"default\"].create({\"name\":\"ember-riak-explorer\",\"version\":\"0.2.0+e5fff7ee\"});\n}\n\n/* jshint ignore:end */\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;ACvHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;ACvHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/LA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC5BA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;;ACHA;AACA;;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;;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;;ACDA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC9IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1jBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChwDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3yCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpyDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClQA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AClJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5jDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;;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;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrcA;AACA;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9VA;AACA;;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;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACndA;AACA;;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;;ACjUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;;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;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjkCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzyBA;AACA;;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;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACppCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;;ACDA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;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;;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;;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;;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;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7MA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzPA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;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;;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1nBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACr7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxjCA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClLA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;","file":"ember-riak-explorer.js"}
\ No newline at end of file
diff --git a/priv/ember_riak_explorer/dist/assets/failed.png b/priv/ember_riak_explorer/dist/assets/failed.png
new file mode 100644
index 0000000..37e8870
Binary files /dev/null and b/priv/ember_riak_explorer/dist/assets/failed.png differ
diff --git a/priv/ember_riak_explorer/dist/assets/images/ajax-loading-big.gif b/priv/ember_riak_explorer/dist/assets/images/ajax-loading-big.gif
new file mode 100644
index 0000000..2cf0d86
Binary files /dev/null and b/priv/ember_riak_explorer/dist/assets/images/ajax-loading-big.gif differ
diff --git a/priv/ember_riak_explorer/dist/assets/images/riak.png b/priv/ember_riak_explorer/dist/assets/images/riak.png
new file mode 100644
index 0000000..38953a0
Binary files /dev/null and b/priv/ember_riak_explorer/dist/assets/images/riak.png differ
diff --git a/priv/ember_riak_explorer/dist/assets/images/sample_logo.png b/priv/ember_riak_explorer/dist/assets/images/sample_logo.png
new file mode 100644
index 0000000..6138dc7
Binary files /dev/null and b/priv/ember_riak_explorer/dist/assets/images/sample_logo.png differ
diff --git a/priv/ember_riak_explorer/dist/assets/passed.png b/priv/ember_riak_explorer/dist/assets/passed.png
new file mode 100644
index 0000000..d4e4fca
Binary files /dev/null and b/priv/ember_riak_explorer/dist/assets/passed.png differ
diff --git a/priv/ember_riak_explorer/dist/assets/test-loader.js b/priv/ember_riak_explorer/dist/assets/test-loader.js
new file mode 100644
index 0000000..6243a6e
--- /dev/null
+++ b/priv/ember_riak_explorer/dist/assets/test-loader.js
@@ -0,0 +1,99 @@
+/* globals requirejs, require */
+(function() {
+define("ember-cli/test-loader",
+ [],
+ function() {
+ "use strict";
+
+ var moduleIncludeMatchers = [];
+ var moduleExcludeMatchers = [];
+
+ function addModuleIncludeMatcher(fn) {
+ moduleIncludeMatchers.push(fn);
+ };
+
+ function addModuleExcludeMatcher(fn) {
+ moduleExcludeMatchers.push(fn);
+ };
+
+ function checkMatchers(matchers, moduleName) {
+ var matcher;
+
+ for (var i = 0, l = matchers.length; i < l; i++) {
+ matcher = matchers[i];
+
+ if (matcher(moduleName)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ function TestLoader() {
+ this._didLogMissingUnsee = false;
+ };
+
+ TestLoader.prototype = {
+ shouldLoadModule: function(moduleName) {
+ return (moduleName.match(/[-_]test$/));
+ },
+
+ listModules: function() {
+ return Object.keys(requirejs.entries);
+ },
+
+ loadModules: function() {
+ var moduleName, index, length;
+ var moduleNames = this.listModules();
+
+ for (index = 0, length = moduleNames.length; index < length; index++) {
+ moduleName = moduleNames[index];
+
+ if (checkMatchers(moduleExcludeMatchers, moduleName)) {
+ continue;
+ }
+
+ if (checkMatchers(moduleIncludeMatchers, moduleName) || this.shouldLoadModule(moduleName)) {
+ this.require(moduleName);
+ this.unsee(moduleName);
+ }
+ }
+ }
+ };
+
+ TestLoader.prototype.require = function(moduleName) {
+ try {
+ require(moduleName);
+ } catch(e) {
+ this.moduleLoadFailure(moduleName, e);
+ }
+ };
+
+ TestLoader.prototype.unsee = function(moduleName) {
+ if (typeof require.unsee === 'function') {
+ require.unsee(moduleName);
+ } else if (!this._didLogMissingUnsee) {
+ this._didLogMissingUnsee = true;
+ if (typeof console !== 'undefined') {
+ console.warn('unable to require.unsee, please upgrade loader.js to >= v3.3.0');
+ }
+ }
+ };
+
+ TestLoader.prototype.moduleLoadFailure = function(moduleName, error) {
+ console.error('Error loading: ' + moduleName, error.stack);
+ };
+
+ TestLoader.load = function() {
+ new TestLoader().loadModules();
+ };
+
+ return {
+ 'default': TestLoader,
+ addModuleIncludeMatcher: addModuleIncludeMatcher,
+ addModuleExcludeMatcher: addModuleExcludeMatcher
+ };
+ }
+);
+})();
diff --git a/priv/ember_riak_explorer/dist/assets/test-support.css b/priv/ember_riak_explorer/dist/assets/test-support.css
new file mode 100644
index 0000000..8eb2e31
--- /dev/null
+++ b/priv/ember_riak_explorer/dist/assets/test-support.css
@@ -0,0 +1,321 @@
+/*!
+ * QUnit 1.23.1
+ * https://qunitjs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2016-04-12T17:29Z
+ */
+
+/** Font Family and Sizes */
+
+#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult {
+ font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
+}
+
+#qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
+#qunit-tests { font-size: smaller; }
+
+
+/** Resets */
+
+#qunit-tests, #qunit-header, #qunit-banner, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
+ margin: 0;
+ padding: 0;
+}
+
+
+/** Header */
+
+#qunit-header {
+ padding: 0.5em 0 0.5em 1em;
+
+ color: #8699A4;
+ background-color: #0D3349;
+
+ font-size: 1.5em;
+ line-height: 1em;
+ font-weight: 400;
+
+ border-radius: 5px 5px 0 0;
+}
+
+#qunit-header a {
+ text-decoration: none;
+ color: #C2CCD1;
+}
+
+#qunit-header a:hover,
+#qunit-header a:focus {
+ color: #FFF;
+}
+
+#qunit-testrunner-toolbar label {
+ display: inline-block;
+ padding: 0 0.5em 0 0.1em;
+}
+
+#qunit-banner {
+ height: 5px;
+}
+
+#qunit-testrunner-toolbar {
+ padding: 0.5em 1em 0.5em 1em;
+ color: #5E740B;
+ background-color: #EEE;
+ overflow: hidden;
+}
+
+#qunit-filteredTest {
+ padding: 0.5em 1em 0.5em 1em;
+ background-color: #F4FF77;
+ color: #366097;
+}
+
+#qunit-userAgent {
+ padding: 0.5em 1em 0.5em 1em;
+ background-color: #2B81AF;
+ color: #FFF;
+ text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
+}
+
+#qunit-modulefilter-container {
+ float: right;
+ padding: 0.2em;
+}
+
+.qunit-url-config {
+ display: inline-block;
+ padding: 0.1em;
+}
+
+.qunit-filter {
+ display: block;
+ float: right;
+ margin-left: 1em;
+}
+
+/** Tests: Pass/Fail */
+
+#qunit-tests {
+ list-style-position: inside;
+}
+
+#qunit-tests li {
+ padding: 0.4em 1em 0.4em 1em;
+ border-bottom: 1px solid #FFF;
+ list-style-position: inside;
+}
+
+#qunit-tests > li {
+ display: none;
+}
+
+#qunit-tests li.running,
+#qunit-tests li.pass,
+#qunit-tests li.fail,
+#qunit-tests li.skipped {
+ display: list-item;
+}
+
+#qunit-tests.hidepass {
+ position: relative;
+}
+
+#qunit-tests.hidepass li.running,
+#qunit-tests.hidepass li.pass {
+ visibility: hidden;
+ position: absolute;
+ width: 0;
+ height: 0;
+ padding: 0;
+ border: 0;
+ margin: 0;
+}
+
+#qunit-tests li strong {
+ cursor: pointer;
+}
+
+#qunit-tests li.skipped strong {
+ cursor: default;
+}
+
+#qunit-tests li a {
+ padding: 0.5em;
+ color: #C2CCD1;
+ text-decoration: none;
+}
+
+#qunit-tests li p a {
+ padding: 0.25em;
+ color: #6B6464;
+}
+#qunit-tests li a:hover,
+#qunit-tests li a:focus {
+ color: #000;
+}
+
+#qunit-tests li .runtime {
+ float: right;
+ font-size: smaller;
+}
+
+.qunit-assert-list {
+ margin-top: 0.5em;
+ padding: 0.5em;
+
+ background-color: #FFF;
+
+ border-radius: 5px;
+}
+
+.qunit-source {
+ margin: 0.6em 0 0.3em;
+}
+
+.qunit-collapsed {
+ display: none;
+}
+
+#qunit-tests table {
+ border-collapse: collapse;
+ margin-top: 0.2em;
+}
+
+#qunit-tests th {
+ text-align: right;
+ vertical-align: top;
+ padding: 0 0.5em 0 0;
+}
+
+#qunit-tests td {
+ vertical-align: top;
+}
+
+#qunit-tests pre {
+ margin: 0;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+}
+
+#qunit-tests del {
+ background-color: #E0F2BE;
+ color: #374E0C;
+ text-decoration: none;
+}
+
+#qunit-tests ins {
+ background-color: #FFCACA;
+ color: #500;
+ text-decoration: none;
+}
+
+/*** Test Counts */
+
+#qunit-tests b.counts { color: #000; }
+#qunit-tests b.passed { color: #5E740B; }
+#qunit-tests b.failed { color: #710909; }
+
+#qunit-tests li li {
+ padding: 5px;
+ background-color: #FFF;
+ border-bottom: none;
+ list-style-position: inside;
+}
+
+/*** Passing Styles */
+
+#qunit-tests li li.pass {
+ color: #3C510C;
+ background-color: #FFF;
+ border-left: 10px solid #C6E746;
+}
+
+#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
+#qunit-tests .pass .test-name { color: #366097; }
+
+#qunit-tests .pass .test-actual,
+#qunit-tests .pass .test-expected { color: #999; }
+
+#qunit-banner.qunit-pass { background-color: #C6E746; }
+
+/*** Failing Styles */
+
+#qunit-tests li li.fail {
+ color: #710909;
+ background-color: #FFF;
+ border-left: 10px solid #EE5757;
+ white-space: pre;
+}
+
+#qunit-tests > li:last-child {
+ border-radius: 0 0 5px 5px;
+}
+
+#qunit-tests .fail { color: #000; background-color: #EE5757; }
+#qunit-tests .fail .test-name,
+#qunit-tests .fail .module-name { color: #000; }
+
+#qunit-tests .fail .test-actual { color: #EE5757; }
+#qunit-tests .fail .test-expected { color: #008000; }
+
+#qunit-banner.qunit-fail { background-color: #EE5757; }
+
+/*** Skipped tests */
+
+#qunit-tests .skipped {
+ background-color: #EBECE9;
+}
+
+#qunit-tests .qunit-skipped-label {
+ background-color: #F4FF77;
+ display: inline-block;
+ font-style: normal;
+ color: #366097;
+ line-height: 1.8em;
+ padding: 0 0.5em;
+ margin: -0.4em 0.4em -0.4em 0;
+}
+
+/** Result */
+
+#qunit-testresult {
+ padding: 0.5em 1em 0.5em 1em;
+
+ color: #2B81AF;
+ background-color: #D2E0E6;
+
+ border-bottom: 1px solid #FFF;
+}
+#qunit-testresult .module-name {
+ font-weight: 700;
+}
+
+/** Fixture */
+
+#qunit-fixture {
+ position: absolute;
+ top: -10000px;
+ left: -10000px;
+ width: 1000px;
+ height: 1000px;
+}
+
+#ember-testing-container {
+ position: relative;
+ background: white;
+ bottom: 0;
+ right: 0;
+ width: 640px;
+ height: 384px;
+ overflow: auto;
+ z-index: 9999;
+ border: 1px solid #ccc;
+ margin: 0 auto;
+}
+#ember-testing {
+ zoom: 50%;
+}
diff --git a/priv/ember_riak_explorer/dist/assets/test-support.js b/priv/ember_riak_explorer/dist/assets/test-support.js
new file mode 100644
index 0000000..69ff4dc
--- /dev/null
+++ b/priv/ember_riak_explorer/dist/assets/test-support.js
@@ -0,0 +1,8288 @@
+/* jshint ignore:start */
+
+
+
+/* jshint ignore:end */
+
+;(function() {
+/*!
+ * @overview Ember - JavaScript Application Framework
+ * @copyright Copyright 2011-2016 Tilde Inc. and contributors
+ * Portions Copyright 2006-2011 Strobe Inc.
+ * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
+ * @license Licensed under MIT license
+ * See https://raw.github.com/emberjs/ember.js/master/LICENSE
+ * @version 2.5.1
+ */
+
+var enifed, requireModule, require, requirejs, Ember;
+var mainContext = this;
+
+(function() {
+ var isNode = typeof window === 'undefined' &&
+ typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
+
+ if (!isNode) {
+ Ember = this.Ember = this.Ember || {};
+ }
+
+ if (typeof Ember === 'undefined') { Ember = {}; };
+
+ if (typeof Ember.__loader === 'undefined') {
+ var registry = {};
+ var seen = {};
+
+ enifed = function(name, deps, callback) {
+ var value = { };
+
+ if (!callback) {
+ value.deps = [];
+ value.callback = deps;
+ } else {
+ value.deps = deps;
+ value.callback = callback;
+ }
+
+ registry[name] = value;
+ };
+
+ requirejs = require = requireModule = function(name) {
+ return internalRequire(name, null);
+ }
+
+ // setup `require` module
+ require['default'] = require;
+
+ require.has = function registryHas(moduleName) {
+ return !!registry[moduleName] || !!registry[moduleName + '/index'];
+ };
+
+ function missingModule(name, referrerName) {
+ if (referrerName) {
+ throw new Error('Could not find module ' + name + ' required by: ' + referrerName);
+ } else {
+ throw new Error('Could not find module ' + name);
+ }
+ }
+
+ function internalRequire(_name, referrerName) {
+ var name = _name;
+ var mod = registry[name];
+
+ if (!mod) {
+ name = name + '/index';
+ mod = registry[name];
+ }
+
+ var exports = seen[name];
+
+ if (exports !== undefined) {
+ return exports;
+ }
+
+ exports = seen[name] = {};
+
+ if (!mod) {
+ missingModule(_name, referrerName);
+ }
+
+ var deps = mod.deps;
+ var callback = mod.callback;
+ var length = deps.length;
+ var reified = new Array(length);;
+
+ for (var i = 0; i < length; i++) {
+ if (deps[i] === 'exports') {
+ reified[i] = exports;
+ } else if (deps[i] === 'require') {
+ reified[i] = require;
+ } else {
+ reified[i] = internalRequire(deps[i], name);
+ }
+ }
+
+ callback.apply(this, reified);
+
+ return exports;
+ };
+
+ requirejs._eak_seen = registry;
+
+ Ember.__loader = {
+ define: enifed,
+ require: require,
+ registry: registry
+ };
+ } else {
+ enifed = Ember.__loader.define;
+ requirejs = require = requireModule = Ember.__loader.require;
+ }
+})();
+
+enifed('ember-debug/deprecate', ['exports', 'ember-metal/core', 'ember-metal/error', 'ember-metal/logger', 'ember-debug/handlers'], function (exports, _emberMetalCore, _emberMetalError, _emberMetalLogger, _emberDebugHandlers) {
+ /*global __fail__*/
+
+ 'use strict';
+
+ var _slice = Array.prototype.slice;
+ exports.registerHandler = registerHandler;
+ exports.default = deprecate;
+
+ function registerHandler(handler) {
+ _emberDebugHandlers.registerHandler('deprecate', handler);
+ }
+
+ function formatMessage(_message, options) {
+ var message = _message;
+
+ if (options && options.id) {
+ message = message + (' [deprecation id: ' + options.id + ']');
+ }
+
+ if (options && options.url) {
+ message += ' See ' + options.url + ' for more details.';
+ }
+
+ return message;
+ }
+
+ registerHandler(function logDeprecationToConsole(message, options) {
+ var updatedMessage = formatMessage(message, options);
+
+ _emberMetalLogger.default.warn('DEPRECATION: ' + updatedMessage);
+ });
+
+ registerHandler(function logDeprecationStackTrace(message, options, next) {
+ if (_emberMetalCore.default.LOG_STACKTRACE_ON_DEPRECATION) {
+ var stackStr = '';
+ var error = undefined,
+ stack = undefined;
+
+ // When using new Error, we can't do the arguments check for Chrome. Alternatives are welcome
+ try {
+ __fail__.fail();
+ } catch (e) {
+ error = e;
+ }
+
+ if (error.stack) {
+ if (error['arguments']) {
+ // Chrome
+ stack = error.stack.replace(/^\s+at\s+/gm, '').replace(/^([^\(]+?)([\n$])/gm, '{anonymous}($1)$2').replace(/^Object.\s*\(([^\)]+)\)/gm, '{anonymous}($1)').split('\n');
+ stack.shift();
+ } else {
+ // Firefox
+ stack = error.stack.replace(/(?:\n@:0)?\s+$/m, '').replace(/^\(/gm, '{anonymous}(').split('\n');
+ }
+
+ stackStr = '\n ' + stack.slice(2).join('\n ');
+ }
+
+ var updatedMessage = formatMessage(message, options);
+
+ _emberMetalLogger.default.warn('DEPRECATION: ' + updatedMessage + stackStr);
+ } else {
+ next.apply(undefined, arguments);
+ }
+ });
+
+ registerHandler(function raiseOnDeprecation(message, options, next) {
+ if (_emberMetalCore.default.ENV.RAISE_ON_DEPRECATION) {
+ var updatedMessage = formatMessage(message);
+
+ throw new _emberMetalError.default(updatedMessage);
+ } else {
+ next.apply(undefined, arguments);
+ }
+ });
+
+ var missingOptionsDeprecation = 'When calling `Ember.deprecate` you ' + 'must provide an `options` hash as the third parameter. ' + '`options` should include `id` and `until` properties.';
+ exports.missingOptionsDeprecation = missingOptionsDeprecation;
+ var missingOptionsIdDeprecation = 'When calling `Ember.deprecate` you must provide `id` in options.';
+ exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;
+ var missingOptionsUntilDeprecation = 'When calling `Ember.deprecate` you must provide `until` in options.';
+
+ exports.missingOptionsUntilDeprecation = missingOptionsUntilDeprecation;
+ /**
+ @module ember
+ @submodule ember-debug
+ */
+
+ /**
+ Display a deprecation warning with the provided message and a stack trace
+ (Chrome and Firefox only).
+
+ * In a production build, this method is defined as an empty function (NOP).
+ Uses of this method in Ember itself are stripped from the ember.prod.js build.
+
+ @method deprecate
+ @param {String} message A description of the deprecation.
+ @param {Boolean} test A boolean. If falsy, the deprecation
+ will be displayed.
+ @param {Object} options An object that can be used to pass
+ in a `url` to the transition guide on the emberjs.com website, and a unique
+ `id` for this deprecation. The `id` can be used by Ember debugging tools
+ to change the behavior (raise, log or silence) for that specific deprecation.
+ The `id` should be namespaced by dots, e.g. "view.helper.select".
+ @for Ember
+ @public
+ */
+
+ function deprecate(message, test, options) {
+ if (!options || !options.id && !options.until) {
+ deprecate(missingOptionsDeprecation, false, {
+ id: 'ember-debug.deprecate-options-missing',
+ until: '3.0.0',
+ url: 'http://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'
+ });
+ }
+
+ if (options && !options.id) {
+ deprecate(missingOptionsIdDeprecation, false, {
+ id: 'ember-debug.deprecate-id-missing',
+ until: '3.0.0',
+ url: 'http://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'
+ });
+ }
+
+ if (options && !options.until) {
+ deprecate(missingOptionsUntilDeprecation, options && options.until, {
+ id: 'ember-debug.deprecate-until-missing',
+ until: '3.0.0',
+ url: 'http://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'
+ });
+ }
+
+ _emberDebugHandlers.invoke.apply(undefined, ['deprecate'].concat(_slice.call(arguments)));
+ }
+});
+enifed('ember-debug/handlers', ['exports', 'ember-debug/is-plain-function', 'ember-debug/deprecate'], function (exports, _emberDebugIsPlainFunction, _emberDebugDeprecate) {
+ 'use strict';
+
+ exports.generateTestAsFunctionDeprecation = generateTestAsFunctionDeprecation;
+ exports.registerHandler = registerHandler;
+ exports.invoke = invoke;
+ var HANDLERS = {};
+
+ exports.HANDLERS = HANDLERS;
+
+ function generateTestAsFunctionDeprecation(source) {
+ return 'Calling `' + source + '` with a function argument is deprecated. Please ' + 'use `!!Constructor` for constructors, or an `IIFE` to compute the test for deprecation. ' + 'In a future version, functions will be treated as truthy values instead of being executed.';
+ }
+
+ function normalizeTest(test, source) {
+ if (_emberDebugIsPlainFunction.default(test)) {
+ _emberDebugDeprecate.default(generateTestAsFunctionDeprecation(source), false, { id: 'ember-debug.deprecate-test-as-function', until: '2.5.0' });
+
+ return test();
+ }
+
+ return test;
+ }
+
+ function registerHandler(type, callback) {
+ var nextHandler = HANDLERS[type] || function () {};
+
+ HANDLERS[type] = function (message, options) {
+ callback(message, options, nextHandler);
+ };
+ }
+
+ function invoke(type, message, test, options) {
+ if (normalizeTest(test, 'Ember.' + type)) {
+ return;
+ }
+
+ var handlerForType = HANDLERS[type];
+
+ if (!handlerForType) {
+ return;
+ }
+
+ if (handlerForType) {
+ handlerForType(message, options);
+ }
+ }
+});
+enifed('ember-debug/index', ['exports', 'ember-metal/core', 'ember-metal/debug', 'ember-metal/features', 'ember-metal/error', 'ember-metal/logger', 'ember-metal/environment', 'ember-debug/deprecate', 'ember-debug/warn', 'ember-debug/is-plain-function', 'ember-debug/handlers'], function (exports, _emberMetalCore, _emberMetalDebug, _emberMetalFeatures, _emberMetalError, _emberMetalLogger, _emberMetalEnvironment, _emberDebugDeprecate, _emberDebugWarn, _emberDebugIsPlainFunction, _emberDebugHandlers) {
+ 'use strict';
+
+ exports._warnIfUsingStrippedFeatureFlags = _warnIfUsingStrippedFeatureFlags;
+
+ /**
+ @module ember
+ @submodule ember-debug
+ */
+
+ /**
+ @class Ember
+ @public
+ */
+
+ /**
+ Define an assertion that will throw an exception if the condition is not met.
+
+ * In a production build, this method is defined as an empty function (NOP).
+ Uses of this method in Ember itself are stripped from the ember.prod.js build.
+
+ ```javascript
+ // Test for truthiness
+ Ember.assert('Must pass a valid object', obj);
+
+ // Fail unconditionally
+ Ember.assert('This code path should never be run');
+ ```
+
+ @method assert
+ @param {String} desc A description of the assertion. This will become
+ the text of the Error thrown if the assertion fails.
+ @param {Boolean} test Must be truthy for the assertion to pass. If
+ falsy, an exception will be thrown.
+ @public
+ */
+ _emberMetalDebug.setDebugFunction('assert', function assert(desc, test) {
+ var throwAssertion = undefined;
+
+ if (_emberDebugIsPlainFunction.default(test)) {
+ _emberMetalDebug.deprecate(_emberDebugHandlers.generateTestAsFunctionDeprecation('Ember.assert'), false, { id: 'ember-debug.deprecate-test-as-function', until: '2.5.0' });
+
+ throwAssertion = !test();
+ } else {
+ throwAssertion = !test;
+ }
+
+ if (throwAssertion) {
+ throw new _emberMetalError.default('Assertion Failed: ' + desc);
+ }
+ });
+
+ /**
+ Display a debug notice.
+
+ * In a production build, this method is defined as an empty function (NOP).
+ Uses of this method in Ember itself are stripped from the ember.prod.js build.
+
+ ```javascript
+ Ember.debug('I\'m a debug notice!');
+ ```
+
+ @method debug
+ @param {String} message A debug message to display.
+ @public
+ */
+ _emberMetalDebug.setDebugFunction('debug', function debug(message) {
+ _emberMetalLogger.default.debug('DEBUG: ' + message);
+ });
+
+ /**
+ Display an info notice.
+
+ * In a production build, this method is defined as an empty function (NOP).
+ Uses of this method in Ember itself are stripped from the ember.prod.js build.
+
+ @method info
+ @private
+ */
+ _emberMetalDebug.setDebugFunction('info', function info() {
+ _emberMetalLogger.default.info.apply(undefined, arguments);
+ });
+
+ /**
+ Alias an old, deprecated method with its new counterpart.
+
+ Display a deprecation warning with the provided message and a stack trace
+ (Chrome and Firefox only) when the assigned method is called.
+
+ * In a production build, this method is defined as an empty function (NOP).
+
+ ```javascript
+ Ember.oldMethod = Ember.deprecateFunc('Please use the new, updated method', Ember.newMethod);
+ ```
+
+ @method deprecateFunc
+ @param {String} message A description of the deprecation.
+ @param {Object} [options] The options object for Ember.deprecate.
+ @param {Function} func The new function called to replace its deprecated counterpart.
+ @return {Function} A new function that wraps the original function with a deprecation warning
+ @private
+ */
+ _emberMetalDebug.setDebugFunction('deprecateFunc', function deprecateFunc() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ if (args.length === 3) {
+ var _ret = (function () {
+ var message = args[0];
+ var options = args[1];
+ var func = args[2];
+
+ return {
+ v: function () {
+ _emberMetalDebug.deprecate(message, false, options);
+ return func.apply(this, arguments);
+ }
+ };
+ })();
+
+ if (typeof _ret === 'object') return _ret.v;
+ } else {
+ var _ret2 = (function () {
+ var message = args[0];
+ var func = args[1];
+
+ return {
+ v: function () {
+ _emberMetalDebug.deprecate(message);
+ return func.apply(this, arguments);
+ }
+ };
+ })();
+
+ if (typeof _ret2 === 'object') return _ret2.v;
+ }
+ });
+
+ /**
+ Run a function meant for debugging.
+
+ * In a production build, this method is defined as an empty function (NOP).
+ Uses of this method in Ember itself are stripped from the ember.prod.js build.
+
+ ```javascript
+ Ember.runInDebug(() => {
+ Ember.Component.reopen({
+ didInsertElement() {
+ console.log("I'm happy");
+ }
+ });
+ });
+ ```
+
+ @method runInDebug
+ @param {Function} func The function to be executed.
+ @since 1.5.0
+ @public
+ */
+ _emberMetalDebug.setDebugFunction('runInDebug', function runInDebug(func) {
+ func();
+ });
+
+ _emberMetalDebug.setDebugFunction('debugSeal', function debugSeal(obj) {
+ Object.seal(obj);
+ });
+
+ _emberMetalDebug.setDebugFunction('deprecate', _emberDebugDeprecate.default);
+
+ _emberMetalDebug.setDebugFunction('warn', _emberDebugWarn.default);
+
+ /**
+ Will call `Ember.warn()` if ENABLE_OPTIONAL_FEATURES or
+ any specific FEATURES flag is truthy.
+
+ This method is called automatically in debug canary builds.
+
+ @private
+ @method _warnIfUsingStrippedFeatureFlags
+ @return {void}
+ */
+
+ function _warnIfUsingStrippedFeatureFlags(FEATURES, knownFeatures, featuresWereStripped) {
+ if (featuresWereStripped) {
+ _emberMetalDebug.warn('Ember.ENV.ENABLE_OPTIONAL_FEATURES is only available in canary builds.', !_emberMetalCore.default.ENV.ENABLE_OPTIONAL_FEATURES, { id: 'ember-debug.feature-flag-with-features-stripped' });
+
+ var keys = Object.keys(FEATURES || {});
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ if (key === 'isEnabled' || !(key in knownFeatures)) {
+ continue;
+ }
+
+ _emberMetalDebug.warn('FEATURE["' + key + '"] is set as enabled, but FEATURE flags are only available in canary builds.', !FEATURES[key], { id: 'ember-debug.feature-flag-with-features-stripped' });
+ }
+ }
+ }
+
+ if (!_emberMetalCore.default.testing) {
+ // Complain if they're using FEATURE flags in builds other than canary
+ _emberMetalFeatures.FEATURES['features-stripped-test'] = true;
+ var featuresWereStripped = true;
+
+ delete _emberMetalFeatures.FEATURES['features-stripped-test'];
+ _warnIfUsingStrippedFeatureFlags(_emberMetalCore.default.ENV.FEATURES, _emberMetalFeatures.KNOWN_FEATURES, featuresWereStripped);
+
+ // Inform the developer about the Ember Inspector if not installed.
+ var isFirefox = _emberMetalEnvironment.default.isFirefox;
+ var isChrome = _emberMetalEnvironment.default.isChrome;
+
+ if (typeof window !== 'undefined' && (isFirefox || isChrome) && window.addEventListener) {
+ window.addEventListener('load', function () {
+ if (document.documentElement && document.documentElement.dataset && !document.documentElement.dataset.emberExtension) {
+ var downloadURL;
+
+ if (isChrome) {
+ downloadURL = 'https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi';
+ } else if (isFirefox) {
+ downloadURL = 'https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/';
+ }
+
+ _emberMetalDebug.debug('For more advanced debugging, install the Ember Inspector from ' + downloadURL);
+ }
+ }, false);
+ }
+ }
+ /**
+ @public
+ @class Ember.Debug
+ */
+ _emberMetalCore.default.Debug = {};
+
+ /**
+ Allows for runtime registration of handler functions that override the default deprecation behavior.
+ Deprecations are invoked by calls to [Ember.deprecate](http://emberjs.com/api/classes/Ember.html#method_deprecate).
+ The following example demonstrates its usage by registering a handler that throws an error if the
+ message contains the word "should", otherwise defers to the default handler.
+ ```javascript
+ Ember.Debug.registerDeprecationHandler((message, options, next) => {
+ if (message.indexOf('should') !== -1) {
+ throw new Error(`Deprecation message with should: ${message}`);
+ } else {
+ // defer to whatever handler was registered before this one
+ next(message, options);
+ }
+ }
+ ```
+ The handler function takes the following arguments:
+
+ message
- The message received from the deprecation call.
+ options
- An object passed in with the deprecation call containing additional information including:
+
+ id
- An id of the deprecation in the form of package-name.specific-deprecation
.
+ until
- The Ember version number the feature and deprecation will be removed in.
+
+ next
- A function that calls into the previously registered handler.
+
+ @public
+ @static
+ @method registerDeprecationHandler
+ @param handler {Function} A function to handle deprecation calls.
+ @since 2.1.0
+ */
+ _emberMetalCore.default.Debug.registerDeprecationHandler = _emberDebugDeprecate.registerHandler;
+ /**
+ Allows for runtime registration of handler functions that override the default warning behavior.
+ Warnings are invoked by calls made to [Ember.warn](http://emberjs.com/api/classes/Ember.html#method_warn).
+ The following example demonstrates its usage by registering a handler that does nothing overriding Ember's
+ default warning behavior.
+ ```javascript
+ // next is not called, so no warnings get the default behavior
+ Ember.Debug.registerWarnHandler(() => {});
+ ```
+ The handler function takes the following arguments:
+
+ message
- The message received from the warn call.
+ options
- An object passed in with the warn call containing additional information including:
+
+ id
- An id of the warning in the form of package-name.specific-warning
.
+
+ next
- A function that calls into the previously registered handler.
+
+ @public
+ @static
+ @method registerWarnHandler
+ @param handler {Function} A function to handle warnings.
+ @since 2.1.0
+ */
+ _emberMetalCore.default.Debug.registerWarnHandler = _emberDebugWarn.registerHandler;
+
+ /*
+ We are transitioning away from `ember.js` to `ember.debug.js` to make
+ it much clearer that it is only for local development purposes.
+
+ This flag value is changed by the tooling (by a simple string replacement)
+ so that if `ember.js` (which must be output for backwards compat reasons) is
+ used a nice helpful warning message will be printed out.
+ */
+ var runningNonEmberDebugJS = false;
+ exports.runningNonEmberDebugJS = runningNonEmberDebugJS;
+ if (runningNonEmberDebugJS) {
+ _emberMetalDebug.warn('Please use `ember.debug.js` instead of `ember.js` for development and debugging.');
+ }
+});
+enifed('ember-debug/is-plain-function', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.default = isPlainFunction;
+
+ function isPlainFunction(test) {
+ return typeof test === 'function' && test.PrototypeMixin === undefined;
+ }
+});
+enifed('ember-debug/warn', ['exports', 'ember-metal/logger', 'ember-metal/debug', 'ember-debug/handlers'], function (exports, _emberMetalLogger, _emberMetalDebug, _emberDebugHandlers) {
+ 'use strict';
+
+ var _slice = Array.prototype.slice;
+ exports.registerHandler = registerHandler;
+ exports.default = warn;
+
+ function registerHandler(handler) {
+ _emberDebugHandlers.registerHandler('warn', handler);
+ }
+
+ registerHandler(function logWarning(message, options) {
+ _emberMetalLogger.default.warn('WARNING: ' + message);
+ if ('trace' in _emberMetalLogger.default) {
+ _emberMetalLogger.default.trace();
+ }
+ });
+
+ var missingOptionsDeprecation = 'When calling `Ember.warn` you ' + 'must provide an `options` hash as the third parameter. ' + '`options` should include an `id` property.';
+ exports.missingOptionsDeprecation = missingOptionsDeprecation;
+ var missingOptionsIdDeprecation = 'When calling `Ember.warn` you must provide `id` in options.';
+
+ exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;
+ /**
+ @module ember
+ @submodule ember-debug
+ */
+
+ /**
+ Display a warning with the provided message.
+
+ * In a production build, this method is defined as an empty function (NOP).
+ Uses of this method in Ember itself are stripped from the ember.prod.js build.
+
+ @method warn
+ @param {String} message A warning to display.
+ @param {Boolean} test An optional boolean. If falsy, the warning
+ will be displayed.
+ @param {Object} options An object that can be used to pass a unique
+ `id` for this warning. The `id` can be used by Ember debugging tools
+ to change the behavior (raise, log, or silence) for that specific warning.
+ The `id` should be namespaced by dots, e.g. "ember-debug.feature-flag-with-features-stripped"
+ @for Ember
+ @public
+ */
+
+ function warn(message, test, options) {
+ if (!options) {
+ _emberMetalDebug.deprecate(missingOptionsDeprecation, false, {
+ id: 'ember-debug.warn-options-missing',
+ until: '3.0.0',
+ url: 'http://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'
+ });
+ }
+
+ if (options && !options.id) {
+ _emberMetalDebug.deprecate(missingOptionsIdDeprecation, false, {
+ id: 'ember-debug.warn-id-missing',
+ until: '3.0.0',
+ url: 'http://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'
+ });
+ }
+
+ _emberDebugHandlers.invoke.apply(undefined, ['warn'].concat(_slice.call(arguments)));
+ }
+});
+enifed('ember-testing/adapters/adapter', ['exports', 'ember-runtime/system/object'], function (exports, _emberRuntimeSystemObject) {
+ 'use strict';
+
+ function K() {
+ return this;
+ }
+
+ /**
+ @module ember
+ @submodule ember-testing
+ */
+
+ /**
+ The primary purpose of this class is to create hooks that can be implemented
+ by an adapter for various test frameworks.
+
+ @class Adapter
+ @namespace Ember.Test
+ @public
+ */
+ var Adapter = _emberRuntimeSystemObject.default.extend({
+ /**
+ This callback will be called whenever an async operation is about to start.
+ Override this to call your framework's methods that handle async
+ operations.
+ @public
+ @method asyncStart
+ */
+ asyncStart: K,
+
+ /**
+ This callback will be called whenever an async operation has completed.
+ @public
+ @method asyncEnd
+ */
+ asyncEnd: K,
+
+ /**
+ Override this method with your testing framework's false assertion.
+ This function is called whenever an exception occurs causing the testing
+ promise to fail.
+ QUnit example:
+ ```javascript
+ exception: function(error) {
+ ok(false, error);
+ };
+ ```
+ @public
+ @method exception
+ @param {String} error The exception to be raised.
+ */
+ exception: function (error) {
+ throw error;
+ }
+ });
+
+ exports.default = Adapter;
+});
+enifed('ember-testing/adapters/qunit', ['exports', 'ember-testing/adapters/adapter', 'ember-metal/utils'], function (exports, _emberTestingAdaptersAdapter, _emberMetalUtils) {
+ 'use strict';
+
+ /**
+ This class implements the methods defined by Ember.Test.Adapter for the
+ QUnit testing framework.
+
+ @class QUnitAdapter
+ @namespace Ember.Test
+ @extends Ember.Test.Adapter
+ @public
+ */
+ exports.default = _emberTestingAdaptersAdapter.default.extend({
+ asyncStart: function () {
+ QUnit.stop();
+ },
+ asyncEnd: function () {
+ QUnit.start();
+ },
+ exception: function (error) {
+ ok(false, _emberMetalUtils.inspect(error));
+ }
+ });
+});
+enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-metal/error', 'ember-metal/run_loop', 'ember-views/system/jquery', 'ember-testing/test', 'ember-runtime/ext/rsvp', 'ember-metal/features'], function (exports, _emberMetalProperty_get, _emberMetalError, _emberMetalRun_loop, _emberViewsSystemJquery, _emberTestingTest, _emberRuntimeExtRsvp, _emberMetalFeatures) {
+ 'use strict';
+
+ /**
+ @module ember
+ @submodule ember-testing
+ */
+
+ var helper = _emberTestingTest.default.registerHelper;
+ var asyncHelper = _emberTestingTest.default.registerAsyncHelper;
+
+ var keyboardEventTypes, mouseEventTypes, buildKeyboardEvent, buildMouseEvent, buildBasicEvent, fireEvent, focus;
+
+ var defaultEventOptions = { canBubble: true, cancelable: true };
+ keyboardEventTypes = ['keydown', 'keypress', 'keyup'];
+ mouseEventTypes = ['click', 'mousedown', 'mouseup', 'dblclick', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover'];
+
+ buildKeyboardEvent = function buildKeyboardEvent(type) {
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
+
+ var event = undefined;
+ try {
+ event = document.createEvent('KeyEvents');
+ var eventOpts = _emberViewsSystemJquery.default.extend({}, defaultEventOptions, options);
+ event.initKeyEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.keyCode, eventOpts.charCode);
+ } catch (e) {
+ event = buildBasicEvent(type, options);
+ }
+ return event;
+ };
+
+ buildMouseEvent = function buildMouseEvent(type) {
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
+
+ var event = undefined;
+ try {
+ event = document.createEvent('MouseEvents');
+ var eventOpts = _emberViewsSystemJquery.default.extend({}, defaultEventOptions, options);
+ event.initMouseEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.detail, eventOpts.screenX, eventOpts.screenY, eventOpts.clientX, eventOpts.clientY, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.button, eventOpts.relatedTarget);
+ } catch (e) {
+ event = buildBasicEvent(type, options);
+ }
+ return event;
+ };
+
+ buildBasicEvent = function buildBasicEvent(type) {
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
+
+ var event = document.createEvent('Events');
+ event.initEvent(type, true, true);
+ _emberViewsSystemJquery.default.extend(event, options);
+ return event;
+ };
+
+ fireEvent = function fireEvent(element, type) {
+ var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
+
+ if (!element) {
+ return;
+ }
+ var event = undefined;
+ if (keyboardEventTypes.indexOf(type) > -1) {
+ event = buildKeyboardEvent(type, options);
+ } else if (mouseEventTypes.indexOf(type) > -1) {
+ var rect = element.getBoundingClientRect();
+ var x = rect.left + 1;
+ var y = rect.top + 1;
+ var simulatedCoordinates = {
+ screenX: x + 5,
+ screenY: y + 95,
+ clientX: x,
+ clientY: y
+ };
+ event = buildMouseEvent(type, _emberViewsSystemJquery.default.extend(simulatedCoordinates, options));
+ } else {
+ event = buildBasicEvent(type, options);
+ }
+ element.dispatchEvent(event);
+ };
+
+ focus = function focus(el) {
+ if (!el) {
+ return;
+ }
+ var $el = _emberViewsSystemJquery.default(el);
+ if ($el.is(':input, [contenteditable=true]')) {
+ var type = $el.prop('type');
+ if (type !== 'checkbox' && type !== 'radio' && type !== 'hidden') {
+ _emberMetalRun_loop.default(null, function () {
+ // Firefox does not trigger the `focusin` event if the window
+ // does not have focus. If the document doesn't have focus just
+ // use trigger('focusin') instead.
+
+ if (!document.hasFocus || document.hasFocus()) {
+ el.focus();
+ } else {
+ $el.trigger('focusin');
+ }
+ });
+ }
+ }
+ };
+
+ function currentRouteName(app) {
+ var routingService = app.__container__.lookup('service:-routing');
+
+ return _emberMetalProperty_get.get(routingService, 'currentRouteName');
+ }
+
+ function currentPath(app) {
+ var routingService = app.__container__.lookup('service:-routing');
+
+ return _emberMetalProperty_get.get(routingService, 'currentPath');
+ }
+
+ function currentURL(app) {
+ var router = app.__container__.lookup('router:main');
+
+ return _emberMetalProperty_get.get(router, 'location').getURL();
+ }
+
+ function pauseTest() {
+ _emberTestingTest.default.adapter.asyncStart();
+ return new _emberRuntimeExtRsvp.default.Promise(function () {}, 'TestAdapter paused promise');
+ }
+
+ function visit(app, url) {
+ var router = app.__container__.lookup('router:main');
+ var shouldHandleURL = false;
+
+ app.boot().then(function () {
+ router.location.setURL(url);
+
+ if (shouldHandleURL) {
+ _emberMetalRun_loop.default(app.__deprecatedInstance__, 'handleURL', url);
+ }
+ });
+
+ if (app._readinessDeferrals > 0) {
+ router['initialURL'] = url;
+ _emberMetalRun_loop.default(app, 'advanceReadiness');
+ delete router['initialURL'];
+ } else {
+ shouldHandleURL = true;
+ }
+
+ return app.testHelpers.wait();
+ }
+
+ function click(app, selector, context) {
+ var $el = app.testHelpers.findWithAssert(selector, context);
+ var el = $el[0];
+
+ _emberMetalRun_loop.default(null, fireEvent, el, 'mousedown');
+
+ focus(el);
+
+ _emberMetalRun_loop.default(null, fireEvent, el, 'mouseup');
+ _emberMetalRun_loop.default(null, fireEvent, el, 'click');
+
+ return app.testHelpers.wait();
+ }
+
+ function triggerEvent(app, selector, contextOrType, typeOrOptions, possibleOptions) {
+ var arity = arguments.length;
+ var context, type, options;
+
+ if (arity === 3) {
+ // context and options are optional, so this is
+ // app, selector, type
+ context = null;
+ type = contextOrType;
+ options = {};
+ } else if (arity === 4) {
+ // context and options are optional, so this is
+ if (typeof typeOrOptions === 'object') {
+ // either
+ // app, selector, type, options
+ context = null;
+ type = contextOrType;
+ options = typeOrOptions;
+ } else {
+ // or
+ // app, selector, context, type
+ context = contextOrType;
+ type = typeOrOptions;
+ options = {};
+ }
+ } else {
+ context = contextOrType;
+ type = typeOrOptions;
+ options = possibleOptions;
+ }
+
+ var $el = app.testHelpers.findWithAssert(selector, context);
+ var el = $el[0];
+
+ _emberMetalRun_loop.default(null, fireEvent, el, type, options);
+
+ return app.testHelpers.wait();
+ }
+
+ function keyEvent(app, selector, contextOrType, typeOrKeyCode, keyCode) {
+ var context, type;
+
+ if (typeof keyCode === 'undefined') {
+ context = null;
+ keyCode = typeOrKeyCode;
+ type = contextOrType;
+ } else {
+ context = contextOrType;
+ type = typeOrKeyCode;
+ }
+
+ return app.testHelpers.triggerEvent(selector, context, type, { keyCode: keyCode, which: keyCode });
+ }
+
+ function fillIn(app, selector, contextOrText, text) {
+ var $el, el, context;
+ if (typeof text === 'undefined') {
+ text = contextOrText;
+ } else {
+ context = contextOrText;
+ }
+ $el = app.testHelpers.findWithAssert(selector, context);
+ el = $el[0];
+ focus(el);
+ _emberMetalRun_loop.default(function () {
+ $el.val(text);
+ fireEvent(el, 'input');
+ fireEvent(el, 'change');
+ });
+ return app.testHelpers.wait();
+ }
+
+ function findWithAssert(app, selector, context) {
+ var $el = app.testHelpers.find(selector, context);
+ if ($el.length === 0) {
+ throw new _emberMetalError.default('Element ' + selector + ' not found.');
+ }
+ return $el;
+ }
+
+ function find(app, selector, context) {
+ var $el;
+ context = context || _emberMetalProperty_get.get(app, 'rootElement');
+ $el = app.$(selector, context);
+
+ return $el;
+ }
+
+ function andThen(app, callback) {
+ return app.testHelpers.wait(callback(app));
+ }
+
+ function wait(app, value) {
+ return new _emberRuntimeExtRsvp.default.Promise(function (resolve) {
+ var router = app.__container__.lookup('router:main');
+
+ // Every 10ms, poll for the async thing to have finished
+ var watcher = setInterval(function () {
+ // 1. If the router is loading, keep polling
+ var routerIsLoading = router.router && !!router.router.activeTransition;
+ if (routerIsLoading) {
+ return;
+ }
+
+ // 2. If there are pending Ajax requests, keep polling
+ if (_emberTestingTest.default.pendingAjaxRequests) {
+ return;
+ }
+
+ // 3. If there are scheduled timers or we are inside of a run loop, keep polling
+ if (_emberMetalRun_loop.default.hasScheduledTimers() || _emberMetalRun_loop.default.currentRunLoop) {
+ return;
+ }
+ if (_emberTestingTest.default.waiters && _emberTestingTest.default.waiters.any(function (waiter) {
+ var context = waiter[0];
+ var callback = waiter[1];
+ return !callback.call(context);
+ })) {
+ return;
+ }
+ // Stop polling
+ clearInterval(watcher);
+
+ // Synchronously resolve the promise
+ _emberMetalRun_loop.default(null, resolve, value);
+ }, 10);
+ });
+ }
+
+ /**
+ Loads a route, sets up any controllers, and renders any templates associated
+ with the route as though a real user had triggered the route change while
+ using your app.
+
+ Example:
+
+ ```javascript
+ visit('posts/index').then(function() {
+ // assert something
+ });
+ ```
+
+ @method visit
+ @param {String} url the name of the route
+ @return {RSVP.Promise}
+ @public
+ */
+ asyncHelper('visit', visit);
+
+ /**
+ Clicks an element and triggers any actions triggered by the element's `click`
+ event.
+
+ Example:
+
+ ```javascript
+ click('.some-jQuery-selector').then(function() {
+ // assert something
+ });
+ ```
+
+ @method click
+ @param {String} selector jQuery selector for finding element on the DOM
+ @return {RSVP.Promise}
+ @public
+ */
+ asyncHelper('click', click);
+
+ /**
+ Simulates a key event, e.g. `keypress`, `keydown`, `keyup` with the desired keyCode
+
+ Example:
+
+ ```javascript
+ keyEvent('.some-jQuery-selector', 'keypress', 13).then(function() {
+ // assert something
+ });
+ ```
+
+ @method keyEvent
+ @param {String} selector jQuery selector for finding element on the DOM
+ @param {String} type the type of key event, e.g. `keypress`, `keydown`, `keyup`
+ @param {Number} keyCode the keyCode of the simulated key event
+ @return {RSVP.Promise}
+ @since 1.5.0
+ @public
+ */
+ asyncHelper('keyEvent', keyEvent);
+
+ /**
+ Fills in an input element with some text.
+
+ Example:
+
+ ```javascript
+ fillIn('#email', 'you@example.com').then(function() {
+ // assert something
+ });
+ ```
+
+ @method fillIn
+ @param {String} selector jQuery selector finding an input element on the DOM
+ to fill text with
+ @param {String} text text to place inside the input element
+ @return {RSVP.Promise}
+ @public
+ */
+ asyncHelper('fillIn', fillIn);
+
+ /**
+ Finds an element in the context of the app's container element. A simple alias
+ for `app.$(selector)`.
+
+ Example:
+
+ ```javascript
+ var $el = find('.my-selector');
+ ```
+
+ @method find
+ @param {String} selector jQuery string selector for element lookup
+ @return {Object} jQuery object representing the results of the query
+ @public
+ */
+ helper('find', find);
+
+ /**
+ Like `find`, but throws an error if the element selector returns no results.
+
+ Example:
+
+ ```javascript
+ var $el = findWithAssert('.doesnt-exist'); // throws error
+ ```
+
+ @method findWithAssert
+ @param {String} selector jQuery selector string for finding an element within
+ the DOM
+ @return {Object} jQuery object representing the results of the query
+ @throws {Error} throws error if jQuery object returned has a length of 0
+ @public
+ */
+ helper('findWithAssert', findWithAssert);
+
+ /**
+ Causes the run loop to process any pending events. This is used to ensure that
+ any async operations from other helpers (or your assertions) have been processed.
+
+ This is most often used as the return value for the helper functions (see 'click',
+ 'fillIn','visit',etc).
+
+ Example:
+
+ ```javascript
+ Ember.Test.registerAsyncHelper('loginUser', function(app, username, password) {
+ visit('secured/path/here')
+ .fillIn('#username', username)
+ .fillIn('#password', password)
+ .click('.submit')
+
+ return app.testHelpers.wait();
+ });
+
+ @method wait
+ @param {Object} value The value to be returned.
+ @return {RSVP.Promise}
+ @public
+ */
+ asyncHelper('wait', wait);
+ asyncHelper('andThen', andThen);
+
+ /**
+ Returns the currently active route name.
+
+ Example:
+
+ ```javascript
+ function validateRouteName() {
+ equal(currentRouteName(), 'some.path', "correct route was transitioned into.");
+ }
+
+ visit('/some/path').then(validateRouteName)
+ ```
+
+ @method currentRouteName
+ @return {Object} The name of the currently active route.
+ @since 1.5.0
+ @public
+ */
+ helper('currentRouteName', currentRouteName);
+
+ /**
+ Returns the current path.
+
+ Example:
+
+ ```javascript
+ function validateURL() {
+ equal(currentPath(), 'some.path.index', "correct path was transitioned into.");
+ }
+
+ click('#some-link-id').then(validateURL);
+ ```
+
+ @method currentPath
+ @return {Object} The currently active path.
+ @since 1.5.0
+ @public
+ */
+ helper('currentPath', currentPath);
+
+ /**
+ Returns the current URL.
+
+ Example:
+
+ ```javascript
+ function validateURL() {
+ equal(currentURL(), '/some/path', "correct URL was transitioned into.");
+ }
+
+ click('#some-link-id').then(validateURL);
+ ```
+
+ @method currentURL
+ @return {Object} The currently active URL.
+ @since 1.5.0
+ @public
+ */
+ helper('currentURL', currentURL);
+
+ /**
+ Pauses the current test - this is useful for debugging while testing or for test-driving.
+ It allows you to inspect the state of your application at any point.
+
+ Example (The test will pause before clicking the button):
+
+ ```javascript
+ visit('/')
+ return pauseTest();
+
+ click('.btn');
+ ```
+
+ @since 1.9.0
+ @method pauseTest
+ @return {Object} A promise that will never resolve
+ @public
+ */
+ helper('pauseTest', pauseTest);
+
+ /**
+ Triggers the given DOM event on the element identified by the provided selector.
+
+ Example:
+
+ ```javascript
+ triggerEvent('#some-elem-id', 'blur');
+ ```
+
+ This is actually used internally by the `keyEvent` helper like so:
+
+ ```javascript
+ triggerEvent('#some-elem-id', 'keypress', { keyCode: 13 });
+ ```
+
+ @method triggerEvent
+ @param {String} selector jQuery selector for finding element on the DOM
+ @param {String} [context] jQuery selector that will limit the selector
+ argument to find only within the context's children
+ @param {String} type The event type to be triggered.
+ @param {Object} [options] The options to be passed to jQuery.Event.
+ @return {RSVP.Promise}
+ @since 1.5.0
+ @public
+ */
+ asyncHelper('triggerEvent', triggerEvent);
+});
+
+// Firefox does not trigger the `focusin` event if the window
+// does not have focus. If the document doesn't have focus just
+// use trigger('focusin') instead.
+enifed('ember-testing/index', ['exports', 'ember-metal/core', 'ember-testing/initializers', 'ember-testing/support', 'ember-testing/setup_for_testing', 'ember-testing/test', 'ember-testing/adapters/adapter', 'ember-testing/adapters/qunit', 'ember-testing/helpers'], function (exports, _emberMetalCore, _emberTestingInitializers, _emberTestingSupport, _emberTestingSetup_for_testing, _emberTestingTest, _emberTestingAdaptersAdapter, _emberTestingAdaptersQunit, _emberTestingHelpers) {
+ 'use strict';
+
+ // adds helpers to helpers object in Test
+
+ /**
+ @module ember
+ @submodule ember-testing
+ */
+
+ _emberMetalCore.default.Test = _emberTestingTest.default;
+ _emberMetalCore.default.Test.Adapter = _emberTestingAdaptersAdapter.default;
+ _emberMetalCore.default.Test.QUnitAdapter = _emberTestingAdaptersQunit.default;
+ _emberMetalCore.default.setupForTesting = _emberTestingSetup_for_testing.default;
+});
+// to setup initializer
+// to handle various edge cases
+enifed('ember-testing/initializers', ['exports', 'ember-runtime/system/lazy_load'], function (exports, _emberRuntimeSystemLazy_load) {
+ 'use strict';
+
+ var name = 'deferReadiness in `testing` mode';
+
+ _emberRuntimeSystemLazy_load.onLoad('Ember.Application', function (Application) {
+ if (!Application.initializers[name]) {
+ Application.initializer({
+ name: name,
+
+ initialize: function (application) {
+ if (application.testing) {
+ application.deferReadiness();
+ }
+ }
+ });
+ }
+ });
+});
+enifed('ember-testing/setup_for_testing', ['exports', 'ember-metal/core', 'ember-testing/adapters/qunit', 'ember-views/system/jquery'], function (exports, _emberMetalCore, _emberTestingAdaptersQunit, _emberViewsSystemJquery) {
+ 'use strict';
+
+ exports.default = setupForTesting;
+
+ var Test, requests;
+
+ function incrementAjaxPendingRequests(_, xhr) {
+ requests.push(xhr);
+ Test.pendingAjaxRequests = requests.length;
+ }
+
+ function decrementAjaxPendingRequests(_, xhr) {
+ for (var i = 0; i < requests.length; i++) {
+ if (xhr === requests[i]) {
+ requests.splice(i, 1);
+ }
+ }
+ Test.pendingAjaxRequests = requests.length;
+ }
+
+ /**
+ Sets Ember up for testing. This is useful to perform
+ basic setup steps in order to unit test.
+
+ Use `App.setupForTesting` to perform integration tests (full
+ application testing).
+
+ @method setupForTesting
+ @namespace Ember
+ @since 1.5.0
+ @private
+ */
+
+ function setupForTesting() {
+ if (!Test) {
+ Test = requireModule('ember-testing/test')['default'];
+ }
+
+ _emberMetalCore.default.testing = true;
+
+ // if adapter is not manually set default to QUnit
+ if (!Test.adapter) {
+ Test.adapter = _emberTestingAdaptersQunit.default.create();
+ }
+
+ requests = [];
+ Test.pendingAjaxRequests = requests.length;
+
+ _emberViewsSystemJquery.default(document).off('ajaxSend', incrementAjaxPendingRequests);
+ _emberViewsSystemJquery.default(document).off('ajaxComplete', decrementAjaxPendingRequests);
+ _emberViewsSystemJquery.default(document).on('ajaxSend', incrementAjaxPendingRequests);
+ _emberViewsSystemJquery.default(document).on('ajaxComplete', decrementAjaxPendingRequests);
+ }
+});
+
+// import Test from "ember-testing/test"; // ES6TODO: fix when cycles are supported
+enifed('ember-testing/support', ['exports', 'ember-metal/debug', 'ember-views/system/jquery', 'ember-metal/environment'], function (exports, _emberMetalDebug, _emberViewsSystemJquery, _emberMetalEnvironment) {
+ 'use strict';
+
+ /**
+ @module ember
+ @submodule ember-testing
+ */
+
+ var $ = _emberViewsSystemJquery.default;
+
+ /**
+ This method creates a checkbox and triggers the click event to fire the
+ passed in handler. It is used to correct for a bug in older versions
+ of jQuery (e.g 1.8.3).
+
+ @private
+ @method testCheckboxClick
+ */
+ function testCheckboxClick(handler) {
+ $(' ').css({ position: 'absolute', left: '-1000px', top: '-1000px' }).appendTo('body').on('click', handler).trigger('click').remove();
+ }
+
+ if (_emberMetalEnvironment.default.hasDOM) {
+ $(function () {
+ /*
+ Determine whether a checkbox checked using jQuery's "click" method will have
+ the correct value for its checked property.
+ If we determine that the current jQuery version exhibits this behavior,
+ patch it to work correctly as in the commit for the actual fix:
+ https://github.com/jquery/jquery/commit/1fb2f92.
+ */
+ testCheckboxClick(function () {
+ if (!this.checked && !$.event.special.click) {
+ $.event.special.click = {
+ // For checkbox, fire native event so checked state will be right
+ trigger: function () {
+ if ($.nodeName(this, 'input') && this.type === 'checkbox' && this.click) {
+ this.click();
+ return false;
+ }
+ }
+ };
+ }
+ });
+
+ // Try again to verify that the patch took effect or blow up.
+ testCheckboxClick(function () {
+ _emberMetalDebug.warn('clicked checkboxes should be checked! the jQuery patch didn\'t work', this.checked, { id: 'ember-testing.test-checkbox-click' });
+ });
+ });
+ }
+});
+enifed('ember-testing/test', ['exports', 'ember-metal/run_loop', 'ember-runtime/ext/rsvp', 'ember-testing/setup_for_testing', 'ember-application/system/application', 'ember-runtime/system/native_array'], function (exports, _emberMetalRun_loop, _emberRuntimeExtRsvp, _emberTestingSetup_for_testing, _emberApplicationSystemApplication, _emberRuntimeSystemNative_array) {
+ 'use strict';
+
+ /**
+ @module ember
+ @submodule ember-testing
+ */
+ var helpers = {};
+ var injectHelpersCallbacks = [];
+
+ /**
+ This is a container for an assortment of testing related functionality:
+
+ * Choose your default test adapter (for your framework of choice).
+ * Register/Unregister additional test helpers.
+ * Setup callbacks to be fired when the test helpers are injected into
+ your application.
+
+ @class Test
+ @namespace Ember
+ @public
+ */
+ var Test = {
+ /**
+ Hash containing all known test helpers.
+ @property _helpers
+ @private
+ @since 1.7.0
+ */
+ _helpers: helpers,
+
+ /**
+ `registerHelper` is used to register a test helper that will be injected
+ when `App.injectTestHelpers` is called.
+ The helper method will always be called with the current Application as
+ the first parameter.
+ For example:
+ ```javascript
+ Ember.Test.registerHelper('boot', function(app) {
+ Ember.run(app, app.advanceReadiness);
+ });
+ ```
+ This helper can later be called without arguments because it will be
+ called with `app` as the first parameter.
+ ```javascript
+ App = Ember.Application.create();
+ App.injectTestHelpers();
+ boot();
+ ```
+ @public
+ @method registerHelper
+ @param {String} name The name of the helper method to add.
+ @param {Function} helperMethod
+ @param options {Object}
+ */
+ registerHelper: function (name, helperMethod) {
+ helpers[name] = {
+ method: helperMethod,
+ meta: { wait: false }
+ };
+ },
+
+ /**
+ `registerAsyncHelper` is used to register an async test helper that will be injected
+ when `App.injectTestHelpers` is called.
+ The helper method will always be called with the current Application as
+ the first parameter.
+ For example:
+ ```javascript
+ Ember.Test.registerAsyncHelper('boot', function(app) {
+ Ember.run(app, app.advanceReadiness);
+ });
+ ```
+ The advantage of an async helper is that it will not run
+ until the last async helper has completed. All async helpers
+ after it will wait for it complete before running.
+ For example:
+ ```javascript
+ Ember.Test.registerAsyncHelper('deletePost', function(app, postId) {
+ click('.delete-' + postId);
+ });
+ // ... in your test
+ visit('/post/2');
+ deletePost(2);
+ visit('/post/3');
+ deletePost(3);
+ ```
+ @public
+ @method registerAsyncHelper
+ @param {String} name The name of the helper method to add.
+ @param {Function} helperMethod
+ @since 1.2.0
+ */
+ registerAsyncHelper: function (name, helperMethod) {
+ helpers[name] = {
+ method: helperMethod,
+ meta: { wait: true }
+ };
+ },
+
+ /**
+ Remove a previously added helper method.
+ Example:
+ ```javascript
+ Ember.Test.unregisterHelper('wait');
+ ```
+ @public
+ @method unregisterHelper
+ @param {String} name The helper to remove.
+ */
+ unregisterHelper: function (name) {
+ delete helpers[name];
+ delete Test.Promise.prototype[name];
+ },
+
+ /**
+ Used to register callbacks to be fired whenever `App.injectTestHelpers`
+ is called.
+ The callback will receive the current application as an argument.
+ Example:
+ ```javascript
+ Ember.Test.onInjectHelpers(function() {
+ Ember.$(document).ajaxSend(function() {
+ Test.pendingAjaxRequests++;
+ });
+ Ember.$(document).ajaxComplete(function() {
+ Test.pendingAjaxRequests--;
+ });
+ });
+ ```
+ @public
+ @method onInjectHelpers
+ @param {Function} callback The function to be called.
+ */
+ onInjectHelpers: function (callback) {
+ injectHelpersCallbacks.push(callback);
+ },
+
+ /**
+ This returns a thenable tailored for testing. It catches failed
+ `onSuccess` callbacks and invokes the `Ember.Test.adapter.exception`
+ callback in the last chained then.
+ This method should be returned by async helpers such as `wait`.
+ @public
+ @method promise
+ @param {Function} resolver The function used to resolve the promise.
+ @param {String} label An optional string for identifying the promise.
+ */
+ promise: function (resolver, label) {
+ var fullLabel = 'Ember.Test.promise: ' + (label || '');
+ return new Test.Promise(resolver, fullLabel);
+ },
+
+ /**
+ Used to allow ember-testing to communicate with a specific testing
+ framework.
+ You can manually set it before calling `App.setupForTesting()`.
+ Example:
+ ```javascript
+ Ember.Test.adapter = MyCustomAdapter.create()
+ ```
+ If you do not set it, ember-testing will default to `Ember.Test.QUnitAdapter`.
+ @public
+ @property adapter
+ @type {Class} The adapter to be used.
+ @default Ember.Test.QUnitAdapter
+ */
+ adapter: null,
+
+ /**
+ Replacement for `Ember.RSVP.resolve`
+ The only difference is this uses
+ an instance of `Ember.Test.Promise`
+ @public
+ @method resolve
+ @param {Mixed} The value to resolve
+ @since 1.2.0
+ */
+ resolve: function (val) {
+ return Test.promise(function (resolve) {
+ return resolve(val);
+ });
+ },
+
+ /**
+ This allows ember-testing to play nicely with other asynchronous
+ events, such as an application that is waiting for a CSS3
+ transition or an IndexDB transaction.
+ For example:
+ ```javascript
+ Ember.Test.registerWaiter(function() {
+ return myPendingTransactions() == 0;
+ });
+ ```
+ The `context` argument allows you to optionally specify the `this`
+ with which your callback will be invoked.
+ For example:
+ ```javascript
+ Ember.Test.registerWaiter(MyDB, MyDB.hasPendingTransactions);
+ ```
+ @public
+ @method registerWaiter
+ @param {Object} context (optional)
+ @param {Function} callback
+ @since 1.2.0
+ */
+ registerWaiter: function (context, callback) {
+ if (arguments.length === 1) {
+ callback = context;
+ context = null;
+ }
+ if (!this.waiters) {
+ this.waiters = _emberRuntimeSystemNative_array.A();
+ }
+ this.waiters.push([context, callback]);
+ },
+ /**
+ `unregisterWaiter` is used to unregister a callback that was
+ registered with `registerWaiter`.
+ @public
+ @method unregisterWaiter
+ @param {Object} context (optional)
+ @param {Function} callback
+ @since 1.2.0
+ */
+ unregisterWaiter: function (context, callback) {
+ if (!this.waiters) {
+ return;
+ }
+ if (arguments.length === 1) {
+ callback = context;
+ context = null;
+ }
+ this.waiters = _emberRuntimeSystemNative_array.A(this.waiters.filter(function (elt) {
+ return !(elt[0] === context && elt[1] === callback);
+ }));
+ }
+ };
+
+ function helper(app, name) {
+ var fn = helpers[name].method;
+ var meta = helpers[name].meta;
+
+ return function () {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ var lastPromise;
+
+ args.unshift(app);
+
+ // some helpers are not async and
+ // need to return a value immediately.
+ // example: `find`
+ if (!meta.wait) {
+ return fn.apply(app, args);
+ }
+
+ lastPromise = run(function () {
+ return Test.resolve(Test.lastPromise);
+ });
+
+ // wait for last helper's promise to resolve and then
+ // execute. To be safe, we need to tell the adapter we're going
+ // asynchronous here, because fn may not be invoked before we
+ // return.
+ Test.adapter.asyncStart();
+ return lastPromise.then(function () {
+ return fn.apply(app, args);
+ }).finally(function () {
+ Test.adapter.asyncEnd();
+ });
+ };
+ }
+
+ function run(fn) {
+ if (!_emberMetalRun_loop.default.currentRunLoop) {
+ return _emberMetalRun_loop.default(fn);
+ } else {
+ return fn();
+ }
+ }
+
+ _emberApplicationSystemApplication.default.reopen({
+ /**
+ This property contains the testing helpers for the current application. These
+ are created once you call `injectTestHelpers` on your `Ember.Application`
+ instance. The included helpers are also available on the `window` object by
+ default, but can be used from this object on the individual application also.
+ @property testHelpers
+ @type {Object}
+ @default {}
+ @public
+ */
+ testHelpers: {},
+
+ /**
+ This property will contain the original methods that were registered
+ on the `helperContainer` before `injectTestHelpers` is called.
+ When `removeTestHelpers` is called, these methods are restored to the
+ `helperContainer`.
+ @property originalMethods
+ @type {Object}
+ @default {}
+ @private
+ @since 1.3.0
+ */
+ originalMethods: {},
+
+ /**
+ This property indicates whether or not this application is currently in
+ testing mode. This is set when `setupForTesting` is called on the current
+ application.
+ @property testing
+ @type {Boolean}
+ @default false
+ @since 1.3.0
+ @public
+ */
+ testing: false,
+
+ /**
+ This hook defers the readiness of the application, so that you can start
+ the app when your tests are ready to run. It also sets the router's
+ location to 'none', so that the window's location will not be modified
+ (preventing both accidental leaking of state between tests and interference
+ with your testing framework).
+ Example:
+ ```
+ App.setupForTesting();
+ ```
+ @method setupForTesting
+ @public
+ */
+ setupForTesting: function () {
+ _emberTestingSetup_for_testing.default();
+
+ this.testing = true;
+
+ this.Router.reopen({
+ location: 'none'
+ });
+ },
+
+ /**
+ This will be used as the container to inject the test helpers into. By
+ default the helpers are injected into `window`.
+ @property helperContainer
+ @type {Object} The object to be used for test helpers.
+ @default window
+ @since 1.2.0
+ @private
+ */
+ helperContainer: null,
+
+ /**
+ This injects the test helpers into the `helperContainer` object. If an object is provided
+ it will be used as the helperContainer. If `helperContainer` is not set it will default
+ to `window`. If a function of the same name has already been defined it will be cached
+ (so that it can be reset if the helper is removed with `unregisterHelper` or
+ `removeTestHelpers`).
+ Any callbacks registered with `onInjectHelpers` will be called once the
+ helpers have been injected.
+ Example:
+ ```
+ App.injectTestHelpers();
+ ```
+ @method injectTestHelpers
+ @public
+ */
+ injectTestHelpers: function (helperContainer) {
+ if (helperContainer) {
+ this.helperContainer = helperContainer;
+ } else {
+ this.helperContainer = window;
+ }
+
+ this.reopen({
+ willDestroy: function () {
+ this._super.apply(this, arguments);
+ this.removeTestHelpers();
+ }
+ });
+
+ this.testHelpers = {};
+ for (var name in helpers) {
+ this.originalMethods[name] = this.helperContainer[name];
+ this.testHelpers[name] = this.helperContainer[name] = helper(this, name);
+ protoWrap(Test.Promise.prototype, name, helper(this, name), helpers[name].meta.wait);
+ }
+
+ for (var i = 0, l = injectHelpersCallbacks.length; i < l; i++) {
+ injectHelpersCallbacks[i](this);
+ }
+ },
+
+ /**
+ This removes all helpers that have been registered, and resets and functions
+ that were overridden by the helpers.
+ Example:
+ ```javascript
+ App.removeTestHelpers();
+ ```
+ @public
+ @method removeTestHelpers
+ */
+ removeTestHelpers: function () {
+ if (!this.helperContainer) {
+ return;
+ }
+
+ for (var name in helpers) {
+ this.helperContainer[name] = this.originalMethods[name];
+ delete Test.Promise.prototype[name];
+ delete this.testHelpers[name];
+ delete this.originalMethods[name];
+ }
+ }
+ });
+
+ // This method is no longer needed
+ // But still here for backwards compatibility
+ // of helper chaining
+ function protoWrap(proto, name, callback, isAsync) {
+ proto[name] = function () {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ if (isAsync) {
+ return callback.apply(this, args);
+ } else {
+ return this.then(function () {
+ return callback.apply(this, args);
+ });
+ }
+ };
+ }
+
+ Test.Promise = function () {
+ _emberRuntimeExtRsvp.default.Promise.apply(this, arguments);
+ Test.lastPromise = this;
+ };
+
+ Test.Promise.prototype = Object.create(_emberRuntimeExtRsvp.default.Promise.prototype);
+ Test.Promise.prototype.constructor = Test.Promise;
+ Test.Promise.resolve = Test.resolve;
+
+ // Patch `then` to isolate async methods
+ // specifically `Ember.Test.lastPromise`
+ var originalThen = _emberRuntimeExtRsvp.default.Promise.prototype.then;
+ Test.Promise.prototype.then = function (onSuccess, onFailure) {
+ return originalThen.call(this, function (val) {
+ return isolate(onSuccess, val);
+ }, onFailure);
+ };
+
+ // This method isolates nested async methods
+ // so that they don't conflict with other last promises.
+ //
+ // 1. Set `Ember.Test.lastPromise` to null
+ // 2. Invoke method
+ // 3. Return the last promise created during method
+ function isolate(fn, val) {
+ var value, lastPromise;
+
+ // Reset lastPromise for nested helpers
+ Test.lastPromise = null;
+
+ value = fn(val);
+
+ lastPromise = Test.lastPromise;
+ Test.lastPromise = null;
+
+ // If the method returned a promise
+ // return that promise. If not,
+ // return the last async helper's promise
+ if (value && value instanceof Test.Promise || !lastPromise) {
+ return value;
+ } else {
+ return run(function () {
+ return Test.resolve(lastPromise).then(function () {
+ return value;
+ });
+ });
+ }
+ }
+
+ exports.default = Test;
+});
+requireModule("ember-testing");
+
+}());
+
+/*!
+ * QUnit 1.23.1
+ * https://qunitjs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2016-04-12T17:29Z
+ */
+
+( function( global ) {
+
+var QUnit = {};
+
+var Date = global.Date;
+var now = Date.now || function() {
+ return new Date().getTime();
+};
+
+var setTimeout = global.setTimeout;
+var clearTimeout = global.clearTimeout;
+
+// Store a local window from the global to allow direct references.
+var window = global.window;
+
+var defined = {
+ document: window && window.document !== undefined,
+ setTimeout: setTimeout !== undefined,
+ sessionStorage: ( function() {
+ var x = "qunit-test-string";
+ try {
+ sessionStorage.setItem( x, x );
+ sessionStorage.removeItem( x );
+ return true;
+ } catch ( e ) {
+ return false;
+ }
+ }() )
+};
+
+var fileName = ( sourceFromStacktrace( 0 ) || "" ).replace( /(:\d+)+\)?/, "" ).replace( /.+\//, "" );
+var globalStartCalled = false;
+var runStarted = false;
+
+var toString = Object.prototype.toString,
+ hasOwn = Object.prototype.hasOwnProperty;
+
+// Returns a new Array with the elements that are in a but not in b
+function diff( a, b ) {
+ var i, j,
+ result = a.slice();
+
+ for ( i = 0; i < result.length; i++ ) {
+ for ( j = 0; j < b.length; j++ ) {
+ if ( result[ i ] === b[ j ] ) {
+ result.splice( i, 1 );
+ i--;
+ break;
+ }
+ }
+ }
+ return result;
+}
+
+// From jquery.js
+function inArray( elem, array ) {
+ if ( array.indexOf ) {
+ return array.indexOf( elem );
+ }
+
+ for ( var i = 0, length = array.length; i < length; i++ ) {
+ if ( array[ i ] === elem ) {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+/**
+ * Makes a clone of an object using only Array or Object as base,
+ * and copies over the own enumerable properties.
+ *
+ * @param {Object} obj
+ * @return {Object} New object with only the own properties (recursively).
+ */
+function objectValues ( obj ) {
+ var key, val,
+ vals = QUnit.is( "array", obj ) ? [] : {};
+ for ( key in obj ) {
+ if ( hasOwn.call( obj, key ) ) {
+ val = obj[ key ];
+ vals[ key ] = val === Object( val ) ? objectValues( val ) : val;
+ }
+ }
+ return vals;
+}
+
+function extend( a, b, undefOnly ) {
+ for ( var prop in b ) {
+ if ( hasOwn.call( b, prop ) ) {
+
+ // Avoid "Member not found" error in IE8 caused by messing with window.constructor
+ // This block runs on every environment, so `global` is being used instead of `window`
+ // to avoid errors on node.
+ if ( prop !== "constructor" || a !== global ) {
+ if ( b[ prop ] === undefined ) {
+ delete a[ prop ];
+ } else if ( !( undefOnly && typeof a[ prop ] !== "undefined" ) ) {
+ a[ prop ] = b[ prop ];
+ }
+ }
+ }
+ }
+
+ return a;
+}
+
+function objectType( obj ) {
+ if ( typeof obj === "undefined" ) {
+ return "undefined";
+ }
+
+ // Consider: typeof null === object
+ if ( obj === null ) {
+ return "null";
+ }
+
+ var match = toString.call( obj ).match( /^\[object\s(.*)\]$/ ),
+ type = match && match[ 1 ];
+
+ switch ( type ) {
+ case "Number":
+ if ( isNaN( obj ) ) {
+ return "nan";
+ }
+ return "number";
+ case "String":
+ case "Boolean":
+ case "Array":
+ case "Set":
+ case "Map":
+ case "Date":
+ case "RegExp":
+ case "Function":
+ case "Symbol":
+ return type.toLowerCase();
+ }
+ if ( typeof obj === "object" ) {
+ return "object";
+ }
+}
+
+// Safe object type checking
+function is( type, obj ) {
+ return QUnit.objectType( obj ) === type;
+}
+
+// Doesn't support IE6 to IE9, it will return undefined on these browsers
+// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
+function extractStacktrace( e, offset ) {
+ offset = offset === undefined ? 4 : offset;
+
+ var stack, include, i;
+
+ if ( e.stack ) {
+ stack = e.stack.split( "\n" );
+ if ( /^error$/i.test( stack[ 0 ] ) ) {
+ stack.shift();
+ }
+ if ( fileName ) {
+ include = [];
+ for ( i = offset; i < stack.length; i++ ) {
+ if ( stack[ i ].indexOf( fileName ) !== -1 ) {
+ break;
+ }
+ include.push( stack[ i ] );
+ }
+ if ( include.length ) {
+ return include.join( "\n" );
+ }
+ }
+ return stack[ offset ];
+
+ // Support: Safari <=6 only
+ } else if ( e.sourceURL ) {
+
+ // Exclude useless self-reference for generated Error objects
+ if ( /qunit.js$/.test( e.sourceURL ) ) {
+ return;
+ }
+
+ // For actual exceptions, this is useful
+ return e.sourceURL + ":" + e.line;
+ }
+}
+
+function sourceFromStacktrace( offset ) {
+ var error = new Error();
+
+ // Support: Safari <=7 only, IE <=10 - 11 only
+ // Not all browsers generate the `stack` property for `new Error()`, see also #636
+ if ( !error.stack ) {
+ try {
+ throw error;
+ } catch ( err ) {
+ error = err;
+ }
+ }
+
+ return extractStacktrace( error, offset );
+}
+
+/**
+ * Config object: Maintain internal state
+ * Later exposed as QUnit.config
+ * `config` initialized at top of scope
+ */
+var config = {
+
+ // The queue of tests to run
+ queue: [],
+
+ // Block until document ready
+ blocking: true,
+
+ // By default, run previously failed tests first
+ // very useful in combination with "Hide passed tests" checked
+ reorder: true,
+
+ // By default, modify document.title when suite is done
+ altertitle: true,
+
+ // HTML Reporter: collapse every test except the first failing test
+ // If false, all failing tests will be expanded
+ collapse: true,
+
+ // By default, scroll to top of the page when suite is done
+ scrolltop: true,
+
+ // Depth up-to which object will be dumped
+ maxDepth: 5,
+
+ // When enabled, all tests must call expect()
+ requireExpects: false,
+
+ // Placeholder for user-configurable form-exposed URL parameters
+ urlConfig: [],
+
+ // Set of all modules.
+ modules: [],
+
+ // Stack of nested modules
+ moduleStack: [],
+
+ // The first unnamed module
+ currentModule: {
+ name: "",
+ tests: []
+ },
+
+ callbacks: {}
+};
+
+// Push a loose unnamed module to the modules collection
+config.modules.push( config.currentModule );
+
+var loggingCallbacks = {};
+
+// Register logging callbacks
+function registerLoggingCallbacks( obj ) {
+ var i, l, key,
+ callbackNames = [ "begin", "done", "log", "testStart", "testDone",
+ "moduleStart", "moduleDone" ];
+
+ function registerLoggingCallback( key ) {
+ var loggingCallback = function( callback ) {
+ if ( objectType( callback ) !== "function" ) {
+ throw new Error(
+ "QUnit logging methods require a callback function as their first parameters."
+ );
+ }
+
+ config.callbacks[ key ].push( callback );
+ };
+
+ // DEPRECATED: This will be removed on QUnit 2.0.0+
+ // Stores the registered functions allowing restoring
+ // at verifyLoggingCallbacks() if modified
+ loggingCallbacks[ key ] = loggingCallback;
+
+ return loggingCallback;
+ }
+
+ for ( i = 0, l = callbackNames.length; i < l; i++ ) {
+ key = callbackNames[ i ];
+
+ // Initialize key collection of logging callback
+ if ( objectType( config.callbacks[ key ] ) === "undefined" ) {
+ config.callbacks[ key ] = [];
+ }
+
+ obj[ key ] = registerLoggingCallback( key );
+ }
+}
+
+function runLoggingCallbacks( key, args ) {
+ var i, l, callbacks;
+
+ callbacks = config.callbacks[ key ];
+ for ( i = 0, l = callbacks.length; i < l; i++ ) {
+ callbacks[ i ]( args );
+ }
+}
+
+// DEPRECATED: This will be removed on 2.0.0+
+// This function verifies if the loggingCallbacks were modified by the user
+// If so, it will restore it, assign the given callback and print a console warning
+function verifyLoggingCallbacks() {
+ var loggingCallback, userCallback;
+
+ for ( loggingCallback in loggingCallbacks ) {
+ if ( QUnit[ loggingCallback ] !== loggingCallbacks[ loggingCallback ] ) {
+
+ userCallback = QUnit[ loggingCallback ];
+
+ // Restore the callback function
+ QUnit[ loggingCallback ] = loggingCallbacks[ loggingCallback ];
+
+ // Assign the deprecated given callback
+ QUnit[ loggingCallback ]( userCallback );
+
+ if ( global.console && global.console.warn ) {
+ global.console.warn(
+ "QUnit." + loggingCallback + " was replaced with a new value.\n" +
+ "Please, check out the documentation on how to apply logging callbacks.\n" +
+ "Reference: https://api.qunitjs.com/category/callbacks/"
+ );
+ }
+ }
+ }
+}
+
+( function() {
+ if ( !defined.document ) {
+ return;
+ }
+
+ // `onErrorFnPrev` initialized at top of scope
+ // Preserve other handlers
+ var onErrorFnPrev = window.onerror;
+
+ // Cover uncaught exceptions
+ // Returning true will suppress the default browser handler,
+ // returning false will let it run.
+ window.onerror = function( error, filePath, linerNr ) {
+ var ret = false;
+ if ( onErrorFnPrev ) {
+ ret = onErrorFnPrev( error, filePath, linerNr );
+ }
+
+ // Treat return value as window.onerror itself does,
+ // Only do our handling if not suppressed.
+ if ( ret !== true ) {
+ if ( QUnit.config.current ) {
+ if ( QUnit.config.current.ignoreGlobalErrors ) {
+ return true;
+ }
+ QUnit.pushFailure( error, filePath + ":" + linerNr );
+ } else {
+ QUnit.test( "global failure", extend( function() {
+ QUnit.pushFailure( error, filePath + ":" + linerNr );
+ }, { validTest: true } ) );
+ }
+ return false;
+ }
+
+ return ret;
+ };
+}() );
+
+// Figure out if we're running the tests from a server or not
+QUnit.isLocal = !( defined.document && window.location.protocol !== "file:" );
+
+// Expose the current QUnit version
+QUnit.version = "1.23.1";
+
+extend( QUnit, {
+
+ // Call on start of module test to prepend name to all tests
+ module: function( name, testEnvironment, executeNow ) {
+ var module, moduleFns;
+ var currentModule = config.currentModule;
+
+ if ( arguments.length === 2 ) {
+ if ( objectType( testEnvironment ) === "function" ) {
+ executeNow = testEnvironment;
+ testEnvironment = undefined;
+ }
+ }
+
+ // DEPRECATED: handles setup/teardown functions,
+ // beforeEach and afterEach should be used instead
+ if ( testEnvironment && testEnvironment.setup ) {
+ testEnvironment.beforeEach = testEnvironment.setup;
+ delete testEnvironment.setup;
+ }
+ if ( testEnvironment && testEnvironment.teardown ) {
+ testEnvironment.afterEach = testEnvironment.teardown;
+ delete testEnvironment.teardown;
+ }
+
+ module = createModule();
+
+ moduleFns = {
+ beforeEach: setHook( module, "beforeEach" ),
+ afterEach: setHook( module, "afterEach" )
+ };
+
+ if ( objectType( executeNow ) === "function" ) {
+ config.moduleStack.push( module );
+ setCurrentModule( module );
+ executeNow.call( module.testEnvironment, moduleFns );
+ config.moduleStack.pop();
+ module = module.parentModule || currentModule;
+ }
+
+ setCurrentModule( module );
+
+ function createModule() {
+ var parentModule = config.moduleStack.length ?
+ config.moduleStack.slice( -1 )[ 0 ] : null;
+ var moduleName = parentModule !== null ?
+ [ parentModule.name, name ].join( " > " ) : name;
+ var module = {
+ name: moduleName,
+ parentModule: parentModule,
+ tests: [],
+ moduleId: generateHash( moduleName )
+ };
+
+ var env = {};
+ if ( parentModule ) {
+ extend( env, parentModule.testEnvironment );
+ delete env.beforeEach;
+ delete env.afterEach;
+ }
+ extend( env, testEnvironment );
+ module.testEnvironment = env;
+
+ config.modules.push( module );
+ return module;
+ }
+
+ function setCurrentModule( module ) {
+ config.currentModule = module;
+ }
+
+ },
+
+ // DEPRECATED: QUnit.asyncTest() will be removed in QUnit 2.0.
+ asyncTest: asyncTest,
+
+ test: test,
+
+ skip: skip,
+
+ only: only,
+
+ // DEPRECATED: The functionality of QUnit.start() will be altered in QUnit 2.0.
+ // In QUnit 2.0, invoking it will ONLY affect the `QUnit.config.autostart` blocking behavior.
+ start: function( count ) {
+ var globalStartAlreadyCalled = globalStartCalled;
+
+ if ( !config.current ) {
+ globalStartCalled = true;
+
+ if ( runStarted ) {
+ throw new Error( "Called start() outside of a test context while already started" );
+ } else if ( globalStartAlreadyCalled || count > 1 ) {
+ throw new Error( "Called start() outside of a test context too many times" );
+ } else if ( config.autostart ) {
+ throw new Error( "Called start() outside of a test context when " +
+ "QUnit.config.autostart was true" );
+ } else if ( !config.pageLoaded ) {
+
+ // The page isn't completely loaded yet, so bail out and let `QUnit.load` handle it
+ config.autostart = true;
+ return;
+ }
+ } else {
+
+ // If a test is running, adjust its semaphore
+ config.current.semaphore -= count || 1;
+
+ // If semaphore is non-numeric, throw error
+ if ( isNaN( config.current.semaphore ) ) {
+ config.current.semaphore = 0;
+
+ QUnit.pushFailure(
+ "Called start() with a non-numeric decrement.",
+ sourceFromStacktrace( 2 )
+ );
+ return;
+ }
+
+ // Don't start until equal number of stop-calls
+ if ( config.current.semaphore > 0 ) {
+ return;
+ }
+
+ // Throw an Error if start is called more often than stop
+ if ( config.current.semaphore < 0 ) {
+ config.current.semaphore = 0;
+
+ QUnit.pushFailure(
+ "Called start() while already started (test's semaphore was 0 already)",
+ sourceFromStacktrace( 2 )
+ );
+ return;
+ }
+ }
+
+ resumeProcessing();
+ },
+
+ // DEPRECATED: QUnit.stop() will be removed in QUnit 2.0.
+ stop: function( count ) {
+
+ // If there isn't a test running, don't allow QUnit.stop() to be called
+ if ( !config.current ) {
+ throw new Error( "Called stop() outside of a test context" );
+ }
+
+ // If a test is running, adjust its semaphore
+ config.current.semaphore += count || 1;
+
+ pauseProcessing();
+ },
+
+ config: config,
+
+ is: is,
+
+ objectType: objectType,
+
+ extend: extend,
+
+ load: function() {
+ config.pageLoaded = true;
+
+ // Initialize the configuration options
+ extend( config, {
+ stats: { all: 0, bad: 0 },
+ moduleStats: { all: 0, bad: 0 },
+ started: 0,
+ updateRate: 1000,
+ autostart: true,
+ filter: ""
+ }, true );
+
+ config.blocking = false;
+
+ if ( config.autostart ) {
+ resumeProcessing();
+ }
+ },
+
+ stack: function( offset ) {
+ offset = ( offset || 0 ) + 2;
+ return sourceFromStacktrace( offset );
+ }
+} );
+
+registerLoggingCallbacks( QUnit );
+
+function begin() {
+ var i, l,
+ modulesLog = [];
+
+ // If the test run hasn't officially begun yet
+ if ( !config.started ) {
+
+ // Record the time of the test run's beginning
+ config.started = now();
+
+ verifyLoggingCallbacks();
+
+ // Delete the loose unnamed module if unused.
+ if ( config.modules[ 0 ].name === "" && config.modules[ 0 ].tests.length === 0 ) {
+ config.modules.shift();
+ }
+
+ // Avoid unnecessary information by not logging modules' test environments
+ for ( i = 0, l = config.modules.length; i < l; i++ ) {
+ modulesLog.push( {
+ name: config.modules[ i ].name,
+ tests: config.modules[ i ].tests
+ } );
+ }
+
+ // The test run is officially beginning now
+ runLoggingCallbacks( "begin", {
+ totalTests: Test.count,
+ modules: modulesLog
+ } );
+ }
+
+ config.blocking = false;
+ process( true );
+}
+
+function process( last ) {
+ function next() {
+ process( last );
+ }
+ var start = now();
+ config.depth = ( config.depth || 0 ) + 1;
+
+ while ( config.queue.length && !config.blocking ) {
+ if ( !defined.setTimeout || config.updateRate <= 0 ||
+ ( ( now() - start ) < config.updateRate ) ) {
+ if ( config.current ) {
+
+ // Reset async tracking for each phase of the Test lifecycle
+ config.current.usedAsync = false;
+ }
+ config.queue.shift()();
+ } else {
+ setTimeout( next, 13 );
+ break;
+ }
+ }
+ config.depth--;
+ if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {
+ done();
+ }
+}
+
+function pauseProcessing() {
+ config.blocking = true;
+
+ if ( config.testTimeout && defined.setTimeout ) {
+ clearTimeout( config.timeout );
+ config.timeout = setTimeout( function() {
+ if ( config.current ) {
+ config.current.semaphore = 0;
+ QUnit.pushFailure( "Test timed out", sourceFromStacktrace( 2 ) );
+ } else {
+ throw new Error( "Test timed out" );
+ }
+ resumeProcessing();
+ }, config.testTimeout );
+ }
+}
+
+function resumeProcessing() {
+ runStarted = true;
+
+ // A slight delay to allow this iteration of the event loop to finish (more assertions, etc.)
+ if ( defined.setTimeout ) {
+ setTimeout( function() {
+ if ( config.current && config.current.semaphore > 0 ) {
+ return;
+ }
+ if ( config.timeout ) {
+ clearTimeout( config.timeout );
+ }
+
+ begin();
+ }, 13 );
+ } else {
+ begin();
+ }
+}
+
+function done() {
+ var runtime, passed;
+
+ config.autorun = true;
+
+ // Log the last module results
+ if ( config.previousModule ) {
+ runLoggingCallbacks( "moduleDone", {
+ name: config.previousModule.name,
+ tests: config.previousModule.tests,
+ failed: config.moduleStats.bad,
+ passed: config.moduleStats.all - config.moduleStats.bad,
+ total: config.moduleStats.all,
+ runtime: now() - config.moduleStats.started
+ } );
+ }
+ delete config.previousModule;
+
+ runtime = now() - config.started;
+ passed = config.stats.all - config.stats.bad;
+
+ runLoggingCallbacks( "done", {
+ failed: config.stats.bad,
+ passed: passed,
+ total: config.stats.all,
+ runtime: runtime
+ } );
+}
+
+function setHook( module, hookName ) {
+ if ( module.testEnvironment === undefined ) {
+ module.testEnvironment = {};
+ }
+
+ return function( callback ) {
+ module.testEnvironment[ hookName ] = callback;
+ };
+}
+
+var focused = false;
+var priorityCount = 0;
+var unitSampler;
+
+function Test( settings ) {
+ var i, l;
+
+ ++Test.count;
+
+ extend( this, settings );
+ this.assertions = [];
+ this.semaphore = 0;
+ this.usedAsync = false;
+ this.module = config.currentModule;
+ this.stack = sourceFromStacktrace( 3 );
+
+ // Register unique strings
+ for ( i = 0, l = this.module.tests; i < l.length; i++ ) {
+ if ( this.module.tests[ i ].name === this.testName ) {
+ this.testName += " ";
+ }
+ }
+
+ this.testId = generateHash( this.module.name, this.testName );
+
+ this.module.tests.push( {
+ name: this.testName,
+ testId: this.testId
+ } );
+
+ if ( settings.skip ) {
+
+ // Skipped tests will fully ignore any sent callback
+ this.callback = function() {};
+ this.async = false;
+ this.expected = 0;
+ } else {
+ this.assert = new Assert( this );
+ }
+}
+
+Test.count = 0;
+
+Test.prototype = {
+ before: function() {
+ if (
+
+ // Emit moduleStart when we're switching from one module to another
+ this.module !== config.previousModule ||
+
+ // They could be equal (both undefined) but if the previousModule property doesn't
+ // yet exist it means this is the first test in a suite that isn't wrapped in a
+ // module, in which case we'll just emit a moduleStart event for 'undefined'.
+ // Without this, reporters can get testStart before moduleStart which is a problem.
+ !hasOwn.call( config, "previousModule" )
+ ) {
+ if ( hasOwn.call( config, "previousModule" ) ) {
+ runLoggingCallbacks( "moduleDone", {
+ name: config.previousModule.name,
+ tests: config.previousModule.tests,
+ failed: config.moduleStats.bad,
+ passed: config.moduleStats.all - config.moduleStats.bad,
+ total: config.moduleStats.all,
+ runtime: now() - config.moduleStats.started
+ } );
+ }
+ config.previousModule = this.module;
+ config.moduleStats = { all: 0, bad: 0, started: now() };
+ runLoggingCallbacks( "moduleStart", {
+ name: this.module.name,
+ tests: this.module.tests
+ } );
+ }
+
+ config.current = this;
+
+ if ( this.module.testEnvironment ) {
+ delete this.module.testEnvironment.beforeEach;
+ delete this.module.testEnvironment.afterEach;
+ }
+ this.testEnvironment = extend( {}, this.module.testEnvironment );
+
+ this.started = now();
+ runLoggingCallbacks( "testStart", {
+ name: this.testName,
+ module: this.module.name,
+ testId: this.testId
+ } );
+
+ if ( !config.pollution ) {
+ saveGlobal();
+ }
+ },
+
+ run: function() {
+ var promise;
+
+ config.current = this;
+
+ if ( this.async ) {
+ QUnit.stop();
+ }
+
+ this.callbackStarted = now();
+
+ if ( config.notrycatch ) {
+ runTest( this );
+ return;
+ }
+
+ try {
+ runTest( this );
+ } catch ( e ) {
+ this.pushFailure( "Died on test #" + ( this.assertions.length + 1 ) + " " +
+ this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
+
+ // Else next test will carry the responsibility
+ saveGlobal();
+
+ // Restart the tests if they're blocking
+ if ( config.blocking ) {
+ QUnit.start();
+ }
+ }
+
+ function runTest( test ) {
+ promise = test.callback.call( test.testEnvironment, test.assert );
+ test.resolvePromise( promise );
+ }
+ },
+
+ after: function() {
+ checkPollution();
+ },
+
+ queueHook: function( hook, hookName ) {
+ var promise,
+ test = this;
+ return function runHook() {
+ config.current = test;
+ if ( config.notrycatch ) {
+ callHook();
+ return;
+ }
+ try {
+ callHook();
+ } catch ( error ) {
+ test.pushFailure( hookName + " failed on " + test.testName + ": " +
+ ( error.message || error ), extractStacktrace( error, 0 ) );
+ }
+
+ function callHook() {
+ promise = hook.call( test.testEnvironment, test.assert );
+ test.resolvePromise( promise, hookName );
+ }
+ };
+ },
+
+ // Currently only used for module level hooks, can be used to add global level ones
+ hooks: function( handler ) {
+ var hooks = [];
+
+ function processHooks( test, module ) {
+ if ( module.parentModule ) {
+ processHooks( test, module.parentModule );
+ }
+ if ( module.testEnvironment &&
+ QUnit.objectType( module.testEnvironment[ handler ] ) === "function" ) {
+ hooks.push( test.queueHook( module.testEnvironment[ handler ], handler ) );
+ }
+ }
+
+ // Hooks are ignored on skipped tests
+ if ( !this.skip ) {
+ processHooks( this, this.module );
+ }
+ return hooks;
+ },
+
+ finish: function() {
+ config.current = this;
+ if ( config.requireExpects && this.expected === null ) {
+ this.pushFailure( "Expected number of assertions to be defined, but expect() was " +
+ "not called.", this.stack );
+ } else if ( this.expected !== null && this.expected !== this.assertions.length ) {
+ this.pushFailure( "Expected " + this.expected + " assertions, but " +
+ this.assertions.length + " were run", this.stack );
+ } else if ( this.expected === null && !this.assertions.length ) {
+ this.pushFailure( "Expected at least one assertion, but none were run - call " +
+ "expect(0) to accept zero assertions.", this.stack );
+ }
+
+ var i,
+ bad = 0;
+
+ this.runtime = now() - this.started;
+ config.stats.all += this.assertions.length;
+ config.moduleStats.all += this.assertions.length;
+
+ for ( i = 0; i < this.assertions.length; i++ ) {
+ if ( !this.assertions[ i ].result ) {
+ bad++;
+ config.stats.bad++;
+ config.moduleStats.bad++;
+ }
+ }
+
+ runLoggingCallbacks( "testDone", {
+ name: this.testName,
+ module: this.module.name,
+ skipped: !!this.skip,
+ failed: bad,
+ passed: this.assertions.length - bad,
+ total: this.assertions.length,
+ runtime: this.runtime,
+
+ // HTML Reporter use
+ assertions: this.assertions,
+ testId: this.testId,
+
+ // Source of Test
+ source: this.stack,
+
+ // DEPRECATED: this property will be removed in 2.0.0, use runtime instead
+ duration: this.runtime
+ } );
+
+ // QUnit.reset() is deprecated and will be replaced for a new
+ // fixture reset function on QUnit 2.0/2.1.
+ // It's still called here for backwards compatibility handling
+ QUnit.reset();
+
+ config.current = undefined;
+ },
+
+ queue: function() {
+ var priority,
+ test = this;
+
+ if ( !this.valid() ) {
+ return;
+ }
+
+ function run() {
+
+ // Each of these can by async
+ synchronize( [
+ function() {
+ test.before();
+ },
+
+ test.hooks( "beforeEach" ),
+ function() {
+ test.run();
+ },
+
+ test.hooks( "afterEach" ).reverse(),
+
+ function() {
+ test.after();
+ },
+ function() {
+ test.finish();
+ }
+ ] );
+ }
+
+ // Prioritize previously failed tests, detected from sessionStorage
+ priority = QUnit.config.reorder && defined.sessionStorage &&
+ +sessionStorage.getItem( "qunit-test-" + this.module.name + "-" + this.testName );
+
+ return synchronize( run, priority, config.seed );
+ },
+
+ pushResult: function( resultInfo ) {
+
+ // Destructure of resultInfo = { result, actual, expected, message, negative }
+ var source,
+ details = {
+ module: this.module.name,
+ name: this.testName,
+ result: resultInfo.result,
+ message: resultInfo.message,
+ actual: resultInfo.actual,
+ expected: resultInfo.expected,
+ testId: this.testId,
+ negative: resultInfo.negative || false,
+ runtime: now() - this.started
+ };
+
+ if ( !resultInfo.result ) {
+ source = sourceFromStacktrace();
+
+ if ( source ) {
+ details.source = source;
+ }
+ }
+
+ runLoggingCallbacks( "log", details );
+
+ this.assertions.push( {
+ result: !!resultInfo.result,
+ message: resultInfo.message
+ } );
+ },
+
+ pushFailure: function( message, source, actual ) {
+ if ( !( this instanceof Test ) ) {
+ throw new Error( "pushFailure() assertion outside test context, was " +
+ sourceFromStacktrace( 2 ) );
+ }
+
+ var details = {
+ module: this.module.name,
+ name: this.testName,
+ result: false,
+ message: message || "error",
+ actual: actual || null,
+ testId: this.testId,
+ runtime: now() - this.started
+ };
+
+ if ( source ) {
+ details.source = source;
+ }
+
+ runLoggingCallbacks( "log", details );
+
+ this.assertions.push( {
+ result: false,
+ message: message
+ } );
+ },
+
+ resolvePromise: function( promise, phase ) {
+ var then, message,
+ test = this;
+ if ( promise != null ) {
+ then = promise.then;
+ if ( QUnit.objectType( then ) === "function" ) {
+ QUnit.stop();
+ then.call(
+ promise,
+ function() { QUnit.start(); },
+ function( error ) {
+ message = "Promise rejected " +
+ ( !phase ? "during" : phase.replace( /Each$/, "" ) ) +
+ " " + test.testName + ": " + ( error.message || error );
+ test.pushFailure( message, extractStacktrace( error, 0 ) );
+
+ // Else next test will carry the responsibility
+ saveGlobal();
+
+ // Unblock
+ QUnit.start();
+ }
+ );
+ }
+ }
+ },
+
+ valid: function() {
+ var filter = config.filter,
+ regexFilter = /^(!?)\/([\w\W]*)\/(i?$)/.exec( filter ),
+ module = config.module && config.module.toLowerCase(),
+ fullName = ( this.module.name + ": " + this.testName );
+
+ function moduleChainNameMatch( testModule ) {
+ var testModuleName = testModule.name ? testModule.name.toLowerCase() : null;
+ if ( testModuleName === module ) {
+ return true;
+ } else if ( testModule.parentModule ) {
+ return moduleChainNameMatch( testModule.parentModule );
+ } else {
+ return false;
+ }
+ }
+
+ function moduleChainIdMatch( testModule ) {
+ return inArray( testModule.moduleId, config.moduleId ) > -1 ||
+ testModule.parentModule && moduleChainIdMatch( testModule.parentModule );
+ }
+
+ // Internally-generated tests are always valid
+ if ( this.callback && this.callback.validTest ) {
+ return true;
+ }
+
+ if ( config.moduleId && config.moduleId.length > 0 &&
+ !moduleChainIdMatch( this.module ) ) {
+
+ return false;
+ }
+
+ if ( config.testId && config.testId.length > 0 &&
+ inArray( this.testId, config.testId ) < 0 ) {
+
+ return false;
+ }
+
+ if ( module && !moduleChainNameMatch( this.module ) ) {
+ return false;
+ }
+
+ if ( !filter ) {
+ return true;
+ }
+
+ return regexFilter ?
+ this.regexFilter( !!regexFilter[ 1 ], regexFilter[ 2 ], regexFilter[ 3 ], fullName ) :
+ this.stringFilter( filter, fullName );
+ },
+
+ regexFilter: function( exclude, pattern, flags, fullName ) {
+ var regex = new RegExp( pattern, flags );
+ var match = regex.test( fullName );
+
+ return match !== exclude;
+ },
+
+ stringFilter: function( filter, fullName ) {
+ filter = filter.toLowerCase();
+ fullName = fullName.toLowerCase();
+
+ var include = filter.charAt( 0 ) !== "!";
+ if ( !include ) {
+ filter = filter.slice( 1 );
+ }
+
+ // If the filter matches, we need to honour include
+ if ( fullName.indexOf( filter ) !== -1 ) {
+ return include;
+ }
+
+ // Otherwise, do the opposite
+ return !include;
+ }
+};
+
+// Resets the test setup. Useful for tests that modify the DOM.
+/*
+DEPRECATED: Use multiple tests instead of resetting inside a test.
+Use testStart or testDone for custom cleanup.
+This method will throw an error in 2.0, and will be removed in 2.1
+*/
+QUnit.reset = function() {
+
+ // Return on non-browser environments
+ // This is necessary to not break on node tests
+ if ( !defined.document ) {
+ return;
+ }
+
+ var fixture = defined.document && document.getElementById &&
+ document.getElementById( "qunit-fixture" );
+
+ if ( fixture ) {
+ fixture.innerHTML = config.fixture;
+ }
+};
+
+QUnit.pushFailure = function() {
+ if ( !QUnit.config.current ) {
+ throw new Error( "pushFailure() assertion outside test context, in " +
+ sourceFromStacktrace( 2 ) );
+ }
+
+ // Gets current test obj
+ var currentTest = QUnit.config.current;
+
+ return currentTest.pushFailure.apply( currentTest, arguments );
+};
+
+// Based on Java's String.hashCode, a simple but not
+// rigorously collision resistant hashing function
+function generateHash( module, testName ) {
+ var hex,
+ i = 0,
+ hash = 0,
+ str = module + "\x1C" + testName,
+ len = str.length;
+
+ for ( ; i < len; i++ ) {
+ hash = ( ( hash << 5 ) - hash ) + str.charCodeAt( i );
+ hash |= 0;
+ }
+
+ // Convert the possibly negative integer hash code into an 8 character hex string, which isn't
+ // strictly necessary but increases user understanding that the id is a SHA-like hash
+ hex = ( 0x100000000 + hash ).toString( 16 );
+ if ( hex.length < 8 ) {
+ hex = "0000000" + hex;
+ }
+
+ return hex.slice( -8 );
+}
+
+function synchronize( callback, priority, seed ) {
+ var last = !priority,
+ index;
+
+ if ( QUnit.objectType( callback ) === "array" ) {
+ while ( callback.length ) {
+ synchronize( callback.shift() );
+ }
+ return;
+ }
+
+ if ( priority ) {
+ config.queue.splice( priorityCount++, 0, callback );
+ } else if ( seed ) {
+ if ( !unitSampler ) {
+ unitSampler = unitSamplerGenerator( seed );
+ }
+
+ // Insert into a random position after all priority items
+ index = Math.floor( unitSampler() * ( config.queue.length - priorityCount + 1 ) );
+ config.queue.splice( priorityCount + index, 0, callback );
+ } else {
+ config.queue.push( callback );
+ }
+
+ if ( config.autorun && !config.blocking ) {
+ process( last );
+ }
+}
+
+function unitSamplerGenerator( seed ) {
+
+ // 32-bit xorshift, requires only a nonzero seed
+ // http://excamera.com/sphinx/article-xorshift.html
+ var sample = parseInt( generateHash( seed ), 16 ) || -1;
+ return function() {
+ sample ^= sample << 13;
+ sample ^= sample >>> 17;
+ sample ^= sample << 5;
+
+ // ECMAScript has no unsigned number type
+ if ( sample < 0 ) {
+ sample += 0x100000000;
+ }
+
+ return sample / 0x100000000;
+ };
+}
+
+function saveGlobal() {
+ config.pollution = [];
+
+ if ( config.noglobals ) {
+ for ( var key in global ) {
+ if ( hasOwn.call( global, key ) ) {
+
+ // In Opera sometimes DOM element ids show up here, ignore them
+ if ( /^qunit-test-output/.test( key ) ) {
+ continue;
+ }
+ config.pollution.push( key );
+ }
+ }
+ }
+}
+
+function checkPollution() {
+ var newGlobals,
+ deletedGlobals,
+ old = config.pollution;
+
+ saveGlobal();
+
+ newGlobals = diff( config.pollution, old );
+ if ( newGlobals.length > 0 ) {
+ QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join( ", " ) );
+ }
+
+ deletedGlobals = diff( old, config.pollution );
+ if ( deletedGlobals.length > 0 ) {
+ QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join( ", " ) );
+ }
+}
+
+// Will be exposed as QUnit.asyncTest
+function asyncTest( testName, expected, callback ) {
+ if ( arguments.length === 2 ) {
+ callback = expected;
+ expected = null;
+ }
+
+ QUnit.test( testName, expected, callback, true );
+}
+
+// Will be exposed as QUnit.test
+function test( testName, expected, callback, async ) {
+ if ( focused ) { return; }
+
+ var newTest;
+
+ if ( arguments.length === 2 ) {
+ callback = expected;
+ expected = null;
+ }
+
+ newTest = new Test( {
+ testName: testName,
+ expected: expected,
+ async: async,
+ callback: callback
+ } );
+
+ newTest.queue();
+}
+
+// Will be exposed as QUnit.skip
+function skip( testName ) {
+ if ( focused ) { return; }
+
+ var test = new Test( {
+ testName: testName,
+ skip: true
+ } );
+
+ test.queue();
+}
+
+// Will be exposed as QUnit.only
+function only( testName, expected, callback, async ) {
+ var newTest;
+
+ if ( focused ) { return; }
+
+ QUnit.config.queue.length = 0;
+ focused = true;
+
+ if ( arguments.length === 2 ) {
+ callback = expected;
+ expected = null;
+ }
+
+ newTest = new Test( {
+ testName: testName,
+ expected: expected,
+ async: async,
+ callback: callback
+ } );
+
+ newTest.queue();
+}
+
+function Assert( testContext ) {
+ this.test = testContext;
+}
+
+// Assert helpers
+QUnit.assert = Assert.prototype = {
+
+ // Specify the number of expected assertions to guarantee that failed test
+ // (no assertions are run at all) don't slip through.
+ expect: function( asserts ) {
+ if ( arguments.length === 1 ) {
+ this.test.expected = asserts;
+ } else {
+ return this.test.expected;
+ }
+ },
+
+ // Increment this Test's semaphore counter, then return a function that
+ // decrements that counter a maximum of once.
+ async: function( count ) {
+ var test = this.test,
+ popped = false,
+ acceptCallCount = count;
+
+ if ( typeof acceptCallCount === "undefined" ) {
+ acceptCallCount = 1;
+ }
+
+ test.semaphore += 1;
+ test.usedAsync = true;
+ pauseProcessing();
+
+ return function done() {
+
+ if ( popped ) {
+ test.pushFailure( "Too many calls to the `assert.async` callback",
+ sourceFromStacktrace( 2 ) );
+ return;
+ }
+ acceptCallCount -= 1;
+ if ( acceptCallCount > 0 ) {
+ return;
+ }
+
+ test.semaphore -= 1;
+ popped = true;
+ resumeProcessing();
+ };
+ },
+
+ // Exports test.push() to the user API
+ // Alias of pushResult.
+ push: function( result, actual, expected, message, negative ) {
+ var currentAssert = this instanceof Assert ? this : QUnit.config.current.assert;
+ return currentAssert.pushResult( {
+ result: result,
+ actual: actual,
+ expected: expected,
+ message: message,
+ negative: negative
+ } );
+ },
+
+ pushResult: function( resultInfo ) {
+
+ // Destructure of resultInfo = { result, actual, expected, message, negative }
+ var assert = this,
+ currentTest = ( assert instanceof Assert && assert.test ) || QUnit.config.current;
+
+ // Backwards compatibility fix.
+ // Allows the direct use of global exported assertions and QUnit.assert.*
+ // Although, it's use is not recommended as it can leak assertions
+ // to other tests from async tests, because we only get a reference to the current test,
+ // not exactly the test where assertion were intended to be called.
+ if ( !currentTest ) {
+ throw new Error( "assertion outside test context, in " + sourceFromStacktrace( 2 ) );
+ }
+
+ if ( currentTest.usedAsync === true && currentTest.semaphore === 0 ) {
+ currentTest.pushFailure( "Assertion after the final `assert.async` was resolved",
+ sourceFromStacktrace( 2 ) );
+
+ // Allow this assertion to continue running anyway...
+ }
+
+ if ( !( assert instanceof Assert ) ) {
+ assert = currentTest.assert;
+ }
+
+ return assert.test.pushResult( resultInfo );
+ },
+
+ ok: function( result, message ) {
+ message = message || ( result ? "okay" : "failed, expected argument to be truthy, was: " +
+ QUnit.dump.parse( result ) );
+ this.pushResult( {
+ result: !!result,
+ actual: result,
+ expected: true,
+ message: message
+ } );
+ },
+
+ notOk: function( result, message ) {
+ message = message || ( !result ? "okay" : "failed, expected argument to be falsy, was: " +
+ QUnit.dump.parse( result ) );
+ this.pushResult( {
+ result: !result,
+ actual: result,
+ expected: false,
+ message: message
+ } );
+ },
+
+ equal: function( actual, expected, message ) {
+ /*jshint eqeqeq:false */
+ this.pushResult( {
+ result: expected == actual,
+ actual: actual,
+ expected: expected,
+ message: message
+ } );
+ },
+
+ notEqual: function( actual, expected, message ) {
+ /*jshint eqeqeq:false */
+ this.pushResult( {
+ result: expected != actual,
+ actual: actual,
+ expected: expected,
+ message: message,
+ negative: true
+ } );
+ },
+
+ propEqual: function( actual, expected, message ) {
+ actual = objectValues( actual );
+ expected = objectValues( expected );
+ this.pushResult( {
+ result: QUnit.equiv( actual, expected ),
+ actual: actual,
+ expected: expected,
+ message: message
+ } );
+ },
+
+ notPropEqual: function( actual, expected, message ) {
+ actual = objectValues( actual );
+ expected = objectValues( expected );
+ this.pushResult( {
+ result: !QUnit.equiv( actual, expected ),
+ actual: actual,
+ expected: expected,
+ message: message,
+ negative: true
+ } );
+ },
+
+ deepEqual: function( actual, expected, message ) {
+ this.pushResult( {
+ result: QUnit.equiv( actual, expected ),
+ actual: actual,
+ expected: expected,
+ message: message
+ } );
+ },
+
+ notDeepEqual: function( actual, expected, message ) {
+ this.pushResult( {
+ result: !QUnit.equiv( actual, expected ),
+ actual: actual,
+ expected: expected,
+ message: message,
+ negative: true
+ } );
+ },
+
+ strictEqual: function( actual, expected, message ) {
+ this.pushResult( {
+ result: expected === actual,
+ actual: actual,
+ expected: expected,
+ message: message
+ } );
+ },
+
+ notStrictEqual: function( actual, expected, message ) {
+ this.pushResult( {
+ result: expected !== actual,
+ actual: actual,
+ expected: expected,
+ message: message,
+ negative: true
+ } );
+ },
+
+ "throws": function( block, expected, message ) {
+ var actual, expectedType,
+ expectedOutput = expected,
+ ok = false,
+ currentTest = ( this instanceof Assert && this.test ) || QUnit.config.current;
+
+ // 'expected' is optional unless doing string comparison
+ if ( message == null && typeof expected === "string" ) {
+ message = expected;
+ expected = null;
+ }
+
+ currentTest.ignoreGlobalErrors = true;
+ try {
+ block.call( currentTest.testEnvironment );
+ } catch ( e ) {
+ actual = e;
+ }
+ currentTest.ignoreGlobalErrors = false;
+
+ if ( actual ) {
+ expectedType = QUnit.objectType( expected );
+
+ // We don't want to validate thrown error
+ if ( !expected ) {
+ ok = true;
+ expectedOutput = null;
+
+ // Expected is a regexp
+ } else if ( expectedType === "regexp" ) {
+ ok = expected.test( errorString( actual ) );
+
+ // Expected is a string
+ } else if ( expectedType === "string" ) {
+ ok = expected === errorString( actual );
+
+ // Expected is a constructor, maybe an Error constructor
+ } else if ( expectedType === "function" && actual instanceof expected ) {
+ ok = true;
+
+ // Expected is an Error object
+ } else if ( expectedType === "object" ) {
+ ok = actual instanceof expected.constructor &&
+ actual.name === expected.name &&
+ actual.message === expected.message;
+
+ // Expected is a validation function which returns true if validation passed
+ } else if ( expectedType === "function" && expected.call( {}, actual ) === true ) {
+ expectedOutput = null;
+ ok = true;
+ }
+ }
+
+ currentTest.assert.pushResult( {
+ result: ok,
+ actual: actual,
+ expected: expectedOutput,
+ message: message
+ } );
+ }
+};
+
+// Provide an alternative to assert.throws(), for environments that consider throws a reserved word
+// Known to us are: Closure Compiler, Narwhal
+( function() {
+ /*jshint sub:true */
+ Assert.prototype.raises = Assert.prototype [ "throws" ]; //jscs:ignore requireDotNotation
+}() );
+
+function errorString( error ) {
+ var name, message,
+ resultErrorString = error.toString();
+ if ( resultErrorString.substring( 0, 7 ) === "[object" ) {
+ name = error.name ? error.name.toString() : "Error";
+ message = error.message ? error.message.toString() : "";
+ if ( name && message ) {
+ return name + ": " + message;
+ } else if ( name ) {
+ return name;
+ } else if ( message ) {
+ return message;
+ } else {
+ return "Error";
+ }
+ } else {
+ return resultErrorString;
+ }
+}
+
+// Test for equality any JavaScript type.
+// Author: Philippe Rathé
+QUnit.equiv = ( function() {
+
+ // Stack to decide between skip/abort functions
+ var callers = [];
+
+ // Stack to avoiding loops from circular referencing
+ var parents = [];
+ var parentsB = [];
+
+ var getProto = Object.getPrototypeOf || function( obj ) {
+
+ /*jshint proto: true */
+ return obj.__proto__;
+ };
+
+ function useStrictEquality( b, a ) {
+
+ // To catch short annotation VS 'new' annotation of a declaration. e.g.:
+ // `var i = 1;`
+ // `var j = new Number(1);`
+ if ( typeof a === "object" ) {
+ a = a.valueOf();
+ }
+ if ( typeof b === "object" ) {
+ b = b.valueOf();
+ }
+
+ return a === b;
+ }
+
+ function compareConstructors( a, b ) {
+ var protoA = getProto( a );
+ var protoB = getProto( b );
+
+ // Comparing constructors is more strict than using `instanceof`
+ if ( a.constructor === b.constructor ) {
+ return true;
+ }
+
+ // Ref #851
+ // If the obj prototype descends from a null constructor, treat it
+ // as a null prototype.
+ if ( protoA && protoA.constructor === null ) {
+ protoA = null;
+ }
+ if ( protoB && protoB.constructor === null ) {
+ protoB = null;
+ }
+
+ // Allow objects with no prototype to be equivalent to
+ // objects with Object as their constructor.
+ if ( ( protoA === null && protoB === Object.prototype ) ||
+ ( protoB === null && protoA === Object.prototype ) ) {
+ return true;
+ }
+
+ return false;
+ }
+
+ function getRegExpFlags( regexp ) {
+ return "flags" in regexp ? regexp.flags : regexp.toString().match( /[gimuy]*$/ )[ 0 ];
+ }
+
+ var callbacks = {
+ "string": useStrictEquality,
+ "boolean": useStrictEquality,
+ "number": useStrictEquality,
+ "null": useStrictEquality,
+ "undefined": useStrictEquality,
+ "symbol": useStrictEquality,
+ "date": useStrictEquality,
+
+ "nan": function() {
+ return true;
+ },
+
+ "regexp": function( b, a ) {
+ return a.source === b.source &&
+
+ // Include flags in the comparison
+ getRegExpFlags( a ) === getRegExpFlags( b );
+ },
+
+ // - skip when the property is a method of an instance (OOP)
+ // - abort otherwise,
+ // initial === would have catch identical references anyway
+ "function": function() {
+ var caller = callers[ callers.length - 1 ];
+ return caller !== Object && typeof caller !== "undefined";
+ },
+
+ "array": function( b, a ) {
+ var i, j, len, loop, aCircular, bCircular;
+
+ len = a.length;
+ if ( len !== b.length ) {
+
+ // Safe and faster
+ return false;
+ }
+
+ // Track reference to avoid circular references
+ parents.push( a );
+ parentsB.push( b );
+ for ( i = 0; i < len; i++ ) {
+ loop = false;
+ for ( j = 0; j < parents.length; j++ ) {
+ aCircular = parents[ j ] === a[ i ];
+ bCircular = parentsB[ j ] === b[ i ];
+ if ( aCircular || bCircular ) {
+ if ( a[ i ] === b[ i ] || aCircular && bCircular ) {
+ loop = true;
+ } else {
+ parents.pop();
+ parentsB.pop();
+ return false;
+ }
+ }
+ }
+ if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {
+ parents.pop();
+ parentsB.pop();
+ return false;
+ }
+ }
+ parents.pop();
+ parentsB.pop();
+ return true;
+ },
+
+ "set": function( b, a ) {
+ var innerEq,
+ outerEq = true;
+
+ if ( a.size !== b.size ) {
+ return false;
+ }
+
+ a.forEach( function( aVal ) {
+ innerEq = false;
+
+ b.forEach( function( bVal ) {
+ if ( innerEquiv( bVal, aVal ) ) {
+ innerEq = true;
+ }
+ } );
+
+ if ( !innerEq ) {
+ outerEq = false;
+ }
+ } );
+
+ return outerEq;
+ },
+
+ "map": function( b, a ) {
+ var innerEq,
+ outerEq = true;
+
+ if ( a.size !== b.size ) {
+ return false;
+ }
+
+ a.forEach( function( aVal, aKey ) {
+ innerEq = false;
+
+ b.forEach( function( bVal, bKey ) {
+ if ( innerEquiv( [ bVal, bKey ], [ aVal, aKey ] ) ) {
+ innerEq = true;
+ }
+ } );
+
+ if ( !innerEq ) {
+ outerEq = false;
+ }
+ } );
+
+ return outerEq;
+ },
+
+ "object": function( b, a ) {
+ var i, j, loop, aCircular, bCircular;
+
+ // Default to true
+ var eq = true;
+ var aProperties = [];
+ var bProperties = [];
+
+ if ( compareConstructors( a, b ) === false ) {
+ return false;
+ }
+
+ // Stack constructor before traversing properties
+ callers.push( a.constructor );
+
+ // Track reference to avoid circular references
+ parents.push( a );
+ parentsB.push( b );
+
+ // Be strict: don't ensure hasOwnProperty and go deep
+ for ( i in a ) {
+ loop = false;
+ for ( j = 0; j < parents.length; j++ ) {
+ aCircular = parents[ j ] === a[ i ];
+ bCircular = parentsB[ j ] === b[ i ];
+ if ( aCircular || bCircular ) {
+ if ( a[ i ] === b[ i ] || aCircular && bCircular ) {
+ loop = true;
+ } else {
+ eq = false;
+ break;
+ }
+ }
+ }
+ aProperties.push( i );
+ if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {
+ eq = false;
+ break;
+ }
+ }
+
+ parents.pop();
+ parentsB.pop();
+
+ // Unstack, we are done
+ callers.pop();
+
+ for ( i in b ) {
+
+ // Collect b's properties
+ bProperties.push( i );
+ }
+
+ // Ensures identical properties name
+ return eq && innerEquiv( aProperties.sort(), bProperties.sort() );
+ }
+ };
+
+ function typeEquiv( a, b ) {
+ var type = QUnit.objectType( a );
+ return QUnit.objectType( b ) === type && callbacks[ type ]( b, a );
+ }
+
+ // The real equiv function
+ function innerEquiv( a, b ) {
+
+ // We're done when there's nothing more to compare
+ if ( arguments.length < 2 ) {
+ return true;
+ }
+
+ // Require type-specific equality
+ return ( a === b || typeEquiv( a, b ) ) &&
+
+ // ...across all consecutive argument pairs
+ ( arguments.length === 2 || innerEquiv.apply( this, [].slice.call( arguments, 1 ) ) );
+ }
+
+ return innerEquiv;
+}() );
+
+// Based on jsDump by Ariel Flesler
+// http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html
+QUnit.dump = ( function() {
+ function quote( str ) {
+ return "\"" + str.toString().replace( /\\/g, "\\\\" ).replace( /"/g, "\\\"" ) + "\"";
+ }
+ function literal( o ) {
+ return o + "";
+ }
+ function join( pre, arr, post ) {
+ var s = dump.separator(),
+ base = dump.indent(),
+ inner = dump.indent( 1 );
+ if ( arr.join ) {
+ arr = arr.join( "," + s + inner );
+ }
+ if ( !arr ) {
+ return pre + post;
+ }
+ return [ pre, inner + arr, base + post ].join( s );
+ }
+ function array( arr, stack ) {
+ var i = arr.length,
+ ret = new Array( i );
+
+ if ( dump.maxDepth && dump.depth > dump.maxDepth ) {
+ return "[object Array]";
+ }
+
+ this.up();
+ while ( i-- ) {
+ ret[ i ] = this.parse( arr[ i ], undefined, stack );
+ }
+ this.down();
+ return join( "[", ret, "]" );
+ }
+
+ var reName = /^function (\w+)/,
+ dump = {
+
+ // The objType is used mostly internally, you can fix a (custom) type in advance
+ parse: function( obj, objType, stack ) {
+ stack = stack || [];
+ var res, parser, parserType,
+ inStack = inArray( obj, stack );
+
+ if ( inStack !== -1 ) {
+ return "recursion(" + ( inStack - stack.length ) + ")";
+ }
+
+ objType = objType || this.typeOf( obj );
+ parser = this.parsers[ objType ];
+ parserType = typeof parser;
+
+ if ( parserType === "function" ) {
+ stack.push( obj );
+ res = parser.call( this, obj, stack );
+ stack.pop();
+ return res;
+ }
+ return ( parserType === "string" ) ? parser : this.parsers.error;
+ },
+ typeOf: function( obj ) {
+ var type;
+ if ( obj === null ) {
+ type = "null";
+ } else if ( typeof obj === "undefined" ) {
+ type = "undefined";
+ } else if ( QUnit.is( "regexp", obj ) ) {
+ type = "regexp";
+ } else if ( QUnit.is( "date", obj ) ) {
+ type = "date";
+ } else if ( QUnit.is( "function", obj ) ) {
+ type = "function";
+ } else if ( obj.setInterval !== undefined &&
+ obj.document !== undefined &&
+ obj.nodeType === undefined ) {
+ type = "window";
+ } else if ( obj.nodeType === 9 ) {
+ type = "document";
+ } else if ( obj.nodeType ) {
+ type = "node";
+ } else if (
+
+ // Native arrays
+ toString.call( obj ) === "[object Array]" ||
+
+ // NodeList objects
+ ( typeof obj.length === "number" && obj.item !== undefined &&
+ ( obj.length ? obj.item( 0 ) === obj[ 0 ] : ( obj.item( 0 ) === null &&
+ obj[ 0 ] === undefined ) ) )
+ ) {
+ type = "array";
+ } else if ( obj.constructor === Error.prototype.constructor ) {
+ type = "error";
+ } else {
+ type = typeof obj;
+ }
+ return type;
+ },
+
+ separator: function() {
+ return this.multiline ? this.HTML ? " " : "\n" : this.HTML ? " " : " ";
+ },
+
+ // Extra can be a number, shortcut for increasing-calling-decreasing
+ indent: function( extra ) {
+ if ( !this.multiline ) {
+ return "";
+ }
+ var chr = this.indentChar;
+ if ( this.HTML ) {
+ chr = chr.replace( /\t/g, " " ).replace( / /g, " " );
+ }
+ return new Array( this.depth + ( extra || 0 ) ).join( chr );
+ },
+ up: function( a ) {
+ this.depth += a || 1;
+ },
+ down: function( a ) {
+ this.depth -= a || 1;
+ },
+ setParser: function( name, parser ) {
+ this.parsers[ name ] = parser;
+ },
+
+ // The next 3 are exposed so you can use them
+ quote: quote,
+ literal: literal,
+ join: join,
+ depth: 1,
+ maxDepth: QUnit.config.maxDepth,
+
+ // This is the list of parsers, to modify them, use dump.setParser
+ parsers: {
+ window: "[Window]",
+ document: "[Document]",
+ error: function( error ) {
+ return "Error(\"" + error.message + "\")";
+ },
+ unknown: "[Unknown]",
+ "null": "null",
+ "undefined": "undefined",
+ "function": function( fn ) {
+ var ret = "function",
+
+ // Functions never have name in IE
+ name = "name" in fn ? fn.name : ( reName.exec( fn ) || [] )[ 1 ];
+
+ if ( name ) {
+ ret += " " + name;
+ }
+ ret += "(";
+
+ ret = [ ret, dump.parse( fn, "functionArgs" ), "){" ].join( "" );
+ return join( ret, dump.parse( fn, "functionCode" ), "}" );
+ },
+ array: array,
+ nodelist: array,
+ "arguments": array,
+ object: function( map, stack ) {
+ var keys, key, val, i, nonEnumerableProperties,
+ ret = [];
+
+ if ( dump.maxDepth && dump.depth > dump.maxDepth ) {
+ return "[object Object]";
+ }
+
+ dump.up();
+ keys = [];
+ for ( key in map ) {
+ keys.push( key );
+ }
+
+ // Some properties are not always enumerable on Error objects.
+ nonEnumerableProperties = [ "message", "name" ];
+ for ( i in nonEnumerableProperties ) {
+ key = nonEnumerableProperties[ i ];
+ if ( key in map && inArray( key, keys ) < 0 ) {
+ keys.push( key );
+ }
+ }
+ keys.sort();
+ for ( i = 0; i < keys.length; i++ ) {
+ key = keys[ i ];
+ val = map[ key ];
+ ret.push( dump.parse( key, "key" ) + ": " +
+ dump.parse( val, undefined, stack ) );
+ }
+ dump.down();
+ return join( "{", ret, "}" );
+ },
+ node: function( node ) {
+ var len, i, val,
+ open = dump.HTML ? "<" : "<",
+ close = dump.HTML ? ">" : ">",
+ tag = node.nodeName.toLowerCase(),
+ ret = open + tag,
+ attrs = node.attributes;
+
+ if ( attrs ) {
+ for ( i = 0, len = attrs.length; i < len; i++ ) {
+ val = attrs[ i ].nodeValue;
+
+ // IE6 includes all attributes in .attributes, even ones not explicitly
+ // set. Those have values like undefined, null, 0, false, "" or
+ // "inherit".
+ if ( val && val !== "inherit" ) {
+ ret += " " + attrs[ i ].nodeName + "=" +
+ dump.parse( val, "attribute" );
+ }
+ }
+ }
+ ret += close;
+
+ // Show content of TextNode or CDATASection
+ if ( node.nodeType === 3 || node.nodeType === 4 ) {
+ ret += node.nodeValue;
+ }
+
+ return ret + open + "/" + tag + close;
+ },
+
+ // Function calls it internally, it's the arguments part of the function
+ functionArgs: function( fn ) {
+ var args,
+ l = fn.length;
+
+ if ( !l ) {
+ return "";
+ }
+
+ args = new Array( l );
+ while ( l-- ) {
+
+ // 97 is 'a'
+ args[ l ] = String.fromCharCode( 97 + l );
+ }
+ return " " + args.join( ", " ) + " ";
+ },
+
+ // Object calls it internally, the key part of an item in a map
+ key: quote,
+
+ // Function calls it internally, it's the content of the function
+ functionCode: "[code]",
+
+ // Node calls it internally, it's a html attribute value
+ attribute: quote,
+ string: quote,
+ date: quote,
+ regexp: literal,
+ number: literal,
+ "boolean": literal
+ },
+
+ // If true, entities are escaped ( <, >, \t, space and \n )
+ HTML: false,
+
+ // Indentation unit
+ indentChar: " ",
+
+ // If true, items in a collection, are separated by a \n, else just a space.
+ multiline: true
+ };
+
+ return dump;
+}() );
+
+// Back compat
+QUnit.jsDump = QUnit.dump;
+
+// Deprecated
+// Extend assert methods to QUnit for Backwards compatibility
+( function() {
+ var i,
+ assertions = Assert.prototype;
+
+ function applyCurrent( current ) {
+ return function() {
+ var assert = new Assert( QUnit.config.current );
+ current.apply( assert, arguments );
+ };
+ }
+
+ for ( i in assertions ) {
+ QUnit[ i ] = applyCurrent( assertions[ i ] );
+ }
+}() );
+
+// For browser, export only select globals
+if ( defined.document ) {
+
+ ( function() {
+ var i, l,
+ keys = [
+ "test",
+ "module",
+ "expect",
+ "asyncTest",
+ "start",
+ "stop",
+ "ok",
+ "notOk",
+ "equal",
+ "notEqual",
+ "propEqual",
+ "notPropEqual",
+ "deepEqual",
+ "notDeepEqual",
+ "strictEqual",
+ "notStrictEqual",
+ "throws",
+ "raises"
+ ];
+
+ for ( i = 0, l = keys.length; i < l; i++ ) {
+ window[ keys[ i ] ] = QUnit[ keys[ i ] ];
+ }
+ }() );
+
+ window.QUnit = QUnit;
+}
+
+// For nodejs
+if ( typeof module !== "undefined" && module && module.exports ) {
+ module.exports = QUnit;
+
+ // For consistency with CommonJS environments' exports
+ module.exports.QUnit = QUnit;
+}
+
+// For CommonJS with exports, but without module.exports, like Rhino
+if ( typeof exports !== "undefined" && exports ) {
+ exports.QUnit = QUnit;
+}
+
+if ( typeof define === "function" && define.amd ) {
+ define( function() {
+ return QUnit;
+ } );
+ QUnit.config.autostart = false;
+}
+
+// Get a reference to the global object, like window in browsers
+}( ( function() {
+ return this;
+}() ) ) );
+
+( function() {
+
+// Only interact with URLs via window.location
+var location = typeof window !== "undefined" && window.location;
+if ( !location ) {
+ return;
+}
+
+var urlParams = getUrlParams();
+
+QUnit.urlParams = urlParams;
+
+// Match module/test by inclusion in an array
+QUnit.config.moduleId = [].concat( urlParams.moduleId || [] );
+QUnit.config.testId = [].concat( urlParams.testId || [] );
+
+// Exact case-insensitive match of the module name
+QUnit.config.module = urlParams.module;
+
+// Regular expression or case-insenstive substring match against "moduleName: testName"
+QUnit.config.filter = urlParams.filter;
+
+// Test order randomization
+if ( urlParams.seed === true ) {
+
+ // Generate a random seed if the option is specified without a value
+ QUnit.config.seed = Math.random().toString( 36 ).slice( 2 );
+} else if ( urlParams.seed ) {
+ QUnit.config.seed = urlParams.seed;
+}
+
+// Add URL-parameter-mapped config values with UI form rendering data
+QUnit.config.urlConfig.push(
+ {
+ id: "hidepassed",
+ label: "Hide passed tests",
+ tooltip: "Only show tests and assertions that fail. Stored as query-strings."
+ },
+ {
+ id: "noglobals",
+ label: "Check for Globals",
+ tooltip: "Enabling this will test if any test introduces new properties on the " +
+ "global object (`window` in Browsers). Stored as query-strings."
+ },
+ {
+ id: "notrycatch",
+ label: "No try-catch",
+ tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging " +
+ "exceptions in IE reasonable. Stored as query-strings."
+ }
+);
+
+QUnit.begin( function() {
+ var i, option,
+ urlConfig = QUnit.config.urlConfig;
+
+ for ( i = 0; i < urlConfig.length; i++ ) {
+
+ // Options can be either strings or objects with nonempty "id" properties
+ option = QUnit.config.urlConfig[ i ];
+ if ( typeof option !== "string" ) {
+ option = option.id;
+ }
+
+ if ( QUnit.config[ option ] === undefined ) {
+ QUnit.config[ option ] = urlParams[ option ];
+ }
+ }
+} );
+
+function getUrlParams() {
+ var i, param, name, value;
+ var urlParams = {};
+ var params = location.search.slice( 1 ).split( "&" );
+ var length = params.length;
+
+ for ( i = 0; i < length; i++ ) {
+ if ( params[ i ] ) {
+ param = params[ i ].split( "=" );
+ name = decodeURIComponent( param[ 0 ] );
+
+ // Allow just a key to turn on a flag, e.g., test.html?noglobals
+ value = param.length === 1 ||
+ decodeURIComponent( param.slice( 1 ).join( "=" ) ) ;
+ if ( urlParams[ name ] ) {
+ urlParams[ name ] = [].concat( urlParams[ name ], value );
+ } else {
+ urlParams[ name ] = value;
+ }
+ }
+ }
+
+ return urlParams;
+}
+
+// Don't load the HTML Reporter on non-browser environments
+if ( typeof window === "undefined" || !window.document ) {
+ return;
+}
+
+// Deprecated QUnit.init - Ref #530
+// Re-initialize the configuration options
+QUnit.init = function() {
+ var config = QUnit.config;
+
+ config.stats = { all: 0, bad: 0 };
+ config.moduleStats = { all: 0, bad: 0 };
+ config.started = 0;
+ config.updateRate = 1000;
+ config.blocking = false;
+ config.autostart = true;
+ config.autorun = false;
+ config.filter = "";
+ config.queue = [];
+
+ appendInterface();
+};
+
+var config = QUnit.config,
+ document = window.document,
+ collapseNext = false,
+ hasOwn = Object.prototype.hasOwnProperty,
+ unfilteredUrl = setUrl( { filter: undefined, module: undefined,
+ moduleId: undefined, testId: undefined } ),
+ defined = {
+ sessionStorage: ( function() {
+ var x = "qunit-test-string";
+ try {
+ sessionStorage.setItem( x, x );
+ sessionStorage.removeItem( x );
+ return true;
+ } catch ( e ) {
+ return false;
+ }
+ }() )
+ },
+ modulesList = [];
+
+/**
+* Escape text for attribute or text content.
+*/
+function escapeText( s ) {
+ if ( !s ) {
+ return "";
+ }
+ s = s + "";
+
+ // Both single quotes and double quotes (for attributes)
+ return s.replace( /['"<>&]/g, function( s ) {
+ switch ( s ) {
+ case "'":
+ return "'";
+ case "\"":
+ return """;
+ case "<":
+ return "<";
+ case ">":
+ return ">";
+ case "&":
+ return "&";
+ }
+ } );
+}
+
+/**
+ * @param {HTMLElement} elem
+ * @param {string} type
+ * @param {Function} fn
+ */
+function addEvent( elem, type, fn ) {
+ if ( elem.addEventListener ) {
+
+ // Standards-based browsers
+ elem.addEventListener( type, fn, false );
+ } else if ( elem.attachEvent ) {
+
+ // Support: IE <9
+ elem.attachEvent( "on" + type, function() {
+ var event = window.event;
+ if ( !event.target ) {
+ event.target = event.srcElement || document;
+ }
+
+ fn.call( elem, event );
+ } );
+ }
+}
+
+/**
+ * @param {Array|NodeList} elems
+ * @param {string} type
+ * @param {Function} fn
+ */
+function addEvents( elems, type, fn ) {
+ var i = elems.length;
+ while ( i-- ) {
+ addEvent( elems[ i ], type, fn );
+ }
+}
+
+function hasClass( elem, name ) {
+ return ( " " + elem.className + " " ).indexOf( " " + name + " " ) >= 0;
+}
+
+function addClass( elem, name ) {
+ if ( !hasClass( elem, name ) ) {
+ elem.className += ( elem.className ? " " : "" ) + name;
+ }
+}
+
+function toggleClass( elem, name, force ) {
+ if ( force || typeof force === "undefined" && !hasClass( elem, name ) ) {
+ addClass( elem, name );
+ } else {
+ removeClass( elem, name );
+ }
+}
+
+function removeClass( elem, name ) {
+ var set = " " + elem.className + " ";
+
+ // Class name may appear multiple times
+ while ( set.indexOf( " " + name + " " ) >= 0 ) {
+ set = set.replace( " " + name + " ", " " );
+ }
+
+ // Trim for prettiness
+ elem.className = typeof set.trim === "function" ? set.trim() : set.replace( /^\s+|\s+$/g, "" );
+}
+
+function id( name ) {
+ return document.getElementById && document.getElementById( name );
+}
+
+function getUrlConfigHtml() {
+ var i, j, val,
+ escaped, escapedTooltip,
+ selection = false,
+ urlConfig = config.urlConfig,
+ urlConfigHtml = "";
+
+ for ( i = 0; i < urlConfig.length; i++ ) {
+
+ // Options can be either strings or objects with nonempty "id" properties
+ val = config.urlConfig[ i ];
+ if ( typeof val === "string" ) {
+ val = {
+ id: val,
+ label: val
+ };
+ }
+
+ escaped = escapeText( val.id );
+ escapedTooltip = escapeText( val.tooltip );
+
+ if ( !val.value || typeof val.value === "string" ) {
+ urlConfigHtml += "" + val.label + " ";
+ } else {
+ urlConfigHtml += "" + val.label +
+ ": ";
+
+ if ( QUnit.is( "array", val.value ) ) {
+ for ( j = 0; j < val.value.length; j++ ) {
+ escaped = escapeText( val.value[ j ] );
+ urlConfigHtml += "" + escaped + " ";
+ }
+ } else {
+ for ( j in val.value ) {
+ if ( hasOwn.call( val.value, j ) ) {
+ urlConfigHtml += "" + escapeText( val.value[ j ] ) + " ";
+ }
+ }
+ }
+ if ( config[ val.id ] && !selection ) {
+ escaped = escapeText( config[ val.id ] );
+ urlConfigHtml += "" + escaped + " ";
+ }
+ urlConfigHtml += " ";
+ }
+ }
+
+ return urlConfigHtml;
+}
+
+// Handle "click" events on toolbar checkboxes and "change" for select menus.
+// Updates the URL with the new state of `config.urlConfig` values.
+function toolbarChanged() {
+ var updatedUrl, value, tests,
+ field = this,
+ params = {};
+
+ // Detect if field is a select menu or a checkbox
+ if ( "selectedIndex" in field ) {
+ value = field.options[ field.selectedIndex ].value || undefined;
+ } else {
+ value = field.checked ? ( field.defaultValue || true ) : undefined;
+ }
+
+ params[ field.name ] = value;
+ updatedUrl = setUrl( params );
+
+ // Check if we can apply the change without a page refresh
+ if ( "hidepassed" === field.name && "replaceState" in window.history ) {
+ QUnit.urlParams[ field.name ] = value;
+ config[ field.name ] = value || false;
+ tests = id( "qunit-tests" );
+ if ( tests ) {
+ toggleClass( tests, "hidepass", value || false );
+ }
+ window.history.replaceState( null, "", updatedUrl );
+ } else {
+ window.location = updatedUrl;
+ }
+}
+
+function setUrl( params ) {
+ var key, arrValue, i,
+ querystring = "?",
+ location = window.location;
+
+ params = QUnit.extend( QUnit.extend( {}, QUnit.urlParams ), params );
+
+ for ( key in params ) {
+
+ // Skip inherited or undefined properties
+ if ( hasOwn.call( params, key ) && params[ key ] !== undefined ) {
+
+ // Output a parameter for each value of this key (but usually just one)
+ arrValue = [].concat( params[ key ] );
+ for ( i = 0; i < arrValue.length; i++ ) {
+ querystring += encodeURIComponent( key );
+ if ( arrValue[ i ] !== true ) {
+ querystring += "=" + encodeURIComponent( arrValue[ i ] );
+ }
+ querystring += "&";
+ }
+ }
+ }
+ return location.protocol + "//" + location.host +
+ location.pathname + querystring.slice( 0, -1 );
+}
+
+function applyUrlParams() {
+ var selectedModule,
+ modulesList = id( "qunit-modulefilter" ),
+ filter = id( "qunit-filter-input" ).value;
+
+ selectedModule = modulesList ?
+ decodeURIComponent( modulesList.options[ modulesList.selectedIndex ].value ) :
+ undefined;
+
+ window.location = setUrl( {
+ module: ( selectedModule === "" ) ? undefined : selectedModule,
+ filter: ( filter === "" ) ? undefined : filter,
+
+ // Remove moduleId and testId filters
+ moduleId: undefined,
+ testId: undefined
+ } );
+}
+
+function toolbarUrlConfigContainer() {
+ var urlConfigContainer = document.createElement( "span" );
+
+ urlConfigContainer.innerHTML = getUrlConfigHtml();
+ addClass( urlConfigContainer, "qunit-url-config" );
+
+ // For oldIE support:
+ // * Add handlers to the individual elements instead of the container
+ // * Use "click" instead of "change" for checkboxes
+ addEvents( urlConfigContainer.getElementsByTagName( "input" ), "click", toolbarChanged );
+ addEvents( urlConfigContainer.getElementsByTagName( "select" ), "change", toolbarChanged );
+
+ return urlConfigContainer;
+}
+
+function toolbarLooseFilter() {
+ var filter = document.createElement( "form" ),
+ label = document.createElement( "label" ),
+ input = document.createElement( "input" ),
+ button = document.createElement( "button" );
+
+ addClass( filter, "qunit-filter" );
+
+ label.innerHTML = "Filter: ";
+
+ input.type = "text";
+ input.value = config.filter || "";
+ input.name = "filter";
+ input.id = "qunit-filter-input";
+
+ button.innerHTML = "Go";
+
+ label.appendChild( input );
+
+ filter.appendChild( label );
+ filter.appendChild( button );
+ addEvent( filter, "submit", function( ev ) {
+ applyUrlParams();
+
+ if ( ev && ev.preventDefault ) {
+ ev.preventDefault();
+ }
+
+ return false;
+ } );
+
+ return filter;
+}
+
+function toolbarModuleFilterHtml() {
+ var i,
+ moduleFilterHtml = "";
+
+ if ( !modulesList.length ) {
+ return false;
+ }
+
+ moduleFilterHtml += "Module: " +
+ "< All Modules > ";
+
+ for ( i = 0; i < modulesList.length; i++ ) {
+ moduleFilterHtml += "" + escapeText( modulesList[ i ] ) + " ";
+ }
+ moduleFilterHtml += " ";
+
+ return moduleFilterHtml;
+}
+
+function toolbarModuleFilter() {
+ var toolbar = id( "qunit-testrunner-toolbar" ),
+ moduleFilter = document.createElement( "span" ),
+ moduleFilterHtml = toolbarModuleFilterHtml();
+
+ if ( !toolbar || !moduleFilterHtml ) {
+ return false;
+ }
+
+ moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
+ moduleFilter.innerHTML = moduleFilterHtml;
+
+ addEvent( moduleFilter.lastChild, "change", applyUrlParams );
+
+ toolbar.appendChild( moduleFilter );
+}
+
+function appendToolbar() {
+ var toolbar = id( "qunit-testrunner-toolbar" );
+
+ if ( toolbar ) {
+ toolbar.appendChild( toolbarUrlConfigContainer() );
+ toolbar.appendChild( toolbarLooseFilter() );
+ toolbarModuleFilter();
+ }
+}
+
+function appendHeader() {
+ var header = id( "qunit-header" );
+
+ if ( header ) {
+ header.innerHTML = "" + header.innerHTML +
+ " ";
+ }
+}
+
+function appendBanner() {
+ var banner = id( "qunit-banner" );
+
+ if ( banner ) {
+ banner.className = "";
+ }
+}
+
+function appendTestResults() {
+ var tests = id( "qunit-tests" ),
+ result = id( "qunit-testresult" );
+
+ if ( result ) {
+ result.parentNode.removeChild( result );
+ }
+
+ if ( tests ) {
+ tests.innerHTML = "";
+ result = document.createElement( "p" );
+ result.id = "qunit-testresult";
+ result.className = "result";
+ tests.parentNode.insertBefore( result, tests );
+ result.innerHTML = "Running... ";
+ }
+}
+
+function storeFixture() {
+ var fixture = id( "qunit-fixture" );
+ if ( fixture ) {
+ config.fixture = fixture.innerHTML;
+ }
+}
+
+function appendFilteredTest() {
+ var testId = QUnit.config.testId;
+ if ( !testId || testId.length <= 0 ) {
+ return "";
+ }
+ return "Rerunning selected tests: " +
+ escapeText( testId.join( ", " ) ) +
+ "
Run all tests ";
+}
+
+function appendUserAgent() {
+ var userAgent = id( "qunit-userAgent" );
+
+ if ( userAgent ) {
+ userAgent.innerHTML = "";
+ userAgent.appendChild(
+ document.createTextNode(
+ "QUnit " + QUnit.version + "; " + navigator.userAgent
+ )
+ );
+ }
+}
+
+function appendInterface() {
+ var qunit = id( "qunit" );
+
+ if ( qunit ) {
+ qunit.innerHTML =
+ "" +
+ " " +
+ "
" +
+ appendFilteredTest() +
+ " " +
+ " ";
+ }
+
+ appendHeader();
+ appendBanner();
+ appendTestResults();
+ appendUserAgent();
+ appendToolbar();
+}
+
+function appendTestsList( modules ) {
+ var i, l, x, z, test, moduleObj;
+
+ for ( i = 0, l = modules.length; i < l; i++ ) {
+ moduleObj = modules[ i ];
+
+ for ( x = 0, z = moduleObj.tests.length; x < z; x++ ) {
+ test = moduleObj.tests[ x ];
+
+ appendTest( test.name, test.testId, moduleObj.name );
+ }
+ }
+}
+
+function appendTest( name, testId, moduleName ) {
+ var title, rerunTrigger, testBlock, assertList,
+ tests = id( "qunit-tests" );
+
+ if ( !tests ) {
+ return;
+ }
+
+ title = document.createElement( "strong" );
+ title.innerHTML = getNameHtml( name, moduleName );
+
+ rerunTrigger = document.createElement( "a" );
+ rerunTrigger.innerHTML = "Rerun";
+ rerunTrigger.href = setUrl( { testId: testId } );
+
+ testBlock = document.createElement( "li" );
+ testBlock.appendChild( title );
+ testBlock.appendChild( rerunTrigger );
+ testBlock.id = "qunit-test-output-" + testId;
+
+ assertList = document.createElement( "ol" );
+ assertList.className = "qunit-assert-list";
+
+ testBlock.appendChild( assertList );
+
+ tests.appendChild( testBlock );
+}
+
+// HTML Reporter initialization and load
+QUnit.begin( function( details ) {
+ var i, moduleObj, tests;
+
+ // Sort modules by name for the picker
+ for ( i = 0; i < details.modules.length; i++ ) {
+ moduleObj = details.modules[ i ];
+ if ( moduleObj.name ) {
+ modulesList.push( moduleObj.name );
+ }
+ }
+ modulesList.sort( function( a, b ) {
+ return a.localeCompare( b );
+ } );
+
+ // Capture fixture HTML from the page
+ storeFixture();
+
+ // Initialize QUnit elements
+ appendInterface();
+ appendTestsList( details.modules );
+ tests = id( "qunit-tests" );
+ if ( tests && config.hidepassed ) {
+ addClass( tests, "hidepass" );
+ }
+} );
+
+QUnit.done( function( details ) {
+ var i, key,
+ banner = id( "qunit-banner" ),
+ tests = id( "qunit-tests" ),
+ html = [
+ "Tests completed in ",
+ details.runtime,
+ " milliseconds. ",
+ "",
+ details.passed,
+ " assertions of ",
+ details.total,
+ " passed, ",
+ details.failed,
+ " failed."
+ ].join( "" );
+
+ if ( banner ) {
+ banner.className = details.failed ? "qunit-fail" : "qunit-pass";
+ }
+
+ if ( tests ) {
+ id( "qunit-testresult" ).innerHTML = html;
+ }
+
+ if ( config.altertitle && document.title ) {
+
+ // Show ✖ for good, ✔ for bad suite result in title
+ // use escape sequences in case file gets loaded with non-utf-8-charset
+ document.title = [
+ ( details.failed ? "\u2716" : "\u2714" ),
+ document.title.replace( /^[\u2714\u2716] /i, "" )
+ ].join( " " );
+ }
+
+ // Clear own sessionStorage items if all tests passed
+ if ( config.reorder && defined.sessionStorage && details.failed === 0 ) {
+ for ( i = 0; i < sessionStorage.length; i++ ) {
+ key = sessionStorage.key( i++ );
+ if ( key.indexOf( "qunit-test-" ) === 0 ) {
+ sessionStorage.removeItem( key );
+ }
+ }
+ }
+
+ // Scroll back to top to show results
+ if ( config.scrolltop && window.scrollTo ) {
+ window.scrollTo( 0, 0 );
+ }
+} );
+
+function getNameHtml( name, module ) {
+ var nameHtml = "";
+
+ if ( module ) {
+ nameHtml = "" + escapeText( module ) + " : ";
+ }
+
+ nameHtml += "" + escapeText( name ) + " ";
+
+ return nameHtml;
+}
+
+QUnit.testStart( function( details ) {
+ var running, testBlock, bad;
+
+ testBlock = id( "qunit-test-output-" + details.testId );
+ if ( testBlock ) {
+ testBlock.className = "running";
+ } else {
+
+ // Report later registered tests
+ appendTest( details.name, details.testId, details.module );
+ }
+
+ running = id( "qunit-testresult" );
+ if ( running ) {
+ bad = QUnit.config.reorder && defined.sessionStorage &&
+ +sessionStorage.getItem( "qunit-test-" + details.module + "-" + details.name );
+
+ running.innerHTML = ( bad ?
+ "Rerunning previously failed test: " :
+ "Running: " ) +
+ getNameHtml( details.name, details.module );
+ }
+
+} );
+
+function stripHtml( string ) {
+
+ // Strip tags, html entity and whitespaces
+ return string.replace( /<\/?[^>]+(>|$)/g, "" ).replace( /\"/g, "" ).replace( /\s+/g, "" );
+}
+
+QUnit.log( function( details ) {
+ var assertList, assertLi,
+ message, expected, actual, diff,
+ showDiff = false,
+ testItem = id( "qunit-test-output-" + details.testId );
+
+ if ( !testItem ) {
+ return;
+ }
+
+ message = escapeText( details.message ) || ( details.result ? "okay" : "failed" );
+ message = "" + message + " ";
+ message += "@ " + details.runtime + " ms ";
+
+ // The pushFailure doesn't provide details.expected
+ // when it calls, it's implicit to also not show expected and diff stuff
+ // Also, we need to check details.expected existence, as it can exist and be undefined
+ if ( !details.result && hasOwn.call( details, "expected" ) ) {
+ if ( details.negative ) {
+ expected = "NOT " + QUnit.dump.parse( details.expected );
+ } else {
+ expected = QUnit.dump.parse( details.expected );
+ }
+
+ actual = QUnit.dump.parse( details.actual );
+ message += "Expected: " +
+ escapeText( expected ) +
+ " ";
+
+ if ( actual !== expected ) {
+
+ message += "Result: " +
+ escapeText( actual ) + " ";
+
+ // Don't show diff if actual or expected are booleans
+ if ( !( /^(true|false)$/.test( actual ) ) &&
+ !( /^(true|false)$/.test( expected ) ) ) {
+ diff = QUnit.diff( expected, actual );
+ showDiff = stripHtml( diff ).length !==
+ stripHtml( expected ).length +
+ stripHtml( actual ).length;
+ }
+
+ // Don't show diff if expected and actual are totally different
+ if ( showDiff ) {
+ message += "Diff: " +
+ diff + " ";
+ }
+ } else if ( expected.indexOf( "[object Array]" ) !== -1 ||
+ expected.indexOf( "[object Object]" ) !== -1 ) {
+ message += "Message: " +
+ "Diff suppressed as the depth of object is more than current max depth (" +
+ QUnit.config.maxDepth + ").Hint: Use QUnit.dump.maxDepth
to " +
+ " run with a higher max depth or " +
+ "Rerun without max depth.
";
+ } else {
+ message += "Message: " +
+ "Diff suppressed as the expected and actual results have an equivalent" +
+ " serialization ";
+ }
+
+ if ( details.source ) {
+ message += "Source: " +
+ escapeText( details.source ) + " ";
+ }
+
+ message += "
";
+
+ // This occurs when pushFailure is set and we have an extracted stack trace
+ } else if ( !details.result && details.source ) {
+ message += "" +
+ "Source: " +
+ escapeText( details.source ) + " " +
+ "
";
+ }
+
+ assertList = testItem.getElementsByTagName( "ol" )[ 0 ];
+
+ assertLi = document.createElement( "li" );
+ assertLi.className = details.result ? "pass" : "fail";
+ assertLi.innerHTML = message;
+ assertList.appendChild( assertLi );
+} );
+
+QUnit.testDone( function( details ) {
+ var testTitle, time, testItem, assertList,
+ good, bad, testCounts, skipped, sourceName,
+ tests = id( "qunit-tests" );
+
+ if ( !tests ) {
+ return;
+ }
+
+ testItem = id( "qunit-test-output-" + details.testId );
+
+ assertList = testItem.getElementsByTagName( "ol" )[ 0 ];
+
+ good = details.passed;
+ bad = details.failed;
+
+ // Store result when possible
+ if ( config.reorder && defined.sessionStorage ) {
+ if ( bad ) {
+ sessionStorage.setItem( "qunit-test-" + details.module + "-" + details.name, bad );
+ } else {
+ sessionStorage.removeItem( "qunit-test-" + details.module + "-" + details.name );
+ }
+ }
+
+ if ( bad === 0 ) {
+
+ // Collapse the passing tests
+ addClass( assertList, "qunit-collapsed" );
+ } else if ( bad && config.collapse && !collapseNext ) {
+
+ // Skip collapsing the first failing test
+ collapseNext = true;
+ } else {
+
+ // Collapse remaining tests
+ addClass( assertList, "qunit-collapsed" );
+ }
+
+ // The testItem.firstChild is the test name
+ testTitle = testItem.firstChild;
+
+ testCounts = bad ?
+ "" + bad + " , " + "" + good + " , " :
+ "";
+
+ testTitle.innerHTML += " (" + testCounts +
+ details.assertions.length + ") ";
+
+ if ( details.skipped ) {
+ testItem.className = "skipped";
+ skipped = document.createElement( "em" );
+ skipped.className = "qunit-skipped-label";
+ skipped.innerHTML = "skipped";
+ testItem.insertBefore( skipped, testTitle );
+ } else {
+ addEvent( testTitle, "click", function() {
+ toggleClass( assertList, "qunit-collapsed" );
+ } );
+
+ testItem.className = bad ? "fail" : "pass";
+
+ time = document.createElement( "span" );
+ time.className = "runtime";
+ time.innerHTML = details.runtime + " ms";
+ testItem.insertBefore( time, assertList );
+ }
+
+ // Show the source of the test when showing assertions
+ if ( details.source ) {
+ sourceName = document.createElement( "p" );
+ sourceName.innerHTML = "Source: " + details.source;
+ addClass( sourceName, "qunit-source" );
+ if ( bad === 0 ) {
+ addClass( sourceName, "qunit-collapsed" );
+ }
+ addEvent( testTitle, "click", function() {
+ toggleClass( sourceName, "qunit-collapsed" );
+ } );
+ testItem.appendChild( sourceName );
+ }
+} );
+
+// Avoid readyState issue with phantomjs
+// Ref: #818
+var notPhantom = ( function( p ) {
+ return !( p && p.version && p.version.major > 0 );
+} )( window.phantom );
+
+if ( notPhantom && document.readyState === "complete" ) {
+ QUnit.load();
+} else {
+ addEvent( window, "load", QUnit.load );
+}
+
+/*
+ * This file is a modified version of google-diff-match-patch's JavaScript implementation
+ * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),
+ * modifications are licensed as more fully set forth in LICENSE.txt.
+ *
+ * The original source of google-diff-match-patch is attributable and licensed as follows:
+ *
+ * Copyright 2006 Google Inc.
+ * https://code.google.com/p/google-diff-match-patch/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * More Info:
+ * https://code.google.com/p/google-diff-match-patch/
+ *
+ * Usage: QUnit.diff(expected, actual)
+ *
+ */
+QUnit.diff = ( function() {
+ function DiffMatchPatch() {
+ }
+
+ // DIFF FUNCTIONS
+
+ /**
+ * The data structure representing a diff is an array of tuples:
+ * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]
+ * which means: delete 'Hello', add 'Goodbye' and keep ' world.'
+ */
+ var DIFF_DELETE = -1,
+ DIFF_INSERT = 1,
+ DIFF_EQUAL = 0;
+
+ /**
+ * Find the differences between two texts. Simplifies the problem by stripping
+ * any common prefix or suffix off the texts before diffing.
+ * @param {string} text1 Old string to be diffed.
+ * @param {string} text2 New string to be diffed.
+ * @param {boolean=} optChecklines Optional speedup flag. If present and false,
+ * then don't run a line-level diff first to identify the changed areas.
+ * Defaults to true, which does a faster, slightly less optimal diff.
+ * @return {!Array.} Array of diff tuples.
+ */
+ DiffMatchPatch.prototype.DiffMain = function( text1, text2, optChecklines ) {
+ var deadline, checklines, commonlength,
+ commonprefix, commonsuffix, diffs;
+
+ // The diff must be complete in up to 1 second.
+ deadline = ( new Date() ).getTime() + 1000;
+
+ // Check for null inputs.
+ if ( text1 === null || text2 === null ) {
+ throw new Error( "Null input. (DiffMain)" );
+ }
+
+ // Check for equality (speedup).
+ if ( text1 === text2 ) {
+ if ( text1 ) {
+ return [
+ [ DIFF_EQUAL, text1 ]
+ ];
+ }
+ return [];
+ }
+
+ if ( typeof optChecklines === "undefined" ) {
+ optChecklines = true;
+ }
+
+ checklines = optChecklines;
+
+ // Trim off common prefix (speedup).
+ commonlength = this.diffCommonPrefix( text1, text2 );
+ commonprefix = text1.substring( 0, commonlength );
+ text1 = text1.substring( commonlength );
+ text2 = text2.substring( commonlength );
+
+ // Trim off common suffix (speedup).
+ commonlength = this.diffCommonSuffix( text1, text2 );
+ commonsuffix = text1.substring( text1.length - commonlength );
+ text1 = text1.substring( 0, text1.length - commonlength );
+ text2 = text2.substring( 0, text2.length - commonlength );
+
+ // Compute the diff on the middle block.
+ diffs = this.diffCompute( text1, text2, checklines, deadline );
+
+ // Restore the prefix and suffix.
+ if ( commonprefix ) {
+ diffs.unshift( [ DIFF_EQUAL, commonprefix ] );
+ }
+ if ( commonsuffix ) {
+ diffs.push( [ DIFF_EQUAL, commonsuffix ] );
+ }
+ this.diffCleanupMerge( diffs );
+ return diffs;
+ };
+
+ /**
+ * Reduce the number of edits by eliminating operationally trivial equalities.
+ * @param {!Array.} diffs Array of diff tuples.
+ */
+ DiffMatchPatch.prototype.diffCleanupEfficiency = function( diffs ) {
+ var changes, equalities, equalitiesLength, lastequality,
+ pointer, preIns, preDel, postIns, postDel;
+ changes = false;
+ equalities = []; // Stack of indices where equalities are found.
+ equalitiesLength = 0; // Keeping our own length var is faster in JS.
+ /** @type {?string} */
+ lastequality = null;
+
+ // Always equal to diffs[equalities[equalitiesLength - 1]][1]
+ pointer = 0; // Index of current position.
+
+ // Is there an insertion operation before the last equality.
+ preIns = false;
+
+ // Is there a deletion operation before the last equality.
+ preDel = false;
+
+ // Is there an insertion operation after the last equality.
+ postIns = false;
+
+ // Is there a deletion operation after the last equality.
+ postDel = false;
+ while ( pointer < diffs.length ) {
+
+ // Equality found.
+ if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) {
+ if ( diffs[ pointer ][ 1 ].length < 4 && ( postIns || postDel ) ) {
+
+ // Candidate found.
+ equalities[ equalitiesLength++ ] = pointer;
+ preIns = postIns;
+ preDel = postDel;
+ lastequality = diffs[ pointer ][ 1 ];
+ } else {
+
+ // Not a candidate, and can never become one.
+ equalitiesLength = 0;
+ lastequality = null;
+ }
+ postIns = postDel = false;
+
+ // An insertion or deletion.
+ } else {
+
+ if ( diffs[ pointer ][ 0 ] === DIFF_DELETE ) {
+ postDel = true;
+ } else {
+ postIns = true;
+ }
+
+ /*
+ * Five types to be split:
+ * A BXYC D
+ * A XC D
+ * A BXC
+ * AXC D
+ * A BXC
+ */
+ if ( lastequality && ( ( preIns && preDel && postIns && postDel ) ||
+ ( ( lastequality.length < 2 ) &&
+ ( preIns + preDel + postIns + postDel ) === 3 ) ) ) {
+
+ // Duplicate record.
+ diffs.splice(
+ equalities[ equalitiesLength - 1 ],
+ 0,
+ [ DIFF_DELETE, lastequality ]
+ );
+
+ // Change second copy to insert.
+ diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;
+ equalitiesLength--; // Throw away the equality we just deleted;
+ lastequality = null;
+ if ( preIns && preDel ) {
+
+ // No changes made which could affect previous entry, keep going.
+ postIns = postDel = true;
+ equalitiesLength = 0;
+ } else {
+ equalitiesLength--; // Throw away the previous equality.
+ pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;
+ postIns = postDel = false;
+ }
+ changes = true;
+ }
+ }
+ pointer++;
+ }
+
+ if ( changes ) {
+ this.diffCleanupMerge( diffs );
+ }
+ };
+
+ /**
+ * Convert a diff array into a pretty HTML report.
+ * @param {!Array.} diffs Array of diff tuples.
+ * @param {integer} string to be beautified.
+ * @return {string} HTML representation.
+ */
+ DiffMatchPatch.prototype.diffPrettyHtml = function( diffs ) {
+ var op, data, x,
+ html = [];
+ for ( x = 0; x < diffs.length; x++ ) {
+ op = diffs[ x ][ 0 ]; // Operation (insert, delete, equal)
+ data = diffs[ x ][ 1 ]; // Text of change.
+ switch ( op ) {
+ case DIFF_INSERT:
+ html[ x ] = "" + escapeText( data ) + " ";
+ break;
+ case DIFF_DELETE:
+ html[ x ] = "" + escapeText( data ) + "";
+ break;
+ case DIFF_EQUAL:
+ html[ x ] = "" + escapeText( data ) + " ";
+ break;
+ }
+ }
+ return html.join( "" );
+ };
+
+ /**
+ * Determine the common prefix of two strings.
+ * @param {string} text1 First string.
+ * @param {string} text2 Second string.
+ * @return {number} The number of characters common to the start of each
+ * string.
+ */
+ DiffMatchPatch.prototype.diffCommonPrefix = function( text1, text2 ) {
+ var pointermid, pointermax, pointermin, pointerstart;
+
+ // Quick check for common null cases.
+ if ( !text1 || !text2 || text1.charAt( 0 ) !== text2.charAt( 0 ) ) {
+ return 0;
+ }
+
+ // Binary search.
+ // Performance analysis: https://neil.fraser.name/news/2007/10/09/
+ pointermin = 0;
+ pointermax = Math.min( text1.length, text2.length );
+ pointermid = pointermax;
+ pointerstart = 0;
+ while ( pointermin < pointermid ) {
+ if ( text1.substring( pointerstart, pointermid ) ===
+ text2.substring( pointerstart, pointermid ) ) {
+ pointermin = pointermid;
+ pointerstart = pointermin;
+ } else {
+ pointermax = pointermid;
+ }
+ pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
+ }
+ return pointermid;
+ };
+
+ /**
+ * Determine the common suffix of two strings.
+ * @param {string} text1 First string.
+ * @param {string} text2 Second string.
+ * @return {number} The number of characters common to the end of each string.
+ */
+ DiffMatchPatch.prototype.diffCommonSuffix = function( text1, text2 ) {
+ var pointermid, pointermax, pointermin, pointerend;
+
+ // Quick check for common null cases.
+ if ( !text1 ||
+ !text2 ||
+ text1.charAt( text1.length - 1 ) !== text2.charAt( text2.length - 1 ) ) {
+ return 0;
+ }
+
+ // Binary search.
+ // Performance analysis: https://neil.fraser.name/news/2007/10/09/
+ pointermin = 0;
+ pointermax = Math.min( text1.length, text2.length );
+ pointermid = pointermax;
+ pointerend = 0;
+ while ( pointermin < pointermid ) {
+ if ( text1.substring( text1.length - pointermid, text1.length - pointerend ) ===
+ text2.substring( text2.length - pointermid, text2.length - pointerend ) ) {
+ pointermin = pointermid;
+ pointerend = pointermin;
+ } else {
+ pointermax = pointermid;
+ }
+ pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
+ }
+ return pointermid;
+ };
+
+ /**
+ * Find the differences between two texts. Assumes that the texts do not
+ * have any common prefix or suffix.
+ * @param {string} text1 Old string to be diffed.
+ * @param {string} text2 New string to be diffed.
+ * @param {boolean} checklines Speedup flag. If false, then don't run a
+ * line-level diff first to identify the changed areas.
+ * If true, then run a faster, slightly less optimal diff.
+ * @param {number} deadline Time when the diff should be complete by.
+ * @return {!Array.} Array of diff tuples.
+ * @private
+ */
+ DiffMatchPatch.prototype.diffCompute = function( text1, text2, checklines, deadline ) {
+ var diffs, longtext, shorttext, i, hm,
+ text1A, text2A, text1B, text2B,
+ midCommon, diffsA, diffsB;
+
+ if ( !text1 ) {
+
+ // Just add some text (speedup).
+ return [
+ [ DIFF_INSERT, text2 ]
+ ];
+ }
+
+ if ( !text2 ) {
+
+ // Just delete some text (speedup).
+ return [
+ [ DIFF_DELETE, text1 ]
+ ];
+ }
+
+ longtext = text1.length > text2.length ? text1 : text2;
+ shorttext = text1.length > text2.length ? text2 : text1;
+ i = longtext.indexOf( shorttext );
+ if ( i !== -1 ) {
+
+ // Shorter text is inside the longer text (speedup).
+ diffs = [
+ [ DIFF_INSERT, longtext.substring( 0, i ) ],
+ [ DIFF_EQUAL, shorttext ],
+ [ DIFF_INSERT, longtext.substring( i + shorttext.length ) ]
+ ];
+
+ // Swap insertions for deletions if diff is reversed.
+ if ( text1.length > text2.length ) {
+ diffs[ 0 ][ 0 ] = diffs[ 2 ][ 0 ] = DIFF_DELETE;
+ }
+ return diffs;
+ }
+
+ if ( shorttext.length === 1 ) {
+
+ // Single character string.
+ // After the previous speedup, the character can't be an equality.
+ return [
+ [ DIFF_DELETE, text1 ],
+ [ DIFF_INSERT, text2 ]
+ ];
+ }
+
+ // Check to see if the problem can be split in two.
+ hm = this.diffHalfMatch( text1, text2 );
+ if ( hm ) {
+
+ // A half-match was found, sort out the return data.
+ text1A = hm[ 0 ];
+ text1B = hm[ 1 ];
+ text2A = hm[ 2 ];
+ text2B = hm[ 3 ];
+ midCommon = hm[ 4 ];
+
+ // Send both pairs off for separate processing.
+ diffsA = this.DiffMain( text1A, text2A, checklines, deadline );
+ diffsB = this.DiffMain( text1B, text2B, checklines, deadline );
+
+ // Merge the results.
+ return diffsA.concat( [
+ [ DIFF_EQUAL, midCommon ]
+ ], diffsB );
+ }
+
+ if ( checklines && text1.length > 100 && text2.length > 100 ) {
+ return this.diffLineMode( text1, text2, deadline );
+ }
+
+ return this.diffBisect( text1, text2, deadline );
+ };
+
+ /**
+ * Do the two texts share a substring which is at least half the length of the
+ * longer text?
+ * This speedup can produce non-minimal diffs.
+ * @param {string} text1 First string.
+ * @param {string} text2 Second string.
+ * @return {Array.} Five element Array, containing the prefix of
+ * text1, the suffix of text1, the prefix of text2, the suffix of
+ * text2 and the common middle. Or null if there was no match.
+ * @private
+ */
+ DiffMatchPatch.prototype.diffHalfMatch = function( text1, text2 ) {
+ var longtext, shorttext, dmp,
+ text1A, text2B, text2A, text1B, midCommon,
+ hm1, hm2, hm;
+
+ longtext = text1.length > text2.length ? text1 : text2;
+ shorttext = text1.length > text2.length ? text2 : text1;
+ if ( longtext.length < 4 || shorttext.length * 2 < longtext.length ) {
+ return null; // Pointless.
+ }
+ dmp = this; // 'this' becomes 'window' in a closure.
+
+ /**
+ * Does a substring of shorttext exist within longtext such that the substring
+ * is at least half the length of longtext?
+ * Closure, but does not reference any external variables.
+ * @param {string} longtext Longer string.
+ * @param {string} shorttext Shorter string.
+ * @param {number} i Start index of quarter length substring within longtext.
+ * @return {Array.} Five element Array, containing the prefix of
+ * longtext, the suffix of longtext, the prefix of shorttext, the suffix
+ * of shorttext and the common middle. Or null if there was no match.
+ * @private
+ */
+ function diffHalfMatchI( longtext, shorttext, i ) {
+ var seed, j, bestCommon, prefixLength, suffixLength,
+ bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;
+
+ // Start with a 1/4 length substring at position i as a seed.
+ seed = longtext.substring( i, i + Math.floor( longtext.length / 4 ) );
+ j = -1;
+ bestCommon = "";
+ while ( ( j = shorttext.indexOf( seed, j + 1 ) ) !== -1 ) {
+ prefixLength = dmp.diffCommonPrefix( longtext.substring( i ),
+ shorttext.substring( j ) );
+ suffixLength = dmp.diffCommonSuffix( longtext.substring( 0, i ),
+ shorttext.substring( 0, j ) );
+ if ( bestCommon.length < suffixLength + prefixLength ) {
+ bestCommon = shorttext.substring( j - suffixLength, j ) +
+ shorttext.substring( j, j + prefixLength );
+ bestLongtextA = longtext.substring( 0, i - suffixLength );
+ bestLongtextB = longtext.substring( i + prefixLength );
+ bestShorttextA = shorttext.substring( 0, j - suffixLength );
+ bestShorttextB = shorttext.substring( j + prefixLength );
+ }
+ }
+ if ( bestCommon.length * 2 >= longtext.length ) {
+ return [ bestLongtextA, bestLongtextB,
+ bestShorttextA, bestShorttextB, bestCommon
+ ];
+ } else {
+ return null;
+ }
+ }
+
+ // First check if the second quarter is the seed for a half-match.
+ hm1 = diffHalfMatchI( longtext, shorttext,
+ Math.ceil( longtext.length / 4 ) );
+
+ // Check again based on the third quarter.
+ hm2 = diffHalfMatchI( longtext, shorttext,
+ Math.ceil( longtext.length / 2 ) );
+ if ( !hm1 && !hm2 ) {
+ return null;
+ } else if ( !hm2 ) {
+ hm = hm1;
+ } else if ( !hm1 ) {
+ hm = hm2;
+ } else {
+
+ // Both matched. Select the longest.
+ hm = hm1[ 4 ].length > hm2[ 4 ].length ? hm1 : hm2;
+ }
+
+ // A half-match was found, sort out the return data.
+ text1A, text1B, text2A, text2B;
+ if ( text1.length > text2.length ) {
+ text1A = hm[ 0 ];
+ text1B = hm[ 1 ];
+ text2A = hm[ 2 ];
+ text2B = hm[ 3 ];
+ } else {
+ text2A = hm[ 0 ];
+ text2B = hm[ 1 ];
+ text1A = hm[ 2 ];
+ text1B = hm[ 3 ];
+ }
+ midCommon = hm[ 4 ];
+ return [ text1A, text1B, text2A, text2B, midCommon ];
+ };
+
+ /**
+ * Do a quick line-level diff on both strings, then rediff the parts for
+ * greater accuracy.
+ * This speedup can produce non-minimal diffs.
+ * @param {string} text1 Old string to be diffed.
+ * @param {string} text2 New string to be diffed.
+ * @param {number} deadline Time when the diff should be complete by.
+ * @return {!Array.} Array of diff tuples.
+ * @private
+ */
+ DiffMatchPatch.prototype.diffLineMode = function( text1, text2, deadline ) {
+ var a, diffs, linearray, pointer, countInsert,
+ countDelete, textInsert, textDelete, j;
+
+ // Scan the text on a line-by-line basis first.
+ a = this.diffLinesToChars( text1, text2 );
+ text1 = a.chars1;
+ text2 = a.chars2;
+ linearray = a.lineArray;
+
+ diffs = this.DiffMain( text1, text2, false, deadline );
+
+ // Convert the diff back to original text.
+ this.diffCharsToLines( diffs, linearray );
+
+ // Eliminate freak matches (e.g. blank lines)
+ this.diffCleanupSemantic( diffs );
+
+ // Rediff any replacement blocks, this time character-by-character.
+ // Add a dummy entry at the end.
+ diffs.push( [ DIFF_EQUAL, "" ] );
+ pointer = 0;
+ countDelete = 0;
+ countInsert = 0;
+ textDelete = "";
+ textInsert = "";
+ while ( pointer < diffs.length ) {
+ switch ( diffs[ pointer ][ 0 ] ) {
+ case DIFF_INSERT:
+ countInsert++;
+ textInsert += diffs[ pointer ][ 1 ];
+ break;
+ case DIFF_DELETE:
+ countDelete++;
+ textDelete += diffs[ pointer ][ 1 ];
+ break;
+ case DIFF_EQUAL:
+
+ // Upon reaching an equality, check for prior redundancies.
+ if ( countDelete >= 1 && countInsert >= 1 ) {
+
+ // Delete the offending records and add the merged ones.
+ diffs.splice( pointer - countDelete - countInsert,
+ countDelete + countInsert );
+ pointer = pointer - countDelete - countInsert;
+ a = this.DiffMain( textDelete, textInsert, false, deadline );
+ for ( j = a.length - 1; j >= 0; j-- ) {
+ diffs.splice( pointer, 0, a[ j ] );
+ }
+ pointer = pointer + a.length;
+ }
+ countInsert = 0;
+ countDelete = 0;
+ textDelete = "";
+ textInsert = "";
+ break;
+ }
+ pointer++;
+ }
+ diffs.pop(); // Remove the dummy entry at the end.
+
+ return diffs;
+ };
+
+ /**
+ * Find the 'middle snake' of a diff, split the problem in two
+ * and return the recursively constructed diff.
+ * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.
+ * @param {string} text1 Old string to be diffed.
+ * @param {string} text2 New string to be diffed.
+ * @param {number} deadline Time at which to bail if not yet complete.
+ * @return {!Array.} Array of diff tuples.
+ * @private
+ */
+ DiffMatchPatch.prototype.diffBisect = function( text1, text2, deadline ) {
+ var text1Length, text2Length, maxD, vOffset, vLength,
+ v1, v2, x, delta, front, k1start, k1end, k2start,
+ k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;
+
+ // Cache the text lengths to prevent multiple calls.
+ text1Length = text1.length;
+ text2Length = text2.length;
+ maxD = Math.ceil( ( text1Length + text2Length ) / 2 );
+ vOffset = maxD;
+ vLength = 2 * maxD;
+ v1 = new Array( vLength );
+ v2 = new Array( vLength );
+
+ // Setting all elements to -1 is faster in Chrome & Firefox than mixing
+ // integers and undefined.
+ for ( x = 0; x < vLength; x++ ) {
+ v1[ x ] = -1;
+ v2[ x ] = -1;
+ }
+ v1[ vOffset + 1 ] = 0;
+ v2[ vOffset + 1 ] = 0;
+ delta = text1Length - text2Length;
+
+ // If the total number of characters is odd, then the front path will collide
+ // with the reverse path.
+ front = ( delta % 2 !== 0 );
+
+ // Offsets for start and end of k loop.
+ // Prevents mapping of space beyond the grid.
+ k1start = 0;
+ k1end = 0;
+ k2start = 0;
+ k2end = 0;
+ for ( d = 0; d < maxD; d++ ) {
+
+ // Bail out if deadline is reached.
+ if ( ( new Date() ).getTime() > deadline ) {
+ break;
+ }
+
+ // Walk the front path one step.
+ for ( k1 = -d + k1start; k1 <= d - k1end; k1 += 2 ) {
+ k1Offset = vOffset + k1;
+ if ( k1 === -d || ( k1 !== d && v1[ k1Offset - 1 ] < v1[ k1Offset + 1 ] ) ) {
+ x1 = v1[ k1Offset + 1 ];
+ } else {
+ x1 = v1[ k1Offset - 1 ] + 1;
+ }
+ y1 = x1 - k1;
+ while ( x1 < text1Length && y1 < text2Length &&
+ text1.charAt( x1 ) === text2.charAt( y1 ) ) {
+ x1++;
+ y1++;
+ }
+ v1[ k1Offset ] = x1;
+ if ( x1 > text1Length ) {
+
+ // Ran off the right of the graph.
+ k1end += 2;
+ } else if ( y1 > text2Length ) {
+
+ // Ran off the bottom of the graph.
+ k1start += 2;
+ } else if ( front ) {
+ k2Offset = vOffset + delta - k1;
+ if ( k2Offset >= 0 && k2Offset < vLength && v2[ k2Offset ] !== -1 ) {
+
+ // Mirror x2 onto top-left coordinate system.
+ x2 = text1Length - v2[ k2Offset ];
+ if ( x1 >= x2 ) {
+
+ // Overlap detected.
+ return this.diffBisectSplit( text1, text2, x1, y1, deadline );
+ }
+ }
+ }
+ }
+
+ // Walk the reverse path one step.
+ for ( k2 = -d + k2start; k2 <= d - k2end; k2 += 2 ) {
+ k2Offset = vOffset + k2;
+ if ( k2 === -d || ( k2 !== d && v2[ k2Offset - 1 ] < v2[ k2Offset + 1 ] ) ) {
+ x2 = v2[ k2Offset + 1 ];
+ } else {
+ x2 = v2[ k2Offset - 1 ] + 1;
+ }
+ y2 = x2 - k2;
+ while ( x2 < text1Length && y2 < text2Length &&
+ text1.charAt( text1Length - x2 - 1 ) ===
+ text2.charAt( text2Length - y2 - 1 ) ) {
+ x2++;
+ y2++;
+ }
+ v2[ k2Offset ] = x2;
+ if ( x2 > text1Length ) {
+
+ // Ran off the left of the graph.
+ k2end += 2;
+ } else if ( y2 > text2Length ) {
+
+ // Ran off the top of the graph.
+ k2start += 2;
+ } else if ( !front ) {
+ k1Offset = vOffset + delta - k2;
+ if ( k1Offset >= 0 && k1Offset < vLength && v1[ k1Offset ] !== -1 ) {
+ x1 = v1[ k1Offset ];
+ y1 = vOffset + x1 - k1Offset;
+
+ // Mirror x2 onto top-left coordinate system.
+ x2 = text1Length - x2;
+ if ( x1 >= x2 ) {
+
+ // Overlap detected.
+ return this.diffBisectSplit( text1, text2, x1, y1, deadline );
+ }
+ }
+ }
+ }
+ }
+
+ // Diff took too long and hit the deadline or
+ // number of diffs equals number of characters, no commonality at all.
+ return [
+ [ DIFF_DELETE, text1 ],
+ [ DIFF_INSERT, text2 ]
+ ];
+ };
+
+ /**
+ * Given the location of the 'middle snake', split the diff in two parts
+ * and recurse.
+ * @param {string} text1 Old string to be diffed.
+ * @param {string} text2 New string to be diffed.
+ * @param {number} x Index of split point in text1.
+ * @param {number} y Index of split point in text2.
+ * @param {number} deadline Time at which to bail if not yet complete.
+ * @return {!Array.} Array of diff tuples.
+ * @private
+ */
+ DiffMatchPatch.prototype.diffBisectSplit = function( text1, text2, x, y, deadline ) {
+ var text1a, text1b, text2a, text2b, diffs, diffsb;
+ text1a = text1.substring( 0, x );
+ text2a = text2.substring( 0, y );
+ text1b = text1.substring( x );
+ text2b = text2.substring( y );
+
+ // Compute both diffs serially.
+ diffs = this.DiffMain( text1a, text2a, false, deadline );
+ diffsb = this.DiffMain( text1b, text2b, false, deadline );
+
+ return diffs.concat( diffsb );
+ };
+
+ /**
+ * Reduce the number of edits by eliminating semantically trivial equalities.
+ * @param {!Array.} diffs Array of diff tuples.
+ */
+ DiffMatchPatch.prototype.diffCleanupSemantic = function( diffs ) {
+ var changes, equalities, equalitiesLength, lastequality,
+ pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1,
+ lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;
+ changes = false;
+ equalities = []; // Stack of indices where equalities are found.
+ equalitiesLength = 0; // Keeping our own length var is faster in JS.
+ /** @type {?string} */
+ lastequality = null;
+
+ // Always equal to diffs[equalities[equalitiesLength - 1]][1]
+ pointer = 0; // Index of current position.
+
+ // Number of characters that changed prior to the equality.
+ lengthInsertions1 = 0;
+ lengthDeletions1 = 0;
+
+ // Number of characters that changed after the equality.
+ lengthInsertions2 = 0;
+ lengthDeletions2 = 0;
+ while ( pointer < diffs.length ) {
+ if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) { // Equality found.
+ equalities[ equalitiesLength++ ] = pointer;
+ lengthInsertions1 = lengthInsertions2;
+ lengthDeletions1 = lengthDeletions2;
+ lengthInsertions2 = 0;
+ lengthDeletions2 = 0;
+ lastequality = diffs[ pointer ][ 1 ];
+ } else { // An insertion or deletion.
+ if ( diffs[ pointer ][ 0 ] === DIFF_INSERT ) {
+ lengthInsertions2 += diffs[ pointer ][ 1 ].length;
+ } else {
+ lengthDeletions2 += diffs[ pointer ][ 1 ].length;
+ }
+
+ // Eliminate an equality that is smaller or equal to the edits on both
+ // sides of it.
+ if ( lastequality && ( lastequality.length <=
+ Math.max( lengthInsertions1, lengthDeletions1 ) ) &&
+ ( lastequality.length <= Math.max( lengthInsertions2,
+ lengthDeletions2 ) ) ) {
+
+ // Duplicate record.
+ diffs.splice(
+ equalities[ equalitiesLength - 1 ],
+ 0,
+ [ DIFF_DELETE, lastequality ]
+ );
+
+ // Change second copy to insert.
+ diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;
+
+ // Throw away the equality we just deleted.
+ equalitiesLength--;
+
+ // Throw away the previous equality (it needs to be reevaluated).
+ equalitiesLength--;
+ pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;
+
+ // Reset the counters.
+ lengthInsertions1 = 0;
+ lengthDeletions1 = 0;
+ lengthInsertions2 = 0;
+ lengthDeletions2 = 0;
+ lastequality = null;
+ changes = true;
+ }
+ }
+ pointer++;
+ }
+
+ // Normalize the diff.
+ if ( changes ) {
+ this.diffCleanupMerge( diffs );
+ }
+
+ // Find any overlaps between deletions and insertions.
+ // e.g: abcxxxxxxdef
+ // -> abcxxxdef
+ // e.g: xxxabcdefxxx
+ // -> def xxxabc
+ // Only extract an overlap if it is as big as the edit ahead or behind it.
+ pointer = 1;
+ while ( pointer < diffs.length ) {
+ if ( diffs[ pointer - 1 ][ 0 ] === DIFF_DELETE &&
+ diffs[ pointer ][ 0 ] === DIFF_INSERT ) {
+ deletion = diffs[ pointer - 1 ][ 1 ];
+ insertion = diffs[ pointer ][ 1 ];
+ overlapLength1 = this.diffCommonOverlap( deletion, insertion );
+ overlapLength2 = this.diffCommonOverlap( insertion, deletion );
+ if ( overlapLength1 >= overlapLength2 ) {
+ if ( overlapLength1 >= deletion.length / 2 ||
+ overlapLength1 >= insertion.length / 2 ) {
+
+ // Overlap found. Insert an equality and trim the surrounding edits.
+ diffs.splice(
+ pointer,
+ 0,
+ [ DIFF_EQUAL, insertion.substring( 0, overlapLength1 ) ]
+ );
+ diffs[ pointer - 1 ][ 1 ] =
+ deletion.substring( 0, deletion.length - overlapLength1 );
+ diffs[ pointer + 1 ][ 1 ] = insertion.substring( overlapLength1 );
+ pointer++;
+ }
+ } else {
+ if ( overlapLength2 >= deletion.length / 2 ||
+ overlapLength2 >= insertion.length / 2 ) {
+
+ // Reverse overlap found.
+ // Insert an equality and swap and trim the surrounding edits.
+ diffs.splice(
+ pointer,
+ 0,
+ [ DIFF_EQUAL, deletion.substring( 0, overlapLength2 ) ]
+ );
+
+ diffs[ pointer - 1 ][ 0 ] = DIFF_INSERT;
+ diffs[ pointer - 1 ][ 1 ] =
+ insertion.substring( 0, insertion.length - overlapLength2 );
+ diffs[ pointer + 1 ][ 0 ] = DIFF_DELETE;
+ diffs[ pointer + 1 ][ 1 ] =
+ deletion.substring( overlapLength2 );
+ pointer++;
+ }
+ }
+ pointer++;
+ }
+ pointer++;
+ }
+ };
+
+ /**
+ * Determine if the suffix of one string is the prefix of another.
+ * @param {string} text1 First string.
+ * @param {string} text2 Second string.
+ * @return {number} The number of characters common to the end of the first
+ * string and the start of the second string.
+ * @private
+ */
+ DiffMatchPatch.prototype.diffCommonOverlap = function( text1, text2 ) {
+ var text1Length, text2Length, textLength,
+ best, length, pattern, found;
+
+ // Cache the text lengths to prevent multiple calls.
+ text1Length = text1.length;
+ text2Length = text2.length;
+
+ // Eliminate the null case.
+ if ( text1Length === 0 || text2Length === 0 ) {
+ return 0;
+ }
+
+ // Truncate the longer string.
+ if ( text1Length > text2Length ) {
+ text1 = text1.substring( text1Length - text2Length );
+ } else if ( text1Length < text2Length ) {
+ text2 = text2.substring( 0, text1Length );
+ }
+ textLength = Math.min( text1Length, text2Length );
+
+ // Quick check for the worst case.
+ if ( text1 === text2 ) {
+ return textLength;
+ }
+
+ // Start by looking for a single character match
+ // and increase length until no match is found.
+ // Performance analysis: https://neil.fraser.name/news/2010/11/04/
+ best = 0;
+ length = 1;
+ while ( true ) {
+ pattern = text1.substring( textLength - length );
+ found = text2.indexOf( pattern );
+ if ( found === -1 ) {
+ return best;
+ }
+ length += found;
+ if ( found === 0 || text1.substring( textLength - length ) ===
+ text2.substring( 0, length ) ) {
+ best = length;
+ length++;
+ }
+ }
+ };
+
+ /**
+ * Split two texts into an array of strings. Reduce the texts to a string of
+ * hashes where each Unicode character represents one line.
+ * @param {string} text1 First string.
+ * @param {string} text2 Second string.
+ * @return {{chars1: string, chars2: string, lineArray: !Array.}}
+ * An object containing the encoded text1, the encoded text2 and
+ * the array of unique strings.
+ * The zeroth element of the array of unique strings is intentionally blank.
+ * @private
+ */
+ DiffMatchPatch.prototype.diffLinesToChars = function( text1, text2 ) {
+ var lineArray, lineHash, chars1, chars2;
+ lineArray = []; // E.g. lineArray[4] === 'Hello\n'
+ lineHash = {}; // E.g. lineHash['Hello\n'] === 4
+
+ // '\x00' is a valid character, but various debuggers don't like it.
+ // So we'll insert a junk entry to avoid generating a null character.
+ lineArray[ 0 ] = "";
+
+ /**
+ * Split a text into an array of strings. Reduce the texts to a string of
+ * hashes where each Unicode character represents one line.
+ * Modifies linearray and linehash through being a closure.
+ * @param {string} text String to encode.
+ * @return {string} Encoded string.
+ * @private
+ */
+ function diffLinesToCharsMunge( text ) {
+ var chars, lineStart, lineEnd, lineArrayLength, line;
+ chars = "";
+
+ // Walk the text, pulling out a substring for each line.
+ // text.split('\n') would would temporarily double our memory footprint.
+ // Modifying text would create many large strings to garbage collect.
+ lineStart = 0;
+ lineEnd = -1;
+
+ // Keeping our own length variable is faster than looking it up.
+ lineArrayLength = lineArray.length;
+ while ( lineEnd < text.length - 1 ) {
+ lineEnd = text.indexOf( "\n", lineStart );
+ if ( lineEnd === -1 ) {
+ lineEnd = text.length - 1;
+ }
+ line = text.substring( lineStart, lineEnd + 1 );
+ lineStart = lineEnd + 1;
+
+ if ( lineHash.hasOwnProperty ? lineHash.hasOwnProperty( line ) :
+ ( lineHash[ line ] !== undefined ) ) {
+ chars += String.fromCharCode( lineHash[ line ] );
+ } else {
+ chars += String.fromCharCode( lineArrayLength );
+ lineHash[ line ] = lineArrayLength;
+ lineArray[ lineArrayLength++ ] = line;
+ }
+ }
+ return chars;
+ }
+
+ chars1 = diffLinesToCharsMunge( text1 );
+ chars2 = diffLinesToCharsMunge( text2 );
+ return {
+ chars1: chars1,
+ chars2: chars2,
+ lineArray: lineArray
+ };
+ };
+
+ /**
+ * Rehydrate the text in a diff from a string of line hashes to real lines of
+ * text.
+ * @param {!Array.} diffs Array of diff tuples.
+ * @param {!Array.} lineArray Array of unique strings.
+ * @private
+ */
+ DiffMatchPatch.prototype.diffCharsToLines = function( diffs, lineArray ) {
+ var x, chars, text, y;
+ for ( x = 0; x < diffs.length; x++ ) {
+ chars = diffs[ x ][ 1 ];
+ text = [];
+ for ( y = 0; y < chars.length; y++ ) {
+ text[ y ] = lineArray[ chars.charCodeAt( y ) ];
+ }
+ diffs[ x ][ 1 ] = text.join( "" );
+ }
+ };
+
+ /**
+ * Reorder and merge like edit sections. Merge equalities.
+ * Any edit section can move as long as it doesn't cross an equality.
+ * @param {!Array.} diffs Array of diff tuples.
+ */
+ DiffMatchPatch.prototype.diffCleanupMerge = function( diffs ) {
+ var pointer, countDelete, countInsert, textInsert, textDelete,
+ commonlength, changes, diffPointer, position;
+ diffs.push( [ DIFF_EQUAL, "" ] ); // Add a dummy entry at the end.
+ pointer = 0;
+ countDelete = 0;
+ countInsert = 0;
+ textDelete = "";
+ textInsert = "";
+ commonlength;
+ while ( pointer < diffs.length ) {
+ switch ( diffs[ pointer ][ 0 ] ) {
+ case DIFF_INSERT:
+ countInsert++;
+ textInsert += diffs[ pointer ][ 1 ];
+ pointer++;
+ break;
+ case DIFF_DELETE:
+ countDelete++;
+ textDelete += diffs[ pointer ][ 1 ];
+ pointer++;
+ break;
+ case DIFF_EQUAL:
+
+ // Upon reaching an equality, check for prior redundancies.
+ if ( countDelete + countInsert > 1 ) {
+ if ( countDelete !== 0 && countInsert !== 0 ) {
+
+ // Factor out any common prefixes.
+ commonlength = this.diffCommonPrefix( textInsert, textDelete );
+ if ( commonlength !== 0 ) {
+ if ( ( pointer - countDelete - countInsert ) > 0 &&
+ diffs[ pointer - countDelete - countInsert - 1 ][ 0 ] ===
+ DIFF_EQUAL ) {
+ diffs[ pointer - countDelete - countInsert - 1 ][ 1 ] +=
+ textInsert.substring( 0, commonlength );
+ } else {
+ diffs.splice( 0, 0, [ DIFF_EQUAL,
+ textInsert.substring( 0, commonlength )
+ ] );
+ pointer++;
+ }
+ textInsert = textInsert.substring( commonlength );
+ textDelete = textDelete.substring( commonlength );
+ }
+
+ // Factor out any common suffixies.
+ commonlength = this.diffCommonSuffix( textInsert, textDelete );
+ if ( commonlength !== 0 ) {
+ diffs[ pointer ][ 1 ] = textInsert.substring( textInsert.length -
+ commonlength ) + diffs[ pointer ][ 1 ];
+ textInsert = textInsert.substring( 0, textInsert.length -
+ commonlength );
+ textDelete = textDelete.substring( 0, textDelete.length -
+ commonlength );
+ }
+ }
+
+ // Delete the offending records and add the merged ones.
+ if ( countDelete === 0 ) {
+ diffs.splice( pointer - countInsert,
+ countDelete + countInsert, [ DIFF_INSERT, textInsert ] );
+ } else if ( countInsert === 0 ) {
+ diffs.splice( pointer - countDelete,
+ countDelete + countInsert, [ DIFF_DELETE, textDelete ] );
+ } else {
+ diffs.splice(
+ pointer - countDelete - countInsert,
+ countDelete + countInsert,
+ [ DIFF_DELETE, textDelete ], [ DIFF_INSERT, textInsert ]
+ );
+ }
+ pointer = pointer - countDelete - countInsert +
+ ( countDelete ? 1 : 0 ) + ( countInsert ? 1 : 0 ) + 1;
+ } else if ( pointer !== 0 && diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL ) {
+
+ // Merge this equality with the previous one.
+ diffs[ pointer - 1 ][ 1 ] += diffs[ pointer ][ 1 ];
+ diffs.splice( pointer, 1 );
+ } else {
+ pointer++;
+ }
+ countInsert = 0;
+ countDelete = 0;
+ textDelete = "";
+ textInsert = "";
+ break;
+ }
+ }
+ if ( diffs[ diffs.length - 1 ][ 1 ] === "" ) {
+ diffs.pop(); // Remove the dummy entry at the end.
+ }
+
+ // Second pass: look for single edits surrounded on both sides by equalities
+ // which can be shifted sideways to eliminate an equality.
+ // e.g: ABA C -> AB AC
+ changes = false;
+ pointer = 1;
+
+ // Intentionally ignore the first and last element (don't need checking).
+ while ( pointer < diffs.length - 1 ) {
+ if ( diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL &&
+ diffs[ pointer + 1 ][ 0 ] === DIFF_EQUAL ) {
+
+ diffPointer = diffs[ pointer ][ 1 ];
+ position = diffPointer.substring(
+ diffPointer.length - diffs[ pointer - 1 ][ 1 ].length
+ );
+
+ // This is a single edit surrounded by equalities.
+ if ( position === diffs[ pointer - 1 ][ 1 ] ) {
+
+ // Shift the edit over the previous equality.
+ diffs[ pointer ][ 1 ] = diffs[ pointer - 1 ][ 1 ] +
+ diffs[ pointer ][ 1 ].substring( 0, diffs[ pointer ][ 1 ].length -
+ diffs[ pointer - 1 ][ 1 ].length );
+ diffs[ pointer + 1 ][ 1 ] =
+ diffs[ pointer - 1 ][ 1 ] + diffs[ pointer + 1 ][ 1 ];
+ diffs.splice( pointer - 1, 1 );
+ changes = true;
+ } else if ( diffPointer.substring( 0, diffs[ pointer + 1 ][ 1 ].length ) ===
+ diffs[ pointer + 1 ][ 1 ] ) {
+
+ // Shift the edit over the next equality.
+ diffs[ pointer - 1 ][ 1 ] += diffs[ pointer + 1 ][ 1 ];
+ diffs[ pointer ][ 1 ] =
+ diffs[ pointer ][ 1 ].substring( diffs[ pointer + 1 ][ 1 ].length ) +
+ diffs[ pointer + 1 ][ 1 ];
+ diffs.splice( pointer + 1, 1 );
+ changes = true;
+ }
+ }
+ pointer++;
+ }
+
+ // If shifts were made, the diff needs reordering and another shift sweep.
+ if ( changes ) {
+ this.diffCleanupMerge( diffs );
+ }
+ };
+
+ return function( o, n ) {
+ var diff, output, text;
+ diff = new DiffMatchPatch();
+ output = diff.DiffMain( o, n );
+ diff.diffCleanupEfficiency( output );
+ text = diff.diffPrettyHtml( output );
+
+ return text;
+ };
+}() );
+
+}() );
+
+QUnit.notifications = function( options ) {
+ "use strict";
+
+ options = options || {};
+ options.icons = options.icons || {};
+ options.timeout = options.timeout || 4000;
+ options.titles = options.titles || { passed: "Passed!", failed: "Failed!" };
+ options.bodies = options.bodies || {
+ passed: "{{passed}} of {{total}} passed",
+ failed: "{{passed}} passed. {{failed}} failed."
+ };
+
+ var renderBody = function( body, details ) {
+ [ "passed", "failed", "total", "runtime" ].forEach( function( type ) {
+ body = body.replace( "{{" + type + "}}", details[ type ] );
+ } );
+
+ return body;
+ };
+
+ function generateQueryString( params ) {
+ var key,
+ querystring = "?";
+
+ params = QUnit.extend( QUnit.extend( {}, QUnit.urlParams ), params );
+
+ for ( key in params ) {
+ if ( params.hasOwnProperty( key ) ) {
+ if ( params[ key ] === undefined ) {
+ continue;
+ }
+ querystring += encodeURIComponent( key );
+ if ( params[ key ] !== true ) {
+ querystring += "=" + encodeURIComponent( params[ key ] );
+ }
+ querystring += "&";
+ }
+ }
+ return location.protocol + "//" + location.host +
+ location.pathname + querystring.slice( 0, -1 );
+ }
+
+ if ( window.Notification ) {
+ QUnit.done( function( details ) {
+ var title,
+ _options = {},
+ notification;
+
+ if ( window.Notification && QUnit.urlParams.notifications ) {
+ if ( details.failed === 0 ) {
+ title = options.titles.passed;
+ _options.body = renderBody( options.bodies.passed, details );
+
+ if ( options.icons.passed ) {
+ _options.icon = options.icons.passed;
+ }
+ } else {
+ title = options.titles.failed;
+ _options.body = renderBody( options.bodies.failed, details );
+
+ if ( options.icons.failed ) {
+ _options.icon = options.icons.failed;
+ }
+ }
+
+ notification = new window.Notification( title, _options );
+
+ setTimeout( function() {
+ notification.close();
+ }, options.timeout );
+ }
+ } );
+
+ QUnit.begin( function() {
+ var toolbar = document.getElementById( "qunit-testrunner-toolbar" );
+ if ( !toolbar ) { return; }
+
+ var notification = document.createElement( "input" ),
+ label = document.createElement( "label" ),
+ disableCheckbox = function() {
+ notification.checked = false;
+ notification.disabled = true;
+ label.style.opacity = 0.5;
+ label.title = notification.title = "Note: Notifications have been " +
+ "disabled in this browser.";
+ };
+
+ notification.type = "checkbox";
+ notification.id = "qunit-notifications";
+
+ label.innerHTML = "Notifications";
+ label.for = "qunit-notifications";
+ label.title = "Show notifications.";
+ if ( window.Notification.permission === "denied" ) {
+ disableCheckbox();
+ } else if ( QUnit.urlParams.notifications ) {
+ notification.checked = true;
+ }
+
+ notification.addEventListener( "click", function( event ) {
+ if ( event.target.checked ) {
+ if ( window.Notification.permission === "granted" ) {
+ window.location = generateQueryString( { notifications: true } );
+ } else if ( window.Notification.permission === "denied" ) {
+ disableCheckbox();
+ } else {
+ window.Notification.requestPermission( function( permission ) {
+ if ( permission === "denied" ) {
+ disableCheckbox();
+ } else {
+ window.location = generateQueryString( { notifications: true } );
+ }
+ } );
+ }
+ } else {
+ window.location = generateQueryString( { notifications: undefined } );
+ }
+ }, false );
+
+ toolbar.appendChild( notification );
+ toolbar.appendChild( label );
+ } );
+ }
+};
+
+/* globals jQuery,QUnit */
+
+QUnit.config.urlConfig.push({ id: 'nocontainer', label: 'Hide container'});
+QUnit.config.urlConfig.push({ id: 'nolint', label: 'Disable Linting'});
+QUnit.config.urlConfig.push({ id: 'dockcontainer', label: 'Dock container'});
+QUnit.config.testTimeout = 60000; //Default Test Timeout 60 Seconds
+
+if (QUnit.notifications) {
+ QUnit.notifications({
+ icons: {
+ passed: '/assets/passed.png',
+ failed: '/assets/failed.png'
+ }
+ });
+}
+
+jQuery(document).ready(function() {
+ var testContainer = document.getElementById('ember-testing-container');
+ if (!testContainer) { return; }
+
+ var containerVisibility = QUnit.urlParams.nocontainer ? 'hidden' : 'visible';
+ var containerPosition = QUnit.urlParams.dockcontainer ? 'absolute' : 'relative';
+ testContainer.style.visibility = containerVisibility;
+ testContainer.style.position = containerPosition;
+});
+
+/* globals jQuery,QUnit */
+
+jQuery(document).ready(function() {
+ var TestLoaderModule = require('ember-cli/test-loader');
+ var TestLoader = TestLoaderModule['default'];
+ var addModuleExcludeMatcher = TestLoaderModule['addModuleExcludeMatcher'];
+ var addModuleIncludeMatcher = TestLoaderModule['addModuleIncludeMatcher'];
+
+ function excludeModule(moduleName) {
+ return QUnit.urlParams.nolint &&
+ moduleName.match(/\.(jshint|lint-test)$/);
+ }
+
+ function includeModule(moduleName) {
+ return moduleName.match(/\.jshint$/);
+ }
+
+ if (addModuleExcludeMatcher && addModuleIncludeMatcher) {
+ addModuleExcludeMatcher(excludeModule);
+ addModuleIncludeMatcher(includeModule);
+ } else {
+ TestLoader.prototype.shouldLoadModule = function shouldLoadModule(moduleName) {
+ return (moduleName.match(/[-_]test$/) || includeModule(moduleName)) && !excludeModule(moduleName);
+ };
+ }
+
+ TestLoader.prototype.moduleLoadFailure = function(moduleName, error) {
+ QUnit.module('TestLoader Failures');
+ QUnit.test(moduleName + ': could not be loaded', function() {
+ throw error;
+ });
+ };
+
+ var autostart = QUnit.config.autostart !== false;
+ QUnit.config.autostart = false;
+
+ setTimeout(function() {
+ TestLoader.load();
+
+ if (autostart) {
+ QUnit.start();
+ }
+ }, 250);
+});
+
+define('ember-qunit', ['exports', 'ember-qunit/module-for', 'ember-qunit/module-for-component', 'ember-qunit/module-for-model', 'ember-qunit/test', 'ember-qunit/only', 'ember-qunit/skip', 'ember-test-helpers'], function (exports, _emberQunitModuleFor, _emberQunitModuleForComponent, _emberQunitModuleForModel, _emberQunitTest, _emberQunitOnly, _emberQunitSkip, _emberTestHelpers) {
+ 'use strict';
+
+ exports.moduleFor = _emberQunitModuleFor['default'];
+ exports.moduleForComponent = _emberQunitModuleForComponent['default'];
+ exports.moduleForModel = _emberQunitModuleForModel['default'];
+ exports.test = _emberQunitTest['default'];
+ exports.only = _emberQunitOnly['default'];
+ exports.skip = _emberQunitSkip['default'];
+ exports.setResolver = _emberTestHelpers.setResolver;
+});
+define('ember-qunit/module-for-component', ['exports', 'ember-qunit/qunit-module', 'ember-test-helpers'], function (exports, _emberQunitQunitModule, _emberTestHelpers) {
+ 'use strict';
+
+ exports['default'] = moduleForComponent;
+
+ function moduleForComponent(name, description, callbacks) {
+ (0, _emberQunitQunitModule.createModule)(_emberTestHelpers.TestModuleForComponent, name, description, callbacks);
+ }
+});
+define('ember-qunit/module-for-model', ['exports', 'ember-qunit/qunit-module', 'ember-test-helpers'], function (exports, _emberQunitQunitModule, _emberTestHelpers) {
+ 'use strict';
+
+ exports['default'] = moduleForModel;
+
+ function moduleForModel(name, description, callbacks) {
+ (0, _emberQunitQunitModule.createModule)(_emberTestHelpers.TestModuleForModel, name, description, callbacks);
+ }
+});
+define('ember-qunit/module-for', ['exports', 'ember-qunit/qunit-module', 'ember-test-helpers'], function (exports, _emberQunitQunitModule, _emberTestHelpers) {
+ 'use strict';
+
+ exports['default'] = moduleFor;
+
+ function moduleFor(name, description, callbacks) {
+ (0, _emberQunitQunitModule.createModule)(_emberTestHelpers.TestModule, name, description, callbacks);
+ }
+});
+define('ember-qunit/only', ['exports', 'ember-qunit/test-wrapper', 'qunit'], function (exports, _emberQunitTestWrapper, _qunit) {
+ 'use strict';
+
+ exports['default'] = only;
+
+ function only() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ args.unshift(_qunit.only);
+ _emberQunitTestWrapper['default'].apply(null, args);
+ }
+});
+define('ember-qunit/qunit-module', ['exports', 'ember', 'qunit'], function (exports, _ember, _qunit) {
+ 'use strict';
+
+ exports.createModule = createModule;
+
+ function beforeEachCallback(callbacks) {
+ if (typeof callbacks !== 'object') {
+ return;
+ }
+ if (!callbacks) {
+ return;
+ }
+
+ var beforeEach;
+
+ if (callbacks.setup) {
+ beforeEach = callbacks.setup;
+ delete callbacks.setup;
+ }
+
+ if (callbacks.beforeEach) {
+ beforeEach = callbacks.beforeEach;
+ delete callbacks.beforeEach;
+ }
+
+ return beforeEach;
+ }
+
+ function afterEachCallback(callbacks) {
+ if (typeof callbacks !== 'object') {
+ return;
+ }
+ if (!callbacks) {
+ return;
+ }
+
+ var afterEach;
+
+ if (callbacks.teardown) {
+ afterEach = callbacks.teardown;
+ delete callbacks.teardown;
+ }
+
+ if (callbacks.afterEach) {
+ afterEach = callbacks.afterEach;
+ delete callbacks.afterEach;
+ }
+
+ return afterEach;
+ }
+
+ function createModule(Constructor, name, description, callbacks) {
+ var beforeEach = beforeEachCallback(callbacks || description);
+ var afterEach = afterEachCallback(callbacks || description);
+
+ var module = new Constructor(name, description, callbacks);
+
+ (0, _qunit.module)(module.name, {
+ setup: function setup(assert) {
+ var done = assert.async();
+
+ // provide the test context to the underlying module
+ module.setContext(this);
+
+ return module.setup().then(function () {
+ if (beforeEach) {
+ return beforeEach.call(module.context, assert);
+ }
+ })['finally'](done);
+ },
+
+ teardown: function teardown(assert) {
+ var result = undefined;
+
+ if (afterEach) {
+ result = afterEach.call(module.context, assert);
+ }
+
+ var done = assert.async();
+ return _ember['default'].RSVP.resolve(result).then(function () {
+ return module.teardown()['finally'](done);
+ });
+ }
+ });
+ }
+});
+define('ember-qunit/skip', ['exports', 'ember-qunit/test-wrapper', 'qunit'], function (exports, _emberQunitTestWrapper, _qunit) {
+ 'use strict';
+
+ exports['default'] = skip;
+
+ function skip() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ args.unshift(_qunit.skip);
+ _emberQunitTestWrapper['default'].apply(null, args);
+ }
+});
+define('ember-qunit/test-wrapper', ['exports', 'ember', 'ember-test-helpers'], function (exports, _ember, _emberTestHelpers) {
+ 'use strict';
+
+ exports['default'] = testWrapper;
+
+ function testWrapper(qunit /*, testName, expected, callback, async */) {
+ var callback;
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; ++_key) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ function wrapper() {
+ var context = (0, _emberTestHelpers.getContext)();
+
+ var result = callback.apply(context, arguments);
+
+ function failTestOnPromiseRejection(reason) {
+ var message;
+ if (reason instanceof Error) {
+ message = reason.stack;
+ if (reason.message && message && message.indexOf(reason.message) < 0) {
+ // PhantomJS has a `stack` that does not contain the actual
+ // exception message.
+ message = _ember['default'].inspect(reason) + "\n" + message;
+ }
+ } else {
+ message = _ember['default'].inspect(reason);
+ }
+ ok(false, message);
+ }
+
+ _ember['default'].run(function () {
+ QUnit.stop();
+ _ember['default'].RSVP.Promise.resolve(result)['catch'](failTestOnPromiseRejection)['finally'](QUnit.start);
+ });
+ }
+
+ if (args.length === 2) {
+ callback = args.splice(1, 1, wrapper)[0];
+ } else {
+ callback = args.splice(2, 1, wrapper)[0];
+ }
+
+ qunit.apply(null, args);
+ }
+});
+define('ember-qunit/test', ['exports', 'ember-qunit/test-wrapper', 'qunit'], function (exports, _emberQunitTestWrapper, _qunit) {
+ 'use strict';
+
+ exports['default'] = test;
+
+ function test() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ args.unshift(_qunit.test);
+ _emberQunitTestWrapper['default'].apply(null, args);
+ }
+});
+define('ember-test-helpers', ['exports', 'ember', 'ember-test-helpers/test-module', 'ember-test-helpers/test-module-for-acceptance', 'ember-test-helpers/test-module-for-integration', 'ember-test-helpers/test-module-for-component', 'ember-test-helpers/test-module-for-model', 'ember-test-helpers/test-context', 'ember-test-helpers/test-resolver'], function (exports, _ember, _emberTestHelpersTestModule, _emberTestHelpersTestModuleForAcceptance, _emberTestHelpersTestModuleForIntegration, _emberTestHelpersTestModuleForComponent, _emberTestHelpersTestModuleForModel, _emberTestHelpersTestContext, _emberTestHelpersTestResolver) {
+ 'use strict';
+
+ _ember['default'].testing = true;
+
+ exports.TestModule = _emberTestHelpersTestModule['default'];
+ exports.TestModuleForAcceptance = _emberTestHelpersTestModuleForAcceptance['default'];
+ exports.TestModuleForIntegration = _emberTestHelpersTestModuleForIntegration['default'];
+ exports.TestModuleForComponent = _emberTestHelpersTestModuleForComponent['default'];
+ exports.TestModuleForModel = _emberTestHelpersTestModuleForModel['default'];
+ exports.getContext = _emberTestHelpersTestContext.getContext;
+ exports.setContext = _emberTestHelpersTestContext.setContext;
+ exports.unsetContext = _emberTestHelpersTestContext.unsetContext;
+ exports.setResolver = _emberTestHelpersTestResolver.setResolver;
+});
+define('ember-test-helpers/-legacy-overrides', ['exports', 'ember', 'ember-test-helpers/has-ember-version'], function (exports, _ember, _emberTestHelpersHasEmberVersion) {
+ 'use strict';
+
+ exports.preGlimmerSetupIntegrationForComponent = preGlimmerSetupIntegrationForComponent;
+
+ function preGlimmerSetupIntegrationForComponent() {
+ var module = this;
+ var context = this.context;
+
+ this.actionHooks = {};
+
+ context.dispatcher = this.container.lookup('event_dispatcher:main') || _ember['default'].EventDispatcher.create();
+ context.dispatcher.setup({}, '#ember-testing');
+ context.actions = module.actionHooks;
+
+ (this.registry || this.container).register('component:-test-holder', _ember['default'].Component.extend());
+
+ context.render = function (template) {
+ // in case `this.render` is called twice, make sure to teardown the first invocation
+ module.teardownComponent();
+
+ if (!template) {
+ throw new Error("in a component integration test you must pass a template to `render()`");
+ }
+ if (_ember['default'].isArray(template)) {
+ template = template.join('');
+ }
+ if (typeof template === 'string') {
+ template = _ember['default'].Handlebars.compile(template);
+ }
+ module.component = module.container.lookupFactory('component:-test-holder').create({
+ layout: template
+ });
+
+ module.component.set('context', context);
+ module.component.set('controller', context);
+
+ _ember['default'].run(function () {
+ module.component.appendTo('#ember-testing');
+ });
+
+ context._element = module.component.element;
+ };
+
+ context.$ = function () {
+ return module.component.$.apply(module.component, arguments);
+ };
+
+ context.set = function (key, value) {
+ var ret = _ember['default'].run(function () {
+ return _ember['default'].set(context, key, value);
+ });
+
+ if ((0, _emberTestHelpersHasEmberVersion['default'])(2, 0)) {
+ return ret;
+ }
+ };
+
+ context.setProperties = function (hash) {
+ var ret = _ember['default'].run(function () {
+ return _ember['default'].setProperties(context, hash);
+ });
+
+ if ((0, _emberTestHelpersHasEmberVersion['default'])(2, 0)) {
+ return ret;
+ }
+ };
+
+ context.get = function (key) {
+ return _ember['default'].get(context, key);
+ };
+
+ context.getProperties = function () {
+ var args = Array.prototype.slice.call(arguments);
+ return _ember['default'].getProperties(context, args);
+ };
+
+ context.on = function (actionName, handler) {
+ module.actionHooks[actionName] = handler;
+ };
+
+ context.send = function (actionName) {
+ var hook = module.actionHooks[actionName];
+ if (!hook) {
+ throw new Error("integration testing template received unexpected action " + actionName);
+ }
+ hook.apply(module, Array.prototype.slice.call(arguments, 1));
+ };
+
+ context.clearRender = function () {
+ module.teardownComponent();
+ };
+ }
+});
+define('ember-test-helpers/abstract-test-module', ['exports', 'klassy', 'ember-test-helpers/wait', 'ember-test-helpers/test-context', 'ember'], function (exports, _klassy, _emberTestHelpersWait, _emberTestHelpersTestContext, _ember) {
+ 'use strict';
+
+ // calling this `merge` here because we cannot
+ // actually assume it is like `Object.assign`
+ // with > 2 args
+ var merge = _ember['default'].assign || _ember['default'].merge;
+
+ exports['default'] = _klassy.Klass.extend({
+ init: function init(name, options) {
+ this.context = undefined;
+ this.name = name;
+ this.callbacks = options || {};
+
+ this.initSetupSteps();
+ this.initTeardownSteps();
+ },
+
+ setup: function setup(assert) {
+ var _this = this;
+
+ return this.invokeSteps(this.setupSteps, this, assert).then(function () {
+ _this.contextualizeCallbacks();
+ return _this.invokeSteps(_this.contextualizedSetupSteps, _this.context, assert);
+ });
+ },
+
+ teardown: function teardown(assert) {
+ var _this2 = this;
+
+ return this.invokeSteps(this.contextualizedTeardownSteps, this.context, assert).then(function () {
+ return _this2.invokeSteps(_this2.teardownSteps, _this2, assert);
+ }).then(function () {
+ _this2.cache = null;
+ _this2.cachedCalls = null;
+ });
+ },
+
+ initSetupSteps: function initSetupSteps() {
+ this.setupSteps = [];
+ this.contextualizedSetupSteps = [];
+
+ if (this.callbacks.beforeSetup) {
+ this.setupSteps.push(this.callbacks.beforeSetup);
+ delete this.callbacks.beforeSetup;
+ }
+
+ this.setupSteps.push(this.setupContext);
+ this.setupSteps.push(this.setupTestElements);
+ this.setupSteps.push(this.setupAJAXListeners);
+
+ if (this.callbacks.setup) {
+ this.contextualizedSetupSteps.push(this.callbacks.setup);
+ delete this.callbacks.setup;
+ }
+ },
+
+ invokeSteps: function invokeSteps(steps, context, assert) {
+ steps = steps.slice();
+
+ function nextStep() {
+ var step = steps.shift();
+ if (step) {
+ // guard against exceptions, for example missing components referenced from needs.
+ return new _ember['default'].RSVP.Promise(function (resolve) {
+ resolve(step.call(context, assert));
+ }).then(nextStep);
+ } else {
+ return _ember['default'].RSVP.resolve();
+ }
+ }
+ return nextStep();
+ },
+
+ contextualizeCallbacks: function contextualizeCallbacks() {},
+
+ initTeardownSteps: function initTeardownSteps() {
+ this.teardownSteps = [];
+ this.contextualizedTeardownSteps = [];
+
+ if (this.callbacks.teardown) {
+ this.contextualizedTeardownSteps.push(this.callbacks.teardown);
+ delete this.callbacks.teardown;
+ }
+
+ this.teardownSteps.push(this.teardownContext);
+ this.teardownSteps.push(this.teardownTestElements);
+ this.teardownSteps.push(this.teardownAJAXListeners);
+
+ if (this.callbacks.afterTeardown) {
+ this.teardownSteps.push(this.callbacks.afterTeardown);
+ delete this.callbacks.afterTeardown;
+ }
+ },
+
+ setupTestElements: function setupTestElements() {
+ var testEl = document.querySelector('#ember-testing');
+ if (!testEl) {
+ var element = document.createElement('div');
+ element.setAttribute('id', 'ember-testing');
+
+ document.body.appendChild(element);
+ this.fixtureResetValue = '';
+ } else {
+ this.fixtureResetValue = testEl.innerHTML;
+ }
+ },
+
+ setupContext: function setupContext(options) {
+ var context = this.getContext();
+
+ merge(context, {
+ dispatcher: null,
+ inject: {}
+ });
+ merge(context, options);
+
+ (0, _emberTestHelpersTestContext.setContext)(context);
+ this.context = context;
+ },
+
+ setContext: function setContext(context) {
+ this.context = context;
+ },
+
+ getContext: function getContext() {
+ if (this.context) {
+ return this.context;
+ }
+
+ return this.context = (0, _emberTestHelpersTestContext.getContext)() || {};
+ },
+
+ setupAJAXListeners: function setupAJAXListeners() {
+ (0, _emberTestHelpersWait._setupAJAXHooks)();
+ },
+
+ teardownAJAXListeners: function teardownAJAXListeners() {
+ (0, _emberTestHelpersWait._teardownAJAXHooks)();
+ },
+
+ teardownTestElements: function teardownTestElements() {
+ document.getElementById('ember-testing').innerHTML = this.fixtureResetValue;
+
+ // Ember 2.0.0 removed Ember.View as public API, so only do this when
+ // Ember.View is present
+ if (_ember['default'].View && _ember['default'].View.views) {
+ _ember['default'].View.views = {};
+ }
+ },
+
+ teardownContext: function teardownContext() {
+ var context = this.context;
+ this.context = undefined;
+ (0, _emberTestHelpersTestContext.unsetContext)();
+
+ if (context && context.dispatcher && !context.dispatcher.isDestroyed) {
+ _ember['default'].run(function () {
+ context.dispatcher.destroy();
+ });
+ }
+ }
+ });
+});
+define('ember-test-helpers/build-registry', ['exports', 'ember'], function (exports, _ember) {
+ /* globals global, self, requirejs, require */
+
+ 'use strict';
+
+ function exposeRegistryMethodsWithoutDeprecations(container) {
+ var methods = ['register', 'unregister', 'resolve', 'normalize', 'typeInjection', 'injection', 'factoryInjection', 'factoryTypeInjection', 'has', 'options', 'optionsForType'];
+
+ function exposeRegistryMethod(container, method) {
+ if (method in container) {
+ container[method] = function () {
+ return container._registry[method].apply(container._registry, arguments);
+ };
+ }
+ }
+
+ for (var i = 0, l = methods.length; i < l; i++) {
+ exposeRegistryMethod(container, methods[i]);
+ }
+ }
+
+ var Owner = (function () {
+ if (_ember['default']._RegistryProxyMixin && _ember['default']._ContainerProxyMixin) {
+ return _ember['default'].Object.extend(_ember['default']._RegistryProxyMixin, _ember['default']._ContainerProxyMixin);
+ }
+
+ return _ember['default'].Object.extend();
+ })();
+
+ exports['default'] = function (resolver) {
+ var fallbackRegistry, registry, container;
+ var namespace = _ember['default'].Object.create({
+ Resolver: { create: function create() {
+ return resolver;
+ } }
+ });
+
+ function register(name, factory) {
+ var thingToRegisterWith = registry || container;
+
+ if (!container.lookupFactory(name)) {
+ thingToRegisterWith.register(name, factory);
+ }
+ }
+
+ if (_ember['default'].Application.buildRegistry) {
+ fallbackRegistry = _ember['default'].Application.buildRegistry(namespace);
+ fallbackRegistry.register('component-lookup:main', _ember['default'].ComponentLookup);
+
+ registry = new _ember['default'].Registry({
+ fallback: fallbackRegistry
+ });
+
+ if (_ember['default'].ApplicationInstance && _ember['default'].ApplicationInstance.setupRegistry) {
+ _ember['default'].ApplicationInstance.setupRegistry(registry);
+ }
+
+ // these properties are set on the fallback registry by `buildRegistry`
+ // and on the primary registry within the ApplicationInstance constructor
+ // but we need to manually recreate them since ApplicationInstance's are not
+ // exposed externally
+ registry.normalizeFullName = fallbackRegistry.normalizeFullName;
+ registry.makeToString = fallbackRegistry.makeToString;
+ registry.describe = fallbackRegistry.describe;
+
+ var owner = Owner.create({
+ __registry__: registry,
+ __container__: null
+ });
+
+ container = registry.container({ owner: owner });
+ owner.__container__ = container;
+
+ exposeRegistryMethodsWithoutDeprecations(container);
+ } else {
+ container = _ember['default'].Application.buildContainer(namespace);
+ container.register('component-lookup:main', _ember['default'].ComponentLookup);
+ }
+
+ // Ember 1.10.0 did not properly add `view:toplevel` or `view:default`
+ // to the registry in Ember.Application.buildRegistry :(
+ //
+ // Ember 2.0.0 removed Ember.View as public API, so only do this when
+ // Ember.View is present
+ if (_ember['default'].View) {
+ register('view:toplevel', _ember['default'].View.extend());
+ }
+
+ // Ember 2.0.0 removed Ember._MetamorphView from the Ember global, so only
+ // do this when present
+ if (_ember['default']._MetamorphView) {
+ register('view:default', _ember['default']._MetamorphView);
+ }
+
+ var globalContext = typeof global === 'object' && global || self;
+ if (requirejs.entries['ember-data/setup-container']) {
+ // ember-data is a proper ember-cli addon since 2.3; if no 'import
+ // 'ember-data'' is present somewhere in the tests, there is also no `DS`
+ // available on the globalContext and hence ember-data wouldn't be setup
+ // correctly for the tests; that's why we import and call setupContainer
+ // here; also see https://github.com/emberjs/data/issues/4071 for context
+ var setupContainer = require('ember-data/setup-container')['default'];
+ setupContainer(registry || container);
+ } else if (globalContext.DS) {
+ var DS = globalContext.DS;
+ if (DS._setupContainer) {
+ DS._setupContainer(registry || container);
+ } else {
+ register('transform:boolean', DS.BooleanTransform);
+ register('transform:date', DS.DateTransform);
+ register('transform:number', DS.NumberTransform);
+ register('transform:string', DS.StringTransform);
+ register('serializer:-default', DS.JSONSerializer);
+ register('serializer:-rest', DS.RESTSerializer);
+ register('adapter:-rest', DS.RESTAdapter);
+ }
+ }
+
+ return {
+ registry: registry,
+ container: container
+ };
+ };
+});
+define('ember-test-helpers/has-ember-version', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports['default'] = hasEmberVersion;
+
+ function hasEmberVersion(major, minor) {
+ var numbers = _ember['default'].VERSION.split('-')[0].split('.');
+ var actualMajor = parseInt(numbers[0], 10);
+ var actualMinor = parseInt(numbers[1], 10);
+ return actualMajor > major || actualMajor === major && actualMinor >= minor;
+ }
+});
+define("ember-test-helpers/test-context", ["exports"], function (exports) {
+ "use strict";
+
+ exports.setContext = setContext;
+ exports.getContext = getContext;
+ exports.unsetContext = unsetContext;
+ var __test_context__;
+
+ function setContext(context) {
+ __test_context__ = context;
+ }
+
+ function getContext() {
+ return __test_context__;
+ }
+
+ function unsetContext() {
+ __test_context__ = undefined;
+ }
+});
+define('ember-test-helpers/test-module-for-acceptance', ['exports', 'ember-test-helpers/abstract-test-module', 'ember', 'ember-test-helpers/test-context'], function (exports, _emberTestHelpersAbstractTestModule, _ember, _emberTestHelpersTestContext) {
+ 'use strict';
+
+ exports['default'] = _emberTestHelpersAbstractTestModule['default'].extend({
+ setupContext: function setupContext() {
+ this._super({ application: this.createApplication() });
+ },
+
+ teardownContext: function teardownContext() {
+ _ember['default'].run(function () {
+ (0, _emberTestHelpersTestContext.getContext)().application.destroy();
+ });
+
+ this._super();
+ },
+
+ createApplication: function createApplication() {
+ var _callbacks = this.callbacks;
+ var Application = _callbacks.Application;
+ var config = _callbacks.config;
+
+ var application = undefined;
+
+ _ember['default'].run(function () {
+ application = Application.create(config);
+ application.setupForTesting();
+ application.injectTestHelpers();
+ });
+
+ return application;
+ }
+ });
+});
+define('ember-test-helpers/test-module-for-component', ['exports', 'ember-test-helpers/test-module', 'ember', 'ember-test-helpers/has-ember-version', 'ember-test-helpers/-legacy-overrides'], function (exports, _emberTestHelpersTestModule, _ember, _emberTestHelpersHasEmberVersion, _emberTestHelpersLegacyOverrides) {
+ 'use strict';
+
+ exports.setupComponentIntegrationTest = setupComponentIntegrationTest;
+
+ var ACTION_KEY = undefined;
+ if ((0, _emberTestHelpersHasEmberVersion['default'])(2, 0)) {
+ ACTION_KEY = 'actions';
+ } else {
+ ACTION_KEY = '_actions';
+ }
+
+ var getOwner = _ember['default'].getOwner;
+ exports['default'] = _emberTestHelpersTestModule['default'].extend({
+ isComponentTestModule: true,
+
+ init: function init(componentName, description, callbacks) {
+ // Allow `description` to be omitted
+ if (!callbacks && typeof description === 'object') {
+ callbacks = description;
+ description = null;
+ } else if (!callbacks) {
+ callbacks = {};
+ }
+
+ this.componentName = componentName;
+
+ if (callbacks.needs || callbacks.unit || callbacks.integration === false) {
+ this.isUnitTest = true;
+ } else if (callbacks.integration) {
+ this.isUnitTest = false;
+ } else {
+ _ember['default'].deprecate("the component:" + componentName + " test module is implicitly running in unit test mode, " + "which will change to integration test mode by default in an upcoming version of " + "ember-test-helpers. Add `unit: true` or a `needs:[]` list to explicitly opt in to unit " + "test mode.", false, { id: 'ember-test-helpers.test-module-for-component.test-type', until: '0.6.0' });
+ this.isUnitTest = true;
+ }
+
+ if (description) {
+ this._super.call(this, 'component:' + componentName, description, callbacks);
+ } else {
+ this._super.call(this, 'component:' + componentName, callbacks);
+ }
+
+ if (!this.isUnitTest && !this.isLegacy) {
+ callbacks.integration = true;
+ }
+
+ if (this.isUnitTest || this.isLegacy) {
+ this.setupSteps.push(this.setupComponentUnitTest);
+ } else {
+ this.callbacks.subject = function () {
+ throw new Error("component integration tests do not support `subject()`. Instead, render the component as if it were HTML: `this.render('');`. For more information, read: http://guides.emberjs.com/v2.2.0/testing/testing-components/");
+ };
+ this.setupSteps.push(this.setupComponentIntegrationTest);
+ this.teardownSteps.unshift(this.teardownComponent);
+ }
+
+ if (_ember['default'].View && _ember['default'].View.views) {
+ this.setupSteps.push(this._aliasViewRegistry);
+ this.teardownSteps.unshift(this._resetViewRegistry);
+ }
+ },
+
+ _aliasViewRegistry: function _aliasViewRegistry() {
+ this._originalGlobalViewRegistry = _ember['default'].View.views;
+ var viewRegistry = this.container.lookup('-view-registry:main');
+
+ if (viewRegistry) {
+ _ember['default'].View.views = viewRegistry;
+ }
+ },
+
+ _resetViewRegistry: function _resetViewRegistry() {
+ _ember['default'].View.views = this._originalGlobalViewRegistry;
+ },
+
+ setupComponentUnitTest: function setupComponentUnitTest() {
+ var _this = this;
+ var resolver = this.resolver;
+ var context = this.context;
+
+ var layoutName = 'template:components/' + this.componentName;
+
+ var layout = resolver.resolve(layoutName);
+
+ var thingToRegisterWith = this.registry || this.container;
+ if (layout) {
+ thingToRegisterWith.register(layoutName, layout);
+ thingToRegisterWith.injection(this.subjectName, 'layout', layoutName);
+ }
+
+ context.dispatcher = this.container.lookup('event_dispatcher:main') || _ember['default'].EventDispatcher.create();
+ context.dispatcher.setup({}, '#ember-testing');
+
+ context._element = null;
+
+ this.callbacks.render = function () {
+ var subject;
+
+ _ember['default'].run(function () {
+ subject = context.subject();
+ subject.appendTo('#ember-testing');
+ });
+
+ context._element = subject.element;
+
+ _this.teardownSteps.unshift(function () {
+ _ember['default'].run(function () {
+ _ember['default'].tryInvoke(subject, 'destroy');
+ });
+ });
+ };
+
+ this.callbacks.append = function () {
+ _ember['default'].deprecate('this.append() is deprecated. Please use this.render() or this.$() instead.', false, { id: 'ember-test-helpers.test-module-for-component.append', until: '0.6.0' });
+ return context.$();
+ };
+
+ context.$ = function () {
+ this.render();
+ var subject = this.subject();
+
+ return subject.$.apply(subject, arguments);
+ };
+ },
+
+ setupComponentIntegrationTest: (function () {
+ if (!(0, _emberTestHelpersHasEmberVersion['default'])(1, 13)) {
+ return _emberTestHelpersLegacyOverrides.preGlimmerSetupIntegrationForComponent;
+ } else {
+ return setupComponentIntegrationTest;
+ }
+ })(),
+
+ setupContext: function setupContext() {
+ this._super.call(this);
+
+ // only setup the injection if we are running against a version
+ // of Ember that has `-view-registry:main` (Ember >= 1.12)
+ if (this.container.lookupFactory('-view-registry:main')) {
+ (this.registry || this.container).injection('component', '_viewRegistry', '-view-registry:main');
+ }
+
+ if (!this.isUnitTest && !this.isLegacy) {
+ this.context.factory = function () {};
+ }
+ },
+
+ teardownComponent: function teardownComponent() {
+ var component = this.component;
+ if (component) {
+ _ember['default'].run(component, 'destroy');
+ this.component = null;
+ }
+ }
+ });
+
+ function setupComponentIntegrationTest() {
+ var module = this;
+ var context = this.context;
+
+ this.actionHooks = context[ACTION_KEY] = {};
+ context.dispatcher = this.container.lookup('event_dispatcher:main') || _ember['default'].EventDispatcher.create();
+ context.dispatcher.setup({}, '#ember-testing');
+
+ var hasRendered = false;
+ var OutletView = module.container.lookupFactory('view:-outlet');
+ var OutletTemplate = module.container.lookup('template:-outlet');
+ var toplevelView = module.component = OutletView.create();
+ var hasOutletTemplate = !!OutletTemplate;
+ var outletState = {
+ render: {
+ owner: getOwner ? getOwner(module.container) : undefined,
+ into: undefined,
+ outlet: 'main',
+ name: 'application',
+ controller: module.context,
+ ViewClass: undefined,
+ template: OutletTemplate
+ },
+
+ outlets: {}
+ };
+
+ var element = document.getElementById('ember-testing');
+ var templateId = 0;
+
+ if (hasOutletTemplate) {
+ _ember['default'].run(function () {
+ toplevelView.setOutletState(outletState);
+ });
+ }
+
+ context.render = function (template) {
+ if (!template) {
+ throw new Error("in a component integration test you must pass a template to `render()`");
+ }
+ if (_ember['default'].isArray(template)) {
+ template = template.join('');
+ }
+ if (typeof template === 'string') {
+ template = _ember['default'].Handlebars.compile(template);
+ }
+
+ var templateFullName = 'template:-undertest-' + ++templateId;
+ this.registry.register(templateFullName, template);
+ var stateToRender = {
+ owner: getOwner ? getOwner(module.container) : undefined,
+ into: undefined,
+ outlet: 'main',
+ name: 'index',
+ controller: module.context,
+ ViewClass: undefined,
+ template: module.container.lookup(templateFullName),
+ outlets: {}
+ };
+
+ if (hasOutletTemplate) {
+ stateToRender.name = 'index';
+ outletState.outlets.main = { render: stateToRender, outlets: {} };
+ } else {
+ stateToRender.name = 'application';
+ outletState = { render: stateToRender, outlets: {} };
+ }
+
+ _ember['default'].run(function () {
+ toplevelView.setOutletState(outletState);
+ });
+
+ if (!hasRendered) {
+ _ember['default'].run(module.component, 'appendTo', '#ember-testing');
+ hasRendered = true;
+ }
+
+ // ensure the element is based on the wrapping toplevel view
+ // Ember still wraps the main application template with a
+ // normal tagged view
+ context._element = element = document.querySelector('#ember-testing > .ember-view');
+ };
+
+ context.$ = function (selector) {
+ // emulates Ember internal behavor of `this.$` in a component
+ // https://github.com/emberjs/ember.js/blob/v2.5.1/packages/ember-views/lib/views/states/has_element.js#L18
+ return selector ? _ember['default'].$(selector, element) : _ember['default'].$(element);
+ };
+
+ context.set = function (key, value) {
+ var ret = _ember['default'].run(function () {
+ return _ember['default'].set(context, key, value);
+ });
+
+ if ((0, _emberTestHelpersHasEmberVersion['default'])(2, 0)) {
+ return ret;
+ }
+ };
+
+ context.setProperties = function (hash) {
+ var ret = _ember['default'].run(function () {
+ return _ember['default'].setProperties(context, hash);
+ });
+
+ if ((0, _emberTestHelpersHasEmberVersion['default'])(2, 0)) {
+ return ret;
+ }
+ };
+
+ context.get = function (key) {
+ return _ember['default'].get(context, key);
+ };
+
+ context.getProperties = function () {
+ var args = Array.prototype.slice.call(arguments);
+ return _ember['default'].getProperties(context, args);
+ };
+
+ context.on = function (actionName, handler) {
+ module.actionHooks[actionName] = handler;
+ };
+
+ context.send = function (actionName) {
+ var hook = module.actionHooks[actionName];
+ if (!hook) {
+ throw new Error("integration testing template received unexpected action " + actionName);
+ }
+ hook.apply(module.context, Array.prototype.slice.call(arguments, 1));
+ };
+
+ context.clearRender = function () {
+ _ember['default'].run(function () {
+ toplevelView.setOutletState({
+ render: {
+ owner: module.container,
+ into: undefined,
+ outlet: 'main',
+ name: 'application',
+ controller: module.context,
+ ViewClass: undefined,
+ template: undefined
+ },
+ outlets: {}
+ });
+ });
+ };
+ }
+});
+define('ember-test-helpers/test-module-for-integration', ['exports', 'ember', 'ember-test-helpers/abstract-test-module', 'ember-test-helpers/test-resolver', 'ember-test-helpers/build-registry', 'ember-test-helpers/has-ember-version', 'ember-test-helpers/-legacy-overrides', 'ember-test-helpers/test-module-for-component'], function (exports, _ember, _emberTestHelpersAbstractTestModule, _emberTestHelpersTestResolver, _emberTestHelpersBuildRegistry, _emberTestHelpersHasEmberVersion, _emberTestHelpersLegacyOverrides, _emberTestHelpersTestModuleForComponent) {
+ 'use strict';
+
+ var ACTION_KEY = undefined;
+ if ((0, _emberTestHelpersHasEmberVersion['default'])(2, 0)) {
+ ACTION_KEY = 'actions';
+ } else {
+ ACTION_KEY = '_actions';
+ }
+
+ exports['default'] = _emberTestHelpersAbstractTestModule['default'].extend({
+ init: function init() {
+ this._super.apply(this, arguments);
+ this.resolver = this.callbacks.resolver || (0, _emberTestHelpersTestResolver.getResolver)();
+ },
+
+ initSetupSteps: function initSetupSteps() {
+ this.setupSteps = [];
+ this.contextualizedSetupSteps = [];
+
+ if (this.callbacks.beforeSetup) {
+ this.setupSteps.push(this.callbacks.beforeSetup);
+ delete this.callbacks.beforeSetup;
+ }
+
+ this.setupSteps.push(this.setupContainer);
+ this.setupSteps.push(this.setupContext);
+ this.setupSteps.push(this.setupTestElements);
+ this.setupSteps.push(this.setupAJAXListeners);
+ this.setupSteps.push(this.setupComponentIntegrationTest);
+
+ if (_ember['default'].View && _ember['default'].View.views) {
+ this.setupSteps.push(this._aliasViewRegistry);
+ }
+
+ if (this.callbacks.setup) {
+ this.contextualizedSetupSteps.push(this.callbacks.setup);
+ delete this.callbacks.setup;
+ }
+ },
+
+ initTeardownSteps: function initTeardownSteps() {
+ this.teardownSteps = [];
+ this.contextualizedTeardownSteps = [];
+
+ if (this.callbacks.teardown) {
+ this.contextualizedTeardownSteps.push(this.callbacks.teardown);
+ delete this.callbacks.teardown;
+ }
+
+ this.teardownSteps.push(this.teardownContainer);
+ this.teardownSteps.push(this.teardownContext);
+ this.teardownSteps.push(this.teardownAJAXListeners);
+ this.teardownSteps.push(this.teardownComponent);
+
+ if (_ember['default'].View && _ember['default'].View.views) {
+ this.teardownSteps.push(this._resetViewRegistry);
+ }
+
+ this.teardownSteps.push(this.teardownTestElements);
+
+ if (this.callbacks.afterTeardown) {
+ this.teardownSteps.push(this.callbacks.afterTeardown);
+ delete this.callbacks.afterTeardown;
+ }
+ },
+
+ setupContainer: function setupContainer() {
+ var resolver = this.resolver;
+ var items = (0, _emberTestHelpersBuildRegistry['default'])(resolver);
+
+ this.container = items.container;
+ this.registry = items.registry;
+
+ if ((0, _emberTestHelpersHasEmberVersion['default'])(1, 13)) {
+ var thingToRegisterWith = this.registry || this.container;
+ var router = resolver.resolve('router:main');
+ router = router || _ember['default'].Router.extend();
+ thingToRegisterWith.register('router:main', router);
+ }
+ },
+
+ setupContext: function setupContext() {
+ var subjectName = this.subjectName;
+ var container = this.container;
+
+ var factory = function factory() {
+ return container.lookupFactory(subjectName);
+ };
+
+ this._super({
+ container: this.container,
+ registry: this.registry,
+ factory: factory,
+ register: function register() {
+ var target = this.registry || this.container;
+ return target.register.apply(target, arguments);
+ }
+ });
+
+ var context = this.context;
+
+ if (_ember['default'].setOwner) {
+ _ember['default'].setOwner(context, this.container.owner);
+ }
+
+ if (_ember['default'].inject) {
+ var keys = (Object.keys || _ember['default'].keys)(_ember['default'].inject);
+ keys.forEach(function (typeName) {
+ context.inject[typeName] = function (name, opts) {
+ var alias = opts && opts.as || name;
+ _ember['default'].run(function () {
+ _ember['default'].set(context, alias, context.container.lookup(typeName + ':' + name));
+ });
+ };
+ });
+ }
+
+ // only setup the injection if we are running against a version
+ // of Ember that has `-view-registry:main` (Ember >= 1.12)
+ if (this.container.lookupFactory('-view-registry:main')) {
+ (this.registry || this.container).injection('component', '_viewRegistry', '-view-registry:main');
+ }
+ },
+
+ setupComponentIntegrationTest: (function () {
+ if (!(0, _emberTestHelpersHasEmberVersion['default'])(1, 13)) {
+ return _emberTestHelpersLegacyOverrides.preGlimmerSetupIntegrationForComponent;
+ } else {
+ return _emberTestHelpersTestModuleForComponent.setupComponentIntegrationTest;
+ }
+ })(),
+
+ teardownComponent: function teardownComponent() {
+ var component = this.component;
+ if (component) {
+ _ember['default'].run(function () {
+ component.destroy();
+ });
+ }
+ },
+
+ teardownContainer: function teardownContainer() {
+ var container = this.container;
+ _ember['default'].run(function () {
+ container.destroy();
+ });
+ },
+
+ // allow arbitrary named factories, like rspec let
+ contextualizeCallbacks: function contextualizeCallbacks() {
+ var callbacks = this.callbacks;
+ var context = this.context;
+
+ this.cache = this.cache || {};
+ this.cachedCalls = this.cachedCalls || {};
+
+ var keys = (Object.keys || _ember['default'].keys)(callbacks);
+ var keysLength = keys.length;
+
+ if (keysLength) {
+ for (var i = 0; i < keysLength; i++) {
+ this._contextualizeCallback(context, keys[i], context);
+ }
+ }
+ },
+
+ _contextualizeCallback: function _contextualizeCallback(context, key, callbackContext) {
+ var _this = this;
+ var callbacks = this.callbacks;
+ var factory = context.factory;
+
+ context[key] = function (options) {
+ if (_this.cachedCalls[key]) {
+ return _this.cache[key];
+ }
+
+ var result = callbacks[key].call(callbackContext, options, factory());
+
+ _this.cache[key] = result;
+ _this.cachedCalls[key] = true;
+
+ return result;
+ };
+ },
+
+ _aliasViewRegistry: function _aliasViewRegistry() {
+ this._originalGlobalViewRegistry = _ember['default'].View.views;
+ var viewRegistry = this.container.lookup('-view-registry:main');
+
+ if (viewRegistry) {
+ _ember['default'].View.views = viewRegistry;
+ }
+ },
+
+ _resetViewRegistry: function _resetViewRegistry() {
+ _ember['default'].View.views = this._originalGlobalViewRegistry;
+ }
+ });
+});
+define('ember-test-helpers/test-module-for-model', ['exports', 'ember-test-helpers/test-module', 'ember'], function (exports, _emberTestHelpersTestModule, _ember) {
+ /* global DS, require, requirejs */ // added here to prevent an import from erroring when ED is not present
+
+ 'use strict';
+
+ exports['default'] = _emberTestHelpersTestModule['default'].extend({
+ init: function init(modelName, description, callbacks) {
+ this.modelName = modelName;
+
+ this._super.call(this, 'model:' + modelName, description, callbacks);
+
+ this.setupSteps.push(this.setupModel);
+ },
+
+ setupModel: function setupModel() {
+ var container = this.container;
+ var defaultSubject = this.defaultSubject;
+ var callbacks = this.callbacks;
+ var modelName = this.modelName;
+
+ var adapterFactory = container.lookupFactory('adapter:application');
+ if (!adapterFactory) {
+ if (requirejs.entries['ember-data/adapters/json-api']) {
+ adapterFactory = require('ember-data/adapters/json-api')['default'];
+ }
+
+ // when ember-data/adapters/json-api is provided via ember-cli shims
+ // using Ember Data 1.x the actual JSONAPIAdapter isn't found, but the
+ // above require statement returns a bizzaro object with only a `default`
+ // property (circular reference actually)
+ if (!adapterFactory || !adapterFactory.create) {
+ adapterFactory = DS.JSONAPIAdapter || DS.FixtureAdapter;
+ }
+
+ var thingToRegisterWith = this.registry || this.container;
+ thingToRegisterWith.register('adapter:application', adapterFactory);
+ }
+
+ callbacks.store = function () {
+ var container = this.container;
+ var store = container.lookup('service:store') || container.lookup('store:main');
+ return store;
+ };
+
+ if (callbacks.subject === defaultSubject) {
+ callbacks.subject = function (options) {
+ var container = this.container;
+
+ return _ember['default'].run(function () {
+ var store = container.lookup('service:store') || container.lookup('store:main');
+ return store.createRecord(modelName, options);
+ });
+ };
+ }
+ }
+ });
+});
+define('ember-test-helpers/test-module', ['exports', 'ember', 'ember-test-helpers/abstract-test-module', 'ember-test-helpers/test-resolver', 'ember-test-helpers/build-registry', 'ember-test-helpers/has-ember-version'], function (exports, _ember, _emberTestHelpersAbstractTestModule, _emberTestHelpersTestResolver, _emberTestHelpersBuildRegistry, _emberTestHelpersHasEmberVersion) {
+ 'use strict';
+
+ exports['default'] = _emberTestHelpersAbstractTestModule['default'].extend({
+ init: function init(subjectName, description, callbacks) {
+ // Allow `description` to be omitted, in which case it should
+ // default to `subjectName`
+ if (!callbacks && typeof description === 'object') {
+ callbacks = description;
+ description = subjectName;
+ }
+
+ this.subjectName = subjectName;
+ this.description = description || subjectName;
+ this.name = description || subjectName;
+ this.callbacks = callbacks || {};
+ this.resolver = this.callbacks.resolver || (0, _emberTestHelpersTestResolver.getResolver)();
+
+ if (this.callbacks.integration && this.callbacks.needs) {
+ throw new Error("cannot declare 'integration: true' and 'needs' in the same module");
+ }
+
+ if (this.callbacks.integration) {
+ if (this.isComponentTestModule) {
+ this.isLegacy = callbacks.integration === 'legacy';
+ this.isIntegration = callbacks.integration !== 'legacy';
+ } else {
+ if (callbacks.integration === 'legacy') {
+ throw new Error('`integration: \'legacy\'` is only valid for component tests.');
+ }
+ this.isIntegration = true;
+ }
+
+ delete callbacks.integration;
+ }
+
+ this.initSubject();
+ this.initNeeds();
+ this.initSetupSteps();
+ this.initTeardownSteps();
+ },
+
+ initSubject: function initSubject() {
+ this.callbacks.subject = this.callbacks.subject || this.defaultSubject;
+ },
+
+ initNeeds: function initNeeds() {
+ this.needs = [this.subjectName];
+ if (this.callbacks.needs) {
+ this.needs = this.needs.concat(this.callbacks.needs);
+ delete this.callbacks.needs;
+ }
+ },
+
+ initSetupSteps: function initSetupSteps() {
+ this.setupSteps = [];
+ this.contextualizedSetupSteps = [];
+
+ if (this.callbacks.beforeSetup) {
+ this.setupSteps.push(this.callbacks.beforeSetup);
+ delete this.callbacks.beforeSetup;
+ }
+
+ this.setupSteps.push(this.setupContainer);
+ this.setupSteps.push(this.setupContext);
+ this.setupSteps.push(this.setupTestElements);
+ this.setupSteps.push(this.setupAJAXListeners);
+
+ if (this.callbacks.setup) {
+ this.contextualizedSetupSteps.push(this.callbacks.setup);
+ delete this.callbacks.setup;
+ }
+ },
+
+ initTeardownSteps: function initTeardownSteps() {
+ this.teardownSteps = [];
+ this.contextualizedTeardownSteps = [];
+
+ if (this.callbacks.teardown) {
+ this.contextualizedTeardownSteps.push(this.callbacks.teardown);
+ delete this.callbacks.teardown;
+ }
+
+ this.teardownSteps.push(this.teardownSubject);
+ this.teardownSteps.push(this.teardownContainer);
+ this.teardownSteps.push(this.teardownContext);
+ this.teardownSteps.push(this.teardownTestElements);
+ this.teardownSteps.push(this.teardownAJAXListeners);
+
+ if (this.callbacks.afterTeardown) {
+ this.teardownSteps.push(this.callbacks.afterTeardown);
+ delete this.callbacks.afterTeardown;
+ }
+ },
+
+ setupContainer: function setupContainer() {
+ if (this.isIntegration || this.isLegacy) {
+ this._setupIntegratedContainer();
+ } else {
+ this._setupIsolatedContainer();
+ }
+ },
+
+ setupContext: function setupContext() {
+ var subjectName = this.subjectName;
+ var container = this.container;
+
+ var factory = function factory() {
+ return container.lookupFactory(subjectName);
+ };
+
+ this._super({
+ container: this.container,
+ registry: this.registry,
+ factory: factory,
+ register: function register() {
+ var target = this.registry || this.container;
+ return target.register.apply(target, arguments);
+ }
+ });
+
+ if (_ember['default'].setOwner) {
+ _ember['default'].setOwner(this.context, this.container.owner);
+ }
+
+ this.setupInject();
+ },
+
+ setupInject: function setupInject() {
+ var module = this;
+ var context = this.context;
+
+ if (_ember['default'].inject) {
+ var keys = (Object.keys || _ember['default'].keys)(_ember['default'].inject);
+
+ keys.forEach(function (typeName) {
+ context.inject[typeName] = function (name, opts) {
+ var alias = opts && opts.as || name;
+ _ember['default'].run(function () {
+ _ember['default'].set(context, alias, module.container.lookup(typeName + ':' + name));
+ });
+ };
+ });
+ }
+ },
+
+ teardownSubject: function teardownSubject() {
+ var subject = this.cache.subject;
+
+ if (subject) {
+ _ember['default'].run(function () {
+ _ember['default'].tryInvoke(subject, 'destroy');
+ });
+ }
+ },
+
+ teardownContainer: function teardownContainer() {
+ var container = this.container;
+ _ember['default'].run(function () {
+ container.destroy();
+ });
+ },
+
+ defaultSubject: function defaultSubject(options, factory) {
+ return factory.create(options);
+ },
+
+ // allow arbitrary named factories, like rspec let
+ contextualizeCallbacks: function contextualizeCallbacks() {
+ var callbacks = this.callbacks;
+ var context = this.context;
+
+ this.cache = this.cache || {};
+ this.cachedCalls = this.cachedCalls || {};
+
+ var keys = (Object.keys || _ember['default'].keys)(callbacks);
+ var keysLength = keys.length;
+
+ if (keysLength) {
+ var deprecatedContext = this._buildDeprecatedContext(this, context);
+ for (var i = 0; i < keysLength; i++) {
+ this._contextualizeCallback(context, keys[i], deprecatedContext);
+ }
+ }
+ },
+
+ _contextualizeCallback: function _contextualizeCallback(context, key, callbackContext) {
+ var _this = this;
+ var callbacks = this.callbacks;
+ var factory = context.factory;
+
+ context[key] = function (options) {
+ if (_this.cachedCalls[key]) {
+ return _this.cache[key];
+ }
+
+ var result = callbacks[key].call(callbackContext, options, factory());
+
+ _this.cache[key] = result;
+ _this.cachedCalls[key] = true;
+
+ return result;
+ };
+ },
+
+ /*
+ Builds a version of the passed in context that contains deprecation warnings
+ for accessing properties that exist on the module.
+ */
+ _buildDeprecatedContext: function _buildDeprecatedContext(module, context) {
+ var deprecatedContext = Object.create(context);
+
+ var keysForDeprecation = Object.keys(module);
+
+ for (var i = 0, l = keysForDeprecation.length; i < l; i++) {
+ this._proxyDeprecation(module, deprecatedContext, keysForDeprecation[i]);
+ }
+
+ return deprecatedContext;
+ },
+
+ /*
+ Defines a key on an object to act as a proxy for deprecating the original.
+ */
+ _proxyDeprecation: function _proxyDeprecation(obj, proxy, key) {
+ if (typeof proxy[key] === 'undefined') {
+ Object.defineProperty(proxy, key, {
+ get: function get() {
+ _ember['default'].deprecate('Accessing the test module property "' + key + '" from a callback is deprecated.', false, { id: 'ember-test-helpers.test-module.callback-context', until: '0.6.0' });
+ return obj[key];
+ }
+ });
+ }
+ },
+
+ _setupContainer: function _setupContainer(isolated) {
+ var resolver = this.resolver;
+
+ var items = (0, _emberTestHelpersBuildRegistry['default'])(!isolated ? resolver : Object.create(resolver, {
+ resolve: {
+ value: function value() {}
+ }
+ }));
+
+ this.container = items.container;
+ this.registry = items.registry;
+
+ if ((0, _emberTestHelpersHasEmberVersion['default'])(1, 13)) {
+ var thingToRegisterWith = this.registry || this.container;
+ var router = resolver.resolve('router:main');
+ router = router || _ember['default'].Router.extend();
+ thingToRegisterWith.register('router:main', router);
+ }
+ },
+
+ _setupIsolatedContainer: function _setupIsolatedContainer() {
+ var resolver = this.resolver;
+ this._setupContainer(true);
+
+ var thingToRegisterWith = this.registry || this.container;
+
+ for (var i = this.needs.length; i > 0; i--) {
+ var fullName = this.needs[i - 1];
+ var normalizedFullName = resolver.normalize(fullName);
+ thingToRegisterWith.register(fullName, resolver.resolve(normalizedFullName));
+ }
+
+ if (!this.registry) {
+ this.container.resolver = function () {};
+ }
+ },
+
+ _setupIntegratedContainer: function _setupIntegratedContainer() {
+ this._setupContainer();
+ }
+
+ });
+});
+define('ember-test-helpers/test-resolver', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.setResolver = setResolver;
+ exports.getResolver = getResolver;
+ var __resolver__;
+
+ function setResolver(resolver) {
+ __resolver__ = resolver;
+ }
+
+ function getResolver() {
+ if (__resolver__ == null) {
+ throw new Error('you must set a resolver with `testResolver.set(resolver)`');
+ }
+
+ return __resolver__;
+ }
+});
+define('ember-test-helpers/wait', ['exports', 'ember'], function (exports, _ember) {
+ /* globals self */
+
+ 'use strict';
+
+ var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();
+
+ exports._teardownAJAXHooks = _teardownAJAXHooks;
+ exports._setupAJAXHooks = _setupAJAXHooks;
+ exports['default'] = wait;
+
+ var jQuery = _ember['default'].$;
+
+ var requests;
+ function incrementAjaxPendingRequests(_, xhr) {
+ requests.push(xhr);
+ }
+
+ function decrementAjaxPendingRequests(_, xhr) {
+ for (var i = 0; i < requests.length; i++) {
+ if (xhr === requests[i]) {
+ requests.splice(i, 1);
+ }
+ }
+ }
+
+ function _teardownAJAXHooks() {
+ if (!jQuery) {
+ return;
+ }
+
+ jQuery(document).off('ajaxSend', incrementAjaxPendingRequests);
+ jQuery(document).off('ajaxComplete', decrementAjaxPendingRequests);
+ }
+
+ function _setupAJAXHooks() {
+ requests = [];
+
+ if (!jQuery) {
+ return;
+ }
+
+ jQuery(document).on('ajaxSend', incrementAjaxPendingRequests);
+ jQuery(document).on('ajaxComplete', decrementAjaxPendingRequests);
+ }
+
+ var _internalCheckWaiters;
+ if (_ember['default'].__loader.registry['ember-testing/test/waiters']) {
+ _internalCheckWaiters = _ember['default'].__loader.require('ember-testing/test/waiters').checkWaiters;
+ }
+
+ function checkWaiters() {
+ if (_internalCheckWaiters) {
+ return _internalCheckWaiters();
+ } else if (_ember['default'].Test.waiters) {
+ if (_ember['default'].Test.waiters.any(function (_ref) {
+ var _ref2 = _slicedToArray(_ref, 2);
+
+ var context = _ref2[0];
+ var callback = _ref2[1];
+ return !callback.call(context);
+ })) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ function wait(_options) {
+ var options = _options || {};
+ var waitForTimers = options.hasOwnProperty('waitForTimers') ? options.waitForTimers : true;
+ var waitForAJAX = options.hasOwnProperty('waitForAJAX') ? options.waitForAJAX : true;
+ var waitForWaiters = options.hasOwnProperty('waitForWaiters') ? options.waitForWaiters : true;
+
+ return new _ember['default'].RSVP.Promise(function (resolve) {
+ var watcher = self.setInterval(function () {
+ if (waitForTimers && (_ember['default'].run.hasScheduledTimers() || _ember['default'].run.currentRunLoop)) {
+ return;
+ }
+
+ if (waitForAJAX && requests && requests.length > 0) {
+ return;
+ }
+
+ if (waitForWaiters && checkWaiters()) {
+ return;
+ }
+
+ // Stop polling
+ self.clearInterval(watcher);
+
+ // Synchronously resolve the promise
+ _ember['default'].run(null, resolve);
+ }, 10);
+ });
+ }
+});
+define('klassy', ['exports'], function (exports) {
+ /**
+ Extend a class with the properties and methods of one or more other classes.
+
+ When a method is replaced with another method, it will be wrapped in a
+ function that makes the replaced method accessible via `this._super`.
+
+ @method extendClass
+ @param {Object} destination The class to merge into
+ @param {Object} source One or more source classes
+ */
+ 'use strict';
+
+ var extendClass = function extendClass(destination) {
+ var sources = Array.prototype.slice.call(arguments, 1);
+ var source;
+
+ for (var i = 0, l = sources.length; i < l; i++) {
+ source = sources[i];
+
+ for (var p in source) {
+ if (source.hasOwnProperty(p) && destination[p] && typeof destination[p] === 'function' && typeof source[p] === 'function') {
+
+ /* jshint loopfunc:true */
+ destination[p] = (function (destinationFn, sourceFn) {
+ var wrapper = function wrapper() {
+ var prevSuper = this._super;
+ this._super = destinationFn;
+
+ var ret = sourceFn.apply(this, arguments);
+
+ this._super = prevSuper;
+
+ return ret;
+ };
+ wrapper.wrappedFunction = sourceFn;
+ return wrapper;
+ })(destination[p], source[p]);
+ } else {
+ destination[p] = source[p];
+ }
+ }
+ }
+ };
+
+ // `subclassing` is a state flag used by `defineClass` to track when a class is
+ // being subclassed. It allows constructors to avoid calling `init`, which can
+ // be expensive and cause undesirable side effects.
+ var subclassing = false;
+
+ /**
+ Define a new class with the properties and methods of one or more other classes.
+
+ The new class can be based on a `SuperClass`, which will be inserted into its
+ prototype chain.
+
+ Furthermore, one or more mixins (object that contain properties and/or methods)
+ may be specified, which will be applied in order. When a method is replaced
+ with another method, it will be wrapped in a function that makes the previous
+ method accessible via `this._super`.
+
+ @method defineClass
+ @param {Object} SuperClass A base class to extend. If `mixins` are to be included
+ without a `SuperClass`, pass `null` for SuperClass.
+ @param {Object} mixins One or more objects that contain properties and methods
+ to apply to the new class.
+ */
+ var defineClass = function defineClass(SuperClass) {
+ var Klass = function Klass() {
+ if (!subclassing && this.init) {
+ this.init.apply(this, arguments);
+ }
+ };
+
+ if (SuperClass) {
+ subclassing = true;
+ Klass.prototype = new SuperClass();
+ subclassing = false;
+ }
+
+ if (arguments.length > 1) {
+ var extendArgs = Array.prototype.slice.call(arguments, 1);
+ extendArgs.unshift(Klass.prototype);
+ extendClass.apply(Klass.prototype, extendArgs);
+ }
+
+ Klass.constructor = Klass;
+
+ Klass.extend = function () {
+ var args = Array.prototype.slice.call(arguments, 0);
+ args.unshift(Klass);
+ return defineClass.apply(Klass, args);
+ };
+
+ return Klass;
+ };
+
+ /**
+ A base class that can be extended.
+
+ @example
+
+ ```javascript
+ var CelestialObject = Klass.extend({
+ init: function(name) {
+ this._super();
+ this.name = name;
+ this.isCelestialObject = true;
+ },
+ greeting: function() {
+ return 'Hello from ' + this.name;
+ }
+ });
+
+ var Planet = CelestialObject.extend({
+ init: function(name) {
+ this._super.apply(this, arguments);
+ this.isPlanet = true;
+ },
+ greeting: function() {
+ return this._super() + '!';
+ },
+ });
+
+ var earth = new Planet('Earth');
+
+ console.log(earth instanceof Klass); // true
+ console.log(earth instanceof CelestialObject); // true
+ console.log(earth instanceof Planet); // true
+
+ console.log(earth.isCelestialObject); // true
+ console.log(earth.isPlanet); // true
+
+ console.log(earth.greeting()); // 'Hello from Earth!'
+ ```
+
+ @class Klass
+ */
+ var Klass = defineClass(null, {
+ init: function init() {}
+ });
+
+ exports.Klass = Klass;
+ exports.defineClass = defineClass;
+ exports.extendClass = extendClass;
+});
+define("qunit", ["exports"], function (exports) {
+ /* globals test:true */
+
+ "use strict";
+
+ var _module = QUnit.module;
+ exports.module = _module;
+ var test = QUnit.test;
+ exports.test = test;
+ var skip = QUnit.skip;
+ exports.skip = skip;
+ var only = QUnit.only;
+
+ exports.only = only;
+ exports["default"] = QUnit;
+});
+/* jshint ignore:start */
+
+runningTests = true;
+
+if (window.Testem) {
+ window.Testem.hookIntoTestFramework();
+}
+
+
+
+/* jshint ignore:end */
+//# sourceMappingURL=test-support.map
\ No newline at end of file
diff --git a/priv/ember_riak_explorer/dist/assets/test-support.map b/priv/ember_riak_explorer/dist/assets/test-support.map
new file mode 100644
index 0000000..4771d61
--- /dev/null
+++ b/priv/ember_riak_explorer/dist/assets/test-support.map
@@ -0,0 +1 @@
+{"version":3,"sources":["vendor/ember-cli/test-support-prefix.js","bower_components/ember/ember-testing.js","vendor/qunit/qunit.js","bower_components/qunit-notifications/index.js","vendor/ember-cli-qunit/qunit-configuration.js","vendor/ember-cli-qunit/test-loader.js","addon-test-support/ember-qunit.js","addon-test-support/ember-qunit/module-for-component.js","addon-test-support/ember-qunit/module-for-model.js","addon-test-support/ember-qunit/module-for.js","addon-test-support/ember-qunit/only.js","addon-test-support/ember-qunit/qunit-module.js","addon-test-support/ember-qunit/skip.js","addon-test-support/ember-qunit/test-wrapper.js","addon-test-support/ember-qunit/test.js","addon-test-support/ember-test-helpers.js","addon-test-support/ember-test-helpers/-legacy-overrides.js","addon-test-support/ember-test-helpers/abstract-test-module.js","addon-test-support/ember-test-helpers/build-registry.js","addon-test-support/ember-test-helpers/has-ember-version.js","addon-test-support/ember-test-helpers/test-context.js","addon-test-support/ember-test-helpers/test-module-for-acceptance.js","addon-test-support/ember-test-helpers/test-module-for-component.js","addon-test-support/ember-test-helpers/test-module-for-integration.js","addon-test-support/ember-test-helpers/test-module-for-model.js","addon-test-support/ember-test-helpers/test-module.js","addon-test-support/ember-test-helpers/test-resolver.js","addon-test-support/ember-test-helpers/wait.js","addon-test-support/klassy.js","addon-test-support/qunit.js","vendor/ember-cli/test-support-suffix.js"],"sourcesContent":["/* jshint ignore:start */\n\n\n\n/* jshint ignore:end */\n",";(function() {\n/*!\n * @overview Ember - JavaScript Application Framework\n * @copyright Copyright 2011-2016 Tilde Inc. and contributors\n * Portions Copyright 2006-2011 Strobe Inc.\n * Portions Copyright 2008-2011 Apple Inc. All rights reserved.\n * @license Licensed under MIT license\n * See https://raw.github.com/emberjs/ember.js/master/LICENSE\n * @version 2.5.1\n */\n\nvar enifed, requireModule, require, requirejs, Ember;\nvar mainContext = this;\n\n(function() {\n var isNode = typeof window === 'undefined' &&\n typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n if (!isNode) {\n Ember = this.Ember = this.Ember || {};\n }\n\n if (typeof Ember === 'undefined') { Ember = {}; };\n\n if (typeof Ember.__loader === 'undefined') {\n var registry = {};\n var seen = {};\n\n enifed = function(name, deps, callback) {\n var value = { };\n\n if (!callback) {\n value.deps = [];\n value.callback = deps;\n } else {\n value.deps = deps;\n value.callback = callback;\n }\n\n registry[name] = value;\n };\n\n requirejs = require = requireModule = function(name) {\n return internalRequire(name, null);\n }\n\n // setup `require` module\n require['default'] = require;\n\n require.has = function registryHas(moduleName) {\n return !!registry[moduleName] || !!registry[moduleName + '/index'];\n };\n\n function missingModule(name, referrerName) {\n if (referrerName) {\n throw new Error('Could not find module ' + name + ' required by: ' + referrerName);\n } else {\n throw new Error('Could not find module ' + name);\n }\n }\n\n function internalRequire(_name, referrerName) {\n var name = _name;\n var mod = registry[name];\n\n if (!mod) {\n name = name + '/index';\n mod = registry[name];\n }\n\n var exports = seen[name];\n\n if (exports !== undefined) {\n return exports;\n }\n\n exports = seen[name] = {};\n\n if (!mod) {\n missingModule(_name, referrerName);\n }\n\n var deps = mod.deps;\n var callback = mod.callback;\n var length = deps.length;\n var reified = new Array(length);;\n\n for (var i = 0; i < length; i++) {\n if (deps[i] === 'exports') {\n reified[i] = exports;\n } else if (deps[i] === 'require') {\n reified[i] = require;\n } else {\n reified[i] = internalRequire(deps[i], name);\n }\n }\n\n callback.apply(this, reified);\n\n return exports;\n };\n\n requirejs._eak_seen = registry;\n\n Ember.__loader = {\n define: enifed,\n require: require,\n registry: registry\n };\n } else {\n enifed = Ember.__loader.define;\n requirejs = require = requireModule = Ember.__loader.require;\n }\n})();\n\nenifed('ember-debug/deprecate', ['exports', 'ember-metal/core', 'ember-metal/error', 'ember-metal/logger', 'ember-debug/handlers'], function (exports, _emberMetalCore, _emberMetalError, _emberMetalLogger, _emberDebugHandlers) {\n /*global __fail__*/\n\n 'use strict';\n\n var _slice = Array.prototype.slice;\n exports.registerHandler = registerHandler;\n exports.default = deprecate;\n\n function registerHandler(handler) {\n _emberDebugHandlers.registerHandler('deprecate', handler);\n }\n\n function formatMessage(_message, options) {\n var message = _message;\n\n if (options && options.id) {\n message = message + (' [deprecation id: ' + options.id + ']');\n }\n\n if (options && options.url) {\n message += ' See ' + options.url + ' for more details.';\n }\n\n return message;\n }\n\n registerHandler(function logDeprecationToConsole(message, options) {\n var updatedMessage = formatMessage(message, options);\n\n _emberMetalLogger.default.warn('DEPRECATION: ' + updatedMessage);\n });\n\n registerHandler(function logDeprecationStackTrace(message, options, next) {\n if (_emberMetalCore.default.LOG_STACKTRACE_ON_DEPRECATION) {\n var stackStr = '';\n var error = undefined,\n stack = undefined;\n\n // When using new Error, we can't do the arguments check for Chrome. Alternatives are welcome\n try {\n __fail__.fail();\n } catch (e) {\n error = e;\n }\n\n if (error.stack) {\n if (error['arguments']) {\n // Chrome\n stack = error.stack.replace(/^\\s+at\\s+/gm, '').replace(/^([^\\(]+?)([\\n$])/gm, '{anonymous}($1)$2').replace(/^Object.\\s*\\(([^\\)]+)\\)/gm, '{anonymous}($1)').split('\\n');\n stack.shift();\n } else {\n // Firefox\n stack = error.stack.replace(/(?:\\n@:0)?\\s+$/m, '').replace(/^\\(/gm, '{anonymous}(').split('\\n');\n }\n\n stackStr = '\\n ' + stack.slice(2).join('\\n ');\n }\n\n var updatedMessage = formatMessage(message, options);\n\n _emberMetalLogger.default.warn('DEPRECATION: ' + updatedMessage + stackStr);\n } else {\n next.apply(undefined, arguments);\n }\n });\n\n registerHandler(function raiseOnDeprecation(message, options, next) {\n if (_emberMetalCore.default.ENV.RAISE_ON_DEPRECATION) {\n var updatedMessage = formatMessage(message);\n\n throw new _emberMetalError.default(updatedMessage);\n } else {\n next.apply(undefined, arguments);\n }\n });\n\n var missingOptionsDeprecation = 'When calling `Ember.deprecate` you ' + 'must provide an `options` hash as the third parameter. ' + '`options` should include `id` and `until` properties.';\n exports.missingOptionsDeprecation = missingOptionsDeprecation;\n var missingOptionsIdDeprecation = 'When calling `Ember.deprecate` you must provide `id` in options.';\n exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;\n var missingOptionsUntilDeprecation = 'When calling `Ember.deprecate` you must provide `until` in options.';\n\n exports.missingOptionsUntilDeprecation = missingOptionsUntilDeprecation;\n /**\n @module ember\n @submodule ember-debug\n */\n\n /**\n Display a deprecation warning with the provided message and a stack trace\n (Chrome and Firefox only).\n \n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n \n @method deprecate\n @param {String} message A description of the deprecation.\n @param {Boolean} test A boolean. If falsy, the deprecation\n will be displayed.\n @param {Object} options An object that can be used to pass\n in a `url` to the transition guide on the emberjs.com website, and a unique\n `id` for this deprecation. The `id` can be used by Ember debugging tools\n to change the behavior (raise, log or silence) for that specific deprecation.\n The `id` should be namespaced by dots, e.g. \"view.helper.select\".\n @for Ember\n @public\n */\n\n function deprecate(message, test, options) {\n if (!options || !options.id && !options.until) {\n deprecate(missingOptionsDeprecation, false, {\n id: 'ember-debug.deprecate-options-missing',\n until: '3.0.0',\n url: 'http://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'\n });\n }\n\n if (options && !options.id) {\n deprecate(missingOptionsIdDeprecation, false, {\n id: 'ember-debug.deprecate-id-missing',\n until: '3.0.0',\n url: 'http://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'\n });\n }\n\n if (options && !options.until) {\n deprecate(missingOptionsUntilDeprecation, options && options.until, {\n id: 'ember-debug.deprecate-until-missing',\n until: '3.0.0',\n url: 'http://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'\n });\n }\n\n _emberDebugHandlers.invoke.apply(undefined, ['deprecate'].concat(_slice.call(arguments)));\n }\n});\nenifed('ember-debug/handlers', ['exports', 'ember-debug/is-plain-function', 'ember-debug/deprecate'], function (exports, _emberDebugIsPlainFunction, _emberDebugDeprecate) {\n 'use strict';\n\n exports.generateTestAsFunctionDeprecation = generateTestAsFunctionDeprecation;\n exports.registerHandler = registerHandler;\n exports.invoke = invoke;\n var HANDLERS = {};\n\n exports.HANDLERS = HANDLERS;\n\n function generateTestAsFunctionDeprecation(source) {\n return 'Calling `' + source + '` with a function argument is deprecated. Please ' + 'use `!!Constructor` for constructors, or an `IIFE` to compute the test for deprecation. ' + 'In a future version, functions will be treated as truthy values instead of being executed.';\n }\n\n function normalizeTest(test, source) {\n if (_emberDebugIsPlainFunction.default(test)) {\n _emberDebugDeprecate.default(generateTestAsFunctionDeprecation(source), false, { id: 'ember-debug.deprecate-test-as-function', until: '2.5.0' });\n\n return test();\n }\n\n return test;\n }\n\n function registerHandler(type, callback) {\n var nextHandler = HANDLERS[type] || function () {};\n\n HANDLERS[type] = function (message, options) {\n callback(message, options, nextHandler);\n };\n }\n\n function invoke(type, message, test, options) {\n if (normalizeTest(test, 'Ember.' + type)) {\n return;\n }\n\n var handlerForType = HANDLERS[type];\n\n if (!handlerForType) {\n return;\n }\n\n if (handlerForType) {\n handlerForType(message, options);\n }\n }\n});\nenifed('ember-debug/index', ['exports', 'ember-metal/core', 'ember-metal/debug', 'ember-metal/features', 'ember-metal/error', 'ember-metal/logger', 'ember-metal/environment', 'ember-debug/deprecate', 'ember-debug/warn', 'ember-debug/is-plain-function', 'ember-debug/handlers'], function (exports, _emberMetalCore, _emberMetalDebug, _emberMetalFeatures, _emberMetalError, _emberMetalLogger, _emberMetalEnvironment, _emberDebugDeprecate, _emberDebugWarn, _emberDebugIsPlainFunction, _emberDebugHandlers) {\n 'use strict';\n\n exports._warnIfUsingStrippedFeatureFlags = _warnIfUsingStrippedFeatureFlags;\n\n /**\n @module ember\n @submodule ember-debug\n */\n\n /**\n @class Ember\n @public\n */\n\n /**\n Define an assertion that will throw an exception if the condition is not met.\n \n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n \n ```javascript\n // Test for truthiness\n Ember.assert('Must pass a valid object', obj);\n \n // Fail unconditionally\n Ember.assert('This code path should never be run');\n ```\n \n @method assert\n @param {String} desc A description of the assertion. This will become\n the text of the Error thrown if the assertion fails.\n @param {Boolean} test Must be truthy for the assertion to pass. If\n falsy, an exception will be thrown.\n @public\n */\n _emberMetalDebug.setDebugFunction('assert', function assert(desc, test) {\n var throwAssertion = undefined;\n\n if (_emberDebugIsPlainFunction.default(test)) {\n _emberMetalDebug.deprecate(_emberDebugHandlers.generateTestAsFunctionDeprecation('Ember.assert'), false, { id: 'ember-debug.deprecate-test-as-function', until: '2.5.0' });\n\n throwAssertion = !test();\n } else {\n throwAssertion = !test;\n }\n\n if (throwAssertion) {\n throw new _emberMetalError.default('Assertion Failed: ' + desc);\n }\n });\n\n /**\n Display a debug notice.\n \n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n \n ```javascript\n Ember.debug('I\\'m a debug notice!');\n ```\n \n @method debug\n @param {String} message A debug message to display.\n @public\n */\n _emberMetalDebug.setDebugFunction('debug', function debug(message) {\n _emberMetalLogger.default.debug('DEBUG: ' + message);\n });\n\n /**\n Display an info notice.\n \n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n \n @method info\n @private\n */\n _emberMetalDebug.setDebugFunction('info', function info() {\n _emberMetalLogger.default.info.apply(undefined, arguments);\n });\n\n /**\n Alias an old, deprecated method with its new counterpart.\n \n Display a deprecation warning with the provided message and a stack trace\n (Chrome and Firefox only) when the assigned method is called.\n \n * In a production build, this method is defined as an empty function (NOP).\n \n ```javascript\n Ember.oldMethod = Ember.deprecateFunc('Please use the new, updated method', Ember.newMethod);\n ```\n \n @method deprecateFunc\n @param {String} message A description of the deprecation.\n @param {Object} [options] The options object for Ember.deprecate.\n @param {Function} func The new function called to replace its deprecated counterpart.\n @return {Function} A new function that wraps the original function with a deprecation warning\n @private\n */\n _emberMetalDebug.setDebugFunction('deprecateFunc', function deprecateFunc() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (args.length === 3) {\n var _ret = (function () {\n var message = args[0];\n var options = args[1];\n var func = args[2];\n\n return {\n v: function () {\n _emberMetalDebug.deprecate(message, false, options);\n return func.apply(this, arguments);\n }\n };\n })();\n\n if (typeof _ret === 'object') return _ret.v;\n } else {\n var _ret2 = (function () {\n var message = args[0];\n var func = args[1];\n\n return {\n v: function () {\n _emberMetalDebug.deprecate(message);\n return func.apply(this, arguments);\n }\n };\n })();\n\n if (typeof _ret2 === 'object') return _ret2.v;\n }\n });\n\n /**\n Run a function meant for debugging.\n \n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n \n ```javascript\n Ember.runInDebug(() => {\n Ember.Component.reopen({\n didInsertElement() {\n console.log(\"I'm happy\");\n }\n });\n });\n ```\n \n @method runInDebug\n @param {Function} func The function to be executed.\n @since 1.5.0\n @public\n */\n _emberMetalDebug.setDebugFunction('runInDebug', function runInDebug(func) {\n func();\n });\n\n _emberMetalDebug.setDebugFunction('debugSeal', function debugSeal(obj) {\n Object.seal(obj);\n });\n\n _emberMetalDebug.setDebugFunction('deprecate', _emberDebugDeprecate.default);\n\n _emberMetalDebug.setDebugFunction('warn', _emberDebugWarn.default);\n\n /**\n Will call `Ember.warn()` if ENABLE_OPTIONAL_FEATURES or\n any specific FEATURES flag is truthy.\n \n This method is called automatically in debug canary builds.\n \n @private\n @method _warnIfUsingStrippedFeatureFlags\n @return {void}\n */\n\n function _warnIfUsingStrippedFeatureFlags(FEATURES, knownFeatures, featuresWereStripped) {\n if (featuresWereStripped) {\n _emberMetalDebug.warn('Ember.ENV.ENABLE_OPTIONAL_FEATURES is only available in canary builds.', !_emberMetalCore.default.ENV.ENABLE_OPTIONAL_FEATURES, { id: 'ember-debug.feature-flag-with-features-stripped' });\n\n var keys = Object.keys(FEATURES || {});\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (key === 'isEnabled' || !(key in knownFeatures)) {\n continue;\n }\n\n _emberMetalDebug.warn('FEATURE[\"' + key + '\"] is set as enabled, but FEATURE flags are only available in canary builds.', !FEATURES[key], { id: 'ember-debug.feature-flag-with-features-stripped' });\n }\n }\n }\n\n if (!_emberMetalCore.default.testing) {\n // Complain if they're using FEATURE flags in builds other than canary\n _emberMetalFeatures.FEATURES['features-stripped-test'] = true;\n var featuresWereStripped = true;\n\n delete _emberMetalFeatures.FEATURES['features-stripped-test'];\n _warnIfUsingStrippedFeatureFlags(_emberMetalCore.default.ENV.FEATURES, _emberMetalFeatures.KNOWN_FEATURES, featuresWereStripped);\n\n // Inform the developer about the Ember Inspector if not installed.\n var isFirefox = _emberMetalEnvironment.default.isFirefox;\n var isChrome = _emberMetalEnvironment.default.isChrome;\n\n if (typeof window !== 'undefined' && (isFirefox || isChrome) && window.addEventListener) {\n window.addEventListener('load', function () {\n if (document.documentElement && document.documentElement.dataset && !document.documentElement.dataset.emberExtension) {\n var downloadURL;\n\n if (isChrome) {\n downloadURL = 'https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi';\n } else if (isFirefox) {\n downloadURL = 'https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/';\n }\n\n _emberMetalDebug.debug('For more advanced debugging, install the Ember Inspector from ' + downloadURL);\n }\n }, false);\n }\n }\n /**\n @public\n @class Ember.Debug\n */\n _emberMetalCore.default.Debug = {};\n\n /**\n Allows for runtime registration of handler functions that override the default deprecation behavior.\n Deprecations are invoked by calls to [Ember.deprecate](http://emberjs.com/api/classes/Ember.html#method_deprecate).\n The following example demonstrates its usage by registering a handler that throws an error if the\n message contains the word \"should\", otherwise defers to the default handler.\n ```javascript\n Ember.Debug.registerDeprecationHandler((message, options, next) => {\n if (message.indexOf('should') !== -1) {\n throw new Error(`Deprecation message with should: ${message}`);\n } else {\n // defer to whatever handler was registered before this one\n next(message, options);\n }\n }\n ```\n The handler function takes the following arguments:\n \n message
- The message received from the deprecation call. \n options
- An object passed in with the deprecation call containing additional information including: \n \n id
- An id of the deprecation in the form of package-name.specific-deprecation
. \n until
- The Ember version number the feature and deprecation will be removed in. \n \n next
- A function that calls into the previously registered handler. \n \n @public\n @static\n @method registerDeprecationHandler\n @param handler {Function} A function to handle deprecation calls.\n @since 2.1.0\n */\n _emberMetalCore.default.Debug.registerDeprecationHandler = _emberDebugDeprecate.registerHandler;\n /**\n Allows for runtime registration of handler functions that override the default warning behavior.\n Warnings are invoked by calls made to [Ember.warn](http://emberjs.com/api/classes/Ember.html#method_warn).\n The following example demonstrates its usage by registering a handler that does nothing overriding Ember's\n default warning behavior.\n ```javascript\n // next is not called, so no warnings get the default behavior\n Ember.Debug.registerWarnHandler(() => {});\n ```\n The handler function takes the following arguments:\n \n message
- The message received from the warn call. \n options
- An object passed in with the warn call containing additional information including: \n \n id
- An id of the warning in the form of package-name.specific-warning
. \n \n next
- A function that calls into the previously registered handler. \n \n @public\n @static\n @method registerWarnHandler\n @param handler {Function} A function to handle warnings.\n @since 2.1.0\n */\n _emberMetalCore.default.Debug.registerWarnHandler = _emberDebugWarn.registerHandler;\n\n /*\n We are transitioning away from `ember.js` to `ember.debug.js` to make\n it much clearer that it is only for local development purposes.\n \n This flag value is changed by the tooling (by a simple string replacement)\n so that if `ember.js` (which must be output for backwards compat reasons) is\n used a nice helpful warning message will be printed out.\n */\n var runningNonEmberDebugJS = false;\n exports.runningNonEmberDebugJS = runningNonEmberDebugJS;\n if (runningNonEmberDebugJS) {\n _emberMetalDebug.warn('Please use `ember.debug.js` instead of `ember.js` for development and debugging.');\n }\n});\nenifed('ember-debug/is-plain-function', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = isPlainFunction;\n\n function isPlainFunction(test) {\n return typeof test === 'function' && test.PrototypeMixin === undefined;\n }\n});\nenifed('ember-debug/warn', ['exports', 'ember-metal/logger', 'ember-metal/debug', 'ember-debug/handlers'], function (exports, _emberMetalLogger, _emberMetalDebug, _emberDebugHandlers) {\n 'use strict';\n\n var _slice = Array.prototype.slice;\n exports.registerHandler = registerHandler;\n exports.default = warn;\n\n function registerHandler(handler) {\n _emberDebugHandlers.registerHandler('warn', handler);\n }\n\n registerHandler(function logWarning(message, options) {\n _emberMetalLogger.default.warn('WARNING: ' + message);\n if ('trace' in _emberMetalLogger.default) {\n _emberMetalLogger.default.trace();\n }\n });\n\n var missingOptionsDeprecation = 'When calling `Ember.warn` you ' + 'must provide an `options` hash as the third parameter. ' + '`options` should include an `id` property.';\n exports.missingOptionsDeprecation = missingOptionsDeprecation;\n var missingOptionsIdDeprecation = 'When calling `Ember.warn` you must provide `id` in options.';\n\n exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;\n /**\n @module ember\n @submodule ember-debug\n */\n\n /**\n Display a warning with the provided message.\n \n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n \n @method warn\n @param {String} message A warning to display.\n @param {Boolean} test An optional boolean. If falsy, the warning\n will be displayed.\n @param {Object} options An object that can be used to pass a unique\n `id` for this warning. The `id` can be used by Ember debugging tools\n to change the behavior (raise, log, or silence) for that specific warning.\n The `id` should be namespaced by dots, e.g. \"ember-debug.feature-flag-with-features-stripped\"\n @for Ember\n @public\n */\n\n function warn(message, test, options) {\n if (!options) {\n _emberMetalDebug.deprecate(missingOptionsDeprecation, false, {\n id: 'ember-debug.warn-options-missing',\n until: '3.0.0',\n url: 'http://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'\n });\n }\n\n if (options && !options.id) {\n _emberMetalDebug.deprecate(missingOptionsIdDeprecation, false, {\n id: 'ember-debug.warn-id-missing',\n until: '3.0.0',\n url: 'http://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'\n });\n }\n\n _emberDebugHandlers.invoke.apply(undefined, ['warn'].concat(_slice.call(arguments)));\n }\n});\nenifed('ember-testing/adapters/adapter', ['exports', 'ember-runtime/system/object'], function (exports, _emberRuntimeSystemObject) {\n 'use strict';\n\n function K() {\n return this;\n }\n\n /**\n @module ember\n @submodule ember-testing\n */\n\n /**\n The primary purpose of this class is to create hooks that can be implemented\n by an adapter for various test frameworks.\n \n @class Adapter\n @namespace Ember.Test\n @public\n */\n var Adapter = _emberRuntimeSystemObject.default.extend({\n /**\n This callback will be called whenever an async operation is about to start.\n Override this to call your framework's methods that handle async\n operations.\n @public\n @method asyncStart\n */\n asyncStart: K,\n\n /**\n This callback will be called whenever an async operation has completed.\n @public\n @method asyncEnd\n */\n asyncEnd: K,\n\n /**\n Override this method with your testing framework's false assertion.\n This function is called whenever an exception occurs causing the testing\n promise to fail.\n QUnit example:\n ```javascript\n exception: function(error) {\n ok(false, error);\n };\n ```\n @public\n @method exception\n @param {String} error The exception to be raised.\n */\n exception: function (error) {\n throw error;\n }\n });\n\n exports.default = Adapter;\n});\nenifed('ember-testing/adapters/qunit', ['exports', 'ember-testing/adapters/adapter', 'ember-metal/utils'], function (exports, _emberTestingAdaptersAdapter, _emberMetalUtils) {\n 'use strict';\n\n /**\n This class implements the methods defined by Ember.Test.Adapter for the\n QUnit testing framework.\n \n @class QUnitAdapter\n @namespace Ember.Test\n @extends Ember.Test.Adapter\n @public\n */\n exports.default = _emberTestingAdaptersAdapter.default.extend({\n asyncStart: function () {\n QUnit.stop();\n },\n asyncEnd: function () {\n QUnit.start();\n },\n exception: function (error) {\n ok(false, _emberMetalUtils.inspect(error));\n }\n });\n});\nenifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-metal/error', 'ember-metal/run_loop', 'ember-views/system/jquery', 'ember-testing/test', 'ember-runtime/ext/rsvp', 'ember-metal/features'], function (exports, _emberMetalProperty_get, _emberMetalError, _emberMetalRun_loop, _emberViewsSystemJquery, _emberTestingTest, _emberRuntimeExtRsvp, _emberMetalFeatures) {\n 'use strict';\n\n /**\n @module ember\n @submodule ember-testing\n */\n\n var helper = _emberTestingTest.default.registerHelper;\n var asyncHelper = _emberTestingTest.default.registerAsyncHelper;\n\n var keyboardEventTypes, mouseEventTypes, buildKeyboardEvent, buildMouseEvent, buildBasicEvent, fireEvent, focus;\n\n var defaultEventOptions = { canBubble: true, cancelable: true };\n keyboardEventTypes = ['keydown', 'keypress', 'keyup'];\n mouseEventTypes = ['click', 'mousedown', 'mouseup', 'dblclick', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover'];\n\n buildKeyboardEvent = function buildKeyboardEvent(type) {\n var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var event = undefined;\n try {\n event = document.createEvent('KeyEvents');\n var eventOpts = _emberViewsSystemJquery.default.extend({}, defaultEventOptions, options);\n event.initKeyEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.keyCode, eventOpts.charCode);\n } catch (e) {\n event = buildBasicEvent(type, options);\n }\n return event;\n };\n\n buildMouseEvent = function buildMouseEvent(type) {\n var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var event = undefined;\n try {\n event = document.createEvent('MouseEvents');\n var eventOpts = _emberViewsSystemJquery.default.extend({}, defaultEventOptions, options);\n event.initMouseEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.detail, eventOpts.screenX, eventOpts.screenY, eventOpts.clientX, eventOpts.clientY, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.button, eventOpts.relatedTarget);\n } catch (e) {\n event = buildBasicEvent(type, options);\n }\n return event;\n };\n\n buildBasicEvent = function buildBasicEvent(type) {\n var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var event = document.createEvent('Events');\n event.initEvent(type, true, true);\n _emberViewsSystemJquery.default.extend(event, options);\n return event;\n };\n\n fireEvent = function fireEvent(element, type) {\n var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];\n\n if (!element) {\n return;\n }\n var event = undefined;\n if (keyboardEventTypes.indexOf(type) > -1) {\n event = buildKeyboardEvent(type, options);\n } else if (mouseEventTypes.indexOf(type) > -1) {\n var rect = element.getBoundingClientRect();\n var x = rect.left + 1;\n var y = rect.top + 1;\n var simulatedCoordinates = {\n screenX: x + 5,\n screenY: y + 95,\n clientX: x,\n clientY: y\n };\n event = buildMouseEvent(type, _emberViewsSystemJquery.default.extend(simulatedCoordinates, options));\n } else {\n event = buildBasicEvent(type, options);\n }\n element.dispatchEvent(event);\n };\n\n focus = function focus(el) {\n if (!el) {\n return;\n }\n var $el = _emberViewsSystemJquery.default(el);\n if ($el.is(':input, [contenteditable=true]')) {\n var type = $el.prop('type');\n if (type !== 'checkbox' && type !== 'radio' && type !== 'hidden') {\n _emberMetalRun_loop.default(null, function () {\n // Firefox does not trigger the `focusin` event if the window\n // does not have focus. If the document doesn't have focus just\n // use trigger('focusin') instead.\n\n if (!document.hasFocus || document.hasFocus()) {\n el.focus();\n } else {\n $el.trigger('focusin');\n }\n });\n }\n }\n };\n\n function currentRouteName(app) {\n var routingService = app.__container__.lookup('service:-routing');\n\n return _emberMetalProperty_get.get(routingService, 'currentRouteName');\n }\n\n function currentPath(app) {\n var routingService = app.__container__.lookup('service:-routing');\n\n return _emberMetalProperty_get.get(routingService, 'currentPath');\n }\n\n function currentURL(app) {\n var router = app.__container__.lookup('router:main');\n\n return _emberMetalProperty_get.get(router, 'location').getURL();\n }\n\n function pauseTest() {\n _emberTestingTest.default.adapter.asyncStart();\n return new _emberRuntimeExtRsvp.default.Promise(function () {}, 'TestAdapter paused promise');\n }\n\n function visit(app, url) {\n var router = app.__container__.lookup('router:main');\n var shouldHandleURL = false;\n\n app.boot().then(function () {\n router.location.setURL(url);\n\n if (shouldHandleURL) {\n _emberMetalRun_loop.default(app.__deprecatedInstance__, 'handleURL', url);\n }\n });\n\n if (app._readinessDeferrals > 0) {\n router['initialURL'] = url;\n _emberMetalRun_loop.default(app, 'advanceReadiness');\n delete router['initialURL'];\n } else {\n shouldHandleURL = true;\n }\n\n return app.testHelpers.wait();\n }\n\n function click(app, selector, context) {\n var $el = app.testHelpers.findWithAssert(selector, context);\n var el = $el[0];\n\n _emberMetalRun_loop.default(null, fireEvent, el, 'mousedown');\n\n focus(el);\n\n _emberMetalRun_loop.default(null, fireEvent, el, 'mouseup');\n _emberMetalRun_loop.default(null, fireEvent, el, 'click');\n\n return app.testHelpers.wait();\n }\n\n function triggerEvent(app, selector, contextOrType, typeOrOptions, possibleOptions) {\n var arity = arguments.length;\n var context, type, options;\n\n if (arity === 3) {\n // context and options are optional, so this is\n // app, selector, type\n context = null;\n type = contextOrType;\n options = {};\n } else if (arity === 4) {\n // context and options are optional, so this is\n if (typeof typeOrOptions === 'object') {\n // either\n // app, selector, type, options\n context = null;\n type = contextOrType;\n options = typeOrOptions;\n } else {\n // or\n // app, selector, context, type\n context = contextOrType;\n type = typeOrOptions;\n options = {};\n }\n } else {\n context = contextOrType;\n type = typeOrOptions;\n options = possibleOptions;\n }\n\n var $el = app.testHelpers.findWithAssert(selector, context);\n var el = $el[0];\n\n _emberMetalRun_loop.default(null, fireEvent, el, type, options);\n\n return app.testHelpers.wait();\n }\n\n function keyEvent(app, selector, contextOrType, typeOrKeyCode, keyCode) {\n var context, type;\n\n if (typeof keyCode === 'undefined') {\n context = null;\n keyCode = typeOrKeyCode;\n type = contextOrType;\n } else {\n context = contextOrType;\n type = typeOrKeyCode;\n }\n\n return app.testHelpers.triggerEvent(selector, context, type, { keyCode: keyCode, which: keyCode });\n }\n\n function fillIn(app, selector, contextOrText, text) {\n var $el, el, context;\n if (typeof text === 'undefined') {\n text = contextOrText;\n } else {\n context = contextOrText;\n }\n $el = app.testHelpers.findWithAssert(selector, context);\n el = $el[0];\n focus(el);\n _emberMetalRun_loop.default(function () {\n $el.val(text);\n fireEvent(el, 'input');\n fireEvent(el, 'change');\n });\n return app.testHelpers.wait();\n }\n\n function findWithAssert(app, selector, context) {\n var $el = app.testHelpers.find(selector, context);\n if ($el.length === 0) {\n throw new _emberMetalError.default('Element ' + selector + ' not found.');\n }\n return $el;\n }\n\n function find(app, selector, context) {\n var $el;\n context = context || _emberMetalProperty_get.get(app, 'rootElement');\n $el = app.$(selector, context);\n\n return $el;\n }\n\n function andThen(app, callback) {\n return app.testHelpers.wait(callback(app));\n }\n\n function wait(app, value) {\n return new _emberRuntimeExtRsvp.default.Promise(function (resolve) {\n var router = app.__container__.lookup('router:main');\n\n // Every 10ms, poll for the async thing to have finished\n var watcher = setInterval(function () {\n // 1. If the router is loading, keep polling\n var routerIsLoading = router.router && !!router.router.activeTransition;\n if (routerIsLoading) {\n return;\n }\n\n // 2. If there are pending Ajax requests, keep polling\n if (_emberTestingTest.default.pendingAjaxRequests) {\n return;\n }\n\n // 3. If there are scheduled timers or we are inside of a run loop, keep polling\n if (_emberMetalRun_loop.default.hasScheduledTimers() || _emberMetalRun_loop.default.currentRunLoop) {\n return;\n }\n if (_emberTestingTest.default.waiters && _emberTestingTest.default.waiters.any(function (waiter) {\n var context = waiter[0];\n var callback = waiter[1];\n return !callback.call(context);\n })) {\n return;\n }\n // Stop polling\n clearInterval(watcher);\n\n // Synchronously resolve the promise\n _emberMetalRun_loop.default(null, resolve, value);\n }, 10);\n });\n }\n\n /**\n Loads a route, sets up any controllers, and renders any templates associated\n with the route as though a real user had triggered the route change while\n using your app.\n \n Example:\n \n ```javascript\n visit('posts/index').then(function() {\n // assert something\n });\n ```\n \n @method visit\n @param {String} url the name of the route\n @return {RSVP.Promise}\n @public\n */\n asyncHelper('visit', visit);\n\n /**\n Clicks an element and triggers any actions triggered by the element's `click`\n event.\n \n Example:\n \n ```javascript\n click('.some-jQuery-selector').then(function() {\n // assert something\n });\n ```\n \n @method click\n @param {String} selector jQuery selector for finding element on the DOM\n @return {RSVP.Promise}\n @public\n */\n asyncHelper('click', click);\n\n /**\n Simulates a key event, e.g. `keypress`, `keydown`, `keyup` with the desired keyCode\n \n Example:\n \n ```javascript\n keyEvent('.some-jQuery-selector', 'keypress', 13).then(function() {\n // assert something\n });\n ```\n \n @method keyEvent\n @param {String} selector jQuery selector for finding element on the DOM\n @param {String} type the type of key event, e.g. `keypress`, `keydown`, `keyup`\n @param {Number} keyCode the keyCode of the simulated key event\n @return {RSVP.Promise}\n @since 1.5.0\n @public\n */\n asyncHelper('keyEvent', keyEvent);\n\n /**\n Fills in an input element with some text.\n \n Example:\n \n ```javascript\n fillIn('#email', 'you@example.com').then(function() {\n // assert something\n });\n ```\n \n @method fillIn\n @param {String} selector jQuery selector finding an input element on the DOM\n to fill text with\n @param {String} text text to place inside the input element\n @return {RSVP.Promise}\n @public\n */\n asyncHelper('fillIn', fillIn);\n\n /**\n Finds an element in the context of the app's container element. A simple alias\n for `app.$(selector)`.\n \n Example:\n \n ```javascript\n var $el = find('.my-selector');\n ```\n \n @method find\n @param {String} selector jQuery string selector for element lookup\n @return {Object} jQuery object representing the results of the query\n @public\n */\n helper('find', find);\n\n /**\n Like `find`, but throws an error if the element selector returns no results.\n \n Example:\n \n ```javascript\n var $el = findWithAssert('.doesnt-exist'); // throws error\n ```\n \n @method findWithAssert\n @param {String} selector jQuery selector string for finding an element within\n the DOM\n @return {Object} jQuery object representing the results of the query\n @throws {Error} throws error if jQuery object returned has a length of 0\n @public\n */\n helper('findWithAssert', findWithAssert);\n\n /**\n Causes the run loop to process any pending events. This is used to ensure that\n any async operations from other helpers (or your assertions) have been processed.\n \n This is most often used as the return value for the helper functions (see 'click',\n 'fillIn','visit',etc).\n \n Example:\n \n ```javascript\n Ember.Test.registerAsyncHelper('loginUser', function(app, username, password) {\n visit('secured/path/here')\n .fillIn('#username', username)\n .fillIn('#password', password)\n .click('.submit')\n \n return app.testHelpers.wait();\n });\n \n @method wait\n @param {Object} value The value to be returned.\n @return {RSVP.Promise}\n @public\n */\n asyncHelper('wait', wait);\n asyncHelper('andThen', andThen);\n\n /**\n Returns the currently active route name.\n \n Example:\n \n ```javascript\n function validateRouteName() {\n equal(currentRouteName(), 'some.path', \"correct route was transitioned into.\");\n }\n \n visit('/some/path').then(validateRouteName)\n ```\n \n @method currentRouteName\n @return {Object} The name of the currently active route.\n @since 1.5.0\n @public\n */\n helper('currentRouteName', currentRouteName);\n\n /**\n Returns the current path.\n \n Example:\n \n ```javascript\n function validateURL() {\n equal(currentPath(), 'some.path.index', \"correct path was transitioned into.\");\n }\n \n click('#some-link-id').then(validateURL);\n ```\n \n @method currentPath\n @return {Object} The currently active path.\n @since 1.5.0\n @public\n */\n helper('currentPath', currentPath);\n\n /**\n Returns the current URL.\n \n Example:\n \n ```javascript\n function validateURL() {\n equal(currentURL(), '/some/path', \"correct URL was transitioned into.\");\n }\n \n click('#some-link-id').then(validateURL);\n ```\n \n @method currentURL\n @return {Object} The currently active URL.\n @since 1.5.0\n @public\n */\n helper('currentURL', currentURL);\n\n /**\n Pauses the current test - this is useful for debugging while testing or for test-driving.\n It allows you to inspect the state of your application at any point.\n \n Example (The test will pause before clicking the button):\n \n ```javascript\n visit('/')\n return pauseTest();\n \n click('.btn');\n ```\n \n @since 1.9.0\n @method pauseTest\n @return {Object} A promise that will never resolve\n @public\n */\n helper('pauseTest', pauseTest);\n\n /**\n Triggers the given DOM event on the element identified by the provided selector.\n \n Example:\n \n ```javascript\n triggerEvent('#some-elem-id', 'blur');\n ```\n \n This is actually used internally by the `keyEvent` helper like so:\n \n ```javascript\n triggerEvent('#some-elem-id', 'keypress', { keyCode: 13 });\n ```\n \n @method triggerEvent\n @param {String} selector jQuery selector for finding element on the DOM\n @param {String} [context] jQuery selector that will limit the selector\n argument to find only within the context's children\n @param {String} type The event type to be triggered.\n @param {Object} [options] The options to be passed to jQuery.Event.\n @return {RSVP.Promise}\n @since 1.5.0\n @public\n */\n asyncHelper('triggerEvent', triggerEvent);\n});\n\n// Firefox does not trigger the `focusin` event if the window\n// does not have focus. If the document doesn't have focus just\n// use trigger('focusin') instead.\nenifed('ember-testing/index', ['exports', 'ember-metal/core', 'ember-testing/initializers', 'ember-testing/support', 'ember-testing/setup_for_testing', 'ember-testing/test', 'ember-testing/adapters/adapter', 'ember-testing/adapters/qunit', 'ember-testing/helpers'], function (exports, _emberMetalCore, _emberTestingInitializers, _emberTestingSupport, _emberTestingSetup_for_testing, _emberTestingTest, _emberTestingAdaptersAdapter, _emberTestingAdaptersQunit, _emberTestingHelpers) {\n 'use strict';\n\n // adds helpers to helpers object in Test\n\n /**\n @module ember\n @submodule ember-testing\n */\n\n _emberMetalCore.default.Test = _emberTestingTest.default;\n _emberMetalCore.default.Test.Adapter = _emberTestingAdaptersAdapter.default;\n _emberMetalCore.default.Test.QUnitAdapter = _emberTestingAdaptersQunit.default;\n _emberMetalCore.default.setupForTesting = _emberTestingSetup_for_testing.default;\n});\n// to setup initializer\n// to handle various edge cases\nenifed('ember-testing/initializers', ['exports', 'ember-runtime/system/lazy_load'], function (exports, _emberRuntimeSystemLazy_load) {\n 'use strict';\n\n var name = 'deferReadiness in `testing` mode';\n\n _emberRuntimeSystemLazy_load.onLoad('Ember.Application', function (Application) {\n if (!Application.initializers[name]) {\n Application.initializer({\n name: name,\n\n initialize: function (application) {\n if (application.testing) {\n application.deferReadiness();\n }\n }\n });\n }\n });\n});\nenifed('ember-testing/setup_for_testing', ['exports', 'ember-metal/core', 'ember-testing/adapters/qunit', 'ember-views/system/jquery'], function (exports, _emberMetalCore, _emberTestingAdaptersQunit, _emberViewsSystemJquery) {\n 'use strict';\n\n exports.default = setupForTesting;\n\n var Test, requests;\n\n function incrementAjaxPendingRequests(_, xhr) {\n requests.push(xhr);\n Test.pendingAjaxRequests = requests.length;\n }\n\n function decrementAjaxPendingRequests(_, xhr) {\n for (var i = 0; i < requests.length; i++) {\n if (xhr === requests[i]) {\n requests.splice(i, 1);\n }\n }\n Test.pendingAjaxRequests = requests.length;\n }\n\n /**\n Sets Ember up for testing. This is useful to perform\n basic setup steps in order to unit test.\n \n Use `App.setupForTesting` to perform integration tests (full\n application testing).\n \n @method setupForTesting\n @namespace Ember\n @since 1.5.0\n @private\n */\n\n function setupForTesting() {\n if (!Test) {\n Test = requireModule('ember-testing/test')['default'];\n }\n\n _emberMetalCore.default.testing = true;\n\n // if adapter is not manually set default to QUnit\n if (!Test.adapter) {\n Test.adapter = _emberTestingAdaptersQunit.default.create();\n }\n\n requests = [];\n Test.pendingAjaxRequests = requests.length;\n\n _emberViewsSystemJquery.default(document).off('ajaxSend', incrementAjaxPendingRequests);\n _emberViewsSystemJquery.default(document).off('ajaxComplete', decrementAjaxPendingRequests);\n _emberViewsSystemJquery.default(document).on('ajaxSend', incrementAjaxPendingRequests);\n _emberViewsSystemJquery.default(document).on('ajaxComplete', decrementAjaxPendingRequests);\n }\n});\n\n// import Test from \"ember-testing/test\"; // ES6TODO: fix when cycles are supported\nenifed('ember-testing/support', ['exports', 'ember-metal/debug', 'ember-views/system/jquery', 'ember-metal/environment'], function (exports, _emberMetalDebug, _emberViewsSystemJquery, _emberMetalEnvironment) {\n 'use strict';\n\n /**\n @module ember\n @submodule ember-testing\n */\n\n var $ = _emberViewsSystemJquery.default;\n\n /**\n This method creates a checkbox and triggers the click event to fire the\n passed in handler. It is used to correct for a bug in older versions\n of jQuery (e.g 1.8.3).\n \n @private\n @method testCheckboxClick\n */\n function testCheckboxClick(handler) {\n $(' ').css({ position: 'absolute', left: '-1000px', top: '-1000px' }).appendTo('body').on('click', handler).trigger('click').remove();\n }\n\n if (_emberMetalEnvironment.default.hasDOM) {\n $(function () {\n /*\n Determine whether a checkbox checked using jQuery's \"click\" method will have\n the correct value for its checked property.\n If we determine that the current jQuery version exhibits this behavior,\n patch it to work correctly as in the commit for the actual fix:\n https://github.com/jquery/jquery/commit/1fb2f92.\n */\n testCheckboxClick(function () {\n if (!this.checked && !$.event.special.click) {\n $.event.special.click = {\n // For checkbox, fire native event so checked state will be right\n trigger: function () {\n if ($.nodeName(this, 'input') && this.type === 'checkbox' && this.click) {\n this.click();\n return false;\n }\n }\n };\n }\n });\n\n // Try again to verify that the patch took effect or blow up.\n testCheckboxClick(function () {\n _emberMetalDebug.warn('clicked checkboxes should be checked! the jQuery patch didn\\'t work', this.checked, { id: 'ember-testing.test-checkbox-click' });\n });\n });\n }\n});\nenifed('ember-testing/test', ['exports', 'ember-metal/run_loop', 'ember-runtime/ext/rsvp', 'ember-testing/setup_for_testing', 'ember-application/system/application', 'ember-runtime/system/native_array'], function (exports, _emberMetalRun_loop, _emberRuntimeExtRsvp, _emberTestingSetup_for_testing, _emberApplicationSystemApplication, _emberRuntimeSystemNative_array) {\n 'use strict';\n\n /**\n @module ember\n @submodule ember-testing\n */\n var helpers = {};\n var injectHelpersCallbacks = [];\n\n /**\n This is a container for an assortment of testing related functionality:\n \n * Choose your default test adapter (for your framework of choice).\n * Register/Unregister additional test helpers.\n * Setup callbacks to be fired when the test helpers are injected into\n your application.\n \n @class Test\n @namespace Ember\n @public\n */\n var Test = {\n /**\n Hash containing all known test helpers.\n @property _helpers\n @private\n @since 1.7.0\n */\n _helpers: helpers,\n\n /**\n `registerHelper` is used to register a test helper that will be injected\n when `App.injectTestHelpers` is called.\n The helper method will always be called with the current Application as\n the first parameter.\n For example:\n ```javascript\n Ember.Test.registerHelper('boot', function(app) {\n Ember.run(app, app.advanceReadiness);\n });\n ```\n This helper can later be called without arguments because it will be\n called with `app` as the first parameter.\n ```javascript\n App = Ember.Application.create();\n App.injectTestHelpers();\n boot();\n ```\n @public\n @method registerHelper\n @param {String} name The name of the helper method to add.\n @param {Function} helperMethod\n @param options {Object}\n */\n registerHelper: function (name, helperMethod) {\n helpers[name] = {\n method: helperMethod,\n meta: { wait: false }\n };\n },\n\n /**\n `registerAsyncHelper` is used to register an async test helper that will be injected\n when `App.injectTestHelpers` is called.\n The helper method will always be called with the current Application as\n the first parameter.\n For example:\n ```javascript\n Ember.Test.registerAsyncHelper('boot', function(app) {\n Ember.run(app, app.advanceReadiness);\n });\n ```\n The advantage of an async helper is that it will not run\n until the last async helper has completed. All async helpers\n after it will wait for it complete before running.\n For example:\n ```javascript\n Ember.Test.registerAsyncHelper('deletePost', function(app, postId) {\n click('.delete-' + postId);\n });\n // ... in your test\n visit('/post/2');\n deletePost(2);\n visit('/post/3');\n deletePost(3);\n ```\n @public\n @method registerAsyncHelper\n @param {String} name The name of the helper method to add.\n @param {Function} helperMethod\n @since 1.2.0\n */\n registerAsyncHelper: function (name, helperMethod) {\n helpers[name] = {\n method: helperMethod,\n meta: { wait: true }\n };\n },\n\n /**\n Remove a previously added helper method.\n Example:\n ```javascript\n Ember.Test.unregisterHelper('wait');\n ```\n @public\n @method unregisterHelper\n @param {String} name The helper to remove.\n */\n unregisterHelper: function (name) {\n delete helpers[name];\n delete Test.Promise.prototype[name];\n },\n\n /**\n Used to register callbacks to be fired whenever `App.injectTestHelpers`\n is called.\n The callback will receive the current application as an argument.\n Example:\n ```javascript\n Ember.Test.onInjectHelpers(function() {\n Ember.$(document).ajaxSend(function() {\n Test.pendingAjaxRequests++;\n });\n Ember.$(document).ajaxComplete(function() {\n Test.pendingAjaxRequests--;\n });\n });\n ```\n @public\n @method onInjectHelpers\n @param {Function} callback The function to be called.\n */\n onInjectHelpers: function (callback) {\n injectHelpersCallbacks.push(callback);\n },\n\n /**\n This returns a thenable tailored for testing. It catches failed\n `onSuccess` callbacks and invokes the `Ember.Test.adapter.exception`\n callback in the last chained then.\n This method should be returned by async helpers such as `wait`.\n @public\n @method promise\n @param {Function} resolver The function used to resolve the promise.\n @param {String} label An optional string for identifying the promise.\n */\n promise: function (resolver, label) {\n var fullLabel = 'Ember.Test.promise: ' + (label || '');\n return new Test.Promise(resolver, fullLabel);\n },\n\n /**\n Used to allow ember-testing to communicate with a specific testing\n framework.\n You can manually set it before calling `App.setupForTesting()`.\n Example:\n ```javascript\n Ember.Test.adapter = MyCustomAdapter.create()\n ```\n If you do not set it, ember-testing will default to `Ember.Test.QUnitAdapter`.\n @public\n @property adapter\n @type {Class} The adapter to be used.\n @default Ember.Test.QUnitAdapter\n */\n adapter: null,\n\n /**\n Replacement for `Ember.RSVP.resolve`\n The only difference is this uses\n an instance of `Ember.Test.Promise`\n @public\n @method resolve\n @param {Mixed} The value to resolve\n @since 1.2.0\n */\n resolve: function (val) {\n return Test.promise(function (resolve) {\n return resolve(val);\n });\n },\n\n /**\n This allows ember-testing to play nicely with other asynchronous\n events, such as an application that is waiting for a CSS3\n transition or an IndexDB transaction.\n For example:\n ```javascript\n Ember.Test.registerWaiter(function() {\n return myPendingTransactions() == 0;\n });\n ```\n The `context` argument allows you to optionally specify the `this`\n with which your callback will be invoked.\n For example:\n ```javascript\n Ember.Test.registerWaiter(MyDB, MyDB.hasPendingTransactions);\n ```\n @public\n @method registerWaiter\n @param {Object} context (optional)\n @param {Function} callback\n @since 1.2.0\n */\n registerWaiter: function (context, callback) {\n if (arguments.length === 1) {\n callback = context;\n context = null;\n }\n if (!this.waiters) {\n this.waiters = _emberRuntimeSystemNative_array.A();\n }\n this.waiters.push([context, callback]);\n },\n /**\n `unregisterWaiter` is used to unregister a callback that was\n registered with `registerWaiter`.\n @public\n @method unregisterWaiter\n @param {Object} context (optional)\n @param {Function} callback\n @since 1.2.0\n */\n unregisterWaiter: function (context, callback) {\n if (!this.waiters) {\n return;\n }\n if (arguments.length === 1) {\n callback = context;\n context = null;\n }\n this.waiters = _emberRuntimeSystemNative_array.A(this.waiters.filter(function (elt) {\n return !(elt[0] === context && elt[1] === callback);\n }));\n }\n };\n\n function helper(app, name) {\n var fn = helpers[name].method;\n var meta = helpers[name].meta;\n\n return function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var lastPromise;\n\n args.unshift(app);\n\n // some helpers are not async and\n // need to return a value immediately.\n // example: `find`\n if (!meta.wait) {\n return fn.apply(app, args);\n }\n\n lastPromise = run(function () {\n return Test.resolve(Test.lastPromise);\n });\n\n // wait for last helper's promise to resolve and then\n // execute. To be safe, we need to tell the adapter we're going\n // asynchronous here, because fn may not be invoked before we\n // return.\n Test.adapter.asyncStart();\n return lastPromise.then(function () {\n return fn.apply(app, args);\n }).finally(function () {\n Test.adapter.asyncEnd();\n });\n };\n }\n\n function run(fn) {\n if (!_emberMetalRun_loop.default.currentRunLoop) {\n return _emberMetalRun_loop.default(fn);\n } else {\n return fn();\n }\n }\n\n _emberApplicationSystemApplication.default.reopen({\n /**\n This property contains the testing helpers for the current application. These\n are created once you call `injectTestHelpers` on your `Ember.Application`\n instance. The included helpers are also available on the `window` object by\n default, but can be used from this object on the individual application also.\n @property testHelpers\n @type {Object}\n @default {}\n @public\n */\n testHelpers: {},\n\n /**\n This property will contain the original methods that were registered\n on the `helperContainer` before `injectTestHelpers` is called.\n When `removeTestHelpers` is called, these methods are restored to the\n `helperContainer`.\n @property originalMethods\n @type {Object}\n @default {}\n @private\n @since 1.3.0\n */\n originalMethods: {},\n\n /**\n This property indicates whether or not this application is currently in\n testing mode. This is set when `setupForTesting` is called on the current\n application.\n @property testing\n @type {Boolean}\n @default false\n @since 1.3.0\n @public\n */\n testing: false,\n\n /**\n This hook defers the readiness of the application, so that you can start\n the app when your tests are ready to run. It also sets the router's\n location to 'none', so that the window's location will not be modified\n (preventing both accidental leaking of state between tests and interference\n with your testing framework).\n Example:\n ```\n App.setupForTesting();\n ```\n @method setupForTesting\n @public\n */\n setupForTesting: function () {\n _emberTestingSetup_for_testing.default();\n\n this.testing = true;\n\n this.Router.reopen({\n location: 'none'\n });\n },\n\n /**\n This will be used as the container to inject the test helpers into. By\n default the helpers are injected into `window`.\n @property helperContainer\n @type {Object} The object to be used for test helpers.\n @default window\n @since 1.2.0\n @private\n */\n helperContainer: null,\n\n /**\n This injects the test helpers into the `helperContainer` object. If an object is provided\n it will be used as the helperContainer. If `helperContainer` is not set it will default\n to `window`. If a function of the same name has already been defined it will be cached\n (so that it can be reset if the helper is removed with `unregisterHelper` or\n `removeTestHelpers`).\n Any callbacks registered with `onInjectHelpers` will be called once the\n helpers have been injected.\n Example:\n ```\n App.injectTestHelpers();\n ```\n @method injectTestHelpers\n @public\n */\n injectTestHelpers: function (helperContainer) {\n if (helperContainer) {\n this.helperContainer = helperContainer;\n } else {\n this.helperContainer = window;\n }\n\n this.reopen({\n willDestroy: function () {\n this._super.apply(this, arguments);\n this.removeTestHelpers();\n }\n });\n\n this.testHelpers = {};\n for (var name in helpers) {\n this.originalMethods[name] = this.helperContainer[name];\n this.testHelpers[name] = this.helperContainer[name] = helper(this, name);\n protoWrap(Test.Promise.prototype, name, helper(this, name), helpers[name].meta.wait);\n }\n\n for (var i = 0, l = injectHelpersCallbacks.length; i < l; i++) {\n injectHelpersCallbacks[i](this);\n }\n },\n\n /**\n This removes all helpers that have been registered, and resets and functions\n that were overridden by the helpers.\n Example:\n ```javascript\n App.removeTestHelpers();\n ```\n @public\n @method removeTestHelpers\n */\n removeTestHelpers: function () {\n if (!this.helperContainer) {\n return;\n }\n\n for (var name in helpers) {\n this.helperContainer[name] = this.originalMethods[name];\n delete Test.Promise.prototype[name];\n delete this.testHelpers[name];\n delete this.originalMethods[name];\n }\n }\n });\n\n // This method is no longer needed\n // But still here for backwards compatibility\n // of helper chaining\n function protoWrap(proto, name, callback, isAsync) {\n proto[name] = function () {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n if (isAsync) {\n return callback.apply(this, args);\n } else {\n return this.then(function () {\n return callback.apply(this, args);\n });\n }\n };\n }\n\n Test.Promise = function () {\n _emberRuntimeExtRsvp.default.Promise.apply(this, arguments);\n Test.lastPromise = this;\n };\n\n Test.Promise.prototype = Object.create(_emberRuntimeExtRsvp.default.Promise.prototype);\n Test.Promise.prototype.constructor = Test.Promise;\n Test.Promise.resolve = Test.resolve;\n\n // Patch `then` to isolate async methods\n // specifically `Ember.Test.lastPromise`\n var originalThen = _emberRuntimeExtRsvp.default.Promise.prototype.then;\n Test.Promise.prototype.then = function (onSuccess, onFailure) {\n return originalThen.call(this, function (val) {\n return isolate(onSuccess, val);\n }, onFailure);\n };\n\n // This method isolates nested async methods\n // so that they don't conflict with other last promises.\n //\n // 1. Set `Ember.Test.lastPromise` to null\n // 2. Invoke method\n // 3. Return the last promise created during method\n function isolate(fn, val) {\n var value, lastPromise;\n\n // Reset lastPromise for nested helpers\n Test.lastPromise = null;\n\n value = fn(val);\n\n lastPromise = Test.lastPromise;\n Test.lastPromise = null;\n\n // If the method returned a promise\n // return that promise. If not,\n // return the last async helper's promise\n if (value && value instanceof Test.Promise || !lastPromise) {\n return value;\n } else {\n return run(function () {\n return Test.resolve(lastPromise).then(function () {\n return value;\n });\n });\n }\n }\n\n exports.default = Test;\n});\nrequireModule(\"ember-testing\");\n\n}());\n","/*!\n * QUnit 1.23.1\n * https://qunitjs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2016-04-12T17:29Z\n */\n\n( function( global ) {\n\nvar QUnit = {};\n\nvar Date = global.Date;\nvar now = Date.now || function() {\n\treturn new Date().getTime();\n};\n\nvar setTimeout = global.setTimeout;\nvar clearTimeout = global.clearTimeout;\n\n// Store a local window from the global to allow direct references.\nvar window = global.window;\n\nvar defined = {\n\tdocument: window && window.document !== undefined,\n\tsetTimeout: setTimeout !== undefined,\n\tsessionStorage: ( function() {\n\t\tvar x = \"qunit-test-string\";\n\t\ttry {\n\t\t\tsessionStorage.setItem( x, x );\n\t\t\tsessionStorage.removeItem( x );\n\t\t\treturn true;\n\t\t} catch ( e ) {\n\t\t\treturn false;\n\t\t}\n\t}() )\n};\n\nvar fileName = ( sourceFromStacktrace( 0 ) || \"\" ).replace( /(:\\d+)+\\)?/, \"\" ).replace( /.+\\//, \"\" );\nvar globalStartCalled = false;\nvar runStarted = false;\n\nvar toString = Object.prototype.toString,\n\thasOwn = Object.prototype.hasOwnProperty;\n\n// Returns a new Array with the elements that are in a but not in b\nfunction diff( a, b ) {\n\tvar i, j,\n\t\tresult = a.slice();\n\n\tfor ( i = 0; i < result.length; i++ ) {\n\t\tfor ( j = 0; j < b.length; j++ ) {\n\t\t\tif ( result[ i ] === b[ j ] ) {\n\t\t\t\tresult.splice( i, 1 );\n\t\t\t\ti--;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n\n// From jquery.js\nfunction inArray( elem, array ) {\n\tif ( array.indexOf ) {\n\t\treturn array.indexOf( elem );\n\t}\n\n\tfor ( var i = 0, length = array.length; i < length; i++ ) {\n\t\tif ( array[ i ] === elem ) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n/**\n * Makes a clone of an object using only Array or Object as base,\n * and copies over the own enumerable properties.\n *\n * @param {Object} obj\n * @return {Object} New object with only the own properties (recursively).\n */\nfunction objectValues ( obj ) {\n\tvar key, val,\n\t\tvals = QUnit.is( \"array\", obj ) ? [] : {};\n\tfor ( key in obj ) {\n\t\tif ( hasOwn.call( obj, key ) ) {\n\t\t\tval = obj[ key ];\n\t\t\tvals[ key ] = val === Object( val ) ? objectValues( val ) : val;\n\t\t}\n\t}\n\treturn vals;\n}\n\nfunction extend( a, b, undefOnly ) {\n\tfor ( var prop in b ) {\n\t\tif ( hasOwn.call( b, prop ) ) {\n\n\t\t\t// Avoid \"Member not found\" error in IE8 caused by messing with window.constructor\n\t\t\t// This block runs on every environment, so `global` is being used instead of `window`\n\t\t\t// to avoid errors on node.\n\t\t\tif ( prop !== \"constructor\" || a !== global ) {\n\t\t\t\tif ( b[ prop ] === undefined ) {\n\t\t\t\t\tdelete a[ prop ];\n\t\t\t\t} else if ( !( undefOnly && typeof a[ prop ] !== \"undefined\" ) ) {\n\t\t\t\t\ta[ prop ] = b[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a;\n}\n\nfunction objectType( obj ) {\n\tif ( typeof obj === \"undefined\" ) {\n\t\treturn \"undefined\";\n\t}\n\n\t// Consider: typeof null === object\n\tif ( obj === null ) {\n\t\treturn \"null\";\n\t}\n\n\tvar match = toString.call( obj ).match( /^\\[object\\s(.*)\\]$/ ),\n\t\ttype = match && match[ 1 ];\n\n\tswitch ( type ) {\n\t\tcase \"Number\":\n\t\t\tif ( isNaN( obj ) ) {\n\t\t\t\treturn \"nan\";\n\t\t\t}\n\t\t\treturn \"number\";\n\t\tcase \"String\":\n\t\tcase \"Boolean\":\n\t\tcase \"Array\":\n\t\tcase \"Set\":\n\t\tcase \"Map\":\n\t\tcase \"Date\":\n\t\tcase \"RegExp\":\n\t\tcase \"Function\":\n\t\tcase \"Symbol\":\n\t\t\treturn type.toLowerCase();\n\t}\n\tif ( typeof obj === \"object\" ) {\n\t\treturn \"object\";\n\t}\n}\n\n// Safe object type checking\nfunction is( type, obj ) {\n\treturn QUnit.objectType( obj ) === type;\n}\n\n// Doesn't support IE6 to IE9, it will return undefined on these browsers\n// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack\nfunction extractStacktrace( e, offset ) {\n\toffset = offset === undefined ? 4 : offset;\n\n\tvar stack, include, i;\n\n\tif ( e.stack ) {\n\t\tstack = e.stack.split( \"\\n\" );\n\t\tif ( /^error$/i.test( stack[ 0 ] ) ) {\n\t\t\tstack.shift();\n\t\t}\n\t\tif ( fileName ) {\n\t\t\tinclude = [];\n\t\t\tfor ( i = offset; i < stack.length; i++ ) {\n\t\t\t\tif ( stack[ i ].indexOf( fileName ) !== -1 ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tinclude.push( stack[ i ] );\n\t\t\t}\n\t\t\tif ( include.length ) {\n\t\t\t\treturn include.join( \"\\n\" );\n\t\t\t}\n\t\t}\n\t\treturn stack[ offset ];\n\n\t// Support: Safari <=6 only\n\t} else if ( e.sourceURL ) {\n\n\t\t// Exclude useless self-reference for generated Error objects\n\t\tif ( /qunit.js$/.test( e.sourceURL ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// For actual exceptions, this is useful\n\t\treturn e.sourceURL + \":\" + e.line;\n\t}\n}\n\nfunction sourceFromStacktrace( offset ) {\n\tvar error = new Error();\n\n\t// Support: Safari <=7 only, IE <=10 - 11 only\n\t// Not all browsers generate the `stack` property for `new Error()`, see also #636\n\tif ( !error.stack ) {\n\t\ttry {\n\t\t\tthrow error;\n\t\t} catch ( err ) {\n\t\t\terror = err;\n\t\t}\n\t}\n\n\treturn extractStacktrace( error, offset );\n}\n\n/**\n * Config object: Maintain internal state\n * Later exposed as QUnit.config\n * `config` initialized at top of scope\n */\nvar config = {\n\n\t// The queue of tests to run\n\tqueue: [],\n\n\t// Block until document ready\n\tblocking: true,\n\n\t// By default, run previously failed tests first\n\t// very useful in combination with \"Hide passed tests\" checked\n\treorder: true,\n\n\t// By default, modify document.title when suite is done\n\taltertitle: true,\n\n\t// HTML Reporter: collapse every test except the first failing test\n\t// If false, all failing tests will be expanded\n\tcollapse: true,\n\n\t// By default, scroll to top of the page when suite is done\n\tscrolltop: true,\n\n\t// Depth up-to which object will be dumped\n\tmaxDepth: 5,\n\n\t// When enabled, all tests must call expect()\n\trequireExpects: false,\n\n\t// Placeholder for user-configurable form-exposed URL parameters\n\turlConfig: [],\n\n\t// Set of all modules.\n\tmodules: [],\n\n\t// Stack of nested modules\n\tmoduleStack: [],\n\n\t// The first unnamed module\n\tcurrentModule: {\n\t\tname: \"\",\n\t\ttests: []\n\t},\n\n\tcallbacks: {}\n};\n\n// Push a loose unnamed module to the modules collection\nconfig.modules.push( config.currentModule );\n\nvar loggingCallbacks = {};\n\n// Register logging callbacks\nfunction registerLoggingCallbacks( obj ) {\n\tvar i, l, key,\n\t\tcallbackNames = [ \"begin\", \"done\", \"log\", \"testStart\", \"testDone\",\n\t\t\t\"moduleStart\", \"moduleDone\" ];\n\n\tfunction registerLoggingCallback( key ) {\n\t\tvar loggingCallback = function( callback ) {\n\t\t\tif ( objectType( callback ) !== \"function\" ) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"QUnit logging methods require a callback function as their first parameters.\"\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconfig.callbacks[ key ].push( callback );\n\t\t};\n\n\t\t// DEPRECATED: This will be removed on QUnit 2.0.0+\n\t\t// Stores the registered functions allowing restoring\n\t\t// at verifyLoggingCallbacks() if modified\n\t\tloggingCallbacks[ key ] = loggingCallback;\n\n\t\treturn loggingCallback;\n\t}\n\n\tfor ( i = 0, l = callbackNames.length; i < l; i++ ) {\n\t\tkey = callbackNames[ i ];\n\n\t\t// Initialize key collection of logging callback\n\t\tif ( objectType( config.callbacks[ key ] ) === \"undefined\" ) {\n\t\t\tconfig.callbacks[ key ] = [];\n\t\t}\n\n\t\tobj[ key ] = registerLoggingCallback( key );\n\t}\n}\n\nfunction runLoggingCallbacks( key, args ) {\n\tvar i, l, callbacks;\n\n\tcallbacks = config.callbacks[ key ];\n\tfor ( i = 0, l = callbacks.length; i < l; i++ ) {\n\t\tcallbacks[ i ]( args );\n\t}\n}\n\n// DEPRECATED: This will be removed on 2.0.0+\n// This function verifies if the loggingCallbacks were modified by the user\n// If so, it will restore it, assign the given callback and print a console warning\nfunction verifyLoggingCallbacks() {\n\tvar loggingCallback, userCallback;\n\n\tfor ( loggingCallback in loggingCallbacks ) {\n\t\tif ( QUnit[ loggingCallback ] !== loggingCallbacks[ loggingCallback ] ) {\n\n\t\t\tuserCallback = QUnit[ loggingCallback ];\n\n\t\t\t// Restore the callback function\n\t\t\tQUnit[ loggingCallback ] = loggingCallbacks[ loggingCallback ];\n\n\t\t\t// Assign the deprecated given callback\n\t\t\tQUnit[ loggingCallback ]( userCallback );\n\n\t\t\tif ( global.console && global.console.warn ) {\n\t\t\t\tglobal.console.warn(\n\t\t\t\t\t\"QUnit.\" + loggingCallback + \" was replaced with a new value.\\n\" +\n\t\t\t\t\t\"Please, check out the documentation on how to apply logging callbacks.\\n\" +\n\t\t\t\t\t\"Reference: https://api.qunitjs.com/category/callbacks/\"\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\n( function() {\n\tif ( !defined.document ) {\n\t\treturn;\n\t}\n\n\t// `onErrorFnPrev` initialized at top of scope\n\t// Preserve other handlers\n\tvar onErrorFnPrev = window.onerror;\n\n\t// Cover uncaught exceptions\n\t// Returning true will suppress the default browser handler,\n\t// returning false will let it run.\n\twindow.onerror = function( error, filePath, linerNr ) {\n\t\tvar ret = false;\n\t\tif ( onErrorFnPrev ) {\n\t\t\tret = onErrorFnPrev( error, filePath, linerNr );\n\t\t}\n\n\t\t// Treat return value as window.onerror itself does,\n\t\t// Only do our handling if not suppressed.\n\t\tif ( ret !== true ) {\n\t\t\tif ( QUnit.config.current ) {\n\t\t\t\tif ( QUnit.config.current.ignoreGlobalErrors ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tQUnit.pushFailure( error, filePath + \":\" + linerNr );\n\t\t\t} else {\n\t\t\t\tQUnit.test( \"global failure\", extend( function() {\n\t\t\t\t\tQUnit.pushFailure( error, filePath + \":\" + linerNr );\n\t\t\t\t}, { validTest: true } ) );\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\treturn ret;\n\t};\n}() );\n\n// Figure out if we're running the tests from a server or not\nQUnit.isLocal = !( defined.document && window.location.protocol !== \"file:\" );\n\n// Expose the current QUnit version\nQUnit.version = \"1.23.1\";\n\nextend( QUnit, {\n\n\t// Call on start of module test to prepend name to all tests\n\tmodule: function( name, testEnvironment, executeNow ) {\n\t\tvar module, moduleFns;\n\t\tvar currentModule = config.currentModule;\n\n\t\tif ( arguments.length === 2 ) {\n\t\t\tif ( objectType( testEnvironment ) === \"function\" ) {\n\t\t\t\texecuteNow = testEnvironment;\n\t\t\t\ttestEnvironment = undefined;\n\t\t\t}\n\t\t}\n\n\t\t// DEPRECATED: handles setup/teardown functions,\n\t\t// beforeEach and afterEach should be used instead\n\t\tif ( testEnvironment && testEnvironment.setup ) {\n\t\t\ttestEnvironment.beforeEach = testEnvironment.setup;\n\t\t\tdelete testEnvironment.setup;\n\t\t}\n\t\tif ( testEnvironment && testEnvironment.teardown ) {\n\t\t\ttestEnvironment.afterEach = testEnvironment.teardown;\n\t\t\tdelete testEnvironment.teardown;\n\t\t}\n\n\t\tmodule = createModule();\n\n\t\tmoduleFns = {\n\t\t\tbeforeEach: setHook( module, \"beforeEach\" ),\n\t\t\tafterEach: setHook( module, \"afterEach\" )\n\t\t};\n\n\t\tif ( objectType( executeNow ) === \"function\" ) {\n\t\t\tconfig.moduleStack.push( module );\n\t\t\tsetCurrentModule( module );\n\t\t\texecuteNow.call( module.testEnvironment, moduleFns );\n\t\t\tconfig.moduleStack.pop();\n\t\t\tmodule = module.parentModule || currentModule;\n\t\t}\n\n\t\tsetCurrentModule( module );\n\n\t\tfunction createModule() {\n\t\t\tvar parentModule = config.moduleStack.length ?\n\t\t\t\tconfig.moduleStack.slice( -1 )[ 0 ] : null;\n\t\t\tvar moduleName = parentModule !== null ?\n\t\t\t\t[ parentModule.name, name ].join( \" > \" ) : name;\n\t\t\tvar module = {\n\t\t\t\tname: moduleName,\n\t\t\t\tparentModule: parentModule,\n\t\t\t\ttests: [],\n\t\t\t\tmoduleId: generateHash( moduleName )\n\t\t\t};\n\n\t\t\tvar env = {};\n\t\t\tif ( parentModule ) {\n\t\t\t\textend( env, parentModule.testEnvironment );\n\t\t\t\tdelete env.beforeEach;\n\t\t\t\tdelete env.afterEach;\n\t\t\t}\n\t\t\textend( env, testEnvironment );\n\t\t\tmodule.testEnvironment = env;\n\n\t\t\tconfig.modules.push( module );\n\t\t\treturn module;\n\t\t}\n\n\t\tfunction setCurrentModule( module ) {\n\t\t\tconfig.currentModule = module;\n\t\t}\n\n\t},\n\n\t// DEPRECATED: QUnit.asyncTest() will be removed in QUnit 2.0.\n\tasyncTest: asyncTest,\n\n\ttest: test,\n\n\tskip: skip,\n\n\tonly: only,\n\n\t// DEPRECATED: The functionality of QUnit.start() will be altered in QUnit 2.0.\n\t// In QUnit 2.0, invoking it will ONLY affect the `QUnit.config.autostart` blocking behavior.\n\tstart: function( count ) {\n\t\tvar globalStartAlreadyCalled = globalStartCalled;\n\n\t\tif ( !config.current ) {\n\t\t\tglobalStartCalled = true;\n\n\t\t\tif ( runStarted ) {\n\t\t\t\tthrow new Error( \"Called start() outside of a test context while already started\" );\n\t\t\t} else if ( globalStartAlreadyCalled || count > 1 ) {\n\t\t\t\tthrow new Error( \"Called start() outside of a test context too many times\" );\n\t\t\t} else if ( config.autostart ) {\n\t\t\t\tthrow new Error( \"Called start() outside of a test context when \" +\n\t\t\t\t\t\"QUnit.config.autostart was true\" );\n\t\t\t} else if ( !config.pageLoaded ) {\n\n\t\t\t\t// The page isn't completely loaded yet, so bail out and let `QUnit.load` handle it\n\t\t\t\tconfig.autostart = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\n\t\t\t// If a test is running, adjust its semaphore\n\t\t\tconfig.current.semaphore -= count || 1;\n\n\t\t\t// If semaphore is non-numeric, throw error\n\t\t\tif ( isNaN( config.current.semaphore ) ) {\n\t\t\t\tconfig.current.semaphore = 0;\n\n\t\t\t\tQUnit.pushFailure(\n\t\t\t\t\t\"Called start() with a non-numeric decrement.\",\n\t\t\t\t\tsourceFromStacktrace( 2 )\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Don't start until equal number of stop-calls\n\t\t\tif ( config.current.semaphore > 0 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Throw an Error if start is called more often than stop\n\t\t\tif ( config.current.semaphore < 0 ) {\n\t\t\t\tconfig.current.semaphore = 0;\n\n\t\t\t\tQUnit.pushFailure(\n\t\t\t\t\t\"Called start() while already started (test's semaphore was 0 already)\",\n\t\t\t\t\tsourceFromStacktrace( 2 )\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tresumeProcessing();\n\t},\n\n\t// DEPRECATED: QUnit.stop() will be removed in QUnit 2.0.\n\tstop: function( count ) {\n\n\t\t// If there isn't a test running, don't allow QUnit.stop() to be called\n\t\tif ( !config.current ) {\n\t\t\tthrow new Error( \"Called stop() outside of a test context\" );\n\t\t}\n\n\t\t// If a test is running, adjust its semaphore\n\t\tconfig.current.semaphore += count || 1;\n\n\t\tpauseProcessing();\n\t},\n\n\tconfig: config,\n\n\tis: is,\n\n\tobjectType: objectType,\n\n\textend: extend,\n\n\tload: function() {\n\t\tconfig.pageLoaded = true;\n\n\t\t// Initialize the configuration options\n\t\textend( config, {\n\t\t\tstats: { all: 0, bad: 0 },\n\t\t\tmoduleStats: { all: 0, bad: 0 },\n\t\t\tstarted: 0,\n\t\t\tupdateRate: 1000,\n\t\t\tautostart: true,\n\t\t\tfilter: \"\"\n\t\t}, true );\n\n\t\tconfig.blocking = false;\n\n\t\tif ( config.autostart ) {\n\t\t\tresumeProcessing();\n\t\t}\n\t},\n\n\tstack: function( offset ) {\n\t\toffset = ( offset || 0 ) + 2;\n\t\treturn sourceFromStacktrace( offset );\n\t}\n} );\n\nregisterLoggingCallbacks( QUnit );\n\nfunction begin() {\n\tvar i, l,\n\t\tmodulesLog = [];\n\n\t// If the test run hasn't officially begun yet\n\tif ( !config.started ) {\n\n\t\t// Record the time of the test run's beginning\n\t\tconfig.started = now();\n\n\t\tverifyLoggingCallbacks();\n\n\t\t// Delete the loose unnamed module if unused.\n\t\tif ( config.modules[ 0 ].name === \"\" && config.modules[ 0 ].tests.length === 0 ) {\n\t\t\tconfig.modules.shift();\n\t\t}\n\n\t\t// Avoid unnecessary information by not logging modules' test environments\n\t\tfor ( i = 0, l = config.modules.length; i < l; i++ ) {\n\t\t\tmodulesLog.push( {\n\t\t\t\tname: config.modules[ i ].name,\n\t\t\t\ttests: config.modules[ i ].tests\n\t\t\t} );\n\t\t}\n\n\t\t// The test run is officially beginning now\n\t\trunLoggingCallbacks( \"begin\", {\n\t\t\ttotalTests: Test.count,\n\t\t\tmodules: modulesLog\n\t\t} );\n\t}\n\n\tconfig.blocking = false;\n\tprocess( true );\n}\n\nfunction process( last ) {\n\tfunction next() {\n\t\tprocess( last );\n\t}\n\tvar start = now();\n\tconfig.depth = ( config.depth || 0 ) + 1;\n\n\twhile ( config.queue.length && !config.blocking ) {\n\t\tif ( !defined.setTimeout || config.updateRate <= 0 ||\n\t\t\t\t( ( now() - start ) < config.updateRate ) ) {\n\t\t\tif ( config.current ) {\n\n\t\t\t\t// Reset async tracking for each phase of the Test lifecycle\n\t\t\t\tconfig.current.usedAsync = false;\n\t\t\t}\n\t\t\tconfig.queue.shift()();\n\t\t} else {\n\t\t\tsetTimeout( next, 13 );\n\t\t\tbreak;\n\t\t}\n\t}\n\tconfig.depth--;\n\tif ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {\n\t\tdone();\n\t}\n}\n\nfunction pauseProcessing() {\n\tconfig.blocking = true;\n\n\tif ( config.testTimeout && defined.setTimeout ) {\n\t\tclearTimeout( config.timeout );\n\t\tconfig.timeout = setTimeout( function() {\n\t\t\tif ( config.current ) {\n\t\t\t\tconfig.current.semaphore = 0;\n\t\t\t\tQUnit.pushFailure( \"Test timed out\", sourceFromStacktrace( 2 ) );\n\t\t\t} else {\n\t\t\t\tthrow new Error( \"Test timed out\" );\n\t\t\t}\n\t\t\tresumeProcessing();\n\t\t}, config.testTimeout );\n\t}\n}\n\nfunction resumeProcessing() {\n\trunStarted = true;\n\n\t// A slight delay to allow this iteration of the event loop to finish (more assertions, etc.)\n\tif ( defined.setTimeout ) {\n\t\tsetTimeout( function() {\n\t\t\tif ( config.current && config.current.semaphore > 0 ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( config.timeout ) {\n\t\t\t\tclearTimeout( config.timeout );\n\t\t\t}\n\n\t\t\tbegin();\n\t\t}, 13 );\n\t} else {\n\t\tbegin();\n\t}\n}\n\nfunction done() {\n\tvar runtime, passed;\n\n\tconfig.autorun = true;\n\n\t// Log the last module results\n\tif ( config.previousModule ) {\n\t\trunLoggingCallbacks( \"moduleDone\", {\n\t\t\tname: config.previousModule.name,\n\t\t\ttests: config.previousModule.tests,\n\t\t\tfailed: config.moduleStats.bad,\n\t\t\tpassed: config.moduleStats.all - config.moduleStats.bad,\n\t\t\ttotal: config.moduleStats.all,\n\t\t\truntime: now() - config.moduleStats.started\n\t\t} );\n\t}\n\tdelete config.previousModule;\n\n\truntime = now() - config.started;\n\tpassed = config.stats.all - config.stats.bad;\n\n\trunLoggingCallbacks( \"done\", {\n\t\tfailed: config.stats.bad,\n\t\tpassed: passed,\n\t\ttotal: config.stats.all,\n\t\truntime: runtime\n\t} );\n}\n\nfunction setHook( module, hookName ) {\n\tif ( module.testEnvironment === undefined ) {\n\t\tmodule.testEnvironment = {};\n\t}\n\n\treturn function( callback ) {\n\t\tmodule.testEnvironment[ hookName ] = callback;\n\t};\n}\n\nvar focused = false;\nvar priorityCount = 0;\nvar unitSampler;\n\nfunction Test( settings ) {\n\tvar i, l;\n\n\t++Test.count;\n\n\textend( this, settings );\n\tthis.assertions = [];\n\tthis.semaphore = 0;\n\tthis.usedAsync = false;\n\tthis.module = config.currentModule;\n\tthis.stack = sourceFromStacktrace( 3 );\n\n\t// Register unique strings\n\tfor ( i = 0, l = this.module.tests; i < l.length; i++ ) {\n\t\tif ( this.module.tests[ i ].name === this.testName ) {\n\t\t\tthis.testName += \" \";\n\t\t}\n\t}\n\n\tthis.testId = generateHash( this.module.name, this.testName );\n\n\tthis.module.tests.push( {\n\t\tname: this.testName,\n\t\ttestId: this.testId\n\t} );\n\n\tif ( settings.skip ) {\n\n\t\t// Skipped tests will fully ignore any sent callback\n\t\tthis.callback = function() {};\n\t\tthis.async = false;\n\t\tthis.expected = 0;\n\t} else {\n\t\tthis.assert = new Assert( this );\n\t}\n}\n\nTest.count = 0;\n\nTest.prototype = {\n\tbefore: function() {\n\t\tif (\n\n\t\t\t// Emit moduleStart when we're switching from one module to another\n\t\t\tthis.module !== config.previousModule ||\n\n\t\t\t\t// They could be equal (both undefined) but if the previousModule property doesn't\n\t\t\t\t// yet exist it means this is the first test in a suite that isn't wrapped in a\n\t\t\t\t// module, in which case we'll just emit a moduleStart event for 'undefined'.\n\t\t\t\t// Without this, reporters can get testStart before moduleStart which is a problem.\n\t\t\t\t!hasOwn.call( config, \"previousModule\" )\n\t\t) {\n\t\t\tif ( hasOwn.call( config, \"previousModule\" ) ) {\n\t\t\t\trunLoggingCallbacks( \"moduleDone\", {\n\t\t\t\t\tname: config.previousModule.name,\n\t\t\t\t\ttests: config.previousModule.tests,\n\t\t\t\t\tfailed: config.moduleStats.bad,\n\t\t\t\t\tpassed: config.moduleStats.all - config.moduleStats.bad,\n\t\t\t\t\ttotal: config.moduleStats.all,\n\t\t\t\t\truntime: now() - config.moduleStats.started\n\t\t\t\t} );\n\t\t\t}\n\t\t\tconfig.previousModule = this.module;\n\t\t\tconfig.moduleStats = { all: 0, bad: 0, started: now() };\n\t\t\trunLoggingCallbacks( \"moduleStart\", {\n\t\t\t\tname: this.module.name,\n\t\t\t\ttests: this.module.tests\n\t\t\t} );\n\t\t}\n\n\t\tconfig.current = this;\n\n\t\tif ( this.module.testEnvironment ) {\n\t\t\tdelete this.module.testEnvironment.beforeEach;\n\t\t\tdelete this.module.testEnvironment.afterEach;\n\t\t}\n\t\tthis.testEnvironment = extend( {}, this.module.testEnvironment );\n\n\t\tthis.started = now();\n\t\trunLoggingCallbacks( \"testStart\", {\n\t\t\tname: this.testName,\n\t\t\tmodule: this.module.name,\n\t\t\ttestId: this.testId\n\t\t} );\n\n\t\tif ( !config.pollution ) {\n\t\t\tsaveGlobal();\n\t\t}\n\t},\n\n\trun: function() {\n\t\tvar promise;\n\n\t\tconfig.current = this;\n\n\t\tif ( this.async ) {\n\t\t\tQUnit.stop();\n\t\t}\n\n\t\tthis.callbackStarted = now();\n\n\t\tif ( config.notrycatch ) {\n\t\t\trunTest( this );\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\trunTest( this );\n\t\t} catch ( e ) {\n\t\t\tthis.pushFailure( \"Died on test #\" + ( this.assertions.length + 1 ) + \" \" +\n\t\t\t\tthis.stack + \": \" + ( e.message || e ), extractStacktrace( e, 0 ) );\n\n\t\t\t// Else next test will carry the responsibility\n\t\t\tsaveGlobal();\n\n\t\t\t// Restart the tests if they're blocking\n\t\t\tif ( config.blocking ) {\n\t\t\t\tQUnit.start();\n\t\t\t}\n\t\t}\n\n\t\tfunction runTest( test ) {\n\t\t\tpromise = test.callback.call( test.testEnvironment, test.assert );\n\t\t\ttest.resolvePromise( promise );\n\t\t}\n\t},\n\n\tafter: function() {\n\t\tcheckPollution();\n\t},\n\n\tqueueHook: function( hook, hookName ) {\n\t\tvar promise,\n\t\t\ttest = this;\n\t\treturn function runHook() {\n\t\t\tconfig.current = test;\n\t\t\tif ( config.notrycatch ) {\n\t\t\t\tcallHook();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tcallHook();\n\t\t\t} catch ( error ) {\n\t\t\t\ttest.pushFailure( hookName + \" failed on \" + test.testName + \": \" +\n\t\t\t\t( error.message || error ), extractStacktrace( error, 0 ) );\n\t\t\t}\n\n\t\t\tfunction callHook() {\n\t\t\t\tpromise = hook.call( test.testEnvironment, test.assert );\n\t\t\t\ttest.resolvePromise( promise, hookName );\n\t\t\t}\n\t\t};\n\t},\n\n\t// Currently only used for module level hooks, can be used to add global level ones\n\thooks: function( handler ) {\n\t\tvar hooks = [];\n\n\t\tfunction processHooks( test, module ) {\n\t\t\tif ( module.parentModule ) {\n\t\t\t\tprocessHooks( test, module.parentModule );\n\t\t\t}\n\t\t\tif ( module.testEnvironment &&\n\t\t\t\tQUnit.objectType( module.testEnvironment[ handler ] ) === \"function\" ) {\n\t\t\t\thooks.push( test.queueHook( module.testEnvironment[ handler ], handler ) );\n\t\t\t}\n\t\t}\n\n\t\t// Hooks are ignored on skipped tests\n\t\tif ( !this.skip ) {\n\t\t\tprocessHooks( this, this.module );\n\t\t}\n\t\treturn hooks;\n\t},\n\n\tfinish: function() {\n\t\tconfig.current = this;\n\t\tif ( config.requireExpects && this.expected === null ) {\n\t\t\tthis.pushFailure( \"Expected number of assertions to be defined, but expect() was \" +\n\t\t\t\t\"not called.\", this.stack );\n\t\t} else if ( this.expected !== null && this.expected !== this.assertions.length ) {\n\t\t\tthis.pushFailure( \"Expected \" + this.expected + \" assertions, but \" +\n\t\t\t\tthis.assertions.length + \" were run\", this.stack );\n\t\t} else if ( this.expected === null && !this.assertions.length ) {\n\t\t\tthis.pushFailure( \"Expected at least one assertion, but none were run - call \" +\n\t\t\t\t\"expect(0) to accept zero assertions.\", this.stack );\n\t\t}\n\n\t\tvar i,\n\t\t\tbad = 0;\n\n\t\tthis.runtime = now() - this.started;\n\t\tconfig.stats.all += this.assertions.length;\n\t\tconfig.moduleStats.all += this.assertions.length;\n\n\t\tfor ( i = 0; i < this.assertions.length; i++ ) {\n\t\t\tif ( !this.assertions[ i ].result ) {\n\t\t\t\tbad++;\n\t\t\t\tconfig.stats.bad++;\n\t\t\t\tconfig.moduleStats.bad++;\n\t\t\t}\n\t\t}\n\n\t\trunLoggingCallbacks( \"testDone\", {\n\t\t\tname: this.testName,\n\t\t\tmodule: this.module.name,\n\t\t\tskipped: !!this.skip,\n\t\t\tfailed: bad,\n\t\t\tpassed: this.assertions.length - bad,\n\t\t\ttotal: this.assertions.length,\n\t\t\truntime: this.runtime,\n\n\t\t\t// HTML Reporter use\n\t\t\tassertions: this.assertions,\n\t\t\ttestId: this.testId,\n\n\t\t\t// Source of Test\n\t\t\tsource: this.stack,\n\n\t\t\t// DEPRECATED: this property will be removed in 2.0.0, use runtime instead\n\t\t\tduration: this.runtime\n\t\t} );\n\n\t\t// QUnit.reset() is deprecated and will be replaced for a new\n\t\t// fixture reset function on QUnit 2.0/2.1.\n\t\t// It's still called here for backwards compatibility handling\n\t\tQUnit.reset();\n\n\t\tconfig.current = undefined;\n\t},\n\n\tqueue: function() {\n\t\tvar priority,\n\t\t\ttest = this;\n\n\t\tif ( !this.valid() ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfunction run() {\n\n\t\t\t// Each of these can by async\n\t\t\tsynchronize( [\n\t\t\t\tfunction() {\n\t\t\t\t\ttest.before();\n\t\t\t\t},\n\n\t\t\t\ttest.hooks( \"beforeEach\" ),\n\t\t\t\tfunction() {\n\t\t\t\t\ttest.run();\n\t\t\t\t},\n\n\t\t\t\ttest.hooks( \"afterEach\" ).reverse(),\n\n\t\t\t\tfunction() {\n\t\t\t\t\ttest.after();\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\ttest.finish();\n\t\t\t\t}\n\t\t\t] );\n\t\t}\n\n\t\t// Prioritize previously failed tests, detected from sessionStorage\n\t\tpriority = QUnit.config.reorder && defined.sessionStorage &&\n\t\t\t\t+sessionStorage.getItem( \"qunit-test-\" + this.module.name + \"-\" + this.testName );\n\n\t\treturn synchronize( run, priority, config.seed );\n\t},\n\n\tpushResult: function( resultInfo ) {\n\n\t\t// Destructure of resultInfo = { result, actual, expected, message, negative }\n\t\tvar source,\n\t\t\tdetails = {\n\t\t\t\tmodule: this.module.name,\n\t\t\t\tname: this.testName,\n\t\t\t\tresult: resultInfo.result,\n\t\t\t\tmessage: resultInfo.message,\n\t\t\t\tactual: resultInfo.actual,\n\t\t\t\texpected: resultInfo.expected,\n\t\t\t\ttestId: this.testId,\n\t\t\t\tnegative: resultInfo.negative || false,\n\t\t\t\truntime: now() - this.started\n\t\t\t};\n\n\t\tif ( !resultInfo.result ) {\n\t\t\tsource = sourceFromStacktrace();\n\n\t\t\tif ( source ) {\n\t\t\t\tdetails.source = source;\n\t\t\t}\n\t\t}\n\n\t\trunLoggingCallbacks( \"log\", details );\n\n\t\tthis.assertions.push( {\n\t\t\tresult: !!resultInfo.result,\n\t\t\tmessage: resultInfo.message\n\t\t} );\n\t},\n\n\tpushFailure: function( message, source, actual ) {\n\t\tif ( !( this instanceof Test ) ) {\n\t\t\tthrow new Error( \"pushFailure() assertion outside test context, was \" +\n\t\t\t\tsourceFromStacktrace( 2 ) );\n\t\t}\n\n\t\tvar details = {\n\t\t\t\tmodule: this.module.name,\n\t\t\t\tname: this.testName,\n\t\t\t\tresult: false,\n\t\t\t\tmessage: message || \"error\",\n\t\t\t\tactual: actual || null,\n\t\t\t\ttestId: this.testId,\n\t\t\t\truntime: now() - this.started\n\t\t\t};\n\n\t\tif ( source ) {\n\t\t\tdetails.source = source;\n\t\t}\n\n\t\trunLoggingCallbacks( \"log\", details );\n\n\t\tthis.assertions.push( {\n\t\t\tresult: false,\n\t\t\tmessage: message\n\t\t} );\n\t},\n\n\tresolvePromise: function( promise, phase ) {\n\t\tvar then, message,\n\t\t\ttest = this;\n\t\tif ( promise != null ) {\n\t\t\tthen = promise.then;\n\t\t\tif ( QUnit.objectType( then ) === \"function\" ) {\n\t\t\t\tQUnit.stop();\n\t\t\t\tthen.call(\n\t\t\t\t\tpromise,\n\t\t\t\t\tfunction() { QUnit.start(); },\n\t\t\t\t\tfunction( error ) {\n\t\t\t\t\t\tmessage = \"Promise rejected \" +\n\t\t\t\t\t\t\t( !phase ? \"during\" : phase.replace( /Each$/, \"\" ) ) +\n\t\t\t\t\t\t\t\" \" + test.testName + \": \" + ( error.message || error );\n\t\t\t\t\t\ttest.pushFailure( message, extractStacktrace( error, 0 ) );\n\n\t\t\t\t\t\t// Else next test will carry the responsibility\n\t\t\t\t\t\tsaveGlobal();\n\n\t\t\t\t\t\t// Unblock\n\t\t\t\t\t\tQUnit.start();\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t},\n\n\tvalid: function() {\n\t\tvar filter = config.filter,\n\t\t\tregexFilter = /^(!?)\\/([\\w\\W]*)\\/(i?$)/.exec( filter ),\n\t\t\tmodule = config.module && config.module.toLowerCase(),\n\t\t\tfullName = ( this.module.name + \": \" + this.testName );\n\n\t\tfunction moduleChainNameMatch( testModule ) {\n\t\t\tvar testModuleName = testModule.name ? testModule.name.toLowerCase() : null;\n\t\t\tif ( testModuleName === module ) {\n\t\t\t\treturn true;\n\t\t\t} else if ( testModule.parentModule ) {\n\t\t\t\treturn moduleChainNameMatch( testModule.parentModule );\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfunction moduleChainIdMatch( testModule ) {\n\t\t\treturn inArray( testModule.moduleId, config.moduleId ) > -1 ||\n\t\t\t\ttestModule.parentModule && moduleChainIdMatch( testModule.parentModule );\n\t\t}\n\n\t\t// Internally-generated tests are always valid\n\t\tif ( this.callback && this.callback.validTest ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif ( config.moduleId && config.moduleId.length > 0 &&\n\t\t\t!moduleChainIdMatch( this.module ) ) {\n\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( config.testId && config.testId.length > 0 &&\n\t\t\tinArray( this.testId, config.testId ) < 0 ) {\n\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( module && !moduleChainNameMatch( this.module ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !filter ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn regexFilter ?\n\t\t\tthis.regexFilter( !!regexFilter[ 1 ], regexFilter[ 2 ], regexFilter[ 3 ], fullName ) :\n\t\t\tthis.stringFilter( filter, fullName );\n\t},\n\n\tregexFilter: function( exclude, pattern, flags, fullName ) {\n\t\tvar regex = new RegExp( pattern, flags );\n\t\tvar match = regex.test( fullName );\n\n\t\treturn match !== exclude;\n\t},\n\n\tstringFilter: function( filter, fullName ) {\n\t\tfilter = filter.toLowerCase();\n\t\tfullName = fullName.toLowerCase();\n\n\t\tvar include = filter.charAt( 0 ) !== \"!\";\n\t\tif ( !include ) {\n\t\t\tfilter = filter.slice( 1 );\n\t\t}\n\n\t\t// If the filter matches, we need to honour include\n\t\tif ( fullName.indexOf( filter ) !== -1 ) {\n\t\t\treturn include;\n\t\t}\n\n\t\t// Otherwise, do the opposite\n\t\treturn !include;\n\t}\n};\n\n// Resets the test setup. Useful for tests that modify the DOM.\n/*\nDEPRECATED: Use multiple tests instead of resetting inside a test.\nUse testStart or testDone for custom cleanup.\nThis method will throw an error in 2.0, and will be removed in 2.1\n*/\nQUnit.reset = function() {\n\n\t// Return on non-browser environments\n\t// This is necessary to not break on node tests\n\tif ( !defined.document ) {\n\t\treturn;\n\t}\n\n\tvar fixture = defined.document && document.getElementById &&\n\t\t\tdocument.getElementById( \"qunit-fixture\" );\n\n\tif ( fixture ) {\n\t\tfixture.innerHTML = config.fixture;\n\t}\n};\n\nQUnit.pushFailure = function() {\n\tif ( !QUnit.config.current ) {\n\t\tthrow new Error( \"pushFailure() assertion outside test context, in \" +\n\t\t\tsourceFromStacktrace( 2 ) );\n\t}\n\n\t// Gets current test obj\n\tvar currentTest = QUnit.config.current;\n\n\treturn currentTest.pushFailure.apply( currentTest, arguments );\n};\n\n// Based on Java's String.hashCode, a simple but not\n// rigorously collision resistant hashing function\nfunction generateHash( module, testName ) {\n\tvar hex,\n\t\ti = 0,\n\t\thash = 0,\n\t\tstr = module + \"\\x1C\" + testName,\n\t\tlen = str.length;\n\n\tfor ( ; i < len; i++ ) {\n\t\thash = ( ( hash << 5 ) - hash ) + str.charCodeAt( i );\n\t\thash |= 0;\n\t}\n\n\t// Convert the possibly negative integer hash code into an 8 character hex string, which isn't\n\t// strictly necessary but increases user understanding that the id is a SHA-like hash\n\thex = ( 0x100000000 + hash ).toString( 16 );\n\tif ( hex.length < 8 ) {\n\t\thex = \"0000000\" + hex;\n\t}\n\n\treturn hex.slice( -8 );\n}\n\nfunction synchronize( callback, priority, seed ) {\n\tvar last = !priority,\n\t\tindex;\n\n\tif ( QUnit.objectType( callback ) === \"array\" ) {\n\t\twhile ( callback.length ) {\n\t\t\tsynchronize( callback.shift() );\n\t\t}\n\t\treturn;\n\t}\n\n\tif ( priority ) {\n\t\tconfig.queue.splice( priorityCount++, 0, callback );\n\t} else if ( seed ) {\n\t\tif ( !unitSampler ) {\n\t\t\tunitSampler = unitSamplerGenerator( seed );\n\t\t}\n\n\t\t// Insert into a random position after all priority items\n\t\tindex = Math.floor( unitSampler() * ( config.queue.length - priorityCount + 1 ) );\n\t\tconfig.queue.splice( priorityCount + index, 0, callback );\n\t} else {\n\t\tconfig.queue.push( callback );\n\t}\n\n\tif ( config.autorun && !config.blocking ) {\n\t\tprocess( last );\n\t}\n}\n\nfunction unitSamplerGenerator( seed ) {\n\n\t// 32-bit xorshift, requires only a nonzero seed\n\t// http://excamera.com/sphinx/article-xorshift.html\n\tvar sample = parseInt( generateHash( seed ), 16 ) || -1;\n\treturn function() {\n\t\tsample ^= sample << 13;\n\t\tsample ^= sample >>> 17;\n\t\tsample ^= sample << 5;\n\n\t\t// ECMAScript has no unsigned number type\n\t\tif ( sample < 0 ) {\n\t\t\tsample += 0x100000000;\n\t\t}\n\n\t\treturn sample / 0x100000000;\n\t};\n}\n\nfunction saveGlobal() {\n\tconfig.pollution = [];\n\n\tif ( config.noglobals ) {\n\t\tfor ( var key in global ) {\n\t\t\tif ( hasOwn.call( global, key ) ) {\n\n\t\t\t\t// In Opera sometimes DOM element ids show up here, ignore them\n\t\t\t\tif ( /^qunit-test-output/.test( key ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconfig.pollution.push( key );\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction checkPollution() {\n\tvar newGlobals,\n\t\tdeletedGlobals,\n\t\told = config.pollution;\n\n\tsaveGlobal();\n\n\tnewGlobals = diff( config.pollution, old );\n\tif ( newGlobals.length > 0 ) {\n\t\tQUnit.pushFailure( \"Introduced global variable(s): \" + newGlobals.join( \", \" ) );\n\t}\n\n\tdeletedGlobals = diff( old, config.pollution );\n\tif ( deletedGlobals.length > 0 ) {\n\t\tQUnit.pushFailure( \"Deleted global variable(s): \" + deletedGlobals.join( \", \" ) );\n\t}\n}\n\n// Will be exposed as QUnit.asyncTest\nfunction asyncTest( testName, expected, callback ) {\n\tif ( arguments.length === 2 ) {\n\t\tcallback = expected;\n\t\texpected = null;\n\t}\n\n\tQUnit.test( testName, expected, callback, true );\n}\n\n// Will be exposed as QUnit.test\nfunction test( testName, expected, callback, async ) {\n\tif ( focused ) { return; }\n\n\tvar newTest;\n\n\tif ( arguments.length === 2 ) {\n\t\tcallback = expected;\n\t\texpected = null;\n\t}\n\n\tnewTest = new Test( {\n\t\ttestName: testName,\n\t\texpected: expected,\n\t\tasync: async,\n\t\tcallback: callback\n\t} );\n\n\tnewTest.queue();\n}\n\n// Will be exposed as QUnit.skip\nfunction skip( testName ) {\n\tif ( focused ) { return; }\n\n\tvar test = new Test( {\n\t\ttestName: testName,\n\t\tskip: true\n\t} );\n\n\ttest.queue();\n}\n\n// Will be exposed as QUnit.only\nfunction only( testName, expected, callback, async ) {\n\tvar newTest;\n\n\tif ( focused ) { return; }\n\n\tQUnit.config.queue.length = 0;\n\tfocused = true;\n\n\tif ( arguments.length === 2 ) {\n\t\tcallback = expected;\n\t\texpected = null;\n\t}\n\n\tnewTest = new Test( {\n\t\ttestName: testName,\n\t\texpected: expected,\n\t\tasync: async,\n\t\tcallback: callback\n\t} );\n\n\tnewTest.queue();\n}\n\nfunction Assert( testContext ) {\n\tthis.test = testContext;\n}\n\n// Assert helpers\nQUnit.assert = Assert.prototype = {\n\n\t// Specify the number of expected assertions to guarantee that failed test\n\t// (no assertions are run at all) don't slip through.\n\texpect: function( asserts ) {\n\t\tif ( arguments.length === 1 ) {\n\t\t\tthis.test.expected = asserts;\n\t\t} else {\n\t\t\treturn this.test.expected;\n\t\t}\n\t},\n\n\t// Increment this Test's semaphore counter, then return a function that\n\t// decrements that counter a maximum of once.\n\tasync: function( count ) {\n\t\tvar test = this.test,\n\t\t\tpopped = false,\n\t\t\tacceptCallCount = count;\n\n\t\tif ( typeof acceptCallCount === \"undefined\" ) {\n\t\t\tacceptCallCount = 1;\n\t\t}\n\n\t\ttest.semaphore += 1;\n\t\ttest.usedAsync = true;\n\t\tpauseProcessing();\n\n\t\treturn function done() {\n\n\t\t\tif ( popped ) {\n\t\t\t\ttest.pushFailure( \"Too many calls to the `assert.async` callback\",\n\t\t\t\t\tsourceFromStacktrace( 2 ) );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tacceptCallCount -= 1;\n\t\t\tif ( acceptCallCount > 0 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttest.semaphore -= 1;\n\t\t\tpopped = true;\n\t\t\tresumeProcessing();\n\t\t};\n\t},\n\n\t// Exports test.push() to the user API\n\t// Alias of pushResult.\n\tpush: function( result, actual, expected, message, negative ) {\n\t\tvar currentAssert = this instanceof Assert ? this : QUnit.config.current.assert;\n\t\treturn currentAssert.pushResult( {\n\t\t\tresult: result,\n\t\t\tactual: actual,\n\t\t\texpected: expected,\n\t\t\tmessage: message,\n\t\t\tnegative: negative\n\t\t} );\n\t},\n\n\tpushResult: function( resultInfo ) {\n\n\t\t// Destructure of resultInfo = { result, actual, expected, message, negative }\n\t\tvar assert = this,\n\t\t\tcurrentTest = ( assert instanceof Assert && assert.test ) || QUnit.config.current;\n\n\t\t// Backwards compatibility fix.\n\t\t// Allows the direct use of global exported assertions and QUnit.assert.*\n\t\t// Although, it's use is not recommended as it can leak assertions\n\t\t// to other tests from async tests, because we only get a reference to the current test,\n\t\t// not exactly the test where assertion were intended to be called.\n\t\tif ( !currentTest ) {\n\t\t\tthrow new Error( \"assertion outside test context, in \" + sourceFromStacktrace( 2 ) );\n\t\t}\n\n\t\tif ( currentTest.usedAsync === true && currentTest.semaphore === 0 ) {\n\t\t\tcurrentTest.pushFailure( \"Assertion after the final `assert.async` was resolved\",\n\t\t\t\tsourceFromStacktrace( 2 ) );\n\n\t\t\t// Allow this assertion to continue running anyway...\n\t\t}\n\n\t\tif ( !( assert instanceof Assert ) ) {\n\t\t\tassert = currentTest.assert;\n\t\t}\n\n\t\treturn assert.test.pushResult( resultInfo );\n\t},\n\n\tok: function( result, message ) {\n\t\tmessage = message || ( result ? \"okay\" : \"failed, expected argument to be truthy, was: \" +\n\t\t\tQUnit.dump.parse( result ) );\n\t\tthis.pushResult( {\n\t\t\tresult: !!result,\n\t\t\tactual: result,\n\t\t\texpected: true,\n\t\t\tmessage: message\n\t\t} );\n\t},\n\n\tnotOk: function( result, message ) {\n\t\tmessage = message || ( !result ? \"okay\" : \"failed, expected argument to be falsy, was: \" +\n\t\t\tQUnit.dump.parse( result ) );\n\t\tthis.pushResult( {\n\t\t\tresult: !result,\n\t\t\tactual: result,\n\t\t\texpected: false,\n\t\t\tmessage: message\n\t\t} );\n\t},\n\n\tequal: function( actual, expected, message ) {\n\t\t/*jshint eqeqeq:false */\n\t\tthis.pushResult( {\n\t\t\tresult: expected == actual,\n\t\t\tactual: actual,\n\t\t\texpected: expected,\n\t\t\tmessage: message\n\t\t} );\n\t},\n\n\tnotEqual: function( actual, expected, message ) {\n\t\t/*jshint eqeqeq:false */\n\t\tthis.pushResult( {\n\t\t\tresult: expected != actual,\n\t\t\tactual: actual,\n\t\t\texpected: expected,\n\t\t\tmessage: message,\n\t\t\tnegative: true\n\t\t} );\n\t},\n\n\tpropEqual: function( actual, expected, message ) {\n\t\tactual = objectValues( actual );\n\t\texpected = objectValues( expected );\n\t\tthis.pushResult( {\n\t\t\tresult: QUnit.equiv( actual, expected ),\n\t\t\tactual: actual,\n\t\t\texpected: expected,\n\t\t\tmessage: message\n\t\t} );\n\t},\n\n\tnotPropEqual: function( actual, expected, message ) {\n\t\tactual = objectValues( actual );\n\t\texpected = objectValues( expected );\n\t\tthis.pushResult( {\n\t\t\tresult: !QUnit.equiv( actual, expected ),\n\t\t\tactual: actual,\n\t\t\texpected: expected,\n\t\t\tmessage: message,\n\t\t\tnegative: true\n\t\t} );\n\t},\n\n\tdeepEqual: function( actual, expected, message ) {\n\t\tthis.pushResult( {\n\t\t\tresult: QUnit.equiv( actual, expected ),\n\t\t\tactual: actual,\n\t\t\texpected: expected,\n\t\t\tmessage: message\n\t\t} );\n\t},\n\n\tnotDeepEqual: function( actual, expected, message ) {\n\t\tthis.pushResult( {\n\t\t\tresult: !QUnit.equiv( actual, expected ),\n\t\t\tactual: actual,\n\t\t\texpected: expected,\n\t\t\tmessage: message,\n\t\t\tnegative: true\n\t\t} );\n\t},\n\n\tstrictEqual: function( actual, expected, message ) {\n\t\tthis.pushResult( {\n\t\t\tresult: expected === actual,\n\t\t\tactual: actual,\n\t\t\texpected: expected,\n\t\t\tmessage: message\n\t\t} );\n\t},\n\n\tnotStrictEqual: function( actual, expected, message ) {\n\t\tthis.pushResult( {\n\t\t\tresult: expected !== actual,\n\t\t\tactual: actual,\n\t\t\texpected: expected,\n\t\t\tmessage: message,\n\t\t\tnegative: true\n\t\t} );\n\t},\n\n\t\"throws\": function( block, expected, message ) {\n\t\tvar actual, expectedType,\n\t\t\texpectedOutput = expected,\n\t\t\tok = false,\n\t\t\tcurrentTest = ( this instanceof Assert && this.test ) || QUnit.config.current;\n\n\t\t// 'expected' is optional unless doing string comparison\n\t\tif ( message == null && typeof expected === \"string\" ) {\n\t\t\tmessage = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\tcurrentTest.ignoreGlobalErrors = true;\n\t\ttry {\n\t\t\tblock.call( currentTest.testEnvironment );\n\t\t} catch ( e ) {\n\t\t\tactual = e;\n\t\t}\n\t\tcurrentTest.ignoreGlobalErrors = false;\n\n\t\tif ( actual ) {\n\t\t\texpectedType = QUnit.objectType( expected );\n\n\t\t\t// We don't want to validate thrown error\n\t\t\tif ( !expected ) {\n\t\t\t\tok = true;\n\t\t\t\texpectedOutput = null;\n\n\t\t\t// Expected is a regexp\n\t\t\t} else if ( expectedType === \"regexp\" ) {\n\t\t\t\tok = expected.test( errorString( actual ) );\n\n\t\t\t// Expected is a string\n\t\t\t} else if ( expectedType === \"string\" ) {\n\t\t\t\tok = expected === errorString( actual );\n\n\t\t\t// Expected is a constructor, maybe an Error constructor\n\t\t\t} else if ( expectedType === \"function\" && actual instanceof expected ) {\n\t\t\t\tok = true;\n\n\t\t\t// Expected is an Error object\n\t\t\t} else if ( expectedType === \"object\" ) {\n\t\t\t\tok = actual instanceof expected.constructor &&\n\t\t\t\t\tactual.name === expected.name &&\n\t\t\t\t\tactual.message === expected.message;\n\n\t\t\t// Expected is a validation function which returns true if validation passed\n\t\t\t} else if ( expectedType === \"function\" && expected.call( {}, actual ) === true ) {\n\t\t\t\texpectedOutput = null;\n\t\t\t\tok = true;\n\t\t\t}\n\t\t}\n\n\t\tcurrentTest.assert.pushResult( {\n\t\t\tresult: ok,\n\t\t\tactual: actual,\n\t\t\texpected: expectedOutput,\n\t\t\tmessage: message\n\t\t} );\n\t}\n};\n\n// Provide an alternative to assert.throws(), for environments that consider throws a reserved word\n// Known to us are: Closure Compiler, Narwhal\n( function() {\n\t/*jshint sub:true */\n\tAssert.prototype.raises = Assert.prototype [ \"throws\" ]; //jscs:ignore requireDotNotation\n}() );\n\nfunction errorString( error ) {\n\tvar name, message,\n\t\tresultErrorString = error.toString();\n\tif ( resultErrorString.substring( 0, 7 ) === \"[object\" ) {\n\t\tname = error.name ? error.name.toString() : \"Error\";\n\t\tmessage = error.message ? error.message.toString() : \"\";\n\t\tif ( name && message ) {\n\t\t\treturn name + \": \" + message;\n\t\t} else if ( name ) {\n\t\t\treturn name;\n\t\t} else if ( message ) {\n\t\t\treturn message;\n\t\t} else {\n\t\t\treturn \"Error\";\n\t\t}\n\t} else {\n\t\treturn resultErrorString;\n\t}\n}\n\n// Test for equality any JavaScript type.\n// Author: Philippe Rathé \nQUnit.equiv = ( function() {\n\n\t// Stack to decide between skip/abort functions\n\tvar callers = [];\n\n\t// Stack to avoiding loops from circular referencing\n\tvar parents = [];\n\tvar parentsB = [];\n\n\tvar getProto = Object.getPrototypeOf || function( obj ) {\n\n\t\t/*jshint proto: true */\n\t\treturn obj.__proto__;\n\t};\n\n\tfunction useStrictEquality( b, a ) {\n\n\t\t// To catch short annotation VS 'new' annotation of a declaration. e.g.:\n\t\t// `var i = 1;`\n\t\t// `var j = new Number(1);`\n\t\tif ( typeof a === \"object\" ) {\n\t\t\ta = a.valueOf();\n\t\t}\n\t\tif ( typeof b === \"object\" ) {\n\t\t\tb = b.valueOf();\n\t\t}\n\n\t\treturn a === b;\n\t}\n\n\tfunction compareConstructors( a, b ) {\n\t\tvar protoA = getProto( a );\n\t\tvar protoB = getProto( b );\n\n\t\t// Comparing constructors is more strict than using `instanceof`\n\t\tif ( a.constructor === b.constructor ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Ref #851\n\t\t// If the obj prototype descends from a null constructor, treat it\n\t\t// as a null prototype.\n\t\tif ( protoA && protoA.constructor === null ) {\n\t\t\tprotoA = null;\n\t\t}\n\t\tif ( protoB && protoB.constructor === null ) {\n\t\t\tprotoB = null;\n\t\t}\n\n\t\t// Allow objects with no prototype to be equivalent to\n\t\t// objects with Object as their constructor.\n\t\tif ( ( protoA === null && protoB === Object.prototype ) ||\n\t\t\t\t( protoB === null && protoA === Object.prototype ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfunction getRegExpFlags( regexp ) {\n\t\treturn \"flags\" in regexp ? regexp.flags : regexp.toString().match( /[gimuy]*$/ )[ 0 ];\n\t}\n\n\tvar callbacks = {\n\t\t\"string\": useStrictEquality,\n\t\t\"boolean\": useStrictEquality,\n\t\t\"number\": useStrictEquality,\n\t\t\"null\": useStrictEquality,\n\t\t\"undefined\": useStrictEquality,\n\t\t\"symbol\": useStrictEquality,\n\t\t\"date\": useStrictEquality,\n\n\t\t\"nan\": function() {\n\t\t\treturn true;\n\t\t},\n\n\t\t\"regexp\": function( b, a ) {\n\t\t\treturn a.source === b.source &&\n\n\t\t\t\t// Include flags in the comparison\n\t\t\t\tgetRegExpFlags( a ) === getRegExpFlags( b );\n\t\t},\n\n\t\t// - skip when the property is a method of an instance (OOP)\n\t\t// - abort otherwise,\n\t\t// initial === would have catch identical references anyway\n\t\t\"function\": function() {\n\t\t\tvar caller = callers[ callers.length - 1 ];\n\t\t\treturn caller !== Object && typeof caller !== \"undefined\";\n\t\t},\n\n\t\t\"array\": function( b, a ) {\n\t\t\tvar i, j, len, loop, aCircular, bCircular;\n\n\t\t\tlen = a.length;\n\t\t\tif ( len !== b.length ) {\n\n\t\t\t\t// Safe and faster\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Track reference to avoid circular references\n\t\t\tparents.push( a );\n\t\t\tparentsB.push( b );\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tloop = false;\n\t\t\t\tfor ( j = 0; j < parents.length; j++ ) {\n\t\t\t\t\taCircular = parents[ j ] === a[ i ];\n\t\t\t\t\tbCircular = parentsB[ j ] === b[ i ];\n\t\t\t\t\tif ( aCircular || bCircular ) {\n\t\t\t\t\t\tif ( a[ i ] === b[ i ] || aCircular && bCircular ) {\n\t\t\t\t\t\t\tloop = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tparents.pop();\n\t\t\t\t\t\t\tparentsB.pop();\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {\n\t\t\t\t\tparents.pop();\n\t\t\t\t\tparentsB.pop();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tparents.pop();\n\t\t\tparentsB.pop();\n\t\t\treturn true;\n\t\t},\n\n\t\t\"set\": function( b, a ) {\n\t\t\tvar innerEq,\n\t\t\t\touterEq = true;\n\n\t\t\tif ( a.size !== b.size ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\ta.forEach( function( aVal ) {\n\t\t\t\tinnerEq = false;\n\n\t\t\t\tb.forEach( function( bVal ) {\n\t\t\t\t\tif ( innerEquiv( bVal, aVal ) ) {\n\t\t\t\t\t\tinnerEq = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tif ( !innerEq ) {\n\t\t\t\t\touterEq = false;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\treturn outerEq;\n\t\t},\n\n\t\t\"map\": function( b, a ) {\n\t\t\tvar innerEq,\n\t\t\t\touterEq = true;\n\n\t\t\tif ( a.size !== b.size ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\ta.forEach( function( aVal, aKey ) {\n\t\t\t\tinnerEq = false;\n\n\t\t\t\tb.forEach( function( bVal, bKey ) {\n\t\t\t\t\tif ( innerEquiv( [ bVal, bKey ], [ aVal, aKey ] ) ) {\n\t\t\t\t\t\tinnerEq = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tif ( !innerEq ) {\n\t\t\t\t\touterEq = false;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\treturn outerEq;\n\t\t},\n\n\t\t\"object\": function( b, a ) {\n\t\t\tvar i, j, loop, aCircular, bCircular;\n\n\t\t\t// Default to true\n\t\t\tvar eq = true;\n\t\t\tvar aProperties = [];\n\t\t\tvar bProperties = [];\n\n\t\t\tif ( compareConstructors( a, b ) === false ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Stack constructor before traversing properties\n\t\t\tcallers.push( a.constructor );\n\n\t\t\t// Track reference to avoid circular references\n\t\t\tparents.push( a );\n\t\t\tparentsB.push( b );\n\n\t\t\t// Be strict: don't ensure hasOwnProperty and go deep\n\t\t\tfor ( i in a ) {\n\t\t\t\tloop = false;\n\t\t\t\tfor ( j = 0; j < parents.length; j++ ) {\n\t\t\t\t\taCircular = parents[ j ] === a[ i ];\n\t\t\t\t\tbCircular = parentsB[ j ] === b[ i ];\n\t\t\t\t\tif ( aCircular || bCircular ) {\n\t\t\t\t\t\tif ( a[ i ] === b[ i ] || aCircular && bCircular ) {\n\t\t\t\t\t\t\tloop = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\teq = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\taProperties.push( i );\n\t\t\t\tif ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {\n\t\t\t\t\teq = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tparents.pop();\n\t\t\tparentsB.pop();\n\n\t\t\t// Unstack, we are done\n\t\t\tcallers.pop();\n\n\t\t\tfor ( i in b ) {\n\n\t\t\t\t// Collect b's properties\n\t\t\t\tbProperties.push( i );\n\t\t\t}\n\n\t\t\t// Ensures identical properties name\n\t\t\treturn eq && innerEquiv( aProperties.sort(), bProperties.sort() );\n\t\t}\n\t};\n\n\tfunction typeEquiv( a, b ) {\n\t\tvar type = QUnit.objectType( a );\n\t\treturn QUnit.objectType( b ) === type && callbacks[ type ]( b, a );\n\t}\n\n\t// The real equiv function\n\tfunction innerEquiv( a, b ) {\n\n\t\t// We're done when there's nothing more to compare\n\t\tif ( arguments.length < 2 ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Require type-specific equality\n\t\treturn ( a === b || typeEquiv( a, b ) ) &&\n\n\t\t\t// ...across all consecutive argument pairs\n\t\t\t( arguments.length === 2 || innerEquiv.apply( this, [].slice.call( arguments, 1 ) ) );\n\t}\n\n\treturn innerEquiv;\n}() );\n\n// Based on jsDump by Ariel Flesler\n// http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html\nQUnit.dump = ( function() {\n\tfunction quote( str ) {\n\t\treturn \"\\\"\" + str.toString().replace( /\\\\/g, \"\\\\\\\\\" ).replace( /\"/g, \"\\\\\\\"\" ) + \"\\\"\";\n\t}\n\tfunction literal( o ) {\n\t\treturn o + \"\";\n\t}\n\tfunction join( pre, arr, post ) {\n\t\tvar s = dump.separator(),\n\t\t\tbase = dump.indent(),\n\t\t\tinner = dump.indent( 1 );\n\t\tif ( arr.join ) {\n\t\t\tarr = arr.join( \",\" + s + inner );\n\t\t}\n\t\tif ( !arr ) {\n\t\t\treturn pre + post;\n\t\t}\n\t\treturn [ pre, inner + arr, base + post ].join( s );\n\t}\n\tfunction array( arr, stack ) {\n\t\tvar i = arr.length,\n\t\t\tret = new Array( i );\n\n\t\tif ( dump.maxDepth && dump.depth > dump.maxDepth ) {\n\t\t\treturn \"[object Array]\";\n\t\t}\n\n\t\tthis.up();\n\t\twhile ( i-- ) {\n\t\t\tret[ i ] = this.parse( arr[ i ], undefined, stack );\n\t\t}\n\t\tthis.down();\n\t\treturn join( \"[\", ret, \"]\" );\n\t}\n\n\tvar reName = /^function (\\w+)/,\n\t\tdump = {\n\n\t\t\t// The objType is used mostly internally, you can fix a (custom) type in advance\n\t\t\tparse: function( obj, objType, stack ) {\n\t\t\t\tstack = stack || [];\n\t\t\t\tvar res, parser, parserType,\n\t\t\t\t\tinStack = inArray( obj, stack );\n\n\t\t\t\tif ( inStack !== -1 ) {\n\t\t\t\t\treturn \"recursion(\" + ( inStack - stack.length ) + \")\";\n\t\t\t\t}\n\n\t\t\t\tobjType = objType || this.typeOf( obj );\n\t\t\t\tparser = this.parsers[ objType ];\n\t\t\t\tparserType = typeof parser;\n\n\t\t\t\tif ( parserType === \"function\" ) {\n\t\t\t\t\tstack.push( obj );\n\t\t\t\t\tres = parser.call( this, obj, stack );\n\t\t\t\t\tstack.pop();\n\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t\treturn ( parserType === \"string\" ) ? parser : this.parsers.error;\n\t\t\t},\n\t\t\ttypeOf: function( obj ) {\n\t\t\t\tvar type;\n\t\t\t\tif ( obj === null ) {\n\t\t\t\t\ttype = \"null\";\n\t\t\t\t} else if ( typeof obj === \"undefined\" ) {\n\t\t\t\t\ttype = \"undefined\";\n\t\t\t\t} else if ( QUnit.is( \"regexp\", obj ) ) {\n\t\t\t\t\ttype = \"regexp\";\n\t\t\t\t} else if ( QUnit.is( \"date\", obj ) ) {\n\t\t\t\t\ttype = \"date\";\n\t\t\t\t} else if ( QUnit.is( \"function\", obj ) ) {\n\t\t\t\t\ttype = \"function\";\n\t\t\t\t} else if ( obj.setInterval !== undefined &&\n\t\t\t\t\t\tobj.document !== undefined &&\n\t\t\t\t\t\tobj.nodeType === undefined ) {\n\t\t\t\t\ttype = \"window\";\n\t\t\t\t} else if ( obj.nodeType === 9 ) {\n\t\t\t\t\ttype = \"document\";\n\t\t\t\t} else if ( obj.nodeType ) {\n\t\t\t\t\ttype = \"node\";\n\t\t\t\t} else if (\n\n\t\t\t\t\t// Native arrays\n\t\t\t\t\ttoString.call( obj ) === \"[object Array]\" ||\n\n\t\t\t\t\t// NodeList objects\n\t\t\t\t\t( typeof obj.length === \"number\" && obj.item !== undefined &&\n\t\t\t\t\t( obj.length ? obj.item( 0 ) === obj[ 0 ] : ( obj.item( 0 ) === null &&\n\t\t\t\t\tobj[ 0 ] === undefined ) ) )\n\t\t\t\t) {\n\t\t\t\t\ttype = \"array\";\n\t\t\t\t} else if ( obj.constructor === Error.prototype.constructor ) {\n\t\t\t\t\ttype = \"error\";\n\t\t\t\t} else {\n\t\t\t\t\ttype = typeof obj;\n\t\t\t\t}\n\t\t\t\treturn type;\n\t\t\t},\n\n\t\t\tseparator: function() {\n\t\t\t\treturn this.multiline ? this.HTML ? \" \" : \"\\n\" : this.HTML ? \" \" : \" \";\n\t\t\t},\n\n\t\t\t// Extra can be a number, shortcut for increasing-calling-decreasing\n\t\t\tindent: function( extra ) {\n\t\t\t\tif ( !this.multiline ) {\n\t\t\t\t\treturn \"\";\n\t\t\t\t}\n\t\t\t\tvar chr = this.indentChar;\n\t\t\t\tif ( this.HTML ) {\n\t\t\t\t\tchr = chr.replace( /\\t/g, \" \" ).replace( / /g, \" \" );\n\t\t\t\t}\n\t\t\t\treturn new Array( this.depth + ( extra || 0 ) ).join( chr );\n\t\t\t},\n\t\t\tup: function( a ) {\n\t\t\t\tthis.depth += a || 1;\n\t\t\t},\n\t\t\tdown: function( a ) {\n\t\t\t\tthis.depth -= a || 1;\n\t\t\t},\n\t\t\tsetParser: function( name, parser ) {\n\t\t\t\tthis.parsers[ name ] = parser;\n\t\t\t},\n\n\t\t\t// The next 3 are exposed so you can use them\n\t\t\tquote: quote,\n\t\t\tliteral: literal,\n\t\t\tjoin: join,\n\t\t\tdepth: 1,\n\t\t\tmaxDepth: QUnit.config.maxDepth,\n\n\t\t\t// This is the list of parsers, to modify them, use dump.setParser\n\t\t\tparsers: {\n\t\t\t\twindow: \"[Window]\",\n\t\t\t\tdocument: \"[Document]\",\n\t\t\t\terror: function( error ) {\n\t\t\t\t\treturn \"Error(\\\"\" + error.message + \"\\\")\";\n\t\t\t\t},\n\t\t\t\tunknown: \"[Unknown]\",\n\t\t\t\t\"null\": \"null\",\n\t\t\t\t\"undefined\": \"undefined\",\n\t\t\t\t\"function\": function( fn ) {\n\t\t\t\t\tvar ret = \"function\",\n\n\t\t\t\t\t\t// Functions never have name in IE\n\t\t\t\t\t\tname = \"name\" in fn ? fn.name : ( reName.exec( fn ) || [] )[ 1 ];\n\n\t\t\t\t\tif ( name ) {\n\t\t\t\t\t\tret += \" \" + name;\n\t\t\t\t\t}\n\t\t\t\t\tret += \"(\";\n\n\t\t\t\t\tret = [ ret, dump.parse( fn, \"functionArgs\" ), \"){\" ].join( \"\" );\n\t\t\t\t\treturn join( ret, dump.parse( fn, \"functionCode\" ), \"}\" );\n\t\t\t\t},\n\t\t\t\tarray: array,\n\t\t\t\tnodelist: array,\n\t\t\t\t\"arguments\": array,\n\t\t\t\tobject: function( map, stack ) {\n\t\t\t\t\tvar keys, key, val, i, nonEnumerableProperties,\n\t\t\t\t\t\tret = [];\n\n\t\t\t\t\tif ( dump.maxDepth && dump.depth > dump.maxDepth ) {\n\t\t\t\t\t\treturn \"[object Object]\";\n\t\t\t\t\t}\n\n\t\t\t\t\tdump.up();\n\t\t\t\t\tkeys = [];\n\t\t\t\t\tfor ( key in map ) {\n\t\t\t\t\t\tkeys.push( key );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Some properties are not always enumerable on Error objects.\n\t\t\t\t\tnonEnumerableProperties = [ \"message\", \"name\" ];\n\t\t\t\t\tfor ( i in nonEnumerableProperties ) {\n\t\t\t\t\t\tkey = nonEnumerableProperties[ i ];\n\t\t\t\t\t\tif ( key in map && inArray( key, keys ) < 0 ) {\n\t\t\t\t\t\t\tkeys.push( key );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tkeys.sort();\n\t\t\t\t\tfor ( i = 0; i < keys.length; i++ ) {\n\t\t\t\t\t\tkey = keys[ i ];\n\t\t\t\t\t\tval = map[ key ];\n\t\t\t\t\t\tret.push( dump.parse( key, \"key\" ) + \": \" +\n\t\t\t\t\t\t\tdump.parse( val, undefined, stack ) );\n\t\t\t\t\t}\n\t\t\t\t\tdump.down();\n\t\t\t\t\treturn join( \"{\", ret, \"}\" );\n\t\t\t\t},\n\t\t\t\tnode: function( node ) {\n\t\t\t\t\tvar len, i, val,\n\t\t\t\t\t\topen = dump.HTML ? \"<\" : \"<\",\n\t\t\t\t\t\tclose = dump.HTML ? \">\" : \">\",\n\t\t\t\t\t\ttag = node.nodeName.toLowerCase(),\n\t\t\t\t\t\tret = open + tag,\n\t\t\t\t\t\tattrs = node.attributes;\n\n\t\t\t\t\tif ( attrs ) {\n\t\t\t\t\t\tfor ( i = 0, len = attrs.length; i < len; i++ ) {\n\t\t\t\t\t\t\tval = attrs[ i ].nodeValue;\n\n\t\t\t\t\t\t\t// IE6 includes all attributes in .attributes, even ones not explicitly\n\t\t\t\t\t\t\t// set. Those have values like undefined, null, 0, false, \"\" or\n\t\t\t\t\t\t\t// \"inherit\".\n\t\t\t\t\t\t\tif ( val && val !== \"inherit\" ) {\n\t\t\t\t\t\t\t\tret += \" \" + attrs[ i ].nodeName + \"=\" +\n\t\t\t\t\t\t\t\t\tdump.parse( val, \"attribute\" );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tret += close;\n\n\t\t\t\t\t// Show content of TextNode or CDATASection\n\t\t\t\t\tif ( node.nodeType === 3 || node.nodeType === 4 ) {\n\t\t\t\t\t\tret += node.nodeValue;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ret + open + \"/\" + tag + close;\n\t\t\t\t},\n\n\t\t\t\t// Function calls it internally, it's the arguments part of the function\n\t\t\t\tfunctionArgs: function( fn ) {\n\t\t\t\t\tvar args,\n\t\t\t\t\t\tl = fn.length;\n\n\t\t\t\t\tif ( !l ) {\n\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t}\n\n\t\t\t\t\targs = new Array( l );\n\t\t\t\t\twhile ( l-- ) {\n\n\t\t\t\t\t\t// 97 is 'a'\n\t\t\t\t\t\targs[ l ] = String.fromCharCode( 97 + l );\n\t\t\t\t\t}\n\t\t\t\t\treturn \" \" + args.join( \", \" ) + \" \";\n\t\t\t\t},\n\n\t\t\t\t// Object calls it internally, the key part of an item in a map\n\t\t\t\tkey: quote,\n\n\t\t\t\t// Function calls it internally, it's the content of the function\n\t\t\t\tfunctionCode: \"[code]\",\n\n\t\t\t\t// Node calls it internally, it's a html attribute value\n\t\t\t\tattribute: quote,\n\t\t\t\tstring: quote,\n\t\t\t\tdate: quote,\n\t\t\t\tregexp: literal,\n\t\t\t\tnumber: literal,\n\t\t\t\t\"boolean\": literal\n\t\t\t},\n\n\t\t\t// If true, entities are escaped ( <, >, \\t, space and \\n )\n\t\t\tHTML: false,\n\n\t\t\t// Indentation unit\n\t\t\tindentChar: \" \",\n\n\t\t\t// If true, items in a collection, are separated by a \\n, else just a space.\n\t\t\tmultiline: true\n\t\t};\n\n\treturn dump;\n}() );\n\n// Back compat\nQUnit.jsDump = QUnit.dump;\n\n// Deprecated\n// Extend assert methods to QUnit for Backwards compatibility\n( function() {\n\tvar i,\n\t\tassertions = Assert.prototype;\n\n\tfunction applyCurrent( current ) {\n\t\treturn function() {\n\t\t\tvar assert = new Assert( QUnit.config.current );\n\t\t\tcurrent.apply( assert, arguments );\n\t\t};\n\t}\n\n\tfor ( i in assertions ) {\n\t\tQUnit[ i ] = applyCurrent( assertions[ i ] );\n\t}\n}() );\n\n// For browser, export only select globals\nif ( defined.document ) {\n\n\t( function() {\n\t\tvar i, l,\n\t\t\tkeys = [\n\t\t\t\t\"test\",\n\t\t\t\t\"module\",\n\t\t\t\t\"expect\",\n\t\t\t\t\"asyncTest\",\n\t\t\t\t\"start\",\n\t\t\t\t\"stop\",\n\t\t\t\t\"ok\",\n\t\t\t\t\"notOk\",\n\t\t\t\t\"equal\",\n\t\t\t\t\"notEqual\",\n\t\t\t\t\"propEqual\",\n\t\t\t\t\"notPropEqual\",\n\t\t\t\t\"deepEqual\",\n\t\t\t\t\"notDeepEqual\",\n\t\t\t\t\"strictEqual\",\n\t\t\t\t\"notStrictEqual\",\n\t\t\t\t\"throws\",\n\t\t\t\t\"raises\"\n\t\t\t];\n\n\t\tfor ( i = 0, l = keys.length; i < l; i++ ) {\n\t\t\twindow[ keys[ i ] ] = QUnit[ keys[ i ] ];\n\t\t}\n\t}() );\n\n\twindow.QUnit = QUnit;\n}\n\n// For nodejs\nif ( typeof module !== \"undefined\" && module && module.exports ) {\n\tmodule.exports = QUnit;\n\n\t// For consistency with CommonJS environments' exports\n\tmodule.exports.QUnit = QUnit;\n}\n\n// For CommonJS with exports, but without module.exports, like Rhino\nif ( typeof exports !== \"undefined\" && exports ) {\n\texports.QUnit = QUnit;\n}\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( function() {\n\t\treturn QUnit;\n\t} );\n\tQUnit.config.autostart = false;\n}\n\n// Get a reference to the global object, like window in browsers\n}( ( function() {\n\treturn this;\n}() ) ) );\n\n( function() {\n\n// Only interact with URLs via window.location\nvar location = typeof window !== \"undefined\" && window.location;\nif ( !location ) {\n\treturn;\n}\n\nvar urlParams = getUrlParams();\n\nQUnit.urlParams = urlParams;\n\n// Match module/test by inclusion in an array\nQUnit.config.moduleId = [].concat( urlParams.moduleId || [] );\nQUnit.config.testId = [].concat( urlParams.testId || [] );\n\n// Exact case-insensitive match of the module name\nQUnit.config.module = urlParams.module;\n\n// Regular expression or case-insenstive substring match against \"moduleName: testName\"\nQUnit.config.filter = urlParams.filter;\n\n// Test order randomization\nif ( urlParams.seed === true ) {\n\n\t// Generate a random seed if the option is specified without a value\n\tQUnit.config.seed = Math.random().toString( 36 ).slice( 2 );\n} else if ( urlParams.seed ) {\n\tQUnit.config.seed = urlParams.seed;\n}\n\n// Add URL-parameter-mapped config values with UI form rendering data\nQUnit.config.urlConfig.push(\n\t{\n\t\tid: \"hidepassed\",\n\t\tlabel: \"Hide passed tests\",\n\t\ttooltip: \"Only show tests and assertions that fail. Stored as query-strings.\"\n\t},\n\t{\n\t\tid: \"noglobals\",\n\t\tlabel: \"Check for Globals\",\n\t\ttooltip: \"Enabling this will test if any test introduces new properties on the \" +\n\t\t\t\"global object (`window` in Browsers). Stored as query-strings.\"\n\t},\n\t{\n\t\tid: \"notrycatch\",\n\t\tlabel: \"No try-catch\",\n\t\ttooltip: \"Enabling this will run tests outside of a try-catch block. Makes debugging \" +\n\t\t\t\"exceptions in IE reasonable. Stored as query-strings.\"\n\t}\n);\n\nQUnit.begin( function() {\n\tvar i, option,\n\t\turlConfig = QUnit.config.urlConfig;\n\n\tfor ( i = 0; i < urlConfig.length; i++ ) {\n\n\t\t// Options can be either strings or objects with nonempty \"id\" properties\n\t\toption = QUnit.config.urlConfig[ i ];\n\t\tif ( typeof option !== \"string\" ) {\n\t\t\toption = option.id;\n\t\t}\n\n\t\tif ( QUnit.config[ option ] === undefined ) {\n\t\t\tQUnit.config[ option ] = urlParams[ option ];\n\t\t}\n\t}\n} );\n\nfunction getUrlParams() {\n\tvar i, param, name, value;\n\tvar urlParams = {};\n\tvar params = location.search.slice( 1 ).split( \"&\" );\n\tvar length = params.length;\n\n\tfor ( i = 0; i < length; i++ ) {\n\t\tif ( params[ i ] ) {\n\t\t\tparam = params[ i ].split( \"=\" );\n\t\t\tname = decodeURIComponent( param[ 0 ] );\n\n\t\t\t// Allow just a key to turn on a flag, e.g., test.html?noglobals\n\t\t\tvalue = param.length === 1 ||\n\t\t\t\tdecodeURIComponent( param.slice( 1 ).join( \"=\" ) ) ;\n\t\t\tif ( urlParams[ name ] ) {\n\t\t\t\turlParams[ name ] = [].concat( urlParams[ name ], value );\n\t\t\t} else {\n\t\t\t\turlParams[ name ] = value;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn urlParams;\n}\n\n// Don't load the HTML Reporter on non-browser environments\nif ( typeof window === \"undefined\" || !window.document ) {\n\treturn;\n}\n\n// Deprecated QUnit.init - Ref #530\n// Re-initialize the configuration options\nQUnit.init = function() {\n\tvar config = QUnit.config;\n\n\tconfig.stats = { all: 0, bad: 0 };\n\tconfig.moduleStats = { all: 0, bad: 0 };\n\tconfig.started = 0;\n\tconfig.updateRate = 1000;\n\tconfig.blocking = false;\n\tconfig.autostart = true;\n\tconfig.autorun = false;\n\tconfig.filter = \"\";\n\tconfig.queue = [];\n\n\tappendInterface();\n};\n\nvar config = QUnit.config,\n\tdocument = window.document,\n\tcollapseNext = false,\n\thasOwn = Object.prototype.hasOwnProperty,\n\tunfilteredUrl = setUrl( { filter: undefined, module: undefined,\n\t\tmoduleId: undefined, testId: undefined } ),\n\tdefined = {\n\t\tsessionStorage: ( function() {\n\t\t\tvar x = \"qunit-test-string\";\n\t\t\ttry {\n\t\t\t\tsessionStorage.setItem( x, x );\n\t\t\t\tsessionStorage.removeItem( x );\n\t\t\t\treturn true;\n\t\t\t} catch ( e ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}() )\n\t},\n\tmodulesList = [];\n\n/**\n* Escape text for attribute or text content.\n*/\nfunction escapeText( s ) {\n\tif ( !s ) {\n\t\treturn \"\";\n\t}\n\ts = s + \"\";\n\n\t// Both single quotes and double quotes (for attributes)\n\treturn s.replace( /['\"<>&]/g, function( s ) {\n\t\tswitch ( s ) {\n\t\tcase \"'\":\n\t\t\treturn \"'\";\n\t\tcase \"\\\"\":\n\t\t\treturn \""\";\n\t\tcase \"<\":\n\t\t\treturn \"<\";\n\t\tcase \">\":\n\t\t\treturn \">\";\n\t\tcase \"&\":\n\t\t\treturn \"&\";\n\t\t}\n\t} );\n}\n\n/**\n * @param {HTMLElement} elem\n * @param {string} type\n * @param {Function} fn\n */\nfunction addEvent( elem, type, fn ) {\n\tif ( elem.addEventListener ) {\n\n\t\t// Standards-based browsers\n\t\telem.addEventListener( type, fn, false );\n\t} else if ( elem.attachEvent ) {\n\n\t\t// Support: IE <9\n\t\telem.attachEvent( \"on\" + type, function() {\n\t\t\tvar event = window.event;\n\t\t\tif ( !event.target ) {\n\t\t\t\tevent.target = event.srcElement || document;\n\t\t\t}\n\n\t\t\tfn.call( elem, event );\n\t\t} );\n\t}\n}\n\n/**\n * @param {Array|NodeList} elems\n * @param {string} type\n * @param {Function} fn\n */\nfunction addEvents( elems, type, fn ) {\n\tvar i = elems.length;\n\twhile ( i-- ) {\n\t\taddEvent( elems[ i ], type, fn );\n\t}\n}\n\nfunction hasClass( elem, name ) {\n\treturn ( \" \" + elem.className + \" \" ).indexOf( \" \" + name + \" \" ) >= 0;\n}\n\nfunction addClass( elem, name ) {\n\tif ( !hasClass( elem, name ) ) {\n\t\telem.className += ( elem.className ? \" \" : \"\" ) + name;\n\t}\n}\n\nfunction toggleClass( elem, name, force ) {\n\tif ( force || typeof force === \"undefined\" && !hasClass( elem, name ) ) {\n\t\taddClass( elem, name );\n\t} else {\n\t\tremoveClass( elem, name );\n\t}\n}\n\nfunction removeClass( elem, name ) {\n\tvar set = \" \" + elem.className + \" \";\n\n\t// Class name may appear multiple times\n\twhile ( set.indexOf( \" \" + name + \" \" ) >= 0 ) {\n\t\tset = set.replace( \" \" + name + \" \", \" \" );\n\t}\n\n\t// Trim for prettiness\n\telem.className = typeof set.trim === \"function\" ? set.trim() : set.replace( /^\\s+|\\s+$/g, \"\" );\n}\n\nfunction id( name ) {\n\treturn document.getElementById && document.getElementById( name );\n}\n\nfunction getUrlConfigHtml() {\n\tvar i, j, val,\n\t\tescaped, escapedTooltip,\n\t\tselection = false,\n\t\turlConfig = config.urlConfig,\n\t\turlConfigHtml = \"\";\n\n\tfor ( i = 0; i < urlConfig.length; i++ ) {\n\n\t\t// Options can be either strings or objects with nonempty \"id\" properties\n\t\tval = config.urlConfig[ i ];\n\t\tif ( typeof val === \"string\" ) {\n\t\t\tval = {\n\t\t\t\tid: val,\n\t\t\t\tlabel: val\n\t\t\t};\n\t\t}\n\n\t\tescaped = escapeText( val.id );\n\t\tescapedTooltip = escapeText( val.tooltip );\n\n\t\tif ( !val.value || typeof val.value === \"string\" ) {\n\t\t\turlConfigHtml += \"\" + val.label + \" \";\n\t\t} else {\n\t\t\turlConfigHtml += \"\" + val.label +\n\t\t\t\t\": \";\n\n\t\t\tif ( QUnit.is( \"array\", val.value ) ) {\n\t\t\t\tfor ( j = 0; j < val.value.length; j++ ) {\n\t\t\t\t\tescaped = escapeText( val.value[ j ] );\n\t\t\t\t\turlConfigHtml += \"\" + escaped + \" \";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( j in val.value ) {\n\t\t\t\t\tif ( hasOwn.call( val.value, j ) ) {\n\t\t\t\t\t\turlConfigHtml += \"\" + escapeText( val.value[ j ] ) + \" \";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( config[ val.id ] && !selection ) {\n\t\t\t\tescaped = escapeText( config[ val.id ] );\n\t\t\t\turlConfigHtml += \"\" + escaped + \" \";\n\t\t\t}\n\t\t\turlConfigHtml += \" \";\n\t\t}\n\t}\n\n\treturn urlConfigHtml;\n}\n\n// Handle \"click\" events on toolbar checkboxes and \"change\" for select menus.\n// Updates the URL with the new state of `config.urlConfig` values.\nfunction toolbarChanged() {\n\tvar updatedUrl, value, tests,\n\t\tfield = this,\n\t\tparams = {};\n\n\t// Detect if field is a select menu or a checkbox\n\tif ( \"selectedIndex\" in field ) {\n\t\tvalue = field.options[ field.selectedIndex ].value || undefined;\n\t} else {\n\t\tvalue = field.checked ? ( field.defaultValue || true ) : undefined;\n\t}\n\n\tparams[ field.name ] = value;\n\tupdatedUrl = setUrl( params );\n\n\t// Check if we can apply the change without a page refresh\n\tif ( \"hidepassed\" === field.name && \"replaceState\" in window.history ) {\n\t\tQUnit.urlParams[ field.name ] = value;\n\t\tconfig[ field.name ] = value || false;\n\t\ttests = id( \"qunit-tests\" );\n\t\tif ( tests ) {\n\t\t\ttoggleClass( tests, \"hidepass\", value || false );\n\t\t}\n\t\twindow.history.replaceState( null, \"\", updatedUrl );\n\t} else {\n\t\twindow.location = updatedUrl;\n\t}\n}\n\nfunction setUrl( params ) {\n\tvar key, arrValue, i,\n\t\tquerystring = \"?\",\n\t\tlocation = window.location;\n\n\tparams = QUnit.extend( QUnit.extend( {}, QUnit.urlParams ), params );\n\n\tfor ( key in params ) {\n\n\t\t// Skip inherited or undefined properties\n\t\tif ( hasOwn.call( params, key ) && params[ key ] !== undefined ) {\n\n\t\t\t// Output a parameter for each value of this key (but usually just one)\n\t\t\tarrValue = [].concat( params[ key ] );\n\t\t\tfor ( i = 0; i < arrValue.length; i++ ) {\n\t\t\t\tquerystring += encodeURIComponent( key );\n\t\t\t\tif ( arrValue[ i ] !== true ) {\n\t\t\t\t\tquerystring += \"=\" + encodeURIComponent( arrValue[ i ] );\n\t\t\t\t}\n\t\t\t\tquerystring += \"&\";\n\t\t\t}\n\t\t}\n\t}\n\treturn location.protocol + \"//\" + location.host +\n\t\tlocation.pathname + querystring.slice( 0, -1 );\n}\n\nfunction applyUrlParams() {\n\tvar selectedModule,\n\t\tmodulesList = id( \"qunit-modulefilter\" ),\n\t\tfilter = id( \"qunit-filter-input\" ).value;\n\n\tselectedModule = modulesList ?\n\t\tdecodeURIComponent( modulesList.options[ modulesList.selectedIndex ].value ) :\n\t\tundefined;\n\n\twindow.location = setUrl( {\n\t\tmodule: ( selectedModule === \"\" ) ? undefined : selectedModule,\n\t\tfilter: ( filter === \"\" ) ? undefined : filter,\n\n\t\t// Remove moduleId and testId filters\n\t\tmoduleId: undefined,\n\t\ttestId: undefined\n\t} );\n}\n\nfunction toolbarUrlConfigContainer() {\n\tvar urlConfigContainer = document.createElement( \"span\" );\n\n\turlConfigContainer.innerHTML = getUrlConfigHtml();\n\taddClass( urlConfigContainer, \"qunit-url-config\" );\n\n\t// For oldIE support:\n\t// * Add handlers to the individual elements instead of the container\n\t// * Use \"click\" instead of \"change\" for checkboxes\n\taddEvents( urlConfigContainer.getElementsByTagName( \"input\" ), \"click\", toolbarChanged );\n\taddEvents( urlConfigContainer.getElementsByTagName( \"select\" ), \"change\", toolbarChanged );\n\n\treturn urlConfigContainer;\n}\n\nfunction toolbarLooseFilter() {\n\tvar filter = document.createElement( \"form\" ),\n\t\tlabel = document.createElement( \"label\" ),\n\t\tinput = document.createElement( \"input\" ),\n\t\tbutton = document.createElement( \"button\" );\n\n\taddClass( filter, \"qunit-filter\" );\n\n\tlabel.innerHTML = \"Filter: \";\n\n\tinput.type = \"text\";\n\tinput.value = config.filter || \"\";\n\tinput.name = \"filter\";\n\tinput.id = \"qunit-filter-input\";\n\n\tbutton.innerHTML = \"Go\";\n\n\tlabel.appendChild( input );\n\n\tfilter.appendChild( label );\n\tfilter.appendChild( button );\n\taddEvent( filter, \"submit\", function( ev ) {\n\t\tapplyUrlParams();\n\n\t\tif ( ev && ev.preventDefault ) {\n\t\t\tev.preventDefault();\n\t\t}\n\n\t\treturn false;\n\t} );\n\n\treturn filter;\n}\n\nfunction toolbarModuleFilterHtml() {\n\tvar i,\n\t\tmoduleFilterHtml = \"\";\n\n\tif ( !modulesList.length ) {\n\t\treturn false;\n\t}\n\n\tmoduleFilterHtml += \"Module: \" +\n\t\t\"< All Modules > \";\n\n\tfor ( i = 0; i < modulesList.length; i++ ) {\n\t\tmoduleFilterHtml += \"\" + escapeText( modulesList[ i ] ) + \" \";\n\t}\n\tmoduleFilterHtml += \" \";\n\n\treturn moduleFilterHtml;\n}\n\nfunction toolbarModuleFilter() {\n\tvar toolbar = id( \"qunit-testrunner-toolbar\" ),\n\t\tmoduleFilter = document.createElement( \"span\" ),\n\t\tmoduleFilterHtml = toolbarModuleFilterHtml();\n\n\tif ( !toolbar || !moduleFilterHtml ) {\n\t\treturn false;\n\t}\n\n\tmoduleFilter.setAttribute( \"id\", \"qunit-modulefilter-container\" );\n\tmoduleFilter.innerHTML = moduleFilterHtml;\n\n\taddEvent( moduleFilter.lastChild, \"change\", applyUrlParams );\n\n\ttoolbar.appendChild( moduleFilter );\n}\n\nfunction appendToolbar() {\n\tvar toolbar = id( \"qunit-testrunner-toolbar\" );\n\n\tif ( toolbar ) {\n\t\ttoolbar.appendChild( toolbarUrlConfigContainer() );\n\t\ttoolbar.appendChild( toolbarLooseFilter() );\n\t\ttoolbarModuleFilter();\n\t}\n}\n\nfunction appendHeader() {\n\tvar header = id( \"qunit-header\" );\n\n\tif ( header ) {\n\t\theader.innerHTML = \"\" + header.innerHTML +\n\t\t\t\" \";\n\t}\n}\n\nfunction appendBanner() {\n\tvar banner = id( \"qunit-banner\" );\n\n\tif ( banner ) {\n\t\tbanner.className = \"\";\n\t}\n}\n\nfunction appendTestResults() {\n\tvar tests = id( \"qunit-tests\" ),\n\t\tresult = id( \"qunit-testresult\" );\n\n\tif ( result ) {\n\t\tresult.parentNode.removeChild( result );\n\t}\n\n\tif ( tests ) {\n\t\ttests.innerHTML = \"\";\n\t\tresult = document.createElement( \"p\" );\n\t\tresult.id = \"qunit-testresult\";\n\t\tresult.className = \"result\";\n\t\ttests.parentNode.insertBefore( result, tests );\n\t\tresult.innerHTML = \"Running... \";\n\t}\n}\n\nfunction storeFixture() {\n\tvar fixture = id( \"qunit-fixture\" );\n\tif ( fixture ) {\n\t\tconfig.fixture = fixture.innerHTML;\n\t}\n}\n\nfunction appendFilteredTest() {\n\tvar testId = QUnit.config.testId;\n\tif ( !testId || testId.length <= 0 ) {\n\t\treturn \"\";\n\t}\n\treturn \"Rerunning selected tests: \" +\n\t\tescapeText( testId.join( \", \" ) ) +\n\t\t\"
Run all tests \";\n}\n\nfunction appendUserAgent() {\n\tvar userAgent = id( \"qunit-userAgent\" );\n\n\tif ( userAgent ) {\n\t\tuserAgent.innerHTML = \"\";\n\t\tuserAgent.appendChild(\n\t\t\tdocument.createTextNode(\n\t\t\t\t\"QUnit \" + QUnit.version + \"; \" + navigator.userAgent\n\t\t\t)\n\t\t);\n\t}\n}\n\nfunction appendInterface() {\n\tvar qunit = id( \"qunit\" );\n\n\tif ( qunit ) {\n\t\tqunit.innerHTML =\n\t\t\t\"\" +\n\t\t\t\" \" +\n\t\t\t\"
\" +\n\t\t\tappendFilteredTest() +\n\t\t\t\" \" +\n\t\t\t\" \";\n\t}\n\n\tappendHeader();\n\tappendBanner();\n\tappendTestResults();\n\tappendUserAgent();\n\tappendToolbar();\n}\n\nfunction appendTestsList( modules ) {\n\tvar i, l, x, z, test, moduleObj;\n\n\tfor ( i = 0, l = modules.length; i < l; i++ ) {\n\t\tmoduleObj = modules[ i ];\n\n\t\tfor ( x = 0, z = moduleObj.tests.length; x < z; x++ ) {\n\t\t\ttest = moduleObj.tests[ x ];\n\n\t\t\tappendTest( test.name, test.testId, moduleObj.name );\n\t\t}\n\t}\n}\n\nfunction appendTest( name, testId, moduleName ) {\n\tvar title, rerunTrigger, testBlock, assertList,\n\t\ttests = id( \"qunit-tests\" );\n\n\tif ( !tests ) {\n\t\treturn;\n\t}\n\n\ttitle = document.createElement( \"strong\" );\n\ttitle.innerHTML = getNameHtml( name, moduleName );\n\n\trerunTrigger = document.createElement( \"a\" );\n\trerunTrigger.innerHTML = \"Rerun\";\n\trerunTrigger.href = setUrl( { testId: testId } );\n\n\ttestBlock = document.createElement( \"li\" );\n\ttestBlock.appendChild( title );\n\ttestBlock.appendChild( rerunTrigger );\n\ttestBlock.id = \"qunit-test-output-\" + testId;\n\n\tassertList = document.createElement( \"ol\" );\n\tassertList.className = \"qunit-assert-list\";\n\n\ttestBlock.appendChild( assertList );\n\n\ttests.appendChild( testBlock );\n}\n\n// HTML Reporter initialization and load\nQUnit.begin( function( details ) {\n\tvar i, moduleObj, tests;\n\n\t// Sort modules by name for the picker\n\tfor ( i = 0; i < details.modules.length; i++ ) {\n\t\tmoduleObj = details.modules[ i ];\n\t\tif ( moduleObj.name ) {\n\t\t\tmodulesList.push( moduleObj.name );\n\t\t}\n\t}\n\tmodulesList.sort( function( a, b ) {\n\t\treturn a.localeCompare( b );\n\t} );\n\n\t// Capture fixture HTML from the page\n\tstoreFixture();\n\n\t// Initialize QUnit elements\n\tappendInterface();\n\tappendTestsList( details.modules );\n\ttests = id( \"qunit-tests\" );\n\tif ( tests && config.hidepassed ) {\n\t\taddClass( tests, \"hidepass\" );\n\t}\n} );\n\nQUnit.done( function( details ) {\n\tvar i, key,\n\t\tbanner = id( \"qunit-banner\" ),\n\t\ttests = id( \"qunit-tests\" ),\n\t\thtml = [\n\t\t\t\"Tests completed in \",\n\t\t\tdetails.runtime,\n\t\t\t\" milliseconds. \",\n\t\t\t\"\",\n\t\t\tdetails.passed,\n\t\t\t\" assertions of \",\n\t\t\tdetails.total,\n\t\t\t\" passed, \",\n\t\t\tdetails.failed,\n\t\t\t\" failed.\"\n\t\t].join( \"\" );\n\n\tif ( banner ) {\n\t\tbanner.className = details.failed ? \"qunit-fail\" : \"qunit-pass\";\n\t}\n\n\tif ( tests ) {\n\t\tid( \"qunit-testresult\" ).innerHTML = html;\n\t}\n\n\tif ( config.altertitle && document.title ) {\n\n\t\t// Show ✖ for good, ✔ for bad suite result in title\n\t\t// use escape sequences in case file gets loaded with non-utf-8-charset\n\t\tdocument.title = [\n\t\t\t( details.failed ? \"\\u2716\" : \"\\u2714\" ),\n\t\t\tdocument.title.replace( /^[\\u2714\\u2716] /i, \"\" )\n\t\t].join( \" \" );\n\t}\n\n\t// Clear own sessionStorage items if all tests passed\n\tif ( config.reorder && defined.sessionStorage && details.failed === 0 ) {\n\t\tfor ( i = 0; i < sessionStorage.length; i++ ) {\n\t\t\tkey = sessionStorage.key( i++ );\n\t\t\tif ( key.indexOf( \"qunit-test-\" ) === 0 ) {\n\t\t\t\tsessionStorage.removeItem( key );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Scroll back to top to show results\n\tif ( config.scrolltop && window.scrollTo ) {\n\t\twindow.scrollTo( 0, 0 );\n\t}\n} );\n\nfunction getNameHtml( name, module ) {\n\tvar nameHtml = \"\";\n\n\tif ( module ) {\n\t\tnameHtml = \"\" + escapeText( module ) + \" : \";\n\t}\n\n\tnameHtml += \"\" + escapeText( name ) + \" \";\n\n\treturn nameHtml;\n}\n\nQUnit.testStart( function( details ) {\n\tvar running, testBlock, bad;\n\n\ttestBlock = id( \"qunit-test-output-\" + details.testId );\n\tif ( testBlock ) {\n\t\ttestBlock.className = \"running\";\n\t} else {\n\n\t\t// Report later registered tests\n\t\tappendTest( details.name, details.testId, details.module );\n\t}\n\n\trunning = id( \"qunit-testresult\" );\n\tif ( running ) {\n\t\tbad = QUnit.config.reorder && defined.sessionStorage &&\n\t\t\t+sessionStorage.getItem( \"qunit-test-\" + details.module + \"-\" + details.name );\n\n\t\trunning.innerHTML = ( bad ?\n\t\t\t\"Rerunning previously failed test: \" :\n\t\t\t\"Running: \" ) +\n\t\t\tgetNameHtml( details.name, details.module );\n\t}\n\n} );\n\nfunction stripHtml( string ) {\n\n\t// Strip tags, html entity and whitespaces\n\treturn string.replace( /<\\/?[^>]+(>|$)/g, \"\" ).replace( /\\"/g, \"\" ).replace( /\\s+/g, \"\" );\n}\n\nQUnit.log( function( details ) {\n\tvar assertList, assertLi,\n\t\tmessage, expected, actual, diff,\n\t\tshowDiff = false,\n\t\ttestItem = id( \"qunit-test-output-\" + details.testId );\n\n\tif ( !testItem ) {\n\t\treturn;\n\t}\n\n\tmessage = escapeText( details.message ) || ( details.result ? \"okay\" : \"failed\" );\n\tmessage = \"\" + message + \" \";\n\tmessage += \"@ \" + details.runtime + \" ms \";\n\n\t// The pushFailure doesn't provide details.expected\n\t// when it calls, it's implicit to also not show expected and diff stuff\n\t// Also, we need to check details.expected existence, as it can exist and be undefined\n\tif ( !details.result && hasOwn.call( details, \"expected\" ) ) {\n\t\tif ( details.negative ) {\n\t\t\texpected = \"NOT \" + QUnit.dump.parse( details.expected );\n\t\t} else {\n\t\t\texpected = QUnit.dump.parse( details.expected );\n\t\t}\n\n\t\tactual = QUnit.dump.parse( details.actual );\n\t\tmessage += \"Expected: \" +\n\t\t\tescapeText( expected ) +\n\t\t\t\" \";\n\n\t\tif ( actual !== expected ) {\n\n\t\t\tmessage += \"Result: \" +\n\t\t\t\tescapeText( actual ) + \" \";\n\n\t\t\t// Don't show diff if actual or expected are booleans\n\t\t\tif ( !( /^(true|false)$/.test( actual ) ) &&\n\t\t\t\t\t!( /^(true|false)$/.test( expected ) ) ) {\n\t\t\t\tdiff = QUnit.diff( expected, actual );\n\t\t\t\tshowDiff = stripHtml( diff ).length !==\n\t\t\t\t\tstripHtml( expected ).length +\n\t\t\t\t\tstripHtml( actual ).length;\n\t\t\t}\n\n\t\t\t// Don't show diff if expected and actual are totally different\n\t\t\tif ( showDiff ) {\n\t\t\t\tmessage += \"Diff: \" +\n\t\t\t\t\tdiff + \" \";\n\t\t\t}\n\t\t} else if ( expected.indexOf( \"[object Array]\" ) !== -1 ||\n\t\t\t\texpected.indexOf( \"[object Object]\" ) !== -1 ) {\n\t\t\tmessage += \"Message: \" +\n\t\t\t\t\"Diff suppressed as the depth of object is more than current max depth (\" +\n\t\t\t\tQUnit.config.maxDepth + \").Hint: Use QUnit.dump.maxDepth
to \" +\n\t\t\t\t\" run with a higher max depth or \" +\n\t\t\t\t\"Rerun without max depth.
\";\n\t\t} else {\n\t\t\tmessage += \"Message: \" +\n\t\t\t\t\"Diff suppressed as the expected and actual results have an equivalent\" +\n\t\t\t\t\" serialization \";\n\t\t}\n\n\t\tif ( details.source ) {\n\t\t\tmessage += \"Source: \" +\n\t\t\t\tescapeText( details.source ) + \" \";\n\t\t}\n\n\t\tmessage += \"
\";\n\n\t// This occurs when pushFailure is set and we have an extracted stack trace\n\t} else if ( !details.result && details.source ) {\n\t\tmessage += \"\" +\n\t\t\t\"Source: \" +\n\t\t\tescapeText( details.source ) + \" \" +\n\t\t\t\"
\";\n\t}\n\n\tassertList = testItem.getElementsByTagName( \"ol\" )[ 0 ];\n\n\tassertLi = document.createElement( \"li\" );\n\tassertLi.className = details.result ? \"pass\" : \"fail\";\n\tassertLi.innerHTML = message;\n\tassertList.appendChild( assertLi );\n} );\n\nQUnit.testDone( function( details ) {\n\tvar testTitle, time, testItem, assertList,\n\t\tgood, bad, testCounts, skipped, sourceName,\n\t\ttests = id( \"qunit-tests\" );\n\n\tif ( !tests ) {\n\t\treturn;\n\t}\n\n\ttestItem = id( \"qunit-test-output-\" + details.testId );\n\n\tassertList = testItem.getElementsByTagName( \"ol\" )[ 0 ];\n\n\tgood = details.passed;\n\tbad = details.failed;\n\n\t// Store result when possible\n\tif ( config.reorder && defined.sessionStorage ) {\n\t\tif ( bad ) {\n\t\t\tsessionStorage.setItem( \"qunit-test-\" + details.module + \"-\" + details.name, bad );\n\t\t} else {\n\t\t\tsessionStorage.removeItem( \"qunit-test-\" + details.module + \"-\" + details.name );\n\t\t}\n\t}\n\n\tif ( bad === 0 ) {\n\n\t\t// Collapse the passing tests\n\t\taddClass( assertList, \"qunit-collapsed\" );\n\t} else if ( bad && config.collapse && !collapseNext ) {\n\n\t\t// Skip collapsing the first failing test\n\t\tcollapseNext = true;\n\t} else {\n\n\t\t// Collapse remaining tests\n\t\taddClass( assertList, \"qunit-collapsed\" );\n\t}\n\n\t// The testItem.firstChild is the test name\n\ttestTitle = testItem.firstChild;\n\n\ttestCounts = bad ?\n\t\t\"\" + bad + \" , \" + \"\" + good + \" , \" :\n\t\t\"\";\n\n\ttestTitle.innerHTML += \" (\" + testCounts +\n\t\tdetails.assertions.length + \") \";\n\n\tif ( details.skipped ) {\n\t\ttestItem.className = \"skipped\";\n\t\tskipped = document.createElement( \"em\" );\n\t\tskipped.className = \"qunit-skipped-label\";\n\t\tskipped.innerHTML = \"skipped\";\n\t\ttestItem.insertBefore( skipped, testTitle );\n\t} else {\n\t\taddEvent( testTitle, \"click\", function() {\n\t\t\ttoggleClass( assertList, \"qunit-collapsed\" );\n\t\t} );\n\n\t\ttestItem.className = bad ? \"fail\" : \"pass\";\n\n\t\ttime = document.createElement( \"span\" );\n\t\ttime.className = \"runtime\";\n\t\ttime.innerHTML = details.runtime + \" ms\";\n\t\ttestItem.insertBefore( time, assertList );\n\t}\n\n\t// Show the source of the test when showing assertions\n\tif ( details.source ) {\n\t\tsourceName = document.createElement( \"p\" );\n\t\tsourceName.innerHTML = \"Source: \" + details.source;\n\t\taddClass( sourceName, \"qunit-source\" );\n\t\tif ( bad === 0 ) {\n\t\t\taddClass( sourceName, \"qunit-collapsed\" );\n\t\t}\n\t\taddEvent( testTitle, \"click\", function() {\n\t\t\ttoggleClass( sourceName, \"qunit-collapsed\" );\n\t\t} );\n\t\ttestItem.appendChild( sourceName );\n\t}\n} );\n\n// Avoid readyState issue with phantomjs\n// Ref: #818\nvar notPhantom = ( function( p ) {\n\treturn !( p && p.version && p.version.major > 0 );\n} )( window.phantom );\n\nif ( notPhantom && document.readyState === \"complete\" ) {\n\tQUnit.load();\n} else {\n\taddEvent( window, \"load\", QUnit.load );\n}\n\n/*\n * This file is a modified version of google-diff-match-patch's JavaScript implementation\n * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),\n * modifications are licensed as more fully set forth in LICENSE.txt.\n *\n * The original source of google-diff-match-patch is attributable and licensed as follows:\n *\n * Copyright 2006 Google Inc.\n * https://code.google.com/p/google-diff-match-patch/\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * More Info:\n * https://code.google.com/p/google-diff-match-patch/\n *\n * Usage: QUnit.diff(expected, actual)\n *\n */\nQUnit.diff = ( function() {\n\tfunction DiffMatchPatch() {\n\t}\n\n\t// DIFF FUNCTIONS\n\n\t/**\n\t * The data structure representing a diff is an array of tuples:\n\t * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n\t * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n\t */\n\tvar DIFF_DELETE = -1,\n\t\tDIFF_INSERT = 1,\n\t\tDIFF_EQUAL = 0;\n\n\t/**\n\t * Find the differences between two texts. Simplifies the problem by stripping\n\t * any common prefix or suffix off the texts before diffing.\n\t * @param {string} text1 Old string to be diffed.\n\t * @param {string} text2 New string to be diffed.\n\t * @param {boolean=} optChecklines Optional speedup flag. If present and false,\n\t * then don't run a line-level diff first to identify the changed areas.\n\t * Defaults to true, which does a faster, slightly less optimal diff.\n\t * @return {!Array.} Array of diff tuples.\n\t */\n\tDiffMatchPatch.prototype.DiffMain = function( text1, text2, optChecklines ) {\n\t\tvar deadline, checklines, commonlength,\n\t\t\tcommonprefix, commonsuffix, diffs;\n\n\t\t// The diff must be complete in up to 1 second.\n\t\tdeadline = ( new Date() ).getTime() + 1000;\n\n\t\t// Check for null inputs.\n\t\tif ( text1 === null || text2 === null ) {\n\t\t\tthrow new Error( \"Null input. (DiffMain)\" );\n\t\t}\n\n\t\t// Check for equality (speedup).\n\t\tif ( text1 === text2 ) {\n\t\t\tif ( text1 ) {\n\t\t\t\treturn [\n\t\t\t\t\t[ DIFF_EQUAL, text1 ]\n\t\t\t\t];\n\t\t\t}\n\t\t\treturn [];\n\t\t}\n\n\t\tif ( typeof optChecklines === \"undefined\" ) {\n\t\t\toptChecklines = true;\n\t\t}\n\n\t\tchecklines = optChecklines;\n\n\t\t// Trim off common prefix (speedup).\n\t\tcommonlength = this.diffCommonPrefix( text1, text2 );\n\t\tcommonprefix = text1.substring( 0, commonlength );\n\t\ttext1 = text1.substring( commonlength );\n\t\ttext2 = text2.substring( commonlength );\n\n\t\t// Trim off common suffix (speedup).\n\t\tcommonlength = this.diffCommonSuffix( text1, text2 );\n\t\tcommonsuffix = text1.substring( text1.length - commonlength );\n\t\ttext1 = text1.substring( 0, text1.length - commonlength );\n\t\ttext2 = text2.substring( 0, text2.length - commonlength );\n\n\t\t// Compute the diff on the middle block.\n\t\tdiffs = this.diffCompute( text1, text2, checklines, deadline );\n\n\t\t// Restore the prefix and suffix.\n\t\tif ( commonprefix ) {\n\t\t\tdiffs.unshift( [ DIFF_EQUAL, commonprefix ] );\n\t\t}\n\t\tif ( commonsuffix ) {\n\t\t\tdiffs.push( [ DIFF_EQUAL, commonsuffix ] );\n\t\t}\n\t\tthis.diffCleanupMerge( diffs );\n\t\treturn diffs;\n\t};\n\n\t/**\n\t * Reduce the number of edits by eliminating operationally trivial equalities.\n\t * @param {!Array.} diffs Array of diff tuples.\n\t */\n\tDiffMatchPatch.prototype.diffCleanupEfficiency = function( diffs ) {\n\t\tvar changes, equalities, equalitiesLength, lastequality,\n\t\t\tpointer, preIns, preDel, postIns, postDel;\n\t\tchanges = false;\n\t\tequalities = []; // Stack of indices where equalities are found.\n\t\tequalitiesLength = 0; // Keeping our own length var is faster in JS.\n\t\t/** @type {?string} */\n\t\tlastequality = null;\n\n\t\t// Always equal to diffs[equalities[equalitiesLength - 1]][1]\n\t\tpointer = 0; // Index of current position.\n\n\t\t// Is there an insertion operation before the last equality.\n\t\tpreIns = false;\n\n\t\t// Is there a deletion operation before the last equality.\n\t\tpreDel = false;\n\n\t\t// Is there an insertion operation after the last equality.\n\t\tpostIns = false;\n\n\t\t// Is there a deletion operation after the last equality.\n\t\tpostDel = false;\n\t\twhile ( pointer < diffs.length ) {\n\n\t\t\t// Equality found.\n\t\t\tif ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) {\n\t\t\t\tif ( diffs[ pointer ][ 1 ].length < 4 && ( postIns || postDel ) ) {\n\n\t\t\t\t\t// Candidate found.\n\t\t\t\t\tequalities[ equalitiesLength++ ] = pointer;\n\t\t\t\t\tpreIns = postIns;\n\t\t\t\t\tpreDel = postDel;\n\t\t\t\t\tlastequality = diffs[ pointer ][ 1 ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// Not a candidate, and can never become one.\n\t\t\t\t\tequalitiesLength = 0;\n\t\t\t\t\tlastequality = null;\n\t\t\t\t}\n\t\t\t\tpostIns = postDel = false;\n\n\t\t\t// An insertion or deletion.\n\t\t\t} else {\n\n\t\t\t\tif ( diffs[ pointer ][ 0 ] === DIFF_DELETE ) {\n\t\t\t\t\tpostDel = true;\n\t\t\t\t} else {\n\t\t\t\t\tpostIns = true;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * Five types to be split:\n\t\t\t\t * A BXYC D\n\t\t\t\t * A XC D\n\t\t\t\t * A BXC \n\t\t\t\t * AXC D\n\t\t\t\t * A BXC\n\t\t\t\t */\n\t\t\t\tif ( lastequality && ( ( preIns && preDel && postIns && postDel ) ||\n\t\t\t\t\t\t( ( lastequality.length < 2 ) &&\n\t\t\t\t\t\t( preIns + preDel + postIns + postDel ) === 3 ) ) ) {\n\n\t\t\t\t\t// Duplicate record.\n\t\t\t\t\tdiffs.splice(\n\t\t\t\t\t\tequalities[ equalitiesLength - 1 ],\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t[ DIFF_DELETE, lastequality ]\n\t\t\t\t\t);\n\n\t\t\t\t\t// Change second copy to insert.\n\t\t\t\t\tdiffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;\n\t\t\t\t\tequalitiesLength--; // Throw away the equality we just deleted;\n\t\t\t\t\tlastequality = null;\n\t\t\t\t\tif ( preIns && preDel ) {\n\n\t\t\t\t\t\t// No changes made which could affect previous entry, keep going.\n\t\t\t\t\t\tpostIns = postDel = true;\n\t\t\t\t\t\tequalitiesLength = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tequalitiesLength--; // Throw away the previous equality.\n\t\t\t\t\t\tpointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;\n\t\t\t\t\t\tpostIns = postDel = false;\n\t\t\t\t\t}\n\t\t\t\t\tchanges = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpointer++;\n\t\t}\n\n\t\tif ( changes ) {\n\t\t\tthis.diffCleanupMerge( diffs );\n\t\t}\n\t};\n\n\t/**\n\t * Convert a diff array into a pretty HTML report.\n\t * @param {!Array.} diffs Array of diff tuples.\n\t * @param {integer} string to be beautified.\n\t * @return {string} HTML representation.\n\t */\n\tDiffMatchPatch.prototype.diffPrettyHtml = function( diffs ) {\n\t\tvar op, data, x,\n\t\t\thtml = [];\n\t\tfor ( x = 0; x < diffs.length; x++ ) {\n\t\t\top = diffs[ x ][ 0 ]; // Operation (insert, delete, equal)\n\t\t\tdata = diffs[ x ][ 1 ]; // Text of change.\n\t\t\tswitch ( op ) {\n\t\t\tcase DIFF_INSERT:\n\t\t\t\thtml[ x ] = \"\" + escapeText( data ) + \" \";\n\t\t\t\tbreak;\n\t\t\tcase DIFF_DELETE:\n\t\t\t\thtml[ x ] = \"\" + escapeText( data ) + \"\";\n\t\t\t\tbreak;\n\t\t\tcase DIFF_EQUAL:\n\t\t\t\thtml[ x ] = \"\" + escapeText( data ) + \" \";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn html.join( \"\" );\n\t};\n\n\t/**\n\t * Determine the common prefix of two strings.\n\t * @param {string} text1 First string.\n\t * @param {string} text2 Second string.\n\t * @return {number} The number of characters common to the start of each\n\t * string.\n\t */\n\tDiffMatchPatch.prototype.diffCommonPrefix = function( text1, text2 ) {\n\t\tvar pointermid, pointermax, pointermin, pointerstart;\n\n\t\t// Quick check for common null cases.\n\t\tif ( !text1 || !text2 || text1.charAt( 0 ) !== text2.charAt( 0 ) ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Binary search.\n\t\t// Performance analysis: https://neil.fraser.name/news/2007/10/09/\n\t\tpointermin = 0;\n\t\tpointermax = Math.min( text1.length, text2.length );\n\t\tpointermid = pointermax;\n\t\tpointerstart = 0;\n\t\twhile ( pointermin < pointermid ) {\n\t\t\tif ( text1.substring( pointerstart, pointermid ) ===\n\t\t\t\t\ttext2.substring( pointerstart, pointermid ) ) {\n\t\t\t\tpointermin = pointermid;\n\t\t\t\tpointerstart = pointermin;\n\t\t\t} else {\n\t\t\t\tpointermax = pointermid;\n\t\t\t}\n\t\t\tpointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );\n\t\t}\n\t\treturn pointermid;\n\t};\n\n\t/**\n\t * Determine the common suffix of two strings.\n\t * @param {string} text1 First string.\n\t * @param {string} text2 Second string.\n\t * @return {number} The number of characters common to the end of each string.\n\t */\n\tDiffMatchPatch.prototype.diffCommonSuffix = function( text1, text2 ) {\n\t\tvar pointermid, pointermax, pointermin, pointerend;\n\n\t\t// Quick check for common null cases.\n\t\tif ( !text1 ||\n\t\t\t\t!text2 ||\n\t\t\t\ttext1.charAt( text1.length - 1 ) !== text2.charAt( text2.length - 1 ) ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Binary search.\n\t\t// Performance analysis: https://neil.fraser.name/news/2007/10/09/\n\t\tpointermin = 0;\n\t\tpointermax = Math.min( text1.length, text2.length );\n\t\tpointermid = pointermax;\n\t\tpointerend = 0;\n\t\twhile ( pointermin < pointermid ) {\n\t\t\tif ( text1.substring( text1.length - pointermid, text1.length - pointerend ) ===\n\t\t\t\t\ttext2.substring( text2.length - pointermid, text2.length - pointerend ) ) {\n\t\t\t\tpointermin = pointermid;\n\t\t\t\tpointerend = pointermin;\n\t\t\t} else {\n\t\t\t\tpointermax = pointermid;\n\t\t\t}\n\t\t\tpointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );\n\t\t}\n\t\treturn pointermid;\n\t};\n\n\t/**\n\t * Find the differences between two texts. Assumes that the texts do not\n\t * have any common prefix or suffix.\n\t * @param {string} text1 Old string to be diffed.\n\t * @param {string} text2 New string to be diffed.\n\t * @param {boolean} checklines Speedup flag. If false, then don't run a\n\t * line-level diff first to identify the changed areas.\n\t * If true, then run a faster, slightly less optimal diff.\n\t * @param {number} deadline Time when the diff should be complete by.\n\t * @return {!Array.} Array of diff tuples.\n\t * @private\n\t */\n\tDiffMatchPatch.prototype.diffCompute = function( text1, text2, checklines, deadline ) {\n\t\tvar diffs, longtext, shorttext, i, hm,\n\t\t\ttext1A, text2A, text1B, text2B,\n\t\t\tmidCommon, diffsA, diffsB;\n\n\t\tif ( !text1 ) {\n\n\t\t\t// Just add some text (speedup).\n\t\t\treturn [\n\t\t\t\t[ DIFF_INSERT, text2 ]\n\t\t\t];\n\t\t}\n\n\t\tif ( !text2 ) {\n\n\t\t\t// Just delete some text (speedup).\n\t\t\treturn [\n\t\t\t\t[ DIFF_DELETE, text1 ]\n\t\t\t];\n\t\t}\n\n\t\tlongtext = text1.length > text2.length ? text1 : text2;\n\t\tshorttext = text1.length > text2.length ? text2 : text1;\n\t\ti = longtext.indexOf( shorttext );\n\t\tif ( i !== -1 ) {\n\n\t\t\t// Shorter text is inside the longer text (speedup).\n\t\t\tdiffs = [\n\t\t\t\t[ DIFF_INSERT, longtext.substring( 0, i ) ],\n\t\t\t\t[ DIFF_EQUAL, shorttext ],\n\t\t\t\t[ DIFF_INSERT, longtext.substring( i + shorttext.length ) ]\n\t\t\t];\n\n\t\t\t// Swap insertions for deletions if diff is reversed.\n\t\t\tif ( text1.length > text2.length ) {\n\t\t\t\tdiffs[ 0 ][ 0 ] = diffs[ 2 ][ 0 ] = DIFF_DELETE;\n\t\t\t}\n\t\t\treturn diffs;\n\t\t}\n\n\t\tif ( shorttext.length === 1 ) {\n\n\t\t\t// Single character string.\n\t\t\t// After the previous speedup, the character can't be an equality.\n\t\t\treturn [\n\t\t\t\t[ DIFF_DELETE, text1 ],\n\t\t\t\t[ DIFF_INSERT, text2 ]\n\t\t\t];\n\t\t}\n\n\t\t// Check to see if the problem can be split in two.\n\t\thm = this.diffHalfMatch( text1, text2 );\n\t\tif ( hm ) {\n\n\t\t\t// A half-match was found, sort out the return data.\n\t\t\ttext1A = hm[ 0 ];\n\t\t\ttext1B = hm[ 1 ];\n\t\t\ttext2A = hm[ 2 ];\n\t\t\ttext2B = hm[ 3 ];\n\t\t\tmidCommon = hm[ 4 ];\n\n\t\t\t// Send both pairs off for separate processing.\n\t\t\tdiffsA = this.DiffMain( text1A, text2A, checklines, deadline );\n\t\t\tdiffsB = this.DiffMain( text1B, text2B, checklines, deadline );\n\n\t\t\t// Merge the results.\n\t\t\treturn diffsA.concat( [\n\t\t\t\t[ DIFF_EQUAL, midCommon ]\n\t\t\t], diffsB );\n\t\t}\n\n\t\tif ( checklines && text1.length > 100 && text2.length > 100 ) {\n\t\t\treturn this.diffLineMode( text1, text2, deadline );\n\t\t}\n\n\t\treturn this.diffBisect( text1, text2, deadline );\n\t};\n\n\t/**\n\t * Do the two texts share a substring which is at least half the length of the\n\t * longer text?\n\t * This speedup can produce non-minimal diffs.\n\t * @param {string} text1 First string.\n\t * @param {string} text2 Second string.\n\t * @return {Array.} Five element Array, containing the prefix of\n\t * text1, the suffix of text1, the prefix of text2, the suffix of\n\t * text2 and the common middle. Or null if there was no match.\n\t * @private\n\t */\n\tDiffMatchPatch.prototype.diffHalfMatch = function( text1, text2 ) {\n\t\tvar longtext, shorttext, dmp,\n\t\t\ttext1A, text2B, text2A, text1B, midCommon,\n\t\t\thm1, hm2, hm;\n\n\t\tlongtext = text1.length > text2.length ? text1 : text2;\n\t\tshorttext = text1.length > text2.length ? text2 : text1;\n\t\tif ( longtext.length < 4 || shorttext.length * 2 < longtext.length ) {\n\t\t\treturn null; // Pointless.\n\t\t}\n\t\tdmp = this; // 'this' becomes 'window' in a closure.\n\n\t\t/**\n\t\t * Does a substring of shorttext exist within longtext such that the substring\n\t\t * is at least half the length of longtext?\n\t\t * Closure, but does not reference any external variables.\n\t\t * @param {string} longtext Longer string.\n\t\t * @param {string} shorttext Shorter string.\n\t\t * @param {number} i Start index of quarter length substring within longtext.\n\t\t * @return {Array.} Five element Array, containing the prefix of\n\t\t * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n\t\t * of shorttext and the common middle. Or null if there was no match.\n\t\t * @private\n\t\t */\n\t\tfunction diffHalfMatchI( longtext, shorttext, i ) {\n\t\t\tvar seed, j, bestCommon, prefixLength, suffixLength,\n\t\t\t\tbestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;\n\n\t\t\t// Start with a 1/4 length substring at position i as a seed.\n\t\t\tseed = longtext.substring( i, i + Math.floor( longtext.length / 4 ) );\n\t\t\tj = -1;\n\t\t\tbestCommon = \"\";\n\t\t\twhile ( ( j = shorttext.indexOf( seed, j + 1 ) ) !== -1 ) {\n\t\t\t\tprefixLength = dmp.diffCommonPrefix( longtext.substring( i ),\n\t\t\t\t\tshorttext.substring( j ) );\n\t\t\t\tsuffixLength = dmp.diffCommonSuffix( longtext.substring( 0, i ),\n\t\t\t\t\tshorttext.substring( 0, j ) );\n\t\t\t\tif ( bestCommon.length < suffixLength + prefixLength ) {\n\t\t\t\t\tbestCommon = shorttext.substring( j - suffixLength, j ) +\n\t\t\t\t\t\tshorttext.substring( j, j + prefixLength );\n\t\t\t\t\tbestLongtextA = longtext.substring( 0, i - suffixLength );\n\t\t\t\t\tbestLongtextB = longtext.substring( i + prefixLength );\n\t\t\t\t\tbestShorttextA = shorttext.substring( 0, j - suffixLength );\n\t\t\t\t\tbestShorttextB = shorttext.substring( j + prefixLength );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( bestCommon.length * 2 >= longtext.length ) {\n\t\t\t\treturn [ bestLongtextA, bestLongtextB,\n\t\t\t\t\tbestShorttextA, bestShorttextB, bestCommon\n\t\t\t\t];\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\t// First check if the second quarter is the seed for a half-match.\n\t\thm1 = diffHalfMatchI( longtext, shorttext,\n\t\t\tMath.ceil( longtext.length / 4 ) );\n\n\t\t// Check again based on the third quarter.\n\t\thm2 = diffHalfMatchI( longtext, shorttext,\n\t\t\tMath.ceil( longtext.length / 2 ) );\n\t\tif ( !hm1 && !hm2 ) {\n\t\t\treturn null;\n\t\t} else if ( !hm2 ) {\n\t\t\thm = hm1;\n\t\t} else if ( !hm1 ) {\n\t\t\thm = hm2;\n\t\t} else {\n\n\t\t\t// Both matched. Select the longest.\n\t\t\thm = hm1[ 4 ].length > hm2[ 4 ].length ? hm1 : hm2;\n\t\t}\n\n\t\t// A half-match was found, sort out the return data.\n\t\ttext1A, text1B, text2A, text2B;\n\t\tif ( text1.length > text2.length ) {\n\t\t\ttext1A = hm[ 0 ];\n\t\t\ttext1B = hm[ 1 ];\n\t\t\ttext2A = hm[ 2 ];\n\t\t\ttext2B = hm[ 3 ];\n\t\t} else {\n\t\t\ttext2A = hm[ 0 ];\n\t\t\ttext2B = hm[ 1 ];\n\t\t\ttext1A = hm[ 2 ];\n\t\t\ttext1B = hm[ 3 ];\n\t\t}\n\t\tmidCommon = hm[ 4 ];\n\t\treturn [ text1A, text1B, text2A, text2B, midCommon ];\n\t};\n\n\t/**\n\t * Do a quick line-level diff on both strings, then rediff the parts for\n\t * greater accuracy.\n\t * This speedup can produce non-minimal diffs.\n\t * @param {string} text1 Old string to be diffed.\n\t * @param {string} text2 New string to be diffed.\n\t * @param {number} deadline Time when the diff should be complete by.\n\t * @return {!Array.} Array of diff tuples.\n\t * @private\n\t */\n\tDiffMatchPatch.prototype.diffLineMode = function( text1, text2, deadline ) {\n\t\tvar a, diffs, linearray, pointer, countInsert,\n\t\t\tcountDelete, textInsert, textDelete, j;\n\n\t\t// Scan the text on a line-by-line basis first.\n\t\ta = this.diffLinesToChars( text1, text2 );\n\t\ttext1 = a.chars1;\n\t\ttext2 = a.chars2;\n\t\tlinearray = a.lineArray;\n\n\t\tdiffs = this.DiffMain( text1, text2, false, deadline );\n\n\t\t// Convert the diff back to original text.\n\t\tthis.diffCharsToLines( diffs, linearray );\n\n\t\t// Eliminate freak matches (e.g. blank lines)\n\t\tthis.diffCleanupSemantic( diffs );\n\n\t\t// Rediff any replacement blocks, this time character-by-character.\n\t\t// Add a dummy entry at the end.\n\t\tdiffs.push( [ DIFF_EQUAL, \"\" ] );\n\t\tpointer = 0;\n\t\tcountDelete = 0;\n\t\tcountInsert = 0;\n\t\ttextDelete = \"\";\n\t\ttextInsert = \"\";\n\t\twhile ( pointer < diffs.length ) {\n\t\t\tswitch ( diffs[ pointer ][ 0 ] ) {\n\t\t\tcase DIFF_INSERT:\n\t\t\t\tcountInsert++;\n\t\t\t\ttextInsert += diffs[ pointer ][ 1 ];\n\t\t\t\tbreak;\n\t\t\tcase DIFF_DELETE:\n\t\t\t\tcountDelete++;\n\t\t\t\ttextDelete += diffs[ pointer ][ 1 ];\n\t\t\t\tbreak;\n\t\t\tcase DIFF_EQUAL:\n\n\t\t\t\t// Upon reaching an equality, check for prior redundancies.\n\t\t\t\tif ( countDelete >= 1 && countInsert >= 1 ) {\n\n\t\t\t\t\t// Delete the offending records and add the merged ones.\n\t\t\t\t\tdiffs.splice( pointer - countDelete - countInsert,\n\t\t\t\t\t\tcountDelete + countInsert );\n\t\t\t\t\tpointer = pointer - countDelete - countInsert;\n\t\t\t\t\ta = this.DiffMain( textDelete, textInsert, false, deadline );\n\t\t\t\t\tfor ( j = a.length - 1; j >= 0; j-- ) {\n\t\t\t\t\t\tdiffs.splice( pointer, 0, a[ j ] );\n\t\t\t\t\t}\n\t\t\t\t\tpointer = pointer + a.length;\n\t\t\t\t}\n\t\t\t\tcountInsert = 0;\n\t\t\t\tcountDelete = 0;\n\t\t\t\ttextDelete = \"\";\n\t\t\t\ttextInsert = \"\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tpointer++;\n\t\t}\n\t\tdiffs.pop(); // Remove the dummy entry at the end.\n\n\t\treturn diffs;\n\t};\n\n\t/**\n\t * Find the 'middle snake' of a diff, split the problem in two\n\t * and return the recursively constructed diff.\n\t * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n\t * @param {string} text1 Old string to be diffed.\n\t * @param {string} text2 New string to be diffed.\n\t * @param {number} deadline Time at which to bail if not yet complete.\n\t * @return {!Array.} Array of diff tuples.\n\t * @private\n\t */\n\tDiffMatchPatch.prototype.diffBisect = function( text1, text2, deadline ) {\n\t\tvar text1Length, text2Length, maxD, vOffset, vLength,\n\t\t\tv1, v2, x, delta, front, k1start, k1end, k2start,\n\t\t\tk2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;\n\n\t\t// Cache the text lengths to prevent multiple calls.\n\t\ttext1Length = text1.length;\n\t\ttext2Length = text2.length;\n\t\tmaxD = Math.ceil( ( text1Length + text2Length ) / 2 );\n\t\tvOffset = maxD;\n\t\tvLength = 2 * maxD;\n\t\tv1 = new Array( vLength );\n\t\tv2 = new Array( vLength );\n\n\t\t// Setting all elements to -1 is faster in Chrome & Firefox than mixing\n\t\t// integers and undefined.\n\t\tfor ( x = 0; x < vLength; x++ ) {\n\t\t\tv1[ x ] = -1;\n\t\t\tv2[ x ] = -1;\n\t\t}\n\t\tv1[ vOffset + 1 ] = 0;\n\t\tv2[ vOffset + 1 ] = 0;\n\t\tdelta = text1Length - text2Length;\n\n\t\t// If the total number of characters is odd, then the front path will collide\n\t\t// with the reverse path.\n\t\tfront = ( delta % 2 !== 0 );\n\n\t\t// Offsets for start and end of k loop.\n\t\t// Prevents mapping of space beyond the grid.\n\t\tk1start = 0;\n\t\tk1end = 0;\n\t\tk2start = 0;\n\t\tk2end = 0;\n\t\tfor ( d = 0; d < maxD; d++ ) {\n\n\t\t\t// Bail out if deadline is reached.\n\t\t\tif ( ( new Date() ).getTime() > deadline ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Walk the front path one step.\n\t\t\tfor ( k1 = -d + k1start; k1 <= d - k1end; k1 += 2 ) {\n\t\t\t\tk1Offset = vOffset + k1;\n\t\t\t\tif ( k1 === -d || ( k1 !== d && v1[ k1Offset - 1 ] < v1[ k1Offset + 1 ] ) ) {\n\t\t\t\t\tx1 = v1[ k1Offset + 1 ];\n\t\t\t\t} else {\n\t\t\t\t\tx1 = v1[ k1Offset - 1 ] + 1;\n\t\t\t\t}\n\t\t\t\ty1 = x1 - k1;\n\t\t\t\twhile ( x1 < text1Length && y1 < text2Length &&\n\t\t\t\t\ttext1.charAt( x1 ) === text2.charAt( y1 ) ) {\n\t\t\t\t\tx1++;\n\t\t\t\t\ty1++;\n\t\t\t\t}\n\t\t\t\tv1[ k1Offset ] = x1;\n\t\t\t\tif ( x1 > text1Length ) {\n\n\t\t\t\t\t// Ran off the right of the graph.\n\t\t\t\t\tk1end += 2;\n\t\t\t\t} else if ( y1 > text2Length ) {\n\n\t\t\t\t\t// Ran off the bottom of the graph.\n\t\t\t\t\tk1start += 2;\n\t\t\t\t} else if ( front ) {\n\t\t\t\t\tk2Offset = vOffset + delta - k1;\n\t\t\t\t\tif ( k2Offset >= 0 && k2Offset < vLength && v2[ k2Offset ] !== -1 ) {\n\n\t\t\t\t\t\t// Mirror x2 onto top-left coordinate system.\n\t\t\t\t\t\tx2 = text1Length - v2[ k2Offset ];\n\t\t\t\t\t\tif ( x1 >= x2 ) {\n\n\t\t\t\t\t\t\t// Overlap detected.\n\t\t\t\t\t\t\treturn this.diffBisectSplit( text1, text2, x1, y1, deadline );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Walk the reverse path one step.\n\t\t\tfor ( k2 = -d + k2start; k2 <= d - k2end; k2 += 2 ) {\n\t\t\t\tk2Offset = vOffset + k2;\n\t\t\t\tif ( k2 === -d || ( k2 !== d && v2[ k2Offset - 1 ] < v2[ k2Offset + 1 ] ) ) {\n\t\t\t\t\tx2 = v2[ k2Offset + 1 ];\n\t\t\t\t} else {\n\t\t\t\t\tx2 = v2[ k2Offset - 1 ] + 1;\n\t\t\t\t}\n\t\t\t\ty2 = x2 - k2;\n\t\t\t\twhile ( x2 < text1Length && y2 < text2Length &&\n\t\t\t\t\ttext1.charAt( text1Length - x2 - 1 ) ===\n\t\t\t\t\ttext2.charAt( text2Length - y2 - 1 ) ) {\n\t\t\t\t\tx2++;\n\t\t\t\t\ty2++;\n\t\t\t\t}\n\t\t\t\tv2[ k2Offset ] = x2;\n\t\t\t\tif ( x2 > text1Length ) {\n\n\t\t\t\t\t// Ran off the left of the graph.\n\t\t\t\t\tk2end += 2;\n\t\t\t\t} else if ( y2 > text2Length ) {\n\n\t\t\t\t\t// Ran off the top of the graph.\n\t\t\t\t\tk2start += 2;\n\t\t\t\t} else if ( !front ) {\n\t\t\t\t\tk1Offset = vOffset + delta - k2;\n\t\t\t\t\tif ( k1Offset >= 0 && k1Offset < vLength && v1[ k1Offset ] !== -1 ) {\n\t\t\t\t\t\tx1 = v1[ k1Offset ];\n\t\t\t\t\t\ty1 = vOffset + x1 - k1Offset;\n\n\t\t\t\t\t\t// Mirror x2 onto top-left coordinate system.\n\t\t\t\t\t\tx2 = text1Length - x2;\n\t\t\t\t\t\tif ( x1 >= x2 ) {\n\n\t\t\t\t\t\t\t// Overlap detected.\n\t\t\t\t\t\t\treturn this.diffBisectSplit( text1, text2, x1, y1, deadline );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Diff took too long and hit the deadline or\n\t\t// number of diffs equals number of characters, no commonality at all.\n\t\treturn [\n\t\t\t[ DIFF_DELETE, text1 ],\n\t\t\t[ DIFF_INSERT, text2 ]\n\t\t];\n\t};\n\n\t/**\n\t * Given the location of the 'middle snake', split the diff in two parts\n\t * and recurse.\n\t * @param {string} text1 Old string to be diffed.\n\t * @param {string} text2 New string to be diffed.\n\t * @param {number} x Index of split point in text1.\n\t * @param {number} y Index of split point in text2.\n\t * @param {number} deadline Time at which to bail if not yet complete.\n\t * @return {!Array.} Array of diff tuples.\n\t * @private\n\t */\n\tDiffMatchPatch.prototype.diffBisectSplit = function( text1, text2, x, y, deadline ) {\n\t\tvar text1a, text1b, text2a, text2b, diffs, diffsb;\n\t\ttext1a = text1.substring( 0, x );\n\t\ttext2a = text2.substring( 0, y );\n\t\ttext1b = text1.substring( x );\n\t\ttext2b = text2.substring( y );\n\n\t\t// Compute both diffs serially.\n\t\tdiffs = this.DiffMain( text1a, text2a, false, deadline );\n\t\tdiffsb = this.DiffMain( text1b, text2b, false, deadline );\n\n\t\treturn diffs.concat( diffsb );\n\t};\n\n\t/**\n\t * Reduce the number of edits by eliminating semantically trivial equalities.\n\t * @param {!Array.} diffs Array of diff tuples.\n\t */\n\tDiffMatchPatch.prototype.diffCleanupSemantic = function( diffs ) {\n\t\tvar changes, equalities, equalitiesLength, lastequality,\n\t\t\tpointer, lengthInsertions2, lengthDeletions2, lengthInsertions1,\n\t\t\tlengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;\n\t\tchanges = false;\n\t\tequalities = []; // Stack of indices where equalities are found.\n\t\tequalitiesLength = 0; // Keeping our own length var is faster in JS.\n\t\t/** @type {?string} */\n\t\tlastequality = null;\n\n\t\t// Always equal to diffs[equalities[equalitiesLength - 1]][1]\n\t\tpointer = 0; // Index of current position.\n\n\t\t// Number of characters that changed prior to the equality.\n\t\tlengthInsertions1 = 0;\n\t\tlengthDeletions1 = 0;\n\n\t\t// Number of characters that changed after the equality.\n\t\tlengthInsertions2 = 0;\n\t\tlengthDeletions2 = 0;\n\t\twhile ( pointer < diffs.length ) {\n\t\t\tif ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) { // Equality found.\n\t\t\t\tequalities[ equalitiesLength++ ] = pointer;\n\t\t\t\tlengthInsertions1 = lengthInsertions2;\n\t\t\t\tlengthDeletions1 = lengthDeletions2;\n\t\t\t\tlengthInsertions2 = 0;\n\t\t\t\tlengthDeletions2 = 0;\n\t\t\t\tlastequality = diffs[ pointer ][ 1 ];\n\t\t\t} else { // An insertion or deletion.\n\t\t\t\tif ( diffs[ pointer ][ 0 ] === DIFF_INSERT ) {\n\t\t\t\t\tlengthInsertions2 += diffs[ pointer ][ 1 ].length;\n\t\t\t\t} else {\n\t\t\t\t\tlengthDeletions2 += diffs[ pointer ][ 1 ].length;\n\t\t\t\t}\n\n\t\t\t\t// Eliminate an equality that is smaller or equal to the edits on both\n\t\t\t\t// sides of it.\n\t\t\t\tif ( lastequality && ( lastequality.length <=\n\t\t\t\t\t\tMath.max( lengthInsertions1, lengthDeletions1 ) ) &&\n\t\t\t\t\t\t( lastequality.length <= Math.max( lengthInsertions2,\n\t\t\t\t\t\t\tlengthDeletions2 ) ) ) {\n\n\t\t\t\t\t// Duplicate record.\n\t\t\t\t\tdiffs.splice(\n\t\t\t\t\t\tequalities[ equalitiesLength - 1 ],\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t[ DIFF_DELETE, lastequality ]\n\t\t\t\t\t);\n\n\t\t\t\t\t// Change second copy to insert.\n\t\t\t\t\tdiffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;\n\n\t\t\t\t\t// Throw away the equality we just deleted.\n\t\t\t\t\tequalitiesLength--;\n\n\t\t\t\t\t// Throw away the previous equality (it needs to be reevaluated).\n\t\t\t\t\tequalitiesLength--;\n\t\t\t\t\tpointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;\n\n\t\t\t\t\t// Reset the counters.\n\t\t\t\t\tlengthInsertions1 = 0;\n\t\t\t\t\tlengthDeletions1 = 0;\n\t\t\t\t\tlengthInsertions2 = 0;\n\t\t\t\t\tlengthDeletions2 = 0;\n\t\t\t\t\tlastequality = null;\n\t\t\t\t\tchanges = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpointer++;\n\t\t}\n\n\t\t// Normalize the diff.\n\t\tif ( changes ) {\n\t\t\tthis.diffCleanupMerge( diffs );\n\t\t}\n\n\t\t// Find any overlaps between deletions and insertions.\n\t\t// e.g: abcxxxxxxdef \n\t\t// -> abcxxxdef \n\t\t// e.g: xxxabcdefxxx \n\t\t// -> def xxxabc\n\t\t// Only extract an overlap if it is as big as the edit ahead or behind it.\n\t\tpointer = 1;\n\t\twhile ( pointer < diffs.length ) {\n\t\t\tif ( diffs[ pointer - 1 ][ 0 ] === DIFF_DELETE &&\n\t\t\t\t\tdiffs[ pointer ][ 0 ] === DIFF_INSERT ) {\n\t\t\t\tdeletion = diffs[ pointer - 1 ][ 1 ];\n\t\t\t\tinsertion = diffs[ pointer ][ 1 ];\n\t\t\t\toverlapLength1 = this.diffCommonOverlap( deletion, insertion );\n\t\t\t\toverlapLength2 = this.diffCommonOverlap( insertion, deletion );\n\t\t\t\tif ( overlapLength1 >= overlapLength2 ) {\n\t\t\t\t\tif ( overlapLength1 >= deletion.length / 2 ||\n\t\t\t\t\t\t\toverlapLength1 >= insertion.length / 2 ) {\n\n\t\t\t\t\t\t// Overlap found. Insert an equality and trim the surrounding edits.\n\t\t\t\t\t\tdiffs.splice(\n\t\t\t\t\t\t\tpointer,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t[ DIFF_EQUAL, insertion.substring( 0, overlapLength1 ) ]\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdiffs[ pointer - 1 ][ 1 ] =\n\t\t\t\t\t\t\tdeletion.substring( 0, deletion.length - overlapLength1 );\n\t\t\t\t\t\tdiffs[ pointer + 1 ][ 1 ] = insertion.substring( overlapLength1 );\n\t\t\t\t\t\tpointer++;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif ( overlapLength2 >= deletion.length / 2 ||\n\t\t\t\t\t\t\toverlapLength2 >= insertion.length / 2 ) {\n\n\t\t\t\t\t\t// Reverse overlap found.\n\t\t\t\t\t\t// Insert an equality and swap and trim the surrounding edits.\n\t\t\t\t\t\tdiffs.splice(\n\t\t\t\t\t\t\tpointer,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t[ DIFF_EQUAL, deletion.substring( 0, overlapLength2 ) ]\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tdiffs[ pointer - 1 ][ 0 ] = DIFF_INSERT;\n\t\t\t\t\t\tdiffs[ pointer - 1 ][ 1 ] =\n\t\t\t\t\t\t\tinsertion.substring( 0, insertion.length - overlapLength2 );\n\t\t\t\t\t\tdiffs[ pointer + 1 ][ 0 ] = DIFF_DELETE;\n\t\t\t\t\t\tdiffs[ pointer + 1 ][ 1 ] =\n\t\t\t\t\t\t\tdeletion.substring( overlapLength2 );\n\t\t\t\t\t\tpointer++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpointer++;\n\t\t\t}\n\t\t\tpointer++;\n\t\t}\n\t};\n\n\t/**\n\t * Determine if the suffix of one string is the prefix of another.\n\t * @param {string} text1 First string.\n\t * @param {string} text2 Second string.\n\t * @return {number} The number of characters common to the end of the first\n\t * string and the start of the second string.\n\t * @private\n\t */\n\tDiffMatchPatch.prototype.diffCommonOverlap = function( text1, text2 ) {\n\t\tvar text1Length, text2Length, textLength,\n\t\t\tbest, length, pattern, found;\n\n\t\t// Cache the text lengths to prevent multiple calls.\n\t\ttext1Length = text1.length;\n\t\ttext2Length = text2.length;\n\n\t\t// Eliminate the null case.\n\t\tif ( text1Length === 0 || text2Length === 0 ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Truncate the longer string.\n\t\tif ( text1Length > text2Length ) {\n\t\t\ttext1 = text1.substring( text1Length - text2Length );\n\t\t} else if ( text1Length < text2Length ) {\n\t\t\ttext2 = text2.substring( 0, text1Length );\n\t\t}\n\t\ttextLength = Math.min( text1Length, text2Length );\n\n\t\t// Quick check for the worst case.\n\t\tif ( text1 === text2 ) {\n\t\t\treturn textLength;\n\t\t}\n\n\t\t// Start by looking for a single character match\n\t\t// and increase length until no match is found.\n\t\t// Performance analysis: https://neil.fraser.name/news/2010/11/04/\n\t\tbest = 0;\n\t\tlength = 1;\n\t\twhile ( true ) {\n\t\t\tpattern = text1.substring( textLength - length );\n\t\t\tfound = text2.indexOf( pattern );\n\t\t\tif ( found === -1 ) {\n\t\t\t\treturn best;\n\t\t\t}\n\t\t\tlength += found;\n\t\t\tif ( found === 0 || text1.substring( textLength - length ) ===\n\t\t\t\t\ttext2.substring( 0, length ) ) {\n\t\t\t\tbest = length;\n\t\t\t\tlength++;\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Split two texts into an array of strings. Reduce the texts to a string of\n\t * hashes where each Unicode character represents one line.\n\t * @param {string} text1 First string.\n\t * @param {string} text2 Second string.\n\t * @return {{chars1: string, chars2: string, lineArray: !Array.}}\n\t * An object containing the encoded text1, the encoded text2 and\n\t * the array of unique strings.\n\t * The zeroth element of the array of unique strings is intentionally blank.\n\t * @private\n\t */\n\tDiffMatchPatch.prototype.diffLinesToChars = function( text1, text2 ) {\n\t\tvar lineArray, lineHash, chars1, chars2;\n\t\tlineArray = []; // E.g. lineArray[4] === 'Hello\\n'\n\t\tlineHash = {}; // E.g. lineHash['Hello\\n'] === 4\n\n\t\t// '\\x00' is a valid character, but various debuggers don't like it.\n\t\t// So we'll insert a junk entry to avoid generating a null character.\n\t\tlineArray[ 0 ] = \"\";\n\n\t\t/**\n\t\t * Split a text into an array of strings. Reduce the texts to a string of\n\t\t * hashes where each Unicode character represents one line.\n\t\t * Modifies linearray and linehash through being a closure.\n\t\t * @param {string} text String to encode.\n\t\t * @return {string} Encoded string.\n\t\t * @private\n\t\t */\n\t\tfunction diffLinesToCharsMunge( text ) {\n\t\t\tvar chars, lineStart, lineEnd, lineArrayLength, line;\n\t\t\tchars = \"\";\n\n\t\t\t// Walk the text, pulling out a substring for each line.\n\t\t\t// text.split('\\n') would would temporarily double our memory footprint.\n\t\t\t// Modifying text would create many large strings to garbage collect.\n\t\t\tlineStart = 0;\n\t\t\tlineEnd = -1;\n\n\t\t\t// Keeping our own length variable is faster than looking it up.\n\t\t\tlineArrayLength = lineArray.length;\n\t\t\twhile ( lineEnd < text.length - 1 ) {\n\t\t\t\tlineEnd = text.indexOf( \"\\n\", lineStart );\n\t\t\t\tif ( lineEnd === -1 ) {\n\t\t\t\t\tlineEnd = text.length - 1;\n\t\t\t\t}\n\t\t\t\tline = text.substring( lineStart, lineEnd + 1 );\n\t\t\t\tlineStart = lineEnd + 1;\n\n\t\t\t\tif ( lineHash.hasOwnProperty ? lineHash.hasOwnProperty( line ) :\n\t\t\t\t\t\t\t( lineHash[ line ] !== undefined ) ) {\n\t\t\t\t\tchars += String.fromCharCode( lineHash[ line ] );\n\t\t\t\t} else {\n\t\t\t\t\tchars += String.fromCharCode( lineArrayLength );\n\t\t\t\t\tlineHash[ line ] = lineArrayLength;\n\t\t\t\t\tlineArray[ lineArrayLength++ ] = line;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn chars;\n\t\t}\n\n\t\tchars1 = diffLinesToCharsMunge( text1 );\n\t\tchars2 = diffLinesToCharsMunge( text2 );\n\t\treturn {\n\t\t\tchars1: chars1,\n\t\t\tchars2: chars2,\n\t\t\tlineArray: lineArray\n\t\t};\n\t};\n\n\t/**\n\t * Rehydrate the text in a diff from a string of line hashes to real lines of\n\t * text.\n\t * @param {!Array.} diffs Array of diff tuples.\n\t * @param {!Array.} lineArray Array of unique strings.\n\t * @private\n\t */\n\tDiffMatchPatch.prototype.diffCharsToLines = function( diffs, lineArray ) {\n\t\tvar x, chars, text, y;\n\t\tfor ( x = 0; x < diffs.length; x++ ) {\n\t\t\tchars = diffs[ x ][ 1 ];\n\t\t\ttext = [];\n\t\t\tfor ( y = 0; y < chars.length; y++ ) {\n\t\t\t\ttext[ y ] = lineArray[ chars.charCodeAt( y ) ];\n\t\t\t}\n\t\t\tdiffs[ x ][ 1 ] = text.join( \"\" );\n\t\t}\n\t};\n\n\t/**\n\t * Reorder and merge like edit sections. Merge equalities.\n\t * Any edit section can move as long as it doesn't cross an equality.\n\t * @param {!Array.} diffs Array of diff tuples.\n\t */\n\tDiffMatchPatch.prototype.diffCleanupMerge = function( diffs ) {\n\t\tvar pointer, countDelete, countInsert, textInsert, textDelete,\n\t\t\tcommonlength, changes, diffPointer, position;\n\t\tdiffs.push( [ DIFF_EQUAL, \"\" ] ); // Add a dummy entry at the end.\n\t\tpointer = 0;\n\t\tcountDelete = 0;\n\t\tcountInsert = 0;\n\t\ttextDelete = \"\";\n\t\ttextInsert = \"\";\n\t\tcommonlength;\n\t\twhile ( pointer < diffs.length ) {\n\t\t\tswitch ( diffs[ pointer ][ 0 ] ) {\n\t\t\tcase DIFF_INSERT:\n\t\t\t\tcountInsert++;\n\t\t\t\ttextInsert += diffs[ pointer ][ 1 ];\n\t\t\t\tpointer++;\n\t\t\t\tbreak;\n\t\t\tcase DIFF_DELETE:\n\t\t\t\tcountDelete++;\n\t\t\t\ttextDelete += diffs[ pointer ][ 1 ];\n\t\t\t\tpointer++;\n\t\t\t\tbreak;\n\t\t\tcase DIFF_EQUAL:\n\n\t\t\t\t// Upon reaching an equality, check for prior redundancies.\n\t\t\t\tif ( countDelete + countInsert > 1 ) {\n\t\t\t\t\tif ( countDelete !== 0 && countInsert !== 0 ) {\n\n\t\t\t\t\t\t// Factor out any common prefixes.\n\t\t\t\t\t\tcommonlength = this.diffCommonPrefix( textInsert, textDelete );\n\t\t\t\t\t\tif ( commonlength !== 0 ) {\n\t\t\t\t\t\t\tif ( ( pointer - countDelete - countInsert ) > 0 &&\n\t\t\t\t\t\t\t\t\tdiffs[ pointer - countDelete - countInsert - 1 ][ 0 ] ===\n\t\t\t\t\t\t\t\t\tDIFF_EQUAL ) {\n\t\t\t\t\t\t\t\tdiffs[ pointer - countDelete - countInsert - 1 ][ 1 ] +=\n\t\t\t\t\t\t\t\t\ttextInsert.substring( 0, commonlength );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdiffs.splice( 0, 0, [ DIFF_EQUAL,\n\t\t\t\t\t\t\t\t\ttextInsert.substring( 0, commonlength )\n\t\t\t\t\t\t\t\t] );\n\t\t\t\t\t\t\t\tpointer++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttextInsert = textInsert.substring( commonlength );\n\t\t\t\t\t\t\ttextDelete = textDelete.substring( commonlength );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Factor out any common suffixies.\n\t\t\t\t\t\tcommonlength = this.diffCommonSuffix( textInsert, textDelete );\n\t\t\t\t\t\tif ( commonlength !== 0 ) {\n\t\t\t\t\t\t\tdiffs[ pointer ][ 1 ] = textInsert.substring( textInsert.length -\n\t\t\t\t\t\t\t\t\tcommonlength ) + diffs[ pointer ][ 1 ];\n\t\t\t\t\t\t\ttextInsert = textInsert.substring( 0, textInsert.length -\n\t\t\t\t\t\t\t\tcommonlength );\n\t\t\t\t\t\t\ttextDelete = textDelete.substring( 0, textDelete.length -\n\t\t\t\t\t\t\t\tcommonlength );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Delete the offending records and add the merged ones.\n\t\t\t\t\tif ( countDelete === 0 ) {\n\t\t\t\t\t\tdiffs.splice( pointer - countInsert,\n\t\t\t\t\t\t\tcountDelete + countInsert, [ DIFF_INSERT, textInsert ] );\n\t\t\t\t\t} else if ( countInsert === 0 ) {\n\t\t\t\t\t\tdiffs.splice( pointer - countDelete,\n\t\t\t\t\t\t\tcountDelete + countInsert, [ DIFF_DELETE, textDelete ] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdiffs.splice(\n\t\t\t\t\t\t\tpointer - countDelete - countInsert,\n\t\t\t\t\t\t\tcountDelete + countInsert,\n\t\t\t\t\t\t\t[ DIFF_DELETE, textDelete ], [ DIFF_INSERT, textInsert ]\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tpointer = pointer - countDelete - countInsert +\n\t\t\t\t\t\t( countDelete ? 1 : 0 ) + ( countInsert ? 1 : 0 ) + 1;\n\t\t\t\t} else if ( pointer !== 0 && diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL ) {\n\n\t\t\t\t\t// Merge this equality with the previous one.\n\t\t\t\t\tdiffs[ pointer - 1 ][ 1 ] += diffs[ pointer ][ 1 ];\n\t\t\t\t\tdiffs.splice( pointer, 1 );\n\t\t\t\t} else {\n\t\t\t\t\tpointer++;\n\t\t\t\t}\n\t\t\t\tcountInsert = 0;\n\t\t\t\tcountDelete = 0;\n\t\t\t\ttextDelete = \"\";\n\t\t\t\ttextInsert = \"\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif ( diffs[ diffs.length - 1 ][ 1 ] === \"\" ) {\n\t\t\tdiffs.pop(); // Remove the dummy entry at the end.\n\t\t}\n\n\t\t// Second pass: look for single edits surrounded on both sides by equalities\n\t\t// which can be shifted sideways to eliminate an equality.\n\t\t// e.g: ABA C -> AB AC\n\t\tchanges = false;\n\t\tpointer = 1;\n\n\t\t// Intentionally ignore the first and last element (don't need checking).\n\t\twhile ( pointer < diffs.length - 1 ) {\n\t\t\tif ( diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL &&\n\t\t\t\t\tdiffs[ pointer + 1 ][ 0 ] === DIFF_EQUAL ) {\n\n\t\t\t\tdiffPointer = diffs[ pointer ][ 1 ];\n\t\t\t\tposition = diffPointer.substring(\n\t\t\t\t\tdiffPointer.length - diffs[ pointer - 1 ][ 1 ].length\n\t\t\t\t);\n\n\t\t\t\t// This is a single edit surrounded by equalities.\n\t\t\t\tif ( position === diffs[ pointer - 1 ][ 1 ] ) {\n\n\t\t\t\t\t// Shift the edit over the previous equality.\n\t\t\t\t\tdiffs[ pointer ][ 1 ] = diffs[ pointer - 1 ][ 1 ] +\n\t\t\t\t\t\tdiffs[ pointer ][ 1 ].substring( 0, diffs[ pointer ][ 1 ].length -\n\t\t\t\t\t\t\tdiffs[ pointer - 1 ][ 1 ].length );\n\t\t\t\t\tdiffs[ pointer + 1 ][ 1 ] =\n\t\t\t\t\t\tdiffs[ pointer - 1 ][ 1 ] + diffs[ pointer + 1 ][ 1 ];\n\t\t\t\t\tdiffs.splice( pointer - 1, 1 );\n\t\t\t\t\tchanges = true;\n\t\t\t\t} else if ( diffPointer.substring( 0, diffs[ pointer + 1 ][ 1 ].length ) ===\n\t\t\t\t\t\tdiffs[ pointer + 1 ][ 1 ] ) {\n\n\t\t\t\t\t// Shift the edit over the next equality.\n\t\t\t\t\tdiffs[ pointer - 1 ][ 1 ] += diffs[ pointer + 1 ][ 1 ];\n\t\t\t\t\tdiffs[ pointer ][ 1 ] =\n\t\t\t\t\t\tdiffs[ pointer ][ 1 ].substring( diffs[ pointer + 1 ][ 1 ].length ) +\n\t\t\t\t\t\tdiffs[ pointer + 1 ][ 1 ];\n\t\t\t\t\tdiffs.splice( pointer + 1, 1 );\n\t\t\t\t\tchanges = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpointer++;\n\t\t}\n\n\t\t// If shifts were made, the diff needs reordering and another shift sweep.\n\t\tif ( changes ) {\n\t\t\tthis.diffCleanupMerge( diffs );\n\t\t}\n\t};\n\n\treturn function( o, n ) {\n\t\tvar diff, output, text;\n\t\tdiff = new DiffMatchPatch();\n\t\toutput = diff.DiffMain( o, n );\n\t\tdiff.diffCleanupEfficiency( output );\n\t\ttext = diff.diffPrettyHtml( output );\n\n\t\treturn text;\n\t};\n}() );\n\n}() );\n","QUnit.notifications = function( options ) {\n \"use strict\";\n\n options = options || {};\n options.icons = options.icons || {};\n options.timeout = options.timeout || 4000;\n options.titles = options.titles || { passed: \"Passed!\", failed: \"Failed!\" };\n options.bodies = options.bodies || {\n passed: \"{{passed}} of {{total}} passed\",\n failed: \"{{passed}} passed. {{failed}} failed.\"\n };\n\n var renderBody = function( body, details ) {\n [ \"passed\", \"failed\", \"total\", \"runtime\" ].forEach( function( type ) {\n body = body.replace( \"{{\" + type + \"}}\", details[ type ] );\n } );\n\n return body;\n };\n\n function generateQueryString( params ) {\n var key,\n querystring = \"?\";\n\n params = QUnit.extend( QUnit.extend( {}, QUnit.urlParams ), params );\n\n for ( key in params ) {\n if ( params.hasOwnProperty( key ) ) {\n if ( params[ key ] === undefined ) {\n continue;\n }\n querystring += encodeURIComponent( key );\n if ( params[ key ] !== true ) {\n querystring += \"=\" + encodeURIComponent( params[ key ] );\n }\n querystring += \"&\";\n }\n }\n return location.protocol + \"//\" + location.host +\n location.pathname + querystring.slice( 0, -1 );\n }\n\n if ( window.Notification ) {\n QUnit.done( function( details ) {\n var title,\n _options = {},\n notification;\n\n if ( window.Notification && QUnit.urlParams.notifications ) {\n if ( details.failed === 0 ) {\n title = options.titles.passed;\n _options.body = renderBody( options.bodies.passed, details );\n\n if ( options.icons.passed ) {\n _options.icon = options.icons.passed;\n }\n } else {\n title = options.titles.failed;\n _options.body = renderBody( options.bodies.failed, details );\n\n if ( options.icons.failed ) {\n _options.icon = options.icons.failed;\n }\n }\n\n notification = new window.Notification( title, _options );\n\n setTimeout( function() {\n notification.close();\n }, options.timeout );\n }\n } );\n\n QUnit.begin( function() {\n var toolbar = document.getElementById( \"qunit-testrunner-toolbar\" );\n if ( !toolbar ) { return; }\n\n var notification = document.createElement( \"input\" ),\n label = document.createElement( \"label\" ),\n disableCheckbox = function() {\n notification.checked = false;\n notification.disabled = true;\n label.style.opacity = 0.5;\n label.title = notification.title = \"Note: Notifications have been \" +\n \"disabled in this browser.\";\n };\n\n notification.type = \"checkbox\";\n notification.id = \"qunit-notifications\";\n\n label.innerHTML = \"Notifications\";\n label.for = \"qunit-notifications\";\n label.title = \"Show notifications.\";\n if ( window.Notification.permission === \"denied\" ) {\n disableCheckbox();\n } else if ( QUnit.urlParams.notifications ) {\n notification.checked = true;\n }\n\n notification.addEventListener( \"click\", function( event ) {\n if ( event.target.checked ) {\n if ( window.Notification.permission === \"granted\" ) {\n window.location = generateQueryString( { notifications: true } );\n } else if ( window.Notification.permission === \"denied\" ) {\n disableCheckbox();\n } else {\n window.Notification.requestPermission( function( permission ) {\n if ( permission === \"denied\" ) {\n disableCheckbox();\n } else {\n window.location = generateQueryString( { notifications: true } );\n }\n } );\n }\n } else {\n window.location = generateQueryString( { notifications: undefined } );\n }\n }, false );\n\n toolbar.appendChild( notification );\n toolbar.appendChild( label );\n } );\n }\n};\n","/* globals jQuery,QUnit */\n\nQUnit.config.urlConfig.push({ id: 'nocontainer', label: 'Hide container'});\nQUnit.config.urlConfig.push({ id: 'nolint', label: 'Disable Linting'});\nQUnit.config.urlConfig.push({ id: 'dockcontainer', label: 'Dock container'});\nQUnit.config.testTimeout = 60000; //Default Test Timeout 60 Seconds\n\nif (QUnit.notifications) {\n QUnit.notifications({\n icons: {\n passed: '/assets/passed.png',\n failed: '/assets/failed.png'\n }\n });\n}\n\njQuery(document).ready(function() {\n var testContainer = document.getElementById('ember-testing-container');\n if (!testContainer) { return; }\n\n var containerVisibility = QUnit.urlParams.nocontainer ? 'hidden' : 'visible';\n var containerPosition = QUnit.urlParams.dockcontainer ? 'absolute' : 'relative';\n testContainer.style.visibility = containerVisibility;\n testContainer.style.position = containerPosition;\n});\n","/* globals jQuery,QUnit */\n\njQuery(document).ready(function() {\n var TestLoaderModule = require('ember-cli/test-loader');\n var TestLoader = TestLoaderModule['default'];\n var addModuleExcludeMatcher = TestLoaderModule['addModuleExcludeMatcher'];\n var addModuleIncludeMatcher = TestLoaderModule['addModuleIncludeMatcher'];\n\n function excludeModule(moduleName) {\n return QUnit.urlParams.nolint &&\n moduleName.match(/\\.(jshint|lint-test)$/);\n }\n\n function includeModule(moduleName) {\n return moduleName.match(/\\.jshint$/);\n }\n\n if (addModuleExcludeMatcher && addModuleIncludeMatcher) {\n addModuleExcludeMatcher(excludeModule);\n addModuleIncludeMatcher(includeModule);\n } else {\n TestLoader.prototype.shouldLoadModule = function shouldLoadModule(moduleName) {\n return (moduleName.match(/[-_]test$/) || includeModule(moduleName)) && !excludeModule(moduleName);\n };\n }\n\n TestLoader.prototype.moduleLoadFailure = function(moduleName, error) {\n QUnit.module('TestLoader Failures');\n QUnit.test(moduleName + ': could not be loaded', function() {\n throw error;\n });\n };\n\n var autostart = QUnit.config.autostart !== false;\n QUnit.config.autostart = false;\n\n setTimeout(function() {\n TestLoader.load();\n\n if (autostart) {\n QUnit.start();\n }\n }, 250);\n});\n","define('ember-qunit', ['exports', 'ember-qunit/module-for', 'ember-qunit/module-for-component', 'ember-qunit/module-for-model', 'ember-qunit/test', 'ember-qunit/only', 'ember-qunit/skip', 'ember-test-helpers'], function (exports, _emberQunitModuleFor, _emberQunitModuleForComponent, _emberQunitModuleForModel, _emberQunitTest, _emberQunitOnly, _emberQunitSkip, _emberTestHelpers) {\n 'use strict';\n\n exports.moduleFor = _emberQunitModuleFor['default'];\n exports.moduleForComponent = _emberQunitModuleForComponent['default'];\n exports.moduleForModel = _emberQunitModuleForModel['default'];\n exports.test = _emberQunitTest['default'];\n exports.only = _emberQunitOnly['default'];\n exports.skip = _emberQunitSkip['default'];\n exports.setResolver = _emberTestHelpers.setResolver;\n});","define('ember-qunit/module-for-component', ['exports', 'ember-qunit/qunit-module', 'ember-test-helpers'], function (exports, _emberQunitQunitModule, _emberTestHelpers) {\n 'use strict';\n\n exports['default'] = moduleForComponent;\n\n function moduleForComponent(name, description, callbacks) {\n (0, _emberQunitQunitModule.createModule)(_emberTestHelpers.TestModuleForComponent, name, description, callbacks);\n }\n});","define('ember-qunit/module-for-model', ['exports', 'ember-qunit/qunit-module', 'ember-test-helpers'], function (exports, _emberQunitQunitModule, _emberTestHelpers) {\n 'use strict';\n\n exports['default'] = moduleForModel;\n\n function moduleForModel(name, description, callbacks) {\n (0, _emberQunitQunitModule.createModule)(_emberTestHelpers.TestModuleForModel, name, description, callbacks);\n }\n});","define('ember-qunit/module-for', ['exports', 'ember-qunit/qunit-module', 'ember-test-helpers'], function (exports, _emberQunitQunitModule, _emberTestHelpers) {\n 'use strict';\n\n exports['default'] = moduleFor;\n\n function moduleFor(name, description, callbacks) {\n (0, _emberQunitQunitModule.createModule)(_emberTestHelpers.TestModule, name, description, callbacks);\n }\n});","define('ember-qunit/only', ['exports', 'ember-qunit/test-wrapper', 'qunit'], function (exports, _emberQunitTestWrapper, _qunit) {\n 'use strict';\n\n exports['default'] = only;\n\n function only() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n args.unshift(_qunit.only);\n _emberQunitTestWrapper['default'].apply(null, args);\n }\n});","define('ember-qunit/qunit-module', ['exports', 'ember', 'qunit'], function (exports, _ember, _qunit) {\n 'use strict';\n\n exports.createModule = createModule;\n\n function beforeEachCallback(callbacks) {\n if (typeof callbacks !== 'object') {\n return;\n }\n if (!callbacks) {\n return;\n }\n\n var beforeEach;\n\n if (callbacks.setup) {\n beforeEach = callbacks.setup;\n delete callbacks.setup;\n }\n\n if (callbacks.beforeEach) {\n beforeEach = callbacks.beforeEach;\n delete callbacks.beforeEach;\n }\n\n return beforeEach;\n }\n\n function afterEachCallback(callbacks) {\n if (typeof callbacks !== 'object') {\n return;\n }\n if (!callbacks) {\n return;\n }\n\n var afterEach;\n\n if (callbacks.teardown) {\n afterEach = callbacks.teardown;\n delete callbacks.teardown;\n }\n\n if (callbacks.afterEach) {\n afterEach = callbacks.afterEach;\n delete callbacks.afterEach;\n }\n\n return afterEach;\n }\n\n function createModule(Constructor, name, description, callbacks) {\n var beforeEach = beforeEachCallback(callbacks || description);\n var afterEach = afterEachCallback(callbacks || description);\n\n var module = new Constructor(name, description, callbacks);\n\n (0, _qunit.module)(module.name, {\n setup: function setup(assert) {\n var done = assert.async();\n\n // provide the test context to the underlying module\n module.setContext(this);\n\n return module.setup().then(function () {\n if (beforeEach) {\n return beforeEach.call(module.context, assert);\n }\n })['finally'](done);\n },\n\n teardown: function teardown(assert) {\n var result = undefined;\n\n if (afterEach) {\n result = afterEach.call(module.context, assert);\n }\n\n var done = assert.async();\n return _ember['default'].RSVP.resolve(result).then(function () {\n return module.teardown()['finally'](done);\n });\n }\n });\n }\n});","define('ember-qunit/skip', ['exports', 'ember-qunit/test-wrapper', 'qunit'], function (exports, _emberQunitTestWrapper, _qunit) {\n 'use strict';\n\n exports['default'] = skip;\n\n function skip() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n args.unshift(_qunit.skip);\n _emberQunitTestWrapper['default'].apply(null, args);\n }\n});","define('ember-qunit/test-wrapper', ['exports', 'ember', 'ember-test-helpers'], function (exports, _ember, _emberTestHelpers) {\n 'use strict';\n\n exports['default'] = testWrapper;\n\n function testWrapper(qunit /*, testName, expected, callback, async */) {\n var callback;\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; ++_key) {\n args[_key - 1] = arguments[_key];\n }\n\n function wrapper() {\n var context = (0, _emberTestHelpers.getContext)();\n\n var result = callback.apply(context, arguments);\n\n function failTestOnPromiseRejection(reason) {\n var message;\n if (reason instanceof Error) {\n message = reason.stack;\n if (reason.message && message && message.indexOf(reason.message) < 0) {\n // PhantomJS has a `stack` that does not contain the actual\n // exception message.\n message = _ember['default'].inspect(reason) + \"\\n\" + message;\n }\n } else {\n message = _ember['default'].inspect(reason);\n }\n ok(false, message);\n }\n\n _ember['default'].run(function () {\n QUnit.stop();\n _ember['default'].RSVP.Promise.resolve(result)['catch'](failTestOnPromiseRejection)['finally'](QUnit.start);\n });\n }\n\n if (args.length === 2) {\n callback = args.splice(1, 1, wrapper)[0];\n } else {\n callback = args.splice(2, 1, wrapper)[0];\n }\n\n qunit.apply(null, args);\n }\n});","define('ember-qunit/test', ['exports', 'ember-qunit/test-wrapper', 'qunit'], function (exports, _emberQunitTestWrapper, _qunit) {\n 'use strict';\n\n exports['default'] = test;\n\n function test() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n args.unshift(_qunit.test);\n _emberQunitTestWrapper['default'].apply(null, args);\n }\n});","define('ember-test-helpers', ['exports', 'ember', 'ember-test-helpers/test-module', 'ember-test-helpers/test-module-for-acceptance', 'ember-test-helpers/test-module-for-integration', 'ember-test-helpers/test-module-for-component', 'ember-test-helpers/test-module-for-model', 'ember-test-helpers/test-context', 'ember-test-helpers/test-resolver'], function (exports, _ember, _emberTestHelpersTestModule, _emberTestHelpersTestModuleForAcceptance, _emberTestHelpersTestModuleForIntegration, _emberTestHelpersTestModuleForComponent, _emberTestHelpersTestModuleForModel, _emberTestHelpersTestContext, _emberTestHelpersTestResolver) {\n 'use strict';\n\n _ember['default'].testing = true;\n\n exports.TestModule = _emberTestHelpersTestModule['default'];\n exports.TestModuleForAcceptance = _emberTestHelpersTestModuleForAcceptance['default'];\n exports.TestModuleForIntegration = _emberTestHelpersTestModuleForIntegration['default'];\n exports.TestModuleForComponent = _emberTestHelpersTestModuleForComponent['default'];\n exports.TestModuleForModel = _emberTestHelpersTestModuleForModel['default'];\n exports.getContext = _emberTestHelpersTestContext.getContext;\n exports.setContext = _emberTestHelpersTestContext.setContext;\n exports.unsetContext = _emberTestHelpersTestContext.unsetContext;\n exports.setResolver = _emberTestHelpersTestResolver.setResolver;\n});","define('ember-test-helpers/-legacy-overrides', ['exports', 'ember', 'ember-test-helpers/has-ember-version'], function (exports, _ember, _emberTestHelpersHasEmberVersion) {\n 'use strict';\n\n exports.preGlimmerSetupIntegrationForComponent = preGlimmerSetupIntegrationForComponent;\n\n function preGlimmerSetupIntegrationForComponent() {\n var module = this;\n var context = this.context;\n\n this.actionHooks = {};\n\n context.dispatcher = this.container.lookup('event_dispatcher:main') || _ember['default'].EventDispatcher.create();\n context.dispatcher.setup({}, '#ember-testing');\n context.actions = module.actionHooks;\n\n (this.registry || this.container).register('component:-test-holder', _ember['default'].Component.extend());\n\n context.render = function (template) {\n // in case `this.render` is called twice, make sure to teardown the first invocation\n module.teardownComponent();\n\n if (!template) {\n throw new Error(\"in a component integration test you must pass a template to `render()`\");\n }\n if (_ember['default'].isArray(template)) {\n template = template.join('');\n }\n if (typeof template === 'string') {\n template = _ember['default'].Handlebars.compile(template);\n }\n module.component = module.container.lookupFactory('component:-test-holder').create({\n layout: template\n });\n\n module.component.set('context', context);\n module.component.set('controller', context);\n\n _ember['default'].run(function () {\n module.component.appendTo('#ember-testing');\n });\n\n context._element = module.component.element;\n };\n\n context.$ = function () {\n return module.component.$.apply(module.component, arguments);\n };\n\n context.set = function (key, value) {\n var ret = _ember['default'].run(function () {\n return _ember['default'].set(context, key, value);\n });\n\n if ((0, _emberTestHelpersHasEmberVersion['default'])(2, 0)) {\n return ret;\n }\n };\n\n context.setProperties = function (hash) {\n var ret = _ember['default'].run(function () {\n return _ember['default'].setProperties(context, hash);\n });\n\n if ((0, _emberTestHelpersHasEmberVersion['default'])(2, 0)) {\n return ret;\n }\n };\n\n context.get = function (key) {\n return _ember['default'].get(context, key);\n };\n\n context.getProperties = function () {\n var args = Array.prototype.slice.call(arguments);\n return _ember['default'].getProperties(context, args);\n };\n\n context.on = function (actionName, handler) {\n module.actionHooks[actionName] = handler;\n };\n\n context.send = function (actionName) {\n var hook = module.actionHooks[actionName];\n if (!hook) {\n throw new Error(\"integration testing template received unexpected action \" + actionName);\n }\n hook.apply(module, Array.prototype.slice.call(arguments, 1));\n };\n\n context.clearRender = function () {\n module.teardownComponent();\n };\n }\n});","define('ember-test-helpers/abstract-test-module', ['exports', 'klassy', 'ember-test-helpers/wait', 'ember-test-helpers/test-context', 'ember'], function (exports, _klassy, _emberTestHelpersWait, _emberTestHelpersTestContext, _ember) {\n 'use strict';\n\n // calling this `merge` here because we cannot\n // actually assume it is like `Object.assign`\n // with > 2 args\n var merge = _ember['default'].assign || _ember['default'].merge;\n\n exports['default'] = _klassy.Klass.extend({\n init: function init(name, options) {\n this.context = undefined;\n this.name = name;\n this.callbacks = options || {};\n\n this.initSetupSteps();\n this.initTeardownSteps();\n },\n\n setup: function setup(assert) {\n var _this = this;\n\n return this.invokeSteps(this.setupSteps, this, assert).then(function () {\n _this.contextualizeCallbacks();\n return _this.invokeSteps(_this.contextualizedSetupSteps, _this.context, assert);\n });\n },\n\n teardown: function teardown(assert) {\n var _this2 = this;\n\n return this.invokeSteps(this.contextualizedTeardownSteps, this.context, assert).then(function () {\n return _this2.invokeSteps(_this2.teardownSteps, _this2, assert);\n }).then(function () {\n _this2.cache = null;\n _this2.cachedCalls = null;\n });\n },\n\n initSetupSteps: function initSetupSteps() {\n this.setupSteps = [];\n this.contextualizedSetupSteps = [];\n\n if (this.callbacks.beforeSetup) {\n this.setupSteps.push(this.callbacks.beforeSetup);\n delete this.callbacks.beforeSetup;\n }\n\n this.setupSteps.push(this.setupContext);\n this.setupSteps.push(this.setupTestElements);\n this.setupSteps.push(this.setupAJAXListeners);\n\n if (this.callbacks.setup) {\n this.contextualizedSetupSteps.push(this.callbacks.setup);\n delete this.callbacks.setup;\n }\n },\n\n invokeSteps: function invokeSteps(steps, context, assert) {\n steps = steps.slice();\n\n function nextStep() {\n var step = steps.shift();\n if (step) {\n // guard against exceptions, for example missing components referenced from needs.\n return new _ember['default'].RSVP.Promise(function (resolve) {\n resolve(step.call(context, assert));\n }).then(nextStep);\n } else {\n return _ember['default'].RSVP.resolve();\n }\n }\n return nextStep();\n },\n\n contextualizeCallbacks: function contextualizeCallbacks() {},\n\n initTeardownSteps: function initTeardownSteps() {\n this.teardownSteps = [];\n this.contextualizedTeardownSteps = [];\n\n if (this.callbacks.teardown) {\n this.contextualizedTeardownSteps.push(this.callbacks.teardown);\n delete this.callbacks.teardown;\n }\n\n this.teardownSteps.push(this.teardownContext);\n this.teardownSteps.push(this.teardownTestElements);\n this.teardownSteps.push(this.teardownAJAXListeners);\n\n if (this.callbacks.afterTeardown) {\n this.teardownSteps.push(this.callbacks.afterTeardown);\n delete this.callbacks.afterTeardown;\n }\n },\n\n setupTestElements: function setupTestElements() {\n var testEl = document.querySelector('#ember-testing');\n if (!testEl) {\n var element = document.createElement('div');\n element.setAttribute('id', 'ember-testing');\n\n document.body.appendChild(element);\n this.fixtureResetValue = '';\n } else {\n this.fixtureResetValue = testEl.innerHTML;\n }\n },\n\n setupContext: function setupContext(options) {\n var context = this.getContext();\n\n merge(context, {\n dispatcher: null,\n inject: {}\n });\n merge(context, options);\n\n (0, _emberTestHelpersTestContext.setContext)(context);\n this.context = context;\n },\n\n setContext: function setContext(context) {\n this.context = context;\n },\n\n getContext: function getContext() {\n if (this.context) {\n return this.context;\n }\n\n return this.context = (0, _emberTestHelpersTestContext.getContext)() || {};\n },\n\n setupAJAXListeners: function setupAJAXListeners() {\n (0, _emberTestHelpersWait._setupAJAXHooks)();\n },\n\n teardownAJAXListeners: function teardownAJAXListeners() {\n (0, _emberTestHelpersWait._teardownAJAXHooks)();\n },\n\n teardownTestElements: function teardownTestElements() {\n document.getElementById('ember-testing').innerHTML = this.fixtureResetValue;\n\n // Ember 2.0.0 removed Ember.View as public API, so only do this when\n // Ember.View is present\n if (_ember['default'].View && _ember['default'].View.views) {\n _ember['default'].View.views = {};\n }\n },\n\n teardownContext: function teardownContext() {\n var context = this.context;\n this.context = undefined;\n (0, _emberTestHelpersTestContext.unsetContext)();\n\n if (context && context.dispatcher && !context.dispatcher.isDestroyed) {\n _ember['default'].run(function () {\n context.dispatcher.destroy();\n });\n }\n }\n });\n});","define('ember-test-helpers/build-registry', ['exports', 'ember'], function (exports, _ember) {\n /* globals global, self, requirejs, require */\n\n 'use strict';\n\n function exposeRegistryMethodsWithoutDeprecations(container) {\n var methods = ['register', 'unregister', 'resolve', 'normalize', 'typeInjection', 'injection', 'factoryInjection', 'factoryTypeInjection', 'has', 'options', 'optionsForType'];\n\n function exposeRegistryMethod(container, method) {\n if (method in container) {\n container[method] = function () {\n return container._registry[method].apply(container._registry, arguments);\n };\n }\n }\n\n for (var i = 0, l = methods.length; i < l; i++) {\n exposeRegistryMethod(container, methods[i]);\n }\n }\n\n var Owner = (function () {\n if (_ember['default']._RegistryProxyMixin && _ember['default']._ContainerProxyMixin) {\n return _ember['default'].Object.extend(_ember['default']._RegistryProxyMixin, _ember['default']._ContainerProxyMixin);\n }\n\n return _ember['default'].Object.extend();\n })();\n\n exports['default'] = function (resolver) {\n var fallbackRegistry, registry, container;\n var namespace = _ember['default'].Object.create({\n Resolver: { create: function create() {\n return resolver;\n } }\n });\n\n function register(name, factory) {\n var thingToRegisterWith = registry || container;\n\n if (!container.lookupFactory(name)) {\n thingToRegisterWith.register(name, factory);\n }\n }\n\n if (_ember['default'].Application.buildRegistry) {\n fallbackRegistry = _ember['default'].Application.buildRegistry(namespace);\n fallbackRegistry.register('component-lookup:main', _ember['default'].ComponentLookup);\n\n registry = new _ember['default'].Registry({\n fallback: fallbackRegistry\n });\n\n if (_ember['default'].ApplicationInstance && _ember['default'].ApplicationInstance.setupRegistry) {\n _ember['default'].ApplicationInstance.setupRegistry(registry);\n }\n\n // these properties are set on the fallback registry by `buildRegistry`\n // and on the primary registry within the ApplicationInstance constructor\n // but we need to manually recreate them since ApplicationInstance's are not\n // exposed externally\n registry.normalizeFullName = fallbackRegistry.normalizeFullName;\n registry.makeToString = fallbackRegistry.makeToString;\n registry.describe = fallbackRegistry.describe;\n\n var owner = Owner.create({\n __registry__: registry,\n __container__: null\n });\n\n container = registry.container({ owner: owner });\n owner.__container__ = container;\n\n exposeRegistryMethodsWithoutDeprecations(container);\n } else {\n container = _ember['default'].Application.buildContainer(namespace);\n container.register('component-lookup:main', _ember['default'].ComponentLookup);\n }\n\n // Ember 1.10.0 did not properly add `view:toplevel` or `view:default`\n // to the registry in Ember.Application.buildRegistry :(\n //\n // Ember 2.0.0 removed Ember.View as public API, so only do this when\n // Ember.View is present\n if (_ember['default'].View) {\n register('view:toplevel', _ember['default'].View.extend());\n }\n\n // Ember 2.0.0 removed Ember._MetamorphView from the Ember global, so only\n // do this when present\n if (_ember['default']._MetamorphView) {\n register('view:default', _ember['default']._MetamorphView);\n }\n\n var globalContext = typeof global === 'object' && global || self;\n if (requirejs.entries['ember-data/setup-container']) {\n // ember-data is a proper ember-cli addon since 2.3; if no 'import\n // 'ember-data'' is present somewhere in the tests, there is also no `DS`\n // available on the globalContext and hence ember-data wouldn't be setup\n // correctly for the tests; that's why we import and call setupContainer\n // here; also see https://github.com/emberjs/data/issues/4071 for context\n var setupContainer = require('ember-data/setup-container')['default'];\n setupContainer(registry || container);\n } else if (globalContext.DS) {\n var DS = globalContext.DS;\n if (DS._setupContainer) {\n DS._setupContainer(registry || container);\n } else {\n register('transform:boolean', DS.BooleanTransform);\n register('transform:date', DS.DateTransform);\n register('transform:number', DS.NumberTransform);\n register('transform:string', DS.StringTransform);\n register('serializer:-default', DS.JSONSerializer);\n register('serializer:-rest', DS.RESTSerializer);\n register('adapter:-rest', DS.RESTAdapter);\n }\n }\n\n return {\n registry: registry,\n container: container\n };\n };\n});","define('ember-test-helpers/has-ember-version', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports['default'] = hasEmberVersion;\n\n function hasEmberVersion(major, minor) {\n var numbers = _ember['default'].VERSION.split('-')[0].split('.');\n var actualMajor = parseInt(numbers[0], 10);\n var actualMinor = parseInt(numbers[1], 10);\n return actualMajor > major || actualMajor === major && actualMinor >= minor;\n }\n});","define(\"ember-test-helpers/test-context\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.setContext = setContext;\n exports.getContext = getContext;\n exports.unsetContext = unsetContext;\n var __test_context__;\n\n function setContext(context) {\n __test_context__ = context;\n }\n\n function getContext() {\n return __test_context__;\n }\n\n function unsetContext() {\n __test_context__ = undefined;\n }\n});","define('ember-test-helpers/test-module-for-acceptance', ['exports', 'ember-test-helpers/abstract-test-module', 'ember', 'ember-test-helpers/test-context'], function (exports, _emberTestHelpersAbstractTestModule, _ember, _emberTestHelpersTestContext) {\n 'use strict';\n\n exports['default'] = _emberTestHelpersAbstractTestModule['default'].extend({\n setupContext: function setupContext() {\n this._super({ application: this.createApplication() });\n },\n\n teardownContext: function teardownContext() {\n _ember['default'].run(function () {\n (0, _emberTestHelpersTestContext.getContext)().application.destroy();\n });\n\n this._super();\n },\n\n createApplication: function createApplication() {\n var _callbacks = this.callbacks;\n var Application = _callbacks.Application;\n var config = _callbacks.config;\n\n var application = undefined;\n\n _ember['default'].run(function () {\n application = Application.create(config);\n application.setupForTesting();\n application.injectTestHelpers();\n });\n\n return application;\n }\n });\n});","define('ember-test-helpers/test-module-for-component', ['exports', 'ember-test-helpers/test-module', 'ember', 'ember-test-helpers/has-ember-version', 'ember-test-helpers/-legacy-overrides'], function (exports, _emberTestHelpersTestModule, _ember, _emberTestHelpersHasEmberVersion, _emberTestHelpersLegacyOverrides) {\n 'use strict';\n\n exports.setupComponentIntegrationTest = setupComponentIntegrationTest;\n\n var ACTION_KEY = undefined;\n if ((0, _emberTestHelpersHasEmberVersion['default'])(2, 0)) {\n ACTION_KEY = 'actions';\n } else {\n ACTION_KEY = '_actions';\n }\n\n var getOwner = _ember['default'].getOwner;\n exports['default'] = _emberTestHelpersTestModule['default'].extend({\n isComponentTestModule: true,\n\n init: function init(componentName, description, callbacks) {\n // Allow `description` to be omitted\n if (!callbacks && typeof description === 'object') {\n callbacks = description;\n description = null;\n } else if (!callbacks) {\n callbacks = {};\n }\n\n this.componentName = componentName;\n\n if (callbacks.needs || callbacks.unit || callbacks.integration === false) {\n this.isUnitTest = true;\n } else if (callbacks.integration) {\n this.isUnitTest = false;\n } else {\n _ember['default'].deprecate(\"the component:\" + componentName + \" test module is implicitly running in unit test mode, \" + \"which will change to integration test mode by default in an upcoming version of \" + \"ember-test-helpers. Add `unit: true` or a `needs:[]` list to explicitly opt in to unit \" + \"test mode.\", false, { id: 'ember-test-helpers.test-module-for-component.test-type', until: '0.6.0' });\n this.isUnitTest = true;\n }\n\n if (description) {\n this._super.call(this, 'component:' + componentName, description, callbacks);\n } else {\n this._super.call(this, 'component:' + componentName, callbacks);\n }\n\n if (!this.isUnitTest && !this.isLegacy) {\n callbacks.integration = true;\n }\n\n if (this.isUnitTest || this.isLegacy) {\n this.setupSteps.push(this.setupComponentUnitTest);\n } else {\n this.callbacks.subject = function () {\n throw new Error(\"component integration tests do not support `subject()`. Instead, render the component as if it were HTML: `this.render('');`. For more information, read: http://guides.emberjs.com/v2.2.0/testing/testing-components/\");\n };\n this.setupSteps.push(this.setupComponentIntegrationTest);\n this.teardownSteps.unshift(this.teardownComponent);\n }\n\n if (_ember['default'].View && _ember['default'].View.views) {\n this.setupSteps.push(this._aliasViewRegistry);\n this.teardownSteps.unshift(this._resetViewRegistry);\n }\n },\n\n _aliasViewRegistry: function _aliasViewRegistry() {\n this._originalGlobalViewRegistry = _ember['default'].View.views;\n var viewRegistry = this.container.lookup('-view-registry:main');\n\n if (viewRegistry) {\n _ember['default'].View.views = viewRegistry;\n }\n },\n\n _resetViewRegistry: function _resetViewRegistry() {\n _ember['default'].View.views = this._originalGlobalViewRegistry;\n },\n\n setupComponentUnitTest: function setupComponentUnitTest() {\n var _this = this;\n var resolver = this.resolver;\n var context = this.context;\n\n var layoutName = 'template:components/' + this.componentName;\n\n var layout = resolver.resolve(layoutName);\n\n var thingToRegisterWith = this.registry || this.container;\n if (layout) {\n thingToRegisterWith.register(layoutName, layout);\n thingToRegisterWith.injection(this.subjectName, 'layout', layoutName);\n }\n\n context.dispatcher = this.container.lookup('event_dispatcher:main') || _ember['default'].EventDispatcher.create();\n context.dispatcher.setup({}, '#ember-testing');\n\n context._element = null;\n\n this.callbacks.render = function () {\n var subject;\n\n _ember['default'].run(function () {\n subject = context.subject();\n subject.appendTo('#ember-testing');\n });\n\n context._element = subject.element;\n\n _this.teardownSteps.unshift(function () {\n _ember['default'].run(function () {\n _ember['default'].tryInvoke(subject, 'destroy');\n });\n });\n };\n\n this.callbacks.append = function () {\n _ember['default'].deprecate('this.append() is deprecated. Please use this.render() or this.$() instead.', false, { id: 'ember-test-helpers.test-module-for-component.append', until: '0.6.0' });\n return context.$();\n };\n\n context.$ = function () {\n this.render();\n var subject = this.subject();\n\n return subject.$.apply(subject, arguments);\n };\n },\n\n setupComponentIntegrationTest: (function () {\n if (!(0, _emberTestHelpersHasEmberVersion['default'])(1, 13)) {\n return _emberTestHelpersLegacyOverrides.preGlimmerSetupIntegrationForComponent;\n } else {\n return setupComponentIntegrationTest;\n }\n })(),\n\n setupContext: function setupContext() {\n this._super.call(this);\n\n // only setup the injection if we are running against a version\n // of Ember that has `-view-registry:main` (Ember >= 1.12)\n if (this.container.lookupFactory('-view-registry:main')) {\n (this.registry || this.container).injection('component', '_viewRegistry', '-view-registry:main');\n }\n\n if (!this.isUnitTest && !this.isLegacy) {\n this.context.factory = function () {};\n }\n },\n\n teardownComponent: function teardownComponent() {\n var component = this.component;\n if (component) {\n _ember['default'].run(component, 'destroy');\n this.component = null;\n }\n }\n });\n\n function setupComponentIntegrationTest() {\n var module = this;\n var context = this.context;\n\n this.actionHooks = context[ACTION_KEY] = {};\n context.dispatcher = this.container.lookup('event_dispatcher:main') || _ember['default'].EventDispatcher.create();\n context.dispatcher.setup({}, '#ember-testing');\n\n var hasRendered = false;\n var OutletView = module.container.lookupFactory('view:-outlet');\n var OutletTemplate = module.container.lookup('template:-outlet');\n var toplevelView = module.component = OutletView.create();\n var hasOutletTemplate = !!OutletTemplate;\n var outletState = {\n render: {\n owner: getOwner ? getOwner(module.container) : undefined,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: module.context,\n ViewClass: undefined,\n template: OutletTemplate\n },\n\n outlets: {}\n };\n\n var element = document.getElementById('ember-testing');\n var templateId = 0;\n\n if (hasOutletTemplate) {\n _ember['default'].run(function () {\n toplevelView.setOutletState(outletState);\n });\n }\n\n context.render = function (template) {\n if (!template) {\n throw new Error(\"in a component integration test you must pass a template to `render()`\");\n }\n if (_ember['default'].isArray(template)) {\n template = template.join('');\n }\n if (typeof template === 'string') {\n template = _ember['default'].Handlebars.compile(template);\n }\n\n var templateFullName = 'template:-undertest-' + ++templateId;\n this.registry.register(templateFullName, template);\n var stateToRender = {\n owner: getOwner ? getOwner(module.container) : undefined,\n into: undefined,\n outlet: 'main',\n name: 'index',\n controller: module.context,\n ViewClass: undefined,\n template: module.container.lookup(templateFullName),\n outlets: {}\n };\n\n if (hasOutletTemplate) {\n stateToRender.name = 'index';\n outletState.outlets.main = { render: stateToRender, outlets: {} };\n } else {\n stateToRender.name = 'application';\n outletState = { render: stateToRender, outlets: {} };\n }\n\n _ember['default'].run(function () {\n toplevelView.setOutletState(outletState);\n });\n\n if (!hasRendered) {\n _ember['default'].run(module.component, 'appendTo', '#ember-testing');\n hasRendered = true;\n }\n\n // ensure the element is based on the wrapping toplevel view\n // Ember still wraps the main application template with a\n // normal tagged view\n context._element = element = document.querySelector('#ember-testing > .ember-view');\n };\n\n context.$ = function (selector) {\n // emulates Ember internal behavor of `this.$` in a component\n // https://github.com/emberjs/ember.js/blob/v2.5.1/packages/ember-views/lib/views/states/has_element.js#L18\n return selector ? _ember['default'].$(selector, element) : _ember['default'].$(element);\n };\n\n context.set = function (key, value) {\n var ret = _ember['default'].run(function () {\n return _ember['default'].set(context, key, value);\n });\n\n if ((0, _emberTestHelpersHasEmberVersion['default'])(2, 0)) {\n return ret;\n }\n };\n\n context.setProperties = function (hash) {\n var ret = _ember['default'].run(function () {\n return _ember['default'].setProperties(context, hash);\n });\n\n if ((0, _emberTestHelpersHasEmberVersion['default'])(2, 0)) {\n return ret;\n }\n };\n\n context.get = function (key) {\n return _ember['default'].get(context, key);\n };\n\n context.getProperties = function () {\n var args = Array.prototype.slice.call(arguments);\n return _ember['default'].getProperties(context, args);\n };\n\n context.on = function (actionName, handler) {\n module.actionHooks[actionName] = handler;\n };\n\n context.send = function (actionName) {\n var hook = module.actionHooks[actionName];\n if (!hook) {\n throw new Error(\"integration testing template received unexpected action \" + actionName);\n }\n hook.apply(module.context, Array.prototype.slice.call(arguments, 1));\n };\n\n context.clearRender = function () {\n _ember['default'].run(function () {\n toplevelView.setOutletState({\n render: {\n owner: module.container,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: module.context,\n ViewClass: undefined,\n template: undefined\n },\n outlets: {}\n });\n });\n };\n }\n});","define('ember-test-helpers/test-module-for-integration', ['exports', 'ember', 'ember-test-helpers/abstract-test-module', 'ember-test-helpers/test-resolver', 'ember-test-helpers/build-registry', 'ember-test-helpers/has-ember-version', 'ember-test-helpers/-legacy-overrides', 'ember-test-helpers/test-module-for-component'], function (exports, _ember, _emberTestHelpersAbstractTestModule, _emberTestHelpersTestResolver, _emberTestHelpersBuildRegistry, _emberTestHelpersHasEmberVersion, _emberTestHelpersLegacyOverrides, _emberTestHelpersTestModuleForComponent) {\n 'use strict';\n\n var ACTION_KEY = undefined;\n if ((0, _emberTestHelpersHasEmberVersion['default'])(2, 0)) {\n ACTION_KEY = 'actions';\n } else {\n ACTION_KEY = '_actions';\n }\n\n exports['default'] = _emberTestHelpersAbstractTestModule['default'].extend({\n init: function init() {\n this._super.apply(this, arguments);\n this.resolver = this.callbacks.resolver || (0, _emberTestHelpersTestResolver.getResolver)();\n },\n\n initSetupSteps: function initSetupSteps() {\n this.setupSteps = [];\n this.contextualizedSetupSteps = [];\n\n if (this.callbacks.beforeSetup) {\n this.setupSteps.push(this.callbacks.beforeSetup);\n delete this.callbacks.beforeSetup;\n }\n\n this.setupSteps.push(this.setupContainer);\n this.setupSteps.push(this.setupContext);\n this.setupSteps.push(this.setupTestElements);\n this.setupSteps.push(this.setupAJAXListeners);\n this.setupSteps.push(this.setupComponentIntegrationTest);\n\n if (_ember['default'].View && _ember['default'].View.views) {\n this.setupSteps.push(this._aliasViewRegistry);\n }\n\n if (this.callbacks.setup) {\n this.contextualizedSetupSteps.push(this.callbacks.setup);\n delete this.callbacks.setup;\n }\n },\n\n initTeardownSteps: function initTeardownSteps() {\n this.teardownSteps = [];\n this.contextualizedTeardownSteps = [];\n\n if (this.callbacks.teardown) {\n this.contextualizedTeardownSteps.push(this.callbacks.teardown);\n delete this.callbacks.teardown;\n }\n\n this.teardownSteps.push(this.teardownContainer);\n this.teardownSteps.push(this.teardownContext);\n this.teardownSteps.push(this.teardownAJAXListeners);\n this.teardownSteps.push(this.teardownComponent);\n\n if (_ember['default'].View && _ember['default'].View.views) {\n this.teardownSteps.push(this._resetViewRegistry);\n }\n\n this.teardownSteps.push(this.teardownTestElements);\n\n if (this.callbacks.afterTeardown) {\n this.teardownSteps.push(this.callbacks.afterTeardown);\n delete this.callbacks.afterTeardown;\n }\n },\n\n setupContainer: function setupContainer() {\n var resolver = this.resolver;\n var items = (0, _emberTestHelpersBuildRegistry['default'])(resolver);\n\n this.container = items.container;\n this.registry = items.registry;\n\n if ((0, _emberTestHelpersHasEmberVersion['default'])(1, 13)) {\n var thingToRegisterWith = this.registry || this.container;\n var router = resolver.resolve('router:main');\n router = router || _ember['default'].Router.extend();\n thingToRegisterWith.register('router:main', router);\n }\n },\n\n setupContext: function setupContext() {\n var subjectName = this.subjectName;\n var container = this.container;\n\n var factory = function factory() {\n return container.lookupFactory(subjectName);\n };\n\n this._super({\n container: this.container,\n registry: this.registry,\n factory: factory,\n register: function register() {\n var target = this.registry || this.container;\n return target.register.apply(target, arguments);\n }\n });\n\n var context = this.context;\n\n if (_ember['default'].setOwner) {\n _ember['default'].setOwner(context, this.container.owner);\n }\n\n if (_ember['default'].inject) {\n var keys = (Object.keys || _ember['default'].keys)(_ember['default'].inject);\n keys.forEach(function (typeName) {\n context.inject[typeName] = function (name, opts) {\n var alias = opts && opts.as || name;\n _ember['default'].run(function () {\n _ember['default'].set(context, alias, context.container.lookup(typeName + ':' + name));\n });\n };\n });\n }\n\n // only setup the injection if we are running against a version\n // of Ember that has `-view-registry:main` (Ember >= 1.12)\n if (this.container.lookupFactory('-view-registry:main')) {\n (this.registry || this.container).injection('component', '_viewRegistry', '-view-registry:main');\n }\n },\n\n setupComponentIntegrationTest: (function () {\n if (!(0, _emberTestHelpersHasEmberVersion['default'])(1, 13)) {\n return _emberTestHelpersLegacyOverrides.preGlimmerSetupIntegrationForComponent;\n } else {\n return _emberTestHelpersTestModuleForComponent.setupComponentIntegrationTest;\n }\n })(),\n\n teardownComponent: function teardownComponent() {\n var component = this.component;\n if (component) {\n _ember['default'].run(function () {\n component.destroy();\n });\n }\n },\n\n teardownContainer: function teardownContainer() {\n var container = this.container;\n _ember['default'].run(function () {\n container.destroy();\n });\n },\n\n // allow arbitrary named factories, like rspec let\n contextualizeCallbacks: function contextualizeCallbacks() {\n var callbacks = this.callbacks;\n var context = this.context;\n\n this.cache = this.cache || {};\n this.cachedCalls = this.cachedCalls || {};\n\n var keys = (Object.keys || _ember['default'].keys)(callbacks);\n var keysLength = keys.length;\n\n if (keysLength) {\n for (var i = 0; i < keysLength; i++) {\n this._contextualizeCallback(context, keys[i], context);\n }\n }\n },\n\n _contextualizeCallback: function _contextualizeCallback(context, key, callbackContext) {\n var _this = this;\n var callbacks = this.callbacks;\n var factory = context.factory;\n\n context[key] = function (options) {\n if (_this.cachedCalls[key]) {\n return _this.cache[key];\n }\n\n var result = callbacks[key].call(callbackContext, options, factory());\n\n _this.cache[key] = result;\n _this.cachedCalls[key] = true;\n\n return result;\n };\n },\n\n _aliasViewRegistry: function _aliasViewRegistry() {\n this._originalGlobalViewRegistry = _ember['default'].View.views;\n var viewRegistry = this.container.lookup('-view-registry:main');\n\n if (viewRegistry) {\n _ember['default'].View.views = viewRegistry;\n }\n },\n\n _resetViewRegistry: function _resetViewRegistry() {\n _ember['default'].View.views = this._originalGlobalViewRegistry;\n }\n });\n});","define('ember-test-helpers/test-module-for-model', ['exports', 'ember-test-helpers/test-module', 'ember'], function (exports, _emberTestHelpersTestModule, _ember) {\n /* global DS, require, requirejs */ // added here to prevent an import from erroring when ED is not present\n\n 'use strict';\n\n exports['default'] = _emberTestHelpersTestModule['default'].extend({\n init: function init(modelName, description, callbacks) {\n this.modelName = modelName;\n\n this._super.call(this, 'model:' + modelName, description, callbacks);\n\n this.setupSteps.push(this.setupModel);\n },\n\n setupModel: function setupModel() {\n var container = this.container;\n var defaultSubject = this.defaultSubject;\n var callbacks = this.callbacks;\n var modelName = this.modelName;\n\n var adapterFactory = container.lookupFactory('adapter:application');\n if (!adapterFactory) {\n if (requirejs.entries['ember-data/adapters/json-api']) {\n adapterFactory = require('ember-data/adapters/json-api')['default'];\n }\n\n // when ember-data/adapters/json-api is provided via ember-cli shims\n // using Ember Data 1.x the actual JSONAPIAdapter isn't found, but the\n // above require statement returns a bizzaro object with only a `default`\n // property (circular reference actually)\n if (!adapterFactory || !adapterFactory.create) {\n adapterFactory = DS.JSONAPIAdapter || DS.FixtureAdapter;\n }\n\n var thingToRegisterWith = this.registry || this.container;\n thingToRegisterWith.register('adapter:application', adapterFactory);\n }\n\n callbacks.store = function () {\n var container = this.container;\n var store = container.lookup('service:store') || container.lookup('store:main');\n return store;\n };\n\n if (callbacks.subject === defaultSubject) {\n callbacks.subject = function (options) {\n var container = this.container;\n\n return _ember['default'].run(function () {\n var store = container.lookup('service:store') || container.lookup('store:main');\n return store.createRecord(modelName, options);\n });\n };\n }\n }\n });\n});","define('ember-test-helpers/test-module', ['exports', 'ember', 'ember-test-helpers/abstract-test-module', 'ember-test-helpers/test-resolver', 'ember-test-helpers/build-registry', 'ember-test-helpers/has-ember-version'], function (exports, _ember, _emberTestHelpersAbstractTestModule, _emberTestHelpersTestResolver, _emberTestHelpersBuildRegistry, _emberTestHelpersHasEmberVersion) {\n 'use strict';\n\n exports['default'] = _emberTestHelpersAbstractTestModule['default'].extend({\n init: function init(subjectName, description, callbacks) {\n // Allow `description` to be omitted, in which case it should\n // default to `subjectName`\n if (!callbacks && typeof description === 'object') {\n callbacks = description;\n description = subjectName;\n }\n\n this.subjectName = subjectName;\n this.description = description || subjectName;\n this.name = description || subjectName;\n this.callbacks = callbacks || {};\n this.resolver = this.callbacks.resolver || (0, _emberTestHelpersTestResolver.getResolver)();\n\n if (this.callbacks.integration && this.callbacks.needs) {\n throw new Error(\"cannot declare 'integration: true' and 'needs' in the same module\");\n }\n\n if (this.callbacks.integration) {\n if (this.isComponentTestModule) {\n this.isLegacy = callbacks.integration === 'legacy';\n this.isIntegration = callbacks.integration !== 'legacy';\n } else {\n if (callbacks.integration === 'legacy') {\n throw new Error('`integration: \\'legacy\\'` is only valid for component tests.');\n }\n this.isIntegration = true;\n }\n\n delete callbacks.integration;\n }\n\n this.initSubject();\n this.initNeeds();\n this.initSetupSteps();\n this.initTeardownSteps();\n },\n\n initSubject: function initSubject() {\n this.callbacks.subject = this.callbacks.subject || this.defaultSubject;\n },\n\n initNeeds: function initNeeds() {\n this.needs = [this.subjectName];\n if (this.callbacks.needs) {\n this.needs = this.needs.concat(this.callbacks.needs);\n delete this.callbacks.needs;\n }\n },\n\n initSetupSteps: function initSetupSteps() {\n this.setupSteps = [];\n this.contextualizedSetupSteps = [];\n\n if (this.callbacks.beforeSetup) {\n this.setupSteps.push(this.callbacks.beforeSetup);\n delete this.callbacks.beforeSetup;\n }\n\n this.setupSteps.push(this.setupContainer);\n this.setupSteps.push(this.setupContext);\n this.setupSteps.push(this.setupTestElements);\n this.setupSteps.push(this.setupAJAXListeners);\n\n if (this.callbacks.setup) {\n this.contextualizedSetupSteps.push(this.callbacks.setup);\n delete this.callbacks.setup;\n }\n },\n\n initTeardownSteps: function initTeardownSteps() {\n this.teardownSteps = [];\n this.contextualizedTeardownSteps = [];\n\n if (this.callbacks.teardown) {\n this.contextualizedTeardownSteps.push(this.callbacks.teardown);\n delete this.callbacks.teardown;\n }\n\n this.teardownSteps.push(this.teardownSubject);\n this.teardownSteps.push(this.teardownContainer);\n this.teardownSteps.push(this.teardownContext);\n this.teardownSteps.push(this.teardownTestElements);\n this.teardownSteps.push(this.teardownAJAXListeners);\n\n if (this.callbacks.afterTeardown) {\n this.teardownSteps.push(this.callbacks.afterTeardown);\n delete this.callbacks.afterTeardown;\n }\n },\n\n setupContainer: function setupContainer() {\n if (this.isIntegration || this.isLegacy) {\n this._setupIntegratedContainer();\n } else {\n this._setupIsolatedContainer();\n }\n },\n\n setupContext: function setupContext() {\n var subjectName = this.subjectName;\n var container = this.container;\n\n var factory = function factory() {\n return container.lookupFactory(subjectName);\n };\n\n this._super({\n container: this.container,\n registry: this.registry,\n factory: factory,\n register: function register() {\n var target = this.registry || this.container;\n return target.register.apply(target, arguments);\n }\n });\n\n if (_ember['default'].setOwner) {\n _ember['default'].setOwner(this.context, this.container.owner);\n }\n\n this.setupInject();\n },\n\n setupInject: function setupInject() {\n var module = this;\n var context = this.context;\n\n if (_ember['default'].inject) {\n var keys = (Object.keys || _ember['default'].keys)(_ember['default'].inject);\n\n keys.forEach(function (typeName) {\n context.inject[typeName] = function (name, opts) {\n var alias = opts && opts.as || name;\n _ember['default'].run(function () {\n _ember['default'].set(context, alias, module.container.lookup(typeName + ':' + name));\n });\n };\n });\n }\n },\n\n teardownSubject: function teardownSubject() {\n var subject = this.cache.subject;\n\n if (subject) {\n _ember['default'].run(function () {\n _ember['default'].tryInvoke(subject, 'destroy');\n });\n }\n },\n\n teardownContainer: function teardownContainer() {\n var container = this.container;\n _ember['default'].run(function () {\n container.destroy();\n });\n },\n\n defaultSubject: function defaultSubject(options, factory) {\n return factory.create(options);\n },\n\n // allow arbitrary named factories, like rspec let\n contextualizeCallbacks: function contextualizeCallbacks() {\n var callbacks = this.callbacks;\n var context = this.context;\n\n this.cache = this.cache || {};\n this.cachedCalls = this.cachedCalls || {};\n\n var keys = (Object.keys || _ember['default'].keys)(callbacks);\n var keysLength = keys.length;\n\n if (keysLength) {\n var deprecatedContext = this._buildDeprecatedContext(this, context);\n for (var i = 0; i < keysLength; i++) {\n this._contextualizeCallback(context, keys[i], deprecatedContext);\n }\n }\n },\n\n _contextualizeCallback: function _contextualizeCallback(context, key, callbackContext) {\n var _this = this;\n var callbacks = this.callbacks;\n var factory = context.factory;\n\n context[key] = function (options) {\n if (_this.cachedCalls[key]) {\n return _this.cache[key];\n }\n\n var result = callbacks[key].call(callbackContext, options, factory());\n\n _this.cache[key] = result;\n _this.cachedCalls[key] = true;\n\n return result;\n };\n },\n\n /*\n Builds a version of the passed in context that contains deprecation warnings\n for accessing properties that exist on the module.\n */\n _buildDeprecatedContext: function _buildDeprecatedContext(module, context) {\n var deprecatedContext = Object.create(context);\n\n var keysForDeprecation = Object.keys(module);\n\n for (var i = 0, l = keysForDeprecation.length; i < l; i++) {\n this._proxyDeprecation(module, deprecatedContext, keysForDeprecation[i]);\n }\n\n return deprecatedContext;\n },\n\n /*\n Defines a key on an object to act as a proxy for deprecating the original.\n */\n _proxyDeprecation: function _proxyDeprecation(obj, proxy, key) {\n if (typeof proxy[key] === 'undefined') {\n Object.defineProperty(proxy, key, {\n get: function get() {\n _ember['default'].deprecate('Accessing the test module property \"' + key + '\" from a callback is deprecated.', false, { id: 'ember-test-helpers.test-module.callback-context', until: '0.6.0' });\n return obj[key];\n }\n });\n }\n },\n\n _setupContainer: function _setupContainer(isolated) {\n var resolver = this.resolver;\n\n var items = (0, _emberTestHelpersBuildRegistry['default'])(!isolated ? resolver : Object.create(resolver, {\n resolve: {\n value: function value() {}\n }\n }));\n\n this.container = items.container;\n this.registry = items.registry;\n\n if ((0, _emberTestHelpersHasEmberVersion['default'])(1, 13)) {\n var thingToRegisterWith = this.registry || this.container;\n var router = resolver.resolve('router:main');\n router = router || _ember['default'].Router.extend();\n thingToRegisterWith.register('router:main', router);\n }\n },\n\n _setupIsolatedContainer: function _setupIsolatedContainer() {\n var resolver = this.resolver;\n this._setupContainer(true);\n\n var thingToRegisterWith = this.registry || this.container;\n\n for (var i = this.needs.length; i > 0; i--) {\n var fullName = this.needs[i - 1];\n var normalizedFullName = resolver.normalize(fullName);\n thingToRegisterWith.register(fullName, resolver.resolve(normalizedFullName));\n }\n\n if (!this.registry) {\n this.container.resolver = function () {};\n }\n },\n\n _setupIntegratedContainer: function _setupIntegratedContainer() {\n this._setupContainer();\n }\n\n });\n});","define('ember-test-helpers/test-resolver', ['exports'], function (exports) {\n 'use strict';\n\n exports.setResolver = setResolver;\n exports.getResolver = getResolver;\n var __resolver__;\n\n function setResolver(resolver) {\n __resolver__ = resolver;\n }\n\n function getResolver() {\n if (__resolver__ == null) {\n throw new Error('you must set a resolver with `testResolver.set(resolver)`');\n }\n\n return __resolver__;\n }\n});","define('ember-test-helpers/wait', ['exports', 'ember'], function (exports, _ember) {\n /* globals self */\n\n 'use strict';\n\n var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\n exports._teardownAJAXHooks = _teardownAJAXHooks;\n exports._setupAJAXHooks = _setupAJAXHooks;\n exports['default'] = wait;\n\n var jQuery = _ember['default'].$;\n\n var requests;\n function incrementAjaxPendingRequests(_, xhr) {\n requests.push(xhr);\n }\n\n function decrementAjaxPendingRequests(_, xhr) {\n for (var i = 0; i < requests.length; i++) {\n if (xhr === requests[i]) {\n requests.splice(i, 1);\n }\n }\n }\n\n function _teardownAJAXHooks() {\n if (!jQuery) {\n return;\n }\n\n jQuery(document).off('ajaxSend', incrementAjaxPendingRequests);\n jQuery(document).off('ajaxComplete', decrementAjaxPendingRequests);\n }\n\n function _setupAJAXHooks() {\n requests = [];\n\n if (!jQuery) {\n return;\n }\n\n jQuery(document).on('ajaxSend', incrementAjaxPendingRequests);\n jQuery(document).on('ajaxComplete', decrementAjaxPendingRequests);\n }\n\n var _internalCheckWaiters;\n if (_ember['default'].__loader.registry['ember-testing/test/waiters']) {\n _internalCheckWaiters = _ember['default'].__loader.require('ember-testing/test/waiters').checkWaiters;\n }\n\n function checkWaiters() {\n if (_internalCheckWaiters) {\n return _internalCheckWaiters();\n } else if (_ember['default'].Test.waiters) {\n if (_ember['default'].Test.waiters.any(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2);\n\n var context = _ref2[0];\n var callback = _ref2[1];\n return !callback.call(context);\n })) {\n return true;\n }\n }\n\n return false;\n }\n\n function wait(_options) {\n var options = _options || {};\n var waitForTimers = options.hasOwnProperty('waitForTimers') ? options.waitForTimers : true;\n var waitForAJAX = options.hasOwnProperty('waitForAJAX') ? options.waitForAJAX : true;\n var waitForWaiters = options.hasOwnProperty('waitForWaiters') ? options.waitForWaiters : true;\n\n return new _ember['default'].RSVP.Promise(function (resolve) {\n var watcher = self.setInterval(function () {\n if (waitForTimers && (_ember['default'].run.hasScheduledTimers() || _ember['default'].run.currentRunLoop)) {\n return;\n }\n\n if (waitForAJAX && requests && requests.length > 0) {\n return;\n }\n\n if (waitForWaiters && checkWaiters()) {\n return;\n }\n\n // Stop polling\n self.clearInterval(watcher);\n\n // Synchronously resolve the promise\n _ember['default'].run(null, resolve);\n }, 10);\n });\n }\n});","define('klassy', ['exports'], function (exports) {\n /**\n Extend a class with the properties and methods of one or more other classes.\n \n When a method is replaced with another method, it will be wrapped in a\n function that makes the replaced method accessible via `this._super`.\n \n @method extendClass\n @param {Object} destination The class to merge into\n @param {Object} source One or more source classes\n */\n 'use strict';\n\n var extendClass = function extendClass(destination) {\n var sources = Array.prototype.slice.call(arguments, 1);\n var source;\n\n for (var i = 0, l = sources.length; i < l; i++) {\n source = sources[i];\n\n for (var p in source) {\n if (source.hasOwnProperty(p) && destination[p] && typeof destination[p] === 'function' && typeof source[p] === 'function') {\n\n /* jshint loopfunc:true */\n destination[p] = (function (destinationFn, sourceFn) {\n var wrapper = function wrapper() {\n var prevSuper = this._super;\n this._super = destinationFn;\n\n var ret = sourceFn.apply(this, arguments);\n\n this._super = prevSuper;\n\n return ret;\n };\n wrapper.wrappedFunction = sourceFn;\n return wrapper;\n })(destination[p], source[p]);\n } else {\n destination[p] = source[p];\n }\n }\n }\n };\n\n // `subclassing` is a state flag used by `defineClass` to track when a class is\n // being subclassed. It allows constructors to avoid calling `init`, which can\n // be expensive and cause undesirable side effects.\n var subclassing = false;\n\n /**\n Define a new class with the properties and methods of one or more other classes.\n \n The new class can be based on a `SuperClass`, which will be inserted into its\n prototype chain.\n \n Furthermore, one or more mixins (object that contain properties and/or methods)\n may be specified, which will be applied in order. When a method is replaced\n with another method, it will be wrapped in a function that makes the previous\n method accessible via `this._super`.\n \n @method defineClass\n @param {Object} SuperClass A base class to extend. If `mixins` are to be included\n without a `SuperClass`, pass `null` for SuperClass.\n @param {Object} mixins One or more objects that contain properties and methods\n to apply to the new class.\n */\n var defineClass = function defineClass(SuperClass) {\n var Klass = function Klass() {\n if (!subclassing && this.init) {\n this.init.apply(this, arguments);\n }\n };\n\n if (SuperClass) {\n subclassing = true;\n Klass.prototype = new SuperClass();\n subclassing = false;\n }\n\n if (arguments.length > 1) {\n var extendArgs = Array.prototype.slice.call(arguments, 1);\n extendArgs.unshift(Klass.prototype);\n extendClass.apply(Klass.prototype, extendArgs);\n }\n\n Klass.constructor = Klass;\n\n Klass.extend = function () {\n var args = Array.prototype.slice.call(arguments, 0);\n args.unshift(Klass);\n return defineClass.apply(Klass, args);\n };\n\n return Klass;\n };\n\n /**\n A base class that can be extended.\n \n @example\n \n ```javascript\n var CelestialObject = Klass.extend({\n init: function(name) {\n this._super();\n this.name = name;\n this.isCelestialObject = true;\n },\n greeting: function() {\n return 'Hello from ' + this.name;\n }\n });\n \n var Planet = CelestialObject.extend({\n init: function(name) {\n this._super.apply(this, arguments);\n this.isPlanet = true;\n },\n greeting: function() {\n return this._super() + '!';\n },\n });\n \n var earth = new Planet('Earth');\n \n console.log(earth instanceof Klass); // true\n console.log(earth instanceof CelestialObject); // true\n console.log(earth instanceof Planet); // true\n \n console.log(earth.isCelestialObject); // true\n console.log(earth.isPlanet); // true\n \n console.log(earth.greeting()); // 'Hello from Earth!'\n ```\n \n @class Klass\n */\n var Klass = defineClass(null, {\n init: function init() {}\n });\n\n exports.Klass = Klass;\n exports.defineClass = defineClass;\n exports.extendClass = extendClass;\n});","define(\"qunit\", [\"exports\"], function (exports) {\n /* globals test:true */\n\n \"use strict\";\n\n var _module = QUnit.module;\n exports.module = _module;\n var test = QUnit.test;\n exports.test = test;\n var skip = QUnit.skip;\n exports.skip = skip;\n var only = QUnit.only;\n\n exports.only = only;\n exports[\"default\"] = QUnit;\n});","/* jshint ignore:start */\n\nrunningTests = true;\n\nif (window.Testem) {\n window.Testem.hookIntoTestFramework();\n}\n\n\n\n/* jshint ignore:end */\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACz5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7uIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;","file":"test-support.js"}
\ No newline at end of file
diff --git a/priv/ember_riak_explorer/dist/assets/tests.js b/priv/ember_riak_explorer/dist/assets/tests.js
new file mode 100644
index 0000000..91ee8eb
--- /dev/null
+++ b/priv/ember_riak_explorer/dist/assets/tests.js
@@ -0,0 +1,3140 @@
+define('ember-riak-explorer/tests/adapters/application.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | adapters/application.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'adapters/application.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/adapters/bucket-list.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | adapters/bucket-list.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'adapters/bucket-list.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/adapters/bucket-type.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | adapters/bucket-type.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'adapters/bucket-type.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/adapters/bucket.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | adapters/bucket.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'adapters/bucket.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/adapters/cluster.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | adapters/cluster.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'adapters/cluster.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/adapters/config-file.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | adapters/config-file.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'adapters/config-file.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/adapters/log-file.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | adapters/log-file.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'adapters/log-file.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/adapters/node.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | adapters/node.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'adapters/node.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/adapters/object-list.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | adapters/object-list.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'adapters/object-list.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/adapters/riak-object.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | adapters/riak-object.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'adapters/riak-object.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/adapters/row-list.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | adapters/row-list.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'adapters/row-list.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/adapters/row.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | adapters/row.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'adapters/row.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/adapters/search-index.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | adapters/search-index.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'adapters/search-index.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/adapters/table.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | adapters/table.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'adapters/table.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/app.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | app.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'app.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/blanket-options', ['exports'], function (exports) {
+ /* globals blanket, module */
+ var options = {
+ modulePrefix: 'ember-riak-explorer',
+ filter: '//.*ember-riak-explorer/.*/',
+ antifilter: '//.*(tests|template).*/',
+ loaderExclusions: [],
+ enableCoverage: true,
+ cliOptions: {
+ reporters: ['json'],
+ autostart: true
+ }
+ };
+ if (typeof exports === 'undefined') {
+ blanket.options(options);
+ } else {
+ module.exports = options;
+ }
+});
+define('ember-riak-explorer/tests/blanket-options.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | blanket-options.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'blanket-options.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/alert-component.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/alert-component.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/alert-component.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/breadcrumb-component.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/breadcrumb-component.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/breadcrumb-component.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/charts/cluster-stat.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/charts/cluster-stat.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/charts/cluster-stat.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/charts/node-stat.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/charts/node-stat.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/charts/node-stat.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/cluster-status-indicator.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/cluster-status-indicator.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/cluster-status-indicator.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/dashboard-module/body.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/dashboard-module/body.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/dashboard-module/body.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/dashboard-module/container.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/dashboard-module/container.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/dashboard-module/container.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/dashboard-module/header.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/dashboard-module/header.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/dashboard-module/header.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/dashboard-module/section.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/dashboard-module/section.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/dashboard-module/section.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/form/add-custom-properties.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/form/add-custom-properties.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/form/add-custom-properties.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/form/explorer-button.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/form/explorer-button.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/form/explorer-button.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/form/explorer-input.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/form/explorer-input.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/form/explorer-input.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/hll-editor.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/hll-editor.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/hll-editor.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/link/explorer-resource.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/link/explorer-resource.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/link/explorer-resource.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/loading-spinner.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/loading-spinner.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/loading-spinner.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/map-object/contents.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/map-object/contents.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/map-object/contents.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/map-object/map.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/map-object/map.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/map-object/map.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/map-object/maps.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/map-object/maps.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/map-object/maps.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/map-object/section.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/map-object/section.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/map-object/section.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/map-object/sets.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/map-object/sets.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/map-object/sets.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/new-object-inputs.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/new-object-inputs.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/new-object-inputs.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/pagination-component.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/pagination-component.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/pagination-component.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/set-editor.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/set-editor.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/set-editor.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/side-drawer.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/side-drawer.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/side-drawer.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/table/bucket-props-advanced.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/table/bucket-props-advanced.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/table/bucket-props-advanced.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/table/bucket-props-overview.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/table/bucket-props-overview.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/table/bucket-props-overview.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/table/bucket-types.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/table/bucket-types.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/table/bucket-types.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/table/object-headers.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/table/object-headers.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/table/object-headers.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/table/object-version.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/table/object-version.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/table/object-version.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/table/search-indexes.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/table/search-indexes.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/table/search-indexes.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/table/table-overview.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/table/table-overview.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/table/table-overview.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/table/ts-table-reference.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/table/ts-table-reference.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/table/ts-table-reference.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/table/ts-tables.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/table/ts-tables.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/table/ts-tables.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/tooltip/bucket-props.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/tooltip/bucket-props.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/tooltip/bucket-props.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/tooltip/node-config.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/tooltip/node-config.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/tooltip/node-config.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/tooltip/node-stats.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/tooltip/node-stats.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/tooltip/node-stats.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/view-label.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/view-label.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/view-label.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/components/wrapper-panel.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | components/wrapper-panel.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'components/wrapper-panel.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/controllers/application.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | controllers/application.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'controllers/application.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/helpers/destroy-app', ['exports', 'ember'], function (exports, _ember) {
+ exports['default'] = destroyApp;
+
+ function destroyApp(application) {
+ _ember['default'].run(application, 'destroy');
+ }
+});
+define('ember-riak-explorer/tests/helpers/destroy-app.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | helpers/destroy-app.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'helpers/destroy-app.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/helpers/ember-power-select', ['exports', 'ember'], function (exports, _ember) {
+ exports.triggerKeydown = triggerKeydown;
+ exports.typeInSearch = typeInSearch;
+ exports.clickTrigger = clickTrigger;
+
+ // Helpers for integration tests
+
+ function typeText(selector, text) {
+ $(selector).val(text);
+ $(selector).trigger('input');
+ }
+
+ function triggerKeydown(domElement, k) {
+ var oEvent = document.createEvent("Events");
+ oEvent.initEvent('keydown', true, true);
+ $.extend(oEvent, {
+ view: window,
+ ctrlKey: false,
+ altKey: false,
+ shiftKey: false,
+ metaKey: false,
+ keyCode: k,
+ charCode: k
+ });
+ _ember['default'].run(function () {
+ domElement.dispatchEvent(oEvent);
+ });
+ }
+
+ function typeInSearch(text) {
+ _ember['default'].run(function () {
+ typeText('.ember-power-select-search input, .ember-power-select-trigger-multiple-input', text);
+ });
+ }
+
+ function clickTrigger(scope) {
+ var selector = '.ember-power-select-trigger';
+ if (scope) {
+ selector = scope + ' ' + selector;
+ }
+ var event = new window.Event('mousedown', { bubbles: true, cancelable: true, view: window });
+ _ember['default'].run(function () {
+ return _ember['default'].$(selector)[0].dispatchEvent(event);
+ });
+ }
+
+ // Helpers for acceptance tests
+
+ exports['default'] = function () {
+ var isEmberOne = _ember['default'].VERSION.match(/1\.13/);
+
+ _ember['default'].Test.registerAsyncHelper('selectChoose', function (app, cssPath, value) {
+ var uuid = find(cssPath).find('.ember-power-select-trigger').attr('class').match(/ember-power-select-trigger-(\d+)/)[1];
+ // If the dropdown is closed, open it
+ if (_ember['default'].$('.ember-power-select-dropdown-' + uuid).length === 0) {
+ click(cssPath + ' .ember-power-select-trigger');
+ }
+
+ // Select the option with the given text
+ click('.ember-power-select-dropdown-' + uuid + ' .ember-power-select-option:contains("' + value + '")');
+ });
+
+ _ember['default'].Test.registerAsyncHelper('selectSearch', function (app, cssPath, value) {
+ var uuid = find(cssPath).find('.ember-power-select-trigger').attr('class').match(/ember-power-select-trigger-(\d+)/)[1];
+ var isMultipleSelect = _ember['default'].$(cssPath + ' .ember-power-select-trigger-multiple-input').length > 0;
+
+ var dropdownIsClosed = _ember['default'].$('.ember-power-select-dropdown-' + uuid).length === 0;
+ if (dropdownIsClosed) {
+ click(cssPath + ' .ember-power-select-trigger');
+ }
+
+ if (isMultipleSelect) {
+ fillIn(cssPath + ' .ember-power-select-trigger-multiple-input', value);
+ if (isEmberOne) {
+ triggerEvent(cssPath + ' .ember-power-select-trigger-multiple-input', 'input');
+ }
+ } else {
+ fillIn('.ember-power-select-search input', value);
+ if (isEmberOne) {
+ triggerEvent('.ember-power-select-dropdown-' + uuid + ' .ember-power-select-search input', 'input');
+ }
+ }
+ });
+ };
+});
+define('ember-riak-explorer/tests/helpers/module-for-acceptance', ['exports', 'qunit', 'ember-riak-explorer/tests/helpers/start-app', 'ember-riak-explorer/tests/helpers/destroy-app'], function (exports, _qunit, _emberRiakExplorerTestsHelpersStartApp, _emberRiakExplorerTestsHelpersDestroyApp) {
+ exports['default'] = function (name) {
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
+
+ (0, _qunit.module)(name, {
+ beforeEach: function beforeEach() {
+ this.application = (0, _emberRiakExplorerTestsHelpersStartApp['default'])();
+
+ if (options.beforeEach) {
+ options.beforeEach.apply(this, arguments);
+ }
+ },
+
+ afterEach: function afterEach() {
+ (0, _emberRiakExplorerTestsHelpersDestroyApp['default'])(this.application);
+
+ if (options.afterEach) {
+ options.afterEach.apply(this, arguments);
+ }
+ }
+ });
+ };
+});
+define('ember-riak-explorer/tests/helpers/module-for-acceptance.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | helpers/module-for-acceptance.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'helpers/module-for-acceptance.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/helpers/object-length.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | helpers/object-length.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'helpers/object-length.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/helpers/resolver', ['exports', 'ember-riak-explorer/resolver', 'ember-riak-explorer/config/environment'], function (exports, _emberRiakExplorerResolver, _emberRiakExplorerConfigEnvironment) {
+
+ var resolver = _emberRiakExplorerResolver['default'].create();
+
+ resolver.namespace = {
+ modulePrefix: _emberRiakExplorerConfigEnvironment['default'].modulePrefix,
+ podModulePrefix: _emberRiakExplorerConfigEnvironment['default'].podModulePrefix
+ };
+
+ exports['default'] = resolver;
+});
+define('ember-riak-explorer/tests/helpers/resolver.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | helpers/resolver.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'helpers/resolver.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/helpers/start-app', ['exports', 'ember', 'ember-riak-explorer/app', 'ember-riak-explorer/config/environment'], function (exports, _ember, _emberRiakExplorerApp, _emberRiakExplorerConfigEnvironment) {
+ exports['default'] = startApp;
+
+ function startApp(attrs) {
+ var application = undefined;
+
+ var attributes = _ember['default'].merge({}, _emberRiakExplorerConfigEnvironment['default'].APP);
+ attributes = _ember['default'].merge(attributes, attrs); // use defaults, but you can override;
+
+ _ember['default'].run(function () {
+ application = _emberRiakExplorerApp['default'].create(attributes);
+ application.setupForTesting();
+ application.injectTestHelpers();
+ });
+
+ return application;
+ }
+});
+define('ember-riak-explorer/tests/helpers/start-app.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | helpers/start-app.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'helpers/start-app.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/initializers/explorer.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | initializers/explorer.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'initializers/explorer.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/integration/components/cluster-status-indicator-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {
+
+ (0, _emberQunit.moduleForComponent)('cluster-status-indicator', 'Integration | Component | cluster status indicator', {
+ integration: true
+ });
+
+ (0, _emberQunit.test)('it renders', function (assert) {
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.on('myAction', function(val) { ... });"
+
+ this.render(Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ 'fragmentReason': {
+ 'name': 'missing-wrapper',
+ 'problems': ['wrong-type']
+ },
+ 'revision': 'Ember@2.5.1',
+ 'loc': {
+ 'source': null,
+ 'start': {
+ 'line': 1,
+ 'column': 0
+ },
+ 'end': {
+ 'line': 1,
+ 'column': 28
+ }
+ }
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment('');
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [['content', 'cluster-status-indicator', ['loc', [null, [1, 0], [1, 28]]]]],
+ locals: [],
+ templates: []
+ };
+ })()));
+
+ assert.equal(this.$().text().trim(), '');
+
+ // Template block usage:"
+ this.render(Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ 'fragmentReason': false,
+ 'revision': 'Ember@2.5.1',
+ 'loc': {
+ 'source': null,
+ 'start': {
+ 'line': 2,
+ 'column': 4
+ },
+ 'end': {
+ 'line': 4,
+ 'column': 4
+ }
+ }
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(' template block text\n');
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+
+ return {
+ meta: {
+ 'fragmentReason': {
+ 'name': 'missing-wrapper',
+ 'problems': ['wrong-type']
+ },
+ 'revision': 'Ember@2.5.1',
+ 'loc': {
+ 'source': null,
+ 'start': {
+ 'line': 1,
+ 'column': 0
+ },
+ 'end': {
+ 'line': 5,
+ 'column': 2
+ }
+ }
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode('\n');
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment('');
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode(' ');
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [['block', 'cluster-status-indicator', [], [], 0, null, ['loc', [null, [2, 4], [4, 33]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })()));
+
+ assert.equal(this.$().text().trim(), 'template block text');
+ });
+});
+define('ember-riak-explorer/tests/integration/components/cluster-status-indicator-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | integration/components/cluster-status-indicator-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'integration/components/cluster-status-indicator-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/integration/components/dashboard-module/section-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {
+
+ (0, _emberQunit.moduleForComponent)('dashboard-module/section', 'Integration | Component | dashboard module/section', {
+ integration: true
+ });
+
+ (0, _emberQunit.test)('it renders', function (assert) {
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.on('myAction', function(val) { ... });
+
+ this.render(Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ 'fragmentReason': {
+ 'name': 'missing-wrapper',
+ 'problems': ['wrong-type']
+ },
+ 'revision': 'Ember@2.5.1',
+ 'loc': {
+ 'source': null,
+ 'start': {
+ 'line': 1,
+ 'column': 0
+ },
+ 'end': {
+ 'line': 1,
+ 'column': 28
+ }
+ }
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment('');
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [['content', 'dashboard-module/section', ['loc', [null, [1, 0], [1, 28]]]]],
+ locals: [],
+ templates: []
+ };
+ })()));
+
+ assert.equal(this.$().text().trim(), '');
+
+ // Template block usage:
+ this.render(Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ 'fragmentReason': false,
+ 'revision': 'Ember@2.5.1',
+ 'loc': {
+ 'source': null,
+ 'start': {
+ 'line': 2,
+ 'column': 4
+ },
+ 'end': {
+ 'line': 4,
+ 'column': 4
+ }
+ }
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(' template block text\n');
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+
+ return {
+ meta: {
+ 'fragmentReason': {
+ 'name': 'missing-wrapper',
+ 'problems': ['wrong-type']
+ },
+ 'revision': 'Ember@2.5.1',
+ 'loc': {
+ 'source': null,
+ 'start': {
+ 'line': 1,
+ 'column': 0
+ },
+ 'end': {
+ 'line': 5,
+ 'column': 2
+ }
+ }
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode('\n');
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment('');
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode(' ');
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [['block', 'dashboard-module/section', [], [], 0, null, ['loc', [null, [2, 4], [4, 33]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })()));
+
+ assert.equal(this.$().text().trim(), 'template block text');
+ });
+});
+define('ember-riak-explorer/tests/integration/components/dashboard-module/section-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | integration/components/dashboard-module/section-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'integration/components/dashboard-module/section-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/integration/components/tooltip/node-config-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {
+
+ (0, _emberQunit.moduleForComponent)('tooltip/node-config', 'Integration | Component | tooltip/node config', {
+ integration: true
+ });
+
+ (0, _emberQunit.test)('it renders', function (assert) {
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.on('myAction', function(val) { ... });"
+
+ this.render(Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ 'fragmentReason': {
+ 'name': 'missing-wrapper',
+ 'problems': ['wrong-type']
+ },
+ 'revision': 'Ember@2.5.1',
+ 'loc': {
+ 'source': null,
+ 'start': {
+ 'line': 1,
+ 'column': 0
+ },
+ 'end': {
+ 'line': 1,
+ 'column': 23
+ }
+ }
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment('');
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [['content', 'tooltip/node-config', ['loc', [null, [1, 0], [1, 23]]]]],
+ locals: [],
+ templates: []
+ };
+ })()));
+
+ assert.equal(this.$().text().trim(), '');
+
+ // Template block usage:"
+ this.render(Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ 'fragmentReason': false,
+ 'revision': 'Ember@2.5.1',
+ 'loc': {
+ 'source': null,
+ 'start': {
+ 'line': 2,
+ 'column': 4
+ },
+ 'end': {
+ 'line': 4,
+ 'column': 4
+ }
+ }
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(' template block text\n');
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+
+ return {
+ meta: {
+ 'fragmentReason': {
+ 'name': 'missing-wrapper',
+ 'problems': ['wrong-type']
+ },
+ 'revision': 'Ember@2.5.1',
+ 'loc': {
+ 'source': null,
+ 'start': {
+ 'line': 1,
+ 'column': 0
+ },
+ 'end': {
+ 'line': 5,
+ 'column': 2
+ }
+ }
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode('\n');
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment('');
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode(' ');
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [['block', 'tooltip/node-config', [], [], 0, null, ['loc', [null, [2, 4], [4, 28]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })()));
+
+ assert.equal(this.$().text().trim(), 'template block text');
+ });
+});
+define('ember-riak-explorer/tests/integration/components/tooltip/node-config-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | integration/components/tooltip/node-config-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'integration/components/tooltip/node-config-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/integration/components/tooltip/node-stats-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {
+
+ (0, _emberQunit.moduleForComponent)('tooltip/node-stats', 'Integration | Component | tooltip/node stats', {
+ integration: true
+ });
+
+ (0, _emberQunit.test)('it renders', function (assert) {
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.on('myAction', function(val) { ... });"
+
+ this.render(Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ 'fragmentReason': {
+ 'name': 'missing-wrapper',
+ 'problems': ['wrong-type']
+ },
+ 'revision': 'Ember@2.5.1',
+ 'loc': {
+ 'source': null,
+ 'start': {
+ 'line': 1,
+ 'column': 0
+ },
+ 'end': {
+ 'line': 1,
+ 'column': 22
+ }
+ }
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment('');
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [['content', 'tooltip/node-stats', ['loc', [null, [1, 0], [1, 22]]]]],
+ locals: [],
+ templates: []
+ };
+ })()));
+
+ assert.equal(this.$().text().trim(), '');
+
+ // Template block usage:"
+ this.render(Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ 'fragmentReason': false,
+ 'revision': 'Ember@2.5.1',
+ 'loc': {
+ 'source': null,
+ 'start': {
+ 'line': 2,
+ 'column': 4
+ },
+ 'end': {
+ 'line': 4,
+ 'column': 4
+ }
+ }
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(' template block text\n');
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes() {
+ return [];
+ },
+ statements: [],
+ locals: [],
+ templates: []
+ };
+ })();
+
+ return {
+ meta: {
+ 'fragmentReason': {
+ 'name': 'missing-wrapper',
+ 'problems': ['wrong-type']
+ },
+ 'revision': 'Ember@2.5.1',
+ 'loc': {
+ 'source': null,
+ 'start': {
+ 'line': 1,
+ 'column': 0
+ },
+ 'end': {
+ 'line': 5,
+ 'column': 2
+ }
+ }
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode('\n');
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment('');
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode(' ');
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [['block', 'tooltip/node-stats', [], [], 0, null, ['loc', [null, [2, 4], [4, 27]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })()));
+
+ assert.equal(this.$().text().trim(), 'template block text');
+ });
+});
+define('ember-riak-explorer/tests/integration/components/tooltip/node-stats-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | integration/components/tooltip/node-stats-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'integration/components/tooltip/node-stats-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/mixins/component/scroll-reset.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | mixins/component/scroll-reset.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'mixins/component/scroll-reset.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/mixins/controller/modal.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | mixins/controller/modal.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'mixins/controller/modal.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/mixins/controller/scroll-reset.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | mixins/controller/scroll-reset.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'mixins/controller/scroll-reset.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/mixins/controller/side-drawer.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | mixins/controller/side-drawer.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'mixins/controller/side-drawer.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/mixins/models/bucket-props.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | mixins/models/bucket-props.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'mixins/models/bucket-props.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/mixins/models/cached-list-watcher.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | mixins/models/cached-list-watcher.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'mixins/models/cached-list-watcher.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/mixins/models/cached-list.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | mixins/models/cached-list.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'mixins/models/cached-list.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/mixins/models/map-object.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | mixins/models/map-object.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'mixins/models/map-object.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/mixins/models/object-headers.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | mixins/models/object-headers.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'mixins/models/object-headers.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/mixins/routes/alerts.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | mixins/routes/alerts.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'mixins/routes/alerts.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/mixins/routes/loading-slider.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | mixins/routes/loading-slider.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'mixins/routes/loading-slider.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/mixins/routes/monitoring.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | mixins/routes/monitoring.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'mixins/routes/monitoring.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/mixins/routes/polling.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | mixins/routes/polling.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'mixins/routes/polling.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/mixins/routes/scroll-reset.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | mixins/routes/scroll-reset.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'mixins/routes/scroll-reset.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/mixins/routes/wrapper-state.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | mixins/routes/wrapper-state.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'mixins/routes/wrapper-state.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/models/bucket-list.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | models/bucket-list.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'models/bucket-list.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/models/object-list.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | models/object-list.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'models/object-list.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/models/row-list.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | models/row-list.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'models/row-list.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/models/row.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | models/row.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'models/row.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/bucket-type/controller.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/bucket-type/controller.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/bucket-type/controller.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/bucket-type/create/controller.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/bucket-type/create/controller.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/bucket-type/create/controller.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/bucket-type/create/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/bucket-type/create/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/bucket-type/create/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/bucket-type/edit/controller.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/bucket-type/edit/controller.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/bucket-type/edit/controller.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/bucket-type/edit/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/bucket-type/edit/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/bucket-type/edit/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/bucket-type/model.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/bucket-type/model.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/bucket-type/model.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/bucket-type/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/bucket-type/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/bucket-type/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/bucket/controller.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/bucket/controller.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/bucket/controller.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/bucket/create/controller.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/bucket/create/controller.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/bucket/create/controller.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/bucket/create/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/bucket/create/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/bucket/create/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/bucket/model.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/bucket/model.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/bucket/model.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/bucket/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/bucket/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/bucket/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/cluster/controller.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/cluster/controller.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/cluster/controller.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/cluster/data/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/cluster/data/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/cluster/data/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/cluster/model.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/cluster/model.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/cluster/model.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/cluster/ops/controller.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/cluster/ops/controller.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/cluster/ops/controller.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/cluster/ops/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/cluster/ops/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/cluster/ops/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/cluster/query/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/cluster/query/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/cluster/query/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/cluster/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/cluster/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/cluster/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/config-file/model.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/config-file/model.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/config-file/model.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/config-file/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/config-file/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/config-file/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/error/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/error/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/error/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/error/service-not-found/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/error/service-not-found/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/error/service-not-found/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/help/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/help/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/help/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/index/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/index/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/index/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/log-file/model.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/log-file/model.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/log-file/model.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/log-file/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/log-file/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/log-file/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/node/model.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/node/model.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/node/model.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/node/monitoring/controller.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/node/monitoring/controller.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/node/monitoring/controller.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/node/monitoring/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/node/monitoring/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/node/monitoring/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/node/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/node/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/node/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/riak-object/controller.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/riak-object/controller.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/riak-object/controller.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/riak-object/counter/controller.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/riak-object/counter/controller.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/riak-object/counter/controller.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/riak-object/counter/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/riak-object/counter/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/riak-object/counter/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/riak-object/create/controller.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/riak-object/create/controller.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/riak-object/create/controller.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/riak-object/create/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/riak-object/create/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/riak-object/create/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/riak-object/edit/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/riak-object/edit/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/riak-object/edit/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/riak-object/hll/controller.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/riak-object/hll/controller.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/riak-object/hll/controller.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/riak-object/hll/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/riak-object/hll/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/riak-object/hll/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/riak-object/map/controller.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/riak-object/map/controller.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/riak-object/map/controller.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/riak-object/map/edit/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/riak-object/map/edit/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/riak-object/map/edit/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/riak-object/map/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/riak-object/map/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/riak-object/map/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/riak-object/model.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/riak-object/model.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/riak-object/model.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/riak-object/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/riak-object/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/riak-object/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/riak-object/set/controller.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/riak-object/set/controller.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/riak-object/set/controller.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/riak-object/set/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/riak-object/set/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/riak-object/set/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/search-index/model.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/search-index/model.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/search-index/model.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/search-index/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/search-index/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/search-index/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/search-schema/create/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/search-schema/create/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/search-schema/create/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/search-schema/edit/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/search-schema/edit/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/search-schema/edit/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/search-schema/model.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/search-schema/model.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/search-schema/model.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/search-schema/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/search-schema/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/search-schema/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/table/controller.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/table/controller.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/table/controller.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/table/create/controller.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/table/create/controller.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/table/create/controller.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/table/create/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/table/create/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/table/create/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/table/model.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/table/model.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/table/model.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/table/query/controller.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/table/query/controller.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/table/query/controller.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/table/query/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/table/query/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/table/query/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/table/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/table/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/table/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/table/write/controller.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/table/write/controller.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/table/write/controller.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/pods/table/write/route.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | pods/table/write/route.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'pods/table/write/route.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/resolver.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | resolver.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'resolver.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/router.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | router.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'router.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/routes/application.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | routes/application.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'routes/application.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/serializers/application.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | serializers/application.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'serializers/application.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/serializers/bucket-type.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | serializers/bucket-type.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'serializers/bucket-type.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/serializers/cluster.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | serializers/cluster.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'serializers/cluster.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/serializers/config-file.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | serializers/config-file.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'serializers/config-file.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/serializers/log-file.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | serializers/log-file.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'serializers/log-file.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/serializers/node.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | serializers/node.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'serializers/node.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/serializers/row.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | serializers/row.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'serializers/row.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/serializers/search-index.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | serializers/search-index.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'serializers/search-index.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/serializers/table.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | serializers/table.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'serializers/table.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/services/explorer.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | services/explorer.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'services/explorer.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/storages/node-stats.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | storages/node-stats.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'storages/node-stats.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/test-helper', ['exports', 'ember-riak-explorer/tests/helpers/resolver', 'ember-qunit'], function (exports, _emberRiakExplorerTestsHelpersResolver, _emberQunit) {
+
+ /**
+ * Basic helper function to mark tests as pending.
+ * NOTE: This still marks the test as passed. It does style the output in the browser.
+ * No phantomJS support as of right now.
+ *
+ * @method pending
+ */
+ _emberQunit['default'].pending = function () {
+ _emberQunit['default'].test(arguments[0] + ' (PENDING TEST)', function (assert) {
+ assert.ok(!0); //dont expect any tests
+
+ $('.running').css('background', '#FFFF99');
+ });
+ };
+
+ _emberQunit['default'].setResolver(_emberRiakExplorerTestsHelpersResolver['default']);
+});
+define('ember-riak-explorer/tests/test-helper.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | test-helper.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'test-helper.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/bucket-list-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {
+
+ (0, _emberQunit.moduleFor)('adapter:bucket-list', 'Unit | Adapter | bucket list', {
+ // Specify the other units that are required for this test.
+ // needs: ['serializer:foo']
+ });
+
+ // Replace this with your real tests.
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var adapter = this.subject();
+ assert.ok(adapter);
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/bucket-list-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/adapters/bucket-list-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/adapters/bucket-list-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/bucket-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {
+
+ (0, _emberQunit.moduleFor)('adapter:bucket', 'Unit | Adapter | bucket', {
+ // Specify the other units that are required for this test.
+ // needs: ['serializer:foo']
+ });
+
+ // Replace this with your real tests.
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var adapter = this.subject();
+ assert.ok(adapter);
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/bucket-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/adapters/bucket-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/adapters/bucket-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/bucket-type-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {
+
+ (0, _emberQunit.moduleFor)('adapter:bucket-type', 'Unit | Adapter | bucket type', {
+ // Specify the other units that are required for this test.
+ // needs: ['serializer:foo']
+ });
+
+ // Replace this with your real tests.
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var adapter = this.subject();
+ assert.ok(adapter);
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/bucket-type-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/adapters/bucket-type-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/adapters/bucket-type-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/cluster-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {
+
+ (0, _emberQunit.moduleFor)('adapter:cluster', 'Unit | Adapter | cluster', {
+ // Specify the other units that are required for this test.
+ // needs: ['serializer:foo']
+ });
+
+ // Replace this with your real tests.
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var adapter = this.subject();
+ assert.ok(adapter);
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/cluster-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/adapters/cluster-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/adapters/cluster-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/config-file-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {
+
+ (0, _emberQunit.moduleFor)('adapter:config-file', 'Unit | Adapter | config file', {
+ // Specify the other units that are required for this test.
+ // needs: ['serializer:foo']
+ });
+
+ // Replace this with your real tests.
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var adapter = this.subject();
+ assert.ok(adapter);
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/config-file-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/adapters/config-file-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/adapters/config-file-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/log-file-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {
+
+ (0, _emberQunit.moduleFor)('adapter:log-file', 'Unit | Adapter | log file', {
+ // Specify the other units that are required for this test.
+ // needs: ['serializer:foo']
+ });
+
+ // Replace this with your real tests.
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var adapter = this.subject();
+ assert.ok(adapter);
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/log-file-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/adapters/log-file-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/adapters/log-file-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/riak-node-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {
+
+ (0, _emberQunit.moduleFor)('adapter:node', 'Unit | Adapter | node', {
+ // Specify the other units that are required for this test.
+ // needs: ['serializer:foo']
+ });
+
+ // Replace this with your real tests.
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var adapter = this.subject();
+ assert.ok(adapter);
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/riak-node-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/adapters/riak-node-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/adapters/riak-node-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/riak-object-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {
+
+ (0, _emberQunit.moduleFor)('adapter:riak-object', 'Unit | Adapter | riak object', {
+ // Specify the other units that are required for this test.
+ // needs: ['serializer:foo']
+ });
+
+ // Replace this with your real tests.
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var adapter = this.subject();
+ assert.ok(adapter);
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/riak-object-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/adapters/riak-object-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/adapters/riak-object-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/row-list-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {
+
+ (0, _emberQunit.moduleFor)('adapter:row-list', 'Unit | Adapter | row list', {
+ // Specify the other units that are required for this test.
+ // needs: ['serializer:foo']
+ });
+
+ // Replace this with your real tests.
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var adapter = this.subject();
+ assert.ok(adapter);
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/row-list-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/adapters/row-list-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/adapters/row-list-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/search-index-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {
+
+ (0, _emberQunit.moduleFor)('adapter:search-index', 'Unit | Adapter | search index', {
+ // Specify the other units that are required for this test.
+ // needs: ['serializer:foo']
+ });
+
+ // Replace this with your real tests.
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var adapter = this.subject();
+ assert.ok(adapter);
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/search-index-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/adapters/search-index-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/adapters/search-index-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/table-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {
+
+ (0, _emberQunit.moduleFor)('adapter:table', 'Unit | Adapter | table', {
+ // Specify the other units that are required for this test.
+ // needs: ['serializer:foo']
+ });
+
+ // Replace this with your real tests.
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var adapter = this.subject();
+ assert.ok(adapter);
+ });
+});
+define('ember-riak-explorer/tests/unit/adapters/table-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/adapters/table-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/adapters/table-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/controllers/application-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {
+
+ (0, _emberQunit.moduleFor)('controller:application', {
+ // Specify the other units that are required for this test.
+ // needs: ['controller:foo']
+ });
+
+ // Replace this with your real tests.
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var controller = this.subject();
+ assert.ok(controller);
+ });
+});
+define('ember-riak-explorer/tests/unit/controllers/application-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/controllers/application-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/controllers/application-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/helpers/object-length-test', ['exports', 'ember-riak-explorer/helpers/object-length', 'qunit'], function (exports, _emberRiakExplorerHelpersObjectLength, _qunit) {
+
+ (0, _qunit.module)('Unit | Helper | object length');
+
+ // Replace this with your real tests.
+ (0, _qunit.test)('it works', function (assert) {
+ var objectWithLength = {
+ foo: "bar",
+ haz: "cheezburger"
+ };
+
+ var objectWithOutLength = {};
+
+ var result1 = (0, _emberRiakExplorerHelpersObjectLength.objectLength)([objectWithLength]);
+ var result2 = (0, _emberRiakExplorerHelpersObjectLength.objectLength)([objectWithOutLength]);
+
+ assert.equal(result1, 2);
+ assert.equal(result2, 0);
+ });
+});
+define('ember-riak-explorer/tests/unit/helpers/object-length-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/helpers/object-length-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/helpers/object-length-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/mixins/controller/modal-test', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/modal', 'qunit'], function (exports, _ember, _emberRiakExplorerMixinsControllerModal, _qunit) {
+
+ (0, _qunit.module)('Unit | Mixin | controller/modal');
+
+ // Replace this with your real tests.
+ (0, _qunit.test)('it works', function (assert) {
+ var ControllerModalObject = _ember['default'].Object.extend(_emberRiakExplorerMixinsControllerModal['default']);
+ var subject = ControllerModalObject.create();
+ assert.ok(subject);
+ });
+});
+define('ember-riak-explorer/tests/unit/mixins/controller/modal-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/mixins/controller/modal-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/mixins/controller/modal-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/mixins/controller/side-drawer-test', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/side-drawer', 'qunit'], function (exports, _ember, _emberRiakExplorerMixinsControllerSideDrawer, _qunit) {
+
+ (0, _qunit.module)('Unit | Mixin | controller/side drawer');
+
+ // Replace this with your real tests.
+ (0, _qunit.test)('it works', function (assert) {
+ var ControllerSideDrawerObject = _ember['default'].Object.extend(_emberRiakExplorerMixinsControllerSideDrawer['default']);
+ var subject = ControllerSideDrawerObject.create();
+ assert.ok(subject);
+ });
+});
+define('ember-riak-explorer/tests/unit/mixins/controller/side-drawer-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/mixins/controller/side-drawer-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/mixins/controller/side-drawer-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/mixins/routes/loading-slider-test', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'qunit'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _qunit) {
+
+ (0, _qunit.module)('Unit | Mixin | routes/loading slider');
+
+ // Replace this with your real tests.
+ (0, _qunit.test)('it works', function (assert) {
+ var RoutesLoadingSliderObject = _ember['default'].Object.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default']);
+ var subject = RoutesLoadingSliderObject.create();
+ assert.ok(subject);
+ });
+});
+define('ember-riak-explorer/tests/unit/mixins/routes/loading-slider-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/mixins/routes/loading-slider-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/mixins/routes/loading-slider-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/mixins/routes/monitoring-test', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/monitoring', 'qunit'], function (exports, _ember, _emberRiakExplorerMixinsRoutesMonitoring, _qunit) {
+
+ (0, _qunit.module)('Unit | Mixin | routes/monitoring');
+
+ // Replace this with your real tests.
+ (0, _qunit.test)('it works', function (assert) {
+ var RoutesMonitoringObject = _ember['default'].Object.extend(_emberRiakExplorerMixinsRoutesMonitoring['default']);
+ var subject = RoutesMonitoringObject.create();
+ assert.ok(subject);
+ });
+});
+define('ember-riak-explorer/tests/unit/mixins/routes/monitoring-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/mixins/routes/monitoring-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/mixins/routes/monitoring-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/mixins/routes/polling-test', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/polling', 'qunit'], function (exports, _ember, _emberRiakExplorerMixinsRoutesPolling, _qunit) {
+
+ (0, _qunit.module)('Unit | Mixin | routes/polling');
+
+ // Replace this with your real tests.
+ (0, _qunit.test)('it works', function (assert) {
+ var RoutesPollingObject = _ember['default'].Object.extend(_emberRiakExplorerMixinsRoutesPolling['default']);
+ var subject = RoutesPollingObject.create();
+ assert.ok(subject);
+ });
+});
+define('ember-riak-explorer/tests/unit/mixins/routes/polling-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/mixins/routes/polling-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/mixins/routes/polling-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/mixins/routes/scroll-reset-test', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/scroll-reset', 'qunit'], function (exports, _ember, _emberRiakExplorerMixinsRoutesScrollReset, _qunit) {
+
+ (0, _qunit.module)('Unit | Mixin | routes/scroll reset');
+
+ // Replace this with your real tests.
+ (0, _qunit.test)('it works', function (assert) {
+ var RoutesScrollResetObject = _ember['default'].Object.extend(_emberRiakExplorerMixinsRoutesScrollReset['default']);
+ var subject = RoutesScrollResetObject.create();
+ assert.ok(subject);
+ });
+});
+define('ember-riak-explorer/tests/unit/mixins/routes/scroll-reset-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/mixins/routes/scroll-reset-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/mixins/routes/scroll-reset-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/models/bucket-list-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {
+
+ (0, _emberQunit.moduleForModel)('bucket-list', 'Unit | Model | bucket list', {
+ needs: ['model:bucketType']
+ });
+
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var model = this.subject();
+ var store = this.store();
+
+ assert.ok(!!model);
+ assert.ok(!!store);
+ });
+
+ (0, _emberQunit.test)('bucket type relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('bucketType');
+
+ assert.equal(relationship.key, 'bucketType');
+
+ assert.equal(relationship.kind, 'belongsTo');
+ });
+});
+define('ember-riak-explorer/tests/unit/models/bucket-list-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/models/bucket-list-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/models/bucket-list-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/models/bucket-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {
+
+ (0, _emberQunit.moduleForModel)('bucket', 'Unit | Model | bucket', {
+ needs: ['model:objectList', 'model:bucketType', 'model:riakObject']
+ });
+
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var model = this.subject();
+ var store = this.store();
+
+ assert.ok(!!model);
+ assert.ok(!!store);
+ });
+
+ (0, _emberQunit.test)('object list relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('objectList');
+
+ assert.equal(relationship.key, 'objectList');
+
+ assert.equal(relationship.kind, 'belongsTo');
+ });
+
+ (0, _emberQunit.test)('bucket type relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('bucketType');
+
+ assert.equal(relationship.key, 'bucketType');
+
+ assert.equal(relationship.kind, 'belongsTo');
+ });
+
+ (0, _emberQunit.test)('objects relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('objects');
+
+ assert.equal(relationship.key, 'objects');
+
+ assert.equal(relationship.kind, 'hasMany');
+ });
+});
+define('ember-riak-explorer/tests/unit/models/bucket-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/models/bucket-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/models/bucket-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/models/bucket-type-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {
+
+ (0, _emberQunit.moduleForModel)('bucket-type', 'Unit | Model | bucket type', {
+ needs: ['model:cluster', 'model:bucketList', 'model:bucket']
+ });
+
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var model = this.subject();
+ var store = this.store();
+
+ assert.ok(!!model);
+ assert.ok(!!store);
+ });
+
+ (0, _emberQunit.test)('cluster relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('cluster');
+
+ assert.equal(relationship.key, 'cluster');
+
+ assert.equal(relationship.kind, 'belongsTo');
+ });
+
+ (0, _emberQunit.test)('bucket lists relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('bucketList');
+
+ assert.equal(relationship.key, 'bucketList');
+
+ assert.equal(relationship.kind, 'belongsTo');
+ });
+
+ (0, _emberQunit.test)('buckets relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('buckets');
+
+ assert.equal(relationship.key, 'buckets');
+ assert.equal(relationship.kind, 'hasMany');
+ });
+});
+define('ember-riak-explorer/tests/unit/models/bucket-type-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/models/bucket-type-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/models/bucket-type-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/models/cluster-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {
+
+ (0, _emberQunit.moduleForModel)('cluster', 'Unit | Model | cluster', {
+ needs: ['model:bucketType', 'model:node', 'model:searchIndex', 'model:searchSchema', 'model:config-file', 'model:log-file', 'model:table']
+ });
+
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var model = this.subject();
+ var store = this.store();
+
+ assert.ok(!!model);
+ assert.ok(!!store);
+ });
+
+ (0, _emberQunit.test)('bucketTypes relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('bucketTypes');
+
+ assert.equal(relationship.key, 'bucketTypes');
+ assert.equal(relationship.kind, 'hasMany');
+ });
+
+ (0, _emberQunit.test)('nodes relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('nodes');
+
+ assert.equal(relationship.key, 'nodes');
+ assert.equal(relationship.kind, 'hasMany');
+ });
+
+ (0, _emberQunit.test)('searchIndexes relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('searchIndexes');
+
+ assert.equal(relationship.key, 'searchIndexes');
+ assert.equal(relationship.kind, 'hasMany');
+ });
+
+ (0, _emberQunit.test)('searchSchemas relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('searchSchemas');
+
+ assert.equal(relationship.key, 'searchSchemas');
+ assert.equal(relationship.kind, 'hasMany');
+ });
+
+ (0, _emberQunit.test)('tables relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('tables');
+
+ assert.equal(relationship.key, 'tables');
+ assert.equal(relationship.kind, 'hasMany');
+ });
+
+ (0, _emberQunit.pending)('getting active bucket types', function () {});
+
+ (0, _emberQunit.pending)('getting inactive bucket types', function () {});
+
+ (0, _emberQunit.pending)('determining production mode', function () {});
+
+ (0, _emberQunit.test)('status', function (assert) {
+ var model = this.subject();
+ var store = this.store();
+
+ _ember['default'].run(function () {
+ // No nodes should return down
+ assert.equal(model.get('status'), 'down');
+
+ // Create some mock nodes
+ var node1 = store.createRecord('node', { name: 'node1', cluster: model });
+ var node2 = store.createRecord('node', { name: 'node2', cluster: model });
+ var node3 = store.createRecord('node', { name: 'node3', cluster: model });
+
+ node1.set('available', true);
+ node1.set('status', 'valid');
+ node2.set('available', true);
+ node2.set('status', 'valid');
+ node3.set('available', true);
+ node3.set('status', 'valid');
+ assert.equal(model.get('status'), 'ok');
+
+ node1.set('available', false);
+ node1.set('status', 'valid');
+ node2.set('available', false);
+ node2.set('status', 'invalid');
+ node3.set('available', false);
+ node3.set('status', 'valid');
+ assert.equal(model.get('status'), 'down');
+
+ node1.set('available', true);
+ node1.set('status', 'valid');
+ node2.set('available', false);
+ node2.set('status', 'invalid');
+ node3.set('available', false);
+ node3.set('status', 'valid');
+ assert.equal(model.get('status'), 'warning');
+ });
+ });
+
+ (0, _emberQunit.test)('supportsHyperLogLogs', function (assert) {
+ var model = this.subject();
+
+ _ember['default'].run(function () {
+ model.set('riakVersion', '1.2.0');
+ assert.equal(model.get('supportsHyperLogLogs'), false);
+
+ model.set('riakVersion', '2.0.0');
+ assert.equal(model.get('supportsHyperLogLogs'), false);
+
+ model.set('riakVersion', '2.1.0');
+ assert.equal(model.get('supportsHyperLogLogs'), false);
+
+ model.set('riakVersion', '2.2.0');
+ assert.equal(model.get('supportsHyperLogLogs'), true);
+
+ model.set('riakVersion', '2.3.0');
+ assert.equal(model.get('supportsHyperLogLogs'), true);
+ });
+ });
+});
+define('ember-riak-explorer/tests/unit/models/cluster-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/models/cluster-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/models/cluster-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/models/config-file-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {
+
+ (0, _emberQunit.moduleForModel)('config-file', 'Unit | Model | config file', {
+ needs: ['model:node']
+ });
+
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var model = this.subject();
+ var store = this.store();
+
+ assert.ok(!!model);
+ assert.ok(!!store);
+ });
+
+ (0, _emberQunit.test)('node relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('node');
+
+ assert.equal(relationship.key, 'node');
+ assert.equal(relationship.kind, 'belongsTo');
+ });
+});
+define('ember-riak-explorer/tests/unit/models/config-file-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/models/config-file-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/models/config-file-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/models/log-file-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {
+
+ (0, _emberQunit.moduleForModel)('log-file', 'Unit | Model | log file', {
+ needs: ['model:node']
+ });
+
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var model = this.subject();
+ var store = this.store();
+
+ assert.ok(!!model);
+ assert.ok(!!store);
+ });
+
+ (0, _emberQunit.test)('node relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('node');
+
+ assert.equal(relationship.key, 'node');
+ assert.equal(relationship.kind, 'belongsTo');
+ });
+});
+define('ember-riak-explorer/tests/unit/models/log-file-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/models/log-file-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/models/log-file-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/models/node-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {
+
+ (0, _emberQunit.moduleForModel)('node', 'Unit | Model | node', {
+ needs: ['model:cluster', 'model:log-file', 'model:config-file']
+ });
+
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var model = this.subject();
+ var store = this.store();
+
+ assert.ok(!!model);
+ assert.ok(!!store);
+ });
+
+ (0, _emberQunit.test)('cluster relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('cluster');
+
+ assert.equal(relationship.key, 'cluster');
+ assert.equal(relationship.kind, 'belongsTo');
+ });
+
+ (0, _emberQunit.test)('log files relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('logFiles');
+
+ assert.equal(relationship.key, 'logFiles');
+ assert.equal(relationship.kind, 'hasMany');
+ });
+
+ (0, _emberQunit.test)('config files relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('configFiles');
+
+ assert.equal(relationship.key, 'configFiles');
+ assert.equal(relationship.kind, 'hasMany');
+ });
+
+ (0, _emberQunit.test)('isHealthy', function (assert) {
+ var model = this.subject();
+
+ _ember['default'].run(function () {
+ model.set('available', true);
+ model.set('status', 'valid');
+ assert.equal(model.get('isHealthy'), true);
+
+ model.set('available', false);
+ model.set('status', 'valid');
+ assert.equal(model.get('isHealthy'), false);
+
+ model.set('available', true);
+ model.set('status', 'invalid');
+ assert.equal(model.get('isHealthy'), false);
+ });
+ });
+});
+define('ember-riak-explorer/tests/unit/models/node-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/models/node-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/models/node-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/models/riak-object-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {
+
+ (0, _emberQunit.moduleForModel)('riak-object', 'Unit | Model | riak object', {
+ needs: ['model:bucket']
+ });
+
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var model = this.subject();
+ var store = this.store();
+
+ assert.ok(!!model);
+ assert.ok(!!store);
+ });
+
+ (0, _emberQunit.test)('bucket relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('bucket');
+
+ assert.equal(relationship.key, 'bucket');
+
+ assert.equal(relationship.kind, 'belongsTo');
+ });
+});
+define('ember-riak-explorer/tests/unit/models/riak-object-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/models/riak-object-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/models/riak-object-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/models/search-index-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {
+
+ (0, _emberQunit.moduleForModel)('search-index', 'Unit | Model | search index', {
+ needs: ['model:cluster', 'model:searchSchema']
+ });
+
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var model = this.subject();
+ var store = this.store();
+
+ assert.ok(!!model);
+ assert.ok(!!store);
+ });
+
+ (0, _emberQunit.test)('cluster relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('cluster');
+
+ assert.equal(relationship.key, 'cluster');
+
+ assert.equal(relationship.kind, 'belongsTo');
+ });
+
+ (0, _emberQunit.test)('schema relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('schema');
+
+ assert.equal(relationship.key, 'schema');
+
+ assert.equal(relationship.kind, 'belongsTo');
+ });
+});
+define('ember-riak-explorer/tests/unit/models/search-index-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/models/search-index-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/models/search-index-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/unit/models/search-schema-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {
+
+ (0, _emberQunit.moduleForModel)('search-schema', 'Unit | Model | search schema', {
+ // Specify the other units that are required for this test.
+ needs: ['model:cluster']
+ });
+
+ (0, _emberQunit.test)('it exists', function (assert) {
+ var model = this.subject();
+ var store = this.store();
+
+ assert.ok(!!model);
+ assert.ok(!!store);
+ });
+
+ (0, _emberQunit.test)('cluster relationship', function (assert) {
+ var klass = this.subject({}).constructor;
+ var relationship = _ember['default'].get(klass, 'relationshipsByName').get('cluster');
+
+ assert.equal(relationship.key, 'cluster');
+
+ assert.equal(relationship.kind, 'belongsTo');
+ });
+});
+define('ember-riak-explorer/tests/unit/models/search-schema-test.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | unit/models/search-schema-test.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'unit/models/search-schema-test.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/utils/data-type-checks.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | utils/data-type-checks.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'utils/data-type-checks.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/utils/parse-header.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | utils/parse-header.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'utils/parse-header.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/utils/riak-object-formatter.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | utils/riak-object-formatter.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'utils/riak-object-formatter.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/utils/string-helpers.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | utils/string-helpers.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'utils/string-helpers.js should pass jshint.');
+ });
+});
+define('ember-riak-explorer/tests/utils/validations.jshint', ['exports'], function (exports) {
+ 'use strict';
+
+ QUnit.module('JSHint | utils/validations.js');
+ QUnit.test('should pass jshint', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'utils/validations.js should pass jshint.');
+ });
+});
+/* jshint ignore:start */
+
+require('ember-riak-explorer/tests/test-helper');
+EmberENV.TESTS_FILE_LOADED = true;
+
+/* jshint ignore:end */
+//# sourceMappingURL=tests.map
\ No newline at end of file
diff --git a/priv/ember_riak_explorer/dist/assets/tests.map b/priv/ember_riak_explorer/dist/assets/tests.map
new file mode 100644
index 0000000..fd7babd
--- /dev/null
+++ b/priv/ember_riak_explorer/dist/assets/tests.map
@@ -0,0 +1 @@
+{"version":3,"sources":["ember-riak-explorer/tests/adapters/application.jshint.js","ember-riak-explorer/tests/adapters/bucket-list.jshint.js","ember-riak-explorer/tests/adapters/bucket-type.jshint.js","ember-riak-explorer/tests/adapters/bucket.jshint.js","ember-riak-explorer/tests/adapters/cluster.jshint.js","ember-riak-explorer/tests/adapters/config-file.jshint.js","ember-riak-explorer/tests/adapters/log-file.jshint.js","ember-riak-explorer/tests/adapters/node.jshint.js","ember-riak-explorer/tests/adapters/object-list.jshint.js","ember-riak-explorer/tests/adapters/riak-object.jshint.js","ember-riak-explorer/tests/adapters/row-list.jshint.js","ember-riak-explorer/tests/adapters/row.jshint.js","ember-riak-explorer/tests/adapters/search-index.jshint.js","ember-riak-explorer/tests/adapters/table.jshint.js","ember-riak-explorer/tests/app.jshint.js","ember-riak-explorer/tests/blanket-options.js","ember-riak-explorer/tests/blanket-options.jshint.js","ember-riak-explorer/tests/components/alert-component.jshint.js","ember-riak-explorer/tests/components/breadcrumb-component.jshint.js","ember-riak-explorer/tests/components/charts/cluster-stat.jshint.js","ember-riak-explorer/tests/components/charts/node-stat.jshint.js","ember-riak-explorer/tests/components/cluster-status-indicator.jshint.js","ember-riak-explorer/tests/components/dashboard-module/body.jshint.js","ember-riak-explorer/tests/components/dashboard-module/container.jshint.js","ember-riak-explorer/tests/components/dashboard-module/header.jshint.js","ember-riak-explorer/tests/components/dashboard-module/section.jshint.js","ember-riak-explorer/tests/components/form/add-custom-properties.jshint.js","ember-riak-explorer/tests/components/form/explorer-button.jshint.js","ember-riak-explorer/tests/components/form/explorer-input.jshint.js","ember-riak-explorer/tests/components/hll-editor.jshint.js","ember-riak-explorer/tests/components/link/explorer-resource.jshint.js","ember-riak-explorer/tests/components/loading-spinner.jshint.js","ember-riak-explorer/tests/components/map-object/contents.jshint.js","ember-riak-explorer/tests/components/map-object/map.jshint.js","ember-riak-explorer/tests/components/map-object/maps.jshint.js","ember-riak-explorer/tests/components/map-object/section.jshint.js","ember-riak-explorer/tests/components/map-object/sets.jshint.js","ember-riak-explorer/tests/components/new-object-inputs.jshint.js","ember-riak-explorer/tests/components/pagination-component.jshint.js","ember-riak-explorer/tests/components/set-editor.jshint.js","ember-riak-explorer/tests/components/side-drawer.jshint.js","ember-riak-explorer/tests/components/table/bucket-props-advanced.jshint.js","ember-riak-explorer/tests/components/table/bucket-props-overview.jshint.js","ember-riak-explorer/tests/components/table/bucket-types.jshint.js","ember-riak-explorer/tests/components/table/object-headers.jshint.js","ember-riak-explorer/tests/components/table/object-version.jshint.js","ember-riak-explorer/tests/components/table/search-indexes.jshint.js","ember-riak-explorer/tests/components/table/table-overview.jshint.js","ember-riak-explorer/tests/components/table/ts-table-reference.jshint.js","ember-riak-explorer/tests/components/table/ts-tables.jshint.js","ember-riak-explorer/tests/components/tooltip/bucket-props.jshint.js","ember-riak-explorer/tests/components/tooltip/node-config.jshint.js","ember-riak-explorer/tests/components/tooltip/node-stats.jshint.js","ember-riak-explorer/tests/components/view-label.jshint.js","ember-riak-explorer/tests/components/wrapper-panel.jshint.js","ember-riak-explorer/tests/controllers/application.jshint.js","ember-riak-explorer/tests/helpers/destroy-app.js","ember-riak-explorer/tests/helpers/destroy-app.jshint.js","ember-riak-explorer/tests/helpers/ember-power-select.js","ember-riak-explorer/tests/helpers/module-for-acceptance.js","ember-riak-explorer/tests/helpers/module-for-acceptance.jshint.js","ember-riak-explorer/tests/helpers/object-length.jshint.js","ember-riak-explorer/tests/helpers/resolver.js","ember-riak-explorer/tests/helpers/resolver.jshint.js","ember-riak-explorer/tests/helpers/start-app.js","ember-riak-explorer/tests/helpers/start-app.jshint.js","ember-riak-explorer/tests/initializers/explorer.jshint.js","ember-riak-explorer/tests/integration/components/cluster-status-indicator-test.js","ember-riak-explorer/tests/integration/components/cluster-status-indicator-test.jshint.js","ember-riak-explorer/tests/integration/components/dashboard-module/section-test.js","ember-riak-explorer/tests/integration/components/dashboard-module/section-test.jshint.js","ember-riak-explorer/tests/integration/components/tooltip/node-config-test.js","ember-riak-explorer/tests/integration/components/tooltip/node-config-test.jshint.js","ember-riak-explorer/tests/integration/components/tooltip/node-stats-test.js","ember-riak-explorer/tests/integration/components/tooltip/node-stats-test.jshint.js","ember-riak-explorer/tests/mixins/component/scroll-reset.jshint.js","ember-riak-explorer/tests/mixins/controller/modal.jshint.js","ember-riak-explorer/tests/mixins/controller/scroll-reset.jshint.js","ember-riak-explorer/tests/mixins/controller/side-drawer.jshint.js","ember-riak-explorer/tests/mixins/models/bucket-props.jshint.js","ember-riak-explorer/tests/mixins/models/cached-list-watcher.jshint.js","ember-riak-explorer/tests/mixins/models/cached-list.jshint.js","ember-riak-explorer/tests/mixins/models/map-object.jshint.js","ember-riak-explorer/tests/mixins/models/object-headers.jshint.js","ember-riak-explorer/tests/mixins/routes/alerts.jshint.js","ember-riak-explorer/tests/mixins/routes/loading-slider.jshint.js","ember-riak-explorer/tests/mixins/routes/monitoring.jshint.js","ember-riak-explorer/tests/mixins/routes/polling.jshint.js","ember-riak-explorer/tests/mixins/routes/scroll-reset.jshint.js","ember-riak-explorer/tests/mixins/routes/wrapper-state.jshint.js","ember-riak-explorer/tests/models/bucket-list.jshint.js","ember-riak-explorer/tests/models/object-list.jshint.js","ember-riak-explorer/tests/models/row-list.jshint.js","ember-riak-explorer/tests/models/row.jshint.js","ember-riak-explorer/tests/pods/bucket-type/controller.jshint.js","ember-riak-explorer/tests/pods/bucket-type/create/controller.jshint.js","ember-riak-explorer/tests/pods/bucket-type/create/route.jshint.js","ember-riak-explorer/tests/pods/bucket-type/edit/controller.jshint.js","ember-riak-explorer/tests/pods/bucket-type/edit/route.jshint.js","ember-riak-explorer/tests/pods/bucket-type/model.jshint.js","ember-riak-explorer/tests/pods/bucket-type/route.jshint.js","ember-riak-explorer/tests/pods/bucket/controller.jshint.js","ember-riak-explorer/tests/pods/bucket/create/controller.jshint.js","ember-riak-explorer/tests/pods/bucket/create/route.jshint.js","ember-riak-explorer/tests/pods/bucket/model.jshint.js","ember-riak-explorer/tests/pods/bucket/route.jshint.js","ember-riak-explorer/tests/pods/cluster/controller.jshint.js","ember-riak-explorer/tests/pods/cluster/data/route.jshint.js","ember-riak-explorer/tests/pods/cluster/model.jshint.js","ember-riak-explorer/tests/pods/cluster/ops/controller.jshint.js","ember-riak-explorer/tests/pods/cluster/ops/route.jshint.js","ember-riak-explorer/tests/pods/cluster/query/route.jshint.js","ember-riak-explorer/tests/pods/cluster/route.jshint.js","ember-riak-explorer/tests/pods/config-file/model.jshint.js","ember-riak-explorer/tests/pods/config-file/route.jshint.js","ember-riak-explorer/tests/pods/error/route.jshint.js","ember-riak-explorer/tests/pods/error/service-not-found/route.jshint.js","ember-riak-explorer/tests/pods/help/route.jshint.js","ember-riak-explorer/tests/pods/index/route.jshint.js","ember-riak-explorer/tests/pods/log-file/model.jshint.js","ember-riak-explorer/tests/pods/log-file/route.jshint.js","ember-riak-explorer/tests/pods/node/model.jshint.js","ember-riak-explorer/tests/pods/node/monitoring/controller.jshint.js","ember-riak-explorer/tests/pods/node/monitoring/route.jshint.js","ember-riak-explorer/tests/pods/node/route.jshint.js","ember-riak-explorer/tests/pods/riak-object/controller.jshint.js","ember-riak-explorer/tests/pods/riak-object/counter/controller.jshint.js","ember-riak-explorer/tests/pods/riak-object/counter/route.jshint.js","ember-riak-explorer/tests/pods/riak-object/create/controller.jshint.js","ember-riak-explorer/tests/pods/riak-object/create/route.jshint.js","ember-riak-explorer/tests/pods/riak-object/edit/route.jshint.js","ember-riak-explorer/tests/pods/riak-object/hll/controller.jshint.js","ember-riak-explorer/tests/pods/riak-object/hll/route.jshint.js","ember-riak-explorer/tests/pods/riak-object/map/controller.jshint.js","ember-riak-explorer/tests/pods/riak-object/map/edit/route.jshint.js","ember-riak-explorer/tests/pods/riak-object/map/route.jshint.js","ember-riak-explorer/tests/pods/riak-object/model.jshint.js","ember-riak-explorer/tests/pods/riak-object/route.jshint.js","ember-riak-explorer/tests/pods/riak-object/set/controller.jshint.js","ember-riak-explorer/tests/pods/riak-object/set/route.jshint.js","ember-riak-explorer/tests/pods/search-index/model.jshint.js","ember-riak-explorer/tests/pods/search-index/route.jshint.js","ember-riak-explorer/tests/pods/search-schema/create/route.jshint.js","ember-riak-explorer/tests/pods/search-schema/edit/route.jshint.js","ember-riak-explorer/tests/pods/search-schema/model.jshint.js","ember-riak-explorer/tests/pods/search-schema/route.jshint.js","ember-riak-explorer/tests/pods/table/controller.jshint.js","ember-riak-explorer/tests/pods/table/create/controller.jshint.js","ember-riak-explorer/tests/pods/table/create/route.jshint.js","ember-riak-explorer/tests/pods/table/model.jshint.js","ember-riak-explorer/tests/pods/table/query/controller.jshint.js","ember-riak-explorer/tests/pods/table/query/route.jshint.js","ember-riak-explorer/tests/pods/table/route.jshint.js","ember-riak-explorer/tests/pods/table/write/controller.jshint.js","ember-riak-explorer/tests/pods/table/write/route.jshint.js","ember-riak-explorer/tests/resolver.jshint.js","ember-riak-explorer/tests/router.jshint.js","ember-riak-explorer/tests/routes/application.jshint.js","ember-riak-explorer/tests/serializers/application.jshint.js","ember-riak-explorer/tests/serializers/bucket-type.jshint.js","ember-riak-explorer/tests/serializers/cluster.jshint.js","ember-riak-explorer/tests/serializers/config-file.jshint.js","ember-riak-explorer/tests/serializers/log-file.jshint.js","ember-riak-explorer/tests/serializers/node.jshint.js","ember-riak-explorer/tests/serializers/row.jshint.js","ember-riak-explorer/tests/serializers/search-index.jshint.js","ember-riak-explorer/tests/serializers/table.jshint.js","ember-riak-explorer/tests/services/explorer.jshint.js","ember-riak-explorer/tests/storages/node-stats.jshint.js","ember-riak-explorer/tests/test-helper.js","ember-riak-explorer/tests/test-helper.jshint.js","ember-riak-explorer/tests/unit/adapters/bucket-list-test.js","ember-riak-explorer/tests/unit/adapters/bucket-list-test.jshint.js","ember-riak-explorer/tests/unit/adapters/bucket-test.js","ember-riak-explorer/tests/unit/adapters/bucket-test.jshint.js","ember-riak-explorer/tests/unit/adapters/bucket-type-test.js","ember-riak-explorer/tests/unit/adapters/bucket-type-test.jshint.js","ember-riak-explorer/tests/unit/adapters/cluster-test.js","ember-riak-explorer/tests/unit/adapters/cluster-test.jshint.js","ember-riak-explorer/tests/unit/adapters/config-file-test.js","ember-riak-explorer/tests/unit/adapters/config-file-test.jshint.js","ember-riak-explorer/tests/unit/adapters/log-file-test.js","ember-riak-explorer/tests/unit/adapters/log-file-test.jshint.js","ember-riak-explorer/tests/unit/adapters/riak-node-test.js","ember-riak-explorer/tests/unit/adapters/riak-node-test.jshint.js","ember-riak-explorer/tests/unit/adapters/riak-object-test.js","ember-riak-explorer/tests/unit/adapters/riak-object-test.jshint.js","ember-riak-explorer/tests/unit/adapters/row-list-test.js","ember-riak-explorer/tests/unit/adapters/row-list-test.jshint.js","ember-riak-explorer/tests/unit/adapters/search-index-test.js","ember-riak-explorer/tests/unit/adapters/search-index-test.jshint.js","ember-riak-explorer/tests/unit/adapters/table-test.js","ember-riak-explorer/tests/unit/adapters/table-test.jshint.js","ember-riak-explorer/tests/unit/controllers/application-test.js","ember-riak-explorer/tests/unit/controllers/application-test.jshint.js","ember-riak-explorer/tests/unit/helpers/object-length-test.js","ember-riak-explorer/tests/unit/helpers/object-length-test.jshint.js","ember-riak-explorer/tests/unit/mixins/controller/modal-test.js","ember-riak-explorer/tests/unit/mixins/controller/modal-test.jshint.js","ember-riak-explorer/tests/unit/mixins/controller/side-drawer-test.js","ember-riak-explorer/tests/unit/mixins/controller/side-drawer-test.jshint.js","ember-riak-explorer/tests/unit/mixins/routes/loading-slider-test.js","ember-riak-explorer/tests/unit/mixins/routes/loading-slider-test.jshint.js","ember-riak-explorer/tests/unit/mixins/routes/monitoring-test.js","ember-riak-explorer/tests/unit/mixins/routes/monitoring-test.jshint.js","ember-riak-explorer/tests/unit/mixins/routes/polling-test.js","ember-riak-explorer/tests/unit/mixins/routes/polling-test.jshint.js","ember-riak-explorer/tests/unit/mixins/routes/scroll-reset-test.js","ember-riak-explorer/tests/unit/mixins/routes/scroll-reset-test.jshint.js","ember-riak-explorer/tests/unit/models/bucket-list-test.js","ember-riak-explorer/tests/unit/models/bucket-list-test.jshint.js","ember-riak-explorer/tests/unit/models/bucket-test.js","ember-riak-explorer/tests/unit/models/bucket-test.jshint.js","ember-riak-explorer/tests/unit/models/bucket-type-test.js","ember-riak-explorer/tests/unit/models/bucket-type-test.jshint.js","ember-riak-explorer/tests/unit/models/cluster-test.js","ember-riak-explorer/tests/unit/models/cluster-test.jshint.js","ember-riak-explorer/tests/unit/models/config-file-test.js","ember-riak-explorer/tests/unit/models/config-file-test.jshint.js","ember-riak-explorer/tests/unit/models/log-file-test.js","ember-riak-explorer/tests/unit/models/log-file-test.jshint.js","ember-riak-explorer/tests/unit/models/node-test.js","ember-riak-explorer/tests/unit/models/node-test.jshint.js","ember-riak-explorer/tests/unit/models/riak-object-test.js","ember-riak-explorer/tests/unit/models/riak-object-test.jshint.js","ember-riak-explorer/tests/unit/models/search-index-test.js","ember-riak-explorer/tests/unit/models/search-index-test.jshint.js","ember-riak-explorer/tests/unit/models/search-schema-test.js","ember-riak-explorer/tests/unit/models/search-schema-test.jshint.js","ember-riak-explorer/tests/utils/data-type-checks.jshint.js","ember-riak-explorer/tests/utils/parse-header.jshint.js","ember-riak-explorer/tests/utils/riak-object-formatter.jshint.js","ember-riak-explorer/tests/utils/string-helpers.jshint.js","ember-riak-explorer/tests/utils/validations.jshint.js","vendor/ember-cli/tests-suffix.js"],"sourcesContent":["define('ember-riak-explorer/tests/adapters/application.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | adapters/application.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'adapters/application.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/adapters/bucket-list.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | adapters/bucket-list.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'adapters/bucket-list.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/adapters/bucket-type.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | adapters/bucket-type.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'adapters/bucket-type.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/adapters/bucket.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | adapters/bucket.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'adapters/bucket.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/adapters/cluster.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | adapters/cluster.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'adapters/cluster.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/adapters/config-file.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | adapters/config-file.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'adapters/config-file.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/adapters/log-file.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | adapters/log-file.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'adapters/log-file.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/adapters/node.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | adapters/node.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'adapters/node.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/adapters/object-list.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | adapters/object-list.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'adapters/object-list.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/adapters/riak-object.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | adapters/riak-object.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'adapters/riak-object.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/adapters/row-list.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | adapters/row-list.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'adapters/row-list.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/adapters/row.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | adapters/row.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'adapters/row.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/adapters/search-index.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | adapters/search-index.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'adapters/search-index.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/adapters/table.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | adapters/table.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'adapters/table.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/app.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | app.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'app.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/blanket-options', ['exports'], function (exports) {\n /* globals blanket, module */\n var options = {\n modulePrefix: 'ember-riak-explorer',\n filter: '//.*ember-riak-explorer/.*/',\n antifilter: '//.*(tests|template).*/',\n loaderExclusions: [],\n enableCoverage: true,\n cliOptions: {\n reporters: ['json'],\n autostart: true\n }\n };\n if (typeof exports === 'undefined') {\n blanket.options(options);\n } else {\n module.exports = options;\n }\n});","define('ember-riak-explorer/tests/blanket-options.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | blanket-options.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'blanket-options.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/alert-component.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/alert-component.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/alert-component.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/breadcrumb-component.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/breadcrumb-component.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/breadcrumb-component.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/charts/cluster-stat.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/charts/cluster-stat.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/charts/cluster-stat.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/charts/node-stat.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/charts/node-stat.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/charts/node-stat.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/cluster-status-indicator.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/cluster-status-indicator.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/cluster-status-indicator.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/dashboard-module/body.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/dashboard-module/body.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/dashboard-module/body.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/dashboard-module/container.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/dashboard-module/container.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/dashboard-module/container.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/dashboard-module/header.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/dashboard-module/header.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/dashboard-module/header.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/dashboard-module/section.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/dashboard-module/section.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/dashboard-module/section.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/form/add-custom-properties.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/form/add-custom-properties.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/form/add-custom-properties.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/form/explorer-button.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/form/explorer-button.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/form/explorer-button.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/form/explorer-input.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/form/explorer-input.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/form/explorer-input.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/hll-editor.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/hll-editor.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/hll-editor.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/link/explorer-resource.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/link/explorer-resource.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/link/explorer-resource.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/loading-spinner.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/loading-spinner.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/loading-spinner.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/map-object/contents.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/map-object/contents.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/map-object/contents.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/map-object/map.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/map-object/map.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/map-object/map.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/map-object/maps.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/map-object/maps.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/map-object/maps.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/map-object/section.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/map-object/section.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/map-object/section.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/map-object/sets.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/map-object/sets.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/map-object/sets.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/new-object-inputs.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/new-object-inputs.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/new-object-inputs.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/pagination-component.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/pagination-component.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/pagination-component.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/set-editor.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/set-editor.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/set-editor.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/side-drawer.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/side-drawer.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/side-drawer.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/table/bucket-props-advanced.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/table/bucket-props-advanced.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/table/bucket-props-advanced.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/table/bucket-props-overview.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/table/bucket-props-overview.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/table/bucket-props-overview.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/table/bucket-types.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/table/bucket-types.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/table/bucket-types.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/table/object-headers.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/table/object-headers.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/table/object-headers.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/table/object-version.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/table/object-version.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/table/object-version.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/table/search-indexes.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/table/search-indexes.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/table/search-indexes.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/table/table-overview.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/table/table-overview.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/table/table-overview.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/table/ts-table-reference.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/table/ts-table-reference.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/table/ts-table-reference.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/table/ts-tables.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/table/ts-tables.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/table/ts-tables.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/tooltip/bucket-props.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/tooltip/bucket-props.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/tooltip/bucket-props.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/tooltip/node-config.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/tooltip/node-config.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/tooltip/node-config.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/tooltip/node-stats.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/tooltip/node-stats.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/tooltip/node-stats.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/view-label.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/view-label.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/view-label.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/components/wrapper-panel.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | components/wrapper-panel.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'components/wrapper-panel.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/controllers/application.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | controllers/application.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'controllers/application.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/helpers/destroy-app', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = destroyApp;\n\n function destroyApp(application) {\n _ember['default'].run(application, 'destroy');\n }\n});","define('ember-riak-explorer/tests/helpers/destroy-app.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | helpers/destroy-app.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'helpers/destroy-app.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/helpers/ember-power-select', ['exports', 'ember'], function (exports, _ember) {\n exports.triggerKeydown = triggerKeydown;\n exports.typeInSearch = typeInSearch;\n exports.clickTrigger = clickTrigger;\n\n // Helpers for integration tests\n\n function typeText(selector, text) {\n $(selector).val(text);\n $(selector).trigger('input');\n }\n\n function triggerKeydown(domElement, k) {\n var oEvent = document.createEvent(\"Events\");\n oEvent.initEvent('keydown', true, true);\n $.extend(oEvent, {\n view: window,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: k,\n charCode: k\n });\n _ember['default'].run(function () {\n domElement.dispatchEvent(oEvent);\n });\n }\n\n function typeInSearch(text) {\n _ember['default'].run(function () {\n typeText('.ember-power-select-search input, .ember-power-select-trigger-multiple-input', text);\n });\n }\n\n function clickTrigger(scope) {\n var selector = '.ember-power-select-trigger';\n if (scope) {\n selector = scope + ' ' + selector;\n }\n var event = new window.Event('mousedown', { bubbles: true, cancelable: true, view: window });\n _ember['default'].run(function () {\n return _ember['default'].$(selector)[0].dispatchEvent(event);\n });\n }\n\n // Helpers for acceptance tests\n\n exports['default'] = function () {\n var isEmberOne = _ember['default'].VERSION.match(/1\\.13/);\n\n _ember['default'].Test.registerAsyncHelper('selectChoose', function (app, cssPath, value) {\n var uuid = find(cssPath).find('.ember-power-select-trigger').attr('class').match(/ember-power-select-trigger-(\\d+)/)[1];\n // If the dropdown is closed, open it\n if (_ember['default'].$('.ember-power-select-dropdown-' + uuid).length === 0) {\n click(cssPath + ' .ember-power-select-trigger');\n }\n\n // Select the option with the given text\n click('.ember-power-select-dropdown-' + uuid + ' .ember-power-select-option:contains(\"' + value + '\")');\n });\n\n _ember['default'].Test.registerAsyncHelper('selectSearch', function (app, cssPath, value) {\n var uuid = find(cssPath).find('.ember-power-select-trigger').attr('class').match(/ember-power-select-trigger-(\\d+)/)[1];\n var isMultipleSelect = _ember['default'].$(cssPath + ' .ember-power-select-trigger-multiple-input').length > 0;\n\n var dropdownIsClosed = _ember['default'].$('.ember-power-select-dropdown-' + uuid).length === 0;\n if (dropdownIsClosed) {\n click(cssPath + ' .ember-power-select-trigger');\n }\n\n if (isMultipleSelect) {\n fillIn(cssPath + ' .ember-power-select-trigger-multiple-input', value);\n if (isEmberOne) {\n triggerEvent(cssPath + ' .ember-power-select-trigger-multiple-input', 'input');\n }\n } else {\n fillIn('.ember-power-select-search input', value);\n if (isEmberOne) {\n triggerEvent('.ember-power-select-dropdown-' + uuid + ' .ember-power-select-search input', 'input');\n }\n }\n });\n };\n});","define('ember-riak-explorer/tests/helpers/module-for-acceptance', ['exports', 'qunit', 'ember-riak-explorer/tests/helpers/start-app', 'ember-riak-explorer/tests/helpers/destroy-app'], function (exports, _qunit, _emberRiakExplorerTestsHelpersStartApp, _emberRiakExplorerTestsHelpersDestroyApp) {\n exports['default'] = function (name) {\n var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n (0, _qunit.module)(name, {\n beforeEach: function beforeEach() {\n this.application = (0, _emberRiakExplorerTestsHelpersStartApp['default'])();\n\n if (options.beforeEach) {\n options.beforeEach.apply(this, arguments);\n }\n },\n\n afterEach: function afterEach() {\n (0, _emberRiakExplorerTestsHelpersDestroyApp['default'])(this.application);\n\n if (options.afterEach) {\n options.afterEach.apply(this, arguments);\n }\n }\n });\n };\n});","define('ember-riak-explorer/tests/helpers/module-for-acceptance.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | helpers/module-for-acceptance.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'helpers/module-for-acceptance.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/helpers/object-length.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | helpers/object-length.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'helpers/object-length.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/helpers/resolver', ['exports', 'ember-riak-explorer/resolver', 'ember-riak-explorer/config/environment'], function (exports, _emberRiakExplorerResolver, _emberRiakExplorerConfigEnvironment) {\n\n var resolver = _emberRiakExplorerResolver['default'].create();\n\n resolver.namespace = {\n modulePrefix: _emberRiakExplorerConfigEnvironment['default'].modulePrefix,\n podModulePrefix: _emberRiakExplorerConfigEnvironment['default'].podModulePrefix\n };\n\n exports['default'] = resolver;\n});","define('ember-riak-explorer/tests/helpers/resolver.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | helpers/resolver.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'helpers/resolver.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/helpers/start-app', ['exports', 'ember', 'ember-riak-explorer/app', 'ember-riak-explorer/config/environment'], function (exports, _ember, _emberRiakExplorerApp, _emberRiakExplorerConfigEnvironment) {\n exports['default'] = startApp;\n\n function startApp(attrs) {\n var application = undefined;\n\n var attributes = _ember['default'].merge({}, _emberRiakExplorerConfigEnvironment['default'].APP);\n attributes = _ember['default'].merge(attributes, attrs); // use defaults, but you can override;\n\n _ember['default'].run(function () {\n application = _emberRiakExplorerApp['default'].create(attributes);\n application.setupForTesting();\n application.injectTestHelpers();\n });\n\n return application;\n }\n});","define('ember-riak-explorer/tests/helpers/start-app.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | helpers/start-app.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'helpers/start-app.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/initializers/explorer.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | initializers/explorer.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'initializers/explorer.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/integration/components/cluster-status-indicator-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {\n\n (0, _emberQunit.moduleForComponent)('cluster-status-indicator', 'Integration | Component | cluster status indicator', {\n integration: true\n });\n\n (0, _emberQunit.test)('it renders', function (assert) {\n // Set any properties with this.set('myProperty', 'value');\n // Handle any actions with this.on('myAction', function(val) { ... });\"\n\n this.render(Ember.HTMLBars.template((function () {\n return {\n meta: {\n 'fragmentReason': {\n 'name': 'missing-wrapper',\n 'problems': ['wrong-type']\n },\n 'revision': 'Ember@2.5.1',\n 'loc': {\n 'source': null,\n 'start': {\n 'line': 1,\n 'column': 0\n },\n 'end': {\n 'line': 1,\n 'column': 28\n }\n }\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment('');\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [['content', 'cluster-status-indicator', ['loc', [null, [1, 0], [1, 28]]]]],\n locals: [],\n templates: []\n };\n })()));\n\n assert.equal(this.$().text().trim(), '');\n\n // Template block usage:\"\n this.render(Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n 'fragmentReason': false,\n 'revision': 'Ember@2.5.1',\n 'loc': {\n 'source': null,\n 'start': {\n 'line': 2,\n 'column': 4\n },\n 'end': {\n 'line': 4,\n 'column': 4\n }\n }\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(' template block text\\n');\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n\n return {\n meta: {\n 'fragmentReason': {\n 'name': 'missing-wrapper',\n 'problems': ['wrong-type']\n },\n 'revision': 'Ember@2.5.1',\n 'loc': {\n 'source': null,\n 'start': {\n 'line': 1,\n 'column': 0\n },\n 'end': {\n 'line': 5,\n 'column': 2\n }\n }\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode('\\n');\n dom.appendChild(el0, el1);\n var el1 = dom.createComment('');\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(' ');\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [['block', 'cluster-status-indicator', [], [], 0, null, ['loc', [null, [2, 4], [4, 33]]]]],\n locals: [],\n templates: [child0]\n };\n })()));\n\n assert.equal(this.$().text().trim(), 'template block text');\n });\n});","define('ember-riak-explorer/tests/integration/components/cluster-status-indicator-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | integration/components/cluster-status-indicator-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'integration/components/cluster-status-indicator-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/integration/components/dashboard-module/section-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {\n\n (0, _emberQunit.moduleForComponent)('dashboard-module/section', 'Integration | Component | dashboard module/section', {\n integration: true\n });\n\n (0, _emberQunit.test)('it renders', function (assert) {\n // Set any properties with this.set('myProperty', 'value');\n // Handle any actions with this.on('myAction', function(val) { ... });\n\n this.render(Ember.HTMLBars.template((function () {\n return {\n meta: {\n 'fragmentReason': {\n 'name': 'missing-wrapper',\n 'problems': ['wrong-type']\n },\n 'revision': 'Ember@2.5.1',\n 'loc': {\n 'source': null,\n 'start': {\n 'line': 1,\n 'column': 0\n },\n 'end': {\n 'line': 1,\n 'column': 28\n }\n }\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment('');\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [['content', 'dashboard-module/section', ['loc', [null, [1, 0], [1, 28]]]]],\n locals: [],\n templates: []\n };\n })()));\n\n assert.equal(this.$().text().trim(), '');\n\n // Template block usage:\n this.render(Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n 'fragmentReason': false,\n 'revision': 'Ember@2.5.1',\n 'loc': {\n 'source': null,\n 'start': {\n 'line': 2,\n 'column': 4\n },\n 'end': {\n 'line': 4,\n 'column': 4\n }\n }\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(' template block text\\n');\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n\n return {\n meta: {\n 'fragmentReason': {\n 'name': 'missing-wrapper',\n 'problems': ['wrong-type']\n },\n 'revision': 'Ember@2.5.1',\n 'loc': {\n 'source': null,\n 'start': {\n 'line': 1,\n 'column': 0\n },\n 'end': {\n 'line': 5,\n 'column': 2\n }\n }\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode('\\n');\n dom.appendChild(el0, el1);\n var el1 = dom.createComment('');\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(' ');\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [['block', 'dashboard-module/section', [], [], 0, null, ['loc', [null, [2, 4], [4, 33]]]]],\n locals: [],\n templates: [child0]\n };\n })()));\n\n assert.equal(this.$().text().trim(), 'template block text');\n });\n});","define('ember-riak-explorer/tests/integration/components/dashboard-module/section-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | integration/components/dashboard-module/section-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'integration/components/dashboard-module/section-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/integration/components/tooltip/node-config-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {\n\n (0, _emberQunit.moduleForComponent)('tooltip/node-config', 'Integration | Component | tooltip/node config', {\n integration: true\n });\n\n (0, _emberQunit.test)('it renders', function (assert) {\n // Set any properties with this.set('myProperty', 'value');\n // Handle any actions with this.on('myAction', function(val) { ... });\"\n\n this.render(Ember.HTMLBars.template((function () {\n return {\n meta: {\n 'fragmentReason': {\n 'name': 'missing-wrapper',\n 'problems': ['wrong-type']\n },\n 'revision': 'Ember@2.5.1',\n 'loc': {\n 'source': null,\n 'start': {\n 'line': 1,\n 'column': 0\n },\n 'end': {\n 'line': 1,\n 'column': 23\n }\n }\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment('');\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [['content', 'tooltip/node-config', ['loc', [null, [1, 0], [1, 23]]]]],\n locals: [],\n templates: []\n };\n })()));\n\n assert.equal(this.$().text().trim(), '');\n\n // Template block usage:\"\n this.render(Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n 'fragmentReason': false,\n 'revision': 'Ember@2.5.1',\n 'loc': {\n 'source': null,\n 'start': {\n 'line': 2,\n 'column': 4\n },\n 'end': {\n 'line': 4,\n 'column': 4\n }\n }\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(' template block text\\n');\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n\n return {\n meta: {\n 'fragmentReason': {\n 'name': 'missing-wrapper',\n 'problems': ['wrong-type']\n },\n 'revision': 'Ember@2.5.1',\n 'loc': {\n 'source': null,\n 'start': {\n 'line': 1,\n 'column': 0\n },\n 'end': {\n 'line': 5,\n 'column': 2\n }\n }\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode('\\n');\n dom.appendChild(el0, el1);\n var el1 = dom.createComment('');\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(' ');\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [['block', 'tooltip/node-config', [], [], 0, null, ['loc', [null, [2, 4], [4, 28]]]]],\n locals: [],\n templates: [child0]\n };\n })()));\n\n assert.equal(this.$().text().trim(), 'template block text');\n });\n});","define('ember-riak-explorer/tests/integration/components/tooltip/node-config-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | integration/components/tooltip/node-config-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'integration/components/tooltip/node-config-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/integration/components/tooltip/node-stats-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {\n\n (0, _emberQunit.moduleForComponent)('tooltip/node-stats', 'Integration | Component | tooltip/node stats', {\n integration: true\n });\n\n (0, _emberQunit.test)('it renders', function (assert) {\n // Set any properties with this.set('myProperty', 'value');\n // Handle any actions with this.on('myAction', function(val) { ... });\"\n\n this.render(Ember.HTMLBars.template((function () {\n return {\n meta: {\n 'fragmentReason': {\n 'name': 'missing-wrapper',\n 'problems': ['wrong-type']\n },\n 'revision': 'Ember@2.5.1',\n 'loc': {\n 'source': null,\n 'start': {\n 'line': 1,\n 'column': 0\n },\n 'end': {\n 'line': 1,\n 'column': 22\n }\n }\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment('');\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [['content', 'tooltip/node-stats', ['loc', [null, [1, 0], [1, 22]]]]],\n locals: [],\n templates: []\n };\n })()));\n\n assert.equal(this.$().text().trim(), '');\n\n // Template block usage:\"\n this.render(Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n 'fragmentReason': false,\n 'revision': 'Ember@2.5.1',\n 'loc': {\n 'source': null,\n 'start': {\n 'line': 2,\n 'column': 4\n },\n 'end': {\n 'line': 4,\n 'column': 4\n }\n }\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(' template block text\\n');\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes() {\n return [];\n },\n statements: [],\n locals: [],\n templates: []\n };\n })();\n\n return {\n meta: {\n 'fragmentReason': {\n 'name': 'missing-wrapper',\n 'problems': ['wrong-type']\n },\n 'revision': 'Ember@2.5.1',\n 'loc': {\n 'source': null,\n 'start': {\n 'line': 1,\n 'column': 0\n },\n 'end': {\n 'line': 5,\n 'column': 2\n }\n }\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode('\\n');\n dom.appendChild(el0, el1);\n var el1 = dom.createComment('');\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(' ');\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [['block', 'tooltip/node-stats', [], [], 0, null, ['loc', [null, [2, 4], [4, 27]]]]],\n locals: [],\n templates: [child0]\n };\n })()));\n\n assert.equal(this.$().text().trim(), 'template block text');\n });\n});","define('ember-riak-explorer/tests/integration/components/tooltip/node-stats-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | integration/components/tooltip/node-stats-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'integration/components/tooltip/node-stats-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/mixins/component/scroll-reset.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | mixins/component/scroll-reset.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'mixins/component/scroll-reset.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/mixins/controller/modal.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | mixins/controller/modal.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'mixins/controller/modal.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/mixins/controller/scroll-reset.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | mixins/controller/scroll-reset.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'mixins/controller/scroll-reset.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/mixins/controller/side-drawer.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | mixins/controller/side-drawer.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'mixins/controller/side-drawer.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/mixins/models/bucket-props.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | mixins/models/bucket-props.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'mixins/models/bucket-props.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/mixins/models/cached-list-watcher.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | mixins/models/cached-list-watcher.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'mixins/models/cached-list-watcher.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/mixins/models/cached-list.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | mixins/models/cached-list.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'mixins/models/cached-list.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/mixins/models/map-object.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | mixins/models/map-object.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'mixins/models/map-object.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/mixins/models/object-headers.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | mixins/models/object-headers.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'mixins/models/object-headers.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/mixins/routes/alerts.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | mixins/routes/alerts.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'mixins/routes/alerts.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/mixins/routes/loading-slider.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | mixins/routes/loading-slider.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'mixins/routes/loading-slider.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/mixins/routes/monitoring.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | mixins/routes/monitoring.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'mixins/routes/monitoring.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/mixins/routes/polling.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | mixins/routes/polling.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'mixins/routes/polling.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/mixins/routes/scroll-reset.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | mixins/routes/scroll-reset.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'mixins/routes/scroll-reset.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/mixins/routes/wrapper-state.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | mixins/routes/wrapper-state.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'mixins/routes/wrapper-state.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/models/bucket-list.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | models/bucket-list.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'models/bucket-list.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/models/object-list.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | models/object-list.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'models/object-list.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/models/row-list.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | models/row-list.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'models/row-list.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/models/row.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | models/row.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'models/row.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/bucket-type/controller.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/bucket-type/controller.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/bucket-type/controller.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/bucket-type/create/controller.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/bucket-type/create/controller.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/bucket-type/create/controller.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/bucket-type/create/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/bucket-type/create/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/bucket-type/create/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/bucket-type/edit/controller.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/bucket-type/edit/controller.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/bucket-type/edit/controller.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/bucket-type/edit/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/bucket-type/edit/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/bucket-type/edit/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/bucket-type/model.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/bucket-type/model.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/bucket-type/model.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/bucket-type/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/bucket-type/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/bucket-type/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/bucket/controller.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/bucket/controller.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/bucket/controller.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/bucket/create/controller.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/bucket/create/controller.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/bucket/create/controller.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/bucket/create/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/bucket/create/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/bucket/create/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/bucket/model.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/bucket/model.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/bucket/model.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/bucket/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/bucket/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/bucket/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/cluster/controller.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/cluster/controller.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/cluster/controller.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/cluster/data/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/cluster/data/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/cluster/data/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/cluster/model.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/cluster/model.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/cluster/model.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/cluster/ops/controller.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/cluster/ops/controller.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/cluster/ops/controller.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/cluster/ops/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/cluster/ops/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/cluster/ops/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/cluster/query/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/cluster/query/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/cluster/query/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/cluster/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/cluster/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/cluster/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/config-file/model.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/config-file/model.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/config-file/model.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/config-file/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/config-file/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/config-file/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/error/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/error/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/error/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/error/service-not-found/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/error/service-not-found/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/error/service-not-found/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/help/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/help/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/help/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/index/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/index/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/index/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/log-file/model.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/log-file/model.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/log-file/model.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/log-file/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/log-file/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/log-file/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/node/model.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/node/model.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/node/model.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/node/monitoring/controller.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/node/monitoring/controller.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/node/monitoring/controller.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/node/monitoring/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/node/monitoring/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/node/monitoring/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/node/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/node/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/node/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/riak-object/controller.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/riak-object/controller.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/riak-object/controller.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/riak-object/counter/controller.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/riak-object/counter/controller.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/riak-object/counter/controller.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/riak-object/counter/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/riak-object/counter/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/riak-object/counter/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/riak-object/create/controller.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/riak-object/create/controller.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/riak-object/create/controller.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/riak-object/create/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/riak-object/create/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/riak-object/create/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/riak-object/edit/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/riak-object/edit/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/riak-object/edit/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/riak-object/hll/controller.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/riak-object/hll/controller.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/riak-object/hll/controller.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/riak-object/hll/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/riak-object/hll/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/riak-object/hll/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/riak-object/map/controller.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/riak-object/map/controller.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/riak-object/map/controller.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/riak-object/map/edit/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/riak-object/map/edit/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/riak-object/map/edit/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/riak-object/map/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/riak-object/map/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/riak-object/map/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/riak-object/model.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/riak-object/model.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/riak-object/model.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/riak-object/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/riak-object/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/riak-object/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/riak-object/set/controller.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/riak-object/set/controller.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/riak-object/set/controller.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/riak-object/set/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/riak-object/set/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/riak-object/set/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/search-index/model.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/search-index/model.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/search-index/model.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/search-index/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/search-index/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/search-index/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/search-schema/create/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/search-schema/create/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/search-schema/create/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/search-schema/edit/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/search-schema/edit/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/search-schema/edit/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/search-schema/model.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/search-schema/model.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/search-schema/model.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/search-schema/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/search-schema/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/search-schema/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/table/controller.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/table/controller.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/table/controller.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/table/create/controller.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/table/create/controller.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/table/create/controller.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/table/create/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/table/create/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/table/create/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/table/model.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/table/model.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/table/model.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/table/query/controller.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/table/query/controller.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/table/query/controller.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/table/query/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/table/query/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/table/query/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/table/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/table/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/table/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/table/write/controller.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/table/write/controller.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/table/write/controller.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/pods/table/write/route.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | pods/table/write/route.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'pods/table/write/route.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/resolver.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | resolver.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'resolver.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/router.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | router.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'router.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/routes/application.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | routes/application.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'routes/application.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/serializers/application.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | serializers/application.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'serializers/application.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/serializers/bucket-type.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | serializers/bucket-type.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'serializers/bucket-type.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/serializers/cluster.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | serializers/cluster.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'serializers/cluster.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/serializers/config-file.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | serializers/config-file.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'serializers/config-file.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/serializers/log-file.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | serializers/log-file.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'serializers/log-file.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/serializers/node.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | serializers/node.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'serializers/node.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/serializers/row.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | serializers/row.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'serializers/row.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/serializers/search-index.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | serializers/search-index.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'serializers/search-index.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/serializers/table.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | serializers/table.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'serializers/table.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/services/explorer.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | services/explorer.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'services/explorer.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/storages/node-stats.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | storages/node-stats.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'storages/node-stats.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/test-helper', ['exports', 'ember-riak-explorer/tests/helpers/resolver', 'ember-qunit'], function (exports, _emberRiakExplorerTestsHelpersResolver, _emberQunit) {\n\n /**\n * Basic helper function to mark tests as pending.\n * NOTE: This still marks the test as passed. It does style the output in the browser.\n * No phantomJS support as of right now.\n *\n * @method pending\n */\n _emberQunit['default'].pending = function () {\n _emberQunit['default'].test(arguments[0] + ' (PENDING TEST)', function (assert) {\n assert.ok(!0); //dont expect any tests\n\n $('.running').css('background', '#FFFF99');\n });\n };\n\n _emberQunit['default'].setResolver(_emberRiakExplorerTestsHelpersResolver['default']);\n});","define('ember-riak-explorer/tests/test-helper.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | test-helper.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'test-helper.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/adapters/bucket-list-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {\n\n (0, _emberQunit.moduleFor)('adapter:bucket-list', 'Unit | Adapter | bucket list', {\n // Specify the other units that are required for this test.\n // needs: ['serializer:foo']\n });\n\n // Replace this with your real tests.\n (0, _emberQunit.test)('it exists', function (assert) {\n var adapter = this.subject();\n assert.ok(adapter);\n });\n});","define('ember-riak-explorer/tests/unit/adapters/bucket-list-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/adapters/bucket-list-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/adapters/bucket-list-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/adapters/bucket-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {\n\n (0, _emberQunit.moduleFor)('adapter:bucket', 'Unit | Adapter | bucket', {\n // Specify the other units that are required for this test.\n // needs: ['serializer:foo']\n });\n\n // Replace this with your real tests.\n (0, _emberQunit.test)('it exists', function (assert) {\n var adapter = this.subject();\n assert.ok(adapter);\n });\n});","define('ember-riak-explorer/tests/unit/adapters/bucket-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/adapters/bucket-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/adapters/bucket-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/adapters/bucket-type-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {\n\n (0, _emberQunit.moduleFor)('adapter:bucket-type', 'Unit | Adapter | bucket type', {\n // Specify the other units that are required for this test.\n // needs: ['serializer:foo']\n });\n\n // Replace this with your real tests.\n (0, _emberQunit.test)('it exists', function (assert) {\n var adapter = this.subject();\n assert.ok(adapter);\n });\n});","define('ember-riak-explorer/tests/unit/adapters/bucket-type-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/adapters/bucket-type-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/adapters/bucket-type-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/adapters/cluster-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {\n\n (0, _emberQunit.moduleFor)('adapter:cluster', 'Unit | Adapter | cluster', {\n // Specify the other units that are required for this test.\n // needs: ['serializer:foo']\n });\n\n // Replace this with your real tests.\n (0, _emberQunit.test)('it exists', function (assert) {\n var adapter = this.subject();\n assert.ok(adapter);\n });\n});","define('ember-riak-explorer/tests/unit/adapters/cluster-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/adapters/cluster-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/adapters/cluster-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/adapters/config-file-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {\n\n (0, _emberQunit.moduleFor)('adapter:config-file', 'Unit | Adapter | config file', {\n // Specify the other units that are required for this test.\n // needs: ['serializer:foo']\n });\n\n // Replace this with your real tests.\n (0, _emberQunit.test)('it exists', function (assert) {\n var adapter = this.subject();\n assert.ok(adapter);\n });\n});","define('ember-riak-explorer/tests/unit/adapters/config-file-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/adapters/config-file-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/adapters/config-file-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/adapters/log-file-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {\n\n (0, _emberQunit.moduleFor)('adapter:log-file', 'Unit | Adapter | log file', {\n // Specify the other units that are required for this test.\n // needs: ['serializer:foo']\n });\n\n // Replace this with your real tests.\n (0, _emberQunit.test)('it exists', function (assert) {\n var adapter = this.subject();\n assert.ok(adapter);\n });\n});","define('ember-riak-explorer/tests/unit/adapters/log-file-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/adapters/log-file-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/adapters/log-file-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/adapters/riak-node-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {\n\n (0, _emberQunit.moduleFor)('adapter:node', 'Unit | Adapter | node', {\n // Specify the other units that are required for this test.\n // needs: ['serializer:foo']\n });\n\n // Replace this with your real tests.\n (0, _emberQunit.test)('it exists', function (assert) {\n var adapter = this.subject();\n assert.ok(adapter);\n });\n});","define('ember-riak-explorer/tests/unit/adapters/riak-node-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/adapters/riak-node-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/adapters/riak-node-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/adapters/riak-object-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {\n\n (0, _emberQunit.moduleFor)('adapter:riak-object', 'Unit | Adapter | riak object', {\n // Specify the other units that are required for this test.\n // needs: ['serializer:foo']\n });\n\n // Replace this with your real tests.\n (0, _emberQunit.test)('it exists', function (assert) {\n var adapter = this.subject();\n assert.ok(adapter);\n });\n});","define('ember-riak-explorer/tests/unit/adapters/riak-object-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/adapters/riak-object-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/adapters/riak-object-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/adapters/row-list-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {\n\n (0, _emberQunit.moduleFor)('adapter:row-list', 'Unit | Adapter | row list', {\n // Specify the other units that are required for this test.\n // needs: ['serializer:foo']\n });\n\n // Replace this with your real tests.\n (0, _emberQunit.test)('it exists', function (assert) {\n var adapter = this.subject();\n assert.ok(adapter);\n });\n});","define('ember-riak-explorer/tests/unit/adapters/row-list-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/adapters/row-list-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/adapters/row-list-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/adapters/search-index-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {\n\n (0, _emberQunit.moduleFor)('adapter:search-index', 'Unit | Adapter | search index', {\n // Specify the other units that are required for this test.\n // needs: ['serializer:foo']\n });\n\n // Replace this with your real tests.\n (0, _emberQunit.test)('it exists', function (assert) {\n var adapter = this.subject();\n assert.ok(adapter);\n });\n});","define('ember-riak-explorer/tests/unit/adapters/search-index-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/adapters/search-index-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/adapters/search-index-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/adapters/table-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {\n\n (0, _emberQunit.moduleFor)('adapter:table', 'Unit | Adapter | table', {\n // Specify the other units that are required for this test.\n // needs: ['serializer:foo']\n });\n\n // Replace this with your real tests.\n (0, _emberQunit.test)('it exists', function (assert) {\n var adapter = this.subject();\n assert.ok(adapter);\n });\n});","define('ember-riak-explorer/tests/unit/adapters/table-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/adapters/table-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/adapters/table-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/controllers/application-test', ['exports', 'ember-qunit'], function (exports, _emberQunit) {\n\n (0, _emberQunit.moduleFor)('controller:application', {\n // Specify the other units that are required for this test.\n // needs: ['controller:foo']\n });\n\n // Replace this with your real tests.\n (0, _emberQunit.test)('it exists', function (assert) {\n var controller = this.subject();\n assert.ok(controller);\n });\n});","define('ember-riak-explorer/tests/unit/controllers/application-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/controllers/application-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/controllers/application-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/helpers/object-length-test', ['exports', 'ember-riak-explorer/helpers/object-length', 'qunit'], function (exports, _emberRiakExplorerHelpersObjectLength, _qunit) {\n\n (0, _qunit.module)('Unit | Helper | object length');\n\n // Replace this with your real tests.\n (0, _qunit.test)('it works', function (assert) {\n var objectWithLength = {\n foo: \"bar\",\n haz: \"cheezburger\"\n };\n\n var objectWithOutLength = {};\n\n var result1 = (0, _emberRiakExplorerHelpersObjectLength.objectLength)([objectWithLength]);\n var result2 = (0, _emberRiakExplorerHelpersObjectLength.objectLength)([objectWithOutLength]);\n\n assert.equal(result1, 2);\n assert.equal(result2, 0);\n });\n});","define('ember-riak-explorer/tests/unit/helpers/object-length-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/helpers/object-length-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/helpers/object-length-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/mixins/controller/modal-test', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/modal', 'qunit'], function (exports, _ember, _emberRiakExplorerMixinsControllerModal, _qunit) {\n\n (0, _qunit.module)('Unit | Mixin | controller/modal');\n\n // Replace this with your real tests.\n (0, _qunit.test)('it works', function (assert) {\n var ControllerModalObject = _ember['default'].Object.extend(_emberRiakExplorerMixinsControllerModal['default']);\n var subject = ControllerModalObject.create();\n assert.ok(subject);\n });\n});","define('ember-riak-explorer/tests/unit/mixins/controller/modal-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/mixins/controller/modal-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/mixins/controller/modal-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/mixins/controller/side-drawer-test', ['exports', 'ember', 'ember-riak-explorer/mixins/controller/side-drawer', 'qunit'], function (exports, _ember, _emberRiakExplorerMixinsControllerSideDrawer, _qunit) {\n\n (0, _qunit.module)('Unit | Mixin | controller/side drawer');\n\n // Replace this with your real tests.\n (0, _qunit.test)('it works', function (assert) {\n var ControllerSideDrawerObject = _ember['default'].Object.extend(_emberRiakExplorerMixinsControllerSideDrawer['default']);\n var subject = ControllerSideDrawerObject.create();\n assert.ok(subject);\n });\n});","define('ember-riak-explorer/tests/unit/mixins/controller/side-drawer-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/mixins/controller/side-drawer-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/mixins/controller/side-drawer-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/mixins/routes/loading-slider-test', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/loading-slider', 'qunit'], function (exports, _ember, _emberRiakExplorerMixinsRoutesLoadingSlider, _qunit) {\n\n (0, _qunit.module)('Unit | Mixin | routes/loading slider');\n\n // Replace this with your real tests.\n (0, _qunit.test)('it works', function (assert) {\n var RoutesLoadingSliderObject = _ember['default'].Object.extend(_emberRiakExplorerMixinsRoutesLoadingSlider['default']);\n var subject = RoutesLoadingSliderObject.create();\n assert.ok(subject);\n });\n});","define('ember-riak-explorer/tests/unit/mixins/routes/loading-slider-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/mixins/routes/loading-slider-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/mixins/routes/loading-slider-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/mixins/routes/monitoring-test', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/monitoring', 'qunit'], function (exports, _ember, _emberRiakExplorerMixinsRoutesMonitoring, _qunit) {\n\n (0, _qunit.module)('Unit | Mixin | routes/monitoring');\n\n // Replace this with your real tests.\n (0, _qunit.test)('it works', function (assert) {\n var RoutesMonitoringObject = _ember['default'].Object.extend(_emberRiakExplorerMixinsRoutesMonitoring['default']);\n var subject = RoutesMonitoringObject.create();\n assert.ok(subject);\n });\n});","define('ember-riak-explorer/tests/unit/mixins/routes/monitoring-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/mixins/routes/monitoring-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/mixins/routes/monitoring-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/mixins/routes/polling-test', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/polling', 'qunit'], function (exports, _ember, _emberRiakExplorerMixinsRoutesPolling, _qunit) {\n\n (0, _qunit.module)('Unit | Mixin | routes/polling');\n\n // Replace this with your real tests.\n (0, _qunit.test)('it works', function (assert) {\n var RoutesPollingObject = _ember['default'].Object.extend(_emberRiakExplorerMixinsRoutesPolling['default']);\n var subject = RoutesPollingObject.create();\n assert.ok(subject);\n });\n});","define('ember-riak-explorer/tests/unit/mixins/routes/polling-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/mixins/routes/polling-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/mixins/routes/polling-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/mixins/routes/scroll-reset-test', ['exports', 'ember', 'ember-riak-explorer/mixins/routes/scroll-reset', 'qunit'], function (exports, _ember, _emberRiakExplorerMixinsRoutesScrollReset, _qunit) {\n\n (0, _qunit.module)('Unit | Mixin | routes/scroll reset');\n\n // Replace this with your real tests.\n (0, _qunit.test)('it works', function (assert) {\n var RoutesScrollResetObject = _ember['default'].Object.extend(_emberRiakExplorerMixinsRoutesScrollReset['default']);\n var subject = RoutesScrollResetObject.create();\n assert.ok(subject);\n });\n});","define('ember-riak-explorer/tests/unit/mixins/routes/scroll-reset-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/mixins/routes/scroll-reset-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/mixins/routes/scroll-reset-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/models/bucket-list-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {\n\n (0, _emberQunit.moduleForModel)('bucket-list', 'Unit | Model | bucket list', {\n needs: ['model:bucketType']\n });\n\n (0, _emberQunit.test)('it exists', function (assert) {\n var model = this.subject();\n var store = this.store();\n\n assert.ok(!!model);\n assert.ok(!!store);\n });\n\n (0, _emberQunit.test)('bucket type relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('bucketType');\n\n assert.equal(relationship.key, 'bucketType');\n\n assert.equal(relationship.kind, 'belongsTo');\n });\n});","define('ember-riak-explorer/tests/unit/models/bucket-list-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/models/bucket-list-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/models/bucket-list-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/models/bucket-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {\n\n (0, _emberQunit.moduleForModel)('bucket', 'Unit | Model | bucket', {\n needs: ['model:objectList', 'model:bucketType', 'model:riakObject']\n });\n\n (0, _emberQunit.test)('it exists', function (assert) {\n var model = this.subject();\n var store = this.store();\n\n assert.ok(!!model);\n assert.ok(!!store);\n });\n\n (0, _emberQunit.test)('object list relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('objectList');\n\n assert.equal(relationship.key, 'objectList');\n\n assert.equal(relationship.kind, 'belongsTo');\n });\n\n (0, _emberQunit.test)('bucket type relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('bucketType');\n\n assert.equal(relationship.key, 'bucketType');\n\n assert.equal(relationship.kind, 'belongsTo');\n });\n\n (0, _emberQunit.test)('objects relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('objects');\n\n assert.equal(relationship.key, 'objects');\n\n assert.equal(relationship.kind, 'hasMany');\n });\n});","define('ember-riak-explorer/tests/unit/models/bucket-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/models/bucket-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/models/bucket-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/models/bucket-type-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {\n\n (0, _emberQunit.moduleForModel)('bucket-type', 'Unit | Model | bucket type', {\n needs: ['model:cluster', 'model:bucketList', 'model:bucket']\n });\n\n (0, _emberQunit.test)('it exists', function (assert) {\n var model = this.subject();\n var store = this.store();\n\n assert.ok(!!model);\n assert.ok(!!store);\n });\n\n (0, _emberQunit.test)('cluster relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('cluster');\n\n assert.equal(relationship.key, 'cluster');\n\n assert.equal(relationship.kind, 'belongsTo');\n });\n\n (0, _emberQunit.test)('bucket lists relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('bucketList');\n\n assert.equal(relationship.key, 'bucketList');\n\n assert.equal(relationship.kind, 'belongsTo');\n });\n\n (0, _emberQunit.test)('buckets relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('buckets');\n\n assert.equal(relationship.key, 'buckets');\n assert.equal(relationship.kind, 'hasMany');\n });\n});","define('ember-riak-explorer/tests/unit/models/bucket-type-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/models/bucket-type-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/models/bucket-type-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/models/cluster-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {\n\n (0, _emberQunit.moduleForModel)('cluster', 'Unit | Model | cluster', {\n needs: ['model:bucketType', 'model:node', 'model:searchIndex', 'model:searchSchema', 'model:config-file', 'model:log-file', 'model:table']\n });\n\n (0, _emberQunit.test)('it exists', function (assert) {\n var model = this.subject();\n var store = this.store();\n\n assert.ok(!!model);\n assert.ok(!!store);\n });\n\n (0, _emberQunit.test)('bucketTypes relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('bucketTypes');\n\n assert.equal(relationship.key, 'bucketTypes');\n assert.equal(relationship.kind, 'hasMany');\n });\n\n (0, _emberQunit.test)('nodes relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('nodes');\n\n assert.equal(relationship.key, 'nodes');\n assert.equal(relationship.kind, 'hasMany');\n });\n\n (0, _emberQunit.test)('searchIndexes relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('searchIndexes');\n\n assert.equal(relationship.key, 'searchIndexes');\n assert.equal(relationship.kind, 'hasMany');\n });\n\n (0, _emberQunit.test)('searchSchemas relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('searchSchemas');\n\n assert.equal(relationship.key, 'searchSchemas');\n assert.equal(relationship.kind, 'hasMany');\n });\n\n (0, _emberQunit.test)('tables relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('tables');\n\n assert.equal(relationship.key, 'tables');\n assert.equal(relationship.kind, 'hasMany');\n });\n\n (0, _emberQunit.pending)('getting active bucket types', function () {});\n\n (0, _emberQunit.pending)('getting inactive bucket types', function () {});\n\n (0, _emberQunit.pending)('determining production mode', function () {});\n\n (0, _emberQunit.test)('status', function (assert) {\n var model = this.subject();\n var store = this.store();\n\n _ember['default'].run(function () {\n // No nodes should return down\n assert.equal(model.get('status'), 'down');\n\n // Create some mock nodes\n var node1 = store.createRecord('node', { name: 'node1', cluster: model });\n var node2 = store.createRecord('node', { name: 'node2', cluster: model });\n var node3 = store.createRecord('node', { name: 'node3', cluster: model });\n\n node1.set('available', true);\n node1.set('status', 'valid');\n node2.set('available', true);\n node2.set('status', 'valid');\n node3.set('available', true);\n node3.set('status', 'valid');\n assert.equal(model.get('status'), 'ok');\n\n node1.set('available', false);\n node1.set('status', 'valid');\n node2.set('available', false);\n node2.set('status', 'invalid');\n node3.set('available', false);\n node3.set('status', 'valid');\n assert.equal(model.get('status'), 'down');\n\n node1.set('available', true);\n node1.set('status', 'valid');\n node2.set('available', false);\n node2.set('status', 'invalid');\n node3.set('available', false);\n node3.set('status', 'valid');\n assert.equal(model.get('status'), 'warning');\n });\n });\n\n (0, _emberQunit.test)('supportsHyperLogLogs', function (assert) {\n var model = this.subject();\n\n _ember['default'].run(function () {\n model.set('riakVersion', '1.2.0');\n assert.equal(model.get('supportsHyperLogLogs'), false);\n\n model.set('riakVersion', '2.0.0');\n assert.equal(model.get('supportsHyperLogLogs'), false);\n\n model.set('riakVersion', '2.1.0');\n assert.equal(model.get('supportsHyperLogLogs'), false);\n\n model.set('riakVersion', '2.2.0');\n assert.equal(model.get('supportsHyperLogLogs'), true);\n\n model.set('riakVersion', '2.3.0');\n assert.equal(model.get('supportsHyperLogLogs'), true);\n });\n });\n});","define('ember-riak-explorer/tests/unit/models/cluster-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/models/cluster-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/models/cluster-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/models/config-file-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {\n\n (0, _emberQunit.moduleForModel)('config-file', 'Unit | Model | config file', {\n needs: ['model:node']\n });\n\n (0, _emberQunit.test)('it exists', function (assert) {\n var model = this.subject();\n var store = this.store();\n\n assert.ok(!!model);\n assert.ok(!!store);\n });\n\n (0, _emberQunit.test)('node relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('node');\n\n assert.equal(relationship.key, 'node');\n assert.equal(relationship.kind, 'belongsTo');\n });\n});","define('ember-riak-explorer/tests/unit/models/config-file-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/models/config-file-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/models/config-file-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/models/log-file-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {\n\n (0, _emberQunit.moduleForModel)('log-file', 'Unit | Model | log file', {\n needs: ['model:node']\n });\n\n (0, _emberQunit.test)('it exists', function (assert) {\n var model = this.subject();\n var store = this.store();\n\n assert.ok(!!model);\n assert.ok(!!store);\n });\n\n (0, _emberQunit.test)('node relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('node');\n\n assert.equal(relationship.key, 'node');\n assert.equal(relationship.kind, 'belongsTo');\n });\n});","define('ember-riak-explorer/tests/unit/models/log-file-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/models/log-file-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/models/log-file-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/models/node-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {\n\n (0, _emberQunit.moduleForModel)('node', 'Unit | Model | node', {\n needs: ['model:cluster', 'model:log-file', 'model:config-file']\n });\n\n (0, _emberQunit.test)('it exists', function (assert) {\n var model = this.subject();\n var store = this.store();\n\n assert.ok(!!model);\n assert.ok(!!store);\n });\n\n (0, _emberQunit.test)('cluster relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('cluster');\n\n assert.equal(relationship.key, 'cluster');\n assert.equal(relationship.kind, 'belongsTo');\n });\n\n (0, _emberQunit.test)('log files relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('logFiles');\n\n assert.equal(relationship.key, 'logFiles');\n assert.equal(relationship.kind, 'hasMany');\n });\n\n (0, _emberQunit.test)('config files relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('configFiles');\n\n assert.equal(relationship.key, 'configFiles');\n assert.equal(relationship.kind, 'hasMany');\n });\n\n (0, _emberQunit.test)('isHealthy', function (assert) {\n var model = this.subject();\n\n _ember['default'].run(function () {\n model.set('available', true);\n model.set('status', 'valid');\n assert.equal(model.get('isHealthy'), true);\n\n model.set('available', false);\n model.set('status', 'valid');\n assert.equal(model.get('isHealthy'), false);\n\n model.set('available', true);\n model.set('status', 'invalid');\n assert.equal(model.get('isHealthy'), false);\n });\n });\n});","define('ember-riak-explorer/tests/unit/models/node-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/models/node-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/models/node-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/models/riak-object-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {\n\n (0, _emberQunit.moduleForModel)('riak-object', 'Unit | Model | riak object', {\n needs: ['model:bucket']\n });\n\n (0, _emberQunit.test)('it exists', function (assert) {\n var model = this.subject();\n var store = this.store();\n\n assert.ok(!!model);\n assert.ok(!!store);\n });\n\n (0, _emberQunit.test)('bucket relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('bucket');\n\n assert.equal(relationship.key, 'bucket');\n\n assert.equal(relationship.kind, 'belongsTo');\n });\n});","define('ember-riak-explorer/tests/unit/models/riak-object-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/models/riak-object-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/models/riak-object-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/models/search-index-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {\n\n (0, _emberQunit.moduleForModel)('search-index', 'Unit | Model | search index', {\n needs: ['model:cluster', 'model:searchSchema']\n });\n\n (0, _emberQunit.test)('it exists', function (assert) {\n var model = this.subject();\n var store = this.store();\n\n assert.ok(!!model);\n assert.ok(!!store);\n });\n\n (0, _emberQunit.test)('cluster relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('cluster');\n\n assert.equal(relationship.key, 'cluster');\n\n assert.equal(relationship.kind, 'belongsTo');\n });\n\n (0, _emberQunit.test)('schema relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('schema');\n\n assert.equal(relationship.key, 'schema');\n\n assert.equal(relationship.kind, 'belongsTo');\n });\n});","define('ember-riak-explorer/tests/unit/models/search-index-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/models/search-index-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/models/search-index-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/unit/models/search-schema-test', ['exports', 'ember-qunit', 'ember'], function (exports, _emberQunit, _ember) {\n\n (0, _emberQunit.moduleForModel)('search-schema', 'Unit | Model | search schema', {\n // Specify the other units that are required for this test.\n needs: ['model:cluster']\n });\n\n (0, _emberQunit.test)('it exists', function (assert) {\n var model = this.subject();\n var store = this.store();\n\n assert.ok(!!model);\n assert.ok(!!store);\n });\n\n (0, _emberQunit.test)('cluster relationship', function (assert) {\n var klass = this.subject({}).constructor;\n var relationship = _ember['default'].get(klass, 'relationshipsByName').get('cluster');\n\n assert.equal(relationship.key, 'cluster');\n\n assert.equal(relationship.kind, 'belongsTo');\n });\n});","define('ember-riak-explorer/tests/unit/models/search-schema-test.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | unit/models/search-schema-test.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'unit/models/search-schema-test.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/utils/data-type-checks.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | utils/data-type-checks.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'utils/data-type-checks.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/utils/parse-header.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | utils/parse-header.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'utils/parse-header.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/utils/riak-object-formatter.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | utils/riak-object-formatter.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'utils/riak-object-formatter.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/utils/string-helpers.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | utils/string-helpers.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'utils/string-helpers.js should pass jshint.');\n });\n});","define('ember-riak-explorer/tests/utils/validations.jshint', ['exports'], function (exports) {\n 'use strict';\n\n QUnit.module('JSHint | utils/validations.js');\n QUnit.test('should pass jshint', function (assert) {\n assert.expect(1);\n assert.ok(true, 'utils/validations.js should pass jshint.');\n });\n});","/* jshint ignore:start */\n\nrequire('ember-riak-explorer/tests/test-helper');\nEmberENV.TESTS_FILE_LOADED = true;\n\n/* jshint ignore:end */\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;","file":"tests.js"}
\ No newline at end of file
diff --git a/priv/ember_riak_explorer/dist/assets/vendor.css b/priv/ember_riak_explorer/dist/assets/vendor.css
new file mode 100644
index 0000000..8835a8c
--- /dev/null
+++ b/priv/ember_riak_explorer/dist/assets/vendor.css
@@ -0,0 +1,587 @@
+.loading-slider {
+ position: fixed;
+ overflow: hidden;
+ top: 0;
+ left: 0;
+ height: 2px;
+ width: 100%;
+ z-index: 999;
+}
+
+.loading-slider.expanding {
+ text-align: center;
+}
+
+.loading-slider.expanding span {
+}
+
+.loading-slider span {
+ position: inherit;
+ height: 2px;
+ background-color: red;
+}
+/*! tooltip 0.1.0 - 18th Dec 2013 | https://github.com/darsain/tooltip */
+.tooltip {
+ position: absolute;
+ padding: .8em 1em;
+ top: 10px; /* Defines the spacing between tooltip and target position */
+ max-width: 200px;
+ color: #fff;
+ background: #3a3c47;
+ border-radius: 2px;
+ text-shadow: -1px -1px 0 rgba(0,0,0,.2);
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ user-select: none;
+ pointer-events: none;
+}
+
+/* Arrow styles */
+.tooltip:after {
+ content: '';
+ position: absolute;
+ width: 10px;
+ height: 10px;
+ margin: -5px;
+ background: inherit;
+ -webkit-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ transform: rotate(45deg);
+}
+
+.tooltip.top:after, .tooltip.top-left:after, .tooltip.top-right:after { bottom: 0; }
+.tooltip.bottom:after, .tooltip.bottom-left:after, .tooltip.bottom-right:after { top: 0; }
+.tooltip.top:after, .tooltip.bottom:after { left: 50%; }
+.tooltip.top-left:after, .tooltip.bottom-left:after { right: 15px; }
+.tooltip.top-right:after, .tooltip.bottom-right:after { left: 15px; }
+
+.tooltip.left:after, .tooltip.left-top:after, .tooltip.left-bottom:after { right: 0; }
+.tooltip.right:after, .tooltip.right-top:after, .tooltip.right-bottom:after { left: 0; }
+.tooltip.left:after, .tooltip.right:after { top: 50%; }
+.tooltip.left-top:after, .tooltip.right-top:after { bottom: 15px; }
+.tooltip.left-bottom:after, .tooltip.right-bottom:after { top: 15px; }
+
+/* Fade */
+.tooltip.fade { opacity: 0; transition: opacity 200ms ease-out; }
+.tooltip.fade.in { opacity: 1; transition-duration: 100ms; }
+
+/* Slide */
+.tooltip.slide {
+ opacity: 0;
+ transition: -webkit-transform 200ms ease-out;
+ transition: transform 200ms ease-out;
+ transition-property: -webkit-transform, opacity;
+ transition-property: transform, opacity;
+}
+.tooltip.slide.top,
+.tooltip.slide.top-left,
+.tooltip.slide.top-right {
+ -webkit-transform: translateY(15px);
+ transform: translateY(15px);
+}
+.tooltip.slide.bottom,
+.tooltip.slide.bottom-left,
+.tooltip.slide.bottom-right {
+ -webkit-transform: translateY(-15px);
+ transform: translateY(-15px);
+}
+.tooltip.slide.left,
+.tooltip.slide.left-top,
+.tooltip.slide.left-bottom {
+ -webkit-transform: translateX(15px);
+ transform: translateX(15px);
+}
+.tooltip.slide.right,
+.tooltip.slide.right-top,
+.tooltip.slide.right-bottom {
+ -webkit-transform: translateX(-15px);
+ transform: translateX(-15px);
+}
+.tooltip.slide.in {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ transition-duration: 100ms;
+}
+
+/* Grow */
+.tooltip.grow {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ transition: -webkit-transform 200ms ease-out;
+ transition: transform 200ms ease-out;
+}
+.tooltip.grow.top {
+ -webkit-transform: translateY(60%) scale(0);
+ transform: translateY(60%) scale(0);
+}
+.tooltip.grow.top-left {
+ -webkit-transform: translateY(60%) translateX(40%) scale(0);
+ transform: translateY(60%) translateX(40%) scale(0);
+}
+.tooltip.grow.top-right {
+ -webkit-transform: translateY(60%) translateX(-40%) scale(0);
+ transform: translateY(60%) translateX(-40%) scale(0);
+}
+.tooltip.grow.bottom {
+ -webkit-transform: translateY(-60%) scale(0);
+ transform: translateY(-60%) scale(0);
+}
+.tooltip.grow.bottom-left {
+ -webkit-transform: translateY(-60%) translateX(40%) scale(0);
+ transform: translateY(-60%) translateX(40%) scale(0);
+}
+.tooltip.grow.bottom-right {
+ -webkit-transform: translateY(-60%) translateX(-40%) scale(0);
+ transform: translateY(-60%) translateX(-40%) scale(0);
+}
+.tooltip.grow.left {
+ -webkit-transform: translateX(53%) scale(0);
+ transform: translateX(53%) scale(0);
+}
+.tooltip.grow.left-top {
+ -webkit-transform: translateX(53%) translateY(40%) scale(0);
+ transform: translateX(53%) translateY(40%) scale(0);
+}
+.tooltip.grow.left-bottom {
+ -webkit-transform: translateX(53%) translateY(-40%) scale(0);
+ transform: translateX(53%) translateY(-40%) scale(0);
+}
+.tooltip.grow.right {
+ -webkit-transform: translateX(-53%) scale(0);
+ transform: translateX(-53%) scale(0);
+}
+.tooltip.grow.right-top {
+ -webkit-transform: translateX(-53%) translateY(40%) scale(0);
+ transform: translateX(-53%) translateY(40%) scale(0);
+}
+.tooltip.grow.right-bottom {
+ -webkit-transform: translateX(-53%) translateY(-40%) scale(0);
+ transform: translateX(-53%) translateY(-40%) scale(0);
+}
+.tooltip.grow.in {
+ -webkit-transform: none;
+ transform: none;
+ transition-duration: 100ms;
+}
+
+/* Types */
+.tooltip.light { color: #3a3c47; background: #fff; text-shadow: none; }
+.tooltip.success { background: #8dc572; }
+.tooltip.warning { background: #ddc12e; }
+.tooltip.error { background: #be6464; }
+
+.tooltip {
+ font-size: 14px;
+ padding: 6px 10px;
+ border-radius: 3px;
+}
+
+/* BASICS */
+
+.CodeMirror {
+ /* Set height, width, borders, and global font properties here */
+ font-family: monospace;
+ height: 300px;
+ color: black;
+}
+
+/* PADDING */
+
+.CodeMirror-lines {
+ padding: 4px 0; /* Vertical padding around content */
+}
+.CodeMirror pre {
+ padding: 0 4px; /* Horizontal padding of content */
+}
+
+.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
+ background-color: white; /* The little square between H and V scrollbars */
+}
+
+/* GUTTER */
+
+.CodeMirror-gutters {
+ border-right: 1px solid #ddd;
+ background-color: #f7f7f7;
+ white-space: nowrap;
+}
+.CodeMirror-linenumbers {}
+.CodeMirror-linenumber {
+ padding: 0 3px 0 5px;
+ min-width: 20px;
+ text-align: right;
+ color: #999;
+ white-space: nowrap;
+}
+
+.CodeMirror-guttermarker { color: black; }
+.CodeMirror-guttermarker-subtle { color: #999; }
+
+/* CURSOR */
+
+.CodeMirror-cursor {
+ border-left: 1px solid black;
+ border-right: none;
+ width: 0;
+}
+/* Shown when moving in bi-directional text */
+.CodeMirror div.CodeMirror-secondarycursor {
+ border-left: 1px solid silver;
+}
+.cm-fat-cursor .CodeMirror-cursor {
+ width: auto;
+ border: 0;
+ background: #7e7;
+}
+.cm-fat-cursor div.CodeMirror-cursors {
+ z-index: 1;
+}
+
+.cm-animate-fat-cursor {
+ width: auto;
+ border: 0;
+ -webkit-animation: blink 1.06s steps(1) infinite;
+ -moz-animation: blink 1.06s steps(1) infinite;
+ animation: blink 1.06s steps(1) infinite;
+ background-color: #7e7;
+}
+@-moz-keyframes blink {
+ 0% {}
+ 50% { background-color: transparent; }
+ 100% {}
+}
+@-webkit-keyframes blink {
+ 0% {}
+ 50% { background-color: transparent; }
+ 100% {}
+}
+@keyframes blink {
+ 0% {}
+ 50% { background-color: transparent; }
+ 100% {}
+}
+
+/* Can style cursor different in overwrite (non-insert) mode */
+.CodeMirror-overwrite .CodeMirror-cursor {}
+
+.cm-tab { display: inline-block; text-decoration: inherit; }
+
+.CodeMirror-ruler {
+ border-left: 1px solid #ccc;
+ position: absolute;
+}
+
+/* DEFAULT THEME */
+
+.cm-s-default .cm-header {color: blue;}
+.cm-s-default .cm-quote {color: #090;}
+.cm-negative {color: #d44;}
+.cm-positive {color: #292;}
+.cm-header, .cm-strong {font-weight: bold;}
+.cm-em {font-style: italic;}
+.cm-link {text-decoration: underline;}
+.cm-strikethrough {text-decoration: line-through;}
+
+.cm-s-default .cm-keyword {color: #708;}
+.cm-s-default .cm-atom {color: #219;}
+.cm-s-default .cm-number {color: #164;}
+.cm-s-default .cm-def {color: #00f;}
+.cm-s-default .cm-variable,
+.cm-s-default .cm-punctuation,
+.cm-s-default .cm-property,
+.cm-s-default .cm-operator {}
+.cm-s-default .cm-variable-2 {color: #05a;}
+.cm-s-default .cm-variable-3 {color: #085;}
+.cm-s-default .cm-comment {color: #a50;}
+.cm-s-default .cm-string {color: #a11;}
+.cm-s-default .cm-string-2 {color: #f50;}
+.cm-s-default .cm-meta {color: #555;}
+.cm-s-default .cm-qualifier {color: #555;}
+.cm-s-default .cm-builtin {color: #30a;}
+.cm-s-default .cm-bracket {color: #997;}
+.cm-s-default .cm-tag {color: #170;}
+.cm-s-default .cm-attribute {color: #00c;}
+.cm-s-default .cm-hr {color: #999;}
+.cm-s-default .cm-link {color: #00c;}
+
+.cm-s-default .cm-error {color: #f00;}
+.cm-invalidchar {color: #f00;}
+
+.CodeMirror-composing { border-bottom: 2px solid; }
+
+/* Default styles for common addons */
+
+div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
+div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
+.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
+.CodeMirror-activeline-background {background: #e8f2ff;}
+
+/* STOP */
+
+/* The rest of this file contains styles related to the mechanics of
+ the editor. You probably shouldn't touch them. */
+
+.CodeMirror {
+ position: relative;
+ overflow: hidden;
+ background: white;
+}
+
+.CodeMirror-scroll {
+ overflow: scroll !important; /* Things will break if this is overridden */
+ /* 30px is the magic margin used to hide the element's real scrollbars */
+ /* See overflow: hidden in .CodeMirror */
+ margin-bottom: -30px; margin-right: -30px;
+ padding-bottom: 30px;
+ height: 100%;
+ outline: none; /* Prevent dragging from highlighting the element */
+ position: relative;
+}
+.CodeMirror-sizer {
+ position: relative;
+ border-right: 30px solid transparent;
+}
+
+/* The fake, visible scrollbars. Used to force redraw during scrolling
+ before actual scrolling happens, thus preventing shaking and
+ flickering artifacts. */
+.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
+ position: absolute;
+ z-index: 6;
+ display: none;
+}
+.CodeMirror-vscrollbar {
+ right: 0; top: 0;
+ overflow-x: hidden;
+ overflow-y: scroll;
+}
+.CodeMirror-hscrollbar {
+ bottom: 0; left: 0;
+ overflow-y: hidden;
+ overflow-x: scroll;
+}
+.CodeMirror-scrollbar-filler {
+ right: 0; bottom: 0;
+}
+.CodeMirror-gutter-filler {
+ left: 0; bottom: 0;
+}
+
+.CodeMirror-gutters {
+ position: absolute; left: 0; top: 0;
+ min-height: 100%;
+ z-index: 3;
+}
+.CodeMirror-gutter {
+ white-space: normal;
+ height: 100%;
+ display: inline-block;
+ vertical-align: top;
+ margin-bottom: -30px;
+ /* Hack to make IE7 behave */
+ *zoom:1;
+ *display:inline;
+}
+.CodeMirror-gutter-wrapper {
+ position: absolute;
+ z-index: 4;
+ background: none !important;
+ border: none !important;
+}
+.CodeMirror-gutter-background {
+ position: absolute;
+ top: 0; bottom: 0;
+ z-index: 4;
+}
+.CodeMirror-gutter-elt {
+ position: absolute;
+ cursor: default;
+ z-index: 4;
+}
+.CodeMirror-gutter-wrapper {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+
+.CodeMirror-lines {
+ cursor: text;
+ min-height: 1px; /* prevents collapsing before first draw */
+}
+.CodeMirror pre {
+ /* Reset some styles that the rest of the page might have set */
+ -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
+ border-width: 0;
+ background: transparent;
+ font-family: inherit;
+ font-size: inherit;
+ margin: 0;
+ white-space: pre;
+ word-wrap: normal;
+ line-height: inherit;
+ color: inherit;
+ z-index: 2;
+ position: relative;
+ overflow: visible;
+ -webkit-tap-highlight-color: transparent;
+ -webkit-font-variant-ligatures: none;
+ font-variant-ligatures: none;
+}
+.CodeMirror-wrap pre {
+ word-wrap: break-word;
+ white-space: pre-wrap;
+ word-break: normal;
+}
+
+.CodeMirror-linebackground {
+ position: absolute;
+ left: 0; right: 0; top: 0; bottom: 0;
+ z-index: 0;
+}
+
+.CodeMirror-linewidget {
+ position: relative;
+ z-index: 2;
+ overflow: auto;
+}
+
+.CodeMirror-widget {}
+
+.CodeMirror-code {
+ outline: none;
+}
+
+/* Force content-box sizing for the elements where we expect it */
+.CodeMirror-scroll,
+.CodeMirror-sizer,
+.CodeMirror-gutter,
+.CodeMirror-gutters,
+.CodeMirror-linenumber {
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+
+.CodeMirror-measure {
+ position: absolute;
+ width: 100%;
+ height: 0;
+ overflow: hidden;
+ visibility: hidden;
+}
+
+.CodeMirror-cursor { position: absolute; }
+.CodeMirror-measure pre { position: static; }
+
+div.CodeMirror-cursors {
+ visibility: hidden;
+ position: relative;
+ z-index: 3;
+}
+div.CodeMirror-dragcursors {
+ visibility: visible;
+}
+
+.CodeMirror-focused div.CodeMirror-cursors {
+ visibility: visible;
+}
+
+.CodeMirror-selected { background: #d9d9d9; }
+.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
+.CodeMirror-crosshair { cursor: crosshair; }
+.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }
+.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }
+
+.cm-searching {
+ background: #ffa;
+ background: rgba(255, 255, 0, .4);
+}
+
+/* IE7 hack to prevent it from returning funny offsetTops on the spans */
+.CodeMirror span { *vertical-align: text-bottom; }
+
+/* Used to force a border model for a node */
+.cm-force-border { padding-right: .1px; }
+
+@media print {
+ /* Hide the cursor when printing */
+ .CodeMirror div.CodeMirror-cursors {
+ visibility: hidden;
+ }
+}
+
+/* See issue #2901 */
+.cm-tab-wrap-hack:after { content: ''; }
+
+/* Help users use markselection to safely style text background */
+span.CodeMirror-selectedtext { background: none; }
+
+/*
+
+ Name: material
+ Author: Michael Kaminsky (http://github.com/mkaminsky11)
+
+ Original material color scheme by Mattia Astorino (https://github.com/equinusocio/material-theme)
+
+*/
+
+.cm-s-material {
+ background-color: #263238;
+ color: rgba(233, 237, 237, 1);
+}
+.cm-s-material .CodeMirror-gutters {
+ background: #263238;
+ color: rgb(83,127,126);
+ border: none;
+}
+.cm-s-material .CodeMirror-guttermarker, .cm-s-material .CodeMirror-guttermarker-subtle, .cm-s-material .CodeMirror-linenumber { color: rgb(83,127,126); }
+.cm-s-material .CodeMirror-cursor { border-left: 1px solid #f8f8f0; }
+.cm-s-material div.CodeMirror-selected { background: rgba(255, 255, 255, 0.15); }
+.cm-s-material.CodeMirror-focused div.CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }
+.cm-s-material .CodeMirror-line::selection, .cm-s-material .CodeMirror-line > span::selection, .cm-s-material .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }
+.cm-s-material .CodeMirror-line::-moz-selection, .cm-s-material .CodeMirror-line > span::-moz-selection, .cm-s-material .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }
+
+.cm-s-material .CodeMirror-activeline-background { background: rgba(0, 0, 0, 0); }
+.cm-s-material .cm-keyword { color: rgba(199, 146, 234, 1); }
+.cm-s-material .cm-operator { color: rgba(233, 237, 237, 1); }
+.cm-s-material .cm-variable-2 { color: #80CBC4; }
+.cm-s-material .cm-variable-3 { color: #82B1FF; }
+.cm-s-material .cm-builtin { color: #DECB6B; }
+.cm-s-material .cm-atom { color: #F77669; }
+.cm-s-material .cm-number { color: #F77669; }
+.cm-s-material .cm-def { color: rgba(233, 237, 237, 1); }
+.cm-s-material .cm-string { color: #C3E88D; }
+.cm-s-material .cm-string-2 { color: #80CBC4; }
+.cm-s-material .cm-comment { color: #546E7A; }
+.cm-s-material .cm-variable { color: #82B1FF; }
+.cm-s-material .cm-tag { color: #80CBC4; }
+.cm-s-material .cm-meta { color: #80CBC4; }
+.cm-s-material .cm-attribute { color: #FFCB6B; }
+.cm-s-material .cm-property { color: #80CBAE; }
+.cm-s-material .cm-qualifier { color: #DECB6B; }
+.cm-s-material .cm-variable-3 { color: #DECB6B; }
+.cm-s-material .cm-tag { color: rgba(255, 83, 112, 1); }
+.cm-s-material .cm-error {
+ color: rgba(255, 255, 255, 1.0);
+ background-color: #EC5F67;
+}
+.cm-s-material .CodeMirror-matchingbracket {
+ text-decoration: underline;
+ color: white !important;
+}
+
+[contenteditable=true]:empty:not(:focus):before {
+ content: attr(placeholder);
+}
+
+[contenteditable=true] {
+ cursor: text;
+}
+
+.ember-content-editable:empty {
+ color: #a9a9a9;
+}
+
+.ember-content-editable:empty:after {
+ content: "\0000a0";
+}
diff --git a/priv/ember_riak_explorer/dist/assets/vendor.js b/priv/ember_riak_explorer/dist/assets/vendor.js
new file mode 100644
index 0000000..71cdd1c
--- /dev/null
+++ b/priv/ember_riak_explorer/dist/assets/vendor.js
@@ -0,0 +1,146247 @@
+/* jshint ignore:start */
+
+window.EmberENV = {"FEATURES":{}};
+var runningTests = false;
+
+
+
+/* jshint ignore:end */
+
+;var loader, define, requireModule, require, requirejs;
+
+(function(global) {
+ 'use strict';
+
+ var stats;
+
+ // Save off the original values of these globals, so we can restore them if someone asks us to
+ var oldGlobals = {
+ loader: loader,
+ define: define,
+ requireModule: requireModule,
+ require: require,
+ requirejs: requirejs
+ };
+
+ requirejs = require = requireModule = function(name) {
+ stats.require++;
+ var pending = [];
+ var mod = findModule(name, '(require)', pending);
+
+ for (var i = pending.length - 1; i >= 0; i--) {
+ pending[i].exports();
+ }
+
+ return mod.module.exports;
+ };
+
+ function resetStats() {
+ stats = {
+ define: 0,
+ require: 0,
+ reify: 0,
+ findDeps: 0,
+ modules: 0,
+ exports: 0,
+ resolve: 0,
+ resolveRelative: 0,
+ findModule: 0,
+ pendingQueueLength: 0
+ };
+ requirejs._stats = stats;
+ }
+
+
+ resetStats();
+
+ loader = {
+ noConflict: function(aliases) {
+ var oldName, newName;
+
+ for (oldName in aliases) {
+ if (aliases.hasOwnProperty(oldName)) {
+ if (oldGlobals.hasOwnProperty(oldName)) {
+ newName = aliases[oldName];
+
+ global[newName] = global[oldName];
+ global[oldName] = oldGlobals[oldName];
+ }
+ }
+ }
+ }
+ };
+
+ var _isArray;
+ if (!Array.isArray) {
+ _isArray = function (x) {
+ return Object.prototype.toString.call(x) === '[object Array]';
+ };
+ } else {
+ _isArray = Array.isArray;
+ }
+
+ var registry = {};
+ var seen = {};
+
+ var uuid = 0;
+
+ function unsupportedModule(length) {
+ throw new Error('an unsupported module was defined, expected `define(name, deps, module)` instead got: `' +
+ length + '` arguments to define`');
+ }
+
+ var defaultDeps = ['require', 'exports', 'module'];
+
+ function Module(name, deps, callback, alias) {
+ stats.modules++;
+ this.id = uuid++;
+ this.name = name;
+ this.deps = !deps.length && callback.length ? defaultDeps : deps;
+ this.module = { exports: {} };
+ this.callback = callback;
+ this.finalized = false;
+ this.hasExportsAsDep = false;
+ this.isAlias = alias;
+ this.reified = new Array(deps.length);
+ this._foundDeps = false;
+ this.isPending = false;
+ }
+
+ Module.prototype.makeDefaultExport = function() {
+ var exports = this.module.exports;
+ if (exports !== null &&
+ (typeof exports === 'object' || typeof exports === 'function') &&
+ exports['default'] === undefined) {
+ exports['default'] = exports;
+ }
+ };
+
+ Module.prototype.exports = function() {
+ if (this.finalized) { return this.module.exports; }
+ stats.exports++;
+
+ this.finalized = true;
+ this.isPending = false;
+
+ if (loader.wrapModules) {
+ this.callback = loader.wrapModules(this.name, this.callback);
+ }
+
+ this.reify();
+
+ var result = this.callback.apply(this, this.reified);
+
+ if (!(this.hasExportsAsDep && result === undefined)) {
+ this.module.exports = result;
+ }
+ this.makeDefaultExport();
+ return this.module.exports;
+ };
+
+ Module.prototype.unsee = function() {
+ this.finalized = false;
+ this._foundDeps = false;
+ this.isPending = false;
+ this.module = { exports: {} };
+ };
+
+ Module.prototype.reify = function() {
+ stats.reify++;
+ var reified = this.reified;
+ for (var i = 0; i < reified.length; i++) {
+ var mod = reified[i];
+ reified[i] = mod.exports ? mod.exports : mod.module.exports();
+ }
+ };
+
+ Module.prototype.findDeps = function(pending) {
+ if (this._foundDeps) {
+ return;
+ }
+
+ stats.findDeps++;
+ this._foundDeps = true;
+ this.isPending = true;
+
+ var deps = this.deps;
+
+ for (var i = 0; i < deps.length; i++) {
+ var dep = deps[i];
+ var entry = this.reified[i] = { exports: undefined, module: undefined };
+ if (dep === 'exports') {
+ this.hasExportsAsDep = true;
+ entry.exports = this.module.exports;
+ } else if (dep === 'require') {
+ entry.exports = this.makeRequire();
+ } else if (dep === 'module') {
+ entry.exports = this.module;
+ } else {
+ entry.module = findModule(resolve(dep, this.name), this.name, pending);
+ }
+ }
+ };
+
+ Module.prototype.makeRequire = function() {
+ var name = this.name;
+ var r = function(dep) {
+ return require(resolve(dep, name));
+ };
+ r['default'] = r;
+ r.has = function(dep) {
+ return has(resolve(dep, name));
+ };
+ return r;
+ };
+
+ define = function(name, deps, callback) {
+ stats.define++;
+ if (arguments.length < 2) {
+ unsupportedModule(arguments.length);
+ }
+
+ if (!_isArray(deps)) {
+ callback = deps;
+ deps = [];
+ }
+
+ if (callback instanceof Alias) {
+ registry[name] = new Module(callback.name, deps, callback, true);
+ } else {
+ registry[name] = new Module(name, deps, callback, false);
+ }
+ };
+
+ // we don't support all of AMD
+ // define.amd = {};
+ // we will support petals...
+ define.petal = { };
+
+ function Alias(path) {
+ this.name = path;
+ }
+
+ define.alias = function(path) {
+ return new Alias(path);
+ };
+
+ function missingModule(name, referrer) {
+ throw new Error('Could not find module `' + name + '` imported from `' + referrer + '`');
+ }
+
+ function findModule(name, referrer, pending) {
+ stats.findModule++;
+ var mod = registry[name] || registry[name + '/index'];
+
+ while (mod && mod.isAlias) {
+ mod = registry[mod.name];
+ }
+
+ if (!mod) { missingModule(name, referrer); }
+
+ if (pending && !mod.finalized && !mod.isPending) {
+ mod.findDeps(pending);
+ pending.push(mod);
+ stats.pendingQueueLength++;
+ }
+ return mod;
+ }
+
+ function resolve(child, name) {
+ stats.resolve++;
+ if (child.charAt(0) !== '.') { return child; }
+ stats.resolveRelative++;
+
+ var parts = child.split('/');
+ var nameParts = name.split('/');
+ var parentBase = nameParts.slice(0, -1);
+
+ for (var i = 0, l = parts.length; i < l; i++) {
+ var part = parts[i];
+
+ if (part === '..') {
+ if (parentBase.length === 0) {
+ throw new Error('Cannot access parent module of root');
+ }
+ parentBase.pop();
+ } else if (part === '.') {
+ continue;
+ } else { parentBase.push(part); }
+ }
+
+ return parentBase.join('/');
+ }
+
+ function has(name) {
+ return !!(registry[name] || registry[name + '/index']);
+ }
+
+ requirejs.entries = requirejs._eak_seen = registry;
+ requirejs.has = has;
+ requirejs.unsee = function(moduleName) {
+ findModule(moduleName, '(unsee)', false).unsee();
+ };
+
+ requirejs.clear = function() {
+ resetStats();
+ requirejs.entries = requirejs._eak_seen = registry = {};
+ seen = {};
+ };
+
+ // prime
+ define('foo', function() {});
+ define('foo/bar', [], function() {});
+ define('foo/asdf', ['module', 'exports', 'require'], function(module, exports, require) {
+ if (require.has('foo/bar')) {
+ require('foo/bar');
+ }
+ });
+ define('foo/baz', [], define.alias('foo'));
+ define('foo/quz', define.alias('foo'));
+ define('foo/bar', ['foo', './quz', './baz', './asdf', './bar', '../foo'], function() {});
+ define('foo/main', ['foo/bar'], function() {});
+
+ require('foo/main');
+ require.unsee('foo/bar');
+
+ requirejs.clear();
+
+ if (typeof exports === 'object' && typeof module === 'object' && module.exports) {
+ module.exports = { require: require, define: define };
+ }
+})(this);
+
+;/*!
+ * jQuery JavaScript Library v2.2.4
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2016-05-20T17:23Z
+ */
+
+(function( global, factory ) {
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Support: Firefox 18+
+// Can't be in strict mode, several libs including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+//"use strict";
+var arr = [];
+
+var document = window.document;
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
+
+
+
+var
+ version = "2.2.4",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android<4.1
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ };
+
+jQuery.fn = jQuery.prototype = {
+
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // Start with an empty selector
+ selector: "",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num != null ?
+
+ // Return just the one element from the set
+ ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+
+ // Return all the elements in a clean array
+ slice.call( this );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ each: function( callback ) {
+ return jQuery.each( this, callback );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map( this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ } ) );
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor();
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[ 0 ] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // Skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
+ target = {};
+ }
+
+ // Extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+
+ // Only deal with non-null/undefined values
+ if ( ( options = arguments[ i ] ) != null ) {
+
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+ ( copyIsArray = jQuery.isArray( copy ) ) ) ) {
+
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray( src ) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject( src ) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend( {
+
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ isFunction: function( obj ) {
+ return jQuery.type( obj ) === "function";
+ },
+
+ isArray: Array.isArray,
+
+ isWindow: function( obj ) {
+ return obj != null && obj === obj.window;
+ },
+
+ isNumeric: function( obj ) {
+
+ // parseFloat NaNs numeric-cast false positives (null|true|false|"")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ // adding 1 corrects loss of precision from parseFloat (#15100)
+ var realStringObj = obj && obj.toString();
+ return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
+ },
+
+ isPlainObject: function( obj ) {
+ var key;
+
+ // Not plain objects:
+ // - Any object or value whose internal [[Class]] property is not "[object Object]"
+ // - DOM nodes
+ // - window
+ if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ // Not own constructor property must be Object
+ if ( obj.constructor &&
+ !hasOwn.call( obj, "constructor" ) &&
+ !hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) {
+ return false;
+ }
+
+ // Own properties are enumerated firstly, so to speed up,
+ // if last one is own, then all properties are own
+ for ( key in obj ) {}
+
+ return key === undefined || hasOwn.call( obj, key );
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+
+ // Support: Android<4.0, iOS<6 (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call( obj ) ] || "object" :
+ typeof obj;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function( code ) {
+ var script,
+ indirect = eval;
+
+ code = jQuery.trim( code );
+
+ if ( code ) {
+
+ // If the code includes a valid, prologue position
+ // strict mode pragma, execute code by injecting a
+ // script tag into the document.
+ if ( code.indexOf( "use strict" ) === 1 ) {
+ script = document.createElement( "script" );
+ script.text = code;
+ document.head.appendChild( script ).parentNode.removeChild( script );
+ } else {
+
+ // Otherwise, avoid the DOM node creation, insertion
+ // and removal by using an indirect global eval
+
+ indirect( code );
+ }
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Support: IE9-11+
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ each: function( obj, callback ) {
+ var length, i = 0;
+
+ if ( isArrayLike( obj ) ) {
+ length = obj.length;
+ for ( ; i < length; i++ ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android<4.1
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArrayLike( Object( arr ) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var length, value,
+ i = 0,
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArrayLike( elems ) ) {
+ length = elems.length;
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ now: Date.now,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+} );
+
+// JSHint would error on this code due to the Symbol not being defined in ES5.
+// Defining this global in .jshintrc would create a danger of using the global
+// unguarded in another place, it seems safer to just disable JSHint for these
+// three lines.
+/* jshint ignore: start */
+if ( typeof Symbol === "function" ) {
+ jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
+}
+/* jshint ignore: end */
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+function( i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+} );
+
+function isArrayLike( obj ) {
+
+ // Support: iOS 8.2 (not reproducible in simulator)
+ // `in` check used to prevent JIT error (gh-2145)
+ // hasOwn isn't used here due to false negatives
+ // regarding Nodelist length in IE
+ var length = !!obj && "length" in obj && obj.length,
+ type = jQuery.type( obj );
+
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.2.1
+ * http://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2015-10-17
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + 1 * new Date(),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // General-purpose constants
+ MAX_NEGATIVE = 1 << 31,
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf as it's faster than native
+ // http://jsperf.com/thor-indexof-vs-for/5
+ indexOf = function( list, elem ) {
+ var i = 0,
+ len = list.length;
+ for ( ; i < len; i++ ) {
+ if ( list[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+
+ // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + identifier + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rwhitespace = new RegExp( whitespace + "+", "g" ),
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + identifier + ")" ),
+ "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+ "TAG": new RegExp( "^(" + identifier + "|[*])" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+ rescape = /'|\\/g,
+
+ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ },
+
+ // Used for iframes
+ // See setDocument()
+ // Removing the function wrapper causes a "Permission Denied"
+ // error in IE
+ unloadHandler = function() {
+ setDocument();
+ };
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var m, i, elem, nid, nidselect, match, groups, newSelector,
+ newContext = context && context.ownerDocument,
+
+ // nodeType defaults to 9, since context defaults to document
+ nodeType = context ? context.nodeType : 9;
+
+ results = results || [];
+
+ // Return early from calls with invalid selector or context
+ if ( typeof selector !== "string" || !selector ||
+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+ return results;
+ }
+
+ // Try to shortcut find operations (as opposed to filters) in HTML documents
+ if ( !seed ) {
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+ context = context || document;
+
+ if ( documentIsHTML ) {
+
+ // If the selector is sufficiently simple, try using a "get*By*" DOM method
+ // (excepting DocumentFragment context, where the methods don't exist)
+ if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+
+ // ID selector
+ if ( (m = match[1]) ) {
+
+ // Document context
+ if ( nodeType === 9 ) {
+ if ( (elem = context.getElementById( m )) ) {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+
+ // Element context
+ } else {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( newContext && (elem = newContext.getElementById( m )) &&
+ contains( context, elem ) &&
+ elem.id === m ) {
+
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Type selector
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Class selector
+ } else if ( (m = match[3]) && support.getElementsByClassName &&
+ context.getElementsByClassName ) {
+
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // Take advantage of querySelectorAll
+ if ( support.qsa &&
+ !compilerCache[ selector + " " ] &&
+ (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+
+ if ( nodeType !== 1 ) {
+ newContext = context;
+ newSelector = selector;
+
+ // qSA looks outside Element context, which is not what we want
+ // Thanks to Andrew Dupont for this workaround technique
+ // Support: IE <=8
+ // Exclude object elements
+ } else if ( context.nodeName.toLowerCase() !== "object" ) {
+
+ // Capture the context ID, setting it first if necessary
+ if ( (nid = context.getAttribute( "id" )) ) {
+ nid = nid.replace( rescape, "\\$&" );
+ } else {
+ context.setAttribute( "id", (nid = expando) );
+ }
+
+ // Prefix every selector in the list
+ groups = tokenize( selector );
+ i = groups.length;
+ nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']";
+ while ( i-- ) {
+ groups[i] = nidselect + " " + toSelector( groups[i] );
+ }
+ newSelector = groups.join( "," );
+
+ // Expand context for sibling selectors
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+ context;
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch ( qsaError ) {
+ } finally {
+ if ( nid === expando ) {
+ context.removeAttribute( "id" );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+ var div = document.createElement("div");
+
+ try {
+ return !!fn( div );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( div.parentNode ) {
+ div.parentNode.removeChild( div );
+ }
+ // release memory in IE
+ div = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = arr.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ ( ~b.sourceIndex || MAX_NEGATIVE ) -
+ ( ~a.sourceIndex || MAX_NEGATIVE );
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare, parent,
+ doc = node ? node.ownerDocument || node : preferredDoc;
+
+ // Return early if doc is invalid or already selected
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Update global variables
+ document = doc;
+ docElem = document.documentElement;
+ documentIsHTML = !isXML( document );
+
+ // Support: IE 9-11, Edge
+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+ if ( (parent = document.defaultView) && parent.top !== parent ) {
+ // Support: IE 11
+ if ( parent.addEventListener ) {
+ parent.addEventListener( "unload", unloadHandler, false );
+
+ // Support: IE 9 - 10 only
+ } else if ( parent.attachEvent ) {
+ parent.attachEvent( "onunload", unloadHandler );
+ }
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties
+ // (excepting IE8 booleans)
+ support.attributes = assert(function( div ) {
+ div.className = "i";
+ return !div.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( div ) {
+ div.appendChild( document.createComment("") );
+ return !div.getElementsByTagName("*").length;
+ });
+
+ // Support: IE<9
+ support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( div ) {
+ docElem.appendChild( div ).id = expando;
+ return !document.getElementsByName || !document.getElementsByName( expando ).length;
+ });
+
+ // ID find and filter
+ if ( support.getById ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var m = context.getElementById( id );
+ return m ? [ m ] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ } else {
+ // Support: IE6/7
+ // getElementById is not reliable as a find shortcut
+ delete Expr.find["ID"];
+
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== "undefined" &&
+ elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ return context.getElementsByTagName( tag );
+
+ // DocumentFragment nodes don't have gEBTN
+ } else if ( support.qsa ) {
+ return context.querySelectorAll( tag );
+ }
+ } :
+
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See http://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( div ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // http://bugs.jquery.com/ticket/12359
+ docElem.appendChild( div ).innerHTML = " " +
+ "" +
+ " ";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( div.querySelectorAll("[msallowcapture^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !div.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+ if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+ rbuggyQSA.push("~=");
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+
+ // Support: Safari 8+, iOS 8+
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
+ // In-page `selector#id sibing-combinator selector` fails
+ if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
+ rbuggyQSA.push(".#.+[+~]");
+ }
+ });
+
+ assert(function( div ) {
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = document.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ div.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( div.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":enabled").length ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( div ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( div, "div" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( div, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully self-exclusive
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === document ? -1 :
+ b === document ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ !compilerCache[ expr + " " ] &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch (e) {}
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, uniqueCache, outerCache, node, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType,
+ diff = false;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) {
+
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+
+ // Seek `elem` from a previously-cached index
+
+ // ...in a gzip-friendly way
+ node = parent;
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex && cache[ 2 ];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ } else {
+ // Use previously-cached element index if available
+ if ( useCache ) {
+ // ...in a gzip-friendly way
+ node = elem;
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex;
+ }
+
+ // xml :nth-child(...)
+ // or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ if ( diff === false ) {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) &&
+ ++diff ) {
+
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ uniqueCache[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ // Don't keep the element (issue #299)
+ input[0] = null;
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ text = text.replace( runescape, funescape );
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": function( elem ) {
+ return elem.disabled === false;
+ },
+
+ "disabled": function( elem ) {
+ return elem.disabled === true;
+ },
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ checkNonElements = base && dir === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, uniqueCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
+
+ if ( (oldCache = uniqueCache[ dir ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ uniqueCache[ dir ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ // Avoid hanging onto element (issue #299)
+ checkContext = null;
+ return ret;
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context === document || context || outermost;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ if ( !context && elem.ownerDocument !== document ) {
+ setDocument( elem );
+ xml = !documentIsHTML;
+ }
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context || document, xml) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // `i` is now the count of elements visited above, and adding it to `matchedCount`
+ // makes the latter nonnegative.
+ matchedCount += i;
+
+ // Apply set filters to unmatched elements
+ // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+ // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+ // no element matchers and no seed.
+ // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+ // case, which will result in a "00" `matchedCount` that differs from `i` but is also
+ // numerically zero.
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is only one selector in the list and no seed
+ // (the latter of which guarantees us context)
+ if ( match.length === 1 ) {
+
+ // Reduce context if the leading compound selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+ // Should return 1, but returns 4 (following)
+ return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+ div.innerHTML = " ";
+ return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+ div.innerHTML = " ";
+ div.firstChild.setAttribute( "value", "" );
+ return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+ return div.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+
+var dir = function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+};
+
+
+var siblings = function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ /* jshint -W018 */
+ return !!qualifier.call( elem, i, elem ) !== not;
+ } );
+
+ }
+
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ } );
+
+ }
+
+ if ( typeof qualifier === "string" ) {
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ qualifier = jQuery.filter( qualifier, elements );
+ }
+
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
+ } );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 && elem.nodeType === 1 ?
+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ } ) );
+};
+
+jQuery.fn.extend( {
+ find: function( selector ) {
+ var i,
+ len = this.length,
+ ret = [],
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter( function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ } ) );
+ }
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+ ret.selector = this.selector ? this.selector + " " + selector : selector;
+ return ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], false ) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], true ) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ init = jQuery.fn.init = function( selector, context, root ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Method init() accepts an alternate rootjQuery
+ // so migrate can support jQuery.sub (gh-2101)
+ root = root || rootjQuery;
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[ 0 ] === "<" &&
+ selector[ selector.length - 1 ] === ">" &&
+ selector.length >= 3 ) {
+
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && ( match[ 1 ] || !context ) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[ 1 ] ) {
+ context = context instanceof jQuery ? context[ 0 ] : context;
+
+ // Option to run scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[ 1 ],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[ 2 ] );
+
+ // Support: Blackberry 4.6
+ // gEBID returns nodes no longer in the document (#6963)
+ if ( elem && elem.parentNode ) {
+
+ // Inject the element directly into the jQuery object
+ this.length = 1;
+ this[ 0 ] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || root ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[ 0 ] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return root.ready !== undefined ?
+ root.ready( selector ) :
+
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+ // Methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.fn.extend( {
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter( function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[ i ] ) ) {
+ return true;
+ }
+ }
+ } );
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( ; i < l; i++ ) {
+ for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && ( pos ?
+ pos.index( cur ) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+ },
+
+ // Determine the position of an element within the set
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // Index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.uniqueSort(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter( selector )
+ );
+ }
+} );
+
+function sibling( cur, dir ) {
+ while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each( {
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return siblings( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return siblings( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.uniqueSort( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+} );
+var rnotwhite = ( /\S+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+ var object = {};
+ jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ } );
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ createOptions( options ) :
+ jQuery.extend( {}, options );
+
+ var // Flag to know if list is currently firing
+ firing,
+
+ // Last fire value for non-forgettable lists
+ memory,
+
+ // Flag to know if list was already fired
+ fired,
+
+ // Flag to prevent firing
+ locked,
+
+ // Actual callback list
+ list = [],
+
+ // Queue of execution data for repeatable lists
+ queue = [],
+
+ // Index of currently firing callback (modified by add/remove as needed)
+ firingIndex = -1,
+
+ // Fire callbacks
+ fire = function() {
+
+ // Enforce single-firing
+ locked = options.once;
+
+ // Execute callbacks for all pending executions,
+ // respecting firingIndex overrides and runtime changes
+ fired = firing = true;
+ for ( ; queue.length; firingIndex = -1 ) {
+ memory = queue.shift();
+ while ( ++firingIndex < list.length ) {
+
+ // Run callback and check for early termination
+ if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+ options.stopOnFalse ) {
+
+ // Jump to end and forget the data so .add doesn't re-fire
+ firingIndex = list.length;
+ memory = false;
+ }
+ }
+ }
+
+ // Forget the data if we're done with it
+ if ( !options.memory ) {
+ memory = false;
+ }
+
+ firing = false;
+
+ // Clean up if we're done firing for good
+ if ( locked ) {
+
+ // Keep an empty list if we have data for future add calls
+ if ( memory ) {
+ list = [];
+
+ // Otherwise, this object is spent
+ } else {
+ list = "";
+ }
+ }
+ },
+
+ // Actual Callbacks object
+ self = {
+
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+
+ // If we have memory from a past run, we should fire after adding
+ if ( memory && !firing ) {
+ firingIndex = list.length - 1;
+ queue.push( memory );
+ }
+
+ ( function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ if ( jQuery.isFunction( arg ) ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
+
+ // Inspect recursively
+ add( arg );
+ }
+ } );
+ } )( arguments );
+
+ if ( memory && !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Remove a callback from the list
+ remove: function() {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+
+ // Handle firing indexes
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ } );
+ return this;
+ },
+
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ?
+ jQuery.inArray( fn, list ) > -1 :
+ list.length > 0;
+ },
+
+ // Remove all callbacks from the list
+ empty: function() {
+ if ( list ) {
+ list = [];
+ }
+ return this;
+ },
+
+ // Disable .fire and .add
+ // Abort any current/pending executions
+ // Clear all callbacks and values
+ disable: function() {
+ locked = queue = [];
+ list = memory = "";
+ return this;
+ },
+ disabled: function() {
+ return !list;
+ },
+
+ // Disable .fire
+ // Also disable .add unless we have memory (since it would have no effect)
+ // Abort any pending executions
+ lock: function() {
+ locked = queue = [];
+ if ( !memory ) {
+ list = memory = "";
+ }
+ return this;
+ },
+ locked: function() {
+ return !!locked;
+ },
+
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( !locked ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ queue.push( args );
+ if ( !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+jQuery.extend( {
+
+ Deferred: function( func ) {
+ var tuples = [
+
+ // action, add listener, listener list, final state
+ [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks( "memory" ) ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+ return jQuery.Deferred( function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[ tuple[ 1 ] ]( function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .progress( newDefer.notify )
+ .done( newDefer.resolve )
+ .fail( newDefer.reject );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ](
+ this === promise ? newDefer.promise() : this,
+ fn ? [ returned ] : arguments
+ );
+ }
+ } );
+ } );
+ fns = null;
+ } ).promise();
+ },
+
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 3 ];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[ 1 ] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add( function() {
+
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[ 0 ] ] = function() {
+ deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments );
+ return this;
+ };
+ deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+ } );
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
+ resolveValues = slice.call( arguments ),
+ length = resolveValues.length,
+
+ // the count of uncompleted subordinates
+ remaining = length !== 1 ||
+ ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+ // the master Deferred.
+ // If resolveValues consist of only a single Deferred, just use that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+ // Update function for both resolve and progress values
+ updateFunc = function( i, contexts, values ) {
+ return function( value ) {
+ contexts[ i ] = this;
+ values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( values === progressValues ) {
+ deferred.notifyWith( contexts, values );
+ } else if ( !( --remaining ) ) {
+ deferred.resolveWith( contexts, values );
+ }
+ };
+ },
+
+ progressValues, progressContexts, resolveContexts;
+
+ // Add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+ resolveValues[ i ].promise()
+ .progress( updateFunc( i, progressContexts, progressValues ) )
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject );
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // If we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
+ }
+
+ return deferred.promise();
+ }
+} );
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+
+ // Add the callback
+ jQuery.ready.promise().done( fn );
+
+ return this;
+};
+
+jQuery.extend( {
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.triggerHandler ) {
+ jQuery( document ).triggerHandler( "ready" );
+ jQuery( document ).off( "ready" );
+ }
+ }
+} );
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed );
+ window.removeEventListener( "load", completed );
+ jQuery.ready();
+}
+
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
+
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called
+ // after the browser event has already occurred.
+ // Support: IE9-10 only
+ // Older IE sometimes signals "interactive" too soon
+ if ( document.readyState === "complete" ||
+ ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ window.setTimeout( jQuery.ready );
+
+ } else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed );
+ }
+ }
+ return readyList.promise( obj );
+};
+
+// Kick off the DOM ready check even if the user does not
+jQuery.ready.promise();
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ access( elems, fn, i, key[ i ], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn(
+ elems[ i ], key, raw ?
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ len ? fn( elems[ 0 ], key ) : emptyGet;
+};
+var acceptData = function( owner ) {
+
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ /* jshint -W018 */
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+
+
+function Data() {
+ this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+
+Data.prototype = {
+
+ register: function( owner, initial ) {
+ var value = initial || {};
+
+ // If it is a node unlikely to be stringify-ed or looped over
+ // use plain assignment
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = value;
+
+ // Otherwise secure it in a non-enumerable, non-writable property
+ // configurability must be true to allow the property to be
+ // deleted with the delete operator
+ } else {
+ Object.defineProperty( owner, this.expando, {
+ value: value,
+ writable: true,
+ configurable: true
+ } );
+ }
+ return owner[ this.expando ];
+ },
+ cache: function( owner ) {
+
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return an empty object.
+ if ( !acceptData( owner ) ) {
+ return {};
+ }
+
+ // Check if the owner object already has a cache
+ var value = owner[ this.expando ];
+
+ // If not, create one
+ if ( !value ) {
+ value = {};
+
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return an empty object.
+ if ( acceptData( owner ) ) {
+
+ // If it is a node unlikely to be stringify-ed or looped over
+ // use plain assignment
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = value;
+
+ // Otherwise secure it in a non-enumerable property
+ // configurable must be true to allow the property to be
+ // deleted when data is removed
+ } else {
+ Object.defineProperty( owner, this.expando, {
+ value: value,
+ configurable: true
+ } );
+ }
+ }
+ }
+
+ return value;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ cache = this.cache( owner );
+
+ // Handle: [ owner, key, value ] args
+ if ( typeof data === "string" ) {
+ cache[ data ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+
+ // Copy the properties one-by-one to the cache object
+ for ( prop in data ) {
+ cache[ prop ] = data[ prop ];
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ return key === undefined ?
+ this.cache( owner ) :
+ owner[ this.expando ] && owner[ this.expando ][ key ];
+ },
+ access: function( owner, key, value ) {
+ var stored;
+
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ( ( key && typeof key === "string" ) && value === undefined ) ) {
+
+ stored = this.get( owner, key );
+
+ return stored !== undefined ?
+ stored : this.get( owner, jQuery.camelCase( key ) );
+ }
+
+ // When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i, name, camel,
+ cache = owner[ this.expando ];
+
+ if ( cache === undefined ) {
+ return;
+ }
+
+ if ( key === undefined ) {
+ this.register( owner );
+
+ } else {
+
+ // Support array or space separated string of keys
+ if ( jQuery.isArray( key ) ) {
+
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = key.concat( key.map( jQuery.camelCase ) );
+ } else {
+ camel = jQuery.camelCase( key );
+
+ // Try the string as a key before any manipulation
+ if ( key in cache ) {
+ name = [ key, camel ];
+ } else {
+
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ name = camel;
+ name = name in cache ?
+ [ name ] : ( name.match( rnotwhite ) || [] );
+ }
+ }
+
+ i = name.length;
+
+ while ( i-- ) {
+ delete cache[ name[ i ] ];
+ }
+ }
+
+ // Remove the expando if there's no more data
+ if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
+
+ // Support: Chrome <= 35-45+
+ // Webkit & Blink performance suffers when deleting properties
+ // from DOM nodes, so set to undefined instead
+ // https://code.google.com/p/chromium/issues/detail?id=378607
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = undefined;
+ } else {
+ delete owner[ this.expando ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ var cache = owner[ this.expando ];
+ return cache !== undefined && !jQuery.isEmptyObject( cache );
+ }
+};
+var dataPriv = new Data();
+
+var dataUser = new Data();
+
+
+
+// Implementation Summary
+//
+// 1. Enforce API surface and semantic compatibility with 1.9.x branch
+// 2. Improve the module's maintainability by reducing the storage
+// paths to a single mechanism.
+// 3. Use the same single mechanism to support "private" and "user" data.
+// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+// 5. Avoid exposing implementation details on user objects (eg. expando properties)
+// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /[A-Z]/g;
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch ( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ dataUser.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend( {
+ hasData: function( elem ) {
+ return dataUser.hasData( elem ) || dataPriv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return dataUser.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ dataUser.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to dataPriv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return dataPriv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ dataPriv.remove( elem, name );
+ }
+} );
+
+jQuery.fn.extend( {
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = dataUser.get( elem );
+
+ if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE11+
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.slice( 5 ) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ dataPriv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each( function() {
+ dataUser.set( this, key );
+ } );
+ }
+
+ return access( this, function( value ) {
+ var data, camelKey;
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+
+ // Attempt to get data from the cache
+ // with the key as-is
+ data = dataUser.get( elem, key ) ||
+
+ // Try to find dashed key if it exists (gh-2779)
+ // This is for 2.2.x only
+ dataUser.get( elem, key.replace( rmultiDash, "-$&" ).toLowerCase() );
+
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ camelKey = jQuery.camelCase( key );
+
+ // Attempt to get data from the cache
+ // with the key camelized
+ data = dataUser.get( elem, camelKey );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, camelKey, undefined );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ camelKey = jQuery.camelCase( key );
+ this.each( function() {
+
+ // First, attempt to store a copy or reference of any
+ // data that might've been store with a camelCased key.
+ var data = dataUser.get( this, camelKey );
+
+ // For HTML5 data-* attribute interop, we have to
+ // store property names with dashes in a camelCase form.
+ // This might not apply to all properties...*
+ dataUser.set( this, camelKey, value );
+
+ // *... In the case of properties that might _actually_
+ // have dashes, we need to also store a copy of that
+ // unchanged property.
+ if ( key.indexOf( "-" ) > -1 && data !== undefined ) {
+ dataUser.set( this, key, value );
+ }
+ } );
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each( function() {
+ dataUser.remove( this, key );
+ } );
+ }
+} );
+
+
+jQuery.extend( {
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = dataPriv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray( data ) ) {
+ queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // Clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // Not public - generate a queueHooks object, or return the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
+ empty: jQuery.Callbacks( "once memory" ).add( function() {
+ dataPriv.remove( elem, [ type + "queue", key ] );
+ } )
+ } );
+ }
+} );
+
+jQuery.fn.extend( {
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[ 0 ], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each( function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // Ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ } );
+ },
+ dequeue: function( type ) {
+ return this.each( function() {
+ jQuery.dequeue( this, type );
+ } );
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+} );
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHidden = function( elem, el ) {
+
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+ return jQuery.css( elem, "display" ) === "none" ||
+ !jQuery.contains( elem.ownerDocument, elem );
+ };
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+ var adjusted,
+ scale = 1,
+ maxIterations = 20,
+ currentValue = tween ?
+ function() { return tween.cur(); } :
+ function() { return jQuery.css( elem, prop, "" ); },
+ initial = currentValue(),
+ unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+ rcssNum.exec( jQuery.css( elem, prop ) );
+
+ if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+ // Trust units reported by jQuery.css
+ unit = unit || initialInUnit[ 3 ];
+
+ // Make sure we update the tween properties later on
+ valueParts = valueParts || [];
+
+ // Iteratively approximate from a nonzero starting point
+ initialInUnit = +initial || 1;
+
+ do {
+
+ // If previous iteration zeroed out, double until we get *something*.
+ // Use string for doubling so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ initialInUnit = initialInUnit / scale;
+ jQuery.style( elem, prop, initialInUnit + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur()
+ // Break the loop if scale is unchanged or perfect, or if we've just had enough.
+ } while (
+ scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
+ );
+ }
+
+ if ( valueParts ) {
+ initialInUnit = +initialInUnit || +initial || 0;
+
+ // Apply relative offset (+=/-=) if specified
+ adjusted = valueParts[ 1 ] ?
+ initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+ +valueParts[ 2 ];
+ if ( tween ) {
+ tween.unit = unit;
+ tween.start = initialInUnit;
+ tween.end = adjusted;
+ }
+ }
+ return adjusted;
+}
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([\w:-]+)/ );
+
+var rscriptType = ( /^$|\/(?:java|ecma)script/i );
+
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+
+ // Support: IE9
+ option: [ 1, "", " " ],
+
+ // XHTML parsers do not magically insert elements in the
+ // same way that tag soup parsers do. So we cannot shorten
+ // this by omitting or other required elements.
+ thead: [ 1, "" ],
+ col: [ 2, "" ],
+ tr: [ 2, "" ],
+ td: [ 3, "" ],
+
+ _default: [ 0, "", "" ]
+};
+
+// Support: IE9
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+
+function getAll( context, tag ) {
+
+ // Support: IE9-11+
+ // Use typeof to avoid zero-argument method invocation on host objects (#15151)
+ var ret = typeof context.getElementsByTagName !== "undefined" ?
+ context.getElementsByTagName( tag || "*" ) :
+ typeof context.querySelectorAll !== "undefined" ?
+ context.querySelectorAll( tag || "*" ) :
+ [];
+
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], ret ) :
+ ret;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ dataPriv.set(
+ elems[ i ],
+ "globalEval",
+ !refElements || dataPriv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+
+var rhtml = /<|?\w+;/;
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+ var elem, tmp, tag, wrap, contains, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+
+ // Support: Android<4.1, PhantomJS<2
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: Android<4.1, PhantomJS<2
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Ensure the created nodes are orphaned (#12392)
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( ( elem = nodes[ i++ ] ) ) {
+
+ // Skip elements already in the context collection (trac-4087)
+ if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+ if ( ignored ) {
+ ignored.push( elem );
+ }
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( ( elem = tmp[ j++ ] ) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+}
+
+
+( function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // Support: Android 4.0-4.3, Safari<=5.1
+ // Check state lost if the name is set (#11217)
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Safari<=5.1, Android<4.2
+ // Older WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE<=11+
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ div.innerHTML = "";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+} )();
+
+
+var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+// Support: IE9
+// See #13393 for more info
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ on( elem, type, selector, data, types[ type ], one );
+ }
+ return elem;
+ }
+
+ if ( data == null && fn == null ) {
+
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return elem;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return elem.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ } );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.get( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !( events = elemData.events ) ) {
+ events = elemData.events = {};
+ }
+ if ( !( eventHandle = elemData.handle ) ) {
+ eventHandle = elemData.handle = function( e ) {
+
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend( {
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join( "." )
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !( handlers = events[ type ] ) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup ||
+ special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
+
+ if ( !elemData || !( events = elemData.events ) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[ 2 ] &&
+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector ||
+ selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown ||
+ special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove data and the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ dataPriv.remove( elem, "handle events" );
+ }
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event );
+
+ var i, j, ret, matched, handleObj,
+ handlerQueue = [],
+ args = slice.call( arguments ),
+ handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[ 0 ] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( ( handleObj = matched.handlers[ j++ ] ) &&
+ !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or 2) have namespace(s)
+ // a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+ handleObj.handler ).apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( ( event.result = ret ) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, matches, sel, handleObj,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Support (at least): Chrome, IE9
+ // Find delegate handlers
+ // Black-hole SVG instance trees (#13180)
+ //
+ // Support: Firefox<=42+
+ // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
+ if ( delegateCount && cur.nodeType &&
+ ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't check non-elements (#13208)
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {
+ matches = [];
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matches[ sel ] === undefined ) {
+ matches[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) > -1 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matches[ sel ] ) {
+ matches.push( handleObj );
+ }
+ }
+ if ( matches.length ) {
+ handlerQueue.push( { elem: cur, handlers: matches } );
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );
+ }
+
+ return handlerQueue;
+ },
+
+ // Includes some event props shared by KeyEvent and MouseEvent
+ props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " +
+ "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ),
+
+ fixHooks: {},
+
+ keyHooks: {
+ props: "char charCode key keyCode".split( " " ),
+ filter: function( event, original ) {
+
+ // Add which for key events
+ if ( event.which == null ) {
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
+ }
+
+ return event;
+ }
+ },
+
+ mouseHooks: {
+ props: ( "button buttons clientX clientY offsetX offsetY pageX pageY " +
+ "screenX screenY toElement" ).split( " " ),
+ filter: function( event, original ) {
+ var eventDoc, doc, body,
+ button = original.button;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && original.clientX != null ) {
+ eventDoc = event.target.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ event.pageX = original.clientX +
+ ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
+ ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+ event.pageY = original.clientY +
+ ( doc && doc.scrollTop || body && body.scrollTop || 0 ) -
+ ( doc && doc.clientTop || body && body.clientTop || 0 );
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && button !== undefined ) {
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+ }
+
+ return event;
+ }
+ },
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop, copy,
+ type = event.type,
+ originalEvent = event,
+ fixHook = this.fixHooks[ type ];
+
+ if ( !fixHook ) {
+ this.fixHooks[ type ] = fixHook =
+ rmouseEvent.test( type ) ? this.mouseHooks :
+ rkeyEvent.test( type ) ? this.keyHooks :
+ {};
+ }
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+ event = new jQuery.Event( originalEvent );
+
+ i = copy.length;
+ while ( i-- ) {
+ prop = copy[ i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Support: Cordova 2.5 (WebKit) (#13255)
+ // All events should have a target; Cordova deviceready doesn't
+ if ( !event.target ) {
+ event.target = document;
+ }
+
+ // Support: Safari 6.0+, Chrome<28
+ // Target should not be a text node (#504, #13143)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+ },
+
+ special: {
+ load: {
+
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ focus: {
+
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== safeActiveElement() && this.focus ) {
+ this.focus();
+ return false;
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function() {
+ if ( this === safeActiveElement() && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+ click: {
+
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
+ this.click();
+ return false;
+ }
+ },
+
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function( event ) {
+ return jQuery.nodeName( event.target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+
+ // This "if" is needed for plain objects
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+
+ // Allow instantiation without the 'new' keyword
+ if ( !( this instanceof jQuery.Event ) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+
+ // Support: Android<4.0
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ constructor: jQuery.Event,
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+ isSimulated: false,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://code.google.com/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mouseenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+} );
+
+jQuery.fn.extend( {
+ on: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn );
+ },
+ one: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ?
+ handleObj.origType + "." + handleObj.namespace :
+ handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each( function() {
+ jQuery.event.remove( this, types, fn, selector );
+ } );
+ }
+} );
+
+
+var
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,
+
+ // Support: IE 10-11, Edge 10240+
+ // In IE/Edge using regex groups here causes severe slowdowns.
+ // See https://connect.microsoft.com/IE/feedback/details/1736512/
+ rnoInnerhtml = /
+ ```
+
+ And associate it by name using a view's `templateName` property:
+
+ ```javascript
+ AView = Ember.View.extend({
+ templateName: 'some-template'
+ });
+ ```
+
+ If you have nested routes, your Handlebars template will look like this:
+
+ ```html
+
+ ```
+
+ And `templateName` property:
+
+ ```javascript
+ AView = Ember.View.extend({
+ templateName: 'posts/new'
+ });
+ ```
+
+ Using a value for `templateName` that does not have a template
+ with a matching `data-template-name` attribute will throw an error.
+
+ For views classes that may have a template later defined (e.g. as the block
+ portion of a `{{view}}` helper call in another template or in
+ a subclass), you can provide a `defaultTemplate` property set to compiled
+ template function. If a template is not later provided for the view instance
+ the `defaultTemplate` value will be used:
+
+ ```javascript
+ AView = Ember.View.extend({
+ defaultTemplate: Ember.HTMLBars.compile('I was the default'),
+ template: null,
+ templateName: null
+ });
+ ```
+
+ Will result in instances with an HTML representation of:
+
+ ```html
+ I was the default
+ ```
+
+ If a `template` or `templateName` is provided it will take precedence over
+ `defaultTemplate`:
+
+ ```javascript
+ AView = Ember.View.extend({
+ defaultTemplate: Ember.HTMLBars.compile('I was the default')
+ });
+
+ aView = AView.create({
+ template: Ember.HTMLBars.compile('I was the template, not default')
+ });
+ ```
+
+ Will result in the following HTML representation when rendered:
+
+ ```html
+ I was the template, not default
+ ```
+
+ ## View Context
+
+ The default context of the compiled template is the view's controller:
+
+ ```javascript
+ AView = Ember.View.extend({
+ template: Ember.HTMLBars.compile('Hello {{excitedGreeting}}')
+ });
+
+ aController = Ember.Object.create({
+ firstName: 'Barry',
+ excitedGreeting: Ember.computed('content.firstName', function() {
+ return this.get('content.firstName') + '!!!';
+ })
+ });
+
+ aView = AView.create({
+ controller: aController
+ });
+ ```
+
+ Will result in an HTML representation of:
+
+ ```html
+ Hello Barry!!!
+ ```
+
+ A context can also be explicitly supplied through the view's `context`
+ property. If the view has neither `context` nor `controller` properties, the
+ `parentView`'s context will be used.
+
+ ## Layouts
+
+ Views can have a secondary template that wraps their main template. Like
+ primary templates, layouts can be any function that accepts an optional
+ context parameter and returns a string of HTML that will be inserted inside
+ view's tag. Views whose HTML element is self closing (e.g. ` `)
+ cannot have a layout and this property will be ignored.
+
+ Most typically in Ember a layout will be a compiled template.
+
+ A view's layout can be set directly with the `layout` property or reference
+ an existing template by name with the `layoutName` property.
+
+ A template used as a layout must contain a single use of the
+ `{{yield}}` helper. The HTML contents of a view's rendered `template` will be
+ inserted at this location:
+
+ ```javascript
+ AViewWithLayout = Ember.View.extend({
+ layout: Ember.HTMLBars.compile("{{yield}}
"),
+ template: Ember.HTMLBars.compile("I got wrapped")
+ });
+ ```
+
+ Will result in view instances with an HTML representation of:
+
+ ```html
+
+ ```
+
+ See [Ember.Templates.helpers.yield](/api/classes/Ember.Templates.helpers.html#method_yield)
+ for more information.
+
+ ## Responding to Browser Events
+
+ Views can respond to user-initiated events in one of three ways: method
+ implementation, through an event manager, and through `{{action}}` helper use
+ in their template or layout.
+
+ ### Method Implementation
+
+ Views can respond to user-initiated events by implementing a method that
+ matches the event name. A `jQuery.Event` object will be passed as the
+ argument to this method.
+
+ ```javascript
+ AView = Ember.View.extend({
+ click: function(event) {
+ // will be called when an instance's
+ // rendered element is clicked
+ }
+ });
+ ```
+
+ ### Event Managers
+
+ Views can define an object as their `eventManager` property. This object can
+ then implement methods that match the desired event names. Matching events
+ that occur on the view's rendered HTML or the rendered HTML of any of its DOM
+ descendants will trigger this method. A `jQuery.Event` object will be passed
+ as the first argument to the method and an `Ember.View` object as the
+ second. The `Ember.View` will be the view whose rendered HTML was interacted
+ with. This may be the view with the `eventManager` property or one of its
+ descendant views.
+
+ ```javascript
+ AView = Ember.View.extend({
+ eventManager: Ember.Object.create({
+ doubleClick: function(event, view) {
+ // will be called when an instance's
+ // rendered element or any rendering
+ // of this view's descendant
+ // elements is clicked
+ }
+ })
+ });
+ ```
+
+ An event defined for an event manager takes precedence over events of the
+ same name handled through methods on the view.
+
+ ```javascript
+ AView = Ember.View.extend({
+ mouseEnter: function(event) {
+ // will never trigger.
+ },
+ eventManager: Ember.Object.create({
+ mouseEnter: function(event, view) {
+ // takes precedence over AView#mouseEnter
+ }
+ })
+ });
+ ```
+
+ Similarly a view's event manager will take precedence for events of any views
+ rendered as a descendant. A method name that matches an event name will not
+ be called if the view instance was rendered inside the HTML representation of
+ a view that has an `eventManager` property defined that handles events of the
+ name. Events not handled by the event manager will still trigger method calls
+ on the descendant.
+
+ ```javascript
+ var App = Ember.Application.create();
+ App.OuterView = Ember.View.extend({
+ template: Ember.HTMLBars.compile("outer {{#view 'inner'}}inner{{/view}} outer"),
+ eventManager: Ember.Object.create({
+ mouseEnter: function(event, view) {
+ // view might be instance of either
+ // OuterView or InnerView depending on
+ // where on the page the user interaction occurred
+ }
+ })
+ });
+
+ App.InnerView = Ember.View.extend({
+ click: function(event) {
+ // will be called if rendered inside
+ // an OuterView because OuterView's
+ // eventManager doesn't handle click events
+ },
+ mouseEnter: function(event) {
+ // will never be called if rendered inside
+ // an OuterView.
+ }
+ });
+ ```
+
+ ### `{{action}}` Helper
+
+ See [Ember.Templates.helpers.action](/api/classes/Ember.Templates.helpers.html#method_action).
+
+ ### Event Names
+
+ All of the event handling approaches described above respond to the same set
+ of events. The names of the built-in events are listed below. (The hash of
+ built-in events exists in `Ember.EventDispatcher`.) Additional, custom events
+ can be registered by using `Ember.Application.customEvents`.
+
+ Touch events:
+
+ * `touchStart`
+ * `touchMove`
+ * `touchEnd`
+ * `touchCancel`
+
+ Keyboard events
+
+ * `keyDown`
+ * `keyUp`
+ * `keyPress`
+
+ Mouse events
+
+ * `mouseDown`
+ * `mouseUp`
+ * `contextMenu`
+ * `click`
+ * `doubleClick`
+ * `mouseMove`
+ * `focusIn`
+ * `focusOut`
+ * `mouseEnter`
+ * `mouseLeave`
+
+ Form events:
+
+ * `submit`
+ * `change`
+ * `focusIn`
+ * `focusOut`
+ * `input`
+
+ HTML5 drag and drop events:
+
+ * `dragStart`
+ * `drag`
+ * `dragEnter`
+ * `dragLeave`
+ * `dragOver`
+ * `dragEnd`
+ * `drop`
+
+ ## `{{view}}` Helper
+
+ Other `Ember.View` instances can be included as part of a view's template by
+ using the `{{view}}` helper. See [Ember.Templates.helpers.view](/api/classes/Ember.Templates.helpers.html#method_view)
+ for additional information.
+
+ @class View
+ @namespace Ember
+ @extends Ember.CoreView
+ @deprecated See http://emberjs.com/deprecations/v1.x/#toc_ember-view
+ @uses Ember.ViewSupport
+ @uses Ember.ViewContextSupport
+ @uses Ember.ViewChildViewsSupport
+ @uses Ember.TemplateRenderingSupport
+ @uses Ember.ClassNamesSupport
+ @uses Ember.AttributeBindingsSupport
+ @uses Ember.LegacyViewSupport
+ @uses Ember.InstrumentationSupport
+ @uses Ember.VisibilitySupport
+ @uses Ember.AriaRoleSupport
+ @public
+ */
+ // jscs:disable validateIndentation
+ var View = _emberViewsViewsCore_view.default.extend(_emberViewsMixinsView_context_support.default, _emberViewsMixinsView_child_views_support.default, _emberViewsMixinsLegacy_child_views_support.default, _emberViewsMixinsView_state_support.default, _emberViewsMixinsTemplate_rendering_support.default, _emberViewsMixinsClass_names_support.default, _emberViewsMixinsLegacy_view_support.default, _emberViewsMixinsInstrumentation_support.default, _emberViewsMixinsVisibility_support.default, _emberViewsCompatAttrsProxy.default, _emberViewsMixinsAria_role_support.default, _emberViewsMixinsView_support.default, {
+ init: function () {
+ this._super.apply(this, arguments);
+
+ if (!this._viewRegistry) {
+ this._viewRegistry = View.views;
+ }
+ },
+
+ /**
+ Given a property name, returns a dasherized version of that
+ property name if the property evaluates to a non-falsy value.
+ For example, if the view has property `isUrgent` that evaluates to true,
+ passing `isUrgent` to this method will return `"is-urgent"`.
+ @method _classStringForProperty
+ @param property
+ @private
+ */
+ _classStringForProperty: function (parsedPath) {
+ return View._classStringForValue(parsedPath.path, parsedPath.stream.value(), parsedPath.className, parsedPath.falsyClassName);
+ }
+ });
+
+ _emberMetalDeprecate_property.deprecateProperty(View.prototype, 'currentState', '_currentState', {
+ id: 'ember-view.current-state',
+ until: '2.3.0',
+ url: 'http://emberjs.com/deprecations/v2.x/#toc_ember-component-currentstate'
+ });
+
+ // jscs:enable validateIndentation
+
+ /*
+ Describe how the specified actions should behave in the various
+ states that a view can exist in. Possible states:
+
+ * preRender: when a view is first instantiated, and after its
+ element was destroyed, it is in the preRender state
+ * inBuffer: once a view has been rendered, but before it has
+ been inserted into the DOM, it is in the inBuffer state
+ * hasElement: the DOM representation of the view is created,
+ and is ready to be inserted
+ * inDOM: once a view has been inserted into the DOM it is in
+ the inDOM state. A view spends the vast majority of its
+ existence in this state.
+ * destroyed: once a view has been destroyed (using the destroy
+ method), it is in this state. No further actions can be invoked
+ on a destroyed view.
+ */
+
+ // in the destroyed state, everything is illegal
+
+ // before rendering has begun, all legal manipulations are noops.
+
+ // inside the buffer, legal manipulations are done on the buffer
+
+ // once the view has been inserted into the DOM, legal manipulations
+ // are done on the DOM element.
+
+ View.reopenClass({
+ /**
+ Global views hash
+ @property views
+ @static
+ @type Object
+ @private
+ */
+ views: {},
+
+ // If someone overrides the child views computed property when
+ // defining their class, we want to be able to process the user's
+ // supplied childViews and then restore the original computed property
+ // at view initialization time. This happens in Ember.ContainerView's init
+ // method.
+ childViewsProperty: _emberViewsMixinsView_child_views_support.childViewsProperty
+ });
+
+ function viewDeprecationMessage() {
+ _emberMetalDebug.deprecate('Ember.View is deprecated. Consult the Deprecations Guide for a migration strategy.', !!_emberMetalCore.default.ENV._ENABLE_LEGACY_VIEW_SUPPORT, {
+ url: 'http://emberjs.com/deprecations/v1.x/#toc_ember-view',
+ id: 'ember-views.view-deprecated',
+ until: '2.4.0'
+ });
+ }
+
+ var DeprecatedView = View.extend({
+ init: function () {
+ viewDeprecationMessage();
+ this._super.apply(this, arguments);
+ }
+ });
+
+ DeprecatedView.reopen = function () {
+ viewDeprecationMessage();
+ View.reopen.apply(View, arguments);
+ return this;
+ };
+
+ exports.default = View;
+ exports.ViewContextSupport = _emberViewsMixinsView_context_support.default;
+ exports.ViewChildViewsSupport = _emberViewsMixinsView_child_views_support.default;
+ exports.ViewStateSupport = _emberViewsMixinsView_state_support.default;
+ exports.TemplateRenderingSupport = _emberViewsMixinsTemplate_rendering_support.default;
+ exports.ClassNamesSupport = _emberViewsMixinsClass_names_support.default;
+ exports.DeprecatedView = DeprecatedView;
+});
+// for the side effect of extending Ember.run.queues
+enifed('htmlbars-runtime/expression-visitor', ['exports'], function (exports) {
+ /**
+ # Expression Nodes:
+
+ These nodes are not directly responsible for any part of the DOM, but are
+ eventually passed to a Statement Node.
+
+ * get
+ * subexpr
+ * concat
+ */
+
+ 'use strict';
+
+ exports.acceptParams = acceptParams;
+ exports.acceptHash = acceptHash;
+
+ function acceptParams(nodes, env, scope) {
+ var array = [];
+
+ for (var i = 0, l = nodes.length; i < l; i++) {
+ array.push(acceptExpression(nodes[i], env, scope).value);
+ }
+
+ return array;
+ }
+
+ function acceptHash(pairs, env, scope) {
+ var object = {};
+
+ for (var i = 0, l = pairs.length; i < l; i += 2) {
+ var key = pairs[i];
+ var value = pairs[i + 1];
+ object[key] = acceptExpression(value, env, scope).value;
+ }
+
+ return object;
+ }
+
+ function acceptExpression(node, env, scope) {
+ var ret = { value: null };
+
+ // Primitive literals are unambiguously non-array representations of
+ // themselves.
+ if (typeof node !== 'object' || node === null) {
+ ret.value = node;
+ } else {
+ ret.value = evaluateNode(node, env, scope);
+ }
+
+ return ret;
+ }
+
+ function evaluateNode(node, env, scope) {
+ switch (node[0]) {
+ // can be used by manualElement
+ case 'value':
+ return node[1];
+ case 'get':
+ return evaluateGet(node, env, scope);
+ case 'subexpr':
+ return evaluateSubexpr(node, env, scope);
+ case 'concat':
+ return evaluateConcat(node, env, scope);
+ }
+ }
+
+ function evaluateGet(node, env, scope) {
+ var path = node[1];
+
+ return env.hooks.get(env, scope, path);
+ }
+
+ function evaluateSubexpr(node, env, scope) {
+ var path = node[1];
+ var rawParams = node[2];
+ var rawHash = node[3];
+
+ var params = acceptParams(rawParams, env, scope);
+ var hash = acceptHash(rawHash, env, scope);
+
+ return env.hooks.subexpr(env, scope, path, params, hash);
+ }
+
+ function evaluateConcat(node, env, scope) {
+ var rawParts = node[1];
+
+ var parts = acceptParams(rawParts, env, scope);
+
+ return env.hooks.concat(env, parts);
+ }
+});
+enifed("htmlbars-runtime/hooks", ["exports", "htmlbars-runtime/render", "morph-range/morph-list", "htmlbars-util/object-utils", "htmlbars-util/morph-utils", "htmlbars-util/template-utils"], function (exports, _htmlbarsRuntimeRender, _morphRangeMorphList, _htmlbarsUtilObjectUtils, _htmlbarsUtilMorphUtils, _htmlbarsUtilTemplateUtils) {
+ "use strict";
+
+ exports.wrap = wrap;
+ exports.wrapForHelper = wrapForHelper;
+ exports.createScope = createScope;
+ exports.createFreshScope = createFreshScope;
+ exports.bindShadowScope = bindShadowScope;
+ exports.createChildScope = createChildScope;
+ exports.bindSelf = bindSelf;
+ exports.updateSelf = updateSelf;
+ exports.bindLocal = bindLocal;
+ exports.updateLocal = updateLocal;
+ exports.bindBlock = bindBlock;
+ exports.block = block;
+ exports.continueBlock = continueBlock;
+ exports.hostBlock = hostBlock;
+ exports.handleRedirect = handleRedirect;
+ exports.handleKeyword = handleKeyword;
+ exports.linkRenderNode = linkRenderNode;
+ exports.inline = inline;
+ exports.keyword = keyword;
+ exports.invokeHelper = invokeHelper;
+ exports.classify = classify;
+ exports.partial = partial;
+ exports.range = range;
+ exports.element = element;
+ exports.attribute = attribute;
+ exports.subexpr = subexpr;
+ exports.get = get;
+ exports.getRoot = getRoot;
+ exports.getBlock = getBlock;
+ exports.getChild = getChild;
+ exports.getValue = getValue;
+ exports.getCellOrValue = getCellOrValue;
+ exports.component = component;
+ exports.concat = concat;
+ exports.hasHelper = hasHelper;
+ exports.lookupHelper = lookupHelper;
+ exports.bindScope = bindScope;
+ exports.updateScope = updateScope;
+
+ /**
+ HTMLBars delegates the runtime behavior of a template to
+ hooks provided by the host environment. These hooks explain
+ the lexical environment of a Handlebars template, the internal
+ representation of references, and the interaction between an
+ HTMLBars template and the DOM it is managing.
+
+ While HTMLBars host hooks have access to all of this internal
+ machinery, templates and helpers have access to the abstraction
+ provided by the host hooks.
+
+ ## The Lexical Environment
+
+ The default lexical environment of an HTMLBars template includes:
+
+ * Any local variables, provided by *block arguments*
+ * The current value of `self`
+
+ ## Simple Nesting
+
+ Let's look at a simple template with a nested block:
+
+ ```hbs
+ {{title}}
+
+ {{#if author}}
+ {{author}}
+ {{/if}}
+ ```
+
+ In this case, the lexical environment at the top-level of the
+ template does not change inside of the `if` block. This is
+ achieved via an implementation of `if` that looks like this:
+
+ ```js
+ registerHelper('if', function(params) {
+ if (!!params[0]) {
+ return this.yield();
+ }
+ });
+ ```
+
+ A call to `this.yield` invokes the child template using the
+ current lexical environment.
+
+ ## Block Arguments
+
+ It is possible for nested blocks to introduce new local
+ variables:
+
+ ```hbs
+ {{#count-calls as |i|}}
+ {{title}}
+ Called {{i}} times
+ {{/count}}
+ ```
+
+ In this example, the child block inherits its surrounding
+ lexical environment, but augments it with a single new
+ variable binding.
+
+ The implementation of `count-calls` supplies the value of
+ `i`, but does not otherwise alter the environment:
+
+ ```js
+ var count = 0;
+ registerHelper('count-calls', function() {
+ return this.yield([ ++count ]);
+ });
+ ```
+ */
+
+ function wrap(template) {
+ if (template === null) {
+ return null;
+ }
+
+ return {
+ meta: template.meta,
+ arity: template.arity,
+ raw: template,
+ render: function (self, env, options, blockArguments) {
+ var scope = env.hooks.createFreshScope();
+
+ var contextualElement = options && options.contextualElement;
+ var renderOptions = new _htmlbarsRuntimeRender.RenderOptions(null, self, blockArguments, contextualElement);
+
+ return _htmlbarsRuntimeRender.default(template, env, scope, renderOptions);
+ }
+ };
+ }
+
+ function wrapForHelper(template, env, scope, morph, renderState, visitor) {
+ if (!template) {
+ return {};
+ }
+
+ var yieldArgs = yieldTemplate(template, env, scope, morph, renderState, visitor);
+
+ return {
+ meta: template.meta,
+ arity: template.arity,
+ 'yield': yieldArgs, // quoted since it's a reserved word, see issue #420
+ yieldItem: yieldItem(template, env, scope, morph, renderState, visitor),
+ raw: template,
+
+ render: function (self, blockArguments) {
+ yieldArgs(blockArguments, self);
+ }
+ };
+ }
+
+ // Called by a user-land helper to render a template.
+ function yieldTemplate(template, env, parentScope, morph, renderState, visitor) {
+ return function (blockArguments, self) {
+ // Render state is used to track the progress of the helper (since it
+ // may call into us multiple times). As the user-land helper calls
+ // into library code, we track what needs to be cleaned up after the
+ // helper has returned.
+ //
+ // Here, we remember that a template has been yielded and so we do not
+ // need to remove the previous template. (If no template is yielded
+ // this render by the helper, we assume nothing should be shown and
+ // remove any previous rendered templates.)
+ renderState.morphToClear = null;
+
+ // In this conditional is true, it means that on the previous rendering pass
+ // the helper yielded multiple items via `yieldItem()`, but this time they
+ // are yielding a single template. In that case, we mark the morph list for
+ // cleanup so it is removed from the DOM.
+ if (morph.morphList) {
+ _htmlbarsUtilTemplateUtils.clearMorphList(morph.morphList, morph, env);
+ renderState.morphListToClear = null;
+ }
+
+ var scope = parentScope;
+
+ if (morph.lastYielded && isStableTemplate(template, morph.lastYielded)) {
+ return morph.lastResult.revalidateWith(env, undefined, self, blockArguments, visitor);
+ }
+
+ // Check to make sure that we actually **need** a new scope, and can't
+ // share the parent scope. Note that we need to move this check into
+ // a host hook, because the host's notion of scope may require a new
+ // scope in more cases than the ones we can determine statically.
+ if (self !== undefined || parentScope === null || template.arity) {
+ scope = env.hooks.createChildScope(parentScope);
+ }
+
+ morph.lastYielded = { self: self, template: template, shadowTemplate: null };
+
+ // Render the template that was selected by the helper
+ var renderOptions = new _htmlbarsRuntimeRender.RenderOptions(morph, self, blockArguments);
+ _htmlbarsRuntimeRender.default(template, env, scope, renderOptions);
+ };
+ }
+
+ function yieldItem(template, env, parentScope, morph, renderState, visitor) {
+ // Initialize state that tracks multiple items being
+ // yielded in.
+ var currentMorph = null;
+
+ // Candidate morphs for deletion.
+ var candidates = {};
+
+ // Reuse existing MorphList if this is not a first-time
+ // render.
+ var morphList = morph.morphList;
+ if (morphList) {
+ currentMorph = morphList.firstChildMorph;
+ }
+
+ // Advances the currentMorph pointer to the morph in the previously-rendered
+ // list that matches the yielded key. While doing so, it marks any morphs
+ // that it advances past as candidates for deletion. Assuming those morphs
+ // are not yielded in later, they will be removed in the prune step during
+ // cleanup.
+ // Note that this helper function assumes that the morph being seeked to is
+ // guaranteed to exist in the previous MorphList; if this is called and the
+ // morph does not exist, it will result in an infinite loop
+ function advanceToKey(key) {
+ var seek = currentMorph;
+
+ while (seek.key !== key) {
+ candidates[seek.key] = seek;
+ seek = seek.nextMorph;
+ }
+
+ currentMorph = seek.nextMorph;
+ return seek;
+ }
+
+ return function (_key, blockArguments, self) {
+ if (typeof _key !== 'string') {
+ throw new Error("You must provide a string key when calling `yieldItem`; you provided " + _key);
+ }
+
+ // At least one item has been yielded, so we do not wholesale
+ // clear the last MorphList but instead apply a prune operation.
+ renderState.morphListToClear = null;
+ morph.lastYielded = null;
+
+ var morphList, morphMap;
+
+ if (!morph.morphList) {
+ morph.morphList = new _morphRangeMorphList.default();
+ morph.morphMap = {};
+ morph.setMorphList(morph.morphList);
+ }
+
+ morphList = morph.morphList;
+ morphMap = morph.morphMap;
+
+ // A map of morphs that have been yielded in on this
+ // rendering pass. Any morphs that do not make it into
+ // this list will be pruned from the MorphList during the cleanup
+ // process.
+ var handledMorphs = renderState.handledMorphs;
+ var key = undefined;
+
+ if (_key in handledMorphs) {
+ // In this branch we are dealing with a duplicate key. The strategy
+ // is to take the original key and append a counter to it that is
+ // incremented every time the key is reused. In order to greatly
+ // reduce the chance of colliding with another valid key we also add
+ // an extra string "--z8mS2hvDW0A--" to the new key.
+ var collisions = renderState.collisions;
+ if (collisions === undefined) {
+ collisions = renderState.collisions = {};
+ }
+ var count = collisions[_key] | 0;
+ collisions[_key] = ++count;
+
+ key = _key + '--z8mS2hvDW0A--' + count;
+ } else {
+ key = _key;
+ }
+
+ if (currentMorph && currentMorph.key === key) {
+ yieldTemplate(template, env, parentScope, currentMorph, renderState, visitor)(blockArguments, self);
+ currentMorph = currentMorph.nextMorph;
+ handledMorphs[key] = currentMorph;
+ } else if (morphMap[key] !== undefined) {
+ var foundMorph = morphMap[key];
+
+ if (key in candidates) {
+ // If we already saw this morph, move it forward to this position
+ morphList.insertBeforeMorph(foundMorph, currentMorph);
+ } else {
+ // Otherwise, move the pointer forward to the existing morph for this key
+ advanceToKey(key);
+ }
+
+ handledMorphs[foundMorph.key] = foundMorph;
+ yieldTemplate(template, env, parentScope, foundMorph, renderState, visitor)(blockArguments, self);
+ } else {
+ var childMorph = _htmlbarsRuntimeRender.createChildMorph(env.dom, morph);
+ childMorph.key = key;
+ morphMap[key] = handledMorphs[key] = childMorph;
+ morphList.insertBeforeMorph(childMorph, currentMorph);
+ yieldTemplate(template, env, parentScope, childMorph, renderState, visitor)(blockArguments, self);
+ }
+
+ renderState.morphListToPrune = morphList;
+ morph.childNodes = null;
+ };
+ }
+
+ function isStableTemplate(template, lastYielded) {
+ return !lastYielded.shadowTemplate && template === lastYielded.template;
+ }
+ function optionsFor(template, inverse, env, scope, morph, visitor) {
+ // If there was a template yielded last time, set morphToClear so it will be cleared
+ // if no template is yielded on this render.
+ var morphToClear = morph.lastResult ? morph : null;
+ var renderState = new _htmlbarsUtilTemplateUtils.RenderState(morphToClear, morph.morphList || null);
+
+ return {
+ templates: {
+ template: wrapForHelper(template, env, scope, morph, renderState, visitor),
+ inverse: wrapForHelper(inverse, env, scope, morph, renderState, visitor)
+ },
+ renderState: renderState
+ };
+ }
+
+ function thisFor(options) {
+ return {
+ arity: options.template.arity,
+ 'yield': options.template.yield, // quoted since it's a reserved word, see issue #420
+ yieldItem: options.template.yieldItem,
+ yieldIn: options.template.yieldIn
+ };
+ }
+
+ /**
+ Host Hook: createScope
+
+ @param {Scope?} parentScope
+ @return Scope
+
+ Corresponds to entering a new HTMLBars block.
+
+ This hook is invoked when a block is entered with
+ a new `self` or additional local variables.
+
+ When invoked for a top-level template, the
+ `parentScope` is `null`, and this hook should return
+ a fresh Scope.
+
+ When invoked for a child template, the `parentScope`
+ is the scope for the parent environment.
+
+ Note that the `Scope` is an opaque value that is
+ passed to other host hooks. For example, the `get`
+ hook uses the scope to retrieve a value for a given
+ scope and variable name.
+ */
+
+ function createScope(env, parentScope) {
+ if (parentScope) {
+ return env.hooks.createChildScope(parentScope);
+ } else {
+ return env.hooks.createFreshScope();
+ }
+ }
+
+ function createFreshScope() {
+ // because `in` checks have unpredictable performance, keep a
+ // separate dictionary to track whether a local was bound.
+ // See `bindLocal` for more information.
+ return { self: null, blocks: {}, locals: {}, localPresent: {} };
+ }
+
+ /**
+ Host Hook: bindShadowScope
+
+ @param {Scope?} parentScope
+ @return Scope
+
+ Corresponds to rendering a new template into an existing
+ render tree, but with a new top-level lexical scope. This
+ template is called the "shadow root".
+
+ If a shadow template invokes `{{yield}}`, it will render
+ the block provided to the shadow root in the original
+ lexical scope.
+
+ ```hbs
+ {{!-- post template --}}
+ {{props.title}}
+ {{yield}}
+
+ {{!-- blog template --}}
+ {{#post title="Hello world"}}
+ by {{byline}}
+ This is my first post
+ {{/post}}
+
+ {{#post title="Goodbye world"}}
+ by {{byline}}
+ This is my last post
+ {{/post}}
+ ```
+
+ ```js
+ helpers.post = function(params, hash, options) {
+ options.template.yieldIn(postTemplate, { props: hash });
+ };
+
+ blog.render({ byline: "Yehuda Katz" });
+ ```
+
+ Produces:
+
+ ```html
+ Hello world
+ by Yehuda Katz
+ This is my first post
+
+ Goodbye world
+ by Yehuda Katz
+ This is my last post
+ ```
+
+ In short, `yieldIn` creates a new top-level scope for the
+ provided template and renders it, making the original block
+ available to `{{yield}}` in that template.
+ */
+
+ function bindShadowScope(env /*, parentScope, shadowScope */) {
+ return env.hooks.createFreshScope();
+ }
+
+ function createChildScope(parent) {
+ var scope = Object.create(parent);
+ scope.locals = Object.create(parent.locals);
+ scope.localPresent = Object.create(parent.localPresent);
+ scope.blocks = Object.create(parent.blocks);
+ return scope;
+ }
+
+ /**
+ Host Hook: bindSelf
+
+ @param {Scope} scope
+ @param {any} self
+
+ Corresponds to entering a template.
+
+ This hook is invoked when the `self` value for a scope is ready to be bound.
+
+ The host must ensure that child scopes reflect the change to the `self` in
+ future calls to the `get` hook.
+ */
+
+ function bindSelf(env, scope, self) {
+ scope.self = self;
+ }
+
+ function updateSelf(env, scope, self) {
+ env.hooks.bindSelf(env, scope, self);
+ }
+
+ /**
+ Host Hook: bindLocal
+
+ @param {Environment} env
+ @param {Scope} scope
+ @param {String} name
+ @param {any} value
+
+ Corresponds to entering a template with block arguments.
+
+ This hook is invoked when a local variable for a scope has been provided.
+
+ The host must ensure that child scopes reflect the change in future calls
+ to the `get` hook.
+ */
+
+ function bindLocal(env, scope, name, value) {
+ scope.localPresent[name] = true;
+ scope.locals[name] = value;
+ }
+
+ function updateLocal(env, scope, name, value) {
+ env.hooks.bindLocal(env, scope, name, value);
+ }
+
+ /**
+ Host Hook: bindBlock
+
+ @param {Environment} env
+ @param {Scope} scope
+ @param {Function} block
+
+ Corresponds to entering a shadow template that was invoked by a block helper with
+ `yieldIn`.
+
+ This hook is invoked with an opaque block that will be passed along
+ to the shadow template, and inserted into the shadow template when
+ `{{yield}}` is used. Optionally provide a non-default block name
+ that can be targeted by `{{yield to=blockName}}`.
+ */
+
+ function bindBlock(env, scope, block) {
+ var name = arguments.length <= 3 || arguments[3] === undefined ? 'default' : arguments[3];
+
+ scope.blocks[name] = block;
+ }
+
+ /**
+ Host Hook: block
+
+ @param {RenderNode} renderNode
+ @param {Environment} env
+ @param {Scope} scope
+ @param {String} path
+ @param {Array} params
+ @param {Object} hash
+ @param {Block} block
+ @param {Block} elseBlock
+
+ Corresponds to:
+
+ ```hbs
+ {{#helper param1 param2 key1=val1 key2=val2}}
+ {{!-- child template --}}
+ {{/helper}}
+ ```
+
+ This host hook is a workhorse of the system. It is invoked
+ whenever a block is encountered, and is responsible for
+ resolving the helper to call, and then invoke it.
+
+ The helper should be invoked with:
+
+ - `{Array} params`: the parameters passed to the helper
+ in the template.
+ - `{Object} hash`: an object containing the keys and values passed
+ in the hash position in the template.
+
+ The values in `params` and `hash` will already be resolved
+ through a previous call to the `get` host hook.
+
+ The helper should be invoked with a `this` value that is
+ an object with one field:
+
+ `{Function} yield`: when invoked, this function executes the
+ block with the current scope. It takes an optional array of
+ block parameters. If block parameters are supplied, HTMLBars
+ will invoke the `bindLocal` host hook to bind the supplied
+ values to the block arguments provided by the template.
+
+ In general, the default implementation of `block` should work
+ for most host environments. It delegates to other host hooks
+ where appropriate, and properly invokes the helper with the
+ appropriate arguments.
+ */
+
+ function block(morph, env, scope, path, params, hash, template, inverse, visitor) {
+ if (handleRedirect(morph, env, scope, path, params, hash, template, inverse, visitor)) {
+ return;
+ }
+
+ continueBlock(morph, env, scope, path, params, hash, template, inverse, visitor);
+ }
+
+ function continueBlock(morph, env, scope, path, params, hash, template, inverse, visitor) {
+ hostBlock(morph, env, scope, template, inverse, null, visitor, function (options) {
+ var helper = env.hooks.lookupHelper(env, scope, path);
+ return env.hooks.invokeHelper(morph, env, scope, visitor, params, hash, helper, options.templates, thisFor(options.templates));
+ });
+ }
+
+ function hostBlock(morph, env, scope, template, inverse, shadowOptions, visitor, callback) {
+ var options = optionsFor(template, inverse, env, scope, morph, visitor);
+ _htmlbarsUtilTemplateUtils.renderAndCleanup(morph, env, options, shadowOptions, callback);
+ }
+
+ function handleRedirect(morph, env, scope, path, params, hash, template, inverse, visitor) {
+ if (!path) {
+ return false;
+ }
+
+ var redirect = env.hooks.classify(env, scope, path);
+ if (redirect) {
+ switch (redirect) {
+ case 'component':
+ env.hooks.component(morph, env, scope, path, params, hash, { default: template, inverse: inverse }, visitor);break;
+ case 'inline':
+ env.hooks.inline(morph, env, scope, path, params, hash, visitor);break;
+ case 'block':
+ env.hooks.block(morph, env, scope, path, params, hash, template, inverse, visitor);break;
+ default:
+ throw new Error("Internal HTMLBars redirection to " + redirect + " not supported");
+ }
+ return true;
+ }
+
+ if (handleKeyword(path, morph, env, scope, params, hash, template, inverse, visitor)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ function handleKeyword(path, morph, env, scope, params, hash, template, inverse, visitor) {
+ var keyword = env.hooks.keywords[path];
+ if (!keyword) {
+ return false;
+ }
+
+ if (typeof keyword === 'function') {
+ return keyword(morph, env, scope, params, hash, template, inverse, visitor);
+ }
+
+ if (keyword.willRender) {
+ keyword.willRender(morph, env);
+ }
+
+ var lastState, newState;
+ if (keyword.setupState) {
+ lastState = _htmlbarsUtilObjectUtils.shallowCopy(morph.getState());
+ newState = morph.setState(keyword.setupState(lastState, env, scope, params, hash));
+ }
+
+ if (keyword.childEnv) {
+ // Build the child environment...
+ env = keyword.childEnv(morph.getState(), env);
+
+ // ..then save off the child env builder on the render node. If the render
+ // node tree is re-rendered and this node is not dirty, the child env
+ // builder will still be invoked so that child dirty render nodes still get
+ // the correct child env.
+ morph.buildChildEnv = keyword.childEnv;
+ }
+
+ var firstTime = !morph.rendered;
+
+ if (keyword.isEmpty) {
+ var isEmpty = keyword.isEmpty(morph.getState(), env, scope, params, hash);
+
+ if (isEmpty) {
+ if (!firstTime) {
+ _htmlbarsUtilTemplateUtils.clearMorph(morph, env, false);
+ }
+ return true;
+ }
+ }
+
+ if (firstTime) {
+ if (keyword.render) {
+ keyword.render(morph, env, scope, params, hash, template, inverse, visitor);
+ }
+ morph.rendered = true;
+ return true;
+ }
+
+ var isStable;
+ if (keyword.isStable) {
+ isStable = keyword.isStable(lastState, newState);
+ } else {
+ isStable = stableState(lastState, newState);
+ }
+
+ if (isStable) {
+ if (keyword.rerender) {
+ var newEnv = keyword.rerender(morph, env, scope, params, hash, template, inverse, visitor);
+ env = newEnv || env;
+ }
+ _htmlbarsUtilMorphUtils.validateChildMorphs(env, morph, visitor);
+ return true;
+ } else {
+ _htmlbarsUtilTemplateUtils.clearMorph(morph, env, false);
+ }
+
+ // If the node is unstable, re-render from scratch
+ if (keyword.render) {
+ keyword.render(morph, env, scope, params, hash, template, inverse, visitor);
+ morph.rendered = true;
+ return true;
+ }
+ }
+
+ function stableState(oldState, newState) {
+ if (_htmlbarsUtilObjectUtils.keyLength(oldState) !== _htmlbarsUtilObjectUtils.keyLength(newState)) {
+ return false;
+ }
+
+ for (var prop in oldState) {
+ if (oldState[prop] !== newState[prop]) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ function linkRenderNode() /* morph, env, scope, params, hash */{
+ return;
+ }
+
+ /**
+ Host Hook: inline
+
+ @param {RenderNode} renderNode
+ @param {Environment} env
+ @param {Scope} scope
+ @param {String} path
+ @param {Array} params
+ @param {Hash} hash
+
+ Corresponds to:
+
+ ```hbs
+ {{helper param1 param2 key1=val1 key2=val2}}
+ ```
+
+ This host hook is similar to the `block` host hook, but it
+ invokes helpers that do not supply an attached block.
+
+ Like the `block` hook, the helper should be invoked with:
+
+ - `{Array} params`: the parameters passed to the helper
+ in the template.
+ - `{Object} hash`: an object containing the keys and values passed
+ in the hash position in the template.
+
+ The values in `params` and `hash` will already be resolved
+ through a previous call to the `get` host hook.
+
+ In general, the default implementation of `inline` should work
+ for most host environments. It delegates to other host hooks
+ where appropriate, and properly invokes the helper with the
+ appropriate arguments.
+
+ The default implementation of `inline` also makes `partial`
+ a keyword. Instead of invoking a helper named `partial`,
+ it invokes the `partial` host hook.
+ */
+
+ function inline(morph, env, scope, path, params, hash, visitor) {
+ if (handleRedirect(morph, env, scope, path, params, hash, null, null, visitor)) {
+ return;
+ }
+
+ var value = undefined,
+ hasValue = undefined;
+ if (morph.linkedResult) {
+ value = env.hooks.getValue(morph.linkedResult);
+ hasValue = true;
+ } else {
+ var options = optionsFor(null, null, env, scope, morph);
+
+ var helper = env.hooks.lookupHelper(env, scope, path);
+ var result = env.hooks.invokeHelper(morph, env, scope, visitor, params, hash, helper, options.templates, thisFor(options.templates));
+
+ if (result && result.link) {
+ morph.linkedResult = result.value;
+ _htmlbarsUtilMorphUtils.linkParams(env, scope, morph, '@content-helper', [morph.linkedResult], null);
+ }
+
+ if (result && 'value' in result) {
+ value = env.hooks.getValue(result.value);
+ hasValue = true;
+ }
+ }
+
+ if (hasValue) {
+ if (morph.lastValue !== value) {
+ morph.setContent(value);
+ }
+ morph.lastValue = value;
+ }
+ }
+
+ function keyword(path, morph, env, scope, params, hash, template, inverse, visitor) {
+ handleKeyword(path, morph, env, scope, params, hash, template, inverse, visitor);
+ }
+
+ function invokeHelper(morph, env, scope, visitor, _params, _hash, helper, templates, context) {
+ var params = normalizeArray(env, _params);
+ var hash = normalizeObject(env, _hash);
+ return { value: helper.call(context, params, hash, templates) };
+ }
+
+ function normalizeArray(env, array) {
+ var out = new Array(array.length);
+
+ for (var i = 0, l = array.length; i < l; i++) {
+ out[i] = env.hooks.getCellOrValue(array[i]);
+ }
+
+ return out;
+ }
+
+ function normalizeObject(env, object) {
+ var out = {};
+
+ for (var prop in object) {
+ out[prop] = env.hooks.getCellOrValue(object[prop]);
+ }
+
+ return out;
+ }
+
+ function classify() /* env, scope, path */{
+ return null;
+ }
+
+ var keywords = {
+ partial: function (morph, env, scope, params) {
+ var value = env.hooks.partial(morph, env, scope, params[0]);
+ morph.setContent(value);
+ return true;
+ },
+
+ // quoted since it's a reserved word, see issue #420
+ 'yield': function (morph, env, scope, params, hash, template, inverse, visitor) {
+ // the current scope is provided purely for the creation of shadow
+ // scopes; it should not be provided to user code.
+
+ var to = env.hooks.getValue(hash.to) || 'default';
+ var block = env.hooks.getBlock(scope, to);
+
+ if (block) {
+ block.invoke(env, params, hash.self, morph, scope, visitor);
+ }
+ return true;
+ },
+
+ hasBlock: function (morph, env, scope, params) {
+ var name = env.hooks.getValue(params[0]) || 'default';
+ return !!env.hooks.getBlock(scope, name);
+ },
+
+ hasBlockParams: function (morph, env, scope, params) {
+ var name = env.hooks.getValue(params[0]) || 'default';
+ var block = env.hooks.getBlock(scope, name);
+ return !!(block && block.arity);
+ }
+
+ };
+
+ exports.keywords = keywords;
+ /**
+ Host Hook: partial
+
+ @param {RenderNode} renderNode
+ @param {Environment} env
+ @param {Scope} scope
+ @param {String} path
+
+ Corresponds to:
+
+ ```hbs
+ {{partial "location"}}
+ ```
+
+ This host hook is invoked by the default implementation of
+ the `inline` hook. This makes `partial` a keyword in an
+ HTMLBars environment using the default `inline` host hook.
+
+ It is implemented as a host hook so that it can retrieve
+ the named partial out of the `Environment`. Helpers, in
+ contrast, only have access to the values passed in to them,
+ and not to the ambient lexical environment.
+
+ The host hook should invoke the referenced partial with
+ the ambient `self`.
+ */
+
+ function partial(renderNode, env, scope, path) {
+ var template = env.partials[path];
+ return template.render(scope.self, env, {}).fragment;
+ }
+
+ /**
+ Host hook: range
+
+ @param {RenderNode} renderNode
+ @param {Environment} env
+ @param {Scope} scope
+ @param {any} value
+
+ Corresponds to:
+
+ ```hbs
+ {{content}}
+ {{{unescaped}}}
+ ```
+
+ This hook is responsible for updating a render node
+ that represents a range of content with a value.
+ */
+
+ function range(morph, env, scope, path, value, visitor) {
+ if (handleRedirect(morph, env, scope, path, [], {}, null, null, visitor)) {
+ return;
+ }
+
+ value = env.hooks.getValue(value);
+
+ if (morph.lastValue !== value) {
+ morph.setContent(value);
+ }
+
+ morph.lastValue = value;
+ }
+
+ /**
+ Host hook: element
+
+ @param {RenderNode} renderNode
+ @param {Environment} env
+ @param {Scope} scope
+ @param {String} path
+ @param {Array} params
+ @param {Hash} hash
+
+ Corresponds to:
+
+ ```hbs
+
+ ```
+
+ This hook is responsible for invoking a helper that
+ modifies an element.
+
+ Its purpose is largely legacy support for awkward
+ idioms that became common when using the string-based
+ Handlebars engine.
+
+ Most of the uses of the `element` hook are expected
+ to be superseded by component syntax and the
+ `attribute` hook.
+ */
+
+ function element(morph, env, scope, path, params, hash, visitor) {
+ if (handleRedirect(morph, env, scope, path, params, hash, null, null, visitor)) {
+ return;
+ }
+
+ var helper = env.hooks.lookupHelper(env, scope, path);
+ if (helper) {
+ env.hooks.invokeHelper(null, env, scope, null, params, hash, helper, { element: morph.element });
+ }
+ }
+
+ /**
+ Host hook: attribute
+
+ @param {RenderNode} renderNode
+ @param {Environment} env
+ @param {String} name
+ @param {any} value
+
+ Corresponds to:
+
+ ```hbs
+
+ ```
+
+ This hook is responsible for updating a render node
+ that represents an element's attribute with a value.
+
+ It receives the name of the attribute as well as an
+ already-resolved value, and should update the render
+ node with the value if appropriate.
+ */
+
+ function attribute(morph, env, scope, name, value) {
+ value = env.hooks.getValue(value);
+
+ if (morph.lastValue !== value) {
+ morph.setContent(value);
+ }
+
+ morph.lastValue = value;
+ }
+
+ function subexpr(env, scope, helperName, params, hash) {
+ var helper = env.hooks.lookupHelper(env, scope, helperName);
+ var result = env.hooks.invokeHelper(null, env, scope, null, params, hash, helper, {});
+ if (result && 'value' in result) {
+ return env.hooks.getValue(result.value);
+ }
+ }
+
+ /**
+ Host Hook: get
+
+ @param {Environment} env
+ @param {Scope} scope
+ @param {String} path
+
+ Corresponds to:
+
+ ```hbs
+ {{foo.bar}}
+ ^
+
+ {{helper foo.bar key=value}}
+ ^ ^
+ ```
+
+ This hook is the "leaf" hook of the system. It is used to
+ resolve a path relative to the current scope.
+ */
+
+ function get(env, scope, path) {
+ if (path === '') {
+ return scope.self;
+ }
+
+ var keys = path.split('.');
+ var value = env.hooks.getRoot(scope, keys[0])[0];
+
+ for (var i = 1; i < keys.length; i++) {
+ if (value) {
+ value = env.hooks.getChild(value, keys[i]);
+ } else {
+ break;
+ }
+ }
+
+ return value;
+ }
+
+ function getRoot(scope, key) {
+ if (scope.localPresent[key]) {
+ return [scope.locals[key]];
+ } else if (scope.self) {
+ return [scope.self[key]];
+ } else {
+ return [undefined];
+ }
+ }
+
+ function getBlock(scope, key) {
+ return scope.blocks[key];
+ }
+
+ function getChild(value, key) {
+ return value[key];
+ }
+
+ function getValue(reference) {
+ return reference;
+ }
+
+ function getCellOrValue(reference) {
+ return reference;
+ }
+
+ function component(morph, env, scope, tagName, params, attrs, templates, visitor) {
+ if (env.hooks.hasHelper(env, scope, tagName)) {
+ return env.hooks.block(morph, env, scope, tagName, params, attrs, templates.default, templates.inverse, visitor);
+ }
+
+ componentFallback(morph, env, scope, tagName, attrs, templates.default);
+ }
+
+ function concat(env, params) {
+ var value = "";
+ for (var i = 0, l = params.length; i < l; i++) {
+ value += env.hooks.getValue(params[i]);
+ }
+ return value;
+ }
+
+ function componentFallback(morph, env, scope, tagName, attrs, template) {
+ var element = env.dom.createElement(tagName);
+ for (var name in attrs) {
+ element.setAttribute(name, env.hooks.getValue(attrs[name]));
+ }
+ var fragment = _htmlbarsRuntimeRender.default(template, env, scope, {}).fragment;
+ element.appendChild(fragment);
+ morph.setNode(element);
+ }
+
+ function hasHelper(env, scope, helperName) {
+ return env.helpers[helperName] !== undefined;
+ }
+
+ function lookupHelper(env, scope, helperName) {
+ return env.helpers[helperName];
+ }
+
+ function bindScope() /* env, scope */{
+ // this function is used to handle host-specified extensions to scope
+ // other than `self`, `locals` and `block`.
+ }
+
+ function updateScope(env, scope) {
+ env.hooks.bindScope(env, scope);
+ }
+
+ exports.default = {
+ // fundamental hooks that you will likely want to override
+ bindLocal: bindLocal,
+ bindSelf: bindSelf,
+ bindScope: bindScope,
+ classify: classify,
+ component: component,
+ concat: concat,
+ createFreshScope: createFreshScope,
+ getChild: getChild,
+ getRoot: getRoot,
+ getBlock: getBlock,
+ getValue: getValue,
+ getCellOrValue: getCellOrValue,
+ keywords: keywords,
+ linkRenderNode: linkRenderNode,
+ partial: partial,
+ subexpr: subexpr,
+
+ // fundamental hooks with good default behavior
+ bindBlock: bindBlock,
+ bindShadowScope: bindShadowScope,
+ updateLocal: updateLocal,
+ updateSelf: updateSelf,
+ updateScope: updateScope,
+ createChildScope: createChildScope,
+ hasHelper: hasHelper,
+ lookupHelper: lookupHelper,
+ invokeHelper: invokeHelper,
+ cleanupRenderNode: null,
+ destroyRenderNode: null,
+ willCleanupTree: null,
+ didCleanupTree: null,
+ willRenderNode: null,
+ didRenderNode: null,
+
+ // derived hooks
+ attribute: attribute,
+ block: block,
+ createScope: createScope,
+ element: element,
+ get: get,
+ inline: inline,
+ range: range,
+ keyword: keyword
+ };
+});
+enifed("htmlbars-runtime/morph", ["exports", "morph-range"], function (exports, _morphRange) {
+ "use strict";
+
+ var guid = 1;
+
+ function HTMLBarsMorph(domHelper, contextualElement) {
+ this.super$constructor(domHelper, contextualElement);
+
+ this._state = undefined;
+ this.ownerNode = null;
+ this.isDirty = false;
+ this.isSubtreeDirty = false;
+ this.lastYielded = null;
+ this.lastResult = null;
+ this.lastValue = null;
+ this.buildChildEnv = null;
+ this.morphList = null;
+ this.morphMap = null;
+ this.key = null;
+ this.linkedParams = null;
+ this.linkedResult = null;
+ this.childNodes = null;
+ this.rendered = false;
+ this.guid = "range" + guid++;
+ this.seen = false;
+ }
+
+ HTMLBarsMorph.empty = function (domHelper, contextualElement) {
+ var morph = new HTMLBarsMorph(domHelper, contextualElement);
+ morph.clear();
+ return morph;
+ };
+
+ HTMLBarsMorph.create = function (domHelper, contextualElement, node) {
+ var morph = new HTMLBarsMorph(domHelper, contextualElement);
+ morph.setNode(node);
+ return morph;
+ };
+
+ HTMLBarsMorph.attach = function (domHelper, contextualElement, firstNode, lastNode) {
+ var morph = new HTMLBarsMorph(domHelper, contextualElement);
+ morph.setRange(firstNode, lastNode);
+ return morph;
+ };
+
+ var prototype = HTMLBarsMorph.prototype = Object.create(_morphRange.default.prototype);
+ prototype.constructor = HTMLBarsMorph;
+ prototype.super$constructor = _morphRange.default;
+
+ prototype.getState = function () {
+ if (!this._state) {
+ this._state = {};
+ }
+
+ return this._state;
+ };
+
+ prototype.setState = function (newState) {
+ /*jshint -W093 */
+
+ return this._state = newState;
+ };
+
+ exports.default = HTMLBarsMorph;
+});
+enifed("htmlbars-runtime/node-visitor", ["exports", "htmlbars-util/morph-utils", "htmlbars-runtime/expression-visitor"], function (exports, _htmlbarsUtilMorphUtils, _htmlbarsRuntimeExpressionVisitor) {
+ "use strict";
+
+ /**
+ Node classification:
+
+ # Primary Statement Nodes:
+
+ These nodes are responsible for a render node that represents a morph-range.
+
+ * block
+ * inline
+ * content
+ * element
+ * component
+
+ # Leaf Statement Nodes:
+
+ This node is responsible for a render node that represents a morph-attr.
+
+ * attribute
+ */
+
+ function linkParamsAndHash(env, scope, morph, path, params, hash) {
+ if (morph.linkedParams) {
+ params = morph.linkedParams.params;
+ hash = morph.linkedParams.hash;
+ } else {
+ params = params && _htmlbarsRuntimeExpressionVisitor.acceptParams(params, env, scope);
+ hash = hash && _htmlbarsRuntimeExpressionVisitor.acceptHash(hash, env, scope);
+ }
+
+ _htmlbarsUtilMorphUtils.linkParams(env, scope, morph, path, params, hash);
+ return [params, hash];
+ }
+
+ var AlwaysDirtyVisitor = {
+
+ block: function (node, morph, env, scope, template, visitor) {
+ var path = node[1];
+ var params = node[2];
+ var hash = node[3];
+ var templateId = node[4];
+ var inverseId = node[5];
+
+ var paramsAndHash = linkParamsAndHash(env, scope, morph, path, params, hash);
+
+ morph.isDirty = morph.isSubtreeDirty = false;
+ env.hooks.block(morph, env, scope, path, paramsAndHash[0], paramsAndHash[1], templateId === null ? null : template.templates[templateId], inverseId === null ? null : template.templates[inverseId], visitor);
+ },
+
+ inline: function (node, morph, env, scope, visitor) {
+ var path = node[1];
+ var params = node[2];
+ var hash = node[3];
+
+ var paramsAndHash = linkParamsAndHash(env, scope, morph, path, params, hash);
+
+ morph.isDirty = morph.isSubtreeDirty = false;
+ env.hooks.inline(morph, env, scope, path, paramsAndHash[0], paramsAndHash[1], visitor);
+ },
+
+ content: function (node, morph, env, scope, visitor) {
+ var path = node[1];
+
+ morph.isDirty = morph.isSubtreeDirty = false;
+
+ if (isHelper(env, scope, path)) {
+ env.hooks.inline(morph, env, scope, path, [], {}, visitor);
+ if (morph.linkedResult) {
+ _htmlbarsUtilMorphUtils.linkParams(env, scope, morph, '@content-helper', [morph.linkedResult], null);
+ }
+ return;
+ }
+
+ var params = undefined;
+ if (morph.linkedParams) {
+ params = morph.linkedParams.params;
+ } else {
+ params = [env.hooks.get(env, scope, path)];
+ }
+
+ _htmlbarsUtilMorphUtils.linkParams(env, scope, morph, '@range', params, null);
+ env.hooks.range(morph, env, scope, path, params[0], visitor);
+ },
+
+ element: function (node, morph, env, scope, visitor) {
+ var path = node[1];
+ var params = node[2];
+ var hash = node[3];
+
+ var paramsAndHash = linkParamsAndHash(env, scope, morph, path, params, hash);
+
+ morph.isDirty = morph.isSubtreeDirty = false;
+ env.hooks.element(morph, env, scope, path, paramsAndHash[0], paramsAndHash[1], visitor);
+ },
+
+ attribute: function (node, morph, env, scope) {
+ var name = node[1];
+ var value = node[2];
+
+ var paramsAndHash = linkParamsAndHash(env, scope, morph, '@attribute', [value], null);
+
+ morph.isDirty = morph.isSubtreeDirty = false;
+ env.hooks.attribute(morph, env, scope, name, paramsAndHash[0][0]);
+ },
+
+ component: function (node, morph, env, scope, template, visitor) {
+ var path = node[1];
+ var attrs = node[2];
+ var templateId = node[3];
+ var inverseId = node[4];
+
+ var paramsAndHash = linkParamsAndHash(env, scope, morph, path, [], attrs);
+ var templates = {
+ default: template.templates[templateId],
+ inverse: template.templates[inverseId]
+ };
+
+ morph.isDirty = morph.isSubtreeDirty = false;
+ env.hooks.component(morph, env, scope, path, paramsAndHash[0], paramsAndHash[1], templates, visitor);
+ },
+
+ attributes: function (node, morph, env, scope, parentMorph, visitor) {
+ var template = node[1];
+
+ env.hooks.attributes(morph, env, scope, template, parentMorph, visitor);
+ }
+
+ };
+
+ exports.AlwaysDirtyVisitor = AlwaysDirtyVisitor;
+ exports.default = {
+ block: function (node, morph, env, scope, template, visitor) {
+ dirtyCheck(env, morph, visitor, function (visitor) {
+ AlwaysDirtyVisitor.block(node, morph, env, scope, template, visitor);
+ });
+ },
+
+ inline: function (node, morph, env, scope, visitor) {
+ dirtyCheck(env, morph, visitor, function (visitor) {
+ AlwaysDirtyVisitor.inline(node, morph, env, scope, visitor);
+ });
+ },
+
+ content: function (node, morph, env, scope, visitor) {
+ dirtyCheck(env, morph, visitor, function (visitor) {
+ AlwaysDirtyVisitor.content(node, morph, env, scope, visitor);
+ });
+ },
+
+ element: function (node, morph, env, scope, template, visitor) {
+ dirtyCheck(env, morph, visitor, function (visitor) {
+ AlwaysDirtyVisitor.element(node, morph, env, scope, template, visitor);
+ });
+ },
+
+ attribute: function (node, morph, env, scope, template) {
+ dirtyCheck(env, morph, null, function () {
+ AlwaysDirtyVisitor.attribute(node, morph, env, scope, template);
+ });
+ },
+
+ component: function (node, morph, env, scope, template, visitor) {
+ dirtyCheck(env, morph, visitor, function (visitor) {
+ AlwaysDirtyVisitor.component(node, morph, env, scope, template, visitor);
+ });
+ },
+
+ attributes: function (node, morph, env, scope, parentMorph, visitor) {
+ AlwaysDirtyVisitor.attributes(node, morph, env, scope, parentMorph, visitor);
+ }
+ };
+
+ function dirtyCheck(_env, morph, visitor, callback) {
+ var isDirty = morph.isDirty;
+ var isSubtreeDirty = morph.isSubtreeDirty;
+ var env = _env;
+
+ if (isSubtreeDirty) {
+ visitor = AlwaysDirtyVisitor;
+ }
+
+ if (isDirty || isSubtreeDirty) {
+ callback(visitor);
+ } else {
+ if (morph.buildChildEnv) {
+ env = morph.buildChildEnv(morph.getState(), env);
+ }
+ _htmlbarsUtilMorphUtils.validateChildMorphs(env, morph, visitor);
+ }
+ }
+
+ function isHelper(env, scope, path) {
+ return env.hooks.keywords[path] !== undefined || env.hooks.hasHelper(env, scope, path);
+ }
+});
+enifed("htmlbars-runtime/render", ["exports", "htmlbars-util/morph-utils", "htmlbars-runtime/node-visitor", "htmlbars-runtime/morph", "htmlbars-util/template-utils", "htmlbars-util/void-tag-names"], function (exports, _htmlbarsUtilMorphUtils, _htmlbarsRuntimeNodeVisitor, _htmlbarsRuntimeMorph, _htmlbarsUtilTemplateUtils, _htmlbarsUtilVoidTagNames) {
+ "use strict";
+
+ exports.default = render;
+ exports.RenderOptions = RenderOptions;
+ exports.manualElement = manualElement;
+ exports.attachAttributes = attachAttributes;
+ exports.createChildMorph = createChildMorph;
+ exports.getCachedFragment = getCachedFragment;
+
+ var svgNamespace = "http://www.w3.org/2000/svg";
+
+ function render(template, env, scope, options) {
+ var dom = env.dom;
+ var contextualElement;
+
+ if (options) {
+ if (options.renderNode) {
+ contextualElement = options.renderNode.contextualElement;
+ } else if (options.contextualElement) {
+ contextualElement = options.contextualElement;
+ }
+ }
+
+ dom.detectNamespace(contextualElement);
+
+ var renderResult = RenderResult.build(env, scope, template, options, contextualElement);
+ renderResult.render();
+
+ return renderResult;
+ }
+
+ function RenderOptions(renderNode, self, blockArguments, contextualElement) {
+ this.renderNode = renderNode || null;
+ this.self = self;
+ this.blockArguments = blockArguments || null;
+ this.contextualElement = contextualElement || null;
+ }
+
+ function RenderResult(env, scope, options, rootNode, ownerNode, nodes, fragment, template, shouldSetContent) {
+ this.root = rootNode;
+ this.fragment = fragment;
+
+ this.nodes = nodes;
+ this.template = template;
+ this.statements = template.statements.slice();
+ this.env = env;
+ this.scope = scope;
+ this.shouldSetContent = shouldSetContent;
+
+ if (options.self !== undefined) {
+ this.bindSelf(options.self);
+ }
+ if (options.blockArguments !== undefined) {
+ this.bindLocals(options.blockArguments);
+ }
+
+ this.initializeNodes(ownerNode);
+ }
+
+ RenderResult.build = function (env, scope, template, options, contextualElement) {
+ var dom = env.dom;
+ var fragment = getCachedFragment(template, env);
+ var nodes = template.buildRenderNodes(dom, fragment, contextualElement);
+
+ var rootNode, ownerNode, shouldSetContent;
+
+ if (options && options.renderNode) {
+ rootNode = options.renderNode;
+ ownerNode = rootNode.ownerNode;
+ shouldSetContent = true;
+ } else {
+ rootNode = dom.createMorph(null, fragment.firstChild, fragment.lastChild, contextualElement);
+ ownerNode = rootNode;
+ rootNode.ownerNode = ownerNode;
+ shouldSetContent = false;
+ }
+
+ if (rootNode.childNodes) {
+ _htmlbarsUtilMorphUtils.visitChildren(rootNode.childNodes, function (node) {
+ _htmlbarsUtilTemplateUtils.clearMorph(node, env, true);
+ });
+ }
+
+ rootNode.childNodes = nodes;
+ return new RenderResult(env, scope, options, rootNode, ownerNode, nodes, fragment, template, shouldSetContent);
+ };
+
+ function manualElement(tagName, attributes, _isEmpty) {
+ var statements = [];
+
+ for (var key in attributes) {
+ if (typeof attributes[key] === 'string') {
+ continue;
+ }
+ statements.push(["attribute", key, attributes[key]]);
+ }
+
+ var isEmpty = _isEmpty || _htmlbarsUtilVoidTagNames.default[tagName];
+
+ if (!isEmpty) {
+ statements.push(['content', 'yield']);
+ }
+
+ var template = {
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ if (tagName === 'svg') {
+ dom.setNamespace(svgNamespace);
+ }
+ var el1 = dom.createElement(tagName);
+
+ for (var key in attributes) {
+ if (typeof attributes[key] !== 'string') {
+ continue;
+ }
+ dom.setAttribute(el1, key, attributes[key]);
+ }
+
+ if (!isEmpty) {
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ }
+
+ dom.appendChild(el0, el1);
+
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment) {
+ var element = dom.childAt(fragment, [0]);
+ var morphs = [];
+
+ for (var key in attributes) {
+ if (typeof attributes[key] === 'string') {
+ continue;
+ }
+ morphs.push(dom.createAttrMorph(element, key));
+ }
+
+ if (!isEmpty) {
+ morphs.push(dom.createMorphAt(element, 0, 0));
+ }
+
+ return morphs;
+ },
+ statements: statements,
+ locals: [],
+ templates: []
+ };
+
+ return template;
+ }
+
+ function attachAttributes(attributes) {
+ var statements = [];
+
+ for (var key in attributes) {
+ if (typeof attributes[key] === 'string') {
+ continue;
+ }
+ statements.push(["attribute", key, attributes[key]]);
+ }
+
+ var template = {
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = this.element;
+ if (el0.namespaceURI === "http://www.w3.org/2000/svg") {
+ dom.setNamespace(svgNamespace);
+ }
+ for (var key in attributes) {
+ if (typeof attributes[key] !== 'string') {
+ continue;
+ }
+ dom.setAttribute(el0, key, attributes[key]);
+ }
+
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom) {
+ var element = this.element;
+ var morphs = [];
+
+ for (var key in attributes) {
+ if (typeof attributes[key] === 'string') {
+ continue;
+ }
+ morphs.push(dom.createAttrMorph(element, key));
+ }
+
+ return morphs;
+ },
+ statements: statements,
+ locals: [],
+ templates: [],
+ element: null
+ };
+
+ return template;
+ }
+
+ RenderResult.prototype.initializeNodes = function (ownerNode) {
+ var childNodes = this.root.childNodes;
+
+ for (var i = 0, l = childNodes.length; i < l; i++) {
+ childNodes[i].ownerNode = ownerNode;
+ }
+ };
+
+ RenderResult.prototype.render = function () {
+ this.root.lastResult = this;
+ this.root.rendered = true;
+ this.populateNodes(_htmlbarsRuntimeNodeVisitor.AlwaysDirtyVisitor);
+
+ if (this.shouldSetContent && this.root.setContent) {
+ this.root.setContent(this.fragment);
+ }
+ };
+
+ RenderResult.prototype.dirty = function () {
+ _htmlbarsUtilMorphUtils.visitChildren([this.root], function (node) {
+ node.isDirty = true;
+ });
+ };
+
+ RenderResult.prototype.revalidate = function (env, self, blockArguments, scope) {
+ this.revalidateWith(env, scope, self, blockArguments, _htmlbarsRuntimeNodeVisitor.default);
+ };
+
+ RenderResult.prototype.rerender = function (env, self, blockArguments, scope) {
+ this.revalidateWith(env, scope, self, blockArguments, _htmlbarsRuntimeNodeVisitor.AlwaysDirtyVisitor);
+ };
+
+ RenderResult.prototype.revalidateWith = function (env, scope, self, blockArguments, visitor) {
+ if (env !== undefined) {
+ this.env = env;
+ }
+ if (scope !== undefined) {
+ this.scope = scope;
+ }
+ this.updateScope();
+
+ if (self !== undefined) {
+ this.updateSelf(self);
+ }
+ if (blockArguments !== undefined) {
+ this.updateLocals(blockArguments);
+ }
+
+ this.populateNodes(visitor);
+ };
+
+ RenderResult.prototype.destroy = function () {
+ var rootNode = this.root;
+ _htmlbarsUtilTemplateUtils.clearMorph(rootNode, this.env, true);
+ };
+
+ RenderResult.prototype.populateNodes = function (visitor) {
+ var env = this.env;
+ var scope = this.scope;
+ var template = this.template;
+ var nodes = this.nodes;
+ var statements = this.statements;
+ var i, l;
+
+ for (i = 0, l = statements.length; i < l; i++) {
+ var statement = statements[i];
+ var morph = nodes[i];
+
+ if (env.hooks.willRenderNode) {
+ env.hooks.willRenderNode(morph, env, scope);
+ }
+
+ switch (statement[0]) {
+ case 'block':
+ visitor.block(statement, morph, env, scope, template, visitor);break;
+ case 'inline':
+ visitor.inline(statement, morph, env, scope, visitor);break;
+ case 'content':
+ visitor.content(statement, morph, env, scope, visitor);break;
+ case 'element':
+ visitor.element(statement, morph, env, scope, template, visitor);break;
+ case 'attribute':
+ visitor.attribute(statement, morph, env, scope);break;
+ case 'component':
+ visitor.component(statement, morph, env, scope, template, visitor);break;
+ }
+
+ if (env.hooks.didRenderNode) {
+ env.hooks.didRenderNode(morph, env, scope);
+ }
+ }
+ };
+
+ RenderResult.prototype.bindScope = function () {
+ this.env.hooks.bindScope(this.env, this.scope);
+ };
+
+ RenderResult.prototype.updateScope = function () {
+ this.env.hooks.updateScope(this.env, this.scope);
+ };
+
+ RenderResult.prototype.bindSelf = function (self) {
+ this.env.hooks.bindSelf(this.env, this.scope, self);
+ };
+
+ RenderResult.prototype.updateSelf = function (self) {
+ this.env.hooks.updateSelf(this.env, this.scope, self);
+ };
+
+ RenderResult.prototype.bindLocals = function (blockArguments) {
+ var localNames = this.template.locals;
+
+ for (var i = 0, l = localNames.length; i < l; i++) {
+ this.env.hooks.bindLocal(this.env, this.scope, localNames[i], blockArguments[i]);
+ }
+ };
+
+ RenderResult.prototype.updateLocals = function (blockArguments) {
+ var localNames = this.template.locals;
+
+ for (var i = 0, l = localNames.length; i < l; i++) {
+ this.env.hooks.updateLocal(this.env, this.scope, localNames[i], blockArguments[i]);
+ }
+ };
+
+ function initializeNode(node, owner) {
+ node.ownerNode = owner;
+ }
+
+ function createChildMorph(dom, parentMorph, contextualElement) {
+ var morph = _htmlbarsRuntimeMorph.default.empty(dom, contextualElement || parentMorph.contextualElement);
+ initializeNode(morph, parentMorph.ownerNode);
+ return morph;
+ }
+
+ function getCachedFragment(template, env) {
+ var dom = env.dom,
+ fragment;
+ if (env.useFragmentCache && dom.canClone) {
+ if (template.cachedFragment === null) {
+ fragment = template.buildFragment(dom);
+ if (template.hasRendered) {
+ template.cachedFragment = fragment;
+ } else {
+ template.hasRendered = true;
+ }
+ }
+ if (template.cachedFragment) {
+ fragment = dom.cloneNode(template.cachedFragment, true);
+ }
+ } else if (!fragment) {
+ fragment = template.buildFragment(dom);
+ }
+
+ return fragment;
+ }
+});
+enifed('htmlbars-runtime', ['exports', 'htmlbars-runtime/hooks', 'htmlbars-runtime/render', 'htmlbars-util/morph-utils', 'htmlbars-util/template-utils'], function (exports, _htmlbarsRuntimeHooks, _htmlbarsRuntimeRender, _htmlbarsUtilMorphUtils, _htmlbarsUtilTemplateUtils) {
+ 'use strict';
+
+ var internal = {
+ blockFor: _htmlbarsUtilTemplateUtils.blockFor,
+ manualElement: _htmlbarsRuntimeRender.manualElement,
+ hostBlock: _htmlbarsRuntimeHooks.hostBlock,
+ continueBlock: _htmlbarsRuntimeHooks.continueBlock,
+ hostYieldWithShadowTemplate: _htmlbarsRuntimeHooks.hostYieldWithShadowTemplate,
+ visitChildren: _htmlbarsUtilMorphUtils.visitChildren,
+ validateChildMorphs: _htmlbarsUtilMorphUtils.validateChildMorphs,
+ clearMorph: _htmlbarsUtilTemplateUtils.clearMorph
+ };
+
+ exports.hooks = _htmlbarsRuntimeHooks.default;
+ exports.render = _htmlbarsRuntimeRender.default;
+ exports.internal = internal;
+});
+enifed('htmlbars-util/array-utils', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.forEach = forEach;
+ exports.map = map;
+
+ function forEach(array, callback, binding) {
+ var i, l;
+ if (binding === undefined) {
+ for (i = 0, l = array.length; i < l; i++) {
+ callback(array[i], i, array);
+ }
+ } else {
+ for (i = 0, l = array.length; i < l; i++) {
+ callback.call(binding, array[i], i, array);
+ }
+ }
+ }
+
+ function map(array, callback) {
+ var output = [];
+ var i, l;
+
+ for (i = 0, l = array.length; i < l; i++) {
+ output.push(callback(array[i], i, array));
+ }
+
+ return output;
+ }
+
+ var getIdx;
+ if (Array.prototype.indexOf) {
+ getIdx = function (array, obj, from) {
+ return array.indexOf(obj, from);
+ };
+ } else {
+ getIdx = function (array, obj, from) {
+ if (from === undefined || from === null) {
+ from = 0;
+ } else if (from < 0) {
+ from = Math.max(0, array.length + from);
+ }
+ for (var i = from, l = array.length; i < l; i++) {
+ if (array[i] === obj) {
+ return i;
+ }
+ }
+ return -1;
+ };
+ }
+
+ var isArray = Array.isArray || function (array) {
+ return Object.prototype.toString.call(array) === '[object Array]';
+ };
+
+ exports.isArray = isArray;
+ var indexOfArray = getIdx;
+ exports.indexOfArray = indexOfArray;
+});
+enifed('htmlbars-util/handlebars/safe-string', ['exports'], function (exports) {
+ // Build out our basic SafeString type
+ 'use strict';
+
+ function SafeString(string) {
+ this.string = string;
+ }
+
+ SafeString.prototype.toString = SafeString.prototype.toHTML = function () {
+ return '' + this.string;
+ };
+
+ exports.default = SafeString;
+});
+enifed('htmlbars-util/handlebars/utils', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.extend = extend;
+ exports.indexOf = indexOf;
+ exports.escapeExpression = escapeExpression;
+ exports.isEmpty = isEmpty;
+ exports.blockParams = blockParams;
+ exports.appendContextPath = appendContextPath;
+ var escape = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": ''',
+ '`': '`'
+ };
+
+ var badChars = /[&<>"'`]/g,
+ possible = /[&<>"'`]/;
+
+ function escapeChar(chr) {
+ return escape[chr];
+ }
+
+ function extend(obj /* , ...source */) {
+ for (var i = 1; i < arguments.length; i++) {
+ for (var key in arguments[i]) {
+ if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {
+ obj[key] = arguments[i][key];
+ }
+ }
+ }
+
+ return obj;
+ }
+
+ var toString = Object.prototype.toString;
+
+ exports.toString = toString;
+ // Sourced from lodash
+ // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt
+ /*eslint-disable func-style, no-var */
+ var isFunction = function (value) {
+ return typeof value === 'function';
+ };
+ // fallback for older versions of Chrome and Safari
+ /* istanbul ignore next */
+ if (isFunction(/x/)) {
+ exports.isFunction = isFunction = function (value) {
+ return typeof value === 'function' && toString.call(value) === '[object Function]';
+ };
+ }
+ var isFunction;
+ exports.isFunction = isFunction;
+ /*eslint-enable func-style, no-var */
+
+ /* istanbul ignore next */
+ var isArray = Array.isArray || function (value) {
+ return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;
+ };
+
+ exports.isArray = isArray;
+ // Older IE versions do not directly support indexOf so we must implement our own, sadly.
+
+ function indexOf(array, value) {
+ for (var i = 0, len = array.length; i < len; i++) {
+ if (array[i] === value) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ function escapeExpression(string) {
+ if (typeof string !== 'string') {
+ // don't escape SafeStrings, since they're already safe
+ if (string && string.toHTML) {
+ return string.toHTML();
+ } else if (string == null) {
+ return '';
+ } else if (!string) {
+ return string + '';
+ }
+
+ // Force a string conversion as this will be done by the append regardless and
+ // the regex test will do this transparently behind the scenes, causing issues if
+ // an object's to string has escaped characters in it.
+ string = '' + string;
+ }
+
+ if (!possible.test(string)) {
+ return string;
+ }
+ return string.replace(badChars, escapeChar);
+ }
+
+ function isEmpty(value) {
+ if (!value && value !== 0) {
+ return true;
+ } else if (isArray(value) && value.length === 0) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ function blockParams(params, ids) {
+ params.path = ids;
+ return params;
+ }
+
+ function appendContextPath(contextPath, id) {
+ return (contextPath ? contextPath + '.' : '') + id;
+ }
+});
+enifed("htmlbars-util/morph-utils", ["exports"], function (exports) {
+ /*globals console*/
+
+ "use strict";
+
+ exports.visitChildren = visitChildren;
+ exports.validateChildMorphs = validateChildMorphs;
+ exports.linkParams = linkParams;
+ exports.dump = dump;
+
+ function visitChildren(nodes, callback) {
+ if (!nodes || nodes.length === 0) {
+ return;
+ }
+
+ nodes = nodes.slice();
+
+ while (nodes.length) {
+ var node = nodes.pop();
+ callback(node);
+
+ if (node.childNodes) {
+ nodes.push.apply(nodes, node.childNodes);
+ } else if (node.firstChildMorph) {
+ var current = node.firstChildMorph;
+
+ while (current) {
+ nodes.push(current);
+ current = current.nextMorph;
+ }
+ } else if (node.morphList) {
+ var current = node.morphList.firstChildMorph;
+
+ while (current) {
+ nodes.push(current);
+ current = current.nextMorph;
+ }
+ }
+ }
+ }
+
+ function validateChildMorphs(env, morph, visitor) {
+ var morphList = morph.morphList;
+ if (morph.morphList) {
+ var current = morphList.firstChildMorph;
+
+ while (current) {
+ var next = current.nextMorph;
+ validateChildMorphs(env, current, visitor);
+ current = next;
+ }
+ } else if (morph.lastResult) {
+ morph.lastResult.revalidateWith(env, undefined, undefined, undefined, visitor);
+ } else if (morph.childNodes) {
+ // This means that the childNodes were wired up manually
+ for (var i = 0, l = morph.childNodes.length; i < l; i++) {
+ validateChildMorphs(env, morph.childNodes[i], visitor);
+ }
+ }
+ }
+
+ function linkParams(env, scope, morph, path, params, hash) {
+ if (morph.linkedParams) {
+ return;
+ }
+
+ if (env.hooks.linkRenderNode(morph, env, scope, path, params, hash)) {
+ morph.linkedParams = { params: params, hash: hash };
+ }
+ }
+
+ function dump(node) {
+ console.group(node, node.isDirty);
+
+ if (node.childNodes) {
+ map(node.childNodes, dump);
+ } else if (node.firstChildMorph) {
+ var current = node.firstChildMorph;
+
+ while (current) {
+ dump(current);
+ current = current.nextMorph;
+ }
+ } else if (node.morphList) {
+ dump(node.morphList);
+ }
+
+ console.groupEnd();
+ }
+
+ function map(nodes, cb) {
+ for (var i = 0, l = nodes.length; i < l; i++) {
+ cb(nodes[i]);
+ }
+ }
+});
+enifed('htmlbars-util/namespaces', ['exports'], function (exports) {
+ // ref http://dev.w3.org/html5/spec-LC/namespaces.html
+ 'use strict';
+
+ exports.getAttrNamespace = getAttrNamespace;
+ var defaultNamespaces = {
+ html: 'http://www.w3.org/1999/xhtml',
+ mathml: 'http://www.w3.org/1998/Math/MathML',
+ svg: 'http://www.w3.org/2000/svg',
+ xlink: 'http://www.w3.org/1999/xlink',
+ xml: 'http://www.w3.org/XML/1998/namespace'
+ };
+
+ function getAttrNamespace(attrName, detectedNamespace) {
+ if (detectedNamespace) {
+ return detectedNamespace;
+ }
+
+ var namespace;
+
+ var colonIndex = attrName.indexOf(':');
+ if (colonIndex !== -1) {
+ var prefix = attrName.slice(0, colonIndex);
+ namespace = defaultNamespaces[prefix];
+ }
+
+ return namespace || null;
+ }
+});
+enifed("htmlbars-util/object-utils", ["exports"], function (exports) {
+ "use strict";
+
+ exports.merge = merge;
+ exports.shallowCopy = shallowCopy;
+ exports.keySet = keySet;
+ exports.keyLength = keyLength;
+
+ function merge(options, defaults) {
+ for (var prop in defaults) {
+ if (options.hasOwnProperty(prop)) {
+ continue;
+ }
+ options[prop] = defaults[prop];
+ }
+ return options;
+ }
+
+ function shallowCopy(obj) {
+ return merge({}, obj);
+ }
+
+ function keySet(obj) {
+ var set = {};
+
+ for (var prop in obj) {
+ if (obj.hasOwnProperty(prop)) {
+ set[prop] = true;
+ }
+ }
+
+ return set;
+ }
+
+ function keyLength(obj) {
+ var count = 0;
+
+ for (var prop in obj) {
+ if (obj.hasOwnProperty(prop)) {
+ count++;
+ }
+ }
+
+ return count;
+ }
+});
+enifed("htmlbars-util/quoting", ["exports"], function (exports) {
+ "use strict";
+
+ exports.hash = hash;
+ exports.repeat = repeat;
+ function escapeString(str) {
+ str = str.replace(/\\/g, "\\\\");
+ str = str.replace(/"/g, '\\"');
+ str = str.replace(/\n/g, "\\n");
+ return str;
+ }
+
+ exports.escapeString = escapeString;
+
+ function string(str) {
+ return '"' + escapeString(str) + '"';
+ }
+
+ exports.string = string;
+
+ function array(a) {
+ return "[" + a + "]";
+ }
+
+ exports.array = array;
+
+ function hash(pairs) {
+ return "{" + pairs.join(", ") + "}";
+ }
+
+ function repeat(chars, times) {
+ var str = "";
+ while (times--) {
+ str += chars;
+ }
+ return str;
+ }
+});
+enifed('htmlbars-util/safe-string', ['exports', 'htmlbars-util/handlebars/safe-string'], function (exports, _htmlbarsUtilHandlebarsSafeString) {
+ 'use strict';
+
+ exports.default = _htmlbarsUtilHandlebarsSafeString.default;
+});
+enifed("htmlbars-util/template-utils", ["exports", "htmlbars-util/morph-utils", "htmlbars-runtime/render"], function (exports, _htmlbarsUtilMorphUtils, _htmlbarsRuntimeRender) {
+ "use strict";
+
+ exports.RenderState = RenderState;
+ exports.blockFor = blockFor;
+ exports.renderAndCleanup = renderAndCleanup;
+ exports.clearMorph = clearMorph;
+ exports.clearMorphList = clearMorphList;
+
+ function RenderState(renderNode, morphList) {
+ // The morph list that is no longer needed and can be
+ // destroyed.
+ this.morphListToClear = morphList;
+
+ // The morph list that needs to be pruned of any items
+ // that were not yielded on a subsequent render.
+ this.morphListToPrune = null;
+
+ // A map of morphs for each item yielded in during this
+ // rendering pass. Any morphs in the DOM but not in this map
+ // will be pruned during cleanup.
+ this.handledMorphs = {};
+ this.collisions = undefined;
+
+ // The morph to clear once rendering is complete. By
+ // default, we set this to the previous morph (to catch
+ // the case where nothing is yielded; in that case, we
+ // should just clear the morph). Otherwise this gets set
+ // to null if anything is rendered.
+ this.morphToClear = renderNode;
+
+ this.shadowOptions = null;
+ }
+
+ function Block(render, template, blockOptions) {
+ this.render = render;
+ this.template = template;
+ this.blockOptions = blockOptions;
+ this.arity = template.arity;
+ }
+
+ Block.prototype.invoke = function (env, blockArguments, _self, renderNode, parentScope, visitor) {
+ if (renderNode.lastResult) {
+ renderNode.lastResult.revalidateWith(env, undefined, _self, blockArguments, visitor);
+ } else {
+ this._firstRender(env, blockArguments, _self, renderNode, parentScope);
+ }
+ };
+
+ Block.prototype._firstRender = function (env, blockArguments, _self, renderNode, parentScope) {
+ var options = { renderState: new RenderState(renderNode) };
+ var render = this.render;
+ var template = this.template;
+ var scope = this.blockOptions.scope;
+
+ var shadowScope = scope ? env.hooks.createChildScope(scope) : env.hooks.createFreshScope();
+
+ env.hooks.bindShadowScope(env, parentScope, shadowScope, this.blockOptions.options);
+
+ if (_self !== undefined) {
+ env.hooks.bindSelf(env, shadowScope, _self);
+ } else if (this.blockOptions.self !== undefined) {
+ env.hooks.bindSelf(env, shadowScope, this.blockOptions.self);
+ }
+
+ bindBlocks(env, shadowScope, this.blockOptions.yieldTo);
+
+ renderAndCleanup(renderNode, env, options, null, function () {
+ options.renderState.morphToClear = null;
+ var renderOptions = new _htmlbarsRuntimeRender.RenderOptions(renderNode, undefined, blockArguments);
+ render(template, env, shadowScope, renderOptions);
+ });
+ };
+
+ function blockFor(render, template, blockOptions) {
+ return new Block(render, template, blockOptions);
+ }
+
+ function bindBlocks(env, shadowScope, blocks) {
+ if (!blocks) {
+ return;
+ }
+ if (blocks instanceof Block) {
+ env.hooks.bindBlock(env, shadowScope, blocks);
+ } else {
+ for (var name in blocks) {
+ if (blocks.hasOwnProperty(name)) {
+ env.hooks.bindBlock(env, shadowScope, blocks[name], name);
+ }
+ }
+ }
+ }
+
+ function renderAndCleanup(morph, env, options, shadowOptions, callback) {
+ // The RenderState object is used to collect information about what the
+ // helper or hook being invoked has yielded. Once it has finished either
+ // yielding multiple items (via yieldItem) or a single template (via
+ // yieldTemplate), we detect what was rendered and how it differs from
+ // the previous render, cleaning up old state in DOM as appropriate.
+ var renderState = options.renderState;
+ renderState.collisions = undefined;
+ renderState.shadowOptions = shadowOptions;
+
+ // Invoke the callback, instructing it to save information about what it
+ // renders into RenderState.
+ var result = callback(options);
+
+ // The hook can opt-out of cleanup if it handled cleanup itself.
+ if (result && result.handled) {
+ return;
+ }
+
+ var morphMap = morph.morphMap;
+
+ // Walk the morph list, clearing any items that were yielded in a previous
+ // render but were not yielded during this render.
+ var morphList = renderState.morphListToPrune;
+ if (morphList) {
+ var handledMorphs = renderState.handledMorphs;
+ var item = morphList.firstChildMorph;
+
+ while (item) {
+ var next = item.nextMorph;
+
+ // If we don't see the key in handledMorphs, it wasn't
+ // yielded in and we can safely remove it from DOM.
+ if (!(item.key in handledMorphs)) {
+ morphMap[item.key] = undefined;
+ clearMorph(item, env, true);
+ item.destroy();
+ }
+
+ item = next;
+ }
+ }
+
+ morphList = renderState.morphListToClear;
+ if (morphList) {
+ clearMorphList(morphList, morph, env);
+ }
+
+ var toClear = renderState.morphToClear;
+ if (toClear) {
+ clearMorph(toClear, env);
+ }
+ }
+
+ function clearMorph(morph, env, destroySelf) {
+ var cleanup = env.hooks.cleanupRenderNode;
+ var destroy = env.hooks.destroyRenderNode;
+ var willCleanup = env.hooks.willCleanupTree;
+ var didCleanup = env.hooks.didCleanupTree;
+
+ function destroyNode(node) {
+ if (cleanup) {
+ cleanup(node);
+ }
+ if (destroy) {
+ destroy(node);
+ }
+ }
+
+ if (willCleanup) {
+ willCleanup(env, morph, destroySelf);
+ }
+ if (cleanup) {
+ cleanup(morph);
+ }
+ if (destroySelf && destroy) {
+ destroy(morph);
+ }
+
+ _htmlbarsUtilMorphUtils.visitChildren(morph.childNodes, destroyNode);
+
+ // TODO: Deal with logical children that are not in the DOM tree
+ morph.clear();
+ if (didCleanup) {
+ didCleanup(env, morph, destroySelf);
+ }
+
+ morph.lastResult = null;
+ morph.lastYielded = null;
+ morph.childNodes = null;
+ }
+
+ function clearMorphList(morphList, morph, env) {
+ var item = morphList.firstChildMorph;
+
+ while (item) {
+ var next = item.nextMorph;
+ morph.morphMap[item.key] = undefined;
+ clearMorph(item, env, true);
+ item.destroy();
+
+ item = next;
+ }
+
+ // Remove the MorphList from the morph.
+ morphList.clear();
+ morph.morphList = null;
+ }
+});
+enifed("htmlbars-util/void-tag-names", ["exports", "htmlbars-util/array-utils"], function (exports, _htmlbarsUtilArrayUtils) {
+ "use strict";
+
+ // The HTML elements in this list are speced by
+ // http://www.w3.org/TR/html-markup/syntax.html#syntax-elements,
+ // and will be forced to close regardless of if they have a
+ // self-closing /> at the end.
+ var voidTagNames = "area base br col command embed hr img input keygen link meta param source track wbr";
+ var voidMap = {};
+
+ _htmlbarsUtilArrayUtils.forEach(voidTagNames.split(" "), function (tagName) {
+ voidMap[tagName] = true;
+ });
+
+ exports.default = voidMap;
+});
+enifed('htmlbars-util', ['exports', 'htmlbars-util/safe-string', 'htmlbars-util/handlebars/utils', 'htmlbars-util/namespaces', 'htmlbars-util/morph-utils'], function (exports, _htmlbarsUtilSafeString, _htmlbarsUtilHandlebarsUtils, _htmlbarsUtilNamespaces, _htmlbarsUtilMorphUtils) {
+ 'use strict';
+
+ exports.SafeString = _htmlbarsUtilSafeString.default;
+ exports.escapeExpression = _htmlbarsUtilHandlebarsUtils.escapeExpression;
+ exports.getAttrNamespace = _htmlbarsUtilNamespaces.getAttrNamespace;
+ exports.validateChildMorphs = _htmlbarsUtilMorphUtils.validateChildMorphs;
+ exports.linkParams = _htmlbarsUtilMorphUtils.linkParams;
+ exports.dump = _htmlbarsUtilMorphUtils.dump;
+});
+enifed('morph-attr/sanitize-attribute-value', ['exports'], function (exports) {
+ /* jshint scripturl:true */
+
+ 'use strict';
+
+ exports.sanitizeAttributeValue = sanitizeAttributeValue;
+ var badProtocols = {
+ 'javascript:': true,
+ 'vbscript:': true
+ };
+
+ var badTags = {
+ 'A': true,
+ 'BODY': true,
+ 'LINK': true,
+ 'IMG': true,
+ 'IFRAME': true,
+ 'BASE': true,
+ 'FORM': true
+ };
+
+ var badTagsForDataURI = {
+ 'EMBED': true
+ };
+
+ var badAttributes = {
+ 'href': true,
+ 'src': true,
+ 'background': true,
+ 'action': true
+ };
+
+ exports.badAttributes = badAttributes;
+ var badAttributesForDataURI = {
+ 'src': true
+ };
+
+ function sanitizeAttributeValue(dom, element, attribute, value) {
+ var tagName;
+
+ if (!element) {
+ tagName = null;
+ } else {
+ tagName = element.tagName.toUpperCase();
+ }
+
+ if (value && value.toHTML) {
+ return value.toHTML();
+ }
+
+ if ((tagName === null || badTags[tagName]) && badAttributes[attribute]) {
+ var protocol = dom.protocolForURL(value);
+ if (badProtocols[protocol] === true) {
+ return 'unsafe:' + value;
+ }
+ }
+
+ if (badTagsForDataURI[tagName] && badAttributesForDataURI[attribute]) {
+ return 'unsafe:' + value;
+ }
+
+ return value;
+ }
+});
+enifed("morph-attr", ["exports", "morph-attr/sanitize-attribute-value", "dom-helper/prop", "dom-helper/build-html-dom", "htmlbars-util"], function (exports, _morphAttrSanitizeAttributeValue, _domHelperProp, _domHelperBuildHtmlDom, _htmlbarsUtil) {
+ "use strict";
+
+ function getProperty() {
+ return this.domHelper.getPropertyStrict(this.element, this.attrName);
+ }
+
+ function updateProperty(value) {
+ if (this._renderedInitially === true || !_domHelperProp.isAttrRemovalValue(value)) {
+ var element = this.element;
+ var attrName = this.attrName;
+
+ if (attrName === 'value' && element.tagName === 'INPUT' && element.value === value) {
+ // Do nothing. Attempts to avoid accidently changing the input cursor location.
+ // See https://github.com/tildeio/htmlbars/pull/447 for more details.
+ } else {
+ // do not render if initial value is undefined or null
+ this.domHelper.setPropertyStrict(element, attrName, value);
+ }
+ }
+
+ this._renderedInitially = true;
+ }
+
+ function getAttribute() {
+ return this.domHelper.getAttribute(this.element, this.attrName);
+ }
+
+ function updateAttribute(value) {
+ if (_domHelperProp.isAttrRemovalValue(value)) {
+ this.domHelper.removeAttribute(this.element, this.attrName);
+ } else {
+ this.domHelper.setAttribute(this.element, this.attrName, value);
+ }
+ }
+
+ function getAttributeNS() {
+ return this.domHelper.getAttributeNS(this.element, this.namespace, this.attrName);
+ }
+
+ function updateAttributeNS(value) {
+ if (_domHelperProp.isAttrRemovalValue(value)) {
+ this.domHelper.removeAttribute(this.element, this.attrName);
+ } else {
+ this.domHelper.setAttributeNS(this.element, this.namespace, this.attrName, value);
+ }
+ }
+
+ var UNSET = { unset: true };
+
+ var guid = 1;
+
+ AttrMorph.create = function (element, attrName, domHelper, namespace) {
+ var ns = _htmlbarsUtil.getAttrNamespace(attrName, namespace);
+
+ if (ns) {
+ return new AttributeNSAttrMorph(element, attrName, domHelper, ns);
+ } else {
+ return createNonNamespacedAttrMorph(element, attrName, domHelper);
+ }
+ };
+
+ function createNonNamespacedAttrMorph(element, attrName, domHelper) {
+ var _normalizeProperty = _domHelperProp.normalizeProperty(element, attrName);
+
+ var normalized = _normalizeProperty.normalized;
+ var type = _normalizeProperty.type;
+
+ if (element.namespaceURI === _domHelperBuildHtmlDom.svgNamespace || attrName === 'style' || type === 'attr') {
+ return new AttributeAttrMorph(element, normalized, domHelper);
+ } else {
+ return new PropertyAttrMorph(element, normalized, domHelper);
+ }
+ }
+
+ function AttrMorph(element, attrName, domHelper) {
+ this.element = element;
+ this.domHelper = domHelper;
+ this.attrName = attrName;
+ this._state = undefined;
+ this.isDirty = false;
+ this.isSubtreeDirty = false;
+ this.escaped = true;
+ this.lastValue = UNSET;
+ this.lastResult = null;
+ this.lastYielded = null;
+ this.childNodes = null;
+ this.linkedParams = null;
+ this.linkedResult = null;
+ this.guid = "attr" + guid++;
+ this.seen = false;
+ this.ownerNode = null;
+ this.rendered = false;
+ this._renderedInitially = false;
+ this.namespace = undefined;
+ this.didInit();
+ }
+
+ AttrMorph.prototype.getState = function () {
+ if (!this._state) {
+ this._state = {};
+ }
+
+ return this._state;
+ };
+
+ AttrMorph.prototype.setState = function (newState) {
+ /*jshint -W093 */
+
+ return this._state = newState;
+ };
+
+ AttrMorph.prototype.didInit = function () {};
+ AttrMorph.prototype.willSetContent = function () {};
+
+ AttrMorph.prototype.setContent = function (value) {
+ this.willSetContent(value);
+
+ if (this.lastValue === value) {
+ return;
+ }
+ this.lastValue = value;
+
+ if (this.escaped) {
+ var sanitized = _morphAttrSanitizeAttributeValue.sanitizeAttributeValue(this.domHelper, this.element, this.attrName, value);
+ this._update(sanitized, this.namespace);
+ } else {
+ this._update(value, this.namespace);
+ }
+ };
+
+ AttrMorph.prototype.getContent = function () {
+ var value = this.lastValue = this._get();
+ return value;
+ };
+
+ // renderAndCleanup calls `clear` on all items in the morph map
+ // just before calling `destroy` on the morph.
+ //
+ // As a future refactor this could be changed to set the property
+ // back to its original/default value.
+ AttrMorph.prototype.clear = function () {};
+
+ AttrMorph.prototype.destroy = function () {
+ this.element = null;
+ this.domHelper = null;
+ };
+
+ AttrMorph.prototype._$superAttrMorph = AttrMorph;
+
+ function PropertyAttrMorph(element, attrName, domHelper) {
+ this._$superAttrMorph(element, attrName, domHelper);
+ }
+
+ PropertyAttrMorph.prototype = Object.create(AttrMorph.prototype);
+ PropertyAttrMorph.prototype._update = updateProperty;
+ PropertyAttrMorph.prototype._get = getProperty;
+
+ function AttributeNSAttrMorph(element, attrName, domHelper, namespace) {
+ this._$superAttrMorph(element, attrName, domHelper);
+ this.namespace = namespace;
+ }
+
+ AttributeNSAttrMorph.prototype = Object.create(AttrMorph.prototype);
+ AttributeNSAttrMorph.prototype._update = updateAttributeNS;
+ AttributeNSAttrMorph.prototype._get = getAttributeNS;
+
+ function AttributeAttrMorph(element, attrName, domHelper) {
+ this._$superAttrMorph(element, attrName, domHelper);
+ }
+
+ AttributeAttrMorph.prototype = Object.create(AttrMorph.prototype);
+ AttributeAttrMorph.prototype._update = updateAttribute;
+ AttributeAttrMorph.prototype._get = getAttribute;
+
+ exports.default = AttrMorph;
+ exports.sanitizeAttributeValue = _morphAttrSanitizeAttributeValue.sanitizeAttributeValue;
+});
+enifed('morph-range/morph-list', ['exports', 'morph-range/utils'], function (exports, _morphRangeUtils) {
+ 'use strict';
+
+ function MorphList() {
+ // morph graph
+ this.firstChildMorph = null;
+ this.lastChildMorph = null;
+
+ this.mountedMorph = null;
+ }
+
+ var prototype = MorphList.prototype;
+
+ prototype.clear = function MorphList$clear() {
+ var current = this.firstChildMorph;
+
+ while (current) {
+ var next = current.nextMorph;
+ current.previousMorph = null;
+ current.nextMorph = null;
+ current.parentMorphList = null;
+ current = next;
+ }
+
+ this.firstChildMorph = this.lastChildMorph = null;
+ };
+
+ prototype.destroy = function MorphList$destroy() {};
+
+ prototype.appendMorph = function MorphList$appendMorph(morph) {
+ this.insertBeforeMorph(morph, null);
+ };
+
+ prototype.insertBeforeMorph = function MorphList$insertBeforeMorph(morph, referenceMorph) {
+ if (morph.parentMorphList !== null) {
+ morph.unlink();
+ }
+ if (referenceMorph && referenceMorph.parentMorphList !== this) {
+ throw new Error('The morph before which the new morph is to be inserted is not a child of this morph.');
+ }
+
+ var mountedMorph = this.mountedMorph;
+
+ if (mountedMorph) {
+
+ var parentNode = mountedMorph.firstNode.parentNode;
+ var referenceNode = referenceMorph ? referenceMorph.firstNode : mountedMorph.lastNode.nextSibling;
+
+ _morphRangeUtils.insertBefore(parentNode, morph.firstNode, morph.lastNode, referenceNode);
+
+ // was not in list mode replace current content
+ if (!this.firstChildMorph) {
+ _morphRangeUtils.clear(this.mountedMorph.firstNode.parentNode, this.mountedMorph.firstNode, this.mountedMorph.lastNode);
+ }
+ }
+
+ morph.parentMorphList = this;
+
+ var previousMorph = referenceMorph ? referenceMorph.previousMorph : this.lastChildMorph;
+ if (previousMorph) {
+ previousMorph.nextMorph = morph;
+ morph.previousMorph = previousMorph;
+ } else {
+ this.firstChildMorph = morph;
+ }
+
+ if (referenceMorph) {
+ referenceMorph.previousMorph = morph;
+ morph.nextMorph = referenceMorph;
+ } else {
+ this.lastChildMorph = morph;
+ }
+
+ this.firstChildMorph._syncFirstNode();
+ this.lastChildMorph._syncLastNode();
+ };
+
+ prototype.removeChildMorph = function MorphList$removeChildMorph(morph) {
+ if (morph.parentMorphList !== this) {
+ throw new Error("Cannot remove a morph from a parent it is not inside of");
+ }
+
+ morph.destroy();
+ };
+
+ exports.default = MorphList;
+});
+enifed('morph-range/morph-list.umd', ['exports', 'morph-range/morph-list'], function (exports, _morphRangeMorphList) {
+ 'use strict';
+
+ (function (root, factory) {
+ if (typeof define === 'function' && define.amd) {
+ define([], factory);
+ } else if (typeof exports === 'object') {
+ module.exports = factory();
+ } else {
+ root.MorphList = factory();
+ }
+ })(undefined, function () {
+ return _morphRangeMorphList.default;
+ });
+});
+enifed("morph-range/utils", ["exports"], function (exports) {
+ // inclusive of both nodes
+ "use strict";
+
+ exports.clear = clear;
+ exports.insertBefore = insertBefore;
+
+ function clear(parentNode, firstNode, lastNode) {
+ if (!parentNode) {
+ return;
+ }
+
+ var node = firstNode;
+ var nextNode;
+ do {
+ nextNode = node.nextSibling;
+ parentNode.removeChild(node);
+ if (node === lastNode) {
+ break;
+ }
+ node = nextNode;
+ } while (node);
+ }
+
+ function insertBefore(parentNode, firstNode, lastNode, refNode) {
+ var node = firstNode;
+ var nextNode;
+ do {
+ nextNode = node.nextSibling;
+ parentNode.insertBefore(node, refNode);
+ if (node === lastNode) {
+ break;
+ }
+ node = nextNode;
+ } while (node);
+ }
+});
+enifed('morph-range', ['exports', 'morph-range/utils'], function (exports, _morphRangeUtils) {
+ 'use strict';
+
+ // constructor just initializes the fields
+ // use one of the static initializers to create a valid morph.
+ function Morph(domHelper, contextualElement) {
+ this.domHelper = domHelper;
+ // context if content if current content is detached
+ this.contextualElement = contextualElement;
+ // inclusive range of morph
+ // these should be nodeType 1, 3, or 8
+ this.firstNode = null;
+ this.lastNode = null;
+
+ // flag to force text to setContent to be treated as html
+ this.parseTextAsHTML = false;
+
+ // morph list graph
+ this.parentMorphList = null;
+ this.previousMorph = null;
+ this.nextMorph = null;
+ }
+
+ Morph.empty = function (domHelper, contextualElement) {
+ var morph = new Morph(domHelper, contextualElement);
+ morph.clear();
+ return morph;
+ };
+
+ Morph.create = function (domHelper, contextualElement, node) {
+ var morph = new Morph(domHelper, contextualElement);
+ morph.setNode(node);
+ return morph;
+ };
+
+ Morph.attach = function (domHelper, contextualElement, firstNode, lastNode) {
+ var morph = new Morph(domHelper, contextualElement);
+ morph.setRange(firstNode, lastNode);
+ return morph;
+ };
+
+ Morph.prototype.setContent = function Morph$setContent(content) {
+ if (content === null || content === undefined) {
+ return this.clear();
+ }
+
+ var type = typeof content;
+ switch (type) {
+ case 'string':
+ if (this.parseTextAsHTML) {
+ return this.domHelper.setMorphHTML(this, content);
+ }
+ return this.setText(content);
+ case 'object':
+ if (typeof content.nodeType === 'number') {
+ return this.setNode(content);
+ }
+ /* Handlebars.SafeString */
+ if (typeof content.toHTML === 'function') {
+ return this.setHTML(content.toHTML());
+ }
+ if (this.parseTextAsHTML) {
+ return this.setHTML(content.toString());
+ }
+ /* falls through */
+ case 'boolean':
+ case 'number':
+ return this.setText(content.toString());
+ case 'function':
+ raiseCannotBindToFunction(content);
+ default:
+ throw new TypeError('unsupported content');
+ }
+ };
+
+ function raiseCannotBindToFunction(content) {
+ var functionName = content.name;
+ var message;
+
+ if (functionName) {
+ message = 'Unsupported Content: Cannot bind to function `' + functionName + '`';
+ } else {
+ message = 'Unsupported Content: Cannot bind to function';
+ }
+
+ throw new TypeError(message);
+ }
+
+ Morph.prototype.clear = function Morph$clear() {
+ var node = this.setNode(this.domHelper.createComment(''));
+ return node;
+ };
+
+ Morph.prototype.setText = function Morph$setText(text) {
+ var firstNode = this.firstNode;
+ var lastNode = this.lastNode;
+
+ if (firstNode && lastNode === firstNode && firstNode.nodeType === 3) {
+ firstNode.nodeValue = text;
+ return firstNode;
+ }
+
+ return this.setNode(text ? this.domHelper.createTextNode(text) : this.domHelper.createComment(''));
+ };
+
+ Morph.prototype.setNode = function Morph$setNode(newNode) {
+ var firstNode, lastNode;
+ switch (newNode.nodeType) {
+ case 3:
+ firstNode = newNode;
+ lastNode = newNode;
+ break;
+ case 11:
+ firstNode = newNode.firstChild;
+ lastNode = newNode.lastChild;
+ if (firstNode === null) {
+ firstNode = this.domHelper.createComment('');
+ newNode.appendChild(firstNode);
+ lastNode = firstNode;
+ }
+ break;
+ default:
+ firstNode = newNode;
+ lastNode = newNode;
+ break;
+ }
+
+ this.setRange(firstNode, lastNode);
+
+ return newNode;
+ };
+
+ Morph.prototype.setRange = function (firstNode, lastNode) {
+ var previousFirstNode = this.firstNode;
+ if (previousFirstNode !== null) {
+
+ var parentNode = previousFirstNode.parentNode;
+ if (parentNode !== null) {
+ _morphRangeUtils.insertBefore(parentNode, firstNode, lastNode, previousFirstNode);
+ _morphRangeUtils.clear(parentNode, previousFirstNode, this.lastNode);
+ }
+ }
+
+ this.firstNode = firstNode;
+ this.lastNode = lastNode;
+
+ if (this.parentMorphList) {
+ this._syncFirstNode();
+ this._syncLastNode();
+ }
+ };
+
+ Morph.prototype.destroy = function Morph$destroy() {
+ this.unlink();
+
+ var firstNode = this.firstNode;
+ var lastNode = this.lastNode;
+ var parentNode = firstNode && firstNode.parentNode;
+
+ this.firstNode = null;
+ this.lastNode = null;
+
+ _morphRangeUtils.clear(parentNode, firstNode, lastNode);
+ };
+
+ Morph.prototype.unlink = function Morph$unlink() {
+ var parentMorphList = this.parentMorphList;
+ var previousMorph = this.previousMorph;
+ var nextMorph = this.nextMorph;
+
+ if (previousMorph) {
+ if (nextMorph) {
+ previousMorph.nextMorph = nextMorph;
+ nextMorph.previousMorph = previousMorph;
+ } else {
+ previousMorph.nextMorph = null;
+ parentMorphList.lastChildMorph = previousMorph;
+ }
+ } else {
+ if (nextMorph) {
+ nextMorph.previousMorph = null;
+ parentMorphList.firstChildMorph = nextMorph;
+ } else if (parentMorphList) {
+ parentMorphList.lastChildMorph = parentMorphList.firstChildMorph = null;
+ }
+ }
+
+ this.parentMorphList = null;
+ this.nextMorph = null;
+ this.previousMorph = null;
+
+ if (parentMorphList && parentMorphList.mountedMorph) {
+ if (!parentMorphList.firstChildMorph) {
+ // list is empty
+ parentMorphList.mountedMorph.clear();
+ return;
+ } else {
+ parentMorphList.firstChildMorph._syncFirstNode();
+ parentMorphList.lastChildMorph._syncLastNode();
+ }
+ }
+ };
+
+ Morph.prototype.setHTML = function (text) {
+ var fragment = this.domHelper.parseHTML(text, this.contextualElement);
+ return this.setNode(fragment);
+ };
+
+ Morph.prototype.setMorphList = function Morph$appendMorphList(morphList) {
+ morphList.mountedMorph = this;
+ this.clear();
+
+ var originalFirstNode = this.firstNode;
+
+ if (morphList.firstChildMorph) {
+ this.firstNode = morphList.firstChildMorph.firstNode;
+ this.lastNode = morphList.lastChildMorph.lastNode;
+
+ var current = morphList.firstChildMorph;
+
+ while (current) {
+ var next = current.nextMorph;
+ current.insertBeforeNode(originalFirstNode, null);
+ current = next;
+ }
+ originalFirstNode.parentNode.removeChild(originalFirstNode);
+ }
+ };
+
+ Morph.prototype._syncFirstNode = function Morph$syncFirstNode() {
+ var morph = this;
+ var parentMorphList;
+ while (parentMorphList = morph.parentMorphList) {
+ if (parentMorphList.mountedMorph === null) {
+ break;
+ }
+ if (morph !== parentMorphList.firstChildMorph) {
+ break;
+ }
+ if (morph.firstNode === parentMorphList.mountedMorph.firstNode) {
+ break;
+ }
+
+ parentMorphList.mountedMorph.firstNode = morph.firstNode;
+
+ morph = parentMorphList.mountedMorph;
+ }
+ };
+
+ Morph.prototype._syncLastNode = function Morph$syncLastNode() {
+ var morph = this;
+ var parentMorphList;
+ while (parentMorphList = morph.parentMorphList) {
+ if (parentMorphList.mountedMorph === null) {
+ break;
+ }
+ if (morph !== parentMorphList.lastChildMorph) {
+ break;
+ }
+ if (morph.lastNode === parentMorphList.mountedMorph.lastNode) {
+ break;
+ }
+
+ parentMorphList.mountedMorph.lastNode = morph.lastNode;
+
+ morph = parentMorphList.mountedMorph;
+ }
+ };
+
+ Morph.prototype.insertBeforeNode = function Morph$insertBeforeNode(parentNode, refNode) {
+ _morphRangeUtils.insertBefore(parentNode, this.firstNode, this.lastNode, refNode);
+ };
+
+ Morph.prototype.appendToNode = function Morph$appendToNode(parentNode) {
+ _morphRangeUtils.insertBefore(parentNode, this.firstNode, this.lastNode, null);
+ };
+
+ exports.default = Morph;
+});
+enifed("route-recognizer/dsl", ["exports"], function (exports) {
+ "use strict";
+
+ function Target(path, matcher, delegate) {
+ this.path = path;
+ this.matcher = matcher;
+ this.delegate = delegate;
+ }
+
+ Target.prototype = {
+ to: function (target, callback) {
+ var delegate = this.delegate;
+
+ if (delegate && delegate.willAddRoute) {
+ target = delegate.willAddRoute(this.matcher.target, target);
+ }
+
+ this.matcher.add(this.path, target);
+
+ if (callback) {
+ if (callback.length === 0) {
+ throw new Error("You must have an argument in the function passed to `to`");
+ }
+ this.matcher.addChild(this.path, target, callback, this.delegate);
+ }
+ return this;
+ }
+ };
+
+ function Matcher(target) {
+ this.routes = {};
+ this.children = {};
+ this.target = target;
+ }
+
+ Matcher.prototype = {
+ add: function (path, handler) {
+ this.routes[path] = handler;
+ },
+
+ addChild: function (path, target, callback, delegate) {
+ var matcher = new Matcher(target);
+ this.children[path] = matcher;
+
+ var match = generateMatch(path, matcher, delegate);
+
+ if (delegate && delegate.contextEntered) {
+ delegate.contextEntered(target, match);
+ }
+
+ callback(match);
+ }
+ };
+
+ function generateMatch(startingPath, matcher, delegate) {
+ return function (path, nestedCallback) {
+ var fullPath = startingPath + path;
+
+ if (nestedCallback) {
+ nestedCallback(generateMatch(fullPath, matcher, delegate));
+ } else {
+ return new Target(startingPath + path, matcher, delegate);
+ }
+ };
+ }
+
+ function addRoute(routeArray, path, handler) {
+ var len = 0;
+ for (var i = 0, l = routeArray.length; i < l; i++) {
+ len += routeArray[i].path.length;
+ }
+
+ path = path.substr(len);
+ var route = { path: path, handler: handler };
+ routeArray.push(route);
+ }
+
+ function eachRoute(baseRoute, matcher, callback, binding) {
+ var routes = matcher.routes;
+
+ for (var path in routes) {
+ if (routes.hasOwnProperty(path)) {
+ var routeArray = baseRoute.slice();
+ addRoute(routeArray, path, routes[path]);
+
+ if (matcher.children[path]) {
+ eachRoute(routeArray, matcher.children[path], callback, binding);
+ } else {
+ callback.call(binding, routeArray);
+ }
+ }
+ }
+ }
+
+ exports.default = function (callback, addRouteCallback) {
+ var matcher = new Matcher();
+
+ callback(generateMatch("", matcher, this.delegate));
+
+ eachRoute([], matcher, function (route) {
+ if (addRouteCallback) {
+ addRouteCallback(this, route);
+ } else {
+ this.add(route);
+ }
+ }, this);
+ };
+});
+enifed('route-recognizer', ['exports', 'route-recognizer/dsl'], function (exports, _routeRecognizerDsl) {
+ 'use strict';
+
+ var specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'];
+
+ var escapeRegex = new RegExp('(\\' + specials.join('|\\') + ')', 'g');
+
+ function isArray(test) {
+ return Object.prototype.toString.call(test) === "[object Array]";
+ }
+
+ // A Segment represents a segment in the original route description.
+ // Each Segment type provides an `eachChar` and `regex` method.
+ //
+ // The `eachChar` method invokes the callback with one or more character
+ // specifications. A character specification consumes one or more input
+ // characters.
+ //
+ // The `regex` method returns a regex fragment for the segment. If the
+ // segment is a dynamic of star segment, the regex fragment also includes
+ // a capture.
+ //
+ // A character specification contains:
+ //
+ // * `validChars`: a String with a list of all valid characters, or
+ // * `invalidChars`: a String with a list of all invalid characters
+ // * `repeat`: true if the character specification can repeat
+
+ function StaticSegment(string) {
+ this.string = string;
+ }
+ StaticSegment.prototype = {
+ eachChar: function (callback) {
+ var string = this.string,
+ ch;
+
+ for (var i = 0, l = string.length; i < l; i++) {
+ ch = string.charAt(i);
+ callback({ validChars: ch });
+ }
+ },
+
+ regex: function () {
+ return this.string.replace(escapeRegex, '\\$1');
+ },
+
+ generate: function () {
+ return this.string;
+ }
+ };
+
+ function DynamicSegment(name) {
+ this.name = name;
+ }
+ DynamicSegment.prototype = {
+ eachChar: function (callback) {
+ callback({ invalidChars: "/", repeat: true });
+ },
+
+ regex: function () {
+ return "([^/]+)";
+ },
+
+ generate: function (params) {
+ return params[this.name];
+ }
+ };
+
+ function StarSegment(name) {
+ this.name = name;
+ }
+ StarSegment.prototype = {
+ eachChar: function (callback) {
+ callback({ invalidChars: "", repeat: true });
+ },
+
+ regex: function () {
+ return "(.+)";
+ },
+
+ generate: function (params) {
+ return params[this.name];
+ }
+ };
+
+ function EpsilonSegment() {}
+ EpsilonSegment.prototype = {
+ eachChar: function () {},
+ regex: function () {
+ return "";
+ },
+ generate: function () {
+ return "";
+ }
+ };
+
+ function parse(route, names, types) {
+ // normalize route as not starting with a "/". Recognition will
+ // also normalize.
+ if (route.charAt(0) === "/") {
+ route = route.substr(1);
+ }
+
+ var segments = route.split("/"),
+ results = [];
+
+ for (var i = 0, l = segments.length; i < l; i++) {
+ var segment = segments[i],
+ match;
+
+ if (match = segment.match(/^:([^\/]+)$/)) {
+ results.push(new DynamicSegment(match[1]));
+ names.push(match[1]);
+ types.dynamics++;
+ } else if (match = segment.match(/^\*([^\/]+)$/)) {
+ results.push(new StarSegment(match[1]));
+ names.push(match[1]);
+ types.stars++;
+ } else if (segment === "") {
+ results.push(new EpsilonSegment());
+ } else {
+ results.push(new StaticSegment(segment));
+ types.statics++;
+ }
+ }
+
+ return results;
+ }
+
+ // A State has a character specification and (`charSpec`) and a list of possible
+ // subsequent states (`nextStates`).
+ //
+ // If a State is an accepting state, it will also have several additional
+ // properties:
+ //
+ // * `regex`: A regular expression that is used to extract parameters from paths
+ // that reached this accepting state.
+ // * `handlers`: Information on how to convert the list of captures into calls
+ // to registered handlers with the specified parameters
+ // * `types`: How many static, dynamic or star segments in this route. Used to
+ // decide which route to use if multiple registered routes match a path.
+ //
+ // Currently, State is implemented naively by looping over `nextStates` and
+ // comparing a character specification against a character. A more efficient
+ // implementation would use a hash of keys pointing at one or more next states.
+
+ function State(charSpec) {
+ this.charSpec = charSpec;
+ this.nextStates = [];
+ }
+
+ State.prototype = {
+ get: function (charSpec) {
+ var nextStates = this.nextStates;
+
+ for (var i = 0, l = nextStates.length; i < l; i++) {
+ var child = nextStates[i];
+
+ var isEqual = child.charSpec.validChars === charSpec.validChars;
+ isEqual = isEqual && child.charSpec.invalidChars === charSpec.invalidChars;
+
+ if (isEqual) {
+ return child;
+ }
+ }
+ },
+
+ put: function (charSpec) {
+ var state;
+
+ // If the character specification already exists in a child of the current
+ // state, just return that state.
+ if (state = this.get(charSpec)) {
+ return state;
+ }
+
+ // Make a new state for the character spec
+ state = new State(charSpec);
+
+ // Insert the new state as a child of the current state
+ this.nextStates.push(state);
+
+ // If this character specification repeats, insert the new state as a child
+ // of itself. Note that this will not trigger an infinite loop because each
+ // transition during recognition consumes a character.
+ if (charSpec.repeat) {
+ state.nextStates.push(state);
+ }
+
+ // Return the new state
+ return state;
+ },
+
+ // Find a list of child states matching the next character
+ match: function (ch) {
+ // DEBUG "Processing `" + ch + "`:"
+ var nextStates = this.nextStates,
+ child,
+ charSpec,
+ chars;
+
+ // DEBUG " " + debugState(this)
+ var returned = [];
+
+ for (var i = 0, l = nextStates.length; i < l; i++) {
+ child = nextStates[i];
+
+ charSpec = child.charSpec;
+
+ if (typeof (chars = charSpec.validChars) !== 'undefined') {
+ if (chars.indexOf(ch) !== -1) {
+ returned.push(child);
+ }
+ } else if (typeof (chars = charSpec.invalidChars) !== 'undefined') {
+ if (chars.indexOf(ch) === -1) {
+ returned.push(child);
+ }
+ }
+ }
+
+ return returned;
+ }
+
+ /** IF DEBUG
+ , debug: function() {
+ var charSpec = this.charSpec,
+ debug = "[",
+ chars = charSpec.validChars || charSpec.invalidChars;
+ if (charSpec.invalidChars) { debug += "^"; }
+ debug += chars;
+ debug += "]";
+ if (charSpec.repeat) { debug += "+"; }
+ return debug;
+ }
+ END IF **/
+ };
+
+ /** IF DEBUG
+ function debug(log) {
+ console.log(log);
+ }
+
+ function debugState(state) {
+ return state.nextStates.map(function(n) {
+ if (n.nextStates.length === 0) { return "( " + n.debug() + " [accepting] )"; }
+ return "( " + n.debug() + " " + n.nextStates.map(function(s) { return s.debug() }).join(" or ") + " )";
+ }).join(", ")
+ }
+ END IF **/
+
+ // This is a somewhat naive strategy, but should work in a lot of cases
+ // A better strategy would properly resolve /posts/:id/new and /posts/edit/:id.
+ //
+ // This strategy generally prefers more static and less dynamic matching.
+ // Specifically, it
+ //
+ // * prefers fewer stars to more, then
+ // * prefers using stars for less of the match to more, then
+ // * prefers fewer dynamic segments to more, then
+ // * prefers more static segments to more
+ function sortSolutions(states) {
+ return states.sort(function (a, b) {
+ if (a.types.stars !== b.types.stars) {
+ return a.types.stars - b.types.stars;
+ }
+
+ if (a.types.stars) {
+ if (a.types.statics !== b.types.statics) {
+ return b.types.statics - a.types.statics;
+ }
+ if (a.types.dynamics !== b.types.dynamics) {
+ return b.types.dynamics - a.types.dynamics;
+ }
+ }
+
+ if (a.types.dynamics !== b.types.dynamics) {
+ return a.types.dynamics - b.types.dynamics;
+ }
+ if (a.types.statics !== b.types.statics) {
+ return b.types.statics - a.types.statics;
+ }
+
+ return 0;
+ });
+ }
+
+ function recognizeChar(states, ch) {
+ var nextStates = [];
+
+ for (var i = 0, l = states.length; i < l; i++) {
+ var state = states[i];
+
+ nextStates = nextStates.concat(state.match(ch));
+ }
+
+ return nextStates;
+ }
+
+ var oCreate = Object.create || function (proto) {
+ function F() {}
+ F.prototype = proto;
+ return new F();
+ };
+
+ function RecognizeResults(queryParams) {
+ this.queryParams = queryParams || {};
+ }
+ RecognizeResults.prototype = oCreate({
+ splice: Array.prototype.splice,
+ slice: Array.prototype.slice,
+ push: Array.prototype.push,
+ length: 0,
+ queryParams: null
+ });
+
+ function findHandler(state, path, queryParams) {
+ var handlers = state.handlers,
+ regex = state.regex;
+ var captures = path.match(regex),
+ currentCapture = 1;
+ var result = new RecognizeResults(queryParams);
+
+ for (var i = 0, l = handlers.length; i < l; i++) {
+ var handler = handlers[i],
+ names = handler.names,
+ params = {};
+
+ for (var j = 0, m = names.length; j < m; j++) {
+ params[names[j]] = captures[currentCapture++];
+ }
+
+ result.push({ handler: handler.handler, params: params, isDynamic: !!names.length });
+ }
+
+ return result;
+ }
+
+ function addSegment(currentState, segment) {
+ segment.eachChar(function (ch) {
+ var state;
+
+ currentState = currentState.put(ch);
+ });
+
+ return currentState;
+ }
+
+ function decodeQueryParamPart(part) {
+ // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
+ part = part.replace(/\+/gm, '%20');
+ return decodeURIComponent(part);
+ }
+
+ // The main interface
+
+ var RouteRecognizer = function () {
+ this.rootState = new State();
+ this.names = {};
+ };
+
+ RouteRecognizer.prototype = {
+ add: function (routes, options) {
+ var currentState = this.rootState,
+ regex = "^",
+ types = { statics: 0, dynamics: 0, stars: 0 },
+ handlers = [],
+ allSegments = [],
+ name;
+
+ var isEmpty = true;
+
+ for (var i = 0, l = routes.length; i < l; i++) {
+ var route = routes[i],
+ names = [];
+
+ var segments = parse(route.path, names, types);
+
+ allSegments = allSegments.concat(segments);
+
+ for (var j = 0, m = segments.length; j < m; j++) {
+ var segment = segments[j];
+
+ if (segment instanceof EpsilonSegment) {
+ continue;
+ }
+
+ isEmpty = false;
+
+ // Add a "/" for the new segment
+ currentState = currentState.put({ validChars: "/" });
+ regex += "/";
+
+ // Add a representation of the segment to the NFA and regex
+ currentState = addSegment(currentState, segment);
+ regex += segment.regex();
+ }
+
+ var handler = { handler: route.handler, names: names };
+ handlers.push(handler);
+ }
+
+ if (isEmpty) {
+ currentState = currentState.put({ validChars: "/" });
+ regex += "/";
+ }
+
+ currentState.handlers = handlers;
+ currentState.regex = new RegExp(regex + "$");
+ currentState.types = types;
+
+ if (name = options && options.as) {
+ this.names[name] = {
+ segments: allSegments,
+ handlers: handlers
+ };
+ }
+ },
+
+ handlersFor: function (name) {
+ var route = this.names[name],
+ result = [];
+ if (!route) {
+ throw new Error("There is no route named " + name);
+ }
+
+ for (var i = 0, l = route.handlers.length; i < l; i++) {
+ result.push(route.handlers[i]);
+ }
+
+ return result;
+ },
+
+ hasRoute: function (name) {
+ return !!this.names[name];
+ },
+
+ generate: function (name, params) {
+ var route = this.names[name],
+ output = "";
+ if (!route) {
+ throw new Error("There is no route named " + name);
+ }
+
+ var segments = route.segments;
+
+ for (var i = 0, l = segments.length; i < l; i++) {
+ var segment = segments[i];
+
+ if (segment instanceof EpsilonSegment) {
+ continue;
+ }
+
+ output += "/";
+ output += segment.generate(params);
+ }
+
+ if (output.charAt(0) !== '/') {
+ output = '/' + output;
+ }
+
+ if (params && params.queryParams) {
+ output += this.generateQueryString(params.queryParams, route.handlers);
+ }
+
+ return output;
+ },
+
+ generateQueryString: function (params, handlers) {
+ var pairs = [];
+ var keys = [];
+ for (var key in params) {
+ if (params.hasOwnProperty(key)) {
+ keys.push(key);
+ }
+ }
+ keys.sort();
+ for (var i = 0, len = keys.length; i < len; i++) {
+ key = keys[i];
+ var value = params[key];
+ if (value == null) {
+ continue;
+ }
+ var pair = encodeURIComponent(key);
+ if (isArray(value)) {
+ for (var j = 0, l = value.length; j < l; j++) {
+ var arrayPair = key + '[]' + '=' + encodeURIComponent(value[j]);
+ pairs.push(arrayPair);
+ }
+ } else {
+ pair += "=" + encodeURIComponent(value);
+ pairs.push(pair);
+ }
+ }
+
+ if (pairs.length === 0) {
+ return '';
+ }
+
+ return "?" + pairs.join("&");
+ },
+
+ parseQueryString: function (queryString) {
+ var pairs = queryString.split("&"),
+ queryParams = {};
+ for (var i = 0; i < pairs.length; i++) {
+ var pair = pairs[i].split('='),
+ key = decodeQueryParamPart(pair[0]),
+ keyLength = key.length,
+ isArray = false,
+ value;
+ if (pair.length === 1) {
+ value = 'true';
+ } else {
+ //Handle arrays
+ if (keyLength > 2 && key.slice(keyLength - 2) === '[]') {
+ isArray = true;
+ key = key.slice(0, keyLength - 2);
+ if (!queryParams[key]) {
+ queryParams[key] = [];
+ }
+ }
+ value = pair[1] ? decodeQueryParamPart(pair[1]) : '';
+ }
+ if (isArray) {
+ queryParams[key].push(value);
+ } else {
+ queryParams[key] = value;
+ }
+ }
+ return queryParams;
+ },
+
+ recognize: function (path) {
+ var states = [this.rootState],
+ pathLen,
+ i,
+ l,
+ queryStart,
+ queryParams = {},
+ isSlashDropped = false;
+
+ queryStart = path.indexOf('?');
+ if (queryStart !== -1) {
+ var queryString = path.substr(queryStart + 1, path.length);
+ path = path.substr(0, queryStart);
+ queryParams = this.parseQueryString(queryString);
+ }
+
+ path = decodeURI(path);
+
+ // DEBUG GROUP path
+
+ if (path.charAt(0) !== "/") {
+ path = "/" + path;
+ }
+
+ pathLen = path.length;
+ if (pathLen > 1 && path.charAt(pathLen - 1) === "/") {
+ path = path.substr(0, pathLen - 1);
+ isSlashDropped = true;
+ }
+
+ for (i = 0, l = path.length; i < l; i++) {
+ states = recognizeChar(states, path.charAt(i));
+ if (!states.length) {
+ break;
+ }
+ }
+
+ // END DEBUG GROUP
+
+ var solutions = [];
+ for (i = 0, l = states.length; i < l; i++) {
+ if (states[i].handlers) {
+ solutions.push(states[i]);
+ }
+ }
+
+ states = sortSolutions(solutions);
+
+ var state = solutions[0];
+
+ if (state && state.handlers) {
+ // if a trailing slash was dropped and a star segment is the last segment
+ // specified, put the trailing slash back
+ if (isSlashDropped && state.regex.source.slice(-5) === "(.+)$") {
+ path = path + "/";
+ }
+ return findHandler(state, path, queryParams);
+ }
+ }
+ };
+
+ RouteRecognizer.prototype.map = _routeRecognizerDsl.default;
+
+ RouteRecognizer.VERSION = '0.1.5';
+
+ exports.default = RouteRecognizer;
+});
+enifed('router/handler-info/factory', ['exports', 'router/handler-info/resolved-handler-info', 'router/handler-info/unresolved-handler-info-by-object', 'router/handler-info/unresolved-handler-info-by-param'], function (exports, _routerHandlerInfoResolvedHandlerInfo, _routerHandlerInfoUnresolvedHandlerInfoByObject, _routerHandlerInfoUnresolvedHandlerInfoByParam) {
+ 'use strict';
+
+ handlerInfoFactory.klasses = {
+ resolved: _routerHandlerInfoResolvedHandlerInfo.default,
+ param: _routerHandlerInfoUnresolvedHandlerInfoByParam.default,
+ object: _routerHandlerInfoUnresolvedHandlerInfoByObject.default
+ };
+
+ function handlerInfoFactory(name, props) {
+ var Ctor = handlerInfoFactory.klasses[name],
+ handlerInfo = new Ctor(props || {});
+ handlerInfo.factory = handlerInfoFactory;
+ return handlerInfo;
+ }
+
+ exports.default = handlerInfoFactory;
+});
+enifed('router/handler-info/resolved-handler-info', ['exports', 'router/handler-info', 'router/utils', 'rsvp/promise'], function (exports, _routerHandlerInfo, _routerUtils, _rsvpPromise) {
+ 'use strict';
+
+ var ResolvedHandlerInfo = _routerUtils.subclass(_routerHandlerInfo.default, {
+ resolve: function (shouldContinue, payload) {
+ // A ResolvedHandlerInfo just resolved with itself.
+ if (payload && payload.resolvedModels) {
+ payload.resolvedModels[this.name] = this.context;
+ }
+ return _rsvpPromise.default.resolve(this, this.promiseLabel("Resolve"));
+ },
+
+ getUnresolved: function () {
+ return this.factory('param', {
+ name: this.name,
+ handler: this.handler,
+ params: this.params
+ });
+ },
+
+ isResolved: true
+ });
+
+ exports.default = ResolvedHandlerInfo;
+});
+enifed('router/handler-info/unresolved-handler-info-by-object', ['exports', 'router/handler-info', 'router/utils', 'rsvp/promise'], function (exports, _routerHandlerInfo, _routerUtils, _rsvpPromise) {
+ 'use strict';
+
+ var UnresolvedHandlerInfoByObject = _routerUtils.subclass(_routerHandlerInfo.default, {
+ getModel: function (payload) {
+ this.log(payload, this.name + ": resolving provided model");
+ return _rsvpPromise.default.resolve(this.context);
+ },
+
+ initialize: function (props) {
+ this.names = props.names || [];
+ this.context = props.context;
+ },
+
+ /**
+ @private
+ Serializes a handler using its custom `serialize` method or
+ by a default that looks up the expected property name from
+ the dynamic segment.
+ @param {Object} model the model to be serialized for this handler
+ */
+ serialize: function (_model) {
+ var model = _model || this.context,
+ names = this.names,
+ handler = this.handler;
+
+ var object = {};
+ if (_routerUtils.isParam(model)) {
+ object[names[0]] = model;
+ return object;
+ }
+
+ // Use custom serialize if it exists.
+ if (handler.serialize) {
+ return handler.serialize(model, names);
+ }
+
+ if (names.length !== 1) {
+ return;
+ }
+
+ var name = names[0];
+
+ if (/_id$/.test(name)) {
+ object[name] = model.id;
+ } else {
+ object[name] = model;
+ }
+ return object;
+ }
+ });
+
+ exports.default = UnresolvedHandlerInfoByObject;
+});
+enifed('router/handler-info/unresolved-handler-info-by-param', ['exports', 'router/handler-info', 'router/utils'], function (exports, _routerHandlerInfo, _routerUtils) {
+ 'use strict';
+
+ // Generated by URL transitions and non-dynamic route segments in named Transitions.
+ var UnresolvedHandlerInfoByParam = _routerUtils.subclass(_routerHandlerInfo.default, {
+ initialize: function (props) {
+ this.params = props.params || {};
+ },
+
+ getModel: function (payload) {
+ var fullParams = this.params;
+ if (payload && payload.queryParams) {
+ fullParams = {};
+ _routerUtils.merge(fullParams, this.params);
+ fullParams.queryParams = payload.queryParams;
+ }
+
+ var handler = this.handler;
+ var hookName = _routerUtils.resolveHook(handler, 'deserialize') || _routerUtils.resolveHook(handler, 'model');
+
+ return this.runSharedModelHook(payload, hookName, [fullParams]);
+ }
+ });
+
+ exports.default = UnresolvedHandlerInfoByParam;
+});
+enifed('router/handler-info', ['exports', 'router/utils', 'rsvp/promise'], function (exports, _routerUtils, _rsvpPromise) {
+ 'use strict';
+
+ function HandlerInfo(_props) {
+ var props = _props || {};
+ _routerUtils.merge(this, props);
+ this.initialize(props);
+ }
+
+ HandlerInfo.prototype = {
+ name: null,
+ handler: null,
+ params: null,
+ context: null,
+
+ // Injected by the handler info factory.
+ factory: null,
+
+ initialize: function () {},
+
+ log: function (payload, message) {
+ if (payload.log) {
+ payload.log(this.name + ': ' + message);
+ }
+ },
+
+ promiseLabel: function (label) {
+ return _routerUtils.promiseLabel("'" + this.name + "' " + label);
+ },
+
+ getUnresolved: function () {
+ return this;
+ },
+
+ serialize: function () {
+ return this.params || {};
+ },
+
+ resolve: function (shouldContinue, payload) {
+ var checkForAbort = _routerUtils.bind(this, this.checkForAbort, shouldContinue),
+ beforeModel = _routerUtils.bind(this, this.runBeforeModelHook, payload),
+ model = _routerUtils.bind(this, this.getModel, payload),
+ afterModel = _routerUtils.bind(this, this.runAfterModelHook, payload),
+ becomeResolved = _routerUtils.bind(this, this.becomeResolved, payload);
+
+ return _rsvpPromise.default.resolve(undefined, this.promiseLabel("Start handler")).then(checkForAbort, null, this.promiseLabel("Check for abort")).then(beforeModel, null, this.promiseLabel("Before model")).then(checkForAbort, null, this.promiseLabel("Check if aborted during 'beforeModel' hook")).then(model, null, this.promiseLabel("Model")).then(checkForAbort, null, this.promiseLabel("Check if aborted in 'model' hook")).then(afterModel, null, this.promiseLabel("After model")).then(checkForAbort, null, this.promiseLabel("Check if aborted in 'afterModel' hook")).then(becomeResolved, null, this.promiseLabel("Become resolved"));
+ },
+
+ runBeforeModelHook: function (payload) {
+ if (payload.trigger) {
+ payload.trigger(true, 'willResolveModel', payload, this.handler);
+ }
+ return this.runSharedModelHook(payload, 'beforeModel', []);
+ },
+
+ runAfterModelHook: function (payload, resolvedModel) {
+ // Stash the resolved model on the payload.
+ // This makes it possible for users to swap out
+ // the resolved model in afterModel.
+ var name = this.name;
+ this.stashResolvedModel(payload, resolvedModel);
+
+ return this.runSharedModelHook(payload, 'afterModel', [resolvedModel]).then(function () {
+ // Ignore the fulfilled value returned from afterModel.
+ // Return the value stashed in resolvedModels, which
+ // might have been swapped out in afterModel.
+ return payload.resolvedModels[name];
+ }, null, this.promiseLabel("Ignore fulfillment value and return model value"));
+ },
+
+ runSharedModelHook: function (payload, hookName, args) {
+ this.log(payload, "calling " + hookName + " hook");
+
+ if (this.queryParams) {
+ args.push(this.queryParams);
+ }
+ args.push(payload);
+
+ var result = _routerUtils.applyHook(this.handler, hookName, args);
+
+ if (result && result.isTransition) {
+ result = null;
+ }
+
+ return _rsvpPromise.default.resolve(result, this.promiseLabel("Resolve value returned from one of the model hooks"));
+ },
+
+ // overridden by subclasses
+ getModel: null,
+
+ checkForAbort: function (shouldContinue, promiseValue) {
+ return _rsvpPromise.default.resolve(shouldContinue(), this.promiseLabel("Check for abort")).then(function () {
+ // We don't care about shouldContinue's resolve value;
+ // pass along the original value passed to this fn.
+ return promiseValue;
+ }, null, this.promiseLabel("Ignore fulfillment value and continue"));
+ },
+
+ stashResolvedModel: function (payload, resolvedModel) {
+ payload.resolvedModels = payload.resolvedModels || {};
+ payload.resolvedModels[this.name] = resolvedModel;
+ },
+
+ becomeResolved: function (payload, resolvedContext) {
+ var params = this.serialize(resolvedContext);
+
+ if (payload) {
+ this.stashResolvedModel(payload, resolvedContext);
+ payload.params = payload.params || {};
+ payload.params[this.name] = params;
+ }
+
+ return this.factory('resolved', {
+ context: resolvedContext,
+ name: this.name,
+ handler: this.handler,
+ params: params
+ });
+ },
+
+ shouldSupercede: function (other) {
+ // Prefer this newer handlerInfo over `other` if:
+ // 1) The other one doesn't exist
+ // 2) The names don't match
+ // 3) This handler has a context that doesn't match
+ // the other one (or the other one doesn't have one).
+ // 4) This handler has parameters that don't match the other.
+ if (!other) {
+ return true;
+ }
+
+ var contextsMatch = other.context === this.context;
+ return other.name !== this.name || this.hasOwnProperty('context') && !contextsMatch || this.hasOwnProperty('params') && !paramsMatch(this.params, other.params);
+ }
+ };
+
+ function paramsMatch(a, b) {
+ if (!a ^ !b) {
+ // Only one is null.
+ return false;
+ }
+
+ if (!a) {
+ // Both must be null.
+ return true;
+ }
+
+ // Note: this assumes that both params have the same
+ // number of keys, but since we're comparing the
+ // same handlers, they should.
+ for (var k in a) {
+ if (a.hasOwnProperty(k) && a[k] !== b[k]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ exports.default = HandlerInfo;
+});
+enifed('router/router', ['exports', 'route-recognizer', 'rsvp/promise', 'router/utils', 'router/transition-state', 'router/transition', 'router/transition-intent/named-transition-intent', 'router/transition-intent/url-transition-intent', 'router/handler-info'], function (exports, _routeRecognizer, _rsvpPromise, _routerUtils, _routerTransitionState, _routerTransition, _routerTransitionIntentNamedTransitionIntent, _routerTransitionIntentUrlTransitionIntent, _routerHandlerInfo) {
+ 'use strict';
+
+ var pop = Array.prototype.pop;
+
+ function Router(_options) {
+ var options = _options || {};
+ this.getHandler = options.getHandler || this.getHandler;
+ this.updateURL = options.updateURL || this.updateURL;
+ this.replaceURL = options.replaceURL || this.replaceURL;
+ this.didTransition = options.didTransition || this.didTransition;
+ this.willTransition = options.willTransition || this.willTransition;
+ this.delegate = options.delegate || this.delegate;
+ this.triggerEvent = options.triggerEvent || this.triggerEvent;
+ this.log = options.log || this.log;
+
+ this.recognizer = new _routeRecognizer.default();
+ this.reset();
+ }
+
+ function getTransitionByIntent(intent, isIntermediate) {
+ var wasTransitioning = !!this.activeTransition;
+ var oldState = wasTransitioning ? this.activeTransition.state : this.state;
+ var newTransition;
+
+ var newState = intent.applyToState(oldState, this.recognizer, this.getHandler, isIntermediate);
+ var queryParamChangelist = _routerUtils.getChangelist(oldState.queryParams, newState.queryParams);
+
+ if (handlerInfosEqual(newState.handlerInfos, oldState.handlerInfos)) {
+
+ // This is a no-op transition. See if query params changed.
+ if (queryParamChangelist) {
+ newTransition = this.queryParamsTransition(queryParamChangelist, wasTransitioning, oldState, newState);
+ if (newTransition) {
+ return newTransition;
+ }
+ }
+
+ // No-op. No need to create a new transition.
+ return this.activeTransition || new _routerTransition.Transition(this);
+ }
+
+ if (isIntermediate) {
+ setupContexts(this, newState);
+ return;
+ }
+
+ // Create a new transition to the destination route.
+ newTransition = new _routerTransition.Transition(this, intent, newState);
+
+ // Abort and usurp any previously active transition.
+ if (this.activeTransition) {
+ this.activeTransition.abort();
+ }
+ this.activeTransition = newTransition;
+
+ // Transition promises by default resolve with resolved state.
+ // For our purposes, swap out the promise to resolve
+ // after the transition has been finalized.
+ newTransition.promise = newTransition.promise.then(function (result) {
+ return finalizeTransition(newTransition, result.state);
+ }, null, _routerUtils.promiseLabel("Settle transition promise when transition is finalized"));
+
+ if (!wasTransitioning) {
+ notifyExistingHandlers(this, newState, newTransition);
+ }
+
+ fireQueryParamDidChange(this, newState, queryParamChangelist);
+
+ return newTransition;
+ }
+
+ Router.prototype = {
+
+ /**
+ The main entry point into the router. The API is essentially
+ the same as the `map` method in `route-recognizer`.
+ This method extracts the String handler at the last `.to()`
+ call and uses it as the name of the whole route.
+ @param {Function} callback
+ */
+ map: function (callback) {
+ this.recognizer.delegate = this.delegate;
+
+ this.recognizer.map(callback, function (recognizer, routes) {
+ for (var i = routes.length - 1, proceed = true; i >= 0 && proceed; --i) {
+ var route = routes[i];
+ recognizer.add(routes, { as: route.handler });
+ proceed = route.path === '/' || route.path === '' || route.handler.slice(-6) === '.index';
+ }
+ });
+ },
+
+ hasRoute: function (route) {
+ return this.recognizer.hasRoute(route);
+ },
+
+ getHandler: function () {},
+
+ queryParamsTransition: function (changelist, wasTransitioning, oldState, newState) {
+ var router = this;
+
+ fireQueryParamDidChange(this, newState, changelist);
+
+ if (!wasTransitioning && this.activeTransition) {
+ // One of the handlers in queryParamsDidChange
+ // caused a transition. Just return that transition.
+ return this.activeTransition;
+ } else {
+ // Running queryParamsDidChange didn't change anything.
+ // Just update query params and be on our way.
+
+ // We have to return a noop transition that will
+ // perform a URL update at the end. This gives
+ // the user the ability to set the url update
+ // method (default is replaceState).
+ var newTransition = new _routerTransition.Transition(this);
+ newTransition.queryParamsOnly = true;
+
+ oldState.queryParams = finalizeQueryParamChange(this, newState.handlerInfos, newState.queryParams, newTransition);
+
+ newTransition.promise = newTransition.promise.then(function (result) {
+ updateURL(newTransition, oldState, true);
+ if (router.didTransition) {
+ router.didTransition(router.currentHandlerInfos);
+ }
+ return result;
+ }, null, _routerUtils.promiseLabel("Transition complete"));
+ return newTransition;
+ }
+ },
+
+ // NOTE: this doesn't really belong here, but here
+ // it shall remain until our ES6 transpiler can
+ // handle cyclical deps.
+ transitionByIntent: function (intent, isIntermediate) {
+ try {
+ return getTransitionByIntent.apply(this, arguments);
+ } catch (e) {
+ return new _routerTransition.Transition(this, intent, null, e);
+ }
+ },
+
+ /**
+ Clears the current and target route handlers and triggers exit
+ on each of them starting at the leaf and traversing up through
+ its ancestors.
+ */
+ reset: function () {
+ if (this.state) {
+ _routerUtils.forEach(this.state.handlerInfos.slice().reverse(), function (handlerInfo) {
+ var handler = handlerInfo.handler;
+ _routerUtils.callHook(handler, 'exit');
+ });
+ }
+
+ this.state = new _routerTransitionState.default();
+ this.currentHandlerInfos = null;
+ },
+
+ activeTransition: null,
+
+ /**
+ var handler = handlerInfo.handler;
+ The entry point for handling a change to the URL (usually
+ via the back and forward button).
+ Returns an Array of handlers and the parameters associated
+ with those parameters.
+ @param {String} url a URL to process
+ @return {Array} an Array of `[handler, parameter]` tuples
+ */
+ handleURL: function (url) {
+ // Perform a URL-based transition, but don't change
+ // the URL afterward, since it already happened.
+ var args = _routerUtils.slice.call(arguments);
+ if (url.charAt(0) !== '/') {
+ args[0] = '/' + url;
+ }
+
+ return doTransition(this, args).method(null);
+ },
+
+ /**
+ Hook point for updating the URL.
+ @param {String} url a URL to update to
+ */
+ updateURL: function () {
+ throw new Error("updateURL is not implemented");
+ },
+
+ /**
+ Hook point for replacing the current URL, i.e. with replaceState
+ By default this behaves the same as `updateURL`
+ @param {String} url a URL to update to
+ */
+ replaceURL: function (url) {
+ this.updateURL(url);
+ },
+
+ /**
+ Transition into the specified named route.
+ If necessary, trigger the exit callback on any handlers
+ that are no longer represented by the target route.
+ @param {String} name the name of the route
+ */
+ transitionTo: function (name) {
+ return doTransition(this, arguments);
+ },
+
+ intermediateTransitionTo: function (name) {
+ return doTransition(this, arguments, true);
+ },
+
+ refresh: function (pivotHandler) {
+ var state = this.activeTransition ? this.activeTransition.state : this.state;
+ var handlerInfos = state.handlerInfos;
+ var params = {};
+ for (var i = 0, len = handlerInfos.length; i < len; ++i) {
+ var handlerInfo = handlerInfos[i];
+ params[handlerInfo.name] = handlerInfo.params || {};
+ }
+
+ _routerUtils.log(this, "Starting a refresh transition");
+ var intent = new _routerTransitionIntentNamedTransitionIntent.default({
+ name: handlerInfos[handlerInfos.length - 1].name,
+ pivotHandler: pivotHandler || handlerInfos[0].handler,
+ contexts: [], // TODO collect contexts...?
+ queryParams: this._changedQueryParams || state.queryParams || {}
+ });
+
+ return this.transitionByIntent(intent, false);
+ },
+
+ /**
+ Identical to `transitionTo` except that the current URL will be replaced
+ if possible.
+ This method is intended primarily for use with `replaceState`.
+ @param {String} name the name of the route
+ */
+ replaceWith: function (name) {
+ return doTransition(this, arguments).method('replace');
+ },
+
+ /**
+ Take a named route and context objects and generate a
+ URL.
+ @param {String} name the name of the route to generate
+ a URL for
+ @param {...Object} objects a list of objects to serialize
+ @return {String} a URL
+ */
+ generate: function (handlerName) {
+
+ var partitionedArgs = _routerUtils.extractQueryParams(_routerUtils.slice.call(arguments, 1)),
+ suppliedParams = partitionedArgs[0],
+ queryParams = partitionedArgs[1];
+
+ // Construct a TransitionIntent with the provided params
+ // and apply it to the present state of the router.
+ var intent = new _routerTransitionIntentNamedTransitionIntent.default({ name: handlerName, contexts: suppliedParams });
+ var state = intent.applyToState(this.state, this.recognizer, this.getHandler);
+ var params = {};
+
+ for (var i = 0, len = state.handlerInfos.length; i < len; ++i) {
+ var handlerInfo = state.handlerInfos[i];
+ var handlerParams = handlerInfo.serialize();
+ _routerUtils.merge(params, handlerParams);
+ }
+ params.queryParams = queryParams;
+
+ return this.recognizer.generate(handlerName, params);
+ },
+
+ applyIntent: function (handlerName, contexts) {
+ var intent = new _routerTransitionIntentNamedTransitionIntent.default({
+ name: handlerName,
+ contexts: contexts
+ });
+
+ var state = this.activeTransition && this.activeTransition.state || this.state;
+ return intent.applyToState(state, this.recognizer, this.getHandler);
+ },
+
+ isActiveIntent: function (handlerName, contexts, queryParams, _state) {
+ var state = _state || this.state,
+ targetHandlerInfos = state.handlerInfos,
+ found = false,
+ names,
+ object,
+ handlerInfo,
+ handlerObj,
+ i,
+ len;
+
+ if (!targetHandlerInfos.length) {
+ return false;
+ }
+
+ var targetHandler = targetHandlerInfos[targetHandlerInfos.length - 1].name;
+ var recogHandlers = this.recognizer.handlersFor(targetHandler);
+
+ var index = 0;
+ for (len = recogHandlers.length; index < len; ++index) {
+ handlerInfo = targetHandlerInfos[index];
+ if (handlerInfo.name === handlerName) {
+ break;
+ }
+ }
+
+ if (index === recogHandlers.length) {
+ // The provided route name isn't even in the route hierarchy.
+ return false;
+ }
+
+ var testState = new _routerTransitionState.default();
+ testState.handlerInfos = targetHandlerInfos.slice(0, index + 1);
+ recogHandlers = recogHandlers.slice(0, index + 1);
+
+ var intent = new _routerTransitionIntentNamedTransitionIntent.default({
+ name: targetHandler,
+ contexts: contexts
+ });
+
+ var newState = intent.applyToHandlers(testState, recogHandlers, this.getHandler, targetHandler, true, true);
+
+ var handlersEqual = handlerInfosEqual(newState.handlerInfos, testState.handlerInfos);
+ if (!queryParams || !handlersEqual) {
+ return handlersEqual;
+ }
+
+ // Get a hash of QPs that will still be active on new route
+ var activeQPsOnNewHandler = {};
+ _routerUtils.merge(activeQPsOnNewHandler, queryParams);
+
+ var activeQueryParams = state.queryParams;
+ for (var key in activeQueryParams) {
+ if (activeQueryParams.hasOwnProperty(key) && activeQPsOnNewHandler.hasOwnProperty(key)) {
+ activeQPsOnNewHandler[key] = activeQueryParams[key];
+ }
+ }
+
+ return handlersEqual && !_routerUtils.getChangelist(activeQPsOnNewHandler, queryParams);
+ },
+
+ isActive: function (handlerName) {
+ var partitionedArgs = _routerUtils.extractQueryParams(_routerUtils.slice.call(arguments, 1));
+ return this.isActiveIntent(handlerName, partitionedArgs[0], partitionedArgs[1]);
+ },
+
+ trigger: function (name) {
+ var args = _routerUtils.slice.call(arguments);
+ _routerUtils.trigger(this, this.currentHandlerInfos, false, args);
+ },
+
+ /**
+ Hook point for logging transition status updates.
+ @param {String} message The message to log.
+ */
+ log: null
+ };
+
+ /**
+ @private
+
+ Fires queryParamsDidChange event
+ */
+ function fireQueryParamDidChange(router, newState, queryParamChangelist) {
+ // If queryParams changed trigger event
+ if (queryParamChangelist) {
+
+ // This is a little hacky but we need some way of storing
+ // changed query params given that no activeTransition
+ // is guaranteed to have occurred.
+ router._changedQueryParams = queryParamChangelist.all;
+ _routerUtils.trigger(router, newState.handlerInfos, true, ['queryParamsDidChange', queryParamChangelist.changed, queryParamChangelist.all, queryParamChangelist.removed]);
+ router._changedQueryParams = null;
+ }
+ }
+
+ /**
+ @private
+
+ Takes an Array of `HandlerInfo`s, figures out which ones are
+ exiting, entering, or changing contexts, and calls the
+ proper handler hooks.
+
+ For example, consider the following tree of handlers. Each handler is
+ followed by the URL segment it handles.
+
+ ```
+ |~index ("/")
+ | |~posts ("/posts")
+ | | |-showPost ("/:id")
+ | | |-newPost ("/new")
+ | | |-editPost ("/edit")
+ | |~about ("/about/:id")
+ ```
+
+ Consider the following transitions:
+
+ 1. A URL transition to `/posts/1`.
+ 1. Triggers the `*model` callbacks on the
+ `index`, `posts`, and `showPost` handlers
+ 2. Triggers the `enter` callback on the same
+ 3. Triggers the `setup` callback on the same
+ 2. A direct transition to `newPost`
+ 1. Triggers the `exit` callback on `showPost`
+ 2. Triggers the `enter` callback on `newPost`
+ 3. Triggers the `setup` callback on `newPost`
+ 3. A direct transition to `about` with a specified
+ context object
+ 1. Triggers the `exit` callback on `newPost`
+ and `posts`
+ 2. Triggers the `serialize` callback on `about`
+ 3. Triggers the `enter` callback on `about`
+ 4. Triggers the `setup` callback on `about`
+
+ @param {Router} transition
+ @param {TransitionState} newState
+ */
+ function setupContexts(router, newState, transition) {
+ var partition = partitionHandlers(router.state, newState);
+ var i, l, handler;
+
+ for (i = 0, l = partition.exited.length; i < l; i++) {
+ handler = partition.exited[i].handler;
+ delete handler.context;
+
+ _routerUtils.callHook(handler, 'reset', true, transition);
+ _routerUtils.callHook(handler, 'exit', transition);
+ }
+
+ var oldState = router.oldState = router.state;
+ router.state = newState;
+ var currentHandlerInfos = router.currentHandlerInfos = partition.unchanged.slice();
+
+ try {
+ for (i = 0, l = partition.reset.length; i < l; i++) {
+ handler = partition.reset[i].handler;
+ _routerUtils.callHook(handler, 'reset', false, transition);
+ }
+
+ for (i = 0, l = partition.updatedContext.length; i < l; i++) {
+ handlerEnteredOrUpdated(currentHandlerInfos, partition.updatedContext[i], false, transition);
+ }
+
+ for (i = 0, l = partition.entered.length; i < l; i++) {
+ handlerEnteredOrUpdated(currentHandlerInfos, partition.entered[i], true, transition);
+ }
+ } catch (e) {
+ router.state = oldState;
+ router.currentHandlerInfos = oldState.handlerInfos;
+ throw e;
+ }
+
+ router.state.queryParams = finalizeQueryParamChange(router, currentHandlerInfos, newState.queryParams, transition);
+ }
+
+ /**
+ @private
+
+ Helper method used by setupContexts. Handles errors or redirects
+ that may happen in enter/setup.
+ */
+ function handlerEnteredOrUpdated(currentHandlerInfos, handlerInfo, enter, transition) {
+
+ var handler = handlerInfo.handler,
+ context = handlerInfo.context;
+
+ if (enter) {
+ _routerUtils.callHook(handler, 'enter', transition);
+ }
+ if (transition && transition.isAborted) {
+ throw new _routerTransition.TransitionAborted();
+ }
+
+ handler.context = context;
+ _routerUtils.callHook(handler, 'contextDidChange');
+
+ _routerUtils.callHook(handler, 'setup', context, transition);
+ if (transition && transition.isAborted) {
+ throw new _routerTransition.TransitionAborted();
+ }
+
+ currentHandlerInfos.push(handlerInfo);
+
+ return true;
+ }
+
+ /**
+ @private
+
+ This function is called when transitioning from one URL to
+ another to determine which handlers are no longer active,
+ which handlers are newly active, and which handlers remain
+ active but have their context changed.
+
+ Take a list of old handlers and new handlers and partition
+ them into four buckets:
+
+ * unchanged: the handler was active in both the old and
+ new URL, and its context remains the same
+ * updated context: the handler was active in both the
+ old and new URL, but its context changed. The handler's
+ `setup` method, if any, will be called with the new
+ context.
+ * exited: the handler was active in the old URL, but is
+ no longer active.
+ * entered: the handler was not active in the old URL, but
+ is now active.
+
+ The PartitionedHandlers structure has four fields:
+
+ * `updatedContext`: a list of `HandlerInfo` objects that
+ represent handlers that remain active but have a changed
+ context
+ * `entered`: a list of `HandlerInfo` objects that represent
+ handlers that are newly active
+ * `exited`: a list of `HandlerInfo` objects that are no
+ longer active.
+ * `unchanged`: a list of `HanderInfo` objects that remain active.
+
+ @param {Array[HandlerInfo]} oldHandlers a list of the handler
+ information for the previous URL (or `[]` if this is the
+ first handled transition)
+ @param {Array[HandlerInfo]} newHandlers a list of the handler
+ information for the new URL
+
+ @return {Partition}
+ */
+ function partitionHandlers(oldState, newState) {
+ var oldHandlers = oldState.handlerInfos;
+ var newHandlers = newState.handlerInfos;
+
+ var handlers = {
+ updatedContext: [],
+ exited: [],
+ entered: [],
+ unchanged: []
+ };
+
+ var handlerChanged,
+ contextChanged = false,
+ i,
+ l;
+
+ for (i = 0, l = newHandlers.length; i < l; i++) {
+ var oldHandler = oldHandlers[i],
+ newHandler = newHandlers[i];
+
+ if (!oldHandler || oldHandler.handler !== newHandler.handler) {
+ handlerChanged = true;
+ }
+
+ if (handlerChanged) {
+ handlers.entered.push(newHandler);
+ if (oldHandler) {
+ handlers.exited.unshift(oldHandler);
+ }
+ } else if (contextChanged || oldHandler.context !== newHandler.context) {
+ contextChanged = true;
+ handlers.updatedContext.push(newHandler);
+ } else {
+ handlers.unchanged.push(oldHandler);
+ }
+ }
+
+ for (i = newHandlers.length, l = oldHandlers.length; i < l; i++) {
+ handlers.exited.unshift(oldHandlers[i]);
+ }
+
+ handlers.reset = handlers.updatedContext.slice();
+ handlers.reset.reverse();
+
+ return handlers;
+ }
+
+ function updateURL(transition, state, inputUrl) {
+ var urlMethod = transition.urlMethod;
+
+ if (!urlMethod) {
+ return;
+ }
+
+ var router = transition.router,
+ handlerInfos = state.handlerInfos,
+ handlerName = handlerInfos[handlerInfos.length - 1].name,
+ params = {};
+
+ for (var i = handlerInfos.length - 1; i >= 0; --i) {
+ var handlerInfo = handlerInfos[i];
+ _routerUtils.merge(params, handlerInfo.params);
+ if (handlerInfo.handler.inaccessibleByURL) {
+ urlMethod = null;
+ }
+ }
+
+ if (urlMethod) {
+ params.queryParams = transition._visibleQueryParams || state.queryParams;
+ var url = router.recognizer.generate(handlerName, params);
+
+ if (urlMethod === 'replace') {
+ router.replaceURL(url);
+ } else {
+ router.updateURL(url);
+ }
+ }
+ }
+
+ /**
+ @private
+
+ Updates the URL (if necessary) and calls `setupContexts`
+ to update the router's array of `currentHandlerInfos`.
+ */
+ function finalizeTransition(transition, newState) {
+
+ try {
+ _routerUtils.log(transition.router, transition.sequence, "Resolved all models on destination route; finalizing transition.");
+
+ var router = transition.router,
+ handlerInfos = newState.handlerInfos,
+ seq = transition.sequence;
+
+ // Run all the necessary enter/setup/exit hooks
+ setupContexts(router, newState, transition);
+
+ // Check if a redirect occurred in enter/setup
+ if (transition.isAborted) {
+ // TODO: cleaner way? distinguish b/w targetHandlerInfos?
+ router.state.handlerInfos = router.currentHandlerInfos;
+ return _rsvpPromise.default.reject(_routerTransition.logAbort(transition));
+ }
+
+ updateURL(transition, newState, transition.intent.url);
+
+ transition.isActive = false;
+ router.activeTransition = null;
+
+ _routerUtils.trigger(router, router.currentHandlerInfos, true, ['didTransition']);
+
+ if (router.didTransition) {
+ router.didTransition(router.currentHandlerInfos);
+ }
+
+ _routerUtils.log(router, transition.sequence, "TRANSITION COMPLETE.");
+
+ // Resolve with the final handler.
+ return handlerInfos[handlerInfos.length - 1].handler;
+ } catch (e) {
+ if (!(e instanceof _routerTransition.TransitionAborted)) {
+ //var erroneousHandler = handlerInfos.pop();
+ var infos = transition.state.handlerInfos;
+ transition.trigger(true, 'error', e, transition, infos[infos.length - 1].handler);
+ transition.abort();
+ }
+
+ throw e;
+ }
+ }
+
+ /**
+ @private
+
+ Begins and returns a Transition based on the provided
+ arguments. Accepts arguments in the form of both URL
+ transitions and named transitions.
+
+ @param {Router} router
+ @param {Array[Object]} args arguments passed to transitionTo,
+ replaceWith, or handleURL
+ */
+ function doTransition(router, args, isIntermediate) {
+ // Normalize blank transitions to root URL transitions.
+ var name = args[0] || '/';
+
+ var lastArg = args[args.length - 1];
+ var queryParams = {};
+ if (lastArg && lastArg.hasOwnProperty('queryParams')) {
+ queryParams = pop.call(args).queryParams;
+ }
+
+ var intent;
+ if (args.length === 0) {
+
+ _routerUtils.log(router, "Updating query params");
+
+ // A query param update is really just a transition
+ // into the route you're already on.
+ var handlerInfos = router.state.handlerInfos;
+ intent = new _routerTransitionIntentNamedTransitionIntent.default({
+ name: handlerInfos[handlerInfos.length - 1].name,
+ contexts: [],
+ queryParams: queryParams
+ });
+ } else if (name.charAt(0) === '/') {
+
+ _routerUtils.log(router, "Attempting URL transition to " + name);
+ intent = new _routerTransitionIntentUrlTransitionIntent.default({ url: name });
+ } else {
+
+ _routerUtils.log(router, "Attempting transition to " + name);
+ intent = new _routerTransitionIntentNamedTransitionIntent.default({
+ name: args[0],
+ contexts: _routerUtils.slice.call(args, 1),
+ queryParams: queryParams
+ });
+ }
+
+ return router.transitionByIntent(intent, isIntermediate);
+ }
+
+ function handlerInfosEqual(handlerInfos, otherHandlerInfos) {
+ if (handlerInfos.length !== otherHandlerInfos.length) {
+ return false;
+ }
+
+ for (var i = 0, len = handlerInfos.length; i < len; ++i) {
+ if (handlerInfos[i] !== otherHandlerInfos[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function finalizeQueryParamChange(router, resolvedHandlers, newQueryParams, transition) {
+ // We fire a finalizeQueryParamChange event which
+ // gives the new route hierarchy a chance to tell
+ // us which query params it's consuming and what
+ // their final values are. If a query param is
+ // no longer consumed in the final route hierarchy,
+ // its serialized segment will be removed
+ // from the URL.
+
+ for (var k in newQueryParams) {
+ if (newQueryParams.hasOwnProperty(k) && newQueryParams[k] === null) {
+ delete newQueryParams[k];
+ }
+ }
+
+ var finalQueryParamsArray = [];
+ _routerUtils.trigger(router, resolvedHandlers, true, ['finalizeQueryParamChange', newQueryParams, finalQueryParamsArray, transition]);
+
+ if (transition) {
+ transition._visibleQueryParams = {};
+ }
+
+ var finalQueryParams = {};
+ for (var i = 0, len = finalQueryParamsArray.length; i < len; ++i) {
+ var qp = finalQueryParamsArray[i];
+ finalQueryParams[qp.key] = qp.value;
+ if (transition && qp.visible !== false) {
+ transition._visibleQueryParams[qp.key] = qp.value;
+ }
+ }
+ return finalQueryParams;
+ }
+
+ function notifyExistingHandlers(router, newState, newTransition) {
+ var oldHandlers = router.state.handlerInfos,
+ changing = [],
+ leavingIndex = null,
+ leaving,
+ leavingChecker,
+ i,
+ oldHandlerLen,
+ oldHandler,
+ newHandler;
+
+ oldHandlerLen = oldHandlers.length;
+ for (i = 0; i < oldHandlerLen; i++) {
+ oldHandler = oldHandlers[i];
+ newHandler = newState.handlerInfos[i];
+
+ if (!newHandler || oldHandler.name !== newHandler.name) {
+ leavingIndex = i;
+ break;
+ }
+
+ if (!newHandler.isResolved) {
+ changing.push(oldHandler);
+ }
+ }
+
+ if (leavingIndex !== null) {
+ leaving = oldHandlers.slice(leavingIndex, oldHandlerLen);
+ leavingChecker = function (name) {
+ for (var h = 0, len = leaving.length; h < len; h++) {
+ if (leaving[h].name === name) {
+ return true;
+ }
+ }
+ return false;
+ };
+ }
+
+ _routerUtils.trigger(router, oldHandlers, true, ['willTransition', newTransition]);
+
+ if (router.willTransition) {
+ router.willTransition(oldHandlers, newState.handlerInfos, newTransition);
+ }
+ }
+
+ exports.default = Router;
+});
+enifed('router/transition-intent/named-transition-intent', ['exports', 'router/transition-intent', 'router/transition-state', 'router/handler-info/factory', 'router/utils'], function (exports, _routerTransitionIntent, _routerTransitionState, _routerHandlerInfoFactory, _routerUtils) {
+ 'use strict';
+
+ exports.default = _routerUtils.subclass(_routerTransitionIntent.default, {
+ name: null,
+ pivotHandler: null,
+ contexts: null,
+ queryParams: null,
+
+ initialize: function (props) {
+ this.name = props.name;
+ this.pivotHandler = props.pivotHandler;
+ this.contexts = props.contexts || [];
+ this.queryParams = props.queryParams;
+ },
+
+ applyToState: function (oldState, recognizer, getHandler, isIntermediate) {
+
+ var partitionedArgs = _routerUtils.extractQueryParams([this.name].concat(this.contexts)),
+ pureArgs = partitionedArgs[0],
+ queryParams = partitionedArgs[1],
+ handlers = recognizer.handlersFor(pureArgs[0]);
+
+ var targetRouteName = handlers[handlers.length - 1].handler;
+
+ return this.applyToHandlers(oldState, handlers, getHandler, targetRouteName, isIntermediate);
+ },
+
+ applyToHandlers: function (oldState, handlers, getHandler, targetRouteName, isIntermediate, checkingIfActive) {
+
+ var i, len;
+ var newState = new _routerTransitionState.default();
+ var objects = this.contexts.slice(0);
+
+ var invalidateIndex = handlers.length;
+
+ // Pivot handlers are provided for refresh transitions
+ if (this.pivotHandler) {
+ for (i = 0, len = handlers.length; i < len; ++i) {
+ if (getHandler(handlers[i].handler) === this.pivotHandler) {
+ invalidateIndex = i;
+ break;
+ }
+ }
+ }
+
+ var pivotHandlerFound = !this.pivotHandler;
+
+ for (i = handlers.length - 1; i >= 0; --i) {
+ var result = handlers[i];
+ var name = result.handler;
+ var handler = getHandler(name);
+
+ var oldHandlerInfo = oldState.handlerInfos[i];
+ var newHandlerInfo = null;
+
+ if (result.names.length > 0) {
+ if (i >= invalidateIndex) {
+ newHandlerInfo = this.createParamHandlerInfo(name, handler, result.names, objects, oldHandlerInfo);
+ } else {
+ newHandlerInfo = this.getHandlerInfoForDynamicSegment(name, handler, result.names, objects, oldHandlerInfo, targetRouteName, i);
+ }
+ } else {
+ // This route has no dynamic segment.
+ // Therefore treat as a param-based handlerInfo
+ // with empty params. This will cause the `model`
+ // hook to be called with empty params, which is desirable.
+ newHandlerInfo = this.createParamHandlerInfo(name, handler, result.names, objects, oldHandlerInfo);
+ }
+
+ if (checkingIfActive) {
+ // If we're performing an isActive check, we want to
+ // serialize URL params with the provided context, but
+ // ignore mismatches between old and new context.
+ newHandlerInfo = newHandlerInfo.becomeResolved(null, newHandlerInfo.context);
+ var oldContext = oldHandlerInfo && oldHandlerInfo.context;
+ if (result.names.length > 0 && newHandlerInfo.context === oldContext) {
+ // If contexts match in isActive test, assume params also match.
+ // This allows for flexibility in not requiring that every last
+ // handler provide a `serialize` method
+ newHandlerInfo.params = oldHandlerInfo && oldHandlerInfo.params;
+ }
+ newHandlerInfo.context = oldContext;
+ }
+
+ var handlerToUse = oldHandlerInfo;
+ if (i >= invalidateIndex || newHandlerInfo.shouldSupercede(oldHandlerInfo)) {
+ invalidateIndex = Math.min(i, invalidateIndex);
+ handlerToUse = newHandlerInfo;
+ }
+
+ if (isIntermediate && !checkingIfActive) {
+ handlerToUse = handlerToUse.becomeResolved(null, handlerToUse.context);
+ }
+
+ newState.handlerInfos.unshift(handlerToUse);
+ }
+
+ if (objects.length > 0) {
+ throw new Error("More context objects were passed than there are dynamic segments for the route: " + targetRouteName);
+ }
+
+ if (!isIntermediate) {
+ this.invalidateChildren(newState.handlerInfos, invalidateIndex);
+ }
+
+ _routerUtils.merge(newState.queryParams, this.queryParams || {});
+
+ return newState;
+ },
+
+ invalidateChildren: function (handlerInfos, invalidateIndex) {
+ for (var i = invalidateIndex, l = handlerInfos.length; i < l; ++i) {
+ var handlerInfo = handlerInfos[i];
+ handlerInfos[i] = handlerInfos[i].getUnresolved();
+ }
+ },
+
+ getHandlerInfoForDynamicSegment: function (name, handler, names, objects, oldHandlerInfo, targetRouteName, i) {
+
+ var numNames = names.length;
+ var objectToUse;
+ if (objects.length > 0) {
+
+ // Use the objects provided for this transition.
+ objectToUse = objects[objects.length - 1];
+ if (_routerUtils.isParam(objectToUse)) {
+ return this.createParamHandlerInfo(name, handler, names, objects, oldHandlerInfo);
+ } else {
+ objects.pop();
+ }
+ } else if (oldHandlerInfo && oldHandlerInfo.name === name) {
+ // Reuse the matching oldHandlerInfo
+ return oldHandlerInfo;
+ } else {
+ if (this.preTransitionState) {
+ var preTransitionHandlerInfo = this.preTransitionState.handlerInfos[i];
+ objectToUse = preTransitionHandlerInfo && preTransitionHandlerInfo.context;
+ } else {
+ // Ideally we should throw this error to provide maximal
+ // information to the user that not enough context objects
+ // were provided, but this proves too cumbersome in Ember
+ // in cases where inner template helpers are evaluated
+ // before parent helpers un-render, in which cases this
+ // error somewhat prematurely fires.
+ //throw new Error("Not enough context objects were provided to complete a transition to " + targetRouteName + ". Specifically, the " + name + " route needs an object that can be serialized into its dynamic URL segments [" + names.join(', ') + "]");
+ return oldHandlerInfo;
+ }
+ }
+
+ return _routerHandlerInfoFactory.default('object', {
+ name: name,
+ handler: handler,
+ context: objectToUse,
+ names: names
+ });
+ },
+
+ createParamHandlerInfo: function (name, handler, names, objects, oldHandlerInfo) {
+ var params = {};
+
+ // Soak up all the provided string/numbers
+ var numNames = names.length;
+ while (numNames--) {
+
+ // Only use old params if the names match with the new handler
+ var oldParams = oldHandlerInfo && name === oldHandlerInfo.name && oldHandlerInfo.params || {};
+
+ var peek = objects[objects.length - 1];
+ var paramName = names[numNames];
+ if (_routerUtils.isParam(peek)) {
+ params[paramName] = "" + objects.pop();
+ } else {
+ // If we're here, this means only some of the params
+ // were string/number params, so try and use a param
+ // value from a previous handler.
+ if (oldParams.hasOwnProperty(paramName)) {
+ params[paramName] = oldParams[paramName];
+ } else {
+ throw new Error("You didn't provide enough string/numeric parameters to satisfy all of the dynamic segments for route " + name);
+ }
+ }
+ }
+
+ return _routerHandlerInfoFactory.default('param', {
+ name: name,
+ handler: handler,
+ params: params
+ });
+ }
+ });
+});
+enifed('router/transition-intent/url-transition-intent', ['exports', 'router/transition-intent', 'router/transition-state', 'router/handler-info/factory', 'router/utils', 'router/unrecognized-url-error'], function (exports, _routerTransitionIntent, _routerTransitionState, _routerHandlerInfoFactory, _routerUtils, _routerUnrecognizedUrlError) {
+ 'use strict';
+
+ exports.default = _routerUtils.subclass(_routerTransitionIntent.default, {
+ url: null,
+
+ initialize: function (props) {
+ this.url = props.url;
+ },
+
+ applyToState: function (oldState, recognizer, getHandler) {
+ var newState = new _routerTransitionState.default();
+
+ var results = recognizer.recognize(this.url),
+ queryParams = {},
+ i,
+ len;
+
+ if (!results) {
+ throw new _routerUnrecognizedUrlError.default(this.url);
+ }
+
+ var statesDiffer = false;
+
+ for (i = 0, len = results.length; i < len; ++i) {
+ var result = results[i];
+ var name = result.handler;
+ var handler = getHandler(name);
+
+ if (handler.inaccessibleByURL) {
+ throw new _routerUnrecognizedUrlError.default(this.url);
+ }
+
+ var newHandlerInfo = _routerHandlerInfoFactory.default('param', {
+ name: name,
+ handler: handler,
+ params: result.params
+ });
+
+ var oldHandlerInfo = oldState.handlerInfos[i];
+ if (statesDiffer || newHandlerInfo.shouldSupercede(oldHandlerInfo)) {
+ statesDiffer = true;
+ newState.handlerInfos[i] = newHandlerInfo;
+ } else {
+ newState.handlerInfos[i] = oldHandlerInfo;
+ }
+ }
+
+ _routerUtils.merge(newState.queryParams, results.queryParams);
+
+ return newState;
+ }
+ });
+});
+enifed('router/transition-intent', ['exports', 'router/utils'], function (exports, _routerUtils) {
+ 'use strict';
+
+ function TransitionIntent(props) {
+ this.initialize(props);
+
+ // TODO: wat
+ this.data = this.data || {};
+ }
+
+ TransitionIntent.prototype = {
+ initialize: null,
+ applyToState: null
+ };
+
+ exports.default = TransitionIntent;
+});
+enifed('router/transition-state', ['exports', 'router/handler-info', 'router/utils', 'rsvp/promise'], function (exports, _routerHandlerInfo, _routerUtils, _rsvpPromise) {
+ 'use strict';
+
+ function TransitionState(other) {
+ this.handlerInfos = [];
+ this.queryParams = {};
+ this.params = {};
+ }
+
+ TransitionState.prototype = {
+ handlerInfos: null,
+ queryParams: null,
+ params: null,
+
+ promiseLabel: function (label) {
+ var targetName = '';
+ _routerUtils.forEach(this.handlerInfos, function (handlerInfo) {
+ if (targetName !== '') {
+ targetName += '.';
+ }
+ targetName += handlerInfo.name;
+ });
+ return _routerUtils.promiseLabel("'" + targetName + "': " + label);
+ },
+
+ resolve: function (shouldContinue, payload) {
+ var self = this;
+ // First, calculate params for this state. This is useful
+ // information to provide to the various route hooks.
+ var params = this.params;
+ _routerUtils.forEach(this.handlerInfos, function (handlerInfo) {
+ params[handlerInfo.name] = handlerInfo.params || {};
+ });
+
+ payload = payload || {};
+ payload.resolveIndex = 0;
+
+ var currentState = this;
+ var wasAborted = false;
+
+ // The prelude RSVP.resolve() asyncs us into the promise land.
+ return _rsvpPromise.default.resolve(null, this.promiseLabel("Start transition")).then(resolveOneHandlerInfo, null, this.promiseLabel('Resolve handler'))['catch'](handleError, this.promiseLabel('Handle error'));
+
+ function innerShouldContinue() {
+ return _rsvpPromise.default.resolve(shouldContinue(), currentState.promiseLabel("Check if should continue"))['catch'](function (reason) {
+ // We distinguish between errors that occurred
+ // during resolution (e.g. beforeModel/model/afterModel),
+ // and aborts due to a rejecting promise from shouldContinue().
+ wasAborted = true;
+ return _rsvpPromise.default.reject(reason);
+ }, currentState.promiseLabel("Handle abort"));
+ }
+
+ function handleError(error) {
+ // This is the only possible
+ // reject value of TransitionState#resolve
+ var handlerInfos = currentState.handlerInfos;
+ var errorHandlerIndex = payload.resolveIndex >= handlerInfos.length ? handlerInfos.length - 1 : payload.resolveIndex;
+ return _rsvpPromise.default.reject({
+ error: error,
+ handlerWithError: currentState.handlerInfos[errorHandlerIndex].handler,
+ wasAborted: wasAborted,
+ state: currentState
+ });
+ }
+
+ function proceed(resolvedHandlerInfo) {
+ var wasAlreadyResolved = currentState.handlerInfos[payload.resolveIndex].isResolved;
+
+ // Swap the previously unresolved handlerInfo with
+ // the resolved handlerInfo
+ currentState.handlerInfos[payload.resolveIndex++] = resolvedHandlerInfo;
+
+ if (!wasAlreadyResolved) {
+ // Call the redirect hook. The reason we call it here
+ // vs. afterModel is so that redirects into child
+ // routes don't re-run the model hooks for this
+ // already-resolved route.
+ var handler = resolvedHandlerInfo.handler;
+ _routerUtils.callHook(handler, 'redirect', resolvedHandlerInfo.context, payload);
+ }
+
+ // Proceed after ensuring that the redirect hook
+ // didn't abort this transition by transitioning elsewhere.
+ return innerShouldContinue().then(resolveOneHandlerInfo, null, currentState.promiseLabel('Resolve handler'));
+ }
+
+ function resolveOneHandlerInfo() {
+ if (payload.resolveIndex === currentState.handlerInfos.length) {
+ // This is is the only possible
+ // fulfill value of TransitionState#resolve
+ return {
+ error: null,
+ state: currentState
+ };
+ }
+
+ var handlerInfo = currentState.handlerInfos[payload.resolveIndex];
+
+ return handlerInfo.resolve(innerShouldContinue, payload).then(proceed, null, currentState.promiseLabel('Proceed'));
+ }
+ }
+ };
+
+ exports.default = TransitionState;
+});
+enifed('router/transition', ['exports', 'rsvp/promise', 'router/handler-info', 'router/utils'], function (exports, _rsvpPromise, _routerHandlerInfo, _routerUtils) {
+ 'use strict';
+
+ /**
+ @private
+
+ A Transition is a thennable (a promise-like object) that represents
+ an attempt to transition to another route. It can be aborted, either
+ explicitly via `abort` or by attempting another transition while a
+ previous one is still underway. An aborted transition can also
+ be `retry()`d later.
+ */
+ function Transition(router, intent, state, error) {
+ var transition = this;
+ this.state = state || router.state;
+ this.intent = intent;
+ this.router = router;
+ this.data = this.intent && this.intent.data || {};
+ this.resolvedModels = {};
+ this.queryParams = {};
+
+ if (error) {
+ this.promise = _rsvpPromise.default.reject(error);
+ this.error = error;
+ return;
+ }
+
+ if (state) {
+ this.params = state.params;
+ this.queryParams = state.queryParams;
+ this.handlerInfos = state.handlerInfos;
+
+ var len = state.handlerInfos.length;
+ if (len) {
+ this.targetName = state.handlerInfos[len - 1].name;
+ }
+
+ for (var i = 0; i < len; ++i) {
+ var handlerInfo = state.handlerInfos[i];
+
+ // TODO: this all seems hacky
+ if (!handlerInfo.isResolved) {
+ break;
+ }
+ this.pivotHandler = handlerInfo.handler;
+ }
+
+ this.sequence = Transition.currentSequence++;
+ this.promise = state.resolve(checkForAbort, this)['catch'](function (result) {
+ if (result.wasAborted || transition.isAborted) {
+ return _rsvpPromise.default.reject(logAbort(transition));
+ } else {
+ transition.trigger('error', result.error, transition, result.handlerWithError);
+ transition.abort();
+ return _rsvpPromise.default.reject(result.error);
+ }
+ }, _routerUtils.promiseLabel('Handle Abort'));
+ } else {
+ this.promise = _rsvpPromise.default.resolve(this.state);
+ this.params = {};
+ }
+
+ function checkForAbort() {
+ if (transition.isAborted) {
+ return _rsvpPromise.default.reject(undefined, _routerUtils.promiseLabel("Transition aborted - reject"));
+ }
+ }
+ }
+
+ Transition.currentSequence = 0;
+
+ Transition.prototype = {
+ targetName: null,
+ urlMethod: 'update',
+ intent: null,
+ params: null,
+ pivotHandler: null,
+ resolveIndex: 0,
+ handlerInfos: null,
+ resolvedModels: null,
+ isActive: true,
+ state: null,
+ queryParamsOnly: false,
+
+ isTransition: true,
+
+ isExiting: function (handler) {
+ var handlerInfos = this.handlerInfos;
+ for (var i = 0, len = handlerInfos.length; i < len; ++i) {
+ var handlerInfo = handlerInfos[i];
+ if (handlerInfo.name === handler || handlerInfo.handler === handler) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ /**
+ @public
+ The Transition's internal promise. Calling `.then` on this property
+ is that same as calling `.then` on the Transition object itself, but
+ this property is exposed for when you want to pass around a
+ Transition's promise, but not the Transition object itself, since
+ Transition object can be externally `abort`ed, while the promise
+ cannot.
+ */
+ promise: null,
+
+ /**
+ @public
+ Custom state can be stored on a Transition's `data` object.
+ This can be useful for decorating a Transition within an earlier
+ hook and shared with a later hook. Properties set on `data` will
+ be copied to new transitions generated by calling `retry` on this
+ transition.
+ */
+ data: null,
+
+ /**
+ @public
+ A standard promise hook that resolves if the transition
+ succeeds and rejects if it fails/redirects/aborts.
+ Forwards to the internal `promise` property which you can
+ use in situations where you want to pass around a thennable,
+ but not the Transition itself.
+ @param {Function} onFulfilled
+ @param {Function} onRejected
+ @param {String} label optional string for labeling the promise.
+ Useful for tooling.
+ @return {Promise}
+ */
+ then: function (onFulfilled, onRejected, label) {
+ return this.promise.then(onFulfilled, onRejected, label);
+ },
+
+ /**
+ @public
+ Forwards to the internal `promise` property which you can
+ use in situations where you want to pass around a thennable,
+ but not the Transition itself.
+ @method catch
+ @param {Function} onRejection
+ @param {String} label optional string for labeling the promise.
+ Useful for tooling.
+ @return {Promise}
+ */
+ catch: function (onRejection, label) {
+ return this.promise.catch(onRejection, label);
+ },
+
+ /**
+ @public
+ Forwards to the internal `promise` property which you can
+ use in situations where you want to pass around a thennable,
+ but not the Transition itself.
+ @method finally
+ @param {Function} callback
+ @param {String} label optional string for labeling the promise.
+ Useful for tooling.
+ @return {Promise}
+ */
+ finally: function (callback, label) {
+ return this.promise.finally(callback, label);
+ },
+
+ /**
+ @public
+ Aborts the Transition. Note you can also implicitly abort a transition
+ by initiating another transition while a previous one is underway.
+ */
+ abort: function () {
+ if (this.isAborted) {
+ return this;
+ }
+ _routerUtils.log(this.router, this.sequence, this.targetName + ": transition was aborted");
+ this.intent.preTransitionState = this.router.state;
+ this.isAborted = true;
+ this.isActive = false;
+ this.router.activeTransition = null;
+ return this;
+ },
+
+ /**
+ @public
+ Retries a previously-aborted transition (making sure to abort the
+ transition if it's still active). Returns a new transition that
+ represents the new attempt to transition.
+ */
+ retry: function () {
+ // TODO: add tests for merged state retry()s
+ this.abort();
+ return this.router.transitionByIntent(this.intent, false);
+ },
+
+ /**
+ @public
+ Sets the URL-changing method to be employed at the end of a
+ successful transition. By default, a new Transition will just
+ use `updateURL`, but passing 'replace' to this method will
+ cause the URL to update using 'replaceWith' instead. Omitting
+ a parameter will disable the URL change, allowing for transitions
+ that don't update the URL at completion (this is also used for
+ handleURL, since the URL has already changed before the
+ transition took place).
+ @param {String} method the type of URL-changing method to use
+ at the end of a transition. Accepted values are 'replace',
+ falsy values, or any other non-falsy value (which is
+ interpreted as an updateURL transition).
+ @return {Transition} this transition
+ */
+ method: function (method) {
+ this.urlMethod = method;
+ return this;
+ },
+
+ /**
+ @public
+ Fires an event on the current list of resolved/resolving
+ handlers within this transition. Useful for firing events
+ on route hierarchies that haven't fully been entered yet.
+ Note: This method is also aliased as `send`
+ @param {Boolean} [ignoreFailure=false] a boolean specifying whether unhandled events throw an error
+ @param {String} name the name of the event to fire
+ */
+ trigger: function (ignoreFailure) {
+ var args = _routerUtils.slice.call(arguments);
+ if (typeof ignoreFailure === 'boolean') {
+ args.shift();
+ } else {
+ // Throw errors on unhandled trigger events by default
+ ignoreFailure = false;
+ }
+ _routerUtils.trigger(this.router, this.state.handlerInfos.slice(0, this.resolveIndex + 1), ignoreFailure, args);
+ },
+
+ /**
+ @public
+ Transitions are aborted and their promises rejected
+ when redirects occur; this method returns a promise
+ that will follow any redirects that occur and fulfill
+ with the value fulfilled by any redirecting transitions
+ that occur.
+ @return {Promise} a promise that fulfills with the same
+ value that the final redirecting transition fulfills with
+ */
+ followRedirects: function () {
+ var router = this.router;
+ return this.promise['catch'](function (reason) {
+ if (router.activeTransition) {
+ return router.activeTransition.followRedirects();
+ }
+ return _rsvpPromise.default.reject(reason);
+ });
+ },
+
+ toString: function () {
+ return "Transition (sequence " + this.sequence + ")";
+ },
+
+ /**
+ @private
+ */
+ log: function (message) {
+ _routerUtils.log(this.router, this.sequence, message);
+ }
+ };
+
+ // Alias 'trigger' as 'send'
+ Transition.prototype.send = Transition.prototype.trigger;
+
+ /**
+ @private
+
+ Logs and returns a TransitionAborted error.
+ */
+ function logAbort(transition) {
+ _routerUtils.log(transition.router, transition.sequence, "detected abort.");
+ return new TransitionAborted();
+ }
+
+ function TransitionAborted(message) {
+ this.message = message || "TransitionAborted";
+ this.name = "TransitionAborted";
+ }
+
+ exports.Transition = Transition;
+ exports.logAbort = logAbort;
+ exports.TransitionAborted = TransitionAborted;
+});
+enifed("router/unrecognized-url-error", ["exports", "router/utils"], function (exports, _routerUtils) {
+ "use strict";
+
+ /**
+ Promise reject reasons passed to promise rejection
+ handlers for failed transitions.
+ */
+ function UnrecognizedURLError(message) {
+ this.message = message || "UnrecognizedURLError";
+ this.name = "UnrecognizedURLError";
+ Error.call(this);
+ }
+
+ UnrecognizedURLError.prototype = _routerUtils.oCreate(Error.prototype);
+
+ exports.default = UnrecognizedURLError;
+});
+enifed('router/utils', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.extractQueryParams = extractQueryParams;
+ exports.log = log;
+ exports.bind = bind;
+ exports.forEach = forEach;
+ exports.trigger = trigger;
+ exports.getChangelist = getChangelist;
+ exports.promiseLabel = promiseLabel;
+ exports.subclass = subclass;
+ var slice = Array.prototype.slice;
+
+ var _isArray;
+ if (!Array.isArray) {
+ _isArray = function (x) {
+ return Object.prototype.toString.call(x) === "[object Array]";
+ };
+ } else {
+ _isArray = Array.isArray;
+ }
+
+ var isArray = _isArray;
+
+ exports.isArray = isArray;
+ function merge(hash, other) {
+ for (var prop in other) {
+ if (other.hasOwnProperty(prop)) {
+ hash[prop] = other[prop];
+ }
+ }
+ }
+
+ var oCreate = Object.create || function (proto) {
+ function F() {}
+ F.prototype = proto;
+ return new F();
+ };
+
+ exports.oCreate = oCreate;
+ /**
+ @private
+
+ Extracts query params from the end of an array
+ **/
+
+ function extractQueryParams(array) {
+ var len = array && array.length,
+ head,
+ queryParams;
+
+ if (len && len > 0 && array[len - 1] && array[len - 1].hasOwnProperty('queryParams')) {
+ queryParams = array[len - 1].queryParams;
+ head = slice.call(array, 0, len - 1);
+ return [head, queryParams];
+ } else {
+ return [array, null];
+ }
+ }
+
+ /**
+ @private
+
+ Coerces query param properties and array elements into strings.
+ **/
+ function coerceQueryParamsToString(queryParams) {
+ for (var key in queryParams) {
+ if (typeof queryParams[key] === 'number') {
+ queryParams[key] = '' + queryParams[key];
+ } else if (isArray(queryParams[key])) {
+ for (var i = 0, l = queryParams[key].length; i < l; i++) {
+ queryParams[key][i] = '' + queryParams[key][i];
+ }
+ }
+ }
+ }
+ /**
+ @private
+ */
+
+ function log(router, sequence, msg) {
+ if (!router.log) {
+ return;
+ }
+
+ if (arguments.length === 3) {
+ router.log("Transition #" + sequence + ": " + msg);
+ } else {
+ msg = sequence;
+ router.log(msg);
+ }
+ }
+
+ function bind(context, fn) {
+ var boundArgs = arguments;
+ return function (value) {
+ var args = slice.call(boundArgs, 2);
+ args.push(value);
+ return fn.apply(context, args);
+ };
+ }
+
+ function isParam(object) {
+ return typeof object === "string" || object instanceof String || typeof object === "number" || object instanceof Number;
+ }
+
+ function forEach(array, callback) {
+ for (var i = 0, l = array.length; i < l && false !== callback(array[i]); i++) {}
+ }
+
+ function trigger(router, handlerInfos, ignoreFailure, args) {
+ if (router.triggerEvent) {
+ router.triggerEvent(handlerInfos, ignoreFailure, args);
+ return;
+ }
+
+ var name = args.shift();
+
+ if (!handlerInfos) {
+ if (ignoreFailure) {
+ return;
+ }
+ throw new Error("Could not trigger event '" + name + "'. There are no active handlers");
+ }
+
+ var eventWasHandled = false;
+
+ for (var i = handlerInfos.length - 1; i >= 0; i--) {
+ var handlerInfo = handlerInfos[i],
+ handler = handlerInfo.handler;
+
+ if (handler.events && handler.events[name]) {
+ if (handler.events[name].apply(handler, args) === true) {
+ eventWasHandled = true;
+ } else {
+ return;
+ }
+ }
+ }
+
+ if (!eventWasHandled && !ignoreFailure) {
+ throw new Error("Nothing handled the event '" + name + "'.");
+ }
+ }
+
+ function getChangelist(oldObject, newObject) {
+ var key;
+ var results = {
+ all: {},
+ changed: {},
+ removed: {}
+ };
+
+ merge(results.all, newObject);
+
+ var didChange = false;
+ coerceQueryParamsToString(oldObject);
+ coerceQueryParamsToString(newObject);
+
+ // Calculate removals
+ for (key in oldObject) {
+ if (oldObject.hasOwnProperty(key)) {
+ if (!newObject.hasOwnProperty(key)) {
+ didChange = true;
+ results.removed[key] = oldObject[key];
+ }
+ }
+ }
+
+ // Calculate changes
+ for (key in newObject) {
+ if (newObject.hasOwnProperty(key)) {
+ if (isArray(oldObject[key]) && isArray(newObject[key])) {
+ if (oldObject[key].length !== newObject[key].length) {
+ results.changed[key] = newObject[key];
+ didChange = true;
+ } else {
+ for (var i = 0, l = oldObject[key].length; i < l; i++) {
+ if (oldObject[key][i] !== newObject[key][i]) {
+ results.changed[key] = newObject[key];
+ didChange = true;
+ }
+ }
+ }
+ } else {
+ if (oldObject[key] !== newObject[key]) {
+ results.changed[key] = newObject[key];
+ didChange = true;
+ }
+ }
+ }
+ }
+
+ return didChange && results;
+ }
+
+ function promiseLabel(label) {
+ return 'Router: ' + label;
+ }
+
+ function subclass(parentConstructor, proto) {
+ function C(props) {
+ parentConstructor.call(this, props || {});
+ }
+ C.prototype = oCreate(parentConstructor.prototype);
+ merge(C.prototype, proto);
+ return C;
+ }
+
+ function resolveHook(obj, hookName) {
+ if (!obj) {
+ return;
+ }
+ var underscored = "_" + hookName;
+ return obj[underscored] && underscored || obj[hookName] && hookName;
+ }
+
+ function callHook(obj, _hookName, arg1, arg2) {
+ var hookName = resolveHook(obj, _hookName);
+ return hookName && obj[hookName].call(obj, arg1, arg2);
+ }
+
+ function applyHook(obj, _hookName, args) {
+ var hookName = resolveHook(obj, _hookName);
+ if (hookName) {
+ if (args.length === 0) {
+ return obj[hookName].call(obj);
+ } else if (args.length === 1) {
+ return obj[hookName].call(obj, args[0]);
+ } else if (args.length === 2) {
+ return obj[hookName].call(obj, args[0], args[1]);
+ } else {
+ return obj[hookName].apply(obj, args);
+ }
+ }
+ }
+
+ exports.merge = merge;
+ exports.slice = slice;
+ exports.isParam = isParam;
+ exports.coerceQueryParamsToString = coerceQueryParamsToString;
+ exports.callHook = callHook;
+ exports.resolveHook = resolveHook;
+ exports.applyHook = applyHook;
+});
+enifed('router', ['exports', 'router/router'], function (exports, _routerRouter) {
+ 'use strict';
+
+ exports.default = _routerRouter.default;
+});
+enifed('rsvp/-internal', ['exports', 'rsvp/utils', 'rsvp/instrument', 'rsvp/config'], function (exports, _rsvpUtils, _rsvpInstrument, _rsvpConfig) {
+ 'use strict';
+
+ function withOwnPromise() {
+ return new TypeError('A promises callback cannot return that same promise.');
+ }
+
+ function noop() {}
+
+ var PENDING = void 0;
+ var FULFILLED = 1;
+ var REJECTED = 2;
+
+ var GET_THEN_ERROR = new ErrorObject();
+
+ function getThen(promise) {
+ try {
+ return promise.then;
+ } catch (error) {
+ GET_THEN_ERROR.error = error;
+ return GET_THEN_ERROR;
+ }
+ }
+
+ function tryThen(then, value, fulfillmentHandler, rejectionHandler) {
+ try {
+ then.call(value, fulfillmentHandler, rejectionHandler);
+ } catch (e) {
+ return e;
+ }
+ }
+
+ function handleForeignThenable(promise, thenable, then) {
+ _rsvpConfig.config.async(function (promise) {
+ var sealed = false;
+ var error = tryThen(then, thenable, function (value) {
+ if (sealed) {
+ return;
+ }
+ sealed = true;
+ if (thenable !== value) {
+ resolve(promise, value);
+ } else {
+ fulfill(promise, value);
+ }
+ }, function (reason) {
+ if (sealed) {
+ return;
+ }
+ sealed = true;
+
+ reject(promise, reason);
+ }, 'Settle: ' + (promise._label || ' unknown promise'));
+
+ if (!sealed && error) {
+ sealed = true;
+ reject(promise, error);
+ }
+ }, promise);
+ }
+
+ function handleOwnThenable(promise, thenable) {
+ if (thenable._state === FULFILLED) {
+ fulfill(promise, thenable._result);
+ } else if (thenable._state === REJECTED) {
+ thenable._onError = null;
+ reject(promise, thenable._result);
+ } else {
+ subscribe(thenable, undefined, function (value) {
+ if (thenable !== value) {
+ resolve(promise, value);
+ } else {
+ fulfill(promise, value);
+ }
+ }, function (reason) {
+ reject(promise, reason);
+ });
+ }
+ }
+
+ function handleMaybeThenable(promise, maybeThenable) {
+ if (maybeThenable.constructor === promise.constructor) {
+ handleOwnThenable(promise, maybeThenable);
+ } else {
+ var then = getThen(maybeThenable);
+
+ if (then === GET_THEN_ERROR) {
+ reject(promise, GET_THEN_ERROR.error);
+ } else if (then === undefined) {
+ fulfill(promise, maybeThenable);
+ } else if (_rsvpUtils.isFunction(then)) {
+ handleForeignThenable(promise, maybeThenable, then);
+ } else {
+ fulfill(promise, maybeThenable);
+ }
+ }
+ }
+
+ function resolve(promise, value) {
+ if (promise === value) {
+ fulfill(promise, value);
+ } else if (_rsvpUtils.objectOrFunction(value)) {
+ handleMaybeThenable(promise, value);
+ } else {
+ fulfill(promise, value);
+ }
+ }
+
+ function publishRejection(promise) {
+ if (promise._onError) {
+ promise._onError(promise._result);
+ }
+
+ publish(promise);
+ }
+
+ function fulfill(promise, value) {
+ if (promise._state !== PENDING) {
+ return;
+ }
+
+ promise._result = value;
+ promise._state = FULFILLED;
+
+ if (promise._subscribers.length === 0) {
+ if (_rsvpConfig.config.instrument) {
+ _rsvpInstrument.default('fulfilled', promise);
+ }
+ } else {
+ _rsvpConfig.config.async(publish, promise);
+ }
+ }
+
+ function reject(promise, reason) {
+ if (promise._state !== PENDING) {
+ return;
+ }
+ promise._state = REJECTED;
+ promise._result = reason;
+ _rsvpConfig.config.async(publishRejection, promise);
+ }
+
+ function subscribe(parent, child, onFulfillment, onRejection) {
+ var subscribers = parent._subscribers;
+ var length = subscribers.length;
+
+ parent._onError = null;
+
+ subscribers[length] = child;
+ subscribers[length + FULFILLED] = onFulfillment;
+ subscribers[length + REJECTED] = onRejection;
+
+ if (length === 0 && parent._state) {
+ _rsvpConfig.config.async(publish, parent);
+ }
+ }
+
+ function publish(promise) {
+ var subscribers = promise._subscribers;
+ var settled = promise._state;
+
+ if (_rsvpConfig.config.instrument) {
+ _rsvpInstrument.default(settled === FULFILLED ? 'fulfilled' : 'rejected', promise);
+ }
+
+ if (subscribers.length === 0) {
+ return;
+ }
+
+ var child,
+ callback,
+ detail = promise._result;
+
+ for (var i = 0; i < subscribers.length; i += 3) {
+ child = subscribers[i];
+ callback = subscribers[i + settled];
+
+ if (child) {
+ invokeCallback(settled, child, callback, detail);
+ } else {
+ callback(detail);
+ }
+ }
+
+ promise._subscribers.length = 0;
+ }
+
+ function ErrorObject() {
+ this.error = null;
+ }
+
+ var TRY_CATCH_ERROR = new ErrorObject();
+
+ function tryCatch(callback, detail) {
+ try {
+ return callback(detail);
+ } catch (e) {
+ TRY_CATCH_ERROR.error = e;
+ return TRY_CATCH_ERROR;
+ }
+ }
+
+ function invokeCallback(settled, promise, callback, detail) {
+ var hasCallback = _rsvpUtils.isFunction(callback),
+ value,
+ error,
+ succeeded,
+ failed;
+
+ if (hasCallback) {
+ value = tryCatch(callback, detail);
+
+ if (value === TRY_CATCH_ERROR) {
+ failed = true;
+ error = value.error;
+ value = null;
+ } else {
+ succeeded = true;
+ }
+
+ if (promise === value) {
+ reject(promise, withOwnPromise());
+ return;
+ }
+ } else {
+ value = detail;
+ succeeded = true;
+ }
+
+ if (promise._state !== PENDING) {
+ // noop
+ } else if (hasCallback && succeeded) {
+ resolve(promise, value);
+ } else if (failed) {
+ reject(promise, error);
+ } else if (settled === FULFILLED) {
+ fulfill(promise, value);
+ } else if (settled === REJECTED) {
+ reject(promise, value);
+ }
+ }
+
+ function initializePromise(promise, resolver) {
+ var resolved = false;
+ try {
+ resolver(function resolvePromise(value) {
+ if (resolved) {
+ return;
+ }
+ resolved = true;
+ resolve(promise, value);
+ }, function rejectPromise(reason) {
+ if (resolved) {
+ return;
+ }
+ resolved = true;
+ reject(promise, reason);
+ });
+ } catch (e) {
+ reject(promise, e);
+ }
+ }
+
+ exports.noop = noop;
+ exports.resolve = resolve;
+ exports.reject = reject;
+ exports.fulfill = fulfill;
+ exports.subscribe = subscribe;
+ exports.publish = publish;
+ exports.publishRejection = publishRejection;
+ exports.initializePromise = initializePromise;
+ exports.invokeCallback = invokeCallback;
+ exports.FULFILLED = FULFILLED;
+ exports.REJECTED = REJECTED;
+ exports.PENDING = PENDING;
+});
+enifed('rsvp/all-settled', ['exports', 'rsvp/enumerator', 'rsvp/promise', 'rsvp/utils'], function (exports, _rsvpEnumerator, _rsvpPromise, _rsvpUtils) {
+ 'use strict';
+
+ exports.default = allSettled;
+
+ function AllSettled(Constructor, entries, label) {
+ this._superConstructor(Constructor, entries, false, /* don't abort on reject */label);
+ }
+
+ AllSettled.prototype = _rsvpUtils.o_create(_rsvpEnumerator.default.prototype);
+ AllSettled.prototype._superConstructor = _rsvpEnumerator.default;
+ AllSettled.prototype._makeResult = _rsvpEnumerator.makeSettledResult;
+ AllSettled.prototype._validationError = function () {
+ return new Error('allSettled must be called with an array');
+ };
+
+ /**
+ `RSVP.allSettled` is similar to `RSVP.all`, but instead of implementing
+ a fail-fast method, it waits until all the promises have returned and
+ shows you all the results. This is useful if you want to handle multiple
+ promises' failure states together as a set.
+
+ Returns a promise that is fulfilled when all the given promises have been
+ settled. The return promise is fulfilled with an array of the states of
+ the promises passed into the `promises` array argument.
+
+ Each state object will either indicate fulfillment or rejection, and
+ provide the corresponding value or reason. The states will take one of
+ the following formats:
+
+ ```javascript
+ { state: 'fulfilled', value: value }
+ or
+ { state: 'rejected', reason: reason }
+ ```
+
+ Example:
+
+ ```javascript
+ var promise1 = RSVP.Promise.resolve(1);
+ var promise2 = RSVP.Promise.reject(new Error('2'));
+ var promise3 = RSVP.Promise.reject(new Error('3'));
+ var promises = [ promise1, promise2, promise3 ];
+
+ RSVP.allSettled(promises).then(function(array){
+ // array == [
+ // { state: 'fulfilled', value: 1 },
+ // { state: 'rejected', reason: Error },
+ // { state: 'rejected', reason: Error }
+ // ]
+ // Note that for the second item, reason.message will be '2', and for the
+ // third item, reason.message will be '3'.
+ }, function(error) {
+ // Not run. (This block would only be called if allSettled had failed,
+ // for instance if passed an incorrect argument type.)
+ });
+ ```
+
+ @method allSettled
+ @static
+ @for RSVP
+ @param {Array} entries
+ @param {String} label - optional string that describes the promise.
+ Useful for tooling.
+ @return {Promise} promise that is fulfilled with an array of the settled
+ states of the constituent promises.
+ */
+
+ function allSettled(entries, label) {
+ return new AllSettled(_rsvpPromise.default, entries, label).promise;
+ }
+});
+enifed("rsvp/all", ["exports", "rsvp/promise"], function (exports, _rsvpPromise) {
+ "use strict";
+
+ exports.default = all;
+
+ /**
+ This is a convenient alias for `RSVP.Promise.all`.
+
+ @method all
+ @static
+ @for RSVP
+ @param {Array} array Array of promises.
+ @param {String} label An optional label. This is useful
+ for tooling.
+ */
+
+ function all(array, label) {
+ return _rsvpPromise.default.all(array, label);
+ }
+});
+enifed('rsvp/asap', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.default = asap;
+ var len = 0;
+ var toString = ({}).toString;
+ var vertxNext;
+
+ function asap(callback, arg) {
+ queue[len] = callback;
+ queue[len + 1] = arg;
+ len += 2;
+ if (len === 2) {
+ // If len is 1, that means that we need to schedule an async flush.
+ // If additional callbacks are queued before the queue is flushed, they
+ // will be processed by this flush that we are scheduling.
+ scheduleFlush();
+ }
+ }
+
+ var browserWindow = typeof window !== 'undefined' ? window : undefined;
+ var browserGlobal = browserWindow || {};
+ var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
+ var isNode = typeof window === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]';
+
+ // test for web worker but not in IE10
+ var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';
+
+ // node
+ function useNextTick() {
+ var nextTick = process.nextTick;
+ // node version 0.10.x displays a deprecation warning when nextTick is used recursively
+ // setImmediate should be used instead instead
+ var version = process.versions.node.match(/^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$/);
+ if (Array.isArray(version) && version[1] === '0' && version[2] === '10') {
+ nextTick = setImmediate;
+ }
+ return function () {
+ nextTick(flush);
+ };
+ }
+
+ // vertx
+ function useVertxTimer() {
+ return function () {
+ vertxNext(flush);
+ };
+ }
+
+ function useMutationObserver() {
+ var iterations = 0;
+ var observer = new BrowserMutationObserver(flush);
+ var node = document.createTextNode('');
+ observer.observe(node, { characterData: true });
+
+ return function () {
+ node.data = iterations = ++iterations % 2;
+ };
+ }
+
+ // web worker
+ function useMessageChannel() {
+ var channel = new MessageChannel();
+ channel.port1.onmessage = flush;
+ return function () {
+ channel.port2.postMessage(0);
+ };
+ }
+
+ function useSetTimeout() {
+ return function () {
+ setTimeout(flush, 1);
+ };
+ }
+
+ var queue = new Array(1000);
+ function flush() {
+ for (var i = 0; i < len; i += 2) {
+ var callback = queue[i];
+ var arg = queue[i + 1];
+
+ callback(arg);
+
+ queue[i] = undefined;
+ queue[i + 1] = undefined;
+ }
+
+ len = 0;
+ }
+
+ function attemptVertex() {
+ try {
+ var r = require;
+ var vertx = r('vertx');
+ vertxNext = vertx.runOnLoop || vertx.runOnContext;
+ return useVertxTimer();
+ } catch (e) {
+ return useSetTimeout();
+ }
+ }
+
+ var scheduleFlush;
+ // Decide what async method to use to triggering processing of queued callbacks:
+ if (isNode) {
+ scheduleFlush = useNextTick();
+ } else if (BrowserMutationObserver) {
+ scheduleFlush = useMutationObserver();
+ } else if (isWorker) {
+ scheduleFlush = useMessageChannel();
+ } else if (browserWindow === undefined && typeof require === 'function') {
+ scheduleFlush = attemptVertex();
+ } else {
+ scheduleFlush = useSetTimeout();
+ }
+});
+enifed('rsvp/config', ['exports', 'rsvp/events'], function (exports, _rsvpEvents) {
+ 'use strict';
+
+ var config = {
+ instrument: false
+ };
+
+ _rsvpEvents.default['mixin'](config);
+
+ function configure(name, value) {
+ if (name === 'onerror') {
+ // handle for legacy users that expect the actual
+ // error to be passed to their function added via
+ // `RSVP.configure('onerror', someFunctionHere);`
+ config['on']('error', value);
+ return;
+ }
+
+ if (arguments.length === 2) {
+ config[name] = value;
+ } else {
+ return config[name];
+ }
+ }
+
+ exports.config = config;
+ exports.configure = configure;
+});
+enifed('rsvp/defer', ['exports', 'rsvp/promise'], function (exports, _rsvpPromise) {
+ 'use strict';
+
+ exports.default = defer;
+
+ /**
+ `RSVP.defer` returns an object similar to jQuery's `$.Deferred`.
+ `RSVP.defer` should be used when porting over code reliant on `$.Deferred`'s
+ interface. New code should use the `RSVP.Promise` constructor instead.
+
+ The object returned from `RSVP.defer` is a plain object with three properties:
+
+ * promise - an `RSVP.Promise`.
+ * reject - a function that causes the `promise` property on this object to
+ become rejected
+ * resolve - a function that causes the `promise` property on this object to
+ become fulfilled.
+
+ Example:
+
+ ```javascript
+ var deferred = RSVP.defer();
+
+ deferred.resolve("Success!");
+
+ deferred.promise.then(function(value){
+ // value here is "Success!"
+ });
+ ```
+
+ @method defer
+ @static
+ @for RSVP
+ @param {String} label optional string for labeling the promise.
+ Useful for tooling.
+ @return {Object}
+ */
+
+ function defer(label) {
+ var deferred = {};
+
+ deferred['promise'] = new _rsvpPromise.default(function (resolve, reject) {
+ deferred['resolve'] = resolve;
+ deferred['reject'] = reject;
+ }, label);
+
+ return deferred;
+ }
+});
+enifed('rsvp/enumerator', ['exports', 'rsvp/utils', 'rsvp/-internal'], function (exports, _rsvpUtils, _rsvpInternal) {
+ 'use strict';
+
+ exports.makeSettledResult = makeSettledResult;
+
+ function makeSettledResult(state, position, value) {
+ if (state === _rsvpInternal.FULFILLED) {
+ return {
+ state: 'fulfilled',
+ value: value
+ };
+ } else {
+ return {
+ state: 'rejected',
+ reason: value
+ };
+ }
+ }
+
+ function Enumerator(Constructor, input, abortOnReject, label) {
+ var enumerator = this;
+
+ enumerator._instanceConstructor = Constructor;
+ enumerator.promise = new Constructor(_rsvpInternal.noop, label);
+ enumerator._abortOnReject = abortOnReject;
+
+ if (enumerator._validateInput(input)) {
+ enumerator._input = input;
+ enumerator.length = input.length;
+ enumerator._remaining = input.length;
+
+ enumerator._init();
+
+ if (enumerator.length === 0) {
+ _rsvpInternal.fulfill(enumerator.promise, enumerator._result);
+ } else {
+ enumerator.length = enumerator.length || 0;
+ enumerator._enumerate();
+ if (enumerator._remaining === 0) {
+ _rsvpInternal.fulfill(enumerator.promise, enumerator._result);
+ }
+ }
+ } else {
+ _rsvpInternal.reject(enumerator.promise, enumerator._validationError());
+ }
+ }
+
+ exports.default = Enumerator;
+
+ Enumerator.prototype._validateInput = function (input) {
+ return _rsvpUtils.isArray(input);
+ };
+
+ Enumerator.prototype._validationError = function () {
+ return new Error('Array Methods must be provided an Array');
+ };
+
+ Enumerator.prototype._init = function () {
+ this._result = new Array(this.length);
+ };
+
+ Enumerator.prototype._enumerate = function () {
+ var enumerator = this;
+ var length = enumerator.length;
+ var promise = enumerator.promise;
+ var input = enumerator._input;
+
+ for (var i = 0; promise._state === _rsvpInternal.PENDING && i < length; i++) {
+ enumerator._eachEntry(input[i], i);
+ }
+ };
+
+ Enumerator.prototype._eachEntry = function (entry, i) {
+ var enumerator = this;
+ var c = enumerator._instanceConstructor;
+ if (_rsvpUtils.isMaybeThenable(entry)) {
+ if (entry.constructor === c && entry._state !== _rsvpInternal.PENDING) {
+ entry._onError = null;
+ enumerator._settledAt(entry._state, i, entry._result);
+ } else {
+ enumerator._willSettleAt(c.resolve(entry), i);
+ }
+ } else {
+ enumerator._remaining--;
+ enumerator._result[i] = enumerator._makeResult(_rsvpInternal.FULFILLED, i, entry);
+ }
+ };
+
+ Enumerator.prototype._settledAt = function (state, i, value) {
+ var enumerator = this;
+ var promise = enumerator.promise;
+
+ if (promise._state === _rsvpInternal.PENDING) {
+ enumerator._remaining--;
+
+ if (enumerator._abortOnReject && state === _rsvpInternal.REJECTED) {
+ _rsvpInternal.reject(promise, value);
+ } else {
+ enumerator._result[i] = enumerator._makeResult(state, i, value);
+ }
+ }
+
+ if (enumerator._remaining === 0) {
+ _rsvpInternal.fulfill(promise, enumerator._result);
+ }
+ };
+
+ Enumerator.prototype._makeResult = function (state, i, value) {
+ return value;
+ };
+
+ Enumerator.prototype._willSettleAt = function (promise, i) {
+ var enumerator = this;
+
+ _rsvpInternal.subscribe(promise, undefined, function (value) {
+ enumerator._settledAt(_rsvpInternal.FULFILLED, i, value);
+ }, function (reason) {
+ enumerator._settledAt(_rsvpInternal.REJECTED, i, reason);
+ });
+ };
+});
+enifed('rsvp/events', ['exports'], function (exports) {
+ 'use strict';
+
+ function indexOf(callbacks, callback) {
+ for (var i = 0, l = callbacks.length; i < l; i++) {
+ if (callbacks[i] === callback) {
+ return i;
+ }
+ }
+
+ return -1;
+ }
+
+ function callbacksFor(object) {
+ var callbacks = object._promiseCallbacks;
+
+ if (!callbacks) {
+ callbacks = object._promiseCallbacks = {};
+ }
+
+ return callbacks;
+ }
+
+ /**
+ @class RSVP.EventTarget
+ */
+ exports.default = {
+
+ /**
+ `RSVP.EventTarget.mixin` extends an object with EventTarget methods. For
+ Example:
+ ```javascript
+ var object = {};
+ RSVP.EventTarget.mixin(object);
+ object.on('finished', function(event) {
+ // handle event
+ });
+ object.trigger('finished', { detail: value });
+ ```
+ `EventTarget.mixin` also works with prototypes:
+ ```javascript
+ var Person = function() {};
+ RSVP.EventTarget.mixin(Person.prototype);
+ var yehuda = new Person();
+ var tom = new Person();
+ yehuda.on('poke', function(event) {
+ console.log('Yehuda says OW');
+ });
+ tom.on('poke', function(event) {
+ console.log('Tom says OW');
+ });
+ yehuda.trigger('poke');
+ tom.trigger('poke');
+ ```
+ @method mixin
+ @for RSVP.EventTarget
+ @private
+ @param {Object} object object to extend with EventTarget methods
+ */
+ 'mixin': function (object) {
+ object['on'] = this['on'];
+ object['off'] = this['off'];
+ object['trigger'] = this['trigger'];
+ object._promiseCallbacks = undefined;
+ return object;
+ },
+
+ /**
+ Registers a callback to be executed when `eventName` is triggered
+ ```javascript
+ object.on('event', function(eventInfo){
+ // handle the event
+ });
+ object.trigger('event');
+ ```
+ @method on
+ @for RSVP.EventTarget
+ @private
+ @param {String} eventName name of the event to listen for
+ @param {Function} callback function to be called when the event is triggered.
+ */
+ 'on': function (eventName, callback) {
+ if (typeof callback !== 'function') {
+ throw new TypeError('Callback must be a function');
+ }
+
+ var allCallbacks = callbacksFor(this),
+ callbacks;
+
+ callbacks = allCallbacks[eventName];
+
+ if (!callbacks) {
+ callbacks = allCallbacks[eventName] = [];
+ }
+
+ if (indexOf(callbacks, callback) === -1) {
+ callbacks.push(callback);
+ }
+ },
+
+ /**
+ You can use `off` to stop firing a particular callback for an event:
+ ```javascript
+ function doStuff() { // do stuff! }
+ object.on('stuff', doStuff);
+ object.trigger('stuff'); // doStuff will be called
+ // Unregister ONLY the doStuff callback
+ object.off('stuff', doStuff);
+ object.trigger('stuff'); // doStuff will NOT be called
+ ```
+ If you don't pass a `callback` argument to `off`, ALL callbacks for the
+ event will not be executed when the event fires. For example:
+ ```javascript
+ var callback1 = function(){};
+ var callback2 = function(){};
+ object.on('stuff', callback1);
+ object.on('stuff', callback2);
+ object.trigger('stuff'); // callback1 and callback2 will be executed.
+ object.off('stuff');
+ object.trigger('stuff'); // callback1 and callback2 will not be executed!
+ ```
+ @method off
+ @for RSVP.EventTarget
+ @private
+ @param {String} eventName event to stop listening to
+ @param {Function} callback optional argument. If given, only the function
+ given will be removed from the event's callback queue. If no `callback`
+ argument is given, all callbacks will be removed from the event's callback
+ queue.
+ */
+ 'off': function (eventName, callback) {
+ var allCallbacks = callbacksFor(this),
+ callbacks,
+ index;
+
+ if (!callback) {
+ allCallbacks[eventName] = [];
+ return;
+ }
+
+ callbacks = allCallbacks[eventName];
+
+ index = indexOf(callbacks, callback);
+
+ if (index !== -1) {
+ callbacks.splice(index, 1);
+ }
+ },
+
+ /**
+ Use `trigger` to fire custom events. For example:
+ ```javascript
+ object.on('foo', function(){
+ console.log('foo event happened!');
+ });
+ object.trigger('foo');
+ // 'foo event happened!' logged to the console
+ ```
+ You can also pass a value as a second argument to `trigger` that will be
+ passed as an argument to all event listeners for the event:
+ ```javascript
+ object.on('foo', function(value){
+ console.log(value.name);
+ });
+ object.trigger('foo', { name: 'bar' });
+ // 'bar' logged to the console
+ ```
+ @method trigger
+ @for RSVP.EventTarget
+ @private
+ @param {String} eventName name of the event to be triggered
+ @param {*} options optional value to be passed to any event handlers for
+ the given `eventName`
+ */
+ 'trigger': function (eventName, options) {
+ var allCallbacks = callbacksFor(this),
+ callbacks,
+ callback;
+
+ if (callbacks = allCallbacks[eventName]) {
+ // Don't cache the callbacks.length since it may grow
+ for (var i = 0; i < callbacks.length; i++) {
+ callback = callbacks[i];
+
+ callback(options);
+ }
+ }
+ }
+ };
+});
+enifed('rsvp/filter', ['exports', 'rsvp/promise', 'rsvp/utils'], function (exports, _rsvpPromise, _rsvpUtils) {
+ 'use strict';
+
+ exports.default = filter;
+
+ /**
+ `RSVP.filter` is similar to JavaScript's native `filter` method, except that it
+ waits for all promises to become fulfilled before running the `filterFn` on
+ each item in given to `promises`. `RSVP.filter` returns a promise that will
+ become fulfilled with the result of running `filterFn` on the values the
+ promises become fulfilled with.
+
+ For example:
+
+ ```javascript
+
+ var promise1 = RSVP.resolve(1);
+ var promise2 = RSVP.resolve(2);
+ var promise3 = RSVP.resolve(3);
+
+ var promises = [promise1, promise2, promise3];
+
+ var filterFn = function(item){
+ return item > 1;
+ };
+
+ RSVP.filter(promises, filterFn).then(function(result){
+ // result is [ 2, 3 ]
+ });
+ ```
+
+ If any of the `promises` given to `RSVP.filter` are rejected, the first promise
+ that is rejected will be given as an argument to the returned promise's
+ rejection handler. For example:
+
+ ```javascript
+ var promise1 = RSVP.resolve(1);
+ var promise2 = RSVP.reject(new Error('2'));
+ var promise3 = RSVP.reject(new Error('3'));
+ var promises = [ promise1, promise2, promise3 ];
+
+ var filterFn = function(item){
+ return item > 1;
+ };
+
+ RSVP.filter(promises, filterFn).then(function(array){
+ // Code here never runs because there are rejected promises!
+ }, function(reason) {
+ // reason.message === '2'
+ });
+ ```
+
+ `RSVP.filter` will also wait for any promises returned from `filterFn`.
+ For instance, you may want to fetch a list of users then return a subset
+ of those users based on some asynchronous operation:
+
+ ```javascript
+
+ var alice = { name: 'alice' };
+ var bob = { name: 'bob' };
+ var users = [ alice, bob ];
+
+ var promises = users.map(function(user){
+ return RSVP.resolve(user);
+ });
+
+ var filterFn = function(user){
+ // Here, Alice has permissions to create a blog post, but Bob does not.
+ return getPrivilegesForUser(user).then(function(privs){
+ return privs.can_create_blog_post === true;
+ });
+ };
+ RSVP.filter(promises, filterFn).then(function(users){
+ // true, because the server told us only Alice can create a blog post.
+ users.length === 1;
+ // false, because Alice is the only user present in `users`
+ users[0] === bob;
+ });
+ ```
+
+ @method filter
+ @static
+ @for RSVP
+ @param {Array} promises
+ @param {Function} filterFn - function to be called on each resolved value to
+ filter the final results.
+ @param {String} label optional string describing the promise. Useful for
+ tooling.
+ @return {Promise}
+ */
+
+ function filter(promises, filterFn, label) {
+ return _rsvpPromise.default.all(promises, label).then(function (values) {
+ if (!_rsvpUtils.isFunction(filterFn)) {
+ throw new TypeError("You must pass a function as filter's second argument.");
+ }
+
+ var length = values.length;
+ var filtered = new Array(length);
+
+ for (var i = 0; i < length; i++) {
+ filtered[i] = filterFn(values[i]);
+ }
+
+ return _rsvpPromise.default.all(filtered, label).then(function (filtered) {
+ var results = new Array(length);
+ var newLength = 0;
+
+ for (var i = 0; i < length; i++) {
+ if (filtered[i]) {
+ results[newLength] = values[i];
+ newLength++;
+ }
+ }
+
+ results.length = newLength;
+
+ return results;
+ });
+ });
+ }
+});
+enifed('rsvp/hash-settled', ['exports', 'rsvp/promise', 'rsvp/enumerator', 'rsvp/promise-hash', 'rsvp/utils'], function (exports, _rsvpPromise, _rsvpEnumerator, _rsvpPromiseHash, _rsvpUtils) {
+ 'use strict';
+
+ exports.default = hashSettled;
+
+ function HashSettled(Constructor, object, label) {
+ this._superConstructor(Constructor, object, false, label);
+ }
+
+ HashSettled.prototype = _rsvpUtils.o_create(_rsvpPromiseHash.default.prototype);
+ HashSettled.prototype._superConstructor = _rsvpEnumerator.default;
+ HashSettled.prototype._makeResult = _rsvpEnumerator.makeSettledResult;
+
+ HashSettled.prototype._validationError = function () {
+ return new Error('hashSettled must be called with an object');
+ };
+
+ /**
+ `RSVP.hashSettled` is similar to `RSVP.allSettled`, but takes an object
+ instead of an array for its `promises` argument.
+
+ Unlike `RSVP.all` or `RSVP.hash`, which implement a fail-fast method,
+ but like `RSVP.allSettled`, `hashSettled` waits until all the
+ constituent promises have returned and then shows you all the results
+ with their states and values/reasons. This is useful if you want to
+ handle multiple promises' failure states together as a set.
+
+ Returns a promise that is fulfilled when all the given promises have been
+ settled, or rejected if the passed parameters are invalid.
+
+ The returned promise is fulfilled with a hash that has the same key names as
+ the `promises` object argument. If any of the values in the object are not
+ promises, they will be copied over to the fulfilled object and marked with state
+ 'fulfilled'.
+
+ Example:
+
+ ```javascript
+ var promises = {
+ myPromise: RSVP.Promise.resolve(1),
+ yourPromise: RSVP.Promise.resolve(2),
+ theirPromise: RSVP.Promise.resolve(3),
+ notAPromise: 4
+ };
+
+ RSVP.hashSettled(promises).then(function(hash){
+ // hash here is an object that looks like:
+ // {
+ // myPromise: { state: 'fulfilled', value: 1 },
+ // yourPromise: { state: 'fulfilled', value: 2 },
+ // theirPromise: { state: 'fulfilled', value: 3 },
+ // notAPromise: { state: 'fulfilled', value: 4 }
+ // }
+ });
+ ```
+
+ If any of the `promises` given to `RSVP.hash` are rejected, the state will
+ be set to 'rejected' and the reason for rejection provided.
+
+ Example:
+
+ ```javascript
+ var promises = {
+ myPromise: RSVP.Promise.resolve(1),
+ rejectedPromise: RSVP.Promise.reject(new Error('rejection')),
+ anotherRejectedPromise: RSVP.Promise.reject(new Error('more rejection')),
+ };
+
+ RSVP.hashSettled(promises).then(function(hash){
+ // hash here is an object that looks like:
+ // {
+ // myPromise: { state: 'fulfilled', value: 1 },
+ // rejectedPromise: { state: 'rejected', reason: Error },
+ // anotherRejectedPromise: { state: 'rejected', reason: Error },
+ // }
+ // Note that for rejectedPromise, reason.message == 'rejection',
+ // and for anotherRejectedPromise, reason.message == 'more rejection'.
+ });
+ ```
+
+ An important note: `RSVP.hashSettled` is intended for plain JavaScript objects that
+ are just a set of keys and values. `RSVP.hashSettled` will NOT preserve prototype
+ chains.
+
+ Example:
+
+ ```javascript
+ function MyConstructor(){
+ this.example = RSVP.Promise.resolve('Example');
+ }
+
+ MyConstructor.prototype = {
+ protoProperty: RSVP.Promise.resolve('Proto Property')
+ };
+
+ var myObject = new MyConstructor();
+
+ RSVP.hashSettled(myObject).then(function(hash){
+ // protoProperty will not be present, instead you will just have an
+ // object that looks like:
+ // {
+ // example: { state: 'fulfilled', value: 'Example' }
+ // }
+ //
+ // hash.hasOwnProperty('protoProperty'); // false
+ // 'undefined' === typeof hash.protoProperty
+ });
+ ```
+
+ @method hashSettled
+ @for RSVP
+ @param {Object} object
+ @param {String} label optional string that describes the promise.
+ Useful for tooling.
+ @return {Promise} promise that is fulfilled when when all properties of `promises`
+ have been settled.
+ @static
+ */
+
+ function hashSettled(object, label) {
+ return new HashSettled(_rsvpPromise.default, object, label).promise;
+ }
+});
+enifed('rsvp/hash', ['exports', 'rsvp/promise', 'rsvp/promise-hash'], function (exports, _rsvpPromise, _rsvpPromiseHash) {
+ 'use strict';
+
+ exports.default = hash;
+
+ /**
+ `RSVP.hash` is similar to `RSVP.all`, but takes an object instead of an array
+ for its `promises` argument.
+
+ Returns a promise that is fulfilled when all the given promises have been
+ fulfilled, or rejected if any of them become rejected. The returned promise
+ is fulfilled with a hash that has the same key names as the `promises` object
+ argument. If any of the values in the object are not promises, they will
+ simply be copied over to the fulfilled object.
+
+ Example:
+
+ ```javascript
+ var promises = {
+ myPromise: RSVP.resolve(1),
+ yourPromise: RSVP.resolve(2),
+ theirPromise: RSVP.resolve(3),
+ notAPromise: 4
+ };
+
+ RSVP.hash(promises).then(function(hash){
+ // hash here is an object that looks like:
+ // {
+ // myPromise: 1,
+ // yourPromise: 2,
+ // theirPromise: 3,
+ // notAPromise: 4
+ // }
+ });
+ ````
+
+ If any of the `promises` given to `RSVP.hash` are rejected, the first promise
+ that is rejected will be given as the reason to the rejection handler.
+
+ Example:
+
+ ```javascript
+ var promises = {
+ myPromise: RSVP.resolve(1),
+ rejectedPromise: RSVP.reject(new Error('rejectedPromise')),
+ anotherRejectedPromise: RSVP.reject(new Error('anotherRejectedPromise')),
+ };
+
+ RSVP.hash(promises).then(function(hash){
+ // Code here never runs because there are rejected promises!
+ }, function(reason) {
+ // reason.message === 'rejectedPromise'
+ });
+ ```
+
+ An important note: `RSVP.hash` is intended for plain JavaScript objects that
+ are just a set of keys and values. `RSVP.hash` will NOT preserve prototype
+ chains.
+
+ Example:
+
+ ```javascript
+ function MyConstructor(){
+ this.example = RSVP.resolve('Example');
+ }
+
+ MyConstructor.prototype = {
+ protoProperty: RSVP.resolve('Proto Property')
+ };
+
+ var myObject = new MyConstructor();
+
+ RSVP.hash(myObject).then(function(hash){
+ // protoProperty will not be present, instead you will just have an
+ // object that looks like:
+ // {
+ // example: 'Example'
+ // }
+ //
+ // hash.hasOwnProperty('protoProperty'); // false
+ // 'undefined' === typeof hash.protoProperty
+ });
+ ```
+
+ @method hash
+ @static
+ @for RSVP
+ @param {Object} object
+ @param {String} label optional string that describes the promise.
+ Useful for tooling.
+ @return {Promise} promise that is fulfilled when all properties of `promises`
+ have been fulfilled, or rejected if any of them become rejected.
+ */
+
+ function hash(object, label) {
+ return new _rsvpPromiseHash.default(_rsvpPromise.default, object, label).promise;
+ }
+});
+enifed('rsvp/instrument', ['exports', 'rsvp/config', 'rsvp/utils'], function (exports, _rsvpConfig, _rsvpUtils) {
+ 'use strict';
+
+ exports.default = instrument;
+
+ var queue = [];
+
+ function scheduleFlush() {
+ setTimeout(function () {
+ var entry;
+ for (var i = 0; i < queue.length; i++) {
+ entry = queue[i];
+
+ var payload = entry.payload;
+
+ payload.guid = payload.key + payload.id;
+ payload.childGuid = payload.key + payload.childId;
+ if (payload.error) {
+ payload.stack = payload.error.stack;
+ }
+
+ _rsvpConfig.config['trigger'](entry.name, entry.payload);
+ }
+ queue.length = 0;
+ }, 50);
+ }
+
+ function instrument(eventName, promise, child) {
+ if (1 === queue.push({
+ name: eventName,
+ payload: {
+ key: promise._guidKey,
+ id: promise._id,
+ eventName: eventName,
+ detail: promise._result,
+ childId: child && child._id,
+ label: promise._label,
+ timeStamp: _rsvpUtils.now(),
+ error: _rsvpConfig.config["instrument-with-stack"] ? new Error(promise._label) : null
+ } })) {
+ scheduleFlush();
+ }
+ }
+});
+enifed('rsvp/map', ['exports', 'rsvp/promise', 'rsvp/utils'], function (exports, _rsvpPromise, _rsvpUtils) {
+ 'use strict';
+
+ exports.default = map;
+
+ /**
+ `RSVP.map` is similar to JavaScript's native `map` method, except that it
+ waits for all promises to become fulfilled before running the `mapFn` on
+ each item in given to `promises`. `RSVP.map` returns a promise that will
+ become fulfilled with the result of running `mapFn` on the values the promises
+ become fulfilled with.
+
+ For example:
+
+ ```javascript
+
+ var promise1 = RSVP.resolve(1);
+ var promise2 = RSVP.resolve(2);
+ var promise3 = RSVP.resolve(3);
+ var promises = [ promise1, promise2, promise3 ];
+
+ var mapFn = function(item){
+ return item + 1;
+ };
+
+ RSVP.map(promises, mapFn).then(function(result){
+ // result is [ 2, 3, 4 ]
+ });
+ ```
+
+ If any of the `promises` given to `RSVP.map` are rejected, the first promise
+ that is rejected will be given as an argument to the returned promise's
+ rejection handler. For example:
+
+ ```javascript
+ var promise1 = RSVP.resolve(1);
+ var promise2 = RSVP.reject(new Error('2'));
+ var promise3 = RSVP.reject(new Error('3'));
+ var promises = [ promise1, promise2, promise3 ];
+
+ var mapFn = function(item){
+ return item + 1;
+ };
+
+ RSVP.map(promises, mapFn).then(function(array){
+ // Code here never runs because there are rejected promises!
+ }, function(reason) {
+ // reason.message === '2'
+ });
+ ```
+
+ `RSVP.map` will also wait if a promise is returned from `mapFn`. For example,
+ say you want to get all comments from a set of blog posts, but you need
+ the blog posts first because they contain a url to those comments.
+
+ ```javscript
+
+ var mapFn = function(blogPost){
+ // getComments does some ajax and returns an RSVP.Promise that is fulfilled
+ // with some comments data
+ return getComments(blogPost.comments_url);
+ };
+
+ // getBlogPosts does some ajax and returns an RSVP.Promise that is fulfilled
+ // with some blog post data
+ RSVP.map(getBlogPosts(), mapFn).then(function(comments){
+ // comments is the result of asking the server for the comments
+ // of all blog posts returned from getBlogPosts()
+ });
+ ```
+
+ @method map
+ @static
+ @for RSVP
+ @param {Array} promises
+ @param {Function} mapFn function to be called on each fulfilled promise.
+ @param {String} label optional string for labeling the promise.
+ Useful for tooling.
+ @return {Promise} promise that is fulfilled with the result of calling
+ `mapFn` on each fulfilled promise or value when they become fulfilled.
+ The promise will be rejected if any of the given `promises` become rejected.
+ @static
+ */
+
+ function map(promises, mapFn, label) {
+ return _rsvpPromise.default.all(promises, label).then(function (values) {
+ if (!_rsvpUtils.isFunction(mapFn)) {
+ throw new TypeError("You must pass a function as map's second argument.");
+ }
+
+ var length = values.length;
+ var results = new Array(length);
+
+ for (var i = 0; i < length; i++) {
+ results[i] = mapFn(values[i]);
+ }
+
+ return _rsvpPromise.default.all(results, label);
+ });
+ }
+});
+enifed('rsvp/node', ['exports', 'rsvp/promise', 'rsvp/-internal', 'rsvp/utils'], function (exports, _rsvpPromise, _rsvpInternal, _rsvpUtils) {
+ 'use strict';
+
+ exports.default = denodeify;
+
+ function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
+
+ function Result() {
+ this.value = undefined;
+ }
+
+ var ERROR = new Result();
+ var GET_THEN_ERROR = new Result();
+
+ function getThen(obj) {
+ try {
+ return obj.then;
+ } catch (error) {
+ ERROR.value = error;
+ return ERROR;
+ }
+ }
+
+ function tryApply(f, s, a) {
+ try {
+ f.apply(s, a);
+ } catch (error) {
+ ERROR.value = error;
+ return ERROR;
+ }
+ }
+
+ function makeObject(_, argumentNames) {
+ var obj = {};
+ var name;
+ var i;
+ var length = _.length;
+ var args = new Array(length);
+
+ for (var x = 0; x < length; x++) {
+ args[x] = _[x];
+ }
+
+ for (i = 0; i < argumentNames.length; i++) {
+ name = argumentNames[i];
+ obj[name] = args[i + 1];
+ }
+
+ return obj;
+ }
+
+ function arrayResult(_) {
+ var length = _.length;
+ var args = new Array(length - 1);
+
+ for (var i = 1; i < length; i++) {
+ args[i - 1] = _[i];
+ }
+
+ return args;
+ }
+
+ function wrapThenable(then, promise) {
+ return {
+ then: function (onFulFillment, onRejection) {
+ return then.call(promise, onFulFillment, onRejection);
+ }
+ };
+ }
+
+ /**
+ `RSVP.denodeify` takes a 'node-style' function and returns a function that
+ will return an `RSVP.Promise`. You can use `denodeify` in Node.js or the
+ browser when you'd prefer to use promises over using callbacks. For example,
+ `denodeify` transforms the following:
+
+ ```javascript
+ var fs = require('fs');
+
+ fs.readFile('myfile.txt', function(err, data){
+ if (err) return handleError(err);
+ handleData(data);
+ });
+ ```
+
+ into:
+
+ ```javascript
+ var fs = require('fs');
+ var readFile = RSVP.denodeify(fs.readFile);
+
+ readFile('myfile.txt').then(handleData, handleError);
+ ```
+
+ If the node function has multiple success parameters, then `denodeify`
+ just returns the first one:
+
+ ```javascript
+ var request = RSVP.denodeify(require('request'));
+
+ request('http://example.com').then(function(res) {
+ // ...
+ });
+ ```
+
+ However, if you need all success parameters, setting `denodeify`'s
+ second parameter to `true` causes it to return all success parameters
+ as an array:
+
+ ```javascript
+ var request = RSVP.denodeify(require('request'), true);
+
+ request('http://example.com').then(function(result) {
+ // result[0] -> res
+ // result[1] -> body
+ });
+ ```
+
+ Or if you pass it an array with names it returns the parameters as a hash:
+
+ ```javascript
+ var request = RSVP.denodeify(require('request'), ['res', 'body']);
+
+ request('http://example.com').then(function(result) {
+ // result.res
+ // result.body
+ });
+ ```
+
+ Sometimes you need to retain the `this`:
+
+ ```javascript
+ var app = require('express')();
+ var render = RSVP.denodeify(app.render.bind(app));
+ ```
+
+ The denodified function inherits from the original function. It works in all
+ environments, except IE 10 and below. Consequently all properties of the original
+ function are available to you. However, any properties you change on the
+ denodeified function won't be changed on the original function. Example:
+
+ ```javascript
+ var request = RSVP.denodeify(require('request')),
+ cookieJar = request.jar(); // <- Inheritance is used here
+
+ request('http://example.com', {jar: cookieJar}).then(function(res) {
+ // cookieJar.cookies holds now the cookies returned by example.com
+ });
+ ```
+
+ Using `denodeify` makes it easier to compose asynchronous operations instead
+ of using callbacks. For example, instead of:
+
+ ```javascript
+ var fs = require('fs');
+
+ fs.readFile('myfile.txt', function(err, data){
+ if (err) { ... } // Handle error
+ fs.writeFile('myfile2.txt', data, function(err){
+ if (err) { ... } // Handle error
+ console.log('done')
+ });
+ });
+ ```
+
+ you can chain the operations together using `then` from the returned promise:
+
+ ```javascript
+ var fs = require('fs');
+ var readFile = RSVP.denodeify(fs.readFile);
+ var writeFile = RSVP.denodeify(fs.writeFile);
+
+ readFile('myfile.txt').then(function(data){
+ return writeFile('myfile2.txt', data);
+ }).then(function(){
+ console.log('done')
+ }).catch(function(error){
+ // Handle error
+ });
+ ```
+
+ @method denodeify
+ @static
+ @for RSVP
+ @param {Function} nodeFunc a 'node-style' function that takes a callback as
+ its last argument. The callback expects an error to be passed as its first
+ argument (if an error occurred, otherwise null), and the value from the
+ operation as its second argument ('function(err, value){ }').
+ @param {Boolean|Array} [options] An optional paramter that if set
+ to `true` causes the promise to fulfill with the callback's success arguments
+ as an array. This is useful if the node function has multiple success
+ paramters. If you set this paramter to an array with names, the promise will
+ fulfill with a hash with these names as keys and the success parameters as
+ values.
+ @return {Function} a function that wraps `nodeFunc` to return an
+ `RSVP.Promise`
+ @static
+ */
+
+ function denodeify(nodeFunc, options) {
+ var fn = function () {
+ var self = this;
+ var l = arguments.length;
+ var args = new Array(l + 1);
+ var arg;
+ var promiseInput = false;
+
+ for (var i = 0; i < l; ++i) {
+ arg = arguments[i];
+
+ if (!promiseInput) {
+ // TODO: clean this up
+ promiseInput = needsPromiseInput(arg);
+ if (promiseInput === GET_THEN_ERROR) {
+ var p = new _rsvpPromise.default(_rsvpInternal.noop);
+ _rsvpInternal.reject(p, GET_THEN_ERROR.value);
+ return p;
+ } else if (promiseInput && promiseInput !== true) {
+ arg = wrapThenable(promiseInput, arg);
+ }
+ }
+ args[i] = arg;
+ }
+
+ var promise = new _rsvpPromise.default(_rsvpInternal.noop);
+
+ args[l] = function (err, val) {
+ if (err) _rsvpInternal.reject(promise, err);else if (options === undefined) _rsvpInternal.resolve(promise, val);else if (options === true) _rsvpInternal.resolve(promise, arrayResult(arguments));else if (_rsvpUtils.isArray(options)) _rsvpInternal.resolve(promise, makeObject(arguments, options));else _rsvpInternal.resolve(promise, val);
+ };
+
+ if (promiseInput) {
+ return handlePromiseInput(promise, args, nodeFunc, self);
+ } else {
+ return handleValueInput(promise, args, nodeFunc, self);
+ }
+ };
+
+ _defaults(fn, nodeFunc);
+
+ return fn;
+ }
+
+ function handleValueInput(promise, args, nodeFunc, self) {
+ var result = tryApply(nodeFunc, self, args);
+ if (result === ERROR) {
+ _rsvpInternal.reject(promise, result.value);
+ }
+ return promise;
+ }
+
+ function handlePromiseInput(promise, args, nodeFunc, self) {
+ return _rsvpPromise.default.all(args).then(function (args) {
+ var result = tryApply(nodeFunc, self, args);
+ if (result === ERROR) {
+ _rsvpInternal.reject(promise, result.value);
+ }
+ return promise;
+ });
+ }
+
+ function needsPromiseInput(arg) {
+ if (arg && typeof arg === 'object') {
+ if (arg.constructor === _rsvpPromise.default) {
+ return true;
+ } else {
+ return getThen(arg);
+ }
+ } else {
+ return false;
+ }
+ }
+});
+enifed('rsvp/platform', ['exports'], function (exports) {
+ 'use strict';
+
+ var platform;
+
+ /* global self */
+ if (typeof self === 'object') {
+ platform = self;
+
+ /* global global */
+ } else if (typeof global === 'object') {
+ platform = global;
+ } else {
+ throw new Error('no global: `self` or `global` found');
+ }
+
+ exports.default = platform;
+});
+enifed('rsvp/promise/all', ['exports', 'rsvp/enumerator'], function (exports, _rsvpEnumerator) {
+ 'use strict';
+
+ exports.default = all;
+
+ /**
+ `RSVP.Promise.all` accepts an array of promises, and returns a new promise which
+ is fulfilled with an array of fulfillment values for the passed promises, or
+ rejected with the reason of the first passed promise to be rejected. It casts all
+ elements of the passed iterable to promises as it runs this algorithm.
+
+ Example:
+
+ ```javascript
+ var promise1 = RSVP.resolve(1);
+ var promise2 = RSVP.resolve(2);
+ var promise3 = RSVP.resolve(3);
+ var promises = [ promise1, promise2, promise3 ];
+
+ RSVP.Promise.all(promises).then(function(array){
+ // The array here would be [ 1, 2, 3 ];
+ });
+ ```
+
+ If any of the `promises` given to `RSVP.all` are rejected, the first promise
+ that is rejected will be given as an argument to the returned promises's
+ rejection handler. For example:
+
+ Example:
+
+ ```javascript
+ var promise1 = RSVP.resolve(1);
+ var promise2 = RSVP.reject(new Error("2"));
+ var promise3 = RSVP.reject(new Error("3"));
+ var promises = [ promise1, promise2, promise3 ];
+
+ RSVP.Promise.all(promises).then(function(array){
+ // Code here never runs because there are rejected promises!
+ }, function(error) {
+ // error.message === "2"
+ });
+ ```
+
+ @method all
+ @static
+ @param {Array} entries array of promises
+ @param {String} label optional string for labeling the promise.
+ Useful for tooling.
+ @return {Promise} promise that is fulfilled when all `promises` have been
+ fulfilled, or rejected if any of them become rejected.
+ @static
+ */
+
+ function all(entries, label) {
+ return new _rsvpEnumerator.default(this, entries, true, /* abort on reject */label).promise;
+ }
+});
+enifed('rsvp/promise/race', ['exports', 'rsvp/utils', 'rsvp/-internal'], function (exports, _rsvpUtils, _rsvpInternal) {
+ 'use strict';
+
+ exports.default = race;
+
+ /**
+ `RSVP.Promise.race` returns a new promise which is settled in the same way as the
+ first passed promise to settle.
+
+ Example:
+
+ ```javascript
+ var promise1 = new RSVP.Promise(function(resolve, reject){
+ setTimeout(function(){
+ resolve('promise 1');
+ }, 200);
+ });
+
+ var promise2 = new RSVP.Promise(function(resolve, reject){
+ setTimeout(function(){
+ resolve('promise 2');
+ }, 100);
+ });
+
+ RSVP.Promise.race([promise1, promise2]).then(function(result){
+ // result === 'promise 2' because it was resolved before promise1
+ // was resolved.
+ });
+ ```
+
+ `RSVP.Promise.race` is deterministic in that only the state of the first
+ settled promise matters. For example, even if other promises given to the
+ `promises` array argument are resolved, but the first settled promise has
+ become rejected before the other promises became fulfilled, the returned
+ promise will become rejected:
+
+ ```javascript
+ var promise1 = new RSVP.Promise(function(resolve, reject){
+ setTimeout(function(){
+ resolve('promise 1');
+ }, 200);
+ });
+
+ var promise2 = new RSVP.Promise(function(resolve, reject){
+ setTimeout(function(){
+ reject(new Error('promise 2'));
+ }, 100);
+ });
+
+ RSVP.Promise.race([promise1, promise2]).then(function(result){
+ // Code here never runs
+ }, function(reason){
+ // reason.message === 'promise 2' because promise 2 became rejected before
+ // promise 1 became fulfilled
+ });
+ ```
+
+ An example real-world use case is implementing timeouts:
+
+ ```javascript
+ RSVP.Promise.race([ajax('foo.json'), timeout(5000)])
+ ```
+
+ @method race
+ @static
+ @param {Array} entries array of promises to observe
+ @param {String} label optional string for describing the promise returned.
+ Useful for tooling.
+ @return {Promise} a promise which settles in the same way as the first passed
+ promise to settle.
+ */
+
+ function race(entries, label) {
+ /*jshint validthis:true */
+ var Constructor = this;
+
+ var promise = new Constructor(_rsvpInternal.noop, label);
+
+ if (!_rsvpUtils.isArray(entries)) {
+ _rsvpInternal.reject(promise, new TypeError('You must pass an array to race.'));
+ return promise;
+ }
+
+ var length = entries.length;
+
+ function onFulfillment(value) {
+ _rsvpInternal.resolve(promise, value);
+ }
+
+ function onRejection(reason) {
+ _rsvpInternal.reject(promise, reason);
+ }
+
+ for (var i = 0; promise._state === _rsvpInternal.PENDING && i < length; i++) {
+ _rsvpInternal.subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection);
+ }
+
+ return promise;
+ }
+});
+enifed('rsvp/promise/reject', ['exports', 'rsvp/-internal'], function (exports, _rsvpInternal) {
+ 'use strict';
+
+ exports.default = reject;
+
+ /**
+ `RSVP.Promise.reject` returns a promise rejected with the passed `reason`.
+ It is shorthand for the following:
+
+ ```javascript
+ var promise = new RSVP.Promise(function(resolve, reject){
+ reject(new Error('WHOOPS'));
+ });
+
+ promise.then(function(value){
+ // Code here doesn't run because the promise is rejected!
+ }, function(reason){
+ // reason.message === 'WHOOPS'
+ });
+ ```
+
+ Instead of writing the above, your code now simply becomes the following:
+
+ ```javascript
+ var promise = RSVP.Promise.reject(new Error('WHOOPS'));
+
+ promise.then(function(value){
+ // Code here doesn't run because the promise is rejected!
+ }, function(reason){
+ // reason.message === 'WHOOPS'
+ });
+ ```
+
+ @method reject
+ @static
+ @param {*} reason value that the returned promise will be rejected with.
+ @param {String} label optional string for identifying the returned promise.
+ Useful for tooling.
+ @return {Promise} a promise rejected with the given `reason`.
+ */
+
+ function reject(reason, label) {
+ /*jshint validthis:true */
+ var Constructor = this;
+ var promise = new Constructor(_rsvpInternal.noop, label);
+ _rsvpInternal.reject(promise, reason);
+ return promise;
+ }
+});
+enifed('rsvp/promise/resolve', ['exports', 'rsvp/-internal'], function (exports, _rsvpInternal) {
+ 'use strict';
+
+ exports.default = resolve;
+
+ /**
+ `RSVP.Promise.resolve` returns a promise that will become resolved with the
+ passed `value`. It is shorthand for the following:
+
+ ```javascript
+ var promise = new RSVP.Promise(function(resolve, reject){
+ resolve(1);
+ });
+
+ promise.then(function(value){
+ // value === 1
+ });
+ ```
+
+ Instead of writing the above, your code now simply becomes the following:
+
+ ```javascript
+ var promise = RSVP.Promise.resolve(1);
+
+ promise.then(function(value){
+ // value === 1
+ });
+ ```
+
+ @method resolve
+ @static
+ @param {*} object value that the returned promise will be resolved with
+ @param {String} label optional string for identifying the returned promise.
+ Useful for tooling.
+ @return {Promise} a promise that will become fulfilled with the given
+ `value`
+ */
+
+ function resolve(object, label) {
+ /*jshint validthis:true */
+ var Constructor = this;
+
+ if (object && typeof object === 'object' && object.constructor === Constructor) {
+ return object;
+ }
+
+ var promise = new Constructor(_rsvpInternal.noop, label);
+ _rsvpInternal.resolve(promise, object);
+ return promise;
+ }
+});
+enifed('rsvp/promise-hash', ['exports', 'rsvp/enumerator', 'rsvp/-internal', 'rsvp/utils'], function (exports, _rsvpEnumerator, _rsvpInternal, _rsvpUtils) {
+ 'use strict';
+
+ function PromiseHash(Constructor, object, label) {
+ this._superConstructor(Constructor, object, true, label);
+ }
+
+ exports.default = PromiseHash;
+
+ PromiseHash.prototype = _rsvpUtils.o_create(_rsvpEnumerator.default.prototype);
+ PromiseHash.prototype._superConstructor = _rsvpEnumerator.default;
+ PromiseHash.prototype._init = function () {
+ this._result = {};
+ };
+
+ PromiseHash.prototype._validateInput = function (input) {
+ return input && typeof input === 'object';
+ };
+
+ PromiseHash.prototype._validationError = function () {
+ return new Error('Promise.hash must be called with an object');
+ };
+
+ PromiseHash.prototype._enumerate = function () {
+ var enumerator = this;
+ var promise = enumerator.promise;
+ var input = enumerator._input;
+ var results = [];
+
+ for (var key in input) {
+ if (promise._state === _rsvpInternal.PENDING && Object.prototype.hasOwnProperty.call(input, key)) {
+ results.push({
+ position: key,
+ entry: input[key]
+ });
+ }
+ }
+
+ var length = results.length;
+ enumerator._remaining = length;
+ var result;
+
+ for (var i = 0; promise._state === _rsvpInternal.PENDING && i < length; i++) {
+ result = results[i];
+ enumerator._eachEntry(result.entry, result.position);
+ }
+ };
+});
+enifed('rsvp/promise', ['exports', 'rsvp/config', 'rsvp/instrument', 'rsvp/utils', 'rsvp/-internal', 'rsvp/promise/all', 'rsvp/promise/race', 'rsvp/promise/resolve', 'rsvp/promise/reject'], function (exports, _rsvpConfig, _rsvpInstrument, _rsvpUtils, _rsvpInternal, _rsvpPromiseAll, _rsvpPromiseRace, _rsvpPromiseResolve, _rsvpPromiseReject) {
+ 'use strict';
+
+ exports.default = Promise;
+
+ var guidKey = 'rsvp_' + _rsvpUtils.now() + '-';
+ var counter = 0;
+
+ function needsResolver() {
+ throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
+ }
+
+ function needsNew() {
+ throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
+ }
+
+ /**
+ Promise objects represent the eventual result of an asynchronous operation. The
+ primary way of interacting with a promise is through its `then` method, which
+ registers callbacks to receive either a promise’s eventual value or the reason
+ why the promise cannot be fulfilled.
+
+ Terminology
+ -----------
+
+ - `promise` is an object or function with a `then` method whose behavior conforms to this specification.
+ - `thenable` is an object or function that defines a `then` method.
+ - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
+ - `exception` is a value that is thrown using the throw statement.
+ - `reason` is a value that indicates why a promise was rejected.
+ - `settled` the final resting state of a promise, fulfilled or rejected.
+
+ A promise can be in one of three states: pending, fulfilled, or rejected.
+
+ Promises that are fulfilled have a fulfillment value and are in the fulfilled
+ state. Promises that are rejected have a rejection reason and are in the
+ rejected state. A fulfillment value is never a thenable.
+
+ Promises can also be said to *resolve* a value. If this value is also a
+ promise, then the original promise's settled state will match the value's
+ settled state. So a promise that *resolves* a promise that rejects will
+ itself reject, and a promise that *resolves* a promise that fulfills will
+ itself fulfill.
+
+
+ Basic Usage:
+ ------------
+
+ ```js
+ var promise = new Promise(function(resolve, reject) {
+ // on success
+ resolve(value);
+
+ // on failure
+ reject(reason);
+ });
+
+ promise.then(function(value) {
+ // on fulfillment
+ }, function(reason) {
+ // on rejection
+ });
+ ```
+
+ Advanced Usage:
+ ---------------
+
+ Promises shine when abstracting away asynchronous interactions such as
+ `XMLHttpRequest`s.
+
+ ```js
+ function getJSON(url) {
+ return new Promise(function(resolve, reject){
+ var xhr = new XMLHttpRequest();
+
+ xhr.open('GET', url);
+ xhr.onreadystatechange = handler;
+ xhr.responseType = 'json';
+ xhr.setRequestHeader('Accept', 'application/json');
+ xhr.send();
+
+ function handler() {
+ if (this.readyState === this.DONE) {
+ if (this.status === 200) {
+ resolve(this.response);
+ } else {
+ reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
+ }
+ }
+ };
+ });
+ }
+
+ getJSON('/posts.json').then(function(json) {
+ // on fulfillment
+ }, function(reason) {
+ // on rejection
+ });
+ ```
+
+ Unlike callbacks, promises are great composable primitives.
+
+ ```js
+ Promise.all([
+ getJSON('/posts'),
+ getJSON('/comments')
+ ]).then(function(values){
+ values[0] // => postsJSON
+ values[1] // => commentsJSON
+
+ return values;
+ });
+ ```
+
+ @class RSVP.Promise
+ @param {function} resolver
+ @param {String} label optional string for labeling the promise.
+ Useful for tooling.
+ @constructor
+ */
+
+ function Promise(resolver, label) {
+ var promise = this;
+
+ promise._id = counter++;
+ promise._label = label;
+ promise._state = undefined;
+ promise._result = undefined;
+ promise._subscribers = [];
+
+ if (_rsvpConfig.config.instrument) {
+ _rsvpInstrument.default('created', promise);
+ }
+
+ if (_rsvpInternal.noop !== resolver) {
+ if (!_rsvpUtils.isFunction(resolver)) {
+ needsResolver();
+ }
+
+ if (!(promise instanceof Promise)) {
+ needsNew();
+ }
+
+ _rsvpInternal.initializePromise(promise, resolver);
+ }
+ }
+
+ Promise.cast = _rsvpPromiseResolve.default; // deprecated
+ Promise.all = _rsvpPromiseAll.default;
+ Promise.race = _rsvpPromiseRace.default;
+ Promise.resolve = _rsvpPromiseResolve.default;
+ Promise.reject = _rsvpPromiseReject.default;
+
+ Promise.prototype = {
+ constructor: Promise,
+
+ _guidKey: guidKey,
+
+ _onError: function (reason) {
+ var promise = this;
+ _rsvpConfig.config.after(function () {
+ if (promise._onError) {
+ _rsvpConfig.config['trigger']('error', reason);
+ }
+ });
+ },
+
+ /**
+ The primary way of interacting with a promise is through its `then` method,
+ which registers callbacks to receive either a promise's eventual value or the
+ reason why the promise cannot be fulfilled.
+
+ ```js
+ findUser().then(function(user){
+ // user is available
+ }, function(reason){
+ // user is unavailable, and you are given the reason why
+ });
+ ```
+
+ Chaining
+ --------
+
+ The return value of `then` is itself a promise. This second, 'downstream'
+ promise is resolved with the return value of the first promise's fulfillment
+ or rejection handler, or rejected if the handler throws an exception.
+
+ ```js
+ findUser().then(function (user) {
+ return user.name;
+ }, function (reason) {
+ return 'default name';
+ }).then(function (userName) {
+ // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
+ // will be `'default name'`
+ });
+
+ findUser().then(function (user) {
+ throw new Error('Found user, but still unhappy');
+ }, function (reason) {
+ throw new Error('`findUser` rejected and we're unhappy');
+ }).then(function (value) {
+ // never reached
+ }, function (reason) {
+ // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
+ // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.
+ });
+ ```
+ If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
+
+ ```js
+ findUser().then(function (user) {
+ throw new PedagogicalException('Upstream error');
+ }).then(function (value) {
+ // never reached
+ }).then(function (value) {
+ // never reached
+ }, function (reason) {
+ // The `PedgagocialException` is propagated all the way down to here
+ });
+ ```
+
+ Assimilation
+ ------------
+
+ Sometimes the value you want to propagate to a downstream promise can only be
+ retrieved asynchronously. This can be achieved by returning a promise in the
+ fulfillment or rejection handler. The downstream promise will then be pending
+ until the returned promise is settled. This is called *assimilation*.
+
+ ```js
+ findUser().then(function (user) {
+ return findCommentsByAuthor(user);
+ }).then(function (comments) {
+ // The user's comments are now available
+ });
+ ```
+
+ If the assimliated promise rejects, then the downstream promise will also reject.
+
+ ```js
+ findUser().then(function (user) {
+ return findCommentsByAuthor(user);
+ }).then(function (comments) {
+ // If `findCommentsByAuthor` fulfills, we'll have the value here
+ }, function (reason) {
+ // If `findCommentsByAuthor` rejects, we'll have the reason here
+ });
+ ```
+
+ Simple Example
+ --------------
+
+ Synchronous Example
+
+ ```javascript
+ var result;
+
+ try {
+ result = findResult();
+ // success
+ } catch(reason) {
+ // failure
+ }
+ ```
+
+ Errback Example
+
+ ```js
+ findResult(function(result, err){
+ if (err) {
+ // failure
+ } else {
+ // success
+ }
+ });
+ ```
+
+ Promise Example;
+
+ ```javascript
+ findResult().then(function(result){
+ // success
+ }, function(reason){
+ // failure
+ });
+ ```
+
+ Advanced Example
+ --------------
+
+ Synchronous Example
+
+ ```javascript
+ var author, books;
+
+ try {
+ author = findAuthor();
+ books = findBooksByAuthor(author);
+ // success
+ } catch(reason) {
+ // failure
+ }
+ ```
+
+ Errback Example
+
+ ```js
+
+ function foundBooks(books) {
+
+ }
+
+ function failure(reason) {
+
+ }
+
+ findAuthor(function(author, err){
+ if (err) {
+ failure(err);
+ // failure
+ } else {
+ try {
+ findBoooksByAuthor(author, function(books, err) {
+ if (err) {
+ failure(err);
+ } else {
+ try {
+ foundBooks(books);
+ } catch(reason) {
+ failure(reason);
+ }
+ }
+ });
+ } catch(error) {
+ failure(err);
+ }
+ // success
+ }
+ });
+ ```
+
+ Promise Example;
+
+ ```javascript
+ findAuthor().
+ then(findBooksByAuthor).
+ then(function(books){
+ // found books
+ }).catch(function(reason){
+ // something went wrong
+ });
+ ```
+
+ @method then
+ @param {Function} onFulfillment
+ @param {Function} onRejection
+ @param {String} label optional string for labeling the promise.
+ Useful for tooling.
+ @return {Promise}
+ */
+ then: function (onFulfillment, onRejection, label) {
+ var parent = this;
+ var state = parent._state;
+
+ if (state === _rsvpInternal.FULFILLED && !onFulfillment || state === _rsvpInternal.REJECTED && !onRejection) {
+ if (_rsvpConfig.config.instrument) {
+ _rsvpInstrument.default('chained', parent, parent);
+ }
+ return parent;
+ }
+
+ parent._onError = null;
+
+ var child = new parent.constructor(_rsvpInternal.noop, label);
+ var result = parent._result;
+
+ if (_rsvpConfig.config.instrument) {
+ _rsvpInstrument.default('chained', parent, child);
+ }
+
+ if (state) {
+ var callback = arguments[state - 1];
+ _rsvpConfig.config.async(function () {
+ _rsvpInternal.invokeCallback(state, child, callback, result);
+ });
+ } else {
+ _rsvpInternal.subscribe(parent, child, onFulfillment, onRejection);
+ }
+
+ return child;
+ },
+
+ /**
+ `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
+ as the catch block of a try/catch statement.
+
+ ```js
+ function findAuthor(){
+ throw new Error('couldn't find that author');
+ }
+
+ // synchronous
+ try {
+ findAuthor();
+ } catch(reason) {
+ // something went wrong
+ }
+
+ // async with promises
+ findAuthor().catch(function(reason){
+ // something went wrong
+ });
+ ```
+
+ @method catch
+ @param {Function} onRejection
+ @param {String} label optional string for labeling the promise.
+ Useful for tooling.
+ @return {Promise}
+ */
+ 'catch': function (onRejection, label) {
+ return this.then(undefined, onRejection, label);
+ },
+
+ /**
+ `finally` will be invoked regardless of the promise's fate just as native
+ try/catch/finally behaves
+
+ Synchronous example:
+
+ ```js
+ findAuthor() {
+ if (Math.random() > 0.5) {
+ throw new Error();
+ }
+ return new Author();
+ }
+
+ try {
+ return findAuthor(); // succeed or fail
+ } catch(error) {
+ return findOtherAuther();
+ } finally {
+ // always runs
+ // doesn't affect the return value
+ }
+ ```
+
+ Asynchronous example:
+
+ ```js
+ findAuthor().catch(function(reason){
+ return findOtherAuther();
+ }).finally(function(){
+ // author was either found, or not
+ });
+ ```
+
+ @method finally
+ @param {Function} callback
+ @param {String} label optional string for labeling the promise.
+ Useful for tooling.
+ @return {Promise}
+ */
+ 'finally': function (callback, label) {
+ var promise = this;
+ var constructor = promise.constructor;
+
+ return promise.then(function (value) {
+ return constructor.resolve(callback()).then(function () {
+ return value;
+ });
+ }, function (reason) {
+ return constructor.resolve(callback()).then(function () {
+ throw reason;
+ });
+ }, label);
+ }
+ };
+});
+enifed('rsvp/race', ['exports', 'rsvp/promise'], function (exports, _rsvpPromise) {
+ 'use strict';
+
+ exports.default = race;
+
+ /**
+ This is a convenient alias for `RSVP.Promise.race`.
+
+ @method race
+ @static
+ @for RSVP
+ @param {Array} array Array of promises.
+ @param {String} label An optional label. This is useful
+ for tooling.
+ */
+
+ function race(array, label) {
+ return _rsvpPromise.default.race(array, label);
+ }
+});
+enifed('rsvp/reject', ['exports', 'rsvp/promise'], function (exports, _rsvpPromise) {
+ 'use strict';
+
+ exports.default = reject;
+
+ /**
+ This is a convenient alias for `RSVP.Promise.reject`.
+
+ @method reject
+ @static
+ @for RSVP
+ @param {*} reason value that the returned promise will be rejected with.
+ @param {String} label optional string for identifying the returned promise.
+ Useful for tooling.
+ @return {Promise} a promise rejected with the given `reason`.
+ */
+
+ function reject(reason, label) {
+ return _rsvpPromise.default.reject(reason, label);
+ }
+});
+enifed('rsvp/resolve', ['exports', 'rsvp/promise'], function (exports, _rsvpPromise) {
+ 'use strict';
+
+ exports.default = resolve;
+
+ /**
+ This is a convenient alias for `RSVP.Promise.resolve`.
+
+ @method resolve
+ @static
+ @for RSVP
+ @param {*} value value that the returned promise will be resolved with
+ @param {String} label optional string for identifying the returned promise.
+ Useful for tooling.
+ @return {Promise} a promise that will become fulfilled with the given
+ `value`
+ */
+
+ function resolve(value, label) {
+ return _rsvpPromise.default.resolve(value, label);
+ }
+});
+enifed("rsvp/rethrow", ["exports"], function (exports) {
+ /**
+ `RSVP.rethrow` will rethrow an error on the next turn of the JavaScript event
+ loop in order to aid debugging.
+
+ Promises A+ specifies that any exceptions that occur with a promise must be
+ caught by the promises implementation and bubbled to the last handler. For
+ this reason, it is recommended that you always specify a second rejection
+ handler function to `then`. However, `RSVP.rethrow` will throw the exception
+ outside of the promise, so it bubbles up to your console if in the browser,
+ or domain/cause uncaught exception in Node. `rethrow` will also throw the
+ error again so the error can be handled by the promise per the spec.
+
+ ```javascript
+ function throws(){
+ throw new Error('Whoops!');
+ }
+
+ var promise = new RSVP.Promise(function(resolve, reject){
+ throws();
+ });
+
+ promise.catch(RSVP.rethrow).then(function(){
+ // Code here doesn't run because the promise became rejected due to an
+ // error!
+ }, function (err){
+ // handle the error here
+ });
+ ```
+
+ The 'Whoops' error will be thrown on the next turn of the event loop
+ and you can watch for it in your console. You can also handle it using a
+ rejection handler given to `.then` or `.catch` on the returned promise.
+
+ @method rethrow
+ @static
+ @for RSVP
+ @param {Error} reason reason the promise became rejected.
+ @throws Error
+ @static
+ */
+ "use strict";
+
+ exports.default = rethrow;
+
+ function rethrow(reason) {
+ setTimeout(function () {
+ throw reason;
+ });
+ throw reason;
+ }
+});
+enifed('rsvp/utils', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.objectOrFunction = objectOrFunction;
+ exports.isFunction = isFunction;
+ exports.isMaybeThenable = isMaybeThenable;
+
+ function objectOrFunction(x) {
+ return typeof x === 'function' || typeof x === 'object' && x !== null;
+ }
+
+ function isFunction(x) {
+ return typeof x === 'function';
+ }
+
+ function isMaybeThenable(x) {
+ return typeof x === 'object' && x !== null;
+ }
+
+ var _isArray;
+ if (!Array.isArray) {
+ _isArray = function (x) {
+ return Object.prototype.toString.call(x) === '[object Array]';
+ };
+ } else {
+ _isArray = Array.isArray;
+ }
+
+ var isArray = _isArray;
+
+ exports.isArray = isArray;
+ // Date.now is not available in browsers < IE9
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#Compatibility
+ var now = Date.now || function () {
+ return new Date().getTime();
+ };
+
+ exports.now = now;
+ function F() {}
+
+ var o_create = Object.create || function (o) {
+ if (arguments.length > 1) {
+ throw new Error('Second argument not supported');
+ }
+ if (typeof o !== 'object') {
+ throw new TypeError('Argument must be an object');
+ }
+ F.prototype = o;
+ return new F();
+ };
+ exports.o_create = o_create;
+});
+enifed('rsvp', ['exports', 'rsvp/promise', 'rsvp/events', 'rsvp/node', 'rsvp/all', 'rsvp/all-settled', 'rsvp/race', 'rsvp/hash', 'rsvp/hash-settled', 'rsvp/rethrow', 'rsvp/defer', 'rsvp/config', 'rsvp/map', 'rsvp/resolve', 'rsvp/reject', 'rsvp/filter', 'rsvp/asap'], function (exports, _rsvpPromise, _rsvpEvents, _rsvpNode, _rsvpAll, _rsvpAllSettled, _rsvpRace, _rsvpHash, _rsvpHashSettled, _rsvpRethrow, _rsvpDefer, _rsvpConfig, _rsvpMap, _rsvpResolve, _rsvpReject, _rsvpFilter, _rsvpAsap) {
+ 'use strict';
+
+ // defaults
+ _rsvpConfig.config.async = _rsvpAsap.default;
+ _rsvpConfig.config.after = function (cb) {
+ setTimeout(cb, 0);
+ };
+ var cast = _rsvpResolve.default;
+ function async(callback, arg) {
+ _rsvpConfig.config.async(callback, arg);
+ }
+
+ function on() {
+ _rsvpConfig.config['on'].apply(_rsvpConfig.config, arguments);
+ }
+
+ function off() {
+ _rsvpConfig.config['off'].apply(_rsvpConfig.config, arguments);
+ }
+
+ // Set up instrumentation through `window.__PROMISE_INTRUMENTATION__`
+ if (typeof window !== 'undefined' && typeof window['__PROMISE_INSTRUMENTATION__'] === 'object') {
+ var callbacks = window['__PROMISE_INSTRUMENTATION__'];
+ _rsvpConfig.configure('instrument', true);
+ for (var eventName in callbacks) {
+ if (callbacks.hasOwnProperty(eventName)) {
+ on(eventName, callbacks[eventName]);
+ }
+ }
+ }
+
+ exports.cast = cast;
+ exports.Promise = _rsvpPromise.default;
+ exports.EventTarget = _rsvpEvents.default;
+ exports.all = _rsvpAll.default;
+ exports.allSettled = _rsvpAllSettled.default;
+ exports.race = _rsvpRace.default;
+ exports.hash = _rsvpHash.default;
+ exports.hashSettled = _rsvpHashSettled.default;
+ exports.rethrow = _rsvpRethrow.default;
+ exports.defer = _rsvpDefer.default;
+ exports.denodeify = _rsvpNode.default;
+ exports.configure = _rsvpConfig.configure;
+ exports.on = on;
+ exports.off = off;
+ exports.resolve = _rsvpResolve.default;
+ exports.reject = _rsvpReject.default;
+ exports.async = async;
+ exports.map = _rsvpMap.default;
+ exports.filter = _rsvpFilter.default;
+});
+enifed('rsvp.umd', ['exports', 'rsvp/platform', 'rsvp'], function (exports, _rsvpPlatform, _rsvp) {
+ 'use strict';
+
+ var RSVP = {
+ 'race': _rsvp.race,
+ 'Promise': _rsvp.Promise,
+ 'allSettled': _rsvp.allSettled,
+ 'hash': _rsvp.hash,
+ 'hashSettled': _rsvp.hashSettled,
+ 'denodeify': _rsvp.denodeify,
+ 'on': _rsvp.on,
+ 'off': _rsvp.off,
+ 'map': _rsvp.map,
+ 'filter': _rsvp.filter,
+ 'resolve': _rsvp.resolve,
+ 'reject': _rsvp.reject,
+ 'all': _rsvp.all,
+ 'rethrow': _rsvp.rethrow,
+ 'defer': _rsvp.defer,
+ 'EventTarget': _rsvp.EventTarget,
+ 'configure': _rsvp.configure,
+ 'async': _rsvp.async
+ };
+
+ /* global define:true module:true window: true */
+ if (typeof define === 'function' && define['amd']) {
+ define(function () {
+ return RSVP;
+ });
+ } else if (typeof module !== 'undefined' && module['exports']) {
+ module['exports'] = RSVP;
+ } else if (typeof _rsvpPlatform.default !== 'undefined') {
+ _rsvpPlatform.default['RSVP'] = RSVP;
+ }
+});
+enifed("vertex", ["exports"], function (exports) {
+ /**
+ * DAG Vertex
+ *
+ * @class Vertex
+ * @constructor
+ */
+
+ "use strict";
+
+ exports.default = Vertex;
+
+ function Vertex(name) {
+ this.name = name;
+ this.incoming = {};
+ this.incomingNames = [];
+ this.hasOutgoing = false;
+ this.value = null;
+ }
+});
+enifed("visit", ["exports"], function (exports) {
+ "use strict";
+
+ exports.default = visit;
+
+ function visit(vertex, fn, visited, path) {
+ var name = vertex.name;
+ var vertices = vertex.incoming;
+ var names = vertex.incomingNames;
+ var len = names.length;
+ var i;
+
+ if (!visited) {
+ visited = {};
+ }
+ if (!path) {
+ path = [];
+ }
+ if (visited.hasOwnProperty(name)) {
+ return;
+ }
+ path.push(name);
+ visited[name] = true;
+ for (i = 0; i < len; i++) {
+ visit(vertices[names[i]], fn, visited, path);
+ }
+ fn(vertex, path);
+ path.pop();
+ }
+});
+requireModule("ember");
+
+}());
+
+;(function() {
+/* globals define, Ember, jQuery */
+
+ function processEmberShims() {
+ var shims = {
+ 'ember': {
+ 'default': Ember
+ },
+ 'ember-application': {
+ 'default': Ember.Application
+ },
+ 'ember-array': {
+ 'default': Ember.Array
+ },
+ 'ember-array/mutable': {
+ 'default': Ember.MutableArray
+ },
+ 'ember-array/utils': {
+ 'A': Ember.A,
+ 'isEmberArray': Ember.isArray,
+ 'wrap': Ember.makeArray
+ },
+ 'ember-component': {
+ 'default': Ember.Component
+ },
+ 'ember-components/checkbox': {
+ 'default': Ember.Checkbox
+ },
+ 'ember-components/text-area': {
+ 'default': Ember.TextArea
+ },
+ 'ember-components/text-field': {
+ 'default': Ember.TextField
+ },
+ 'ember-controller': {
+ 'default': Ember.Controller
+ },
+ 'ember-controller/inject': {
+ 'default': Ember.inject.controller
+ },
+ 'ember-controller/proxy': {
+ 'default': Ember.ArrayProxy
+ },
+ 'ember-controllers/sortable': {
+ 'default': Ember.SortableMixin
+ },
+ 'ember-debug': {
+ 'log': Ember.debug,
+ 'inspect': Ember.inspect,
+ 'run': Ember.runInDebug,
+ 'warn': Ember.warn
+ },
+ 'ember-debug/container-debug-adapter': {
+ 'default': Ember.ContainerDebugAdapter
+ },
+ 'ember-debug/data-adapter': {
+ 'default': Ember.DataAdapter
+ },
+ 'ember-deprecations': {
+ 'deprecate': Ember.deprecate,
+ 'deprecateFunc': Ember.deprecateFunc
+ },
+ 'ember-enumerable': {
+ 'default': Ember.Enumerable
+ },
+ 'ember-evented': {
+ 'default': Ember.Evented
+ },
+ 'ember-evented/on': {
+ 'default': Ember.on
+ },
+ 'ember-globals-resolver': {
+ 'default': Ember.DefaultResolver
+ },
+ 'ember-helper': {
+ 'default': Ember.Helper,
+ 'helper': Ember.Helper && Ember.Helper.helper
+ },
+ 'ember-instrumentation': {
+ 'instrument': Ember.Instrumentation.instrument,
+ 'reset': Ember.Instrumentation.reset,
+ 'subscribe': Ember.Instrumentation.subscribe,
+ 'unsubscribe': Ember.Instrumentation.unsubscribe
+ },
+ 'ember-locations/hash': {
+ 'default': Ember.HashLocation
+ },
+ 'ember-locations/history': {
+ 'default': Ember.HistoryLocation
+ },
+ 'ember-locations/none': {
+ 'default': Ember.NoneLocation
+ },
+ 'ember-map': {
+ 'default': Ember.Map,
+ 'withDefault': Ember.MapWithDefault
+ },
+ 'ember-metal/destroy': {
+ 'default': Ember.destroy
+ },
+ 'ember-metal/events': {
+ 'addListener': Ember.addListener,
+ 'removeListener': Ember.removeListener,
+ 'send': Ember.sendEvent
+ },
+ 'ember-metal/get': {
+ 'default': Ember.get,
+ 'getProperties': Ember.getProperties
+ },
+ 'ember-metal/mixin': {
+ 'default': Ember.Mixin
+ },
+ 'ember-metal/observer': {
+ 'default': Ember.observer,
+ 'addObserver': Ember.addObserver,
+ 'removeObserver': Ember.removeObserver
+ },
+ 'ember-metal/on-load': {
+ 'default': Ember.onLoad,
+ 'run': Ember.runLoadHooks
+ },
+ 'ember-metal/set': {
+ 'default': Ember.set,
+ 'setProperties': Ember.setProperties,
+ 'trySet': Ember.trySet
+ },
+ 'ember-metal/utils': {
+ 'aliasMethod': Ember.aliasMethod,
+ 'assert': Ember.assert,
+ 'cacheFor': Ember.cacheFor,
+ 'copy': Ember.copy,
+ 'guidFor': Ember.guidFor
+ },
+ 'ember-object': {
+ 'default': Ember.Object
+ },
+ 'ember-platform': {
+ 'assign': Ember.merge,
+ 'create': Ember.create,
+ 'defineProperty': Ember.platform.defineProperty,
+ 'hasAccessors': Ember.platform.hasPropertyAccessors,
+ 'keys': Ember.keys
+ },
+ 'ember-route': {
+ 'default': Ember.Route
+ },
+ 'ember-router': {
+ 'default': Ember.Router
+ },
+ 'ember-runloop': {
+ 'default': Ember.run,
+ 'begin': Ember.run.begin,
+ 'bind': Ember.run.bind,
+ 'cancel': Ember.run.cancel,
+ 'debounce': Ember.run.debounce,
+ 'end': Ember.run.end,
+ 'join': Ember.run.join,
+ 'later': Ember.run.later,
+ 'next': Ember.run.next,
+ 'once': Ember.run.once,
+ 'schedule': Ember.run.schedule,
+ 'scheduleOnce': Ember.run.scheduleOnce,
+ 'throttle': Ember.run.throttle
+ },
+ 'ember-service': {
+ 'default': Ember.Service
+ },
+ 'ember-service/inject': {
+ 'default': Ember.inject.service
+ },
+ 'ember-set/ordered': {
+ 'default': Ember.OrderedSet
+ },
+ 'ember-string': {
+ 'camelize': Ember.String.camelize,
+ 'capitalize': Ember.String.capitalize,
+ 'classify': Ember.String.classify,
+ 'dasherize': Ember.String.dasherize,
+ 'decamelize': Ember.String.decamelize,
+ 'fmt': Ember.String.fmt,
+ 'htmlSafe': Ember.String.htmlSafe,
+ 'loc': Ember.String.loc,
+ 'underscore': Ember.String.underscore,
+ 'w': Ember.String.w
+ },
+ 'ember-utils': {
+ 'isBlank': Ember.isBlank,
+ 'isEmpty': Ember.isEmpty,
+ 'isNone': Ember.isNone,
+ 'isPresent': Ember.isPresent,
+ 'tryInvoke': Ember.tryInvoke,
+ 'typeOf': Ember.typeOf
+ }
+ };
+
+ // populate `ember/computed` named exports
+ shims['ember-computed'] = {
+ 'default': Ember.computed
+ };
+ var computedMacros = [
+ "empty","notEmpty", "none", "not", "bool", "match",
+ "equal", "gt", "gte", "lt", "lte", "alias", "oneWay",
+ "reads", "readOnly", "deprecatingAlias",
+ "and", "or", "collect", "sum", "min", "max",
+ "map", "sort", "setDiff", "mapBy", "mapProperty",
+ "filter", "filterBy", "filterProperty", "uniq",
+ "union", "intersect"
+ ];
+ for (var i = 0, l = computedMacros.length; i < l; i++) {
+ var key = computedMacros[i];
+ shims['ember-computed'][key] = Ember.computed[key];
+ }
+
+ for (var moduleName in shims) {
+ generateModule(moduleName, shims[moduleName]);
+ }
+ }
+
+ function processTestShims() {
+ if (Ember.Test) {
+ var testShims = {
+ 'ember-test': {
+ 'default': Ember.Test
+ },
+ 'ember-test/adapter': {
+ 'default': Ember.Test.Adapter
+ },
+ 'ember-test/qunit-adapter': {
+ 'default': Ember.Test.QUnitAdapter
+ }
+ };
+
+ for (var moduleName in testShims) {
+ generateModule(moduleName, testShims[moduleName]);
+ }
+ }
+ }
+
+ function generateModule(name, values) {
+ define(name, [], function() {
+ 'use strict';
+
+ return values;
+ });
+ }
+
+ processEmberShims();
+ processTestShims();
+ generateModule('jquery', { 'default': self.jQuery });
+ generateModule('rsvp', { 'default': Ember.RSVP });
+})();
+
+;(function() {
+ function objectAt(content, idx) {
+ if (content.objectAt) {
+ return content.objectAt(idx);
+ }
+
+ return content[idx];
+ }
+
+ function arrayIncludes(obj, startAt) {
+ var len = Ember.get(this, 'length');
+ var idx, currentObj;
+
+ if (startAt === undefined) {
+ startAt = 0;
+ }
+
+ if (startAt < 0) {
+ startAt += len;
+ }
+
+ for (idx = startAt; idx < len; idx++) {
+ currentObj = objectAt(this, idx);
+
+ // SameValueZero comparison (NaN !== NaN)
+ if (obj === currentObj || (obj !== obj && currentObj !== currentObj)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ Ember.Array.reopen({
+ // inlined from https://git.io/v6F5T
+ includes: arrayIncludes
+ });
+
+ Ember.MutableArray.reopen({
+ addObject: function(obj) {
+ if (!this.includes(obj)) {
+ this.pushObject(obj);
+ }
+
+ return this;
+ }
+ });
+
+ Ember.Enumerable.reopen({
+ includes: function(obj) {
+ Ember.assert('Enumerable#includes cannot accept a second argument "startAt" as enumerable items are unordered.', arguments.length === 1);
+
+ var len = Ember.get(this, 'length');
+ var idx, next;
+ var last = null;
+ var found = false;
+
+ for (idx = 0; idx < len && !found; idx++) {
+ next = this.nextObject(idx, last);
+
+ found = obj === next || (obj !== obj && next !== next);
+
+ last = next;
+ }
+
+ next = last = null;
+
+ return found;
+ }
+ });
+
+ if ((Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Array) && !Array.prototype.includes) {
+ Array.prototype.includes = arrayIncludes;
+ }
+})();
+
+;/* globals define */
+define('ember/load-initializers', ['exports', 'ember-load-initializers', 'ember'], function(exports, loadInitializers, Ember) {
+ Ember['default'].deprecate(
+ 'Usage of `' + 'ember/load-initializers' + '` module is deprecated, please update to `ember-load-initializers`.',
+ false,
+ { id: 'ember-load-initializers.legacy-shims', until: '3.0.0' }
+ );
+
+ exports['default'] = loadInitializers['default'];
+});
+
+;/* globals define */
+
+function createDeprecatedModule(moduleId) {
+ define(moduleId, ['exports', 'ember-resolver/resolver', 'ember'], function(exports, Resolver, Ember) {
+ Ember['default'].deprecate(
+ 'Usage of `' + moduleId + '` module is deprecated, please update to `ember-resolver`.',
+ false,
+ { id: 'ember-resolver.legacy-shims', until: '3.0.0' }
+ );
+
+ exports['default'] = Resolver['default'];
+ });
+}
+
+createDeprecatedModule('ember/resolver');
+createDeprecatedModule('resolver');
+
+;// ==ClosureCompiler==
+// @compilation_level SIMPLE_OPTIMIZATIONS
+
+/**
+ * @license Highstock JS v4.2.6 (2016-08-02)
+ *
+ * (c) 2009-2016 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+(function (root, factory) {
+ if (typeof module === 'object' && module.exports) {
+ module.exports = root.document ?
+ factory(root) :
+ factory;
+ } else {
+ root.Highcharts = factory(root);
+ }
+}(typeof window !== 'undefined' ? window : this, function (win) { // eslint-disable-line no-undef
+// encapsulated variables
+ var UNDEFINED,
+ doc = win.document,
+ math = Math,
+ mathRound = math.round,
+ mathFloor = math.floor,
+ mathCeil = math.ceil,
+ mathMax = math.max,
+ mathMin = math.min,
+ mathAbs = math.abs,
+ mathCos = math.cos,
+ mathSin = math.sin,
+ mathPI = math.PI,
+ deg2rad = mathPI * 2 / 360,
+
+
+ // some variables
+ userAgent = (win.navigator && win.navigator.userAgent) || '',
+ isOpera = win.opera,
+ isMS = /(msie|trident|edge)/i.test(userAgent) && !isOpera,
+ docMode8 = doc && doc.documentMode === 8,
+ isWebKit = !isMS && /AppleWebKit/.test(userAgent),
+ isFirefox = /Firefox/.test(userAgent),
+ isTouchDevice = /(Mobile|Android|Windows Phone)/.test(userAgent),
+ SVG_NS = 'http://www.w3.org/2000/svg',
+ hasSVG = doc && doc.createElementNS && !!doc.createElementNS(SVG_NS, 'svg').createSVGRect,
+ hasBidiBug = isFirefox && parseInt(userAgent.split('Firefox/')[1], 10) < 4, // issue #38
+ useCanVG = doc && !hasSVG && !isMS && !!doc.createElement('canvas').getContext,
+ Renderer,
+ hasTouch,
+ symbolSizes = {},
+ idCounter = 0,
+ garbageBin,
+ defaultOptions,
+ dateFormat, // function
+ pathAnim,
+ timeUnits,
+ noop = function () {},
+ charts = [],
+ chartCount = 0,
+ PRODUCT = 'Highstock',
+ VERSION = '4.2.6',
+
+ // some constants for frequently used strings
+ DIV = 'div',
+ ABSOLUTE = 'absolute',
+ RELATIVE = 'relative',
+ HIDDEN = 'hidden',
+ PREFIX = 'highcharts-',
+ VISIBLE = 'visible',
+ PX = 'px',
+ NONE = 'none',
+ M = 'M',
+ L = 'L',
+ numRegex = /^[0-9]+$/,
+ NORMAL_STATE = '',
+ HOVER_STATE = 'hover',
+ SELECT_STATE = 'select',
+ marginNames = ['plotTop', 'marginRight', 'marginBottom', 'plotLeft'],
+
+ // Object for extending Axis
+ AxisPlotLineOrBandExtension,
+
+ // constants for attributes
+ STROKE_WIDTH = 'stroke-width',
+
+ // time methods, changed based on whether or not UTC is used
+ Date, // Allow using a different Date class
+ makeTime,
+ timezoneOffset,
+ getTimezoneOffset,
+ getMinutes,
+ getHours,
+ getDay,
+ getDate,
+ getMonth,
+ getFullYear,
+ setMilliseconds,
+ setSeconds,
+ setMinutes,
+ setHours,
+ setDate,
+ setMonth,
+ setFullYear,
+
+
+ // lookup over the types and the associated classes
+ seriesTypes = {},
+ Highcharts;
+
+ /**
+ * Provide error messages for debugging, with links to online explanation
+ */
+ function error(code, stop) {
+ var msg = 'Highcharts error #' + code + ': www.highcharts.com/errors/' + code;
+ if (stop) {
+ throw new Error(msg);
+ }
+ // else ...
+ if (win.console) {
+ console.log(msg); // eslint-disable-line no-console
+ }
+ }
+
+ // The Highcharts namespace
+ Highcharts = win.Highcharts ? error(16, true) : { win: win };
+
+ Highcharts.seriesTypes = seriesTypes;
+ var timers = [],
+ getStyle,
+
+ // Previous adapter functions
+ inArray,
+ each,
+ grep,
+ offset,
+ map,
+ addEvent,
+ removeEvent,
+ fireEvent,
+ animate,
+ stop;
+
+ /**
+ * An animator object. One instance applies to one property (attribute or style prop)
+ * on one element.
+ *
+ * @param {object} elem The element to animate. May be a DOM element or a Highcharts SVGElement wrapper.
+ * @param {object} options Animation options, including duration, easing, step and complete.
+ * @param {object} prop The property to animate.
+ */
+ function Fx(elem, options, prop) {
+ this.options = options;
+ this.elem = elem;
+ this.prop = prop;
+ }
+ Fx.prototype = {
+
+ /**
+ * Animating a path definition on SVGElement
+ * @returns {undefined}
+ */
+ dSetter: function () {
+ var start = this.paths[0],
+ end = this.paths[1],
+ ret = [],
+ now = this.now,
+ i = start.length,
+ startVal;
+
+ if (now === 1) { // land on the final path without adjustment points appended in the ends
+ ret = this.toD;
+
+ } else if (i === end.length && now < 1) {
+ while (i--) {
+ startVal = parseFloat(start[i]);
+ ret[i] =
+ isNaN(startVal) ? // a letter instruction like M or L
+ start[i] :
+ now * (parseFloat(end[i] - startVal)) + startVal;
+
+ }
+ } else { // if animation is finished or length not matching, land on right value
+ ret = end;
+ }
+ this.elem.attr('d', ret);
+ },
+
+ /**
+ * Update the element with the current animation step
+ * @returns {undefined}
+ */
+ update: function () {
+ var elem = this.elem,
+ prop = this.prop, // if destroyed, it is null
+ now = this.now,
+ step = this.options.step;
+
+ // Animation setter defined from outside
+ if (this[prop + 'Setter']) {
+ this[prop + 'Setter']();
+
+ // Other animations on SVGElement
+ } else if (elem.attr) {
+ if (elem.element) {
+ elem.attr(prop, now);
+ }
+
+ // HTML styles, raw HTML content like container size
+ } else {
+ elem.style[prop] = now + this.unit;
+ }
+
+ if (step) {
+ step.call(elem, now, this);
+ }
+
+ },
+
+ /**
+ * Run an animation
+ */
+ run: function (from, to, unit) {
+ var self = this,
+ timer = function (gotoEnd) {
+ return timer.stopped ? false : self.step(gotoEnd);
+ },
+ i;
+
+ this.startTime = +new Date();
+ this.start = from;
+ this.end = to;
+ this.unit = unit;
+ this.now = this.start;
+ this.pos = 0;
+
+ timer.elem = this.elem;
+
+ if (timer() && timers.push(timer) === 1) {
+ timer.timerId = setInterval(function () {
+
+ for (i = 0; i < timers.length; i++) {
+ if (!timers[i]()) {
+ timers.splice(i--, 1);
+ }
+ }
+
+ if (!timers.length) {
+ clearInterval(timer.timerId);
+ }
+ }, 13);
+ }
+ },
+
+ /**
+ * Run a single step in the animation
+ * @param {Boolean} gotoEnd Whether to go to then endpoint of the animation after abort
+ * @returns {Boolean} True if animation continues
+ */
+ step: function (gotoEnd) {
+ var t = +new Date(),
+ ret,
+ done,
+ options = this.options,
+ elem = this.elem,
+ complete = options.complete,
+ duration = options.duration,
+ curAnim = options.curAnim,
+ i;
+
+ if (elem.attr && !elem.element) { // #2616, element including flag is destroyed
+ ret = false;
+
+ } else if (gotoEnd || t >= duration + this.startTime) {
+ this.now = this.end;
+ this.pos = 1;
+ this.update();
+
+ curAnim[this.prop] = true;
+
+ done = true;
+ for (i in curAnim) {
+ if (curAnim[i] !== true) {
+ done = false;
+ }
+ }
+
+ if (done && complete) {
+ complete.call(elem);
+ }
+ ret = false;
+
+ } else {
+ this.pos = options.easing((t - this.startTime) / duration);
+ this.now = this.start + ((this.end - this.start) * this.pos);
+ this.update();
+ ret = true;
+ }
+ return ret;
+ },
+
+ /**
+ * Prepare start and end values so that the path can be animated one to one
+ */
+ initPath: function (elem, fromD, toD) {
+ fromD = fromD || '';
+ var shift,
+ startX = elem.startX,
+ endX = elem.endX,
+ bezier = fromD.indexOf('C') > -1,
+ numParams = bezier ? 7 : 3,
+ fullLength,
+ slice,
+ i,
+ start = fromD.split(' '),
+ end = toD.slice(), // copy
+ isArea = elem.isArea,
+ positionFactor = isArea ? 2 : 1,
+ reverse;
+
+ /**
+ * In splines make move points have six parameters like bezier curves
+ */
+ function sixify(arr) {
+ i = arr.length;
+ while (i--) {
+ if (arr[i] === M || arr[i] === L) {
+ arr.splice(i + 1, 0, arr[i + 1], arr[i + 2], arr[i + 1], arr[i + 2]);
+ }
+ }
+ }
+
+ /**
+ * Insert an array at the given position of another array
+ */
+ function insertSlice(arr, subArr, index) {
+ [].splice.apply(
+ arr,
+ [index, 0].concat(subArr)
+ );
+ }
+
+ /**
+ * If shifting points, prepend a dummy point to the end path.
+ */
+ function prepend(arr, other) {
+ while (arr.length < fullLength) {
+
+ // Move to, line to or curve to?
+ arr[0] = other[fullLength - arr.length];
+
+ // Prepend a copy of the first point
+ insertSlice(arr, arr.slice(0, numParams), 0);
+
+ // For areas, the bottom path goes back again to the left, so we need
+ // to append a copy of the last point.
+ if (isArea) {
+ insertSlice(arr, arr.slice(arr.length - numParams), arr.length);
+ i--;
+ }
+ }
+ arr[0] = 'M';
+ }
+
+ /**
+ * Copy and append last point until the length matches the end length
+ */
+ function append(arr, other) {
+ var i = (fullLength - arr.length) / numParams;
+ while (i > 0 && i--) {
+
+ // Pull out the slice that is going to be appended or inserted. In a line graph,
+ // the positionFactor is 1, and the last point is sliced out. In an area graph,
+ // the positionFactor is 2, causing the middle two points to be sliced out, since
+ // an area path starts at left, follows the upper path then turns and follows the
+ // bottom back.
+ slice = arr.slice().splice(
+ (arr.length / positionFactor) - numParams,
+ numParams * positionFactor
+ );
+
+ // Move to, line to or curve to?
+ slice[0] = other[fullLength - numParams - (i * numParams)];
+
+ // Disable first control point
+ if (bezier) {
+ slice[numParams - 6] = slice[numParams - 2];
+ slice[numParams - 5] = slice[numParams - 1];
+ }
+
+ // Now insert the slice, either in the middle (for areas) or at the end (for lines)
+ insertSlice(arr, slice, arr.length / positionFactor);
+
+ if (isArea) {
+ i--;
+ }
+ }
+ }
+
+ if (bezier) {
+ sixify(start);
+ sixify(end);
+ }
+
+ // For sideways animation, find out how much we need to shift to get the start path Xs
+ // to match the end path Xs.
+ if (startX && endX) {
+ for (i = 0; i < startX.length; i++) {
+ if (startX[i] === endX[0]) { // Moving left, new points coming in on right
+ shift = i;
+ break;
+ } else if (startX[0] === endX[endX.length - startX.length + i]) { // Moving right
+ shift = i;
+ reverse = true;
+ break;
+ }
+ }
+ if (shift === undefined) {
+ start = [];
+ }
+ }
+
+ if (start.length && Highcharts.isNumber(shift)) {
+
+ // The common target length for the start and end array, where both
+ // arrays are padded in opposite ends
+ fullLength = end.length + shift * positionFactor * numParams;
+
+ if (!reverse) {
+ prepend(end, start);
+ append(start, end);
+ } else {
+ prepend(start, end);
+ append(end, start);
+ }
+ }
+
+ return [start, end];
+ }
+ }; // End of Fx prototype
+
+
+ /**
+ * Extend an object with the members of another
+ * @param {Object} a The object to be extended
+ * @param {Object} b The object to add to the first one
+ */
+ var extend = Highcharts.extend = function (a, b) {
+ var n;
+ if (!a) {
+ a = {};
+ }
+ for (n in b) {
+ a[n] = b[n];
+ }
+ return a;
+ };
+
+ /**
+ * Deep merge two or more objects and return a third object. If the first argument is
+ * true, the contents of the second object is copied into the first object.
+ * Previously this function redirected to jQuery.extend(true), but this had two limitations.
+ * First, it deep merged arrays, which lead to workarounds in Highcharts. Second,
+ * it copied properties from extended prototypes.
+ */
+ function merge() {
+ var i,
+ args = arguments,
+ len,
+ ret = {},
+ doCopy = function (copy, original) {
+ var value, key;
+
+ // An object is replacing a primitive
+ if (typeof copy !== 'object') {
+ copy = {};
+ }
+
+ for (key in original) {
+ if (original.hasOwnProperty(key)) {
+ value = original[key];
+
+ // Copy the contents of objects, but not arrays or DOM nodes
+ if (value && typeof value === 'object' && Object.prototype.toString.call(value) !== '[object Array]' &&
+ key !== 'renderTo' && typeof value.nodeType !== 'number') {
+ copy[key] = doCopy(copy[key] || {}, value);
+
+ // Primitives and arrays are copied over directly
+ } else {
+ copy[key] = original[key];
+ }
+ }
+ }
+ return copy;
+ };
+
+ // If first argument is true, copy into the existing object. Used in setOptions.
+ if (args[0] === true) {
+ ret = args[1];
+ args = Array.prototype.slice.call(args, 2);
+ }
+
+ // For each argument, extend the return
+ len = args.length;
+ for (i = 0; i < len; i++) {
+ ret = doCopy(ret, args[i]);
+ }
+
+ return ret;
+ }
+
+ /**
+ * Shortcut for parseInt
+ * @param {Object} s
+ * @param {Number} mag Magnitude
+ */
+ function pInt(s, mag) {
+ return parseInt(s, mag || 10);
+ }
+
+ /**
+ * Check for string
+ * @param {Object} s
+ */
+ function isString(s) {
+ return typeof s === 'string';
+ }
+
+ /**
+ * Check for array
+ * @param {Object} obj
+ */
+ function isArray(obj) {
+ return Object.prototype.toString.call(obj) === '[object Array]';
+ }
+
+ /**
+ * Check for object
+ * @param {Object} obj
+ * @param {Boolean} strict Also checks that the object is not an array
+ */
+ var isObject = Highcharts.isObject = function (obj, strict) {
+ //debugger;
+ return obj && typeof obj === 'object' && (!strict || !isArray(obj));
+ };
+
+ /**
+ * Check for number
+ * @param {Object} n
+ */
+ var isNumber = Highcharts.isNumber = function isNumber(n) {
+ return typeof n === 'number' && !isNaN(n);
+ };
+
+ /**
+ * Remove last occurence of an item from an array
+ * @param {Array} arr
+ * @param {Mixed} item
+ */
+ function erase(arr, item) {
+ var i = arr.length;
+ while (i--) {
+ if (arr[i] === item) {
+ arr.splice(i, 1);
+ break;
+ }
+ }
+ //return arr;
+ }
+
+ /**
+ * Returns true if the object is not null or undefined.
+ * @param {Object} obj
+ */
+ function defined(obj) {
+ return obj !== UNDEFINED && obj !== null;
+ }
+
+ /**
+ * Set or get an attribute or an object of attributes. Can't use jQuery attr because
+ * it attempts to set expando properties on the SVG element, which is not allowed.
+ *
+ * @param {Object} elem The DOM element to receive the attribute(s)
+ * @param {String|Object} prop The property or an abject of key-value pairs
+ * @param {String} value The value if a single property is set
+ */
+ function attr(elem, prop, value) {
+ var key,
+ ret;
+
+ // if the prop is a string
+ if (isString(prop)) {
+ // set the value
+ if (defined(value)) {
+ elem.setAttribute(prop, value);
+
+ // get the value
+ } else if (elem && elem.getAttribute) { // elem not defined when printing pie demo...
+ ret = elem.getAttribute(prop);
+ }
+
+ // else if prop is defined, it is a hash of key/value pairs
+ } else if (defined(prop) && isObject(prop)) {
+ for (key in prop) {
+ elem.setAttribute(key, prop[key]);
+ }
+ }
+ return ret;
+ }
+ /**
+ * Check if an element is an array, and if not, make it into an array.
+ */
+ function splat(obj) {
+ return isArray(obj) ? obj : [obj];
+ }
+
+ /**
+ * Set a timeout if the delay is given, otherwise perform the function synchronously
+ * @param {Function} fn The function to perform
+ * @param {Number} delay Delay in milliseconds
+ * @param {Ojbect} context The context
+ * @returns {Nubmer} An identifier for the timeout
+ */
+ function syncTimeout(fn, delay, context) {
+ if (delay) {
+ return setTimeout(fn, delay, context);
+ }
+ fn.call(0, context);
+ }
+
+
+ /**
+ * Return the first value that is defined.
+ */
+ var pick = Highcharts.pick = function () {
+ var args = arguments,
+ i,
+ arg,
+ length = args.length;
+ for (i = 0; i < length; i++) {
+ arg = args[i];
+ if (arg !== UNDEFINED && arg !== null) {
+ return arg;
+ }
+ }
+ };
+
+ /**
+ * Set CSS on a given element
+ * @param {Object} el
+ * @param {Object} styles Style object with camel case property names
+ */
+ function css(el, styles) {
+ if (isMS && !hasSVG) { // #2686
+ if (styles && styles.opacity !== UNDEFINED) {
+ styles.filter = 'alpha(opacity=' + (styles.opacity * 100) + ')';
+ }
+ }
+ extend(el.style, styles);
+ }
+
+ /**
+ * Utility function to create element with attributes and styles
+ * @param {Object} tag
+ * @param {Object} attribs
+ * @param {Object} styles
+ * @param {Object} parent
+ * @param {Object} nopad
+ */
+ function createElement(tag, attribs, styles, parent, nopad) {
+ var el = doc.createElement(tag);
+ if (attribs) {
+ extend(el, attribs);
+ }
+ if (nopad) {
+ css(el, { padding: 0, border: 'none', margin: 0 });
+ }
+ if (styles) {
+ css(el, styles);
+ }
+ if (parent) {
+ parent.appendChild(el);
+ }
+ return el;
+ }
+
+ /**
+ * Extend a prototyped class by new members
+ * @param {Object} parent
+ * @param {Object} members
+ */
+ function extendClass(Parent, members) {
+ var object = function () {
+ };
+ object.prototype = new Parent();
+ extend(object.prototype, members);
+ return object;
+ }
+
+ /**
+ * Pad a string to a given length by adding 0 to the beginning
+ * @param {Number} number
+ * @param {Number} length
+ */
+ function pad(number, length, padder) {
+ return new Array((length || 2) + 1 - String(number).length).join(padder || 0) + number;
+ }
+
+ /**
+ * Return a length based on either the integer value, or a percentage of a base.
+ */
+ function relativeLength(value, base) {
+ return (/%$/).test(value) ? base * parseFloat(value) / 100 : parseFloat(value);
+ }
+
+ /**
+ * Wrap a method with extended functionality, preserving the original function
+ * @param {Object} obj The context object that the method belongs to
+ * @param {String} method The name of the method to extend
+ * @param {Function} func A wrapper function callback. This function is called with the same arguments
+ * as the original function, except that the original function is unshifted and passed as the first
+ * argument.
+ */
+ var wrap = Highcharts.wrap = function (obj, method, func) {
+ var proceed = obj[method];
+ obj[method] = function () {
+ var args = Array.prototype.slice.call(arguments);
+ args.unshift(proceed);
+ return func.apply(this, args);
+ };
+ };
+
+
+ function getTZOffset(timestamp) {
+ return ((getTimezoneOffset && getTimezoneOffset(timestamp)) || timezoneOffset || 0) * 60000;
+ }
+
+ /**
+ * Based on http://www.php.net/manual/en/function.strftime.php
+ * @param {String} format
+ * @param {Number} timestamp
+ * @param {Boolean} capitalize
+ */
+ dateFormat = function (format, timestamp, capitalize) {
+ if (!defined(timestamp) || isNaN(timestamp)) {
+ return defaultOptions.lang.invalidDate || '';
+ }
+ format = pick(format, '%Y-%m-%d %H:%M:%S');
+
+ var date = new Date(timestamp - getTZOffset(timestamp)),
+ key, // used in for constuct below
+ // get the basic time values
+ hours = date[getHours](),
+ day = date[getDay](),
+ dayOfMonth = date[getDate](),
+ month = date[getMonth](),
+ fullYear = date[getFullYear](),
+ lang = defaultOptions.lang,
+ langWeekdays = lang.weekdays,
+ shortWeekdays = lang.shortWeekdays,
+
+ // List all format keys. Custom formats can be added from the outside.
+ replacements = extend({
+
+ // Day
+ 'a': shortWeekdays ? shortWeekdays[day] : langWeekdays[day].substr(0, 3), // Short weekday, like 'Mon'
+ 'A': langWeekdays[day], // Long weekday, like 'Monday'
+ 'd': pad(dayOfMonth), // Two digit day of the month, 01 to 31
+ 'e': pad(dayOfMonth, 2, ' '), // Day of the month, 1 through 31
+ 'w': day,
+
+ // Week (none implemented)
+ //'W': weekNumber(),
+
+ // Month
+ 'b': lang.shortMonths[month], // Short month, like 'Jan'
+ 'B': lang.months[month], // Long month, like 'January'
+ 'm': pad(month + 1), // Two digit month number, 01 through 12
+
+ // Year
+ 'y': fullYear.toString().substr(2, 2), // Two digits year, like 09 for 2009
+ 'Y': fullYear, // Four digits year, like 2009
+
+ // Time
+ 'H': pad(hours), // Two digits hours in 24h format, 00 through 23
+ 'k': hours, // Hours in 24h format, 0 through 23
+ 'I': pad((hours % 12) || 12), // Two digits hours in 12h format, 00 through 11
+ 'l': (hours % 12) || 12, // Hours in 12h format, 1 through 12
+ 'M': pad(date[getMinutes]()), // Two digits minutes, 00 through 59
+ 'p': hours < 12 ? 'AM' : 'PM', // Upper case AM or PM
+ 'P': hours < 12 ? 'am' : 'pm', // Lower case AM or PM
+ 'S': pad(date.getSeconds()), // Two digits seconds, 00 through 59
+ 'L': pad(mathRound(timestamp % 1000), 3) // Milliseconds (naming from Ruby)
+ }, Highcharts.dateFormats);
+
+
+ // do the replaces
+ for (key in replacements) {
+ while (format.indexOf('%' + key) !== -1) { // regex would do it in one line, but this is faster
+ format = format.replace('%' + key, typeof replacements[key] === 'function' ? replacements[key](timestamp) : replacements[key]);
+ }
+ }
+
+ // Optionally capitalize the string and return
+ return capitalize ? format.substr(0, 1).toUpperCase() + format.substr(1) : format;
+ };
+
+ /**
+ * Format a single variable. Similar to sprintf, without the % prefix.
+ */
+ function formatSingle(format, val) {
+ var floatRegex = /f$/,
+ decRegex = /\.([0-9])/,
+ lang = defaultOptions.lang,
+ decimals;
+
+ if (floatRegex.test(format)) { // float
+ decimals = format.match(decRegex);
+ decimals = decimals ? decimals[1] : -1;
+ if (val !== null) {
+ val = Highcharts.numberFormat(
+ val,
+ decimals,
+ lang.decimalPoint,
+ format.indexOf(',') > -1 ? lang.thousandsSep : ''
+ );
+ }
+ } else {
+ val = dateFormat(format, val);
+ }
+ return val;
+ }
+
+ /**
+ * Format a string according to a subset of the rules of Python's String.format method.
+ */
+ function format(str, ctx) {
+ var splitter = '{',
+ isInside = false,
+ segment,
+ valueAndFormat,
+ path,
+ i,
+ len,
+ ret = [],
+ val,
+ index;
+
+ while ((index = str.indexOf(splitter)) !== -1) {
+
+ segment = str.slice(0, index);
+ if (isInside) { // we're on the closing bracket looking back
+
+ valueAndFormat = segment.split(':');
+ path = valueAndFormat.shift().split('.'); // get first and leave format
+ len = path.length;
+ val = ctx;
+
+ // Assign deeper paths
+ for (i = 0; i < len; i++) {
+ val = val[path[i]];
+ }
+
+ // Format the replacement
+ if (valueAndFormat.length) {
+ val = formatSingle(valueAndFormat.join(':'), val);
+ }
+
+ // Push the result and advance the cursor
+ ret.push(val);
+
+ } else {
+ ret.push(segment);
+
+ }
+ str = str.slice(index + 1); // the rest
+ isInside = !isInside; // toggle
+ splitter = isInside ? '}' : '{'; // now look for next matching bracket
+ }
+ ret.push(str);
+ return ret.join('');
+ }
+
+ /**
+ * Get the magnitude of a number
+ */
+ function getMagnitude(num) {
+ return math.pow(10, mathFloor(math.log(num) / math.LN10));
+ }
+
+ /**
+ * Take an interval and normalize it to multiples of 1, 2, 2.5 and 5
+ * @param {Number} interval
+ * @param {Array} multiples
+ * @param {Number} magnitude
+ * @param {Object} options
+ */
+ function normalizeTickInterval(interval, multiples, magnitude, allowDecimals, preventExceed) {
+ var normalized,
+ i,
+ retInterval = interval;
+
+ // round to a tenfold of 1, 2, 2.5 or 5
+ magnitude = pick(magnitude, 1);
+ normalized = interval / magnitude;
+
+ // multiples for a linear scale
+ if (!multiples) {
+ multiples = [1, 2, 2.5, 5, 10];
+
+ // the allowDecimals option
+ if (allowDecimals === false) {
+ if (magnitude === 1) {
+ multiples = [1, 2, 5, 10];
+ } else if (magnitude <= 0.1) {
+ multiples = [1 / magnitude];
+ }
+ }
+ }
+
+ // normalize the interval to the nearest multiple
+ for (i = 0; i < multiples.length; i++) {
+ retInterval = multiples[i];
+ if ((preventExceed && retInterval * magnitude >= interval) || // only allow tick amounts smaller than natural
+ (!preventExceed && (normalized <= (multiples[i] + (multiples[i + 1] || multiples[i])) / 2))) {
+ break;
+ }
+ }
+
+ // multiply back to the correct magnitude
+ retInterval *= magnitude;
+
+ return retInterval;
+ }
+
+
+ /**
+ * Utility method that sorts an object array and keeping the order of equal items.
+ * ECMA script standard does not specify the behaviour when items are equal.
+ */
+ function stableSort(arr, sortFunction) {
+ var length = arr.length,
+ sortValue,
+ i;
+
+ // Add index to each item
+ for (i = 0; i < length; i++) {
+ arr[i].safeI = i; // stable sort index
+ }
+
+ arr.sort(function (a, b) {
+ sortValue = sortFunction(a, b);
+ return sortValue === 0 ? a.safeI - b.safeI : sortValue;
+ });
+
+ // Remove index from items
+ for (i = 0; i < length; i++) {
+ delete arr[i].safeI; // stable sort index
+ }
+ }
+
+ /**
+ * Non-recursive method to find the lowest member of an array. Math.min raises a maximum
+ * call stack size exceeded error in Chrome when trying to apply more than 150.000 points. This
+ * method is slightly slower, but safe.
+ */
+ function arrayMin(data) {
+ var i = data.length,
+ min = data[0];
+
+ while (i--) {
+ if (data[i] < min) {
+ min = data[i];
+ }
+ }
+ return min;
+ }
+
+ /**
+ * Non-recursive method to find the lowest member of an array. Math.min raises a maximum
+ * call stack size exceeded error in Chrome when trying to apply more than 150.000 points. This
+ * method is slightly slower, but safe.
+ */
+ function arrayMax(data) {
+ var i = data.length,
+ max = data[0];
+
+ while (i--) {
+ if (data[i] > max) {
+ max = data[i];
+ }
+ }
+ return max;
+ }
+
+ /**
+ * Utility method that destroys any SVGElement or VMLElement that are properties on the given object.
+ * It loops all properties and invokes destroy if there is a destroy method. The property is
+ * then delete'ed.
+ * @param {Object} The object to destroy properties on
+ * @param {Object} Exception, do not destroy this property, only delete it.
+ */
+ function destroyObjectProperties(obj, except) {
+ var n;
+ for (n in obj) {
+ // If the object is non-null and destroy is defined
+ if (obj[n] && obj[n] !== except && obj[n].destroy) {
+ // Invoke the destroy
+ obj[n].destroy();
+ }
+
+ // Delete the property from the object.
+ delete obj[n];
+ }
+ }
+
+
+ /**
+ * Discard an element by moving it to the bin and delete
+ * @param {Object} The HTML node to discard
+ */
+ function discardElement(element) {
+ // create a garbage bin element, not part of the DOM
+ if (!garbageBin) {
+ garbageBin = createElement(DIV);
+ }
+
+ // move the node and empty bin
+ if (element) {
+ garbageBin.appendChild(element);
+ }
+ garbageBin.innerHTML = '';
+ }
+
+ /**
+ * Fix JS round off float errors
+ * @param {Number} num
+ */
+ function correctFloat(num, prec) {
+ return parseFloat(
+ num.toPrecision(prec || 14)
+ );
+ }
+
+ /**
+ * Set the global animation to either a given value, or fall back to the
+ * given chart's animation option
+ * @param {Object} animation
+ * @param {Object} chart
+ */
+ function setAnimation(animation, chart) {
+ chart.renderer.globalAnimation = pick(animation, chart.animation);
+ }
+
+ /**
+ * Get the animation in object form, where a disabled animation is always
+ * returned with duration: 0
+ */
+ function animObject(animation) {
+ return isObject(animation) ? merge(animation) : { duration: animation ? 500 : 0 };
+ }
+
+ /**
+ * The time unit lookup
+ */
+ timeUnits = {
+ millisecond: 1,
+ second: 1000,
+ minute: 60000,
+ hour: 3600000,
+ day: 24 * 3600000,
+ week: 7 * 24 * 3600000,
+ month: 28 * 24 * 3600000,
+ year: 364 * 24 * 3600000
+ };
+
+
+ /**
+ * Format a number and return a string based on input settings
+ * @param {Number} number The input number to format
+ * @param {Number} decimals The amount of decimals
+ * @param {String} decimalPoint The decimal point, defaults to the one given in the lang options
+ * @param {String} thousandsSep The thousands separator, defaults to the one given in the lang options
+ */
+ Highcharts.numberFormat = function (number, decimals, decimalPoint, thousandsSep) {
+
+ number = +number || 0;
+ decimals = +decimals;
+
+ var lang = defaultOptions.lang,
+ origDec = (number.toString().split('.')[1] || '').length,
+ decimalComponent,
+ strinteger,
+ thousands,
+ absNumber = Math.abs(number),
+ ret;
+
+ if (decimals === -1) {
+ decimals = Math.min(origDec, 20); // Preserve decimals. Not huge numbers (#3793).
+ } else if (!isNumber(decimals)) {
+ decimals = 2;
+ }
+
+ // A string containing the positive integer component of the number
+ strinteger = String(pInt(absNumber.toFixed(decimals)));
+
+ // Leftover after grouping into thousands. Can be 0, 1 or 3.
+ thousands = strinteger.length > 3 ? strinteger.length % 3 : 0;
+
+ // Language
+ decimalPoint = pick(decimalPoint, lang.decimalPoint);
+ thousandsSep = pick(thousandsSep, lang.thousandsSep);
+
+ // Start building the return
+ ret = number < 0 ? '-' : '';
+
+ // Add the leftover after grouping into thousands. For example, in the number 42 000 000,
+ // this line adds 42.
+ ret += thousands ? strinteger.substr(0, thousands) + thousandsSep : '';
+
+ // Add the remaining thousands groups, joined by the thousands separator
+ ret += strinteger.substr(thousands).replace(/(\d{3})(?=\d)/g, '$1' + thousandsSep);
+
+ // Add the decimal point and the decimal component
+ if (decimals) {
+ // Get the decimal component, and add power to avoid rounding errors with float numbers (#4573)
+ decimalComponent = Math.abs(absNumber - strinteger + Math.pow(10, -Math.max(decimals, origDec) - 1));
+ ret += decimalPoint + decimalComponent.toFixed(decimals).slice(2);
+ }
+
+ return ret;
+ };
+
+ /**
+ * Easing definition
+ * @param {Number} pos Current position, ranging from 0 to 1
+ */
+ Math.easeInOutSine = function (pos) {
+ return -0.5 * (Math.cos(Math.PI * pos) - 1);
+ };
+
+ /**
+ * Internal method to return CSS value for given element and property
+ */
+ getStyle = function (el, prop) {
+
+ var style;
+
+ // For width and height, return the actual inner pixel size (#4913)
+ if (prop === 'width') {
+ return Math.min(el.offsetWidth, el.scrollWidth) - getStyle(el, 'padding-left') - getStyle(el, 'padding-right');
+ } else if (prop === 'height') {
+ return Math.min(el.offsetHeight, el.scrollHeight) - getStyle(el, 'padding-top') - getStyle(el, 'padding-bottom');
+ }
+
+ // Otherwise, get the computed style
+ style = win.getComputedStyle(el, undefined);
+ return style && pInt(style.getPropertyValue(prop));
+ };
+
+ /**
+ * Return the index of an item in an array, or -1 if not found
+ */
+ inArray = function (item, arr) {
+ return arr.indexOf ? arr.indexOf(item) : [].indexOf.call(arr, item);
+ };
+
+ /**
+ * Filter an array
+ */
+ grep = function (elements, callback) {
+ return [].filter.call(elements, callback);
+ };
+
+ /**
+ * Map an array
+ */
+ map = function (arr, fn) {
+ var results = [],
+ i = 0,
+ len = arr.length;
+
+ for (; i < len; i++) {
+ results[i] = fn.call(arr[i], arr[i], i, arr);
+ }
+
+ return results;
+ };
+
+ /**
+ * Get the element's offset position, corrected by overflow:auto.
+ */
+ offset = function (el) {
+ var docElem = doc.documentElement,
+ box = el.getBoundingClientRect();
+
+ return {
+ top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),
+ left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)
+ };
+ };
+
+ /**
+ * Stop running animation.
+ * A possible extension to this would be to stop a single property, when
+ * we want to continue animating others. Then assign the prop to the timer
+ * in the Fx.run method, and check for the prop here. This would be an improvement
+ * in all cases where we stop the animation from .attr. Instead of stopping
+ * everything, we can just stop the actual attributes we're setting.
+ */
+ stop = function (el) {
+
+ var i = timers.length;
+
+ // Remove timers related to this element (#4519)
+ while (i--) {
+ if (timers[i].elem === el) {
+ timers[i].stopped = true; // #4667
+ }
+ }
+ };
+
+ /**
+ * Utility for iterating over an array.
+ * @param {Array} arr
+ * @param {Function} fn
+ */
+ each = function (arr, fn) { // modern browsers
+ return Array.prototype.forEach.call(arr, fn);
+ };
+
+ /**
+ * Add an event listener
+ */
+ addEvent = function (el, type, fn) {
+
+ var events = el.hcEvents = el.hcEvents || {};
+
+ function wrappedFn(e) {
+ e.target = e.srcElement || win; // #2820
+ fn.call(el, e);
+ }
+
+ // Handle DOM events in modern browsers
+ if (el.addEventListener) {
+ el.addEventListener(type, fn, false);
+
+ // Handle old IE implementation
+ } else if (el.attachEvent) {
+
+ if (!el.hcEventsIE) {
+ el.hcEventsIE = {};
+ }
+
+ // Link wrapped fn with original fn, so we can get this in removeEvent
+ el.hcEventsIE[fn.toString()] = wrappedFn;
+
+ el.attachEvent('on' + type, wrappedFn);
+ }
+
+ if (!events[type]) {
+ events[type] = [];
+ }
+
+ events[type].push(fn);
+ };
+
+ /**
+ * Remove event added with addEvent
+ */
+ removeEvent = function (el, type, fn) {
+
+ var events,
+ hcEvents = el.hcEvents,
+ index;
+
+ function removeOneEvent(type, fn) {
+ if (el.removeEventListener) {
+ el.removeEventListener(type, fn, false);
+ } else if (el.attachEvent) {
+ fn = el.hcEventsIE[fn.toString()];
+ el.detachEvent('on' + type, fn);
+ }
+ }
+
+ function removeAllEvents() {
+ var types,
+ len,
+ n;
+
+ if (!el.nodeName) {
+ return; // break on non-DOM events
+ }
+
+ if (type) {
+ types = {};
+ types[type] = true;
+ } else {
+ types = hcEvents;
+ }
+
+ for (n in types) {
+ if (hcEvents[n]) {
+ len = hcEvents[n].length;
+ while (len--) {
+ removeOneEvent(n, hcEvents[n][len]);
+ }
+ }
+ }
+ }
+
+ if (hcEvents) {
+ if (type) {
+ events = hcEvents[type] || [];
+ if (fn) {
+ index = inArray(fn, events);
+ if (index > -1) {
+ events.splice(index, 1);
+ hcEvents[type] = events;
+ }
+ removeOneEvent(type, fn);
+
+ } else {
+ removeAllEvents();
+ hcEvents[type] = [];
+ }
+ } else {
+ removeAllEvents();
+ el.hcEvents = {};
+ }
+ }
+ };
+
+ /**
+ * Fire an event on a custom object
+ */
+ fireEvent = function (el, type, eventArguments, defaultFunction) {
+ var e,
+ hcEvents = el.hcEvents,
+ events,
+ len,
+ i,
+ fn;
+
+ eventArguments = eventArguments || {};
+
+ if (doc.createEvent && (el.dispatchEvent || el.fireEvent)) {
+ e = doc.createEvent('Events');
+ e.initEvent(type, true, true);
+ e.target = el;
+
+ extend(e, eventArguments);
+
+ if (el.dispatchEvent) {
+ el.dispatchEvent(e);
+ } else {
+ el.fireEvent(type, e);
+ }
+
+ } else if (hcEvents) {
+
+ events = hcEvents[type] || [];
+ len = events.length;
+
+ // Attach a simple preventDefault function to skip default handler if called.
+ // The built-in defaultPrevented property is not overwritable (#5112)
+ if (!eventArguments.preventDefault) {
+ eventArguments.preventDefault = function () {
+ eventArguments.defaultPrevented = true;
+ };
+ }
+
+ eventArguments.target = el;
+
+ // If the type is not set, we're running a custom event (#2297). If it is set,
+ // we're running a browser event, and setting it will cause en error in
+ // IE8 (#2465).
+ if (!eventArguments.type) {
+ eventArguments.type = type;
+ }
+
+ for (i = 0; i < len; i++) {
+ fn = events[i];
+
+ // If the event handler return false, prevent the default handler from executing
+ if (fn && fn.call(el, eventArguments) === false) {
+ eventArguments.preventDefault();
+ }
+ }
+ }
+
+ // Run the default if not prevented
+ if (defaultFunction && !eventArguments.defaultPrevented) {
+ defaultFunction(eventArguments);
+ }
+ };
+
+ /**
+ * The global animate method, which uses Fx to create individual animators.
+ */
+ animate = function (el, params, opt) {
+ var start,
+ unit = '',
+ end,
+ fx,
+ args,
+ prop;
+
+ if (!isObject(opt)) { // Number or undefined/null
+ args = arguments;
+ opt = {
+ duration: args[2],
+ easing: args[3],
+ complete: args[4]
+ };
+ }
+ if (!isNumber(opt.duration)) {
+ opt.duration = 400;
+ }
+ opt.easing = typeof opt.easing === 'function' ? opt.easing : (Math[opt.easing] || Math.easeInOutSine);
+ opt.curAnim = merge(params);
+
+ for (prop in params) {
+ fx = new Fx(el, opt, prop);
+ end = null;
+
+ if (prop === 'd') {
+ fx.paths = fx.initPath(
+ el,
+ el.d,
+ params.d
+ );
+ fx.toD = params.d;
+ start = 0;
+ end = 1;
+ } else if (el.attr) {
+ start = el.attr(prop);
+ } else {
+ start = parseFloat(getStyle(el, prop)) || 0;
+ if (prop !== 'opacity') {
+ unit = 'px';
+ }
+ }
+
+ if (!end) {
+ end = params[prop];
+ }
+ if (end.match && end.match('px')) {
+ end = end.replace(/px/g, ''); // #4351
+ }
+ fx.run(start, end, unit);
+ }
+ };
+
+ /**
+ * Register Highcharts as a plugin in jQuery
+ */
+ if (win.jQuery) {
+ win.jQuery.fn.highcharts = function () {
+ var args = [].slice.call(arguments);
+
+ if (this[0]) { // this[0] is the renderTo div
+
+ // Create the chart
+ if (args[0]) {
+ new Highcharts[ // eslint-disable-line no-new
+ isString(args[0]) ? args.shift() : 'Chart' // Constructor defaults to Chart
+ ](this[0], args[0], args[1]);
+ return this;
+ }
+
+ // When called without parameters or with the return argument, return an existing chart
+ return charts[attr(this[0], 'data-highcharts-chart')];
+ }
+ };
+ }
+
+
+ /**
+ * Compatibility section to add support for legacy IE. This can be removed if old IE
+ * support is not needed.
+ */
+ if (doc && !doc.defaultView) {
+ getStyle = function (el, prop) {
+ var val,
+ alias = { width: 'clientWidth', height: 'clientHeight' }[prop];
+
+ if (el.style[prop]) {
+ return pInt(el.style[prop]);
+ }
+ if (prop === 'opacity') {
+ prop = 'filter';
+ }
+
+ // Getting the rendered width and height
+ if (alias) {
+ el.style.zoom = 1;
+ return Math.max(el[alias] - 2 * getStyle(el, 'padding'), 0);
+ }
+
+ val = el.currentStyle[prop.replace(/\-(\w)/g, function (a, b) {
+ return b.toUpperCase();
+ })];
+ if (prop === 'filter') {
+ val = val.replace(
+ /alpha\(opacity=([0-9]+)\)/,
+ function (a, b) {
+ return b / 100;
+ }
+ );
+ }
+
+ return val === '' ? 1 : pInt(val);
+ };
+ }
+
+ if (!Array.prototype.forEach) {
+ each = function (arr, fn) { // legacy
+ var i = 0,
+ len = arr.length;
+ for (; i < len; i++) {
+ if (fn.call(arr[i], arr[i], i, arr) === false) {
+ return i;
+ }
+ }
+ };
+ }
+
+ if (!Array.prototype.indexOf) {
+ inArray = function (item, arr) {
+ var len,
+ i = 0;
+
+ if (arr) {
+ len = arr.length;
+
+ for (; i < len; i++) {
+ if (arr[i] === item) {
+ return i;
+ }
+ }
+ }
+
+ return -1;
+ };
+ }
+
+ if (!Array.prototype.filter) {
+ grep = function (elements, fn) {
+ var ret = [],
+ i = 0,
+ length = elements.length;
+
+ for (; i < length; i++) {
+ if (fn(elements[i], i)) {
+ ret.push(elements[i]);
+ }
+ }
+
+ return ret;
+ };
+ }
+
+ //--- End compatibility section ---
+
+ // Expose utilities
+ Highcharts.Fx = Fx;
+ Highcharts.inArray = inArray;
+ Highcharts.each = each;
+ Highcharts.grep = grep;
+ Highcharts.offset = offset;
+ Highcharts.map = map;
+ Highcharts.addEvent = addEvent;
+ Highcharts.removeEvent = removeEvent;
+ Highcharts.fireEvent = fireEvent;
+ Highcharts.animate = animate;
+ Highcharts.animObject = animObject;
+ Highcharts.stop = stop;
+
+ /* ****************************************************************************
+ * Handle the options *
+ *****************************************************************************/
+ defaultOptions = {
+ colors: ['#7cb5ec', '#434348', '#90ed7d', '#f7a35c',
+ '#8085e9', '#f15c80', '#e4d354', '#2b908f', '#f45b5b', '#91e8e1'],
+ symbols: ['circle', 'diamond', 'square', 'triangle', 'triangle-down'],
+ lang: {
+ loading: 'Loading...',
+ months: ['January', 'February', 'March', 'April', 'May', 'June', 'July',
+ 'August', 'September', 'October', 'November', 'December'],
+ shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+ // invalidDate: '',
+ decimalPoint: '.',
+ numericSymbols: ['k', 'M', 'G', 'T', 'P', 'E'], // SI prefixes used in axis labels
+ resetZoom: 'Reset zoom',
+ resetZoomTitle: 'Reset zoom level 1:1',
+ thousandsSep: ' '
+ },
+ global: {
+ useUTC: true,
+ //timezoneOffset: 0,
+ canvasToolsURL: 'http://code.highcharts.com/modules/canvas-tools.js',
+ VMLRadialGradientURL: 'http://code.highcharts.com/stock/4.2.6/gfx/vml-radial-gradient.png'
+ },
+ chart: {
+ //animation: true,
+ //alignTicks: false,
+ //reflow: true,
+ //className: null,
+ //events: { load, selection },
+ //margin: [null],
+ //marginTop: null,
+ //marginRight: null,
+ //marginBottom: null,
+ //marginLeft: null,
+ borderColor: '#4572A7',
+ //borderWidth: 0,
+ borderRadius: 0,
+ defaultSeriesType: 'line',
+ ignoreHiddenSeries: true,
+ //inverted: false,
+ //shadow: false,
+ spacing: [10, 10, 15, 10],
+ //spacingTop: 10,
+ //spacingRight: 10,
+ //spacingBottom: 15,
+ //spacingLeft: 10,
+ //style: {
+ // fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif', // default font
+ // fontSize: '12px'
+ //},
+ backgroundColor: '#FFFFFF',
+ //plotBackgroundColor: null,
+ plotBorderColor: '#C0C0C0',
+ //plotBorderWidth: 0,
+ //plotShadow: false,
+ //zoomType: ''
+ resetZoomButton: {
+ theme: {
+ zIndex: 20
+ },
+ position: {
+ align: 'right',
+ x: -10,
+ //verticalAlign: 'top',
+ y: 10
+ }
+ // relativeTo: 'plot'
+ },
+ width: null,
+ height: null
+ },
+ title: {
+ text: 'Chart title',
+ align: 'center',
+ // floating: false,
+ margin: 15,
+ // x: 0,
+ // verticalAlign: 'top',
+ // y: null,
+ style: {
+ color: '#333333',
+ fontSize: '18px'
+ },
+ widthAdjust: -44
+
+ },
+ subtitle: {
+ text: '',
+ align: 'center',
+ // floating: false
+ // x: 0,
+ // verticalAlign: 'top',
+ // y: null,
+ style: {
+ color: '#555555'
+ },
+ widthAdjust: -44
+ },
+
+ plotOptions: {
+ line: { // base series options
+ allowPointSelect: false,
+ showCheckbox: false,
+ animation: {
+ duration: 1000
+ },
+ //connectNulls: false,
+ //cursor: 'default',
+ //clip: true,
+ //dashStyle: null,
+ //enableMouseTracking: true,
+ events: {},
+ //legendIndex: 0,
+ //linecap: 'round',
+ lineWidth: 2,
+ //shadow: false,
+ // stacking: null,
+ marker: {
+ //enabled: true,
+ //symbol: null,
+ lineWidth: 0,
+ radius: 4,
+ lineColor: '#FFFFFF',
+ //fillColor: null,
+ states: { // states for a single point
+ hover: {
+ enabled: true,
+ lineWidthPlus: 1,
+ radiusPlus: 2
+ },
+ select: {
+ fillColor: '#FFFFFF',
+ lineColor: '#000000',
+ lineWidth: 2
+ }
+ }
+ },
+ point: {
+ events: {}
+ },
+ dataLabels: {
+ align: 'center',
+ // defer: true,
+ // enabled: false,
+ formatter: function () {
+ return this.y === null ? '' : Highcharts.numberFormat(this.y, -1);
+ },
+ style: {
+ color: 'contrast',
+ fontSize: '11px',
+ fontWeight: 'bold',
+ textShadow: '0 0 6px contrast, 0 0 3px contrast'
+ },
+ verticalAlign: 'bottom', // above singular point
+ x: 0,
+ y: 0,
+ // backgroundColor: undefined,
+ // borderColor: undefined,
+ // borderRadius: undefined,
+ // borderWidth: undefined,
+ padding: 5
+ // shadow: false
+ },
+ cropThreshold: 300, // draw points outside the plot area when the number of points is less than this
+ pointRange: 0,
+ //pointStart: 0,
+ //pointInterval: 1,
+ //showInLegend: null, // auto: true for standalone series, false for linked series
+ softThreshold: true,
+ states: { // states for the entire series
+ hover: {
+ //enabled: false,
+ lineWidthPlus: 1,
+ marker: {
+ // lineWidth: base + 1,
+ // radius: base + 1
+ },
+ halo: {
+ size: 10,
+ opacity: 0.25
+ }
+ },
+ select: {
+ marker: {}
+ }
+ },
+ stickyTracking: true,
+ //tooltip: {
+ //pointFormat: '\u25CF {series.name}: {point.y} '
+ //valueDecimals: null,
+ //xDateFormat: '%A, %b %e, %Y',
+ //valuePrefix: '',
+ //ySuffix: ''
+ //}
+ turboThreshold: 1000
+ // zIndex: null
+ }
+ },
+ labels: {
+ //items: [],
+ style: {
+ //font: defaultFont,
+ position: ABSOLUTE,
+ color: '#3E576F'
+ }
+ },
+ legend: {
+ enabled: true,
+ align: 'center',
+ //floating: false,
+ layout: 'horizontal',
+ labelFormatter: function () {
+ return this.name;
+ },
+ //borderWidth: 0,
+ borderColor: '#909090',
+ borderRadius: 0,
+ navigation: {
+ // animation: true,
+ activeColor: '#274b6d',
+ // arrowSize: 12
+ inactiveColor: '#CCC'
+ // style: {} // text styles
+ },
+ // margin: 20,
+ // reversed: false,
+ shadow: false,
+ // backgroundColor: null,
+ /*style: {
+ padding: '5px'
+ },*/
+ itemStyle: {
+ color: '#333333',
+ fontSize: '12px',
+ fontWeight: 'bold'
+ },
+ itemHoverStyle: {
+ //cursor: 'pointer', removed as of #601
+ color: '#000'
+ },
+ itemHiddenStyle: {
+ color: '#CCC'
+ },
+ itemCheckboxStyle: {
+ position: ABSOLUTE,
+ width: '13px', // for IE precision
+ height: '13px'
+ },
+ // itemWidth: undefined,
+ // symbolRadius: 0,
+ // symbolWidth: 16,
+ symbolPadding: 5,
+ verticalAlign: 'bottom',
+ // width: undefined,
+ x: 0,
+ y: 0,
+ title: {
+ //text: null,
+ style: {
+ fontWeight: 'bold'
+ }
+ }
+ },
+
+ loading: {
+ // hideDuration: 100,
+ labelStyle: {
+ fontWeight: 'bold',
+ position: RELATIVE,
+ top: '45%'
+ },
+ // showDuration: 0,
+ style: {
+ position: ABSOLUTE,
+ backgroundColor: 'white',
+ opacity: 0.5,
+ textAlign: 'center'
+ }
+ },
+
+ tooltip: {
+ enabled: true,
+ animation: hasSVG,
+ //crosshairs: null,
+ backgroundColor: 'rgba(249, 249, 249, .85)',
+ borderWidth: 1,
+ borderRadius: 3,
+ dateTimeLabelFormats: {
+ millisecond: '%A, %b %e, %H:%M:%S.%L',
+ second: '%A, %b %e, %H:%M:%S',
+ minute: '%A, %b %e, %H:%M',
+ hour: '%A, %b %e, %H:%M',
+ day: '%A, %b %e, %Y',
+ week: 'Week from %A, %b %e, %Y',
+ month: '%B %Y',
+ year: '%Y'
+ },
+ footerFormat: '',
+ //formatter: defaultFormatter,
+ headerFormat: '{point.key} ',
+ pointFormat: '\u25CF {series.name}: {point.y} ',
+ shadow: true,
+ //shape: 'callout',
+ //shared: false,
+ snap: isTouchDevice ? 25 : 10,
+ style: {
+ color: '#333333',
+ cursor: 'default',
+ fontSize: '12px',
+ padding: '8px',
+ pointerEvents: 'none', // #1686 http://caniuse.com/#feat=pointer-events
+ whiteSpace: 'nowrap'
+ }
+ //xDateFormat: '%A, %b %e, %Y',
+ //valueDecimals: null,
+ //valuePrefix: '',
+ //valueSuffix: ''
+ },
+
+ credits: {
+ enabled: true,
+ text: 'Highcharts.com',
+ href: 'http://www.highcharts.com',
+ position: {
+ align: 'right',
+ x: -10,
+ verticalAlign: 'bottom',
+ y: -5
+ },
+ style: {
+ cursor: 'pointer',
+ color: '#909090',
+ fontSize: '9px'
+ }
+ }
+ };
+
+
+
+ /**
+ * Set the time methods globally based on the useUTC option. Time method can be either
+ * local time or UTC (default).
+ */
+ function setTimeMethods() {
+ var globalOptions = defaultOptions.global,
+ useUTC = globalOptions.useUTC,
+ GET = useUTC ? 'getUTC' : 'get',
+ SET = useUTC ? 'setUTC' : 'set';
+
+
+ Date = globalOptions.Date || win.Date;
+ timezoneOffset = useUTC && globalOptions.timezoneOffset;
+ getTimezoneOffset = useUTC && globalOptions.getTimezoneOffset;
+ makeTime = function (year, month, date, hours, minutes, seconds) {
+ var d;
+ if (useUTC) {
+ d = Date.UTC.apply(0, arguments);
+ d += getTZOffset(d);
+ } else {
+ d = new Date(
+ year,
+ month,
+ pick(date, 1),
+ pick(hours, 0),
+ pick(minutes, 0),
+ pick(seconds, 0)
+ ).getTime();
+ }
+ return d;
+ };
+ getMinutes = GET + 'Minutes';
+ getHours = GET + 'Hours';
+ getDay = GET + 'Day';
+ getDate = GET + 'Date';
+ getMonth = GET + 'Month';
+ getFullYear = GET + 'FullYear';
+ setMilliseconds = SET + 'Milliseconds';
+ setSeconds = SET + 'Seconds';
+ setMinutes = SET + 'Minutes';
+ setHours = SET + 'Hours';
+ setDate = SET + 'Date';
+ setMonth = SET + 'Month';
+ setFullYear = SET + 'FullYear';
+
+ }
+
+ /**
+ * Merge the default options with custom options and return the new options structure
+ * @param {Object} options The new custom options
+ */
+ function setOptions(options) {
+
+ // Copy in the default options
+ defaultOptions = merge(true, defaultOptions, options);
+
+ // Apply UTC
+ setTimeMethods();
+
+ return defaultOptions;
+ }
+
+ /**
+ * Get the updated default options. Until 3.0.7, merely exposing defaultOptions for outside modules
+ * wasn't enough because the setOptions method created a new object.
+ */
+ function getOptions() {
+ return defaultOptions;
+ }
+
+
+
+
+
+
+ // Series defaults
+ var defaultPlotOptions = defaultOptions.plotOptions,
+ defaultSeriesOptions = defaultPlotOptions.line;
+
+ // set the default time methods
+ setTimeMethods();
+
+
+ /**
+ * Handle color operations. The object methods are chainable.
+ * @param {String} input The input color in either rbga or hex format
+ */
+ function Color(input) {
+ // Backwards compatibility, allow instanciation without new
+ if (!(this instanceof Color)) {
+ return new Color(input);
+ }
+ // Initialize
+ this.init(input);
+ }
+ Color.prototype = {
+
+ // Collection of parsers. This can be extended from the outside by pushing parsers
+ // to Highcharts.Colors.prototype.parsers.
+ parsers: [{
+ // RGBA color
+ regex: /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,
+ parse: function (result) {
+ return [pInt(result[1]), pInt(result[2]), pInt(result[3]), parseFloat(result[4], 10)];
+ }
+ }, {
+ // HEX color
+ regex: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,
+ parse: function (result) {
+ return [pInt(result[1], 16), pInt(result[2], 16), pInt(result[3], 16), 1];
+ }
+ }, {
+ // RGB color
+ regex: /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,
+ parse: function (result) {
+ return [pInt(result[1]), pInt(result[2]), pInt(result[3]), 1];
+ }
+ }],
+
+ /**
+ * Parse the input color to rgba array
+ * @param {String} input
+ */
+ init: function (input) {
+ var result,
+ rgba,
+ i,
+ parser;
+
+ this.input = input;
+
+ // Gradients
+ if (input && input.stops) {
+ this.stops = map(input.stops, function (stop) {
+ return new Color(stop[1]);
+ });
+
+ // Solid colors
+ } else {
+ i = this.parsers.length;
+ while (i-- && !rgba) {
+ parser = this.parsers[i];
+ result = parser.regex.exec(input);
+ if (result) {
+ rgba = parser.parse(result);
+ }
+ }
+ }
+ this.rgba = rgba || [];
+ },
+
+ /**
+ * Return the color a specified format
+ * @param {String} format
+ */
+ get: function (format) {
+ var input = this.input,
+ rgba = this.rgba,
+ ret;
+
+ if (this.stops) {
+ ret = merge(input);
+ ret.stops = [].concat(ret.stops);
+ each(this.stops, function (stop, i) {
+ ret.stops[i] = [ret.stops[i][0], stop.get(format)];
+ });
+
+ // it's NaN if gradient colors on a column chart
+ } else if (rgba && isNumber(rgba[0])) {
+ if (format === 'rgb' || (!format && rgba[3] === 1)) {
+ ret = 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')';
+ } else if (format === 'a') {
+ ret = rgba[3];
+ } else {
+ ret = 'rgba(' + rgba.join(',') + ')';
+ }
+ } else {
+ ret = input;
+ }
+ return ret;
+ },
+
+ /**
+ * Brighten the color
+ * @param {Number} alpha
+ */
+ brighten: function (alpha) {
+ var i,
+ rgba = this.rgba;
+
+ if (this.stops) {
+ each(this.stops, function (stop) {
+ stop.brighten(alpha);
+ });
+
+ } else if (isNumber(alpha) && alpha !== 0) {
+ for (i = 0; i < 3; i++) {
+ rgba[i] += pInt(alpha * 255);
+
+ if (rgba[i] < 0) {
+ rgba[i] = 0;
+ }
+ if (rgba[i] > 255) {
+ rgba[i] = 255;
+ }
+ }
+ }
+ return this;
+ },
+
+ /**
+ * Set the color's opacity to a given alpha value
+ * @param {Number} alpha
+ */
+ setOpacity: function (alpha) {
+ this.rgba[3] = alpha;
+ return this;
+ }
+ };
+
+
+ /**
+ * A wrapper object for SVG elements
+ */
+ function SVGElement() {}
+
+ SVGElement.prototype = {
+
+ // Default base for animation
+ opacity: 1,
+ // For labels, these CSS properties are applied to the node directly
+ textProps: ['direction', 'fontSize', 'fontWeight', 'fontFamily', 'fontStyle', 'color',
+ 'lineHeight', 'width', 'textDecoration', 'textOverflow', 'textShadow'],
+
+ /**
+ * Initialize the SVG renderer
+ * @param {Object} renderer
+ * @param {String} nodeName
+ */
+ init: function (renderer, nodeName) {
+ var wrapper = this;
+ wrapper.element = nodeName === 'span' ?
+ createElement(nodeName) :
+ doc.createElementNS(SVG_NS, nodeName);
+ wrapper.renderer = renderer;
+ },
+
+ /**
+ * Animate a given attribute
+ * @param {Object} params
+ * @param {Number} options Options include duration, easing, step and complete
+ * @param {Function} complete Function to perform at the end of animation
+ */
+ animate: function (params, options, complete) {
+ var animOptions = pick(options, this.renderer.globalAnimation, true);
+ stop(this); // stop regardless of animation actually running, or reverting to .attr (#607)
+ if (animOptions) {
+ if (complete) { // allows using a callback with the global animation without overwriting it
+ animOptions.complete = complete;
+ }
+ animate(this, params, animOptions);
+ } else {
+ this.attr(params, null, complete);
+ }
+ return this;
+ },
+
+ /**
+ * Build an SVG gradient out of a common JavaScript configuration object
+ */
+ colorGradient: function (color, prop, elem) {
+ var renderer = this.renderer,
+ colorObject,
+ gradName,
+ gradAttr,
+ radAttr,
+ gradients,
+ gradientObject,
+ stops,
+ stopColor,
+ stopOpacity,
+ radialReference,
+ n,
+ id,
+ key = [],
+ value;
+
+ // Apply linear or radial gradients
+ if (color.linearGradient) {
+ gradName = 'linearGradient';
+ } else if (color.radialGradient) {
+ gradName = 'radialGradient';
+ }
+
+ if (gradName) {
+ gradAttr = color[gradName];
+ gradients = renderer.gradients;
+ stops = color.stops;
+ radialReference = elem.radialReference;
+
+ // Keep < 2.2 kompatibility
+ if (isArray(gradAttr)) {
+ color[gradName] = gradAttr = {
+ x1: gradAttr[0],
+ y1: gradAttr[1],
+ x2: gradAttr[2],
+ y2: gradAttr[3],
+ gradientUnits: 'userSpaceOnUse'
+ };
+ }
+
+ // Correct the radial gradient for the radial reference system
+ if (gradName === 'radialGradient' && radialReference && !defined(gradAttr.gradientUnits)) {
+ radAttr = gradAttr; // Save the radial attributes for updating
+ gradAttr = merge(gradAttr,
+ renderer.getRadialAttr(radialReference, radAttr),
+ { gradientUnits: 'userSpaceOnUse' }
+ );
+ }
+
+ // Build the unique key to detect whether we need to create a new element (#1282)
+ for (n in gradAttr) {
+ if (n !== 'id') {
+ key.push(n, gradAttr[n]);
+ }
+ }
+ for (n in stops) {
+ key.push(stops[n]);
+ }
+ key = key.join(',');
+
+ // Check if a gradient object with the same config object is created within this renderer
+ if (gradients[key]) {
+ id = gradients[key].attr('id');
+
+ } else {
+
+ // Set the id and create the element
+ gradAttr.id = id = PREFIX + idCounter++;
+ gradients[key] = gradientObject = renderer.createElement(gradName)
+ .attr(gradAttr)
+ .add(renderer.defs);
+
+ gradientObject.radAttr = radAttr;
+
+ // The gradient needs to keep a list of stops to be able to destroy them
+ gradientObject.stops = [];
+ each(stops, function (stop) {
+ var stopObject;
+ if (stop[1].indexOf('rgba') === 0) {
+ colorObject = Color(stop[1]);
+ stopColor = colorObject.get('rgb');
+ stopOpacity = colorObject.get('a');
+ } else {
+ stopColor = stop[1];
+ stopOpacity = 1;
+ }
+ stopObject = renderer.createElement('stop').attr({
+ offset: stop[0],
+ 'stop-color': stopColor,
+ 'stop-opacity': stopOpacity
+ }).add(gradientObject);
+
+ // Add the stop element to the gradient
+ gradientObject.stops.push(stopObject);
+ });
+ }
+
+ // Set the reference to the gradient object
+ value = 'url(' + renderer.url + '#' + id + ')';
+ elem.setAttribute(prop, value);
+ elem.gradient = key;
+
+ // Allow the color to be concatenated into tooltips formatters etc. (#2995)
+ color.toString = function () {
+ return value;
+ };
+ }
+ },
+
+ /**
+ * Apply a polyfill to the text-stroke CSS property, by copying the text element
+ * and apply strokes to the copy.
+ *
+ * Contrast checks at http://jsfiddle.net/highcharts/43soe9m1/2/
+ */
+ applyTextShadow: function (textShadow) {
+ var elem = this.element,
+ tspans,
+ hasContrast = textShadow.indexOf('contrast') !== -1,
+ styles = {},
+ forExport = this.renderer.forExport,
+ // IE10 and IE11 report textShadow in elem.style even though it doesn't work. Check
+ // this again with new IE release. In exports, the rendering is passed to PhantomJS.
+ supports = forExport || (elem.style.textShadow !== UNDEFINED && !isMS);
+
+ // When the text shadow is set to contrast, use dark stroke for light text and vice versa
+ if (hasContrast) {
+ styles.textShadow = textShadow = textShadow.replace(/contrast/g, this.renderer.getContrast(elem.style.fill));
+ }
+
+ // Safari with retina displays as well as PhantomJS bug (#3974). Firefox does not tolerate this,
+ // it removes the text shadows.
+ if (isWebKit || forExport) {
+ styles.textRendering = 'geometricPrecision';
+ }
+
+ /* Selective side-by-side testing in supported browser (http://jsfiddle.net/highcharts/73L1ptrh/)
+ if (elem.textContent.indexOf('2.') === 0) {
+ elem.style['text-shadow'] = 'none';
+ supports = false;
+ }
+ // */
+
+ // No reason to polyfill, we've got native support
+ if (supports) {
+ this.css(styles); // Apply altered textShadow or textRendering workaround
+ } else {
+
+ this.fakeTS = true; // Fake text shadow
+
+ // In order to get the right y position of the clones,
+ // copy over the y setter
+ this.ySetter = this.xSetter;
+
+ tspans = [].slice.call(elem.getElementsByTagName('tspan'));
+ each(textShadow.split(/\s?,\s?/g), function (textShadow) {
+ var firstChild = elem.firstChild,
+ color,
+ strokeWidth;
+
+ textShadow = textShadow.split(' ');
+ color = textShadow[textShadow.length - 1];
+
+ // Approximately tune the settings to the text-shadow behaviour
+ strokeWidth = textShadow[textShadow.length - 2];
+
+ if (strokeWidth) {
+ each(tspans, function (tspan, y) {
+ var clone;
+
+ // Let the first line start at the correct X position
+ if (y === 0) {
+ tspan.setAttribute('x', elem.getAttribute('x'));
+ y = elem.getAttribute('y');
+ tspan.setAttribute('y', y || 0);
+ if (y === null) {
+ elem.setAttribute('y', 0);
+ }
+ }
+
+ // Create the clone and apply shadow properties
+ clone = tspan.cloneNode(1);
+ attr(clone, {
+ 'class': PREFIX + 'text-shadow',
+ 'fill': color,
+ 'stroke': color,
+ 'stroke-opacity': 1 / mathMax(pInt(strokeWidth), 3),
+ 'stroke-width': strokeWidth,
+ 'stroke-linejoin': 'round'
+ });
+ elem.insertBefore(clone, firstChild);
+ });
+ }
+ });
+ }
+ },
+
+ /**
+ * Set or get a given attribute
+ * @param {Object|String} hash
+ * @param {Mixed|Undefined} val
+ */
+ attr: function (hash, val, complete) {
+ var key,
+ value,
+ element = this.element,
+ hasSetSymbolSize,
+ ret = this,
+ skipAttr,
+ setter;
+
+ // single key-value pair
+ if (typeof hash === 'string' && val !== UNDEFINED) {
+ key = hash;
+ hash = {};
+ hash[key] = val;
+ }
+
+ // used as a getter: first argument is a string, second is undefined
+ if (typeof hash === 'string') {
+ ret = (this[hash + 'Getter'] || this._defaultGetter).call(this, hash, element);
+
+ // setter
+ } else {
+
+ for (key in hash) {
+ value = hash[key];
+ skipAttr = false;
+
+
+
+ if (this.symbolName && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(key)) {
+ if (!hasSetSymbolSize) {
+ this.symbolAttr(hash);
+ hasSetSymbolSize = true;
+ }
+ skipAttr = true;
+ }
+
+ if (this.rotation && (key === 'x' || key === 'y')) {
+ this.doTransform = true;
+ }
+
+ if (!skipAttr) {
+ setter = this[key + 'Setter'] || this._defaultSetter;
+ setter.call(this, value, key, element);
+
+ // Let the shadow follow the main element
+ if (this.shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(key)) {
+ this.updateShadows(key, value, setter);
+ }
+ }
+ }
+
+ // Update transform. Do this outside the loop to prevent redundant updating for batch setting
+ // of attributes.
+ if (this.doTransform) {
+ this.updateTransform();
+ this.doTransform = false;
+ }
+
+ }
+
+ // In accordance with animate, run a complete callback
+ if (complete) {
+ complete();
+ }
+
+ return ret;
+ },
+
+ /**
+ * Update the shadow elements with new attributes
+ * @param {String} key The attribute name
+ * @param {String|Number} value The value of the attribute
+ * @param {Function} setter The setter function, inherited from the parent wrapper
+ * @returns {undefined}
+ */
+ updateShadows: function (key, value, setter) {
+ var shadows = this.shadows,
+ i = shadows.length;
+
+ while (i--) {
+ setter.call(
+ shadows[i],
+ key === 'height' ?
+ Math.max(value - (shadows[i].cutHeight || 0), 0) :
+ key === 'd' ? this.d : value,
+ key,
+ shadows[i]
+ );
+ }
+ },
+
+ /**
+ * Add a class name to an element
+ */
+ addClass: function (className) {
+ var element = this.element,
+ currentClassName = attr(element, 'class') || '';
+
+ if (currentClassName.indexOf(className) === -1) {
+ attr(element, 'class', currentClassName + ' ' + className);
+ }
+ return this;
+ },
+ /* hasClass and removeClass are not (yet) needed
+ hasClass: function (className) {
+ return attr(this.element, 'class').indexOf(className) !== -1;
+ },
+ removeClass: function (className) {
+ attr(this.element, 'class', attr(this.element, 'class').replace(className, ''));
+ return this;
+ },
+ */
+
+ /**
+ * If one of the symbol size affecting parameters are changed,
+ * check all the others only once for each call to an element's
+ * .attr() method
+ * @param {Object} hash
+ */
+ symbolAttr: function (hash) {
+ var wrapper = this;
+
+ each(['x', 'y', 'r', 'start', 'end', 'width', 'height', 'innerR', 'anchorX', 'anchorY'], function (key) {
+ wrapper[key] = pick(hash[key], wrapper[key]);
+ });
+
+ wrapper.attr({
+ d: wrapper.renderer.symbols[wrapper.symbolName](
+ wrapper.x,
+ wrapper.y,
+ wrapper.width,
+ wrapper.height,
+ wrapper
+ )
+ });
+ },
+
+ /**
+ * Apply a clipping path to this object
+ * @param {String} id
+ */
+ clip: function (clipRect) {
+ return this.attr('clip-path', clipRect ? 'url(' + this.renderer.url + '#' + clipRect.id + ')' : NONE);
+ },
+
+ /**
+ * Calculate the coordinates needed for drawing a rectangle crisply and return the
+ * calculated attributes
+ * @param {Number} strokeWidth
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} width
+ * @param {Number} height
+ */
+ crisp: function (rect) {
+
+ var wrapper = this,
+ key,
+ attribs = {},
+ normalizer,
+ strokeWidth = wrapper.strokeWidth || 0;
+
+ normalizer = mathRound(strokeWidth) % 2 / 2; // mathRound because strokeWidth can sometimes have roundoff errors
+
+ // normalize for crisp edges
+ rect.x = mathFloor(rect.x || wrapper.x || 0) + normalizer;
+ rect.y = mathFloor(rect.y || wrapper.y || 0) + normalizer;
+ rect.width = mathFloor((rect.width || wrapper.width || 0) - 2 * normalizer);
+ rect.height = mathFloor((rect.height || wrapper.height || 0) - 2 * normalizer);
+ rect.strokeWidth = strokeWidth;
+
+ for (key in rect) {
+ if (wrapper[key] !== rect[key]) { // only set attribute if changed
+ wrapper[key] = attribs[key] = rect[key];
+ }
+ }
+
+ return attribs;
+ },
+
+ /**
+ * Set styles for the element
+ * @param {Object} styles
+ */
+ css: function (styles) {
+ var elemWrapper = this,
+ oldStyles = elemWrapper.styles,
+ newStyles = {},
+ elem = elemWrapper.element,
+ textWidth,
+ n,
+ serializedCss = '',
+ hyphenate,
+ hasNew = !oldStyles;
+
+ // convert legacy
+ if (styles && styles.color) {
+ styles.fill = styles.color;
+ }
+
+ // Filter out existing styles to increase performance (#2640)
+ if (oldStyles) {
+ for (n in styles) {
+ if (styles[n] !== oldStyles[n]) {
+ newStyles[n] = styles[n];
+ hasNew = true;
+ }
+ }
+ }
+ if (hasNew) {
+ textWidth = elemWrapper.textWidth =
+ (styles && styles.width && elem.nodeName.toLowerCase() === 'text' && pInt(styles.width)) ||
+ elemWrapper.textWidth; // #3501
+
+ // Merge the new styles with the old ones
+ if (oldStyles) {
+ styles = extend(
+ oldStyles,
+ newStyles
+ );
+ }
+
+ // store object
+ elemWrapper.styles = styles;
+
+ if (textWidth && (useCanVG || (!hasSVG && elemWrapper.renderer.forExport))) {
+ delete styles.width;
+ }
+
+ // serialize and set style attribute
+ if (isMS && !hasSVG) {
+ css(elemWrapper.element, styles);
+ } else {
+ hyphenate = function (a, b) {
+ return '-' + b.toLowerCase();
+ };
+ for (n in styles) {
+ serializedCss += n.replace(/([A-Z])/g, hyphenate) + ':' + styles[n] + ';';
+ }
+ attr(elem, 'style', serializedCss); // #1881
+ }
+
+
+ // re-build text
+ if (textWidth && elemWrapper.added) {
+ elemWrapper.renderer.buildText(elemWrapper);
+ }
+ }
+
+ return elemWrapper;
+ },
+
+ /**
+ * Add an event listener
+ * @param {String} eventType
+ * @param {Function} handler
+ */
+ on: function (eventType, handler) {
+ var svgElement = this,
+ element = svgElement.element;
+
+ // touch
+ if (hasTouch && eventType === 'click') {
+ element.ontouchstart = function (e) {
+ svgElement.touchEventFired = Date.now();
+ e.preventDefault();
+ handler.call(element, e);
+ };
+ element.onclick = function (e) {
+ if (userAgent.indexOf('Android') === -1 || Date.now() - (svgElement.touchEventFired || 0) > 1100) { // #2269
+ handler.call(element, e);
+ }
+ };
+ } else {
+ // simplest possible event model for internal use
+ element['on' + eventType] = handler;
+ }
+ return this;
+ },
+
+ /**
+ * Set the coordinates needed to draw a consistent radial gradient across
+ * pie slices regardless of positioning inside the chart. The format is
+ * [centerX, centerY, diameter] in pixels.
+ */
+ setRadialReference: function (coordinates) {
+ var existingGradient = this.renderer.gradients[this.element.gradient];
+
+ this.element.radialReference = coordinates;
+
+ // On redrawing objects with an existing gradient, the gradient needs
+ // to be repositioned (#3801)
+ if (existingGradient && existingGradient.radAttr) {
+ existingGradient.animate(
+ this.renderer.getRadialAttr(
+ coordinates,
+ existingGradient.radAttr
+ )
+ );
+ }
+
+ return this;
+ },
+
+ /**
+ * Move an object and its children by x and y values
+ * @param {Number} x
+ * @param {Number} y
+ */
+ translate: function (x, y) {
+ return this.attr({
+ translateX: x,
+ translateY: y
+ });
+ },
+
+ /**
+ * Invert a group, rotate and flip
+ */
+ invert: function () {
+ var wrapper = this;
+ wrapper.inverted = true;
+ wrapper.updateTransform();
+ return wrapper;
+ },
+
+ /**
+ * Private method to update the transform attribute based on internal
+ * properties
+ */
+ updateTransform: function () {
+ var wrapper = this,
+ translateX = wrapper.translateX || 0,
+ translateY = wrapper.translateY || 0,
+ scaleX = wrapper.scaleX,
+ scaleY = wrapper.scaleY,
+ inverted = wrapper.inverted,
+ rotation = wrapper.rotation,
+ element = wrapper.element,
+ transform;
+
+ // flipping affects translate as adjustment for flipping around the group's axis
+ if (inverted) {
+ translateX += wrapper.attr('width');
+ translateY += wrapper.attr('height');
+ }
+
+ // Apply translate. Nearly all transformed elements have translation, so instead
+ // of checking for translate = 0, do it always (#1767, #1846).
+ transform = ['translate(' + translateX + ',' + translateY + ')'];
+
+ // apply rotation
+ if (inverted) {
+ transform.push('rotate(90) scale(-1,1)');
+ } else if (rotation) { // text rotation
+ transform.push('rotate(' + rotation + ' ' + (element.getAttribute('x') || 0) + ' ' + (element.getAttribute('y') || 0) + ')');
+
+ // Delete bBox memo when the rotation changes
+ //delete wrapper.bBox;
+ }
+
+ // apply scale
+ if (defined(scaleX) || defined(scaleY)) {
+ transform.push('scale(' + pick(scaleX, 1) + ' ' + pick(scaleY, 1) + ')');
+ }
+
+ if (transform.length) {
+ element.setAttribute('transform', transform.join(' '));
+ }
+ },
+ /**
+ * Bring the element to the front
+ */
+ toFront: function () {
+ var element = this.element;
+ element.parentNode.appendChild(element);
+ return this;
+ },
+
+
+ /**
+ * Break down alignment options like align, verticalAlign, x and y
+ * to x and y relative to the chart.
+ *
+ * @param {Object} alignOptions
+ * @param {Boolean} alignByTranslate
+ * @param {String[Object} box The box to align to, needs a width and height. When the
+ * box is a string, it refers to an object in the Renderer. For example, when
+ * box is 'spacingBox', it refers to Renderer.spacingBox which holds width, height
+ * x and y properties.
+ *
+ */
+ align: function (alignOptions, alignByTranslate, box) {
+ var align,
+ vAlign,
+ x,
+ y,
+ attribs = {},
+ alignTo,
+ renderer = this.renderer,
+ alignedObjects = renderer.alignedObjects;
+
+ // First call on instanciate
+ if (alignOptions) {
+ this.alignOptions = alignOptions;
+ this.alignByTranslate = alignByTranslate;
+ if (!box || isString(box)) { // boxes other than renderer handle this internally
+ this.alignTo = alignTo = box || 'renderer';
+ erase(alignedObjects, this); // prevent duplicates, like legendGroup after resize
+ alignedObjects.push(this);
+ box = null; // reassign it below
+ }
+
+ // When called on resize, no arguments are supplied
+ } else {
+ alignOptions = this.alignOptions;
+ alignByTranslate = this.alignByTranslate;
+ alignTo = this.alignTo;
+ }
+
+ box = pick(box, renderer[alignTo], renderer);
+
+ // Assign variables
+ align = alignOptions.align;
+ vAlign = alignOptions.verticalAlign;
+ x = (box.x || 0) + (alignOptions.x || 0); // default: left align
+ y = (box.y || 0) + (alignOptions.y || 0); // default: top align
+
+ // Align
+ if (align === 'right' || align === 'center') {
+ x += (box.width - (alignOptions.width || 0)) /
+ { right: 1, center: 2 }[align];
+ }
+ attribs[alignByTranslate ? 'translateX' : 'x'] = mathRound(x);
+
+
+ // Vertical align
+ if (vAlign === 'bottom' || vAlign === 'middle') {
+ y += (box.height - (alignOptions.height || 0)) /
+ ({ bottom: 1, middle: 2 }[vAlign] || 1);
+
+ }
+ attribs[alignByTranslate ? 'translateY' : 'y'] = mathRound(y);
+
+ // Animate only if already placed
+ this[this.placed ? 'animate' : 'attr'](attribs);
+ this.placed = true;
+ this.alignAttr = attribs;
+
+ return this;
+ },
+
+ /**
+ * Get the bounding box (width, height, x and y) for the element
+ */
+ getBBox: function (reload, rot) {
+ var wrapper = this,
+ bBox, // = wrapper.bBox,
+ renderer = wrapper.renderer,
+ width,
+ height,
+ rotation,
+ rad,
+ element = wrapper.element,
+ styles = wrapper.styles,
+ textStr = wrapper.textStr,
+ textShadow,
+ elemStyle = element.style,
+ toggleTextShadowShim,
+ cache = renderer.cache,
+ cacheKeys = renderer.cacheKeys,
+ cacheKey;
+
+ rotation = pick(rot, wrapper.rotation);
+ rad = rotation * deg2rad;
+
+ if (textStr !== UNDEFINED) {
+
+ // Properties that affect bounding box
+ cacheKey = ['', rotation || 0, styles && styles.fontSize, element.style.width].join(',');
+
+ // Since numbers are monospaced, and numerical labels appear a lot in a chart,
+ // we assume that a label of n characters has the same bounding box as others
+ // of the same length.
+ if (textStr === '' || numRegex.test(textStr)) {
+ cacheKey = 'num:' + textStr.toString().length + cacheKey;
+
+ // Caching all strings reduces rendering time by 4-5%.
+ } else {
+ cacheKey = textStr + cacheKey;
+ }
+ }
+
+ if (cacheKey && !reload) {
+ bBox = cache[cacheKey];
+ }
+
+ // No cache found
+ if (!bBox) {
+
+ // SVG elements
+ if (element.namespaceURI === SVG_NS || renderer.forExport) {
+ try { // Fails in Firefox if the container has display: none.
+
+ // When the text shadow shim is used, we need to hide the fake shadows
+ // to get the correct bounding box (#3872)
+ toggleTextShadowShim = this.fakeTS && function (display) {
+ each(element.querySelectorAll('.' + PREFIX + 'text-shadow'), function (tspan) {
+ tspan.style.display = display;
+ });
+ };
+
+ // Workaround for #3842, Firefox reporting wrong bounding box for shadows
+ if (isFirefox && elemStyle.textShadow) {
+ textShadow = elemStyle.textShadow;
+ elemStyle.textShadow = '';
+ } else if (toggleTextShadowShim) {
+ toggleTextShadowShim(NONE);
+ }
+
+ bBox = element.getBBox ?
+ // SVG: use extend because IE9 is not allowed to change width and height in case
+ // of rotation (below)
+ extend({}, element.getBBox()) :
+ // Canvas renderer and legacy IE in export mode
+ {
+ width: element.offsetWidth,
+ height: element.offsetHeight
+ };
+
+ // #3842
+ if (textShadow) {
+ elemStyle.textShadow = textShadow;
+ } else if (toggleTextShadowShim) {
+ toggleTextShadowShim('');
+ }
+ } catch (e) {}
+
+ // If the bBox is not set, the try-catch block above failed. The other condition
+ // is for Opera that returns a width of -Infinity on hidden elements.
+ if (!bBox || bBox.width < 0) {
+ bBox = { width: 0, height: 0 };
+ }
+
+
+ // VML Renderer or useHTML within SVG
+ } else {
+
+ bBox = wrapper.htmlGetBBox();
+
+ }
+
+ // True SVG elements as well as HTML elements in modern browsers using the .useHTML option
+ // need to compensated for rotation
+ if (renderer.isSVG) {
+ width = bBox.width;
+ height = bBox.height;
+
+ // Workaround for wrong bounding box in IE9 and IE10 (#1101, #1505, #1669, #2568)
+ if (isMS && styles && styles.fontSize === '11px' && height.toPrecision(3) === '16.9') {
+ bBox.height = height = 14;
+ }
+
+ // Adjust for rotated text
+ if (rotation) {
+ bBox.width = mathAbs(height * mathSin(rad)) + mathAbs(width * mathCos(rad));
+ bBox.height = mathAbs(height * mathCos(rad)) + mathAbs(width * mathSin(rad));
+ }
+ }
+
+ // Cache it
+ if (cacheKey) {
+
+ // Rotate (#4681)
+ while (cacheKeys.length > 250) {
+ delete cache[cacheKeys.shift()];
+ }
+
+ if (!cache[cacheKey]) {
+ cacheKeys.push(cacheKey);
+ }
+ cache[cacheKey] = bBox;
+ }
+ }
+ return bBox;
+ },
+
+ /**
+ * Show the element
+ */
+ show: function (inherit) {
+ return this.attr({ visibility: inherit ? 'inherit' : VISIBLE });
+ },
+
+ /**
+ * Hide the element
+ */
+ hide: function () {
+ return this.attr({ visibility: HIDDEN });
+ },
+
+ fadeOut: function (duration) {
+ var elemWrapper = this;
+ elemWrapper.animate({
+ opacity: 0
+ }, {
+ duration: duration || 150,
+ complete: function () {
+ elemWrapper.attr({ y: -9999 }); // #3088, assuming we're only using this for tooltips
+ }
+ });
+ },
+
+ /**
+ * Add the element
+ * @param {Object|Undefined} parent Can be an element, an element wrapper or undefined
+ * to append the element to the renderer.box.
+ */
+ add: function (parent) {
+
+ var renderer = this.renderer,
+ element = this.element,
+ inserted;
+
+ if (parent) {
+ this.parentGroup = parent;
+ }
+
+ // mark as inverted
+ this.parentInverted = parent && parent.inverted;
+
+ // build formatted text
+ if (this.textStr !== undefined) {
+ renderer.buildText(this);
+ }
+
+ // Mark as added
+ this.added = true;
+
+ // If we're adding to renderer root, or other elements in the group
+ // have a z index, we need to handle it
+ if (!parent || parent.handleZ || this.zIndex) {
+ inserted = this.zIndexSetter();
+ }
+
+ // If zIndex is not handled, append at the end
+ if (!inserted) {
+ (parent ? parent.element : renderer.box).appendChild(element);
+ }
+
+ // fire an event for internal hooks
+ if (this.onAdd) {
+ this.onAdd();
+ }
+
+ return this;
+ },
+
+ /**
+ * Removes a child either by removeChild or move to garbageBin.
+ * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not.
+ */
+ safeRemoveChild: function (element) {
+ var parentNode = element.parentNode;
+ if (parentNode) {
+ parentNode.removeChild(element);
+ }
+ },
+
+ /**
+ * Destroy the element and element wrapper
+ */
+ destroy: function () {
+ var wrapper = this,
+ element = wrapper.element || {},
+ shadows = wrapper.shadows,
+ parentToClean = wrapper.renderer.isSVG && element.nodeName === 'SPAN' && wrapper.parentGroup,
+ grandParent,
+ key,
+ i;
+
+ // remove events
+ element.onclick = element.onmouseout = element.onmouseover = element.onmousemove = element.point = null;
+ stop(wrapper); // stop running animations
+
+ if (wrapper.clipPath) {
+ wrapper.clipPath = wrapper.clipPath.destroy();
+ }
+
+ // Destroy stops in case this is a gradient object
+ if (wrapper.stops) {
+ for (i = 0; i < wrapper.stops.length; i++) {
+ wrapper.stops[i] = wrapper.stops[i].destroy();
+ }
+ wrapper.stops = null;
+ }
+
+ // remove element
+ wrapper.safeRemoveChild(element);
+
+ // destroy shadows
+ if (shadows) {
+ each(shadows, function (shadow) {
+ wrapper.safeRemoveChild(shadow);
+ });
+ }
+
+ // In case of useHTML, clean up empty containers emulating SVG groups (#1960, #2393, #2697).
+ while (parentToClean && parentToClean.div && parentToClean.div.childNodes.length === 0) {
+ grandParent = parentToClean.parentGroup;
+ wrapper.safeRemoveChild(parentToClean.div);
+ delete parentToClean.div;
+ parentToClean = grandParent;
+ }
+
+ // remove from alignObjects
+ if (wrapper.alignTo) {
+ erase(wrapper.renderer.alignedObjects, wrapper);
+ }
+
+ for (key in wrapper) {
+ delete wrapper[key];
+ }
+
+ return null;
+ },
+
+ /**
+ * Add a shadow to the element. Must be done after the element is added to the DOM
+ * @param {Boolean|Object} shadowOptions
+ */
+ shadow: function (shadowOptions, group, cutOff) {
+ var shadows = [],
+ i,
+ shadow,
+ element = this.element,
+ strokeWidth,
+ shadowWidth,
+ shadowElementOpacity,
+
+ // compensate for inverted plot area
+ transform;
+
+
+ if (shadowOptions) {
+ shadowWidth = pick(shadowOptions.width, 3);
+ shadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;
+ transform = this.parentInverted ?
+ '(-1,-1)' :
+ '(' + pick(shadowOptions.offsetX, 1) + ', ' + pick(shadowOptions.offsetY, 1) + ')';
+ for (i = 1; i <= shadowWidth; i++) {
+ shadow = element.cloneNode(0);
+ strokeWidth = (shadowWidth * 2) + 1 - (2 * i);
+ attr(shadow, {
+ 'isShadow': 'true',
+ 'stroke': shadowOptions.color || 'black',
+ 'stroke-opacity': shadowElementOpacity * i,
+ 'stroke-width': strokeWidth,
+ 'transform': 'translate' + transform,
+ 'fill': NONE
+ });
+ if (cutOff) {
+ attr(shadow, 'height', mathMax(attr(shadow, 'height') - strokeWidth, 0));
+ shadow.cutHeight = strokeWidth;
+ }
+
+ if (group) {
+ group.element.appendChild(shadow);
+ } else {
+ element.parentNode.insertBefore(shadow, element);
+ }
+
+ shadows.push(shadow);
+ }
+
+ this.shadows = shadows;
+ }
+ return this;
+
+ },
+
+ xGetter: function (key) {
+ if (this.element.nodeName === 'circle') {
+ key = { x: 'cx', y: 'cy' }[key] || key;
+ }
+ return this._defaultGetter(key);
+ },
+
+ /**
+ * Get the current value of an attribute or pseudo attribute, used mainly
+ * for animation.
+ */
+ _defaultGetter: function (key) {
+ var ret = pick(this[key], this.element ? this.element.getAttribute(key) : null, 0);
+
+ if (/^[\-0-9\.]+$/.test(ret)) { // is numerical
+ ret = parseFloat(ret);
+ }
+ return ret;
+ },
+
+
+ dSetter: function (value, key, element) {
+ if (value && value.join) { // join path
+ value = value.join(' ');
+ }
+ if (/(NaN| {2}|^$)/.test(value)) {
+ value = 'M 0 0';
+ }
+ element.setAttribute(key, value);
+
+ this[key] = value;
+ },
+ dashstyleSetter: function (value) {
+ var i,
+ strokeWidth = this['stroke-width'];
+
+ // If "inherit", like maps in IE, assume 1 (#4981). With HC5 and the new strokeWidth
+ // function, we should be able to use that instead.
+ if (strokeWidth === 'inherit') {
+ strokeWidth = 1;
+ }
+ value = value && value.toLowerCase();
+ if (value) {
+ value = value
+ .replace('shortdashdotdot', '3,1,1,1,1,1,')
+ .replace('shortdashdot', '3,1,1,1')
+ .replace('shortdot', '1,1,')
+ .replace('shortdash', '3,1,')
+ .replace('longdash', '8,3,')
+ .replace(/dot/g, '1,3,')
+ .replace('dash', '4,3,')
+ .replace(/,$/, '')
+ .split(','); // ending comma
+
+ i = value.length;
+ while (i--) {
+ value[i] = pInt(value[i]) * strokeWidth;
+ }
+ value = value.join(',')
+ .replace(/NaN/g, 'none'); // #3226
+ this.element.setAttribute('stroke-dasharray', value);
+ }
+ },
+ alignSetter: function (value) {
+ this.element.setAttribute('text-anchor', { left: 'start', center: 'middle', right: 'end' }[value]);
+ },
+ opacitySetter: function (value, key, element) {
+ this[key] = value;
+ element.setAttribute(key, value);
+ },
+ titleSetter: function (value) {
+ var titleNode = this.element.getElementsByTagName('title')[0];
+ if (!titleNode) {
+ titleNode = doc.createElementNS(SVG_NS, 'title');
+ this.element.appendChild(titleNode);
+ }
+
+ // Remove text content if it exists
+ if (titleNode.firstChild) {
+ titleNode.removeChild(titleNode.firstChild);
+ }
+
+ titleNode.appendChild(
+ doc.createTextNode(
+ (String(pick(value), '')).replace(/<[^>]*>/g, '') // #3276, #3895
+ )
+ );
+ },
+ textSetter: function (value) {
+ if (value !== this.textStr) {
+ // Delete bBox memo when the text changes
+ delete this.bBox;
+
+ this.textStr = value;
+ if (this.added) {
+ this.renderer.buildText(this);
+ }
+ }
+ },
+ fillSetter: function (value, key, element) {
+ if (typeof value === 'string') {
+ element.setAttribute(key, value);
+ } else if (value) {
+ this.colorGradient(value, key, element);
+ }
+ },
+ visibilitySetter: function (value, key, element) {
+ // IE9-11 doesn't handle visibilty:inherit well, so we remove the attribute instead (#2881, #3909)
+ if (value === 'inherit') {
+ element.removeAttribute(key);
+ } else {
+ element.setAttribute(key, value);
+ }
+ },
+ zIndexSetter: function (value, key) {
+ var renderer = this.renderer,
+ parentGroup = this.parentGroup,
+ parentWrapper = parentGroup || renderer,
+ parentNode = parentWrapper.element || renderer.box,
+ childNodes,
+ otherElement,
+ otherZIndex,
+ element = this.element,
+ inserted,
+ run = this.added,
+ i;
+
+ if (defined(value)) {
+ element.zIndex = value; // So we can read it for other elements in the group
+ value = +value;
+ if (this[key] === value) { // Only update when needed (#3865)
+ run = false;
+ }
+ this[key] = value;
+ }
+
+ // Insert according to this and other elements' zIndex. Before .add() is called,
+ // nothing is done. Then on add, or by later calls to zIndexSetter, the node
+ // is placed on the right place in the DOM.
+ if (run) {
+ value = this.zIndex;
+
+ if (value && parentGroup) {
+ parentGroup.handleZ = true;
+ }
+
+ childNodes = parentNode.childNodes;
+ for (i = 0; i < childNodes.length && !inserted; i++) {
+ otherElement = childNodes[i];
+ otherZIndex = otherElement.zIndex;
+ if (otherElement !== element && (
+ // Insert before the first element with a higher zIndex
+ pInt(otherZIndex) > value ||
+ // If no zIndex given, insert before the first element with a zIndex
+ (!defined(value) && defined(otherZIndex))
+
+ )) {
+ parentNode.insertBefore(element, otherElement);
+ inserted = true;
+ }
+ }
+ if (!inserted) {
+ parentNode.appendChild(element);
+ }
+ }
+ return inserted;
+ },
+ _defaultSetter: function (value, key, element) {
+ element.setAttribute(key, value);
+ }
+ };
+
+ // Some shared setters and getters
+ SVGElement.prototype.yGetter = SVGElement.prototype.xGetter;
+ SVGElement.prototype.translateXSetter = SVGElement.prototype.translateYSetter =
+ SVGElement.prototype.rotationSetter = SVGElement.prototype.verticalAlignSetter =
+ SVGElement.prototype.scaleXSetter = SVGElement.prototype.scaleYSetter = function (value, key) {
+ this[key] = value;
+ this.doTransform = true;
+ };
+
+ // WebKit and Batik have problems with a stroke-width of zero, so in this case we remove the
+ // stroke attribute altogether. #1270, #1369, #3065, #3072.
+ SVGElement.prototype['stroke-widthSetter'] = SVGElement.prototype.strokeSetter = function (value, key, element) {
+ this[key] = value;
+ // Only apply the stroke attribute if the stroke width is defined and larger than 0
+ if (this.stroke && this['stroke-width']) {
+ this.strokeWidth = this['stroke-width'];
+ SVGElement.prototype.fillSetter.call(this, this.stroke, 'stroke', element); // use prototype as instance may be overridden
+ element.setAttribute('stroke-width', this['stroke-width']);
+ this.hasStroke = true;
+ } else if (key === 'stroke-width' && value === 0 && this.hasStroke) {
+ element.removeAttribute('stroke');
+ this.hasStroke = false;
+ }
+ };
+
+
+ /**
+ * The default SVG renderer
+ */
+ var SVGRenderer = function () {
+ this.init.apply(this, arguments);
+ };
+ SVGRenderer.prototype = {
+ Element: SVGElement,
+
+ /**
+ * Initialize the SVGRenderer
+ * @param {Object} container
+ * @param {Number} width
+ * @param {Number} height
+ * @param {Boolean} forExport
+ */
+ init: function (container, width, height, style, forExport, allowHTML) {
+ var renderer = this,
+ boxWrapper,
+ element,
+ desc;
+
+ boxWrapper = renderer.createElement('svg')
+ .attr({
+ version: '1.1'
+ })
+ .css(this.getStyle(style));
+ element = boxWrapper.element;
+ container.appendChild(element);
+
+ // For browsers other than IE, add the namespace attribute (#1978)
+ if (container.innerHTML.indexOf('xmlns') === -1) {
+ attr(element, 'xmlns', SVG_NS);
+ }
+
+ // object properties
+ renderer.isSVG = true;
+ renderer.box = element;
+ renderer.boxWrapper = boxWrapper;
+ renderer.alignedObjects = [];
+
+ // Page url used for internal references. #24, #672, #1070
+ renderer.url = (isFirefox || isWebKit) && doc.getElementsByTagName('base').length ?
+ win.location.href
+ .replace(/#.*?$/, '') // remove the hash
+ .replace(/([\('\)])/g, '\\$1') // escape parantheses and quotes
+ .replace(/ /g, '%20') : // replace spaces (needed for Safari only)
+ '';
+
+ // Add description
+ desc = this.createElement('desc').add();
+ desc.element.appendChild(doc.createTextNode('Created with ' + PRODUCT + ' ' + VERSION));
+
+
+ renderer.defs = this.createElement('defs').add();
+ renderer.allowHTML = allowHTML;
+ renderer.forExport = forExport;
+ renderer.gradients = {}; // Object where gradient SvgElements are stored
+ renderer.cache = {}; // Cache for numerical bounding boxes
+ renderer.cacheKeys = [];
+ renderer.imgCount = 0;
+
+ renderer.setSize(width, height, false);
+
+
+
+ // Issue 110 workaround:
+ // In Firefox, if a div is positioned by percentage, its pixel position may land
+ // between pixels. The container itself doesn't display this, but an SVG element
+ // inside this container will be drawn at subpixel precision. In order to draw
+ // sharp lines, this must be compensated for. This doesn't seem to work inside
+ // iframes though (like in jsFiddle).
+ var subPixelFix, rect;
+ if (isFirefox && container.getBoundingClientRect) {
+ renderer.subPixelFix = subPixelFix = function () {
+ css(container, { left: 0, top: 0 });
+ rect = container.getBoundingClientRect();
+ css(container, {
+ left: (mathCeil(rect.left) - rect.left) + PX,
+ top: (mathCeil(rect.top) - rect.top) + PX
+ });
+ };
+
+ // run the fix now
+ subPixelFix();
+
+ // run it on resize
+ addEvent(win, 'resize', subPixelFix);
+ }
+ },
+
+ getStyle: function (style) {
+ this.style = extend({
+ fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif', // default font
+ fontSize: '12px'
+ }, style);
+ return this.style;
+ },
+
+ /**
+ * Detect whether the renderer is hidden. This happens when one of the parent elements
+ * has display: none. #608.
+ */
+ isHidden: function () {
+ return !this.boxWrapper.getBBox().width;
+ },
+
+ /**
+ * Destroys the renderer and its allocated members.
+ */
+ destroy: function () {
+ var renderer = this,
+ rendererDefs = renderer.defs;
+ renderer.box = null;
+ renderer.boxWrapper = renderer.boxWrapper.destroy();
+
+ // Call destroy on all gradient elements
+ destroyObjectProperties(renderer.gradients || {});
+ renderer.gradients = null;
+
+ // Defs are null in VMLRenderer
+ // Otherwise, destroy them here.
+ if (rendererDefs) {
+ renderer.defs = rendererDefs.destroy();
+ }
+
+ // Remove sub pixel fix handler
+ // We need to check that there is a handler, otherwise all functions that are registered for event 'resize' are removed
+ // See issue #982
+ if (renderer.subPixelFix) {
+ removeEvent(win, 'resize', renderer.subPixelFix);
+ }
+
+ renderer.alignedObjects = null;
+
+ return null;
+ },
+
+ /**
+ * Create a wrapper for an SVG element
+ * @param {Object} nodeName
+ */
+ createElement: function (nodeName) {
+ var wrapper = new this.Element();
+ wrapper.init(this, nodeName);
+ return wrapper;
+ },
+
+ /**
+ * Dummy function for use in canvas renderer
+ */
+ draw: function () {},
+
+ /**
+ * Get converted radial gradient attributes
+ */
+ getRadialAttr: function (radialReference, gradAttr) {
+ return {
+ cx: (radialReference[0] - radialReference[2] / 2) + gradAttr.cx * radialReference[2],
+ cy: (radialReference[1] - radialReference[2] / 2) + gradAttr.cy * radialReference[2],
+ r: gradAttr.r * radialReference[2]
+ };
+ },
+
+ /**
+ * Parse a simple HTML string into SVG tspans
+ *
+ * @param {Object} textNode The parent text SVG node
+ */
+ buildText: function (wrapper) {
+ var textNode = wrapper.element,
+ renderer = this,
+ forExport = renderer.forExport,
+ textStr = pick(wrapper.textStr, '').toString(),
+ hasMarkup = textStr.indexOf('<') !== -1,
+ lines,
+ childNodes = textNode.childNodes,
+ styleRegex,
+ hrefRegex,
+ wasTooLong,
+ parentX = attr(textNode, 'x'),
+ textStyles = wrapper.styles,
+ width = wrapper.textWidth,
+ textLineHeight = textStyles && textStyles.lineHeight,
+ textShadow = textStyles && textStyles.textShadow,
+ ellipsis = textStyles && textStyles.textOverflow === 'ellipsis',
+ i = childNodes.length,
+ tempParent = width && !wrapper.added && this.box,
+ getLineHeight = function (tspan) {
+ return textLineHeight ?
+ pInt(textLineHeight) :
+ renderer.fontMetrics(
+ /(px|em)$/.test(tspan && tspan.style.fontSize) ?
+ tspan.style.fontSize :
+ ((textStyles && textStyles.fontSize) || renderer.style.fontSize || 12),
+ tspan
+ ).h;
+ },
+ unescapeAngleBrackets = function (inputStr) {
+ return inputStr.replace(/</g, '<').replace(/>/g, '>');
+ };
+
+ /// remove old text
+ while (i--) {
+ textNode.removeChild(childNodes[i]);
+ }
+
+ // Skip tspans, add text directly to text node. The forceTSpan is a hook
+ // used in text outline hack.
+ if (!hasMarkup && !textShadow && !ellipsis && !width && textStr.indexOf(' ') === -1) {
+ textNode.appendChild(doc.createTextNode(unescapeAngleBrackets(textStr)));
+
+ // Complex strings, add more logic
+ } else {
+
+ styleRegex = /<.*style="([^"]+)".*>/;
+ hrefRegex = /<.*href="(http[^"]+)".*>/;
+
+ if (tempParent) {
+ tempParent.appendChild(textNode); // attach it to the DOM to read offset width
+ }
+
+ if (hasMarkup) {
+ lines = textStr
+ .replace(/<(b|strong)>/g, '')
+ .replace(/<(i|em)>/g, '')
+ .replace(//g, ' ')
+ .split(//g);
+
+ } else {
+ lines = [textStr];
+ }
+
+
+ // Trim empty lines (#5261)
+ lines = grep(lines, function (line) {
+ return line !== '';
+ });
+
+
+ // build the lines
+ each(lines, function buildTextLines(line, lineNo) {
+ var spans,
+ spanNo = 0;
+ line = line
+ .replace(/^\s+|\s+$/g, '') // Trim to prevent useless/costly process on the spaces (#5258)
+ .replace(//g, ' |||');
+ spans = line.split('|||');
+
+ each(spans, function buildTextSpans(span) {
+ if (span !== '' || spans.length === 1) {
+ var attributes = {},
+ tspan = doc.createElementNS(SVG_NS, 'tspan'),
+ spanStyle; // #390
+ if (styleRegex.test(span)) {
+ spanStyle = span.match(styleRegex)[1].replace(/(;| |^)color([ :])/, '$1fill$2');
+ attr(tspan, 'style', spanStyle);
+ }
+ if (hrefRegex.test(span) && !forExport) { // Not for export - #1529
+ attr(tspan, 'onclick', 'location.href=\"' + span.match(hrefRegex)[1] + '\"');
+ css(tspan, { cursor: 'pointer' });
+ }
+
+ span = unescapeAngleBrackets(span.replace(/<(.|\n)*?>/g, '') || ' ');
+
+ // Nested tags aren't supported, and cause crash in Safari (#1596)
+ if (span !== ' ') {
+
+ // add the text node
+ tspan.appendChild(doc.createTextNode(span));
+
+ if (!spanNo) { // first span in a line, align it to the left
+ if (lineNo && parentX !== null) {
+ attributes.x = parentX;
+ }
+ } else {
+ attributes.dx = 0; // #16
+ }
+
+ // add attributes
+ attr(tspan, attributes);
+
+ // Append it
+ textNode.appendChild(tspan);
+
+ // first span on subsequent line, add the line height
+ if (!spanNo && lineNo) {
+
+ // allow getting the right offset height in exporting in IE
+ if (!hasSVG && forExport) {
+ css(tspan, { display: 'block' });
+ }
+
+ // Set the line height based on the font size of either
+ // the text element or the tspan element
+ attr(
+ tspan,
+ 'dy',
+ getLineHeight(tspan)
+ );
+ }
+
+ /*if (width) {
+ renderer.breakText(wrapper, width);
+ }*/
+
+ // Check width and apply soft breaks or ellipsis
+ if (width) {
+ var words = span.replace(/([^\^])-/g, '$1- ').split(' '), // #1273
+ hasWhiteSpace = spans.length > 1 || lineNo || (words.length > 1 && textStyles.whiteSpace !== 'nowrap'),
+ tooLong,
+ actualWidth,
+ rest = [],
+ dy = getLineHeight(tspan),
+ softLineNo = 1,
+ rotation = wrapper.rotation,
+ wordStr = span, // for ellipsis
+ cursor = wordStr.length, // binary search cursor
+ bBox;
+
+ while ((hasWhiteSpace || ellipsis) && (words.length || rest.length)) {
+ wrapper.rotation = 0; // discard rotation when computing box
+ bBox = wrapper.getBBox(true);
+ actualWidth = bBox.width;
+
+ // Old IE cannot measure the actualWidth for SVG elements (#2314)
+ if (!hasSVG && renderer.forExport) {
+ actualWidth = renderer.measureSpanWidth(tspan.firstChild.data, wrapper.styles);
+ }
+
+ tooLong = actualWidth > width;
+
+ // For ellipsis, do a binary search for the correct string length
+ if (wasTooLong === undefined) {
+ wasTooLong = tooLong; // First time
+ }
+ if (ellipsis && wasTooLong) {
+ cursor /= 2;
+
+ if (wordStr === '' || (!tooLong && cursor < 0.5)) {
+ words = []; // All ok, break out
+ } else {
+ wordStr = span.substring(0, wordStr.length + (tooLong ? -1 : 1) * mathCeil(cursor));
+ words = [wordStr + (width > 3 ? '\u2026' : '')];
+ tspan.removeChild(tspan.firstChild);
+ }
+
+ // Looping down, this is the first word sequence that is not too long,
+ // so we can move on to build the next line.
+ } else if (!tooLong || words.length === 1) {
+ words = rest;
+ rest = [];
+
+ if (words.length) {
+ softLineNo++;
+
+ tspan = doc.createElementNS(SVG_NS, 'tspan');
+ attr(tspan, {
+ dy: dy,
+ x: parentX
+ });
+ if (spanStyle) { // #390
+ attr(tspan, 'style', spanStyle);
+ }
+ textNode.appendChild(tspan);
+ }
+ if (actualWidth > width) { // a single word is pressing it out
+ width = actualWidth;
+ }
+ } else { // append to existing line tspan
+ tspan.removeChild(tspan.firstChild);
+ rest.unshift(words.pop());
+ }
+ if (words.length) {
+ tspan.appendChild(doc.createTextNode(words.join(' ').replace(/- /g, '-')));
+ }
+ }
+ wrapper.rotation = rotation;
+ }
+
+ spanNo++;
+ }
+ }
+ });
+ });
+
+ if (wasTooLong) {
+ wrapper.attr('title', wrapper.textStr);
+ }
+ if (tempParent) {
+ tempParent.removeChild(textNode); // attach it to the DOM to read offset width
+ }
+
+ // Apply the text shadow
+ if (textShadow && wrapper.applyTextShadow) {
+ wrapper.applyTextShadow(textShadow);
+ }
+ }
+ },
+
+
+
+ /*
+ breakText: function (wrapper, width) {
+ var bBox = wrapper.getBBox(),
+ node = wrapper.element,
+ textLength = node.textContent.length,
+ pos = mathRound(width * textLength / bBox.width), // try this position first, based on average character width
+ increment = 0,
+ finalPos;
+
+ if (bBox.width > width) {
+ while (finalPos === undefined) {
+ textLength = node.getSubStringLength(0, pos);
+
+ if (textLength <= width) {
+ if (increment === -1) {
+ finalPos = pos;
+ } else {
+ increment = 1;
+ }
+ } else {
+ if (increment === 1) {
+ finalPos = pos - 1;
+ } else {
+ increment = -1;
+ }
+ }
+ pos += increment;
+ }
+ }
+ console.log('width', width, 'stringWidth', node.getSubStringLength(0, finalPos))
+ },
+ */
+
+ /**
+ * Returns white for dark colors and black for bright colors
+ */
+ getContrast: function (color) {
+ color = Color(color).rgba;
+ return color[0] + color[1] + color[2] > 384 ? '#000000' : '#FFFFFF';
+ },
+
+ /**
+ * Create a button with preset states
+ * @param {String} text
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Function} callback
+ * @param {Object} normalState
+ * @param {Object} hoverState
+ * @param {Object} pressedState
+ */
+ button: function (text, x, y, callback, normalState, hoverState, pressedState, disabledState, shape) {
+ var label = this.label(text, x, y, shape, null, null, null, null, 'button'),
+ curState = 0,
+ stateOptions,
+ stateStyle,
+ normalStyle,
+ hoverStyle,
+ pressedStyle,
+ disabledStyle,
+ verticalGradient = { x1: 0, y1: 0, x2: 0, y2: 1 };
+
+ // Normal state - prepare the attributes
+ normalState = merge({
+ 'stroke-width': 1,
+ stroke: '#CCCCCC',
+ fill: {
+ linearGradient: verticalGradient,
+ stops: [
+ [0, '#FEFEFE'],
+ [1, '#F6F6F6']
+ ]
+ },
+ r: 2,
+ padding: 5,
+ style: {
+ color: 'black'
+ }
+ }, normalState);
+ normalStyle = normalState.style;
+ delete normalState.style;
+
+ // Hover state
+ hoverState = merge(normalState, {
+ stroke: '#68A',
+ fill: {
+ linearGradient: verticalGradient,
+ stops: [
+ [0, '#FFF'],
+ [1, '#ACF']
+ ]
+ }
+ }, hoverState);
+ hoverStyle = hoverState.style;
+ delete hoverState.style;
+
+ // Pressed state
+ pressedState = merge(normalState, {
+ stroke: '#68A',
+ fill: {
+ linearGradient: verticalGradient,
+ stops: [
+ [0, '#9BD'],
+ [1, '#CDF']
+ ]
+ }
+ }, pressedState);
+ pressedStyle = pressedState.style;
+ delete pressedState.style;
+
+ // Disabled state
+ disabledState = merge(normalState, {
+ style: {
+ color: '#CCC'
+ }
+ }, disabledState);
+ disabledStyle = disabledState.style;
+ delete disabledState.style;
+
+ // Add the events. IE9 and IE10 need mouseover and mouseout to funciton (#667).
+ addEvent(label.element, isMS ? 'mouseover' : 'mouseenter', function () {
+ if (curState !== 3) {
+ label.attr(hoverState)
+ .css(hoverStyle);
+ }
+ });
+ addEvent(label.element, isMS ? 'mouseout' : 'mouseleave', function () {
+ if (curState !== 3) {
+ stateOptions = [normalState, hoverState, pressedState][curState];
+ stateStyle = [normalStyle, hoverStyle, pressedStyle][curState];
+ label.attr(stateOptions)
+ .css(stateStyle);
+ }
+ });
+
+ label.setState = function (state) {
+ label.state = curState = state;
+ if (!state) {
+ label.attr(normalState)
+ .css(normalStyle);
+ } else if (state === 2) {
+ label.attr(pressedState)
+ .css(pressedStyle);
+ } else if (state === 3) {
+ label.attr(disabledState)
+ .css(disabledStyle);
+ }
+ };
+
+ return label
+ .on('click', function (e) {
+ if (curState !== 3) {
+ callback.call(label, e);
+ }
+ })
+ .attr(normalState)
+ .css(extend({ cursor: 'default' }, normalStyle));
+ },
+
+ /**
+ * Make a straight line crisper by not spilling out to neighbour pixels
+ * @param {Array} points
+ * @param {Number} width
+ */
+ crispLine: function (points, width) {
+ // points format: [M, 0, 0, L, 100, 0]
+ // normalize to a crisp line
+ if (points[1] === points[4]) {
+ // Substract due to #1129. Now bottom and left axis gridlines behave the same.
+ points[1] = points[4] = mathRound(points[1]) - (width % 2 / 2);
+ }
+ if (points[2] === points[5]) {
+ points[2] = points[5] = mathRound(points[2]) + (width % 2 / 2);
+ }
+ return points;
+ },
+
+
+ /**
+ * Draw a path
+ * @param {Array} path An SVG path in array form
+ */
+ path: function (path) {
+ var attr = {
+ fill: NONE
+ };
+ if (isArray(path)) {
+ attr.d = path;
+ } else if (isObject(path)) { // attributes
+ extend(attr, path);
+ }
+ return this.createElement('path').attr(attr);
+ },
+
+ /**
+ * Draw and return an SVG circle
+ * @param {Number} x The x position
+ * @param {Number} y The y position
+ * @param {Number} r The radius
+ */
+ circle: function (x, y, r) {
+ var attr = isObject(x) ? x : { x: x, y: y, r: r },
+ wrapper = this.createElement('circle');
+
+ // Setting x or y translates to cx and cy
+ wrapper.xSetter = wrapper.ySetter = function (value, key, element) {
+ element.setAttribute('c' + key, value);
+ };
+
+ return wrapper.attr(attr);
+ },
+
+ /**
+ * Draw and return an arc
+ * @param {Number} x X position
+ * @param {Number} y Y position
+ * @param {Number} r Radius
+ * @param {Number} innerR Inner radius like used in donut charts
+ * @param {Number} start Starting angle
+ * @param {Number} end Ending angle
+ */
+ arc: function (x, y, r, innerR, start, end) {
+ var arc;
+
+ if (isObject(x)) {
+ y = x.y;
+ r = x.r;
+ innerR = x.innerR;
+ start = x.start;
+ end = x.end;
+ x = x.x;
+ }
+
+ // Arcs are defined as symbols for the ability to set
+ // attributes in attr and animate
+ arc = this.symbol('arc', x || 0, y || 0, r || 0, r || 0, {
+ innerR: innerR || 0,
+ start: start || 0,
+ end: end || 0
+ });
+ arc.r = r; // #959
+ return arc;
+ },
+
+ /**
+ * Draw and return a rectangle
+ * @param {Number} x Left position
+ * @param {Number} y Top position
+ * @param {Number} width
+ * @param {Number} height
+ * @param {Number} r Border corner radius
+ * @param {Number} strokeWidth A stroke width can be supplied to allow crisp drawing
+ */
+ rect: function (x, y, width, height, r, strokeWidth) {
+
+ r = isObject(x) ? x.r : r;
+
+ var wrapper = this.createElement('rect'),
+ attribs = isObject(x) ? x : x === UNDEFINED ? {} : {
+ x: x,
+ y: y,
+ width: mathMax(width, 0),
+ height: mathMax(height, 0)
+ };
+
+ if (strokeWidth !== UNDEFINED) {
+ wrapper.strokeWidth = strokeWidth;
+ attribs = wrapper.crisp(attribs);
+ }
+
+ if (r) {
+ attribs.r = r;
+ }
+
+ wrapper.rSetter = function (value, key, element) {
+ attr(element, {
+ rx: value,
+ ry: value
+ });
+ };
+
+ return wrapper.attr(attribs);
+ },
+
+ /**
+ * Resize the box and re-align all aligned elements
+ * @param {Object} width
+ * @param {Object} height
+ * @param {Boolean} animate
+ *
+ */
+ setSize: function (width, height, animate) {
+ var renderer = this,
+ alignedObjects = renderer.alignedObjects,
+ i = alignedObjects.length;
+
+ renderer.width = width;
+ renderer.height = height;
+
+ renderer.boxWrapper[pick(animate, true) ? 'animate' : 'attr']({
+ width: width,
+ height: height
+ });
+
+ while (i--) {
+ alignedObjects[i].align();
+ }
+ },
+
+ /**
+ * Create a group
+ * @param {String} name The group will be given a class name of 'highcharts-{name}'.
+ * This can be used for styling and scripting.
+ */
+ g: function (name) {
+ var elem = this.createElement('g');
+ return defined(name) ? elem.attr({ 'class': PREFIX + name }) : elem;
+ },
+
+ /**
+ * Display an image
+ * @param {String} src
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} width
+ * @param {Number} height
+ */
+ image: function (src, x, y, width, height) {
+ var attribs = {
+ preserveAspectRatio: NONE
+ },
+ elemWrapper;
+
+ // optional properties
+ if (arguments.length > 1) {
+ extend(attribs, {
+ x: x,
+ y: y,
+ width: width,
+ height: height
+ });
+ }
+
+ elemWrapper = this.createElement('image').attr(attribs);
+
+ // set the href in the xlink namespace
+ if (elemWrapper.element.setAttributeNS) {
+ elemWrapper.element.setAttributeNS('http://www.w3.org/1999/xlink',
+ 'href', src);
+ } else {
+ // could be exporting in IE
+ // using href throws "not supported" in ie7 and under, requries regex shim to fix later
+ elemWrapper.element.setAttribute('hc-svg-href', src);
+ }
+ return elemWrapper;
+ },
+
+ /**
+ * Draw a symbol out of pre-defined shape paths from the namespace 'symbol' object.
+ *
+ * @param {Object} symbol
+ * @param {Object} x
+ * @param {Object} y
+ * @param {Object} radius
+ * @param {Object} options
+ */
+ symbol: function (symbol, x, y, width, height, options) {
+
+ var ren = this,
+ obj,
+
+ // get the symbol definition function
+ symbolFn = this.symbols[symbol],
+
+ // check if there's a path defined for this symbol
+ path = symbolFn && symbolFn(
+ mathRound(x),
+ mathRound(y),
+ width,
+ height,
+ options
+ ),
+
+ imageRegex = /^url\((.*?)\)$/,
+ imageSrc,
+ imageSize,
+ centerImage;
+
+ if (path) {
+
+ obj = this.path(path);
+ // expando properties for use in animate and attr
+ extend(obj, {
+ symbolName: symbol,
+ x: x,
+ y: y,
+ width: width,
+ height: height
+ });
+ if (options) {
+ extend(obj, options);
+ }
+
+
+ // image symbols
+ } else if (imageRegex.test(symbol)) {
+
+ // On image load, set the size and position
+ centerImage = function (img, size) {
+ if (img.element) { // it may be destroyed in the meantime (#1390)
+ img.attr({
+ width: size[0],
+ height: size[1]
+ });
+
+ if (!img.alignByTranslate) { // #185
+ img.translate(
+ mathRound((width - size[0]) / 2), // #1378
+ mathRound((height - size[1]) / 2)
+ );
+ }
+ }
+ };
+
+ imageSrc = symbol.match(imageRegex)[1];
+ imageSize = symbolSizes[imageSrc] || (options && options.width && options.height && [options.width, options.height]);
+
+ // Ireate the image synchronously, add attribs async
+ obj = this.image(imageSrc)
+ .attr({
+ x: x,
+ y: y
+ });
+ obj.isImg = true;
+
+ if (imageSize) {
+ centerImage(obj, imageSize);
+ } else {
+ // Initialize image to be 0 size so export will still function if there's no cached sizes.
+ obj.attr({ width: 0, height: 0 });
+
+ // Create a dummy JavaScript image to get the width and height. Due to a bug in IE < 8,
+ // the created element must be assigned to a variable in order to load (#292).
+ createElement('img', {
+ onload: function () {
+
+ // Special case for SVGs on IE11, the width is not accessible until the image is
+ // part of the DOM (#2854).
+ if (this.width === 0) {
+ css(this, {
+ position: ABSOLUTE,
+ top: '-999em'
+ });
+ doc.body.appendChild(this);
+ }
+
+ // Center the image
+ centerImage(obj, symbolSizes[imageSrc] = [this.width, this.height]);
+
+ // Clean up after #2854 workaround.
+ if (this.parentNode) {
+ this.parentNode.removeChild(this);
+ }
+
+ // Fire the load event when all external images are loaded
+ ren.imgCount--;
+ if (!ren.imgCount && charts[ren.chartIndex].onload) {
+ charts[ren.chartIndex].onload();
+ }
+ },
+ src: imageSrc
+ });
+ this.imgCount++;
+ }
+ }
+
+ return obj;
+ },
+
+ /**
+ * An extendable collection of functions for defining symbol paths.
+ */
+ symbols: {
+ 'circle': function (x, y, w, h) {
+ var cpw = 0.166 * w;
+ return [
+ M, x + w / 2, y,
+ 'C', x + w + cpw, y, x + w + cpw, y + h, x + w / 2, y + h,
+ 'C', x - cpw, y + h, x - cpw, y, x + w / 2, y,
+ 'Z'
+ ];
+ },
+
+ 'square': function (x, y, w, h) {
+ return [
+ M, x, y,
+ L, x + w, y,
+ x + w, y + h,
+ x, y + h,
+ 'Z'
+ ];
+ },
+
+ 'triangle': function (x, y, w, h) {
+ return [
+ M, x + w / 2, y,
+ L, x + w, y + h,
+ x, y + h,
+ 'Z'
+ ];
+ },
+
+ 'triangle-down': function (x, y, w, h) {
+ return [
+ M, x, y,
+ L, x + w, y,
+ x + w / 2, y + h,
+ 'Z'
+ ];
+ },
+ 'diamond': function (x, y, w, h) {
+ return [
+ M, x + w / 2, y,
+ L, x + w, y + h / 2,
+ x + w / 2, y + h,
+ x, y + h / 2,
+ 'Z'
+ ];
+ },
+ 'arc': function (x, y, w, h, options) {
+ var start = options.start,
+ radius = options.r || w || h,
+ end = options.end - 0.001, // to prevent cos and sin of start and end from becoming equal on 360 arcs (related: #1561)
+ innerRadius = options.innerR,
+ open = options.open,
+ cosStart = mathCos(start),
+ sinStart = mathSin(start),
+ cosEnd = mathCos(end),
+ sinEnd = mathSin(end),
+ longArc = options.end - start < mathPI ? 0 : 1;
+
+ return [
+ M,
+ x + radius * cosStart,
+ y + radius * sinStart,
+ 'A', // arcTo
+ radius, // x radius
+ radius, // y radius
+ 0, // slanting
+ longArc, // long or short arc
+ 1, // clockwise
+ x + radius * cosEnd,
+ y + radius * sinEnd,
+ open ? M : L,
+ x + innerRadius * cosEnd,
+ y + innerRadius * sinEnd,
+ 'A', // arcTo
+ innerRadius, // x radius
+ innerRadius, // y radius
+ 0, // slanting
+ longArc, // long or short arc
+ 0, // clockwise
+ x + innerRadius * cosStart,
+ y + innerRadius * sinStart,
+
+ open ? '' : 'Z' // close
+ ];
+ },
+
+ /**
+ * Callout shape used for default tooltips, also used for rounded rectangles in VML
+ */
+ callout: function (x, y, w, h, options) {
+ var arrowLength = 6,
+ halfDistance = 6,
+ r = mathMin((options && options.r) || 0, w, h),
+ safeDistance = r + halfDistance,
+ anchorX = options && options.anchorX,
+ anchorY = options && options.anchorY,
+ path;
+
+ path = [
+ 'M', x + r, y,
+ 'L', x + w - r, y, // top side
+ 'C', x + w, y, x + w, y, x + w, y + r, // top-right corner
+ 'L', x + w, y + h - r, // right side
+ 'C', x + w, y + h, x + w, y + h, x + w - r, y + h, // bottom-right corner
+ 'L', x + r, y + h, // bottom side
+ 'C', x, y + h, x, y + h, x, y + h - r, // bottom-left corner
+ 'L', x, y + r, // left side
+ 'C', x, y, x, y, x + r, y // top-right corner
+ ];
+
+ if (anchorX && anchorX > w && anchorY > y + safeDistance && anchorY < y + h - safeDistance) { // replace right side
+ path.splice(13, 3,
+ 'L', x + w, anchorY - halfDistance,
+ x + w + arrowLength, anchorY,
+ x + w, anchorY + halfDistance,
+ x + w, y + h - r
+ );
+ } else if (anchorX && anchorX < 0 && anchorY > y + safeDistance && anchorY < y + h - safeDistance) { // replace left side
+ path.splice(33, 3,
+ 'L', x, anchorY + halfDistance,
+ x - arrowLength, anchorY,
+ x, anchorY - halfDistance,
+ x, y + r
+ );
+ } else if (anchorY && anchorY > h && anchorX > x + safeDistance && anchorX < x + w - safeDistance) { // replace bottom
+ path.splice(23, 3,
+ 'L', anchorX + halfDistance, y + h,
+ anchorX, y + h + arrowLength,
+ anchorX - halfDistance, y + h,
+ x + r, y + h
+ );
+ } else if (anchorY && anchorY < 0 && anchorX > x + safeDistance && anchorX < x + w - safeDistance) { // replace top
+ path.splice(3, 3,
+ 'L', anchorX - halfDistance, y,
+ anchorX, y - arrowLength,
+ anchorX + halfDistance, y,
+ w - r, y
+ );
+ }
+ return path;
+ }
+ },
+
+ /**
+ * Define a clipping rectangle
+ * @param {String} id
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} width
+ * @param {Number} height
+ */
+ clipRect: function (x, y, width, height) {
+ var wrapper,
+ id = PREFIX + idCounter++,
+
+ clipPath = this.createElement('clipPath').attr({
+ id: id
+ }).add(this.defs);
+
+ wrapper = this.rect(x, y, width, height, 0).add(clipPath);
+ wrapper.id = id;
+ wrapper.clipPath = clipPath;
+ wrapper.count = 0;
+
+ return wrapper;
+ },
+
+
+
+
+
+ /**
+ * Add text to the SVG object
+ * @param {String} str
+ * @param {Number} x Left position
+ * @param {Number} y Top position
+ * @param {Boolean} useHTML Use HTML to render the text
+ */
+ text: function (str, x, y, useHTML) {
+
+ // declare variables
+ var renderer = this,
+ fakeSVG = useCanVG || (!hasSVG && renderer.forExport),
+ wrapper,
+ attr = {};
+
+ if (useHTML && (renderer.allowHTML || !renderer.forExport)) {
+ return renderer.html(str, x, y);
+ }
+
+ attr.x = Math.round(x || 0); // X is always needed for line-wrap logic
+ if (y) {
+ attr.y = Math.round(y);
+ }
+ if (str || str === 0) {
+ attr.text = str;
+ }
+
+ wrapper = renderer.createElement('text')
+ .attr(attr);
+
+ // Prevent wrapping from creating false offsetWidths in export in legacy IE (#1079, #1063)
+ if (fakeSVG) {
+ wrapper.css({
+ position: ABSOLUTE
+ });
+ }
+
+ if (!useHTML) {
+ wrapper.xSetter = function (value, key, element) {
+ var tspans = element.getElementsByTagName('tspan'),
+ tspan,
+ parentVal = element.getAttribute(key),
+ i;
+ for (i = 0; i < tspans.length; i++) {
+ tspan = tspans[i];
+ // If the x values are equal, the tspan represents a linebreak
+ if (tspan.getAttribute(key) === parentVal) {
+ tspan.setAttribute(key, value);
+ }
+ }
+ element.setAttribute(key, value);
+ };
+ }
+
+ return wrapper;
+ },
+
+ /**
+ * Utility to return the baseline offset and total line height from the font size
+ */
+ fontMetrics: function (fontSize, elem) {
+ var lineHeight,
+ baseline,
+ style;
+
+ fontSize = fontSize || this.style.fontSize;
+ if (!fontSize && elem && win.getComputedStyle) {
+ elem = elem.element || elem; // SVGElement
+ style = win.getComputedStyle(elem, '');
+ fontSize = style && style.fontSize; // #4309, the style doesn't exist inside a hidden iframe in Firefox
+ }
+ fontSize = /px/.test(fontSize) ? pInt(fontSize) : /em/.test(fontSize) ? parseFloat(fontSize) * 12 : 12;
+
+ // Empirical values found by comparing font size and bounding box height.
+ // Applies to the default font family. http://jsfiddle.net/highcharts/7xvn7/
+ lineHeight = fontSize < 24 ? fontSize + 3 : mathRound(fontSize * 1.2);
+ baseline = mathRound(lineHeight * 0.8);
+
+ return {
+ h: lineHeight,
+ b: baseline,
+ f: fontSize
+ };
+ },
+
+ /**
+ * Correct X and Y positioning of a label for rotation (#1764)
+ */
+ rotCorr: function (baseline, rotation, alterY) {
+ var y = baseline;
+ if (rotation && alterY) {
+ y = mathMax(y * mathCos(rotation * deg2rad), 4);
+ }
+ return {
+ x: (-baseline / 3) * mathSin(rotation * deg2rad),
+ y: y
+ };
+ },
+
+ /**
+ * Add a label, a text item that can hold a colored or gradient background
+ * as well as a border and shadow.
+ * @param {string} str
+ * @param {Number} x
+ * @param {Number} y
+ * @param {String} shape
+ * @param {Number} anchorX In case the shape has a pointer, like a flag, this is the
+ * coordinates it should be pinned to
+ * @param {Number} anchorY
+ * @param {Boolean} baseline Whether to position the label relative to the text baseline,
+ * like renderer.text, or to the upper border of the rectangle.
+ * @param {String} className Class name for the group
+ */
+ label: function (str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {
+
+ var renderer = this,
+ wrapper = renderer.g(className),
+ text = renderer.text('', 0, 0, useHTML)
+ .attr({
+ zIndex: 1
+ }),
+ //.add(wrapper),
+ box,
+ bBox,
+ alignFactor = 0,
+ padding = 3,
+ paddingLeft = 0,
+ width,
+ height,
+ wrapperX,
+ wrapperY,
+ crispAdjust = 0,
+ deferredAttr = {},
+ baselineOffset,
+ needsBox,
+ updateBoxSize,
+ updateTextPadding,
+ boxAttr;
+
+ /**
+ * This function runs after the label is added to the DOM (when the bounding box is
+ * available), and after the text of the label is updated to detect the new bounding
+ * box and reflect it in the border box.
+ */
+ updateBoxSize = function () {
+ var boxX,
+ boxY,
+ style = text.element.style;
+
+ bBox = (width === undefined || height === undefined || wrapper.styles.textAlign) && defined(text.textStr) &&
+ text.getBBox(); //#3295 && 3514 box failure when string equals 0
+ wrapper.width = (width || bBox.width || 0) + 2 * padding + paddingLeft;
+ wrapper.height = (height || bBox.height || 0) + 2 * padding;
+
+ // update the label-scoped y offset
+ baselineOffset = padding + renderer.fontMetrics(style && style.fontSize, text).b;
+
+
+ if (needsBox) {
+
+ if (!box) {
+ // create the border box if it is not already present
+ boxX = crispAdjust;
+ boxY = (baseline ? -baselineOffset : 0) + crispAdjust;
+ wrapper.box = box = renderer.symbols[shape] ? // Symbol definition exists (#5324)
+ renderer.symbol(shape, boxX, boxY, wrapper.width, wrapper.height, deferredAttr) :
+ renderer.rect(boxX, boxY, wrapper.width, wrapper.height, 0, deferredAttr[STROKE_WIDTH]);
+
+ if (!box.isImg) { // #4324, fill "none" causes it to be ignored by mouse events in IE
+ box.attr('fill', NONE);
+ }
+ box.add(wrapper);
+ }
+
+ // apply the box attributes
+ if (!box.isImg) { // #1630
+ box.attr(extend({
+ width: mathRound(wrapper.width),
+ height: mathRound(wrapper.height)
+ }, deferredAttr));
+ }
+ deferredAttr = null;
+ }
+ };
+
+ /**
+ * This function runs after setting text or padding, but only if padding is changed
+ */
+ updateTextPadding = function () {
+ var styles = wrapper.styles,
+ textAlign = styles && styles.textAlign,
+ x = paddingLeft + padding,
+ y;
+
+ // determin y based on the baseline
+ y = baseline ? 0 : baselineOffset;
+
+ // compensate for alignment
+ if (defined(width) && bBox && (textAlign === 'center' || textAlign === 'right')) {
+ x += { center: 0.5, right: 1 }[textAlign] * (width - bBox.width);
+ }
+
+ // update if anything changed
+ if (x !== text.x || y !== text.y) {
+ text.attr('x', x);
+ if (y !== UNDEFINED) {
+ text.attr('y', y);
+ }
+ }
+
+ // record current values
+ text.x = x;
+ text.y = y;
+ };
+
+ /**
+ * Set a box attribute, or defer it if the box is not yet created
+ * @param {Object} key
+ * @param {Object} value
+ */
+ boxAttr = function (key, value) {
+ if (box) {
+ box.attr(key, value);
+ } else {
+ deferredAttr[key] = value;
+ }
+ };
+
+ /**
+ * After the text element is added, get the desired size of the border box
+ * and add it before the text in the DOM.
+ */
+ wrapper.onAdd = function () {
+ text.add(wrapper);
+ wrapper.attr({
+ text: (str || str === 0) ? str : '', // alignment is available now // #3295: 0 not rendered if given as a value
+ x: x,
+ y: y
+ });
+
+ if (box && defined(anchorX)) {
+ wrapper.attr({
+ anchorX: anchorX,
+ anchorY: anchorY
+ });
+ }
+ };
+
+ /*
+ * Add specific attribute setters.
+ */
+
+ // only change local variables
+ wrapper.widthSetter = function (value) {
+ width = value;
+ };
+ wrapper.heightSetter = function (value) {
+ height = value;
+ };
+ wrapper.paddingSetter = function (value) {
+ if (defined(value) && value !== padding) {
+ padding = wrapper.padding = value;
+ updateTextPadding();
+ }
+ };
+ wrapper.paddingLeftSetter = function (value) {
+ if (defined(value) && value !== paddingLeft) {
+ paddingLeft = value;
+ updateTextPadding();
+ }
+ };
+
+
+ // change local variable and prevent setting attribute on the group
+ wrapper.alignSetter = function (value) {
+ value = { left: 0, center: 0.5, right: 1 }[value];
+ if (value !== alignFactor) {
+ alignFactor = value;
+ if (bBox) { // Bounding box exists, means we're dynamically changing
+ wrapper.attr({ x: wrapperX }); // #5134
+ }
+ }
+ };
+
+ // apply these to the box and the text alike
+ wrapper.textSetter = function (value) {
+ if (value !== UNDEFINED) {
+ text.textSetter(value);
+ }
+ updateBoxSize();
+ updateTextPadding();
+ };
+
+ // apply these to the box but not to the text
+ wrapper['stroke-widthSetter'] = function (value, key) {
+ if (value) {
+ needsBox = true;
+ }
+ crispAdjust = value % 2 / 2;
+ boxAttr(key, value);
+ };
+ wrapper.strokeSetter = wrapper.fillSetter = wrapper.rSetter = function (value, key) {
+ if (key === 'fill' && value) {
+ needsBox = true;
+ }
+ boxAttr(key, value);
+ };
+ wrapper.anchorXSetter = function (value, key) {
+ anchorX = value;
+ boxAttr(key, mathRound(value) - crispAdjust - wrapperX);
+ };
+ wrapper.anchorYSetter = function (value, key) {
+ anchorY = value;
+ boxAttr(key, value - wrapperY);
+ };
+
+ // rename attributes
+ wrapper.xSetter = function (value) {
+ wrapper.x = value; // for animation getter
+ if (alignFactor) {
+ value -= alignFactor * ((width || bBox.width) + 2 * padding);
+ }
+ wrapperX = mathRound(value);
+ wrapper.attr('translateX', wrapperX);
+ };
+ wrapper.ySetter = function (value) {
+ wrapperY = wrapper.y = mathRound(value);
+ wrapper.attr('translateY', wrapperY);
+ };
+
+ // Redirect certain methods to either the box or the text
+ var baseCss = wrapper.css;
+ return extend(wrapper, {
+ /**
+ * Pick up some properties and apply them to the text instead of the wrapper
+ */
+ css: function (styles) {
+ if (styles) {
+ var textStyles = {};
+ styles = merge(styles); // create a copy to avoid altering the original object (#537)
+ each(wrapper.textProps, function (prop) {
+ if (styles[prop] !== UNDEFINED) {
+ textStyles[prop] = styles[prop];
+ delete styles[prop];
+ }
+ });
+ text.css(textStyles);
+ }
+ return baseCss.call(wrapper, styles);
+ },
+ /**
+ * Return the bounding box of the box, not the group
+ */
+ getBBox: function () {
+ return {
+ width: bBox.width + 2 * padding,
+ height: bBox.height + 2 * padding,
+ x: bBox.x - padding,
+ y: bBox.y - padding
+ };
+ },
+ /**
+ * Apply the shadow to the box
+ */
+ shadow: function (b) {
+ if (box) {
+ box.shadow(b);
+ }
+ return wrapper;
+ },
+ /**
+ * Destroy and release memory.
+ */
+ destroy: function () {
+
+ // Added by button implementation
+ removeEvent(wrapper.element, 'mouseenter');
+ removeEvent(wrapper.element, 'mouseleave');
+
+ if (text) {
+ text = text.destroy();
+ }
+ if (box) {
+ box = box.destroy();
+ }
+ // Call base implementation to destroy the rest
+ SVGElement.prototype.destroy.call(wrapper);
+
+ // Release local pointers (#1298)
+ wrapper = renderer = updateBoxSize = updateTextPadding = boxAttr = null;
+ }
+ });
+ }
+ }; // end SVGRenderer
+
+
+ // general renderer
+ Renderer = SVGRenderer;
+ // extend SvgElement for useHTML option
+ extend(SVGElement.prototype, {
+ /**
+ * Apply CSS to HTML elements. This is used in text within SVG rendering and
+ * by the VML renderer
+ */
+ htmlCss: function (styles) {
+ var wrapper = this,
+ element = wrapper.element,
+ textWidth = styles && element.tagName === 'SPAN' && styles.width;
+
+ if (textWidth) {
+ delete styles.width;
+ wrapper.textWidth = textWidth;
+ wrapper.updateTransform();
+ }
+ if (styles && styles.textOverflow === 'ellipsis') {
+ styles.whiteSpace = 'nowrap';
+ styles.overflow = 'hidden';
+ }
+ wrapper.styles = extend(wrapper.styles, styles);
+ css(wrapper.element, styles);
+
+ return wrapper;
+ },
+
+ /**
+ * VML and useHTML method for calculating the bounding box based on offsets
+ * @param {Boolean} refresh Whether to force a fresh value from the DOM or to
+ * use the cached value
+ *
+ * @return {Object} A hash containing values for x, y, width and height
+ */
+
+ htmlGetBBox: function () {
+ var wrapper = this,
+ element = wrapper.element;
+
+ // faking getBBox in exported SVG in legacy IE
+ // faking getBBox in exported SVG in legacy IE (is this a duplicate of the fix for #1079?)
+ if (element.nodeName === 'text') {
+ element.style.position = ABSOLUTE;
+ }
+
+ return {
+ x: element.offsetLeft,
+ y: element.offsetTop,
+ width: element.offsetWidth,
+ height: element.offsetHeight
+ };
+ },
+
+ /**
+ * VML override private method to update elements based on internal
+ * properties based on SVG transform
+ */
+ htmlUpdateTransform: function () {
+ // aligning non added elements is expensive
+ if (!this.added) {
+ this.alignOnAdd = true;
+ return;
+ }
+
+ var wrapper = this,
+ renderer = wrapper.renderer,
+ elem = wrapper.element,
+ translateX = wrapper.translateX || 0,
+ translateY = wrapper.translateY || 0,
+ x = wrapper.x || 0,
+ y = wrapper.y || 0,
+ align = wrapper.textAlign || 'left',
+ alignCorrection = { left: 0, center: 0.5, right: 1 }[align],
+ shadows = wrapper.shadows,
+ styles = wrapper.styles;
+
+ // apply translate
+ css(elem, {
+ marginLeft: translateX,
+ marginTop: translateY
+ });
+ if (shadows) { // used in labels/tooltip
+ each(shadows, function (shadow) {
+ css(shadow, {
+ marginLeft: translateX + 1,
+ marginTop: translateY + 1
+ });
+ });
+ }
+
+ // apply inversion
+ if (wrapper.inverted) { // wrapper is a group
+ each(elem.childNodes, function (child) {
+ renderer.invertChild(child, elem);
+ });
+ }
+
+ if (elem.tagName === 'SPAN') {
+
+ var rotation = wrapper.rotation,
+ baseline,
+ textWidth = pInt(wrapper.textWidth),
+ whiteSpace = styles && styles.whiteSpace,
+ currentTextTransform = [rotation, align, elem.innerHTML, wrapper.textWidth, wrapper.textAlign].join(',');
+
+ if (currentTextTransform !== wrapper.cTT) { // do the calculations and DOM access only if properties changed
+
+
+ baseline = renderer.fontMetrics(elem.style.fontSize).b;
+
+ // Renderer specific handling of span rotation
+ if (defined(rotation)) {
+ wrapper.setSpanRotation(rotation, alignCorrection, baseline);
+ }
+
+ // Reset multiline/ellipsis in order to read width (#4928, #5417)
+ css(elem, {
+ width: '',
+ whiteSpace: whiteSpace || 'nowrap'
+ });
+
+ // Update textWidth
+ if (elem.offsetWidth > textWidth && /[ \-]/.test(elem.textContent || elem.innerText)) { // #983, #1254
+ css(elem, {
+ width: textWidth + PX,
+ display: 'block',
+ whiteSpace: whiteSpace || 'normal' // #3331
+ });
+ }
+
+
+ wrapper.getSpanCorrection(elem.offsetWidth, baseline, alignCorrection, rotation, align);
+ }
+
+ // apply position with correction
+ css(elem, {
+ left: (x + (wrapper.xCorr || 0)) + PX,
+ top: (y + (wrapper.yCorr || 0)) + PX
+ });
+
+ // force reflow in webkit to apply the left and top on useHTML element (#1249)
+ if (isWebKit) {
+ baseline = elem.offsetHeight; // assigned to baseline for lint purpose
+ }
+
+ // record current text transform
+ wrapper.cTT = currentTextTransform;
+ }
+ },
+
+ /**
+ * Set the rotation of an individual HTML span
+ */
+ setSpanRotation: function (rotation, alignCorrection, baseline) {
+ var rotationStyle = {},
+ cssTransformKey = isMS ? '-ms-transform' : isWebKit ? '-webkit-transform' : isFirefox ? 'MozTransform' : isOpera ? '-o-transform' : '';
+
+ rotationStyle[cssTransformKey] = rotationStyle.transform = 'rotate(' + rotation + 'deg)';
+ rotationStyle[cssTransformKey + (isFirefox ? 'Origin' : '-origin')] = rotationStyle.transformOrigin = (alignCorrection * 100) + '% ' + baseline + 'px';
+ css(this.element, rotationStyle);
+ },
+
+ /**
+ * Get the correction in X and Y positioning as the element is rotated.
+ */
+ getSpanCorrection: function (width, baseline, alignCorrection) {
+ this.xCorr = -width * alignCorrection;
+ this.yCorr = -baseline;
+ }
+ });
+
+ // Extend SvgRenderer for useHTML option.
+ extend(SVGRenderer.prototype, {
+ /**
+ * Create HTML text node. This is used by the VML renderer as well as the SVG
+ * renderer through the useHTML option.
+ *
+ * @param {String} str
+ * @param {Number} x
+ * @param {Number} y
+ */
+ html: function (str, x, y) {
+ var wrapper = this.createElement('span'),
+ element = wrapper.element,
+ renderer = wrapper.renderer,
+ isSVG = renderer.isSVG,
+ addSetters = function (element, style) {
+ // These properties are set as attributes on the SVG group, and as
+ // identical CSS properties on the div. (#3542)
+ each(['opacity', 'visibility'], function (prop) {
+ wrap(element, prop + 'Setter', function (proceed, value, key, elem) {
+ proceed.call(this, value, key, elem);
+ style[key] = value;
+ });
+ });
+ };
+
+ // Text setter
+ wrapper.textSetter = function (value) {
+ if (value !== element.innerHTML) {
+ delete this.bBox;
+ }
+ element.innerHTML = this.textStr = value;
+ wrapper.htmlUpdateTransform();
+ };
+
+ // Add setters for the element itself (#4938)
+ if (isSVG) { // #4938, only for HTML within SVG
+ addSetters(wrapper, wrapper.element.style);
+ }
+
+ // Various setters which rely on update transform
+ wrapper.xSetter = wrapper.ySetter = wrapper.alignSetter = wrapper.rotationSetter = function (value, key) {
+ if (key === 'align') {
+ key = 'textAlign'; // Do not overwrite the SVGElement.align method. Same as VML.
+ }
+ wrapper[key] = value;
+ wrapper.htmlUpdateTransform();
+ };
+
+ // Set the default attributes
+ wrapper
+ .attr({
+ text: str,
+ x: mathRound(x),
+ y: mathRound(y)
+ })
+ .css({
+ position: ABSOLUTE,
+ fontFamily: this.style.fontFamily,
+ fontSize: this.style.fontSize
+ });
+
+ // Keep the whiteSpace style outside the wrapper.styles collection
+ element.style.whiteSpace = 'nowrap';
+
+ // Use the HTML specific .css method
+ wrapper.css = wrapper.htmlCss;
+
+ // This is specific for HTML within SVG
+ if (isSVG) {
+ wrapper.add = function (svgGroupWrapper) {
+
+ var htmlGroup,
+ container = renderer.box.parentNode,
+ parentGroup,
+ parents = [];
+
+ this.parentGroup = svgGroupWrapper;
+
+ // Create a mock group to hold the HTML elements
+ if (svgGroupWrapper) {
+ htmlGroup = svgGroupWrapper.div;
+ if (!htmlGroup) {
+
+ // Read the parent chain into an array and read from top down
+ parentGroup = svgGroupWrapper;
+ while (parentGroup) {
+
+ parents.push(parentGroup);
+
+ // Move up to the next parent group
+ parentGroup = parentGroup.parentGroup;
+ }
+
+ // Ensure dynamically updating position when any parent is translated
+ each(parents.reverse(), function (parentGroup) {
+ var htmlGroupStyle,
+ cls = attr(parentGroup.element, 'class');
+
+ if (cls) {
+ cls = { className: cls };
+ } // else null
+
+ // Create a HTML div and append it to the parent div to emulate
+ // the SVG group structure
+ htmlGroup = parentGroup.div = parentGroup.div || createElement(DIV, cls, {
+ position: ABSOLUTE,
+ left: (parentGroup.translateX || 0) + PX,
+ top: (parentGroup.translateY || 0) + PX,
+ opacity: parentGroup.opacity // #5075
+ }, htmlGroup || container); // the top group is appended to container
+
+ // Shortcut
+ htmlGroupStyle = htmlGroup.style;
+
+ // Set listeners to update the HTML div's position whenever the SVG group
+ // position is changed
+ extend(parentGroup, {
+ translateXSetter: function (value, key) {
+ htmlGroupStyle.left = value + PX;
+ parentGroup[key] = value;
+ parentGroup.doTransform = true;
+ },
+ translateYSetter: function (value, key) {
+ htmlGroupStyle.top = value + PX;
+ parentGroup[key] = value;
+ parentGroup.doTransform = true;
+ }
+ });
+ addSetters(parentGroup, htmlGroupStyle);
+ });
+
+ }
+ } else {
+ htmlGroup = container;
+ }
+
+ htmlGroup.appendChild(element);
+
+ // Shared with VML:
+ wrapper.added = true;
+ if (wrapper.alignOnAdd) {
+ wrapper.htmlUpdateTransform();
+ }
+
+ return wrapper;
+ };
+ }
+ return wrapper;
+ }
+ });
+
+
+ /* ****************************************************************************
+ * *
+ * START OF INTERNET EXPLORER <= 8 SPECIFIC CODE *
+ * *
+ * For applications and websites that don't need IE support, like platform *
+ * targeted mobile apps and web apps, this code can be removed. *
+ * *
+ *****************************************************************************/
+
+ /**
+ * @constructor
+ */
+ var VMLRenderer, VMLElement;
+ if (!hasSVG && !useCanVG) {
+
+ /**
+ * The VML element wrapper.
+ */
+ VMLElement = {
+
+ /**
+ * Initialize a new VML element wrapper. It builds the markup as a string
+ * to minimize DOM traffic.
+ * @param {Object} renderer
+ * @param {Object} nodeName
+ */
+ init: function (renderer, nodeName) {
+ var wrapper = this,
+ markup = ['<', nodeName, ' filled="f" stroked="f"'],
+ style = ['position: ', ABSOLUTE, ';'],
+ isDiv = nodeName === DIV;
+
+ // divs and shapes need size
+ if (nodeName === 'shape' || isDiv) {
+ style.push('left:0;top:0;width:1px;height:1px;');
+ }
+ style.push('visibility: ', isDiv ? HIDDEN : VISIBLE);
+
+ markup.push(' style="', style.join(''), '"/>');
+
+ // create element with default attributes and style
+ if (nodeName) {
+ markup = isDiv || nodeName === 'span' || nodeName === 'img' ?
+ markup.join('') :
+ renderer.prepVML(markup);
+ wrapper.element = createElement(markup);
+ }
+
+ wrapper.renderer = renderer;
+ },
+
+ /**
+ * Add the node to the given parent
+ * @param {Object} parent
+ */
+ add: function (parent) {
+ var wrapper = this,
+ renderer = wrapper.renderer,
+ element = wrapper.element,
+ box = renderer.box,
+ inverted = parent && parent.inverted,
+
+ // get the parent node
+ parentNode = parent ?
+ parent.element || parent :
+ box;
+
+ if (parent) {
+ this.parentGroup = parent;
+ }
+
+ // if the parent group is inverted, apply inversion on all children
+ if (inverted) { // only on groups
+ renderer.invertChild(element, parentNode);
+ }
+
+ // append it
+ parentNode.appendChild(element);
+
+ // align text after adding to be able to read offset
+ wrapper.added = true;
+ if (wrapper.alignOnAdd && !wrapper.deferUpdateTransform) {
+ wrapper.updateTransform();
+ }
+
+ // fire an event for internal hooks
+ if (wrapper.onAdd) {
+ wrapper.onAdd();
+ }
+
+ return wrapper;
+ },
+
+ /**
+ * VML always uses htmlUpdateTransform
+ */
+ updateTransform: SVGElement.prototype.htmlUpdateTransform,
+
+ /**
+ * Set the rotation of a span with oldIE's filter
+ */
+ setSpanRotation: function () {
+ // Adjust for alignment and rotation. Rotation of useHTML content is not yet implemented
+ // but it can probably be implemented for Firefox 3.5+ on user request. FF3.5+
+ // has support for CSS3 transform. The getBBox method also needs to be updated
+ // to compensate for the rotation, like it currently does for SVG.
+ // Test case: http://jsfiddle.net/highcharts/Ybt44/
+
+ var rotation = this.rotation,
+ costheta = mathCos(rotation * deg2rad),
+ sintheta = mathSin(rotation * deg2rad);
+
+ css(this.element, {
+ filter: rotation ? ['progid:DXImageTransform.Microsoft.Matrix(M11=', costheta,
+ ', M12=', -sintheta, ', M21=', sintheta, ', M22=', costheta,
+ ', sizingMethod=\'auto expand\')'].join('') : NONE
+ });
+ },
+
+ /**
+ * Get the positioning correction for the span after rotating.
+ */
+ getSpanCorrection: function (width, baseline, alignCorrection, rotation, align) {
+
+ var costheta = rotation ? mathCos(rotation * deg2rad) : 1,
+ sintheta = rotation ? mathSin(rotation * deg2rad) : 0,
+ height = pick(this.elemHeight, this.element.offsetHeight),
+ quad,
+ nonLeft = align && align !== 'left';
+
+ // correct x and y
+ this.xCorr = costheta < 0 && -width;
+ this.yCorr = sintheta < 0 && -height;
+
+ // correct for baseline and corners spilling out after rotation
+ quad = costheta * sintheta < 0;
+ this.xCorr += sintheta * baseline * (quad ? 1 - alignCorrection : alignCorrection);
+ this.yCorr -= costheta * baseline * (rotation ? (quad ? alignCorrection : 1 - alignCorrection) : 1);
+ // correct for the length/height of the text
+ if (nonLeft) {
+ this.xCorr -= width * alignCorrection * (costheta < 0 ? -1 : 1);
+ if (rotation) {
+ this.yCorr -= height * alignCorrection * (sintheta < 0 ? -1 : 1);
+ }
+ css(this.element, {
+ textAlign: align
+ });
+ }
+ },
+
+ /**
+ * Converts a subset of an SVG path definition to its VML counterpart. Takes an array
+ * as the parameter and returns a string.
+ */
+ pathToVML: function (value) {
+ // convert paths
+ var i = value.length,
+ path = [];
+
+ while (i--) {
+
+ // Multiply by 10 to allow subpixel precision.
+ // Substracting half a pixel seems to make the coordinates
+ // align with SVG, but this hasn't been tested thoroughly
+ if (isNumber(value[i])) {
+ path[i] = mathRound(value[i] * 10) - 5;
+ } else if (value[i] === 'Z') { // close the path
+ path[i] = 'x';
+ } else {
+ path[i] = value[i];
+
+ // When the start X and end X coordinates of an arc are too close,
+ // they are rounded to the same value above. In this case, substract or
+ // add 1 from the end X and Y positions. #186, #760, #1371, #1410.
+ if (value.isArc && (value[i] === 'wa' || value[i] === 'at')) {
+ // Start and end X
+ if (path[i + 5] === path[i + 7]) {
+ path[i + 7] += value[i + 7] > value[i + 5] ? 1 : -1;
+ }
+ // Start and end Y
+ if (path[i + 6] === path[i + 8]) {
+ path[i + 8] += value[i + 8] > value[i + 6] ? 1 : -1;
+ }
+ }
+ }
+ }
+
+
+ // Loop up again to handle path shortcuts (#2132)
+ /*while (i++ < path.length) {
+ if (path[i] === 'H') { // horizontal line to
+ path[i] = 'L';
+ path.splice(i + 2, 0, path[i - 1]);
+ } else if (path[i] === 'V') { // vertical line to
+ path[i] = 'L';
+ path.splice(i + 1, 0, path[i - 2]);
+ }
+ }*/
+ return path.join(' ') || 'x';
+ },
+
+ /**
+ * Set the element's clipping to a predefined rectangle
+ *
+ * @param {String} id The id of the clip rectangle
+ */
+ clip: function (clipRect) {
+ var wrapper = this,
+ clipMembers,
+ cssRet;
+
+ if (clipRect) {
+ clipMembers = clipRect.members;
+ erase(clipMembers, wrapper); // Ensure unique list of elements (#1258)
+ clipMembers.push(wrapper);
+ wrapper.destroyClip = function () {
+ erase(clipMembers, wrapper);
+ };
+ cssRet = clipRect.getCSS(wrapper);
+
+ } else {
+ if (wrapper.destroyClip) {
+ wrapper.destroyClip();
+ }
+ cssRet = { clip: docMode8 ? 'inherit' : 'rect(auto)' }; // #1214
+ }
+
+ return wrapper.css(cssRet);
+
+ },
+
+ /**
+ * Set styles for the element
+ * @param {Object} styles
+ */
+ css: SVGElement.prototype.htmlCss,
+
+ /**
+ * Removes a child either by removeChild or move to garbageBin.
+ * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not.
+ */
+ safeRemoveChild: function (element) {
+ // discardElement will detach the node from its parent before attaching it
+ // to the garbage bin. Therefore it is important that the node is attached and have parent.
+ if (element.parentNode) {
+ discardElement(element);
+ }
+ },
+
+ /**
+ * Extend element.destroy by removing it from the clip members array
+ */
+ destroy: function () {
+ if (this.destroyClip) {
+ this.destroyClip();
+ }
+
+ return SVGElement.prototype.destroy.apply(this);
+ },
+
+ /**
+ * Add an event listener. VML override for normalizing event parameters.
+ * @param {String} eventType
+ * @param {Function} handler
+ */
+ on: function (eventType, handler) {
+ // simplest possible event model for internal use
+ this.element['on' + eventType] = function () {
+ var evt = win.event;
+ evt.target = evt.srcElement;
+ handler(evt);
+ };
+ return this;
+ },
+
+ /**
+ * In stacked columns, cut off the shadows so that they don't overlap
+ */
+ cutOffPath: function (path, length) {
+
+ var len;
+
+ path = path.split(/[ ,]/);
+ len = path.length;
+
+ if (len === 9 || len === 11) {
+ path[len - 4] = path[len - 2] = pInt(path[len - 2]) - 10 * length;
+ }
+ return path.join(' ');
+ },
+
+ /**
+ * Apply a drop shadow by copying elements and giving them different strokes
+ * @param {Boolean|Object} shadowOptions
+ */
+ shadow: function (shadowOptions, group, cutOff) {
+ var shadows = [],
+ i,
+ element = this.element,
+ renderer = this.renderer,
+ shadow,
+ elemStyle = element.style,
+ markup,
+ path = element.path,
+ strokeWidth,
+ modifiedPath,
+ shadowWidth,
+ shadowElementOpacity;
+
+ // some times empty paths are not strings
+ if (path && typeof path.value !== 'string') {
+ path = 'x';
+ }
+ modifiedPath = path;
+
+ if (shadowOptions) {
+ shadowWidth = pick(shadowOptions.width, 3);
+ shadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;
+ for (i = 1; i <= 3; i++) {
+
+ strokeWidth = (shadowWidth * 2) + 1 - (2 * i);
+
+ // Cut off shadows for stacked column items
+ if (cutOff) {
+ modifiedPath = this.cutOffPath(path.value, strokeWidth + 0.5);
+ }
+
+ markup = [' '];
+
+ shadow = createElement(renderer.prepVML(markup),
+ null, {
+ left: pInt(elemStyle.left) + pick(shadowOptions.offsetX, 1),
+ top: pInt(elemStyle.top) + pick(shadowOptions.offsetY, 1)
+ }
+ );
+ if (cutOff) {
+ shadow.cutOff = strokeWidth + 1;
+ }
+
+ // apply the opacity
+ markup = [' '];
+ createElement(renderer.prepVML(markup), null, null, shadow);
+
+
+ // insert it
+ if (group) {
+ group.element.appendChild(shadow);
+ } else {
+ element.parentNode.insertBefore(shadow, element);
+ }
+
+ // record it
+ shadows.push(shadow);
+
+ }
+
+ this.shadows = shadows;
+ }
+ return this;
+ },
+ updateShadows: noop, // Used in SVG only
+
+ setAttr: function (key, value) {
+ if (docMode8) { // IE8 setAttribute bug
+ this.element[key] = value;
+ } else {
+ this.element.setAttribute(key, value);
+ }
+ },
+ classSetter: function (value) {
+ // IE8 Standards mode has problems retrieving the className unless set like this
+ this.element.className = value;
+ },
+ dashstyleSetter: function (value, key, element) {
+ var strokeElem = element.getElementsByTagName('stroke')[0] ||
+ createElement(this.renderer.prepVML([' ']), null, null, element);
+ strokeElem[key] = value || 'solid';
+ this[key] = value; /* because changing stroke-width will change the dash length
+ and cause an epileptic effect */
+ },
+ dSetter: function (value, key, element) {
+ var i,
+ shadows = this.shadows;
+ value = value || [];
+ this.d = value.join && value.join(' '); // used in getter for animation
+
+ element.path = value = this.pathToVML(value);
+
+ // update shadows
+ if (shadows) {
+ i = shadows.length;
+ while (i--) {
+ shadows[i].path = shadows[i].cutOff ? this.cutOffPath(value, shadows[i].cutOff) : value;
+ }
+ }
+ this.setAttr(key, value);
+ },
+ fillSetter: function (value, key, element) {
+ var nodeName = element.nodeName;
+ if (nodeName === 'SPAN') { // text color
+ element.style.color = value;
+ } else if (nodeName !== 'IMG') { // #1336
+ element.filled = value !== NONE;
+ this.setAttr('fillcolor', this.renderer.color(value, element, key, this));
+ }
+ },
+ 'fill-opacitySetter': function (value, key, element) {
+ createElement(
+ this.renderer.prepVML(['<', key.split('-')[0], ' opacity="', value, '"/>']),
+ null,
+ null,
+ element
+ );
+ },
+ opacitySetter: noop, // Don't bother - animation is too slow and filters introduce artifacts
+ rotationSetter: function (value, key, element) {
+ var style = element.style;
+ this[key] = style[key] = value; // style is for #1873
+
+ // Correction for the 1x1 size of the shape container. Used in gauge needles.
+ style.left = -mathRound(mathSin(value * deg2rad) + 1) + PX;
+ style.top = mathRound(mathCos(value * deg2rad)) + PX;
+ },
+ strokeSetter: function (value, key, element) {
+ this.setAttr('strokecolor', this.renderer.color(value, element, key, this));
+ },
+ 'stroke-widthSetter': function (value, key, element) {
+ element.stroked = !!value; // VML "stroked" attribute
+ this[key] = value; // used in getter, issue #113
+ if (isNumber(value)) {
+ value += PX;
+ }
+ this.setAttr('strokeweight', value);
+ },
+ titleSetter: function (value, key) {
+ this.setAttr(key, value);
+ },
+ visibilitySetter: function (value, key, element) {
+
+ // Handle inherited visibility
+ if (value === 'inherit') {
+ value = VISIBLE;
+ }
+
+ // Let the shadow follow the main element
+ if (this.shadows) {
+ each(this.shadows, function (shadow) {
+ shadow.style[key] = value;
+ });
+ }
+
+ // Instead of toggling the visibility CSS property, move the div out of the viewport.
+ // This works around #61 and #586
+ if (element.nodeName === 'DIV') {
+ value = value === HIDDEN ? '-999em' : 0;
+
+ // In order to redraw, IE7 needs the div to be visible when tucked away
+ // outside the viewport. So the visibility is actually opposite of
+ // the expected value. This applies to the tooltip only.
+ if (!docMode8) {
+ element.style[key] = value ? VISIBLE : HIDDEN;
+ }
+ key = 'top';
+ }
+ element.style[key] = value;
+ },
+ xSetter: function (value, key, element) {
+ this[key] = value; // used in getter
+
+ if (key === 'x') {
+ key = 'left';
+ } else if (key === 'y') {
+ key = 'top';
+ }/* else {
+ value = mathMax(0, value); // don't set width or height below zero (#311)
+ }*/
+
+ // clipping rectangle special
+ if (this.updateClipping) {
+ this[key] = value; // the key is now 'left' or 'top' for 'x' and 'y'
+ this.updateClipping();
+ } else {
+ // normal
+ element.style[key] = value;
+ }
+ },
+ zIndexSetter: function (value, key, element) {
+ element.style[key] = value;
+ }
+ };
+ VMLElement['stroke-opacitySetter'] = VMLElement['fill-opacitySetter'];
+
+ Highcharts.VMLElement = VMLElement = extendClass(SVGElement, VMLElement);
+
+ // Some shared setters
+ VMLElement.prototype.ySetter =
+ VMLElement.prototype.widthSetter =
+ VMLElement.prototype.heightSetter =
+ VMLElement.prototype.xSetter;
+
+
+ /**
+ * The VML renderer
+ */
+ var VMLRendererExtension = { // inherit SVGRenderer
+
+ Element: VMLElement,
+ isIE8: userAgent.indexOf('MSIE 8.0') > -1,
+
+
+ /**
+ * Initialize the VMLRenderer
+ * @param {Object} container
+ * @param {Number} width
+ * @param {Number} height
+ */
+ init: function (container, width, height, style) {
+ var renderer = this,
+ boxWrapper,
+ box,
+ css;
+
+ renderer.alignedObjects = [];
+
+ boxWrapper = renderer.createElement(DIV)
+ .css(extend(this.getStyle(style), { position: 'relative' }));
+ box = boxWrapper.element;
+ container.appendChild(boxWrapper.element);
+
+
+ // generate the containing box
+ renderer.isVML = true;
+ renderer.box = box;
+ renderer.boxWrapper = boxWrapper;
+ renderer.gradients = {};
+ renderer.cache = {}; // Cache for numerical bounding boxes
+ renderer.cacheKeys = [];
+ renderer.imgCount = 0;
+
+
+ renderer.setSize(width, height, false);
+
+ // The only way to make IE6 and IE7 print is to use a global namespace. However,
+ // with IE8 the only way to make the dynamic shapes visible in screen and print mode
+ // seems to be to add the xmlns attribute and the behaviour style inline.
+ if (!doc.namespaces.hcv) {
+
+ doc.namespaces.add('hcv', 'urn:schemas-microsoft-com:vml');
+
+ // Setup default CSS (#2153, #2368, #2384)
+ css = 'hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke' +
+ '{ behavior:url(#default#VML); display: inline-block; } ';
+ try {
+ doc.createStyleSheet().cssText = css;
+ } catch (e) {
+ doc.styleSheets[0].cssText += css;
+ }
+
+ }
+ },
+
+
+ /**
+ * Detect whether the renderer is hidden. This happens when one of the parent elements
+ * has display: none
+ */
+ isHidden: function () {
+ return !this.box.offsetWidth;
+ },
+
+ /**
+ * Define a clipping rectangle. In VML it is accomplished by storing the values
+ * for setting the CSS style to all associated members.
+ *
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} width
+ * @param {Number} height
+ */
+ clipRect: function (x, y, width, height) {
+
+ // create a dummy element
+ var clipRect = this.createElement(),
+ isObj = isObject(x);
+
+ // mimic a rectangle with its style object for automatic updating in attr
+ return extend(clipRect, {
+ members: [],
+ count: 0,
+ left: (isObj ? x.x : x) + 1,
+ top: (isObj ? x.y : y) + 1,
+ width: (isObj ? x.width : width) - 1,
+ height: (isObj ? x.height : height) - 1,
+ getCSS: function (wrapper) {
+ var element = wrapper.element,
+ nodeName = element.nodeName,
+ isShape = nodeName === 'shape',
+ inverted = wrapper.inverted,
+ rect = this,
+ top = rect.top - (isShape ? element.offsetTop : 0),
+ left = rect.left,
+ right = left + rect.width,
+ bottom = top + rect.height,
+ ret = {
+ clip: 'rect(' +
+ mathRound(inverted ? left : top) + 'px,' +
+ mathRound(inverted ? bottom : right) + 'px,' +
+ mathRound(inverted ? right : bottom) + 'px,' +
+ mathRound(inverted ? top : left) + 'px)'
+ };
+
+ // issue 74 workaround
+ if (!inverted && docMode8 && nodeName === 'DIV') {
+ extend(ret, {
+ width: right + PX,
+ height: bottom + PX
+ });
+ }
+ return ret;
+ },
+
+ // used in attr and animation to update the clipping of all members
+ updateClipping: function () {
+ each(clipRect.members, function (member) {
+ if (member.element) { // Deleted series, like in stock/members/series-remove demo. Should be removed from members, but this will do.
+ member.css(clipRect.getCSS(member));
+ }
+ });
+ }
+ });
+
+ },
+
+
+ /**
+ * Take a color and return it if it's a string, make it a gradient if it's a
+ * gradient configuration object, and apply opacity.
+ *
+ * @param {Object} color The color or config object
+ */
+ color: function (color, elem, prop, wrapper) {
+ var renderer = this,
+ colorObject,
+ regexRgba = /^rgba/,
+ markup,
+ fillType,
+ ret = NONE;
+
+ // Check for linear or radial gradient
+ if (color && color.linearGradient) {
+ fillType = 'gradient';
+ } else if (color && color.radialGradient) {
+ fillType = 'pattern';
+ }
+
+
+ if (fillType) {
+
+ var stopColor,
+ stopOpacity,
+ gradient = color.linearGradient || color.radialGradient,
+ x1,
+ y1,
+ x2,
+ y2,
+ opacity1,
+ opacity2,
+ color1,
+ color2,
+ fillAttr = '',
+ stops = color.stops,
+ firstStop,
+ lastStop,
+ colors = [],
+ addFillNode = function () {
+ // Add the fill subnode. When colors attribute is used, the meanings of opacity and o:opacity2
+ // are reversed.
+ markup = [' '];
+ createElement(renderer.prepVML(markup), null, null, elem);
+ };
+
+ // Extend from 0 to 1
+ firstStop = stops[0];
+ lastStop = stops[stops.length - 1];
+ if (firstStop[0] > 0) {
+ stops.unshift([
+ 0,
+ firstStop[1]
+ ]);
+ }
+ if (lastStop[0] < 1) {
+ stops.push([
+ 1,
+ lastStop[1]
+ ]);
+ }
+
+ // Compute the stops
+ each(stops, function (stop, i) {
+ if (regexRgba.test(stop[1])) {
+ colorObject = Color(stop[1]);
+ stopColor = colorObject.get('rgb');
+ stopOpacity = colorObject.get('a');
+ } else {
+ stopColor = stop[1];
+ stopOpacity = 1;
+ }
+
+ // Build the color attribute
+ colors.push((stop[0] * 100) + '% ' + stopColor);
+
+ // Only start and end opacities are allowed, so we use the first and the last
+ if (!i) {
+ opacity1 = stopOpacity;
+ color2 = stopColor;
+ } else {
+ opacity2 = stopOpacity;
+ color1 = stopColor;
+ }
+ });
+
+ // Apply the gradient to fills only.
+ if (prop === 'fill') {
+
+ // Handle linear gradient angle
+ if (fillType === 'gradient') {
+ x1 = gradient.x1 || gradient[0] || 0;
+ y1 = gradient.y1 || gradient[1] || 0;
+ x2 = gradient.x2 || gradient[2] || 0;
+ y2 = gradient.y2 || gradient[3] || 0;
+ fillAttr = 'angle="' + (90 - math.atan(
+ (y2 - y1) / // y vector
+ (x2 - x1) // x vector
+ ) * 180 / mathPI) + '"';
+
+ addFillNode();
+
+ // Radial (circular) gradient
+ } else {
+
+ var r = gradient.r,
+ sizex = r * 2,
+ sizey = r * 2,
+ cx = gradient.cx,
+ cy = gradient.cy,
+ radialReference = elem.radialReference,
+ bBox,
+ applyRadialGradient = function () {
+ if (radialReference) {
+ bBox = wrapper.getBBox();
+ cx += (radialReference[0] - bBox.x) / bBox.width - 0.5;
+ cy += (radialReference[1] - bBox.y) / bBox.height - 0.5;
+ sizex *= radialReference[2] / bBox.width;
+ sizey *= radialReference[2] / bBox.height;
+ }
+ fillAttr = 'src="' + defaultOptions.global.VMLRadialGradientURL + '" ' +
+ 'size="' + sizex + ',' + sizey + '" ' +
+ 'origin="0.5,0.5" ' +
+ 'position="' + cx + ',' + cy + '" ' +
+ 'color2="' + color2 + '" ';
+
+ addFillNode();
+ };
+
+ // Apply radial gradient
+ if (wrapper.added) {
+ applyRadialGradient();
+ } else {
+ // We need to know the bounding box to get the size and position right
+ wrapper.onAdd = applyRadialGradient;
+ }
+
+ // The fill element's color attribute is broken in IE8 standards mode, so we
+ // need to set the parent shape's fillcolor attribute instead.
+ ret = color1;
+ }
+
+ // Gradients are not supported for VML stroke, return the first color. #722.
+ } else {
+ ret = stopColor;
+ }
+
+ // If the color is an rgba color, split it and add a fill node
+ // to hold the opacity component
+ } else if (regexRgba.test(color) && elem.tagName !== 'IMG') {
+
+ colorObject = Color(color);
+
+ wrapper[prop + '-opacitySetter'](colorObject.get('a'), prop, elem);
+
+ ret = colorObject.get('rgb');
+
+
+ } else {
+ var propNodes = elem.getElementsByTagName(prop); // 'stroke' or 'fill' node
+ if (propNodes.length) {
+ propNodes[0].opacity = 1;
+ propNodes[0].type = 'solid';
+ }
+ ret = color;
+ }
+
+ return ret;
+ },
+
+ /**
+ * Take a VML string and prepare it for either IE8 or IE6/IE7.
+ * @param {Array} markup A string array of the VML markup to prepare
+ */
+ prepVML: function (markup) {
+ var vmlStyle = 'display:inline-block;behavior:url(#default#VML);',
+ isIE8 = this.isIE8;
+
+ markup = markup.join('');
+
+ if (isIE8) { // add xmlns and style inline
+ markup = markup.replace('/>', ' xmlns="urn:schemas-microsoft-com:vml" />');
+ if (markup.indexOf('style="') === -1) {
+ markup = markup.replace('/>', ' style="' + vmlStyle + '" />');
+ } else {
+ markup = markup.replace('style="', 'style="' + vmlStyle);
+ }
+
+ } else { // add namespace
+ markup = markup.replace('<', ' 1) {
+ obj.attr({
+ x: x,
+ y: y,
+ width: width,
+ height: height
+ });
+ }
+ return obj;
+ },
+
+ /**
+ * For rectangles, VML uses a shape for rect to overcome bugs and rotation problems
+ */
+ createElement: function (nodeName) {
+ return nodeName === 'rect' ? this.symbol(nodeName) : SVGRenderer.prototype.createElement.call(this, nodeName);
+ },
+
+ /**
+ * In the VML renderer, each child of an inverted div (group) is inverted
+ * @param {Object} element
+ * @param {Object} parentNode
+ */
+ invertChild: function (element, parentNode) {
+ var ren = this,
+ parentStyle = parentNode.style,
+ imgStyle = element.tagName === 'IMG' && element.style; // #1111
+
+ css(element, {
+ flip: 'x',
+ left: pInt(parentStyle.width) - (imgStyle ? pInt(imgStyle.top) : 1),
+ top: pInt(parentStyle.height) - (imgStyle ? pInt(imgStyle.left) : 1),
+ rotation: -90
+ });
+
+ // Recursively invert child elements, needed for nested composite shapes like box plots and error bars. #1680, #1806.
+ each(element.childNodes, function (child) {
+ ren.invertChild(child, element);
+ });
+ },
+
+ /**
+ * Symbol definitions that override the parent SVG renderer's symbols
+ *
+ */
+ symbols: {
+ // VML specific arc function
+ arc: function (x, y, w, h, options) {
+ var start = options.start,
+ end = options.end,
+ radius = options.r || w || h,
+ innerRadius = options.innerR,
+ cosStart = mathCos(start),
+ sinStart = mathSin(start),
+ cosEnd = mathCos(end),
+ sinEnd = mathSin(end),
+ ret;
+
+ if (end - start === 0) { // no angle, don't show it.
+ return ['x'];
+ }
+
+ ret = [
+ 'wa', // clockwise arc to
+ x - radius, // left
+ y - radius, // top
+ x + radius, // right
+ y + radius, // bottom
+ x + radius * cosStart, // start x
+ y + radius * sinStart, // start y
+ x + radius * cosEnd, // end x
+ y + radius * sinEnd // end y
+ ];
+
+ if (options.open && !innerRadius) {
+ ret.push(
+ 'e',
+ M,
+ x, // - innerRadius,
+ y// - innerRadius
+ );
+ }
+
+ ret.push(
+ 'at', // anti clockwise arc to
+ x - innerRadius, // left
+ y - innerRadius, // top
+ x + innerRadius, // right
+ y + innerRadius, // bottom
+ x + innerRadius * cosEnd, // start x
+ y + innerRadius * sinEnd, // start y
+ x + innerRadius * cosStart, // end x
+ y + innerRadius * sinStart, // end y
+ 'x', // finish path
+ 'e' // close
+ );
+
+ ret.isArc = true;
+ return ret;
+
+ },
+ // Add circle symbol path. This performs significantly faster than v:oval.
+ circle: function (x, y, w, h, wrapper) {
+
+ if (wrapper) {
+ w = h = 2 * wrapper.r;
+ }
+
+ // Center correction, #1682
+ if (wrapper && wrapper.isCircle) {
+ x -= w / 2;
+ y -= h / 2;
+ }
+
+ // Return the path
+ return [
+ 'wa', // clockwisearcto
+ x, // left
+ y, // top
+ x + w, // right
+ y + h, // bottom
+ x + w, // start x
+ y + h / 2, // start y
+ x + w, // end x
+ y + h / 2, // end y
+ //'x', // finish path
+ 'e' // close
+ ];
+ },
+ /**
+ * Add rectangle symbol path which eases rotation and omits arcsize problems
+ * compared to the built-in VML roundrect shape. When borders are not rounded,
+ * use the simpler square path, else use the callout path without the arrow.
+ */
+ rect: function (x, y, w, h, options) {
+ return SVGRenderer.prototype.symbols[
+ !defined(options) || !options.r ? 'square' : 'callout'
+ ].call(0, x, y, w, h, options);
+ }
+ }
+ };
+ Highcharts.VMLRenderer = VMLRenderer = function () {
+ this.init.apply(this, arguments);
+ };
+ VMLRenderer.prototype = merge(SVGRenderer.prototype, VMLRendererExtension);
+
+ // general renderer
+ Renderer = VMLRenderer;
+ }
+
+ // This method is used with exporting in old IE, when emulating SVG (see #2314)
+ SVGRenderer.prototype.measureSpanWidth = function (text, styles) {
+ var measuringSpan = doc.createElement('span'),
+ offsetWidth,
+ textNode = doc.createTextNode(text);
+
+ measuringSpan.appendChild(textNode);
+ css(measuringSpan, styles);
+ this.box.appendChild(measuringSpan);
+ offsetWidth = measuringSpan.offsetWidth;
+ discardElement(measuringSpan); // #2463
+ return offsetWidth;
+ };
+
+
+ /* ****************************************************************************
+ * *
+ * END OF INTERNET EXPLORER <= 8 SPECIFIC CODE *
+ * *
+ *****************************************************************************/
+ /* ****************************************************************************
+ * *
+ * START OF ANDROID < 3 SPECIFIC CODE. THIS CAN BE REMOVED IF YOU'RE NOT *
+ * TARGETING THAT SYSTEM. *
+ * *
+ *****************************************************************************/
+ var CanVGRenderer,
+ CanVGController;
+
+ /**
+ * Downloads a script and executes a callback when done.
+ * @param {String} scriptLocation
+ * @param {Function} callback
+ */
+ function getScript(scriptLocation, callback) {
+ var head = doc.getElementsByTagName('head')[0],
+ script = doc.createElement('script');
+
+ script.type = 'text/javascript';
+ script.src = scriptLocation;
+ script.onload = callback;
+
+ head.appendChild(script);
+ }
+
+ if (useCanVG) {
+ /**
+ * The CanVGRenderer is empty from start to keep the source footprint small.
+ * When requested, the CanVGController downloads the rest of the source packaged
+ * together with the canvg library.
+ */
+ Highcharts.CanVGRenderer = CanVGRenderer = function () {
+ // Override the global SVG namespace to fake SVG/HTML that accepts CSS
+ SVG_NS = 'http://www.w3.org/1999/xhtml';
+ };
+
+ /**
+ * Start with an empty symbols object. This is needed when exporting is used (exporting.src.js will add a few symbols), but
+ * the implementation from SvgRenderer will not be merged in until first render.
+ */
+ CanVGRenderer.prototype.symbols = {};
+
+ /**
+ * Handles on demand download of canvg rendering support.
+ */
+ CanVGController = (function () {
+ // List of renderering calls
+ var deferredRenderCalls = [];
+
+ /**
+ * When downloaded, we are ready to draw deferred charts.
+ */
+ function drawDeferred() {
+ var callLength = deferredRenderCalls.length,
+ callIndex;
+
+ // Draw all pending render calls
+ for (callIndex = 0; callIndex < callLength; callIndex++) {
+ deferredRenderCalls[callIndex]();
+ }
+ // Clear the list
+ deferredRenderCalls = [];
+ }
+
+ return {
+ push: function (func, scriptLocation) {
+ // Only get the script once
+ if (deferredRenderCalls.length === 0) {
+ getScript(scriptLocation, drawDeferred);
+ }
+ // Register render call
+ deferredRenderCalls.push(func);
+ }
+ };
+ }());
+
+ Renderer = CanVGRenderer;
+ } // end CanVGRenderer
+
+ /* ****************************************************************************
+ * *
+ * END OF ANDROID < 3 SPECIFIC CODE *
+ * *
+ *****************************************************************************/
+
+ /**
+ * The Tick class
+ */
+ function Tick(axis, pos, type, noLabel) {
+ this.axis = axis;
+ this.pos = pos;
+ this.type = type || '';
+ this.isNew = true;
+
+ if (!type && !noLabel) {
+ this.addLabel();
+ }
+ }
+
+ Tick.prototype = {
+ /**
+ * Write the tick label
+ */
+ addLabel: function () {
+ var tick = this,
+ axis = tick.axis,
+ options = axis.options,
+ chart = axis.chart,
+ categories = axis.categories,
+ names = axis.names,
+ pos = tick.pos,
+ labelOptions = options.labels,
+ str,
+ tickPositions = axis.tickPositions,
+ isFirst = pos === tickPositions[0],
+ isLast = pos === tickPositions[tickPositions.length - 1],
+ value = categories ?
+ pick(categories[pos], names[pos], pos) :
+ pos,
+ label = tick.label,
+ tickPositionInfo = tickPositions.info,
+ dateTimeLabelFormat;
+
+ // Set the datetime label format. If a higher rank is set for this position, use that. If not,
+ // use the general format.
+ if (axis.isDatetimeAxis && tickPositionInfo) {
+ dateTimeLabelFormat = options.dateTimeLabelFormats[tickPositionInfo.higherRanks[pos] || tickPositionInfo.unitName];
+ }
+ // set properties for access in render method
+ tick.isFirst = isFirst;
+ tick.isLast = isLast;
+
+ // get the string
+ str = axis.labelFormatter.call({
+ axis: axis,
+ chart: chart,
+ isFirst: isFirst,
+ isLast: isLast,
+ dateTimeLabelFormat: dateTimeLabelFormat,
+ value: axis.isLog ? correctFloat(axis.lin2log(value)) : value
+ });
+
+ // prepare CSS
+ //css = width && { width: mathMax(1, mathRound(width - 2 * (labelOptions.padding || 10))) + PX };
+
+ // first call
+ if (!defined(label)) {
+
+ tick.label = label =
+ defined(str) && labelOptions.enabled ?
+ chart.renderer.text(
+ str,
+ 0,
+ 0,
+ labelOptions.useHTML
+ )
+ //.attr(attr)
+ // without position absolute, IE export sometimes is wrong
+ .css(merge(labelOptions.style))
+ .add(axis.labelGroup) :
+ null;
+ tick.labelLength = label && label.getBBox().width; // Un-rotated length
+ tick.rotation = 0; // Base value to detect change for new calls to getBBox
+
+ // update
+ } else if (label) {
+ label.attr({ text: str });
+ }
+ },
+
+ /**
+ * Get the offset height or width of the label
+ */
+ getLabelSize: function () {
+ return this.label ?
+ this.label.getBBox()[this.axis.horiz ? 'height' : 'width'] :
+ 0;
+ },
+
+ /**
+ * Handle the label overflow by adjusting the labels to the left and right edge, or
+ * hide them if they collide into the neighbour label.
+ */
+ handleOverflow: function (xy) {
+ var axis = this.axis,
+ pxPos = xy.x,
+ chartWidth = axis.chart.chartWidth,
+ spacing = axis.chart.spacing,
+ leftBound = pick(axis.labelLeft, mathMin(axis.pos, spacing[3])),
+ rightBound = pick(axis.labelRight, mathMax(axis.pos + axis.len, chartWidth - spacing[1])),
+ label = this.label,
+ rotation = this.rotation,
+ factor = { left: 0, center: 0.5, right: 1 }[axis.labelAlign],
+ labelWidth = label.getBBox().width,
+ slotWidth = axis.getSlotWidth(),
+ modifiedSlotWidth = slotWidth,
+ xCorrection = factor,
+ goRight = 1,
+ leftPos,
+ rightPos,
+ textWidth,
+ css = {};
+
+ // Check if the label overshoots the chart spacing box. If it does, move it.
+ // If it now overshoots the slotWidth, add ellipsis.
+ if (!rotation) {
+ leftPos = pxPos - factor * labelWidth;
+ rightPos = pxPos + (1 - factor) * labelWidth;
+
+ if (leftPos < leftBound) {
+ modifiedSlotWidth = xy.x + modifiedSlotWidth * (1 - factor) - leftBound;
+ } else if (rightPos > rightBound) {
+ modifiedSlotWidth = rightBound - xy.x + modifiedSlotWidth * factor;
+ goRight = -1;
+ }
+
+ modifiedSlotWidth = mathMin(slotWidth, modifiedSlotWidth); // #4177
+ if (modifiedSlotWidth < slotWidth && axis.labelAlign === 'center') {
+ xy.x += goRight * (slotWidth - modifiedSlotWidth - xCorrection * (slotWidth - mathMin(labelWidth, modifiedSlotWidth)));
+ }
+ // If the label width exceeds the available space, set a text width to be
+ // picked up below. Also, if a width has been set before, we need to set a new
+ // one because the reported labelWidth will be limited by the box (#3938).
+ if (labelWidth > modifiedSlotWidth || (axis.autoRotation && label.styles.width)) {
+ textWidth = modifiedSlotWidth;
+ }
+
+ // Add ellipsis to prevent rotated labels to be clipped against the edge of the chart
+ } else if (rotation < 0 && pxPos - factor * labelWidth < leftBound) {
+ textWidth = mathRound(pxPos / mathCos(rotation * deg2rad) - leftBound);
+ } else if (rotation > 0 && pxPos + factor * labelWidth > rightBound) {
+ textWidth = mathRound((chartWidth - pxPos) / mathCos(rotation * deg2rad));
+ }
+
+ if (textWidth) {
+ css.width = textWidth;
+ if (!axis.options.labels.style.textOverflow) {
+ css.textOverflow = 'ellipsis';
+ }
+ label.css(css);
+ }
+ },
+
+ /**
+ * Get the x and y position for ticks and labels
+ */
+ getPosition: function (horiz, pos, tickmarkOffset, old) {
+ var axis = this.axis,
+ chart = axis.chart,
+ cHeight = (old && chart.oldChartHeight) || chart.chartHeight;
+
+ return {
+ x: horiz ?
+ axis.translate(pos + tickmarkOffset, null, null, old) + axis.transB :
+ axis.left + axis.offset + (axis.opposite ? ((old && chart.oldChartWidth) || chart.chartWidth) - axis.right - axis.left : 0),
+
+ y: horiz ?
+ cHeight - axis.bottom + axis.offset - (axis.opposite ? axis.height : 0) :
+ cHeight - axis.translate(pos + tickmarkOffset, null, null, old) - axis.transB
+ };
+
+ },
+
+ /**
+ * Get the x, y position of the tick label
+ */
+ getLabelPosition: function (x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {
+ var axis = this.axis,
+ transA = axis.transA,
+ reversed = axis.reversed,
+ staggerLines = axis.staggerLines,
+ rotCorr = axis.tickRotCorr || { x: 0, y: 0 },
+ yOffset = labelOptions.y,
+ line;
+
+ if (!defined(yOffset)) {
+ if (axis.side === 0) {
+ yOffset = label.rotation ? -8 : -label.getBBox().height;
+ } else if (axis.side === 2) {
+ yOffset = rotCorr.y + 8;
+ } else {
+ // #3140, #3140
+ yOffset = mathCos(label.rotation * deg2rad) * (rotCorr.y - label.getBBox(false, 0).height / 2);
+ }
+ }
+
+ x = x + labelOptions.x + rotCorr.x - (tickmarkOffset && horiz ?
+ tickmarkOffset * transA * (reversed ? -1 : 1) : 0);
+ y = y + yOffset - (tickmarkOffset && !horiz ?
+ tickmarkOffset * transA * (reversed ? 1 : -1) : 0);
+
+ // Correct for staggered labels
+ if (staggerLines) {
+ line = (index / (step || 1) % staggerLines);
+ if (axis.opposite) {
+ line = staggerLines - line - 1;
+ }
+ y += line * (axis.labelOffset / staggerLines);
+ }
+
+ return {
+ x: x,
+ y: mathRound(y)
+ };
+ },
+
+ /**
+ * Extendible method to return the path of the marker
+ */
+ getMarkPath: function (x, y, tickLength, tickWidth, horiz, renderer) {
+ return renderer.crispLine([
+ M,
+ x,
+ y,
+ L,
+ x + (horiz ? 0 : -tickLength),
+ y + (horiz ? tickLength : 0)
+ ], tickWidth);
+ },
+
+ /**
+ * Put everything in place
+ *
+ * @param index {Number}
+ * @param old {Boolean} Use old coordinates to prepare an animation into new position
+ */
+ render: function (index, old, opacity) {
+ var tick = this,
+ axis = tick.axis,
+ options = axis.options,
+ chart = axis.chart,
+ renderer = chart.renderer,
+ horiz = axis.horiz,
+ type = tick.type,
+ label = tick.label,
+ pos = tick.pos,
+ labelOptions = options.labels,
+ gridLine = tick.gridLine,
+ gridPrefix = type ? type + 'Grid' : 'grid',
+ tickPrefix = type ? type + 'Tick' : 'tick',
+ gridLineWidth = options[gridPrefix + 'LineWidth'],
+ gridLineColor = options[gridPrefix + 'LineColor'],
+ dashStyle = options[gridPrefix + 'LineDashStyle'],
+ tickSize = axis.tickSize(tickPrefix),
+ tickColor = options[tickPrefix + 'Color'],
+ gridLinePath,
+ mark = tick.mark,
+ markPath,
+ step = /*axis.labelStep || */labelOptions.step,
+ attribs,
+ show = true,
+ tickmarkOffset = axis.tickmarkOffset,
+ xy = tick.getPosition(horiz, pos, tickmarkOffset, old),
+ x = xy.x,
+ y = xy.y,
+ reverseCrisp = ((horiz && x === axis.pos + axis.len) || (!horiz && y === axis.pos)) ? -1 : 1; // #1480, #1687
+
+ opacity = pick(opacity, 1);
+ this.isActive = true;
+
+ // create the grid line
+ if (gridLineWidth) {
+ gridLinePath = axis.getPlotLinePath(pos + tickmarkOffset, gridLineWidth * reverseCrisp, old, true);
+
+ if (gridLine === UNDEFINED) {
+ attribs = {
+ stroke: gridLineColor,
+ 'stroke-width': gridLineWidth
+ };
+ if (dashStyle) {
+ attribs.dashstyle = dashStyle;
+ }
+ if (!type) {
+ attribs.zIndex = 1;
+ }
+ if (old) {
+ attribs.opacity = 0;
+ }
+ tick.gridLine = gridLine =
+ gridLineWidth ?
+ renderer.path(gridLinePath)
+ .attr(attribs).add(axis.gridGroup) :
+ null;
+ }
+
+ // If the parameter 'old' is set, the current call will be followed
+ // by another call, therefore do not do any animations this time
+ if (!old && gridLine && gridLinePath) {
+ gridLine[tick.isNew ? 'attr' : 'animate']({
+ d: gridLinePath,
+ opacity: opacity
+ });
+ }
+ }
+
+ // create the tick mark
+ if (tickSize) {
+ if (axis.opposite) {
+ tickSize[0] = -tickSize[0];
+ }
+ markPath = tick.getMarkPath(x, y, tickSize[0], tickSize[1] * reverseCrisp, horiz, renderer);
+ if (mark) { // updating
+ mark.animate({
+ d: markPath,
+ opacity: opacity
+ });
+ } else { // first time
+ tick.mark = renderer.path(
+ markPath
+ ).attr({
+ stroke: tickColor,
+ 'stroke-width': tickSize[1],
+ opacity: opacity
+ }).add(axis.axisGroup);
+ }
+ }
+
+ // the label is created on init - now move it into place
+ if (label && isNumber(x)) {
+ label.xy = xy = tick.getLabelPosition(x, y, label, horiz, labelOptions, tickmarkOffset, index, step);
+
+ // Apply show first and show last. If the tick is both first and last, it is
+ // a single centered tick, in which case we show the label anyway (#2100).
+ if ((tick.isFirst && !tick.isLast && !pick(options.showFirstLabel, 1)) ||
+ (tick.isLast && !tick.isFirst && !pick(options.showLastLabel, 1))) {
+ show = false;
+
+ // Handle label overflow and show or hide accordingly
+ } else if (horiz && !axis.isRadial && !labelOptions.step && !labelOptions.rotation && !old && opacity !== 0) {
+ tick.handleOverflow(xy);
+ }
+
+ // apply step
+ if (step && index % step) {
+ // show those indices dividable by step
+ show = false;
+ }
+
+ // Set the new position, and show or hide
+ if (show && isNumber(xy.y)) {
+ xy.opacity = opacity;
+ label[tick.isNew ? 'attr' : 'animate'](xy);
+ } else {
+ stop(label); // #5332
+ label.attr('y', -9999); // #1338
+ }
+ tick.isNew = false;
+ }
+ },
+
+ /**
+ * Destructor for the tick prototype
+ */
+ destroy: function () {
+ destroyObjectProperties(this, this.axis);
+ }
+ };
+
+ /**
+ * The object wrapper for plot lines and plot bands
+ * @param {Object} options
+ */
+ Highcharts.PlotLineOrBand = function (axis, options) {
+ this.axis = axis;
+
+ if (options) {
+ this.options = options;
+ this.id = options.id;
+ }
+ };
+
+ Highcharts.PlotLineOrBand.prototype = {
+
+ /**
+ * Render the plot line or plot band. If it is already existing,
+ * move it.
+ */
+ render: function () {
+ var plotLine = this,
+ axis = plotLine.axis,
+ horiz = axis.horiz,
+ options = plotLine.options,
+ optionsLabel = options.label,
+ label = plotLine.label,
+ width = options.width,
+ to = options.to,
+ from = options.from,
+ isBand = defined(from) && defined(to),
+ value = options.value,
+ dashStyle = options.dashStyle,
+ svgElem = plotLine.svgElem,
+ path = [],
+ addEvent,
+ eventType,
+ color = options.color,
+ zIndex = pick(options.zIndex, 0),
+ events = options.events,
+ attribs = {},
+ renderer = axis.chart.renderer,
+ log2lin = axis.log2lin;
+
+ // logarithmic conversion
+ if (axis.isLog) {
+ from = log2lin(from);
+ to = log2lin(to);
+ value = log2lin(value);
+ }
+
+ // plot line
+ if (width) {
+ path = axis.getPlotLinePath(value, width);
+ attribs = {
+ stroke: color,
+ 'stroke-width': width
+ };
+ if (dashStyle) {
+ attribs.dashstyle = dashStyle;
+ }
+ } else if (isBand) { // plot band
+
+ path = axis.getPlotBandPath(from, to, options);
+ if (color) {
+ attribs.fill = color;
+ }
+ if (options.borderWidth) {
+ attribs.stroke = options.borderColor;
+ attribs['stroke-width'] = options.borderWidth;
+ }
+ } else {
+ return;
+ }
+ // zIndex
+ attribs.zIndex = zIndex;
+
+ // common for lines and bands
+ if (svgElem) {
+ if (path) {
+ svgElem.show();
+ svgElem.animate({ d: path });
+ } else {
+ svgElem.hide();
+ if (label) {
+ plotLine.label = label = label.destroy();
+ }
+ }
+ } else if (path && path.length) {
+ plotLine.svgElem = svgElem = renderer.path(path)
+ .attr(attribs).add();
+
+ // events
+ if (events) {
+ addEvent = function (eventType) {
+ svgElem.on(eventType, function (e) {
+ events[eventType].apply(plotLine, [e]);
+ });
+ };
+ for (eventType in events) {
+ addEvent(eventType);
+ }
+ }
+ }
+
+ // the plot band/line label
+ if (optionsLabel && defined(optionsLabel.text) && path && path.length &&
+ axis.width > 0 && axis.height > 0 && !path.flat) {
+ // apply defaults
+ optionsLabel = merge({
+ align: horiz && isBand && 'center',
+ x: horiz ? !isBand && 4 : 10,
+ verticalAlign: !horiz && isBand && 'middle',
+ y: horiz ? isBand ? 16 : 10 : isBand ? 6 : -4,
+ rotation: horiz && !isBand && 90
+ }, optionsLabel);
+
+ this.renderLabel(optionsLabel, path, isBand, zIndex);
+
+ } else if (label) { // move out of sight
+ label.hide();
+ }
+
+ // chainable
+ return plotLine;
+ },
+
+ /**
+ * Render and align label for plot line or band.
+ */
+ renderLabel: function (optionsLabel, path, isBand, zIndex) {
+ var plotLine = this,
+ label = plotLine.label,
+ renderer = plotLine.axis.chart.renderer,
+ attribs,
+ xs,
+ ys,
+ x,
+ y;
+
+ // add the SVG element
+ if (!label) {
+ attribs = {
+ align: optionsLabel.textAlign || optionsLabel.align,
+ rotation: optionsLabel.rotation
+ };
+
+ attribs.zIndex = zIndex;
+
+ plotLine.label = label = renderer.text(
+ optionsLabel.text,
+ 0,
+ 0,
+ optionsLabel.useHTML
+ )
+ .attr(attribs)
+ .css(optionsLabel.style)
+ .add();
+ }
+
+ // get the bounding box and align the label
+ // #3000 changed to better handle choice between plotband or plotline
+ xs = [path[1], path[4], (isBand ? path[6] : path[1])];
+ ys = [path[2], path[5], (isBand ? path[7] : path[2])];
+ x = arrayMin(xs);
+ y = arrayMin(ys);
+
+ label.align(optionsLabel, false, {
+ x: x,
+ y: y,
+ width: arrayMax(xs) - x,
+ height: arrayMax(ys) - y
+ });
+ label.show();
+ },
+
+ /**
+ * Remove the plot line or band
+ */
+ destroy: function () {
+ // remove it from the lookup
+ erase(this.axis.plotLinesAndBands, this);
+
+ delete this.axis;
+ destroyObjectProperties(this);
+ }
+ };
+
+ /**
+ * Object with members for extending the Axis prototype
+ */
+
+ AxisPlotLineOrBandExtension = {
+
+ /**
+ * Create the path for a plot band
+ */
+ getPlotBandPath: function (from, to) {
+ var toPath = this.getPlotLinePath(to, null, null, true),
+ path = this.getPlotLinePath(from, null, null, true);
+
+ if (path && toPath) {
+
+ // Flat paths don't need labels (#3836)
+ path.flat = path.toString() === toPath.toString();
+
+ path.push(
+ toPath[4],
+ toPath[5],
+ toPath[1],
+ toPath[2]
+ );
+ } else { // outside the axis area
+ path = null;
+ }
+
+ return path;
+ },
+
+ addPlotBand: function (options) {
+ return this.addPlotBandOrLine(options, 'plotBands');
+ },
+
+ addPlotLine: function (options) {
+ return this.addPlotBandOrLine(options, 'plotLines');
+ },
+
+ /**
+ * Add a plot band or plot line after render time
+ *
+ * @param options {Object} The plotBand or plotLine configuration object
+ */
+ addPlotBandOrLine: function (options, coll) {
+ var obj = new Highcharts.PlotLineOrBand(this, options).render(),
+ userOptions = this.userOptions;
+
+ if (obj) { // #2189
+ // Add it to the user options for exporting and Axis.update
+ if (coll) {
+ userOptions[coll] = userOptions[coll] || [];
+ userOptions[coll].push(options);
+ }
+ this.plotLinesAndBands.push(obj);
+ }
+
+ return obj;
+ },
+
+ /**
+ * Remove a plot band or plot line from the chart by id
+ * @param {Object} id
+ */
+ removePlotBandOrLine: function (id) {
+ var plotLinesAndBands = this.plotLinesAndBands,
+ options = this.options,
+ userOptions = this.userOptions,
+ i = plotLinesAndBands.length;
+ while (i--) {
+ if (plotLinesAndBands[i].id === id) {
+ plotLinesAndBands[i].destroy();
+ }
+ }
+ each([options.plotLines || [], userOptions.plotLines || [], options.plotBands || [], userOptions.plotBands || []], function (arr) {
+ i = arr.length;
+ while (i--) {
+ if (arr[i].id === id) {
+ erase(arr, arr[i]);
+ }
+ }
+ });
+ }
+ };
+
+ /**
+ * Create a new axis object
+ * @param {Object} chart
+ * @param {Object} options
+ */
+ var Axis = Highcharts.Axis = function () {
+ this.init.apply(this, arguments);
+ };
+
+ Axis.prototype = {
+
+ /**
+ * Default options for the X axis - the Y axis has extended defaults
+ */
+ defaultOptions: {
+ // allowDecimals: null,
+ // alternateGridColor: null,
+ // categories: [],
+ dateTimeLabelFormats: {
+ millisecond: '%H:%M:%S.%L',
+ second: '%H:%M:%S',
+ minute: '%H:%M',
+ hour: '%H:%M',
+ day: '%e. %b',
+ week: '%e. %b',
+ month: '%b \'%y',
+ year: '%Y'
+ },
+ endOnTick: false,
+ gridLineColor: '#D8D8D8',
+ // gridLineDashStyle: 'solid',
+ // gridLineWidth: 0,
+ // reversed: false,
+
+ labels: {
+ enabled: true,
+ // rotation: 0,
+ // align: 'center',
+ // step: null,
+ style: {
+ color: '#606060',
+ cursor: 'default',
+ fontSize: '11px'
+ },
+ x: 0
+ //y: undefined
+ /*formatter: function () {
+ return this.value;
+ },*/
+ },
+ lineColor: '#C0D0E0',
+ lineWidth: 1,
+ //linkedTo: null,
+ //max: undefined,
+ //min: undefined,
+ minPadding: 0.01,
+ maxPadding: 0.01,
+ //minRange: null,
+ minorGridLineColor: '#E0E0E0',
+ // minorGridLineDashStyle: null,
+ minorGridLineWidth: 1,
+ minorTickColor: '#A0A0A0',
+ //minorTickInterval: null,
+ minorTickLength: 2,
+ minorTickPosition: 'outside', // inside or outside
+ //minorTickWidth: 0,
+ //opposite: false,
+ //offset: 0,
+ //plotBands: [{
+ // events: {},
+ // zIndex: 1,
+ // labels: { align, x, verticalAlign, y, style, rotation, textAlign }
+ //}],
+ //plotLines: [{
+ // events: {}
+ // dashStyle: {}
+ // zIndex:
+ // labels: { align, x, verticalAlign, y, style, rotation, textAlign }
+ //}],
+ //reversed: false,
+ // showFirstLabel: true,
+ // showLastLabel: true,
+ startOfWeek: 1,
+ startOnTick: false,
+ tickColor: '#C0D0E0',
+ //tickInterval: null,
+ tickLength: 10,
+ tickmarkPlacement: 'between', // on or between
+ tickPixelInterval: 100,
+ tickPosition: 'outside',
+ //tickWidth: 1,
+ title: {
+ //text: null,
+ align: 'middle', // low, middle or high
+ //margin: 0 for horizontal, 10 for vertical axes,
+ //rotation: 0,
+ //side: 'outside',
+ style: {
+ color: '#707070'
+ }
+ //x: 0,
+ //y: 0
+ },
+ type: 'linear' // linear, logarithmic or datetime
+ //visible: true
+ },
+
+ /**
+ * This options set extends the defaultOptions for Y axes
+ */
+ defaultYAxisOptions: {
+ endOnTick: true,
+ gridLineWidth: 1,
+ tickPixelInterval: 72,
+ showLastLabel: true,
+ labels: {
+ x: -8
+ },
+ lineWidth: 0,
+ maxPadding: 0.05,
+ minPadding: 0.05,
+ startOnTick: true,
+ //tickWidth: 0,
+ title: {
+ rotation: 270,
+ text: 'Values'
+ },
+ stackLabels: {
+ enabled: false,
+ //align: dynamic,
+ //y: dynamic,
+ //x: dynamic,
+ //verticalAlign: dynamic,
+ //textAlign: dynamic,
+ //rotation: 0,
+ formatter: function () {
+ return Highcharts.numberFormat(this.total, -1);
+ },
+ style: merge(defaultPlotOptions.line.dataLabels.style, { color: '#000000' })
+ }
+ },
+
+ /**
+ * These options extend the defaultOptions for left axes
+ */
+ defaultLeftAxisOptions: {
+ labels: {
+ x: -15
+ },
+ title: {
+ rotation: 270
+ }
+ },
+
+ /**
+ * These options extend the defaultOptions for right axes
+ */
+ defaultRightAxisOptions: {
+ labels: {
+ x: 15
+ },
+ title: {
+ rotation: 90
+ }
+ },
+
+ /**
+ * These options extend the defaultOptions for bottom axes
+ */
+ defaultBottomAxisOptions: {
+ labels: {
+ autoRotation: [-45],
+ x: 0
+ // overflow: undefined,
+ // staggerLines: null
+ },
+ title: {
+ rotation: 0
+ }
+ },
+ /**
+ * These options extend the defaultOptions for top axes
+ */
+ defaultTopAxisOptions: {
+ labels: {
+ autoRotation: [-45],
+ x: 0
+ // overflow: undefined
+ // staggerLines: null
+ },
+ title: {
+ rotation: 0
+ }
+ },
+
+ /**
+ * Initialize the axis
+ */
+ init: function (chart, userOptions) {
+
+
+ var isXAxis = userOptions.isX,
+ axis = this;
+
+ axis.chart = chart;
+
+ // Flag, is the axis horizontal
+ axis.horiz = chart.inverted ? !isXAxis : isXAxis;
+
+ // Flag, isXAxis
+ axis.isXAxis = isXAxis;
+ axis.coll = isXAxis ? 'xAxis' : 'yAxis';
+
+ axis.opposite = userOptions.opposite; // needed in setOptions
+ axis.side = userOptions.side || (axis.horiz ?
+ (axis.opposite ? 0 : 2) : // top : bottom
+ (axis.opposite ? 1 : 3)); // right : left
+
+ axis.setOptions(userOptions);
+
+
+ var options = this.options,
+ type = options.type,
+ isDatetimeAxis = type === 'datetime';
+
+ axis.labelFormatter = options.labels.formatter || axis.defaultLabelFormatter; // can be overwritten by dynamic format
+
+
+ // Flag, stagger lines or not
+ axis.userOptions = userOptions;
+
+ //axis.axisTitleMargin = UNDEFINED,// = options.title.margin,
+ axis.minPixelPadding = 0;
+
+ axis.reversed = options.reversed;
+ axis.visible = options.visible !== false;
+ axis.zoomEnabled = options.zoomEnabled !== false;
+
+ // Initial categories
+ axis.categories = options.categories || type === 'category';
+ axis.names = axis.names || []; // Preserve on update (#3830)
+
+ // Elements
+ //axis.axisGroup = UNDEFINED;
+ //axis.gridGroup = UNDEFINED;
+ //axis.axisTitle = UNDEFINED;
+ //axis.axisLine = UNDEFINED;
+
+ // Shorthand types
+ axis.isLog = type === 'logarithmic';
+ axis.isDatetimeAxis = isDatetimeAxis;
+
+ // Flag, if axis is linked to another axis
+ axis.isLinked = defined(options.linkedTo);
+ // Linked axis.
+ //axis.linkedParent = UNDEFINED;
+
+ // Tick positions
+ //axis.tickPositions = UNDEFINED; // array containing predefined positions
+ // Tick intervals
+ //axis.tickInterval = UNDEFINED;
+ //axis.minorTickInterval = UNDEFINED;
+
+
+ // Major ticks
+ axis.ticks = {};
+ axis.labelEdge = [];
+ // Minor ticks
+ axis.minorTicks = {};
+
+ // List of plotLines/Bands
+ axis.plotLinesAndBands = [];
+
+ // Alternate bands
+ axis.alternateBands = {};
+
+ // Axis metrics
+ //axis.left = UNDEFINED;
+ //axis.top = UNDEFINED;
+ //axis.width = UNDEFINED;
+ //axis.height = UNDEFINED;
+ //axis.bottom = UNDEFINED;
+ //axis.right = UNDEFINED;
+ //axis.transA = UNDEFINED;
+ //axis.transB = UNDEFINED;
+ //axis.oldTransA = UNDEFINED;
+ axis.len = 0;
+ //axis.oldMin = UNDEFINED;
+ //axis.oldMax = UNDEFINED;
+ //axis.oldUserMin = UNDEFINED;
+ //axis.oldUserMax = UNDEFINED;
+ //axis.oldAxisLength = UNDEFINED;
+ axis.minRange = axis.userMinRange = options.minRange || options.maxZoom;
+ axis.range = options.range;
+ axis.offset = options.offset || 0;
+
+
+ // Dictionary for stacks
+ axis.stacks = {};
+ axis.oldStacks = {};
+ axis.stacksTouched = 0;
+
+ // Min and max in the data
+ //axis.dataMin = UNDEFINED,
+ //axis.dataMax = UNDEFINED,
+
+ // The axis range
+ axis.max = null;
+ axis.min = null;
+
+ // User set min and max
+ //axis.userMin = UNDEFINED,
+ //axis.userMax = UNDEFINED,
+
+ // Crosshair options
+ axis.crosshair = pick(options.crosshair, splat(chart.options.tooltip.crosshairs)[isXAxis ? 0 : 1], false);
+ // Run Axis
+
+ var eventType,
+ events = axis.options.events;
+
+ // Register
+ if (inArray(axis, chart.axes) === -1) { // don't add it again on Axis.update()
+ if (isXAxis && !this.isColorAxis) { // #2713
+ chart.axes.splice(chart.xAxis.length, 0, axis);
+ } else {
+ chart.axes.push(axis);
+ }
+
+ chart[axis.coll].push(axis);
+ }
+
+ axis.series = axis.series || []; // populated by Series
+
+ // inverted charts have reversed xAxes as default
+ if (chart.inverted && isXAxis && axis.reversed === UNDEFINED) {
+ axis.reversed = true;
+ }
+
+ axis.removePlotBand = axis.removePlotBandOrLine;
+ axis.removePlotLine = axis.removePlotBandOrLine;
+
+
+ // register event listeners
+ for (eventType in events) {
+ addEvent(axis, eventType, events[eventType]);
+ }
+
+ // extend logarithmic axis
+ if (axis.isLog) {
+ axis.val2lin = axis.log2lin;
+ axis.lin2val = axis.lin2log;
+ }
+ },
+
+ /**
+ * Merge and set options
+ */
+ setOptions: function (userOptions) {
+ this.options = merge(
+ this.defaultOptions,
+ this.isXAxis ? {} : this.defaultYAxisOptions,
+ [this.defaultTopAxisOptions, this.defaultRightAxisOptions,
+ this.defaultBottomAxisOptions, this.defaultLeftAxisOptions][this.side],
+ merge(
+ defaultOptions[this.coll], // if set in setOptions (#1053)
+ userOptions
+ )
+ );
+ },
+
+ /**
+ * The default label formatter. The context is a special config object for the label.
+ */
+ defaultLabelFormatter: function () {
+ var axis = this.axis,
+ value = this.value,
+ categories = axis.categories,
+ dateTimeLabelFormat = this.dateTimeLabelFormat,
+ numericSymbols = defaultOptions.lang.numericSymbols,
+ i = numericSymbols && numericSymbols.length,
+ multi,
+ ret,
+ formatOption = axis.options.labels.format,
+
+ // make sure the same symbol is added for all labels on a linear axis
+ numericSymbolDetector = axis.isLog ? value : axis.tickInterval;
+
+ if (formatOption) {
+ ret = format(formatOption, this);
+
+ } else if (categories) {
+ ret = value;
+
+ } else if (dateTimeLabelFormat) { // datetime axis
+ ret = dateFormat(dateTimeLabelFormat, value);
+
+ } else if (i && numericSymbolDetector >= 1000) {
+ // Decide whether we should add a numeric symbol like k (thousands) or M (millions).
+ // If we are to enable this in tooltip or other places as well, we can move this
+ // logic to the numberFormatter and enable it by a parameter.
+ while (i-- && ret === UNDEFINED) {
+ multi = Math.pow(1000, i + 1);
+ if (numericSymbolDetector >= multi && (value * 10) % multi === 0 && numericSymbols[i] !== null && value !== 0) { // #5480
+ ret = Highcharts.numberFormat(value / multi, -1) + numericSymbols[i];
+ }
+ }
+ }
+
+ if (ret === UNDEFINED) {
+ if (mathAbs(value) >= 10000) { // add thousands separators
+ ret = Highcharts.numberFormat(value, -1);
+
+ } else { // small numbers
+ ret = Highcharts.numberFormat(value, -1, UNDEFINED, ''); // #2466
+ }
+ }
+
+ return ret;
+ },
+
+ /**
+ * Get the minimum and maximum for the series of each axis
+ */
+ getSeriesExtremes: function () {
+ var axis = this,
+ chart = axis.chart;
+
+ axis.hasVisibleSeries = false;
+
+ // Reset properties in case we're redrawing (#3353)
+ axis.dataMin = axis.dataMax = axis.threshold = null;
+ axis.softThreshold = !axis.isXAxis;
+
+ if (axis.buildStacks) {
+ axis.buildStacks();
+ }
+
+ // loop through this axis' series
+ each(axis.series, function (series) {
+
+ if (series.visible || !chart.options.chart.ignoreHiddenSeries) {
+
+ var seriesOptions = series.options,
+ xData,
+ threshold = seriesOptions.threshold,
+ seriesDataMin,
+ seriesDataMax;
+
+ axis.hasVisibleSeries = true;
+
+ // Validate threshold in logarithmic axes
+ if (axis.isLog && threshold <= 0) {
+ threshold = null;
+ }
+
+ // Get dataMin and dataMax for X axes
+ if (axis.isXAxis) {
+ xData = series.xData;
+ if (xData.length) {
+ // If xData contains values which is not numbers, then filter them out.
+ // To prevent performance hit, we only do this after we have already
+ // found seriesDataMin because in most cases all data is valid. #5234.
+ seriesDataMin = arrayMin(xData);
+ if (!isNumber(seriesDataMin) && !(seriesDataMin instanceof Date)) { // Date for #5010
+ xData = grep(xData, function (x) {
+ return isNumber(x);
+ });
+ seriesDataMin = arrayMin(xData); // Do it again with valid data
+ }
+
+ axis.dataMin = mathMin(pick(axis.dataMin, xData[0]), seriesDataMin);
+ axis.dataMax = mathMax(pick(axis.dataMax, xData[0]), arrayMax(xData));
+
+ }
+
+ // Get dataMin and dataMax for Y axes, as well as handle stacking and processed data
+ } else {
+
+ // Get this particular series extremes
+ series.getExtremes();
+ seriesDataMax = series.dataMax;
+ seriesDataMin = series.dataMin;
+
+ // Get the dataMin and dataMax so far. If percentage is used, the min and max are
+ // always 0 and 100. If seriesDataMin and seriesDataMax is null, then series
+ // doesn't have active y data, we continue with nulls
+ if (defined(seriesDataMin) && defined(seriesDataMax)) {
+ axis.dataMin = mathMin(pick(axis.dataMin, seriesDataMin), seriesDataMin);
+ axis.dataMax = mathMax(pick(axis.dataMax, seriesDataMax), seriesDataMax);
+ }
+
+ // Adjust to threshold
+ if (defined(threshold)) {
+ axis.threshold = threshold;
+ }
+ // If any series has a hard threshold, it takes precedence
+ if (!seriesOptions.softThreshold || axis.isLog) {
+ axis.softThreshold = false;
+ }
+ }
+ }
+ });
+ },
+
+ /**
+ * Translate from axis value to pixel position on the chart, or back
+ *
+ */
+ translate: function (val, backwards, cvsCoord, old, handleLog, pointPlacement) {
+ var axis = this.linkedParent || this, // #1417
+ sign = 1,
+ cvsOffset = 0,
+ localA = old ? axis.oldTransA : axis.transA,
+ localMin = old ? axis.oldMin : axis.min,
+ returnValue,
+ minPixelPadding = axis.minPixelPadding,
+ doPostTranslate = (axis.isOrdinal || axis.isBroken || (axis.isLog && handleLog)) && axis.lin2val;
+
+ if (!localA) {
+ localA = axis.transA;
+ }
+
+ // In vertical axes, the canvas coordinates start from 0 at the top like in
+ // SVG.
+ if (cvsCoord) {
+ sign *= -1; // canvas coordinates inverts the value
+ cvsOffset = axis.len;
+ }
+
+ // Handle reversed axis
+ if (axis.reversed) {
+ sign *= -1;
+ cvsOffset -= sign * (axis.sector || axis.len);
+ }
+
+ // From pixels to value
+ if (backwards) { // reverse translation
+
+ val = val * sign + cvsOffset;
+ val -= minPixelPadding;
+ returnValue = val / localA + localMin; // from chart pixel to value
+ if (doPostTranslate) { // log and ordinal axes
+ returnValue = axis.lin2val(returnValue);
+ }
+
+ // From value to pixels
+ } else {
+ if (doPostTranslate) { // log and ordinal axes
+ val = axis.val2lin(val);
+ }
+ if (pointPlacement === 'between') {
+ pointPlacement = 0.5;
+ }
+ returnValue = sign * (val - localMin) * localA + cvsOffset + (sign * minPixelPadding) +
+ (isNumber(pointPlacement) ? localA * pointPlacement * axis.pointRange : 0);
+ }
+
+ return returnValue;
+ },
+
+ /**
+ * Utility method to translate an axis value to pixel position.
+ * @param {Number} value A value in terms of axis units
+ * @param {Boolean} paneCoordinates Whether to return the pixel coordinate relative to the chart
+ * or just the axis/pane itself.
+ */
+ toPixels: function (value, paneCoordinates) {
+ return this.translate(value, false, !this.horiz, null, true) + (paneCoordinates ? 0 : this.pos);
+ },
+
+ /*
+ * Utility method to translate a pixel position in to an axis value
+ * @param {Number} pixel The pixel value coordinate
+ * @param {Boolean} paneCoordiantes Whether the input pixel is relative to the chart or just the
+ * axis/pane itself.
+ */
+ toValue: function (pixel, paneCoordinates) {
+ return this.translate(pixel - (paneCoordinates ? 0 : this.pos), true, !this.horiz, null, true);
+ },
+
+ /**
+ * Create the path for a plot line that goes from the given value on
+ * this axis, across the plot to the opposite side
+ * @param {Number} value
+ * @param {Number} lineWidth Used for calculation crisp line
+ * @param {Number] old Use old coordinates (for resizing and rescaling)
+ */
+ getPlotLinePath: function (value, lineWidth, old, force, translatedValue) {
+ var axis = this,
+ chart = axis.chart,
+ axisLeft = axis.left,
+ axisTop = axis.top,
+ x1,
+ y1,
+ x2,
+ y2,
+ cHeight = (old && chart.oldChartHeight) || chart.chartHeight,
+ cWidth = (old && chart.oldChartWidth) || chart.chartWidth,
+ skip,
+ transB = axis.transB,
+ /**
+ * Check if x is between a and b. If not, either move to a/b or skip,
+ * depending on the force parameter.
+ */
+ between = function (x, a, b) {
+ if (x < a || x > b) {
+ if (force) {
+ x = mathMin(mathMax(a, x), b);
+ } else {
+ skip = true;
+ }
+ }
+ return x;
+ };
+
+ translatedValue = pick(translatedValue, axis.translate(value, null, null, old));
+ x1 = x2 = mathRound(translatedValue + transB);
+ y1 = y2 = mathRound(cHeight - translatedValue - transB);
+ if (!isNumber(translatedValue)) { // no min or max
+ skip = true;
+
+ } else if (axis.horiz) {
+ y1 = axisTop;
+ y2 = cHeight - axis.bottom;
+ x1 = x2 = between(x1, axisLeft, axisLeft + axis.width);
+ } else {
+ x1 = axisLeft;
+ x2 = cWidth - axis.right;
+ y1 = y2 = between(y1, axisTop, axisTop + axis.height);
+ }
+ return skip && !force ?
+ null :
+ chart.renderer.crispLine([M, x1, y1, L, x2, y2], lineWidth || 1);
+ },
+
+ /**
+ * Set the tick positions of a linear axis to round values like whole tens or every five.
+ */
+ getLinearTickPositions: function (tickInterval, min, max) {
+ var pos,
+ lastPos,
+ roundedMin = correctFloat(mathFloor(min / tickInterval) * tickInterval),
+ roundedMax = correctFloat(mathCeil(max / tickInterval) * tickInterval),
+ tickPositions = [];
+
+ // For single points, add a tick regardless of the relative position (#2662)
+ if (min === max && isNumber(min)) {
+ return [min];
+ }
+
+ // Populate the intermediate values
+ pos = roundedMin;
+ while (pos <= roundedMax) {
+
+ // Place the tick on the rounded value
+ tickPositions.push(pos);
+
+ // Always add the raw tickInterval, not the corrected one.
+ pos = correctFloat(pos + tickInterval);
+
+ // If the interval is not big enough in the current min - max range to actually increase
+ // the loop variable, we need to break out to prevent endless loop. Issue #619
+ if (pos === lastPos) {
+ break;
+ }
+
+ // Record the last value
+ lastPos = pos;
+ }
+ return tickPositions;
+ },
+
+ /**
+ * Return the minor tick positions. For logarithmic axes, reuse the same logic
+ * as for major ticks.
+ */
+ getMinorTickPositions: function () {
+ var axis = this,
+ options = axis.options,
+ tickPositions = axis.tickPositions,
+ minorTickInterval = axis.minorTickInterval,
+ minorTickPositions = [],
+ pos,
+ i,
+ pointRangePadding = axis.pointRangePadding || 0,
+ min = axis.min - pointRangePadding, // #1498
+ max = axis.max + pointRangePadding, // #1498
+ range = max - min,
+ len;
+
+ // If minor ticks get too dense, they are hard to read, and may cause long running script. So we don't draw them.
+ if (range && range / minorTickInterval < axis.len / 3) { // #3875
+
+ if (axis.isLog) {
+ len = tickPositions.length;
+ for (i = 1; i < len; i++) {
+ minorTickPositions = minorTickPositions.concat(
+ axis.getLogTickPositions(minorTickInterval, tickPositions[i - 1], tickPositions[i], true)
+ );
+ }
+ } else if (axis.isDatetimeAxis && options.minorTickInterval === 'auto') { // #1314
+ minorTickPositions = minorTickPositions.concat(
+ axis.getTimeTicks(
+ axis.normalizeTimeTickInterval(minorTickInterval),
+ min,
+ max,
+ options.startOfWeek
+ )
+ );
+ } else {
+ for (pos = min + (tickPositions[0] - min) % minorTickInterval; pos <= max; pos += minorTickInterval) {
+ minorTickPositions.push(pos);
+ }
+ }
+ }
+
+ if (minorTickPositions.length !== 0) { // don't change the extremes, when there is no minor ticks
+ axis.trimTicks(minorTickPositions, options.startOnTick, options.endOnTick); // #3652 #3743 #1498
+ }
+ return minorTickPositions;
+ },
+
+ /**
+ * Adjust the min and max for the minimum range. Keep in mind that the series data is
+ * not yet processed, so we don't have information on data cropping and grouping, or
+ * updated axis.pointRange or series.pointRange. The data can't be processed until
+ * we have finally established min and max.
+ */
+ adjustForMinRange: function () {
+ var axis = this,
+ options = axis.options,
+ min = axis.min,
+ max = axis.max,
+ zoomOffset,
+ spaceAvailable = axis.dataMax - axis.dataMin >= axis.minRange,
+ closestDataRange,
+ i,
+ distance,
+ xData,
+ loopLength,
+ minArgs,
+ maxArgs,
+ minRange;
+
+ // Set the automatic minimum range based on the closest point distance
+ if (axis.isXAxis && axis.minRange === UNDEFINED && !axis.isLog) {
+
+ if (defined(options.min) || defined(options.max)) {
+ axis.minRange = null; // don't do this again
+
+ } else {
+
+ // Find the closest distance between raw data points, as opposed to
+ // closestPointRange that applies to processed points (cropped and grouped)
+ each(axis.series, function (series) {
+ xData = series.xData;
+ loopLength = series.xIncrement ? 1 : xData.length - 1;
+ for (i = loopLength; i > 0; i--) {
+ distance = xData[i] - xData[i - 1];
+ if (closestDataRange === UNDEFINED || distance < closestDataRange) {
+ closestDataRange = distance;
+ }
+ }
+ });
+ axis.minRange = mathMin(closestDataRange * 5, axis.dataMax - axis.dataMin);
+ }
+ }
+
+ // if minRange is exceeded, adjust
+ if (max - min < axis.minRange) {
+ minRange = axis.minRange;
+ zoomOffset = (minRange - max + min) / 2;
+
+ // if min and max options have been set, don't go beyond it
+ minArgs = [min - zoomOffset, pick(options.min, min - zoomOffset)];
+ if (spaceAvailable) { // if space is available, stay within the data range
+ minArgs[2] = axis.dataMin;
+ }
+ min = arrayMax(minArgs);
+
+ maxArgs = [min + minRange, pick(options.max, min + minRange)];
+ if (spaceAvailable) { // if space is availabe, stay within the data range
+ maxArgs[2] = axis.dataMax;
+ }
+
+ max = arrayMin(maxArgs);
+
+ // now if the max is adjusted, adjust the min back
+ if (max - min < minRange) {
+ minArgs[0] = max - minRange;
+ minArgs[1] = pick(options.min, max - minRange);
+ min = arrayMax(minArgs);
+ }
+ }
+
+ // Record modified extremes
+ axis.min = min;
+ axis.max = max;
+ },
+
+ /**
+ * Find the closestPointRange across all series
+ */
+ getClosest: function () {
+ var ret;
+
+ if (this.categories) {
+ ret = 1;
+ } else {
+ each(this.series, function (series) {
+ var seriesClosest = series.closestPointRange;
+ if (!series.noSharedTooltip && defined(seriesClosest)) {
+ ret = defined(ret) ?
+ mathMin(ret, seriesClosest) :
+ seriesClosest;
+ }
+ });
+ }
+ return ret;
+ },
+
+ /**
+ * Update translation information
+ */
+ setAxisTranslation: function (saveOld) {
+ var axis = this,
+ range = axis.max - axis.min,
+ pointRange = axis.axisPointRange || 0,
+ closestPointRange,
+ minPointOffset = 0,
+ pointRangePadding = 0,
+ linkedParent = axis.linkedParent,
+ ordinalCorrection,
+ hasCategories = !!axis.categories,
+ transA = axis.transA,
+ isXAxis = axis.isXAxis;
+
+ // Adjust translation for padding. Y axis with categories need to go through the same (#1784).
+ if (isXAxis || hasCategories || pointRange) {
+ if (linkedParent) {
+ minPointOffset = linkedParent.minPointOffset;
+ pointRangePadding = linkedParent.pointRangePadding;
+
+ } else {
+
+ // Get the closest points
+ closestPointRange = axis.getClosest();
+
+ each(axis.series, function (series) {
+ var seriesPointRange = hasCategories ?
+ 1 :
+ (isXAxis ?
+ pick(series.options.pointRange, closestPointRange, 0) :
+ (axis.axisPointRange || 0)), // #2806
+ pointPlacement = series.options.pointPlacement;
+
+ pointRange = mathMax(pointRange, seriesPointRange);
+
+ if (!axis.single) {
+ // minPointOffset is the value padding to the left of the axis in order to make
+ // room for points with a pointRange, typically columns. When the pointPlacement option
+ // is 'between' or 'on', this padding does not apply.
+ minPointOffset = mathMax(
+ minPointOffset,
+ isString(pointPlacement) ? 0 : seriesPointRange / 2
+ );
+
+ // Determine the total padding needed to the length of the axis to make room for the
+ // pointRange. If the series' pointPlacement is 'on', no padding is added.
+ pointRangePadding = mathMax(
+ pointRangePadding,
+ pointPlacement === 'on' ? 0 : seriesPointRange
+ );
+ }
+ });
+ }
+
+ // Record minPointOffset and pointRangePadding
+ ordinalCorrection = axis.ordinalSlope && closestPointRange ? axis.ordinalSlope / closestPointRange : 1; // #988, #1853
+ axis.minPointOffset = minPointOffset = minPointOffset * ordinalCorrection;
+ axis.pointRangePadding = pointRangePadding = pointRangePadding * ordinalCorrection;
+
+ // pointRange means the width reserved for each point, like in a column chart
+ axis.pointRange = mathMin(pointRange, range);
+
+ // closestPointRange means the closest distance between points. In columns
+ // it is mostly equal to pointRange, but in lines pointRange is 0 while closestPointRange
+ // is some other value
+ if (isXAxis) {
+ axis.closestPointRange = closestPointRange;
+ }
+ }
+
+ // Secondary values
+ if (saveOld) {
+ axis.oldTransA = transA;
+ }
+ axis.translationSlope = axis.transA = transA = axis.len / ((range + pointRangePadding) || 1);
+ axis.transB = axis.horiz ? axis.left : axis.bottom; // translation addend
+ axis.minPixelPadding = transA * minPointOffset;
+ },
+
+ minFromRange: function () {
+ return this.max - this.range;
+ },
+
+ /**
+ * Set the tick positions to round values and optionally extend the extremes
+ * to the nearest tick
+ */
+ setTickInterval: function (secondPass) {
+ var axis = this,
+ chart = axis.chart,
+ options = axis.options,
+ isLog = axis.isLog,
+ log2lin = axis.log2lin,
+ isDatetimeAxis = axis.isDatetimeAxis,
+ isXAxis = axis.isXAxis,
+ isLinked = axis.isLinked,
+ maxPadding = options.maxPadding,
+ minPadding = options.minPadding,
+ length,
+ linkedParentExtremes,
+ tickIntervalOption = options.tickInterval,
+ minTickInterval,
+ tickPixelIntervalOption = options.tickPixelInterval,
+ categories = axis.categories,
+ threshold = axis.threshold,
+ softThreshold = axis.softThreshold,
+ thresholdMin,
+ thresholdMax,
+ hardMin,
+ hardMax;
+
+ if (!isDatetimeAxis && !categories && !isLinked) {
+ this.getTickAmount();
+ }
+
+ // Min or max set either by zooming/setExtremes or initial options
+ hardMin = pick(axis.userMin, options.min);
+ hardMax = pick(axis.userMax, options.max);
+
+ // Linked axis gets the extremes from the parent axis
+ if (isLinked) {
+ axis.linkedParent = chart[axis.coll][options.linkedTo];
+ linkedParentExtremes = axis.linkedParent.getExtremes();
+ axis.min = pick(linkedParentExtremes.min, linkedParentExtremes.dataMin);
+ axis.max = pick(linkedParentExtremes.max, linkedParentExtremes.dataMax);
+ if (options.type !== axis.linkedParent.options.type) {
+ error(11, 1); // Can't link axes of different type
+ }
+
+ // Initial min and max from the extreme data values
+ } else {
+
+ // Adjust to hard threshold
+ if (!softThreshold && defined(threshold)) {
+ if (axis.dataMin >= threshold) {
+ thresholdMin = threshold;
+ minPadding = 0;
+ } else if (axis.dataMax <= threshold) {
+ thresholdMax = threshold;
+ maxPadding = 0;
+ }
+ }
+
+ axis.min = pick(hardMin, thresholdMin, axis.dataMin);
+ axis.max = pick(hardMax, thresholdMax, axis.dataMax);
+
+ }
+
+ if (isLog) {
+ if (!secondPass && mathMin(axis.min, pick(axis.dataMin, axis.min)) <= 0) { // #978
+ error(10, 1); // Can't plot negative values on log axis
+ }
+ // The correctFloat cures #934, float errors on full tens. But it
+ // was too aggressive for #4360 because of conversion back to lin,
+ // therefore use precision 15.
+ axis.min = correctFloat(log2lin(axis.min), 15);
+ axis.max = correctFloat(log2lin(axis.max), 15);
+ }
+
+ // handle zoomed range
+ if (axis.range && defined(axis.max)) {
+ axis.userMin = axis.min = hardMin = mathMax(axis.min, axis.minFromRange()); // #618
+ axis.userMax = hardMax = axis.max;
+
+ axis.range = null; // don't use it when running setExtremes
+ }
+
+ // Hook for Highstock Scroller. Consider combining with beforePadding.
+ fireEvent(axis, 'foundExtremes');
+
+ // Hook for adjusting this.min and this.max. Used by bubble series.
+ if (axis.beforePadding) {
+ axis.beforePadding();
+ }
+
+ // adjust min and max for the minimum range
+ axis.adjustForMinRange();
+
+ // Pad the values to get clear of the chart's edges. To avoid tickInterval taking the padding
+ // into account, we do this after computing tick interval (#1337).
+ if (!categories && !axis.axisPointRange && !axis.usePercentage && !isLinked && defined(axis.min) && defined(axis.max)) {
+ length = axis.max - axis.min;
+ if (length) {
+ if (!defined(hardMin) && minPadding) {
+ axis.min -= length * minPadding;
+ }
+ if (!defined(hardMax) && maxPadding) {
+ axis.max += length * maxPadding;
+ }
+ }
+ }
+
+ // Stay within floor and ceiling
+ if (isNumber(options.floor)) {
+ axis.min = mathMax(axis.min, options.floor);
+ }
+ if (isNumber(options.ceiling)) {
+ axis.max = mathMin(axis.max, options.ceiling);
+ }
+
+ // When the threshold is soft, adjust the extreme value only if
+ // the data extreme and the padded extreme land on either side of the threshold. For example,
+ // a series of [0, 1, 2, 3] would make the yAxis add a tick for -1 because of the
+ // default minPadding and startOnTick options. This is prevented by the softThreshold
+ // option.
+ if (softThreshold && defined(axis.dataMin)) {
+ threshold = threshold || 0;
+ if (!defined(hardMin) && axis.min < threshold && axis.dataMin >= threshold) {
+ axis.min = threshold;
+ } else if (!defined(hardMax) && axis.max > threshold && axis.dataMax <= threshold) {
+ axis.max = threshold;
+ }
+ }
+
+
+ // get tickInterval
+ if (axis.min === axis.max || axis.min === undefined || axis.max === undefined) {
+ axis.tickInterval = 1;
+ } else if (isLinked && !tickIntervalOption &&
+ tickPixelIntervalOption === axis.linkedParent.options.tickPixelInterval) {
+ axis.tickInterval = tickIntervalOption = axis.linkedParent.tickInterval;
+ } else {
+ axis.tickInterval = pick(
+ tickIntervalOption,
+ this.tickAmount ? ((axis.max - axis.min) / mathMax(this.tickAmount - 1, 1)) : undefined,
+ categories ? // for categoried axis, 1 is default, for linear axis use tickPix
+ 1 :
+ // don't let it be more than the data range
+ (axis.max - axis.min) * tickPixelIntervalOption / mathMax(axis.len, tickPixelIntervalOption)
+ );
+ }
+
+ // Now we're finished detecting min and max, crop and group series data. This
+ // is in turn needed in order to find tick positions in ordinal axes.
+ if (isXAxis && !secondPass) {
+ each(axis.series, function (series) {
+ series.processData(axis.min !== axis.oldMin || axis.max !== axis.oldMax);
+ });
+ }
+
+ // set the translation factor used in translate function
+ axis.setAxisTranslation(true);
+
+ // hook for ordinal axes and radial axes
+ if (axis.beforeSetTickPositions) {
+ axis.beforeSetTickPositions();
+ }
+
+ // hook for extensions, used in Highstock ordinal axes
+ if (axis.postProcessTickInterval) {
+ axis.tickInterval = axis.postProcessTickInterval(axis.tickInterval);
+ }
+
+ // In column-like charts, don't cramp in more ticks than there are points (#1943, #4184)
+ if (axis.pointRange && !tickIntervalOption) {
+ axis.tickInterval = mathMax(axis.pointRange, axis.tickInterval);
+ }
+
+ // Before normalizing the tick interval, handle minimum tick interval. This applies only if tickInterval is not defined.
+ minTickInterval = pick(options.minTickInterval, axis.isDatetimeAxis && axis.closestPointRange);
+ if (!tickIntervalOption && axis.tickInterval < minTickInterval) {
+ axis.tickInterval = minTickInterval;
+ }
+
+ // for linear axes, get magnitude and normalize the interval
+ if (!isDatetimeAxis && !isLog && !tickIntervalOption) {
+ axis.tickInterval = normalizeTickInterval(
+ axis.tickInterval,
+ null,
+ getMagnitude(axis.tickInterval),
+ // If the tick interval is between 0.5 and 5 and the axis max is in the order of
+ // thousands, chances are we are dealing with years. Don't allow decimals. #3363.
+ pick(options.allowDecimals, !(axis.tickInterval > 0.5 && axis.tickInterval < 5 && axis.max > 1000 && axis.max < 9999)),
+ !!this.tickAmount
+ );
+ }
+
+ // Prevent ticks from getting so close that we can't draw the labels
+ if (!this.tickAmount && this.len) { // Color axis with disabled legend has no length
+ axis.tickInterval = axis.unsquish();
+ }
+
+ this.setTickPositions();
+ },
+
+ /**
+ * Now we have computed the normalized tickInterval, get the tick positions
+ */
+ setTickPositions: function () {
+
+ var options = this.options,
+ tickPositions,
+ tickPositionsOption = options.tickPositions,
+ tickPositioner = options.tickPositioner,
+ startOnTick = options.startOnTick,
+ endOnTick = options.endOnTick,
+ single;
+
+ // Set the tickmarkOffset
+ this.tickmarkOffset = (this.categories && options.tickmarkPlacement === 'between' &&
+ this.tickInterval === 1) ? 0.5 : 0; // #3202
+
+
+ // get minorTickInterval
+ this.minorTickInterval = options.minorTickInterval === 'auto' && this.tickInterval ?
+ this.tickInterval / 5 : options.minorTickInterval;
+
+ // Find the tick positions
+ this.tickPositions = tickPositions = tickPositionsOption && tickPositionsOption.slice(); // Work on a copy (#1565)
+ if (!tickPositions) {
+
+ if (this.isDatetimeAxis) {
+ tickPositions = this.getTimeTicks(
+ this.normalizeTimeTickInterval(this.tickInterval, options.units),
+ this.min,
+ this.max,
+ options.startOfWeek,
+ this.ordinalPositions,
+ this.closestPointRange,
+ true
+ );
+ } else if (this.isLog) {
+ tickPositions = this.getLogTickPositions(this.tickInterval, this.min, this.max);
+ } else {
+ tickPositions = this.getLinearTickPositions(this.tickInterval, this.min, this.max);
+ }
+
+ // Too dense ticks, keep only the first and last (#4477)
+ if (tickPositions.length > this.len) {
+ tickPositions = [tickPositions[0], tickPositions.pop()];
+ }
+
+ this.tickPositions = tickPositions;
+
+ // Run the tick positioner callback, that allows modifying auto tick positions.
+ if (tickPositioner) {
+ tickPositioner = tickPositioner.apply(this, [this.min, this.max]);
+ if (tickPositioner) {
+ this.tickPositions = tickPositions = tickPositioner;
+ }
+ }
+
+ }
+
+ if (!this.isLinked) {
+
+ // reset min/max or remove extremes based on start/end on tick
+ this.trimTicks(tickPositions, startOnTick, endOnTick);
+
+ // When there is only one point, or all points have the same value on this axis, then min
+ // and max are equal and tickPositions.length is 0 or 1. In this case, add some padding
+ // in order to center the point, but leave it with one tick. #1337.
+ if (this.min === this.max && defined(this.min) && !this.tickAmount) {
+ // Substract half a unit (#2619, #2846, #2515, #3390)
+ single = true;
+ this.min -= 0.5;
+ this.max += 0.5;
+ }
+ this.single = single;
+
+ if (!tickPositionsOption && !tickPositioner) {
+ this.adjustTickAmount();
+ }
+ }
+ },
+
+ /**
+ * Handle startOnTick and endOnTick by either adapting to padding min/max or rounded min/max
+ */
+ trimTicks: function (tickPositions, startOnTick, endOnTick) {
+ var roundedMin = tickPositions[0],
+ roundedMax = tickPositions[tickPositions.length - 1],
+ minPointOffset = this.minPointOffset || 0;
+
+ if (startOnTick) {
+ this.min = roundedMin;
+ } else {
+ while (this.min - minPointOffset > tickPositions[0]) {
+ tickPositions.shift();
+ }
+ }
+
+ if (endOnTick) {
+ this.max = roundedMax;
+ } else {
+ while (this.max + minPointOffset < tickPositions[tickPositions.length - 1]) {
+ tickPositions.pop();
+ }
+ }
+
+ // If no tick are left, set one tick in the middle (#3195)
+ if (tickPositions.length === 0 && defined(roundedMin)) {
+ tickPositions.push((roundedMax + roundedMin) / 2);
+ }
+ },
+
+ /**
+ * Check if there are multiple axes in the same pane
+ * @returns {Boolean} There are other axes
+ */
+ alignToOthers: function () {
+ var others = {}, // Whether there is another axis to pair with this one
+ hasOther,
+ options = this.options;
+
+ if (this.chart.options.chart.alignTicks !== false && options.alignTicks !== false) {
+ each(this.chart[this.coll], function (axis) {
+ var otherOptions = axis.options,
+ horiz = axis.horiz,
+ key = [
+ horiz ? otherOptions.left : otherOptions.top,
+ otherOptions.width,
+ otherOptions.height,
+ otherOptions.pane
+ ].join(',');
+
+
+ if (axis.series.length) { // #4442
+ if (others[key]) {
+ hasOther = true; // #4201
+ } else {
+ others[key] = 1;
+ }
+ }
+ });
+ }
+ return hasOther;
+ },
+
+ /**
+ * Set the max ticks of either the x and y axis collection
+ */
+ getTickAmount: function () {
+ var options = this.options,
+ tickAmount = options.tickAmount,
+ tickPixelInterval = options.tickPixelInterval;
+
+ if (!defined(options.tickInterval) && this.len < tickPixelInterval && !this.isRadial &&
+ !this.isLog && options.startOnTick && options.endOnTick) {
+ tickAmount = 2;
+ }
+
+ if (!tickAmount && this.alignToOthers()) {
+ // Add 1 because 4 tick intervals require 5 ticks (including first and last)
+ tickAmount = mathCeil(this.len / tickPixelInterval) + 1;
+ }
+
+ // For tick amounts of 2 and 3, compute five ticks and remove the intermediate ones. This
+ // prevents the axis from adding ticks that are too far away from the data extremes.
+ if (tickAmount < 4) {
+ this.finalTickAmt = tickAmount;
+ tickAmount = 5;
+ }
+
+ this.tickAmount = tickAmount;
+ },
+
+ /**
+ * When using multiple axes, adjust the number of ticks to match the highest
+ * number of ticks in that group
+ */
+ adjustTickAmount: function () {
+ var tickInterval = this.tickInterval,
+ tickPositions = this.tickPositions,
+ tickAmount = this.tickAmount,
+ finalTickAmt = this.finalTickAmt,
+ currentTickAmount = tickPositions && tickPositions.length,
+ i,
+ len;
+
+ if (currentTickAmount < tickAmount) {
+ while (tickPositions.length < tickAmount) {
+ tickPositions.push(correctFloat(
+ tickPositions[tickPositions.length - 1] + tickInterval
+ ));
+ }
+ this.transA *= (currentTickAmount - 1) / (tickAmount - 1);
+ this.max = tickPositions[tickPositions.length - 1];
+
+ // We have too many ticks, run second pass to try to reduce ticks
+ } else if (currentTickAmount > tickAmount) {
+ this.tickInterval *= 2;
+ this.setTickPositions();
+ }
+
+ // The finalTickAmt property is set in getTickAmount
+ if (defined(finalTickAmt)) {
+ i = len = tickPositions.length;
+ while (i--) {
+ if (
+ (finalTickAmt === 3 && i % 2 === 1) || // Remove every other tick
+ (finalTickAmt <= 2 && i > 0 && i < len - 1) // Remove all but first and last
+ ) {
+ tickPositions.splice(i, 1);
+ }
+ }
+ this.finalTickAmt = UNDEFINED;
+ }
+ },
+
+ /**
+ * Set the scale based on data min and max, user set min and max or options
+ *
+ */
+ setScale: function () {
+ var axis = this,
+ isDirtyData,
+ isDirtyAxisLength;
+
+ axis.oldMin = axis.min;
+ axis.oldMax = axis.max;
+ axis.oldAxisLength = axis.len;
+
+ // set the new axisLength
+ axis.setAxisSize();
+ //axisLength = horiz ? axisWidth : axisHeight;
+ isDirtyAxisLength = axis.len !== axis.oldAxisLength;
+
+ // is there new data?
+ each(axis.series, function (series) {
+ if (series.isDirtyData || series.isDirty ||
+ series.xAxis.isDirty) { // when x axis is dirty, we need new data extremes for y as well
+ isDirtyData = true;
+ }
+ });
+
+ // do we really need to go through all this?
+ if (isDirtyAxisLength || isDirtyData || axis.isLinked || axis.forceRedraw ||
+ axis.userMin !== axis.oldUserMin || axis.userMax !== axis.oldUserMax || axis.alignToOthers()) {
+
+ if (axis.resetStacks) {
+ axis.resetStacks();
+ }
+
+ axis.forceRedraw = false;
+
+ // get data extremes if needed
+ axis.getSeriesExtremes();
+
+ // get fixed positions based on tickInterval
+ axis.setTickInterval();
+
+ // record old values to decide whether a rescale is necessary later on (#540)
+ axis.oldUserMin = axis.userMin;
+ axis.oldUserMax = axis.userMax;
+
+ // Mark as dirty if it is not already set to dirty and extremes have changed. #595.
+ if (!axis.isDirty) {
+ axis.isDirty = isDirtyAxisLength || axis.min !== axis.oldMin || axis.max !== axis.oldMax;
+ }
+ } else if (axis.cleanStacks) {
+ axis.cleanStacks();
+ }
+ },
+
+ /**
+ * Set the extremes and optionally redraw
+ * @param {Number} newMin
+ * @param {Number} newMax
+ * @param {Boolean} redraw
+ * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+ * configuration
+ * @param {Object} eventArguments
+ *
+ */
+ setExtremes: function (newMin, newMax, redraw, animation, eventArguments) {
+ var axis = this,
+ chart = axis.chart;
+
+ redraw = pick(redraw, true); // defaults to true
+
+ each(axis.series, function (serie) {
+ delete serie.kdTree;
+ });
+
+ // Extend the arguments with min and max
+ eventArguments = extend(eventArguments, {
+ min: newMin,
+ max: newMax
+ });
+
+ // Fire the event
+ fireEvent(axis, 'setExtremes', eventArguments, function () { // the default event handler
+
+ axis.userMin = newMin;
+ axis.userMax = newMax;
+ axis.eventArgs = eventArguments;
+
+ if (redraw) {
+ chart.redraw(animation);
+ }
+ });
+ },
+
+ /**
+ * Overridable method for zooming chart. Pulled out in a separate method to allow overriding
+ * in stock charts.
+ */
+ zoom: function (newMin, newMax) {
+ var dataMin = this.dataMin,
+ dataMax = this.dataMax,
+ options = this.options,
+ min = mathMin(dataMin, pick(options.min, dataMin)),
+ max = mathMax(dataMax, pick(options.max, dataMax));
+
+ // Prevent pinch zooming out of range. Check for defined is for #1946. #1734.
+ if (!this.allowZoomOutside) {
+ if (defined(dataMin) && newMin <= min) {
+ newMin = min;
+ }
+ if (defined(dataMax) && newMax >= max) {
+ newMax = max;
+ }
+ }
+
+ // In full view, displaying the reset zoom button is not required
+ this.displayBtn = newMin !== UNDEFINED || newMax !== UNDEFINED;
+
+ // Do it
+ this.setExtremes(
+ newMin,
+ newMax,
+ false,
+ UNDEFINED,
+ { trigger: 'zoom' }
+ );
+ return true;
+ },
+
+ /**
+ * Update the axis metrics
+ */
+ setAxisSize: function () {
+ var chart = this.chart,
+ options = this.options,
+ offsetLeft = options.offsetLeft || 0,
+ offsetRight = options.offsetRight || 0,
+ horiz = this.horiz,
+ width = pick(options.width, chart.plotWidth - offsetLeft + offsetRight),
+ height = pick(options.height, chart.plotHeight),
+ top = pick(options.top, chart.plotTop),
+ left = pick(options.left, chart.plotLeft + offsetLeft),
+ percentRegex = /%$/;
+
+ // Check for percentage based input values. Rounding fixes problems with
+ // column overflow and plot line filtering (#4898, #4899)
+ if (percentRegex.test(height)) {
+ height = Math.round(parseFloat(height) / 100 * chart.plotHeight);
+ }
+ if (percentRegex.test(top)) {
+ top = Math.round(parseFloat(top) / 100 * chart.plotHeight + chart.plotTop);
+ }
+
+ // Expose basic values to use in Series object and navigator
+ this.left = left;
+ this.top = top;
+ this.width = width;
+ this.height = height;
+ this.bottom = chart.chartHeight - height - top;
+ this.right = chart.chartWidth - width - left;
+
+ // Direction agnostic properties
+ this.len = mathMax(horiz ? width : height, 0); // mathMax fixes #905
+ this.pos = horiz ? left : top; // distance from SVG origin
+ },
+
+ /**
+ * Get the actual axis extremes
+ */
+ getExtremes: function () {
+ var axis = this,
+ isLog = axis.isLog,
+ lin2log = axis.lin2log;
+
+ return {
+ min: isLog ? correctFloat(lin2log(axis.min)) : axis.min,
+ max: isLog ? correctFloat(lin2log(axis.max)) : axis.max,
+ dataMin: axis.dataMin,
+ dataMax: axis.dataMax,
+ userMin: axis.userMin,
+ userMax: axis.userMax
+ };
+ },
+
+ /**
+ * Get the zero plane either based on zero or on the min or max value.
+ * Used in bar and area plots
+ */
+ getThreshold: function (threshold) {
+ var axis = this,
+ isLog = axis.isLog,
+ lin2log = axis.lin2log,
+ realMin = isLog ? lin2log(axis.min) : axis.min,
+ realMax = isLog ? lin2log(axis.max) : axis.max;
+
+ if (threshold === null) {
+ threshold = realMin;
+ } else if (realMin > threshold) {
+ threshold = realMin;
+ } else if (realMax < threshold) {
+ threshold = realMax;
+ }
+
+ return axis.translate(threshold, 0, 1, 0, 1);
+ },
+
+ /**
+ * Compute auto alignment for the axis label based on which side the axis is on
+ * and the given rotation for the label
+ */
+ autoLabelAlign: function (rotation) {
+ var ret,
+ angle = (pick(rotation, 0) - (this.side * 90) + 720) % 360;
+
+ if (angle > 15 && angle < 165) {
+ ret = 'right';
+ } else if (angle > 195 && angle < 345) {
+ ret = 'left';
+ } else {
+ ret = 'center';
+ }
+ return ret;
+ },
+
+ /**
+ * Get the tick length and width for the axis.
+ * @param {String} prefix 'tick' or 'minorTick'
+ * @returns {Array} An array of tickLength and tickWidth
+ */
+ tickSize: function (prefix) {
+ var options = this.options,
+ tickLength = options[prefix + 'Length'],
+ tickWidth = pick(options[prefix + 'Width'], prefix === 'tick' && this.isXAxis ? 1 : 0); // X axis defaults to 1
+
+ if (tickWidth && tickLength) {
+ // Negate the length
+ if (options[prefix + 'Position'] === 'inside') {
+ tickLength = -tickLength;
+ }
+ return [tickLength, tickWidth];
+ }
+
+ },
+
+ /**
+ * Return the size of the labels
+ */
+ labelMetrics: function () {
+ return this.chart.renderer.fontMetrics(
+ this.options.labels.style.fontSize,
+ this.ticks[0] && this.ticks[0].label
+ );
+ },
+
+ /**
+ * Prevent the ticks from getting so close we can't draw the labels. On a horizontal
+ * axis, this is handled by rotating the labels, removing ticks and adding ellipsis.
+ * On a vertical axis remove ticks and add ellipsis.
+ */
+ unsquish: function () {
+ var labelOptions = this.options.labels,
+ horiz = this.horiz,
+ tickInterval = this.tickInterval,
+ newTickInterval = tickInterval,
+ slotSize = this.len / (((this.categories ? 1 : 0) + this.max - this.min) / tickInterval),
+ rotation,
+ rotationOption = labelOptions.rotation,
+ labelMetrics = this.labelMetrics(),
+ step,
+ bestScore = Number.MAX_VALUE,
+ autoRotation,
+ // Return the multiple of tickInterval that is needed to avoid collision
+ getStep = function (spaceNeeded) {
+ var step = spaceNeeded / (slotSize || 1);
+ step = step > 1 ? mathCeil(step) : 1;
+ return step * tickInterval;
+ };
+
+ if (horiz) {
+ autoRotation = !labelOptions.staggerLines && !labelOptions.step && ( // #3971
+ defined(rotationOption) ?
+ [rotationOption] :
+ slotSize < pick(labelOptions.autoRotationLimit, 80) && labelOptions.autoRotation
+ );
+
+ if (autoRotation) {
+
+ // Loop over the given autoRotation options, and determine which gives the best score. The
+ // best score is that with the lowest number of steps and a rotation closest to horizontal.
+ each(autoRotation, function (rot) {
+ var score;
+
+ if (rot === rotationOption || (rot && rot >= -90 && rot <= 90)) { // #3891
+
+ step = getStep(mathAbs(labelMetrics.h / mathSin(deg2rad * rot)));
+
+ score = step + mathAbs(rot / 360);
+
+ if (score < bestScore) {
+ bestScore = score;
+ rotation = rot;
+ newTickInterval = step;
+ }
+ }
+ });
+ }
+
+ } else if (!labelOptions.step) { // #4411
+ newTickInterval = getStep(labelMetrics.h);
+ }
+
+ this.autoRotation = autoRotation;
+ this.labelRotation = pick(rotation, rotationOption);
+
+ return newTickInterval;
+ },
+
+ /**
+ * Get the general slot width for this axis. This may change between the pre-render (from Axis.getOffset)
+ * and the final tick rendering and placement (#5086).
+ */
+ getSlotWidth: function () {
+ var chart = this.chart,
+ horiz = this.horiz,
+ labelOptions = this.options.labels,
+ slotCount = Math.max(this.tickPositions.length - (this.categories ? 0 : 1), 1),
+ marginLeft = chart.margin[3];
+
+ return (horiz && (labelOptions.step || 0) < 2 && !labelOptions.rotation && // #4415
+ ((this.staggerLines || 1) * chart.plotWidth) / slotCount) ||
+ (!horiz && ((marginLeft && (marginLeft - chart.spacing[3])) || chart.chartWidth * 0.33)); // #1580, #1931
+
+ },
+
+ /**
+ * Render the axis labels and determine whether ellipsis or rotation need to be applied
+ */
+ renderUnsquish: function () {
+ var chart = this.chart,
+ renderer = chart.renderer,
+ tickPositions = this.tickPositions,
+ ticks = this.ticks,
+ labelOptions = this.options.labels,
+ horiz = this.horiz,
+ slotWidth = this.getSlotWidth(),
+ innerWidth = mathMax(1, mathRound(slotWidth - 2 * (labelOptions.padding || 5))),
+ attr = {},
+ labelMetrics = this.labelMetrics(),
+ textOverflowOption = labelOptions.style.textOverflow,
+ css,
+ labelLength = 0,
+ label,
+ i,
+ pos;
+
+ // Set rotation option unless it is "auto", like in gauges
+ if (!isString(labelOptions.rotation)) {
+ attr.rotation = labelOptions.rotation || 0; // #4443
+ }
+
+ // Handle auto rotation on horizontal axis
+ if (this.autoRotation) {
+
+ // Get the longest label length
+ each(tickPositions, function (tick) {
+ tick = ticks[tick];
+ if (tick && tick.labelLength > labelLength) {
+ labelLength = tick.labelLength;
+ }
+ });
+
+ // Apply rotation only if the label is too wide for the slot, and
+ // the label is wider than its height.
+ if (labelLength > innerWidth && labelLength > labelMetrics.h) {
+ attr.rotation = this.labelRotation;
+ } else {
+ this.labelRotation = 0;
+ }
+
+ // Handle word-wrap or ellipsis on vertical axis
+ } else if (slotWidth) {
+ // For word-wrap or ellipsis
+ css = { width: innerWidth + PX };
+
+ if (!textOverflowOption) {
+ css.textOverflow = 'clip';
+
+ // On vertical axis, only allow word wrap if there is room for more lines.
+ i = tickPositions.length;
+ while (!horiz && i--) {
+ pos = tickPositions[i];
+ label = ticks[pos].label;
+ if (label) {
+ // Reset ellipsis in order to get the correct bounding box (#4070)
+ if (label.styles.textOverflow === 'ellipsis') {
+ label.css({ textOverflow: 'clip' });
+
+ // Set the correct width in order to read the bounding box height (#4678, #5034)
+ } else if (ticks[pos].labelLength > slotWidth) {
+ label.css({ width: slotWidth + 'px' });
+ }
+
+ if (label.getBBox().height > this.len / tickPositions.length - (labelMetrics.h - labelMetrics.f)) {
+ label.specCss = { textOverflow: 'ellipsis' };
+ }
+ }
+ }
+ }
+ }
+
+
+ // Add ellipsis if the label length is significantly longer than ideal
+ if (attr.rotation) {
+ css = {
+ width: (labelLength > chart.chartHeight * 0.5 ? chart.chartHeight * 0.33 : chart.chartHeight) + PX
+ };
+ if (!textOverflowOption) {
+ css.textOverflow = 'ellipsis';
+ }
+ }
+
+ // Set the explicit or automatic label alignment
+ this.labelAlign = labelOptions.align || this.autoLabelAlign(this.labelRotation);
+ if (this.labelAlign) {
+ attr.align = this.labelAlign;
+ }
+
+ // Apply general and specific CSS
+ each(tickPositions, function (pos) {
+ var tick = ticks[pos],
+ label = tick && tick.label;
+ if (label) {
+ label.attr(attr); // This needs to go before the CSS in old IE (#4502)
+ if (css) {
+ label.css(merge(css, label.specCss));
+ }
+ delete label.specCss;
+ tick.rotation = attr.rotation;
+ }
+ });
+
+ // Note: Why is this not part of getLabelPosition?
+ this.tickRotCorr = renderer.rotCorr(labelMetrics.b, this.labelRotation || 0, this.side !== 0);
+ },
+
+ /**
+ * Return true if the axis has associated data
+ */
+ hasData: function () {
+ return this.hasVisibleSeries || (defined(this.min) && defined(this.max) && !!this.tickPositions);
+ },
+
+ /**
+ * Render the tick labels to a preliminary position to get their sizes
+ */
+ getOffset: function () {
+ var axis = this,
+ chart = axis.chart,
+ renderer = chart.renderer,
+ options = axis.options,
+ tickPositions = axis.tickPositions,
+ ticks = axis.ticks,
+ horiz = axis.horiz,
+ side = axis.side,
+ invertedSide = chart.inverted ? [1, 0, 3, 2][side] : side,
+ hasData,
+ showAxis,
+ titleOffset = 0,
+ titleOffsetOption,
+ titleMargin = 0,
+ axisTitleOptions = options.title,
+ labelOptions = options.labels,
+ labelOffset = 0, // reset
+ labelOffsetPadded,
+ opposite = axis.opposite,
+ axisOffset = chart.axisOffset,
+ clipOffset = chart.clipOffset,
+ clip,
+ directionFactor = [-1, 1, 1, -1][side],
+ n,
+ textAlign,
+ axisParent = axis.axisParent, // Used in color axis
+ lineHeightCorrection,
+ tickSize = this.tickSize('tick');
+
+ // For reuse in Axis.render
+ hasData = axis.hasData();
+ axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);
+
+ // Set/reset staggerLines
+ axis.staggerLines = axis.horiz && labelOptions.staggerLines;
+
+ // Create the axisGroup and gridGroup elements on first iteration
+ if (!axis.axisGroup) {
+ axis.gridGroup = renderer.g('grid')
+ .attr({ zIndex: options.gridZIndex || 1 })
+ .add(axisParent);
+ axis.axisGroup = renderer.g('axis')
+ .attr({ zIndex: options.zIndex || 2 })
+ .add(axisParent);
+ axis.labelGroup = renderer.g('axis-labels')
+ .attr({ zIndex: labelOptions.zIndex || 7 })
+ .addClass(PREFIX + axis.coll.toLowerCase() + '-labels')
+ .add(axisParent);
+ }
+
+ if (hasData || axis.isLinked) {
+
+ // Generate ticks
+ each(tickPositions, function (pos) {
+ if (!ticks[pos]) {
+ ticks[pos] = new Tick(axis, pos);
+ } else {
+ ticks[pos].addLabel(); // update labels depending on tick interval
+ }
+ });
+
+ axis.renderUnsquish();
+
+
+ // Left side must be align: right and right side must have align: left for labels
+ if (labelOptions.reserveSpace !== false && (side === 0 || side === 2 ||
+ { 1: 'left', 3: 'right' }[side] === axis.labelAlign || axis.labelAlign === 'center')) {
+ each(tickPositions, function (pos) {
+
+ // get the highest offset
+ labelOffset = mathMax(
+ ticks[pos].getLabelSize(),
+ labelOffset
+ );
+ });
+ }
+
+ if (axis.staggerLines) {
+ labelOffset *= axis.staggerLines;
+ axis.labelOffset = labelOffset * (axis.opposite ? -1 : 1);
+ }
+
+
+ } else { // doesn't have data
+ for (n in ticks) {
+ ticks[n].destroy();
+ delete ticks[n];
+ }
+ }
+
+ if (axisTitleOptions && axisTitleOptions.text && axisTitleOptions.enabled !== false) {
+ if (!axis.axisTitle) {
+ textAlign = axisTitleOptions.textAlign;
+ if (!textAlign) {
+ textAlign = (horiz ? {
+ low: 'left',
+ middle: 'center',
+ high: 'right'
+ } : {
+ low: opposite ? 'right' : 'left',
+ middle: 'center',
+ high: opposite ? 'left' : 'right'
+ })[axisTitleOptions.align];
+ }
+ axis.axisTitle = renderer.text(
+ axisTitleOptions.text,
+ 0,
+ 0,
+ axisTitleOptions.useHTML
+ )
+ .attr({
+ zIndex: 7,
+ rotation: axisTitleOptions.rotation || 0,
+ align: textAlign
+ })
+ .addClass(PREFIX + this.coll.toLowerCase() + '-title')
+ .css(axisTitleOptions.style)
+ .add(axis.axisGroup);
+ axis.axisTitle.isNew = true;
+ }
+
+ if (showAxis) {
+ titleOffset = axis.axisTitle.getBBox()[horiz ? 'height' : 'width'];
+ titleOffsetOption = axisTitleOptions.offset;
+ titleMargin = defined(titleOffsetOption) ? 0 : pick(axisTitleOptions.margin, horiz ? 5 : 10);
+ }
+
+ // hide or show the title depending on whether showEmpty is set
+ axis.axisTitle[showAxis ? 'show' : 'hide'](true);
+ }
+
+ // handle automatic or user set offset
+ axis.offset = directionFactor * pick(options.offset, axisOffset[side]);
+
+ axis.tickRotCorr = axis.tickRotCorr || { x: 0, y: 0 }; // polar
+ if (side === 0) {
+ lineHeightCorrection = -axis.labelMetrics().h;
+ } else if (side === 2) {
+ lineHeightCorrection = axis.tickRotCorr.y;
+ } else {
+ lineHeightCorrection = 0;
+ }
+
+ // Find the padded label offset
+ labelOffsetPadded = Math.abs(labelOffset) + titleMargin;
+ if (labelOffset) {
+ labelOffsetPadded -= lineHeightCorrection;
+ labelOffsetPadded += directionFactor * (horiz ? pick(labelOptions.y, axis.tickRotCorr.y + directionFactor * 8) : labelOptions.x);
+ }
+ axis.axisTitleMargin = pick(titleOffsetOption, labelOffsetPadded);
+
+ axisOffset[side] = mathMax(
+ axisOffset[side],
+ axis.axisTitleMargin + titleOffset + directionFactor * axis.offset,
+ labelOffsetPadded, // #3027
+ hasData && tickPositions.length && tickSize ? tickSize[0] : 0 // #4866
+ );
+
+ // Decide the clipping needed to keep the graph inside the plot area and axis lines
+ clip = options.offset ? 0 : mathFloor(options.lineWidth / 2) * 2; // #4308, #4371
+ clipOffset[invertedSide] = mathMax(clipOffset[invertedSide], clip);
+ },
+
+ /**
+ * Get the path for the axis line
+ */
+ getLinePath: function (lineWidth) {
+ var chart = this.chart,
+ opposite = this.opposite,
+ offset = this.offset,
+ horiz = this.horiz,
+ lineLeft = this.left + (opposite ? this.width : 0) + offset,
+ lineTop = chart.chartHeight - this.bottom - (opposite ? this.height : 0) + offset;
+
+ if (opposite) {
+ lineWidth *= -1; // crispify the other way - #1480, #1687
+ }
+
+ return chart.renderer
+ .crispLine([
+ M,
+ horiz ?
+ this.left :
+ lineLeft,
+ horiz ?
+ lineTop :
+ this.top,
+ L,
+ horiz ?
+ chart.chartWidth - this.right :
+ lineLeft,
+ horiz ?
+ lineTop :
+ chart.chartHeight - this.bottom
+ ], lineWidth);
+ },
+
+ /**
+ * Position the title
+ */
+ getTitlePosition: function () {
+ // compute anchor points for each of the title align options
+ var horiz = this.horiz,
+ axisLeft = this.left,
+ axisTop = this.top,
+ axisLength = this.len,
+ axisTitleOptions = this.options.title,
+ margin = horiz ? axisLeft : axisTop,
+ opposite = this.opposite,
+ offset = this.offset,
+ xOption = axisTitleOptions.x || 0,
+ yOption = axisTitleOptions.y || 0,
+ fontSize = this.chart.renderer.fontMetrics(axisTitleOptions.style.fontSize).f,
+
+ // the position in the length direction of the axis
+ alongAxis = {
+ low: margin + (horiz ? 0 : axisLength),
+ middle: margin + axisLength / 2,
+ high: margin + (horiz ? axisLength : 0)
+ }[axisTitleOptions.align],
+
+ // the position in the perpendicular direction of the axis
+ offAxis = (horiz ? axisTop + this.height : axisLeft) +
+ (horiz ? 1 : -1) * // horizontal axis reverses the margin
+ (opposite ? -1 : 1) * // so does opposite axes
+ this.axisTitleMargin +
+ (this.side === 2 ? fontSize : 0);
+
+ return {
+ x: horiz ?
+ alongAxis + xOption :
+ offAxis + (opposite ? this.width : 0) + offset + xOption,
+ y: horiz ?
+ offAxis + yOption - (opposite ? this.height : 0) + offset :
+ alongAxis + yOption
+ };
+ },
+
+ /**
+ * Render the axis
+ */
+ render: function () {
+ var axis = this,
+ chart = axis.chart,
+ renderer = chart.renderer,
+ options = axis.options,
+ isLog = axis.isLog,
+ lin2log = axis.lin2log,
+ isLinked = axis.isLinked,
+ tickPositions = axis.tickPositions,
+ axisTitle = axis.axisTitle,
+ ticks = axis.ticks,
+ minorTicks = axis.minorTicks,
+ alternateBands = axis.alternateBands,
+ stackLabelOptions = options.stackLabels,
+ alternateGridColor = options.alternateGridColor,
+ tickmarkOffset = axis.tickmarkOffset,
+ lineWidth = options.lineWidth,
+ linePath,
+ hasRendered = chart.hasRendered,
+ slideInTicks = hasRendered && isNumber(axis.oldMin),
+ showAxis = axis.showAxis,
+ animation = animObject(renderer.globalAnimation),
+ from,
+ to;
+
+ // Reset
+ axis.labelEdge.length = 0;
+ //axis.justifyToPlot = overflow === 'justify';
+ axis.overlap = false;
+
+ // Mark all elements inActive before we go over and mark the active ones
+ each([ticks, minorTicks, alternateBands], function (coll) {
+ var pos;
+ for (pos in coll) {
+ coll[pos].isActive = false;
+ }
+ });
+
+ // If the series has data draw the ticks. Else only the line and title
+ if (axis.hasData() || isLinked) {
+
+ // minor ticks
+ if (axis.minorTickInterval && !axis.categories) {
+ each(axis.getMinorTickPositions(), function (pos) {
+ if (!minorTicks[pos]) {
+ minorTicks[pos] = new Tick(axis, pos, 'minor');
+ }
+
+ // render new ticks in old position
+ if (slideInTicks && minorTicks[pos].isNew) {
+ minorTicks[pos].render(null, true);
+ }
+
+ minorTicks[pos].render(null, false, 1);
+ });
+ }
+
+ // Major ticks. Pull out the first item and render it last so that
+ // we can get the position of the neighbour label. #808.
+ if (tickPositions.length) { // #1300
+ each(tickPositions, function (pos, i) {
+
+ // linked axes need an extra check to find out if
+ if (!isLinked || (pos >= axis.min && pos <= axis.max)) {
+
+ if (!ticks[pos]) {
+ ticks[pos] = new Tick(axis, pos);
+ }
+
+ // render new ticks in old position
+ if (slideInTicks && ticks[pos].isNew) {
+ ticks[pos].render(i, true, 0.1);
+ }
+
+ ticks[pos].render(i);
+ }
+
+ });
+ // In a categorized axis, the tick marks are displayed between labels. So
+ // we need to add a tick mark and grid line at the left edge of the X axis.
+ if (tickmarkOffset && (axis.min === 0 || axis.single)) {
+ if (!ticks[-1]) {
+ ticks[-1] = new Tick(axis, -1, null, true);
+ }
+ ticks[-1].render(-1);
+ }
+
+ }
+
+ // alternate grid color
+ if (alternateGridColor) {
+ each(tickPositions, function (pos, i) {
+ to = tickPositions[i + 1] !== UNDEFINED ? tickPositions[i + 1] + tickmarkOffset : axis.max - tickmarkOffset;
+ if (i % 2 === 0 && pos < axis.max && to <= axis.max + (chart.polar ? -tickmarkOffset : tickmarkOffset)) { // #2248, #4660
+ if (!alternateBands[pos]) {
+ alternateBands[pos] = new Highcharts.PlotLineOrBand(axis);
+ }
+ from = pos + tickmarkOffset; // #949
+ alternateBands[pos].options = {
+ from: isLog ? lin2log(from) : from,
+ to: isLog ? lin2log(to) : to,
+ color: alternateGridColor
+ };
+ alternateBands[pos].render();
+ alternateBands[pos].isActive = true;
+ }
+ });
+ }
+
+ // custom plot lines and bands
+ if (!axis._addedPlotLB) { // only first time
+ each((options.plotLines || []).concat(options.plotBands || []), function (plotLineOptions) {
+ axis.addPlotBandOrLine(plotLineOptions);
+ });
+ axis._addedPlotLB = true;
+ }
+
+ } // end if hasData
+
+ // Remove inactive ticks
+ each([ticks, minorTicks, alternateBands], function (coll) {
+ var pos,
+ i,
+ forDestruction = [],
+ delay = animation.duration,
+ destroyInactiveItems = function () {
+ i = forDestruction.length;
+ while (i--) {
+ // When resizing rapidly, the same items may be destroyed in different timeouts,
+ // or the may be reactivated
+ if (coll[forDestruction[i]] && !coll[forDestruction[i]].isActive) {
+ coll[forDestruction[i]].destroy();
+ delete coll[forDestruction[i]];
+ }
+ }
+
+ };
+
+ for (pos in coll) {
+
+ if (!coll[pos].isActive) {
+ // Render to zero opacity
+ coll[pos].render(pos, false, 0);
+ coll[pos].isActive = false;
+ forDestruction.push(pos);
+ }
+ }
+
+ // When the objects are finished fading out, destroy them
+ syncTimeout(
+ destroyInactiveItems,
+ coll === alternateBands || !chart.hasRendered || !delay ? 0 : delay
+ );
+ });
+
+ // Static items. As the axis group is cleared on subsequent calls
+ // to render, these items are added outside the group.
+ // axis line
+ if (lineWidth) {
+ linePath = axis.getLinePath(lineWidth);
+ if (!axis.axisLine) {
+ axis.axisLine = renderer.path(linePath)
+ .attr({
+ stroke: options.lineColor,
+ 'stroke-width': lineWidth,
+ zIndex: 7
+ })
+ .add(axis.axisGroup);
+ } else {
+ axis.axisLine.animate({ d: linePath });
+ }
+
+ // show or hide the line depending on options.showEmpty
+ axis.axisLine[showAxis ? 'show' : 'hide'](true);
+ }
+
+ if (axisTitle && showAxis) {
+
+ axisTitle[axisTitle.isNew ? 'attr' : 'animate'](
+ axis.getTitlePosition()
+ );
+ axisTitle.isNew = false;
+ }
+
+ // Stacked totals:
+ if (stackLabelOptions && stackLabelOptions.enabled) {
+ axis.renderStackTotals();
+ }
+ // End stacked totals
+
+ axis.isDirty = false;
+ },
+
+ /**
+ * Redraw the axis to reflect changes in the data or axis extremes
+ */
+ redraw: function () {
+
+ if (this.visible) {
+ // render the axis
+ this.render();
+
+ // move plot lines and bands
+ each(this.plotLinesAndBands, function (plotLine) {
+ plotLine.render();
+ });
+ }
+
+ // mark associated series as dirty and ready for redraw
+ each(this.series, function (series) {
+ series.isDirty = true;
+ });
+
+ },
+
+ /**
+ * Destroys an Axis instance.
+ */
+ destroy: function (keepEvents) {
+ var axis = this,
+ stacks = axis.stacks,
+ stackKey,
+ plotLinesAndBands = axis.plotLinesAndBands,
+ i;
+
+ // Remove the events
+ if (!keepEvents) {
+ removeEvent(axis);
+ }
+
+ // Destroy each stack total
+ for (stackKey in stacks) {
+ destroyObjectProperties(stacks[stackKey]);
+
+ stacks[stackKey] = null;
+ }
+
+ // Destroy collections
+ each([axis.ticks, axis.minorTicks, axis.alternateBands], function (coll) {
+ destroyObjectProperties(coll);
+ });
+ i = plotLinesAndBands.length;
+ while (i--) { // #1975
+ plotLinesAndBands[i].destroy();
+ }
+
+ // Destroy properties
+ each(['stackTotalGroup', 'axisLine', 'axisTitle', 'axisGroup', 'gridGroup', 'labelGroup', 'cross'], function (prop) {
+ if (axis[prop]) {
+ axis[prop] = axis[prop].destroy();
+ }
+ });
+
+
+ this._addedPlotLB = this.chart._labelPanes = this.ordinalSlope = undefined; // #1611, #2887, #4314, #5316
+ },
+
+ /**
+ * Draw the crosshair
+ *
+ * @param {Object} e The event arguments from the modified pointer event
+ * @param {Object} point The Point object
+ */
+ drawCrosshair: function (e, point) {
+
+ var path,
+ options = this.crosshair,
+ pos,
+ attribs,
+ categorized,
+ strokeWidth;
+
+ // Use last available event when updating non-snapped crosshairs without
+ // mouse interaction (#5287)
+ if (!e) {
+ e = this.cross && this.cross.e;
+ }
+
+ if (
+ // Disabled in options
+ !this.crosshair ||
+ // Snap
+ ((defined(point) || !pick(options.snap, true)) === false)
+ ) {
+ this.hideCrosshair();
+ } else {
+
+ // Get the path
+ if (!pick(options.snap, true)) {
+ pos = (this.horiz ? e.chartX - this.pos : this.len - e.chartY + this.pos);
+ } else if (defined(point)) {
+ pos = this.isXAxis ? point.plotX : this.len - point.plotY; // #3834
+ }
+
+ if (this.isRadial) {
+ path = this.getPlotLinePath(this.isXAxis ? point.x : pick(point.stackY, point.y)) || null; // #3189
+ } else {
+ path = this.getPlotLinePath(null, null, null, null, pos) || null; // #3189
+ }
+
+ if (path === null) {
+ this.hideCrosshair();
+ return;
+ }
+
+ categorized = this.categories && !this.isRadial;
+ strokeWidth = pick(options.width, (categorized ? this.transA : 1));
+
+ // Draw the cross
+ if (this.cross) {
+ this.cross
+ .attr({
+ d: path,
+ visibility: 'visible',
+ 'stroke-width': strokeWidth // #4737
+ });
+ } else {
+ attribs = {
+ 'pointer-events': 'none', // #5259
+ 'stroke-width': strokeWidth,
+ stroke: options.color || (categorized ? 'rgba(155,200,255,0.2)' : '#C0C0C0'),
+ zIndex: pick(options.zIndex, 2)
+ };
+ if (options.dashStyle) {
+ attribs.dashstyle = options.dashStyle;
+ }
+ this.cross = this.chart.renderer.path(path).attr(attribs).add();
+ }
+ this.cross.e = e;
+ }
+
+ },
+
+ /**
+ * Hide the crosshair.
+ */
+ hideCrosshair: function () {
+ if (this.cross) {
+ this.cross.hide();
+ }
+ }
+ }; // end Axis
+
+ extend(Axis.prototype, AxisPlotLineOrBandExtension);
+
+ /**
+ * Set the tick positions to a time unit that makes sense, for example
+ * on the first of each month or on every Monday. Return an array
+ * with the time positions. Used in datetime axes as well as for grouping
+ * data on a datetime axis.
+ *
+ * @param {Object} normalizedInterval The interval in axis values (ms) and the count
+ * @param {Number} min The minimum in axis values
+ * @param {Number} max The maximum in axis values
+ * @param {Number} startOfWeek
+ */
+ Axis.prototype.getTimeTicks = function (normalizedInterval, min, max, startOfWeek) {
+ var tickPositions = [],
+ i,
+ higherRanks = {},
+ useUTC = defaultOptions.global.useUTC,
+ minYear, // used in months and years as a basis for Date.UTC()
+ minDate = new Date(min - getTZOffset(min)),
+ interval = normalizedInterval.unitRange,
+ count = normalizedInterval.count;
+
+ if (defined(min)) { // #1300
+ minDate[setMilliseconds](interval >= timeUnits.second ? 0 : // #3935
+ count * mathFloor(minDate.getMilliseconds() / count)); // #3652, #3654
+
+ if (interval >= timeUnits.second) { // second
+ minDate[setSeconds](interval >= timeUnits.minute ? 0 : // #3935
+ count * mathFloor(minDate.getSeconds() / count));
+ }
+
+ if (interval >= timeUnits.minute) { // minute
+ minDate[setMinutes](interval >= timeUnits.hour ? 0 :
+ count * mathFloor(minDate[getMinutes]() / count));
+ }
+
+ if (interval >= timeUnits.hour) { // hour
+ minDate[setHours](interval >= timeUnits.day ? 0 :
+ count * mathFloor(minDate[getHours]() / count));
+ }
+
+ if (interval >= timeUnits.day) { // day
+ minDate[setDate](interval >= timeUnits.month ? 1 :
+ count * mathFloor(minDate[getDate]() / count));
+ }
+
+ if (interval >= timeUnits.month) { // month
+ minDate[setMonth](interval >= timeUnits.year ? 0 :
+ count * mathFloor(minDate[getMonth]() / count));
+ minYear = minDate[getFullYear]();
+ }
+
+ if (interval >= timeUnits.year) { // year
+ minYear -= minYear % count;
+ minDate[setFullYear](minYear);
+ }
+
+ // week is a special case that runs outside the hierarchy
+ if (interval === timeUnits.week) {
+ // get start of current week, independent of count
+ minDate[setDate](minDate[getDate]() - minDate[getDay]() +
+ pick(startOfWeek, 1));
+ }
+
+
+ // get tick positions
+ i = 1;
+ if (timezoneOffset || getTimezoneOffset) {
+ minDate = minDate.getTime();
+ minDate = new Date(minDate + getTZOffset(minDate));
+ }
+ minYear = minDate[getFullYear]();
+ var time = minDate.getTime(),
+ minMonth = minDate[getMonth](),
+ minDateDate = minDate[getDate](),
+ variableDayLength = !useUTC || !!getTimezoneOffset, // #4951
+ localTimezoneOffset = (timeUnits.day +
+ (useUTC ? getTZOffset(minDate) : minDate.getTimezoneOffset() * 60 * 1000)
+ ) % timeUnits.day; // #950, #3359
+
+ // iterate and add tick positions at appropriate values
+ while (time < max) {
+ tickPositions.push(time);
+
+ // if the interval is years, use Date.UTC to increase years
+ if (interval === timeUnits.year) {
+ time = makeTime(minYear + i * count, 0);
+
+ // if the interval is months, use Date.UTC to increase months
+ } else if (interval === timeUnits.month) {
+ time = makeTime(minYear, minMonth + i * count);
+
+ // if we're using global time, the interval is not fixed as it jumps
+ // one hour at the DST crossover
+ } else if (variableDayLength && (interval === timeUnits.day || interval === timeUnits.week)) {
+ time = makeTime(minYear, minMonth, minDateDate +
+ i * count * (interval === timeUnits.day ? 1 : 7));
+
+ // else, the interval is fixed and we use simple addition
+ } else {
+ time += interval * count;
+ }
+
+ i++;
+ }
+
+ // push the last time
+ tickPositions.push(time);
+
+
+ // mark new days if the time is dividible by day (#1649, #1760)
+ each(grep(tickPositions, function (time) {
+ return interval <= timeUnits.hour && time % timeUnits.day === localTimezoneOffset;
+ }), function (time) {
+ higherRanks[time] = 'day';
+ });
+ }
+
+
+ // record information on the chosen unit - for dynamic label formatter
+ tickPositions.info = extend(normalizedInterval, {
+ higherRanks: higherRanks,
+ totalRange: interval * count
+ });
+
+ return tickPositions;
+ };
+
+ /**
+ * Get a normalized tick interval for dates. Returns a configuration object with
+ * unit range (interval), count and name. Used to prepare data for getTimeTicks.
+ * Previously this logic was part of getTimeTicks, but as getTimeTicks now runs
+ * of segments in stock charts, the normalizing logic was extracted in order to
+ * prevent it for running over again for each segment having the same interval.
+ * #662, #697.
+ */
+ Axis.prototype.normalizeTimeTickInterval = function (tickInterval, unitsOption) {
+ var units = unitsOption || [[
+ 'millisecond', // unit name
+ [1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples
+ ], [
+ 'second',
+ [1, 2, 5, 10, 15, 30]
+ ], [
+ 'minute',
+ [1, 2, 5, 10, 15, 30]
+ ], [
+ 'hour',
+ [1, 2, 3, 4, 6, 8, 12]
+ ], [
+ 'day',
+ [1, 2]
+ ], [
+ 'week',
+ [1, 2]
+ ], [
+ 'month',
+ [1, 2, 3, 4, 6]
+ ], [
+ 'year',
+ null
+ ]],
+ unit = units[units.length - 1], // default unit is years
+ interval = timeUnits[unit[0]],
+ multiples = unit[1],
+ count,
+ i;
+
+ // loop through the units to find the one that best fits the tickInterval
+ for (i = 0; i < units.length; i++) {
+ unit = units[i];
+ interval = timeUnits[unit[0]];
+ multiples = unit[1];
+
+
+ if (units[i + 1]) {
+ // lessThan is in the middle between the highest multiple and the next unit.
+ var lessThan = (interval * multiples[multiples.length - 1] +
+ timeUnits[units[i + 1][0]]) / 2;
+
+ // break and keep the current unit
+ if (tickInterval <= lessThan) {
+ break;
+ }
+ }
+ }
+
+ // prevent 2.5 years intervals, though 25, 250 etc. are allowed
+ if (interval === timeUnits.year && tickInterval < 5 * interval) {
+ multiples = [1, 2, 5];
+ }
+
+ // get the count
+ count = normalizeTickInterval(
+ tickInterval / interval,
+ multiples,
+ unit[0] === 'year' ? mathMax(getMagnitude(tickInterval / interval), 1) : 1 // #1913, #2360
+ );
+
+ return {
+ unitRange: interval,
+ count: count,
+ unitName: unit[0]
+ };
+ };
+ /**
+ * Methods defined on the Axis prototype
+ */
+
+ /**
+ * Set the tick positions of a logarithmic axis
+ */
+ Axis.prototype.getLogTickPositions = function (interval, min, max, minor) {
+ var axis = this,
+ options = axis.options,
+ axisLength = axis.len,
+ lin2log = axis.lin2log,
+ log2lin = axis.log2lin,
+ // Since we use this method for both major and minor ticks,
+ // use a local variable and return the result
+ positions = [];
+
+ // Reset
+ if (!minor) {
+ axis._minorAutoInterval = null;
+ }
+
+ // First case: All ticks fall on whole logarithms: 1, 10, 100 etc.
+ if (interval >= 0.5) {
+ interval = mathRound(interval);
+ positions = axis.getLinearTickPositions(interval, min, max);
+
+ // Second case: We need intermediary ticks. For example
+ // 1, 2, 4, 6, 8, 10, 20, 40 etc.
+ } else if (interval >= 0.08) {
+ var roundedMin = mathFloor(min),
+ intermediate,
+ i,
+ j,
+ len,
+ pos,
+ lastPos,
+ break2;
+
+ if (interval > 0.3) {
+ intermediate = [1, 2, 4];
+ } else if (interval > 0.15) { // 0.2 equals five minor ticks per 1, 10, 100 etc
+ intermediate = [1, 2, 4, 6, 8];
+ } else { // 0.1 equals ten minor ticks per 1, 10, 100 etc
+ intermediate = [1, 2, 3, 4, 5, 6, 7, 8, 9];
+ }
+
+ for (i = roundedMin; i < max + 1 && !break2; i++) {
+ len = intermediate.length;
+ for (j = 0; j < len && !break2; j++) {
+ pos = log2lin(lin2log(i) * intermediate[j]);
+ if (pos > min && (!minor || lastPos <= max) && lastPos !== UNDEFINED) { // #1670, lastPos is #3113
+ positions.push(lastPos);
+ }
+
+ if (lastPos > max) {
+ break2 = true;
+ }
+ lastPos = pos;
+ }
+ }
+
+ // Third case: We are so deep in between whole logarithmic values that
+ // we might as well handle the tick positions like a linear axis. For
+ // example 1.01, 1.02, 1.03, 1.04.
+ } else {
+ var realMin = lin2log(min),
+ realMax = lin2log(max),
+ tickIntervalOption = options[minor ? 'minorTickInterval' : 'tickInterval'],
+ filteredTickIntervalOption = tickIntervalOption === 'auto' ? null : tickIntervalOption,
+ tickPixelIntervalOption = options.tickPixelInterval / (minor ? 5 : 1),
+ totalPixelLength = minor ? axisLength / axis.tickPositions.length : axisLength;
+
+ interval = pick(
+ filteredTickIntervalOption,
+ axis._minorAutoInterval,
+ (realMax - realMin) * tickPixelIntervalOption / (totalPixelLength || 1)
+ );
+
+ interval = normalizeTickInterval(
+ interval,
+ null,
+ getMagnitude(interval)
+ );
+
+ positions = map(axis.getLinearTickPositions(
+ interval,
+ realMin,
+ realMax
+ ), log2lin);
+
+ if (!minor) {
+ axis._minorAutoInterval = interval / 5;
+ }
+ }
+
+ // Set the axis-level tickInterval variable
+ if (!minor) {
+ axis.tickInterval = interval;
+ }
+ return positions;
+ };
+
+ Axis.prototype.log2lin = function (num) {
+ return math.log(num) / math.LN10;
+ };
+
+ Axis.prototype.lin2log = function (num) {
+ return math.pow(10, num);
+ };
+ /**
+ * The tooltip object
+ * @param {Object} chart The chart instance
+ * @param {Object} options Tooltip options
+ */
+ var Tooltip = Highcharts.Tooltip = function () {
+ this.init.apply(this, arguments);
+ };
+
+ Tooltip.prototype = {
+
+ init: function (chart, options) {
+
+ var borderWidth = options.borderWidth,
+ style = options.style,
+ padding = pInt(style.padding);
+
+ // Save the chart and options
+ this.chart = chart;
+ this.options = options;
+
+ // Keep track of the current series
+ //this.currentSeries = UNDEFINED;
+
+ // List of crosshairs
+ this.crosshairs = [];
+
+ // Current values of x and y when animating
+ this.now = { x: 0, y: 0 };
+
+ // The tooltip is initially hidden
+ this.isHidden = true;
+
+
+ // create the label
+ this.label = chart.renderer.label('', 0, 0, options.shape || 'callout', null, null, options.useHTML, null, 'tooltip')
+ .attr({
+ padding: padding,
+ fill: options.backgroundColor,
+ 'stroke-width': borderWidth,
+ r: options.borderRadius,
+ zIndex: 8
+ })
+ .css(style)
+ .css({ padding: 0 }) // Remove it from VML, the padding is applied as an attribute instead (#1117)
+ .add()
+ .attr({ y: -9e9 }); // #2301, #2657, #3532
+
+ // When using canVG the shadow shows up as a gray circle
+ // even if the tooltip is hidden.
+ if (!useCanVG) {
+ this.label.shadow(options.shadow);
+ }
+
+ // Public property for getting the shared state.
+ this.shared = options.shared;
+ },
+
+ /**
+ * Destroy the tooltip and its elements.
+ */
+ destroy: function () {
+ // Destroy and clear local variables
+ if (this.label) {
+ this.label = this.label.destroy();
+ }
+ clearTimeout(this.hideTimer);
+ clearTimeout(this.tooltipTimeout);
+ },
+
+ /**
+ * Provide a soft movement for the tooltip
+ *
+ * @param {Number} x
+ * @param {Number} y
+ * @private
+ */
+ move: function (x, y, anchorX, anchorY) {
+ var tooltip = this,
+ now = tooltip.now,
+ animate = tooltip.options.animation !== false && !tooltip.isHidden &&
+ // When we get close to the target position, abort animation and land on the right place (#3056)
+ (mathAbs(x - now.x) > 1 || mathAbs(y - now.y) > 1),
+ skipAnchor = tooltip.followPointer || tooltip.len > 1;
+
+ // Get intermediate values for animation
+ extend(now, {
+ x: animate ? (2 * now.x + x) / 3 : x,
+ y: animate ? (now.y + y) / 2 : y,
+ anchorX: skipAnchor ? UNDEFINED : animate ? (2 * now.anchorX + anchorX) / 3 : anchorX,
+ anchorY: skipAnchor ? UNDEFINED : animate ? (now.anchorY + anchorY) / 2 : anchorY
+ });
+
+ // Move to the intermediate value
+ tooltip.label.attr(now);
+
+
+ // Run on next tick of the mouse tracker
+ if (animate) {
+
+ // Never allow two timeouts
+ clearTimeout(this.tooltipTimeout);
+
+ // Set the fixed interval ticking for the smooth tooltip
+ this.tooltipTimeout = setTimeout(function () {
+ // The interval function may still be running during destroy, so check that the chart is really there before calling.
+ if (tooltip) {
+ tooltip.move(x, y, anchorX, anchorY);
+ }
+ }, 32);
+
+ }
+ },
+
+ /**
+ * Hide the tooltip
+ */
+ hide: function (delay) {
+ var tooltip = this;
+ clearTimeout(this.hideTimer); // disallow duplicate timers (#1728, #1766)
+ delay = pick(delay, this.options.hideDelay, 500);
+ if (!this.isHidden) {
+ this.hideTimer = syncTimeout(function () {
+ tooltip.label[delay ? 'fadeOut' : 'hide']();
+ tooltip.isHidden = true;
+ }, delay);
+ }
+ },
+
+ /**
+ * Extendable method to get the anchor position of the tooltip
+ * from a point or set of points
+ */
+ getAnchor: function (points, mouseEvent) {
+ var ret,
+ chart = this.chart,
+ inverted = chart.inverted,
+ plotTop = chart.plotTop,
+ plotLeft = chart.plotLeft,
+ plotX = 0,
+ plotY = 0,
+ yAxis,
+ xAxis;
+
+ points = splat(points);
+
+ // Pie uses a special tooltipPos
+ ret = points[0].tooltipPos;
+
+ // When tooltip follows mouse, relate the position to the mouse
+ if (this.followPointer && mouseEvent) {
+ if (mouseEvent.chartX === UNDEFINED) {
+ mouseEvent = chart.pointer.normalize(mouseEvent);
+ }
+ ret = [
+ mouseEvent.chartX - chart.plotLeft,
+ mouseEvent.chartY - plotTop
+ ];
+ }
+ // When shared, use the average position
+ if (!ret) {
+ each(points, function (point) {
+ yAxis = point.series.yAxis;
+ xAxis = point.series.xAxis;
+ plotX += point.plotX + (!inverted && xAxis ? xAxis.left - plotLeft : 0);
+ plotY += (point.plotLow ? (point.plotLow + point.plotHigh) / 2 : point.plotY) +
+ (!inverted && yAxis ? yAxis.top - plotTop : 0); // #1151
+ });
+
+ plotX /= points.length;
+ plotY /= points.length;
+
+ ret = [
+ inverted ? chart.plotWidth - plotY : plotX,
+ this.shared && !inverted && points.length > 1 && mouseEvent ?
+ mouseEvent.chartY - plotTop : // place shared tooltip next to the mouse (#424)
+ inverted ? chart.plotHeight - plotX : plotY
+ ];
+ }
+
+ return map(ret, mathRound);
+ },
+
+ /**
+ * Place the tooltip in a chart without spilling over
+ * and not covering the point it self.
+ */
+ getPosition: function (boxWidth, boxHeight, point) {
+
+ var chart = this.chart,
+ distance = this.distance,
+ ret = {},
+ h = point.h || 0, // #4117
+ swapped,
+ first = ['y', chart.chartHeight, boxHeight, point.plotY + chart.plotTop, chart.plotTop, chart.plotTop + chart.plotHeight],
+ second = ['x', chart.chartWidth, boxWidth, point.plotX + chart.plotLeft, chart.plotLeft, chart.plotLeft + chart.plotWidth],
+ // The far side is right or bottom
+ preferFarSide = !this.followPointer && pick(point.ttBelow, !chart.inverted === !!point.negative), // #4984
+ /**
+ * Handle the preferred dimension. When the preferred dimension is tooltip
+ * on top or bottom of the point, it will look for space there.
+ */
+ firstDimension = function (dim, outerSize, innerSize, point, min, max) {
+ var roomLeft = innerSize < point - distance,
+ roomRight = point + distance + innerSize < outerSize,
+ alignedLeft = point - distance - innerSize,
+ alignedRight = point + distance;
+
+ if (preferFarSide && roomRight) {
+ ret[dim] = alignedRight;
+ } else if (!preferFarSide && roomLeft) {
+ ret[dim] = alignedLeft;
+ } else if (roomLeft) {
+ ret[dim] = mathMin(max - innerSize, alignedLeft - h < 0 ? alignedLeft : alignedLeft - h);
+ } else if (roomRight) {
+ ret[dim] = mathMax(min, alignedRight + h + innerSize > outerSize ? alignedRight : alignedRight + h);
+ } else {
+ return false;
+ }
+ },
+ /**
+ * Handle the secondary dimension. If the preferred dimension is tooltip
+ * on top or bottom of the point, the second dimension is to align the tooltip
+ * above the point, trying to align center but allowing left or right
+ * align within the chart box.
+ */
+ secondDimension = function (dim, outerSize, innerSize, point) {
+ var retVal;
+
+ // Too close to the edge, return false and swap dimensions
+ if (point < distance || point > outerSize - distance) {
+ retVal = false;
+ // Align left/top
+ } else if (point < innerSize / 2) {
+ ret[dim] = 1;
+ // Align right/bottom
+ } else if (point > outerSize - innerSize / 2) {
+ ret[dim] = outerSize - innerSize - 2;
+ // Align center
+ } else {
+ ret[dim] = point - innerSize / 2;
+ }
+ return retVal;
+ },
+ /**
+ * Swap the dimensions
+ */
+ swap = function (count) {
+ var temp = first;
+ first = second;
+ second = temp;
+ swapped = count;
+ },
+ run = function () {
+ if (firstDimension.apply(0, first) !== false) {
+ if (secondDimension.apply(0, second) === false && !swapped) {
+ swap(true);
+ run();
+ }
+ } else if (!swapped) {
+ swap(true);
+ run();
+ } else {
+ ret.x = ret.y = 0;
+ }
+ };
+
+ // Under these conditions, prefer the tooltip on the side of the point
+ if (chart.inverted || this.len > 1) {
+ swap();
+ }
+ run();
+
+ return ret;
+
+ },
+
+ /**
+ * In case no user defined formatter is given, this will be used. Note that the context
+ * here is an object holding point, series, x, y etc.
+ */
+ defaultFormatter: function (tooltip) {
+ var items = this.points || splat(this),
+ s;
+
+ // build the header
+ s = [tooltip.tooltipFooterHeaderFormatter(items[0])]; //#3397: abstraction to enable formatting of footer and header
+
+ // build the values
+ s = s.concat(tooltip.bodyFormatter(items));
+
+ // footer
+ s.push(tooltip.tooltipFooterHeaderFormatter(items[0], true)); //#3397: abstraction to enable formatting of footer and header
+
+ return s.join('');
+ },
+
+ /**
+ * Refresh the tooltip's text and position.
+ * @param {Object} point
+ */
+ refresh: function (point, mouseEvent) {
+ var tooltip = this,
+ chart = tooltip.chart,
+ label = tooltip.label,
+ options = tooltip.options,
+ x,
+ y,
+ anchor,
+ textConfig = {},
+ text,
+ pointConfig = [],
+ formatter = options.formatter || tooltip.defaultFormatter,
+ hoverPoints = chart.hoverPoints,
+ borderColor,
+ shared = tooltip.shared,
+ currentSeries;
+
+ clearTimeout(this.hideTimer);
+
+ // get the reference point coordinates (pie charts use tooltipPos)
+ tooltip.followPointer = splat(point)[0].series.tooltipOptions.followPointer;
+ anchor = tooltip.getAnchor(point, mouseEvent);
+ x = anchor[0];
+ y = anchor[1];
+
+ // shared tooltip, array is sent over
+ if (shared && !(point.series && point.series.noSharedTooltip)) {
+
+ // hide previous hoverPoints and set new
+
+ chart.hoverPoints = point;
+ if (hoverPoints) {
+ each(hoverPoints, function (point) {
+ point.setState();
+ });
+ }
+
+ each(point, function (item) {
+ item.setState(HOVER_STATE);
+
+ pointConfig.push(item.getLabelConfig());
+ });
+
+ textConfig = {
+ x: point[0].category,
+ y: point[0].y
+ };
+ textConfig.points = pointConfig;
+ this.len = pointConfig.length;
+ point = point[0];
+
+ // single point tooltip
+ } else {
+ textConfig = point.getLabelConfig();
+ }
+ text = formatter.call(textConfig, tooltip);
+
+ // register the current series
+ currentSeries = point.series;
+ this.distance = pick(currentSeries.tooltipOptions.distance, 16);
+
+ // update the inner HTML
+ if (text === false) {
+ this.hide();
+ } else {
+
+ // show it
+ if (tooltip.isHidden) {
+ stop(label);
+ label.attr('opacity', 1).show();
+ }
+
+ // update text
+ label.attr({
+ text: text
+ });
+
+ // set the stroke color of the box
+ borderColor = options.borderColor || point.color || currentSeries.color || '#606060';
+ label.attr({
+ stroke: borderColor
+ });
+ tooltip.updatePosition({
+ plotX: x,
+ plotY: y,
+ negative: point.negative,
+ ttBelow: point.ttBelow,
+ h: anchor[2] || 0
+ });
+
+ this.isHidden = false;
+ }
+ fireEvent(chart, 'tooltipRefresh', {
+ text: text,
+ x: x + chart.plotLeft,
+ y: y + chart.plotTop,
+ borderColor: borderColor
+ });
+ },
+
+ /**
+ * Find the new position and perform the move
+ */
+ updatePosition: function (point) {
+ var chart = this.chart,
+ label = this.label,
+ pos = (this.options.positioner || this.getPosition).call(
+ this,
+ label.width,
+ label.height,
+ point
+ );
+
+ // do the move
+ this.move(
+ mathRound(pos.x),
+ mathRound(pos.y || 0), // can be undefined (#3977)
+ point.plotX + chart.plotLeft,
+ point.plotY + chart.plotTop
+ );
+ },
+
+ /**
+ * Get the best X date format based on the closest point range on the axis.
+ */
+ getXDateFormat: function (point, options, xAxis) {
+ var xDateFormat,
+ dateTimeLabelFormats = options.dateTimeLabelFormats,
+ closestPointRange = xAxis && xAxis.closestPointRange,
+ n,
+ blank = '01-01 00:00:00.000',
+ strpos = {
+ millisecond: 15,
+ second: 12,
+ minute: 9,
+ hour: 6,
+ day: 3
+ },
+ date,
+ lastN = 'millisecond'; // for sub-millisecond data, #4223
+
+ if (closestPointRange) {
+ date = dateFormat('%m-%d %H:%M:%S.%L', point.x);
+ for (n in timeUnits) {
+
+ // If the range is exactly one week and we're looking at a Sunday/Monday, go for the week format
+ if (closestPointRange === timeUnits.week && +dateFormat('%w', point.x) === xAxis.options.startOfWeek &&
+ date.substr(6) === blank.substr(6)) {
+ n = 'week';
+ break;
+ }
+
+ // The first format that is too great for the range
+ if (timeUnits[n] > closestPointRange) {
+ n = lastN;
+ break;
+ }
+
+ // If the point is placed every day at 23:59, we need to show
+ // the minutes as well. #2637.
+ if (strpos[n] && date.substr(strpos[n]) !== blank.substr(strpos[n])) {
+ break;
+ }
+
+ // Weeks are outside the hierarchy, only apply them on Mondays/Sundays like in the first condition
+ if (n !== 'week') {
+ lastN = n;
+ }
+ }
+
+ if (n) {
+ xDateFormat = dateTimeLabelFormats[n];
+ }
+ } else {
+ xDateFormat = dateTimeLabelFormats.day;
+ }
+
+ return xDateFormat || dateTimeLabelFormats.year; // #2546, 2581
+ },
+
+ /**
+ * Format the footer/header of the tooltip
+ * #3397: abstraction to enable formatting of footer and header
+ */
+ tooltipFooterHeaderFormatter: function (labelConfig, isFooter) {
+ var footOrHead = isFooter ? 'footer' : 'header',
+ series = labelConfig.series,
+ tooltipOptions = series.tooltipOptions,
+ xDateFormat = tooltipOptions.xDateFormat,
+ xAxis = series.xAxis,
+ isDateTime = xAxis && xAxis.options.type === 'datetime' && isNumber(labelConfig.key),
+ formatString = tooltipOptions[footOrHead + 'Format'];
+
+ // Guess the best date format based on the closest point distance (#568, #3418)
+ if (isDateTime && !xDateFormat) {
+ xDateFormat = this.getXDateFormat(labelConfig, tooltipOptions, xAxis);
+ }
+
+ // Insert the footer date format if any
+ if (isDateTime && xDateFormat) {
+ formatString = formatString.replace('{point.key}', '{point.key:' + xDateFormat + '}');
+ }
+
+ return format(formatString, {
+ point: labelConfig,
+ series: series
+ });
+ },
+
+ /**
+ * Build the body (lines) of the tooltip by iterating over the items and returning one entry for each item,
+ * abstracting this functionality allows to easily overwrite and extend it.
+ */
+ bodyFormatter: function (items) {
+ return map(items, function (item) {
+ var tooltipOptions = item.series.tooltipOptions;
+ return (tooltipOptions.pointFormatter || item.point.tooltipFormatter).call(item.point, tooltipOptions.pointFormat);
+ });
+ }
+
+ };
+
+ var hoverChartIndex;
+
+ // Global flag for touch support
+ hasTouch = doc && doc.documentElement.ontouchstart !== UNDEFINED;
+
+ /**
+ * The mouse tracker object. All methods starting with "on" are primary DOM event handlers.
+ * Subsequent methods should be named differently from what they are doing.
+ * @param {Object} chart The Chart instance
+ * @param {Object} options The root options object
+ */
+ var Pointer = Highcharts.Pointer = function (chart, options) {
+ this.init(chart, options);
+ };
+
+ Pointer.prototype = {
+ /**
+ * Initialize Pointer
+ */
+ init: function (chart, options) {
+
+ var chartOptions = options.chart,
+ chartEvents = chartOptions.events,
+ zoomType = useCanVG ? '' : chartOptions.zoomType,
+ inverted = chart.inverted,
+ zoomX,
+ zoomY;
+
+ // Store references
+ this.options = options;
+ this.chart = chart;
+
+ // Zoom status
+ this.zoomX = zoomX = /x/.test(zoomType);
+ this.zoomY = zoomY = /y/.test(zoomType);
+ this.zoomHor = (zoomX && !inverted) || (zoomY && inverted);
+ this.zoomVert = (zoomY && !inverted) || (zoomX && inverted);
+ this.hasZoom = zoomX || zoomY;
+
+ // Do we need to handle click on a touch device?
+ this.runChartClick = chartEvents && !!chartEvents.click;
+
+ this.pinchDown = [];
+ this.lastValidTouch = {};
+
+ if (Highcharts.Tooltip && options.tooltip.enabled) {
+ chart.tooltip = new Tooltip(chart, options.tooltip);
+ this.followTouchMove = pick(options.tooltip.followTouchMove, true);
+ }
+
+ this.setDOMEvents();
+ },
+
+ /**
+ * Add crossbrowser support for chartX and chartY
+ * @param {Object} e The event object in standard browsers
+ */
+ normalize: function (e, chartPosition) {
+ var chartX,
+ chartY,
+ ePos;
+
+ // IE normalizing
+ e = e || win.event;
+ if (!e.target) {
+ e.target = e.srcElement;
+ }
+
+ // iOS (#2757)
+ ePos = e.touches ? (e.touches.length ? e.touches.item(0) : e.changedTouches[0]) : e;
+
+ // Get mouse position
+ if (!chartPosition) {
+ this.chartPosition = chartPosition = offset(this.chart.container);
+ }
+
+ // chartX and chartY
+ if (ePos.pageX === UNDEFINED) { // IE < 9. #886.
+ chartX = mathMax(e.x, e.clientX - chartPosition.left); // #2005, #2129: the second case is
+ // for IE10 quirks mode within framesets
+ chartY = e.y;
+ } else {
+ chartX = ePos.pageX - chartPosition.left;
+ chartY = ePos.pageY - chartPosition.top;
+ }
+
+ return extend(e, {
+ chartX: mathRound(chartX),
+ chartY: mathRound(chartY)
+ });
+ },
+
+ /**
+ * Get the click position in terms of axis values.
+ *
+ * @param {Object} e A pointer event
+ */
+ getCoordinates: function (e) {
+ var coordinates = {
+ xAxis: [],
+ yAxis: []
+ };
+
+ each(this.chart.axes, function (axis) {
+ coordinates[axis.isXAxis ? 'xAxis' : 'yAxis'].push({
+ axis: axis,
+ value: axis.toValue(e[axis.horiz ? 'chartX' : 'chartY'])
+ });
+ });
+ return coordinates;
+ },
+
+ /**
+ * With line type charts with a single tracker, get the point closest to the mouse.
+ * Run Point.onMouseOver and display tooltip for the point or points.
+ */
+ runPointActions: function (e) {
+
+ var pointer = this,
+ chart = pointer.chart,
+ series = chart.series,
+ tooltip = chart.tooltip,
+ shared = tooltip ? tooltip.shared : false,
+ followPointer,
+ hoverPoint = chart.hoverPoint,
+ hoverSeries = chart.hoverSeries,
+ i,
+ distance = [Number.MAX_VALUE, Number.MAX_VALUE], // #4511
+ anchor,
+ noSharedTooltip,
+ stickToHoverSeries,
+ directTouch,
+ kdpoints = [],
+ kdpoint = [],
+ kdpointT;
+
+ // For hovering over the empty parts of the plot area (hoverSeries is undefined).
+ // If there is one series with point tracking (combo chart), don't go to nearest neighbour.
+ if (!shared && !hoverSeries) {
+ for (i = 0; i < series.length; i++) {
+ if (series[i].directTouch || !series[i].options.stickyTracking) {
+ series = [];
+ }
+ }
+ }
+
+ // If it has a hoverPoint and that series requires direct touch (like columns, #3899), or we're on
+ // a noSharedTooltip series among shared tooltip series (#4546), use the hoverPoint . Otherwise,
+ // search the k-d tree.
+ stickToHoverSeries = hoverSeries && (shared ? hoverSeries.noSharedTooltip : hoverSeries.directTouch);
+ if (stickToHoverSeries && hoverPoint) {
+ kdpoint = [hoverPoint];
+
+ // Handle shared tooltip or cases where a series is not yet hovered
+ } else {
+ // Find nearest points on all series
+ each(series, function (s) {
+ // Skip hidden series
+ noSharedTooltip = s.noSharedTooltip && shared;
+ directTouch = !shared && s.directTouch;
+ if (s.visible && !noSharedTooltip && !directTouch && pick(s.options.enableMouseTracking, true)) { // #3821
+ kdpointT = s.searchPoint(e, !noSharedTooltip && s.kdDimensions === 1); // #3828
+ if (kdpointT && kdpointT.series) { // Point.series becomes null when reset and before redraw (#5197)
+ kdpoints.push(kdpointT);
+ }
+ }
+ });
+ // Find absolute nearest point
+ each(kdpoints, function (p) {
+ if (p) {
+ // Store both closest points, using point.dist and point.distX comparisons (#4645):
+ each(['dist', 'distX'], function (dist, k) {
+ if (isNumber(p[dist])) {
+ var
+ // It is closer than the reference point
+ isCloser = p[dist] < distance[k],
+ // It is equally close, but above the reference point (#4679)
+ isAbove = p[dist] === distance[k] && p.series.group.zIndex >= kdpoint[k].series.group.zIndex;
+
+ if (isCloser || isAbove) {
+ distance[k] = p[dist];
+ kdpoint[k] = p;
+ }
+ }
+ });
+ }
+ });
+ }
+
+ // Remove points with different x-positions, required for shared tooltip and crosshairs (#4645):
+ if (shared) {
+ i = kdpoints.length;
+ while (i--) {
+ if (kdpoints[i].clientX !== kdpoint[1].clientX || kdpoints[i].series.noSharedTooltip) {
+ kdpoints.splice(i, 1);
+ }
+ }
+ }
+
+ // Refresh tooltip for kdpoint if new hover point or tooltip was hidden // #3926, #4200
+ if (kdpoint[0] && (kdpoint[0] !== this.prevKDPoint || (tooltip && tooltip.isHidden))) {
+ // Draw tooltip if necessary
+ if (shared && !kdpoint[0].series.noSharedTooltip) {
+ if (kdpoints.length && tooltip) {
+ tooltip.refresh(kdpoints, e);
+ }
+
+ // Do mouseover on all points (#3919, #3985, #4410)
+ each(kdpoints, function (point) {
+ point.onMouseOver(e, point !== ((hoverSeries && hoverSeries.directTouch && hoverPoint) || kdpoint[0]));
+ });
+ this.prevKDPoint = kdpoint[1];
+ } else {
+ if (tooltip) {
+ tooltip.refresh(kdpoint[0], e);
+ }
+ if (!hoverSeries || !hoverSeries.directTouch) { // #4448
+ kdpoint[0].onMouseOver(e);
+ }
+ this.prevKDPoint = kdpoint[0];
+ }
+
+ // Update positions (regardless of kdpoint or hoverPoint)
+ } else {
+ followPointer = hoverSeries && hoverSeries.tooltipOptions.followPointer;
+ if (tooltip && followPointer && !tooltip.isHidden) {
+ anchor = tooltip.getAnchor([{}], e);
+ tooltip.updatePosition({ plotX: anchor[0], plotY: anchor[1] });
+ }
+ }
+
+ // Start the event listener to pick up the tooltip and crosshairs
+ if (!pointer._onDocumentMouseMove) {
+ pointer._onDocumentMouseMove = function (e) {
+ if (charts[hoverChartIndex]) {
+ charts[hoverChartIndex].pointer.onDocumentMouseMove(e);
+ }
+ };
+ addEvent(doc, 'mousemove', pointer._onDocumentMouseMove);
+ }
+
+ // Crosshair. For each hover point, loop over axes and draw cross if that point
+ // belongs to the axis (#4927).
+ each(shared ? kdpoints : [pick(hoverPoint, kdpoint[1])], function (point) { // #5269
+ each(chart.axes, function (axis) {
+ // In case of snap = false, point is undefined, and we draw the crosshair anyway (#5066)
+ if (!point || point.series[axis.coll] === axis) {
+ axis.drawCrosshair(e, point);
+ }
+ });
+ });
+ },
+
+ /**
+ * Reset the tracking by hiding the tooltip, the hover series state and the hover point
+ *
+ * @param allowMove {Boolean} Instead of destroying the tooltip altogether, allow moving it if possible
+ */
+ reset: function (allowMove, delay) {
+ var pointer = this,
+ chart = pointer.chart,
+ hoverSeries = chart.hoverSeries,
+ hoverPoint = chart.hoverPoint,
+ hoverPoints = chart.hoverPoints,
+ tooltip = chart.tooltip,
+ tooltipPoints = tooltip && tooltip.shared ? hoverPoints : hoverPoint;
+
+ // Check if the points have moved outside the plot area (#1003, #4736, #5101)
+ if (allowMove && tooltipPoints) {
+ each(splat(tooltipPoints), function (point) {
+ if (point.series.isCartesian && point.plotX === undefined) {
+ allowMove = false;
+ }
+ });
+ }
+
+ // Just move the tooltip, #349
+ if (allowMove) {
+ if (tooltip && tooltipPoints) {
+ tooltip.refresh(tooltipPoints);
+ if (hoverPoint) { // #2500
+ hoverPoint.setState(hoverPoint.state, true);
+ each(chart.axes, function (axis) {
+ if (axis.crosshair) {
+ axis.drawCrosshair(null, hoverPoint);
+ }
+ });
+ }
+ }
+
+ // Full reset
+ } else {
+
+ if (hoverPoint) {
+ hoverPoint.onMouseOut();
+ }
+
+ if (hoverPoints) {
+ each(hoverPoints, function (point) {
+ point.setState();
+ });
+ }
+
+ if (hoverSeries) {
+ hoverSeries.onMouseOut();
+ }
+
+ if (tooltip) {
+ tooltip.hide(delay);
+ }
+
+ if (pointer._onDocumentMouseMove) {
+ removeEvent(doc, 'mousemove', pointer._onDocumentMouseMove);
+ pointer._onDocumentMouseMove = null;
+ }
+
+ // Remove crosshairs
+ each(chart.axes, function (axis) {
+ axis.hideCrosshair();
+ });
+
+ pointer.hoverX = pointer.prevKDPoint = chart.hoverPoints = chart.hoverPoint = null;
+ }
+ },
+
+ /**
+ * Scale series groups to a certain scale and translation
+ */
+ scaleGroups: function (attribs, clip) {
+
+ var chart = this.chart,
+ seriesAttribs;
+
+ // Scale each series
+ each(chart.series, function (series) {
+ seriesAttribs = attribs || series.getPlotBox(); // #1701
+ if (series.xAxis && series.xAxis.zoomEnabled) {
+ series.group.attr(seriesAttribs);
+ if (series.markerGroup) {
+ series.markerGroup.attr(seriesAttribs);
+ series.markerGroup.clip(clip ? chart.clipRect : null);
+ }
+ if (series.dataLabelsGroup) {
+ series.dataLabelsGroup.attr(seriesAttribs);
+ }
+ }
+ });
+
+ // Clip
+ chart.clipRect.attr(clip || chart.clipBox);
+ },
+
+ /**
+ * Start a drag operation
+ */
+ dragStart: function (e) {
+ var chart = this.chart;
+
+ // Record the start position
+ chart.mouseIsDown = e.type;
+ chart.cancelClick = false;
+ chart.mouseDownX = this.mouseDownX = e.chartX;
+ chart.mouseDownY = this.mouseDownY = e.chartY;
+ },
+
+ /**
+ * Perform a drag operation in response to a mousemove event while the mouse is down
+ */
+ drag: function (e) {
+
+ var chart = this.chart,
+ chartOptions = chart.options.chart,
+ chartX = e.chartX,
+ chartY = e.chartY,
+ zoomHor = this.zoomHor,
+ zoomVert = this.zoomVert,
+ plotLeft = chart.plotLeft,
+ plotTop = chart.plotTop,
+ plotWidth = chart.plotWidth,
+ plotHeight = chart.plotHeight,
+ clickedInside,
+ size,
+ selectionMarker = this.selectionMarker,
+ mouseDownX = this.mouseDownX,
+ mouseDownY = this.mouseDownY,
+ panKey = chartOptions.panKey && e[chartOptions.panKey + 'Key'];
+
+ // If the device supports both touch and mouse (like IE11), and we are touch-dragging
+ // inside the plot area, don't handle the mouse event. #4339.
+ if (selectionMarker && selectionMarker.touch) {
+ return;
+ }
+
+ // If the mouse is outside the plot area, adjust to cooordinates
+ // inside to prevent the selection marker from going outside
+ if (chartX < plotLeft) {
+ chartX = plotLeft;
+ } else if (chartX > plotLeft + plotWidth) {
+ chartX = plotLeft + plotWidth;
+ }
+
+ if (chartY < plotTop) {
+ chartY = plotTop;
+ } else if (chartY > plotTop + plotHeight) {
+ chartY = plotTop + plotHeight;
+ }
+
+ // determine if the mouse has moved more than 10px
+ this.hasDragged = Math.sqrt(
+ Math.pow(mouseDownX - chartX, 2) +
+ Math.pow(mouseDownY - chartY, 2)
+ );
+
+ if (this.hasDragged > 10) {
+ clickedInside = chart.isInsidePlot(mouseDownX - plotLeft, mouseDownY - plotTop);
+
+ // make a selection
+ if (chart.hasCartesianSeries && (this.zoomX || this.zoomY) && clickedInside && !panKey) {
+ if (!selectionMarker) {
+ this.selectionMarker = selectionMarker = chart.renderer.rect(
+ plotLeft,
+ plotTop,
+ zoomHor ? 1 : plotWidth,
+ zoomVert ? 1 : plotHeight,
+ 0
+ )
+ .attr({
+ fill: chartOptions.selectionMarkerFill || 'rgba(69,114,167,0.25)',
+ zIndex: 7
+ })
+ .add();
+ }
+ }
+
+ // adjust the width of the selection marker
+ if (selectionMarker && zoomHor) {
+ size = chartX - mouseDownX;
+ selectionMarker.attr({
+ width: mathAbs(size),
+ x: (size > 0 ? 0 : size) + mouseDownX
+ });
+ }
+ // adjust the height of the selection marker
+ if (selectionMarker && zoomVert) {
+ size = chartY - mouseDownY;
+ selectionMarker.attr({
+ height: mathAbs(size),
+ y: (size > 0 ? 0 : size) + mouseDownY
+ });
+ }
+
+ // panning
+ if (clickedInside && !selectionMarker && chartOptions.panning) {
+ chart.pan(e, chartOptions.panning);
+ }
+ }
+ },
+
+ /**
+ * On mouse up or touch end across the entire document, drop the selection.
+ */
+ drop: function (e) {
+ var pointer = this,
+ chart = this.chart,
+ hasPinched = this.hasPinched;
+
+ if (this.selectionMarker) {
+ var selectionData = {
+ originalEvent: e, // #4890
+ xAxis: [],
+ yAxis: []
+ },
+ selectionBox = this.selectionMarker,
+ selectionLeft = selectionBox.attr ? selectionBox.attr('x') : selectionBox.x,
+ selectionTop = selectionBox.attr ? selectionBox.attr('y') : selectionBox.y,
+ selectionWidth = selectionBox.attr ? selectionBox.attr('width') : selectionBox.width,
+ selectionHeight = selectionBox.attr ? selectionBox.attr('height') : selectionBox.height,
+ runZoom;
+
+ // a selection has been made
+ if (this.hasDragged || hasPinched) {
+
+ // record each axis' min and max
+ each(chart.axes, function (axis) {
+ if (axis.zoomEnabled && defined(axis.min) && (hasPinched || pointer[{ xAxis: 'zoomX', yAxis: 'zoomY' }[axis.coll]])) { // #859, #3569
+ var horiz = axis.horiz,
+ minPixelPadding = e.type === 'touchend' ? axis.minPixelPadding : 0, // #1207, #3075
+ selectionMin = axis.toValue((horiz ? selectionLeft : selectionTop) + minPixelPadding),
+ selectionMax = axis.toValue((horiz ? selectionLeft + selectionWidth : selectionTop + selectionHeight) - minPixelPadding);
+
+ selectionData[axis.coll].push({
+ axis: axis,
+ min: mathMin(selectionMin, selectionMax), // for reversed axes
+ max: mathMax(selectionMin, selectionMax)
+ });
+ runZoom = true;
+ }
+ });
+ if (runZoom) {
+ fireEvent(chart, 'selection', selectionData, function (args) {
+ chart.zoom(extend(args, hasPinched ? { animation: false } : null));
+ });
+ }
+
+ }
+ this.selectionMarker = this.selectionMarker.destroy();
+
+ // Reset scaling preview
+ if (hasPinched) {
+ this.scaleGroups();
+ }
+ }
+
+ // Reset all
+ if (chart) { // it may be destroyed on mouse up - #877
+ css(chart.container, { cursor: chart._cursor });
+ chart.cancelClick = this.hasDragged > 10; // #370
+ chart.mouseIsDown = this.hasDragged = this.hasPinched = false;
+ this.pinchDown = [];
+ }
+ },
+
+ onContainerMouseDown: function (e) {
+
+ e = this.normalize(e);
+
+ // issue #295, dragging not always working in Firefox
+ if (e.preventDefault) {
+ e.preventDefault();
+ }
+
+ this.dragStart(e);
+ },
+
+
+
+ onDocumentMouseUp: function (e) {
+ if (charts[hoverChartIndex]) {
+ charts[hoverChartIndex].pointer.drop(e);
+ }
+ },
+
+ /**
+ * Special handler for mouse move that will hide the tooltip when the mouse leaves the plotarea.
+ * Issue #149 workaround. The mouseleave event does not always fire.
+ */
+ onDocumentMouseMove: function (e) {
+ var chart = this.chart,
+ chartPosition = this.chartPosition;
+
+ e = this.normalize(e, chartPosition);
+
+ // If we're outside, hide the tooltip
+ if (chartPosition && !this.inClass(e.target, 'highcharts-tracker') &&
+ !chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {
+ this.reset();
+ }
+ },
+
+ /**
+ * When mouse leaves the container, hide the tooltip.
+ */
+ onContainerMouseLeave: function (e) {
+ var chart = charts[hoverChartIndex];
+ if (chart && (e.relatedTarget || e.toElement)) { // #4886, MS Touch end fires mouseleave but with no related target
+ chart.pointer.reset();
+ chart.pointer.chartPosition = null; // also reset the chart position, used in #149 fix
+ }
+ },
+
+ // The mousemove, touchmove and touchstart event handler
+ onContainerMouseMove: function (e) {
+
+ var chart = this.chart;
+
+ if (!defined(hoverChartIndex) || !charts[hoverChartIndex] || !charts[hoverChartIndex].mouseIsDown) {
+ hoverChartIndex = chart.index;
+ }
+
+ e = this.normalize(e);
+ e.returnValue = false; // #2251, #3224
+
+ if (chart.mouseIsDown === 'mousedown') {
+ this.drag(e);
+ }
+
+ // Show the tooltip and run mouse over events (#977)
+ if ((this.inClass(e.target, 'highcharts-tracker') ||
+ chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) && !chart.openMenu) {
+ this.runPointActions(e);
+ }
+ },
+
+ /**
+ * Utility to detect whether an element has, or has a parent with, a specific
+ * class name. Used on detection of tracker objects and on deciding whether
+ * hovering the tooltip should cause the active series to mouse out.
+ */
+ inClass: function (element, className) {
+ var elemClassName;
+ while (element) {
+ elemClassName = attr(element, 'class');
+ if (elemClassName) {
+ if (elemClassName.indexOf(className) !== -1) {
+ return true;
+ }
+ if (elemClassName.indexOf(PREFIX + 'container') !== -1) {
+ return false;
+ }
+ }
+ element = element.parentNode;
+ }
+ },
+
+ onTrackerMouseOut: function (e) {
+ var series = this.chart.hoverSeries,
+ relatedTarget = e.relatedTarget || e.toElement;
+
+ if (series && relatedTarget && !series.options.stickyTracking && // #4886
+ !this.inClass(relatedTarget, PREFIX + 'tooltip') &&
+ !this.inClass(relatedTarget, PREFIX + 'series-' + series.index)) { // #2499, #4465
+ series.onMouseOut();
+ }
+ },
+
+ onContainerClick: function (e) {
+ var chart = this.chart,
+ hoverPoint = chart.hoverPoint,
+ plotLeft = chart.plotLeft,
+ plotTop = chart.plotTop;
+
+ e = this.normalize(e);
+
+ if (!chart.cancelClick) {
+
+ // On tracker click, fire the series and point events. #783, #1583
+ if (hoverPoint && this.inClass(e.target, PREFIX + 'tracker')) {
+
+ // the series click event
+ fireEvent(hoverPoint.series, 'click', extend(e, {
+ point: hoverPoint
+ }));
+
+ // the point click event
+ if (chart.hoverPoint) { // it may be destroyed (#1844)
+ hoverPoint.firePointEvent('click', e);
+ }
+
+ // When clicking outside a tracker, fire a chart event
+ } else {
+ extend(e, this.getCoordinates(e));
+
+ // fire a click event in the chart
+ if (chart.isInsidePlot(e.chartX - plotLeft, e.chartY - plotTop)) {
+ fireEvent(chart, 'click', e);
+ }
+ }
+
+
+ }
+ },
+
+ /**
+ * Set the JS DOM events on the container and document. This method should contain
+ * a one-to-one assignment between methods and their handlers. Any advanced logic should
+ * be moved to the handler reflecting the event's name.
+ */
+ setDOMEvents: function () {
+
+ var pointer = this,
+ container = pointer.chart.container;
+
+ container.onmousedown = function (e) {
+ pointer.onContainerMouseDown(e);
+ };
+ container.onmousemove = function (e) {
+ pointer.onContainerMouseMove(e);
+ };
+ container.onclick = function (e) {
+ pointer.onContainerClick(e);
+ };
+ addEvent(container, 'mouseleave', pointer.onContainerMouseLeave);
+ if (chartCount === 1) {
+ addEvent(doc, 'mouseup', pointer.onDocumentMouseUp);
+ }
+ if (hasTouch) {
+ container.ontouchstart = function (e) {
+ pointer.onContainerTouchStart(e);
+ };
+ container.ontouchmove = function (e) {
+ pointer.onContainerTouchMove(e);
+ };
+ if (chartCount === 1) {
+ addEvent(doc, 'touchend', pointer.onDocumentTouchEnd);
+ }
+ }
+
+ },
+
+ /**
+ * Destroys the Pointer object and disconnects DOM events.
+ */
+ destroy: function () {
+ var prop;
+
+ removeEvent(this.chart.container, 'mouseleave', this.onContainerMouseLeave);
+ if (!chartCount) {
+ removeEvent(doc, 'mouseup', this.onDocumentMouseUp);
+ removeEvent(doc, 'touchend', this.onDocumentTouchEnd);
+ }
+
+ // memory and CPU leak
+ clearInterval(this.tooltipTimeout);
+
+ for (prop in this) {
+ this[prop] = null;
+ }
+ }
+ };
+
+
+ /* Support for touch devices */
+ extend(Highcharts.Pointer.prototype, {
+
+ /**
+ * Run translation operations
+ */
+ pinchTranslate: function (pinchDown, touches, transform, selectionMarker, clip, lastValidTouch) {
+ if (this.zoomHor || this.pinchHor) {
+ this.pinchTranslateDirection(true, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);
+ }
+ if (this.zoomVert || this.pinchVert) {
+ this.pinchTranslateDirection(false, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);
+ }
+ },
+
+ /**
+ * Run translation operations for each direction (horizontal and vertical) independently
+ */
+ pinchTranslateDirection: function (horiz, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch, forcedScale) {
+ var chart = this.chart,
+ xy = horiz ? 'x' : 'y',
+ XY = horiz ? 'X' : 'Y',
+ sChartXY = 'chart' + XY,
+ wh = horiz ? 'width' : 'height',
+ plotLeftTop = chart['plot' + (horiz ? 'Left' : 'Top')],
+ selectionWH,
+ selectionXY,
+ clipXY,
+ scale = forcedScale || 1,
+ inverted = chart.inverted,
+ bounds = chart.bounds[horiz ? 'h' : 'v'],
+ singleTouch = pinchDown.length === 1,
+ touch0Start = pinchDown[0][sChartXY],
+ touch0Now = touches[0][sChartXY],
+ touch1Start = !singleTouch && pinchDown[1][sChartXY],
+ touch1Now = !singleTouch && touches[1][sChartXY],
+ outOfBounds,
+ transformScale,
+ scaleKey,
+ setScale = function () {
+ if (!singleTouch && mathAbs(touch0Start - touch1Start) > 20) { // Don't zoom if fingers are too close on this axis
+ scale = forcedScale || mathAbs(touch0Now - touch1Now) / mathAbs(touch0Start - touch1Start);
+ }
+
+ clipXY = ((plotLeftTop - touch0Now) / scale) + touch0Start;
+ selectionWH = chart['plot' + (horiz ? 'Width' : 'Height')] / scale;
+ };
+
+ // Set the scale, first pass
+ setScale();
+
+ selectionXY = clipXY; // the clip position (x or y) is altered if out of bounds, the selection position is not
+
+ // Out of bounds
+ if (selectionXY < bounds.min) {
+ selectionXY = bounds.min;
+ outOfBounds = true;
+ } else if (selectionXY + selectionWH > bounds.max) {
+ selectionXY = bounds.max - selectionWH;
+ outOfBounds = true;
+ }
+
+ // Is the chart dragged off its bounds, determined by dataMin and dataMax?
+ if (outOfBounds) {
+
+ // Modify the touchNow position in order to create an elastic drag movement. This indicates
+ // to the user that the chart is responsive but can't be dragged further.
+ touch0Now -= 0.8 * (touch0Now - lastValidTouch[xy][0]);
+ if (!singleTouch) {
+ touch1Now -= 0.8 * (touch1Now - lastValidTouch[xy][1]);
+ }
+
+ // Set the scale, second pass to adapt to the modified touchNow positions
+ setScale();
+
+ } else {
+ lastValidTouch[xy] = [touch0Now, touch1Now];
+ }
+
+ // Set geometry for clipping, selection and transformation
+ if (!inverted) {
+ clip[xy] = clipXY - plotLeftTop;
+ clip[wh] = selectionWH;
+ }
+ scaleKey = inverted ? (horiz ? 'scaleY' : 'scaleX') : 'scale' + XY;
+ transformScale = inverted ? 1 / scale : scale;
+
+ selectionMarker[wh] = selectionWH;
+ selectionMarker[xy] = selectionXY;
+ transform[scaleKey] = scale;
+ transform['translate' + XY] = (transformScale * plotLeftTop) + (touch0Now - (transformScale * touch0Start));
+ },
+
+ /**
+ * Handle touch events with two touches
+ */
+ pinch: function (e) {
+
+ var self = this,
+ chart = self.chart,
+ pinchDown = self.pinchDown,
+ touches = e.touches,
+ touchesLength = touches.length,
+ lastValidTouch = self.lastValidTouch,
+ hasZoom = self.hasZoom,
+ selectionMarker = self.selectionMarker,
+ transform = {},
+ fireClickEvent = touchesLength === 1 && ((self.inClass(e.target, PREFIX + 'tracker') &&
+ chart.runTrackerClick) || self.runChartClick),
+ clip = {};
+
+ // Don't initiate panning until the user has pinched. This prevents us from
+ // blocking page scrolling as users scroll down a long page (#4210).
+ if (touchesLength > 1) {
+ self.initiated = true;
+ }
+
+ // On touch devices, only proceed to trigger click if a handler is defined
+ if (hasZoom && self.initiated && !fireClickEvent) {
+ e.preventDefault();
+ }
+
+ // Normalize each touch
+ map(touches, function (e) {
+ return self.normalize(e);
+ });
+
+ // Register the touch start position
+ if (e.type === 'touchstart') {
+ each(touches, function (e, i) {
+ pinchDown[i] = { chartX: e.chartX, chartY: e.chartY };
+ });
+ lastValidTouch.x = [pinchDown[0].chartX, pinchDown[1] && pinchDown[1].chartX];
+ lastValidTouch.y = [pinchDown[0].chartY, pinchDown[1] && pinchDown[1].chartY];
+
+ // Identify the data bounds in pixels
+ each(chart.axes, function (axis) {
+ if (axis.zoomEnabled) {
+ var bounds = chart.bounds[axis.horiz ? 'h' : 'v'],
+ minPixelPadding = axis.minPixelPadding,
+ min = axis.toPixels(pick(axis.options.min, axis.dataMin)),
+ max = axis.toPixels(pick(axis.options.max, axis.dataMax)),
+ absMin = mathMin(min, max),
+ absMax = mathMax(min, max);
+
+ // Store the bounds for use in the touchmove handler
+ bounds.min = mathMin(axis.pos, absMin - minPixelPadding);
+ bounds.max = mathMax(axis.pos + axis.len, absMax + minPixelPadding);
+ }
+ });
+ self.res = true; // reset on next move
+
+ // Event type is touchmove, handle panning and pinching
+ } else if (pinchDown.length) { // can be 0 when releasing, if touchend fires first
+
+
+ // Set the marker
+ if (!selectionMarker) {
+ self.selectionMarker = selectionMarker = extend({
+ destroy: noop,
+ touch: true
+ }, chart.plotBox);
+ }
+
+ self.pinchTranslate(pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);
+
+ self.hasPinched = hasZoom;
+
+ // Scale and translate the groups to provide visual feedback during pinching
+ self.scaleGroups(transform, clip);
+
+ // Optionally move the tooltip on touchmove
+ if (!hasZoom && self.followTouchMove && touchesLength === 1) {
+ this.runPointActions(self.normalize(e));
+ } else if (self.res) {
+ self.res = false;
+ this.reset(false, 0);
+ }
+ }
+ },
+
+ /**
+ * General touch handler shared by touchstart and touchmove.
+ */
+ touch: function (e, start) {
+ var chart = this.chart,
+ hasMoved,
+ pinchDown;
+
+ hoverChartIndex = chart.index;
+
+ if (e.touches.length === 1) {
+
+ e = this.normalize(e);
+
+ if (chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop) && !chart.openMenu) {
+
+ // Run mouse events and display tooltip etc
+ if (start) {
+ this.runPointActions(e);
+ }
+
+ // Android fires touchmove events after the touchstart even if the
+ // finger hasn't moved, or moved only a pixel or two. In iOS however,
+ // the touchmove doesn't fire unless the finger moves more than ~4px.
+ // So we emulate this behaviour in Android by checking how much it
+ // moved, and cancelling on small distances. #3450.
+ if (e.type === 'touchmove') {
+ pinchDown = this.pinchDown;
+ hasMoved = pinchDown[0] ? Math.sqrt( // #5266
+ Math.pow(pinchDown[0].chartX - e.chartX, 2) +
+ Math.pow(pinchDown[0].chartY - e.chartY, 2)
+ ) >= 4 : false;
+ }
+
+ if (pick(hasMoved, true)) {
+ this.pinch(e);
+ }
+
+ } else if (start) {
+ // Hide the tooltip on touching outside the plot area (#1203)
+ this.reset();
+ }
+
+ } else if (e.touches.length === 2) {
+ this.pinch(e);
+ }
+ },
+
+ onContainerTouchStart: function (e) {
+ this.touch(e, true);
+ },
+
+ onContainerTouchMove: function (e) {
+ this.touch(e);
+ },
+
+ onDocumentTouchEnd: function (e) {
+ if (charts[hoverChartIndex]) {
+ charts[hoverChartIndex].pointer.drop(e);
+ }
+ }
+
+ });
+ if (win.PointerEvent || win.MSPointerEvent) {
+
+ // The touches object keeps track of the points being touched at all times
+ var touches = {},
+ hasPointerEvent = !!win.PointerEvent,
+ getWebkitTouches = function () {
+ var key,
+ fake = [];
+ fake.item = function (i) {
+ return this[i];
+ };
+ for (key in touches) {
+ if (touches.hasOwnProperty(key)) {
+ fake.push({
+ pageX: touches[key].pageX,
+ pageY: touches[key].pageY,
+ target: touches[key].target
+ });
+ }
+ }
+ return fake;
+ },
+ translateMSPointer = function (e, method, wktype, func) {
+ var p;
+ if ((e.pointerType === 'touch' || e.pointerType === e.MSPOINTER_TYPE_TOUCH) && charts[hoverChartIndex]) {
+ func(e);
+ p = charts[hoverChartIndex].pointer;
+ p[method]({
+ type: wktype,
+ target: e.currentTarget,
+ preventDefault: noop,
+ touches: getWebkitTouches()
+ });
+ }
+ };
+
+ /**
+ * Extend the Pointer prototype with methods for each event handler and more
+ */
+ extend(Pointer.prototype, {
+ onContainerPointerDown: function (e) {
+ translateMSPointer(e, 'onContainerTouchStart', 'touchstart', function (e) {
+ touches[e.pointerId] = { pageX: e.pageX, pageY: e.pageY, target: e.currentTarget };
+ });
+ },
+ onContainerPointerMove: function (e) {
+ translateMSPointer(e, 'onContainerTouchMove', 'touchmove', function (e) {
+ touches[e.pointerId] = { pageX: e.pageX, pageY: e.pageY };
+ if (!touches[e.pointerId].target) {
+ touches[e.pointerId].target = e.currentTarget;
+ }
+ });
+ },
+ onDocumentPointerUp: function (e) {
+ translateMSPointer(e, 'onDocumentTouchEnd', 'touchend', function (e) {
+ delete touches[e.pointerId];
+ });
+ },
+
+ /**
+ * Add or remove the MS Pointer specific events
+ */
+ batchMSEvents: function (fn) {
+ fn(this.chart.container, hasPointerEvent ? 'pointerdown' : 'MSPointerDown', this.onContainerPointerDown);
+ fn(this.chart.container, hasPointerEvent ? 'pointermove' : 'MSPointerMove', this.onContainerPointerMove);
+ fn(doc, hasPointerEvent ? 'pointerup' : 'MSPointerUp', this.onDocumentPointerUp);
+ }
+ });
+
+ // Disable default IE actions for pinch and such on chart element
+ wrap(Pointer.prototype, 'init', function (proceed, chart, options) {
+ proceed.call(this, chart, options);
+ if (this.hasZoom) { // #4014
+ css(chart.container, {
+ '-ms-touch-action': NONE,
+ 'touch-action': NONE
+ });
+ }
+ });
+
+ // Add IE specific touch events to chart
+ wrap(Pointer.prototype, 'setDOMEvents', function (proceed) {
+ proceed.apply(this);
+ if (this.hasZoom || this.followTouchMove) {
+ this.batchMSEvents(addEvent);
+ }
+ });
+ // Destroy MS events also
+ wrap(Pointer.prototype, 'destroy', function (proceed) {
+ this.batchMSEvents(removeEvent);
+ proceed.call(this);
+ });
+ }
+ /**
+ * The overview of the chart's series
+ */
+ var Legend = Highcharts.Legend = function (chart, options) {
+ this.init(chart, options);
+ };
+
+ Legend.prototype = {
+
+ /**
+ * Initialize the legend
+ */
+ init: function (chart, options) {
+
+ var legend = this,
+ itemStyle = options.itemStyle,
+ padding,
+ itemMarginTop = options.itemMarginTop || 0;
+
+ this.options = options;
+
+ if (!options.enabled) {
+ return;
+ }
+
+ legend.itemStyle = itemStyle;
+ legend.itemHiddenStyle = merge(itemStyle, options.itemHiddenStyle);
+ legend.itemMarginTop = itemMarginTop;
+ legend.padding = padding = pick(options.padding, 8);
+ legend.initialItemX = padding;
+ legend.initialItemY = padding - 5; // 5 is the number of pixels above the text
+ legend.maxItemWidth = 0;
+ legend.chart = chart;
+ legend.itemHeight = 0;
+ legend.symbolWidth = pick(options.symbolWidth, 16);
+ legend.pages = [];
+
+
+ // Render it
+ legend.render();
+
+ // move checkboxes
+ addEvent(legend.chart, 'endResize', function () {
+ legend.positionCheckboxes();
+ });
+
+ },
+
+ /**
+ * Set the colors for the legend item
+ * @param {Object} item A Series or Point instance
+ * @param {Object} visible Dimmed or colored
+ */
+ colorizeItem: function (item, visible) {
+ var legend = this,
+ options = legend.options,
+ legendItem = item.legendItem,
+ legendLine = item.legendLine,
+ legendSymbol = item.legendSymbol,
+ hiddenColor = legend.itemHiddenStyle.color,
+ textColor = visible ? options.itemStyle.color : hiddenColor,
+ symbolColor = visible ? (item.legendColor || item.color || '#CCC') : hiddenColor,
+ markerOptions = item.options && item.options.marker,
+ symbolAttr = { fill: symbolColor },
+ key,
+ val;
+
+ if (legendItem) {
+ legendItem.css({ fill: textColor, color: textColor }); // color for #1553, oldIE
+ }
+ if (legendLine) {
+ legendLine.attr({ stroke: symbolColor });
+ }
+
+ if (legendSymbol) {
+
+ // Apply marker options
+ if (markerOptions && legendSymbol.isMarker) { // #585
+ symbolAttr.stroke = symbolColor;
+ markerOptions = item.convertAttribs(markerOptions);
+ for (key in markerOptions) {
+ val = markerOptions[key];
+ if (val !== UNDEFINED) {
+ symbolAttr[key] = val;
+ }
+ }
+ }
+
+ legendSymbol.attr(symbolAttr);
+ }
+ },
+
+ /**
+ * Position the legend item
+ * @param {Object} item A Series or Point instance
+ */
+ positionItem: function (item) {
+ var legend = this,
+ options = legend.options,
+ symbolPadding = options.symbolPadding,
+ ltr = !options.rtl,
+ legendItemPos = item._legendItemPos,
+ itemX = legendItemPos[0],
+ itemY = legendItemPos[1],
+ checkbox = item.checkbox,
+ legendGroup = item.legendGroup;
+
+ if (legendGroup && legendGroup.element) {
+ legendGroup.translate(
+ ltr ? itemX : legend.legendWidth - itemX - 2 * symbolPadding - 4,
+ itemY
+ );
+ }
+
+ if (checkbox) {
+ checkbox.x = itemX;
+ checkbox.y = itemY;
+ }
+ },
+
+ /**
+ * Destroy a single legend item
+ * @param {Object} item The series or point
+ */
+ destroyItem: function (item) {
+ var checkbox = item.checkbox;
+
+ // destroy SVG elements
+ each(['legendItem', 'legendLine', 'legendSymbol', 'legendGroup'], function (key) {
+ if (item[key]) {
+ item[key] = item[key].destroy();
+ }
+ });
+
+ if (checkbox) {
+ discardElement(item.checkbox);
+ }
+ },
+
+ /**
+ * Destroys the legend.
+ */
+ destroy: function () {
+ var legend = this,
+ legendGroup = legend.group,
+ box = legend.box;
+
+ if (box) {
+ legend.box = box.destroy();
+ }
+
+ if (legendGroup) {
+ legend.group = legendGroup.destroy();
+ }
+ },
+
+ /**
+ * Position the checkboxes after the width is determined
+ */
+ positionCheckboxes: function (scrollOffset) {
+ var alignAttr = this.group.alignAttr,
+ translateY,
+ clipHeight = this.clipHeight || this.legendHeight,
+ titleHeight = this.titleHeight;
+
+ if (alignAttr) {
+ translateY = alignAttr.translateY;
+ each(this.allItems, function (item) {
+ var checkbox = item.checkbox,
+ top;
+
+ if (checkbox) {
+ top = translateY + titleHeight + checkbox.y + (scrollOffset || 0) + 3;
+ css(checkbox, {
+ left: (alignAttr.translateX + item.checkboxOffset + checkbox.x - 20) + PX,
+ top: top + PX,
+ display: top > translateY - 6 && top < translateY + clipHeight - 6 ? '' : NONE
+ });
+ }
+ });
+ }
+ },
+
+ /**
+ * Render the legend title on top of the legend
+ */
+ renderTitle: function () {
+ var options = this.options,
+ padding = this.padding,
+ titleOptions = options.title,
+ titleHeight = 0,
+ bBox;
+
+ if (titleOptions.text) {
+ if (!this.title) {
+ this.title = this.chart.renderer.label(titleOptions.text, padding - 3, padding - 4, null, null, null, null, null, 'legend-title')
+ .attr({ zIndex: 1 })
+ .css(titleOptions.style)
+ .add(this.group);
+ }
+ bBox = this.title.getBBox();
+ titleHeight = bBox.height;
+ this.offsetWidth = bBox.width; // #1717
+ this.contentGroup.attr({ translateY: titleHeight });
+ }
+ this.titleHeight = titleHeight;
+ },
+
+ /**
+ * Set the legend item text
+ */
+ setText: function (item) {
+ var options = this.options;
+ item.legendItem.attr({
+ text: options.labelFormat ? format(options.labelFormat, item) : options.labelFormatter.call(item)
+ });
+ },
+
+ /**
+ * Render a single specific legend item
+ * @param {Object} item A series or point
+ */
+ renderItem: function (item) {
+ var legend = this,
+ chart = legend.chart,
+ renderer = chart.renderer,
+ options = legend.options,
+ horizontal = options.layout === 'horizontal',
+ symbolWidth = legend.symbolWidth,
+ symbolPadding = options.symbolPadding,
+ itemStyle = legend.itemStyle,
+ itemHiddenStyle = legend.itemHiddenStyle,
+ padding = legend.padding,
+ itemDistance = horizontal ? pick(options.itemDistance, 20) : 0,
+ ltr = !options.rtl,
+ itemHeight,
+ widthOption = options.width,
+ itemMarginBottom = options.itemMarginBottom || 0,
+ itemMarginTop = legend.itemMarginTop,
+ initialItemX = legend.initialItemX,
+ bBox,
+ itemWidth,
+ li = item.legendItem,
+ series = item.series && item.series.drawLegendSymbol ? item.series : item,
+ seriesOptions = series.options,
+ showCheckbox = legend.createCheckboxForItem && seriesOptions && seriesOptions.showCheckbox,
+ useHTML = options.useHTML;
+
+ if (!li) { // generate it once, later move it
+
+ // Generate the group box
+ // A group to hold the symbol and text. Text is to be appended in Legend class.
+ item.legendGroup = renderer.g('legend-item')
+ .attr({ zIndex: 1 })
+ .add(legend.scrollGroup);
+
+ // Generate the list item text and add it to the group
+ item.legendItem = li = renderer.text(
+ '',
+ ltr ? symbolWidth + symbolPadding : -symbolPadding,
+ legend.baseline || 0,
+ useHTML
+ )
+ .css(merge(item.visible ? itemStyle : itemHiddenStyle)) // merge to prevent modifying original (#1021)
+ .attr({
+ align: ltr ? 'left' : 'right',
+ zIndex: 2
+ })
+ .add(item.legendGroup);
+
+ // Get the baseline for the first item - the font size is equal for all
+ if (!legend.baseline) {
+ legend.fontMetrics = renderer.fontMetrics(itemStyle.fontSize, li);
+ legend.baseline = legend.fontMetrics.f + 3 + itemMarginTop;
+ li.attr('y', legend.baseline);
+ }
+
+ // Draw the legend symbol inside the group box
+ series.drawLegendSymbol(legend, item);
+
+ if (legend.setItemEvents) {
+ legend.setItemEvents(item, li, useHTML, itemStyle, itemHiddenStyle);
+ }
+
+ // add the HTML checkbox on top
+ if (showCheckbox) {
+ legend.createCheckboxForItem(item);
+ }
+ }
+
+ // Colorize the items
+ legend.colorizeItem(item, item.visible);
+
+ // Always update the text
+ legend.setText(item);
+
+ // calculate the positions for the next line
+ bBox = li.getBBox();
+
+ itemWidth = item.checkboxOffset =
+ options.itemWidth ||
+ item.legendItemWidth ||
+ symbolWidth + symbolPadding + bBox.width + itemDistance + (showCheckbox ? 20 : 0);
+ legend.itemHeight = itemHeight = mathRound(item.legendItemHeight || bBox.height);
+
+ // if the item exceeds the width, start a new line
+ if (horizontal && legend.itemX - initialItemX + itemWidth >
+ (widthOption || (chart.chartWidth - 2 * padding - initialItemX - options.x))) {
+ legend.itemX = initialItemX;
+ legend.itemY += itemMarginTop + legend.lastLineHeight + itemMarginBottom;
+ legend.lastLineHeight = 0; // reset for next line (#915, #3976)
+ }
+
+ // If the item exceeds the height, start a new column
+ /*if (!horizontal && legend.itemY + options.y + itemHeight > chart.chartHeight - spacingTop - spacingBottom) {
+ legend.itemY = legend.initialItemY;
+ legend.itemX += legend.maxItemWidth;
+ legend.maxItemWidth = 0;
+ }*/
+
+ // Set the edge positions
+ legend.maxItemWidth = mathMax(legend.maxItemWidth, itemWidth);
+ legend.lastItemY = itemMarginTop + legend.itemY + itemMarginBottom;
+ legend.lastLineHeight = mathMax(itemHeight, legend.lastLineHeight); // #915
+
+ // cache the position of the newly generated or reordered items
+ item._legendItemPos = [legend.itemX, legend.itemY];
+
+ // advance
+ if (horizontal) {
+ legend.itemX += itemWidth;
+
+ } else {
+ legend.itemY += itemMarginTop + itemHeight + itemMarginBottom;
+ legend.lastLineHeight = itemHeight;
+ }
+
+ // the width of the widest item
+ legend.offsetWidth = widthOption || mathMax(
+ (horizontal ? legend.itemX - initialItemX - itemDistance : itemWidth) + padding,
+ legend.offsetWidth
+ );
+ },
+
+ /**
+ * Get all items, which is one item per series for normal series and one item per point
+ * for pie series.
+ */
+ getAllItems: function () {
+ var allItems = [];
+ each(this.chart.series, function (series) {
+ var seriesOptions = series.options;
+
+ // Handle showInLegend. If the series is linked to another series, defaults to false.
+ if (!pick(seriesOptions.showInLegend, !defined(seriesOptions.linkedTo) ? UNDEFINED : false, true)) {
+ return;
+ }
+
+ // use points or series for the legend item depending on legendType
+ allItems = allItems.concat(
+ series.legendItems ||
+ (seriesOptions.legendType === 'point' ?
+ series.data :
+ series)
+ );
+ });
+ return allItems;
+ },
+
+ /**
+ * Adjust the chart margins by reserving space for the legend on only one side
+ * of the chart. If the position is set to a corner, top or bottom is reserved
+ * for horizontal legends and left or right for vertical ones.
+ */
+ adjustMargins: function (margin, spacing) {
+ var chart = this.chart,
+ options = this.options,
+ // Use the first letter of each alignment option in order to detect the side
+ alignment = options.align.charAt(0) + options.verticalAlign.charAt(0) + options.layout.charAt(0); // #4189 - use charAt(x) notation instead of [x] for IE7
+
+ if (!options.floating) {
+
+ each([
+ /(lth|ct|rth)/,
+ /(rtv|rm|rbv)/,
+ /(rbh|cb|lbh)/,
+ /(lbv|lm|ltv)/
+ ], function (alignments, side) {
+ if (alignments.test(alignment) && !defined(margin[side])) {
+ // Now we have detected on which side of the chart we should reserve space for the legend
+ chart[marginNames[side]] = mathMax(
+ chart[marginNames[side]],
+ chart.legend[(side + 1) % 2 ? 'legendHeight' : 'legendWidth'] +
+ [1, -1, -1, 1][side] * options[(side % 2) ? 'x' : 'y'] +
+ pick(options.margin, 12) +
+ spacing[side]
+ );
+ }
+ });
+ }
+ },
+
+ /**
+ * Render the legend. This method can be called both before and after
+ * chart.render. If called after, it will only rearrange items instead
+ * of creating new ones.
+ */
+ render: function () {
+ var legend = this,
+ chart = legend.chart,
+ renderer = chart.renderer,
+ legendGroup = legend.group,
+ allItems,
+ display,
+ legendWidth,
+ legendHeight,
+ box = legend.box,
+ options = legend.options,
+ padding = legend.padding,
+ legendBorderWidth = options.borderWidth,
+ legendBackgroundColor = options.backgroundColor;
+
+ legend.itemX = legend.initialItemX;
+ legend.itemY = legend.initialItemY;
+ legend.offsetWidth = 0;
+ legend.lastItemY = 0;
+
+ if (!legendGroup) {
+ legend.group = legendGroup = renderer.g('legend')
+ .attr({ zIndex: 7 })
+ .add();
+ legend.contentGroup = renderer.g()
+ .attr({ zIndex: 1 }) // above background
+ .add(legendGroup);
+ legend.scrollGroup = renderer.g()
+ .add(legend.contentGroup);
+ }
+
+ legend.renderTitle();
+
+ // add each series or point
+ allItems = legend.getAllItems();
+
+ // sort by legendIndex
+ stableSort(allItems, function (a, b) {
+ return ((a.options && a.options.legendIndex) || 0) - ((b.options && b.options.legendIndex) || 0);
+ });
+
+ // reversed legend
+ if (options.reversed) {
+ allItems.reverse();
+ }
+
+ legend.allItems = allItems;
+ legend.display = display = !!allItems.length;
+
+ // render the items
+ legend.lastLineHeight = 0;
+ each(allItems, function (item) {
+ legend.renderItem(item);
+ });
+
+ // Get the box
+ legendWidth = (options.width || legend.offsetWidth) + padding;
+ legendHeight = legend.lastItemY + legend.lastLineHeight + legend.titleHeight;
+ legendHeight = legend.handleOverflow(legendHeight);
+ legendHeight += padding;
+
+ // Draw the border and/or background
+ if (legendBorderWidth || legendBackgroundColor) {
+
+ if (!box) {
+ legend.box = box = renderer.rect(
+ 0,
+ 0,
+ legendWidth,
+ legendHeight,
+ options.borderRadius,
+ legendBorderWidth || 0
+ ).attr({
+ stroke: options.borderColor,
+ 'stroke-width': legendBorderWidth || 0,
+ fill: legendBackgroundColor || NONE
+ })
+ .add(legendGroup)
+ .shadow(options.shadow);
+ box.isNew = true;
+
+ } else if (legendWidth > 0 && legendHeight > 0) {
+ box[box.isNew ? 'attr' : 'animate'](
+ box.crisp({ width: legendWidth, height: legendHeight })
+ );
+ box.isNew = false;
+ }
+
+ // hide the border if no items
+ box[display ? 'show' : 'hide']();
+ }
+
+ legend.legendWidth = legendWidth;
+ legend.legendHeight = legendHeight;
+
+ // Now that the legend width and height are established, put the items in the
+ // final position
+ each(allItems, function (item) {
+ legend.positionItem(item);
+ });
+
+ // 1.x compatibility: positioning based on style
+ /*var props = ['left', 'right', 'top', 'bottom'],
+ prop,
+ i = 4;
+ while (i--) {
+ prop = props[i];
+ if (options.style[prop] && options.style[prop] !== 'auto') {
+ options[i < 2 ? 'align' : 'verticalAlign'] = prop;
+ options[i < 2 ? 'x' : 'y'] = pInt(options.style[prop]) * (i % 2 ? -1 : 1);
+ }
+ }*/
+
+ if (display) {
+ legendGroup.align(extend({
+ width: legendWidth,
+ height: legendHeight
+ }, options), true, 'spacingBox');
+ }
+
+ if (!chart.isResizing) {
+ this.positionCheckboxes();
+ }
+ },
+
+ /**
+ * Set up the overflow handling by adding navigation with up and down arrows below the
+ * legend.
+ */
+ handleOverflow: function (legendHeight) {
+ var legend = this,
+ chart = this.chart,
+ renderer = chart.renderer,
+ options = this.options,
+ optionsY = options.y,
+ alignTop = options.verticalAlign === 'top',
+ spaceHeight = chart.spacingBox.height + (alignTop ? -optionsY : optionsY) - this.padding,
+ maxHeight = options.maxHeight,
+ clipHeight,
+ clipRect = this.clipRect,
+ navOptions = options.navigation,
+ animation = pick(navOptions.animation, true),
+ arrowSize = navOptions.arrowSize || 12,
+ nav = this.nav,
+ pages = this.pages,
+ padding = this.padding,
+ lastY,
+ allItems = this.allItems,
+ clipToHeight = function (height) {
+ clipRect.attr({
+ height: height
+ });
+
+ // useHTML
+ if (legend.contentGroup.div) {
+ legend.contentGroup.div.style.clip = 'rect(' + padding + 'px,9999px,' + (padding + height) + 'px,0)';
+ }
+ };
+
+
+ // Adjust the height
+ if (options.layout === 'horizontal') {
+ spaceHeight /= 2;
+ }
+ if (maxHeight) {
+ spaceHeight = mathMin(spaceHeight, maxHeight);
+ }
+
+ // Reset the legend height and adjust the clipping rectangle
+ pages.length = 0;
+ if (legendHeight > spaceHeight && navOptions.enabled !== false) {
+
+ this.clipHeight = clipHeight = mathMax(spaceHeight - 20 - this.titleHeight - padding, 0);
+ this.currentPage = pick(this.currentPage, 1);
+ this.fullHeight = legendHeight;
+
+ // Fill pages with Y positions so that the top of each a legend item defines
+ // the scroll top for each page (#2098)
+ each(allItems, function (item, i) {
+ var y = item._legendItemPos[1],
+ h = mathRound(item.legendItem.getBBox().height),
+ len = pages.length;
+
+ if (!len || (y - pages[len - 1] > clipHeight && (lastY || y) !== pages[len - 1])) {
+ pages.push(lastY || y);
+ len++;
+ }
+
+ if (i === allItems.length - 1 && y + h - pages[len - 1] > clipHeight) {
+ pages.push(y);
+ }
+ if (y !== lastY) {
+ lastY = y;
+ }
+ });
+
+ // Only apply clipping if needed. Clipping causes blurred legend in PDF export (#1787)
+ if (!clipRect) {
+ clipRect = legend.clipRect = renderer.clipRect(0, padding, 9999, 0);
+ legend.contentGroup.clip(clipRect);
+ }
+
+ clipToHeight(clipHeight);
+
+ // Add navigation elements
+ if (!nav) {
+ this.nav = nav = renderer.g().attr({ zIndex: 1 }).add(this.group);
+ this.up = renderer.symbol('triangle', 0, 0, arrowSize, arrowSize)
+ .on('click', function () {
+ legend.scroll(-1, animation);
+ })
+ .add(nav);
+ this.pager = renderer.text('', 15, 10)
+ .css(navOptions.style)
+ .add(nav);
+ this.down = renderer.symbol('triangle-down', 0, 0, arrowSize, arrowSize)
+ .on('click', function () {
+ legend.scroll(1, animation);
+ })
+ .add(nav);
+ }
+
+ // Set initial position
+ legend.scroll(0);
+
+ legendHeight = spaceHeight;
+
+ } else if (nav) {
+ clipToHeight(chart.chartHeight);
+ nav.hide();
+ this.scrollGroup.attr({
+ translateY: 1
+ });
+ this.clipHeight = 0; // #1379
+ }
+
+ return legendHeight;
+ },
+
+ /**
+ * Scroll the legend by a number of pages
+ * @param {Object} scrollBy
+ * @param {Object} animation
+ */
+ scroll: function (scrollBy, animation) {
+ var pages = this.pages,
+ pageCount = pages.length,
+ currentPage = this.currentPage + scrollBy,
+ clipHeight = this.clipHeight,
+ navOptions = this.options.navigation,
+ activeColor = navOptions.activeColor,
+ inactiveColor = navOptions.inactiveColor,
+ pager = this.pager,
+ padding = this.padding,
+ scrollOffset;
+
+ // When resizing while looking at the last page
+ if (currentPage > pageCount) {
+ currentPage = pageCount;
+ }
+
+ if (currentPage > 0) {
+
+ if (animation !== UNDEFINED) {
+ setAnimation(animation, this.chart);
+ }
+
+ this.nav.attr({
+ translateX: padding,
+ translateY: clipHeight + this.padding + 7 + this.titleHeight,
+ visibility: VISIBLE
+ });
+ this.up.attr({
+ fill: currentPage === 1 ? inactiveColor : activeColor
+ })
+ .css({
+ cursor: currentPage === 1 ? 'default' : 'pointer'
+ });
+ pager.attr({
+ text: currentPage + '/' + pageCount
+ });
+ this.down.attr({
+ x: 18 + this.pager.getBBox().width, // adjust to text width
+ fill: currentPage === pageCount ? inactiveColor : activeColor
+ })
+ .css({
+ cursor: currentPage === pageCount ? 'default' : 'pointer'
+ });
+
+ scrollOffset = -pages[currentPage - 1] + this.initialItemY;
+
+ this.scrollGroup.animate({
+ translateY: scrollOffset
+ });
+
+ this.currentPage = currentPage;
+ this.positionCheckboxes(scrollOffset);
+ }
+
+ }
+
+ };
+
+ /*
+ * LegendSymbolMixin
+ */
+
+ var LegendSymbolMixin = Highcharts.LegendSymbolMixin = {
+
+ /**
+ * Get the series' symbol in the legend
+ *
+ * @param {Object} legend The legend object
+ * @param {Object} item The series (this) or point
+ */
+ drawRectangle: function (legend, item) {
+ var symbolHeight = legend.options.symbolHeight || legend.fontMetrics.f;
+
+ item.legendSymbol = this.chart.renderer.rect(
+ 0,
+ legend.baseline - symbolHeight + 1, // #3988
+ legend.symbolWidth,
+ symbolHeight,
+ legend.options.symbolRadius || 0
+ ).attr({
+ zIndex: 3
+ }).add(item.legendGroup);
+
+ },
+
+ /**
+ * Get the series' symbol in the legend. This method should be overridable to create custom
+ * symbols through Highcharts.seriesTypes[type].prototype.drawLegendSymbols.
+ *
+ * @param {Object} legend The legend object
+ */
+ drawLineMarker: function (legend) {
+
+ var options = this.options,
+ markerOptions = options.marker,
+ radius,
+ legendSymbol,
+ symbolWidth = legend.symbolWidth,
+ renderer = this.chart.renderer,
+ legendItemGroup = this.legendGroup,
+ verticalCenter = legend.baseline - mathRound(legend.fontMetrics.b * 0.3),
+ attr;
+
+ // Draw the line
+ if (options.lineWidth) {
+ attr = {
+ 'stroke-width': options.lineWidth
+ };
+ if (options.dashStyle) {
+ attr.dashstyle = options.dashStyle;
+ }
+ this.legendLine = renderer.path([
+ M,
+ 0,
+ verticalCenter,
+ L,
+ symbolWidth,
+ verticalCenter
+ ])
+ .attr(attr)
+ .add(legendItemGroup);
+ }
+
+ // Draw the marker
+ if (markerOptions && markerOptions.enabled !== false) {
+ radius = markerOptions.radius;
+ this.legendSymbol = legendSymbol = renderer.symbol(
+ this.symbol,
+ (symbolWidth / 2) - radius,
+ verticalCenter - radius,
+ 2 * radius,
+ 2 * radius,
+ markerOptions
+ )
+ .add(legendItemGroup);
+ legendSymbol.isMarker = true;
+ }
+ }
+ };
+
+ // Workaround for #2030, horizontal legend items not displaying in IE11 Preview,
+ // and for #2580, a similar drawing flaw in Firefox 26.
+ // Explore if there's a general cause for this. The problem may be related
+ // to nested group elements, as the legend item texts are within 4 group elements.
+ if (/Trident\/7\.0/.test(userAgent) || isFirefox) {
+ wrap(Legend.prototype, 'positionItem', function (proceed, item) {
+ var legend = this,
+ runPositionItem = function () { // If chart destroyed in sync, this is undefined (#2030)
+ if (item._legendItemPos) {
+ proceed.call(legend, item);
+ }
+ };
+
+ // Do it now, for export and to get checkbox placement
+ runPositionItem();
+
+ // Do it after to work around the core issue
+ setTimeout(runPositionItem);
+ });
+ }
+ /**
+ * The Chart class
+ * @param {String|Object} renderTo The DOM element to render to, or its id
+ * @param {Object} options
+ * @param {Function} callback Function to run when the chart has loaded
+ */
+ var Chart = Highcharts.Chart = function () {
+ this.getArgs.apply(this, arguments);
+ };
+
+ Highcharts.chart = function (a, b, c) {
+ return new Chart(a, b, c);
+ };
+
+ Chart.prototype = {
+
+ /**
+ * Hook for modules
+ */
+ callbacks: [],
+
+ /**
+ * Handle the arguments passed to the constructor
+ * @returns {Array} Arguments without renderTo
+ */
+ getArgs: function () {
+ var args = [].slice.call(arguments);
+
+ // Remove the optional first argument, renderTo, and
+ // set it on this.
+ if (isString(args[0]) || args[0].nodeName) {
+ this.renderTo = args.shift();
+ }
+ this.init(args[0], args[1]);
+ },
+
+ /**
+ * Initialize the chart
+ */
+ init: function (userOptions, callback) {
+
+ // Handle regular options
+ var options,
+ seriesOptions = userOptions.series; // skip merging data points to increase performance
+
+ userOptions.series = null;
+ options = merge(defaultOptions, userOptions); // do the merge
+ options.series = userOptions.series = seriesOptions; // set back the series data
+ this.userOptions = userOptions;
+
+ var optionsChart = options.chart;
+
+ // Create margin & spacing array
+ this.margin = this.splashArray('margin', optionsChart);
+ this.spacing = this.splashArray('spacing', optionsChart);
+
+ var chartEvents = optionsChart.events;
+
+ //this.runChartClick = chartEvents && !!chartEvents.click;
+ this.bounds = { h: {}, v: {} }; // Pixel data bounds for touch zoom
+
+ this.callback = callback;
+ this.isResizing = 0;
+ this.options = options;
+ //chartTitleOptions = UNDEFINED;
+ //chartSubtitleOptions = UNDEFINED;
+
+ this.axes = [];
+ this.series = [];
+ this.hasCartesianSeries = optionsChart.showAxes;
+ //this.axisOffset = UNDEFINED;
+ //this.maxTicks = UNDEFINED; // handle the greatest amount of ticks on grouped axes
+ //this.inverted = UNDEFINED;
+ //this.loadingShown = UNDEFINED;
+ //this.container = UNDEFINED;
+ //this.chartWidth = UNDEFINED;
+ //this.chartHeight = UNDEFINED;
+ //this.marginRight = UNDEFINED;
+ //this.marginBottom = UNDEFINED;
+ //this.containerWidth = UNDEFINED;
+ //this.containerHeight = UNDEFINED;
+ //this.oldChartWidth = UNDEFINED;
+ //this.oldChartHeight = UNDEFINED;
+
+ //this.renderTo = UNDEFINED;
+ //this.renderToClone = UNDEFINED;
+
+ //this.spacingBox = UNDEFINED
+
+ //this.legend = UNDEFINED;
+
+ // Elements
+ //this.chartBackground = UNDEFINED;
+ //this.plotBackground = UNDEFINED;
+ //this.plotBGImage = UNDEFINED;
+ //this.plotBorder = UNDEFINED;
+ //this.loadingDiv = UNDEFINED;
+ //this.loadingSpan = UNDEFINED;
+
+ var chart = this,
+ eventType;
+
+ // Add the chart to the global lookup
+ chart.index = charts.length;
+ charts.push(chart);
+ chartCount++;
+
+ // Set up auto resize
+ if (optionsChart.reflow !== false) {
+ addEvent(chart, 'load', function () {
+ chart.initReflow();
+ });
+ }
+
+ // Chart event handlers
+ if (chartEvents) {
+ for (eventType in chartEvents) {
+ addEvent(chart, eventType, chartEvents[eventType]);
+ }
+ }
+
+ chart.xAxis = [];
+ chart.yAxis = [];
+
+ // Expose methods and variables
+ chart.animation = useCanVG ? false : pick(optionsChart.animation, true);
+ chart.pointCount = chart.colorCounter = chart.symbolCounter = 0;
+
+ chart.firstRender();
+ },
+
+ /**
+ * Initialize an individual series, called internally before render time
+ */
+ initSeries: function (options) {
+ var chart = this,
+ optionsChart = chart.options.chart,
+ type = options.type || optionsChart.type || optionsChart.defaultSeriesType,
+ series,
+ constr = seriesTypes[type];
+
+ // No such series type
+ if (!constr) {
+ error(17, true);
+ }
+
+ series = new constr();
+ series.init(this, options);
+ return series;
+ },
+
+ /**
+ * Check whether a given point is within the plot area
+ *
+ * @param {Number} plotX Pixel x relative to the plot area
+ * @param {Number} plotY Pixel y relative to the plot area
+ * @param {Boolean} inverted Whether the chart is inverted
+ */
+ isInsidePlot: function (plotX, plotY, inverted) {
+ var x = inverted ? plotY : plotX,
+ y = inverted ? plotX : plotY;
+
+ return x >= 0 &&
+ x <= this.plotWidth &&
+ y >= 0 &&
+ y <= this.plotHeight;
+ },
+
+ /**
+ * Redraw legend, axes or series based on updated data
+ *
+ * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+ * configuration
+ */
+ redraw: function (animation) {
+ var chart = this,
+ axes = chart.axes,
+ series = chart.series,
+ pointer = chart.pointer,
+ legend = chart.legend,
+ redrawLegend = chart.isDirtyLegend,
+ hasStackedSeries,
+ hasDirtyStacks,
+ hasCartesianSeries = chart.hasCartesianSeries,
+ isDirtyBox = chart.isDirtyBox,
+ seriesLength = series.length,
+ i = seriesLength,
+ serie,
+ renderer = chart.renderer,
+ isHiddenChart = renderer.isHidden(),
+ afterRedraw = [];
+
+ setAnimation(animation, chart);
+
+ if (isHiddenChart) {
+ chart.cloneRenderTo();
+ }
+
+ // Adjust title layout (reflow multiline text)
+ chart.layOutTitles();
+
+ // link stacked series
+ while (i--) {
+ serie = series[i];
+
+ if (serie.options.stacking) {
+ hasStackedSeries = true;
+
+ if (serie.isDirty) {
+ hasDirtyStacks = true;
+ break;
+ }
+ }
+ }
+ if (hasDirtyStacks) { // mark others as dirty
+ i = seriesLength;
+ while (i--) {
+ serie = series[i];
+ if (serie.options.stacking) {
+ serie.isDirty = true;
+ }
+ }
+ }
+
+ // Handle updated data in the series
+ each(series, function (serie) {
+ if (serie.isDirty) {
+ if (serie.options.legendType === 'point') {
+ if (serie.updateTotals) {
+ serie.updateTotals();
+ }
+ redrawLegend = true;
+ }
+ }
+ if (serie.isDirtyData) {
+ fireEvent(serie, 'updatedData');
+ }
+ });
+
+ // handle added or removed series
+ if (redrawLegend && legend.options.enabled) { // series or pie points are added or removed
+ // draw legend graphics
+ legend.render();
+
+ chart.isDirtyLegend = false;
+ }
+
+ // reset stacks
+ if (hasStackedSeries) {
+ chart.getStacks();
+ }
+
+
+ if (hasCartesianSeries) {
+ if (!chart.isResizing) {
+
+ // reset maxTicks
+ chart.maxTicks = null;
+
+ // set axes scales
+ each(axes, function (axis) {
+ axis.setScale();
+ });
+ }
+ }
+
+ chart.getMargins(); // #3098
+
+ if (hasCartesianSeries) {
+ // If one axis is dirty, all axes must be redrawn (#792, #2169)
+ each(axes, function (axis) {
+ if (axis.isDirty) {
+ isDirtyBox = true;
+ }
+ });
+
+ // redraw axes
+ each(axes, function (axis) {
+
+ // Fire 'afterSetExtremes' only if extremes are set
+ var key = axis.min + ',' + axis.max;
+ if (axis.extKey !== key) { // #821, #4452
+ axis.extKey = key;
+ afterRedraw.push(function () { // prevent a recursive call to chart.redraw() (#1119)
+ fireEvent(axis, 'afterSetExtremes', extend(axis.eventArgs, axis.getExtremes())); // #747, #751
+ delete axis.eventArgs;
+ });
+ }
+ if (isDirtyBox || hasStackedSeries) {
+ axis.redraw();
+ }
+ });
+ }
+
+ // the plot areas size has changed
+ if (isDirtyBox) {
+ chart.drawChartBox();
+ }
+
+
+ // redraw affected series
+ each(series, function (serie) {
+ if (serie.isDirty && serie.visible &&
+ (!serie.isCartesian || serie.xAxis)) { // issue #153
+ serie.redraw();
+ }
+ });
+
+ // move tooltip or reset
+ if (pointer) {
+ pointer.reset(true);
+ }
+
+ // redraw if canvas
+ renderer.draw();
+
+ // fire the event
+ fireEvent(chart, 'redraw');
+
+ if (isHiddenChart) {
+ chart.cloneRenderTo(true);
+ }
+
+ // Fire callbacks that are put on hold until after the redraw
+ each(afterRedraw, function (callback) {
+ callback.call();
+ });
+ },
+
+ /**
+ * Get an axis, series or point object by id.
+ * @param id {String} The id as given in the configuration options
+ */
+ get: function (id) {
+ var chart = this,
+ axes = chart.axes,
+ series = chart.series;
+
+ var i,
+ j,
+ points;
+
+ // search axes
+ for (i = 0; i < axes.length; i++) {
+ if (axes[i].options.id === id) {
+ return axes[i];
+ }
+ }
+
+ // search series
+ for (i = 0; i < series.length; i++) {
+ if (series[i].options.id === id) {
+ return series[i];
+ }
+ }
+
+ // search points
+ for (i = 0; i < series.length; i++) {
+ points = series[i].points || [];
+ for (j = 0; j < points.length; j++) {
+ if (points[j].id === id) {
+ return points[j];
+ }
+ }
+ }
+ return null;
+ },
+
+ /**
+ * Create the Axis instances based on the config options
+ */
+ getAxes: function () {
+ var chart = this,
+ options = this.options,
+ xAxisOptions = options.xAxis = splat(options.xAxis || {}),
+ yAxisOptions = options.yAxis = splat(options.yAxis || {}),
+ optionsArray;
+
+ // make sure the options are arrays and add some members
+ each(xAxisOptions, function (axis, i) {
+ axis.index = i;
+ axis.isX = true;
+ });
+
+ each(yAxisOptions, function (axis, i) {
+ axis.index = i;
+ });
+
+ // concatenate all axis options into one array
+ optionsArray = xAxisOptions.concat(yAxisOptions);
+
+ each(optionsArray, function (axisOptions) {
+ new Axis(chart, axisOptions); // eslint-disable-line no-new
+ });
+ },
+
+
+ /**
+ * Get the currently selected points from all series
+ */
+ getSelectedPoints: function () {
+ var points = [];
+ each(this.series, function (serie) {
+ points = points.concat(grep(serie.points || [], function (point) {
+ return point.selected;
+ }));
+ });
+ return points;
+ },
+
+ /**
+ * Get the currently selected series
+ */
+ getSelectedSeries: function () {
+ return grep(this.series, function (serie) {
+ return serie.selected;
+ });
+ },
+
+ /**
+ * Show the title and subtitle of the chart
+ *
+ * @param titleOptions {Object} New title options
+ * @param subtitleOptions {Object} New subtitle options
+ *
+ */
+ setTitle: function (titleOptions, subtitleOptions, redraw) {
+ var chart = this,
+ options = chart.options,
+ chartTitleOptions,
+ chartSubtitleOptions;
+
+ chartTitleOptions = options.title = merge(options.title, titleOptions);
+ chartSubtitleOptions = options.subtitle = merge(options.subtitle, subtitleOptions);
+
+ // add title and subtitle
+ each([
+ ['title', titleOptions, chartTitleOptions],
+ ['subtitle', subtitleOptions, chartSubtitleOptions]
+ ], function (arr) {
+ var name = arr[0],
+ title = chart[name],
+ titleOptions = arr[1],
+ chartTitleOptions = arr[2];
+
+ if (title && titleOptions) {
+ chart[name] = title = title.destroy(); // remove old
+ }
+
+ if (chartTitleOptions && chartTitleOptions.text && !title) {
+ chart[name] = chart.renderer.text(
+ chartTitleOptions.text,
+ 0,
+ 0,
+ chartTitleOptions.useHTML
+ )
+ .attr({
+ align: chartTitleOptions.align,
+ 'class': PREFIX + name,
+ zIndex: chartTitleOptions.zIndex || 4
+ })
+ .css(chartTitleOptions.style)
+ .add();
+
+ }
+ });
+ chart.layOutTitles(redraw);
+ },
+
+ /**
+ * Lay out the chart titles and cache the full offset height for use in getMargins
+ */
+ layOutTitles: function (redraw) {
+ var titleOffset = 0,
+ title = this.title,
+ subtitle = this.subtitle,
+ options = this.options,
+ titleOptions = options.title,
+ subtitleOptions = options.subtitle,
+ requiresDirtyBox,
+ renderer = this.renderer,
+ spacingBox = this.spacingBox;
+
+ if (title) {
+ title
+ .css({ width: (titleOptions.width || spacingBox.width + titleOptions.widthAdjust) + PX })
+ .align(extend({
+ y: renderer.fontMetrics(titleOptions.style.fontSize, title).b - 3
+ }, titleOptions), false, spacingBox);
+
+ if (!titleOptions.floating && !titleOptions.verticalAlign) {
+ titleOffset = title.getBBox().height;
+ }
+ }
+ if (subtitle) {
+ subtitle
+ .css({ width: (subtitleOptions.width || spacingBox.width + subtitleOptions.widthAdjust) + PX })
+ .align(extend({
+ y: titleOffset + (titleOptions.margin - 13) + renderer.fontMetrics(subtitleOptions.style.fontSize, title).b
+ }, subtitleOptions), false, spacingBox);
+
+ if (!subtitleOptions.floating && !subtitleOptions.verticalAlign) {
+ titleOffset = mathCeil(titleOffset + subtitle.getBBox().height);
+ }
+ }
+
+ requiresDirtyBox = this.titleOffset !== titleOffset;
+ this.titleOffset = titleOffset; // used in getMargins
+
+ if (!this.isDirtyBox && requiresDirtyBox) {
+ this.isDirtyBox = requiresDirtyBox;
+ // Redraw if necessary (#2719, #2744)
+ if (this.hasRendered && pick(redraw, true) && this.isDirtyBox) {
+ this.redraw();
+ }
+ }
+ },
+
+ /**
+ * Get chart width and height according to options and container size
+ */
+ getChartSize: function () {
+ var chart = this,
+ optionsChart = chart.options.chart,
+ widthOption = optionsChart.width,
+ heightOption = optionsChart.height,
+ renderTo = chart.renderToClone || chart.renderTo;
+
+ // Get inner width and height
+ if (!defined(widthOption)) {
+ chart.containerWidth = getStyle(renderTo, 'width');
+ }
+ if (!defined(heightOption)) {
+ chart.containerHeight = getStyle(renderTo, 'height');
+ }
+
+ chart.chartWidth = mathMax(0, widthOption || chart.containerWidth || 600); // #1393, 1460
+ chart.chartHeight = mathMax(0, pick(heightOption,
+ // the offsetHeight of an empty container is 0 in standard browsers, but 19 in IE7:
+ chart.containerHeight > 19 ? chart.containerHeight : 400));
+ },
+
+ /**
+ * Create a clone of the chart's renderTo div and place it outside the viewport to allow
+ * size computation on chart.render and chart.redraw
+ */
+ cloneRenderTo: function (revert) {
+ var clone = this.renderToClone,
+ container = this.container;
+
+ // Destroy the clone and bring the container back to the real renderTo div
+ if (revert) {
+ if (clone) {
+ this.renderTo.appendChild(container);
+ discardElement(clone);
+ delete this.renderToClone;
+ }
+
+ // Set up the clone
+ } else {
+ if (container && container.parentNode === this.renderTo) {
+ this.renderTo.removeChild(container); // do not clone this
+ }
+ this.renderToClone = clone = this.renderTo.cloneNode(0);
+ css(clone, {
+ position: ABSOLUTE,
+ top: '-9999px',
+ display: 'block' // #833
+ });
+ if (clone.style.setProperty) { // #2631
+ clone.style.setProperty('display', 'block', 'important');
+ }
+ doc.body.appendChild(clone);
+ if (container) {
+ clone.appendChild(container);
+ }
+ }
+ },
+
+ /**
+ * Get the containing element, determine the size and create the inner container
+ * div to hold the chart
+ */
+ getContainer: function () {
+ var chart = this,
+ container,
+ options = chart.options,
+ optionsChart = options.chart,
+ chartWidth,
+ chartHeight,
+ renderTo = chart.renderTo,
+ indexAttrName = 'data-highcharts-chart',
+ oldChartIndex,
+ Ren,
+ containerId = 'highcharts-' + idCounter++;
+
+ if (!renderTo) {
+ chart.renderTo = renderTo = optionsChart.renderTo;
+ }
+
+ if (isString(renderTo)) {
+ chart.renderTo = renderTo = doc.getElementById(renderTo);
+ }
+
+ // Display an error if the renderTo is wrong
+ if (!renderTo) {
+ error(13, true);
+ }
+
+ // If the container already holds a chart, destroy it. The check for hasRendered is there
+ // because web pages that are saved to disk from the browser, will preserve the data-highcharts-chart
+ // attribute and the SVG contents, but not an interactive chart. So in this case,
+ // charts[oldChartIndex] will point to the wrong chart if any (#2609).
+ oldChartIndex = pInt(attr(renderTo, indexAttrName));
+ if (isNumber(oldChartIndex) && charts[oldChartIndex] && charts[oldChartIndex].hasRendered) {
+ charts[oldChartIndex].destroy();
+ }
+
+ // Make a reference to the chart from the div
+ attr(renderTo, indexAttrName, chart.index);
+
+ // remove previous chart
+ renderTo.innerHTML = '';
+
+ // If the container doesn't have an offsetWidth, it has or is a child of a node
+ // that has display:none. We need to temporarily move it out to a visible
+ // state to determine the size, else the legend and tooltips won't render
+ // properly. The allowClone option is used in sparklines as a micro optimization,
+ // saving about 1-2 ms each chart.
+ if (!optionsChart.skipClone && !renderTo.offsetWidth) {
+ chart.cloneRenderTo();
+ }
+
+ // get the width and height
+ chart.getChartSize();
+ chartWidth = chart.chartWidth;
+ chartHeight = chart.chartHeight;
+
+ // create the inner container
+ chart.container = container = createElement(DIV, {
+ className: PREFIX + 'container' +
+ (optionsChart.className ? ' ' + optionsChart.className : ''),
+ id: containerId
+ }, extend({
+ position: RELATIVE,
+ overflow: HIDDEN, // needed for context menu (avoid scrollbars) and
+ // content overflow in IE
+ width: chartWidth + PX,
+ height: chartHeight + PX,
+ textAlign: 'left',
+ lineHeight: 'normal', // #427
+ zIndex: 0, // #1072
+ '-webkit-tap-highlight-color': 'rgba(0,0,0,0)'
+ }, optionsChart.style),
+ chart.renderToClone || renderTo
+ );
+
+ // cache the cursor (#1650)
+ chart._cursor = container.style.cursor;
+
+ // Initialize the renderer
+ Ren = Highcharts[optionsChart.renderer] || Renderer;
+ chart.renderer = new Ren(
+ container,
+ chartWidth,
+ chartHeight,
+ optionsChart.style,
+ optionsChart.forExport,
+ options.exporting && options.exporting.allowHTML
+ );
+
+ if (useCanVG) {
+ // If we need canvg library, extend and configure the renderer
+ // to get the tracker for translating mouse events
+ chart.renderer.create(chart, container, chartWidth, chartHeight);
+ }
+ // Add a reference to the charts index
+ chart.renderer.chartIndex = chart.index;
+ },
+
+ /**
+ * Calculate margins by rendering axis labels in a preliminary position. Title,
+ * subtitle and legend have already been rendered at this stage, but will be
+ * moved into their final positions
+ */
+ getMargins: function (skipAxes) {
+ var chart = this,
+ spacing = chart.spacing,
+ margin = chart.margin,
+ titleOffset = chart.titleOffset;
+
+ chart.resetMargins();
+
+ // Adjust for title and subtitle
+ if (titleOffset && !defined(margin[0])) {
+ chart.plotTop = mathMax(chart.plotTop, titleOffset + chart.options.title.margin + spacing[0]);
+ }
+
+ // Adjust for legend
+ if (chart.legend.display) {
+ chart.legend.adjustMargins(margin, spacing);
+ }
+
+ // adjust for scroller
+ if (chart.extraBottomMargin) {
+ chart.marginBottom += chart.extraBottomMargin;
+ }
+ if (chart.extraTopMargin) {
+ chart.plotTop += chart.extraTopMargin;
+ }
+ if (!skipAxes) {
+ this.getAxisMargins();
+ }
+ },
+
+ getAxisMargins: function () {
+
+ var chart = this,
+ axisOffset = chart.axisOffset = [0, 0, 0, 0], // top, right, bottom, left
+ margin = chart.margin;
+
+ // pre-render axes to get labels offset width
+ if (chart.hasCartesianSeries) {
+ each(chart.axes, function (axis) {
+ if (axis.visible) {
+ axis.getOffset();
+ }
+ });
+ }
+
+ // Add the axis offsets
+ each(marginNames, function (m, side) {
+ if (!defined(margin[side])) {
+ chart[m] += axisOffset[side];
+ }
+ });
+
+ chart.setChartSize();
+
+ },
+
+ /**
+ * Resize the chart to its container if size is not explicitly set
+ */
+ reflow: function (e) {
+ var chart = this,
+ optionsChart = chart.options.chart,
+ renderTo = chart.renderTo,
+ hasUserWidth = defined(optionsChart.width),
+ width = optionsChart.width || getStyle(renderTo, 'width'),
+ height = optionsChart.height || getStyle(renderTo, 'height'),
+ target = e ? e.target : win;
+
+ // Width and height checks for display:none. Target is doc in IE8 and Opera,
+ // win in Firefox, Chrome and IE9.
+ if (!hasUserWidth && !chart.isPrinting && width && height && (target === win || target === doc)) { // #1093
+ if (width !== chart.containerWidth || height !== chart.containerHeight) {
+ clearTimeout(chart.reflowTimeout);
+ // When called from window.resize, e is set, else it's called directly (#2224)
+ chart.reflowTimeout = syncTimeout(function () {
+ if (chart.container) { // It may have been destroyed in the meantime (#1257)
+ chart.setSize(undefined, undefined, false);
+ }
+ }, e ? 100 : 0);
+ }
+ chart.containerWidth = width;
+ chart.containerHeight = height;
+ }
+ },
+
+ /**
+ * Add the event handlers necessary for auto resizing
+ */
+ initReflow: function () {
+ var chart = this,
+ reflow = function (e) {
+ chart.reflow(e);
+ };
+
+
+ addEvent(win, 'resize', reflow);
+ addEvent(chart, 'destroy', function () {
+ removeEvent(win, 'resize', reflow);
+ });
+ },
+
+ /**
+ * Resize the chart to a given width and height
+ * @param {Number} width
+ * @param {Number} height
+ * @param {Object|Boolean} animation
+ */
+ setSize: function (width, height, animation) {
+ var chart = this,
+ renderer = chart.renderer,
+ globalAnimation;
+
+ // Handle the isResizing counter
+ chart.isResizing += 1;
+
+ // set the animation for the current process
+ setAnimation(animation, chart);
+
+ chart.oldChartHeight = chart.chartHeight;
+ chart.oldChartWidth = chart.chartWidth;
+ if (width !== undefined) {
+ chart.options.chart.width = width;
+ }
+ if (height !== undefined) {
+ chart.options.chart.height = height;
+ }
+ chart.getChartSize();
+
+ // Resize the container with the global animation applied if enabled (#2503)
+ globalAnimation = renderer.globalAnimation;
+ (globalAnimation ? animate : css)(chart.container, {
+ width: chart.chartWidth + PX,
+ height: chart.chartHeight + PX
+ }, globalAnimation);
+
+ chart.setChartSize(true);
+ renderer.setSize(chart.chartWidth, chart.chartHeight, animation);
+
+ // handle axes
+ chart.maxTicks = null;
+ each(chart.axes, function (axis) {
+ axis.isDirty = true;
+ axis.setScale();
+ });
+
+ // make sure non-cartesian series are also handled
+ each(chart.series, function (serie) {
+ serie.isDirty = true;
+ });
+
+ chart.isDirtyLegend = true; // force legend redraw
+ chart.isDirtyBox = true; // force redraw of plot and chart border
+
+ chart.layOutTitles(); // #2857
+ chart.getMargins();
+
+ chart.redraw(animation);
+
+
+ chart.oldChartHeight = null;
+ fireEvent(chart, 'resize');
+
+ // Fire endResize and set isResizing back. If animation is disabled, fire without delay
+ syncTimeout(function () {
+ if (chart) {
+ fireEvent(chart, 'endResize', null, function () {
+ chart.isResizing -= 1;
+ });
+ }
+ }, animObject(globalAnimation).duration);
+ },
+
+ /**
+ * Set the public chart properties. This is done before and after the pre-render
+ * to determine margin sizes
+ */
+ setChartSize: function (skipAxes) {
+ var chart = this,
+ inverted = chart.inverted,
+ renderer = chart.renderer,
+ chartWidth = chart.chartWidth,
+ chartHeight = chart.chartHeight,
+ optionsChart = chart.options.chart,
+ spacing = chart.spacing,
+ clipOffset = chart.clipOffset,
+ clipX,
+ clipY,
+ plotLeft,
+ plotTop,
+ plotWidth,
+ plotHeight,
+ plotBorderWidth;
+
+ chart.plotLeft = plotLeft = mathRound(chart.plotLeft);
+ chart.plotTop = plotTop = mathRound(chart.plotTop);
+ chart.plotWidth = plotWidth = mathMax(0, mathRound(chartWidth - plotLeft - chart.marginRight));
+ chart.plotHeight = plotHeight = mathMax(0, mathRound(chartHeight - plotTop - chart.marginBottom));
+
+ chart.plotSizeX = inverted ? plotHeight : plotWidth;
+ chart.plotSizeY = inverted ? plotWidth : plotHeight;
+
+ chart.plotBorderWidth = optionsChart.plotBorderWidth || 0;
+
+ // Set boxes used for alignment
+ chart.spacingBox = renderer.spacingBox = {
+ x: spacing[3],
+ y: spacing[0],
+ width: chartWidth - spacing[3] - spacing[1],
+ height: chartHeight - spacing[0] - spacing[2]
+ };
+ chart.plotBox = renderer.plotBox = {
+ x: plotLeft,
+ y: plotTop,
+ width: plotWidth,
+ height: plotHeight
+ };
+
+ plotBorderWidth = 2 * mathFloor(chart.plotBorderWidth / 2);
+ clipX = mathCeil(mathMax(plotBorderWidth, clipOffset[3]) / 2);
+ clipY = mathCeil(mathMax(plotBorderWidth, clipOffset[0]) / 2);
+ chart.clipBox = {
+ x: clipX,
+ y: clipY,
+ width: mathFloor(chart.plotSizeX - mathMax(plotBorderWidth, clipOffset[1]) / 2 - clipX),
+ height: mathMax(0, mathFloor(chart.plotSizeY - mathMax(plotBorderWidth, clipOffset[2]) / 2 - clipY))
+ };
+
+ if (!skipAxes) {
+ each(chart.axes, function (axis) {
+ axis.setAxisSize();
+ axis.setAxisTranslation();
+ });
+ }
+ },
+
+ /**
+ * Initial margins before auto size margins are applied
+ */
+ resetMargins: function () {
+ var chart = this;
+
+ each(marginNames, function (m, side) {
+ chart[m] = pick(chart.margin[side], chart.spacing[side]);
+ });
+ chart.axisOffset = [0, 0, 0, 0]; // top, right, bottom, left
+ chart.clipOffset = [0, 0, 0, 0];
+ },
+
+ /**
+ * Draw the borders and backgrounds for chart and plot area
+ */
+ drawChartBox: function () {
+ var chart = this,
+ optionsChart = chart.options.chart,
+ renderer = chart.renderer,
+ chartWidth = chart.chartWidth,
+ chartHeight = chart.chartHeight,
+ chartBackground = chart.chartBackground,
+ plotBackground = chart.plotBackground,
+ plotBorder = chart.plotBorder,
+ plotBGImage = chart.plotBGImage,
+ chartBorderWidth = optionsChart.borderWidth || 0,
+ chartBackgroundColor = optionsChart.backgroundColor,
+ plotBackgroundColor = optionsChart.plotBackgroundColor,
+ plotBackgroundImage = optionsChart.plotBackgroundImage,
+ plotBorderWidth = optionsChart.plotBorderWidth || 0,
+ mgn,
+ bgAttr,
+ plotLeft = chart.plotLeft,
+ plotTop = chart.plotTop,
+ plotWidth = chart.plotWidth,
+ plotHeight = chart.plotHeight,
+ plotBox = chart.plotBox,
+ clipRect = chart.clipRect,
+ clipBox = chart.clipBox;
+
+ // Chart area
+ mgn = chartBorderWidth + (optionsChart.shadow ? 8 : 0);
+
+ if (chartBorderWidth || chartBackgroundColor) {
+ if (!chartBackground) {
+
+ bgAttr = {
+ fill: chartBackgroundColor || NONE
+ };
+ if (chartBorderWidth) { // #980
+ bgAttr.stroke = optionsChart.borderColor;
+ bgAttr['stroke-width'] = chartBorderWidth;
+ }
+ chart.chartBackground = renderer.rect(mgn / 2, mgn / 2, chartWidth - mgn, chartHeight - mgn,
+ optionsChart.borderRadius, chartBorderWidth)
+ .attr(bgAttr)
+ .addClass(PREFIX + 'background')
+ .add()
+ .shadow(optionsChart.shadow);
+
+ } else { // resize
+ chartBackground.animate(
+ chartBackground.crisp({ width: chartWidth - mgn, height: chartHeight - mgn })
+ );
+ }
+ }
+
+
+ // Plot background
+ if (plotBackgroundColor) {
+ if (!plotBackground) {
+ chart.plotBackground = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0)
+ .attr({
+ fill: plotBackgroundColor
+ })
+ .add()
+ .shadow(optionsChart.plotShadow);
+ } else {
+ plotBackground.animate(plotBox);
+ }
+ }
+ if (plotBackgroundImage) {
+ if (!plotBGImage) {
+ chart.plotBGImage = renderer.image(plotBackgroundImage, plotLeft, plotTop, plotWidth, plotHeight)
+ .add();
+ } else {
+ plotBGImage.animate(plotBox);
+ }
+ }
+
+ // Plot clip
+ if (!clipRect) {
+ chart.clipRect = renderer.clipRect(clipBox);
+ } else {
+ clipRect.animate({
+ width: clipBox.width,
+ height: clipBox.height
+ });
+ }
+
+ // Plot area border
+ if (plotBorderWidth) {
+ if (!plotBorder) {
+ chart.plotBorder = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0, -plotBorderWidth)
+ .attr({
+ stroke: optionsChart.plotBorderColor,
+ 'stroke-width': plotBorderWidth,
+ fill: NONE,
+ zIndex: 1
+ })
+ .add();
+ } else {
+ plotBorder.strokeWidth = -plotBorderWidth;
+ plotBorder.animate(
+ plotBorder.crisp({ x: plotLeft, y: plotTop, width: plotWidth, height: plotHeight }) //#3282 plotBorder should be negative
+ );
+ }
+ }
+
+ // reset
+ chart.isDirtyBox = false;
+ },
+
+ /**
+ * Detect whether a certain chart property is needed based on inspecting its options
+ * and series. This mainly applies to the chart.invert property, and in extensions to
+ * the chart.angular and chart.polar properties.
+ */
+ propFromSeries: function () {
+ var chart = this,
+ optionsChart = chart.options.chart,
+ klass,
+ seriesOptions = chart.options.series,
+ i,
+ value;
+
+
+ each(['inverted', 'angular', 'polar'], function (key) {
+
+ // The default series type's class
+ klass = seriesTypes[optionsChart.type || optionsChart.defaultSeriesType];
+
+ // Get the value from available chart-wide properties
+ value = (
+ chart[key] || // 1. it is set before
+ optionsChart[key] || // 2. it is set in the options
+ (klass && klass.prototype[key]) // 3. it's default series class requires it
+ );
+
+ // 4. Check if any the chart's series require it
+ i = seriesOptions && seriesOptions.length;
+ while (!value && i--) {
+ klass = seriesTypes[seriesOptions[i].type];
+ if (klass && klass.prototype[key]) {
+ value = true;
+ }
+ }
+
+ // Set the chart property
+ chart[key] = value;
+ });
+
+ },
+
+ /**
+ * Link two or more series together. This is done initially from Chart.render,
+ * and after Chart.addSeries and Series.remove.
+ */
+ linkSeries: function () {
+ var chart = this,
+ chartSeries = chart.series;
+
+ // Reset links
+ each(chartSeries, function (series) {
+ series.linkedSeries.length = 0;
+ });
+
+ // Apply new links
+ each(chartSeries, function (series) {
+ var linkedTo = series.options.linkedTo;
+ if (isString(linkedTo)) {
+ if (linkedTo === ':previous') {
+ linkedTo = chart.series[series.index - 1];
+ } else {
+ linkedTo = chart.get(linkedTo);
+ }
+ if (linkedTo) {
+ linkedTo.linkedSeries.push(series);
+ series.linkedParent = linkedTo;
+ series.visible = pick(series.options.visible, linkedTo.options.visible, series.visible); // #3879
+ }
+ }
+ });
+ },
+
+ /**
+ * Render series for the chart
+ */
+ renderSeries: function () {
+ each(this.series, function (serie) {
+ serie.translate();
+ serie.render();
+ });
+ },
+
+ /**
+ * Render labels for the chart
+ */
+ renderLabels: function () {
+ var chart = this,
+ labels = chart.options.labels;
+ if (labels.items) {
+ each(labels.items, function (label) {
+ var style = extend(labels.style, label.style),
+ x = pInt(style.left) + chart.plotLeft,
+ y = pInt(style.top) + chart.plotTop + 12;
+
+ // delete to prevent rewriting in IE
+ delete style.left;
+ delete style.top;
+
+ chart.renderer.text(
+ label.html,
+ x,
+ y
+ )
+ .attr({ zIndex: 2 })
+ .css(style)
+ .add();
+
+ });
+ }
+ },
+
+ /**
+ * Render all graphics for the chart
+ */
+ render: function () {
+ var chart = this,
+ axes = chart.axes,
+ renderer = chart.renderer,
+ options = chart.options,
+ tempWidth,
+ tempHeight,
+ redoHorizontal,
+ redoVertical;
+
+ // Title
+ chart.setTitle();
+
+
+ // Legend
+ chart.legend = new Legend(chart, options.legend);
+
+ // Get stacks
+ if (chart.getStacks) {
+ chart.getStacks();
+ }
+
+ // Get chart margins
+ chart.getMargins(true);
+ chart.setChartSize();
+
+ // Record preliminary dimensions for later comparison
+ tempWidth = chart.plotWidth;
+ tempHeight = chart.plotHeight = chart.plotHeight - 21; // 21 is the most common correction for X axis labels
+
+ // Get margins by pre-rendering axes
+ each(axes, function (axis) {
+ axis.setScale();
+ });
+ chart.getAxisMargins();
+
+ // If the plot area size has changed significantly, calculate tick positions again
+ redoHorizontal = tempWidth / chart.plotWidth > 1.1;
+ redoVertical = tempHeight / chart.plotHeight > 1.05; // Height is more sensitive
+
+ if (redoHorizontal || redoVertical) {
+
+ chart.maxTicks = null; // reset for second pass
+ each(axes, function (axis) {
+ if ((axis.horiz && redoHorizontal) || (!axis.horiz && redoVertical)) {
+ axis.setTickInterval(true); // update to reflect the new margins
+ }
+ });
+ chart.getMargins(); // second pass to check for new labels
+ }
+
+ // Draw the borders and backgrounds
+ chart.drawChartBox();
+
+
+ // Axes
+ if (chart.hasCartesianSeries) {
+ each(axes, function (axis) {
+ if (axis.visible) {
+ axis.render();
+ }
+ });
+ }
+
+ // The series
+ if (!chart.seriesGroup) {
+ chart.seriesGroup = renderer.g('series-group')
+ .attr({ zIndex: 3 })
+ .add();
+ }
+ chart.renderSeries();
+
+ // Labels
+ chart.renderLabels();
+
+ // Credits
+ chart.showCredits(options.credits);
+
+ // Set flag
+ chart.hasRendered = true;
+
+ },
+
+ /**
+ * Show chart credits based on config options
+ */
+ showCredits: function (credits) {
+ if (credits.enabled && !this.credits) {
+ this.credits = this.renderer.text(
+ credits.text,
+ 0,
+ 0
+ )
+ .on('click', function () {
+ if (credits.href) {
+ win.location.href = credits.href;
+ }
+ })
+ .attr({
+ align: credits.position.align,
+ zIndex: 8
+ })
+ .css(credits.style)
+ .add()
+ .align(credits.position);
+ }
+ },
+
+ /**
+ * Clean up memory usage
+ */
+ destroy: function () {
+ var chart = this,
+ axes = chart.axes,
+ series = chart.series,
+ container = chart.container,
+ i,
+ parentNode = container && container.parentNode;
+
+ // fire the chart.destoy event
+ fireEvent(chart, 'destroy');
+
+ // Delete the chart from charts lookup array
+ charts[chart.index] = UNDEFINED;
+ chartCount--;
+ chart.renderTo.removeAttribute('data-highcharts-chart');
+
+ // remove events
+ removeEvent(chart);
+
+ // ==== Destroy collections:
+ // Destroy axes
+ i = axes.length;
+ while (i--) {
+ axes[i] = axes[i].destroy();
+ }
+
+ // Destroy each series
+ i = series.length;
+ while (i--) {
+ series[i] = series[i].destroy();
+ }
+
+ // ==== Destroy chart properties:
+ each(['title', 'subtitle', 'chartBackground', 'plotBackground', 'plotBGImage',
+ 'plotBorder', 'seriesGroup', 'clipRect', 'credits', 'pointer', 'scroller',
+ 'rangeSelector', 'legend', 'resetZoomButton', 'tooltip', 'renderer'], function (name) {
+ var prop = chart[name];
+
+ if (prop && prop.destroy) {
+ chart[name] = prop.destroy();
+ }
+ });
+
+ // remove container and all SVG
+ if (container) { // can break in IE when destroyed before finished loading
+ container.innerHTML = '';
+ removeEvent(container);
+ if (parentNode) {
+ discardElement(container);
+ }
+
+ }
+
+ // clean it all up
+ for (i in chart) {
+ delete chart[i];
+ }
+
+ },
+
+
+ /**
+ * VML namespaces can't be added until after complete. Listening
+ * for Perini's doScroll hack is not enough.
+ */
+ isReadyToRender: function () {
+ var chart = this;
+
+ // Note: win == win.top is required
+ if ((!hasSVG && (win == win.top && doc.readyState !== 'complete')) || (useCanVG && !win.canvg)) { // eslint-disable-line eqeqeq
+ if (useCanVG) {
+ // Delay rendering until canvg library is downloaded and ready
+ CanVGController.push(function () {
+ chart.firstRender();
+ }, chart.options.global.canvasToolsURL);
+ } else {
+ doc.attachEvent('onreadystatechange', function () {
+ doc.detachEvent('onreadystatechange', chart.firstRender);
+ if (doc.readyState === 'complete') {
+ chart.firstRender();
+ }
+ });
+ }
+ return false;
+ }
+ return true;
+ },
+
+ /**
+ * Prepare for first rendering after all data are loaded
+ */
+ firstRender: function () {
+ var chart = this,
+ options = chart.options;
+
+ // Check whether the chart is ready to render
+ if (!chart.isReadyToRender()) {
+ return;
+ }
+
+ // Create the container
+ chart.getContainer();
+
+ // Run an early event after the container and renderer are established
+ fireEvent(chart, 'init');
+
+
+ chart.resetMargins();
+ chart.setChartSize();
+
+ // Set the common chart properties (mainly invert) from the given series
+ chart.propFromSeries();
+
+ // get axes
+ chart.getAxes();
+
+ // Initialize the series
+ each(options.series || [], function (serieOptions) {
+ chart.initSeries(serieOptions);
+ });
+
+ chart.linkSeries();
+
+ // Run an event after axes and series are initialized, but before render. At this stage,
+ // the series data is indexed and cached in the xData and yData arrays, so we can access
+ // those before rendering. Used in Highstock.
+ fireEvent(chart, 'beforeRender');
+
+ // depends on inverted and on margins being set
+ if (Highcharts.Pointer) {
+ chart.pointer = new Pointer(chart, options);
+ }
+
+ chart.render();
+
+ // add canvas
+ chart.renderer.draw();
+
+ // Fire the load event if there are no external images
+ if (!chart.renderer.imgCount && chart.onload) {
+ chart.onload();
+ }
+
+ // If the chart was rendered outside the top container, put it back in (#3679)
+ chart.cloneRenderTo(true);
+
+ },
+
+ /**
+ * On chart load
+ */
+ onload: function () {
+ var chart = this;
+
+ // Run callbacks
+ each([this.callback].concat(this.callbacks), function (fn) {
+ if (fn && chart.index !== undefined) { // Chart destroyed in its own callback (#3600)
+ fn.apply(chart, [chart]);
+ }
+ });
+
+ fireEvent(chart, 'load');
+
+ // Don't run again
+ this.onload = null;
+ },
+
+ /**
+ * Creates arrays for spacing and margin from given options.
+ */
+ splashArray: function (target, options) {
+ var oVar = options[target],
+ tArray = isObject(oVar) ? oVar : [oVar, oVar, oVar, oVar];
+
+ return [pick(options[target + 'Top'], tArray[0]),
+ pick(options[target + 'Right'], tArray[1]),
+ pick(options[target + 'Bottom'], tArray[2]),
+ pick(options[target + 'Left'], tArray[3])];
+ }
+ }; // end Chart
+
+ var CenteredSeriesMixin = Highcharts.CenteredSeriesMixin = {
+ /**
+ * Get the center of the pie based on the size and center options relative to the
+ * plot area. Borrowed by the polar and gauge series types.
+ */
+ getCenter: function () {
+
+ var options = this.options,
+ chart = this.chart,
+ slicingRoom = 2 * (options.slicedOffset || 0),
+ handleSlicingRoom,
+ plotWidth = chart.plotWidth - 2 * slicingRoom,
+ plotHeight = chart.plotHeight - 2 * slicingRoom,
+ centerOption = options.center,
+ positions = [pick(centerOption[0], '50%'), pick(centerOption[1], '50%'), options.size || '100%', options.innerSize || 0],
+ smallestSize = mathMin(plotWidth, plotHeight),
+ i,
+ value;
+
+ for (i = 0; i < 4; ++i) {
+ value = positions[i];
+ handleSlicingRoom = i < 2 || (i === 2 && /%$/.test(value));
+
+ // i == 0: centerX, relative to width
+ // i == 1: centerY, relative to height
+ // i == 2: size, relative to smallestSize
+ // i == 3: innerSize, relative to size
+ positions[i] = relativeLength(value, [plotWidth, plotHeight, smallestSize, positions[2]][i]) +
+ (handleSlicingRoom ? slicingRoom : 0);
+
+ }
+ // innerSize cannot be larger than size (#3632)
+ if (positions[3] > positions[2]) {
+ positions[3] = positions[2];
+ }
+ return positions;
+ }
+ };
+
+ /**
+ * The Point object and prototype. Inheritable and used as base for PiePoint
+ */
+ var Point = function () {};
+ Point.prototype = {
+
+ /**
+ * Initialize the point
+ * @param {Object} series The series object containing this point
+ * @param {Object} options The data in either number, array or object format
+ */
+ init: function (series, options, x) {
+
+ var point = this,
+ colors;
+ point.series = series;
+ point.color = series.color; // #3445
+ point.applyOptions(options, x);
+ point.pointAttr = {};
+
+ if (series.options.colorByPoint) {
+ colors = series.options.colors || series.chart.options.colors;
+ point.color = point.color || colors[series.colorCounter++];
+ // loop back to zero
+ if (series.colorCounter === colors.length) {
+ series.colorCounter = 0;
+ }
+ }
+
+ series.chart.pointCount++;
+ return point;
+ },
+ /**
+ * Apply the options containing the x and y data and possible some extra properties.
+ * This is called on point init or from point.update.
+ *
+ * @param {Object} options
+ */
+ applyOptions: function (options, x) {
+ var point = this,
+ series = point.series,
+ pointValKey = series.options.pointValKey || series.pointValKey;
+
+ options = Point.prototype.optionsToObject.call(this, options);
+
+ // copy options directly to point
+ extend(point, options);
+ point.options = point.options ? extend(point.options, options) : options;
+
+ // For higher dimension series types. For instance, for ranges, point.y is mapped to point.low.
+ if (pointValKey) {
+ point.y = point[pointValKey];
+ }
+ point.isNull = point.x === null || !isNumber(point.y, true); // #3571, check for NaN
+
+ // If no x is set by now, get auto incremented value. All points must have an
+ // x value, however the y value can be null to create a gap in the series
+ if (point.x === undefined && series) {
+ if (x === undefined) {
+ point.x = series.autoIncrement(point);
+ } else {
+ point.x = x;
+ }
+ }
+
+ // Write the last point's name to the names array
+ if (series.xAxis && series.xAxis.names) {
+ series.xAxis.names[point.x] = point.name;
+ }
+
+ return point;
+ },
+
+ /**
+ * Transform number or array configs into objects
+ */
+ optionsToObject: function (options) {
+ var ret = {},
+ series = this.series,
+ keys = series.options.keys,
+ pointArrayMap = keys || series.pointArrayMap || ['y'],
+ valueCount = pointArrayMap.length,
+ firstItemType,
+ i = 0,
+ j = 0;
+
+ if (isNumber(options) || options === null) {
+ ret[pointArrayMap[0]] = options;
+
+ } else if (isArray(options)) {
+ // with leading x value
+ if (!keys && options.length > valueCount) {
+ firstItemType = typeof options[0];
+ if (firstItemType === 'string') {
+ ret.name = options[0];
+ } else if (firstItemType === 'number') {
+ ret.x = options[0];
+ }
+ i++;
+ }
+ while (j < valueCount) {
+ if (!keys || options[i] !== undefined) { // Skip undefined positions for keys
+ ret[pointArrayMap[j]] = options[i];
+ }
+ i++;
+ j++;
+ }
+ } else if (typeof options === 'object') {
+ ret = options;
+
+ // This is the fastest way to detect if there are individual point dataLabels that need
+ // to be considered in drawDataLabels. These can only occur in object configs.
+ if (options.dataLabels) {
+ series._hasPointLabels = true;
+ }
+
+ // Same approach as above for markers
+ if (options.marker) {
+ series._hasPointMarkers = true;
+ }
+ }
+ return ret;
+ },
+
+ /**
+ * Destroy a point to clear memory. Its reference still stays in series.data.
+ */
+ destroy: function () {
+ var point = this,
+ series = point.series,
+ chart = series.chart,
+ hoverPoints = chart.hoverPoints,
+ prop;
+
+ chart.pointCount--;
+
+ if (hoverPoints) {
+ point.setState();
+ erase(hoverPoints, point);
+ if (!hoverPoints.length) {
+ chart.hoverPoints = null;
+ }
+
+ }
+ if (point === chart.hoverPoint) {
+ point.onMouseOut();
+ }
+
+ // remove all events
+ if (point.graphic || point.dataLabel) { // removeEvent and destroyElements are performance expensive
+ removeEvent(point);
+ point.destroyElements();
+ }
+
+ if (point.legendItem) { // pies have legend items
+ chart.legend.destroyItem(point);
+ }
+
+ for (prop in point) {
+ point[prop] = null;
+ }
+
+
+ },
+
+ /**
+ * Destroy SVG elements associated with the point
+ */
+ destroyElements: function () {
+ var point = this,
+ props = ['graphic', 'dataLabel', 'dataLabelUpper', 'connector', 'shadowGroup'],
+ prop,
+ i = 6;
+ while (i--) {
+ prop = props[i];
+ if (point[prop]) {
+ point[prop] = point[prop].destroy();
+ }
+ }
+ },
+
+ /**
+ * Return the configuration hash needed for the data label and tooltip formatters
+ */
+ getLabelConfig: function () {
+ return {
+ x: this.category,
+ y: this.y,
+ color: this.color,
+ key: this.name || this.category,
+ series: this.series,
+ point: this,
+ percentage: this.percentage,
+ total: this.total || this.stackTotal
+ };
+ },
+
+ /**
+ * Extendable method for formatting each point's tooltip line
+ *
+ * @return {String} A string to be concatenated in to the common tooltip text
+ */
+ tooltipFormatter: function (pointFormat) {
+
+ // Insert options for valueDecimals, valuePrefix, and valueSuffix
+ var series = this.series,
+ seriesTooltipOptions = series.tooltipOptions,
+ valueDecimals = pick(seriesTooltipOptions.valueDecimals, ''),
+ valuePrefix = seriesTooltipOptions.valuePrefix || '',
+ valueSuffix = seriesTooltipOptions.valueSuffix || '';
+
+ // Loop over the point array map and replace unformatted values with sprintf formatting markup
+ each(series.pointArrayMap || ['y'], function (key) {
+ key = '{point.' + key; // without the closing bracket
+ if (valuePrefix || valueSuffix) {
+ pointFormat = pointFormat.replace(key + '}', valuePrefix + key + '}' + valueSuffix);
+ }
+ pointFormat = pointFormat.replace(key + '}', key + ':,.' + valueDecimals + 'f}');
+ });
+
+ return format(pointFormat, {
+ point: this,
+ series: this.series
+ });
+ },
+
+ /**
+ * Fire an event on the Point object.
+ * @param {String} eventType
+ * @param {Object} eventArgs Additional event arguments
+ * @param {Function} defaultFunction Default event handler
+ */
+ firePointEvent: function (eventType, eventArgs, defaultFunction) {
+ var point = this,
+ series = this.series,
+ seriesOptions = series.options;
+
+ // load event handlers on demand to save time on mouseover/out
+ if (seriesOptions.point.events[eventType] || (point.options && point.options.events && point.options.events[eventType])) {
+ this.importEvents();
+ }
+
+ // add default handler if in selection mode
+ if (eventType === 'click' && seriesOptions.allowPointSelect) {
+ defaultFunction = function (event) {
+ // Control key is for Windows, meta (= Cmd key) for Mac, Shift for Opera
+ if (point.select) { // Could be destroyed by prior event handlers (#2911)
+ point.select(null, event.ctrlKey || event.metaKey || event.shiftKey);
+ }
+ };
+ }
+
+ fireEvent(this, eventType, eventArgs, defaultFunction);
+ },
+ visible: true
+ };/**
+ * @classDescription The base function which all other series types inherit from. The data in the series is stored
+ * in various arrays.
+ *
+ * - First, series.options.data contains all the original config options for
+ * each point whether added by options or methods like series.addPoint.
+ * - Next, series.data contains those values converted to points, but in case the series data length
+ * exceeds the cropThreshold, or if the data is grouped, series.data doesn't contain all the points. It
+ * only contains the points that have been created on demand.
+ * - Then there's series.points that contains all currently visible point objects. In case of cropping,
+ * the cropped-away points are not part of this array. The series.points array starts at series.cropStart
+ * compared to series.data and series.options.data. If however the series data is grouped, these can't
+ * be correlated one to one.
+ * - series.xData and series.processedXData contain clean x values, equivalent to series.data and series.points.
+ * - series.yData and series.processedYData contain clean x values, equivalent to series.data and series.points.
+ *
+ * @param {Object} chart
+ * @param {Object} options
+ */
+ var Series = Highcharts.Series = function () {};
+
+ Series.prototype = {
+
+ isCartesian: true,
+ type: 'line',
+ pointClass: Point,
+ sorted: true, // requires the data to be sorted
+ requireSorting: true,
+ pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+ stroke: 'lineColor',
+ 'stroke-width': 'lineWidth',
+ fill: 'fillColor',
+ r: 'radius'
+ },
+ directTouch: false,
+ axisTypes: ['xAxis', 'yAxis'],
+ colorCounter: 0,
+ parallelArrays: ['x', 'y'], // each point's x and y values are stored in this.xData and this.yData
+ init: function (chart, options) {
+ var series = this,
+ eventType,
+ events,
+ chartSeries = chart.series,
+ sortByIndex = function (a, b) {
+ return pick(a.options.index, a._i) - pick(b.options.index, b._i);
+ };
+
+ series.chart = chart;
+ series.options = options = series.setOptions(options); // merge with plotOptions
+ series.linkedSeries = [];
+
+ // bind the axes
+ series.bindAxes();
+
+ // set some variables
+ extend(series, {
+ name: options.name,
+ state: NORMAL_STATE,
+ pointAttr: {},
+ visible: options.visible !== false, // true by default
+ selected: options.selected === true // false by default
+ });
+
+ // special
+ if (useCanVG) {
+ options.animation = false;
+ }
+
+ // register event listeners
+ events = options.events;
+ for (eventType in events) {
+ addEvent(series, eventType, events[eventType]);
+ }
+ if (
+ (events && events.click) ||
+ (options.point && options.point.events && options.point.events.click) ||
+ options.allowPointSelect
+ ) {
+ chart.runTrackerClick = true;
+ }
+
+ series.getColor();
+ series.getSymbol();
+
+ // Set the data
+ each(series.parallelArrays, function (key) {
+ series[key + 'Data'] = [];
+ });
+ series.setData(options.data, false);
+
+ // Mark cartesian
+ if (series.isCartesian) {
+ chart.hasCartesianSeries = true;
+ }
+
+ // Register it in the chart
+ chartSeries.push(series);
+ series._i = chartSeries.length - 1;
+
+ // Sort series according to index option (#248, #1123, #2456)
+ stableSort(chartSeries, sortByIndex);
+ if (this.yAxis) {
+ stableSort(this.yAxis.series, sortByIndex);
+ }
+
+ each(chartSeries, function (series, i) {
+ series.index = i;
+ series.name = series.name || 'Series ' + (i + 1);
+ });
+
+ },
+
+ /**
+ * Set the xAxis and yAxis properties of cartesian series, and register the series
+ * in the axis.series array
+ */
+ bindAxes: function () {
+ var series = this,
+ seriesOptions = series.options,
+ chart = series.chart,
+ axisOptions;
+
+ each(series.axisTypes || [], function (AXIS) { // repeat for xAxis and yAxis
+
+ each(chart[AXIS], function (axis) { // loop through the chart's axis objects
+ axisOptions = axis.options;
+
+ // apply if the series xAxis or yAxis option mathches the number of the
+ // axis, or if undefined, use the first axis
+ if ((seriesOptions[AXIS] === axisOptions.index) ||
+ (seriesOptions[AXIS] !== UNDEFINED && seriesOptions[AXIS] === axisOptions.id) ||
+ (seriesOptions[AXIS] === UNDEFINED && axisOptions.index === 0)) {
+
+ // register this series in the axis.series lookup
+ axis.series.push(series);
+
+ // set this series.xAxis or series.yAxis reference
+ series[AXIS] = axis;
+
+ // mark dirty for redraw
+ axis.isDirty = true;
+ }
+ });
+
+ // The series needs an X and an Y axis
+ if (!series[AXIS] && series.optionalAxis !== AXIS) {
+ error(18, true);
+ }
+
+ });
+ },
+
+ /**
+ * For simple series types like line and column, the data values are held in arrays like
+ * xData and yData for quick lookup to find extremes and more. For multidimensional series
+ * like bubble and map, this can be extended with arrays like zData and valueData by
+ * adding to the series.parallelArrays array.
+ */
+ updateParallelArrays: function (point, i) {
+ var series = point.series,
+ args = arguments,
+ fn = isNumber(i) ?
+ // Insert the value in the given position
+ function (key) {
+ var val = key === 'y' && series.toYData ? series.toYData(point) : point[key];
+ series[key + 'Data'][i] = val;
+ } :
+ // Apply the method specified in i with the following arguments as arguments
+ function (key) {
+ Array.prototype[i].apply(series[key + 'Data'], Array.prototype.slice.call(args, 2));
+ };
+
+ each(series.parallelArrays, fn);
+ },
+
+ /**
+ * Return an auto incremented x value based on the pointStart and pointInterval options.
+ * This is only used if an x value is not given for the point that calls autoIncrement.
+ */
+ autoIncrement: function (point) {
+
+ var options = this.options,
+ xIncrement = this.xIncrement,
+ date,
+ pointInterval,
+ pointIntervalUnit = options.pointIntervalUnit,
+ xAxis = this.xAxis,
+ explicitCategories,
+ names,
+ nameX;
+
+ xIncrement = pick(xIncrement, options.pointStart, 0);
+
+ this.pointInterval = pointInterval = pick(this.pointInterval, options.pointInterval, 1);
+
+ // When a point name is given and no x, search for the name in the existing categories,
+ // or if categories aren't provided, search names or create a new category (#2522).
+ if (xAxis && xAxis.categories && point.name) {
+ this.requireSorting = false;
+ explicitCategories = isArray(xAxis.categories);
+ names = explicitCategories ? xAxis.categories : xAxis.names;
+ nameX = inArray(point.name, names); // #2522
+ if (nameX === -1) { // The name is not found in currenct categories
+ if (!explicitCategories) {
+ xIncrement = names.length;
+ }
+ } else {
+ xIncrement = nameX;
+ }
+ }
+
+ // Added code for pointInterval strings
+ if (pointIntervalUnit) {
+ date = new Date(xIncrement);
+
+ if (pointIntervalUnit === 'day') {
+ date = +date[setDate](date[getDate]() + pointInterval);
+ } else if (pointIntervalUnit === 'month') {
+ date = +date[setMonth](date[getMonth]() + pointInterval);
+ } else if (pointIntervalUnit === 'year') {
+ date = +date[setFullYear](date[getFullYear]() + pointInterval);
+ }
+ pointInterval = date - xIncrement;
+ }
+
+ this.xIncrement = xIncrement + pointInterval;
+ return xIncrement;
+ },
+
+ /**
+ * Set the series options by merging from the options tree
+ * @param {Object} itemOptions
+ */
+ setOptions: function (itemOptions) {
+ var chart = this.chart,
+ chartOptions = chart.options,
+ plotOptions = chartOptions.plotOptions,
+ userOptions = chart.userOptions || {},
+ userPlotOptions = userOptions.plotOptions || {},
+ typeOptions = plotOptions[this.type],
+ options,
+ zones;
+
+ this.userOptions = itemOptions;
+
+ // General series options take precedence over type options because otherwise, default
+ // type options like column.animation would be overwritten by the general option.
+ // But issues have been raised here (#3881), and the solution may be to distinguish
+ // between default option and userOptions like in the tooltip below.
+ options = merge(
+ typeOptions,
+ plotOptions.series,
+ itemOptions
+ );
+
+ // The tooltip options are merged between global and series specific options
+ this.tooltipOptions = merge(
+ defaultOptions.tooltip,
+ defaultOptions.plotOptions[this.type].tooltip,
+ userOptions.tooltip,
+ userPlotOptions.series && userPlotOptions.series.tooltip,
+ userPlotOptions[this.type] && userPlotOptions[this.type].tooltip,
+ itemOptions.tooltip
+ );
+
+ // Delete marker object if not allowed (#1125)
+ if (typeOptions.marker === null) {
+ delete options.marker;
+ }
+
+ // Handle color zones
+ this.zoneAxis = options.zoneAxis;
+ zones = this.zones = (options.zones || []).slice();
+ if ((options.negativeColor || options.negativeFillColor) && !options.zones) {
+ zones.push({
+ value: options[this.zoneAxis + 'Threshold'] || options.threshold || 0,
+ color: options.negativeColor,
+ fillColor: options.negativeFillColor
+ });
+ }
+ if (zones.length) { // Push one extra zone for the rest
+ if (defined(zones[zones.length - 1].value)) {
+ zones.push({
+ color: this.color,
+ fillColor: this.fillColor
+ });
+ }
+ }
+ return options;
+ },
+
+ getCyclic: function (prop, value, defaults) {
+ var i,
+ userOptions = this.userOptions,
+ indexName = '_' + prop + 'Index',
+ counterName = prop + 'Counter';
+
+ if (!value) {
+ if (defined(userOptions[indexName])) { // after Series.update()
+ i = userOptions[indexName];
+ } else {
+ userOptions[indexName] = i = this.chart[counterName] % defaults.length;
+ this.chart[counterName] += 1;
+ }
+ value = defaults[i];
+ }
+ this[prop] = value;
+ },
+
+ /**
+ * Get the series' color
+ */
+ getColor: function () {
+ if (this.options.colorByPoint) {
+ this.options.color = null; // #4359, selected slice got series.color even when colorByPoint was set.
+ } else {
+ this.getCyclic('color', this.options.color || defaultPlotOptions[this.type].color, this.chart.options.colors);
+ }
+ },
+ /**
+ * Get the series' symbol
+ */
+ getSymbol: function () {
+ var seriesMarkerOption = this.options.marker;
+
+ this.getCyclic('symbol', seriesMarkerOption.symbol, this.chart.options.symbols);
+
+ // don't substract radius in image symbols (#604)
+ if (/^url/.test(this.symbol)) {
+ seriesMarkerOption.radius = 0;
+ }
+ },
+
+ drawLegendSymbol: LegendSymbolMixin.drawLineMarker,
+
+ /**
+ * Replace the series data with a new set of data
+ * @param {Object} data
+ * @param {Object} redraw
+ */
+ setData: function (data, redraw, animation, updatePoints) {
+ var series = this,
+ oldData = series.points,
+ oldDataLength = (oldData && oldData.length) || 0,
+ dataLength,
+ options = series.options,
+ chart = series.chart,
+ firstPoint = null,
+ xAxis = series.xAxis,
+ i,
+ turboThreshold = options.turboThreshold,
+ pt,
+ xData = this.xData,
+ yData = this.yData,
+ pointArrayMap = series.pointArrayMap,
+ valueCount = pointArrayMap && pointArrayMap.length;
+
+ data = data || [];
+ dataLength = data.length;
+ redraw = pick(redraw, true);
+
+ // If the point count is the same as is was, just run Point.update which is
+ // cheaper, allows animation, and keeps references to points.
+ if (updatePoints !== false && dataLength && oldDataLength === dataLength && !series.cropped && !series.hasGroupedData && series.visible) {
+ each(data, function (point, i) {
+ // .update doesn't exist on a linked, hidden series (#3709)
+ if (oldData[i].update && point !== options.data[i]) {
+ oldData[i].update(point, false, null, false);
+ }
+ });
+
+ } else {
+
+ // Reset properties
+ series.xIncrement = null;
+
+ series.colorCounter = 0; // for series with colorByPoint (#1547)
+
+ // Update parallel arrays
+ each(this.parallelArrays, function (key) {
+ series[key + 'Data'].length = 0;
+ });
+
+ // In turbo mode, only one- or twodimensional arrays of numbers are allowed. The
+ // first value is tested, and we assume that all the rest are defined the same
+ // way. Although the 'for' loops are similar, they are repeated inside each
+ // if-else conditional for max performance.
+ if (turboThreshold && dataLength > turboThreshold) {
+
+ // find the first non-null point
+ i = 0;
+ while (firstPoint === null && i < dataLength) {
+ firstPoint = data[i];
+ i++;
+ }
+
+
+ if (isNumber(firstPoint)) { // assume all points are numbers
+ var x = pick(options.pointStart, 0),
+ pointInterval = pick(options.pointInterval, 1);
+
+ for (i = 0; i < dataLength; i++) {
+ xData[i] = x;
+ yData[i] = data[i];
+ x += pointInterval;
+ }
+ series.xIncrement = x;
+ } else if (isArray(firstPoint)) { // assume all points are arrays
+ if (valueCount) { // [x, low, high] or [x, o, h, l, c]
+ for (i = 0; i < dataLength; i++) {
+ pt = data[i];
+ xData[i] = pt[0];
+ yData[i] = pt.slice(1, valueCount + 1);
+ }
+ } else { // [x, y]
+ for (i = 0; i < dataLength; i++) {
+ pt = data[i];
+ xData[i] = pt[0];
+ yData[i] = pt[1];
+ }
+ }
+ } else {
+ error(12); // Highcharts expects configs to be numbers or arrays in turbo mode
+ }
+ } else {
+ for (i = 0; i < dataLength; i++) {
+ if (data[i] !== UNDEFINED) { // stray commas in oldIE
+ pt = { series: series };
+ series.pointClass.prototype.applyOptions.apply(pt, [data[i]]);
+ series.updateParallelArrays(pt, i);
+ }
+ }
+ }
+
+ // Forgetting to cast strings to numbers is a common caveat when handling CSV or JSON
+ if (isString(yData[0])) {
+ error(14, true);
+ }
+
+ series.data = [];
+ series.options.data = series.userOptions.data = data;
+
+ // destroy old points
+ i = oldDataLength;
+ while (i--) {
+ if (oldData[i] && oldData[i].destroy) {
+ oldData[i].destroy();
+ }
+ }
+
+ // reset minRange (#878)
+ if (xAxis) {
+ xAxis.minRange = xAxis.userMinRange;
+ }
+
+ // redraw
+ series.isDirty = series.isDirtyData = chart.isDirtyBox = true;
+ animation = false;
+ }
+
+ // Typically for pie series, points need to be processed and generated
+ // prior to rendering the legend
+ if (options.legendType === 'point') {
+ this.processData();
+ this.generatePoints();
+ }
+
+ if (redraw) {
+ chart.redraw(animation);
+ }
+ },
+
+ /**
+ * Process the data by cropping away unused data points if the series is longer
+ * than the crop threshold. This saves computing time for lage series.
+ */
+ processData: function (force) {
+ var series = this,
+ processedXData = series.xData, // copied during slice operation below
+ processedYData = series.yData,
+ dataLength = processedXData.length,
+ croppedData,
+ cropStart = 0,
+ cropped,
+ distance,
+ closestPointRange,
+ xAxis = series.xAxis,
+ i, // loop variable
+ options = series.options,
+ cropThreshold = options.cropThreshold,
+ getExtremesFromAll = series.getExtremesFromAll || options.getExtremesFromAll, // #4599
+ isCartesian = series.isCartesian,
+ xExtremes,
+ val2lin = xAxis && xAxis.val2lin,
+ isLog = xAxis && xAxis.isLog,
+ min,
+ max;
+
+ // If the series data or axes haven't changed, don't go through this. Return false to pass
+ // the message on to override methods like in data grouping.
+ if (isCartesian && !series.isDirty && !xAxis.isDirty && !series.yAxis.isDirty && !force) {
+ return false;
+ }
+
+ if (xAxis) {
+ xExtremes = xAxis.getExtremes(); // corrected for log axis (#3053)
+ min = xExtremes.min;
+ max = xExtremes.max;
+ }
+
+ // optionally filter out points outside the plot area
+ if (isCartesian && series.sorted && !getExtremesFromAll && (!cropThreshold || dataLength > cropThreshold || series.forceCrop)) {
+
+ // it's outside current extremes
+ if (processedXData[dataLength - 1] < min || processedXData[0] > max) {
+ processedXData = [];
+ processedYData = [];
+
+ // only crop if it's actually spilling out
+ } else if (processedXData[0] < min || processedXData[dataLength - 1] > max) {
+ croppedData = this.cropData(series.xData, series.yData, min, max);
+ processedXData = croppedData.xData;
+ processedYData = croppedData.yData;
+ cropStart = croppedData.start;
+ cropped = true;
+ }
+ }
+
+
+ // Find the closest distance between processed points
+ i = processedXData.length || 1;
+ while (--i) {
+ distance = isLog ?
+ val2lin(processedXData[i]) - val2lin(processedXData[i - 1]) :
+ processedXData[i] - processedXData[i - 1];
+
+ if (distance > 0 && (closestPointRange === UNDEFINED || distance < closestPointRange)) {
+ closestPointRange = distance;
+
+ // Unsorted data is not supported by the line tooltip, as well as data grouping and
+ // navigation in Stock charts (#725) and width calculation of columns (#1900)
+ } else if (distance < 0 && series.requireSorting) {
+ error(15);
+ }
+ }
+
+ // Record the properties
+ series.cropped = cropped; // undefined or true
+ series.cropStart = cropStart;
+ series.processedXData = processedXData;
+ series.processedYData = processedYData;
+
+ series.closestPointRange = closestPointRange;
+
+ },
+
+ /**
+ * Iterate over xData and crop values between min and max. Returns object containing crop start/end
+ * cropped xData with corresponding part of yData, dataMin and dataMax within the cropped range
+ */
+ cropData: function (xData, yData, min, max) {
+ var dataLength = xData.length,
+ cropStart = 0,
+ cropEnd = dataLength,
+ cropShoulder = pick(this.cropShoulder, 1), // line-type series need one point outside
+ i,
+ j;
+
+ // iterate up to find slice start
+ for (i = 0; i < dataLength; i++) {
+ if (xData[i] >= min) {
+ cropStart = mathMax(0, i - cropShoulder);
+ break;
+ }
+ }
+
+ // proceed to find slice end
+ for (j = i; j < dataLength; j++) {
+ if (xData[j] > max) {
+ cropEnd = j + cropShoulder;
+ break;
+ }
+ }
+
+ return {
+ xData: xData.slice(cropStart, cropEnd),
+ yData: yData.slice(cropStart, cropEnd),
+ start: cropStart,
+ end: cropEnd
+ };
+ },
+
+
+ /**
+ * Generate the data point after the data has been processed by cropping away
+ * unused points and optionally grouped in Highcharts Stock.
+ */
+ generatePoints: function () {
+ var series = this,
+ options = series.options,
+ dataOptions = options.data,
+ data = series.data,
+ dataLength,
+ processedXData = series.processedXData,
+ processedYData = series.processedYData,
+ pointClass = series.pointClass,
+ processedDataLength = processedXData.length,
+ cropStart = series.cropStart || 0,
+ cursor,
+ hasGroupedData = series.hasGroupedData,
+ point,
+ points = [],
+ i;
+
+ if (!data && !hasGroupedData) {
+ var arr = [];
+ arr.length = dataOptions.length;
+ data = series.data = arr;
+ }
+
+ for (i = 0; i < processedDataLength; i++) {
+ cursor = cropStart + i;
+ if (!hasGroupedData) {
+ if (data[cursor]) {
+ point = data[cursor];
+ } else if (dataOptions[cursor] !== UNDEFINED) { // #970
+ data[cursor] = point = (new pointClass()).init(series, dataOptions[cursor], processedXData[i]);
+ }
+ points[i] = point;
+ } else {
+ // splat the y data in case of ohlc data array
+ points[i] = (new pointClass()).init(series, [processedXData[i]].concat(splat(processedYData[i])));
+ points[i].dataGroup = series.groupMap[i];
+ }
+ points[i].index = cursor; // For faster access in Point.update
+ }
+
+ // Hide cropped-away points - this only runs when the number of points is above cropThreshold, or when
+ // swithching view from non-grouped data to grouped data (#637)
+ if (data && (processedDataLength !== (dataLength = data.length) || hasGroupedData)) {
+ for (i = 0; i < dataLength; i++) {
+ if (i === cropStart && !hasGroupedData) { // when has grouped data, clear all points
+ i += processedDataLength;
+ }
+ if (data[i]) {
+ data[i].destroyElements();
+ data[i].plotX = UNDEFINED; // #1003
+ }
+ }
+ }
+
+ series.data = data;
+ series.points = points;
+ },
+
+ /**
+ * Calculate Y extremes for visible data
+ */
+ getExtremes: function (yData) {
+ var xAxis = this.xAxis,
+ yAxis = this.yAxis,
+ xData = this.processedXData,
+ yDataLength,
+ activeYData = [],
+ activeCounter = 0,
+ xExtremes = xAxis.getExtremes(), // #2117, need to compensate for log X axis
+ xMin = xExtremes.min,
+ xMax = xExtremes.max,
+ validValue,
+ withinRange,
+ x,
+ y,
+ i,
+ j;
+
+ yData = yData || this.stackedYData || this.processedYData || [];
+ yDataLength = yData.length;
+
+ for (i = 0; i < yDataLength; i++) {
+
+ x = xData[i];
+ y = yData[i];
+
+ // For points within the visible range, including the first point outside the
+ // visible range, consider y extremes
+ validValue = y !== null && y !== UNDEFINED && (!yAxis.isLog || (y.length || y > 0));
+ withinRange = this.getExtremesFromAll || this.options.getExtremesFromAll || this.cropped ||
+ ((xData[i + 1] || x) >= xMin && (xData[i - 1] || x) <= xMax);
+
+ if (validValue && withinRange) {
+
+ j = y.length;
+ if (j) { // array, like ohlc or range data
+ while (j--) {
+ if (y[j] !== null) {
+ activeYData[activeCounter++] = y[j];
+ }
+ }
+ } else {
+ activeYData[activeCounter++] = y;
+ }
+ }
+ }
+ this.dataMin = arrayMin(activeYData);
+ this.dataMax = arrayMax(activeYData);
+ },
+
+ /**
+ * Translate data points from raw data values to chart specific positioning data
+ * needed later in drawPoints, drawGraph and drawTracker.
+ */
+ translate: function () {
+ if (!this.processedXData) { // hidden series
+ this.processData();
+ }
+ this.generatePoints();
+ var series = this,
+ options = series.options,
+ stacking = options.stacking,
+ xAxis = series.xAxis,
+ categories = xAxis.categories,
+ yAxis = series.yAxis,
+ points = series.points,
+ dataLength = points.length,
+ hasModifyValue = !!series.modifyValue,
+ i,
+ pointPlacement = options.pointPlacement,
+ dynamicallyPlaced = pointPlacement === 'between' || isNumber(pointPlacement),
+ threshold = options.threshold,
+ stackThreshold = options.startFromThreshold ? threshold : 0,
+ plotX,
+ plotY,
+ lastPlotX,
+ stackIndicator,
+ closestPointRangePx = Number.MAX_VALUE;
+
+ // Translate each point
+ for (i = 0; i < dataLength; i++) {
+ var point = points[i],
+ xValue = point.x,
+ yValue = point.y,
+ yBottom = point.low,
+ stack = stacking && yAxis.stacks[(series.negStacks && yValue < (stackThreshold ? 0 : threshold) ? '-' : '') + series.stackKey],
+ pointStack,
+ stackValues;
+
+ // Discard disallowed y values for log axes (#3434)
+ if (yAxis.isLog && yValue !== null && yValue <= 0) {
+ point.y = yValue = null;
+ error(10);
+ }
+
+ // Get the plotX translation
+ point.plotX = plotX = correctFloat( // #5236
+ mathMin(mathMax(-1e5, xAxis.translate(xValue, 0, 0, 0, 1, pointPlacement, this.type === 'flags')), 1e5) // #3923
+ );
+
+ // Calculate the bottom y value for stacked series
+ if (stacking && series.visible && !point.isNull && stack && stack[xValue]) {
+ stackIndicator = series.getStackIndicator(stackIndicator, xValue, series.index);
+ pointStack = stack[xValue];
+ stackValues = pointStack.points[stackIndicator.key];
+ yBottom = stackValues[0];
+ yValue = stackValues[1];
+
+ if (yBottom === stackThreshold && stackIndicator.key === stack[xValue].base) {
+ yBottom = pick(threshold, yAxis.min);
+ }
+ if (yAxis.isLog && yBottom <= 0) { // #1200, #1232
+ yBottom = null;
+ }
+
+ point.total = point.stackTotal = pointStack.total;
+ point.percentage = pointStack.total && (point.y / pointStack.total * 100);
+ point.stackY = yValue;
+
+ // Place the stack label
+ pointStack.setOffset(series.pointXOffset || 0, series.barW || 0);
+
+ }
+
+ // Set translated yBottom or remove it
+ point.yBottom = defined(yBottom) ?
+ yAxis.translate(yBottom, 0, 1, 0, 1) :
+ null;
+
+ // general hook, used for Highstock compare mode
+ if (hasModifyValue) {
+ yValue = series.modifyValue(yValue, point);
+ }
+
+ // Set the the plotY value, reset it for redraws
+ point.plotY = plotY = (typeof yValue === 'number' && yValue !== Infinity) ?
+ mathMin(mathMax(-1e5, yAxis.translate(yValue, 0, 1, 0, 1)), 1e5) : // #3201
+ UNDEFINED;
+ point.isInside = plotY !== UNDEFINED && plotY >= 0 && plotY <= yAxis.len && // #3519
+ plotX >= 0 && plotX <= xAxis.len;
+
+
+ // Set client related positions for mouse tracking
+ point.clientX = dynamicallyPlaced ? correctFloat(xAxis.translate(xValue, 0, 0, 0, 1)) : plotX; // #1514
+
+ point.negative = point.y < (threshold || 0);
+
+ // some API data
+ point.category = categories && categories[point.x] !== UNDEFINED ?
+ categories[point.x] : point.x;
+
+ // Determine auto enabling of markers (#3635, #5099)
+ if (!point.isNull) {
+ if (lastPlotX !== undefined) {
+ closestPointRangePx = mathMin(closestPointRangePx, mathAbs(plotX - lastPlotX));
+ }
+ lastPlotX = plotX;
+ }
+
+ }
+ series.closestPointRangePx = closestPointRangePx;
+ },
+
+ /**
+ * Return the series points with null points filtered out
+ */
+ getValidPoints: function (points, insideOnly) {
+ var chart = this.chart;
+ return grep(points || this.points || [], function isValidPoint(point) { // #3916, #5029
+ if (insideOnly && !chart.isInsidePlot(point.plotX, point.plotY, chart.inverted)) { // #5085
+ return false;
+ }
+ return !point.isNull;
+ });
+ },
+
+ /**
+ * Set the clipping for the series. For animated series it is called twice, first to initiate
+ * animating the clip then the second time without the animation to set the final clip.
+ */
+ setClip: function (animation) {
+ var chart = this.chart,
+ options = this.options,
+ renderer = chart.renderer,
+ inverted = chart.inverted,
+ seriesClipBox = this.clipBox,
+ clipBox = seriesClipBox || chart.clipBox,
+ sharedClipKey = this.sharedClipKey || ['_sharedClip', animation && animation.duration, animation && animation.easing, clipBox.height, options.xAxis, options.yAxis].join(','), // #4526
+ clipRect = chart[sharedClipKey],
+ markerClipRect = chart[sharedClipKey + 'm'];
+
+ // If a clipping rectangle with the same properties is currently present in the chart, use that.
+ if (!clipRect) {
+
+ // When animation is set, prepare the initial positions
+ if (animation) {
+ clipBox.width = 0;
+
+ chart[sharedClipKey + 'm'] = markerClipRect = renderer.clipRect(
+ -99, // include the width of the first marker
+ inverted ? -chart.plotLeft : -chart.plotTop,
+ 99,
+ inverted ? chart.chartWidth : chart.chartHeight
+ );
+ }
+ chart[sharedClipKey] = clipRect = renderer.clipRect(clipBox);
+ // Create hashmap for series indexes
+ clipRect.count = { length: 0 };
+
+ }
+ if (animation) {
+ if (!clipRect.count[this.index]) {
+ clipRect.count[this.index] = true;
+ clipRect.count.length += 1;
+ }
+ }
+
+ if (options.clip !== false) {
+ this.group.clip(animation || seriesClipBox ? clipRect : chart.clipRect);
+ this.markerGroup.clip(markerClipRect);
+ this.sharedClipKey = sharedClipKey;
+ }
+
+ // Remove the shared clipping rectangle when all series are shown
+ if (!animation) {
+ if (clipRect.count[this.index]) {
+ delete clipRect.count[this.index];
+ clipRect.count.length -= 1;
+ }
+
+ if (clipRect.count.length === 0 && sharedClipKey && chart[sharedClipKey]) {
+ if (!seriesClipBox) {
+ chart[sharedClipKey] = chart[sharedClipKey].destroy();
+ }
+ if (chart[sharedClipKey + 'm']) {
+ chart[sharedClipKey + 'm'] = chart[sharedClipKey + 'm'].destroy();
+ }
+ }
+ }
+ },
+
+ /**
+ * Animate in the series
+ */
+ animate: function (init) {
+ var series = this,
+ chart = series.chart,
+ clipRect,
+ animation = series.options.animation,
+ sharedClipKey;
+
+ // Animation option is set to true
+ if (animation && !isObject(animation)) {
+ animation = defaultPlotOptions[series.type].animation;
+ }
+
+ // Initialize the animation. Set up the clipping rectangle.
+ if (init) {
+
+ series.setClip(animation);
+
+ // Run the animation
+ } else {
+ sharedClipKey = this.sharedClipKey;
+ clipRect = chart[sharedClipKey];
+ if (clipRect) {
+ clipRect.animate({
+ width: chart.plotSizeX
+ }, animation);
+ }
+ if (chart[sharedClipKey + 'm']) {
+ chart[sharedClipKey + 'm'].animate({
+ width: chart.plotSizeX + 99
+ }, animation);
+ }
+
+ // Delete this function to allow it only once
+ series.animate = null;
+
+ }
+ },
+
+ /**
+ * This runs after animation to land on the final plot clipping
+ */
+ afterAnimate: function () {
+ this.setClip();
+ fireEvent(this, 'afterAnimate');
+ },
+
+ /**
+ * Draw the markers
+ */
+ drawPoints: function () {
+ var series = this,
+ pointAttr,
+ points = series.points,
+ chart = series.chart,
+ plotX,
+ plotY,
+ i,
+ point,
+ radius,
+ symbol,
+ isImage,
+ graphic,
+ options = series.options,
+ seriesMarkerOptions = options.marker,
+ seriesPointAttr = series.pointAttr[''],
+ pointMarkerOptions,
+ hasPointMarker,
+ enabled,
+ isInside,
+ markerGroup = series.markerGroup,
+ xAxis = series.xAxis,
+ globallyEnabled = pick(
+ seriesMarkerOptions.enabled,
+ xAxis.isRadial,
+ series.closestPointRangePx > 2 * seriesMarkerOptions.radius
+ );
+
+ if (seriesMarkerOptions.enabled !== false || series._hasPointMarkers) {
+
+ i = points.length;
+ while (i--) {
+ point = points[i];
+ plotX = mathFloor(point.plotX); // #1843
+ plotY = point.plotY;
+ graphic = point.graphic;
+ pointMarkerOptions = point.marker || {};
+ hasPointMarker = !!point.marker;
+ enabled = (globallyEnabled && pointMarkerOptions.enabled === UNDEFINED) || pointMarkerOptions.enabled;
+ isInside = point.isInside;
+
+ // only draw the point if y is defined
+ if (enabled && isNumber(plotY) && point.y !== null) {
+
+ // shortcuts
+ pointAttr = point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE] || seriesPointAttr;
+ radius = pointAttr.r;
+ symbol = pick(pointMarkerOptions.symbol, series.symbol);
+ isImage = symbol.indexOf('url') === 0;
+
+ if (graphic) { // update
+ graphic[isInside ? 'show' : 'hide'](true) // Since the marker group isn't clipped, each individual marker must be toggled
+ .attr(pointAttr) // #4759
+ .animate(extend({
+ x: plotX - radius,
+ y: plotY - radius
+ }, graphic.symbolName ? { // don't apply to image symbols #507
+ width: 2 * radius,
+ height: 2 * radius
+ } : {}));
+ } else if (isInside && (radius > 0 || isImage)) {
+ point.graphic = graphic = chart.renderer.symbol(
+ symbol,
+ plotX - radius,
+ plotY - radius,
+ 2 * radius,
+ 2 * radius,
+ hasPointMarker ? pointMarkerOptions : seriesMarkerOptions
+ )
+ .attr(pointAttr)
+ .add(markerGroup);
+ }
+
+ } else if (graphic) {
+ point.graphic = graphic.destroy(); // #1269
+ }
+ }
+ }
+
+ },
+
+ /**
+ * Convert state properties from API naming conventions to SVG attributes
+ *
+ * @param {Object} options API options object
+ * @param {Object} base1 SVG attribute object to inherit from
+ * @param {Object} base2 Second level SVG attribute object to inherit from
+ */
+ convertAttribs: function (options, base1, base2, base3) {
+ var conversion = this.pointAttrToOptions,
+ attr,
+ option,
+ obj = {};
+
+ options = options || {};
+ base1 = base1 || {};
+ base2 = base2 || {};
+ base3 = base3 || {};
+
+ for (attr in conversion) {
+ option = conversion[attr];
+ obj[attr] = pick(options[option], base1[attr], base2[attr], base3[attr]);
+ }
+ return obj;
+ },
+
+ /**
+ * Get the state attributes. Each series type has its own set of attributes
+ * that are allowed to change on a point's state change. Series wide attributes are stored for
+ * all series, and additionally point specific attributes are stored for all
+ * points with individual marker options. If such options are not defined for the point,
+ * a reference to the series wide attributes is stored in point.pointAttr.
+ */
+ getAttribs: function () {
+ var series = this,
+ seriesOptions = series.options,
+ normalOptions = defaultPlotOptions[series.type].marker ? seriesOptions.marker : seriesOptions,
+ stateOptions = normalOptions.states,
+ stateOptionsHover = stateOptions[HOVER_STATE],
+ pointStateOptionsHover,
+ seriesColor = series.color,
+ seriesNegativeColor = series.options.negativeColor,
+ normalDefaults = {
+ stroke: seriesColor,
+ fill: seriesColor
+ },
+ points = series.points || [], // #927
+ i,
+ j,
+ threshold,
+ point,
+ seriesPointAttr = [],
+ pointAttr,
+ pointAttrToOptions = series.pointAttrToOptions,
+ hasPointSpecificOptions = series.hasPointSpecificOptions,
+ defaultLineColor = normalOptions.lineColor,
+ defaultFillColor = normalOptions.fillColor,
+ turboThreshold = seriesOptions.turboThreshold,
+ zones = series.zones,
+ zoneAxis = series.zoneAxis || 'y',
+ zoneColor,
+ attr,
+ key;
+
+ // series type specific modifications
+ if (seriesOptions.marker) { // line, spline, area, areaspline, scatter
+
+ // if no hover radius is given, default to normal radius + 2
+ stateOptionsHover.radius = +stateOptionsHover.radius || +normalOptions.radius + +stateOptionsHover.radiusPlus;
+ stateOptionsHover.lineWidth = stateOptionsHover.lineWidth || normalOptions.lineWidth + stateOptionsHover.lineWidthPlus;
+
+ } else { // column, bar, pie
+
+ // if no hover color is given, brighten the normal color
+ stateOptionsHover.color = stateOptionsHover.color ||
+ Color(stateOptionsHover.color || seriesColor)
+ .brighten(stateOptionsHover.brightness).get();
+
+ // if no hover negativeColor is given, brighten the normal negativeColor
+ stateOptionsHover.negativeColor = stateOptionsHover.negativeColor ||
+ Color(stateOptionsHover.negativeColor || seriesNegativeColor)
+ .brighten(stateOptionsHover.brightness).get();
+ }
+
+ // general point attributes for the series normal state
+ seriesPointAttr[NORMAL_STATE] = series.convertAttribs(normalOptions, normalDefaults);
+
+ // HOVER_STATE and SELECT_STATE states inherit from normal state except the default radius
+ each([HOVER_STATE, SELECT_STATE], function (state) {
+ seriesPointAttr[state] =
+ series.convertAttribs(stateOptions[state], seriesPointAttr[NORMAL_STATE]);
+ });
+
+ // set it
+ series.pointAttr = seriesPointAttr;
+
+
+ // Generate the point-specific attribute collections if specific point
+ // options are given. If not, create a referance to the series wide point
+ // attributes
+ i = points.length;
+ if (!turboThreshold || i < turboThreshold || hasPointSpecificOptions) {
+ while (i--) {
+ point = points[i];
+ normalOptions = (point.options && point.options.marker) || point.options;
+ if (normalOptions && normalOptions.enabled === false) {
+ normalOptions.radius = 0;
+ }
+
+ zoneColor = null;
+ if (zones.length) {
+ j = 0;
+ threshold = zones[j];
+ while (point[zoneAxis] >= threshold.value) {
+ threshold = zones[++j];
+ }
+
+ point.color = point.fillColor = zoneColor = pick(threshold.color, series.color); // #3636, #4267, #4430 - inherit color from series, when color is undefined
+
+ }
+
+ hasPointSpecificOptions = seriesOptions.colorByPoint || point.color; // #868
+
+ // check if the point has specific visual options
+ if (point.options) {
+ for (key in pointAttrToOptions) {
+ if (defined(normalOptions[pointAttrToOptions[key]])) {
+ hasPointSpecificOptions = true;
+ }
+ }
+ }
+
+ // a specific marker config object is defined for the individual point:
+ // create it's own attribute collection
+ if (hasPointSpecificOptions) {
+ normalOptions = normalOptions || {};
+ pointAttr = [];
+ stateOptions = normalOptions.states || {}; // reassign for individual point
+ pointStateOptionsHover = stateOptions[HOVER_STATE] = stateOptions[HOVER_STATE] || {};
+
+ // Handle colors for column and pies
+ if (!seriesOptions.marker || (point.negative && !pointStateOptionsHover.fillColor && !stateOptionsHover.fillColor)) { // column, bar, point or negative threshold for series with markers (#3636)
+ // If no hover color is given, brighten the normal color. #1619, #2579
+ pointStateOptionsHover[series.pointAttrToOptions.fill] = pointStateOptionsHover.color || (!point.options.color && stateOptionsHover[(point.negative && seriesNegativeColor ? 'negativeColor' : 'color')]) ||
+ Color(point.color)
+ .brighten(pointStateOptionsHover.brightness || stateOptionsHover.brightness)
+ .get();
+ }
+
+ // normal point state inherits series wide normal state
+ attr = { color: point.color }; // #868
+ if (!defaultFillColor) { // Individual point color or negative color markers (#2219)
+ attr.fillColor = point.color;
+ }
+ if (!defaultLineColor) {
+ attr.lineColor = point.color; // Bubbles take point color, line markers use white
+ }
+ // Color is explicitly set to null or undefined (#1288, #4068)
+ if (normalOptions.hasOwnProperty('color') && !normalOptions.color) {
+ delete normalOptions.color;
+ }
+
+ // When zone is set, but series.states.hover.color is not set, apply zone color on hover, #4670:
+ if (zoneColor && !stateOptionsHover.fillColor) {
+ pointStateOptionsHover.fillColor = zoneColor;
+ }
+
+ pointAttr[NORMAL_STATE] = series.convertAttribs(extend(attr, normalOptions), seriesPointAttr[NORMAL_STATE]);
+
+ // inherit from point normal and series hover
+ pointAttr[HOVER_STATE] = series.convertAttribs(
+ stateOptions[HOVER_STATE],
+ seriesPointAttr[HOVER_STATE],
+ pointAttr[NORMAL_STATE]
+ );
+
+ // inherit from point normal and series hover
+ pointAttr[SELECT_STATE] = series.convertAttribs(
+ stateOptions[SELECT_STATE],
+ seriesPointAttr[SELECT_STATE],
+ pointAttr[NORMAL_STATE]
+ );
+
+
+ // no marker config object is created: copy a reference to the series-wide
+ // attribute collection
+ } else {
+ pointAttr = seriesPointAttr;
+ }
+
+ point.pointAttr = pointAttr;
+ }
+ }
+ },
+
+ /**
+ * Clear DOM objects and free up memory
+ */
+ destroy: function () {
+ var series = this,
+ chart = series.chart,
+ issue134 = /AppleWebKit\/533/.test(userAgent),
+ destroy,
+ i,
+ data = series.data || [],
+ point,
+ prop,
+ axis;
+
+ // add event hook
+ fireEvent(series, 'destroy');
+
+ // remove all events
+ removeEvent(series);
+
+ // erase from axes
+ each(series.axisTypes || [], function (AXIS) {
+ axis = series[AXIS];
+ if (axis) {
+ erase(axis.series, series);
+ axis.isDirty = axis.forceRedraw = true;
+ }
+ });
+
+ // remove legend items
+ if (series.legendItem) {
+ series.chart.legend.destroyItem(series);
+ }
+
+ // destroy all points with their elements
+ i = data.length;
+ while (i--) {
+ point = data[i];
+ if (point && point.destroy) {
+ point.destroy();
+ }
+ }
+ series.points = null;
+
+ // Clear the animation timeout if we are destroying the series during initial animation
+ clearTimeout(series.animationTimeout);
+
+ // Destroy all SVGElements associated to the series
+ for (prop in series) {
+ if (series[prop] instanceof SVGElement && !series[prop].survive) { // Survive provides a hook for not destroying
+
+ // issue 134 workaround
+ destroy = issue134 && prop === 'group' ?
+ 'hide' :
+ 'destroy';
+
+ series[prop][destroy]();
+ }
+ }
+
+ // remove from hoverSeries
+ if (chart.hoverSeries === series) {
+ chart.hoverSeries = null;
+ }
+ erase(chart.series, series);
+
+ // clear all members
+ for (prop in series) {
+ delete series[prop];
+ }
+ },
+
+ /**
+ * Get the graph path
+ */
+ getGraphPath: function (points, nullsAsZeroes, connectCliffs) {
+ var series = this,
+ options = series.options,
+ step = options.step,
+ reversed,
+ graphPath = [],
+ xMap = [],
+ gap;
+
+ points = points || series.points;
+
+ // Bottom of a stack is reversed
+ reversed = points.reversed;
+ if (reversed) {
+ points.reverse();
+ }
+ // Reverse the steps (#5004)
+ step = { right: 1, center: 2 }[step] || (step && 3);
+ if (step && reversed) {
+ step = 4 - step;
+ }
+
+ // Remove invalid points, especially in spline (#5015)
+ if (options.connectNulls && !nullsAsZeroes && !connectCliffs) {
+ points = this.getValidPoints(points);
+ }
+
+ // Build the line
+ each(points, function (point, i) {
+
+ var plotX = point.plotX,
+ plotY = point.plotY,
+ lastPoint = points[i - 1],
+ pathToPoint; // the path to this point from the previous
+
+ if ((point.leftCliff || (lastPoint && lastPoint.rightCliff)) && !connectCliffs) {
+ gap = true; // ... and continue
+ }
+
+ // Line series, nullsAsZeroes is not handled
+ if (point.isNull && !defined(nullsAsZeroes) && i > 0) {
+ gap = !options.connectNulls;
+
+ // Area series, nullsAsZeroes is set
+ } else if (point.isNull && !nullsAsZeroes) {
+ gap = true;
+
+ } else {
+
+ if (i === 0 || gap) {
+ pathToPoint = [M, point.plotX, point.plotY];
+
+ } else if (series.getPointSpline) { // generate the spline as defined in the SplineSeries object
+
+ pathToPoint = series.getPointSpline(points, point, i);
+
+ } else if (step) {
+
+ if (step === 1) { // right
+ pathToPoint = [
+ L,
+ lastPoint.plotX,
+ plotY
+ ];
+
+ } else if (step === 2) { // center
+ pathToPoint = [
+ L,
+ (lastPoint.plotX + plotX) / 2,
+ lastPoint.plotY,
+ L,
+ (lastPoint.plotX + plotX) / 2,
+ plotY
+ ];
+
+ } else {
+ pathToPoint = [
+ L,
+ plotX,
+ lastPoint.plotY
+ ];
+ }
+ pathToPoint.push(L, plotX, plotY);
+
+ } else {
+ // normal line to next point
+ pathToPoint = [
+ L,
+ plotX,
+ plotY
+ ];
+ }
+
+ // Prepare for animation. When step is enabled, there are two path nodes for each x value.
+ xMap.push(point.x);
+ if (step) {
+ xMap.push(point.x);
+ }
+
+ graphPath.push.apply(graphPath, pathToPoint);
+ gap = false;
+ }
+ });
+
+ graphPath.xMap = xMap;
+ series.graphPath = graphPath;
+
+ return graphPath;
+
+ },
+
+ /**
+ * Draw the actual graph
+ */
+ drawGraph: function () {
+ var series = this,
+ options = this.options,
+ props = [['graph', options.lineColor || this.color, options.dashStyle]],
+ lineWidth = options.lineWidth,
+ roundCap = options.linecap !== 'square',
+ graphPath = (this.gappedPath || this.getGraphPath).call(this),
+ zones = this.zones;
+
+ each(zones, function (threshold, i) {
+ props.push(['zoneGraph' + i, threshold.color || series.color, threshold.dashStyle || options.dashStyle]);
+ });
+
+ // Draw the graph
+ each(props, function (prop, i) {
+ var graphKey = prop[0],
+ graph = series[graphKey],
+ attribs;
+
+ if (graph) {
+ graph.endX = graphPath.xMap;
+ graph.animate({ d: graphPath });
+
+ } else if (lineWidth && graphPath.length) { // #1487
+ attribs = {
+ stroke: prop[1],
+ 'stroke-width': lineWidth,
+ fill: 'none',
+ zIndex: 1 // #1069
+ };
+ if (prop[2]) {
+ attribs.dashstyle = prop[2];
+ } else if (roundCap) {
+ attribs['stroke-linecap'] = attribs['stroke-linejoin'] = 'round';
+ }
+
+ graph = series[graphKey] = series.chart.renderer.path(graphPath)
+ .attr(attribs)
+ .add(series.group)
+ .shadow((i < 2) && options.shadow); // add shadow to normal series (0) or to first zone (1) #3932
+ }
+
+ // Helpers for animation
+ if (graph) {
+ graph.startX = graphPath.xMap;
+ //graph.shiftUnit = options.step ? 2 : 1;
+ graph.isArea = graphPath.isArea; // For arearange animation
+ }
+ });
+ },
+
+ /**
+ * Clip the graphs into the positive and negative coloured graphs
+ */
+ applyZones: function () {
+ var series = this,
+ chart = this.chart,
+ renderer = chart.renderer,
+ zones = this.zones,
+ translatedFrom,
+ translatedTo,
+ clips = this.clips || [],
+ clipAttr,
+ graph = this.graph,
+ area = this.area,
+ chartSizeMax = mathMax(chart.chartWidth, chart.chartHeight),
+ axis = this[(this.zoneAxis || 'y') + 'Axis'],
+ extremes,
+ reversed = axis.reversed,
+ inverted = chart.inverted,
+ horiz = axis.horiz,
+ pxRange,
+ pxPosMin,
+ pxPosMax,
+ ignoreZones = false;
+
+ if (zones.length && (graph || area) && axis.min !== UNDEFINED) {
+ // The use of the Color Threshold assumes there are no gaps
+ // so it is safe to hide the original graph and area
+ if (graph) {
+ graph.hide();
+ }
+ if (area) {
+ area.hide();
+ }
+
+ // Create the clips
+ extremes = axis.getExtremes();
+ each(zones, function (threshold, i) {
+
+ translatedFrom = reversed ?
+ (horiz ? chart.plotWidth : 0) :
+ (horiz ? 0 : axis.toPixels(extremes.min));
+ translatedFrom = mathMin(mathMax(pick(translatedTo, translatedFrom), 0), chartSizeMax);
+ translatedTo = mathMin(mathMax(mathRound(axis.toPixels(pick(threshold.value, extremes.max), true)), 0), chartSizeMax);
+
+ if (ignoreZones) {
+ translatedFrom = translatedTo = axis.toPixels(extremes.max);
+ }
+
+ pxRange = Math.abs(translatedFrom - translatedTo);
+ pxPosMin = mathMin(translatedFrom, translatedTo);
+ pxPosMax = mathMax(translatedFrom, translatedTo);
+ if (axis.isXAxis) {
+ clipAttr = {
+ x: inverted ? pxPosMax : pxPosMin,
+ y: 0,
+ width: pxRange,
+ height: chartSizeMax
+ };
+ if (!horiz) {
+ clipAttr.x = chart.plotHeight - clipAttr.x;
+ }
+ } else {
+ clipAttr = {
+ x: 0,
+ y: inverted ? pxPosMax : pxPosMin,
+ width: chartSizeMax,
+ height: pxRange
+ };
+ if (horiz) {
+ clipAttr.y = chart.plotWidth - clipAttr.y;
+ }
+ }
+
+ /// VML SUPPPORT
+ if (chart.inverted && renderer.isVML) {
+ if (axis.isXAxis) {
+ clipAttr = {
+ x: 0,
+ y: reversed ? pxPosMin : pxPosMax,
+ height: clipAttr.width,
+ width: chart.chartWidth
+ };
+ } else {
+ clipAttr = {
+ x: clipAttr.y - chart.plotLeft - chart.spacingBox.x,
+ y: 0,
+ width: clipAttr.height,
+ height: chart.chartHeight
+ };
+ }
+ }
+ /// END OF VML SUPPORT
+
+ if (clips[i]) {
+ clips[i].animate(clipAttr);
+ } else {
+ clips[i] = renderer.clipRect(clipAttr);
+
+ if (graph) {
+ series['zoneGraph' + i].clip(clips[i]);
+ }
+
+ if (area) {
+ series['zoneArea' + i].clip(clips[i]);
+ }
+ }
+ // if this zone extends out of the axis, ignore the others
+ ignoreZones = threshold.value > extremes.max;
+ });
+ this.clips = clips;
+ }
+ },
+
+ /**
+ * Initialize and perform group inversion on series.group and series.markerGroup
+ */
+ invertGroups: function () {
+ var series = this,
+ chart = series.chart;
+
+ // Pie, go away (#1736)
+ if (!series.xAxis) {
+ return;
+ }
+
+ // A fixed size is needed for inversion to work
+ function setInvert() {
+ var size = {
+ width: series.yAxis.len,
+ height: series.xAxis.len
+ };
+
+ each(['group', 'markerGroup'], function (groupName) {
+ if (series[groupName]) {
+ series[groupName].attr(size).invert();
+ }
+ });
+ }
+
+ addEvent(chart, 'resize', setInvert); // do it on resize
+ addEvent(series, 'destroy', function () {
+ removeEvent(chart, 'resize', setInvert);
+ });
+
+ // Do it now
+ setInvert(); // do it now
+
+ // On subsequent render and redraw, just do setInvert without setting up events again
+ series.invertGroups = setInvert;
+ },
+
+ /**
+ * General abstraction for creating plot groups like series.group, series.dataLabelsGroup and
+ * series.markerGroup. On subsequent calls, the group will only be adjusted to the updated plot size.
+ */
+ plotGroup: function (prop, name, visibility, zIndex, parent) {
+ var group = this[prop],
+ isNew = !group;
+
+ // Generate it on first call
+ if (isNew) {
+ this[prop] = group = this.chart.renderer.g(name)
+ .attr({
+ zIndex: zIndex || 0.1 // IE8 and pointer logic use this
+ })
+ .add(parent);
+
+ group.addClass('highcharts-series-' + this.index);
+ }
+
+ // Place it on first and subsequent (redraw) calls
+ group.attr({ visibility: visibility })[isNew ? 'attr' : 'animate'](this.getPlotBox());
+ return group;
+ },
+
+ /**
+ * Get the translation and scale for the plot area of this series
+ */
+ getPlotBox: function () {
+ var chart = this.chart,
+ xAxis = this.xAxis,
+ yAxis = this.yAxis;
+
+ // Swap axes for inverted (#2339)
+ if (chart.inverted) {
+ xAxis = yAxis;
+ yAxis = this.xAxis;
+ }
+ return {
+ translateX: xAxis ? xAxis.left : chart.plotLeft,
+ translateY: yAxis ? yAxis.top : chart.plotTop,
+ scaleX: 1, // #1623
+ scaleY: 1
+ };
+ },
+
+ /**
+ * Render the graph and markers
+ */
+ render: function () {
+ var series = this,
+ chart = series.chart,
+ group,
+ options = series.options,
+ // Animation doesn't work in IE8 quirks when the group div is hidden,
+ // and looks bad in other oldIE
+ animDuration = !!series.animate && chart.renderer.isSVG && animObject(options.animation).duration,
+ visibility = series.visible ? 'inherit' : 'hidden', // #2597
+ zIndex = options.zIndex,
+ hasRendered = series.hasRendered,
+ chartSeriesGroup = chart.seriesGroup;
+
+ // the group
+ group = series.plotGroup(
+ 'group',
+ 'series',
+ visibility,
+ zIndex,
+ chartSeriesGroup
+ );
+
+ series.markerGroup = series.plotGroup(
+ 'markerGroup',
+ 'markers',
+ visibility,
+ zIndex,
+ chartSeriesGroup
+ );
+
+ // initiate the animation
+ if (animDuration) {
+ series.animate(true);
+ }
+
+ // cache attributes for shapes
+ series.getAttribs();
+
+ // SVGRenderer needs to know this before drawing elements (#1089, #1795)
+ group.inverted = series.isCartesian ? chart.inverted : false;
+
+ // draw the graph if any
+ if (series.drawGraph) {
+ series.drawGraph();
+ series.applyZones();
+ }
+
+ each(series.points, function (point) {
+ if (point.redraw) {
+ point.redraw();
+ }
+ });
+
+ // draw the data labels (inn pies they go before the points)
+ if (series.drawDataLabels) {
+ series.drawDataLabels();
+ }
+
+ // draw the points
+ if (series.visible) {
+ series.drawPoints();
+ }
+
+
+ // draw the mouse tracking area
+ if (series.drawTracker && series.options.enableMouseTracking !== false) {
+ series.drawTracker();
+ }
+
+ // Handle inverted series and tracker groups
+ if (chart.inverted) {
+ series.invertGroups();
+ }
+
+ // Initial clipping, must be defined after inverting groups for VML. Applies to columns etc. (#3839).
+ if (options.clip !== false && !series.sharedClipKey && !hasRendered) {
+ group.clip(chart.clipRect);
+ }
+
+ // Run the animation
+ if (animDuration) {
+ series.animate();
+ }
+
+ // Call the afterAnimate function on animation complete (but don't overwrite the animation.complete option
+ // which should be available to the user).
+ if (!hasRendered) {
+ series.animationTimeout = syncTimeout(function () {
+ series.afterAnimate();
+ }, animDuration);
+ }
+
+ series.isDirty = series.isDirtyData = false; // means data is in accordance with what you see
+ // (See #322) series.isDirty = series.isDirtyData = false; // means data is in accordance with what you see
+ series.hasRendered = true;
+ },
+
+ /**
+ * Redraw the series after an update in the axes.
+ */
+ redraw: function () {
+ var series = this,
+ chart = series.chart,
+ wasDirty = series.isDirty || series.isDirtyData, // cache it here as it is set to false in render, but used after
+ group = series.group,
+ xAxis = series.xAxis,
+ yAxis = series.yAxis;
+
+ // reposition on resize
+ if (group) {
+ if (chart.inverted) {
+ group.attr({
+ width: chart.plotWidth,
+ height: chart.plotHeight
+ });
+ }
+
+ group.animate({
+ translateX: pick(xAxis && xAxis.left, chart.plotLeft),
+ translateY: pick(yAxis && yAxis.top, chart.plotTop)
+ });
+ }
+
+ series.translate();
+ series.render();
+ if (wasDirty) { // #3868, #3945
+ delete this.kdTree;
+ }
+ },
+
+ /**
+ * KD Tree && PointSearching Implementation
+ */
+
+ kdDimensions: 1,
+ kdAxisArray: ['clientX', 'plotY'],
+
+ searchPoint: function (e, compareX) {
+ var series = this,
+ xAxis = series.xAxis,
+ yAxis = series.yAxis,
+ inverted = series.chart.inverted;
+
+ return this.searchKDTree({
+ clientX: inverted ? xAxis.len - e.chartY + xAxis.pos : e.chartX - xAxis.pos,
+ plotY: inverted ? yAxis.len - e.chartX + yAxis.pos : e.chartY - yAxis.pos
+ }, compareX);
+ },
+
+ buildKDTree: function () {
+ var series = this,
+ dimensions = series.kdDimensions;
+
+ // Internal function
+ function _kdtree(points, depth, dimensions) {
+ var axis,
+ median,
+ length = points && points.length;
+
+ if (length) {
+
+ // alternate between the axis
+ axis = series.kdAxisArray[depth % dimensions];
+
+ // sort point array
+ points.sort(function (a, b) {
+ return a[axis] - b[axis];
+ });
+
+ median = Math.floor(length / 2);
+
+ // build and return nod
+ return {
+ point: points[median],
+ left: _kdtree(points.slice(0, median), depth + 1, dimensions),
+ right: _kdtree(points.slice(median + 1), depth + 1, dimensions)
+ };
+
+ }
+ }
+
+ // Start the recursive build process with a clone of the points array and null points filtered out (#3873)
+ function startRecursive() {
+ series.kdTree = _kdtree(
+ series.getValidPoints(
+ null,
+ !series.directTouch // For line-type series restrict to plot area, but column-type series not (#3916, #4511)
+ ),
+ dimensions,
+ dimensions
+ );
+ }
+ delete series.kdTree;
+
+ // For testing tooltips, don't build async
+ syncTimeout(startRecursive, series.options.kdNow ? 0 : 1);
+ },
+
+ searchKDTree: function (point, compareX) {
+ var series = this,
+ kdX = this.kdAxisArray[0],
+ kdY = this.kdAxisArray[1],
+ kdComparer = compareX ? 'distX' : 'dist';
+
+ // Set the one and two dimensional distance on the point object
+ function setDistance(p1, p2) {
+ var x = (defined(p1[kdX]) && defined(p2[kdX])) ? Math.pow(p1[kdX] - p2[kdX], 2) : null,
+ y = (defined(p1[kdY]) && defined(p2[kdY])) ? Math.pow(p1[kdY] - p2[kdY], 2) : null,
+ r = (x || 0) + (y || 0);
+
+ p2.dist = defined(r) ? Math.sqrt(r) : Number.MAX_VALUE;
+ p2.distX = defined(x) ? Math.sqrt(x) : Number.MAX_VALUE;
+ }
+ function _search(search, tree, depth, dimensions) {
+ var point = tree.point,
+ axis = series.kdAxisArray[depth % dimensions],
+ tdist,
+ sideA,
+ sideB,
+ ret = point,
+ nPoint1,
+ nPoint2;
+
+ setDistance(search, point);
+
+ // Pick side based on distance to splitting point
+ tdist = search[axis] - point[axis];
+ sideA = tdist < 0 ? 'left' : 'right';
+ sideB = tdist < 0 ? 'right' : 'left';
+
+ // End of tree
+ if (tree[sideA]) {
+ nPoint1 = _search(search, tree[sideA], depth + 1, dimensions);
+
+ ret = (nPoint1[kdComparer] < ret[kdComparer] ? nPoint1 : point);
+ }
+ if (tree[sideB]) {
+ // compare distance to current best to splitting point to decide wether to check side B or not
+ if (Math.sqrt(tdist * tdist) < ret[kdComparer]) {
+ nPoint2 = _search(search, tree[sideB], depth + 1, dimensions);
+ ret = (nPoint2[kdComparer] < ret[kdComparer] ? nPoint2 : ret);
+ }
+ }
+
+ return ret;
+ }
+
+ if (!this.kdTree) {
+ this.buildKDTree();
+ }
+
+ if (this.kdTree) {
+ return _search(point,
+ this.kdTree, this.kdDimensions, this.kdDimensions);
+ }
+ }
+
+ }; // end Series prototype
+
+ /**
+ * The class for stack items
+ */
+ function StackItem(axis, options, isNegative, x, stackOption) {
+
+ var inverted = axis.chart.inverted;
+
+ this.axis = axis;
+
+ // Tells if the stack is negative
+ this.isNegative = isNegative;
+
+ // Save the options to be able to style the label
+ this.options = options;
+
+ // Save the x value to be able to position the label later
+ this.x = x;
+
+ // Initialize total value
+ this.total = null;
+
+ // This will keep each points' extremes stored by series.index and point index
+ this.points = {};
+
+ // Save the stack option on the series configuration object, and whether to treat it as percent
+ this.stack = stackOption;
+ this.leftCliff = 0;
+ this.rightCliff = 0;
+
+ // The align options and text align varies on whether the stack is negative and
+ // if the chart is inverted or not.
+ // First test the user supplied value, then use the dynamic.
+ this.alignOptions = {
+ align: options.align || (inverted ? (isNegative ? 'left' : 'right') : 'center'),
+ verticalAlign: options.verticalAlign || (inverted ? 'middle' : (isNegative ? 'bottom' : 'top')),
+ y: pick(options.y, inverted ? 4 : (isNegative ? 14 : -6)),
+ x: pick(options.x, inverted ? (isNegative ? -6 : 6) : 0)
+ };
+
+ this.textAlign = options.textAlign || (inverted ? (isNegative ? 'right' : 'left') : 'center');
+ }
+
+ StackItem.prototype = {
+ destroy: function () {
+ destroyObjectProperties(this, this.axis);
+ },
+
+ /**
+ * Renders the stack total label and adds it to the stack label group.
+ */
+ render: function (group) {
+ var options = this.options,
+ formatOption = options.format,
+ str = formatOption ?
+ format(formatOption, this) :
+ options.formatter.call(this); // format the text in the label
+
+ // Change the text to reflect the new total and set visibility to hidden in case the serie is hidden
+ if (this.label) {
+ this.label.attr({ text: str, visibility: 'hidden' });
+ // Create new label
+ } else {
+ this.label =
+ this.axis.chart.renderer.text(str, null, null, options.useHTML) // dummy positions, actual position updated with setOffset method in columnseries
+ .css(options.style) // apply style
+ .attr({
+ align: this.textAlign, // fix the text-anchor
+ rotation: options.rotation, // rotation
+ visibility: HIDDEN // hidden until setOffset is called
+ })
+ .add(group); // add to the labels-group
+ }
+ },
+
+ /**
+ * Sets the offset that the stack has from the x value and repositions the label.
+ */
+ setOffset: function (xOffset, xWidth) {
+ var stackItem = this,
+ axis = stackItem.axis,
+ chart = axis.chart,
+ inverted = chart.inverted,
+ reversed = axis.reversed,
+ neg = (this.isNegative && !reversed) || (!this.isNegative && reversed), // #4056
+ y = axis.translate(axis.usePercentage ? 100 : this.total, 0, 0, 0, 1), // stack value translated mapped to chart coordinates
+ yZero = axis.translate(0), // stack origin
+ h = mathAbs(y - yZero), // stack height
+ x = chart.xAxis[0].translate(this.x) + xOffset, // stack x position
+ plotHeight = chart.plotHeight,
+ stackBox = { // this is the box for the complete stack
+ x: inverted ? (neg ? y : y - h) : x,
+ y: inverted ? plotHeight - x - xWidth : (neg ? (plotHeight - y - h) : plotHeight - y),
+ width: inverted ? h : xWidth,
+ height: inverted ? xWidth : h
+ },
+ label = this.label,
+ alignAttr;
+
+ if (label) {
+ label.align(this.alignOptions, null, stackBox); // align the label to the box
+
+ // Set visibility (#678)
+ alignAttr = label.alignAttr;
+ label[this.options.crop === false || chart.isInsidePlot(alignAttr.x, alignAttr.y) ? 'show' : 'hide'](true);
+ }
+ }
+ };
+
+ /**
+ * Generate stacks for each series and calculate stacks total values
+ */
+ Chart.prototype.getStacks = function () {
+ var chart = this;
+
+ // reset stacks for each yAxis
+ each(chart.yAxis, function (axis) {
+ if (axis.stacks && axis.hasVisibleSeries) {
+ axis.oldStacks = axis.stacks;
+ }
+ });
+
+ each(chart.series, function (series) {
+ if (series.options.stacking && (series.visible === true || chart.options.chart.ignoreHiddenSeries === false)) {
+ series.stackKey = series.type + pick(series.options.stack, '');
+ }
+ });
+ };
+
+
+ // Stacking methods defined on the Axis prototype
+
+ /**
+ * Build the stacks from top down
+ */
+ Axis.prototype.buildStacks = function () {
+ var axisSeries = this.series,
+ series,
+ reversedStacks = pick(this.options.reversedStacks, true),
+ len = axisSeries.length,
+ i;
+ if (!this.isXAxis) {
+ this.usePercentage = false;
+ i = len;
+ while (i--) {
+ axisSeries[reversedStacks ? i : len - i - 1].setStackedPoints();
+ }
+
+ i = len;
+ while (i--) {
+ series = axisSeries[reversedStacks ? i : len - i - 1];
+ if (series.setStackCliffs) {
+ series.setStackCliffs();
+ }
+ }
+ // Loop up again to compute percent stack
+ if (this.usePercentage) {
+ for (i = 0; i < len; i++) {
+ axisSeries[i].setPercentStacks();
+ }
+ }
+ }
+ };
+
+ Axis.prototype.renderStackTotals = function () {
+ var axis = this,
+ chart = axis.chart,
+ renderer = chart.renderer,
+ stacks = axis.stacks,
+ stackKey,
+ oneStack,
+ stackCategory,
+ stackTotalGroup = axis.stackTotalGroup;
+
+ // Create a separate group for the stack total labels
+ if (!stackTotalGroup) {
+ axis.stackTotalGroup = stackTotalGroup =
+ renderer.g('stack-labels')
+ .attr({
+ visibility: VISIBLE,
+ zIndex: 6
+ })
+ .add();
+ }
+
+ // plotLeft/Top will change when y axis gets wider so we need to translate the
+ // stackTotalGroup at every render call. See bug #506 and #516
+ stackTotalGroup.translate(chart.plotLeft, chart.plotTop);
+
+ // Render each stack total
+ for (stackKey in stacks) {
+ oneStack = stacks[stackKey];
+ for (stackCategory in oneStack) {
+ oneStack[stackCategory].render(stackTotalGroup);
+ }
+ }
+ };
+
+ /**
+ * Set all the stacks to initial states and destroy unused ones.
+ */
+ Axis.prototype.resetStacks = function () {
+ var stacks = this.stacks,
+ type,
+ i;
+ if (!this.isXAxis) {
+ for (type in stacks) {
+ for (i in stacks[type]) {
+
+ // Clean up memory after point deletion (#1044, #4320)
+ if (stacks[type][i].touched < this.stacksTouched) {
+ stacks[type][i].destroy();
+ delete stacks[type][i];
+
+ // Reset stacks
+ } else {
+ stacks[type][i].total = null;
+ stacks[type][i].cum = 0;
+ }
+ }
+ }
+ }
+ };
+
+ Axis.prototype.cleanStacks = function () {
+ var stacks, type, i;
+
+ if (!this.isXAxis) {
+ if (this.oldStacks) {
+ stacks = this.stacks = this.oldStacks;
+ }
+
+ // reset stacks
+ for (type in stacks) {
+ for (i in stacks[type]) {
+ stacks[type][i].cum = stacks[type][i].total;
+ }
+ }
+ }
+ };
+
+
+ // Stacking methods defnied for Series prototype
+
+ /**
+ * Adds series' points value to corresponding stack
+ */
+ Series.prototype.setStackedPoints = function () {
+ if (!this.options.stacking || (this.visible !== true && this.chart.options.chart.ignoreHiddenSeries !== false)) {
+ return;
+ }
+
+ var series = this,
+ xData = series.processedXData,
+ yData = series.processedYData,
+ stackedYData = [],
+ yDataLength = yData.length,
+ seriesOptions = series.options,
+ threshold = seriesOptions.threshold,
+ stackThreshold = seriesOptions.startFromThreshold ? threshold : 0,
+ stackOption = seriesOptions.stack,
+ stacking = seriesOptions.stacking,
+ stackKey = series.stackKey,
+ negKey = '-' + stackKey,
+ negStacks = series.negStacks,
+ yAxis = series.yAxis,
+ stacks = yAxis.stacks,
+ oldStacks = yAxis.oldStacks,
+ stackIndicator,
+ isNegative,
+ stack,
+ other,
+ key,
+ pointKey,
+ i,
+ x,
+ y;
+
+
+ yAxis.stacksTouched += 1;
+
+ // loop over the non-null y values and read them into a local array
+ for (i = 0; i < yDataLength; i++) {
+ x = xData[i];
+ y = yData[i];
+ stackIndicator = series.getStackIndicator(stackIndicator, x, series.index);
+ pointKey = stackIndicator.key;
+ // Read stacked values into a stack based on the x value,
+ // the sign of y and the stack key. Stacking is also handled for null values (#739)
+ isNegative = negStacks && y < (stackThreshold ? 0 : threshold);
+ key = isNegative ? negKey : stackKey;
+
+ // Create empty object for this stack if it doesn't exist yet
+ if (!stacks[key]) {
+ stacks[key] = {};
+ }
+
+ // Initialize StackItem for this x
+ if (!stacks[key][x]) {
+ if (oldStacks[key] && oldStacks[key][x]) {
+ stacks[key][x] = oldStacks[key][x];
+ stacks[key][x].total = null;
+ } else {
+ stacks[key][x] = new StackItem(yAxis, yAxis.options.stackLabels, isNegative, x, stackOption);
+ }
+ }
+
+ // If the StackItem doesn't exist, create it first
+ stack = stacks[key][x];
+ if (y !== null) {
+ stack.points[pointKey] = stack.points[series.index] = [pick(stack.cum, stackThreshold)];
+
+ // Record the base of the stack
+ if (!defined(stack.cum)) {
+ stack.base = pointKey;
+ }
+ stack.touched = yAxis.stacksTouched;
+
+
+ // In area charts, if there are multiple points on the same X value, let the
+ // area fill the full span of those points
+ if (stackIndicator.index > 0 && series.singleStacks === false) {
+ stack.points[pointKey][0] = stack.points[series.index + ',' + x + ',0'][0];
+ }
+ }
+
+ // Add value to the stack total
+ if (stacking === 'percent') {
+
+ // Percent stacked column, totals are the same for the positive and negative stacks
+ other = isNegative ? stackKey : negKey;
+ if (negStacks && stacks[other] && stacks[other][x]) {
+ other = stacks[other][x];
+ stack.total = other.total = mathMax(other.total, stack.total) + mathAbs(y) || 0;
+
+ // Percent stacked areas
+ } else {
+ stack.total = correctFloat(stack.total + (mathAbs(y) || 0));
+ }
+ } else {
+ stack.total = correctFloat(stack.total + (y || 0));
+ }
+
+ stack.cum = pick(stack.cum, stackThreshold) + (y || 0);
+
+ if (y !== null) {
+ stack.points[pointKey].push(stack.cum);
+ stackedYData[i] = stack.cum;
+ }
+
+ }
+
+ if (stacking === 'percent') {
+ yAxis.usePercentage = true;
+ }
+
+ this.stackedYData = stackedYData; // To be used in getExtremes
+
+ // Reset old stacks
+ yAxis.oldStacks = {};
+ };
+
+ /**
+ * Iterate over all stacks and compute the absolute values to percent
+ */
+ Series.prototype.setPercentStacks = function () {
+ var series = this,
+ stackKey = series.stackKey,
+ stacks = series.yAxis.stacks,
+ processedXData = series.processedXData,
+ stackIndicator;
+
+ each([stackKey, '-' + stackKey], function (key) {
+ var i = processedXData.length,
+ x,
+ stack,
+ pointExtremes,
+ totalFactor;
+
+ while (i--) {
+ x = processedXData[i];
+ stackIndicator = series.getStackIndicator(stackIndicator, x, series.index);
+ stack = stacks[key] && stacks[key][x];
+ pointExtremes = stack && stack.points[stackIndicator.key];
+ if (pointExtremes) {
+ totalFactor = stack.total ? 100 / stack.total : 0;
+ pointExtremes[0] = correctFloat(pointExtremes[0] * totalFactor); // Y bottom value
+ pointExtremes[1] = correctFloat(pointExtremes[1] * totalFactor); // Y value
+ series.stackedYData[i] = pointExtremes[1];
+ }
+ }
+ });
+ };
+
+ /**
+ * Get stack indicator, according to it's x-value, to determine points with the same x-value
+ */
+ Series.prototype.getStackIndicator = function (stackIndicator, x, index) {
+ if (!defined(stackIndicator) || stackIndicator.x !== x) {
+ stackIndicator = {
+ x: x,
+ index: 0
+ };
+ } else {
+ stackIndicator.index++;
+ }
+
+ stackIndicator.key = [index, x, stackIndicator.index].join(',');
+
+ return stackIndicator;
+ };
+
+ // Extend the Chart prototype for dynamic methods
+ extend(Chart.prototype, {
+
+ /**
+ * Add a series dynamically after time
+ *
+ * @param {Object} options The config options
+ * @param {Boolean} redraw Whether to redraw the chart after adding. Defaults to true.
+ * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+ * configuration
+ *
+ * @return {Object} series The newly created series object
+ */
+ addSeries: function (options, redraw, animation) {
+ var series,
+ chart = this;
+
+ if (options) {
+ redraw = pick(redraw, true); // defaults to true
+
+ fireEvent(chart, 'addSeries', { options: options }, function () {
+ series = chart.initSeries(options);
+
+ chart.isDirtyLegend = true; // the series array is out of sync with the display
+ chart.linkSeries();
+ if (redraw) {
+ chart.redraw(animation);
+ }
+ });
+ }
+
+ return series;
+ },
+
+ /**
+ * Add an axis to the chart
+ * @param {Object} options The axis option
+ * @param {Boolean} isX Whether it is an X axis or a value axis
+ */
+ addAxis: function (options, isX, redraw, animation) {
+ var key = isX ? 'xAxis' : 'yAxis',
+ chartOptions = this.options,
+ userOptions = merge(options, {
+ index: this[key].length,
+ isX: isX
+ });
+
+ new Axis(this, userOptions); // eslint-disable-line no-new
+
+ // Push the new axis options to the chart options
+ chartOptions[key] = splat(chartOptions[key] || {});
+ chartOptions[key].push(userOptions);
+
+ if (pick(redraw, true)) {
+ this.redraw(animation);
+ }
+ },
+
+ /**
+ * Dim the chart and show a loading text or symbol
+ * @param {String} str An optional text to show in the loading label instead of the default one
+ */
+ showLoading: function (str) {
+ var chart = this,
+ options = chart.options,
+ loadingDiv = chart.loadingDiv,
+ loadingOptions = options.loading,
+ setLoadingSize = function () {
+ if (loadingDiv) {
+ css(loadingDiv, {
+ left: chart.plotLeft + PX,
+ top: chart.plotTop + PX,
+ width: chart.plotWidth + PX,
+ height: chart.plotHeight + PX
+ });
+ }
+ };
+
+ // create the layer at the first call
+ if (!loadingDiv) {
+ chart.loadingDiv = loadingDiv = createElement(DIV, {
+ className: PREFIX + 'loading'
+ }, extend(loadingOptions.style, {
+ zIndex: 10,
+ display: NONE
+ }), chart.container);
+
+ chart.loadingSpan = createElement(
+ 'span',
+ null,
+ loadingOptions.labelStyle,
+ loadingDiv
+ );
+ addEvent(chart, 'redraw', setLoadingSize); // #1080
+ }
+
+ // update text
+ chart.loadingSpan.innerHTML = str || options.lang.loading;
+
+ // show it
+ if (!chart.loadingShown) {
+ css(loadingDiv, {
+ opacity: 0,
+ display: ''
+ });
+ animate(loadingDiv, {
+ opacity: loadingOptions.style.opacity
+ }, {
+ duration: loadingOptions.showDuration || 0
+ });
+ chart.loadingShown = true;
+ }
+ setLoadingSize();
+ },
+
+ /**
+ * Hide the loading layer
+ */
+ hideLoading: function () {
+ var options = this.options,
+ loadingDiv = this.loadingDiv;
+
+ if (loadingDiv) {
+ animate(loadingDiv, {
+ opacity: 0
+ }, {
+ duration: options.loading.hideDuration || 100,
+ complete: function () {
+ css(loadingDiv, { display: NONE });
+ }
+ });
+ }
+ this.loadingShown = false;
+ }
+ });
+
+ // extend the Point prototype for dynamic methods
+ extend(Point.prototype, {
+ /**
+ * Update the point with new options (typically x/y data) and optionally redraw the series.
+ *
+ * @param {Object} options Point options as defined in the series.data array
+ * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+ * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+ * configuration
+ *
+ */
+ update: function (options, redraw, animation, runEvent) {
+ var point = this,
+ series = point.series,
+ graphic = point.graphic,
+ i,
+ chart = series.chart,
+ seriesOptions = series.options,
+ names = series.xAxis && series.xAxis.names;
+
+ redraw = pick(redraw, true);
+
+ function update() {
+
+ point.applyOptions(options);
+
+ // Update visuals
+ if (point.y === null && graphic) { // #4146
+ point.graphic = graphic.destroy();
+ }
+ if (isObject(options, true)) {
+ // Defer the actual redraw until getAttribs has been called (#3260)
+ point.redraw = function () {
+ if (graphic && graphic.element) {
+ if (options && options.marker && options.marker.symbol) {
+ point.graphic = graphic.destroy();
+ }
+ }
+ if (options && options.dataLabels && point.dataLabel) { // #2468
+ point.dataLabel = point.dataLabel.destroy();
+ }
+ point.redraw = null;
+ };
+ }
+
+ // record changes in the parallel arrays
+ i = point.index;
+ series.updateParallelArrays(point, i);
+ if (names && point.name) {
+ names[point.x] = point.name;
+ }
+
+ // Record the options to options.data. If there is an object from before,
+ // use point options, otherwise use raw options. (#4701)
+ seriesOptions.data[i] = isObject(seriesOptions.data[i], true) ? point.options : options;
+
+ // redraw
+ series.isDirty = series.isDirtyData = true;
+ if (!series.fixedBox && series.hasCartesianSeries) { // #1906, #2320
+ chart.isDirtyBox = true;
+ }
+
+ if (seriesOptions.legendType === 'point') { // #1831, #1885
+ chart.isDirtyLegend = true;
+ }
+ if (redraw) {
+ chart.redraw(animation);
+ }
+ }
+
+ // Fire the event with a default handler of doing the update
+ if (runEvent === false) { // When called from setData
+ update();
+ } else {
+ point.firePointEvent('update', { options: options }, update);
+ }
+ },
+
+ /**
+ * Remove a point and optionally redraw the series and if necessary the axes
+ * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+ * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+ * configuration
+ */
+ remove: function (redraw, animation) {
+ this.series.removePoint(inArray(this, this.series.data), redraw, animation);
+ }
+ });
+
+ // Extend the series prototype for dynamic methods
+ extend(Series.prototype, {
+ /**
+ * Add a point dynamically after chart load time
+ * @param {Object} options Point options as given in series.data
+ * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+ * @param {Boolean} shift If shift is true, a point is shifted off the start
+ * of the series as one is appended to the end.
+ * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+ * configuration
+ */
+ addPoint: function (options, redraw, shift, animation) {
+ var series = this,
+ seriesOptions = series.options,
+ data = series.data,
+ chart = series.chart,
+ names = series.xAxis && series.xAxis.names,
+ dataOptions = seriesOptions.data,
+ point,
+ isInTheMiddle,
+ xData = series.xData,
+ i,
+ x;
+
+ setAnimation(animation, chart);
+
+ // Optional redraw, defaults to true
+ redraw = pick(redraw, true);
+
+ // Get options and push the point to xData, yData and series.options. In series.generatePoints
+ // the Point instance will be created on demand and pushed to the series.data array.
+ point = { series: series };
+ series.pointClass.prototype.applyOptions.apply(point, [options]);
+ x = point.x;
+
+ // Get the insertion point
+ i = xData.length;
+ if (series.requireSorting && x < xData[i - 1]) {
+ isInTheMiddle = true;
+ while (i && xData[i - 1] > x) {
+ i--;
+ }
+ }
+
+ series.updateParallelArrays(point, 'splice', i, 0, 0); // insert undefined item
+ series.updateParallelArrays(point, i); // update it
+
+ if (names && point.name) {
+ names[x] = point.name;
+ }
+ dataOptions.splice(i, 0, options);
+
+ if (isInTheMiddle) {
+ series.data.splice(i, 0, null);
+ series.processData();
+ }
+
+ // Generate points to be added to the legend (#1329)
+ if (seriesOptions.legendType === 'point') {
+ series.generatePoints();
+ }
+
+ // Shift the first point off the parallel arrays
+ if (shift) {
+ if (data[0] && data[0].remove) {
+ data[0].remove(false);
+ } else {
+ data.shift();
+ series.updateParallelArrays(point, 'shift');
+
+ dataOptions.shift();
+ }
+ }
+
+ // redraw
+ series.isDirty = true;
+ series.isDirtyData = true;
+ if (redraw) {
+ series.getAttribs(); // #1937
+ chart.redraw();
+ }
+ },
+
+ /**
+ * Remove a point (rendered or not), by index
+ */
+ removePoint: function (i, redraw, animation) {
+
+ var series = this,
+ data = series.data,
+ point = data[i],
+ points = series.points,
+ chart = series.chart,
+ remove = function () {
+
+ if (points && points.length === data.length) { // #4935
+ points.splice(i, 1);
+ }
+ data.splice(i, 1);
+ series.options.data.splice(i, 1);
+ series.updateParallelArrays(point || { series: series }, 'splice', i, 1);
+
+ if (point) {
+ point.destroy();
+ }
+
+ // redraw
+ series.isDirty = true;
+ series.isDirtyData = true;
+ if (redraw) {
+ chart.redraw();
+ }
+ };
+
+ setAnimation(animation, chart);
+ redraw = pick(redraw, true);
+
+ // Fire the event with a default handler of removing the point
+ if (point) {
+ point.firePointEvent('remove', null, remove);
+ } else {
+ remove();
+ }
+ },
+
+ /**
+ * Remove a series and optionally redraw the chart
+ *
+ * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+ * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+ * configuration
+ */
+ remove: function (redraw, animation) {
+ var series = this,
+ chart = series.chart;
+
+ // Fire the event with a default handler of removing the point
+ fireEvent(series, 'remove', null, function () {
+
+ // Destroy elements
+ series.destroy();
+
+ // Redraw
+ chart.isDirtyLegend = chart.isDirtyBox = true;
+ chart.linkSeries();
+
+ if (pick(redraw, true)) {
+ chart.redraw(animation);
+ }
+ });
+ },
+
+ /**
+ * Update the series with a new set of options
+ */
+ update: function (newOptions, redraw) {
+ var series = this,
+ chart = this.chart,
+ // must use user options when changing type because this.options is merged
+ // in with type specific plotOptions
+ oldOptions = this.userOptions,
+ oldType = this.type,
+ proto = seriesTypes[oldType].prototype,
+ preserve = ['group', 'markerGroup', 'dataLabelsGroup'],
+ n;
+
+ // If we're changing type or zIndex, create new groups (#3380, #3404)
+ if ((newOptions.type && newOptions.type !== oldType) || newOptions.zIndex !== undefined) {
+ preserve.length = 0;
+ }
+
+ // Make sure groups are not destroyed (#3094)
+ each(preserve, function (prop) {
+ preserve[prop] = series[prop];
+ delete series[prop];
+ });
+
+ // Do the merge, with some forced options
+ newOptions = merge(oldOptions, {
+ animation: false,
+ index: this.index,
+ pointStart: this.xData[0] // when updating after addPoint
+ }, { data: this.options.data }, newOptions);
+
+ // Destroy the series and delete all properties. Reinsert all methods
+ // and properties from the new type prototype (#2270, #3719)
+ this.remove(false);
+ for (n in proto) {
+ this[n] = UNDEFINED;
+ }
+ extend(this, seriesTypes[newOptions.type || oldType].prototype);
+
+ // Re-register groups (#3094)
+ each(preserve, function (prop) {
+ series[prop] = preserve[prop];
+ });
+
+ this.init(chart, newOptions);
+ chart.linkSeries(); // Links are lost in this.remove (#3028)
+ if (pick(redraw, true)) {
+ chart.redraw(false);
+ }
+ }
+ });
+
+ // Extend the Axis.prototype for dynamic methods
+ extend(Axis.prototype, {
+
+ /**
+ * Update the axis with a new options structure
+ */
+ update: function (newOptions, redraw) {
+ var chart = this.chart;
+
+ newOptions = chart.options[this.coll][this.options.index] = merge(this.userOptions, newOptions);
+
+ this.destroy(true);
+
+ this.init(chart, extend(newOptions, { events: UNDEFINED }));
+
+ chart.isDirtyBox = true;
+ if (pick(redraw, true)) {
+ chart.redraw();
+ }
+ },
+
+ /**
+ * Remove the axis from the chart
+ */
+ remove: function (redraw) {
+ var chart = this.chart,
+ key = this.coll, // xAxis or yAxis
+ axisSeries = this.series,
+ i = axisSeries.length;
+
+ // Remove associated series (#2687)
+ while (i--) {
+ if (axisSeries[i]) {
+ axisSeries[i].remove(false);
+ }
+ }
+
+ // Remove the axis
+ erase(chart.axes, this);
+ erase(chart[key], this);
+ chart.options[key].splice(this.options.index, 1);
+ each(chart[key], function (axis, i) { // Re-index, #1706
+ axis.options.index = i;
+ });
+ this.destroy();
+ chart.isDirtyBox = true;
+
+ if (pick(redraw, true)) {
+ chart.redraw();
+ }
+ },
+
+ /**
+ * Update the axis title by options
+ */
+ setTitle: function (newTitleOptions, redraw) {
+ this.update({ title: newTitleOptions }, redraw);
+ },
+
+ /**
+ * Set new axis categories and optionally redraw
+ * @param {Array} categories
+ * @param {Boolean} redraw
+ */
+ setCategories: function (categories, redraw) {
+ this.update({ categories: categories }, redraw);
+ }
+
+ });
+
+
+ /**
+ * LineSeries object
+ */
+ var LineSeries = extendClass(Series);
+ seriesTypes.line = LineSeries;
+
+ /**
+ * Set the default options for area
+ */
+ defaultPlotOptions.area = merge(defaultSeriesOptions, {
+ softThreshold: false,
+ threshold: 0
+ // trackByArea: false,
+ // lineColor: null, // overrides color, but lets fillColor be unaltered
+ // fillOpacity: 0.75,
+ // fillColor: null
+ });
+
+ /**
+ * AreaSeries object
+ */
+ var AreaSeries = extendClass(Series, {
+ type: 'area',
+ singleStacks: false,
+ /**
+ * Return an array of stacked points, where null and missing points are replaced by
+ * dummy points in order for gaps to be drawn correctly in stacks.
+ */
+ getStackPoints: function () {
+ var series = this,
+ segment = [],
+ keys = [],
+ xAxis = this.xAxis,
+ yAxis = this.yAxis,
+ stack = yAxis.stacks[this.stackKey],
+ pointMap = {},
+ points = this.points,
+ seriesIndex = series.index,
+ yAxisSeries = yAxis.series,
+ seriesLength = yAxisSeries.length,
+ visibleSeries,
+ upOrDown = pick(yAxis.options.reversedStacks, true) ? 1 : -1,
+ i,
+ x;
+
+ if (this.options.stacking) {
+ // Create a map where we can quickly look up the points by their X value.
+ for (i = 0; i < points.length; i++) {
+ pointMap[points[i].x] = points[i];
+ }
+
+ // Sort the keys (#1651)
+ for (x in stack) {
+ if (stack[x].total !== null) { // nulled after switching between grouping and not (#1651, #2336)
+ keys.push(x);
+ }
+ }
+ keys.sort(function (a, b) {
+ return a - b;
+ });
+
+ visibleSeries = map(yAxisSeries, function () {
+ return this.visible;
+ });
+
+ each(keys, function (x, idx) {
+ var y = 0,
+ stackPoint,
+ stackedValues;
+
+ if (pointMap[x] && !pointMap[x].isNull) {
+ segment.push(pointMap[x]);
+
+ // Find left and right cliff. -1 goes left, 1 goes right.
+ each([-1, 1], function (direction) {
+ var nullName = direction === 1 ? 'rightNull' : 'leftNull',
+ cliffName = direction === 1 ? 'rightCliff' : 'leftCliff',
+ cliff = 0,
+ otherStack = stack[keys[idx + direction]];
+
+ // If there is a stack next to this one, to the left or to the right...
+ if (otherStack) {
+ i = seriesIndex;
+ while (i >= 0 && i < seriesLength) { // Can go either up or down, depending on reversedStacks
+ stackPoint = otherStack.points[i];
+ if (!stackPoint) {
+ // If the next point in this series is missing, mark the point
+ // with point.leftNull or point.rightNull = true.
+ if (i === seriesIndex) {
+ pointMap[x][nullName] = true;
+
+ // If there are missing points in the next stack in any of the
+ // series below this one, we need to substract the missing values
+ // and add a hiatus to the left or right.
+ } else if (visibleSeries[i]) {
+ stackedValues = stack[x].points[i];
+ if (stackedValues) {
+ cliff -= stackedValues[1] - stackedValues[0];
+ }
+ }
+ }
+ // When reversedStacks is true, loop up, else loop down
+ i += upOrDown;
+ }
+ }
+ pointMap[x][cliffName] = cliff;
+ });
+
+
+ // There is no point for this X value in this series, so we
+ // insert a dummy point in order for the areas to be drawn
+ // correctly.
+ } else {
+
+ // Loop down the stack to find the series below this one that has
+ // a value (#1991)
+ i = seriesIndex;
+ while (i >= 0 && i < seriesLength) {
+ stackPoint = stack[x].points[i];
+ if (stackPoint) {
+ y = stackPoint[1];
+ break;
+ }
+ // When reversedStacks is true, loop up, else loop down
+ i += upOrDown;
+ }
+
+ y = yAxis.toPixels(y, true);
+ segment.push({
+ isNull: true,
+ plotX: xAxis.toPixels(x, true),
+ plotY: y,
+ yBottom: y
+ });
+ }
+ });
+
+ }
+
+ return segment;
+ },
+
+ getGraphPath: function (points) {
+ var getGraphPath = Series.prototype.getGraphPath,
+ graphPath,
+ options = this.options,
+ stacking = options.stacking,
+ yAxis = this.yAxis,
+ topPath,
+ //topPoints = [],
+ bottomPath,
+ bottomPoints = [],
+ graphPoints = [],
+ seriesIndex = this.index,
+ i,
+ areaPath,
+ plotX,
+ stacks = yAxis.stacks[this.stackKey],
+ threshold = options.threshold,
+ translatedThreshold = yAxis.getThreshold(options.threshold),
+ isNull,
+ yBottom,
+ connectNulls = options.connectNulls || stacking === 'percent',
+ /**
+ * To display null points in underlying stacked series, this series graph must be
+ * broken, and the area also fall down to fill the gap left by the null point. #2069
+ */
+ addDummyPoints = function (i, otherI, side) {
+ var point = points[i],
+ stackedValues = stacking && stacks[point.x].points[seriesIndex],
+ nullVal = point[side + 'Null'] || 0,
+ cliffVal = point[side + 'Cliff'] || 0,
+ top,
+ bottom,
+ isNull = true;
+
+ if (cliffVal || nullVal) {
+
+ top = (nullVal ? stackedValues[0] : stackedValues[1]) + cliffVal;
+ bottom = stackedValues[0] + cliffVal;
+ isNull = !!nullVal;
+
+ } else if (!stacking && points[otherI] && points[otherI].isNull) {
+ top = bottom = threshold;
+ }
+
+ // Add to the top and bottom line of the area
+ if (top !== undefined) {
+ graphPoints.push({
+ plotX: plotX,
+ plotY: top === null ? translatedThreshold : yAxis.getThreshold(top),
+ isNull: isNull
+ });
+ bottomPoints.push({
+ plotX: plotX,
+ plotY: bottom === null ? translatedThreshold : yAxis.getThreshold(bottom)
+ });
+ }
+ };
+
+ // Find what points to use
+ points = points || this.points;
+
+
+ // Fill in missing points
+ if (stacking) {
+ points = this.getStackPoints();
+ }
+
+ for (i = 0; i < points.length; i++) {
+ isNull = points[i].isNull;
+ plotX = pick(points[i].rectPlotX, points[i].plotX);
+ yBottom = pick(points[i].yBottom, translatedThreshold);
+
+ if (!isNull || connectNulls) {
+
+ if (!connectNulls) {
+ addDummyPoints(i, i - 1, 'left');
+ }
+
+ if (!(isNull && !stacking && connectNulls)) { // Skip null point when stacking is false and connectNulls true
+ graphPoints.push(points[i]);
+ bottomPoints.push({
+ x: i,
+ plotX: plotX,
+ plotY: yBottom
+ });
+ }
+
+ if (!connectNulls) {
+ addDummyPoints(i, i + 1, 'right');
+ }
+ }
+ }
+
+ topPath = getGraphPath.call(this, graphPoints, true, true);
+
+ bottomPoints.reversed = true;
+ bottomPath = getGraphPath.call(this, bottomPoints, true, true);
+ if (bottomPath.length) {
+ bottomPath[0] = L;
+ }
+
+ areaPath = topPath.concat(bottomPath);
+ graphPath = getGraphPath.call(this, graphPoints, false, connectNulls); // TODO: don't set leftCliff and rightCliff when connectNulls?
+
+ areaPath.xMap = topPath.xMap;
+ this.areaPath = areaPath;
+ return graphPath;
+ },
+
+ /**
+ * Draw the graph and the underlying area. This method calls the Series base
+ * function and adds the area. The areaPath is calculated in the getSegmentPath
+ * method called from Series.prototype.drawGraph.
+ */
+ drawGraph: function () {
+
+ // Define or reset areaPath
+ this.areaPath = [];
+
+ // Call the base method
+ Series.prototype.drawGraph.apply(this);
+
+ // Define local variables
+ var series = this,
+ areaPath = this.areaPath,
+ options = this.options,
+ zones = this.zones,
+ props = [['area', this.color, options.fillColor]]; // area name, main color, fill color
+
+ each(zones, function (threshold, i) {
+ props.push(['zoneArea' + i, threshold.color || series.color, threshold.fillColor || options.fillColor]);
+ });
+ each(props, function (prop) {
+ var areaKey = prop[0],
+ area = series[areaKey],
+ attr;
+
+ // Create or update the area
+ if (area) { // update
+ area.endX = areaPath.xMap;
+ area.animate({ d: areaPath });
+
+ } else { // create
+ attr = {
+ fill: prop[2] || prop[1],
+ zIndex: 0 // #1069
+ };
+ if (!prop[2]) {
+ attr['fill-opacity'] = pick(options.fillOpacity, 0.75);
+ }
+ area = series[areaKey] = series.chart.renderer.path(areaPath)
+ .attr(attr)
+ .add(series.group);
+ area.isArea = true;
+ }
+ area.startX = areaPath.xMap;
+ area.shiftUnit = options.step ? 2 : 1;
+ });
+ },
+
+ drawLegendSymbol: LegendSymbolMixin.drawRectangle
+ });
+
+ seriesTypes.area = AreaSeries;
+ /**
+ * Set the default options for spline
+ */
+ defaultPlotOptions.spline = merge(defaultSeriesOptions);
+
+ /**
+ * SplineSeries object
+ */
+ var SplineSeries = extendClass(Series, {
+ type: 'spline',
+
+ /**
+ * Get the spline segment from a given point's previous neighbour to the given point
+ */
+ getPointSpline: function (points, point, i) {
+ var smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc
+ denom = smoothing + 1,
+ plotX = point.plotX,
+ plotY = point.plotY,
+ lastPoint = points[i - 1],
+ nextPoint = points[i + 1],
+ leftContX,
+ leftContY,
+ rightContX,
+ rightContY,
+ ret;
+
+ // Find control points
+ if (lastPoint && !lastPoint.isNull && nextPoint && !nextPoint.isNull) {
+ var lastX = lastPoint.plotX,
+ lastY = lastPoint.plotY,
+ nextX = nextPoint.plotX,
+ nextY = nextPoint.plotY,
+ correction = 0;
+
+ leftContX = (smoothing * plotX + lastX) / denom;
+ leftContY = (smoothing * plotY + lastY) / denom;
+ rightContX = (smoothing * plotX + nextX) / denom;
+ rightContY = (smoothing * plotY + nextY) / denom;
+
+ // Have the two control points make a straight line through main point
+ if (rightContX !== leftContX) { // #5016, division by zero
+ correction = ((rightContY - leftContY) * (rightContX - plotX)) /
+ (rightContX - leftContX) + plotY - rightContY;
+ }
+
+ leftContY += correction;
+ rightContY += correction;
+
+ // to prevent false extremes, check that control points are between
+ // neighbouring points' y values
+ if (leftContY > lastY && leftContY > plotY) {
+ leftContY = mathMax(lastY, plotY);
+ rightContY = 2 * plotY - leftContY; // mirror of left control point
+ } else if (leftContY < lastY && leftContY < plotY) {
+ leftContY = mathMin(lastY, plotY);
+ rightContY = 2 * plotY - leftContY;
+ }
+ if (rightContY > nextY && rightContY > plotY) {
+ rightContY = mathMax(nextY, plotY);
+ leftContY = 2 * plotY - rightContY;
+ } else if (rightContY < nextY && rightContY < plotY) {
+ rightContY = mathMin(nextY, plotY);
+ leftContY = 2 * plotY - rightContY;
+ }
+
+ // record for drawing in next point
+ point.rightContX = rightContX;
+ point.rightContY = rightContY;
+
+
+ }
+
+ // Visualize control points for debugging
+ /*
+ if (leftContX) {
+ this.chart.renderer.circle(leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop, 2)
+ .attr({
+ stroke: 'red',
+ 'stroke-width': 1,
+ fill: 'none'
+ })
+ .add();
+ this.chart.renderer.path(['M', leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop,
+ 'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])
+ .attr({
+ stroke: 'red',
+ 'stroke-width': 1
+ })
+ .add();
+ this.chart.renderer.circle(rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop, 2)
+ .attr({
+ stroke: 'green',
+ 'stroke-width': 1,
+ fill: 'none'
+ })
+ .add();
+ this.chart.renderer.path(['M', rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop,
+ 'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])
+ .attr({
+ stroke: 'green',
+ 'stroke-width': 1
+ })
+ .add();
+ }
+ // */
+ ret = [
+ 'C',
+ pick(lastPoint.rightContX, lastPoint.plotX),
+ pick(lastPoint.rightContY, lastPoint.plotY),
+ pick(leftContX, plotX),
+ pick(leftContY, plotY),
+ plotX,
+ plotY
+ ];
+ lastPoint.rightContX = lastPoint.rightContY = null; // reset for updating series later
+ return ret;
+ }
+ });
+ seriesTypes.spline = SplineSeries;
+
+ /**
+ * Set the default options for areaspline
+ */
+ defaultPlotOptions.areaspline = merge(defaultPlotOptions.area);
+
+ /**
+ * AreaSplineSeries object
+ */
+ var areaProto = AreaSeries.prototype,
+ AreaSplineSeries = extendClass(SplineSeries, {
+ type: 'areaspline',
+ getStackPoints: areaProto.getStackPoints,
+ getGraphPath: areaProto.getGraphPath,
+ setStackCliffs: areaProto.setStackCliffs,
+ drawGraph: areaProto.drawGraph,
+ drawLegendSymbol: LegendSymbolMixin.drawRectangle
+ });
+
+ seriesTypes.areaspline = AreaSplineSeries;
+
+ /**
+ * Set the default options for column
+ */
+ defaultPlotOptions.column = merge(defaultSeriesOptions, {
+ borderColor: '#FFFFFF',
+ //borderWidth: 1,
+ borderRadius: 0,
+ //colorByPoint: undefined,
+ groupPadding: 0.2,
+ //grouping: true,
+ marker: null, // point options are specified in the base options
+ pointPadding: 0.1,
+ //pointWidth: null,
+ minPointLength: 0,
+ cropThreshold: 50, // when there are more points, they will not animate out of the chart on xAxis.setExtremes
+ pointRange: null, // null means auto, meaning 1 in a categorized axis and least distance between points if not categories
+ states: {
+ hover: {
+ brightness: 0.1,
+ shadow: false,
+ halo: false
+ },
+ select: {
+ color: '#C0C0C0',
+ borderColor: '#000000',
+ shadow: false
+ }
+ },
+ dataLabels: {
+ align: null, // auto
+ verticalAlign: null, // auto
+ y: null
+ },
+ softThreshold: false,
+ startFromThreshold: true, // false doesn't work well: http://jsfiddle.net/highcharts/hz8fopan/14/
+ stickyTracking: false,
+ tooltip: {
+ distance: 6
+ },
+ threshold: 0
+ });
+
+ /**
+ * ColumnSeries object
+ */
+ var ColumnSeries = extendClass(Series, {
+ type: 'column',
+ pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+ stroke: 'borderColor',
+ fill: 'color',
+ r: 'borderRadius'
+ },
+ cropShoulder: 0,
+ directTouch: true, // When tooltip is not shared, this series (and derivatives) requires direct touch/hover. KD-tree does not apply.
+ trackerGroups: ['group', 'dataLabelsGroup'],
+ negStacks: true, // use separate negative stacks, unlike area stacks where a negative
+ // point is substracted from previous (#1910)
+
+ /**
+ * Initialize the series
+ */
+ init: function () {
+ Series.prototype.init.apply(this, arguments);
+
+ var series = this,
+ chart = series.chart;
+
+ // if the series is added dynamically, force redraw of other
+ // series affected by a new column
+ if (chart.hasRendered) {
+ each(chart.series, function (otherSeries) {
+ if (otherSeries.type === series.type) {
+ otherSeries.isDirty = true;
+ }
+ });
+ }
+ },
+
+ /**
+ * Return the width and x offset of the columns adjusted for grouping, groupPadding, pointPadding,
+ * pointWidth etc.
+ */
+ getColumnMetrics: function () {
+
+ var series = this,
+ options = series.options,
+ xAxis = series.xAxis,
+ yAxis = series.yAxis,
+ reversedXAxis = xAxis.reversed,
+ stackKey,
+ stackGroups = {},
+ columnCount = 0;
+
+ // Get the total number of column type series.
+ // This is called on every series. Consider moving this logic to a
+ // chart.orderStacks() function and call it on init, addSeries and removeSeries
+ if (options.grouping === false) {
+ columnCount = 1;
+ } else {
+ each(series.chart.series, function (otherSeries) {
+ var otherOptions = otherSeries.options,
+ otherYAxis = otherSeries.yAxis,
+ columnIndex;
+ if (otherSeries.type === series.type && otherSeries.visible &&
+ yAxis.len === otherYAxis.len && yAxis.pos === otherYAxis.pos) { // #642, #2086
+ if (otherOptions.stacking) {
+ stackKey = otherSeries.stackKey;
+ if (stackGroups[stackKey] === UNDEFINED) {
+ stackGroups[stackKey] = columnCount++;
+ }
+ columnIndex = stackGroups[stackKey];
+ } else if (otherOptions.grouping !== false) { // #1162
+ columnIndex = columnCount++;
+ }
+ otherSeries.columnIndex = columnIndex;
+ }
+ });
+ }
+
+ var categoryWidth = mathMin(
+ mathAbs(xAxis.transA) * (xAxis.ordinalSlope || options.pointRange || xAxis.closestPointRange || xAxis.tickInterval || 1), // #2610
+ xAxis.len // #1535
+ ),
+ groupPadding = categoryWidth * options.groupPadding,
+ groupWidth = categoryWidth - 2 * groupPadding,
+ pointOffsetWidth = groupWidth / columnCount,
+ pointWidth = mathMin(
+ options.maxPointWidth || xAxis.len,
+ pick(options.pointWidth, pointOffsetWidth * (1 - 2 * options.pointPadding))
+ ),
+ pointPadding = (pointOffsetWidth - pointWidth) / 2,
+ colIndex = (series.columnIndex || 0) + (reversedXAxis ? 1 : 0), // #1251, #3737
+ pointXOffset = pointPadding + (groupPadding + colIndex *
+ pointOffsetWidth - (categoryWidth / 2)) *
+ (reversedXAxis ? -1 : 1);
+
+ // Save it for reading in linked series (Error bars particularly)
+ series.columnMetrics = {
+ width: pointWidth,
+ offset: pointXOffset
+ };
+ return series.columnMetrics;
+
+ },
+
+ /**
+ * Make the columns crisp. The edges are rounded to the nearest full pixel.
+ */
+ crispCol: function (x, y, w, h) {
+ var chart = this.chart,
+ borderWidth = this.borderWidth,
+ xCrisp = -(borderWidth % 2 ? 0.5 : 0),
+ yCrisp = borderWidth % 2 ? 0.5 : 1,
+ right,
+ bottom,
+ fromTop;
+
+ if (chart.inverted && chart.renderer.isVML) {
+ yCrisp += 1;
+ }
+
+ // Horizontal. We need to first compute the exact right edge, then round it
+ // and compute the width from there.
+ right = Math.round(x + w) + xCrisp;
+ x = Math.round(x) + xCrisp;
+ w = right - x;
+
+ // Vertical
+ bottom = Math.round(y + h) + yCrisp;
+ fromTop = mathAbs(y) <= 0.5 && bottom > 0.5; // #4504, #4656
+ y = Math.round(y) + yCrisp;
+ h = bottom - y;
+
+ // Top edges are exceptions
+ if (fromTop && h) { // #5146
+ y -= 1;
+ h += 1;
+ }
+
+ return {
+ x: x,
+ y: y,
+ width: w,
+ height: h
+ };
+ },
+
+ /**
+ * Translate each point to the plot area coordinate system and find shape positions
+ */
+ translate: function () {
+ var series = this,
+ chart = series.chart,
+ options = series.options,
+ borderWidth = series.borderWidth = pick(
+ options.borderWidth,
+ series.closestPointRange * series.xAxis.transA < 2 ? 0 : 1 // #3635
+ ),
+ yAxis = series.yAxis,
+ threshold = options.threshold,
+ translatedThreshold = series.translatedThreshold = yAxis.getThreshold(threshold),
+ minPointLength = pick(options.minPointLength, 5),
+ metrics = series.getColumnMetrics(),
+ pointWidth = metrics.width,
+ seriesBarW = series.barW = mathMax(pointWidth, 1 + 2 * borderWidth), // postprocessed for border width
+ pointXOffset = series.pointXOffset = metrics.offset;
+
+ if (chart.inverted) {
+ translatedThreshold -= 0.5; // #3355
+ }
+
+ // When the pointPadding is 0, we want the columns to be packed tightly, so we allow individual
+ // columns to have individual sizes. When pointPadding is greater, we strive for equal-width
+ // columns (#2694).
+ if (options.pointPadding) {
+ seriesBarW = mathCeil(seriesBarW);
+ }
+
+ Series.prototype.translate.apply(series);
+
+ // Record the new values
+ each(series.points, function (point) {
+ var yBottom = mathMin(pick(point.yBottom, translatedThreshold), 9e4), // #3575
+ safeDistance = 999 + mathAbs(yBottom),
+ plotY = mathMin(mathMax(-safeDistance, point.plotY), yAxis.len + safeDistance), // Don't draw too far outside plot area (#1303, #2241, #4264)
+ barX = point.plotX + pointXOffset,
+ barW = seriesBarW,
+ barY = mathMin(plotY, yBottom),
+ up,
+ barH = mathMax(plotY, yBottom) - barY;
+
+ // Handle options.minPointLength
+ if (mathAbs(barH) < minPointLength) {
+ if (minPointLength) {
+ barH = minPointLength;
+ up = (!yAxis.reversed && !point.negative) || (yAxis.reversed && point.negative);
+ barY = mathAbs(barY - translatedThreshold) > minPointLength ? // stacked
+ yBottom - minPointLength : // keep position
+ translatedThreshold - (up ? minPointLength : 0); // #1485, #4051
+ }
+ }
+
+ // Cache for access in polar
+ point.barX = barX;
+ point.pointWidth = pointWidth;
+
+ // Fix the tooltip on center of grouped columns (#1216, #424, #3648)
+ point.tooltipPos = chart.inverted ?
+ [yAxis.len + yAxis.pos - chart.plotLeft - plotY, series.xAxis.len - barX - barW / 2, barH] :
+ [barX + barW / 2, plotY + yAxis.pos - chart.plotTop, barH];
+
+ // Register shape type and arguments to be used in drawPoints
+ point.shapeType = 'rect';
+ point.shapeArgs = series.crispCol(barX, barY, barW, barH);
+ });
+
+ },
+
+ getSymbol: noop,
+
+ /**
+ * Use a solid rectangle like the area series types
+ */
+ drawLegendSymbol: LegendSymbolMixin.drawRectangle,
+
+
+ /**
+ * Columns have no graph
+ */
+ drawGraph: noop,
+
+ /**
+ * Draw the columns. For bars, the series.group is rotated, so the same coordinates
+ * apply for columns and bars. This method is inherited by scatter series.
+ *
+ */
+ drawPoints: function () {
+ var series = this,
+ chart = this.chart,
+ options = series.options,
+ renderer = chart.renderer,
+ animationLimit = options.animationLimit || 250,
+ shapeArgs,
+ pointAttr;
+
+ // draw the columns
+ each(series.points, function (point) {
+ var plotY = point.plotY,
+ graphic = point.graphic,
+ borderAttr;
+
+ if (isNumber(plotY) && point.y !== null) {
+ shapeArgs = point.shapeArgs;
+
+ borderAttr = defined(series.borderWidth) ? {
+ 'stroke-width': series.borderWidth
+ } : {};
+
+ pointAttr = point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE] || series.pointAttr[NORMAL_STATE];
+
+ if (graphic) { // update
+ stop(graphic);
+ graphic.attr(borderAttr).attr(pointAttr)[chart.pointCount < animationLimit ? 'animate' : 'attr'](merge(shapeArgs)); // #4267
+
+ } else {
+ point.graphic = graphic = renderer[point.shapeType](shapeArgs)
+ .attr(borderAttr)
+ .attr(pointAttr)
+ .add(point.group || series.group)
+ .shadow(options.shadow, null, options.stacking && !options.borderRadius);
+ }
+
+ } else if (graphic) {
+ point.graphic = graphic.destroy(); // #1269
+ }
+ });
+ },
+
+ /**
+ * Animate the column heights one by one from zero
+ * @param {Boolean} init Whether to initialize the animation or run it
+ */
+ animate: function (init) {
+ var series = this,
+ yAxis = this.yAxis,
+ options = series.options,
+ inverted = this.chart.inverted,
+ attr = {},
+ translatedThreshold;
+
+ if (hasSVG) { // VML is too slow anyway
+ if (init) {
+ attr.scaleY = 0.001;
+ translatedThreshold = mathMin(yAxis.pos + yAxis.len, mathMax(yAxis.pos, yAxis.toPixels(options.threshold)));
+ if (inverted) {
+ attr.translateX = translatedThreshold - yAxis.len;
+ } else {
+ attr.translateY = translatedThreshold;
+ }
+ series.group.attr(attr);
+
+ } else { // run the animation
+
+ attr[inverted ? 'translateX' : 'translateY'] = yAxis.pos;
+ series.group.animate(attr, extend(animObject(series.options.animation), {
+ // Do the scale synchronously to ensure smooth updating (#5030)
+ step: function (val, fx) {
+ series.group.attr({
+ scaleY: mathMax(0.001, fx.pos) // #5250
+ });
+ }
+ }));
+
+ // delete this function to allow it only once
+ series.animate = null;
+ }
+ }
+ },
+
+ /**
+ * Remove this series from the chart
+ */
+ remove: function () {
+ var series = this,
+ chart = series.chart;
+
+ // column and bar series affects other series of the same type
+ // as they are either stacked or grouped
+ if (chart.hasRendered) {
+ each(chart.series, function (otherSeries) {
+ if (otherSeries.type === series.type) {
+ otherSeries.isDirty = true;
+ }
+ });
+ }
+
+ Series.prototype.remove.apply(series, arguments);
+ }
+ });
+ seriesTypes.column = ColumnSeries;
+ /**
+ * Set the default options for bar
+ */
+ defaultPlotOptions.bar = merge(defaultPlotOptions.column);
+ /**
+ * The Bar series class
+ */
+ var BarSeries = extendClass(ColumnSeries, {
+ type: 'bar',
+ inverted: true
+ });
+ seriesTypes.bar = BarSeries;
+
+ /**
+ * Set the default options for scatter
+ */
+ defaultPlotOptions.scatter = merge(defaultSeriesOptions, {
+ lineWidth: 0,
+ marker: {
+ enabled: true // Overrides auto-enabling in line series (#3647)
+ },
+ tooltip: {
+ headerFormat: '\u25CF {series.name} ',
+ pointFormat: 'x: {point.x} y: {point.y} '
+ }
+ });
+
+ /**
+ * The scatter series class
+ */
+ var ScatterSeries = extendClass(Series, {
+ type: 'scatter',
+ sorted: false,
+ requireSorting: false,
+ noSharedTooltip: true,
+ trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup'],
+ takeOrdinalPosition: false, // #2342
+ kdDimensions: 2,
+ drawGraph: function () {
+ if (this.options.lineWidth) {
+ Series.prototype.drawGraph.call(this);
+ }
+ }
+ });
+
+ seriesTypes.scatter = ScatterSeries;
+
+ /**
+ * Set the default options for pie
+ */
+ defaultPlotOptions.pie = merge(defaultSeriesOptions, {
+ borderColor: '#FFFFFF',
+ borderWidth: 1,
+ center: [null, null],
+ clip: false,
+ colorByPoint: true, // always true for pies
+ dataLabels: {
+ // align: null,
+ // connectorWidth: 1,
+ // connectorColor: point.color,
+ // connectorPadding: 5,
+ distance: 30,
+ enabled: true,
+ formatter: function () { // #2945
+ return this.y === null ? undefined : this.point.name;
+ },
+ // softConnector: true,
+ x: 0
+ // y: 0
+ },
+ ignoreHiddenPoint: true,
+ //innerSize: 0,
+ legendType: 'point',
+ marker: null, // point options are specified in the base options
+ size: null,
+ showInLegend: false,
+ slicedOffset: 10,
+ states: {
+ hover: {
+ brightness: 0.1,
+ shadow: false
+ }
+ },
+ stickyTracking: false,
+ tooltip: {
+ followPointer: true
+ }
+ });
+
+ /**
+ * Extended point object for pies
+ */
+ var PiePoint = extendClass(Point, {
+ /**
+ * Initiate the pie slice
+ */
+ init: function () {
+
+ Point.prototype.init.apply(this, arguments);
+
+ var point = this,
+ toggleSlice;
+
+ point.name = pick(point.name, 'Slice');
+
+ // add event listener for select
+ toggleSlice = function (e) {
+ point.slice(e.type === 'select');
+ };
+ addEvent(point, 'select', toggleSlice);
+ addEvent(point, 'unselect', toggleSlice);
+
+ return point;
+ },
+
+ /**
+ * Toggle the visibility of the pie slice
+ * @param {Boolean} vis Whether to show the slice or not. If undefined, the
+ * visibility is toggled
+ */
+ setVisible: function (vis, redraw) {
+ var point = this,
+ series = point.series,
+ chart = series.chart,
+ ignoreHiddenPoint = series.options.ignoreHiddenPoint;
+
+ redraw = pick(redraw, ignoreHiddenPoint);
+
+ if (vis !== point.visible) {
+
+ // If called without an argument, toggle visibility
+ point.visible = point.options.visible = vis = vis === UNDEFINED ? !point.visible : vis;
+ series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data
+
+ // Show and hide associated elements. This is performed regardless of redraw or not,
+ // because chart.redraw only handles full series.
+ each(['graphic', 'dataLabel', 'connector', 'shadowGroup'], function (key) {
+ if (point[key]) {
+ point[key][vis ? 'show' : 'hide'](true);
+ }
+ });
+
+ if (point.legendItem) {
+ chart.legend.colorizeItem(point, vis);
+ }
+
+ // #4170, hide halo after hiding point
+ if (!vis && point.state === 'hover') {
+ point.setState('');
+ }
+
+ // Handle ignore hidden slices
+ if (ignoreHiddenPoint) {
+ series.isDirty = true;
+ }
+
+ if (redraw) {
+ chart.redraw();
+ }
+ }
+ },
+
+ /**
+ * Set or toggle whether the slice is cut out from the pie
+ * @param {Boolean} sliced When undefined, the slice state is toggled
+ * @param {Boolean} redraw Whether to redraw the chart. True by default.
+ */
+ slice: function (sliced, redraw, animation) {
+ var point = this,
+ series = point.series,
+ chart = series.chart,
+ translation;
+
+ setAnimation(animation, chart);
+
+ // redraw is true by default
+ redraw = pick(redraw, true);
+
+ // if called without an argument, toggle
+ point.sliced = point.options.sliced = sliced = defined(sliced) ? sliced : !point.sliced;
+ series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data
+
+ translation = sliced ? point.slicedTranslation : {
+ translateX: 0,
+ translateY: 0
+ };
+
+ point.graphic.animate(translation);
+
+ if (point.shadowGroup) {
+ point.shadowGroup.animate(translation);
+ }
+
+ },
+
+ haloPath: function (size) {
+ var shapeArgs = this.shapeArgs,
+ chart = this.series.chart;
+
+ return this.sliced || !this.visible ? [] : this.series.chart.renderer.symbols.arc(chart.plotLeft + shapeArgs.x, chart.plotTop + shapeArgs.y, shapeArgs.r + size, shapeArgs.r + size, {
+ innerR: this.shapeArgs.r,
+ start: shapeArgs.start,
+ end: shapeArgs.end
+ });
+ }
+ });
+
+ /**
+ * The Pie series class
+ */
+ var PieSeries = {
+ type: 'pie',
+ isCartesian: false,
+ pointClass: PiePoint,
+ requireSorting: false,
+ directTouch: true,
+ noSharedTooltip: true,
+ trackerGroups: ['group', 'dataLabelsGroup'],
+ axisTypes: [],
+ pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+ stroke: 'borderColor',
+ 'stroke-width': 'borderWidth',
+ fill: 'color'
+ },
+
+ /**
+ * Animate the pies in
+ */
+ animate: function (init) {
+ var series = this,
+ points = series.points,
+ startAngleRad = series.startAngleRad;
+
+ if (!init) {
+ each(points, function (point) {
+ var graphic = point.graphic,
+ args = point.shapeArgs;
+
+ if (graphic) {
+ // start values
+ graphic.attr({
+ r: point.startR || (series.center[3] / 2), // animate from inner radius (#779)
+ start: startAngleRad,
+ end: startAngleRad
+ });
+
+ // animate
+ graphic.animate({
+ r: args.r,
+ start: args.start,
+ end: args.end
+ }, series.options.animation);
+ }
+ });
+
+ // delete this function to allow it only once
+ series.animate = null;
+ }
+ },
+
+ /**
+ * Recompute total chart sum and update percentages of points.
+ */
+ updateTotals: function () {
+ var i,
+ total = 0,
+ points = this.points,
+ len = points.length,
+ point,
+ ignoreHiddenPoint = this.options.ignoreHiddenPoint;
+
+ // Get the total sum
+ for (i = 0; i < len; i++) {
+ point = points[i];
+ // Disallow negative values (#1530, #3623, #5322)
+ if (point.y < 0) {
+ point.y = null;
+ }
+ total += (ignoreHiddenPoint && !point.visible) ? 0 : point.y;
+ }
+ this.total = total;
+
+ // Set each point's properties
+ for (i = 0; i < len; i++) {
+ point = points[i];
+ point.percentage = (total > 0 && (point.visible || !ignoreHiddenPoint)) ? point.y / total * 100 : 0;
+ point.total = total;
+ }
+ },
+
+ /**
+ * Extend the generatePoints method by adding total and percentage properties to each point
+ */
+ generatePoints: function () {
+ Series.prototype.generatePoints.call(this);
+ this.updateTotals();
+ },
+
+ /**
+ * Do translation for pie slices
+ */
+ translate: function (positions) {
+ this.generatePoints();
+
+ var series = this,
+ cumulative = 0,
+ precision = 1000, // issue #172
+ options = series.options,
+ slicedOffset = options.slicedOffset,
+ connectorOffset = slicedOffset + options.borderWidth,
+ start,
+ end,
+ angle,
+ startAngle = options.startAngle || 0,
+ startAngleRad = series.startAngleRad = mathPI / 180 * (startAngle - 90),
+ endAngleRad = series.endAngleRad = mathPI / 180 * ((pick(options.endAngle, startAngle + 360)) - 90),
+ circ = endAngleRad - startAngleRad, //2 * mathPI,
+ points = series.points,
+ radiusX, // the x component of the radius vector for a given point
+ radiusY,
+ labelDistance = options.dataLabels.distance,
+ ignoreHiddenPoint = options.ignoreHiddenPoint,
+ i,
+ len = points.length,
+ point;
+
+ // Get positions - either an integer or a percentage string must be given.
+ // If positions are passed as a parameter, we're in a recursive loop for adjusting
+ // space for data labels.
+ if (!positions) {
+ series.center = positions = series.getCenter();
+ }
+
+ // utility for getting the x value from a given y, used for anticollision logic in data labels
+ series.getX = function (y, left) {
+
+ angle = math.asin(mathMin((y - positions[1]) / (positions[2] / 2 + labelDistance), 1));
+
+ return positions[0] +
+ (left ? -1 : 1) *
+ (mathCos(angle) * (positions[2] / 2 + labelDistance));
+ };
+
+ // Calculate the geometry for each point
+ for (i = 0; i < len; i++) {
+
+ point = points[i];
+
+ // set start and end angle
+ start = startAngleRad + (cumulative * circ);
+ if (!ignoreHiddenPoint || point.visible) {
+ cumulative += point.percentage / 100;
+ }
+ end = startAngleRad + (cumulative * circ);
+
+ // set the shape
+ point.shapeType = 'arc';
+ point.shapeArgs = {
+ x: positions[0],
+ y: positions[1],
+ r: positions[2] / 2,
+ innerR: positions[3] / 2,
+ start: mathRound(start * precision) / precision,
+ end: mathRound(end * precision) / precision
+ };
+
+ // The angle must stay within -90 and 270 (#2645)
+ angle = (end + start) / 2;
+ if (angle > 1.5 * mathPI) {
+ angle -= 2 * mathPI;
+ } else if (angle < -mathPI / 2) {
+ angle += 2 * mathPI;
+ }
+
+ // Center for the sliced out slice
+ point.slicedTranslation = {
+ translateX: mathRound(mathCos(angle) * slicedOffset),
+ translateY: mathRound(mathSin(angle) * slicedOffset)
+ };
+
+ // set the anchor point for tooltips
+ radiusX = mathCos(angle) * positions[2] / 2;
+ radiusY = mathSin(angle) * positions[2] / 2;
+ point.tooltipPos = [
+ positions[0] + radiusX * 0.7,
+ positions[1] + radiusY * 0.7
+ ];
+
+ point.half = angle < -mathPI / 2 || angle > mathPI / 2 ? 1 : 0;
+ point.angle = angle;
+
+ // set the anchor point for data labels
+ connectorOffset = mathMin(connectorOffset, labelDistance / 2); // #1678
+ point.labelPos = [
+ positions[0] + radiusX + mathCos(angle) * labelDistance, // first break of connector
+ positions[1] + radiusY + mathSin(angle) * labelDistance, // a/a
+ positions[0] + radiusX + mathCos(angle) * connectorOffset, // second break, right outside pie
+ positions[1] + radiusY + mathSin(angle) * connectorOffset, // a/a
+ positions[0] + radiusX, // landing point for connector
+ positions[1] + radiusY, // a/a
+ labelDistance < 0 ? // alignment
+ 'center' :
+ point.half ? 'right' : 'left', // alignment
+ angle // center angle
+ ];
+
+ }
+ },
+
+ drawGraph: null,
+
+ /**
+ * Draw the data points
+ */
+ drawPoints: function () {
+ var series = this,
+ chart = series.chart,
+ renderer = chart.renderer,
+ groupTranslation,
+ //center,
+ graphic,
+ //group,
+ shadow = series.options.shadow,
+ shadowGroup,
+ pointAttr,
+ shapeArgs,
+ attr;
+
+ if (shadow && !series.shadowGroup) {
+ series.shadowGroup = renderer.g('shadow')
+ .add(series.group);
+ }
+
+ // draw the slices
+ each(series.points, function (point) {
+ if (point.y !== null) {
+ graphic = point.graphic;
+ shapeArgs = point.shapeArgs;
+ shadowGroup = point.shadowGroup;
+ pointAttr = point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE];
+ if (!pointAttr.stroke) {
+ pointAttr.stroke = pointAttr.fill;
+ }
+
+ // put the shadow behind all points
+ if (shadow && !shadowGroup) {
+ shadowGroup = point.shadowGroup = renderer.g('shadow')
+ .add(series.shadowGroup);
+ }
+
+ // if the point is sliced, use special translation, else use plot area traslation
+ groupTranslation = point.sliced ? point.slicedTranslation : {
+ translateX: 0,
+ translateY: 0
+ };
+
+ //group.translate(groupTranslation[0], groupTranslation[1]);
+ if (shadowGroup) {
+ shadowGroup.attr(groupTranslation);
+ }
+
+ // draw the slice
+ if (graphic) {
+ graphic
+ .setRadialReference(series.center)
+ .attr(pointAttr)
+ .animate(extend(shapeArgs, groupTranslation));
+ } else {
+ attr = { 'stroke-linejoin': 'round' };
+ if (!point.visible) {
+ attr.visibility = 'hidden';
+ }
+
+ point.graphic = graphic = renderer[point.shapeType](shapeArgs)
+ .setRadialReference(series.center)
+ .attr(pointAttr)
+ .attr(attr)
+ .attr(groupTranslation)
+ .add(series.group)
+ .shadow(shadow, shadowGroup);
+ }
+ }
+ });
+
+ },
+
+
+ searchPoint: noop,
+
+ /**
+ * Utility for sorting data labels
+ */
+ sortByAngle: function (points, sign) {
+ points.sort(function (a, b) {
+ return a.angle !== undefined && (b.angle - a.angle) * sign;
+ });
+ },
+
+ /**
+ * Use a simple symbol from LegendSymbolMixin
+ */
+ drawLegendSymbol: LegendSymbolMixin.drawRectangle,
+
+ /**
+ * Use the getCenter method from drawLegendSymbol
+ */
+ getCenter: CenteredSeriesMixin.getCenter,
+
+ /**
+ * Pies don't have point marker symbols
+ */
+ getSymbol: noop
+
+ };
+ PieSeries = extendClass(Series, PieSeries);
+ seriesTypes.pie = PieSeries;
+
+ /**
+ * Draw the data labels
+ */
+ Series.prototype.drawDataLabels = function () {
+
+ var series = this,
+ seriesOptions = series.options,
+ cursor = seriesOptions.cursor,
+ options = seriesOptions.dataLabels,
+ points = series.points,
+ pointOptions,
+ generalOptions,
+ hasRendered = series.hasRendered || 0,
+ str,
+ dataLabelsGroup,
+ defer = pick(options.defer, true),
+ renderer = series.chart.renderer;
+
+ if (options.enabled || series._hasPointLabels) {
+
+ // Process default alignment of data labels for columns
+ if (series.dlProcessOptions) {
+ series.dlProcessOptions(options);
+ }
+
+ // Create a separate group for the data labels to avoid rotation
+ dataLabelsGroup = series.plotGroup(
+ 'dataLabelsGroup',
+ 'data-labels',
+ defer && !hasRendered ? 'hidden' : 'visible', // #5133
+ options.zIndex || 6
+ );
+
+ if (defer) {
+ dataLabelsGroup.attr({ opacity: +hasRendered }); // #3300
+ if (!hasRendered) {
+ addEvent(series, 'afterAnimate', function () {
+ if (series.visible) { // #2597, #3023, #3024
+ dataLabelsGroup.show(true);
+ }
+ dataLabelsGroup[seriesOptions.animation ? 'animate' : 'attr']({ opacity: 1 }, { duration: 200 });
+ });
+ }
+ }
+
+ // Make the labels for each point
+ generalOptions = options;
+ each(points, function (point) {
+
+ var enabled,
+ dataLabel = point.dataLabel,
+ labelConfig,
+ attr,
+ name,
+ rotation,
+ connector = point.connector,
+ isNew = true,
+ style,
+ moreStyle = {};
+
+ // Determine if each data label is enabled
+ pointOptions = point.dlOptions || (point.options && point.options.dataLabels); // dlOptions is used in treemaps
+ enabled = pick(pointOptions && pointOptions.enabled, generalOptions.enabled) && point.y !== null; // #2282, #4641
+
+
+ // If the point is outside the plot area, destroy it. #678, #820
+ if (dataLabel && !enabled) {
+ point.dataLabel = dataLabel.destroy();
+
+ // Individual labels are disabled if the are explicitly disabled
+ // in the point options, or if they fall outside the plot area.
+ } else if (enabled) {
+
+ // Create individual options structure that can be extended without
+ // affecting others
+ options = merge(generalOptions, pointOptions);
+ style = options.style;
+
+ rotation = options.rotation;
+
+ // Get the string
+ labelConfig = point.getLabelConfig();
+ str = options.format ?
+ format(options.format, labelConfig) :
+ options.formatter.call(labelConfig, options);
+
+ // Determine the color
+ style.color = pick(options.color, style.color, series.color, 'black');
+
+
+ // update existing label
+ if (dataLabel) {
+
+ if (defined(str)) {
+ dataLabel
+ .attr({
+ text: str
+ });
+ isNew = false;
+
+ } else { // #1437 - the label is shown conditionally
+ point.dataLabel = dataLabel = dataLabel.destroy();
+ if (connector) {
+ point.connector = connector.destroy();
+ }
+ }
+
+ // create new label
+ } else if (defined(str)) {
+ attr = {
+ //align: align,
+ fill: options.backgroundColor,
+ stroke: options.borderColor,
+ 'stroke-width': options.borderWidth,
+ r: options.borderRadius || 0,
+ rotation: rotation,
+ padding: options.padding,
+ zIndex: 1
+ };
+
+ // Get automated contrast color
+ if (style.color === 'contrast') {
+ moreStyle.color = options.inside || options.distance < 0 || !!seriesOptions.stacking ?
+ renderer.getContrast(point.color || series.color) :
+ '#000000';
+ }
+ if (cursor) {
+ moreStyle.cursor = cursor;
+ }
+
+
+ // Remove unused attributes (#947)
+ for (name in attr) {
+ if (attr[name] === UNDEFINED) {
+ delete attr[name];
+ }
+ }
+
+ dataLabel = point.dataLabel = renderer[rotation ? 'text' : 'label']( // labels don't support rotation
+ str,
+ 0,
+ -9999,
+ options.shape,
+ null,
+ null,
+ options.useHTML
+ )
+ .attr(attr)
+ .css(extend(style, moreStyle))
+ .add(dataLabelsGroup)
+ .shadow(options.shadow);
+
+ }
+
+ if (dataLabel) {
+ // Now the data label is created and placed at 0,0, so we need to align it
+ series.alignDataLabel(point, dataLabel, options, null, isNew);
+ }
+ }
+ });
+ }
+ };
+
+ /**
+ * Align each individual data label
+ */
+ Series.prototype.alignDataLabel = function (point, dataLabel, options, alignTo, isNew) {
+ var chart = this.chart,
+ inverted = chart.inverted,
+ plotX = pick(point.plotX, -9999),
+ plotY = pick(point.plotY, -9999),
+ bBox = dataLabel.getBBox(),
+ baseline = chart.renderer.fontMetrics(options.style.fontSize).b,
+ rotation = options.rotation,
+ normRotation,
+ negRotation,
+ align = options.align,
+ rotCorr, // rotation correction
+ // Math.round for rounding errors (#2683), alignTo to allow column labels (#2700)
+ visible = this.visible && (point.series.forceDL || chart.isInsidePlot(plotX, mathRound(plotY), inverted) ||
+ (alignTo && chart.isInsidePlot(plotX, inverted ? alignTo.x + 1 : alignTo.y + alignTo.height - 1, inverted))),
+ alignAttr, // the final position;
+ justify = pick(options.overflow, 'justify') === 'justify';
+
+ if (visible) {
+
+ // The alignment box is a singular point
+ alignTo = extend({
+ x: inverted ? chart.plotWidth - plotY : plotX,
+ y: mathRound(inverted ? chart.plotHeight - plotX : plotY),
+ width: 0,
+ height: 0
+ }, alignTo);
+
+ // Add the text size for alignment calculation
+ extend(options, {
+ width: bBox.width,
+ height: bBox.height
+ });
+
+ // Allow a hook for changing alignment in the last moment, then do the alignment
+ if (rotation) {
+ justify = false; // Not supported for rotated text
+ rotCorr = chart.renderer.rotCorr(baseline, rotation); // #3723
+ alignAttr = {
+ x: alignTo.x + options.x + alignTo.width / 2 + rotCorr.x,
+ y: alignTo.y + options.y + { top: 0, middle: 0.5, bottom: 1 }[options.verticalAlign] * alignTo.height
+ };
+ dataLabel[isNew ? 'attr' : 'animate'](alignAttr)
+ .attr({ // #3003
+ align: align
+ });
+
+ // Compensate for the rotated label sticking out on the sides
+ normRotation = (rotation + 720) % 360;
+ negRotation = normRotation > 180 && normRotation < 360;
+
+ if (align === 'left') {
+ alignAttr.y -= negRotation ? bBox.height : 0;
+ } else if (align === 'center') {
+ alignAttr.x -= bBox.width / 2;
+ alignAttr.y -= bBox.height / 2;
+ } else if (align === 'right') {
+ alignAttr.x -= bBox.width;
+ alignAttr.y -= negRotation ? 0 : bBox.height;
+ }
+
+
+ } else {
+ dataLabel.align(options, null, alignTo);
+ alignAttr = dataLabel.alignAttr;
+ }
+
+ // Handle justify or crop
+ if (justify) {
+ this.justifyDataLabel(dataLabel, options, alignAttr, bBox, alignTo, isNew);
+
+ // Now check that the data label is within the plot area
+ } else if (pick(options.crop, true)) {
+ visible = chart.isInsidePlot(alignAttr.x, alignAttr.y) && chart.isInsidePlot(alignAttr.x + bBox.width, alignAttr.y + bBox.height);
+ }
+
+ // When we're using a shape, make it possible with a connector or an arrow pointing to thie point
+ if (options.shape && !rotation) {
+ dataLabel.attr({
+ anchorX: point.plotX,
+ anchorY: point.plotY
+ });
+ }
+ }
+
+ // Show or hide based on the final aligned position
+ if (!visible) {
+ stop(dataLabel);
+ dataLabel.attr({ y: -9999 });
+ dataLabel.placed = false; // don't animate back in
+ }
+
+ };
+
+ /**
+ * If data labels fall partly outside the plot area, align them back in, in a way that
+ * doesn't hide the point.
+ */
+ Series.prototype.justifyDataLabel = function (dataLabel, options, alignAttr, bBox, alignTo, isNew) {
+ var chart = this.chart,
+ align = options.align,
+ verticalAlign = options.verticalAlign,
+ off,
+ justified,
+ padding = dataLabel.box ? 0 : (dataLabel.padding || 0);
+
+ // Off left
+ off = alignAttr.x + padding;
+ if (off < 0) {
+ if (align === 'right') {
+ options.align = 'left';
+ } else {
+ options.x = -off;
+ }
+ justified = true;
+ }
+
+ // Off right
+ off = alignAttr.x + bBox.width - padding;
+ if (off > chart.plotWidth) {
+ if (align === 'left') {
+ options.align = 'right';
+ } else {
+ options.x = chart.plotWidth - off;
+ }
+ justified = true;
+ }
+
+ // Off top
+ off = alignAttr.y + padding;
+ if (off < 0) {
+ if (verticalAlign === 'bottom') {
+ options.verticalAlign = 'top';
+ } else {
+ options.y = -off;
+ }
+ justified = true;
+ }
+
+ // Off bottom
+ off = alignAttr.y + bBox.height - padding;
+ if (off > chart.plotHeight) {
+ if (verticalAlign === 'top') {
+ options.verticalAlign = 'bottom';
+ } else {
+ options.y = chart.plotHeight - off;
+ }
+ justified = true;
+ }
+
+ if (justified) {
+ dataLabel.placed = !isNew;
+ dataLabel.align(options, null, alignTo);
+ }
+ };
+
+ /**
+ * Override the base drawDataLabels method by pie specific functionality
+ */
+ if (seriesTypes.pie) {
+ seriesTypes.pie.prototype.drawDataLabels = function () {
+ var series = this,
+ data = series.data,
+ point,
+ chart = series.chart,
+ options = series.options.dataLabels,
+ connectorPadding = pick(options.connectorPadding, 10),
+ connectorWidth = pick(options.connectorWidth, 1),
+ plotWidth = chart.plotWidth,
+ plotHeight = chart.plotHeight,
+ connector,
+ connectorPath,
+ softConnector = pick(options.softConnector, true),
+ distanceOption = options.distance,
+ seriesCenter = series.center,
+ radius = seriesCenter[2] / 2,
+ centerY = seriesCenter[1],
+ outside = distanceOption > 0,
+ dataLabel,
+ dataLabelWidth,
+ labelPos,
+ labelHeight,
+ halves = [// divide the points into right and left halves for anti collision
+ [], // right
+ [] // left
+ ],
+ x,
+ y,
+ visibility,
+ rankArr,
+ i,
+ j,
+ overflow = [0, 0, 0, 0], // top, right, bottom, left
+ sort = function (a, b) {
+ return b.y - a.y;
+ };
+
+ // get out if not enabled
+ if (!series.visible || (!options.enabled && !series._hasPointLabels)) {
+ return;
+ }
+
+ // run parent method
+ Series.prototype.drawDataLabels.apply(series);
+
+ each(data, function (point) {
+ if (point.dataLabel && point.visible) { // #407, #2510
+
+ // Arrange points for detection collision
+ halves[point.half].push(point);
+
+ // Reset positions (#4905)
+ point.dataLabel._pos = null;
+ }
+ });
+
+ /* Loop over the points in each half, starting from the top and bottom
+ * of the pie to detect overlapping labels.
+ */
+ i = 2;
+ while (i--) {
+
+ var slots = [],
+ slotsLength,
+ usedSlots = [],
+ points = halves[i],
+ pos,
+ bottom,
+ length = points.length,
+ slotIndex;
+
+ if (!length) {
+ continue;
+ }
+
+ // Sort by angle
+ series.sortByAngle(points, i - 0.5);
+
+ // Assume equal label heights on either hemisphere (#2630)
+ j = labelHeight = 0;
+ while (!labelHeight && points[j]) { // #1569
+ labelHeight = points[j] && points[j].dataLabel && (points[j].dataLabel.getBBox().height || 21); // 21 is for #968
+ j++;
+ }
+
+ // Only do anti-collision when we are outside the pie and have connectors (#856)
+ if (distanceOption > 0) {
+
+ // Build the slots
+ bottom = mathMin(centerY + radius + distanceOption, chart.plotHeight);
+ for (pos = mathMax(0, centerY - radius - distanceOption); pos <= bottom; pos += labelHeight) {
+ slots.push(pos);
+ }
+ slotsLength = slots.length;
+
+
+ /* Visualize the slots
+ if (!series.slotElements) {
+ series.slotElements = [];
+ }
+ if (i === 1) {
+ series.slotElements.forEach(function (elem) {
+ elem.destroy();
+ });
+ series.slotElements.length = 0;
+ }
+
+ slots.forEach(function (pos, no) {
+ var slotX = series.getX(pos, i) + chart.plotLeft - (i ? 100 : 0),
+ slotY = pos + chart.plotTop;
+
+ if (isNumber(slotX)) {
+ series.slotElements.push(chart.renderer.rect(slotX, slotY - 7, 100, labelHeight, 1)
+ .attr({
+ 'stroke-width': 1,
+ stroke: 'silver',
+ fill: 'rgba(0,0,255,0.1)'
+ })
+ .add());
+ series.slotElements.push(chart.renderer.text('Slot '+ no, slotX, slotY + 4)
+ .attr({
+ fill: 'silver'
+ }).add());
+ }
+ });
+ // */
+
+ // if there are more values than available slots, remove lowest values
+ if (length > slotsLength) {
+ // create an array for sorting and ranking the points within each quarter
+ rankArr = [].concat(points);
+ rankArr.sort(sort);
+ j = length;
+ while (j--) {
+ rankArr[j].rank = j;
+ }
+ j = length;
+ while (j--) {
+ if (points[j].rank >= slotsLength) {
+ points.splice(j, 1);
+ }
+ }
+ length = points.length;
+ }
+
+ // The label goes to the nearest open slot, but not closer to the edge than
+ // the label's index.
+ for (j = 0; j < length; j++) {
+
+ point = points[j];
+ labelPos = point.labelPos;
+
+ var closest = 9999,
+ distance,
+ slotI;
+
+ // find the closest slot index
+ for (slotI = 0; slotI < slotsLength; slotI++) {
+ distance = mathAbs(slots[slotI] - labelPos[1]);
+ if (distance < closest) {
+ closest = distance;
+ slotIndex = slotI;
+ }
+ }
+
+ // if that slot index is closer to the edges of the slots, move it
+ // to the closest appropriate slot
+ if (slotIndex < j && slots[j] !== null) { // cluster at the top
+ slotIndex = j;
+ } else if (slotsLength < length - j + slotIndex && slots[j] !== null) { // cluster at the bottom
+ slotIndex = slotsLength - length + j;
+ while (slots[slotIndex] === null) { // make sure it is not taken
+ slotIndex++;
+ }
+ } else {
+ // Slot is taken, find next free slot below. In the next run, the next slice will find the
+ // slot above these, because it is the closest one
+ while (slots[slotIndex] === null) { // make sure it is not taken
+ slotIndex++;
+ }
+ }
+
+ usedSlots.push({ i: slotIndex, y: slots[slotIndex] });
+ slots[slotIndex] = null; // mark as taken
+ }
+ // sort them in order to fill in from the top
+ usedSlots.sort(sort);
+ }
+
+ // now the used slots are sorted, fill them up sequentially
+ for (j = 0; j < length; j++) {
+
+ var slot, naturalY;
+
+ point = points[j];
+ labelPos = point.labelPos;
+ dataLabel = point.dataLabel;
+ visibility = point.visible === false ? HIDDEN : 'inherit';
+ naturalY = labelPos[1];
+
+ if (distanceOption > 0) {
+ slot = usedSlots.pop();
+ slotIndex = slot.i;
+
+ // if the slot next to currrent slot is free, the y value is allowed
+ // to fall back to the natural position
+ y = slot.y;
+ if ((naturalY > y && slots[slotIndex + 1] !== null) ||
+ (naturalY < y && slots[slotIndex - 1] !== null)) {
+ y = mathMin(mathMax(0, naturalY), chart.plotHeight);
+ }
+
+ } else {
+ y = naturalY;
+ }
+
+ // get the x - use the natural x position for first and last slot, to prevent the top
+ // and botton slice connectors from touching each other on either side
+ x = options.justify ?
+ seriesCenter[0] + (i ? -1 : 1) * (radius + distanceOption) :
+ series.getX(y === centerY - radius - distanceOption || y === centerY + radius + distanceOption ? naturalY : y, i);
+
+
+ // Record the placement and visibility
+ dataLabel._attr = {
+ visibility: visibility,
+ align: labelPos[6]
+ };
+ dataLabel._pos = {
+ x: x + options.x +
+ ({ left: connectorPadding, right: -connectorPadding }[labelPos[6]] || 0),
+ y: y + options.y - 10 // 10 is for the baseline (label vs text)
+ };
+ dataLabel.connX = x;
+ dataLabel.connY = y;
+
+
+ // Detect overflowing data labels
+ if (this.options.size === null) {
+ dataLabelWidth = dataLabel.width;
+ // Overflow left
+ if (x - dataLabelWidth < connectorPadding) {
+ overflow[3] = mathMax(mathRound(dataLabelWidth - x + connectorPadding), overflow[3]);
+
+ // Overflow right
+ } else if (x + dataLabelWidth > plotWidth - connectorPadding) {
+ overflow[1] = mathMax(mathRound(x + dataLabelWidth - plotWidth + connectorPadding), overflow[1]);
+ }
+
+ // Overflow top
+ if (y - labelHeight / 2 < 0) {
+ overflow[0] = mathMax(mathRound(-y + labelHeight / 2), overflow[0]);
+
+ // Overflow left
+ } else if (y + labelHeight / 2 > plotHeight) {
+ overflow[2] = mathMax(mathRound(y + labelHeight / 2 - plotHeight), overflow[2]);
+ }
+ }
+ } // for each point
+ } // for each half
+
+ // Do not apply the final placement and draw the connectors until we have verified
+ // that labels are not spilling over.
+ if (arrayMax(overflow) === 0 || this.verifyDataLabelOverflow(overflow)) {
+
+ // Place the labels in the final position
+ this.placeDataLabels();
+
+ // Draw the connectors
+ if (outside && connectorWidth) {
+ each(this.points, function (point) {
+ connector = point.connector;
+ labelPos = point.labelPos;
+ dataLabel = point.dataLabel;
+
+ if (dataLabel && dataLabel._pos && point.visible) {
+ visibility = dataLabel._attr.visibility;
+ x = dataLabel.connX;
+ y = dataLabel.connY;
+ connectorPath = softConnector ? [
+ M,
+ x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label
+ 'C',
+ x, y, // first break, next to the label
+ 2 * labelPos[2] - labelPos[4], 2 * labelPos[3] - labelPos[5],
+ labelPos[2], labelPos[3], // second break
+ L,
+ labelPos[4], labelPos[5] // base
+ ] : [
+ M,
+ x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label
+ L,
+ labelPos[2], labelPos[3], // second break
+ L,
+ labelPos[4], labelPos[5] // base
+ ];
+
+ if (connector) {
+ connector.animate({ d: connectorPath });
+ connector.attr('visibility', visibility);
+
+ } else {
+ point.connector = connector = series.chart.renderer.path(connectorPath).attr({
+ 'stroke-width': connectorWidth,
+ stroke: options.connectorColor || point.color || '#606060',
+ visibility: visibility
+ //zIndex: 0 // #2722 (reversed)
+ })
+ .add(series.dataLabelsGroup);
+ }
+ } else if (connector) {
+ point.connector = connector.destroy();
+ }
+ });
+ }
+ }
+ };
+ /**
+ * Perform the final placement of the data labels after we have verified that they
+ * fall within the plot area.
+ */
+ seriesTypes.pie.prototype.placeDataLabels = function () {
+ each(this.points, function (point) {
+ var dataLabel = point.dataLabel,
+ _pos;
+
+ if (dataLabel && point.visible) {
+ _pos = dataLabel._pos;
+ if (_pos) {
+ dataLabel.attr(dataLabel._attr);
+ dataLabel[dataLabel.moved ? 'animate' : 'attr'](_pos);
+ dataLabel.moved = true;
+ } else if (dataLabel) {
+ dataLabel.attr({ y: -9999 });
+ }
+ }
+ });
+ };
+
+ seriesTypes.pie.prototype.alignDataLabel = noop;
+
+ /**
+ * Verify whether the data labels are allowed to draw, or we should run more translation and data
+ * label positioning to keep them inside the plot area. Returns true when data labels are ready
+ * to draw.
+ */
+ seriesTypes.pie.prototype.verifyDataLabelOverflow = function (overflow) {
+
+ var center = this.center,
+ options = this.options,
+ centerOption = options.center,
+ minSize = options.minSize || 80,
+ newSize = minSize,
+ ret;
+
+ // Handle horizontal size and center
+ if (centerOption[0] !== null) { // Fixed center
+ newSize = mathMax(center[2] - mathMax(overflow[1], overflow[3]), minSize);
+
+ } else { // Auto center
+ newSize = mathMax(
+ center[2] - overflow[1] - overflow[3], // horizontal overflow
+ minSize
+ );
+ center[0] += (overflow[3] - overflow[1]) / 2; // horizontal center
+ }
+
+ // Handle vertical size and center
+ if (centerOption[1] !== null) { // Fixed center
+ newSize = mathMax(mathMin(newSize, center[2] - mathMax(overflow[0], overflow[2])), minSize);
+
+ } else { // Auto center
+ newSize = mathMax(
+ mathMin(
+ newSize,
+ center[2] - overflow[0] - overflow[2] // vertical overflow
+ ),
+ minSize
+ );
+ center[1] += (overflow[0] - overflow[2]) / 2; // vertical center
+ }
+
+ // If the size must be decreased, we need to run translate and drawDataLabels again
+ if (newSize < center[2]) {
+ center[2] = newSize;
+ center[3] = Math.min(relativeLength(options.innerSize || 0, newSize), newSize); // #3632
+ this.translate(center);
+
+ if (this.drawDataLabels) {
+ this.drawDataLabels();
+ }
+ // Else, return true to indicate that the pie and its labels is within the plot area
+ } else {
+ ret = true;
+ }
+ return ret;
+ };
+ }
+
+ if (seriesTypes.column) {
+
+ /**
+ * Override the basic data label alignment by adjusting for the position of the column
+ */
+ seriesTypes.column.prototype.alignDataLabel = function (point, dataLabel, options, alignTo, isNew) {
+ var inverted = this.chart.inverted,
+ series = point.series,
+ dlBox = point.dlBox || point.shapeArgs, // data label box for alignment
+ below = pick(point.below, point.plotY > pick(this.translatedThreshold, series.yAxis.len)), // point.below is used in range series
+ inside = pick(options.inside, !!this.options.stacking), // draw it inside the box?
+ overshoot;
+
+ // Align to the column itself, or the top of it
+ if (dlBox) { // Area range uses this method but not alignTo
+ alignTo = merge(dlBox);
+
+ if (alignTo.y < 0) {
+ alignTo.height += alignTo.y;
+ alignTo.y = 0;
+ }
+ overshoot = alignTo.y + alignTo.height - series.yAxis.len;
+ if (overshoot > 0) {
+ alignTo.height -= overshoot;
+ }
+
+ if (inverted) {
+ alignTo = {
+ x: series.yAxis.len - alignTo.y - alignTo.height,
+ y: series.xAxis.len - alignTo.x - alignTo.width,
+ width: alignTo.height,
+ height: alignTo.width
+ };
+ }
+
+ // Compute the alignment box
+ if (!inside) {
+ if (inverted) {
+ alignTo.x += below ? 0 : alignTo.width;
+ alignTo.width = 0;
+ } else {
+ alignTo.y += below ? alignTo.height : 0;
+ alignTo.height = 0;
+ }
+ }
+ }
+
+
+ // When alignment is undefined (typically columns and bars), display the individual
+ // point below or above the point depending on the threshold
+ options.align = pick(
+ options.align,
+ !inverted || inside ? 'center' : below ? 'right' : 'left'
+ );
+ options.verticalAlign = pick(
+ options.verticalAlign,
+ inverted || inside ? 'middle' : below ? 'top' : 'bottom'
+ );
+
+ // Call the parent method
+ Series.prototype.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);
+ };
+ }
+
+
+
+ /**
+ * Highcharts module to hide overlapping data labels. This module is included in Highcharts.
+ */
+ (function (H) {
+ var Chart = H.Chart,
+ each = H.each,
+ pick = H.pick,
+ addEvent = H.addEvent;
+
+ // Collect potensial overlapping data labels. Stack labels probably don't need to be
+ // considered because they are usually accompanied by data labels that lie inside the columns.
+ Chart.prototype.callbacks.push(function (chart) {
+ function collectAndHide() {
+ var labels = [];
+
+ each(chart.series, function (series) {
+ var dlOptions = series.options.dataLabels,
+ collections = series.dataLabelCollections || ['dataLabel']; // Range series have two collections
+ if ((dlOptions.enabled || series._hasPointLabels) && !dlOptions.allowOverlap && series.visible) { // #3866
+ each(collections, function (coll) {
+ each(series.points, function (point) {
+ if (point[coll]) {
+ point[coll].labelrank = pick(point.labelrank, point.shapeArgs && point.shapeArgs.height); // #4118
+ labels.push(point[coll]);
+ }
+ });
+ });
+ }
+ });
+ chart.hideOverlappingLabels(labels);
+ }
+
+ // Do it now ...
+ collectAndHide();
+
+ // ... and after each chart redraw
+ addEvent(chart, 'redraw', collectAndHide);
+
+ });
+
+ /**
+ * Hide overlapping labels. Labels are moved and faded in and out on zoom to provide a smooth
+ * visual imression.
+ */
+ Chart.prototype.hideOverlappingLabels = function (labels) {
+
+ var len = labels.length,
+ label,
+ i,
+ j,
+ label1,
+ label2,
+ isIntersecting,
+ pos1,
+ pos2,
+ parent1,
+ parent2,
+ padding,
+ intersectRect = function (x1, y1, w1, h1, x2, y2, w2, h2) {
+ return !(
+ x2 > x1 + w1 ||
+ x2 + w2 < x1 ||
+ y2 > y1 + h1 ||
+ y2 + h2 < y1
+ );
+ };
+
+ // Mark with initial opacity
+ for (i = 0; i < len; i++) {
+ label = labels[i];
+ if (label) {
+ label.oldOpacity = label.opacity;
+ label.newOpacity = 1;
+ }
+ }
+
+ // Prevent a situation in a gradually rising slope, that each label
+ // will hide the previous one because the previous one always has
+ // lower rank.
+ labels.sort(function (a, b) {
+ return (b.labelrank || 0) - (a.labelrank || 0);
+ });
+
+ // Detect overlapping labels
+ for (i = 0; i < len; i++) {
+ label1 = labels[i];
+
+ for (j = i + 1; j < len; ++j) {
+ label2 = labels[j];
+ if (label1 && label2 && label1.placed && label2.placed && label1.newOpacity !== 0 && label2.newOpacity !== 0) {
+ pos1 = label1.alignAttr;
+ pos2 = label2.alignAttr;
+ parent1 = label1.parentGroup; // Different panes have different positions
+ parent2 = label2.parentGroup;
+ padding = 2 * (label1.box ? 0 : label1.padding); // Substract the padding if no background or border (#4333)
+ isIntersecting = intersectRect(
+ pos1.x + parent1.translateX,
+ pos1.y + parent1.translateY,
+ label1.width - padding,
+ label1.height - padding,
+ pos2.x + parent2.translateX,
+ pos2.y + parent2.translateY,
+ label2.width - padding,
+ label2.height - padding
+ );
+
+ if (isIntersecting) {
+ (label1.labelrank < label2.labelrank ? label1 : label2).newOpacity = 0;
+ }
+ }
+ }
+ }
+
+ // Hide or show
+ each(labels, function (label) {
+ var complete,
+ newOpacity;
+
+ if (label) {
+ newOpacity = label.newOpacity;
+
+ if (label.oldOpacity !== newOpacity && label.placed) {
+
+ // Make sure the label is completely hidden to avoid catching clicks (#4362)
+ if (newOpacity) {
+ label.show(true);
+ } else {
+ complete = function () {
+ label.hide();
+ };
+ }
+
+ // Animate or set the opacity
+ label.alignAttr.opacity = newOpacity;
+ label[label.isOld ? 'animate' : 'attr'](label.alignAttr, null, complete);
+
+ }
+ label.isOld = true;
+ }
+ });
+ };
+ }(Highcharts));
+ /**
+ * TrackerMixin for points and graphs
+ */
+
+ var TrackerMixin = Highcharts.TrackerMixin = {
+
+ drawTrackerPoint: function () {
+ var series = this,
+ chart = series.chart,
+ pointer = chart.pointer,
+ cursor = series.options.cursor,
+ css = cursor && { cursor: cursor },
+ onMouseOver = function (e) {
+ var target = e.target,
+ point;
+
+ while (target && !point) {
+ point = target.point;
+ target = target.parentNode;
+ }
+
+ if (point !== UNDEFINED && point !== chart.hoverPoint) { // undefined on graph in scatterchart
+ point.onMouseOver(e);
+ }
+ };
+
+ // Add reference to the point
+ each(series.points, function (point) {
+ if (point.graphic) {
+ point.graphic.element.point = point;
+ }
+ if (point.dataLabel) {
+ point.dataLabel.element.point = point;
+ }
+ });
+
+ // Add the event listeners, we need to do this only once
+ if (!series._hasTracking) {
+ each(series.trackerGroups, function (key) {
+ if (series[key]) { // we don't always have dataLabelsGroup
+ series[key]
+ .addClass(PREFIX + 'tracker')
+ .on('mouseover', onMouseOver)
+ .on('mouseout', function (e) {
+ pointer.onTrackerMouseOut(e);
+ })
+ .css(css);
+ if (hasTouch) {
+ series[key].on('touchstart', onMouseOver);
+ }
+ }
+ });
+ series._hasTracking = true;
+ }
+ },
+
+ /**
+ * Draw the tracker object that sits above all data labels and markers to
+ * track mouse events on the graph or points. For the line type charts
+ * the tracker uses the same graphPath, but with a greater stroke width
+ * for better control.
+ */
+ drawTrackerGraph: function () {
+ var series = this,
+ options = series.options,
+ trackByArea = options.trackByArea,
+ trackerPath = [].concat(trackByArea ? series.areaPath : series.graphPath),
+ trackerPathLength = trackerPath.length,
+ chart = series.chart,
+ pointer = chart.pointer,
+ renderer = chart.renderer,
+ snap = chart.options.tooltip.snap,
+ tracker = series.tracker,
+ cursor = options.cursor,
+ css = cursor && { cursor: cursor },
+ i,
+ onMouseOver = function () {
+ if (chart.hoverSeries !== series) {
+ series.onMouseOver();
+ }
+ },
+ /*
+ * Empirical lowest possible opacities for TRACKER_FILL for an element to stay invisible but clickable
+ * IE6: 0.002
+ * IE7: 0.002
+ * IE8: 0.002
+ * IE9: 0.00000000001 (unlimited)
+ * IE10: 0.0001 (exporting only)
+ * FF: 0.00000000001 (unlimited)
+ * Chrome: 0.000001
+ * Safari: 0.000001
+ * Opera: 0.00000000001 (unlimited)
+ */
+ TRACKER_FILL = 'rgba(192,192,192,' + (hasSVG ? 0.0001 : 0.002) + ')';
+
+ // Extend end points. A better way would be to use round linecaps,
+ // but those are not clickable in VML.
+ if (trackerPathLength && !trackByArea) {
+ i = trackerPathLength + 1;
+ while (i--) {
+ if (trackerPath[i] === M) { // extend left side
+ trackerPath.splice(i + 1, 0, trackerPath[i + 1] - snap, trackerPath[i + 2], L);
+ }
+ if ((i && trackerPath[i] === M) || i === trackerPathLength) { // extend right side
+ trackerPath.splice(i, 0, L, trackerPath[i - 2] + snap, trackerPath[i - 1]);
+ }
+ }
+ }
+
+ // handle single points
+ /*for (i = 0; i < singlePoints.length; i++) {
+ singlePoint = singlePoints[i];
+ trackerPath.push(M, singlePoint.plotX - snap, singlePoint.plotY,
+ L, singlePoint.plotX + snap, singlePoint.plotY);
+ }*/
+
+ // draw the tracker
+ if (tracker) {
+ tracker.attr({ d: trackerPath });
+ } else { // create
+
+ series.tracker = renderer.path(trackerPath)
+ .attr({
+ 'stroke-linejoin': 'round', // #1225
+ visibility: series.visible ? VISIBLE : HIDDEN,
+ stroke: TRACKER_FILL,
+ fill: trackByArea ? TRACKER_FILL : NONE,
+ 'stroke-width': options.lineWidth + (trackByArea ? 0 : 2 * snap),
+ zIndex: 2
+ })
+ .add(series.group);
+
+ // The tracker is added to the series group, which is clipped, but is covered
+ // by the marker group. So the marker group also needs to capture events.
+ each([series.tracker, series.markerGroup], function (tracker) {
+ tracker.addClass(PREFIX + 'tracker')
+ .on('mouseover', onMouseOver)
+ .on('mouseout', function (e) {
+ pointer.onTrackerMouseOut(e);
+ })
+ .css(css);
+
+ if (hasTouch) {
+ tracker.on('touchstart', onMouseOver);
+ }
+ });
+ }
+ }
+ };
+ /* End TrackerMixin */
+
+
+ /**
+ * Add tracking event listener to the series group, so the point graphics
+ * themselves act as trackers
+ */
+
+ if (seriesTypes.column) {
+ ColumnSeries.prototype.drawTracker = TrackerMixin.drawTrackerPoint;
+ }
+
+ if (seriesTypes.pie) {
+ seriesTypes.pie.prototype.drawTracker = TrackerMixin.drawTrackerPoint;
+ }
+
+ if (seriesTypes.scatter) {
+ ScatterSeries.prototype.drawTracker = TrackerMixin.drawTrackerPoint;
+ }
+
+ /*
+ * Extend Legend for item events
+ */
+ extend(Legend.prototype, {
+
+ setItemEvents: function (item, legendItem, useHTML, itemStyle, itemHiddenStyle) {
+ var legend = this;
+ // Set the events on the item group, or in case of useHTML, the item itself (#1249)
+ (useHTML ? legendItem : item.legendGroup).on('mouseover', function () {
+ item.setState(HOVER_STATE);
+ legendItem.css(legend.options.itemHoverStyle);
+ })
+ .on('mouseout', function () {
+ legendItem.css(item.visible ? itemStyle : itemHiddenStyle);
+ item.setState();
+ })
+ .on('click', function (event) {
+ var strLegendItemClick = 'legendItemClick',
+ fnLegendItemClick = function () {
+ if (item.setVisible) {
+ item.setVisible();
+ }
+ };
+
+ // Pass over the click/touch event. #4.
+ event = {
+ browserEvent: event
+ };
+
+ // click the name or symbol
+ if (item.firePointEvent) { // point
+ item.firePointEvent(strLegendItemClick, event, fnLegendItemClick);
+ } else {
+ fireEvent(item, strLegendItemClick, event, fnLegendItemClick);
+ }
+ });
+ },
+
+ createCheckboxForItem: function (item) {
+ var legend = this;
+
+ item.checkbox = createElement('input', {
+ type: 'checkbox',
+ checked: item.selected,
+ defaultChecked: item.selected // required by IE7
+ }, legend.options.itemCheckboxStyle, legend.chart.container);
+
+ addEvent(item.checkbox, 'click', function (event) {
+ var target = event.target;
+ fireEvent(
+ item.series || item,
+ 'checkboxClick',
+ { // #3712
+ checked: target.checked,
+ item: item
+ },
+ function () {
+ item.select();
+ }
+ );
+ });
+ }
+ });
+
+ /*
+ * Add pointer cursor to legend itemstyle in defaultOptions
+ */
+ defaultOptions.legend.itemStyle.cursor = 'pointer';
+
+
+ /*
+ * Extend the Chart object with interaction
+ */
+
+ extend(Chart.prototype, {
+ /**
+ * Display the zoom button
+ */
+ showResetZoom: function () {
+ var chart = this,
+ lang = defaultOptions.lang,
+ btnOptions = chart.options.chart.resetZoomButton,
+ theme = btnOptions.theme,
+ states = theme.states,
+ alignTo = btnOptions.relativeTo === 'chart' ? null : 'plotBox';
+
+ function zoomOut() {
+ chart.zoomOut();
+ }
+
+ this.resetZoomButton = chart.renderer.button(lang.resetZoom, null, null, zoomOut, theme, states && states.hover)
+ .attr({
+ align: btnOptions.position.align,
+ title: lang.resetZoomTitle
+ })
+ .add()
+ .align(btnOptions.position, false, alignTo);
+
+ },
+
+ /**
+ * Zoom out to 1:1
+ */
+ zoomOut: function () {
+ var chart = this;
+ fireEvent(chart, 'selection', { resetSelection: true }, function () {
+ chart.zoom();
+ });
+ },
+
+ /**
+ * Zoom into a given portion of the chart given by axis coordinates
+ * @param {Object} event
+ */
+ zoom: function (event) {
+ var chart = this,
+ hasZoomed,
+ pointer = chart.pointer,
+ displayButton = false,
+ resetZoomButton;
+
+ // If zoom is called with no arguments, reset the axes
+ if (!event || event.resetSelection) {
+ each(chart.axes, function (axis) {
+ hasZoomed = axis.zoom();
+ });
+ } else { // else, zoom in on all axes
+ each(event.xAxis.concat(event.yAxis), function (axisData) {
+ var axis = axisData.axis,
+ isXAxis = axis.isXAxis;
+
+ // don't zoom more than minRange
+ if (pointer[isXAxis ? 'zoomX' : 'zoomY'] || pointer[isXAxis ? 'pinchX' : 'pinchY']) {
+ hasZoomed = axis.zoom(axisData.min, axisData.max);
+ if (axis.displayBtn) {
+ displayButton = true;
+ }
+ }
+ });
+ }
+
+ // Show or hide the Reset zoom button
+ resetZoomButton = chart.resetZoomButton;
+ if (displayButton && !resetZoomButton) {
+ chart.showResetZoom();
+ } else if (!displayButton && isObject(resetZoomButton)) {
+ chart.resetZoomButton = resetZoomButton.destroy();
+ }
+
+
+ // Redraw
+ if (hasZoomed) {
+ chart.redraw(
+ pick(chart.options.chart.animation, event && event.animation, chart.pointCount < 100) // animation
+ );
+ }
+ },
+
+ /**
+ * Pan the chart by dragging the mouse across the pane. This function is called
+ * on mouse move, and the distance to pan is computed from chartX compared to
+ * the first chartX position in the dragging operation.
+ */
+ pan: function (e, panning) {
+
+ var chart = this,
+ hoverPoints = chart.hoverPoints,
+ doRedraw;
+
+ // remove active points for shared tooltip
+ if (hoverPoints) {
+ each(hoverPoints, function (point) {
+ point.setState();
+ });
+ }
+
+ each(panning === 'xy' ? [1, 0] : [1], function (isX) { // xy is used in maps
+ var axis = chart[isX ? 'xAxis' : 'yAxis'][0],
+ horiz = axis.horiz,
+ mousePos = e[horiz ? 'chartX' : 'chartY'],
+ mouseDown = horiz ? 'mouseDownX' : 'mouseDownY',
+ startPos = chart[mouseDown],
+ halfPointRange = (axis.pointRange || 0) / 2,
+ extremes = axis.getExtremes(),
+ newMin = axis.toValue(startPos - mousePos, true) + halfPointRange,
+ newMax = axis.toValue(startPos + axis.len - mousePos, true) - halfPointRange,
+ goingLeft = startPos > mousePos; // #3613
+
+ if (axis.series.length &&
+ (goingLeft || newMin > mathMin(extremes.dataMin, extremes.min)) &&
+ (!goingLeft || newMax < mathMax(extremes.dataMax, extremes.max))) {
+ axis.setExtremes(newMin, newMax, false, false, { trigger: 'pan' });
+ doRedraw = true;
+ }
+
+ chart[mouseDown] = mousePos; // set new reference for next run
+ });
+
+ if (doRedraw) {
+ chart.redraw(false);
+ }
+ css(chart.container, { cursor: 'move' });
+ }
+ });
+
+ /*
+ * Extend the Point object with interaction
+ */
+ extend(Point.prototype, {
+ /**
+ * Toggle the selection status of a point
+ * @param {Boolean} selected Whether to select or unselect the point.
+ * @param {Boolean} accumulate Whether to add to the previous selection. By default,
+ * this happens if the control key (Cmd on Mac) was pressed during clicking.
+ */
+ select: function (selected, accumulate) {
+ var point = this,
+ series = point.series,
+ chart = series.chart;
+
+ selected = pick(selected, !point.selected);
+
+ // fire the event with the default handler
+ point.firePointEvent(selected ? 'select' : 'unselect', { accumulate: accumulate }, function () {
+ point.selected = point.options.selected = selected;
+ series.options.data[inArray(point, series.data)] = point.options;
+
+ point.setState(selected && SELECT_STATE);
+
+ // unselect all other points unless Ctrl or Cmd + click
+ if (!accumulate) {
+ each(chart.getSelectedPoints(), function (loopPoint) {
+ if (loopPoint.selected && loopPoint !== point) {
+ loopPoint.selected = loopPoint.options.selected = false;
+ series.options.data[inArray(loopPoint, series.data)] = loopPoint.options;
+ loopPoint.setState(NORMAL_STATE);
+ loopPoint.firePointEvent('unselect');
+ }
+ });
+ }
+ });
+ },
+
+ /**
+ * Runs on mouse over the point
+ *
+ * @param {Object} e The event arguments
+ * @param {Boolean} byProximity Falsy for kd points that are closest to the mouse, or to
+ * actually hovered points. True for other points in shared tooltip.
+ */
+ onMouseOver: function (e, byProximity) {
+ var point = this,
+ series = point.series,
+ chart = series.chart,
+ tooltip = chart.tooltip,
+ hoverPoint = chart.hoverPoint;
+
+ if (chart.hoverSeries !== series) {
+ series.onMouseOver();
+ }
+
+ // set normal state to previous series
+ if (hoverPoint && hoverPoint !== point) {
+ hoverPoint.onMouseOut();
+ }
+
+ if (point.series) { // It may have been destroyed, #4130
+
+ // trigger the event
+ point.firePointEvent('mouseOver');
+
+ // update the tooltip
+ if (tooltip && (!tooltip.shared || series.noSharedTooltip)) {
+ tooltip.refresh(point, e);
+ }
+
+ // hover this
+ point.setState(HOVER_STATE);
+ if (!byProximity) {
+ chart.hoverPoint = point;
+ }
+ }
+ },
+
+ /**
+ * Runs on mouse out from the point
+ */
+ onMouseOut: function () {
+ var chart = this.series.chart,
+ hoverPoints = chart.hoverPoints;
+
+ this.firePointEvent('mouseOut');
+
+ if (!hoverPoints || inArray(this, hoverPoints) === -1) { // #887, #2240
+ this.setState();
+ chart.hoverPoint = null;
+ }
+ },
+
+ /**
+ * Import events from the series' and point's options. Only do it on
+ * demand, to save processing time on hovering.
+ */
+ importEvents: function () {
+ if (!this.hasImportedEvents) {
+ var point = this,
+ options = merge(point.series.options.point, point.options),
+ events = options.events,
+ eventType;
+
+ point.events = events;
+
+ for (eventType in events) {
+ addEvent(point, eventType, events[eventType]);
+ }
+ this.hasImportedEvents = true;
+
+ }
+ },
+
+ /**
+ * Set the point's state
+ * @param {String} state
+ */
+ setState: function (state, move) {
+ var point = this,
+ plotX = mathFloor(point.plotX), // #4586
+ plotY = point.plotY,
+ series = point.series,
+ stateOptions = series.options.states,
+ markerOptions = defaultPlotOptions[series.type].marker && series.options.marker,
+ normalDisabled = markerOptions && !markerOptions.enabled,
+ markerStateOptions = markerOptions && markerOptions.states[state],
+ stateDisabled = markerStateOptions && markerStateOptions.enabled === false,
+ stateMarkerGraphic = series.stateMarkerGraphic,
+ pointMarker = point.marker || {},
+ chart = series.chart,
+ radius,
+ halo = series.halo,
+ haloOptions,
+ newSymbol,
+ pointAttr;
+
+ state = state || NORMAL_STATE; // empty string
+ pointAttr = point.pointAttr[state] || series.pointAttr[state];
+
+ if (
+ // already has this state
+ (state === point.state && !move) ||
+ // selected points don't respond to hover
+ (point.selected && state !== SELECT_STATE) ||
+ // series' state options is disabled
+ (stateOptions[state] && stateOptions[state].enabled === false) ||
+ // general point marker's state options is disabled
+ (state && (stateDisabled || (normalDisabled && markerStateOptions.enabled === false))) ||
+ // individual point marker's state options is disabled
+ (state && pointMarker.states && pointMarker.states[state] && pointMarker.states[state].enabled === false) // #1610
+
+ ) {
+ return;
+ }
+
+ // apply hover styles to the existing point
+ if (point.graphic) {
+ radius = markerOptions && point.graphic.symbolName && pointAttr.r;
+ point.graphic.attr(merge(
+ pointAttr,
+ radius ? { // new symbol attributes (#507, #612)
+ x: plotX - radius,
+ y: plotY - radius,
+ width: 2 * radius,
+ height: 2 * radius
+ } : {}
+ ));
+
+ // Zooming in from a range with no markers to a range with markers
+ if (stateMarkerGraphic) {
+ stateMarkerGraphic.hide();
+ }
+ } else {
+ // if a graphic is not applied to each point in the normal state, create a shared
+ // graphic for the hover state
+ if (state && markerStateOptions) {
+ radius = markerStateOptions.radius;
+ newSymbol = pointMarker.symbol || series.symbol;
+
+ // If the point has another symbol than the previous one, throw away the
+ // state marker graphic and force a new one (#1459)
+ if (stateMarkerGraphic && stateMarkerGraphic.currentSymbol !== newSymbol) {
+ stateMarkerGraphic = stateMarkerGraphic.destroy();
+ }
+
+ // Add a new state marker graphic
+ if (!stateMarkerGraphic) {
+ if (newSymbol) {
+ series.stateMarkerGraphic = stateMarkerGraphic = chart.renderer.symbol(
+ newSymbol,
+ plotX - radius,
+ plotY - radius,
+ 2 * radius,
+ 2 * radius
+ )
+ .attr(pointAttr)
+ .add(series.markerGroup);
+ stateMarkerGraphic.currentSymbol = newSymbol;
+ }
+
+ // Move the existing graphic
+ } else {
+ stateMarkerGraphic[move ? 'animate' : 'attr']({ // #1054
+ x: plotX - radius,
+ y: plotY - radius
+ });
+ }
+ }
+
+ if (stateMarkerGraphic) {
+ stateMarkerGraphic[state && chart.isInsidePlot(plotX, plotY, chart.inverted) ? 'show' : 'hide'](); // #2450
+ stateMarkerGraphic.element.point = point; // #4310
+ }
+ }
+
+ // Show me your halo
+ haloOptions = stateOptions[state] && stateOptions[state].halo;
+ if (haloOptions && haloOptions.size) {
+ if (!halo) {
+ series.halo = halo = chart.renderer.path()
+ .add(chart.seriesGroup);
+ }
+ halo.attr(extend({
+ 'fill': point.color || series.color,
+ 'fill-opacity': haloOptions.opacity,
+ 'zIndex': -1 // #4929, IE8 added halo above everything
+ },
+ haloOptions.attributes))[move ? 'animate' : 'attr']({
+ d: point.haloPath(haloOptions.size)
+ });
+ } else if (halo) {
+ halo.attr({ d: [] });
+ }
+
+ point.state = state;
+ },
+
+ /**
+ * Get the circular path definition for the halo
+ * @param {Number} size The radius of the circular halo
+ * @returns {Array} The path definition
+ */
+ haloPath: function (size) {
+ var series = this.series,
+ chart = series.chart,
+ plotBox = series.getPlotBox(),
+ inverted = chart.inverted,
+ plotX = Math.floor(this.plotX);
+
+ return chart.renderer.symbols.circle(
+ plotBox.translateX + (inverted ? series.yAxis.len - this.plotY : plotX) - size,
+ plotBox.translateY + (inverted ? series.xAxis.len - plotX : this.plotY) - size,
+ size * 2,
+ size * 2
+ );
+ }
+ });
+
+ /*
+ * Extend the Series object with interaction
+ */
+
+ extend(Series.prototype, {
+ /**
+ * Series mouse over handler
+ */
+ onMouseOver: function () {
+ var series = this,
+ chart = series.chart,
+ hoverSeries = chart.hoverSeries;
+
+ // set normal state to previous series
+ if (hoverSeries && hoverSeries !== series) {
+ hoverSeries.onMouseOut();
+ }
+
+ // trigger the event, but to save processing time,
+ // only if defined
+ if (series.options.events.mouseOver) {
+ fireEvent(series, 'mouseOver');
+ }
+
+ // hover this
+ series.setState(HOVER_STATE);
+ chart.hoverSeries = series;
+ },
+
+ /**
+ * Series mouse out handler
+ */
+ onMouseOut: function () {
+ // trigger the event only if listeners exist
+ var series = this,
+ options = series.options,
+ chart = series.chart,
+ tooltip = chart.tooltip,
+ hoverPoint = chart.hoverPoint;
+
+ chart.hoverSeries = null; // #182, set to null before the mouseOut event fires
+
+ // trigger mouse out on the point, which must be in this series
+ if (hoverPoint) {
+ hoverPoint.onMouseOut();
+ }
+
+ // fire the mouse out event
+ if (series && options.events.mouseOut) {
+ fireEvent(series, 'mouseOut');
+ }
+
+
+ // hide the tooltip
+ if (tooltip && !options.stickyTracking && (!tooltip.shared || series.noSharedTooltip)) {
+ tooltip.hide();
+ }
+
+ // set normal state
+ series.setState();
+ },
+
+ /**
+ * Set the state of the graph
+ */
+ setState: function (state) {
+ var series = this,
+ options = series.options,
+ graph = series.graph,
+ stateOptions = options.states,
+ lineWidth = options.lineWidth,
+ attribs,
+ i = 0;
+
+ state = state || NORMAL_STATE;
+
+ if (series.state !== state) {
+ series.state = state;
+
+ if (stateOptions[state] && stateOptions[state].enabled === false) {
+ return;
+ }
+
+ if (state) {
+ lineWidth = stateOptions[state].lineWidth || lineWidth + (stateOptions[state].lineWidthPlus || 0); // #4035
+ }
+
+ if (graph && !graph.dashstyle) { // hover is turned off for dashed lines in VML
+ attribs = {
+ 'stroke-width': lineWidth
+ };
+ // use attr because animate will cause any other animation on the graph to stop
+ graph.attr(attribs);
+ while (series['zoneGraph' + i]) {
+ series['zoneGraph' + i].attr(attribs);
+ i = i + 1;
+ }
+ }
+ }
+ },
+
+ /**
+ * Set the visibility of the graph
+ *
+ * @param vis {Boolean} True to show the series, false to hide. If UNDEFINED,
+ * the visibility is toggled.
+ */
+ setVisible: function (vis, redraw) {
+ var series = this,
+ chart = series.chart,
+ legendItem = series.legendItem,
+ showOrHide,
+ ignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries,
+ oldVisibility = series.visible;
+
+ // if called without an argument, toggle visibility
+ series.visible = vis = series.userOptions.visible = vis === UNDEFINED ? !oldVisibility : vis;
+ showOrHide = vis ? 'show' : 'hide';
+
+ // show or hide elements
+ each(['group', 'dataLabelsGroup', 'markerGroup', 'tracker'], function (key) {
+ if (series[key]) {
+ series[key][showOrHide]();
+ }
+ });
+
+
+ // hide tooltip (#1361)
+ if (chart.hoverSeries === series || (chart.hoverPoint && chart.hoverPoint.series) === series) {
+ series.onMouseOut();
+ }
+
+
+ if (legendItem) {
+ chart.legend.colorizeItem(series, vis);
+ }
+
+
+ // rescale or adapt to resized chart
+ series.isDirty = true;
+ // in a stack, all other series are affected
+ if (series.options.stacking) {
+ each(chart.series, function (otherSeries) {
+ if (otherSeries.options.stacking && otherSeries.visible) {
+ otherSeries.isDirty = true;
+ }
+ });
+ }
+
+ // show or hide linked series
+ each(series.linkedSeries, function (otherSeries) {
+ otherSeries.setVisible(vis, false);
+ });
+
+ if (ignoreHiddenSeries) {
+ chart.isDirtyBox = true;
+ }
+ if (redraw !== false) {
+ chart.redraw();
+ }
+
+ fireEvent(series, showOrHide);
+ },
+
+ /**
+ * Show the graph
+ */
+ show: function () {
+ this.setVisible(true);
+ },
+
+ /**
+ * Hide the graph
+ */
+ hide: function () {
+ this.setVisible(false);
+ },
+
+
+ /**
+ * Set the selected state of the graph
+ *
+ * @param selected {Boolean} True to select the series, false to unselect. If
+ * UNDEFINED, the selection state is toggled.
+ */
+ select: function (selected) {
+ var series = this;
+ // if called without an argument, toggle
+ series.selected = selected = (selected === UNDEFINED) ? !series.selected : selected;
+
+ if (series.checkbox) {
+ series.checkbox.checked = selected;
+ }
+
+ fireEvent(series, selected ? 'select' : 'unselect');
+ },
+
+ drawTracker: TrackerMixin.drawTrackerGraph
+ });
+ /* ****************************************************************************
+ * Start ordinal axis logic *
+ *****************************************************************************/
+
+
+ wrap(Series.prototype, 'init', function (proceed) {
+ var series = this,
+ xAxis;
+
+ // call the original function
+ proceed.apply(this, Array.prototype.slice.call(arguments, 1));
+
+ xAxis = series.xAxis;
+
+ // Destroy the extended ordinal index on updated data
+ if (xAxis && xAxis.options.ordinal) {
+ addEvent(series, 'updatedData', function () {
+ delete xAxis.ordinalIndex;
+ });
+ }
+ });
+
+ /**
+ * In an ordinal axis, there might be areas with dense consentrations of points, then large
+ * gaps between some. Creating equally distributed ticks over this entire range
+ * may lead to a huge number of ticks that will later be removed. So instead, break the
+ * positions up in segments, find the tick positions for each segment then concatenize them.
+ * This method is used from both data grouping logic and X axis tick position logic.
+ */
+ wrap(Axis.prototype, 'getTimeTicks', function (proceed, normalizedInterval, min, max, startOfWeek, positions, closestDistance, findHigherRanks) {
+
+ var start = 0,
+ end,
+ segmentPositions,
+ higherRanks = {},
+ hasCrossedHigherRank,
+ info,
+ posLength,
+ outsideMax,
+ groupPositions = [],
+ lastGroupPosition = -Number.MAX_VALUE,
+ tickPixelIntervalOption = this.options.tickPixelInterval;
+
+ // The positions are not always defined, for example for ordinal positions when data
+ // has regular interval (#1557, #2090)
+ if ((!this.options.ordinal && !this.options.breaks) || !positions || positions.length < 3 || min === UNDEFINED) {
+ return proceed.call(this, normalizedInterval, min, max, startOfWeek);
+ }
+
+ // Analyze the positions array to split it into segments on gaps larger than 5 times
+ // the closest distance. The closest distance is already found at this point, so
+ // we reuse that instead of computing it again.
+ posLength = positions.length;
+
+ for (end = 0; end < posLength; end++) {
+
+ outsideMax = end && positions[end - 1] > max;
+
+ if (positions[end] < min) { // Set the last position before min
+ start = end;
+ }
+
+ if (end === posLength - 1 || positions[end + 1] - positions[end] > closestDistance * 5 || outsideMax) {
+
+ // For each segment, calculate the tick positions from the getTimeTicks utility
+ // function. The interval will be the same regardless of how long the segment is.
+ if (positions[end] > lastGroupPosition) { // #1475
+
+ segmentPositions = proceed.call(this, normalizedInterval, positions[start], positions[end], startOfWeek);
+
+ // Prevent duplicate groups, for example for multiple segments within one larger time frame (#1475)
+ while (segmentPositions.length && segmentPositions[0] <= lastGroupPosition) {
+ segmentPositions.shift();
+ }
+ if (segmentPositions.length) {
+ lastGroupPosition = segmentPositions[segmentPositions.length - 1];
+ }
+
+ groupPositions = groupPositions.concat(segmentPositions);
+ }
+ // Set start of next segment
+ start = end + 1;
+ }
+
+ if (outsideMax) {
+ break;
+ }
+ }
+
+ // Get the grouping info from the last of the segments. The info is the same for
+ // all segments.
+ info = segmentPositions.info;
+
+ // Optionally identify ticks with higher rank, for example when the ticks
+ // have crossed midnight.
+ if (findHigherRanks && info.unitRange <= timeUnits.hour) {
+ end = groupPositions.length - 1;
+
+ // Compare points two by two
+ for (start = 1; start < end; start++) {
+ if (dateFormat('%d', groupPositions[start]) !== dateFormat('%d', groupPositions[start - 1])) {
+ higherRanks[groupPositions[start]] = 'day';
+ hasCrossedHigherRank = true;
+ }
+ }
+
+ // If the complete array has crossed midnight, we want to mark the first
+ // positions also as higher rank
+ if (hasCrossedHigherRank) {
+ higherRanks[groupPositions[0]] = 'day';
+ }
+ info.higherRanks = higherRanks;
+ }
+
+ // Save the info
+ groupPositions.info = info;
+
+
+
+ // Don't show ticks within a gap in the ordinal axis, where the space between
+ // two points is greater than a portion of the tick pixel interval
+ if (findHigherRanks && defined(tickPixelIntervalOption)) { // check for squashed ticks
+
+ var length = groupPositions.length,
+ i = length,
+ itemToRemove,
+ translated,
+ translatedArr = [],
+ lastTranslated,
+ medianDistance,
+ distance,
+ distances = [];
+
+ // Find median pixel distance in order to keep a reasonably even distance between
+ // ticks (#748)
+ while (i--) {
+ translated = this.translate(groupPositions[i]);
+ if (lastTranslated) {
+ distances[i] = lastTranslated - translated;
+ }
+ translatedArr[i] = lastTranslated = translated;
+ }
+ distances.sort();
+ medianDistance = distances[mathFloor(distances.length / 2)];
+ if (medianDistance < tickPixelIntervalOption * 0.6) {
+ medianDistance = null;
+ }
+
+ // Now loop over again and remove ticks where needed
+ i = groupPositions[length - 1] > max ? length - 1 : length; // #817
+ lastTranslated = undefined;
+ while (i--) {
+ translated = translatedArr[i];
+ distance = lastTranslated - translated;
+
+ // Remove ticks that are closer than 0.6 times the pixel interval from the one to the right,
+ // but not if it is close to the median distance (#748).
+ if (lastTranslated && distance < tickPixelIntervalOption * 0.8 &&
+ (medianDistance === null || distance < medianDistance * 0.8)) {
+
+ // Is this a higher ranked position with a normal position to the right?
+ if (higherRanks[groupPositions[i]] && !higherRanks[groupPositions[i + 1]]) {
+
+ // Yes: remove the lower ranked neighbour to the right
+ itemToRemove = i + 1;
+ lastTranslated = translated; // #709
+
+ } else {
+
+ // No: remove this one
+ itemToRemove = i;
+ }
+
+ groupPositions.splice(itemToRemove, 1);
+
+ } else {
+ lastTranslated = translated;
+ }
+ }
+ }
+ return groupPositions;
+ });
+
+ // Extend the Axis prototype
+ extend(Axis.prototype, {
+
+ /**
+ * Calculate the ordinal positions before tick positions are calculated.
+ */
+ beforeSetTickPositions: function () {
+ var axis = this,
+ len,
+ ordinalPositions = [],
+ useOrdinal = false,
+ dist,
+ extremes = axis.getExtremes(),
+ min = extremes.min,
+ max = extremes.max,
+ minIndex,
+ maxIndex,
+ slope,
+ hasBreaks = axis.isXAxis && !!axis.options.breaks,
+ isOrdinal = axis.options.ordinal,
+ i;
+
+ // apply the ordinal logic
+ if (isOrdinal || hasBreaks) { // #4167 YAxis is never ordinal ?
+
+ each(axis.series, function (series, i) {
+
+ if (series.visible !== false && (series.takeOrdinalPosition !== false || hasBreaks)) {
+
+ // concatenate the processed X data into the existing positions, or the empty array
+ ordinalPositions = ordinalPositions.concat(series.processedXData);
+ len = ordinalPositions.length;
+
+ // remove duplicates (#1588)
+ ordinalPositions.sort(function (a, b) {
+ return a - b; // without a custom function it is sorted as strings
+ });
+
+ if (len) {
+ i = len - 1;
+ while (i--) {
+ if (ordinalPositions[i] === ordinalPositions[i + 1]) {
+ ordinalPositions.splice(i, 1);
+ }
+ }
+ }
+ }
+
+ });
+
+ // cache the length
+ len = ordinalPositions.length;
+
+ // Check if we really need the overhead of mapping axis data against the ordinal positions.
+ // If the series consist of evenly spaced data any way, we don't need any ordinal logic.
+ if (len > 2) { // two points have equal distance by default
+ dist = ordinalPositions[1] - ordinalPositions[0];
+ i = len - 1;
+ while (i-- && !useOrdinal) {
+ if (ordinalPositions[i + 1] - ordinalPositions[i] !== dist) {
+ useOrdinal = true;
+ }
+ }
+
+ // When zooming in on a week, prevent axis padding for weekends even though the data within
+ // the week is evenly spaced.
+ if (!axis.options.keepOrdinalPadding && (ordinalPositions[0] - min > dist || max - ordinalPositions[ordinalPositions.length - 1] > dist)) {
+ useOrdinal = true;
+ }
+ }
+
+ // Record the slope and offset to compute the linear values from the array index.
+ // Since the ordinal positions may exceed the current range, get the start and
+ // end positions within it (#719, #665b)
+ if (useOrdinal) {
+
+ // Register
+ axis.ordinalPositions = ordinalPositions;
+
+ // This relies on the ordinalPositions being set. Use mathMax and mathMin to prevent
+ // padding on either sides of the data.
+ minIndex = axis.val2lin(mathMax(min, ordinalPositions[0]), true);
+ maxIndex = mathMax(axis.val2lin(mathMin(max, ordinalPositions[ordinalPositions.length - 1]), true), 1); // #3339
+
+ // Set the slope and offset of the values compared to the indices in the ordinal positions
+ axis.ordinalSlope = slope = (max - min) / (maxIndex - minIndex);
+ axis.ordinalOffset = min - (minIndex * slope);
+
+ } else {
+ axis.ordinalPositions = axis.ordinalSlope = axis.ordinalOffset = UNDEFINED;
+ }
+ }
+ axis.isOrdinal = isOrdinal && useOrdinal; // #3818, #4196, #4926
+ axis.groupIntervalFactor = null; // reset for next run
+ },
+ /**
+ * Translate from a linear axis value to the corresponding ordinal axis position. If there
+ * are no gaps in the ordinal axis this will be the same. The translated value is the value
+ * that the point would have if the axis were linear, using the same min and max.
+ *
+ * @param Number val The axis value
+ * @param Boolean toIndex Whether to return the index in the ordinalPositions or the new value
+ */
+ val2lin: function (val, toIndex) {
+ var axis = this,
+ ordinalPositions = axis.ordinalPositions,
+ ret;
+
+ if (!ordinalPositions) {
+ ret = val;
+
+ } else {
+
+ var ordinalLength = ordinalPositions.length,
+ i,
+ distance,
+ ordinalIndex;
+
+ // first look for an exact match in the ordinalpositions array
+ i = ordinalLength;
+ while (i--) {
+ if (ordinalPositions[i] === val) {
+ ordinalIndex = i;
+ break;
+ }
+ }
+
+ // if that failed, find the intermediate position between the two nearest values
+ i = ordinalLength - 1;
+ while (i--) {
+ if (val > ordinalPositions[i] || i === 0) { // interpolate
+ distance = (val - ordinalPositions[i]) / (ordinalPositions[i + 1] - ordinalPositions[i]); // something between 0 and 1
+ ordinalIndex = i + distance;
+ break;
+ }
+ }
+ ret = toIndex ?
+ ordinalIndex :
+ axis.ordinalSlope * (ordinalIndex || 0) + axis.ordinalOffset;
+ }
+ return ret;
+ },
+ /**
+ * Translate from linear (internal) to axis value
+ *
+ * @param Number val The linear abstracted value
+ * @param Boolean fromIndex Translate from an index in the ordinal positions rather than a value
+ */
+ lin2val: function (val, fromIndex) {
+ var axis = this,
+ ordinalPositions = axis.ordinalPositions,
+ ret;
+
+ if (!ordinalPositions) { // the visible range contains only equally spaced values
+ ret = val;
+
+ } else {
+
+ var ordinalSlope = axis.ordinalSlope,
+ ordinalOffset = axis.ordinalOffset,
+ i = ordinalPositions.length - 1,
+ linearEquivalentLeft,
+ linearEquivalentRight,
+ distance;
+
+
+ // Handle the case where we translate from the index directly, used only
+ // when panning an ordinal axis
+ if (fromIndex) {
+
+ if (val < 0) { // out of range, in effect panning to the left
+ val = ordinalPositions[0];
+ } else if (val > i) { // out of range, panning to the right
+ val = ordinalPositions[i];
+ } else { // split it up
+ i = mathFloor(val);
+ distance = val - i; // the decimal
+ }
+
+ // Loop down along the ordinal positions. When the linear equivalent of i matches
+ // an ordinal position, interpolate between the left and right values.
+ } else {
+ while (i--) {
+ linearEquivalentLeft = (ordinalSlope * i) + ordinalOffset;
+ if (val >= linearEquivalentLeft) {
+ linearEquivalentRight = (ordinalSlope * (i + 1)) + ordinalOffset;
+ distance = (val - linearEquivalentLeft) / (linearEquivalentRight - linearEquivalentLeft); // something between 0 and 1
+ break;
+ }
+ }
+ }
+
+ // If the index is within the range of the ordinal positions, return the associated
+ // or interpolated value. If not, just return the value
+ ret = distance !== UNDEFINED && ordinalPositions[i] !== UNDEFINED ?
+ ordinalPositions[i] + (distance ? distance * (ordinalPositions[i + 1] - ordinalPositions[i]) : 0) :
+ val;
+ }
+ return ret;
+ },
+ /**
+ * Get the ordinal positions for the entire data set. This is necessary in chart panning
+ * because we need to find out what points or data groups are available outside the
+ * visible range. When a panning operation starts, if an index for the given grouping
+ * does not exists, it is created and cached. This index is deleted on updated data, so
+ * it will be regenerated the next time a panning operation starts.
+ */
+ getExtendedPositions: function () {
+ var axis = this,
+ chart = axis.chart,
+ grouping = axis.series[0].currentDataGrouping,
+ ordinalIndex = axis.ordinalIndex,
+ key = grouping ? grouping.count + grouping.unitName : 'raw',
+ extremes = axis.getExtremes(),
+ fakeAxis,
+ fakeSeries;
+
+ // If this is the first time, or the ordinal index is deleted by updatedData,
+ // create it.
+ if (!ordinalIndex) {
+ ordinalIndex = axis.ordinalIndex = {};
+ }
+
+
+ if (!ordinalIndex[key]) {
+
+ // Create a fake axis object where the extended ordinal positions are emulated
+ fakeAxis = {
+ series: [],
+ getExtremes: function () {
+ return {
+ min: extremes.dataMin,
+ max: extremes.dataMax
+ };
+ },
+ options: {
+ ordinal: true
+ },
+ val2lin: Axis.prototype.val2lin // #2590
+ };
+
+ // Add the fake series to hold the full data, then apply processData to it
+ each(axis.series, function (series) {
+ fakeSeries = {
+ xAxis: fakeAxis,
+ xData: series.xData,
+ chart: chart,
+ destroyGroupedData: noop
+ };
+ fakeSeries.options = {
+ dataGrouping: grouping ? {
+ enabled: true,
+ forced: true,
+ approximation: 'open', // doesn't matter which, use the fastest
+ units: [[grouping.unitName, [grouping.count]]]
+ } : {
+ enabled: false
+ }
+ };
+ series.processData.apply(fakeSeries);
+
+ fakeAxis.series.push(fakeSeries);
+ });
+
+ // Run beforeSetTickPositions to compute the ordinalPositions
+ axis.beforeSetTickPositions.apply(fakeAxis);
+
+ // Cache it
+ ordinalIndex[key] = fakeAxis.ordinalPositions;
+ }
+ return ordinalIndex[key];
+ },
+
+ /**
+ * Find the factor to estimate how wide the plot area would have been if ordinal
+ * gaps were included. This value is used to compute an imagined plot width in order
+ * to establish the data grouping interval.
+ *
+ * A real world case is the intraday-candlestick
+ * example. Without this logic, it would show the correct data grouping when viewing
+ * a range within each day, but once moving the range to include the gap between two
+ * days, the interval would include the cut-away night hours and the data grouping
+ * would be wrong. So the below method tries to compensate by identifying the most
+ * common point interval, in this case days.
+ *
+ * An opposite case is presented in issue #718. We have a long array of daily data,
+ * then one point is appended one hour after the last point. We expect the data grouping
+ * not to change.
+ *
+ * In the future, if we find cases where this estimation doesn't work optimally, we
+ * might need to add a second pass to the data grouping logic, where we do another run
+ * with a greater interval if the number of data groups is more than a certain fraction
+ * of the desired group count.
+ */
+ getGroupIntervalFactor: function (xMin, xMax, series) {
+ var i,
+ processedXData = series.processedXData,
+ len = processedXData.length,
+ distances = [],
+ median,
+ groupIntervalFactor = this.groupIntervalFactor;
+
+ // Only do this computation for the first series, let the other inherit it (#2416)
+ if (!groupIntervalFactor) {
+
+ // Register all the distances in an array
+ for (i = 0; i < len - 1; i++) {
+ distances[i] = processedXData[i + 1] - processedXData[i];
+ }
+
+ // Sort them and find the median
+ distances.sort(function (a, b) {
+ return a - b;
+ });
+ median = distances[mathFloor(len / 2)];
+
+ // Compensate for series that don't extend through the entire axis extent. #1675.
+ xMin = mathMax(xMin, processedXData[0]);
+ xMax = mathMin(xMax, processedXData[len - 1]);
+
+ this.groupIntervalFactor = groupIntervalFactor = (len * median) / (xMax - xMin);
+ }
+
+ // Return the factor needed for data grouping
+ return groupIntervalFactor;
+ },
+
+ /**
+ * Make the tick intervals closer because the ordinal gaps make the ticks spread out or cluster
+ */
+ postProcessTickInterval: function (tickInterval) {
+ // Problem: http://jsfiddle.net/highcharts/FQm4E/1/
+ // This is a case where this algorithm doesn't work optimally. In this case, the
+ // tick labels are spread out per week, but all the gaps reside within weeks. So
+ // we have a situation where the labels are courser than the ordinal gaps, and
+ // thus the tick interval should not be altered
+ var ordinalSlope = this.ordinalSlope,
+ ret;
+
+
+ if (ordinalSlope) {
+ if (!this.options.breaks) {
+ ret = tickInterval / (ordinalSlope / this.closestPointRange);
+ } else {
+ ret = this.closestPointRange;
+ }
+ } else {
+ ret = tickInterval;
+ }
+ return ret;
+ }
+ });
+
+ // Extending the Chart.pan method for ordinal axes
+ wrap(Chart.prototype, 'pan', function (proceed, e) {
+ var chart = this,
+ xAxis = chart.xAxis[0],
+ chartX = e.chartX,
+ runBase = false;
+
+ if (xAxis.options.ordinal && xAxis.series.length) {
+
+ var mouseDownX = chart.mouseDownX,
+ extremes = xAxis.getExtremes(),
+ dataMax = extremes.dataMax,
+ min = extremes.min,
+ max = extremes.max,
+ trimmedRange,
+ hoverPoints = chart.hoverPoints,
+ closestPointRange = xAxis.closestPointRange,
+ pointPixelWidth = xAxis.translationSlope * (xAxis.ordinalSlope || closestPointRange),
+ movedUnits = (mouseDownX - chartX) / pointPixelWidth, // how many ordinal units did we move?
+ extendedAxis = { ordinalPositions: xAxis.getExtendedPositions() }, // get index of all the chart's points
+ ordinalPositions,
+ searchAxisLeft,
+ lin2val = xAxis.lin2val,
+ val2lin = xAxis.val2lin,
+ searchAxisRight;
+
+ if (!extendedAxis.ordinalPositions) { // we have an ordinal axis, but the data is equally spaced
+ runBase = true;
+
+ } else if (mathAbs(movedUnits) > 1) {
+
+ // Remove active points for shared tooltip
+ if (hoverPoints) {
+ each(hoverPoints, function (point) {
+ point.setState();
+ });
+ }
+
+ if (movedUnits < 0) {
+ searchAxisLeft = extendedAxis;
+ searchAxisRight = xAxis.ordinalPositions ? xAxis : extendedAxis;
+ } else {
+ searchAxisLeft = xAxis.ordinalPositions ? xAxis : extendedAxis;
+ searchAxisRight = extendedAxis;
+ }
+
+ // In grouped data series, the last ordinal position represents the grouped data, which is
+ // to the left of the real data max. If we don't compensate for this, we will be allowed
+ // to pan grouped data series passed the right of the plot area.
+ ordinalPositions = searchAxisRight.ordinalPositions;
+ if (dataMax > ordinalPositions[ordinalPositions.length - 1]) {
+ ordinalPositions.push(dataMax);
+ }
+
+ // Get the new min and max values by getting the ordinal index for the current extreme,
+ // then add the moved units and translate back to values. This happens on the
+ // extended ordinal positions if the new position is out of range, else it happens
+ // on the current x axis which is smaller and faster.
+ chart.fixedRange = max - min;
+ trimmedRange = xAxis.toFixedRange(null, null,
+ lin2val.apply(searchAxisLeft, [
+ val2lin.apply(searchAxisLeft, [min, true]) + movedUnits, // the new index
+ true // translate from index
+ ]),
+ lin2val.apply(searchAxisRight, [
+ val2lin.apply(searchAxisRight, [max, true]) + movedUnits, // the new index
+ true // translate from index
+ ])
+ );
+
+ // Apply it if it is within the available data range
+ if (trimmedRange.min >= mathMin(extremes.dataMin, min) && trimmedRange.max <= mathMax(dataMax, max)) {
+ xAxis.setExtremes(trimmedRange.min, trimmedRange.max, true, false, { trigger: 'pan' });
+ }
+
+ chart.mouseDownX = chartX; // set new reference for next run
+ css(chart.container, { cursor: 'move' });
+ }
+
+ } else {
+ runBase = true;
+ }
+
+ // revert to the linear chart.pan version
+ if (runBase) {
+ // call the original function
+ proceed.apply(this, Array.prototype.slice.call(arguments, 1));
+ }
+ });
+
+
+
+ /**
+ * Extend getGraphPath by identifying gaps in the ordinal data so that we can draw a gap in the
+ * line or area
+ */
+ Series.prototype.gappedPath = function () {
+ var gapSize = this.options.gapSize,
+ points = this.points.slice(),
+ i = points.length - 1;
+
+ if (gapSize && i > 0) { // #5008
+
+ // extension for ordinal breaks
+ while (i--) {
+ if (points[i + 1].x - points[i].x > this.closestPointRange * gapSize) {
+ points.splice( // insert after this one
+ i + 1,
+ 0,
+ { isNull: true }
+ );
+ }
+ }
+ }
+
+ // Call base method
+ //return proceed.call(this, points, a, b);
+ return this.getGraphPath(points);
+ };
+
+ /* ****************************************************************************
+ * End ordinal axis logic *
+ *****************************************************************************/
+ /**
+ * Highstock JS v4.2.6 (2016-08-02)
+ * Highcharts Broken Axis module
+ *
+ * License: www.highcharts.com/license
+ */
+
+ (function (factory) {
+
+ factory(Highcharts);
+
+ }(function (H) {
+
+ 'use strict';
+
+ var pick = H.pick,
+ wrap = H.wrap,
+ each = H.each,
+ extend = H.extend,
+ fireEvent = H.fireEvent,
+ Axis = H.Axis,
+ Series = H.Series;
+
+ function stripArguments() {
+ return Array.prototype.slice.call(arguments, 1);
+ }
+
+ extend(Axis.prototype, {
+ isInBreak: function (brk, val) {
+ var ret,
+ repeat = brk.repeat || Infinity,
+ from = brk.from,
+ length = brk.to - brk.from,
+ test = (val >= from ? (val - from) % repeat : repeat - ((from - val) % repeat));
+
+ if (!brk.inclusive) {
+ ret = test < length && test !== 0;
+ } else {
+ ret = test <= length;
+ }
+ return ret;
+ },
+
+ isInAnyBreak: function (val, testKeep) {
+
+ var breaks = this.options.breaks,
+ i = breaks && breaks.length,
+ inbrk,
+ keep,
+ ret;
+
+
+ if (i) {
+
+ while (i--) {
+ if (this.isInBreak(breaks[i], val)) {
+ inbrk = true;
+ if (!keep) {
+ keep = pick(breaks[i].showPoints, this.isXAxis ? false : true);
+ }
+ }
+ }
+
+ if (inbrk && testKeep) {
+ ret = inbrk && !keep;
+ } else {
+ ret = inbrk;
+ }
+ }
+ return ret;
+ }
+ });
+
+ wrap(Axis.prototype, 'setTickPositions', function (proceed) {
+ proceed.apply(this, Array.prototype.slice.call(arguments, 1));
+
+ if (this.options.breaks) {
+ var axis = this,
+ tickPositions = this.tickPositions,
+ info = this.tickPositions.info,
+ newPositions = [],
+ i;
+
+ for (i = 0; i < tickPositions.length; i++) {
+ if (!axis.isInAnyBreak(tickPositions[i])) {
+ newPositions.push(tickPositions[i]);
+ }
+ }
+
+ this.tickPositions = newPositions;
+ this.tickPositions.info = info;
+ }
+ });
+
+ wrap(Axis.prototype, 'init', function (proceed, chart, userOptions) {
+ // Force Axis to be not-ordinal when breaks are defined
+ if (userOptions.breaks && userOptions.breaks.length) {
+ userOptions.ordinal = false;
+ }
+
+ proceed.call(this, chart, userOptions);
+
+ if (this.options.breaks) {
+
+ var axis = this;
+
+ axis.isBroken = true;
+
+ this.val2lin = function (val) {
+ var nval = val,
+ brk,
+ i;
+
+ for (i = 0; i < axis.breakArray.length; i++) {
+ brk = axis.breakArray[i];
+ if (brk.to <= val) {
+ nval -= brk.len;
+ } else if (brk.from >= val) {
+ break;
+ } else if (axis.isInBreak(brk, val)) {
+ nval -= (val - brk.from);
+ break;
+ }
+ }
+
+ return nval;
+ };
+
+ this.lin2val = function (val) {
+ var nval = val,
+ brk,
+ i;
+
+ for (i = 0; i < axis.breakArray.length; i++) {
+ brk = axis.breakArray[i];
+ if (brk.from >= nval) {
+ break;
+ } else if (brk.to < nval) {
+ nval += brk.len;
+ } else if (axis.isInBreak(brk, nval)) {
+ nval += brk.len;
+ }
+ }
+ return nval;
+ };
+
+ this.setExtremes = function (newMin, newMax, redraw, animation, eventArguments) {
+ // If trying to set extremes inside a break, extend it to before and after the break ( #3857 )
+ while (this.isInAnyBreak(newMin)) {
+ newMin -= this.closestPointRange;
+ }
+ while (this.isInAnyBreak(newMax)) {
+ newMax -= this.closestPointRange;
+ }
+ Axis.prototype.setExtremes.call(this, newMin, newMax, redraw, animation, eventArguments);
+ };
+
+ this.setAxisTranslation = function (saveOld) {
+ Axis.prototype.setAxisTranslation.call(this, saveOld);
+
+ var breaks = axis.options.breaks,
+ breakArrayT = [], // Temporary one
+ breakArray = [],
+ length = 0,
+ inBrk,
+ repeat,
+ brk,
+ min = axis.userMin || axis.min,
+ max = axis.userMax || axis.max,
+ start,
+ i,
+ j;
+
+ // Min & max check (#4247)
+ for (i in breaks) {
+ brk = breaks[i];
+ repeat = brk.repeat || Infinity;
+ if (axis.isInBreak(brk, min)) {
+ min += (brk.to % repeat) - (min % repeat);
+ }
+ if (axis.isInBreak(brk, max)) {
+ max -= (max % repeat) - (brk.from % repeat);
+ }
+ }
+
+ // Construct an array holding all breaks in the axis
+ for (i in breaks) {
+ brk = breaks[i];
+ start = brk.from;
+ repeat = brk.repeat || Infinity;
+
+ while (start - repeat > min) {
+ start -= repeat;
+ }
+ while (start < min) {
+ start += repeat;
+ }
+
+ for (j = start; j < max; j += repeat) {
+ breakArrayT.push({
+ value: j,
+ move: 'in'
+ });
+ breakArrayT.push({
+ value: j + (brk.to - brk.from),
+ move: 'out',
+ size: brk.breakSize
+ });
+ }
+ }
+
+ breakArrayT.sort(function (a, b) {
+ var ret;
+ if (a.value === b.value) {
+ ret = (a.move === 'in' ? 0 : 1) - (b.move === 'in' ? 0 : 1);
+ } else {
+ ret = a.value - b.value;
+ }
+ return ret;
+ });
+
+ // Simplify the breaks
+ inBrk = 0;
+ start = min;
+
+ for (i in breakArrayT) {
+ brk = breakArrayT[i];
+ inBrk += (brk.move === 'in' ? 1 : -1);
+
+ if (inBrk === 1 && brk.move === 'in') {
+ start = brk.value;
+ }
+ if (inBrk === 0) {
+ breakArray.push({
+ from: start,
+ to: brk.value,
+ len: brk.value - start - (brk.size || 0)
+ });
+ length += brk.value - start - (brk.size || 0);
+ }
+ }
+
+ axis.breakArray = breakArray;
+
+ fireEvent(axis, 'afterBreaks');
+
+ axis.transA *= ((max - axis.min) / (max - min - length));
+
+ axis.min = min;
+ axis.max = max;
+ };
+ }
+ });
+
+ wrap(Series.prototype, 'generatePoints', function (proceed) {
+
+ proceed.apply(this, stripArguments(arguments));
+
+ var series = this,
+ xAxis = series.xAxis,
+ yAxis = series.yAxis,
+ points = series.points,
+ point,
+ i = points.length,
+ connectNulls = series.options.connectNulls,
+ nullGap;
+
+
+ if (xAxis && yAxis && (xAxis.options.breaks || yAxis.options.breaks)) {
+ while (i--) {
+ point = points[i];
+
+ nullGap = point.y === null && connectNulls === false; // respect nulls inside the break (#4275)
+ if (!nullGap && (xAxis.isInAnyBreak(point.x, true) || yAxis.isInAnyBreak(point.y, true))) {
+ points.splice(i, 1);
+ if (this.data[i]) {
+ this.data[i].destroyElements(); // removes the graphics for this point if they exist
+ }
+ }
+ }
+ }
+
+ });
+
+ function drawPointsWrapped(proceed) {
+ proceed.apply(this);
+ this.drawBreaks(this.xAxis, ['x']);
+ this.drawBreaks(this.yAxis, pick(this.pointArrayMap, ['y']));
+ }
+
+ H.Series.prototype.drawBreaks = function (axis, keys) {
+ var series = this,
+ points = series.points,
+ breaks,
+ threshold,
+ eventName,
+ y;
+
+ each(keys, function (key) {
+ breaks = axis.breakArray || [];
+ threshold = axis.isXAxis ? axis.min : pick(series.options.threshold, axis.min);
+ each(points, function (point) {
+ y = pick(point['stack' + key.toUpperCase()], point[key]);
+ each(breaks, function (brk) {
+ eventName = false;
+
+ if ((threshold < brk.from && y > brk.to) || (threshold > brk.from && y < brk.from)) {
+ eventName = 'pointBreak';
+ } else if ((threshold < brk.from && y > brk.from && y < brk.to) || (threshold > brk.from && y > brk.to && y < brk.from)) { // point falls inside the break
+ eventName = 'pointInBreak';
+ }
+ if (eventName) {
+ fireEvent(axis, eventName, { point: point, brk: brk });
+ }
+ });
+ });
+ });
+ };
+
+ wrap(H.seriesTypes.column.prototype, 'drawPoints', drawPointsWrapped);
+ wrap(H.Series.prototype, 'drawPoints', drawPointsWrapped);
+
+ }));
+ /* ****************************************************************************
+ * Start data grouping module *
+ ******************************************************************************/
+ var DATA_GROUPING = 'dataGrouping',
+ seriesProto = Series.prototype,
+ baseProcessData = seriesProto.processData,
+ baseGeneratePoints = seriesProto.generatePoints,
+ baseDestroy = seriesProto.destroy,
+
+ commonOptions = {
+ approximation: 'average', // average, open, high, low, close, sum
+ //enabled: null, // (true for stock charts, false for basic),
+ //forced: undefined,
+ groupPixelWidth: 2,
+ // the first one is the point or start value, the second is the start value if we're dealing with range,
+ // the third one is the end value if dealing with a range
+ dateTimeLabelFormats: {
+ millisecond: ['%A, %b %e, %H:%M:%S.%L', '%A, %b %e, %H:%M:%S.%L', '-%H:%M:%S.%L'],
+ second: ['%A, %b %e, %H:%M:%S', '%A, %b %e, %H:%M:%S', '-%H:%M:%S'],
+ minute: ['%A, %b %e, %H:%M', '%A, %b %e, %H:%M', '-%H:%M'],
+ hour: ['%A, %b %e, %H:%M', '%A, %b %e, %H:%M', '-%H:%M'],
+ day: ['%A, %b %e, %Y', '%A, %b %e', '-%A, %b %e, %Y'],
+ week: ['Week from %A, %b %e, %Y', '%A, %b %e', '-%A, %b %e, %Y'],
+ month: ['%B %Y', '%B', '-%B %Y'],
+ year: ['%Y', '%Y', '-%Y']
+ }
+ // smoothed = false, // enable this for navigator series only
+ },
+
+ specificOptions = { // extends common options
+ line: {},
+ spline: {},
+ area: {},
+ areaspline: {},
+ column: {
+ approximation: 'sum',
+ groupPixelWidth: 10
+ },
+ arearange: {
+ approximation: 'range'
+ },
+ areasplinerange: {
+ approximation: 'range'
+ },
+ columnrange: {
+ approximation: 'range',
+ groupPixelWidth: 10
+ },
+ candlestick: {
+ approximation: 'ohlc',
+ groupPixelWidth: 10
+ },
+ ohlc: {
+ approximation: 'ohlc',
+ groupPixelWidth: 5
+ }
+ },
+
+ // units are defined in a separate array to allow complete overriding in case of a user option
+ defaultDataGroupingUnits = [
+ [
+ 'millisecond', // unit name
+ [1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples
+ ], [
+ 'second',
+ [1, 2, 5, 10, 15, 30]
+ ], [
+ 'minute',
+ [1, 2, 5, 10, 15, 30]
+ ], [
+ 'hour',
+ [1, 2, 3, 4, 6, 8, 12]
+ ], [
+ 'day',
+ [1]
+ ], [
+ 'week',
+ [1]
+ ], [
+ 'month',
+ [1, 3, 6]
+ ], [
+ 'year',
+ null
+ ]
+ ],
+
+
+ /**
+ * Define the available approximation types. The data grouping approximations takes an array
+ * or numbers as the first parameter. In case of ohlc, four arrays are sent in as four parameters.
+ * Each array consists only of numbers. In case null values belong to the group, the property
+ * .hasNulls will be set to true on the array.
+ */
+ approximations = {
+ sum: function (arr) {
+ var len = arr.length,
+ ret;
+
+ // 1. it consists of nulls exclusively
+ if (!len && arr.hasNulls) {
+ ret = null;
+ // 2. it has a length and real values
+ } else if (len) {
+ ret = 0;
+ while (len--) {
+ ret += arr[len];
+ }
+ }
+ // 3. it has zero length, so just return undefined
+ // => doNothing()
+
+ return ret;
+ },
+ average: function (arr) {
+ var len = arr.length,
+ ret = approximations.sum(arr);
+
+ // If we have a number, return it divided by the length. If not, return
+ // null or undefined based on what the sum method finds.
+ if (isNumber(ret) && len) {
+ ret = ret / len;
+ }
+
+ return ret;
+ },
+ open: function (arr) {
+ return arr.length ? arr[0] : (arr.hasNulls ? null : UNDEFINED);
+ },
+ high: function (arr) {
+ return arr.length ? arrayMax(arr) : (arr.hasNulls ? null : UNDEFINED);
+ },
+ low: function (arr) {
+ return arr.length ? arrayMin(arr) : (arr.hasNulls ? null : UNDEFINED);
+ },
+ close: function (arr) {
+ return arr.length ? arr[arr.length - 1] : (arr.hasNulls ? null : UNDEFINED);
+ },
+ // ohlc and range are special cases where a multidimensional array is input and an array is output
+ ohlc: function (open, high, low, close) {
+ open = approximations.open(open);
+ high = approximations.high(high);
+ low = approximations.low(low);
+ close = approximations.close(close);
+
+ if (isNumber(open) || isNumber(high) || isNumber(low) || isNumber(close)) {
+ return [open, high, low, close];
+ }
+ // else, return is undefined
+ },
+ range: function (low, high) {
+ low = approximations.low(low);
+ high = approximations.high(high);
+
+ if (isNumber(low) || isNumber(high)) {
+ return [low, high];
+ }
+ // else, return is undefined
+ }
+ };
+
+
+ /**
+ * Takes parallel arrays of x and y data and groups the data into intervals defined by groupPositions, a collection
+ * of starting x values for each group.
+ */
+ seriesProto.groupData = function (xData, yData, groupPositions, approximation) {
+ var series = this,
+ data = series.data,
+ dataOptions = series.options.data,
+ groupedXData = [],
+ groupedYData = [],
+ groupMap = [],
+ dataLength = xData.length,
+ pointX,
+ pointY,
+ groupedY,
+ handleYData = !!yData, // when grouping the fake extended axis for panning, we don't need to consider y
+ values = [[], [], [], []],
+ approximationFn = typeof approximation === 'function' ? approximation : approximations[approximation],
+ pointArrayMap = series.pointArrayMap,
+ pointArrayMapLength = pointArrayMap && pointArrayMap.length,
+ i,
+ pos = 0,
+ start = 0;
+
+ // Start with the first point within the X axis range (#2696)
+ for (i = 0; i <= dataLength; i++) {
+ if (xData[i] >= groupPositions[0]) {
+ break;
+ }
+ }
+
+ for (i; i <= dataLength; i++) {
+
+ // when a new group is entered, summarize and initiate the previous group
+ while ((groupPositions[pos + 1] !== undefined && xData[i] >= groupPositions[pos + 1]) ||
+ i === dataLength) { // get the last group
+
+ // get group x and y
+ pointX = groupPositions[pos];
+ groupedY = approximationFn.apply(0, values);
+
+ // push the grouped data
+ if (groupedY !== UNDEFINED) {
+ groupedXData.push(pointX);
+ groupedYData.push(groupedY);
+ groupMap.push({ start: start, length: values[0].length });
+ }
+
+ // reset the aggregate arrays
+ start = i;
+ values[0] = [];
+ values[1] = [];
+ values[2] = [];
+ values[3] = [];
+
+ // Advance on the group positions
+ pos += 1;
+
+ // don't loop beyond the last group
+ if (i === dataLength) {
+ break;
+ }
+ }
+
+ // break out
+ if (i === dataLength) {
+ break;
+ }
+
+ // for each raw data point, push it to an array that contains all values for this specific group
+ if (pointArrayMap) {
+
+ var index = series.cropStart + i,
+ point = (data && data[index]) || series.pointClass.prototype.applyOptions.apply({ series: series }, [dataOptions[index]]),
+ j,
+ val;
+
+ for (j = 0; j < pointArrayMapLength; j++) {
+ val = point[pointArrayMap[j]];
+ if (isNumber(val)) {
+ values[j].push(val);
+ } else if (val === null) {
+ values[j].hasNulls = true;
+ }
+ }
+
+ } else {
+ pointY = handleYData ? yData[i] : null;
+
+ if (isNumber(pointY)) {
+ values[0].push(pointY);
+ } else if (pointY === null) {
+ values[0].hasNulls = true;
+ }
+ }
+ }
+
+ return [groupedXData, groupedYData, groupMap];
+ };
+
+ /**
+ * Extend the basic processData method, that crops the data to the current zoom
+ * range, with data grouping logic.
+ */
+ seriesProto.processData = function () {
+ var series = this,
+ chart = series.chart,
+ options = series.options,
+ dataGroupingOptions = options[DATA_GROUPING],
+ groupingEnabled = series.allowDG !== false && dataGroupingOptions && pick(dataGroupingOptions.enabled, chart.options._stock),
+ hasGroupedData,
+ skip;
+
+ // run base method
+ series.forceCrop = groupingEnabled; // #334
+ series.groupPixelWidth = null; // #2110
+ series.hasProcessed = true; // #2692
+
+ // skip if processData returns false or if grouping is disabled (in that order)
+ skip = baseProcessData.apply(series, arguments) === false || !groupingEnabled;
+ if (!skip) {
+ series.destroyGroupedData();
+
+ var i,
+ processedXData = series.processedXData,
+ processedYData = series.processedYData,
+ plotSizeX = chart.plotSizeX,
+ xAxis = series.xAxis,
+ ordinal = xAxis.options.ordinal,
+ groupPixelWidth = series.groupPixelWidth = xAxis.getGroupPixelWidth && xAxis.getGroupPixelWidth();
+
+ // Execute grouping if the amount of points is greater than the limit defined in groupPixelWidth
+ if (groupPixelWidth) {
+ hasGroupedData = true;
+
+ series.points = null; // force recreation of point instances in series.translate
+
+ var extremes = xAxis.getExtremes(),
+ xMin = extremes.min,
+ xMax = extremes.max,
+ groupIntervalFactor = (ordinal && xAxis.getGroupIntervalFactor(xMin, xMax, series)) || 1,
+ interval = (groupPixelWidth * (xMax - xMin) / plotSizeX) * groupIntervalFactor,
+ groupPositions = xAxis.getTimeTicks(
+ xAxis.normalizeTimeTickInterval(interval, dataGroupingOptions.units || defaultDataGroupingUnits),
+ Math.min(xMin, processedXData[0]), // Processed data may extend beyond axis (#4907)
+ Math.max(xMax, processedXData[processedXData.length - 1]),
+ xAxis.options.startOfWeek,
+ processedXData,
+ series.closestPointRange
+ ),
+ groupedData = seriesProto.groupData.apply(series, [processedXData, processedYData, groupPositions, dataGroupingOptions.approximation]),
+ groupedXData = groupedData[0],
+ groupedYData = groupedData[1];
+
+ // prevent the smoothed data to spill out left and right, and make
+ // sure data is not shifted to the left
+ if (dataGroupingOptions.smoothed) {
+ i = groupedXData.length - 1;
+ groupedXData[i] = Math.min(groupedXData[i], xMax);
+ while (i-- && i > 0) {
+ groupedXData[i] += interval / 2;
+ }
+ groupedXData[0] = Math.max(groupedXData[0], xMin);
+ }
+
+ // record what data grouping values were used
+ series.currentDataGrouping = groupPositions.info;
+ series.closestPointRange = groupPositions.info.totalRange;
+ series.groupMap = groupedData[2];
+
+ // Make sure the X axis extends to show the first group (#2533)
+ if (defined(groupedXData[0]) && groupedXData[0] < xAxis.dataMin) {
+ if (xAxis.min === xAxis.dataMin) {
+ xAxis.min = groupedXData[0];
+ }
+ xAxis.dataMin = groupedXData[0];
+ }
+
+ // set series props
+ series.processedXData = groupedXData;
+ series.processedYData = groupedYData;
+ } else {
+ series.currentDataGrouping = series.groupMap = null;
+ }
+ series.hasGroupedData = hasGroupedData;
+ }
+ };
+
+ /**
+ * Destroy the grouped data points. #622, #740
+ */
+ seriesProto.destroyGroupedData = function () {
+
+ var groupedData = this.groupedData;
+
+ // clear previous groups
+ each(groupedData || [], function (point, i) {
+ if (point) {
+ groupedData[i] = point.destroy ? point.destroy() : null;
+ }
+ });
+ this.groupedData = null;
+ };
+
+ /**
+ * Override the generatePoints method by adding a reference to grouped data
+ */
+ seriesProto.generatePoints = function () {
+
+ baseGeneratePoints.apply(this);
+
+ // record grouped data in order to let it be destroyed the next time processData runs
+ this.destroyGroupedData(); // #622
+ this.groupedData = this.hasGroupedData ? this.points : null;
+ };
+
+ /**
+ * Extend the original method, make the tooltip's header reflect the grouped range
+ */
+ wrap(Tooltip.prototype, 'tooltipFooterHeaderFormatter', function (proceed, labelConfig, isFooter) {
+ var tooltip = this,
+ series = labelConfig.series,
+ options = series.options,
+ tooltipOptions = series.tooltipOptions,
+ dataGroupingOptions = options.dataGrouping,
+ xDateFormat = tooltipOptions.xDateFormat,
+ xDateFormatEnd,
+ xAxis = series.xAxis,
+ currentDataGrouping,
+ dateTimeLabelFormats,
+ labelFormats,
+ formattedKey;
+
+ // apply only to grouped series
+ if (xAxis && xAxis.options.type === 'datetime' && dataGroupingOptions && isNumber(labelConfig.key)) {
+
+ // set variables
+ currentDataGrouping = series.currentDataGrouping;
+ dateTimeLabelFormats = dataGroupingOptions.dateTimeLabelFormats;
+
+ // if we have grouped data, use the grouping information to get the right format
+ if (currentDataGrouping) {
+ labelFormats = dateTimeLabelFormats[currentDataGrouping.unitName];
+ if (currentDataGrouping.count === 1) {
+ xDateFormat = labelFormats[0];
+ } else {
+ xDateFormat = labelFormats[1];
+ xDateFormatEnd = labelFormats[2];
+ }
+ // if not grouped, and we don't have set the xDateFormat option, get the best fit,
+ // so if the least distance between points is one minute, show it, but if the
+ // least distance is one day, skip hours and minutes etc.
+ } else if (!xDateFormat && dateTimeLabelFormats) {
+ xDateFormat = tooltip.getXDateFormat(labelConfig, tooltipOptions, xAxis);
+ }
+
+ // now format the key
+ formattedKey = dateFormat(xDateFormat, labelConfig.key);
+ if (xDateFormatEnd) {
+ formattedKey += dateFormat(xDateFormatEnd, labelConfig.key + currentDataGrouping.totalRange - 1);
+ }
+
+ // return the replaced format
+ return format(tooltipOptions[(isFooter ? 'footer' : 'header') + 'Format'], {
+ point: extend(labelConfig.point, { key: formattedKey }),
+ series: series
+ });
+
+ }
+
+ // else, fall back to the regular formatter
+ return proceed.call(tooltip, labelConfig, isFooter);
+ });
+
+ /**
+ * Extend the series destroyer
+ */
+ seriesProto.destroy = function () {
+ var series = this,
+ groupedData = series.groupedData || [],
+ i = groupedData.length;
+
+ while (i--) {
+ if (groupedData[i]) {
+ groupedData[i].destroy();
+ }
+ }
+ baseDestroy.apply(series);
+ };
+
+
+ // Handle default options for data grouping. This must be set at runtime because some series types are
+ // defined after this.
+ wrap(seriesProto, 'setOptions', function (proceed, itemOptions) {
+
+ var options = proceed.call(this, itemOptions),
+ type = this.type,
+ plotOptions = this.chart.options.plotOptions,
+ defaultOptions = defaultPlotOptions[type].dataGrouping;
+
+ if (specificOptions[type]) { // #1284
+ if (!defaultOptions) {
+ defaultOptions = merge(commonOptions, specificOptions[type]);
+ }
+
+ options.dataGrouping = merge(
+ defaultOptions,
+ plotOptions.series && plotOptions.series.dataGrouping, // #1228
+ plotOptions[type].dataGrouping, // Set by the StockChart constructor
+ itemOptions.dataGrouping
+ );
+ }
+
+ if (this.chart.options._stock) {
+ this.requireSorting = true;
+ }
+
+ return options;
+ });
+
+
+ /**
+ * When resetting the scale reset the hasProccessed flag to avoid taking previous data grouping
+ * of neighbour series into accound when determining group pixel width (#2692).
+ */
+ wrap(Axis.prototype, 'setScale', function (proceed) {
+ proceed.call(this);
+ each(this.series, function (series) {
+ series.hasProcessed = false;
+ });
+ });
+
+ /**
+ * Get the data grouping pixel width based on the greatest defined individual width
+ * of the axis' series, and if whether one of the axes need grouping.
+ */
+ Axis.prototype.getGroupPixelWidth = function () {
+
+ var series = this.series,
+ len = series.length,
+ i,
+ groupPixelWidth = 0,
+ doGrouping = false,
+ dataLength,
+ dgOptions;
+
+ // If multiple series are compared on the same x axis, give them the same
+ // group pixel width (#334)
+ i = len;
+ while (i--) {
+ dgOptions = series[i].options.dataGrouping;
+ if (dgOptions) {
+ groupPixelWidth = mathMax(groupPixelWidth, dgOptions.groupPixelWidth);
+
+ }
+ }
+
+ // If one of the series needs grouping, apply it to all (#1634)
+ i = len;
+ while (i--) {
+ dgOptions = series[i].options.dataGrouping;
+
+ if (dgOptions && series[i].hasProcessed) { // #2692
+
+ dataLength = (series[i].processedXData || series[i].data).length;
+
+ // Execute grouping if the amount of points is greater than the limit defined in groupPixelWidth
+ if (series[i].groupPixelWidth || dataLength > (this.chart.plotSizeX / groupPixelWidth) || (dataLength && dgOptions.forced)) {
+ doGrouping = true;
+ }
+ }
+ }
+
+ return doGrouping ? groupPixelWidth : 0;
+ };
+
+ /**
+ * Force data grouping on all the axis' series.
+ */
+ Axis.prototype.setDataGrouping = function (dataGrouping, redraw) {
+ var i;
+
+ redraw = pick(redraw, true);
+
+ if (!dataGrouping) {
+ dataGrouping = {
+ forced: false,
+ units: null
+ };
+ }
+
+ // Axis is instantiated, update all series
+ if (this instanceof Axis) {
+ i = this.series.length;
+ while (i--) {
+ this.series[i].update({
+ dataGrouping: dataGrouping
+ }, false);
+ }
+
+ // Axis not yet instanciated, alter series options
+ } else {
+ each(this.chart.options.series, function (seriesOptions) {
+ seriesOptions.dataGrouping = dataGrouping;
+ }, false);
+ }
+
+ if (redraw) {
+ this.chart.redraw();
+ }
+ };
+
+
+
+ /* ****************************************************************************
+ * End data grouping module *
+ ******************************************************************************/
+ /* ****************************************************************************
+ * Start OHLC series code *
+ *****************************************************************************/
+
+ // 1 - Set default options
+ defaultPlotOptions.ohlc = merge(defaultPlotOptions.column, {
+ lineWidth: 1,
+ tooltip: {
+ pointFormat: '\u25CF {series.name} ' +
+ 'Open: {point.open} ' +
+ 'High: {point.high} ' +
+ 'Low: {point.low} ' +
+ 'Close: {point.close} '
+ },
+ states: {
+ hover: {
+ lineWidth: 3
+ }
+ },
+ threshold: null
+ //upColor: undefined
+ });
+
+ // 2 - Create the OHLCSeries object
+ var OHLCSeries = extendClass(seriesTypes.column, {
+ type: 'ohlc',
+ pointArrayMap: ['open', 'high', 'low', 'close'], // array point configs are mapped to this
+ toYData: function (point) { // return a plain array for speedy calculation
+ return [point.open, point.high, point.low, point.close];
+ },
+ pointValKey: 'high',
+
+ pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+ stroke: 'color',
+ 'stroke-width': 'lineWidth'
+ },
+ upColorProp: 'stroke',
+
+ /**
+ * Postprocess mapping between options and SVG attributes
+ */
+ getAttribs: function () {
+ seriesTypes.column.prototype.getAttribs.apply(this, arguments);
+ var series = this,
+ options = series.options,
+ stateOptions = options.states,
+ upColor = options.upColor || series.color,
+ seriesDownPointAttr = merge(series.pointAttr),
+ upColorProp = series.upColorProp;
+
+ seriesDownPointAttr[''][upColorProp] = upColor;
+ seriesDownPointAttr.hover[upColorProp] = stateOptions.hover.upColor || upColor;
+ seriesDownPointAttr.select[upColorProp] = stateOptions.select.upColor || upColor;
+
+ each(series.points, function (point) {
+ if (point.open < point.close && !point.options.color) {
+ point.pointAttr = seriesDownPointAttr;
+ }
+ });
+ },
+
+ /**
+ * Translate data points from raw values x and y to plotX and plotY
+ */
+ translate: function () {
+ var series = this,
+ yAxis = series.yAxis;
+
+ seriesTypes.column.prototype.translate.apply(series);
+
+ // do the translation
+ each(series.points, function (point) {
+ // the graphics
+ if (point.open !== null) {
+ point.plotOpen = yAxis.translate(point.open, 0, 1, 0, 1);
+ }
+ if (point.close !== null) {
+ point.plotClose = yAxis.translate(point.close, 0, 1, 0, 1);
+ }
+
+ });
+ },
+
+ /**
+ * Draw the data points
+ */
+ drawPoints: function () {
+ var series = this,
+ points = series.points,
+ chart = series.chart,
+ pointAttr,
+ plotOpen,
+ plotClose,
+ crispCorr,
+ halfWidth,
+ path,
+ graphic,
+ crispX;
+
+
+ each(points, function (point) {
+ if (point.plotY !== UNDEFINED) {
+
+ graphic = point.graphic;
+ pointAttr = point.pointAttr[point.selected ? 'selected' : ''] || series.pointAttr[NORMAL_STATE];
+
+ // crisp vector coordinates
+ crispCorr = (pointAttr['stroke-width'] % 2) / 2;
+ crispX = mathRound(point.plotX) - crispCorr; // #2596
+ halfWidth = mathRound(point.shapeArgs.width / 2);
+
+ // the vertical stem
+ path = [
+ 'M',
+ crispX, mathRound(point.yBottom),
+ 'L',
+ crispX, mathRound(point.plotY)
+ ];
+
+ // open
+ if (point.open !== null) {
+ plotOpen = mathRound(point.plotOpen) + crispCorr;
+ path.push(
+ 'M',
+ crispX,
+ plotOpen,
+ 'L',
+ crispX - halfWidth,
+ plotOpen
+ );
+ }
+
+ // close
+ if (point.close !== null) {
+ plotClose = mathRound(point.plotClose) + crispCorr;
+ path.push(
+ 'M',
+ crispX,
+ plotClose,
+ 'L',
+ crispX + halfWidth,
+ plotClose
+ );
+ }
+
+ // create and/or update the graphic
+ if (graphic) {
+ graphic
+ .attr(pointAttr) // #3897
+ .animate({ d: path });
+ } else {
+ point.graphic = chart.renderer.path(path)
+ .attr(pointAttr)
+ .add(series.group);
+ }
+
+ }
+
+
+ });
+
+ },
+
+ /**
+ * Disable animation
+ */
+ animate: null
+
+
+ });
+ seriesTypes.ohlc = OHLCSeries;
+ /* ****************************************************************************
+ * End OHLC series code *
+ *****************************************************************************/
+ /* ****************************************************************************
+ * Start Candlestick series code *
+ *****************************************************************************/
+
+ // 1 - set default options
+ defaultPlotOptions.candlestick = merge(defaultPlotOptions.column, {
+ lineColor: 'black',
+ lineWidth: 1,
+ states: {
+ hover: {
+ lineWidth: 2
+ }
+ },
+ tooltip: defaultPlotOptions.ohlc.tooltip,
+ threshold: null,
+ upColor: 'white'
+ // upLineColor: null
+ });
+
+ // 2 - Create the CandlestickSeries object
+ var CandlestickSeries = extendClass(OHLCSeries, {
+ type: 'candlestick',
+
+ /**
+ * One-to-one mapping from options to SVG attributes
+ */
+ pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+ fill: 'color',
+ stroke: 'lineColor',
+ 'stroke-width': 'lineWidth'
+ },
+ upColorProp: 'fill',
+
+ /**
+ * Postprocess mapping between options and SVG attributes
+ */
+ getAttribs: function () {
+ seriesTypes.ohlc.prototype.getAttribs.apply(this, arguments);
+ var series = this,
+ options = series.options,
+ stateOptions = options.states,
+ upLineColor = options.upLineColor || options.lineColor,
+ hoverStroke = stateOptions.hover.upLineColor || upLineColor,
+ selectStroke = stateOptions.select.upLineColor || upLineColor;
+
+ // Add custom line color for points going up (close > open).
+ // Fill is handled by OHLCSeries' getAttribs.
+ each(series.points, function (point) {
+ if (point.open < point.close) {
+
+ // If an individual line color is set, we need to merge the
+ // point attributes, because they are shared between all up
+ // points by inheritance from OHCLSeries.
+ if (point.lineColor) {
+ point.pointAttr = merge(point.pointAttr);
+ upLineColor = point.lineColor;
+ }
+
+ point.pointAttr[''].stroke = upLineColor;
+ point.pointAttr.hover.stroke = hoverStroke;
+ point.pointAttr.select.stroke = selectStroke;
+ }
+ });
+ },
+
+ /**
+ * Draw the data points
+ */
+ drawPoints: function () {
+ var series = this, //state = series.state,
+ points = series.points,
+ chart = series.chart,
+ pointAttr,
+ seriesPointAttr = series.pointAttr[''],
+ plotOpen,
+ plotClose,
+ topBox,
+ bottomBox,
+ hasTopWhisker,
+ hasBottomWhisker,
+ crispCorr,
+ crispX,
+ graphic,
+ path,
+ halfWidth;
+
+
+ each(points, function (point) {
+
+ graphic = point.graphic;
+ if (point.plotY !== UNDEFINED) {
+
+ pointAttr = point.pointAttr[point.selected ? 'selected' : ''] || seriesPointAttr;
+
+ // crisp vector coordinates
+ crispCorr = (pointAttr['stroke-width'] % 2) / 2;
+ crispX = mathRound(point.plotX) - crispCorr; // #2596
+ plotOpen = point.plotOpen;
+ plotClose = point.plotClose;
+ topBox = math.min(plotOpen, plotClose);
+ bottomBox = math.max(plotOpen, plotClose);
+ halfWidth = mathRound(point.shapeArgs.width / 2);
+ hasTopWhisker = mathRound(topBox) !== mathRound(point.plotY);
+ hasBottomWhisker = bottomBox !== point.yBottom;
+ topBox = mathRound(topBox) + crispCorr;
+ bottomBox = mathRound(bottomBox) + crispCorr;
+
+ // Create the path. Due to a bug in Chrome 49, the path is first instanciated
+ // with no values, then the values pushed. For unknown reasons, instanciated
+ // the path array with all the values would lead to a crash when updating
+ // frequently (#5193).
+ path = [];
+ path.push(
+ 'M',
+ crispX - halfWidth, bottomBox,
+ 'L',
+ crispX - halfWidth, topBox,
+ 'L',
+ crispX + halfWidth, topBox,
+ 'L',
+ crispX + halfWidth, bottomBox,
+ 'Z', // Use a close statement to ensure a nice rectangle #2602
+ 'M',
+ crispX, topBox,
+ 'L',
+ crispX, hasTopWhisker ? mathRound(point.plotY) : topBox, // #460, #2094
+ 'M',
+ crispX, bottomBox,
+ 'L',
+ crispX, hasBottomWhisker ? mathRound(point.yBottom) : bottomBox // #460, #2094
+ );
+
+ if (graphic) {
+ graphic
+ .attr(pointAttr) // #3897
+ .animate({ d: path });
+ } else {
+ point.graphic = chart.renderer.path(path)
+ .attr(pointAttr)
+ .add(series.group)
+ .shadow(series.options.shadow);
+ }
+
+ }
+ });
+
+ }
+
+
+ });
+
+ seriesTypes.candlestick = CandlestickSeries;
+
+ /* ****************************************************************************
+ * End Candlestick series code *
+ *****************************************************************************/
+ /* ****************************************************************************
+ * Start Flags series code *
+ *****************************************************************************/
+
+ var symbols = SVGRenderer.prototype.symbols;
+
+ // 1 - set default options
+ defaultPlotOptions.flags = merge(defaultPlotOptions.column, {
+ fillColor: 'white',
+ lineWidth: 1,
+ pointRange: 0, // #673
+ //radius: 2,
+ shape: 'flag',
+ stackDistance: 12,
+ states: {
+ hover: {
+ lineColor: 'black',
+ fillColor: '#FCFFC5'
+ }
+ },
+ style: {
+ fontSize: '11px',
+ fontWeight: 'bold',
+ textAlign: 'center'
+ },
+ tooltip: {
+ pointFormat: '{point.text} '
+ },
+ threshold: null,
+ y: -30
+ });
+
+ // 2 - Create the CandlestickSeries object
+ seriesTypes.flags = extendClass(seriesTypes.column, {
+ type: 'flags',
+ sorted: false,
+ noSharedTooltip: true,
+ allowDG: false,
+ takeOrdinalPosition: false, // #1074
+ trackerGroups: ['markerGroup'],
+ forceCrop: true,
+ /**
+ * Inherit the initialization from base Series
+ */
+ init: Series.prototype.init,
+
+ /**
+ * One-to-one mapping from options to SVG attributes
+ */
+ pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+ fill: 'fillColor',
+ stroke: 'color',
+ 'stroke-width': 'lineWidth',
+ r: 'radius'
+ },
+
+ /**
+ * Extend the translate method by placing the point on the related series
+ */
+ translate: function () {
+
+ seriesTypes.column.prototype.translate.apply(this);
+
+ var series = this,
+ options = series.options,
+ chart = series.chart,
+ points = series.points,
+ cursor = points.length - 1,
+ point,
+ lastPoint,
+ optionsOnSeries = options.onSeries,
+ onSeries = optionsOnSeries && chart.get(optionsOnSeries),
+ onKey = options.onKey || 'y',
+ step = onSeries && onSeries.options.step,
+ onData = onSeries && onSeries.points,
+ i = onData && onData.length,
+ xAxis = series.xAxis,
+ xAxisExt = xAxis.getExtremes(),
+ leftPoint,
+ lastX,
+ rightPoint,
+ currentDataGrouping;
+
+ // relate to a master series
+ if (onSeries && onSeries.visible && i) {
+ currentDataGrouping = onSeries.currentDataGrouping;
+ lastX = onData[i - 1].x + (currentDataGrouping ? currentDataGrouping.totalRange : 0); // #2374
+
+ // sort the data points
+ points.sort(function (a, b) {
+ return (a.x - b.x);
+ });
+
+ onKey = 'plot' + onKey[0].toUpperCase() + onKey.substr(1);
+ while (i-- && points[cursor]) {
+ point = points[cursor];
+ leftPoint = onData[i];
+ if (leftPoint.x <= point.x && leftPoint[onKey] !== undefined) {
+ if (point.x <= lastX) { // #803
+
+ point.plotY = leftPoint[onKey];
+
+ // interpolate between points, #666
+ if (leftPoint.x < point.x && !step) {
+ rightPoint = onData[i + 1];
+ if (rightPoint && rightPoint[onKey] !== UNDEFINED) {
+ point.plotY +=
+ ((point.x - leftPoint.x) / (rightPoint.x - leftPoint.x)) * // the distance ratio, between 0 and 1
+ (rightPoint[onKey] - leftPoint[onKey]); // the y distance
+ }
+ }
+ }
+ cursor--;
+ i++; // check again for points in the same x position
+ if (cursor < 0) {
+ break;
+ }
+ }
+ }
+ }
+
+ // Add plotY position and handle stacking
+ each(points, function (point, i) {
+
+ var stackIndex;
+
+ // Undefined plotY means the point is either on axis, outside series range or hidden series.
+ // If the series is outside the range of the x axis it should fall through with
+ // an undefined plotY, but then we must remove the shapeArgs (#847).
+ if (point.plotY === UNDEFINED) {
+ if (point.x >= xAxisExt.min && point.x <= xAxisExt.max) { // we're inside xAxis range
+ point.plotY = chart.chartHeight - xAxis.bottom - (xAxis.opposite ? xAxis.height : 0) + xAxis.offset - chart.plotTop;
+ } else {
+ point.shapeArgs = {}; // 847
+ }
+ }
+ // if multiple flags appear at the same x, order them into a stack
+ lastPoint = points[i - 1];
+ if (lastPoint && lastPoint.plotX === point.plotX) {
+ if (lastPoint.stackIndex === UNDEFINED) {
+ lastPoint.stackIndex = 0;
+ }
+ stackIndex = lastPoint.stackIndex + 1;
+ }
+ point.stackIndex = stackIndex; // #3639
+ });
+
+
+ },
+
+ /**
+ * Draw the markers
+ */
+ drawPoints: function () {
+ var series = this,
+ pointAttr,
+ seriesPointAttr = series.pointAttr[''],
+ points = series.points,
+ chart = series.chart,
+ renderer = chart.renderer,
+ plotX,
+ plotY,
+ options = series.options,
+ optionsY = options.y,
+ shape,
+ i,
+ point,
+ graphic,
+ stackIndex,
+ anchorX,
+ anchorY,
+ outsideRight,
+ yAxis = series.yAxis,
+ text;
+
+ i = points.length;
+ while (i--) {
+ point = points[i];
+ outsideRight = point.plotX > series.xAxis.len;
+ plotX = point.plotX;
+ if (plotX > 0) { // #3119
+ plotX -= pick(point.lineWidth, options.lineWidth) % 2; // #4285
+ }
+ stackIndex = point.stackIndex;
+ shape = point.options.shape || options.shape;
+ plotY = point.plotY;
+ if (plotY !== UNDEFINED) {
+ plotY = point.plotY + optionsY - (stackIndex !== UNDEFINED && stackIndex * options.stackDistance);
+ }
+ anchorX = stackIndex ? UNDEFINED : point.plotX; // skip connectors for higher level stacked points
+ anchorY = stackIndex ? UNDEFINED : point.plotY;
+
+ graphic = point.graphic;
+
+
+ // only draw the point if y is defined and the flag is within the visible area
+ if (plotY !== UNDEFINED && plotX >= 0 && !outsideRight) {
+ // shortcuts
+ pointAttr = point.pointAttr[point.selected ? 'select' : ''] || seriesPointAttr;
+ text = pick(point.options.title, options.title, 'A');
+ if (graphic) { // update
+ graphic.attr({
+ text: text // first apply text, so text will be centered later
+ }).attr({
+ x: plotX,
+ y: plotY,
+ r: pointAttr.r,
+ anchorX: anchorX,
+ anchorY: anchorY
+ });
+ } else {
+ graphic = point.graphic = renderer.label(
+ text,
+ plotX,
+ plotY,
+ shape,
+ anchorX,
+ anchorY,
+ options.useHTML
+ )
+ .css(merge(options.style, point.style))
+ .attr(pointAttr)
+ .attr({
+ align: shape === 'flag' ? 'left' : 'center',
+ width: options.width,
+ height: options.height
+ })
+ .add(series.markerGroup)
+ .shadow(options.shadow);
+
+ }
+
+ // Set the tooltip anchor position
+ point.tooltipPos = chart.inverted ? [yAxis.len + yAxis.pos - chart.plotLeft - plotY, series.xAxis.len - plotX] : [plotX, plotY];
+
+ } else if (graphic) {
+ point.graphic = graphic.destroy();
+ }
+
+ }
+
+ },
+
+ /**
+ * Extend the column trackers with listeners to expand and contract stacks
+ */
+ drawTracker: function () {
+ var series = this,
+ points = series.points;
+
+ TrackerMixin.drawTrackerPoint.apply(this);
+
+ // Bring each stacked flag up on mouse over, this allows readability of vertically
+ // stacked elements as well as tight points on the x axis. #1924.
+ each(points, function (point) {
+ var graphic = point.graphic;
+ if (graphic) {
+ addEvent(graphic.element, 'mouseover', function () {
+
+ // Raise this point
+ if (point.stackIndex > 0 && !point.raised) {
+ point._y = graphic.y;
+ graphic.attr({
+ y: point._y - 8
+ });
+ point.raised = true;
+ }
+
+ // Revert other raised points
+ each(points, function (otherPoint) {
+ if (otherPoint !== point && otherPoint.raised && otherPoint.graphic) {
+ otherPoint.graphic.attr({
+ y: otherPoint._y
+ });
+ otherPoint.raised = false;
+ }
+ });
+ });
+ }
+ });
+ },
+
+ /**
+ * Disable animation
+ */
+ animate: noop,
+ buildKDTree: noop,
+ setClip: noop
+
+ });
+
+ // create the flag icon with anchor
+ symbols.flag = function (x, y, w, h, options) {
+ var anchorX = (options && options.anchorX) || x,
+ anchorY = (options && options.anchorY) || y;
+
+ return [
+ 'M', anchorX, anchorY,
+ 'L', x, y + h,
+ x, y,
+ x + w, y,
+ x + w, y + h,
+ x, y + h,
+ 'Z'
+ ];
+ };
+
+ // create the circlepin and squarepin icons with anchor
+ each(['circle', 'square'], function (shape) {
+ symbols[shape + 'pin'] = function (x, y, w, h, options) {
+
+ var anchorX = options && options.anchorX,
+ anchorY = options && options.anchorY,
+ path,
+ labelTopOrBottomY;
+
+ // For single-letter flags, make sure circular flags are not taller than their width
+ if (shape === 'circle' && h > w) {
+ x -= mathRound((h - w) / 2);
+ w = h;
+ }
+
+ path = symbols[shape](x, y, w, h);
+
+ if (anchorX && anchorY) {
+ // if the label is below the anchor, draw the connecting line from the top edge of the label
+ // otherwise start drawing from the bottom edge
+ labelTopOrBottomY = (y > anchorY) ? y : y + h;
+ path.push('M', anchorX, labelTopOrBottomY, 'L', anchorX, anchorY);
+ }
+
+ return path;
+ };
+ });
+
+ // The symbol callbacks are generated on the SVGRenderer object in all browsers. Even
+ // VML browsers need this in order to generate shapes in export. Now share
+ // them with the VMLRenderer.
+ if (Renderer === Highcharts.VMLRenderer) {
+ each(['flag', 'circlepin', 'squarepin'], function (shape) {
+ VMLRenderer.prototype.symbols[shape] = symbols[shape];
+ });
+ }
+
+ /* ****************************************************************************
+ * End Flags series code *
+ *****************************************************************************/
+
+ var defaultScrollbarOptions = {
+ //enabled: true
+ height: isTouchDevice ? 20 : 14,
+ barBackgroundColor: '#bfc8d1',
+ barBorderRadius: 0,
+ barBorderWidth: 1,
+ barBorderColor: '#bfc8d1',
+ buttonArrowColor: '#666',
+ buttonBackgroundColor: '#ebe7e8',
+ buttonBorderColor: '#bbb',
+ buttonBorderRadius: 0,
+ buttonBorderWidth: 1,
+ //showFull: true,
+ margin: 10,
+ minWidth: 6,
+ rifleColor: '#666',
+ zIndex: 3,
+ step: 0.2,
+ //size: null,
+ trackBackgroundColor: '#eeeeee',
+ trackBorderColor: '#eeeeee',
+ trackBorderWidth: 1,
+ // trackBorderRadius: 0
+ liveRedraw: hasSVG && !isTouchDevice
+ };
+
+ defaultOptions.scrollbar = merge(true, defaultScrollbarOptions, defaultOptions.scrollbar);
+
+ /**
+ * The Scrollbar class
+ * @param {Object} renderer
+ * @param {Object} options
+ * @param {Object} chart
+ */
+ function Scrollbar(renderer, options, chart) {
+ this.scrollbarButtons = [];
+
+ this.renderer = renderer;
+
+ this.userOptions = options;
+ this.options = merge(defaultScrollbarOptions, options);
+
+ this.chart = chart;
+
+ this.size = pick(this.options.size, this.options.height); // backward compatibility
+
+ // Init
+ this.render();
+ this.initEvents();
+ this.addEvents();
+ }
+
+ Scrollbar.prototype = {
+ /**
+ * Render scrollbar with all required items.
+ */
+ render: function () {
+ var scroller = this,
+ renderer = scroller.renderer,
+ options = scroller.options,
+ strokeWidth = options.trackBorderWidth,
+ scrollbarStrokeWidth = options.barBorderWidth,
+ size = scroller.size,
+ group;
+
+ // Draw the scrollbar group:
+ scroller.group = group = renderer.g(PREFIX + 'scrollbar').attr({
+ zIndex: options.zIndex,
+ translateY: -99999
+ }).add();
+
+ // Draw the scrollbar track:
+ scroller.track = renderer.rect().attr({
+ height: size,
+ width: size,
+ y: -strokeWidth % 2 / 2,
+ x: -strokeWidth % 2 / 2,
+ 'stroke-width': strokeWidth,
+ fill: options.trackBackgroundColor,
+ stroke: options.trackBorderColor,
+ r: options.trackBorderRadius || 0
+ }).add(group);
+
+ // Draw the scrollbar itself:
+ scroller.scrollbarGroup = renderer.g().add(group);
+
+ scroller.scrollbar = renderer.rect().attr({
+ height: size,
+ width: size,
+ y: -scrollbarStrokeWidth % 2 / 2,
+ x: -scrollbarStrokeWidth % 2 / 2,
+ 'stroke-width': scrollbarStrokeWidth,
+ fill: options.barBackgroundColor,
+ stroke: options.barBorderColor,
+ r: options.barBorderRadius || 0
+ }).add(scroller.scrollbarGroup);
+
+ // Draw the scrollbat rifles:
+ scroller.scrollbarRifles = renderer.path(scroller.swapXY([
+ M,
+ -3, size / 4,
+ L,
+ -3, 2 * size / 3,
+ M,
+ 0, size / 4,
+ L,
+ 0, 2 * size / 3,
+ M,
+ 3, size / 4,
+ L,
+ 3, 2 * size / 3
+ ], options.vertical)).attr({
+ stroke: options.rifleColor,
+ 'stroke-width': 1
+ }).add(scroller.scrollbarGroup);
+
+ // Draw the buttons:
+ scroller.drawScrollbarButton(0);
+ scroller.drawScrollbarButton(1);
+ },
+
+ /**
+ * Position the scrollbar, method called from a parent with defined dimensions
+ * @param {Number} x - x-position on the chart
+ * @param {Number} y - y-position on the chart
+ * @param {Number} width - width of the scrollbar
+ * @param {Number} height - height of the scorllbar
+ */
+ position: function (x, y, width, height) {
+ var scroller = this,
+ options = scroller.options,
+ vertical = options.vertical,
+ xOffset = height,
+ yOffset = 0,
+ method = scroller.rendered ? 'animate' : 'attr';
+
+ scroller.x = x;
+ scroller.y = y + options.trackBorderWidth;
+ scroller.width = width; // width with buttons
+ scroller.height = height;
+ scroller.xOffset = xOffset;
+ scroller.yOffset = yOffset;
+
+ // If Scrollbar is a vertical type, swap options:
+ if (vertical) {
+ scroller.width = scroller.yOffset = width = yOffset = scroller.size;
+ scroller.xOffset = xOffset = 0;
+ scroller.barWidth = height - width * 2; // width without buttons
+ scroller.x = x = x + scroller.options.margin;
+ } else {
+ scroller.height = scroller.xOffset = height = xOffset = scroller.size;
+ scroller.barWidth = width - height * 2; // width without buttons
+ scroller.y = scroller.y + scroller.options.margin;
+ }
+
+ // Set general position for a group:
+ scroller.group[method]({
+ translateX: x,
+ translateY: scroller.y
+ });
+
+ // Resize background/track:
+ scroller.track[method]({
+ width: width,
+ height: height
+ });
+
+ // Move right/bottom button ot it's place:
+ scroller.scrollbarButtons[1].attr({
+ translateX: vertical ? 0 : width - xOffset,
+ translateY: vertical ? height - yOffset : 0
+ });
+ },
+
+ /**
+ * Draw the scrollbar buttons with arrows
+ * @param {Number} index 0 is left, 1 is right
+ */
+ drawScrollbarButton: function (index) {
+ var scroller = this,
+ renderer = scroller.renderer,
+ scrollbarButtons = scroller.scrollbarButtons,
+ options = scroller.options,
+ size = scroller.size,
+ group;
+
+ group = renderer.g().add(scroller.group);
+ scrollbarButtons.push(group);
+
+ // Button rect:
+ renderer.rect(
+ -0.5,
+ -0.5,
+ size + 1, // +1 to compensate for crispifying in rect method
+ size + 1,
+ options.buttonBorderRadius,
+ options.buttonBorderWidth
+ ).attr({
+ stroke: options.buttonBorderColor,
+ 'stroke-width': options.buttonBorderWidth,
+ fill: options.buttonBackgroundColor
+ }).add(group);
+
+ // Button arrow:
+ renderer.path(scroller.swapXY([
+ 'M',
+ size / 2 + (index ? -1 : 1),
+ size / 2 - 3,
+ 'L',
+ size / 2 + (index ? -1 : 1),
+ size / 2 + 3,
+ 'L',
+ size / 2 + (index ? 2 : -2),
+ size / 2
+ ], options.vertical)).attr({
+ fill: options.buttonArrowColor
+ }).add(group);
+ },
+
+ /**
+ * When we have vertical scrollbar, rifles are rotated, the same for arrow in buttons:
+ * @param {Array} path - path to be rotated
+ * @param {Boolean} vertical - if vertical scrollbar, swap x-y values
+ */
+ swapXY: function (path, vertical) {
+ var i,
+ len = path.length,
+ temp;
+
+ if (vertical) {
+ for (i = 0; i < len; i += 3) {
+ temp = path[i + 1];
+ path[i + 1] = path[i + 2];
+ path[i + 2] = temp;
+ }
+ }
+
+ return path;
+ },
+
+ /**
+ * Set scrollbar size, with a given scale.
+ * @param {Number} from - scale (0-1) where bar should start
+ * @param {Number} to - scale (0-1) where bar should end
+ */
+ setRange: function (from, to) {
+ var scroller = this,
+ options = scroller.options,
+ vertical = options.vertical,
+ fromPX,
+ toPX,
+ newPos,
+ newSize,
+ newRiflesPos,
+ method = this.rendered && !this.hasDragged ? 'animate' : 'attr';
+
+ if (!defined(scroller.barWidth)) {
+ return;
+ }
+
+ fromPX = scroller.barWidth * Math.max(from, 0);
+ toPX = scroller.barWidth * Math.min(to, 1);
+ newSize = Math.max(correctFloat(toPX - fromPX), options.minWidth);
+ newPos = Math.floor(fromPX + scroller.xOffset + scroller.yOffset);
+ newRiflesPos = newSize / 2 - 0.5; // -0.5 -> rifle line width / 2
+
+ // Store current position:
+ scroller.from = from;
+ scroller.to = to;
+
+ if (!vertical) {
+ scroller.scrollbarGroup[method]({
+ translateX: newPos
+ });
+ scroller.scrollbar[method]({
+ width: newSize
+ });
+ scroller.scrollbarRifles[method]({
+ translateX: newRiflesPos
+ });
+ scroller.scrollbarLeft = newPos;
+ scroller.scrollbarTop = 0;
+ } else {
+ scroller.scrollbarGroup[method]({
+ translateY: newPos
+ });
+ scroller.scrollbar[method]({
+ height: newSize
+ });
+ scroller.scrollbarRifles[method]({
+ translateY: newRiflesPos
+ });
+ scroller.scrollbarTop = newPos;
+ scroller.scrollbarLeft = 0;
+ }
+
+ if (newSize <= 12) {
+ scroller.scrollbarRifles.hide();
+ } else {
+ scroller.scrollbarRifles.show(true);
+ }
+
+ // Show or hide the scrollbar based on the showFull setting
+ if (options.showFull === false) {
+ if (from <= 0 && to >= 1) {
+ scroller.group.hide();
+ } else {
+ scroller.group.show();
+ }
+ }
+
+ scroller.rendered = true;
+ },
+
+ /**
+ * Init events methods, so we have an access to the Scrollbar itself
+ */
+ initEvents: function () {
+ var scroller = this;
+ /**
+ * Event handler for the mouse move event.
+ */
+ scroller.mouseMoveHandler = function (e) {
+ var normalizedEvent = scroller.chart.pointer.normalize(e),
+ options = scroller.options,
+ direction = options.vertical ? 'chartY' : 'chartX',
+ initPositions = scroller.initPositions,
+ scrollPosition,
+ chartPosition,
+ change;
+
+ // In iOS, a mousemove event with e.pageX === 0 is fired when holding the finger
+ // down in the center of the scrollbar. This should be ignored.
+ if (scroller.grabbedCenter && (!e.touches || e.touches[0][direction] !== 0)) { // #4696, scrollbar failed on Android
+
+ chartPosition = {
+ chartX: (normalizedEvent.chartX - scroller.x - scroller.xOffset) / scroller.barWidth,
+ chartY: (normalizedEvent.chartY - scroller.y - scroller.yOffset) / scroller.barWidth
+ }[direction];
+ scrollPosition = scroller[direction];
+
+ change = chartPosition - scrollPosition;
+
+ scroller.hasDragged = true;
+ scroller.updatePosition(initPositions[0] + change, initPositions[1] + change);
+
+ if (scroller.hasDragged) {
+ fireEvent(scroller, 'changed', {
+ from: scroller.from,
+ to: scroller.to,
+ trigger: 'scrollbar',
+ DOMType: e.type,
+ DOMEvent: e
+ });
+ }
+ }
+ };
+
+ /**
+ * Event handler for the mouse up event.
+ */
+ scroller.mouseUpHandler = function (e) {
+ if (scroller.hasDragged) {
+ fireEvent(scroller, 'changed', {
+ from: scroller.from,
+ to: scroller.to,
+ trigger: 'scrollbar',
+ DOMType: e.type,
+ DOMEvent: e
+ });
+ }
+ scroller.grabbedCenter = scroller.hasDragged = scroller.chartX = scroller.chartY = null;
+ };
+
+ scroller.mouseDownHandler = function (e) {
+ var normalizedEvent = scroller.chart.pointer.normalize(e);
+
+ scroller.chartX = (normalizedEvent.chartX - scroller.x - scroller.xOffset) / scroller.barWidth;
+ scroller.chartY = (normalizedEvent.chartY - scroller.y - scroller.yOffset) / scroller.barWidth;
+ scroller.initPositions = [scroller.from, scroller.to];
+
+ scroller.grabbedCenter = true;
+ };
+
+ scroller.buttonToMinClick = function (e) {
+ var range = correctFloat(scroller.to - scroller.from) * scroller.options.step;
+ scroller.updatePosition(correctFloat(scroller.from - range), correctFloat(scroller.to - range));
+ fireEvent(scroller, 'changed', {
+ from: scroller.from,
+ to: scroller.to,
+ trigger: 'scrollbar',
+ DOMEvent: e
+ });
+ };
+
+ scroller.buttonToMaxClick = function (e) {
+ var range = (scroller.to - scroller.from) * scroller.options.step;
+ scroller.updatePosition(scroller.from + range, scroller.to + range);
+ fireEvent(scroller, 'changed', {
+ from: scroller.from,
+ to: scroller.to,
+ trigger: 'scrollbar',
+ DOMEvent: e
+ });
+ };
+
+ scroller.trackClick = function (e) {
+ var normalizedEvent = scroller.chart.pointer.normalize(e),
+ range = scroller.to - scroller.from,
+ top = scroller.y + scroller.scrollbarTop,
+ left = scroller.x + scroller.scrollbarLeft;
+
+ if ((scroller.options.vertical && normalizedEvent.chartY > top) ||
+ (!scroller.options.vertical && normalizedEvent.chartX > left)) {
+ // On the top or on the left side of the track:
+ scroller.updatePosition(scroller.from + range, scroller.to + range);
+ } else {
+ // On the bottom or the right side of the track:
+ scroller.updatePosition(scroller.from - range, scroller.to - range);
+ }
+
+ fireEvent(scroller, 'changed', {
+ from: scroller.from,
+ to: scroller.to,
+ trigger: 'scrollbar',
+ DOMEvent: e
+ });
+ };
+ },
+
+ /**
+ * Update position option in the Scrollbar, with normalized 0-1 scale
+ */
+ updatePosition: function (from, to) {
+ if (to > 1) {
+ from = correctFloat(1 - correctFloat(to - from));
+ to = 1;
+ }
+
+ if (from < 0) {
+ to = correctFloat(to - from);
+ from = 0;
+ }
+
+ this.from = from;
+ this.to = to;
+ },
+
+ /**
+ * Set up the mouse and touch events for the Scrollbar
+ */
+ addEvents: function () {
+ var buttonsOrder = this.options.inverted ? [1, 0] : [0, 1],
+ buttons = this.scrollbarButtons,
+ bar = this.scrollbarGroup.element,
+ track = this.track.element,
+ mouseDownHandler = this.mouseDownHandler,
+ mouseMoveHandler = this.mouseMoveHandler,
+ mouseUpHandler = this.mouseUpHandler,
+ _events;
+
+ // Mouse events
+ _events = [
+ [buttons[buttonsOrder[0]].element, 'click', this.buttonToMinClick],
+ [buttons[buttonsOrder[1]].element, 'click', this.buttonToMaxClick],
+ [track, 'click', this.trackClick],
+ [bar, 'mousedown', mouseDownHandler],
+ [doc, 'mousemove', mouseMoveHandler],
+ [doc, 'mouseup', mouseUpHandler]
+ ];
+
+ // Touch events
+ if (hasTouch) {
+ _events.push(
+ [bar, 'touchstart', mouseDownHandler],
+ [doc, 'touchmove', mouseMoveHandler],
+ [doc, 'touchend', mouseUpHandler]
+ );
+ }
+
+ // Add them all
+ each(_events, function (args) {
+ addEvent.apply(null, args);
+ });
+ this._events = _events;
+ },
+
+ /**
+ * Removes the event handlers attached previously with addEvents.
+ */
+ removeEvents: function () {
+ each(this._events, function (args) {
+ removeEvent.apply(null, args);
+ });
+ this._events = UNDEFINED;
+ },
+
+ /**
+ * Destroys allocated elements.
+ */
+ destroy: function () {
+ var scroller = this;
+
+ // Disconnect events added in addEvents
+ scroller.removeEvents();
+
+ // Destroy properties
+ each([scroller.track, scroller.scrollbarRifles, scroller.scrollbar, scroller.scrollbarGroup, scroller.group], function (prop) {
+ if (prop && prop.destroy) {
+ prop = prop.destroy();
+ }
+ });
+
+ // Destroy elements in collection
+ destroyObjectProperties(scroller.scrollbarButtons);
+ }
+ };
+
+ /**
+ * Wrap axis initialization and create scrollbar if enabled:
+ */
+ wrap(Axis.prototype, 'init', function (proceed) {
+ var axis = this;
+ proceed.apply(axis, [].slice.call(arguments, 1));
+
+ if (axis.options.scrollbar && axis.options.scrollbar.enabled) {
+ // Predefined options:
+ axis.options.scrollbar.vertical = !axis.horiz;
+ axis.options.startOnTick = axis.options.endOnTick = false;
+
+ axis.scrollbar = new Scrollbar(axis.chart.renderer, axis.options.scrollbar, axis.chart);
+
+ addEvent(axis.scrollbar, 'changed', function (e) {
+ var unitedMin = Math.min(pick(axis.options.min, axis.min), axis.min, axis.dataMin),
+ unitedMax = Math.max(pick(axis.options.max, axis.max), axis.max, axis.dataMax),
+ range = unitedMax - unitedMin,
+ to,
+ from;
+
+ if ((axis.horiz && !axis.reversed) || (!axis.horiz && axis.reversed)) {
+ to = unitedMin + range * this.to;
+ from = unitedMin + range * this.from;
+ } else {
+ // y-values in browser are reversed, but this also applies for reversed horizontal axis:
+ to = unitedMin + range * (1 - this.from);
+ from = unitedMin + range * (1 - this.to);
+ }
+
+ axis.setExtremes(from, to, true, false, e);
+ });
+ }
+ });
+
+ /**
+ * Wrap rendering axis, and update scrollbar if one is created:
+ */
+ wrap(Axis.prototype, 'render', function (proceed) {
+ var axis = this,
+ scrollMin = Math.min(pick(axis.options.min, axis.min), axis.min, axis.dataMin),
+ scrollMax = Math.max(pick(axis.options.max, axis.max), axis.max, axis.dataMax),
+ scrollbar = axis.scrollbar,
+ from,
+ to;
+
+ proceed.apply(axis, [].slice.call(arguments, 1));
+
+ if (scrollbar) {
+ if (axis.horiz) {
+ scrollbar.position(
+ axis.left,
+ axis.top + axis.height + axis.offset + 2 + (axis.opposite ? 0 : axis.axisTitleMargin),
+ axis.width,
+ axis.height
+ );
+ } else {
+ scrollbar.position(
+ axis.left + axis.width + 2 + axis.offset + (axis.opposite ? axis.axisTitleMargin : 0),
+ axis.top,
+ axis.width,
+ axis.height
+ );
+ }
+
+ if (isNaN(scrollMin) || isNaN(scrollMax) || !defined(axis.min) || !defined(axis.max)) {
+ scrollbar.setRange(0, 0); // default action: when there is not extremes on the axis, but scrollbar exists, make it full size
+ } else {
+ from = (axis.min - scrollMin) / (scrollMax - scrollMin);
+ to = (axis.max - scrollMin) / (scrollMax - scrollMin);
+
+ if ((axis.horiz && !axis.reversed) || (!axis.horiz && axis.reversed)) {
+ scrollbar.setRange(from, to);
+ } else {
+ scrollbar.setRange(1 - to, 1 - from); // inverse vertical axis
+ }
+ }
+ }
+ });
+
+ /**
+ * Make space for a scrollbar
+ */
+ wrap(Axis.prototype, 'getOffset', function (proceed) {
+ var axis = this,
+ index = axis.horiz ? 2 : 1,
+ scrollbar = axis.scrollbar;
+
+ proceed.apply(axis, [].slice.call(arguments, 1));
+
+ if (scrollbar) {
+ axis.chart.axisOffset[index] += scrollbar.size + scrollbar.options.margin;
+ }
+ });
+
+ /**
+ * Destroy scrollbar when connected to the specific axis
+ */
+ wrap(Axis.prototype, 'destroy', function (proceed) {
+ if (this.scrollbar) {
+ this.scrollbar = this.scrollbar.destroy();
+ }
+
+ proceed.apply(this, [].slice.call(arguments, 1));
+ });
+
+ Highcharts.Scrollbar = Scrollbar;
+ /* ****************************************************************************
+ * Start Navigator code *
+ *****************************************************************************/
+ var units = [].concat(defaultDataGroupingUnits), // copy
+ defaultSeriesType,
+
+ // Finding the min or max of a set of variables where we don't know if they are defined,
+ // is a pattern that is repeated several places in Highcharts. Consider making this
+ // a global utility method.
+ numExt = function (extreme) {
+ var numbers = grep(arguments, isNumber);
+ if (numbers.length) {
+ return Math[extreme].apply(0, numbers);
+ }
+ };
+
+ // add more resolution to units
+ units[4] = ['day', [1, 2, 3, 4]]; // allow more days
+ units[5] = ['week', [1, 2, 3]]; // allow more weeks
+
+ defaultSeriesType = seriesTypes.areaspline === UNDEFINED ? 'line' : 'areaspline';
+
+ extend(defaultOptions, {
+ navigator: {
+ //enabled: true,
+ handles: {
+ backgroundColor: '#ebe7e8',
+ borderColor: '#b2b1b6'
+ },
+ height: 40,
+ margin: 25,
+ maskFill: 'rgba(128,179,236,0.3)',
+ maskInside: true,
+ outlineColor: '#b2b1b6',
+ outlineWidth: 1,
+ series: {
+ type: defaultSeriesType,
+ color: '#4572A7',
+ compare: null,
+ fillOpacity: 0.05,
+ dataGrouping: {
+ approximation: 'average',
+ enabled: true,
+ groupPixelWidth: 2,
+ smoothed: true,
+ units: units
+ },
+ dataLabels: {
+ enabled: false,
+ zIndex: 2 // #1839
+ },
+ id: PREFIX + 'navigator-series',
+ lineColor: null, // Allow color setting while disallowing default candlestick setting (#4602)
+ lineWidth: 1,
+ marker: {
+ enabled: false
+ },
+ pointRange: 0,
+ shadow: false,
+ threshold: null
+ },
+ //top: undefined,
+ xAxis: {
+ tickWidth: 0,
+ lineWidth: 0,
+ gridLineColor: '#EEE',
+ gridLineWidth: 1,
+ tickPixelInterval: 200,
+ labels: {
+ align: 'left',
+ style: {
+ color: '#888'
+ },
+ x: 3,
+ y: -4
+ },
+ crosshair: false
+ },
+ yAxis: {
+ gridLineWidth: 0,
+ startOnTick: false,
+ endOnTick: false,
+ minPadding: 0.1,
+ maxPadding: 0.1,
+ labels: {
+ enabled: false
+ },
+ crosshair: false,
+ title: {
+ text: null
+ },
+ tickWidth: 0
+ }
+ }
+ });
+
+ /**
+ * The Navigator class
+ * @param {Object} chart
+ */
+ function Navigator(chart) {
+ var chartOptions = chart.options,
+ navigatorOptions = chartOptions.navigator,
+ navigatorEnabled = navigatorOptions.enabled,
+ scrollbarOptions = chartOptions.scrollbar,
+ scrollbarEnabled = scrollbarOptions.enabled,
+ height = navigatorEnabled ? navigatorOptions.height : 0,
+ scrollbarHeight = scrollbarEnabled ? scrollbarOptions.height : 0;
+
+ this.handles = [];
+ this.elementsToDestroy = []; // Array containing the elements to destroy when Navigator is destroyed
+
+ this.chart = chart;
+ this.setBaseSeries();
+
+ this.height = height;
+ this.scrollbarHeight = scrollbarHeight;
+ this.scrollbarEnabled = scrollbarEnabled;
+ this.navigatorEnabled = navigatorEnabled;
+ this.navigatorOptions = navigatorOptions;
+ this.outlineHeight = height + scrollbarHeight;
+
+ // Run scroller
+ this.init();
+ }
+
+ Navigator.prototype = {
+ /**
+ * Draw one of the handles on the side of the zoomed range in the navigator
+ * @param {Number} x The x center for the handle
+ * @param {Number} index 0 for left and 1 for right
+ */
+ drawHandle: function (x, index) {
+ var scroller = this,
+ chart = scroller.chart,
+ renderer = chart.renderer,
+ elementsToDestroy = scroller.elementsToDestroy,
+ handles = scroller.handles,
+ handlesOptions = scroller.navigatorOptions.handles,
+ attr = {
+ fill: handlesOptions.backgroundColor,
+ stroke: handlesOptions.borderColor,
+ 'stroke-width': 1
+ },
+ tempElem;
+
+ // create the elements
+ if (!scroller.rendered) {
+ // the group
+ handles[index] = renderer.g('navigator-handle-' + ['left', 'right'][index])
+ .css({ cursor: 'ew-resize' })
+ .attr({ zIndex: 10 - index }) // zIndex = 3 for right handle, 4 for left / 10 - #2908
+ .add();
+
+ // the rectangle
+ tempElem = renderer.rect(-4.5, 0, 9, 16, 0, 1)
+ .attr(attr)
+ .add(handles[index]);
+ elementsToDestroy.push(tempElem);
+
+ // the rifles
+ tempElem = renderer
+ .path([
+ 'M',
+ -1.5, 4,
+ 'L',
+ -1.5, 12,
+ 'M',
+ 0.5, 4,
+ 'L',
+ 0.5, 12
+ ]).attr(attr)
+ .add(handles[index]);
+ elementsToDestroy.push(tempElem);
+ }
+
+ // Place it
+ handles[index][scroller.rendered && !scroller.hasDragged ? 'animate' : 'attr']({
+ translateX: scroller.scrollerLeft + scroller.scrollbarHeight + parseInt(x, 10),
+ translateY: scroller.top + scroller.height / 2 - 8
+ });
+ },
+
+ /**
+ * Render the navigator
+ * @param {Number} min X axis value minimum
+ * @param {Number} max X axis value maximum
+ * @param {Number} pxMin Pixel value minimum
+ * @param {Number} pxMax Pixel value maximum
+ */
+ render: function (min, max, pxMin, pxMax) {
+ var scroller = this,
+ chart = scroller.chart,
+ renderer = chart.renderer,
+ navigatorLeft,
+ navigatorWidth,
+ scrollerLeft,
+ scrollerWidth,
+ navigatorGroup = scroller.navigatorGroup,
+ scrollbarHeight = scroller.scrollbarHeight,
+ xAxis = scroller.xAxis,
+ navigatorOptions = scroller.navigatorOptions,
+ height = scroller.height,
+ top = scroller.top,
+ navigatorEnabled = scroller.navigatorEnabled,
+ outlineWidth = navigatorOptions.outlineWidth,
+ halfOutline = outlineWidth / 2,
+ zoomedMin,
+ zoomedMax,
+ outlineHeight = scroller.outlineHeight,
+ outlineTop = top + halfOutline,
+ rendered = scroller.rendered,
+ verb;
+
+ // Don't render the navigator until we have data (#486, #4202, #5172). Don't redraw while moving the handles (#4703).
+ if (!isNumber(min) || !isNumber(max) || (scroller.hasDragged && !defined(pxMin))) {
+ return;
+ }
+
+ scroller.navigatorLeft = navigatorLeft = pick(
+ xAxis.left,
+ chart.plotLeft + scrollbarHeight // in case of scrollbar only, without navigator
+ );
+ scroller.navigatorWidth = navigatorWidth = pick(xAxis.len, chart.plotWidth - 2 * scrollbarHeight);
+ scroller.scrollerLeft = scrollerLeft = navigatorLeft - scrollbarHeight;
+ scroller.scrollerWidth = scrollerWidth = scrollerWidth = navigatorWidth + 2 * scrollbarHeight;
+
+ // Get the pixel position of the handles
+ pxMin = pick(pxMin, xAxis.translate(min));
+ pxMax = pick(pxMax, xAxis.translate(max));
+ if (!isNumber(pxMin) || mathAbs(pxMin) === Infinity) { // Verify (#1851, #2238)
+ pxMin = 0;
+ pxMax = scrollerWidth;
+ }
+
+ // Are we below the minRange? (#2618)
+ if (xAxis.translate(pxMax, true) - xAxis.translate(pxMin, true) < chart.xAxis[0].minRange) {
+ return;
+ }
+
+
+ // handles are allowed to cross, but never exceed the plot area
+ scroller.zoomedMax = mathMin(mathMax(pxMin, pxMax, 0), navigatorWidth);
+ scroller.zoomedMin = mathMin(mathMax(scroller.fixedWidth ? scroller.zoomedMax - scroller.fixedWidth : mathMin(pxMin, pxMax), 0), navigatorWidth);
+ scroller.range = scroller.zoomedMax - scroller.zoomedMin;
+ zoomedMax = mathRound(scroller.zoomedMax);
+ zoomedMin = mathRound(scroller.zoomedMin);
+
+ if (!rendered) {
+
+ if (navigatorEnabled) {
+
+ // draw the navigator group
+ scroller.navigatorGroup = navigatorGroup = renderer.g('navigator')
+ .attr({
+ zIndex: 3
+ })
+ .add();
+
+ scroller.leftShade = renderer.rect()
+ .attr({
+ fill: navigatorOptions.maskFill
+ }).add(navigatorGroup);
+
+ if (navigatorOptions.maskInside) {
+ scroller.leftShade.css({ cursor: 'ew-resize' });
+ } else {
+ scroller.rightShade = renderer.rect()
+ .attr({
+ fill: navigatorOptions.maskFill
+ }).add(navigatorGroup);
+ }
+
+
+ scroller.outline = renderer.path()
+ .attr({
+ 'stroke-width': outlineWidth,
+ stroke: navigatorOptions.outlineColor
+ })
+ .add(navigatorGroup);
+ }
+ }
+
+ // place elements
+ verb = rendered && !scroller.hasDragged ? 'animate' : 'attr';
+ if (navigatorEnabled) {
+ scroller.leftShade[verb](navigatorOptions.maskInside ? {
+ x: navigatorLeft + zoomedMin,
+ y: top,
+ width: zoomedMax - zoomedMin,
+ height: height
+ } : {
+ x: navigatorLeft,
+ y: top,
+ width: zoomedMin,
+ height: height
+ });
+ if (scroller.rightShade) {
+ scroller.rightShade[verb]({
+ x: navigatorLeft + zoomedMax,
+ y: top,
+ width: navigatorWidth - zoomedMax,
+ height: height
+ });
+ }
+
+ scroller.outline[verb]({ d: [
+ M,
+ scrollerLeft, outlineTop, // left
+ L,
+ navigatorLeft + zoomedMin - halfOutline, outlineTop, // upper left of zoomed range
+ navigatorLeft + zoomedMin - halfOutline, outlineTop + outlineHeight, // lower left of z.r.
+ L,
+ navigatorLeft + zoomedMax - halfOutline, outlineTop + outlineHeight, // lower right of z.r.
+ L,
+ navigatorLeft + zoomedMax - halfOutline, outlineTop, // upper right of z.r.
+ scrollerLeft + scrollerWidth, outlineTop // right
+ ].concat(navigatorOptions.maskInside ? [
+ M,
+ navigatorLeft + zoomedMin + halfOutline, outlineTop, // upper left of zoomed range
+ L,
+ navigatorLeft + zoomedMax - halfOutline, outlineTop // upper right of z.r.
+ ] : []) });
+ // draw handles
+ scroller.drawHandle(zoomedMin + halfOutline, 0);
+ scroller.drawHandle(zoomedMax + halfOutline, 1);
+ }
+
+ if (scroller.scrollbar) {
+
+ scroller.scrollbar.hasDragged = scroller.hasDragged;
+
+ // Keep scale 0-1
+ scroller.scrollbar.position(
+ scroller.scrollerLeft,
+ scroller.top + (navigatorEnabled ? scroller.height : -scroller.scrollbarHeight),
+ scroller.scrollerWidth,
+ scroller.scrollbarHeight
+ );
+ scroller.scrollbar.setRange(
+ zoomedMin / navigatorWidth,
+ zoomedMax / navigatorWidth
+ );
+ }
+ scroller.rendered = true;
+ },
+
+ /**
+ * Set up the mouse and touch events for the navigator
+ */
+ addEvents: function () {
+ var chart = this.chart,
+ container = chart.container,
+ mouseDownHandler = this.mouseDownHandler,
+ mouseMoveHandler = this.mouseMoveHandler,
+ mouseUpHandler = this.mouseUpHandler,
+ _events;
+
+ // Mouse events
+ _events = [
+ [container, 'mousedown', mouseDownHandler],
+ [container, 'mousemove', mouseMoveHandler],
+ [doc, 'mouseup', mouseUpHandler]
+ ];
+
+ // Touch events
+ if (hasTouch) {
+ _events.push(
+ [container, 'touchstart', mouseDownHandler],
+ [container, 'touchmove', mouseMoveHandler],
+ [doc, 'touchend', mouseUpHandler]
+ );
+ }
+
+ // Add them all
+ each(_events, function (args) {
+ addEvent.apply(null, args);
+ });
+ this._events = _events;
+
+ // Data events
+ if (this.series) {
+ addEvent(this.series.xAxis, 'foundExtremes', function () {
+ chart.scroller.modifyNavigatorAxisExtremes();
+ });
+ }
+
+ addEvent(chart, 'redraw', function () {
+ // Move the scrollbar after redraw, like after data updata even if axes don't redraw
+ var scroller = this.scroller,
+ xAxis = scroller && scroller.baseSeries && scroller.baseSeries.xAxis;
+
+ if (xAxis) {
+ scroller.render(xAxis.min, xAxis.max);
+ }
+ });
+ },
+
+ /**
+ * Removes the event handlers attached previously with addEvents.
+ */
+ removeEvents: function () {
+
+ each(this._events, function (args) {
+ removeEvent.apply(null, args);
+ });
+ this._events = UNDEFINED;
+ this.removeBaseSeriesEvents();
+ },
+
+ removeBaseSeriesEvents: function () {
+ if (this.navigatorEnabled && this.baseSeries && this.baseSeries.xAxis && this.navigatorOptions.adaptToUpdatedData !== false) {
+ removeEvent(this.baseSeries, 'updatedData', this.updatedDataHandler);
+ removeEvent(this.baseSeries.xAxis, 'foundExtremes', this.modifyBaseAxisExtremes);
+ }
+ },
+
+ /**
+ * Initiate the Navigator object
+ */
+ init: function () {
+ var scroller = this,
+ chart = scroller.chart,
+ xAxis,
+ yAxis,
+ scrollbarHeight = scroller.scrollbarHeight,
+ navigatorOptions = scroller.navigatorOptions,
+ height = scroller.height,
+ top = scroller.top,
+ dragOffset,
+ baseSeries = scroller.baseSeries;
+
+ /**
+ * Event handler for the mouse down event.
+ */
+ scroller.mouseDownHandler = function (e) {
+ e = chart.pointer.normalize(e);
+
+ var zoomedMin = scroller.zoomedMin,
+ zoomedMax = scroller.zoomedMax,
+ top = scroller.top,
+ scrollerLeft = scroller.scrollerLeft,
+ scrollerWidth = scroller.scrollerWidth,
+ navigatorLeft = scroller.navigatorLeft,
+ navigatorWidth = scroller.navigatorWidth,
+ scrollbarPad = scroller.scrollbarPad || 0,
+ range = scroller.range,
+ chartX = e.chartX,
+ chartY = e.chartY,
+ baseXAxis = chart.xAxis[0],
+ fixedMax,
+ ext,
+ handleSensitivity = isTouchDevice ? 10 : 7,
+ left;
+
+ if (chartY > top && chartY < top + height) { // we're vertically inside the navigator
+
+ // grab the left handle
+ if (math.abs(chartX - zoomedMin - navigatorLeft) < handleSensitivity) {
+ scroller.grabbedLeft = true;
+ scroller.otherHandlePos = zoomedMax;
+ scroller.fixedExtreme = baseXAxis.max;
+ chart.fixedRange = null;
+
+ // grab the right handle
+ } else if (math.abs(chartX - zoomedMax - navigatorLeft) < handleSensitivity) {
+ scroller.grabbedRight = true;
+ scroller.otherHandlePos = zoomedMin;
+ scroller.fixedExtreme = baseXAxis.min;
+ chart.fixedRange = null;
+
+ // grab the zoomed range
+ } else if (chartX > navigatorLeft + zoomedMin - scrollbarPad && chartX < navigatorLeft + zoomedMax + scrollbarPad) {
+ scroller.grabbedCenter = chartX;
+ scroller.fixedWidth = range;
+
+ dragOffset = chartX - zoomedMin;
+
+ // shift the range by clicking on shaded areas
+ } else if (chartX > scrollerLeft && chartX < scrollerLeft + scrollerWidth) {
+ left = chartX - navigatorLeft - range / 2;
+ if (left < 0) {
+ left = 0;
+ } else if (left + range >= navigatorWidth) {
+ left = navigatorWidth - range;
+ fixedMax = scroller.getUnionExtremes().dataMax; // #2293, #3543
+ }
+ if (left !== zoomedMin) { // it has actually moved
+ scroller.fixedWidth = range; // #1370
+
+ ext = xAxis.toFixedRange(left, left + range, null, fixedMax);
+ baseXAxis.setExtremes(
+ ext.min,
+ ext.max,
+ true,
+ null, // auto animation
+ { trigger: 'navigator' }
+ );
+ }
+ }
+
+ }
+ };
+
+ /**
+ * Event handler for the mouse move event.
+ */
+ scroller.mouseMoveHandler = function (e) {
+ var scrollbarHeight = scroller.scrollbarHeight,
+ navigatorLeft = scroller.navigatorLeft,
+ navigatorWidth = scroller.navigatorWidth,
+ scrollerLeft = scroller.scrollerLeft,
+ scrollerWidth = scroller.scrollerWidth,
+ range = scroller.range,
+ chartX;
+
+ // In iOS, a mousemove event with e.pageX === 0 is fired when holding the finger
+ // down in the center of the scrollbar. This should be ignored.
+ if (!e.touches || e.touches[0].pageX !== 0) { // #4696, scrollbar failed on Android
+
+ e = chart.pointer.normalize(e);
+ chartX = e.chartX;
+
+ // validation for handle dragging
+ if (chartX < navigatorLeft) {
+ chartX = navigatorLeft;
+ } else if (chartX > scrollerLeft + scrollerWidth - scrollbarHeight) {
+ chartX = scrollerLeft + scrollerWidth - scrollbarHeight;
+ }
+
+ // drag left handle
+ if (scroller.grabbedLeft) {
+ scroller.hasDragged = true;
+ scroller.render(0, 0, chartX - navigatorLeft, scroller.otherHandlePos);
+
+ // drag right handle
+ } else if (scroller.grabbedRight) {
+ scroller.hasDragged = true;
+ scroller.render(0, 0, scroller.otherHandlePos, chartX - navigatorLeft);
+
+ // drag scrollbar or open area in navigator
+ } else if (scroller.grabbedCenter) {
+
+ scroller.hasDragged = true;
+ if (chartX < dragOffset) { // outside left
+ chartX = dragOffset;
+ } else if (chartX > navigatorWidth + dragOffset - range) { // outside right
+ chartX = navigatorWidth + dragOffset - range;
+ }
+
+ scroller.render(0, 0, chartX - dragOffset, chartX - dragOffset + range);
+ }
+ if (scroller.hasDragged && scroller.scrollbar && scroller.scrollbar.options.liveRedraw) {
+ e.DOMType = e.type; // DOMType is for IE8 because it can't read type async
+ setTimeout(function () {
+ scroller.mouseUpHandler(e);
+ }, 0);
+ }
+ }
+ };
+
+ /**
+ * Event handler for the mouse up event.
+ */
+ scroller.mouseUpHandler = function (e) {
+ var ext,
+ fixedMin,
+ fixedMax,
+ DOMEvent = e.DOMEvent || e;
+
+ if (scroller.hasDragged || e.trigger === 'scrollbar') {
+ // When dragging one handle, make sure the other one doesn't change
+ if (scroller.zoomedMin === scroller.otherHandlePos) {
+ fixedMin = scroller.fixedExtreme;
+ } else if (scroller.zoomedMax === scroller.otherHandlePos) {
+ fixedMax = scroller.fixedExtreme;
+ }
+
+ // Snap to right edge (#4076)
+ if (scroller.zoomedMax === scroller.navigatorWidth) {
+ fixedMax = scroller.getUnionExtremes().dataMax;
+ }
+
+ ext = xAxis.toFixedRange(scroller.zoomedMin, scroller.zoomedMax, fixedMin, fixedMax);
+ if (defined(ext.min)) {
+ chart.xAxis[0].setExtremes(
+ ext.min,
+ ext.max,
+ true,
+ scroller.hasDragged ? false : null, // Run animation when clicking buttons, scrollbar track etc, but not when dragging handles or scrollbar
+ {
+ trigger: 'navigator',
+ triggerOp: 'navigator-drag',
+ DOMEvent: DOMEvent // #1838
+ }
+ );
+ }
+ }
+
+ if (e.DOMType !== 'mousemove') {
+ scroller.grabbedLeft = scroller.grabbedRight = scroller.grabbedCenter = scroller.fixedWidth =
+ scroller.fixedExtreme = scroller.otherHandlePos = scroller.hasDragged = dragOffset = null;
+ }
+
+ };
+
+
+
+ var xAxisIndex = chart.xAxis.length,
+ yAxisIndex = chart.yAxis.length;
+
+ // make room below the chart
+ chart.extraBottomMargin = scroller.outlineHeight + navigatorOptions.margin;
+
+
+ if (scroller.navigatorEnabled) {
+ // an x axis is required for scrollbar also
+ scroller.xAxis = xAxis = new Axis(chart, merge({
+ // inherit base xAxis' break and ordinal options
+ breaks: baseSeries && baseSeries.xAxis.options.breaks,
+ ordinal: baseSeries && baseSeries.xAxis.options.ordinal
+ }, navigatorOptions.xAxis, {
+ id: 'navigator-x-axis',
+ isX: true,
+ type: 'datetime',
+ index: xAxisIndex,
+ height: height,
+ offset: 0,
+ offsetLeft: scrollbarHeight,
+ offsetRight: -scrollbarHeight,
+ keepOrdinalPadding: true, // #2436
+ startOnTick: false,
+ endOnTick: false,
+ minPadding: 0,
+ maxPadding: 0,
+ zoomEnabled: false
+ }));
+
+ scroller.yAxis = yAxis = new Axis(chart, merge(navigatorOptions.yAxis, {
+ id: 'navigator-y-axis',
+ alignTicks: false,
+ height: height,
+ offset: 0,
+ index: yAxisIndex,
+ zoomEnabled: false
+ }));
+
+ // If we have a base series, initialize the navigator series
+ if (baseSeries || navigatorOptions.series.data) {
+ scroller.addBaseSeries();
+
+ // If not, set up an event to listen for added series
+ } else if (chart.series.length === 0) {
+
+ wrap(chart, 'redraw', function (proceed, animation) {
+ // We've got one, now add it as base and reset chart.redraw
+ if (chart.series.length > 0 && !scroller.series) {
+ scroller.setBaseSeries();
+ chart.redraw = proceed; // reset
+ }
+ proceed.call(chart, animation);
+ });
+ }
+
+ // in case of scrollbar only, fake an x axis to get translation
+ } else {
+ scroller.xAxis = xAxis = {
+ translate: function (value, reverse) {
+ var axis = chart.xAxis[0],
+ ext = axis.getExtremes(),
+ scrollTrackWidth = chart.plotWidth - 2 * scrollbarHeight,
+ min = numExt('min', axis.options.min, ext.dataMin),
+ valueRange = numExt('max', axis.options.max, ext.dataMax) - min;
+
+ return reverse ?
+ // from pixel to value
+ (value * valueRange / scrollTrackWidth) + min :
+ // from value to pixel
+ scrollTrackWidth * (value - min) / valueRange;
+ },
+ toFixedRange: Axis.prototype.toFixedRange
+ };
+ }
+
+
+ // Initialize the scrollbar
+ if (chart.options.scrollbar.enabled) {
+ scroller.scrollbar = new Scrollbar(
+ chart.renderer,
+ merge(chart.options.scrollbar, { margin: scroller.navigatorEnabled ? 0 : 10 }),
+ chart
+ );
+ addEvent(scroller.scrollbar, 'changed', function (e) {
+ var range = scroller.navigatorWidth,
+ to = range * this.to,
+ from = range * this.from;
+
+ scroller.hasDragged = scroller.scrollbar.hasDragged;
+ scroller.render(0, 0, from, to);
+
+ if (chart.options.scrollbar.liveRedraw || e.DOMType !== 'mousemove') {
+ setTimeout(function () {
+ scroller.mouseUpHandler(e);
+ });
+ }
+ });
+ }
+
+ // Add data events
+ scroller.addBaseSeriesEvents();
+
+
+ /**
+ * For stock charts, extend the Chart.getMargins method so that we can set the final top position
+ * of the navigator once the height of the chart, including the legend, is determined. #367.
+ */
+ wrap(chart, 'getMargins', function (proceed) {
+
+ var legend = this.legend,
+ legendOptions = legend.options;
+
+ proceed.apply(this, [].slice.call(arguments, 1));
+
+ // Compute the top position
+ scroller.top = top = scroller.navigatorOptions.top ||
+ this.chartHeight - scroller.height - scroller.scrollbarHeight - this.spacing[2] -
+ (legendOptions.verticalAlign === 'bottom' && legendOptions.enabled && !legendOptions.floating ?
+ legend.legendHeight + pick(legendOptions.margin, 10) : 0);
+
+ if (xAxis && yAxis) { // false if navigator is disabled (#904)
+
+ xAxis.options.top = yAxis.options.top = top;
+
+ xAxis.setAxisSize();
+ yAxis.setAxisSize();
+ }
+ });
+
+ scroller.addEvents();
+ },
+
+ /**
+ * Get the union data extremes of the chart - the outer data extremes of the base
+ * X axis and the navigator axis.
+ */
+ getUnionExtremes: function (returnFalseOnNoBaseSeries) {
+ var baseAxis = this.chart.xAxis[0],
+ navAxis = this.xAxis,
+ navAxisOptions = navAxis.options,
+ baseAxisOptions = baseAxis.options,
+ ret;
+
+ if (!returnFalseOnNoBaseSeries || baseAxis.dataMin !== null) {
+ ret = {
+ dataMin: pick( // #4053
+ navAxisOptions && navAxisOptions.min,
+ numExt(
+ 'min',
+ baseAxisOptions.min,
+ baseAxis.dataMin,
+ navAxis.dataMin,
+ navAxis.min
+ )
+ ),
+ dataMax: pick(
+ navAxisOptions && navAxisOptions.max,
+ numExt(
+ 'max',
+ baseAxisOptions.max,
+ baseAxis.dataMax,
+ navAxis.dataMax,
+ navAxis.max
+ )
+ )
+ };
+ }
+ return ret;
+ },
+
+ /**
+ * Set the base series. With a bit of modification we should be able to make
+ * this an API method to be called from the outside
+ */
+ setBaseSeries: function (baseSeriesOption) {
+ var chart = this.chart;
+
+ baseSeriesOption = baseSeriesOption || chart.options.navigator.baseSeries;
+
+ // If we're resetting, remove the existing series
+ if (this.series) {
+ this.removeBaseSeriesEvents();
+ this.series.remove();
+ }
+
+ // Set the new base series
+ this.baseSeries = chart.series[baseSeriesOption] ||
+ (typeof baseSeriesOption === 'string' && chart.get(baseSeriesOption)) ||
+ chart.series[0];
+
+ // When run after render, this.xAxis already exists
+ if (this.xAxis) {
+ this.addBaseSeries();
+ }
+ },
+
+ addBaseSeries: function () {
+ var baseSeries = this.baseSeries,
+ baseOptions = baseSeries ? baseSeries.options : {},
+ baseData = baseOptions.data,
+ mergedNavSeriesOptions,
+ navigatorSeriesOptions = this.navigatorOptions.series,
+ navigatorData;
+
+ // remove it to prevent merging one by one
+ navigatorData = navigatorSeriesOptions.data;
+ this.hasNavigatorData = !!navigatorData;
+
+ // Merge the series options
+ mergedNavSeriesOptions = merge(baseOptions, navigatorSeriesOptions, {
+ enableMouseTracking: false,
+ group: 'nav', // for columns
+ padXAxis: false,
+ xAxis: 'navigator-x-axis',
+ yAxis: 'navigator-y-axis',
+ name: 'Navigator',
+ showInLegend: false,
+ stacking: false, // We only allow one series anyway (#4823)
+ isInternal: true,
+ visible: true
+ });
+
+ // Set the data. Do a slice to avoid mutating the navigator options from base series (#4923).
+ mergedNavSeriesOptions.data = navigatorData || baseData.slice(0);
+
+ // Add the series
+ this.series = this.chart.initSeries(mergedNavSeriesOptions);
+
+ this.addBaseSeriesEvents();
+
+ },
+ addBaseSeriesEvents: function () {
+ var baseSeries = this.baseSeries;
+
+ // Respond to updated data in the base series.
+ // Abort if lazy-loading data from the server.
+ if (baseSeries && baseSeries.xAxis && this.navigatorOptions.adaptToUpdatedData !== false) {
+ addEvent(baseSeries, 'updatedData', this.updatedDataHandler);
+ addEvent(baseSeries.xAxis, 'foundExtremes', this.modifyBaseAxisExtremes);
+
+ // Survive Series.update()
+ baseSeries.userOptions.events = extend(baseSeries.userOptions.event, { updatedData: this.updatedDataHandler });
+ }
+ },
+ /**
+ * Set the scroller x axis extremes to reflect the total. The navigator extremes
+ * should always be the extremes of the union of all series in the chart as
+ * well as the navigator series.
+ */
+ modifyNavigatorAxisExtremes: function () {
+ var xAxis = this.xAxis,
+ unionExtremes;
+
+ if (xAxis.getExtremes) {
+ unionExtremes = this.getUnionExtremes(true);
+ if (unionExtremes && (unionExtremes.dataMin !== xAxis.min || unionExtremes.dataMax !== xAxis.max)) {
+ xAxis.min = unionExtremes.dataMin;
+ xAxis.max = unionExtremes.dataMax;
+ }
+ }
+ },
+
+ /**
+ * Hook to modify the base axis extremes with information from the Navigator
+ */
+ modifyBaseAxisExtremes: function () {
+ if (!this.chart.scroller.baseSeries || !this.chart.scroller.baseSeries.xAxis) {
+ return;
+ }
+
+ var baseXAxis = this,
+ scroller = baseXAxis.chart.scroller,
+ baseExtremes = baseXAxis.getExtremes(),
+ baseMin = baseExtremes.min,
+ baseMax = baseExtremes.max,
+ baseDataMin = baseExtremes.dataMin,
+ baseDataMax = baseExtremes.dataMax,
+ range = baseMax - baseMin,
+ stickToMin = scroller.stickToMin,
+ stickToMax = scroller.stickToMax,
+ newMax,
+ newMin,
+ navigatorSeries = scroller.series,
+ hasSetExtremes = !!baseXAxis.setExtremes,
+
+ // When the extremes have been set by range selector button, don't stick to min or max.
+ // The range selector buttons will handle the extremes. (#5489)
+ unmutable = baseXAxis.eventArgs && baseXAxis.eventArgs.trigger === 'rangeSelectorButton';
+
+ if (!unmutable) {
+
+ // If the zoomed range is already at the min, move it to the right as new data
+ // comes in
+ if (stickToMin) {
+ newMin = baseDataMin;
+ newMax = newMin + range;
+ }
+
+ // If the zoomed range is already at the max, move it to the right as new data
+ // comes in
+ if (stickToMax) {
+ newMax = baseDataMax;
+ if (!stickToMin) { // if stickToMin is true, the new min value is set above
+ newMin = mathMax(newMax - range, navigatorSeries && navigatorSeries.xData ? navigatorSeries.xData[0] : -Number.MAX_VALUE);
+ }
+ }
+
+ // Update the extremes
+ if (hasSetExtremes && (stickToMin || stickToMax)) {
+ if (isNumber(newMin)) {
+ baseXAxis.min = baseXAxis.userMin = newMin;
+ baseXAxis.max = baseXAxis.userMax = newMax;
+ }
+ }
+ }
+
+ // Reset
+ scroller.stickToMin = scroller.stickToMax = null;
+ },
+
+ /**
+ * Handler for updated data on the base series. When data is modified, the navigator series
+ * must reflect it. This is called from the Chart.redraw function before axis and series
+ * extremes are computed.
+ */
+ updatedDataHandler: function () {
+ var scroller = this.chart.scroller,
+ baseSeries = scroller.baseSeries,
+ navigatorSeries = scroller.series;
+
+ // Detect whether the zoomed area should stick to the minimum or maximum. If the current
+ // axis minimum falls outside the new updated dataset, we must adjust.
+ scroller.stickToMin = isNumber(baseSeries.xAxis.min) && (baseSeries.xAxis.min <= baseSeries.xData[0]);
+ // If the scrollbar is scrolled all the way to the right, keep right as new data
+ // comes in.
+ scroller.stickToMax = Math.round(scroller.zoomedMax) >= Math.round(scroller.navigatorWidth);
+
+ // Set the navigator series data to the new data of the base series
+ if (navigatorSeries && !scroller.hasNavigatorData) {
+ navigatorSeries.options.pointStart = baseSeries.xData[0];
+ navigatorSeries.setData(baseSeries.options.data, false, null, false); // #5414
+ }
+ },
+
+ /**
+ * Destroys allocated elements.
+ */
+ destroy: function () {
+ var scroller = this;
+
+ // Disconnect events added in addEvents
+ scroller.removeEvents();
+
+ // Destroy properties
+ each([scroller.scrollbar, scroller.xAxis, scroller.yAxis, scroller.leftShade, scroller.rightShade, scroller.outline], function (prop) {
+ if (prop && prop.destroy) {
+ prop.destroy();
+ }
+ });
+ scroller.xAxis = scroller.yAxis = scroller.leftShade = scroller.rightShade = scroller.outline = null;
+
+ // Destroy elements in collection
+ each([scroller.handles, scroller.elementsToDestroy], function (coll) {
+ destroyObjectProperties(coll);
+ });
+ }
+ };
+
+ Highcharts.Navigator = Navigator;
+
+ /**
+ * For Stock charts, override selection zooming with some special features because
+ * X axis zooming is already allowed by the Navigator and Range selector.
+ */
+ wrap(Axis.prototype, 'zoom', function (proceed, newMin, newMax) {
+ var chart = this.chart,
+ chartOptions = chart.options,
+ zoomType = chartOptions.chart.zoomType,
+ previousZoom,
+ navigator = chartOptions.navigator,
+ rangeSelector = chartOptions.rangeSelector,
+ ret;
+
+ if (this.isXAxis && ((navigator && navigator.enabled) ||
+ (rangeSelector && rangeSelector.enabled))) {
+
+ // For x only zooming, fool the chart.zoom method not to create the zoom button
+ // because the property already exists
+ if (zoomType === 'x') {
+ chart.resetZoomButton = 'blocked';
+
+ // For y only zooming, ignore the X axis completely
+ } else if (zoomType === 'y') {
+ ret = false;
+
+ // For xy zooming, record the state of the zoom before zoom selection, then when
+ // the reset button is pressed, revert to this state
+ } else if (zoomType === 'xy') {
+ previousZoom = this.previousZoom;
+ if (defined(newMin)) {
+ this.previousZoom = [this.min, this.max];
+ } else if (previousZoom) {
+ newMin = previousZoom[0];
+ newMax = previousZoom[1];
+ delete this.previousZoom;
+ }
+ }
+
+ }
+ return ret !== UNDEFINED ? ret : proceed.call(this, newMin, newMax);
+ });
+
+ // Initialize scroller for stock charts
+ wrap(Chart.prototype, 'init', function (proceed, options, callback) {
+
+ addEvent(this, 'beforeRender', function () {
+ var options = this.options;
+ if (options.navigator.enabled || options.scrollbar.enabled) {
+ this.scroller = new Navigator(this);
+ }
+ });
+
+ proceed.call(this, options, callback);
+
+ });
+
+ // Pick up badly formatted point options to addPoint
+ wrap(Series.prototype, 'addPoint', function (proceed, options, redraw, shift, animation) {
+ var turboThreshold = this.options.turboThreshold;
+ if (turboThreshold && this.xData.length > turboThreshold && isObject(options, true) && this.chart.scroller) {
+ error(20, true);
+ }
+ proceed.call(this, options, redraw, shift, animation);
+ });
+
+ /* ****************************************************************************
+ * End Navigator code *
+ *****************************************************************************/
+ /* ****************************************************************************
+ * Start Range Selector code *
+ *****************************************************************************/
+ extend(defaultOptions, {
+ rangeSelector: {
+ // allButtonsEnabled: false,
+ // enabled: true,
+ // buttons: {Object}
+ // buttonSpacing: 0,
+ buttonTheme: {
+ width: 28,
+ height: 18,
+ fill: '#f7f7f7',
+ padding: 2,
+ r: 0,
+ 'stroke-width': 0,
+ style: {
+ color: '#444',
+ cursor: 'pointer',
+ fontWeight: 'normal'
+ },
+ zIndex: 7, // #484, #852
+ states: {
+ hover: {
+ fill: '#e7e7e7'
+ },
+ select: {
+ fill: '#e7f0f9',
+ style: {
+ color: 'black',
+ fontWeight: 'bold'
+ }
+ }
+ }
+ },
+ height: 35, // reserved space for buttons and input
+ inputPosition: {
+ align: 'right'
+ },
+ // inputDateFormat: '%b %e, %Y',
+ // inputEditDateFormat: '%Y-%m-%d',
+ // inputEnabled: true,
+ // inputStyle: {},
+ labelStyle: {
+ color: '#666'
+ }
+ // selected: undefined
+ }
+ });
+ defaultOptions.lang = merge(defaultOptions.lang, {
+ rangeSelectorZoom: 'Zoom',
+ rangeSelectorFrom: 'From',
+ rangeSelectorTo: 'To'
+ });
+
+ /**
+ * The object constructor for the range selector
+ * @param {Object} chart
+ */
+ function RangeSelector(chart) {
+
+ // Run RangeSelector
+ this.init(chart);
+ }
+
+ RangeSelector.prototype = {
+ /**
+ * The method to run when one of the buttons in the range selectors is clicked
+ * @param {Number} i The index of the button
+ * @param {Object} rangeOptions
+ * @param {Boolean} redraw
+ */
+ clickButton: function (i, redraw) {
+ var rangeSelector = this,
+ selected = rangeSelector.selected,
+ chart = rangeSelector.chart,
+ buttons = rangeSelector.buttons,
+ rangeOptions = rangeSelector.buttonOptions[i],
+ baseAxis = chart.xAxis[0],
+ unionExtremes = (chart.scroller && chart.scroller.getUnionExtremes()) || baseAxis || {},
+ dataMin = unionExtremes.dataMin,
+ dataMax = unionExtremes.dataMax,
+ newMin,
+ newMax = baseAxis && mathRound(mathMin(baseAxis.max, pick(dataMax, baseAxis.max))), // #1568
+ now,
+ type = rangeOptions.type,
+ baseXAxisOptions,
+ range = rangeOptions._range,
+ rangeMin,
+ year,
+ minSetting,
+ rangeSetting,
+ ctx,
+ dataGrouping = rangeOptions.dataGrouping;
+
+ if (dataMin === null || dataMax === null || // chart has no data, base series is removed
+ i === rangeSelector.selected) { // same button is clicked twice
+ return;
+ }
+
+ // Set the fixed range before range is altered
+ chart.fixedRange = range;
+
+ // Apply dataGrouping associated to button
+ if (dataGrouping) {
+ this.forcedDataGrouping = true;
+ Axis.prototype.setDataGrouping.call(baseAxis || { chart: this.chart }, dataGrouping, false);
+ }
+
+ // Apply range
+ if (type === 'month' || type === 'year') {
+ if (!baseAxis) {
+ // This is set to the user options and picked up later when the axis is instantiated
+ // so that we know the min and max.
+ range = rangeOptions;
+ } else {
+ ctx = {
+ range: rangeOptions,
+ max: newMax,
+ dataMin: dataMin,
+ dataMax: dataMax
+ };
+ newMin = baseAxis.minFromRange.call(ctx);
+ if (isNumber(ctx.newMax)) {
+ newMax = ctx.newMax;
+ }
+ }
+
+ // Fixed times like minutes, hours, days
+ } else if (range) {
+ newMin = mathMax(newMax - range, dataMin);
+ newMax = mathMin(newMin + range, dataMax);
+
+ } else if (type === 'ytd') {
+
+ // On user clicks on the buttons, or a delayed action running from the beforeRender
+ // event (below), the baseAxis is defined.
+ if (baseAxis) {
+
+ // When "ytd" is the pre-selected button for the initial view, its calculation
+ // is delayed and rerun in the beforeRender event (below). When the series
+ // are initialized, but before the chart is rendered, we have access to the xData
+ // array (#942).
+ if (dataMax === UNDEFINED) {
+ dataMin = Number.MAX_VALUE;
+ dataMax = Number.MIN_VALUE;
+ each(chart.series, function (series) {
+ var xData = series.xData; // reassign it to the last item
+ dataMin = mathMin(xData[0], dataMin);
+ dataMax = mathMax(xData[xData.length - 1], dataMax);
+ });
+ redraw = false;
+ }
+ now = new Date(dataMax);
+ year = now.getFullYear();
+ newMin = rangeMin = mathMax(dataMin || 0, Date.UTC(year, 0, 1));
+ now = now.getTime();
+ newMax = mathMin(dataMax || now, now);
+
+ // "ytd" is pre-selected. We don't yet have access to processed point and extremes data
+ // (things like pointStart and pointInterval are missing), so we delay the process (#942)
+ } else {
+ addEvent(chart, 'beforeRender', function () {
+ rangeSelector.clickButton(i);
+ });
+ return;
+ }
+ } else if (type === 'all' && baseAxis) {
+ newMin = dataMin;
+ newMax = dataMax;
+ }
+
+ // Deselect previous button
+ if (buttons[selected]) {
+ buttons[selected].setState(0);
+ }
+ // Select this button
+ if (buttons[i]) {
+ buttons[i].setState(2);
+ rangeSelector.lastSelected = i;
+ }
+
+ // Update the chart
+ if (!baseAxis) {
+ // Axis not yet instanciated. Temporarily set min and range
+ // options and remove them on chart load (#4317).
+ baseXAxisOptions = splat(chart.options.xAxis)[0];
+ rangeSetting = baseXAxisOptions.range;
+ baseXAxisOptions.range = range;
+ minSetting = baseXAxisOptions.min;
+ baseXAxisOptions.min = rangeMin;
+ rangeSelector.setSelected(i);
+ addEvent(chart, 'load', function resetMinAndRange() {
+ baseXAxisOptions.range = rangeSetting;
+ baseXAxisOptions.min = minSetting;
+ });
+ } else {
+ // Existing axis object. Set extremes after render time.
+ baseAxis.setExtremes(
+ newMin,
+ newMax,
+ pick(redraw, 1),
+ null, // auto animation
+ {
+ trigger: 'rangeSelectorButton',
+ rangeSelectorButton: rangeOptions
+ }
+ );
+ rangeSelector.setSelected(i);
+ }
+ },
+
+ /**
+ * Set the selected option. This method only sets the internal flag, it doesn't
+ * update the buttons or the actual zoomed range.
+ */
+ setSelected: function (selected) {
+ this.selected = this.options.selected = selected;
+ },
+
+ /**
+ * The default buttons for pre-selecting time frames
+ */
+ defaultButtons: [{
+ type: 'month',
+ count: 1,
+ text: '1m'
+ }, {
+ type: 'month',
+ count: 3,
+ text: '3m'
+ }, {
+ type: 'month',
+ count: 6,
+ text: '6m'
+ }, {
+ type: 'ytd',
+ text: 'YTD'
+ }, {
+ type: 'year',
+ count: 1,
+ text: '1y'
+ }, {
+ type: 'all',
+ text: 'All'
+ }],
+
+ /**
+ * Initialize the range selector
+ */
+ init: function (chart) {
+
+ var rangeSelector = this,
+ options = chart.options.rangeSelector,
+ buttonOptions = options.buttons || [].concat(rangeSelector.defaultButtons),
+ selectedOption = options.selected,
+ blurInputs = rangeSelector.blurInputs = function () {
+ var minInput = rangeSelector.minInput,
+ maxInput = rangeSelector.maxInput;
+ if (minInput && minInput.blur) { //#3274 in some case blur is not defined
+ fireEvent(minInput, 'blur'); //#3274
+ }
+ if (maxInput && maxInput.blur) { //#3274 in some case blur is not defined
+ fireEvent(maxInput, 'blur'); //#3274
+ }
+ };
+
+ rangeSelector.chart = chart;
+ rangeSelector.options = options;
+ rangeSelector.buttons = [];
+
+ chart.extraTopMargin = options.height;
+ rangeSelector.buttonOptions = buttonOptions;
+
+ addEvent(chart.container, 'mousedown', blurInputs);
+ addEvent(chart, 'resize', blurInputs);
+
+ // Extend the buttonOptions with actual range
+ each(buttonOptions, rangeSelector.computeButtonRange);
+
+ // zoomed range based on a pre-selected button index
+ if (selectedOption !== UNDEFINED && buttonOptions[selectedOption]) {
+ this.clickButton(selectedOption, false);
+ }
+
+
+ addEvent(chart, 'load', function () {
+ // If a data grouping is applied to the current button, release it when extremes change
+ addEvent(chart.xAxis[0], 'setExtremes', function (e) {
+ if (this.max - this.min !== chart.fixedRange && e.trigger !== 'rangeSelectorButton' &&
+ e.trigger !== 'updatedData' && rangeSelector.forcedDataGrouping) {
+ this.setDataGrouping(false, false);
+ }
+ });
+ // Normalize the pressed button whenever a new range is selected
+ addEvent(chart.xAxis[0], 'afterSetExtremes', function () {
+ rangeSelector.updateButtonStates(true);
+ });
+ });
+ },
+
+ /**
+ * Dynamically update the range selector buttons after a new range has been set
+ */
+ updateButtonStates: function (updating) {
+ var rangeSelector = this,
+ chart = this.chart,
+ baseAxis = chart.xAxis[0],
+ unionExtremes = (chart.scroller && chart.scroller.getUnionExtremes()) || baseAxis,
+ dataMin = unionExtremes.dataMin,
+ dataMax = unionExtremes.dataMax,
+ selected = rangeSelector.selected,
+ allButtonsEnabled = rangeSelector.options.allButtonsEnabled,
+ buttons = rangeSelector.buttons;
+
+ if (updating && chart.fixedRange !== mathRound(baseAxis.max - baseAxis.min)) {
+ if (buttons[selected]) {
+ buttons[selected].setState(0);
+ }
+ rangeSelector.setSelected(null);
+ }
+
+ each(rangeSelector.buttonOptions, function (rangeOptions, i) {
+ var actualRange = mathRound(baseAxis.max - baseAxis.min),
+ range = rangeOptions._range,
+ type = rangeOptions.type,
+ count = rangeOptions.count || 1,
+ // Disable buttons where the range exceeds what is allowed in the current view
+ isTooGreatRange = range > dataMax - dataMin,
+ // Disable buttons where the range is smaller than the minimum range
+ isTooSmallRange = range < baseAxis.minRange,
+ // Disable the All button if we're already showing all
+ isAllButAlreadyShowingAll = rangeOptions.type === 'all' && baseAxis.max - baseAxis.min >= dataMax - dataMin &&
+ buttons[i].state !== 2,
+ // Disable the YTD button if the complete range is within the same year
+ isYTDButNotAvailable = rangeOptions.type === 'ytd' && dateFormat('%Y', dataMin) === dateFormat('%Y', dataMax),
+ // Set a button on export
+ isSelectedForExport = chart.renderer.forExport && i === selected,
+
+ isSameRange = range === actualRange,
+
+ hasNoData = !baseAxis.hasVisibleSeries;
+
+ // Months and years have a variable range so we check the extremes
+ if ((type === 'month' || type === 'year') && (actualRange >= { month: 28, year: 365 }[type] * 24 * 36e5 * count) &&
+ (actualRange <= { month: 31, year: 366 }[type] * 24 * 36e5 * count)) {
+ isSameRange = true;
+ }
+ // The new zoom area happens to match the range for a button - mark it selected.
+ // This happens when scrolling across an ordinal gap. It can be seen in the intraday
+ // demos when selecting 1h and scroll across the night gap.
+ if (isSelectedForExport || (isSameRange && i !== selected) && i === rangeSelector.lastSelected) {
+ rangeSelector.setSelected(i);
+ buttons[i].setState(2);
+
+ } else if (!allButtonsEnabled && (isTooGreatRange || isTooSmallRange || isAllButAlreadyShowingAll || isYTDButNotAvailable || hasNoData)) {
+ buttons[i].setState(3);
+
+ } else if (buttons[i].state === 3) {
+ buttons[i].setState(0);
+ }
+ });
+ },
+
+ /**
+ * Compute and cache the range for an individual button
+ */
+ computeButtonRange: function (rangeOptions) {
+ var type = rangeOptions.type,
+ count = rangeOptions.count || 1,
+
+ // these time intervals have a fixed number of milliseconds, as opposed
+ // to month, ytd and year
+ fixedTimes = {
+ millisecond: 1,
+ second: 1000,
+ minute: 60 * 1000,
+ hour: 3600 * 1000,
+ day: 24 * 3600 * 1000,
+ week: 7 * 24 * 3600 * 1000
+ };
+
+ // Store the range on the button object
+ if (fixedTimes[type]) {
+ rangeOptions._range = fixedTimes[type] * count;
+ } else if (type === 'month' || type === 'year') {
+ rangeOptions._range = { month: 30, year: 365 }[type] * 24 * 36e5 * count;
+ }
+ },
+
+ /**
+ * Set the internal and displayed value of a HTML input for the dates
+ * @param {String} name
+ * @param {Number} time
+ */
+ setInputValue: function (name, time) {
+ var options = this.chart.options.rangeSelector;
+
+ if (defined(time)) {
+ this[name + 'Input'].HCTime = time;
+ }
+
+ this[name + 'Input'].value = dateFormat(
+ options.inputEditDateFormat || '%Y-%m-%d',
+ this[name + 'Input'].HCTime
+ );
+ this[name + 'DateBox'].attr({
+ text: dateFormat(options.inputDateFormat || '%b %e, %Y', this[name + 'Input'].HCTime)
+ });
+ },
+
+ showInput: function (name) {
+ var inputGroup = this.inputGroup,
+ dateBox = this[name + 'DateBox'];
+
+ css(this[name + 'Input'], {
+ left: (inputGroup.translateX + dateBox.x) + PX,
+ top: inputGroup.translateY + PX,
+ width: (dateBox.width - 2) + PX,
+ height: (dateBox.height - 2) + PX,
+ border: '2px solid silver'
+ });
+ },
+
+ hideInput: function (name) {
+ css(this[name + 'Input'], {
+ border: 0,
+ width: '1px',
+ height: '1px'
+ });
+ this.setInputValue(name);
+ },
+
+ /**
+ * Draw either the 'from' or the 'to' HTML input box of the range selector
+ * @param {Object} name
+ */
+ drawInput: function (name) {
+ var rangeSelector = this,
+ chart = rangeSelector.chart,
+ chartStyle = chart.renderer.style,
+ renderer = chart.renderer,
+ options = chart.options.rangeSelector,
+ lang = defaultOptions.lang,
+ div = rangeSelector.div,
+ isMin = name === 'min',
+ input,
+ label,
+ dateBox,
+ inputGroup = this.inputGroup;
+
+ function updateExtremes() {
+ var inputValue = input.value,
+ value = (options.inputDateParser || Date.parse)(inputValue),
+ xAxis = chart.xAxis[0],
+ dataMin = xAxis.dataMin,
+ dataMax = xAxis.dataMax;
+ if (value !== input.previousValue) {
+ input.previousValue = value;
+ // If the value isn't parsed directly to a value by the browser's Date.parse method,
+ // like YYYY-MM-DD in IE, try parsing it a different way
+ if (!isNumber(value)) {
+ value = inputValue.split('-');
+ value = Date.UTC(pInt(value[0]), pInt(value[1]) - 1, pInt(value[2]));
+ }
+
+ if (isNumber(value)) {
+
+ // Correct for timezone offset (#433)
+ if (!defaultOptions.global.useUTC) {
+ value = value + new Date().getTimezoneOffset() * 60 * 1000;
+ }
+
+ // Validate the extremes. If it goes beyound the data min or max, use the
+ // actual data extreme (#2438).
+ if (isMin) {
+ if (value > rangeSelector.maxInput.HCTime) {
+ value = UNDEFINED;
+ } else if (value < dataMin) {
+ value = dataMin;
+ }
+ } else {
+ if (value < rangeSelector.minInput.HCTime) {
+ value = UNDEFINED;
+ } else if (value > dataMax) {
+ value = dataMax;
+ }
+ }
+
+ // Set the extremes
+ if (value !== UNDEFINED) {
+ chart.xAxis[0].setExtremes(
+ isMin ? value : xAxis.min,
+ isMin ? xAxis.max : value,
+ UNDEFINED,
+ UNDEFINED,
+ { trigger: 'rangeSelectorInput' }
+ );
+ }
+ }
+ }
+ }
+
+ // Create the text label
+ this[name + 'Label'] = label = renderer.label(lang[isMin ? 'rangeSelectorFrom' : 'rangeSelectorTo'], this.inputGroup.offset)
+ .attr({
+ padding: 2
+ })
+ .css(merge(chartStyle, options.labelStyle))
+ .add(inputGroup);
+ inputGroup.offset += label.width + 5;
+
+ // Create an SVG label that shows updated date ranges and and records click events that
+ // bring in the HTML input.
+ this[name + 'DateBox'] = dateBox = renderer.label('', inputGroup.offset)
+ .attr({
+ padding: 2,
+ width: options.inputBoxWidth || 90,
+ height: options.inputBoxHeight || 17,
+ stroke: options.inputBoxBorderColor || 'silver',
+ 'stroke-width': 1
+ })
+ .css(merge({
+ textAlign: 'center',
+ color: '#444'
+ }, chartStyle, options.inputStyle))
+ .on('click', function () {
+ rangeSelector.showInput(name); // If it is already focused, the onfocus event doesn't fire (#3713)
+ rangeSelector[name + 'Input'].focus();
+ })
+ .add(inputGroup);
+ inputGroup.offset += dateBox.width + (isMin ? 10 : 0);
+
+
+ // Create the HTML input element. This is rendered as 1x1 pixel then set to the right size
+ // when focused.
+ this[name + 'Input'] = input = createElement('input', {
+ name: name,
+ className: PREFIX + 'range-selector',
+ type: 'text'
+ }, extend({
+ position: ABSOLUTE,
+ border: 0,
+ width: '1px', // Chrome needs a pixel to see it
+ height: '1px',
+ padding: 0,
+ textAlign: 'center',
+ fontSize: chartStyle.fontSize,
+ fontFamily: chartStyle.fontFamily,
+ left: '-9em', // #4798
+ top: chart.plotTop + PX // prevent jump on focus in Firefox
+ }, options.inputStyle), div);
+
+ // Blow up the input box
+ input.onfocus = function () {
+ rangeSelector.showInput(name);
+ };
+ // Hide away the input box
+ input.onblur = function () {
+ rangeSelector.hideInput(name);
+ };
+
+ // handle changes in the input boxes
+ input.onchange = updateExtremes;
+
+ input.onkeypress = function (event) {
+ // IE does not fire onchange on enter
+ if (event.keyCode === 13) {
+ updateExtremes();
+ }
+ };
+ },
+
+ /**
+ * Get the position of the range selector buttons and inputs. This can be overridden from outside for custom positioning.
+ */
+ getPosition: function () {
+ var chart = this.chart,
+ options = chart.options.rangeSelector,
+ buttonTop = pick((options.buttonPosition || {}).y, chart.plotTop - chart.axisOffset[0] - options.height);
+
+ return {
+ buttonTop: buttonTop,
+ inputTop: buttonTop - 10
+ };
+ },
+
+ /**
+ * Render the range selector including the buttons and the inputs. The first time render
+ * is called, the elements are created and positioned. On subsequent calls, they are
+ * moved and updated.
+ * @param {Number} min X axis minimum
+ * @param {Number} max X axis maximum
+ */
+ render: function (min, max) {
+
+ var rangeSelector = this,
+ chart = rangeSelector.chart,
+ renderer = chart.renderer,
+ container = chart.container,
+ chartOptions = chart.options,
+ navButtonOptions = chartOptions.exporting && chartOptions.exporting.enabled !== false &&
+ chartOptions.navigation && chartOptions.navigation.buttonOptions,
+ options = chartOptions.rangeSelector,
+ buttons = rangeSelector.buttons,
+ lang = defaultOptions.lang,
+ div = rangeSelector.div,
+ inputGroup = rangeSelector.inputGroup,
+ buttonTheme = options.buttonTheme,
+ buttonPosition = options.buttonPosition || {},
+ inputEnabled = options.inputEnabled,
+ states = buttonTheme && buttonTheme.states,
+ plotLeft = chart.plotLeft,
+ buttonLeft,
+ pos = this.getPosition(),
+ buttonGroup = rangeSelector.group,
+ buttonBBox,
+ rendered = rangeSelector.rendered;
+
+
+ // create the elements
+ if (!rendered) {
+
+ rangeSelector.group = buttonGroup = renderer.g('range-selector-buttons').add();
+
+ rangeSelector.zoomText = renderer.text(lang.rangeSelectorZoom, pick(buttonPosition.x, plotLeft), 15)
+ .css(options.labelStyle)
+ .add(buttonGroup);
+
+ // button starting position
+ buttonLeft = pick(buttonPosition.x, plotLeft) + rangeSelector.zoomText.getBBox().width + 5;
+
+ each(rangeSelector.buttonOptions, function (rangeOptions, i) {
+ buttons[i] = renderer.button(
+ rangeOptions.text,
+ buttonLeft,
+ 0,
+ function () {
+ rangeSelector.clickButton(i);
+ rangeSelector.isActive = true;
+ },
+ buttonTheme,
+ states && states.hover,
+ states && states.select,
+ states && states.disabled
+ )
+ .css({
+ textAlign: 'center'
+ })
+ .add(buttonGroup);
+
+ // increase button position for the next button
+ buttonLeft += buttons[i].width + pick(options.buttonSpacing, 5);
+
+ if (rangeSelector.selected === i) {
+ buttons[i].setState(2);
+ }
+ });
+
+ rangeSelector.updateButtonStates();
+
+ // first create a wrapper outside the container in order to make
+ // the inputs work and make export correct
+ if (inputEnabled !== false) {
+ rangeSelector.div = div = createElement('div', null, {
+ position: 'relative',
+ height: 0,
+ zIndex: 1 // above container
+ });
+
+ container.parentNode.insertBefore(div, container);
+
+ // Create the group to keep the inputs
+ rangeSelector.inputGroup = inputGroup = renderer.g('input-group')
+ .add();
+ inputGroup.offset = 0;
+
+ rangeSelector.drawInput('min');
+ rangeSelector.drawInput('max');
+ }
+ }
+
+ // Set or update the group position
+ buttonGroup[rendered ? 'animate' : 'attr']({
+ translateY: pos.buttonTop
+ });
+
+ if (inputEnabled !== false) {
+
+ // Update the alignment to the updated spacing box
+ inputGroup.align(extend({
+ y: pos.inputTop,
+ width: inputGroup.offset,
+ // Detect collision with the exporting buttons
+ x: navButtonOptions && (pos.inputTop < (navButtonOptions.y || 0) + navButtonOptions.height - chart.spacing[0]) ?
+ -40 : 0
+ }, options.inputPosition), true, chart.spacingBox);
+
+ // Hide if overlapping - inputEnabled is null or undefined
+ if (!defined(inputEnabled)) {
+ buttonBBox = buttonGroup.getBBox();
+ inputGroup[inputGroup.translateX < buttonBBox.x + buttonBBox.width + 10 ? 'hide' : 'show']();
+ }
+
+ // Set or reset the input values
+ rangeSelector.setInputValue('min', min);
+ rangeSelector.setInputValue('max', max);
+ }
+
+ rangeSelector.rendered = true;
+ },
+
+ /**
+ * Destroys allocated elements.
+ */
+ destroy: function () {
+ var minInput = this.minInput,
+ maxInput = this.maxInput,
+ chart = this.chart,
+ blurInputs = this.blurInputs,
+ key;
+
+ removeEvent(chart.container, 'mousedown', blurInputs);
+ removeEvent(chart, 'resize', blurInputs);
+
+ // Destroy elements in collections
+ destroyObjectProperties(this.buttons);
+
+ // Clear input element events
+ if (minInput) {
+ minInput.onfocus = minInput.onblur = minInput.onchange = null;
+ }
+ if (maxInput) {
+ maxInput.onfocus = maxInput.onblur = maxInput.onchange = null;
+ }
+
+ // Destroy HTML and SVG elements
+ for (key in this) {
+ if (this[key] && key !== 'chart') {
+ if (this[key].destroy) { // SVGElement
+ this[key].destroy();
+ } else if (this[key].nodeType) { // HTML element
+ discardElement(this[key]);
+ }
+ }
+ this[key] = null;
+ }
+ }
+ };
+
+ /**
+ * Add logic to normalize the zoomed range in order to preserve the pressed state of range selector buttons
+ */
+ Axis.prototype.toFixedRange = function (pxMin, pxMax, fixedMin, fixedMax) {
+ var fixedRange = this.chart && this.chart.fixedRange,
+ newMin = pick(fixedMin, this.translate(pxMin, true)),
+ newMax = pick(fixedMax, this.translate(pxMax, true)),
+ changeRatio = fixedRange && (newMax - newMin) / fixedRange;
+
+ // If the difference between the fixed range and the actual requested range is
+ // too great, the user is dragging across an ordinal gap, and we need to release
+ // the range selector button.
+ if (changeRatio > 0.7 && changeRatio < 1.3) {
+ if (fixedMax) {
+ newMin = newMax - fixedRange;
+ } else {
+ newMax = newMin + fixedRange;
+ }
+ }
+ if (!isNumber(newMin)) { // #1195
+ newMin = newMax = undefined;
+ }
+
+ return {
+ min: newMin,
+ max: newMax
+ };
+ };
+
+ Axis.prototype.minFromRange = function () {
+ var rangeOptions = this.range,
+ type = rangeOptions.type,
+ timeName = { month: 'Month', year: 'FullYear' }[type],
+ min,
+ max = this.max,
+ dataMin,
+ range,
+ // Get the true range from a start date
+ getTrueRange = function (base, count) {
+ var date = new Date(base);
+ date['set' + timeName](date['get' + timeName]() + count);
+ return date.getTime() - base;
+ };
+
+ if (isNumber(rangeOptions)) {
+ min = this.max - rangeOptions;
+ range = rangeOptions;
+ } else {
+ min = max + getTrueRange(max, -rangeOptions.count);
+ }
+
+ dataMin = pick(this.dataMin, Number.MIN_VALUE);
+ if (!isNumber(min)) {
+ min = dataMin;
+ }
+ if (min <= dataMin) {
+ min = dataMin;
+ if (range === undefined) { // #4501
+ range = getTrueRange(min, rangeOptions.count);
+ }
+ this.newMax = mathMin(min + range, this.dataMax);
+ }
+ if (!isNumber(max)) {
+ min = undefined;
+ }
+ return min;
+
+ };
+
+ // Initialize scroller for stock charts
+ wrap(Chart.prototype, 'init', function (proceed, options, callback) {
+
+ addEvent(this, 'init', function () {
+ if (this.options.rangeSelector.enabled) {
+ this.rangeSelector = new RangeSelector(this);
+ }
+ });
+
+ proceed.call(this, options, callback);
+
+ });
+
+
+ Highcharts.RangeSelector = RangeSelector;
+
+ /* ****************************************************************************
+ * End Range Selector code *
+ *****************************************************************************/
+
+
+
+ Chart.prototype.callbacks.push(function (chart) {
+ var extremes,
+ scroller = chart.scroller,
+ rangeSelector = chart.rangeSelector;
+
+ function renderRangeSelector() {
+ extremes = chart.xAxis[0].getExtremes();
+ if (isNumber(extremes.min)) {
+ rangeSelector.render(extremes.min, extremes.max);
+ }
+ }
+
+ function afterSetExtremesHandlerRangeSelector(e) {
+ rangeSelector.render(e.min, e.max);
+ }
+
+ function destroyEvents() {
+ if (rangeSelector) {
+ removeEvent(chart, 'resize', renderRangeSelector);
+ removeEvent(chart.xAxis[0], 'afterSetExtremes', afterSetExtremesHandlerRangeSelector);
+ }
+ }
+
+ // initiate the scroller
+ if (scroller) {
+ extremes = chart.xAxis[0].getExtremes();
+ scroller.render(extremes.min, extremes.max);
+ }
+ if (rangeSelector) {
+ // redraw the scroller on setExtremes
+ addEvent(chart.xAxis[0], 'afterSetExtremes', afterSetExtremesHandlerRangeSelector);
+
+ // redraw the scroller chart resize
+ addEvent(chart, 'resize', renderRangeSelector);
+
+ // do it now
+ renderRangeSelector();
+ }
+
+ // Remove resize/afterSetExtremes at chart destroy
+ addEvent(chart, 'destroy', destroyEvents);
+ });
+ /**
+ * A wrapper for Chart with all the default values for a Stock chart
+ */
+ Highcharts.StockChart = Highcharts.stockChart = function (a, b, c) {
+ var hasRenderToArg = isString(a) || a.nodeName,
+ options = arguments[hasRenderToArg ? 1 : 0],
+ seriesOptions = options.series, // to increase performance, don't merge the data
+ opposite,
+
+ // Always disable startOnTick:true on the main axis when the navigator is enabled (#1090)
+ navigatorEnabled = pick(options.navigator && options.navigator.enabled, true),
+ disableStartOnTick = navigatorEnabled ? {
+ startOnTick: false,
+ endOnTick: false
+ } : null,
+
+ lineOptions = {
+
+ marker: {
+ enabled: false,
+ radius: 2
+ }
+ // gapSize: 0
+ },
+ columnOptions = {
+ shadow: false,
+ borderWidth: 0
+ };
+
+ // apply X axis options to both single and multi y axes
+ options.xAxis = map(splat(options.xAxis || {}), function (xAxisOptions) {
+ return merge(
+ { // defaults
+ minPadding: 0,
+ maxPadding: 0,
+ ordinal: true,
+ title: {
+ text: null
+ },
+ labels: {
+ overflow: 'justify'
+ },
+ showLastLabel: true
+ }, xAxisOptions, // user options
+ { // forced options
+ type: 'datetime',
+ categories: null
+ },
+ disableStartOnTick
+ );
+ });
+
+ // apply Y axis options to both single and multi y axes
+ options.yAxis = map(splat(options.yAxis || {}), function (yAxisOptions) {
+ opposite = pick(yAxisOptions.opposite, true);
+ return merge({ // defaults
+ labels: {
+ y: -2
+ },
+ opposite: opposite,
+ showLastLabel: false,
+ title: {
+ text: null
+ }
+ }, yAxisOptions // user options
+ );
+ });
+
+ options.series = null;
+
+ options = merge(
+ {
+ chart: {
+ panning: true,
+ pinchType: 'x'
+ },
+ navigator: {
+ enabled: true
+ },
+ scrollbar: {
+ enabled: true
+ },
+ rangeSelector: {
+ enabled: true
+ },
+ title: {
+ text: null,
+ style: {
+ fontSize: '16px'
+ }
+ },
+ tooltip: {
+ shared: true,
+ crosshairs: true
+ },
+ legend: {
+ enabled: false
+ },
+
+ plotOptions: {
+ line: lineOptions,
+ spline: lineOptions,
+ area: lineOptions,
+ areaspline: lineOptions,
+ arearange: lineOptions,
+ areasplinerange: lineOptions,
+ column: columnOptions,
+ columnrange: columnOptions,
+ candlestick: columnOptions,
+ ohlc: columnOptions
+ }
+
+ },
+ options, // user's options
+
+ { // forced options
+ _stock: true, // internal flag
+ chart: {
+ inverted: false
+ }
+ }
+ );
+
+ options.series = seriesOptions;
+
+ return hasRenderToArg ?
+ new Chart(a, options, c) :
+ new Chart(options, b);
+ };
+
+ // Implement the pinchType option
+ wrap(Pointer.prototype, 'init', function (proceed, chart, options) {
+
+ var pinchType = options.chart.pinchType || '';
+
+ proceed.call(this, chart, options);
+
+ // Pinch status
+ this.pinchX = this.pinchHor = pinchType.indexOf('x') !== -1;
+ this.pinchY = this.pinchVert = pinchType.indexOf('y') !== -1;
+ this.hasZoom = this.hasZoom || this.pinchHor || this.pinchVert;
+ });
+
+ // Override the automatic label alignment so that the first Y axis' labels
+ // are drawn on top of the grid line, and subsequent axes are drawn outside
+ wrap(Axis.prototype, 'autoLabelAlign', function (proceed) {
+ var chart = this.chart,
+ options = this.options,
+ panes = chart._labelPanes = chart._labelPanes || {},
+ key,
+ labelOptions = this.options.labels;
+ if (this.chart.options._stock && this.coll === 'yAxis') {
+ key = options.top + ',' + options.height;
+ if (!panes[key] && labelOptions.enabled) { // do it only for the first Y axis of each pane
+ if (labelOptions.x === 15) { // default
+ labelOptions.x = 0;
+ }
+ if (labelOptions.align === undefined) {
+ labelOptions.align = 'right';
+ }
+ panes[key] = 1;
+ return 'right';
+ }
+ }
+ return proceed.call(this, [].slice.call(arguments, 1));
+ });
+
+ // Override getPlotLinePath to allow for multipane charts
+ wrap(Axis.prototype, 'getPlotLinePath', function (proceed, value, lineWidth, old, force, translatedValue) {
+ var axis = this,
+ series = (this.isLinked && !this.series ? this.linkedParent.series : this.series),
+ chart = axis.chart,
+ renderer = chart.renderer,
+ axisLeft = axis.left,
+ axisTop = axis.top,
+ x1,
+ y1,
+ x2,
+ y2,
+ result = [],
+ axes = [], //#3416 need a default array
+ axes2,
+ uniqueAxes,
+ transVal;
+
+ // Ignore in case of color Axis. #3360, #3524
+ if (axis.coll === 'colorAxis') {
+ return proceed.apply(this, [].slice.call(arguments, 1));
+ }
+
+ // Get the related axes based on series
+ axes = (axis.isXAxis ?
+ (defined(axis.options.yAxis) ?
+ [chart.yAxis[axis.options.yAxis]] :
+ map(series, function (s) {
+ return s.yAxis;
+ })
+ ) :
+ (defined(axis.options.xAxis) ?
+ [chart.xAxis[axis.options.xAxis]] :
+ map(series, function (s) {
+ return s.xAxis;
+ })
+ )
+ );
+
+ // Get the related axes based options.*Axis setting #2810
+ axes2 = (axis.isXAxis ? chart.yAxis : chart.xAxis);
+ each(axes2, function (A) {
+ if (defined(A.options.id) ? A.options.id.indexOf('navigator') === -1 : true) {
+ var a = (A.isXAxis ? 'yAxis' : 'xAxis'),
+ rax = (defined(A.options[a]) ? chart[a][A.options[a]] : chart[a][0]);
+
+ if (axis === rax) {
+ axes.push(A);
+ }
+ }
+ });
+
+
+ // Remove duplicates in the axes array. If there are no axes in the axes array,
+ // we are adding an axis without data, so we need to populate this with grid
+ // lines (#2796).
+ uniqueAxes = axes.length ? [] : [axis.isXAxis ? chart.yAxis[0] : chart.xAxis[0]]; //#3742
+ each(axes, function (axis2) {
+ if (inArray(axis2, uniqueAxes) === -1) {
+ uniqueAxes.push(axis2);
+ }
+ });
+
+ transVal = pick(translatedValue, axis.translate(value, null, null, old));
+ if (isNumber(transVal)) {
+ if (axis.horiz) {
+ each(uniqueAxes, function (axis2) {
+ var skip;
+
+ y1 = axis2.pos;
+ y2 = y1 + axis2.len;
+ x1 = x2 = mathRound(transVal + axis.transB);
+
+ if (x1 < axisLeft || x1 > axisLeft + axis.width) { // outside plot area
+ if (force) {
+ x1 = x2 = mathMin(mathMax(axisLeft, x1), axisLeft + axis.width);
+ } else {
+ skip = true;
+ }
+ }
+ if (!skip) {
+ result.push('M', x1, y1, 'L', x2, y2);
+ }
+ });
+ } else {
+ each(uniqueAxes, function (axis2) {
+ var skip;
+
+ x1 = axis2.pos;
+ x2 = x1 + axis2.len;
+ y1 = y2 = mathRound(axisTop + axis.height - transVal);
+
+ if (y1 < axisTop || y1 > axisTop + axis.height) { // outside plot area
+ if (force) {
+ y1 = y2 = mathMin(mathMax(axisTop, y1), axis.top + axis.height);
+ } else {
+ skip = true;
+ }
+ }
+ if (!skip) {
+ result.push('M', x1, y1, 'L', x2, y2);
+ }
+ });
+ }
+ }
+ return result.length > 0 ?
+ renderer.crispPolyLine(result, lineWidth || 1) :
+ null; //#3557 getPlotLinePath in regular Highcharts also returns null
+ });
+
+ // Override getPlotBandPath to allow for multipane charts
+ Axis.prototype.getPlotBandPath = function (from, to) {
+ var toPath = this.getPlotLinePath(to, null, null, true),
+ path = this.getPlotLinePath(from, null, null, true),
+ result = [],
+ i;
+
+ if (path && toPath && path.toString() !== toPath.toString()) {
+ // Go over each subpath
+ for (i = 0; i < path.length; i += 6) {
+ result.push('M', path[i + 1], path[i + 2], 'L', path[i + 4], path[i + 5], toPath[i + 4], toPath[i + 5], toPath[i + 1], toPath[i + 2]);
+ }
+ } else { // outside the axis area
+ result = null;
+ }
+
+ return result;
+ };
+
+ // Function to crisp a line with multiple segments
+ SVGRenderer.prototype.crispPolyLine = function (points, width) {
+ // points format: [M, 0, 0, L, 100, 0]
+ // normalize to a crisp line
+ var i;
+ for (i = 0; i < points.length; i = i + 6) {
+ if (points[i + 1] === points[i + 4]) {
+ // Substract due to #1129. Now bottom and left axis gridlines behave the same.
+ points[i + 1] = points[i + 4] = mathRound(points[i + 1]) - (width % 2 / 2);
+ }
+ if (points[i + 2] === points[i + 5]) {
+ points[i + 2] = points[i + 5] = mathRound(points[i + 2]) + (width % 2 / 2);
+ }
+ }
+ return points;
+ };
+ if (Renderer === Highcharts.VMLRenderer) {
+ VMLRenderer.prototype.crispPolyLine = SVGRenderer.prototype.crispPolyLine;
+ }
+
+
+ // Wrapper to hide the label
+ wrap(Axis.prototype, 'hideCrosshair', function (proceed, i) {
+ proceed.call(this, i);
+
+ if (this.crossLabel) {
+ this.crossLabel = this.crossLabel.hide();
+ }
+ });
+
+ // Wrapper to draw the label
+ wrap(Axis.prototype, 'drawCrosshair', function (proceed, e, point) {
+ // Draw the crosshair
+ proceed.call(this, e, point);
+
+ // Check if the label has to be drawn
+ if (!defined(this.crosshair.label) || !this.crosshair.label.enabled || !this.cross) {
+ return;
+ }
+
+ var chart = this.chart,
+ options = this.options.crosshair.label, // the label's options
+ horiz = this.horiz, // axis orientation
+ opposite = this.opposite, // axis position
+ left = this.left, // left position
+ top = this.top, // top position
+ crossLabel = this.crossLabel, // reference to the svgElement
+ posx,
+ posy,
+ crossBox,
+ formatOption = options.format,
+ formatFormat = '',
+ limit,
+ align,
+ tickInside = this.options.tickPosition === 'inside',
+ snap = this.crosshair.snap !== false,
+ value;
+
+ // Use last available event (#5287)
+ if (!e) {
+ e = this.cross && this.cross.e;
+ }
+
+ align = (horiz ? 'center' : opposite ? (this.labelAlign === 'right' ? 'right' : 'left') : (this.labelAlign === 'left' ? 'left' : 'center'));
+
+ // If the label does not exist yet, create it.
+ if (!crossLabel) {
+ crossLabel = this.crossLabel = chart.renderer.label(null, null, null, options.shape || 'callout')
+ .attr({
+ align: options.align || align,
+ zIndex: 12,
+ fill: options.backgroundColor || (this.series[0] && this.series[0].color) || 'gray',
+ padding: pick(options.padding, 8),
+ stroke: options.borderColor || '',
+ 'stroke-width': options.borderWidth || 0,
+ r: pick(options.borderRadius, 3)
+ })
+ .css(extend({
+ color: 'white',
+ fontWeight: 'normal',
+ fontSize: '11px',
+ textAlign: 'center'
+ }, options.style))
+ .add();
+ }
+
+ if (horiz) {
+ posx = snap ? point.plotX + left : e.chartX;
+ posy = top + (opposite ? 0 : this.height);
+ } else {
+ posx = opposite ? this.width + left : 0;
+ posy = snap ? point.plotY + top : e.chartY;
+ }
+
+ if (!formatOption && !options.formatter) {
+ if (this.isDatetimeAxis) {
+ formatFormat = '%b %d, %Y';
+ }
+ formatOption = '{value' + (formatFormat ? ':' + formatFormat : '') + '}';
+ }
+
+ // Show the label
+ value = snap ? point[this.isXAxis ? 'x' : 'y'] : this.toValue(horiz ? e.chartX : e.chartY);
+ crossLabel.attr({
+ text: formatOption ? format(formatOption, { value: value }) : options.formatter.call(this, value),
+ anchorX: horiz ? posx : (this.opposite ? 0 : chart.chartWidth),
+ anchorY: horiz ? (this.opposite ? chart.chartHeight : 0) : posy,
+ x: posx,
+ y: posy,
+ visibility: VISIBLE
+ });
+ crossBox = crossLabel.getBBox();
+
+ // now it is placed we can correct its position
+ if (horiz) {
+ if ((tickInside && !opposite) || (!tickInside && opposite)) {
+ posy = crossLabel.y - crossBox.height;
+ }
+ } else {
+ posy = crossLabel.y - (crossBox.height / 2);
+ }
+
+ // check the edges
+ if (horiz) {
+ limit = {
+ left: left - crossBox.x,
+ right: left + this.width - crossBox.x
+ };
+ } else {
+ limit = {
+ left: this.labelAlign === 'left' ? left : 0,
+ right: this.labelAlign === 'right' ? left + this.width : chart.chartWidth
+ };
+ }
+
+ // left edge
+ if (crossLabel.translateX < limit.left) {
+ posx += limit.left - crossLabel.translateX;
+ }
+ // right edge
+ if (crossLabel.translateX + crossBox.width >= limit.right) {
+ posx -= crossLabel.translateX + crossBox.width - limit.right;
+ }
+
+ // show the crosslabel
+ crossLabel.attr({ x: posx, y: posy, visibility: 'visible' });
+ });
+
+ /* ****************************************************************************
+ * Start value compare logic *
+ *****************************************************************************/
+
+ var seriesInit = seriesProto.init,
+ seriesProcessData = seriesProto.processData,
+ pointTooltipFormatter = Point.prototype.tooltipFormatter;
+
+ /**
+ * Extend series.init by adding a method to modify the y value used for plotting
+ * on the y axis. This method is called both from the axis when finding dataMin
+ * and dataMax, and from the series.translate method.
+ */
+ seriesProto.init = function () {
+
+ // Call base method
+ seriesInit.apply(this, arguments);
+
+ // Set comparison mode
+ this.setCompare(this.options.compare);
+ };
+
+ /**
+ * The setCompare method can be called also from the outside after render time
+ */
+ seriesProto.setCompare = function (compare) {
+
+ // Set or unset the modifyValue method
+ this.modifyValue = (compare === 'value' || compare === 'percent') ? function (value, point) {
+ var compareValue = this.compareValue;
+
+ if (value !== UNDEFINED) { // #2601
+
+ // get the modified value
+ value = compare === 'value' ?
+ value - compareValue : // compare value
+ value = 100 * (value / compareValue) - 100; // compare percent
+
+ // record for tooltip etc.
+ if (point) {
+ point.change = value;
+ }
+
+ }
+
+ return value;
+ } : null;
+
+ // Survive to export, #5485
+ this.userOptions.compare = compare;
+
+ // Mark dirty
+ if (this.chart.hasRendered) {
+ this.isDirty = true;
+ }
+
+ };
+
+ /**
+ * Extend series.processData by finding the first y value in the plot area,
+ * used for comparing the following values
+ */
+ seriesProto.processData = function () {
+ var series = this,
+ i,
+ keyIndex = -1,
+ processedXData,
+ processedYData,
+ length,
+ compareValue;
+
+ // call base method
+ seriesProcessData.apply(this, arguments);
+
+ if (series.xAxis && series.processedYData) { // not pies
+
+ // local variables
+ processedXData = series.processedXData;
+ processedYData = series.processedYData;
+ length = processedYData.length;
+
+ // For series with more than one value (range, OHLC etc), compare against
+ // the pointValKey (#4922)
+ if (series.pointArrayMap) {
+ keyIndex = inArray(series.pointValKey || 'y', series.pointArrayMap);
+ }
+
+ // find the first value for comparison
+ for (i = 0; i < length - 1; i++) {
+ compareValue = keyIndex > -1 ?
+ processedYData[i][keyIndex] :
+ processedYData[i];
+ if (isNumber(compareValue) && processedXData[i + 1] >= series.xAxis.min && compareValue !== 0) {
+ series.compareValue = compareValue;
+ break;
+ }
+ }
+ }
+ };
+
+ /**
+ * Modify series extremes
+ */
+ wrap(seriesProto, 'getExtremes', function (proceed) {
+ var extremes;
+
+ proceed.apply(this, [].slice.call(arguments, 1));
+
+ if (this.modifyValue) {
+ extremes = [this.modifyValue(this.dataMin), this.modifyValue(this.dataMax)];
+ this.dataMin = arrayMin(extremes);
+ this.dataMax = arrayMax(extremes);
+ }
+ });
+
+ /**
+ * Add a utility method, setCompare, to the Y axis
+ */
+ Axis.prototype.setCompare = function (compare, redraw) {
+ if (!this.isXAxis) {
+ each(this.series, function (series) {
+ series.setCompare(compare);
+ });
+ if (pick(redraw, true)) {
+ this.chart.redraw();
+ }
+ }
+ };
+
+ /**
+ * Extend the tooltip formatter by adding support for the point.change variable
+ * as well as the changeDecimals option
+ */
+ Point.prototype.tooltipFormatter = function (pointFormat) {
+ var point = this;
+
+ pointFormat = pointFormat.replace(
+ '{point.change}',
+ (point.change > 0 ? '+' : '') + Highcharts.numberFormat(point.change, pick(point.series.tooltipOptions.changeDecimals, 2))
+ );
+
+ return pointTooltipFormatter.apply(this, [pointFormat]);
+ };
+
+ /* ****************************************************************************
+ * End value compare logic *
+ *****************************************************************************/
+
+
+ /**
+ * Extend the Series prototype to create a separate series clip box. This is related
+ * to using multiple panes, and a future pane logic should incorporate this feature (#2754).
+ */
+ wrap(Series.prototype, 'render', function (proceed) {
+ // Only do this on stock charts (#2939), and only if the series type handles clipping
+ // in the animate method (#2975).
+ if (this.chart.options._stock && this.xAxis) {
+
+ // First render, initial clip box
+ if (!this.clipBox && this.animate) {
+ this.clipBox = merge(this.chart.clipBox);
+ this.clipBox.width = this.xAxis.len;
+ this.clipBox.height = this.yAxis.len;
+
+ // On redrawing, resizing etc, update the clip rectangle
+ } else if (this.chart[this.sharedClipKey]) {
+ stop(this.chart[this.sharedClipKey]); // #2998
+ this.chart[this.sharedClipKey].attr({
+ width: this.xAxis.len,
+ height: this.yAxis.len
+ });
+ }
+ }
+ proceed.call(this);
+ });
+
+ // global variables
+ extend(Highcharts, {
+
+ // Constructors
+ Color: Color,
+ Point: Point,
+ Tick: Tick,
+ Renderer: Renderer,
+ SVGElement: SVGElement,
+ SVGRenderer: SVGRenderer,
+
+ // Various
+ arrayMin: arrayMin,
+ arrayMax: arrayMax,
+ charts: charts,
+ correctFloat: correctFloat,
+ dateFormat: dateFormat,
+ error: error,
+ format: format,
+ pathAnim: pathAnim,
+ getOptions: getOptions,
+ hasBidiBug: hasBidiBug,
+ isTouchDevice: isTouchDevice,
+ setOptions: setOptions,
+ addEvent: addEvent,
+ removeEvent: removeEvent,
+ createElement: createElement,
+ discardElement: discardElement,
+ css: css,
+ each: each,
+ map: map,
+ merge: merge,
+ splat: splat,
+ stableSort: stableSort,
+ extendClass: extendClass,
+ pInt: pInt,
+ svg: hasSVG,
+ canvas: useCanVG,
+ vml: !hasSVG && !useCanVG,
+ product: PRODUCT,
+ version: VERSION
+ });
+
+ return Highcharts;
+}));
+
+;/*!
+ * tooltip 0.1.0 - 18th Dec 2013
+ * https://github.com/darsain/tooltip
+ *
+ * Licensed under the MIT license.
+ * http://opensource.org/licenses/MIT
+ */
+;(function(){
+
+/**
+ * Require the given path.
+ *
+ * @param {String} path
+ * @return {Object} exports
+ * @api public
+ */
+
+function require(path, parent, orig) {
+ var resolved = require.resolve(path);
+
+ // lookup failed
+ if (null == resolved) {
+ orig = orig || path;
+ parent = parent || 'root';
+ var err = new Error('Failed to require "' + orig + '" from "' + parent + '"');
+ err.path = orig;
+ err.parent = parent;
+ err.require = true;
+ throw err;
+ }
+
+ var module = require.modules[resolved];
+
+ // perform real require()
+ // by invoking the module's
+ // registered function
+ if (!module._resolving && !module.exports) {
+ var mod = {};
+ mod.exports = {};
+ mod.client = mod.component = true;
+ module._resolving = true;
+ module.call(this, mod.exports, require.relative(resolved), mod);
+ delete module._resolving;
+ module.exports = mod.exports;
+ }
+
+ return module.exports;
+}
+
+/**
+ * Registered modules.
+ */
+
+require.modules = {};
+
+/**
+ * Registered aliases.
+ */
+
+require.aliases = {};
+
+/**
+ * Resolve `path`.
+ *
+ * Lookup:
+ *
+ * - PATH/index.js
+ * - PATH.js
+ * - PATH
+ *
+ * @param {String} path
+ * @return {String} path or null
+ * @api private
+ */
+
+require.resolve = function(path) {
+ if (path.charAt(0) === '/') path = path.slice(1);
+
+ var paths = [
+ path,
+ path + '.js',
+ path + '.json',
+ path + '/index.js',
+ path + '/index.json'
+ ];
+
+ for (var i = 0; i < paths.length; i++) {
+ var path = paths[i];
+ if (require.modules.hasOwnProperty(path)) return path;
+ if (require.aliases.hasOwnProperty(path)) return require.aliases[path];
+ }
+};
+
+/**
+ * Normalize `path` relative to the current path.
+ *
+ * @param {String} curr
+ * @param {String} path
+ * @return {String}
+ * @api private
+ */
+
+require.normalize = function(curr, path) {
+ var segs = [];
+
+ if ('.' != path.charAt(0)) return path;
+
+ curr = curr.split('/');
+ path = path.split('/');
+
+ for (var i = 0; i < path.length; ++i) {
+ if ('..' == path[i]) {
+ curr.pop();
+ } else if ('.' != path[i] && '' != path[i]) {
+ segs.push(path[i]);
+ }
+ }
+
+ return curr.concat(segs).join('/');
+};
+
+/**
+ * Register module at `path` with callback `definition`.
+ *
+ * @param {String} path
+ * @param {Function} definition
+ * @api private
+ */
+
+require.register = function(path, definition) {
+ require.modules[path] = definition;
+};
+
+/**
+ * Alias a module definition.
+ *
+ * @param {String} from
+ * @param {String} to
+ * @api private
+ */
+
+require.alias = function(from, to) {
+ if (!require.modules.hasOwnProperty(from)) {
+ throw new Error('Failed to alias "' + from + '", it does not exist');
+ }
+ require.aliases[to] = from;
+};
+
+/**
+ * Return a require function relative to the `parent` path.
+ *
+ * @param {String} parent
+ * @return {Function}
+ * @api private
+ */
+
+require.relative = function(parent) {
+ var p = require.normalize(parent, '..');
+
+ /**
+ * lastIndexOf helper.
+ */
+
+ function lastIndexOf(arr, obj) {
+ var i = arr.length;
+ while (i--) {
+ if (arr[i] === obj) return i;
+ }
+ return -1;
+ }
+
+ /**
+ * The relative require() itself.
+ */
+
+ function localRequire(path) {
+ var resolved = localRequire.resolve(path);
+ return require(resolved, parent, path);
+ }
+
+ /**
+ * Resolve relative to the parent.
+ */
+
+ localRequire.resolve = function(path) {
+ var c = path.charAt(0);
+ if ('/' == c) return path.slice(1);
+ if ('.' == c) return require.normalize(p, path);
+
+ // resolve deps by returning
+ // the dep in the nearest "deps"
+ // directory
+ var segs = parent.split('/');
+ var i = lastIndexOf(segs, 'deps') + 1;
+ if (!i) i = 0;
+ path = segs.slice(0, i + 1).join('/') + '/deps/' + path;
+ return path;
+ };
+
+ /**
+ * Check if module is defined at `path`.
+ */
+
+ localRequire.exists = function(path) {
+ return require.modules.hasOwnProperty(localRequire.resolve(path));
+ };
+
+ return localRequire;
+};
+require.register("darsain-event/index.js", Function("exports, require, module",
+"'use strict';\n\
+\n\
+/**\n\
+ * Bind `el` event `type` to `fn`.\n\
+ *\n\
+ * @param {Element} el\n\
+ * @param {String} type\n\
+ * @param {Function} fn\n\
+ * @param {Boolean} capture\n\
+ *\n\
+ * @return {Function}\n\
+ */\n\
+exports.bind = window.addEventListener ? function (el, type, fn, capture) {\n\
+\tel.addEventListener(type, fn, capture || false);\n\
+\treturn fn;\n\
+} : function (el, type, fn) {\n\
+\tvar fnid = type + fn;\n\
+\tel[fnid] = el[fnid] || function () {\n\
+\t\tvar event = window.event;\n\
+\t\tevent.target = event.srcElement;\n\
+\t\tevent.preventDefault = function () {\n\
+\t\t\tevent.returnValue = false;\n\
+\t\t};\n\
+\t\tevent.stopPropagation = function () {\n\
+\t\t\tevent.cancelBubble = true;\n\
+\t\t};\n\
+\t\tfn.call(el, event);\n\
+\t};\n\
+\tel.attachEvent('on' + type, el[fnid]);\n\
+\treturn fn;\n\
+};\n\
+\n\
+/**\n\
+ * Unbind `el` event `type`'s callback `fn`.\n\
+ *\n\
+ * @param {Element} el\n\
+ * @param {String} type\n\
+ * @param {Function} fn\n\
+ * @param {Boolean} capture\n\
+ *\n\
+ * @return {Function}\n\
+ */\n\
+exports.unbind = window.removeEventListener ? function (el, type, fn, capture) {\n\
+\tel.removeEventListener(type, fn, capture || false);\n\
+\treturn fn;\n\
+} : function (el, type, fn) {\n\
+\tvar fnid = type + fn;\n\
+\tel.detachEvent('on' + type, el[fnid]);\n\
+\ttry {\n\
+\t\tdelete el[fnid];\n\
+\t} catch (err) {\n\
+\t\t// can't delete window object properties\n\
+\t\tel[fnid] = undefined;\n\
+\t}\n\
+\treturn fn;\n\
+};//# sourceURL=darsain-event/index.js"
+));
+require.register("darsain-position/index.js", Function("exports, require, module",
+"'use strict';\n\
+\n\
+/**\n\
+ * Transport.\n\
+ */\n\
+module.exports = position;\n\
+\n\
+/**\n\
+ * Globals.\n\
+ */\n\
+var win = window;\n\
+var doc = win.document;\n\
+var docEl = doc.documentElement;\n\
+\n\
+/**\n\
+ * Poor man's shallow object extend.\n\
+ *\n\
+ * @param {Object} a\n\
+ * @param {Object} b\n\
+ *\n\
+ * @return {Object}\n\
+ */\n\
+function extend(a, b) {\n\
+\tfor (var key in b) {\n\
+\t\ta[key] = b[key];\n\
+\t}\n\
+\treturn a;\n\
+}\n\
+\n\
+/**\n\
+ * Checks whether object is window.\n\
+ *\n\
+ * @param {Object} obj\n\
+ *\n\
+ * @return {Boolean}\n\
+ */\n\
+function isWin(obj) {\n\
+\treturn obj && obj.setInterval != null;\n\
+}\n\
+\n\
+/**\n\
+ * Returns element's object with `left`, `top`, `bottom`, `right`, `width`, and `height`\n\
+ * properties indicating the position and dimensions of element on a page.\n\
+ *\n\
+ * @param {Element} element\n\
+ *\n\
+ * @return {Object}\n\
+ */\n\
+function position(element) {\n\
+\tvar winTop = win.pageYOffset || docEl.scrollTop;\n\
+\tvar winLeft = win.pageXOffset || docEl.scrollLeft;\n\
+\tvar box = { left: 0, right: 0, top: 0, bottom: 0, width: 0, height: 0 };\n\
+\n\
+\tif (isWin(element)) {\n\
+\t\tbox.width = win.innerWidth || docEl.clientWidth;\n\
+\t\tbox.height = win.innerHeight || docEl.clientHeight;\n\
+\t} else if (docEl.contains(element) && element.getBoundingClientRect != null) {\n\
+\t\textend(box, element.getBoundingClientRect());\n\
+\t\t// width & height don't exist in = winPos.bottom) {\n\
+\t\t\tplace[0] = 'top';\n\
+\t\t}\n\
+\t\tswitch (place[1]) {\n\
+\t\t\tcase 'left':\n\
+\t\t\t\tif (target.right - this.width <= winPos.left) {\n\
+\t\t\t\t\tplace[1] = 'right';\n\
+\t\t\t\t}\n\
+\t\t\t\tbreak;\n\
+\t\t\tcase 'right':\n\
+\t\t\t\tif (target.left + this.width >= winPos.right) {\n\
+\t\t\t\t\tplace[1] = 'left';\n\
+\t\t\t\t}\n\
+\t\t\t\tbreak;\n\
+\t\t\tdefault:\n\
+\t\t\t\tif (target.left + target.width / 2 + this.width / 2 >= winPos.right) {\n\
+\t\t\t\t\tplace[1] = 'left';\n\
+\t\t\t\t} else if (target.right - target.width / 2 - this.width / 2 <= winPos.left) {\n\
+\t\t\t\t\tplace[1] = 'right';\n\
+\t\t\t\t}\n\
+\t\t}\n\
+\t} else {\n\
+\t\tif (target.left - this.width - spacing <= winPos.left) {\n\
+\t\t\tplace[0] = 'right';\n\
+\t\t} else if (target.right + this.width + spacing >= winPos.right) {\n\
+\t\t\tplace[0] = 'left';\n\
+\t\t}\n\
+\t\tswitch (place[1]) {\n\
+\t\t\tcase 'top':\n\
+\t\t\t\tif (target.bottom - this.height <= winPos.top) {\n\
+\t\t\t\t\tplace[1] = 'bottom';\n\
+\t\t\t\t}\n\
+\t\t\t\tbreak;\n\
+\t\t\tcase 'bottom':\n\
+\t\t\t\tif (target.top + this.height >= winPos.bottom) {\n\
+\t\t\t\t\tplace[1] = 'top';\n\
+\t\t\t\t}\n\
+\t\t\t\tbreak;\n\
+\t\t\tdefault:\n\
+\t\t\t\tif (target.top + target.height / 2 + this.height / 2 >= winPos.bottom) {\n\
+\t\t\t\t\tplace[1] = 'top';\n\
+\t\t\t\t} else if (target.bottom - target.height / 2 - this.height / 2 <= winPos.top) {\n\
+\t\t\t\t\tplace[1] = 'bottom';\n\
+\t\t\t\t}\n\
+\t\t}\n\
+\t}\n\
+\n\
+\treturn place.join('-');\n\
+};\n\
+\n\
+/**\n\
+ * Position the element to an element or a specific coordinates.\n\
+ *\n\
+ * @param {Integer|Element} x\n\
+ * @param {Integer} y\n\
+ *\n\
+ * @return {Tooltip}\n\
+ */\n\
+Tooltip.prototype.position = function (x, y) {\n\
+\tif (this.attachedTo) {\n\
+\t\tx = this.attachedTo;\n\
+\t}\n\
+\tif (x == null && this._p) {\n\
+\t\tx = this._p[0];\n\
+\t\ty = this._p[1];\n\
+\t} else {\n\
+\t\tthis._p = arguments;\n\
+\t}\n\
+\tvar target = typeof x === 'number' ? {\n\
+\t\tleft: 0|x,\n\
+\t\tright: 0|x,\n\
+\t\ttop: 0|y,\n\
+\t\tbottom: 0|y,\n\
+\t\twidth: 0,\n\
+\t\theight: 0\n\
+\t} : position(x);\n\
+\tvar spacing = this.spacing;\n\
+\tvar newPlace = this._pickPlace(target);\n\
+\n\
+\t// Add/Change place class when necessary\n\
+\tif (newPlace !== this.curPlace) {\n\
+\t\tif (this.curPlace) {\n\
+\t\t\tthis.classes.remove(this.curPlace);\n\
+\t\t}\n\
+\t\tthis.classes.add(newPlace);\n\
+\t\tthis.curPlace = newPlace;\n\
+\t}\n\
+\n\
+\t// Position the tip\n\
+\tvar top, left;\n\
+\tswitch (this.curPlace) {\n\
+\t\tcase 'top':\n\
+\t\t\ttop = target.top - this.height - spacing;\n\
+\t\t\tleft = target.left + target.width / 2 - this.width / 2;\n\
+\t\t\tbreak;\n\
+\t\tcase 'top-left':\n\
+\t\t\ttop = target.top - this.height - spacing;\n\
+\t\t\tleft = target.right - this.width;\n\
+\t\t\tbreak;\n\
+\t\tcase 'top-right':\n\
+\t\t\ttop = target.top - this.height - spacing;\n\
+\t\t\tleft = target.left;\n\
+\t\t\tbreak;\n\
+\n\
+\t\tcase 'bottom':\n\
+\t\t\ttop = target.bottom + spacing;\n\
+\t\t\tleft = target.left + target.width / 2 - this.width / 2;\n\
+\t\t\tbreak;\n\
+\t\tcase 'bottom-left':\n\
+\t\t\ttop = target.bottom + spacing;\n\
+\t\t\tleft = target.right - this.width;\n\
+\t\t\tbreak;\n\
+\t\tcase 'bottom-right':\n\
+\t\t\ttop = target.bottom + spacing;\n\
+\t\t\tleft = target.left;\n\
+\t\t\tbreak;\n\
+\n\
+\t\tcase 'left':\n\
+\t\t\ttop = target.top + target.height / 2 - this.height / 2;\n\
+\t\t\tleft = target.left - this.width - spacing;\n\
+\t\t\tbreak;\n\
+\t\tcase 'left-top':\n\
+\t\t\ttop = target.bottom - this.height;\n\
+\t\t\tleft = target.left - this.width - spacing;\n\
+\t\t\tbreak;\n\
+\t\tcase 'left-bottom':\n\
+\t\t\ttop = target.top;\n\
+\t\t\tleft = target.left - this.width - spacing;\n\
+\t\t\tbreak;\n\
+\n\
+\t\tcase 'right':\n\
+\t\t\ttop = target.top + target.height / 2 - this.height / 2;\n\
+\t\t\tleft = target.right + spacing;\n\
+\t\t\tbreak;\n\
+\t\tcase 'right-top':\n\
+\t\t\ttop = target.bottom - this.height;\n\
+\t\t\tleft = target.right + spacing;\n\
+\t\t\tbreak;\n\
+\t\tcase 'right-bottom':\n\
+\t\t\ttop = target.top;\n\
+\t\t\tleft = target.right + spacing;\n\
+\t\t\tbreak;\n\
+\t}\n\
+\n\
+\t// Set tip position & class\n\
+\tthis.element.style.top = Math.round(top) + 'px';\n\
+\tthis.element.style.left = Math.round(left) + 'px';\n\
+\n\
+\treturn this;\n\
+};\n\
+\n\
+/**\n\
+ * Show the tooltip.\n\
+ *\n\
+ * @param {Integer|Element} x\n\
+ * @param {Integer} y\n\
+ *\n\
+ * @return {Tooltip}\n\
+ */\n\
+Tooltip.prototype.show = function (x, y) {\n\
+\tx = this.attachedTo ? this.attachedTo : x;\n\
+\n\
+\t// Clear potential ongoing animation\n\
+\tclearTimeout(this.aIndex);\n\
+\n\
+\t// Position the element when requested\n\
+\tif (x != null) {\n\
+\t\tthis.position(x, y);\n\
+\t}\n\
+\n\
+\t// Stop here if tip is already visible\n\
+\tif (this.hidden) {\n\
+\t\tthis.hidden = 0;\n\
+\t\tbody.appendChild(this.element);\n\
+\t}\n\
+\n\
+\t// Make tooltip aware of window resize\n\
+\tif (this.attachedTo) {\n\
+\t\tthis._aware();\n\
+\t}\n\
+\n\
+\t// Trigger layout and kick in the transition\n\
+\tif (this.options.inClass) {\n\
+\t\tif (this.options.effectClass) {\n\
+\t\t\tvoid this.element.clientHeight;\n\
+\t\t}\n\
+\t\tthis.classes.add(this.options.inClass);\n\
+\t}\n\
+\n\
+\treturn this;\n\
+};\n\
+\n\
+/**\n\
+ * Hide the tooltip.\n\
+ *\n\
+ * @return {Tooltip}\n\
+ */\n\
+Tooltip.prototype.hide = function () {\n\
+\tif (this.hidden) {\n\
+\t\treturn;\n\
+\t}\n\
+\n\
+\tvar self = this;\n\
+\tvar duration = 0;\n\
+\n\
+\t// Remove .in class and calculate transition duration if any\n\
+\tif (this.options.inClass) {\n\
+\t\tthis.classes.remove(this.options.inClass);\n\
+\t\tif (this.options.effectClass) {\n\
+\t\t\tduration = transitionDuration(this.element);\n\
+\t\t}\n\
+\t}\n\
+\n\
+\t// Remove tip from window resize awareness\n\
+\tif (this.attachedTo) {\n\
+\t\tthis._unaware();\n\
+\t}\n\
+\n\
+\t// Remove the tip from the DOM when transition is done\n\
+\tclearTimeout(this.aIndex);\n\
+\tthis.aIndex = setTimeout(function () {\n\
+\t\tself.aIndex = 0;\n\
+\t\tbody.removeChild(self.element);\n\
+\t\tself.hidden = 1;\n\
+\t}, duration);\n\
+\n\
+\treturn this;\n\
+};\n\
+\n\
+Tooltip.prototype.toggle = function (x, y) {\n\
+\treturn this[this.hidden ? 'show' : 'hide'](x, y);\n\
+};\n\
+\n\
+Tooltip.prototype.destroy = function () {\n\
+\tclearTimeout(this.aIndex);\n\
+\tthis._unaware();\n\
+\tif (!this.hidden) {\n\
+\t\tbody.removeChild(this.element);\n\
+\t}\n\
+\tthis.element = this.options = null;\n\
+};\n\
+\n\
+/**\n\
+ * Make the tip window resize aware.\n\
+ *\n\
+ * @return {Void}\n\
+ */\n\
+Tooltip.prototype._aware = function () {\n\
+\tvar index = indexOf(Tooltip.winAware, this);\n\
+\tif (!~index) {\n\
+\t\tTooltip.winAware.push(this);\n\
+\t}\n\
+};\n\
+\n\
+/**\n\
+ * Remove the window resize awareness.\n\
+ *\n\
+ * @return {Void}\n\
+ */\n\
+Tooltip.prototype._unaware = function () {\n\
+\tvar index = indexOf(Tooltip.winAware, this);\n\
+\tif (~index) {\n\
+\t\tTooltip.winAware.splice(index, 1);\n\
+\t}\n\
+};\n\
+\n\
+/**\n\
+ * Handles repositioning of tooltips on window resize.\n\
+ *\n\
+ * @return {Void}\n\
+ */\n\
+Tooltip.reposition = (function () {\n\
+\tvar rAF = window.requestAnimationFrame || window.webkitRequestAnimationFrame || function (fn) {\n\
+\t\treturn setTimeout(fn, 17);\n\
+\t};\n\
+\tvar rIndex;\n\
+\n\
+\tfunction requestReposition() {\n\
+\t\tif (rIndex || !Tooltip.winAware.length) {\n\
+\t\t\treturn;\n\
+\t\t}\n\
+\t\trIndex = rAF(reposition, 17);\n\
+\t}\n\
+\n\
+\tfunction reposition() {\n\
+\t\trIndex = 0;\n\
+\t\tvar tip;\n\
+\t\tfor (var i = 0, l = Tooltip.winAware.length; i < l; i++) {\n\
+\t\t\ttip = Tooltip.winAware[i];\n\
+\t\t\ttip.position();\n\
+\t\t}\n\
+\t}\n\
+\n\
+\treturn requestReposition;\n\
+}());\n\
+Tooltip.winAware = [];\n\
+\n\
+// Bind winAware repositioning to window resize event\n\
+evt.bind(window, 'resize', Tooltip.reposition);\n\
+evt.bind(window, 'scroll', Tooltip.reposition);\n\
+\n\
+/**\n\
+ * Array with dynamic class types.\n\
+ *\n\
+ * @type {Array}\n\
+ */\n\
+Tooltip.classTypes = ['type', 'effect'];\n\
+\n\
+/**\n\
+ * Default options for Tooltip constructor.\n\
+ *\n\
+ * @type {Object}\n\
+ */\n\
+Tooltip.defaults = {\n\
+\tbaseClass: 'tooltip', // Base tooltip class name.\n\
+\ttypeClass: null, // Type tooltip class name.\n\
+\teffectClass: null, // Effect tooltip class name.\n\
+\tinClass: 'in', // Class used to transition stuff in.\n\
+\tplace: 'top', // Default place.\n\
+\tspacing: null, // Gap between target and tooltip.\n\
+\tauto: 0 // Whether to automatically adjust place to fit into window.\n\
+};//# sourceURL=tooltip/index.js"
+));
+
+
+
+
+
+
+
+
+require.alias("darsain-event/index.js", "tooltip/deps/event/index.js");
+require.alias("darsain-event/index.js", "event/index.js");
+
+require.alias("darsain-position/index.js", "tooltip/deps/position/index.js");
+require.alias("darsain-position/index.js", "position/index.js");
+
+require.alias("component-classes/index.js", "tooltip/deps/classes/index.js");
+require.alias("component-classes/index.js", "classes/index.js");
+require.alias("component-indexof/index.js", "component-classes/deps/indexof/index.js");
+
+require.alias("component-indexof/index.js", "tooltip/deps/indexof/index.js");
+require.alias("component-indexof/index.js", "indexof/index.js");
+if (typeof exports == "object") {
+ module.exports = require("tooltip");
+} else if (typeof define == "function" && define.amd) {
+ define(function(){ return require("tooltip"); });
+} else {
+ this["Tooltip"] = require("tooltip");
+}})();
+
+;// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+// This is CodeMirror (http://codemirror.net), a code editor
+// implemented in JavaScript on top of the browser's DOM.
+//
+// You can find some technical background for some of the code below
+// at http://marijnhaverbeke.nl/blog/#cm-internals .
+
+(function(mod) {
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
+ module.exports = mod();
+ else if (typeof define == "function" && define.amd) // AMD
+ return define([], mod);
+ else // Plain browser env
+ (this || window).CodeMirror = mod();
+})(function() {
+ "use strict";
+
+ // BROWSER SNIFFING
+
+ // Kludges for bugs and behavior differences that can't be feature
+ // detected are enabled based on userAgent etc sniffing.
+ var userAgent = navigator.userAgent;
+ var platform = navigator.platform;
+
+ var gecko = /gecko\/\d/i.test(userAgent);
+ var ie_upto10 = /MSIE \d/.test(userAgent);
+ var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent);
+ var ie = ie_upto10 || ie_11up;
+ var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : ie_11up[1]);
+ var webkit = /WebKit\//.test(userAgent);
+ var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent);
+ var chrome = /Chrome\//.test(userAgent);
+ var presto = /Opera\//.test(userAgent);
+ var safari = /Apple Computer/.test(navigator.vendor);
+ var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent);
+ var phantom = /PhantomJS/.test(userAgent);
+
+ var ios = /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent);
+ // This is woefully incomplete. Suggestions for alternative methods welcome.
+ var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);
+ var mac = ios || /Mac/.test(platform);
+ var windows = /win/i.test(platform);
+
+ var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/);
+ if (presto_version) presto_version = Number(presto_version[1]);
+ if (presto_version && presto_version >= 15) { presto = false; webkit = true; }
+ // Some browsers use the wrong event properties to signal cmd/ctrl on OS X
+ var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));
+ var captureRightClick = gecko || (ie && ie_version >= 9);
+
+ // Optimize some code when these features are not used.
+ var sawReadOnlySpans = false, sawCollapsedSpans = false;
+
+ // EDITOR CONSTRUCTOR
+
+ // A CodeMirror instance represents an editor. This is the object
+ // that user code is usually dealing with.
+
+ function CodeMirror(place, options) {
+ if (!(this instanceof CodeMirror)) return new CodeMirror(place, options);
+
+ this.options = options = options ? copyObj(options) : {};
+ // Determine effective options based on given values and defaults.
+ copyObj(defaults, options, false);
+ setGuttersForLineNumbers(options);
+
+ var doc = options.value;
+ if (typeof doc == "string") doc = new Doc(doc, options.mode, null, options.lineSeparator);
+ this.doc = doc;
+
+ var input = new CodeMirror.inputStyles[options.inputStyle](this);
+ var display = this.display = new Display(place, doc, input);
+ display.wrapper.CodeMirror = this;
+ updateGutters(this);
+ themeChanged(this);
+ if (options.lineWrapping)
+ this.display.wrapper.className += " CodeMirror-wrap";
+ if (options.autofocus && !mobile) display.input.focus();
+ initScrollbars(this);
+
+ this.state = {
+ keyMaps: [], // stores maps added by addKeyMap
+ overlays: [], // highlighting overlays, as added by addOverlay
+ modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info
+ overwrite: false,
+ delayingBlurEvent: false,
+ focused: false,
+ suppressEdits: false, // used to disable editing during key handlers when in readOnly mode
+ pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in input.poll
+ selectingText: false,
+ draggingText: false,
+ highlight: new Delayed(), // stores highlight worker timeout
+ keySeq: null, // Unfinished key sequence
+ specialChars: null
+ };
+
+ var cm = this;
+
+ // Override magic textarea content restore that IE sometimes does
+ // on our hidden textarea on reload
+ if (ie && ie_version < 11) setTimeout(function() { cm.display.input.reset(true); }, 20);
+
+ registerEventHandlers(this);
+ ensureGlobalHandlers();
+
+ startOperation(this);
+ this.curOp.forceUpdate = true;
+ attachDoc(this, doc);
+
+ if ((options.autofocus && !mobile) || cm.hasFocus())
+ setTimeout(bind(onFocus, this), 20);
+ else
+ onBlur(this);
+
+ for (var opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt))
+ optionHandlers[opt](this, options[opt], Init);
+ maybeUpdateLineNumberWidth(this);
+ if (options.finishInit) options.finishInit(this);
+ for (var i = 0; i < initHooks.length; ++i) initHooks[i](this);
+ endOperation(this);
+ // Suppress optimizelegibility in Webkit, since it breaks text
+ // measuring on line wrapping boundaries.
+ if (webkit && options.lineWrapping &&
+ getComputedStyle(display.lineDiv).textRendering == "optimizelegibility")
+ display.lineDiv.style.textRendering = "auto";
+ }
+
+ // DISPLAY CONSTRUCTOR
+
+ // The display handles the DOM integration, both for input reading
+ // and content drawing. It holds references to DOM nodes and
+ // display-related state.
+
+ function Display(place, doc, input) {
+ var d = this;
+ this.input = input;
+
+ // Covers bottom-right square when both scrollbars are present.
+ d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler");
+ d.scrollbarFiller.setAttribute("cm-not-content", "true");
+ // Covers bottom of gutter when coverGutterNextToScrollbar is on
+ // and h scrollbar is present.
+ d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler");
+ d.gutterFiller.setAttribute("cm-not-content", "true");
+ // Will contain the actual code, positioned to cover the viewport.
+ d.lineDiv = elt("div", null, "CodeMirror-code");
+ // Elements are added to these to represent selection and cursors.
+ d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1");
+ d.cursorDiv = elt("div", null, "CodeMirror-cursors");
+ // A visibility: hidden element used to find the size of things.
+ d.measure = elt("div", null, "CodeMirror-measure");
+ // When lines outside of the viewport are measured, they are drawn in this.
+ d.lineMeasure = elt("div", null, "CodeMirror-measure");
+ // Wraps everything that needs to exist inside the vertically-padded coordinate system
+ d.lineSpace = elt("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],
+ null, "position: relative; outline: none");
+ // Moved around its parent to cover visible view.
+ d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative");
+ // Set to the height of the document, allowing scrolling.
+ d.sizer = elt("div", [d.mover], "CodeMirror-sizer");
+ d.sizerWidth = null;
+ // Behavior of elts with overflow: auto and padding is
+ // inconsistent across browsers. This is used to ensure the
+ // scrollable area is big enough.
+ d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;");
+ // Will contain the gutters, if any.
+ d.gutters = elt("div", null, "CodeMirror-gutters");
+ d.lineGutter = null;
+ // Actual scrollable element.
+ d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll");
+ d.scroller.setAttribute("tabIndex", "-1");
+ // The element in which the editor lives.
+ d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror");
+
+ // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)
+ if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }
+ if (!webkit && !(gecko && mobile)) d.scroller.draggable = true;
+
+ if (place) {
+ if (place.appendChild) place.appendChild(d.wrapper);
+ else place(d.wrapper);
+ }
+
+ // Current rendered range (may be bigger than the view window).
+ d.viewFrom = d.viewTo = doc.first;
+ d.reportedViewFrom = d.reportedViewTo = doc.first;
+ // Information about the rendered lines.
+ d.view = [];
+ d.renderedView = null;
+ // Holds info about a single rendered line when it was rendered
+ // for measurement, while not in view.
+ d.externalMeasured = null;
+ // Empty space (in pixels) above the view
+ d.viewOffset = 0;
+ d.lastWrapHeight = d.lastWrapWidth = 0;
+ d.updateLineNumbers = null;
+
+ d.nativeBarWidth = d.barHeight = d.barWidth = 0;
+ d.scrollbarsClipped = false;
+
+ // Used to only resize the line number gutter when necessary (when
+ // the amount of lines crosses a boundary that makes its width change)
+ d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;
+ // Set to true when a non-horizontal-scrolling line widget is
+ // added. As an optimization, line widget aligning is skipped when
+ // this is false.
+ d.alignWidgets = false;
+
+ d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;
+
+ // Tracks the maximum line length so that the horizontal scrollbar
+ // can be kept static when scrolling.
+ d.maxLine = null;
+ d.maxLineLength = 0;
+ d.maxLineChanged = false;
+
+ // Used for measuring wheel scrolling granularity
+ d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;
+
+ // True when shift is held down.
+ d.shift = false;
+
+ // Used to track whether anything happened since the context menu
+ // was opened.
+ d.selForContextMenu = null;
+
+ d.activeTouch = null;
+
+ input.init(d);
+ }
+
+ // STATE UPDATES
+
+ // Used to get the editor into a consistent state again when options change.
+
+ function loadMode(cm) {
+ cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption);
+ resetModeState(cm);
+ }
+
+ function resetModeState(cm) {
+ cm.doc.iter(function(line) {
+ if (line.stateAfter) line.stateAfter = null;
+ if (line.styles) line.styles = null;
+ });
+ cm.doc.frontier = cm.doc.first;
+ startWorker(cm, 100);
+ cm.state.modeGen++;
+ if (cm.curOp) regChange(cm);
+ }
+
+ function wrappingChanged(cm) {
+ if (cm.options.lineWrapping) {
+ addClass(cm.display.wrapper, "CodeMirror-wrap");
+ cm.display.sizer.style.minWidth = "";
+ cm.display.sizerWidth = null;
+ } else {
+ rmClass(cm.display.wrapper, "CodeMirror-wrap");
+ findMaxLine(cm);
+ }
+ estimateLineHeights(cm);
+ regChange(cm);
+ clearCaches(cm);
+ setTimeout(function(){updateScrollbars(cm);}, 100);
+ }
+
+ // Returns a function that estimates the height of a line, to use as
+ // first approximation until the line becomes visible (and is thus
+ // properly measurable).
+ function estimateHeight(cm) {
+ var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;
+ var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);
+ return function(line) {
+ if (lineIsHidden(cm.doc, line)) return 0;
+
+ var widgetsHeight = 0;
+ if (line.widgets) for (var i = 0; i < line.widgets.length; i++) {
+ if (line.widgets[i].height) widgetsHeight += line.widgets[i].height;
+ }
+
+ if (wrapping)
+ return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th;
+ else
+ return widgetsHeight + th;
+ };
+ }
+
+ function estimateLineHeights(cm) {
+ var doc = cm.doc, est = estimateHeight(cm);
+ doc.iter(function(line) {
+ var estHeight = est(line);
+ if (estHeight != line.height) updateLineHeight(line, estHeight);
+ });
+ }
+
+ function themeChanged(cm) {
+ cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") +
+ cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-");
+ clearCaches(cm);
+ }
+
+ function guttersChanged(cm) {
+ updateGutters(cm);
+ regChange(cm);
+ setTimeout(function(){alignHorizontally(cm);}, 20);
+ }
+
+ // Rebuild the gutter elements, ensure the margin to the left of the
+ // code matches their width.
+ function updateGutters(cm) {
+ var gutters = cm.display.gutters, specs = cm.options.gutters;
+ removeChildren(gutters);
+ for (var i = 0; i < specs.length; ++i) {
+ var gutterClass = specs[i];
+ var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass));
+ if (gutterClass == "CodeMirror-linenumbers") {
+ cm.display.lineGutter = gElt;
+ gElt.style.width = (cm.display.lineNumWidth || 1) + "px";
+ }
+ }
+ gutters.style.display = i ? "" : "none";
+ updateGutterSpace(cm);
+ }
+
+ function updateGutterSpace(cm) {
+ var width = cm.display.gutters.offsetWidth;
+ cm.display.sizer.style.marginLeft = width + "px";
+ }
+
+ // Compute the character length of a line, taking into account
+ // collapsed ranges (see markText) that might hide parts, and join
+ // other lines onto it.
+ function lineLength(line) {
+ if (line.height == 0) return 0;
+ var len = line.text.length, merged, cur = line;
+ while (merged = collapsedSpanAtStart(cur)) {
+ var found = merged.find(0, true);
+ cur = found.from.line;
+ len += found.from.ch - found.to.ch;
+ }
+ cur = line;
+ while (merged = collapsedSpanAtEnd(cur)) {
+ var found = merged.find(0, true);
+ len -= cur.text.length - found.from.ch;
+ cur = found.to.line;
+ len += cur.text.length - found.to.ch;
+ }
+ return len;
+ }
+
+ // Find the longest line in the document.
+ function findMaxLine(cm) {
+ var d = cm.display, doc = cm.doc;
+ d.maxLine = getLine(doc, doc.first);
+ d.maxLineLength = lineLength(d.maxLine);
+ d.maxLineChanged = true;
+ doc.iter(function(line) {
+ var len = lineLength(line);
+ if (len > d.maxLineLength) {
+ d.maxLineLength = len;
+ d.maxLine = line;
+ }
+ });
+ }
+
+ // Make sure the gutters options contains the element
+ // "CodeMirror-linenumbers" when the lineNumbers option is true.
+ function setGuttersForLineNumbers(options) {
+ var found = indexOf(options.gutters, "CodeMirror-linenumbers");
+ if (found == -1 && options.lineNumbers) {
+ options.gutters = options.gutters.concat(["CodeMirror-linenumbers"]);
+ } else if (found > -1 && !options.lineNumbers) {
+ options.gutters = options.gutters.slice(0);
+ options.gutters.splice(found, 1);
+ }
+ }
+
+ // SCROLLBARS
+
+ // Prepare DOM reads needed to update the scrollbars. Done in one
+ // shot to minimize update/measure roundtrips.
+ function measureForScrollbars(cm) {
+ var d = cm.display, gutterW = d.gutters.offsetWidth;
+ var docH = Math.round(cm.doc.height + paddingVert(cm.display));
+ return {
+ clientHeight: d.scroller.clientHeight,
+ viewHeight: d.wrapper.clientHeight,
+ scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,
+ viewWidth: d.wrapper.clientWidth,
+ barLeft: cm.options.fixedGutter ? gutterW : 0,
+ docHeight: docH,
+ scrollHeight: docH + scrollGap(cm) + d.barHeight,
+ nativeBarWidth: d.nativeBarWidth,
+ gutterWidth: gutterW
+ };
+ }
+
+ function NativeScrollbars(place, scroll, cm) {
+ this.cm = cm;
+ var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar");
+ var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar");
+ place(vert); place(horiz);
+
+ on(vert, "scroll", function() {
+ if (vert.clientHeight) scroll(vert.scrollTop, "vertical");
+ });
+ on(horiz, "scroll", function() {
+ if (horiz.clientWidth) scroll(horiz.scrollLeft, "horizontal");
+ });
+
+ this.checkedZeroWidth = false;
+ // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).
+ if (ie && ie_version < 8) this.horiz.style.minHeight = this.vert.style.minWidth = "18px";
+ }
+
+ NativeScrollbars.prototype = copyObj({
+ update: function(measure) {
+ var needsH = measure.scrollWidth > measure.clientWidth + 1;
+ var needsV = measure.scrollHeight > measure.clientHeight + 1;
+ var sWidth = measure.nativeBarWidth;
+
+ if (needsV) {
+ this.vert.style.display = "block";
+ this.vert.style.bottom = needsH ? sWidth + "px" : "0";
+ var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);
+ // A bug in IE8 can cause this value to be negative, so guard it.
+ this.vert.firstChild.style.height =
+ Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px";
+ } else {
+ this.vert.style.display = "";
+ this.vert.firstChild.style.height = "0";
+ }
+
+ if (needsH) {
+ this.horiz.style.display = "block";
+ this.horiz.style.right = needsV ? sWidth + "px" : "0";
+ this.horiz.style.left = measure.barLeft + "px";
+ var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);
+ this.horiz.firstChild.style.width =
+ (measure.scrollWidth - measure.clientWidth + totalWidth) + "px";
+ } else {
+ this.horiz.style.display = "";
+ this.horiz.firstChild.style.width = "0";
+ }
+
+ if (!this.checkedZeroWidth && measure.clientHeight > 0) {
+ if (sWidth == 0) this.zeroWidthHack();
+ this.checkedZeroWidth = true;
+ }
+
+ return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0};
+ },
+ setScrollLeft: function(pos) {
+ if (this.horiz.scrollLeft != pos) this.horiz.scrollLeft = pos;
+ if (this.disableHoriz) this.enableZeroWidthBar(this.horiz, this.disableHoriz);
+ },
+ setScrollTop: function(pos) {
+ if (this.vert.scrollTop != pos) this.vert.scrollTop = pos;
+ if (this.disableVert) this.enableZeroWidthBar(this.vert, this.disableVert);
+ },
+ zeroWidthHack: function() {
+ var w = mac && !mac_geMountainLion ? "12px" : "18px";
+ this.horiz.style.height = this.vert.style.width = w;
+ this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none";
+ this.disableHoriz = new Delayed;
+ this.disableVert = new Delayed;
+ },
+ enableZeroWidthBar: function(bar, delay) {
+ bar.style.pointerEvents = "auto";
+ function maybeDisable() {
+ // To find out whether the scrollbar is still visible, we
+ // check whether the element under the pixel in the bottom
+ // left corner of the scrollbar box is the scrollbar box
+ // itself (when the bar is still visible) or its filler child
+ // (when the bar is hidden). If it is still visible, we keep
+ // it enabled, if it's hidden, we disable pointer events.
+ var box = bar.getBoundingClientRect();
+ var elt = document.elementFromPoint(box.left + 1, box.bottom - 1);
+ if (elt != bar) bar.style.pointerEvents = "none";
+ else delay.set(1000, maybeDisable);
+ }
+ delay.set(1000, maybeDisable);
+ },
+ clear: function() {
+ var parent = this.horiz.parentNode;
+ parent.removeChild(this.horiz);
+ parent.removeChild(this.vert);
+ }
+ }, NativeScrollbars.prototype);
+
+ function NullScrollbars() {}
+
+ NullScrollbars.prototype = copyObj({
+ update: function() { return {bottom: 0, right: 0}; },
+ setScrollLeft: function() {},
+ setScrollTop: function() {},
+ clear: function() {}
+ }, NullScrollbars.prototype);
+
+ CodeMirror.scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars};
+
+ function initScrollbars(cm) {
+ if (cm.display.scrollbars) {
+ cm.display.scrollbars.clear();
+ if (cm.display.scrollbars.addClass)
+ rmClass(cm.display.wrapper, cm.display.scrollbars.addClass);
+ }
+
+ cm.display.scrollbars = new CodeMirror.scrollbarModel[cm.options.scrollbarStyle](function(node) {
+ cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);
+ // Prevent clicks in the scrollbars from killing focus
+ on(node, "mousedown", function() {
+ if (cm.state.focused) setTimeout(function() { cm.display.input.focus(); }, 0);
+ });
+ node.setAttribute("cm-not-content", "true");
+ }, function(pos, axis) {
+ if (axis == "horizontal") setScrollLeft(cm, pos);
+ else setScrollTop(cm, pos);
+ }, cm);
+ if (cm.display.scrollbars.addClass)
+ addClass(cm.display.wrapper, cm.display.scrollbars.addClass);
+ }
+
+ function updateScrollbars(cm, measure) {
+ if (!measure) measure = measureForScrollbars(cm);
+ var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;
+ updateScrollbarsInner(cm, measure);
+ for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {
+ if (startWidth != cm.display.barWidth && cm.options.lineWrapping)
+ updateHeightsInViewport(cm);
+ updateScrollbarsInner(cm, measureForScrollbars(cm));
+ startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;
+ }
+ }
+
+ // Re-synchronize the fake scrollbars with the actual size of the
+ // content.
+ function updateScrollbarsInner(cm, measure) {
+ var d = cm.display;
+ var sizes = d.scrollbars.update(measure);
+
+ d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px";
+ d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px";
+ d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent"
+
+ if (sizes.right && sizes.bottom) {
+ d.scrollbarFiller.style.display = "block";
+ d.scrollbarFiller.style.height = sizes.bottom + "px";
+ d.scrollbarFiller.style.width = sizes.right + "px";
+ } else d.scrollbarFiller.style.display = "";
+ if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {
+ d.gutterFiller.style.display = "block";
+ d.gutterFiller.style.height = sizes.bottom + "px";
+ d.gutterFiller.style.width = measure.gutterWidth + "px";
+ } else d.gutterFiller.style.display = "";
+ }
+
+ // Compute the lines that are visible in a given viewport (defaults
+ // the the current scroll position). viewport may contain top,
+ // height, and ensure (see op.scrollToPos) properties.
+ function visibleLines(display, doc, viewport) {
+ var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;
+ top = Math.floor(top - paddingTop(display));
+ var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;
+
+ var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);
+ // Ensure is a {from: {line, ch}, to: {line, ch}} object, and
+ // forces those lines into the viewport (if possible).
+ if (viewport && viewport.ensure) {
+ var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;
+ if (ensureFrom < from) {
+ from = ensureFrom;
+ to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);
+ } else if (Math.min(ensureTo, doc.lastLine()) >= to) {
+ from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);
+ to = ensureTo;
+ }
+ }
+ return {from: from, to: Math.max(to, from + 1)};
+ }
+
+ // LINE NUMBERS
+
+ // Re-align line numbers and gutter marks to compensate for
+ // horizontal scrolling.
+ function alignHorizontally(cm) {
+ var display = cm.display, view = display.view;
+ if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return;
+ var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;
+ var gutterW = display.gutters.offsetWidth, left = comp + "px";
+ for (var i = 0; i < view.length; i++) if (!view[i].hidden) {
+ if (cm.options.fixedGutter && view[i].gutter)
+ view[i].gutter.style.left = left;
+ var align = view[i].alignable;
+ if (align) for (var j = 0; j < align.length; j++)
+ align[j].style.left = left;
+ }
+ if (cm.options.fixedGutter)
+ display.gutters.style.left = (comp + gutterW) + "px";
+ }
+
+ // Used to ensure that the line number gutter is still the right
+ // size for the current document size. Returns true when an update
+ // is needed.
+ function maybeUpdateLineNumberWidth(cm) {
+ if (!cm.options.lineNumbers) return false;
+ var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;
+ if (last.length != display.lineNumChars) {
+ var test = display.measure.appendChild(elt("div", [elt("div", last)],
+ "CodeMirror-linenumber CodeMirror-gutter-elt"));
+ var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;
+ display.lineGutter.style.width = "";
+ display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1;
+ display.lineNumWidth = display.lineNumInnerWidth + padding;
+ display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;
+ display.lineGutter.style.width = display.lineNumWidth + "px";
+ updateGutterSpace(cm);
+ return true;
+ }
+ return false;
+ }
+
+ function lineNumberFor(options, i) {
+ return String(options.lineNumberFormatter(i + options.firstLineNumber));
+ }
+
+ // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,
+ // but using getBoundingClientRect to get a sub-pixel-accurate
+ // result.
+ function compensateForHScroll(display) {
+ return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left;
+ }
+
+ // DISPLAY DRAWING
+
+ function DisplayUpdate(cm, viewport, force) {
+ var display = cm.display;
+
+ this.viewport = viewport;
+ // Store some values that we'll need later (but don't want to force a relayout for)
+ this.visible = visibleLines(display, cm.doc, viewport);
+ this.editorIsHidden = !display.wrapper.offsetWidth;
+ this.wrapperHeight = display.wrapper.clientHeight;
+ this.wrapperWidth = display.wrapper.clientWidth;
+ this.oldDisplayWidth = displayWidth(cm);
+ this.force = force;
+ this.dims = getDimensions(cm);
+ this.events = [];
+ }
+
+ DisplayUpdate.prototype.signal = function(emitter, type) {
+ if (hasHandler(emitter, type))
+ this.events.push(arguments);
+ };
+ DisplayUpdate.prototype.finish = function() {
+ for (var i = 0; i < this.events.length; i++)
+ signal.apply(null, this.events[i]);
+ };
+
+ function maybeClipScrollbars(cm) {
+ var display = cm.display;
+ if (!display.scrollbarsClipped && display.scroller.offsetWidth) {
+ display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;
+ display.heightForcer.style.height = scrollGap(cm) + "px";
+ display.sizer.style.marginBottom = -display.nativeBarWidth + "px";
+ display.sizer.style.borderRightWidth = scrollGap(cm) + "px";
+ display.scrollbarsClipped = true;
+ }
+ }
+
+ // Does the actual updating of the line display. Bails out
+ // (returning false) when there is nothing to be done and forced is
+ // false.
+ function updateDisplayIfNeeded(cm, update) {
+ var display = cm.display, doc = cm.doc;
+
+ if (update.editorIsHidden) {
+ resetView(cm);
+ return false;
+ }
+
+ // Bail out if the visible area is already rendered and nothing changed.
+ if (!update.force &&
+ update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&
+ (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&
+ display.renderedView == display.view && countDirtyView(cm) == 0)
+ return false;
+
+ if (maybeUpdateLineNumberWidth(cm)) {
+ resetView(cm);
+ update.dims = getDimensions(cm);
+ }
+
+ // Compute a suitable new viewport (from & to)
+ var end = doc.first + doc.size;
+ var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);
+ var to = Math.min(end, update.visible.to + cm.options.viewportMargin);
+ if (display.viewFrom < from && from - display.viewFrom < 20) from = Math.max(doc.first, display.viewFrom);
+ if (display.viewTo > to && display.viewTo - to < 20) to = Math.min(end, display.viewTo);
+ if (sawCollapsedSpans) {
+ from = visualLineNo(cm.doc, from);
+ to = visualLineEndNo(cm.doc, to);
+ }
+
+ var different = from != display.viewFrom || to != display.viewTo ||
+ display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;
+ adjustView(cm, from, to);
+
+ display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));
+ // Position the mover div to align with the current scroll position
+ cm.display.mover.style.top = display.viewOffset + "px";
+
+ var toUpdate = countDirtyView(cm);
+ if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&
+ (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))
+ return false;
+
+ // For big changes, we hide the enclosing element during the
+ // update, since that speeds up the operations on most browsers.
+ var focused = activeElt();
+ if (toUpdate > 4) display.lineDiv.style.display = "none";
+ patchDisplay(cm, display.updateLineNumbers, update.dims);
+ if (toUpdate > 4) display.lineDiv.style.display = "";
+ display.renderedView = display.view;
+ // There might have been a widget with a focused element that got
+ // hidden or updated, if so re-focus it.
+ if (focused && activeElt() != focused && focused.offsetHeight) focused.focus();
+
+ // Prevent selection and cursors from interfering with the scroll
+ // width and height.
+ removeChildren(display.cursorDiv);
+ removeChildren(display.selectionDiv);
+ display.gutters.style.height = display.sizer.style.minHeight = 0;
+
+ if (different) {
+ display.lastWrapHeight = update.wrapperHeight;
+ display.lastWrapWidth = update.wrapperWidth;
+ startWorker(cm, 400);
+ }
+
+ display.updateLineNumbers = null;
+
+ return true;
+ }
+
+ function postUpdateDisplay(cm, update) {
+ var viewport = update.viewport;
+
+ for (var first = true;; first = false) {
+ if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {
+ // Clip forced viewport to actual scrollable area.
+ if (viewport && viewport.top != null)
+ viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)};
+ // Updated line heights might result in the drawn area not
+ // actually covering the viewport. Keep looping until it does.
+ update.visible = visibleLines(cm.display, cm.doc, viewport);
+ if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)
+ break;
+ }
+ if (!updateDisplayIfNeeded(cm, update)) break;
+ updateHeightsInViewport(cm);
+ var barMeasure = measureForScrollbars(cm);
+ updateSelection(cm);
+ updateScrollbars(cm, barMeasure);
+ setDocumentHeight(cm, barMeasure);
+ }
+
+ update.signal(cm, "update", cm);
+ if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {
+ update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo);
+ cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;
+ }
+ }
+
+ function updateDisplaySimple(cm, viewport) {
+ var update = new DisplayUpdate(cm, viewport);
+ if (updateDisplayIfNeeded(cm, update)) {
+ updateHeightsInViewport(cm);
+ postUpdateDisplay(cm, update);
+ var barMeasure = measureForScrollbars(cm);
+ updateSelection(cm);
+ updateScrollbars(cm, barMeasure);
+ setDocumentHeight(cm, barMeasure);
+ update.finish();
+ }
+ }
+
+ function setDocumentHeight(cm, measure) {
+ cm.display.sizer.style.minHeight = measure.docHeight + "px";
+ cm.display.heightForcer.style.top = measure.docHeight + "px";
+ cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px";
+ }
+
+ // Read the actual heights of the rendered lines, and update their
+ // stored heights to match.
+ function updateHeightsInViewport(cm) {
+ var display = cm.display;
+ var prevBottom = display.lineDiv.offsetTop;
+ for (var i = 0; i < display.view.length; i++) {
+ var cur = display.view[i], height;
+ if (cur.hidden) continue;
+ if (ie && ie_version < 8) {
+ var bot = cur.node.offsetTop + cur.node.offsetHeight;
+ height = bot - prevBottom;
+ prevBottom = bot;
+ } else {
+ var box = cur.node.getBoundingClientRect();
+ height = box.bottom - box.top;
+ }
+ var diff = cur.line.height - height;
+ if (height < 2) height = textHeight(display);
+ if (diff > .001 || diff < -.001) {
+ updateLineHeight(cur.line, height);
+ updateWidgetHeight(cur.line);
+ if (cur.rest) for (var j = 0; j < cur.rest.length; j++)
+ updateWidgetHeight(cur.rest[j]);
+ }
+ }
+ }
+
+ // Read and store the height of line widgets associated with the
+ // given line.
+ function updateWidgetHeight(line) {
+ if (line.widgets) for (var i = 0; i < line.widgets.length; ++i)
+ line.widgets[i].height = line.widgets[i].node.parentNode.offsetHeight;
+ }
+
+ // Do a bulk-read of the DOM positions and sizes needed to draw the
+ // view, so that we don't interleave reading and writing to the DOM.
+ function getDimensions(cm) {
+ var d = cm.display, left = {}, width = {};
+ var gutterLeft = d.gutters.clientLeft;
+ for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {
+ left[cm.options.gutters[i]] = n.offsetLeft + n.clientLeft + gutterLeft;
+ width[cm.options.gutters[i]] = n.clientWidth;
+ }
+ return {fixedPos: compensateForHScroll(d),
+ gutterTotalWidth: d.gutters.offsetWidth,
+ gutterLeft: left,
+ gutterWidth: width,
+ wrapperWidth: d.wrapper.clientWidth};
+ }
+
+ // Sync the actual display DOM structure with display.view, removing
+ // nodes for lines that are no longer in view, and creating the ones
+ // that are not there yet, and updating the ones that are out of
+ // date.
+ function patchDisplay(cm, updateNumbersFrom, dims) {
+ var display = cm.display, lineNumbers = cm.options.lineNumbers;
+ var container = display.lineDiv, cur = container.firstChild;
+
+ function rm(node) {
+ var next = node.nextSibling;
+ // Works around a throw-scroll bug in OS X Webkit
+ if (webkit && mac && cm.display.currentWheelTarget == node)
+ node.style.display = "none";
+ else
+ node.parentNode.removeChild(node);
+ return next;
+ }
+
+ var view = display.view, lineN = display.viewFrom;
+ // Loop over the elements in the view, syncing cur (the DOM nodes
+ // in display.lineDiv) with the view as we go.
+ for (var i = 0; i < view.length; i++) {
+ var lineView = view[i];
+ if (lineView.hidden) {
+ } else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet
+ var node = buildLineElement(cm, lineView, lineN, dims);
+ container.insertBefore(node, cur);
+ } else { // Already drawn
+ while (cur != lineView.node) cur = rm(cur);
+ var updateNumber = lineNumbers && updateNumbersFrom != null &&
+ updateNumbersFrom <= lineN && lineView.lineNumber;
+ if (lineView.changes) {
+ if (indexOf(lineView.changes, "gutter") > -1) updateNumber = false;
+ updateLineForChanges(cm, lineView, lineN, dims);
+ }
+ if (updateNumber) {
+ removeChildren(lineView.lineNumber);
+ lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));
+ }
+ cur = lineView.node.nextSibling;
+ }
+ lineN += lineView.size;
+ }
+ while (cur) cur = rm(cur);
+ }
+
+ // When an aspect of a line changes, a string is added to
+ // lineView.changes. This updates the relevant part of the line's
+ // DOM structure.
+ function updateLineForChanges(cm, lineView, lineN, dims) {
+ for (var j = 0; j < lineView.changes.length; j++) {
+ var type = lineView.changes[j];
+ if (type == "text") updateLineText(cm, lineView);
+ else if (type == "gutter") updateLineGutter(cm, lineView, lineN, dims);
+ else if (type == "class") updateLineClasses(lineView);
+ else if (type == "widget") updateLineWidgets(cm, lineView, dims);
+ }
+ lineView.changes = null;
+ }
+
+ // Lines with gutter elements, widgets or a background class need to
+ // be wrapped, and have the extra elements added to the wrapper div
+ function ensureLineWrapped(lineView) {
+ if (lineView.node == lineView.text) {
+ lineView.node = elt("div", null, null, "position: relative");
+ if (lineView.text.parentNode)
+ lineView.text.parentNode.replaceChild(lineView.node, lineView.text);
+ lineView.node.appendChild(lineView.text);
+ if (ie && ie_version < 8) lineView.node.style.zIndex = 2;
+ }
+ return lineView.node;
+ }
+
+ function updateLineBackground(lineView) {
+ var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass;
+ if (cls) cls += " CodeMirror-linebackground";
+ if (lineView.background) {
+ if (cls) lineView.background.className = cls;
+ else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }
+ } else if (cls) {
+ var wrap = ensureLineWrapped(lineView);
+ lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild);
+ }
+ }
+
+ // Wrapper around buildLineContent which will reuse the structure
+ // in display.externalMeasured when possible.
+ function getLineContent(cm, lineView) {
+ var ext = cm.display.externalMeasured;
+ if (ext && ext.line == lineView.line) {
+ cm.display.externalMeasured = null;
+ lineView.measure = ext.measure;
+ return ext.built;
+ }
+ return buildLineContent(cm, lineView);
+ }
+
+ // Redraw the line's text. Interacts with the background and text
+ // classes because the mode may output tokens that influence these
+ // classes.
+ function updateLineText(cm, lineView) {
+ var cls = lineView.text.className;
+ var built = getLineContent(cm, lineView);
+ if (lineView.text == lineView.node) lineView.node = built.pre;
+ lineView.text.parentNode.replaceChild(built.pre, lineView.text);
+ lineView.text = built.pre;
+ if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {
+ lineView.bgClass = built.bgClass;
+ lineView.textClass = built.textClass;
+ updateLineClasses(lineView);
+ } else if (cls) {
+ lineView.text.className = cls;
+ }
+ }
+
+ function updateLineClasses(lineView) {
+ updateLineBackground(lineView);
+ if (lineView.line.wrapClass)
+ ensureLineWrapped(lineView).className = lineView.line.wrapClass;
+ else if (lineView.node != lineView.text)
+ lineView.node.className = "";
+ var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass;
+ lineView.text.className = textClass || "";
+ }
+
+ function updateLineGutter(cm, lineView, lineN, dims) {
+ if (lineView.gutter) {
+ lineView.node.removeChild(lineView.gutter);
+ lineView.gutter = null;
+ }
+ if (lineView.gutterBackground) {
+ lineView.node.removeChild(lineView.gutterBackground);
+ lineView.gutterBackground = null;
+ }
+ if (lineView.line.gutterClass) {
+ var wrap = ensureLineWrapped(lineView);
+ lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass,
+ "left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) +
+ "px; width: " + dims.gutterTotalWidth + "px");
+ wrap.insertBefore(lineView.gutterBackground, lineView.text);
+ }
+ var markers = lineView.line.gutterMarkers;
+ if (cm.options.lineNumbers || markers) {
+ var wrap = ensureLineWrapped(lineView);
+ var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", "left: " +
+ (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px");
+ cm.display.input.setUneditable(gutterWrap);
+ wrap.insertBefore(gutterWrap, lineView.text);
+ if (lineView.line.gutterClass)
+ gutterWrap.className += " " + lineView.line.gutterClass;
+ if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))
+ lineView.lineNumber = gutterWrap.appendChild(
+ elt("div", lineNumberFor(cm.options, lineN),
+ "CodeMirror-linenumber CodeMirror-gutter-elt",
+ "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: "
+ + cm.display.lineNumInnerWidth + "px"));
+ if (markers) for (var k = 0; k < cm.options.gutters.length; ++k) {
+ var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];
+ if (found)
+ gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " +
+ dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px"));
+ }
+ }
+ }
+
+ function updateLineWidgets(cm, lineView, dims) {
+ if (lineView.alignable) lineView.alignable = null;
+ for (var node = lineView.node.firstChild, next; node; node = next) {
+ var next = node.nextSibling;
+ if (node.className == "CodeMirror-linewidget")
+ lineView.node.removeChild(node);
+ }
+ insertLineWidgets(cm, lineView, dims);
+ }
+
+ // Build a line's DOM representation from scratch
+ function buildLineElement(cm, lineView, lineN, dims) {
+ var built = getLineContent(cm, lineView);
+ lineView.text = lineView.node = built.pre;
+ if (built.bgClass) lineView.bgClass = built.bgClass;
+ if (built.textClass) lineView.textClass = built.textClass;
+
+ updateLineClasses(lineView);
+ updateLineGutter(cm, lineView, lineN, dims);
+ insertLineWidgets(cm, lineView, dims);
+ return lineView.node;
+ }
+
+ // A lineView may contain multiple logical lines (when merged by
+ // collapsed spans). The widgets for all of them need to be drawn.
+ function insertLineWidgets(cm, lineView, dims) {
+ insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);
+ if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)
+ insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false);
+ }
+
+ function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {
+ if (!line.widgets) return;
+ var wrap = ensureLineWrapped(lineView);
+ for (var i = 0, ws = line.widgets; i < ws.length; ++i) {
+ var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget");
+ if (!widget.handleMouseEvents) node.setAttribute("cm-ignore-events", "true");
+ positionLineWidget(widget, node, lineView, dims);
+ cm.display.input.setUneditable(node);
+ if (allowAbove && widget.above)
+ wrap.insertBefore(node, lineView.gutter || lineView.text);
+ else
+ wrap.appendChild(node);
+ signalLater(widget, "redraw");
+ }
+ }
+
+ function positionLineWidget(widget, node, lineView, dims) {
+ if (widget.noHScroll) {
+ (lineView.alignable || (lineView.alignable = [])).push(node);
+ var width = dims.wrapperWidth;
+ node.style.left = dims.fixedPos + "px";
+ if (!widget.coverGutter) {
+ width -= dims.gutterTotalWidth;
+ node.style.paddingLeft = dims.gutterTotalWidth + "px";
+ }
+ node.style.width = width + "px";
+ }
+ if (widget.coverGutter) {
+ node.style.zIndex = 5;
+ node.style.position = "relative";
+ if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px";
+ }
+ }
+
+ // POSITION OBJECT
+
+ // A Pos instance represents a position within the text.
+ var Pos = CodeMirror.Pos = function(line, ch) {
+ if (!(this instanceof Pos)) return new Pos(line, ch);
+ this.line = line; this.ch = ch;
+ };
+
+ // Compare two positions, return 0 if they are the same, a negative
+ // number when a is less, and a positive number otherwise.
+ var cmp = CodeMirror.cmpPos = function(a, b) { return a.line - b.line || a.ch - b.ch; };
+
+ function copyPos(x) {return Pos(x.line, x.ch);}
+ function maxPos(a, b) { return cmp(a, b) < 0 ? b : a; }
+ function minPos(a, b) { return cmp(a, b) < 0 ? a : b; }
+
+ // INPUT HANDLING
+
+ function ensureFocus(cm) {
+ if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); }
+ }
+
+ // This will be set to an array of strings when copying, so that,
+ // when pasting, we know what kind of selections the copied text
+ // was made out of.
+ var lastCopied = null;
+
+ function applyTextInput(cm, inserted, deleted, sel, origin) {
+ var doc = cm.doc;
+ cm.display.shift = false;
+ if (!sel) sel = doc.sel;
+
+ var paste = cm.state.pasteIncoming || origin == "paste";
+ var textLines = doc.splitLines(inserted), multiPaste = null;
+ // When pasing N lines into N selections, insert one line per selection
+ if (paste && sel.ranges.length > 1) {
+ if (lastCopied && lastCopied.join("\n") == inserted) {
+ if (sel.ranges.length % lastCopied.length == 0) {
+ multiPaste = [];
+ for (var i = 0; i < lastCopied.length; i++)
+ multiPaste.push(doc.splitLines(lastCopied[i]));
+ }
+ } else if (textLines.length == sel.ranges.length) {
+ multiPaste = map(textLines, function(l) { return [l]; });
+ }
+ }
+
+ // Normal behavior is to insert the new text into every selection
+ for (var i = sel.ranges.length - 1; i >= 0; i--) {
+ var range = sel.ranges[i];
+ var from = range.from(), to = range.to();
+ if (range.empty()) {
+ if (deleted && deleted > 0) // Handle deletion
+ from = Pos(from.line, from.ch - deleted);
+ else if (cm.state.overwrite && !paste) // Handle overwrite
+ to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length));
+ }
+ var updateInput = cm.curOp.updateInput;
+ var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i % multiPaste.length] : textLines,
+ origin: origin || (paste ? "paste" : cm.state.cutIncoming ? "cut" : "+input")};
+ makeChange(cm.doc, changeEvent);
+ signalLater(cm, "inputRead", cm, changeEvent);
+ }
+ if (inserted && !paste)
+ triggerElectric(cm, inserted);
+
+ ensureCursorVisible(cm);
+ cm.curOp.updateInput = updateInput;
+ cm.curOp.typing = true;
+ cm.state.pasteIncoming = cm.state.cutIncoming = false;
+ }
+
+ function handlePaste(e, cm) {
+ var pasted = e.clipboardData && e.clipboardData.getData("text/plain");
+ if (pasted) {
+ e.preventDefault();
+ if (!cm.isReadOnly() && !cm.options.disableInput)
+ runInOp(cm, function() { applyTextInput(cm, pasted, 0, null, "paste"); });
+ return true;
+ }
+ }
+
+ function triggerElectric(cm, inserted) {
+ // When an 'electric' character is inserted, immediately trigger a reindent
+ if (!cm.options.electricChars || !cm.options.smartIndent) return;
+ var sel = cm.doc.sel;
+
+ for (var i = sel.ranges.length - 1; i >= 0; i--) {
+ var range = sel.ranges[i];
+ if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) continue;
+ var mode = cm.getModeAt(range.head);
+ var indented = false;
+ if (mode.electricChars) {
+ for (var j = 0; j < mode.electricChars.length; j++)
+ if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {
+ indented = indentLine(cm, range.head.line, "smart");
+ break;
+ }
+ } else if (mode.electricInput) {
+ if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch)))
+ indented = indentLine(cm, range.head.line, "smart");
+ }
+ if (indented) signalLater(cm, "electricInput", cm, range.head.line);
+ }
+ }
+
+ function copyableRanges(cm) {
+ var text = [], ranges = [];
+ for (var i = 0; i < cm.doc.sel.ranges.length; i++) {
+ var line = cm.doc.sel.ranges[i].head.line;
+ var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};
+ ranges.push(lineRange);
+ text.push(cm.getRange(lineRange.anchor, lineRange.head));
+ }
+ return {text: text, ranges: ranges};
+ }
+
+ function disableBrowserMagic(field) {
+ field.setAttribute("autocorrect", "off");
+ field.setAttribute("autocapitalize", "off");
+ field.setAttribute("spellcheck", "false");
+ }
+
+ // TEXTAREA INPUT STYLE
+
+ function TextareaInput(cm) {
+ this.cm = cm;
+ // See input.poll and input.reset
+ this.prevInput = "";
+
+ // Flag that indicates whether we expect input to appear real soon
+ // now (after some event like 'keypress' or 'input') and are
+ // polling intensively.
+ this.pollingFast = false;
+ // Self-resetting timeout for the poller
+ this.polling = new Delayed();
+ // Tracks when input.reset has punted to just putting a short
+ // string into the textarea instead of the full selection.
+ this.inaccurateSelection = false;
+ // Used to work around IE issue with selection being forgotten when focus moves away from textarea
+ this.hasSelection = false;
+ this.composing = null;
+ };
+
+ function hiddenTextarea() {
+ var te = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none");
+ var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
+ // The textarea is kept positioned near the cursor to prevent the
+ // fact that it'll be scrolled into view on input from scrolling
+ // our fake cursor out of view. On webkit, when wrap=off, paste is
+ // very slow. So make the area wide instead.
+ if (webkit) te.style.width = "1000px";
+ else te.setAttribute("wrap", "off");
+ // If border: 0; -- iOS fails to open keyboard (issue #1287)
+ if (ios) te.style.border = "1px solid black";
+ disableBrowserMagic(te);
+ return div;
+ }
+
+ TextareaInput.prototype = copyObj({
+ init: function(display) {
+ var input = this, cm = this.cm;
+
+ // Wraps and hides input textarea
+ var div = this.wrapper = hiddenTextarea();
+ // The semihidden textarea that is focused when the editor is
+ // focused, and receives input.
+ var te = this.textarea = div.firstChild;
+ display.wrapper.insertBefore(div, display.wrapper.firstChild);
+
+ // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)
+ if (ios) te.style.width = "0px";
+
+ on(te, "input", function() {
+ if (ie && ie_version >= 9 && input.hasSelection) input.hasSelection = null;
+ input.poll();
+ });
+
+ on(te, "paste", function(e) {
+ if (signalDOMEvent(cm, e) || handlePaste(e, cm)) return
+
+ cm.state.pasteIncoming = true;
+ input.fastPoll();
+ });
+
+ function prepareCopyCut(e) {
+ if (signalDOMEvent(cm, e)) return
+ if (cm.somethingSelected()) {
+ lastCopied = cm.getSelections();
+ if (input.inaccurateSelection) {
+ input.prevInput = "";
+ input.inaccurateSelection = false;
+ te.value = lastCopied.join("\n");
+ selectInput(te);
+ }
+ } else if (!cm.options.lineWiseCopyCut) {
+ return;
+ } else {
+ var ranges = copyableRanges(cm);
+ lastCopied = ranges.text;
+ if (e.type == "cut") {
+ cm.setSelections(ranges.ranges, null, sel_dontScroll);
+ } else {
+ input.prevInput = "";
+ te.value = ranges.text.join("\n");
+ selectInput(te);
+ }
+ }
+ if (e.type == "cut") cm.state.cutIncoming = true;
+ }
+ on(te, "cut", prepareCopyCut);
+ on(te, "copy", prepareCopyCut);
+
+ on(display.scroller, "paste", function(e) {
+ if (eventInWidget(display, e) || signalDOMEvent(cm, e)) return;
+ cm.state.pasteIncoming = true;
+ input.focus();
+ });
+
+ // Prevent normal selection in the editor (we handle our own)
+ on(display.lineSpace, "selectstart", function(e) {
+ if (!eventInWidget(display, e)) e_preventDefault(e);
+ });
+
+ on(te, "compositionstart", function() {
+ var start = cm.getCursor("from");
+ if (input.composing) input.composing.range.clear()
+ input.composing = {
+ start: start,
+ range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"})
+ };
+ });
+ on(te, "compositionend", function() {
+ if (input.composing) {
+ input.poll();
+ input.composing.range.clear();
+ input.composing = null;
+ }
+ });
+ },
+
+ prepareSelection: function() {
+ // Redraw the selection and/or cursor
+ var cm = this.cm, display = cm.display, doc = cm.doc;
+ var result = prepareSelection(cm);
+
+ // Move the hidden textarea near the cursor to prevent scrolling artifacts
+ if (cm.options.moveInputWithCursor) {
+ var headPos = cursorCoords(cm, doc.sel.primary().head, "div");
+ var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();
+ result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,
+ headPos.top + lineOff.top - wrapOff.top));
+ result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,
+ headPos.left + lineOff.left - wrapOff.left));
+ }
+
+ return result;
+ },
+
+ showSelection: function(drawn) {
+ var cm = this.cm, display = cm.display;
+ removeChildrenAndAdd(display.cursorDiv, drawn.cursors);
+ removeChildrenAndAdd(display.selectionDiv, drawn.selection);
+ if (drawn.teTop != null) {
+ this.wrapper.style.top = drawn.teTop + "px";
+ this.wrapper.style.left = drawn.teLeft + "px";
+ }
+ },
+
+ // Reset the input to correspond to the selection (or to be empty,
+ // when not typing and nothing is selected)
+ reset: function(typing) {
+ if (this.contextMenuPending) return;
+ var minimal, selected, cm = this.cm, doc = cm.doc;
+ if (cm.somethingSelected()) {
+ this.prevInput = "";
+ var range = doc.sel.primary();
+ minimal = hasCopyEvent &&
+ (range.to().line - range.from().line > 100 || (selected = cm.getSelection()).length > 1000);
+ var content = minimal ? "-" : selected || cm.getSelection();
+ this.textarea.value = content;
+ if (cm.state.focused) selectInput(this.textarea);
+ if (ie && ie_version >= 9) this.hasSelection = content;
+ } else if (!typing) {
+ this.prevInput = this.textarea.value = "";
+ if (ie && ie_version >= 9) this.hasSelection = null;
+ }
+ this.inaccurateSelection = minimal;
+ },
+
+ getField: function() { return this.textarea; },
+
+ supportsTouch: function() { return false; },
+
+ focus: function() {
+ if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) {
+ try { this.textarea.focus(); }
+ catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM
+ }
+ },
+
+ blur: function() { this.textarea.blur(); },
+
+ resetPosition: function() {
+ this.wrapper.style.top = this.wrapper.style.left = 0;
+ },
+
+ receivedFocus: function() { this.slowPoll(); },
+
+ // Poll for input changes, using the normal rate of polling. This
+ // runs as long as the editor is focused.
+ slowPoll: function() {
+ var input = this;
+ if (input.pollingFast) return;
+ input.polling.set(this.cm.options.pollInterval, function() {
+ input.poll();
+ if (input.cm.state.focused) input.slowPoll();
+ });
+ },
+
+ // When an event has just come in that is likely to add or change
+ // something in the input textarea, we poll faster, to ensure that
+ // the change appears on the screen quickly.
+ fastPoll: function() {
+ var missed = false, input = this;
+ input.pollingFast = true;
+ function p() {
+ var changed = input.poll();
+ if (!changed && !missed) {missed = true; input.polling.set(60, p);}
+ else {input.pollingFast = false; input.slowPoll();}
+ }
+ input.polling.set(20, p);
+ },
+
+ // Read input from the textarea, and update the document to match.
+ // When something is selected, it is present in the textarea, and
+ // selected (unless it is huge, in which case a placeholder is
+ // used). When nothing is selected, the cursor sits after previously
+ // seen text (can be empty), which is stored in prevInput (we must
+ // not reset the textarea when typing, because that breaks IME).
+ poll: function() {
+ var cm = this.cm, input = this.textarea, prevInput = this.prevInput;
+ // Since this is called a *lot*, try to bail out as cheaply as
+ // possible when it is clear that nothing happened. hasSelection
+ // will be the case when there is a lot of text in the textarea,
+ // in which case reading its value would be expensive.
+ if (this.contextMenuPending || !cm.state.focused ||
+ (hasSelection(input) && !prevInput && !this.composing) ||
+ cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)
+ return false;
+
+ var text = input.value;
+ // If nothing changed, bail.
+ if (text == prevInput && !cm.somethingSelected()) return false;
+ // Work around nonsensical selection resetting in IE9/10, and
+ // inexplicable appearance of private area unicode characters on
+ // some key combos in Mac (#2689).
+ if (ie && ie_version >= 9 && this.hasSelection === text ||
+ mac && /[\uf700-\uf7ff]/.test(text)) {
+ cm.display.input.reset();
+ return false;
+ }
+
+ if (cm.doc.sel == cm.display.selForContextMenu) {
+ var first = text.charCodeAt(0);
+ if (first == 0x200b && !prevInput) prevInput = "\u200b";
+ if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo"); }
+ }
+ // Find the part of the input that is actually new
+ var same = 0, l = Math.min(prevInput.length, text.length);
+ while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same;
+
+ var self = this;
+ runInOp(cm, function() {
+ applyTextInput(cm, text.slice(same), prevInput.length - same,
+ null, self.composing ? "*compose" : null);
+
+ // Don't leave long text in the textarea, since it makes further polling slow
+ if (text.length > 1000 || text.indexOf("\n") > -1) input.value = self.prevInput = "";
+ else self.prevInput = text;
+
+ if (self.composing) {
+ self.composing.range.clear();
+ self.composing.range = cm.markText(self.composing.start, cm.getCursor("to"),
+ {className: "CodeMirror-composing"});
+ }
+ });
+ return true;
+ },
+
+ ensurePolled: function() {
+ if (this.pollingFast && this.poll()) this.pollingFast = false;
+ },
+
+ onKeyPress: function() {
+ if (ie && ie_version >= 9) this.hasSelection = null;
+ this.fastPoll();
+ },
+
+ onContextMenu: function(e) {
+ var input = this, cm = input.cm, display = cm.display, te = input.textarea;
+ var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;
+ if (!pos || presto) return; // Opera is difficult.
+
+ // Reset the current text selection only if the click is done outside of the selection
+ // and 'resetSelectionOnContextMenu' option is true.
+ var reset = cm.options.resetSelectionOnContextMenu;
+ if (reset && cm.doc.sel.contains(pos) == -1)
+ operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll);
+
+ var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText;
+ input.wrapper.style.cssText = "position: absolute"
+ var wrapperBox = input.wrapper.getBoundingClientRect()
+ te.style.cssText = "position: absolute; width: 30px; height: 30px; top: " + (e.clientY - wrapperBox.top - 5) +
+ "px; left: " + (e.clientX - wrapperBox.left - 5) + "px; z-index: 1000; background: " +
+ (ie ? "rgba(255, 255, 255, .05)" : "transparent") +
+ "; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";
+ if (webkit) var oldScrollY = window.scrollY; // Work around Chrome issue (#2712)
+ display.input.focus();
+ if (webkit) window.scrollTo(null, oldScrollY);
+ display.input.reset();
+ // Adds "Select all" to context menu in FF
+ if (!cm.somethingSelected()) te.value = input.prevInput = " ";
+ input.contextMenuPending = true;
+ display.selForContextMenu = cm.doc.sel;
+ clearTimeout(display.detectingSelectAll);
+
+ // Select-all will be greyed out if there's nothing to select, so
+ // this adds a zero-width space so that we can later check whether
+ // it got selected.
+ function prepareSelectAllHack() {
+ if (te.selectionStart != null) {
+ var selected = cm.somethingSelected();
+ var extval = "\u200b" + (selected ? te.value : "");
+ te.value = "\u21da"; // Used to catch context-menu undo
+ te.value = extval;
+ input.prevInput = selected ? "" : "\u200b";
+ te.selectionStart = 1; te.selectionEnd = extval.length;
+ // Re-set this, in case some other handler touched the
+ // selection in the meantime.
+ display.selForContextMenu = cm.doc.sel;
+ }
+ }
+ function rehide() {
+ input.contextMenuPending = false;
+ input.wrapper.style.cssText = oldWrapperCSS
+ te.style.cssText = oldCSS;
+ if (ie && ie_version < 9) display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos);
+
+ // Try to detect the user choosing select-all
+ if (te.selectionStart != null) {
+ if (!ie || (ie && ie_version < 9)) prepareSelectAllHack();
+ var i = 0, poll = function() {
+ if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&
+ te.selectionEnd > 0 && input.prevInput == "\u200b")
+ operation(cm, commands.selectAll)(cm);
+ else if (i++ < 10) display.detectingSelectAll = setTimeout(poll, 500);
+ else display.input.reset();
+ };
+ display.detectingSelectAll = setTimeout(poll, 200);
+ }
+ }
+
+ if (ie && ie_version >= 9) prepareSelectAllHack();
+ if (captureRightClick) {
+ e_stop(e);
+ var mouseup = function() {
+ off(window, "mouseup", mouseup);
+ setTimeout(rehide, 20);
+ };
+ on(window, "mouseup", mouseup);
+ } else {
+ setTimeout(rehide, 50);
+ }
+ },
+
+ readOnlyChanged: function(val) {
+ if (!val) this.reset();
+ },
+
+ setUneditable: nothing,
+
+ needsContentAttribute: false
+ }, TextareaInput.prototype);
+
+ // CONTENTEDITABLE INPUT STYLE
+
+ function ContentEditableInput(cm) {
+ this.cm = cm;
+ this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;
+ this.polling = new Delayed();
+ this.gracePeriod = false;
+ }
+
+ ContentEditableInput.prototype = copyObj({
+ init: function(display) {
+ var input = this, cm = input.cm;
+ var div = input.div = display.lineDiv;
+ disableBrowserMagic(div);
+
+ on(div, "paste", function(e) {
+ if (!signalDOMEvent(cm, e)) handlePaste(e, cm);
+ })
+
+ on(div, "compositionstart", function(e) {
+ var data = e.data;
+ input.composing = {sel: cm.doc.sel, data: data, startData: data};
+ if (!data) return;
+ var prim = cm.doc.sel.primary();
+ var line = cm.getLine(prim.head.line);
+ var found = line.indexOf(data, Math.max(0, prim.head.ch - data.length));
+ if (found > -1 && found <= prim.head.ch)
+ input.composing.sel = simpleSelection(Pos(prim.head.line, found),
+ Pos(prim.head.line, found + data.length));
+ });
+ on(div, "compositionupdate", function(e) {
+ input.composing.data = e.data;
+ });
+ on(div, "compositionend", function(e) {
+ var ours = input.composing;
+ if (!ours) return;
+ if (e.data != ours.startData && !/\u200b/.test(e.data))
+ ours.data = e.data;
+ // Need a small delay to prevent other code (input event,
+ // selection polling) from doing damage when fired right after
+ // compositionend.
+ setTimeout(function() {
+ if (!ours.handled)
+ input.applyComposition(ours);
+ if (input.composing == ours)
+ input.composing = null;
+ }, 50);
+ });
+
+ on(div, "touchstart", function() {
+ input.forceCompositionEnd();
+ });
+
+ on(div, "input", function() {
+ if (input.composing) return;
+ if (cm.isReadOnly() || !input.pollContent())
+ runInOp(input.cm, function() {regChange(cm);});
+ });
+
+ function onCopyCut(e) {
+ if (signalDOMEvent(cm, e)) return
+ if (cm.somethingSelected()) {
+ lastCopied = cm.getSelections();
+ if (e.type == "cut") cm.replaceSelection("", null, "cut");
+ } else if (!cm.options.lineWiseCopyCut) {
+ return;
+ } else {
+ var ranges = copyableRanges(cm);
+ lastCopied = ranges.text;
+ if (e.type == "cut") {
+ cm.operation(function() {
+ cm.setSelections(ranges.ranges, 0, sel_dontScroll);
+ cm.replaceSelection("", null, "cut");
+ });
+ }
+ }
+ // iOS exposes the clipboard API, but seems to discard content inserted into it
+ if (e.clipboardData && !ios) {
+ e.preventDefault();
+ e.clipboardData.clearData();
+ e.clipboardData.setData("text/plain", lastCopied.join("\n"));
+ } else {
+ // Old-fashioned briefly-focus-a-textarea hack
+ var kludge = hiddenTextarea(), te = kludge.firstChild;
+ cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);
+ te.value = lastCopied.join("\n");
+ var hadFocus = document.activeElement;
+ selectInput(te);
+ setTimeout(function() {
+ cm.display.lineSpace.removeChild(kludge);
+ hadFocus.focus();
+ }, 50);
+ }
+ }
+ on(div, "copy", onCopyCut);
+ on(div, "cut", onCopyCut);
+ },
+
+ prepareSelection: function() {
+ var result = prepareSelection(this.cm, false);
+ result.focus = this.cm.state.focused;
+ return result;
+ },
+
+ showSelection: function(info) {
+ if (!info || !this.cm.display.view.length) return;
+ if (info.focus) this.showPrimarySelection();
+ this.showMultipleSelections(info);
+ },
+
+ showPrimarySelection: function() {
+ var sel = window.getSelection(), prim = this.cm.doc.sel.primary();
+ var curAnchor = domToPos(this.cm, sel.anchorNode, sel.anchorOffset);
+ var curFocus = domToPos(this.cm, sel.focusNode, sel.focusOffset);
+ if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&
+ cmp(minPos(curAnchor, curFocus), prim.from()) == 0 &&
+ cmp(maxPos(curAnchor, curFocus), prim.to()) == 0)
+ return;
+
+ var start = posToDOM(this.cm, prim.from());
+ var end = posToDOM(this.cm, prim.to());
+ if (!start && !end) return;
+
+ var view = this.cm.display.view;
+ var old = sel.rangeCount && sel.getRangeAt(0);
+ if (!start) {
+ start = {node: view[0].measure.map[2], offset: 0};
+ } else if (!end) { // FIXME dangerously hacky
+ var measure = view[view.length - 1].measure;
+ var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map;
+ end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]};
+ }
+
+ try { var rng = range(start.node, start.offset, end.offset, end.node); }
+ catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible
+ if (rng) {
+ if (!gecko && this.cm.state.focused) {
+ sel.collapse(start.node, start.offset);
+ if (!rng.collapsed) sel.addRange(rng);
+ } else {
+ sel.removeAllRanges();
+ sel.addRange(rng);
+ }
+ if (old && sel.anchorNode == null) sel.addRange(old);
+ else if (gecko) this.startGracePeriod();
+ }
+ this.rememberSelection();
+ },
+
+ startGracePeriod: function() {
+ var input = this;
+ clearTimeout(this.gracePeriod);
+ this.gracePeriod = setTimeout(function() {
+ input.gracePeriod = false;
+ if (input.selectionChanged())
+ input.cm.operation(function() { input.cm.curOp.selectionChanged = true; });
+ }, 20);
+ },
+
+ showMultipleSelections: function(info) {
+ removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);
+ removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);
+ },
+
+ rememberSelection: function() {
+ var sel = window.getSelection();
+ this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;
+ this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;
+ },
+
+ selectionInEditor: function() {
+ var sel = window.getSelection();
+ if (!sel.rangeCount) return false;
+ var node = sel.getRangeAt(0).commonAncestorContainer;
+ return contains(this.div, node);
+ },
+
+ focus: function() {
+ if (this.cm.options.readOnly != "nocursor") this.div.focus();
+ },
+ blur: function() { this.div.blur(); },
+ getField: function() { return this.div; },
+
+ supportsTouch: function() { return true; },
+
+ receivedFocus: function() {
+ var input = this;
+ if (this.selectionInEditor())
+ this.pollSelection();
+ else
+ runInOp(this.cm, function() { input.cm.curOp.selectionChanged = true; });
+
+ function poll() {
+ if (input.cm.state.focused) {
+ input.pollSelection();
+ input.polling.set(input.cm.options.pollInterval, poll);
+ }
+ }
+ this.polling.set(this.cm.options.pollInterval, poll);
+ },
+
+ selectionChanged: function() {
+ var sel = window.getSelection();
+ return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||
+ sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset;
+ },
+
+ pollSelection: function() {
+ if (!this.composing && !this.gracePeriod && this.selectionChanged()) {
+ var sel = window.getSelection(), cm = this.cm;
+ this.rememberSelection();
+ var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);
+ var head = domToPos(cm, sel.focusNode, sel.focusOffset);
+ if (anchor && head) runInOp(cm, function() {
+ setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll);
+ if (anchor.bad || head.bad) cm.curOp.selectionChanged = true;
+ });
+ }
+ },
+
+ pollContent: function() {
+ var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();
+ var from = sel.from(), to = sel.to();
+ if (from.line < display.viewFrom || to.line > display.viewTo - 1) return false;
+
+ var fromIndex;
+ if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {
+ var fromLine = lineNo(display.view[0].line);
+ var fromNode = display.view[0].node;
+ } else {
+ var fromLine = lineNo(display.view[fromIndex].line);
+ var fromNode = display.view[fromIndex - 1].node.nextSibling;
+ }
+ var toIndex = findViewIndex(cm, to.line);
+ if (toIndex == display.view.length - 1) {
+ var toLine = display.viewTo - 1;
+ var toNode = display.lineDiv.lastChild;
+ } else {
+ var toLine = lineNo(display.view[toIndex + 1].line) - 1;
+ var toNode = display.view[toIndex + 1].node.previousSibling;
+ }
+
+ var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine));
+ var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length));
+ while (newText.length > 1 && oldText.length > 1) {
+ if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; }
+ else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; }
+ else break;
+ }
+
+ var cutFront = 0, cutEnd = 0;
+ var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length);
+ while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))
+ ++cutFront;
+ var newBot = lst(newText), oldBot = lst(oldText);
+ var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),
+ oldBot.length - (oldText.length == 1 ? cutFront : 0));
+ while (cutEnd < maxCutEnd &&
+ newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))
+ ++cutEnd;
+
+ newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd);
+ newText[0] = newText[0].slice(cutFront);
+
+ var chFrom = Pos(fromLine, cutFront);
+ var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0);
+ if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {
+ replaceRange(cm.doc, newText, chFrom, chTo, "+input");
+ return true;
+ }
+ },
+
+ ensurePolled: function() {
+ this.forceCompositionEnd();
+ },
+ reset: function() {
+ this.forceCompositionEnd();
+ },
+ forceCompositionEnd: function() {
+ if (!this.composing || this.composing.handled) return;
+ this.applyComposition(this.composing);
+ this.composing.handled = true;
+ this.div.blur();
+ this.div.focus();
+ },
+ applyComposition: function(composing) {
+ if (this.cm.isReadOnly())
+ operation(this.cm, regChange)(this.cm)
+ else if (composing.data && composing.data != composing.startData)
+ operation(this.cm, applyTextInput)(this.cm, composing.data, 0, composing.sel);
+ },
+
+ setUneditable: function(node) {
+ node.contentEditable = "false"
+ },
+
+ onKeyPress: function(e) {
+ e.preventDefault();
+ if (!this.cm.isReadOnly())
+ operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0);
+ },
+
+ readOnlyChanged: function(val) {
+ this.div.contentEditable = String(val != "nocursor")
+ },
+
+ onContextMenu: nothing,
+ resetPosition: nothing,
+
+ needsContentAttribute: true
+ }, ContentEditableInput.prototype);
+
+ function posToDOM(cm, pos) {
+ var view = findViewForLine(cm, pos.line);
+ if (!view || view.hidden) return null;
+ var line = getLine(cm.doc, pos.line);
+ var info = mapFromLineView(view, line, pos.line);
+
+ var order = getOrder(line), side = "left";
+ if (order) {
+ var partPos = getBidiPartAt(order, pos.ch);
+ side = partPos % 2 ? "right" : "left";
+ }
+ var result = nodeAndOffsetInLineMap(info.map, pos.ch, side);
+ result.offset = result.collapse == "right" ? result.end : result.start;
+ return result;
+ }
+
+ function badPos(pos, bad) { if (bad) pos.bad = true; return pos; }
+
+ function domToPos(cm, node, offset) {
+ var lineNode;
+ if (node == cm.display.lineDiv) {
+ lineNode = cm.display.lineDiv.childNodes[offset];
+ if (!lineNode) return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true);
+ node = null; offset = 0;
+ } else {
+ for (lineNode = node;; lineNode = lineNode.parentNode) {
+ if (!lineNode || lineNode == cm.display.lineDiv) return null;
+ if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) break;
+ }
+ }
+ for (var i = 0; i < cm.display.view.length; i++) {
+ var lineView = cm.display.view[i];
+ if (lineView.node == lineNode)
+ return locateNodeInLineView(lineView, node, offset);
+ }
+ }
+
+ function locateNodeInLineView(lineView, node, offset) {
+ var wrapper = lineView.text.firstChild, bad = false;
+ if (!node || !contains(wrapper, node)) return badPos(Pos(lineNo(lineView.line), 0), true);
+ if (node == wrapper) {
+ bad = true;
+ node = wrapper.childNodes[offset];
+ offset = 0;
+ if (!node) {
+ var line = lineView.rest ? lst(lineView.rest) : lineView.line;
+ return badPos(Pos(lineNo(line), line.text.length), bad);
+ }
+ }
+
+ var textNode = node.nodeType == 3 ? node : null, topNode = node;
+ if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {
+ textNode = node.firstChild;
+ if (offset) offset = textNode.nodeValue.length;
+ }
+ while (topNode.parentNode != wrapper) topNode = topNode.parentNode;
+ var measure = lineView.measure, maps = measure.maps;
+
+ function find(textNode, topNode, offset) {
+ for (var i = -1; i < (maps ? maps.length : 0); i++) {
+ var map = i < 0 ? measure.map : maps[i];
+ for (var j = 0; j < map.length; j += 3) {
+ var curNode = map[j + 2];
+ if (curNode == textNode || curNode == topNode) {
+ var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]);
+ var ch = map[j] + offset;
+ if (offset < 0 || curNode != textNode) ch = map[j + (offset ? 1 : 0)];
+ return Pos(line, ch);
+ }
+ }
+ }
+ }
+ var found = find(textNode, topNode, offset);
+ if (found) return badPos(found, bad);
+
+ // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems
+ for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {
+ found = find(after, after.firstChild, 0);
+ if (found)
+ return badPos(Pos(found.line, found.ch - dist), bad);
+ else
+ dist += after.textContent.length;
+ }
+ for (var before = topNode.previousSibling, dist = offset; before; before = before.previousSibling) {
+ found = find(before, before.firstChild, -1);
+ if (found)
+ return badPos(Pos(found.line, found.ch + dist), bad);
+ else
+ dist += after.textContent.length;
+ }
+ }
+
+ function domTextBetween(cm, from, to, fromLine, toLine) {
+ var text = "", closing = false, lineSep = cm.doc.lineSeparator();
+ function recognizeMarker(id) { return function(marker) { return marker.id == id; }; }
+ function walk(node) {
+ if (node.nodeType == 1) {
+ var cmText = node.getAttribute("cm-text");
+ if (cmText != null) {
+ if (cmText == "") cmText = node.textContent.replace(/\u200b/g, "");
+ text += cmText;
+ return;
+ }
+ var markerID = node.getAttribute("cm-marker"), range;
+ if (markerID) {
+ var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID));
+ if (found.length && (range = found[0].find()))
+ text += getBetween(cm.doc, range.from, range.to).join(lineSep);
+ return;
+ }
+ if (node.getAttribute("contenteditable") == "false") return;
+ for (var i = 0; i < node.childNodes.length; i++)
+ walk(node.childNodes[i]);
+ if (/^(pre|div|p)$/i.test(node.nodeName))
+ closing = true;
+ } else if (node.nodeType == 3) {
+ var val = node.nodeValue;
+ if (!val) return;
+ if (closing) {
+ text += lineSep;
+ closing = false;
+ }
+ text += val;
+ }
+ }
+ for (;;) {
+ walk(from);
+ if (from == to) break;
+ from = from.nextSibling;
+ }
+ return text;
+ }
+
+ CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput};
+
+ // SELECTION / CURSOR
+
+ // Selection objects are immutable. A new one is created every time
+ // the selection changes. A selection is one or more non-overlapping
+ // (and non-touching) ranges, sorted, and an integer that indicates
+ // which one is the primary selection (the one that's scrolled into
+ // view, that getCursor returns, etc).
+ function Selection(ranges, primIndex) {
+ this.ranges = ranges;
+ this.primIndex = primIndex;
+ }
+
+ Selection.prototype = {
+ primary: function() { return this.ranges[this.primIndex]; },
+ equals: function(other) {
+ if (other == this) return true;
+ if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) return false;
+ for (var i = 0; i < this.ranges.length; i++) {
+ var here = this.ranges[i], there = other.ranges[i];
+ if (cmp(here.anchor, there.anchor) != 0 || cmp(here.head, there.head) != 0) return false;
+ }
+ return true;
+ },
+ deepCopy: function() {
+ for (var out = [], i = 0; i < this.ranges.length; i++)
+ out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head));
+ return new Selection(out, this.primIndex);
+ },
+ somethingSelected: function() {
+ for (var i = 0; i < this.ranges.length; i++)
+ if (!this.ranges[i].empty()) return true;
+ return false;
+ },
+ contains: function(pos, end) {
+ if (!end) end = pos;
+ for (var i = 0; i < this.ranges.length; i++) {
+ var range = this.ranges[i];
+ if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)
+ return i;
+ }
+ return -1;
+ }
+ };
+
+ function Range(anchor, head) {
+ this.anchor = anchor; this.head = head;
+ }
+
+ Range.prototype = {
+ from: function() { return minPos(this.anchor, this.head); },
+ to: function() { return maxPos(this.anchor, this.head); },
+ empty: function() {
+ return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch;
+ }
+ };
+
+ // Take an unsorted, potentially overlapping set of ranges, and
+ // build a selection out of it. 'Consumes' ranges array (modifying
+ // it).
+ function normalizeSelection(ranges, primIndex) {
+ var prim = ranges[primIndex];
+ ranges.sort(function(a, b) { return cmp(a.from(), b.from()); });
+ primIndex = indexOf(ranges, prim);
+ for (var i = 1; i < ranges.length; i++) {
+ var cur = ranges[i], prev = ranges[i - 1];
+ if (cmp(prev.to(), cur.from()) >= 0) {
+ var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());
+ var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;
+ if (i <= primIndex) --primIndex;
+ ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));
+ }
+ }
+ return new Selection(ranges, primIndex);
+ }
+
+ function simpleSelection(anchor, head) {
+ return new Selection([new Range(anchor, head || anchor)], 0);
+ }
+
+ // Most of the external API clips given positions to make sure they
+ // actually exist within the document.
+ function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));}
+ function clipPos(doc, pos) {
+ if (pos.line < doc.first) return Pos(doc.first, 0);
+ var last = doc.first + doc.size - 1;
+ if (pos.line > last) return Pos(last, getLine(doc, last).text.length);
+ return clipToLen(pos, getLine(doc, pos.line).text.length);
+ }
+ function clipToLen(pos, linelen) {
+ var ch = pos.ch;
+ if (ch == null || ch > linelen) return Pos(pos.line, linelen);
+ else if (ch < 0) return Pos(pos.line, 0);
+ else return pos;
+ }
+ function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;}
+ function clipPosArray(doc, array) {
+ for (var out = [], i = 0; i < array.length; i++) out[i] = clipPos(doc, array[i]);
+ return out;
+ }
+
+ // SELECTION UPDATES
+
+ // The 'scroll' parameter given to many of these indicated whether
+ // the new cursor position should be scrolled into view after
+ // modifying the selection.
+
+ // If shift is held or the extend flag is set, extends a range to
+ // include a given position (and optionally a second position).
+ // Otherwise, simply returns the range between the given positions.
+ // Used for cursor motion and such.
+ function extendRange(doc, range, head, other) {
+ if (doc.cm && doc.cm.display.shift || doc.extend) {
+ var anchor = range.anchor;
+ if (other) {
+ var posBefore = cmp(head, anchor) < 0;
+ if (posBefore != (cmp(other, anchor) < 0)) {
+ anchor = head;
+ head = other;
+ } else if (posBefore != (cmp(head, other) < 0)) {
+ head = other;
+ }
+ }
+ return new Range(anchor, head);
+ } else {
+ return new Range(other || head, head);
+ }
+ }
+
+ // Extend the primary selection range, discard the rest.
+ function extendSelection(doc, head, other, options) {
+ setSelection(doc, new Selection([extendRange(doc, doc.sel.primary(), head, other)], 0), options);
+ }
+
+ // Extend all selections (pos is an array of selections with length
+ // equal the number of selections)
+ function extendSelections(doc, heads, options) {
+ for (var out = [], i = 0; i < doc.sel.ranges.length; i++)
+ out[i] = extendRange(doc, doc.sel.ranges[i], heads[i], null);
+ var newSel = normalizeSelection(out, doc.sel.primIndex);
+ setSelection(doc, newSel, options);
+ }
+
+ // Updates a single range in the selection.
+ function replaceOneSelection(doc, i, range, options) {
+ var ranges = doc.sel.ranges.slice(0);
+ ranges[i] = range;
+ setSelection(doc, normalizeSelection(ranges, doc.sel.primIndex), options);
+ }
+
+ // Reset the selection to a single range.
+ function setSimpleSelection(doc, anchor, head, options) {
+ setSelection(doc, simpleSelection(anchor, head), options);
+ }
+
+ // Give beforeSelectionChange handlers a change to influence a
+ // selection update.
+ function filterSelectionChange(doc, sel, options) {
+ var obj = {
+ ranges: sel.ranges,
+ update: function(ranges) {
+ this.ranges = [];
+ for (var i = 0; i < ranges.length; i++)
+ this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),
+ clipPos(doc, ranges[i].head));
+ },
+ origin: options && options.origin
+ };
+ signal(doc, "beforeSelectionChange", doc, obj);
+ if (doc.cm) signal(doc.cm, "beforeSelectionChange", doc.cm, obj);
+ if (obj.ranges != sel.ranges) return normalizeSelection(obj.ranges, obj.ranges.length - 1);
+ else return sel;
+ }
+
+ function setSelectionReplaceHistory(doc, sel, options) {
+ var done = doc.history.done, last = lst(done);
+ if (last && last.ranges) {
+ done[done.length - 1] = sel;
+ setSelectionNoUndo(doc, sel, options);
+ } else {
+ setSelection(doc, sel, options);
+ }
+ }
+
+ // Set a new selection.
+ function setSelection(doc, sel, options) {
+ setSelectionNoUndo(doc, sel, options);
+ addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);
+ }
+
+ function setSelectionNoUndo(doc, sel, options) {
+ if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange"))
+ sel = filterSelectionChange(doc, sel, options);
+
+ var bias = options && options.bias ||
+ (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);
+ setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));
+
+ if (!(options && options.scroll === false) && doc.cm)
+ ensureCursorVisible(doc.cm);
+ }
+
+ function setSelectionInner(doc, sel) {
+ if (sel.equals(doc.sel)) return;
+
+ doc.sel = sel;
+
+ if (doc.cm) {
+ doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true;
+ signalCursorActivity(doc.cm);
+ }
+ signalLater(doc, "cursorActivity", doc);
+ }
+
+ // Verify that the selection does not partially select any atomic
+ // marked ranges.
+ function reCheckSelection(doc) {
+ setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false), sel_dontScroll);
+ }
+
+ // Return a selection that does not partially select any atomic
+ // ranges.
+ function skipAtomicInSelection(doc, sel, bias, mayClear) {
+ var out;
+ for (var i = 0; i < sel.ranges.length; i++) {
+ var range = sel.ranges[i];
+ var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i];
+ var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear);
+ var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear);
+ if (out || newAnchor != range.anchor || newHead != range.head) {
+ if (!out) out = sel.ranges.slice(0, i);
+ out[i] = new Range(newAnchor, newHead);
+ }
+ }
+ return out ? normalizeSelection(out, sel.primIndex) : sel;
+ }
+
+ function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {
+ var line = getLine(doc, pos.line);
+ if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) {
+ var sp = line.markedSpans[i], m = sp.marker;
+ if ((sp.from == null || (m.inclusiveLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&
+ (sp.to == null || (m.inclusiveRight ? sp.to >= pos.ch : sp.to > pos.ch))) {
+ if (mayClear) {
+ signal(m, "beforeCursorEnter");
+ if (m.explicitlyCleared) {
+ if (!line.markedSpans) break;
+ else {--i; continue;}
+ }
+ }
+ if (!m.atomic) continue;
+
+ if (oldPos) {
+ var near = m.find(dir < 0 ? 1 : -1), diff;
+ if (dir < 0 ? m.inclusiveRight : m.inclusiveLeft)
+ near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null);
+ if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))
+ return skipAtomicInner(doc, near, pos, dir, mayClear);
+ }
+
+ var far = m.find(dir < 0 ? -1 : 1);
+ if (dir < 0 ? m.inclusiveLeft : m.inclusiveRight)
+ far = movePos(doc, far, dir, far.line == pos.line ? line : null);
+ return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null;
+ }
+ }
+ return pos;
+ }
+
+ // Ensure a given position is not inside an atomic range.
+ function skipAtomic(doc, pos, oldPos, bias, mayClear) {
+ var dir = bias || 1;
+ var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||
+ (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||
+ skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||
+ (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true));
+ if (!found) {
+ doc.cantEdit = true;
+ return Pos(doc.first, 0);
+ }
+ return found;
+ }
+
+ function movePos(doc, pos, dir, line) {
+ if (dir < 0 && pos.ch == 0) {
+ if (pos.line > doc.first) return clipPos(doc, Pos(pos.line - 1));
+ else return null;
+ } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {
+ if (pos.line < doc.first + doc.size - 1) return Pos(pos.line + 1, 0);
+ else return null;
+ } else {
+ return new Pos(pos.line, pos.ch + dir);
+ }
+ }
+
+ // SELECTION DRAWING
+
+ function updateSelection(cm) {
+ cm.display.input.showSelection(cm.display.input.prepareSelection());
+ }
+
+ function prepareSelection(cm, primary) {
+ var doc = cm.doc, result = {};
+ var curFragment = result.cursors = document.createDocumentFragment();
+ var selFragment = result.selection = document.createDocumentFragment();
+
+ for (var i = 0; i < doc.sel.ranges.length; i++) {
+ if (primary === false && i == doc.sel.primIndex) continue;
+ var range = doc.sel.ranges[i];
+ if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) continue;
+ var collapsed = range.empty();
+ if (collapsed || cm.options.showCursorWhenSelecting)
+ drawSelectionCursor(cm, range.head, curFragment);
+ if (!collapsed)
+ drawSelectionRange(cm, range, selFragment);
+ }
+ return result;
+ }
+
+ // Draws a cursor for the given range
+ function drawSelectionCursor(cm, head, output) {
+ var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine);
+
+ var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor"));
+ cursor.style.left = pos.left + "px";
+ cursor.style.top = pos.top + "px";
+ cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px";
+
+ if (pos.other) {
+ // Secondary cursor, shown when on a 'jump' in bi-directional text
+ var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor"));
+ otherCursor.style.display = "";
+ otherCursor.style.left = pos.other.left + "px";
+ otherCursor.style.top = pos.other.top + "px";
+ otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px";
+ }
+ }
+
+ // Draws the given range as a highlighted selection
+ function drawSelectionRange(cm, range, output) {
+ var display = cm.display, doc = cm.doc;
+ var fragment = document.createDocumentFragment();
+ var padding = paddingH(cm.display), leftSide = padding.left;
+ var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;
+
+ function add(left, top, width, bottom) {
+ if (top < 0) top = 0;
+ top = Math.round(top);
+ bottom = Math.round(bottom);
+ fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left +
+ "px; top: " + top + "px; width: " + (width == null ? rightSide - left : width) +
+ "px; height: " + (bottom - top) + "px"));
+ }
+
+ function drawForLine(line, fromArg, toArg) {
+ var lineObj = getLine(doc, line);
+ var lineLen = lineObj.text.length;
+ var start, end;
+ function coords(ch, bias) {
+ return charCoords(cm, Pos(line, ch), "div", lineObj, bias);
+ }
+
+ iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) {
+ var leftPos = coords(from, "left"), rightPos, left, right;
+ if (from == to) {
+ rightPos = leftPos;
+ left = right = leftPos.left;
+ } else {
+ rightPos = coords(to - 1, "right");
+ if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }
+ left = leftPos.left;
+ right = rightPos.right;
+ }
+ if (fromArg == null && from == 0) left = leftSide;
+ if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part
+ add(left, leftPos.top, null, leftPos.bottom);
+ left = leftSide;
+ if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);
+ }
+ if (toArg == null && to == lineLen) right = rightSide;
+ if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)
+ start = leftPos;
+ if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)
+ end = rightPos;
+ if (left < leftSide + 1) left = leftSide;
+ add(left, rightPos.top, right - left, rightPos.bottom);
+ });
+ return {start: start, end: end};
+ }
+
+ var sFrom = range.from(), sTo = range.to();
+ if (sFrom.line == sTo.line) {
+ drawForLine(sFrom.line, sFrom.ch, sTo.ch);
+ } else {
+ var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);
+ var singleVLine = visualLine(fromLine) == visualLine(toLine);
+ var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;
+ var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;
+ if (singleVLine) {
+ if (leftEnd.top < rightStart.top - 2) {
+ add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);
+ add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);
+ } else {
+ add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);
+ }
+ }
+ if (leftEnd.bottom < rightStart.top)
+ add(leftSide, leftEnd.bottom, null, rightStart.top);
+ }
+
+ output.appendChild(fragment);
+ }
+
+ // Cursor-blinking
+ function restartBlink(cm) {
+ if (!cm.state.focused) return;
+ var display = cm.display;
+ clearInterval(display.blinker);
+ var on = true;
+ display.cursorDiv.style.visibility = "";
+ if (cm.options.cursorBlinkRate > 0)
+ display.blinker = setInterval(function() {
+ display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden";
+ }, cm.options.cursorBlinkRate);
+ else if (cm.options.cursorBlinkRate < 0)
+ display.cursorDiv.style.visibility = "hidden";
+ }
+
+ // HIGHLIGHT WORKER
+
+ function startWorker(cm, time) {
+ if (cm.doc.mode.startState && cm.doc.frontier < cm.display.viewTo)
+ cm.state.highlight.set(time, bind(highlightWorker, cm));
+ }
+
+ function highlightWorker(cm) {
+ var doc = cm.doc;
+ if (doc.frontier < doc.first) doc.frontier = doc.first;
+ if (doc.frontier >= cm.display.viewTo) return;
+ var end = +new Date + cm.options.workTime;
+ var state = copyState(doc.mode, getStateBefore(cm, doc.frontier));
+ var changedLines = [];
+
+ doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function(line) {
+ if (doc.frontier >= cm.display.viewFrom) { // Visible
+ var oldStyles = line.styles, tooLong = line.text.length > cm.options.maxHighlightLength;
+ var highlighted = highlightLine(cm, line, tooLong ? copyState(doc.mode, state) : state, true);
+ line.styles = highlighted.styles;
+ var oldCls = line.styleClasses, newCls = highlighted.classes;
+ if (newCls) line.styleClasses = newCls;
+ else if (oldCls) line.styleClasses = null;
+ var ischange = !oldStyles || oldStyles.length != line.styles.length ||
+ oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);
+ for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i];
+ if (ischange) changedLines.push(doc.frontier);
+ line.stateAfter = tooLong ? state : copyState(doc.mode, state);
+ } else {
+ if (line.text.length <= cm.options.maxHighlightLength)
+ processLine(cm, line.text, state);
+ line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null;
+ }
+ ++doc.frontier;
+ if (+new Date > end) {
+ startWorker(cm, cm.options.workDelay);
+ return true;
+ }
+ });
+ if (changedLines.length) runInOp(cm, function() {
+ for (var i = 0; i < changedLines.length; i++)
+ regLineChange(cm, changedLines[i], "text");
+ });
+ }
+
+ // Finds the line to start with when starting a parse. Tries to
+ // find a line with a stateAfter, so that it can start with a
+ // valid state. If that fails, it returns the line with the
+ // smallest indentation, which tends to need the least context to
+ // parse correctly.
+ function findStartLine(cm, n, precise) {
+ var minindent, minline, doc = cm.doc;
+ var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);
+ for (var search = n; search > lim; --search) {
+ if (search <= doc.first) return doc.first;
+ var line = getLine(doc, search - 1);
+ if (line.stateAfter && (!precise || search <= doc.frontier)) return search;
+ var indented = countColumn(line.text, null, cm.options.tabSize);
+ if (minline == null || minindent > indented) {
+ minline = search - 1;
+ minindent = indented;
+ }
+ }
+ return minline;
+ }
+
+ function getStateBefore(cm, n, precise) {
+ var doc = cm.doc, display = cm.display;
+ if (!doc.mode.startState) return true;
+ var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter;
+ if (!state) state = startState(doc.mode);
+ else state = copyState(doc.mode, state);
+ doc.iter(pos, n, function(line) {
+ processLine(cm, line.text, state);
+ var save = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo;
+ line.stateAfter = save ? copyState(doc.mode, state) : null;
+ ++pos;
+ });
+ if (precise) doc.frontier = pos;
+ return state;
+ }
+
+ // POSITION MEASUREMENT
+
+ function paddingTop(display) {return display.lineSpace.offsetTop;}
+ function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;}
+ function paddingH(display) {
+ if (display.cachedPaddingH) return display.cachedPaddingH;
+ var e = removeChildrenAndAdd(display.measure, elt("pre", "x"));
+ var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;
+ var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};
+ if (!isNaN(data.left) && !isNaN(data.right)) display.cachedPaddingH = data;
+ return data;
+ }
+
+ function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth; }
+ function displayWidth(cm) {
+ return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth;
+ }
+ function displayHeight(cm) {
+ return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight;
+ }
+
+ // Ensure the lineView.wrapping.heights array is populated. This is
+ // an array of bottom offsets for the lines that make up a drawn
+ // line. When lineWrapping is on, there might be more than one
+ // height.
+ function ensureLineHeights(cm, lineView, rect) {
+ var wrapping = cm.options.lineWrapping;
+ var curWidth = wrapping && displayWidth(cm);
+ if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {
+ var heights = lineView.measure.heights = [];
+ if (wrapping) {
+ lineView.measure.width = curWidth;
+ var rects = lineView.text.firstChild.getClientRects();
+ for (var i = 0; i < rects.length - 1; i++) {
+ var cur = rects[i], next = rects[i + 1];
+ if (Math.abs(cur.bottom - next.bottom) > 2)
+ heights.push((cur.bottom + next.top) / 2 - rect.top);
+ }
+ }
+ heights.push(rect.bottom - rect.top);
+ }
+ }
+
+ // Find a line map (mapping character offsets to text nodes) and a
+ // measurement cache for the given line number. (A line view might
+ // contain multiple lines when collapsed ranges are present.)
+ function mapFromLineView(lineView, line, lineN) {
+ if (lineView.line == line)
+ return {map: lineView.measure.map, cache: lineView.measure.cache};
+ for (var i = 0; i < lineView.rest.length; i++)
+ if (lineView.rest[i] == line)
+ return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]};
+ for (var i = 0; i < lineView.rest.length; i++)
+ if (lineNo(lineView.rest[i]) > lineN)
+ return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i], before: true};
+ }
+
+ // Render a line into the hidden node display.externalMeasured. Used
+ // when measurement is needed for a line that's not in the viewport.
+ function updateExternalMeasurement(cm, line) {
+ line = visualLine(line);
+ var lineN = lineNo(line);
+ var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);
+ view.lineN = lineN;
+ var built = view.built = buildLineContent(cm, view);
+ view.text = built.pre;
+ removeChildrenAndAdd(cm.display.lineMeasure, built.pre);
+ return view;
+ }
+
+ // Get a {top, bottom, left, right} box (in line-local coordinates)
+ // for a given character.
+ function measureChar(cm, line, ch, bias) {
+ return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias);
+ }
+
+ // Find a line view that corresponds to the given line number.
+ function findViewForLine(cm, lineN) {
+ if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)
+ return cm.display.view[findViewIndex(cm, lineN)];
+ var ext = cm.display.externalMeasured;
+ if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)
+ return ext;
+ }
+
+ // Measurement can be split in two steps, the set-up work that
+ // applies to the whole line, and the measurement of the actual
+ // character. Functions like coordsChar, that need to do a lot of
+ // measurements in a row, can thus ensure that the set-up work is
+ // only done once.
+ function prepareMeasureForLine(cm, line) {
+ var lineN = lineNo(line);
+ var view = findViewForLine(cm, lineN);
+ if (view && !view.text) {
+ view = null;
+ } else if (view && view.changes) {
+ updateLineForChanges(cm, view, lineN, getDimensions(cm));
+ cm.curOp.forceUpdate = true;
+ }
+ if (!view)
+ view = updateExternalMeasurement(cm, line);
+
+ var info = mapFromLineView(view, line, lineN);
+ return {
+ line: line, view: view, rect: null,
+ map: info.map, cache: info.cache, before: info.before,
+ hasHeights: false
+ };
+ }
+
+ // Given a prepared measurement object, measures the position of an
+ // actual character (or fetches it from the cache).
+ function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
+ if (prepared.before) ch = -1;
+ var key = ch + (bias || ""), found;
+ if (prepared.cache.hasOwnProperty(key)) {
+ found = prepared.cache[key];
+ } else {
+ if (!prepared.rect)
+ prepared.rect = prepared.view.text.getBoundingClientRect();
+ if (!prepared.hasHeights) {
+ ensureLineHeights(cm, prepared.view, prepared.rect);
+ prepared.hasHeights = true;
+ }
+ found = measureCharInner(cm, prepared, ch, bias);
+ if (!found.bogus) prepared.cache[key] = found;
+ }
+ return {left: found.left, right: found.right,
+ top: varHeight ? found.rtop : found.top,
+ bottom: varHeight ? found.rbottom : found.bottom};
+ }
+
+ var nullRect = {left: 0, right: 0, top: 0, bottom: 0};
+
+ function nodeAndOffsetInLineMap(map, ch, bias) {
+ var node, start, end, collapse;
+ // First, search the line map for the text node corresponding to,
+ // or closest to, the target character.
+ for (var i = 0; i < map.length; i += 3) {
+ var mStart = map[i], mEnd = map[i + 1];
+ if (ch < mStart) {
+ start = 0; end = 1;
+ collapse = "left";
+ } else if (ch < mEnd) {
+ start = ch - mStart;
+ end = start + 1;
+ } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {
+ end = mEnd - mStart;
+ start = end - 1;
+ if (ch >= mEnd) collapse = "right";
+ }
+ if (start != null) {
+ node = map[i + 2];
+ if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right"))
+ collapse = bias;
+ if (bias == "left" && start == 0)
+ while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {
+ node = map[(i -= 3) + 2];
+ collapse = "left";
+ }
+ if (bias == "right" && start == mEnd - mStart)
+ while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {
+ node = map[(i += 3) + 2];
+ collapse = "right";
+ }
+ break;
+ }
+ }
+ return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd};
+ }
+
+ function measureCharInner(cm, prepared, ch, bias) {
+ var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);
+ var node = place.node, start = place.start, end = place.end, collapse = place.collapse;
+
+ var rect;
+ if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.
+ for (var i = 0; i < 4; i++) { // Retry a maximum of 4 times when nonsense rectangles are returned
+ while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) --start;
+ while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) ++end;
+ if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) {
+ rect = node.parentNode.getBoundingClientRect();
+ } else if (ie && cm.options.lineWrapping) {
+ var rects = range(node, start, end).getClientRects();
+ if (rects.length)
+ rect = rects[bias == "right" ? rects.length - 1 : 0];
+ else
+ rect = nullRect;
+ } else {
+ rect = range(node, start, end).getBoundingClientRect() || nullRect;
+ }
+ if (rect.left || rect.right || start == 0) break;
+ end = start;
+ start = start - 1;
+ collapse = "right";
+ }
+ if (ie && ie_version < 11) rect = maybeUpdateRectForZooming(cm.display.measure, rect);
+ } else { // If it is a widget, simply get the box for the whole widget.
+ if (start > 0) collapse = bias = "right";
+ var rects;
+ if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)
+ rect = rects[bias == "right" ? rects.length - 1 : 0];
+ else
+ rect = node.getBoundingClientRect();
+ }
+ if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {
+ var rSpan = node.parentNode.getClientRects()[0];
+ if (rSpan)
+ rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom};
+ else
+ rect = nullRect;
+ }
+
+ var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;
+ var mid = (rtop + rbot) / 2;
+ var heights = prepared.view.measure.heights;
+ for (var i = 0; i < heights.length - 1; i++)
+ if (mid < heights[i]) break;
+ var top = i ? heights[i - 1] : 0, bot = heights[i];
+ var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left,
+ right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left,
+ top: top, bottom: bot};
+ if (!rect.left && !rect.right) result.bogus = true;
+ if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }
+
+ return result;
+ }
+
+ // Work around problem with bounding client rects on ranges being
+ // returned incorrectly when zoomed on IE10 and below.
+ function maybeUpdateRectForZooming(measure, rect) {
+ if (!window.screen || screen.logicalXDPI == null ||
+ screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))
+ return rect;
+ var scaleX = screen.logicalXDPI / screen.deviceXDPI;
+ var scaleY = screen.logicalYDPI / screen.deviceYDPI;
+ return {left: rect.left * scaleX, right: rect.right * scaleX,
+ top: rect.top * scaleY, bottom: rect.bottom * scaleY};
+ }
+
+ function clearLineMeasurementCacheFor(lineView) {
+ if (lineView.measure) {
+ lineView.measure.cache = {};
+ lineView.measure.heights = null;
+ if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)
+ lineView.measure.caches[i] = {};
+ }
+ }
+
+ function clearLineMeasurementCache(cm) {
+ cm.display.externalMeasure = null;
+ removeChildren(cm.display.lineMeasure);
+ for (var i = 0; i < cm.display.view.length; i++)
+ clearLineMeasurementCacheFor(cm.display.view[i]);
+ }
+
+ function clearCaches(cm) {
+ clearLineMeasurementCache(cm);
+ cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;
+ if (!cm.options.lineWrapping) cm.display.maxLineChanged = true;
+ cm.display.lineNumChars = null;
+ }
+
+ function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; }
+ function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; }
+
+ // Converts a {top, bottom, left, right} box from line-local
+ // coordinates into another coordinate system. Context may be one of
+ // "line", "div" (display.lineDiv), "local"/null (editor), "window",
+ // or "page".
+ function intoCoordSystem(cm, lineObj, rect, context) {
+ if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) {
+ var size = widgetHeight(lineObj.widgets[i]);
+ rect.top += size; rect.bottom += size;
+ }
+ if (context == "line") return rect;
+ if (!context) context = "local";
+ var yOff = heightAtLine(lineObj);
+ if (context == "local") yOff += paddingTop(cm.display);
+ else yOff -= cm.display.viewOffset;
+ if (context == "page" || context == "window") {
+ var lOff = cm.display.lineSpace.getBoundingClientRect();
+ yOff += lOff.top + (context == "window" ? 0 : pageScrollY());
+ var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());
+ rect.left += xOff; rect.right += xOff;
+ }
+ rect.top += yOff; rect.bottom += yOff;
+ return rect;
+ }
+
+ // Coverts a box from "div" coords to another coordinate system.
+ // Context may be "window", "page", "div", or "local"/null.
+ function fromCoordSystem(cm, coords, context) {
+ if (context == "div") return coords;
+ var left = coords.left, top = coords.top;
+ // First move into "page" coordinate system
+ if (context == "page") {
+ left -= pageScrollX();
+ top -= pageScrollY();
+ } else if (context == "local" || !context) {
+ var localBox = cm.display.sizer.getBoundingClientRect();
+ left += localBox.left;
+ top += localBox.top;
+ }
+
+ var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();
+ return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top};
+ }
+
+ function charCoords(cm, pos, context, lineObj, bias) {
+ if (!lineObj) lineObj = getLine(cm.doc, pos.line);
+ return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context);
+ }
+
+ // Returns a box for a given cursor position, which may have an
+ // 'other' property containing the position of the secondary cursor
+ // on a bidi boundary.
+ function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {
+ lineObj = lineObj || getLine(cm.doc, pos.line);
+ if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj);
+ function get(ch, right) {
+ var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight);
+ if (right) m.left = m.right; else m.right = m.left;
+ return intoCoordSystem(cm, lineObj, m, context);
+ }
+ function getBidi(ch, partPos) {
+ var part = order[partPos], right = part.level % 2;
+ if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) {
+ part = order[--partPos];
+ ch = bidiRight(part) - (part.level % 2 ? 0 : 1);
+ right = true;
+ } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) {
+ part = order[++partPos];
+ ch = bidiLeft(part) - part.level % 2;
+ right = false;
+ }
+ if (right && ch == part.to && ch > part.from) return get(ch - 1);
+ return get(ch, right);
+ }
+ var order = getOrder(lineObj), ch = pos.ch;
+ if (!order) return get(ch);
+ var partPos = getBidiPartAt(order, ch);
+ var val = getBidi(ch, partPos);
+ if (bidiOther != null) val.other = getBidi(ch, bidiOther);
+ return val;
+ }
+
+ // Used to cheaply estimate the coordinates for a position. Used for
+ // intermediate scroll updates.
+ function estimateCoords(cm, pos) {
+ var left = 0, pos = clipPos(cm.doc, pos);
+ if (!cm.options.lineWrapping) left = charWidth(cm.display) * pos.ch;
+ var lineObj = getLine(cm.doc, pos.line);
+ var top = heightAtLine(lineObj) + paddingTop(cm.display);
+ return {left: left, right: left, top: top, bottom: top + lineObj.height};
+ }
+
+ // Positions returned by coordsChar contain some extra information.
+ // xRel is the relative x position of the input coordinates compared
+ // to the found position (so xRel > 0 means the coordinates are to
+ // the right of the character position, for example). When outside
+ // is true, that means the coordinates lie outside the line's
+ // vertical range.
+ function PosWithInfo(line, ch, outside, xRel) {
+ var pos = Pos(line, ch);
+ pos.xRel = xRel;
+ if (outside) pos.outside = true;
+ return pos;
+ }
+
+ // Compute the character position closest to the given coordinates.
+ // Input must be lineSpace-local ("div" coordinate system).
+ function coordsChar(cm, x, y) {
+ var doc = cm.doc;
+ y += cm.display.viewOffset;
+ if (y < 0) return PosWithInfo(doc.first, 0, true, -1);
+ var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;
+ if (lineN > last)
+ return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1);
+ if (x < 0) x = 0;
+
+ var lineObj = getLine(doc, lineN);
+ for (;;) {
+ var found = coordsCharInner(cm, lineObj, lineN, x, y);
+ var merged = collapsedSpanAtEnd(lineObj);
+ var mergedPos = merged && merged.find(0, true);
+ if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))
+ lineN = lineNo(lineObj = mergedPos.to.line);
+ else
+ return found;
+ }
+ }
+
+ function coordsCharInner(cm, lineObj, lineNo, x, y) {
+ var innerOff = y - heightAtLine(lineObj);
+ var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth;
+ var preparedMeasure = prepareMeasureForLine(cm, lineObj);
+
+ function getX(ch) {
+ var sp = cursorCoords(cm, Pos(lineNo, ch), "line", lineObj, preparedMeasure);
+ wrongLine = true;
+ if (innerOff > sp.bottom) return sp.left - adjust;
+ else if (innerOff < sp.top) return sp.left + adjust;
+ else wrongLine = false;
+ return sp.left;
+ }
+
+ var bidi = getOrder(lineObj), dist = lineObj.text.length;
+ var from = lineLeft(lineObj), to = lineRight(lineObj);
+ var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine;
+
+ if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1);
+ // Do a binary search between these bounds.
+ for (;;) {
+ if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {
+ var ch = x < fromX || x - fromX <= toX - x ? from : to;
+ var xDiff = x - (ch == from ? fromX : toX);
+ while (isExtendingChar(lineObj.text.charAt(ch))) ++ch;
+ var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside,
+ xDiff < -1 ? -1 : xDiff > 1 ? 1 : 0);
+ return pos;
+ }
+ var step = Math.ceil(dist / 2), middle = from + step;
+ if (bidi) {
+ middle = from;
+ for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1);
+ }
+ var middleX = getX(middle);
+ if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;}
+ else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;}
+ }
+ }
+
+ var measureText;
+ // Compute the default text height.
+ function textHeight(display) {
+ if (display.cachedTextHeight != null) return display.cachedTextHeight;
+ if (measureText == null) {
+ measureText = elt("pre");
+ // Measure a bunch of lines, for browsers that compute
+ // fractional heights.
+ for (var i = 0; i < 49; ++i) {
+ measureText.appendChild(document.createTextNode("x"));
+ measureText.appendChild(elt("br"));
+ }
+ measureText.appendChild(document.createTextNode("x"));
+ }
+ removeChildrenAndAdd(display.measure, measureText);
+ var height = measureText.offsetHeight / 50;
+ if (height > 3) display.cachedTextHeight = height;
+ removeChildren(display.measure);
+ return height || 1;
+ }
+
+ // Compute the default character width.
+ function charWidth(display) {
+ if (display.cachedCharWidth != null) return display.cachedCharWidth;
+ var anchor = elt("span", "xxxxxxxxxx");
+ var pre = elt("pre", [anchor]);
+ removeChildrenAndAdd(display.measure, pre);
+ var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;
+ if (width > 2) display.cachedCharWidth = width;
+ return width || 10;
+ }
+
+ // OPERATIONS
+
+ // Operations are used to wrap a series of changes to the editor
+ // state in such a way that each change won't have to update the
+ // cursor and display (which would be awkward, slow, and
+ // error-prone). Instead, display updates are batched and then all
+ // combined and executed at once.
+
+ var operationGroup = null;
+
+ var nextOpId = 0;
+ // Start a new operation.
+ function startOperation(cm) {
+ cm.curOp = {
+ cm: cm,
+ viewChanged: false, // Flag that indicates that lines might need to be redrawn
+ startHeight: cm.doc.height, // Used to detect need to update scrollbar
+ forceUpdate: false, // Used to force a redraw
+ updateInput: null, // Whether to reset the input textarea
+ typing: false, // Whether this reset should be careful to leave existing text (for compositing)
+ changeObjs: null, // Accumulated changes, for firing change events
+ cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on
+ cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already
+ selectionChanged: false, // Whether the selection needs to be redrawn
+ updateMaxLine: false, // Set when the widest line needs to be determined anew
+ scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet
+ scrollToPos: null, // Used to scroll to a specific position
+ focus: false,
+ id: ++nextOpId // Unique ID
+ };
+ if (operationGroup) {
+ operationGroup.ops.push(cm.curOp);
+ } else {
+ cm.curOp.ownsGroup = operationGroup = {
+ ops: [cm.curOp],
+ delayedCallbacks: []
+ };
+ }
+ }
+
+ function fireCallbacksForOps(group) {
+ // Calls delayed callbacks and cursorActivity handlers until no
+ // new ones appear
+ var callbacks = group.delayedCallbacks, i = 0;
+ do {
+ for (; i < callbacks.length; i++)
+ callbacks[i].call(null);
+ for (var j = 0; j < group.ops.length; j++) {
+ var op = group.ops[j];
+ if (op.cursorActivityHandlers)
+ while (op.cursorActivityCalled < op.cursorActivityHandlers.length)
+ op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm);
+ }
+ } while (i < callbacks.length);
+ }
+
+ // Finish an operation, updating the display and signalling delayed events
+ function endOperation(cm) {
+ var op = cm.curOp, group = op.ownsGroup;
+ if (!group) return;
+
+ try { fireCallbacksForOps(group); }
+ finally {
+ operationGroup = null;
+ for (var i = 0; i < group.ops.length; i++)
+ group.ops[i].cm.curOp = null;
+ endOperations(group);
+ }
+ }
+
+ // The DOM updates done when an operation finishes are batched so
+ // that the minimum number of relayouts are required.
+ function endOperations(group) {
+ var ops = group.ops;
+ for (var i = 0; i < ops.length; i++) // Read DOM
+ endOperation_R1(ops[i]);
+ for (var i = 0; i < ops.length; i++) // Write DOM (maybe)
+ endOperation_W1(ops[i]);
+ for (var i = 0; i < ops.length; i++) // Read DOM
+ endOperation_R2(ops[i]);
+ for (var i = 0; i < ops.length; i++) // Write DOM (maybe)
+ endOperation_W2(ops[i]);
+ for (var i = 0; i < ops.length; i++) // Read DOM
+ endOperation_finish(ops[i]);
+ }
+
+ function endOperation_R1(op) {
+ var cm = op.cm, display = cm.display;
+ maybeClipScrollbars(cm);
+ if (op.updateMaxLine) findMaxLine(cm);
+
+ op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||
+ op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||
+ op.scrollToPos.to.line >= display.viewTo) ||
+ display.maxLineChanged && cm.options.lineWrapping;
+ op.update = op.mustUpdate &&
+ new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);
+ }
+
+ function endOperation_W1(op) {
+ op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);
+ }
+
+ function endOperation_R2(op) {
+ var cm = op.cm, display = cm.display;
+ if (op.updatedDisplay) updateHeightsInViewport(cm);
+
+ op.barMeasure = measureForScrollbars(cm);
+
+ // If the max line changed since it was last measured, measure it,
+ // and ensure the document's width matches it.
+ // updateDisplay_W2 will use these properties to do the actual resizing
+ if (display.maxLineChanged && !cm.options.lineWrapping) {
+ op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;
+ cm.display.sizerWidth = op.adjustWidthTo;
+ op.barMeasure.scrollWidth =
+ Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);
+ op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));
+ }
+
+ if (op.updatedDisplay || op.selectionChanged)
+ op.preparedSelection = display.input.prepareSelection();
+ }
+
+ function endOperation_W2(op) {
+ var cm = op.cm;
+
+ if (op.adjustWidthTo != null) {
+ cm.display.sizer.style.minWidth = op.adjustWidthTo + "px";
+ if (op.maxScrollLeft < cm.doc.scrollLeft)
+ setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true);
+ cm.display.maxLineChanged = false;
+ }
+
+ if (op.preparedSelection)
+ cm.display.input.showSelection(op.preparedSelection);
+ if (op.updatedDisplay || op.startHeight != cm.doc.height)
+ updateScrollbars(cm, op.barMeasure);
+ if (op.updatedDisplay)
+ setDocumentHeight(cm, op.barMeasure);
+
+ if (op.selectionChanged) restartBlink(cm);
+
+ if (cm.state.focused && op.updateInput)
+ cm.display.input.reset(op.typing);
+ if (op.focus && op.focus == activeElt() && (!document.hasFocus || document.hasFocus()))
+ ensureFocus(op.cm);
+ }
+
+ function endOperation_finish(op) {
+ var cm = op.cm, display = cm.display, doc = cm.doc;
+
+ if (op.updatedDisplay) postUpdateDisplay(cm, op.update);
+
+ // Abort mouse wheel delta measurement, when scrolling explicitly
+ if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))
+ display.wheelStartX = display.wheelStartY = null;
+
+ // Propagate the scroll position to the actual DOM scroller
+ if (op.scrollTop != null && (display.scroller.scrollTop != op.scrollTop || op.forceScroll)) {
+ doc.scrollTop = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, op.scrollTop));
+ display.scrollbars.setScrollTop(doc.scrollTop);
+ display.scroller.scrollTop = doc.scrollTop;
+ }
+ if (op.scrollLeft != null && (display.scroller.scrollLeft != op.scrollLeft || op.forceScroll)) {
+ doc.scrollLeft = Math.max(0, Math.min(display.scroller.scrollWidth - display.scroller.clientWidth, op.scrollLeft));
+ display.scrollbars.setScrollLeft(doc.scrollLeft);
+ display.scroller.scrollLeft = doc.scrollLeft;
+ alignHorizontally(cm);
+ }
+ // If we need to scroll a specific position into view, do so.
+ if (op.scrollToPos) {
+ var coords = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),
+ clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);
+ if (op.scrollToPos.isCursor && cm.state.focused) maybeScrollWindow(cm, coords);
+ }
+
+ // Fire events for markers that are hidden/unidden by editing or
+ // undoing
+ var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;
+ if (hidden) for (var i = 0; i < hidden.length; ++i)
+ if (!hidden[i].lines.length) signal(hidden[i], "hide");
+ if (unhidden) for (var i = 0; i < unhidden.length; ++i)
+ if (unhidden[i].lines.length) signal(unhidden[i], "unhide");
+
+ if (display.wrapper.offsetHeight)
+ doc.scrollTop = cm.display.scroller.scrollTop;
+
+ // Fire change events, and delayed event handlers
+ if (op.changeObjs)
+ signal(cm, "changes", cm, op.changeObjs);
+ if (op.update)
+ op.update.finish();
+ }
+
+ // Run the given function in an operation
+ function runInOp(cm, f) {
+ if (cm.curOp) return f();
+ startOperation(cm);
+ try { return f(); }
+ finally { endOperation(cm); }
+ }
+ // Wraps a function in an operation. Returns the wrapped function.
+ function operation(cm, f) {
+ return function() {
+ if (cm.curOp) return f.apply(cm, arguments);
+ startOperation(cm);
+ try { return f.apply(cm, arguments); }
+ finally { endOperation(cm); }
+ };
+ }
+ // Used to add methods to editor and doc instances, wrapping them in
+ // operations.
+ function methodOp(f) {
+ return function() {
+ if (this.curOp) return f.apply(this, arguments);
+ startOperation(this);
+ try { return f.apply(this, arguments); }
+ finally { endOperation(this); }
+ };
+ }
+ function docMethodOp(f) {
+ return function() {
+ var cm = this.cm;
+ if (!cm || cm.curOp) return f.apply(this, arguments);
+ startOperation(cm);
+ try { return f.apply(this, arguments); }
+ finally { endOperation(cm); }
+ };
+ }
+
+ // VIEW TRACKING
+
+ // These objects are used to represent the visible (currently drawn)
+ // part of the document. A LineView may correspond to multiple
+ // logical lines, if those are connected by collapsed ranges.
+ function LineView(doc, line, lineN) {
+ // The starting line
+ this.line = line;
+ // Continuing lines, if any
+ this.rest = visualLineContinued(line);
+ // Number of logical lines in this visual line
+ this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;
+ this.node = this.text = null;
+ this.hidden = lineIsHidden(doc, line);
+ }
+
+ // Create a range of LineView objects for the given lines.
+ function buildViewArray(cm, from, to) {
+ var array = [], nextPos;
+ for (var pos = from; pos < to; pos = nextPos) {
+ var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);
+ nextPos = pos + view.size;
+ array.push(view);
+ }
+ return array;
+ }
+
+ // Updates the display.view data structure for a given change to the
+ // document. From and to are in pre-change coordinates. Lendiff is
+ // the amount of lines added or subtracted by the change. This is
+ // used for changes that span multiple lines, or change the way
+ // lines are divided into visual lines. regLineChange (below)
+ // registers single-line changes.
+ function regChange(cm, from, to, lendiff) {
+ if (from == null) from = cm.doc.first;
+ if (to == null) to = cm.doc.first + cm.doc.size;
+ if (!lendiff) lendiff = 0;
+
+ var display = cm.display;
+ if (lendiff && to < display.viewTo &&
+ (display.updateLineNumbers == null || display.updateLineNumbers > from))
+ display.updateLineNumbers = from;
+
+ cm.curOp.viewChanged = true;
+
+ if (from >= display.viewTo) { // Change after
+ if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)
+ resetView(cm);
+ } else if (to <= display.viewFrom) { // Change before
+ if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {
+ resetView(cm);
+ } else {
+ display.viewFrom += lendiff;
+ display.viewTo += lendiff;
+ }
+ } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap
+ resetView(cm);
+ } else if (from <= display.viewFrom) { // Top overlap
+ var cut = viewCuttingPoint(cm, to, to + lendiff, 1);
+ if (cut) {
+ display.view = display.view.slice(cut.index);
+ display.viewFrom = cut.lineN;
+ display.viewTo += lendiff;
+ } else {
+ resetView(cm);
+ }
+ } else if (to >= display.viewTo) { // Bottom overlap
+ var cut = viewCuttingPoint(cm, from, from, -1);
+ if (cut) {
+ display.view = display.view.slice(0, cut.index);
+ display.viewTo = cut.lineN;
+ } else {
+ resetView(cm);
+ }
+ } else { // Gap in the middle
+ var cutTop = viewCuttingPoint(cm, from, from, -1);
+ var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);
+ if (cutTop && cutBot) {
+ display.view = display.view.slice(0, cutTop.index)
+ .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))
+ .concat(display.view.slice(cutBot.index));
+ display.viewTo += lendiff;
+ } else {
+ resetView(cm);
+ }
+ }
+
+ var ext = display.externalMeasured;
+ if (ext) {
+ if (to < ext.lineN)
+ ext.lineN += lendiff;
+ else if (from < ext.lineN + ext.size)
+ display.externalMeasured = null;
+ }
+ }
+
+ // Register a change to a single line. Type must be one of "text",
+ // "gutter", "class", "widget"
+ function regLineChange(cm, line, type) {
+ cm.curOp.viewChanged = true;
+ var display = cm.display, ext = cm.display.externalMeasured;
+ if (ext && line >= ext.lineN && line < ext.lineN + ext.size)
+ display.externalMeasured = null;
+
+ if (line < display.viewFrom || line >= display.viewTo) return;
+ var lineView = display.view[findViewIndex(cm, line)];
+ if (lineView.node == null) return;
+ var arr = lineView.changes || (lineView.changes = []);
+ if (indexOf(arr, type) == -1) arr.push(type);
+ }
+
+ // Clear the view.
+ function resetView(cm) {
+ cm.display.viewFrom = cm.display.viewTo = cm.doc.first;
+ cm.display.view = [];
+ cm.display.viewOffset = 0;
+ }
+
+ // Find the view element corresponding to a given line. Return null
+ // when the line isn't visible.
+ function findViewIndex(cm, n) {
+ if (n >= cm.display.viewTo) return null;
+ n -= cm.display.viewFrom;
+ if (n < 0) return null;
+ var view = cm.display.view;
+ for (var i = 0; i < view.length; i++) {
+ n -= view[i].size;
+ if (n < 0) return i;
+ }
+ }
+
+ function viewCuttingPoint(cm, oldN, newN, dir) {
+ var index = findViewIndex(cm, oldN), diff, view = cm.display.view;
+ if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)
+ return {index: index, lineN: newN};
+ for (var i = 0, n = cm.display.viewFrom; i < index; i++)
+ n += view[i].size;
+ if (n != oldN) {
+ if (dir > 0) {
+ if (index == view.length - 1) return null;
+ diff = (n + view[index].size) - oldN;
+ index++;
+ } else {
+ diff = n - oldN;
+ }
+ oldN += diff; newN += diff;
+ }
+ while (visualLineNo(cm.doc, newN) != newN) {
+ if (index == (dir < 0 ? 0 : view.length - 1)) return null;
+ newN += dir * view[index - (dir < 0 ? 1 : 0)].size;
+ index += dir;
+ }
+ return {index: index, lineN: newN};
+ }
+
+ // Force the view to cover a given range, adding empty view element
+ // or clipping off existing ones as needed.
+ function adjustView(cm, from, to) {
+ var display = cm.display, view = display.view;
+ if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {
+ display.view = buildViewArray(cm, from, to);
+ display.viewFrom = from;
+ } else {
+ if (display.viewFrom > from)
+ display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view);
+ else if (display.viewFrom < from)
+ display.view = display.view.slice(findViewIndex(cm, from));
+ display.viewFrom = from;
+ if (display.viewTo < to)
+ display.view = display.view.concat(buildViewArray(cm, display.viewTo, to));
+ else if (display.viewTo > to)
+ display.view = display.view.slice(0, findViewIndex(cm, to));
+ }
+ display.viewTo = to;
+ }
+
+ // Count the number of lines in the view whose DOM representation is
+ // out of date (or nonexistent).
+ function countDirtyView(cm) {
+ var view = cm.display.view, dirty = 0;
+ for (var i = 0; i < view.length; i++) {
+ var lineView = view[i];
+ if (!lineView.hidden && (!lineView.node || lineView.changes)) ++dirty;
+ }
+ return dirty;
+ }
+
+ // EVENT HANDLERS
+
+ // Attach the necessary event handlers when initializing the editor
+ function registerEventHandlers(cm) {
+ var d = cm.display;
+ on(d.scroller, "mousedown", operation(cm, onMouseDown));
+ // Older IE's will not fire a second mousedown for a double click
+ if (ie && ie_version < 11)
+ on(d.scroller, "dblclick", operation(cm, function(e) {
+ if (signalDOMEvent(cm, e)) return;
+ var pos = posFromMouse(cm, e);
+ if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return;
+ e_preventDefault(e);
+ var word = cm.findWordAt(pos);
+ extendSelection(cm.doc, word.anchor, word.head);
+ }));
+ else
+ on(d.scroller, "dblclick", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); });
+ // Some browsers fire contextmenu *after* opening the menu, at
+ // which point we can't mess with it anymore. Context menu is
+ // handled in onMouseDown for these browsers.
+ if (!captureRightClick) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);});
+
+ // Used to suppress mouse event handling when a touch happens
+ var touchFinished, prevTouch = {end: 0};
+ function finishTouch() {
+ if (d.activeTouch) {
+ touchFinished = setTimeout(function() {d.activeTouch = null;}, 1000);
+ prevTouch = d.activeTouch;
+ prevTouch.end = +new Date;
+ }
+ };
+ function isMouseLikeTouchEvent(e) {
+ if (e.touches.length != 1) return false;
+ var touch = e.touches[0];
+ return touch.radiusX <= 1 && touch.radiusY <= 1;
+ }
+ function farAway(touch, other) {
+ if (other.left == null) return true;
+ var dx = other.left - touch.left, dy = other.top - touch.top;
+ return dx * dx + dy * dy > 20 * 20;
+ }
+ on(d.scroller, "touchstart", function(e) {
+ if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e)) {
+ clearTimeout(touchFinished);
+ var now = +new Date;
+ d.activeTouch = {start: now, moved: false,
+ prev: now - prevTouch.end <= 300 ? prevTouch : null};
+ if (e.touches.length == 1) {
+ d.activeTouch.left = e.touches[0].pageX;
+ d.activeTouch.top = e.touches[0].pageY;
+ }
+ }
+ });
+ on(d.scroller, "touchmove", function() {
+ if (d.activeTouch) d.activeTouch.moved = true;
+ });
+ on(d.scroller, "touchend", function(e) {
+ var touch = d.activeTouch;
+ if (touch && !eventInWidget(d, e) && touch.left != null &&
+ !touch.moved && new Date - touch.start < 300) {
+ var pos = cm.coordsChar(d.activeTouch, "page"), range;
+ if (!touch.prev || farAway(touch, touch.prev)) // Single tap
+ range = new Range(pos, pos);
+ else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap
+ range = cm.findWordAt(pos);
+ else // Triple tap
+ range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0)));
+ cm.setSelection(range.anchor, range.head);
+ cm.focus();
+ e_preventDefault(e);
+ }
+ finishTouch();
+ });
+ on(d.scroller, "touchcancel", finishTouch);
+
+ // Sync scrolling between fake scrollbars and real scrollable
+ // area, ensure viewport is updated when scrolling.
+ on(d.scroller, "scroll", function() {
+ if (d.scroller.clientHeight) {
+ setScrollTop(cm, d.scroller.scrollTop);
+ setScrollLeft(cm, d.scroller.scrollLeft, true);
+ signal(cm, "scroll", cm);
+ }
+ });
+
+ // Listen to wheel events in order to try and update the viewport on time.
+ on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);});
+ on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);});
+
+ // Prevent wrapper from ever scrolling
+ on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });
+
+ d.dragFunctions = {
+ enter: function(e) {if (!signalDOMEvent(cm, e)) e_stop(e);},
+ over: function(e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},
+ start: function(e){onDragStart(cm, e);},
+ drop: operation(cm, onDrop),
+ leave: function(e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }}
+ };
+
+ var inp = d.input.getField();
+ on(inp, "keyup", function(e) { onKeyUp.call(cm, e); });
+ on(inp, "keydown", operation(cm, onKeyDown));
+ on(inp, "keypress", operation(cm, onKeyPress));
+ on(inp, "focus", bind(onFocus, cm));
+ on(inp, "blur", bind(onBlur, cm));
+ }
+
+ function dragDropChanged(cm, value, old) {
+ var wasOn = old && old != CodeMirror.Init;
+ if (!value != !wasOn) {
+ var funcs = cm.display.dragFunctions;
+ var toggle = value ? on : off;
+ toggle(cm.display.scroller, "dragstart", funcs.start);
+ toggle(cm.display.scroller, "dragenter", funcs.enter);
+ toggle(cm.display.scroller, "dragover", funcs.over);
+ toggle(cm.display.scroller, "dragleave", funcs.leave);
+ toggle(cm.display.scroller, "drop", funcs.drop);
+ }
+ }
+
+ // Called when the window resizes
+ function onResize(cm) {
+ var d = cm.display;
+ if (d.lastWrapHeight == d.wrapper.clientHeight && d.lastWrapWidth == d.wrapper.clientWidth)
+ return;
+ // Might be a text scaling operation, clear size caches.
+ d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;
+ d.scrollbarsClipped = false;
+ cm.setSize();
+ }
+
+ // MOUSE EVENTS
+
+ // Return true when the given mouse event happened in a widget
+ function eventInWidget(display, e) {
+ for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {
+ if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") ||
+ (n.parentNode == display.sizer && n != display.mover))
+ return true;
+ }
+ }
+
+ // Given a mouse event, find the corresponding position. If liberal
+ // is false, it checks whether a gutter or scrollbar was clicked,
+ // and returns null if it was. forRect is used by rectangular
+ // selections, and tries to estimate a character position even for
+ // coordinates beyond the right of the text.
+ function posFromMouse(cm, e, liberal, forRect) {
+ var display = cm.display;
+ if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") return null;
+
+ var x, y, space = display.lineSpace.getBoundingClientRect();
+ // Fails unpredictably on IE[67] when mouse is dragged around quickly.
+ try { x = e.clientX - space.left; y = e.clientY - space.top; }
+ catch (e) { return null; }
+ var coords = coordsChar(cm, x, y), line;
+ if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {
+ var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;
+ coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));
+ }
+ return coords;
+ }
+
+ // A mouse down can be a single click, double click, triple click,
+ // start of selection drag, start of text drag, new cursor
+ // (ctrl-click), rectangle drag (alt-drag), or xwin
+ // middle-click-paste. Or it might be a click on something we should
+ // not interfere with, such as a scrollbar or widget.
+ function onMouseDown(e) {
+ var cm = this, display = cm.display;
+ if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) return;
+ display.shift = e.shiftKey;
+
+ if (eventInWidget(display, e)) {
+ if (!webkit) {
+ // Briefly turn off draggability, to allow widgets to do
+ // normal dragging things.
+ display.scroller.draggable = false;
+ setTimeout(function(){display.scroller.draggable = true;}, 100);
+ }
+ return;
+ }
+ if (clickInGutter(cm, e)) return;
+ var start = posFromMouse(cm, e);
+ window.focus();
+
+ switch (e_button(e)) {
+ case 1:
+ // #3261: make sure, that we're not starting a second selection
+ if (cm.state.selectingText)
+ cm.state.selectingText(e);
+ else if (start)
+ leftButtonDown(cm, e, start);
+ else if (e_target(e) == display.scroller)
+ e_preventDefault(e);
+ break;
+ case 2:
+ if (webkit) cm.state.lastMiddleDown = +new Date;
+ if (start) extendSelection(cm.doc, start);
+ setTimeout(function() {display.input.focus();}, 20);
+ e_preventDefault(e);
+ break;
+ case 3:
+ if (captureRightClick) onContextMenu(cm, e);
+ else delayBlurEvent(cm);
+ break;
+ }
+ }
+
+ var lastClick, lastDoubleClick;
+ function leftButtonDown(cm, e, start) {
+ if (ie) setTimeout(bind(ensureFocus, cm), 0);
+ else cm.curOp.focus = activeElt();
+
+ var now = +new Date, type;
+ if (lastDoubleClick && lastDoubleClick.time > now - 400 && cmp(lastDoubleClick.pos, start) == 0) {
+ type = "triple";
+ } else if (lastClick && lastClick.time > now - 400 && cmp(lastClick.pos, start) == 0) {
+ type = "double";
+ lastDoubleClick = {time: now, pos: start};
+ } else {
+ type = "single";
+ lastClick = {time: now, pos: start};
+ }
+
+ var sel = cm.doc.sel, modifier = mac ? e.metaKey : e.ctrlKey, contained;
+ if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&
+ type == "single" && (contained = sel.contains(start)) > -1 &&
+ (cmp((contained = sel.ranges[contained]).from(), start) < 0 || start.xRel > 0) &&
+ (cmp(contained.to(), start) > 0 || start.xRel < 0))
+ leftButtonStartDrag(cm, e, start, modifier);
+ else
+ leftButtonSelect(cm, e, start, type, modifier);
+ }
+
+ // Start a text drag. When it ends, see if any dragging actually
+ // happen, and treat as a click if it didn't.
+ function leftButtonStartDrag(cm, e, start, modifier) {
+ var display = cm.display, startTime = +new Date;
+ var dragEnd = operation(cm, function(e2) {
+ if (webkit) display.scroller.draggable = false;
+ cm.state.draggingText = false;
+ off(document, "mouseup", dragEnd);
+ off(display.scroller, "drop", dragEnd);
+ if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {
+ e_preventDefault(e2);
+ if (!modifier && +new Date - 200 < startTime)
+ extendSelection(cm.doc, start);
+ // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)
+ if (webkit || ie && ie_version == 9)
+ setTimeout(function() {document.body.focus(); display.input.focus();}, 20);
+ else
+ display.input.focus();
+ }
+ });
+ // Let the drag handler handle this.
+ if (webkit) display.scroller.draggable = true;
+ cm.state.draggingText = dragEnd;
+ // IE's approach to draggable
+ if (display.scroller.dragDrop) display.scroller.dragDrop();
+ on(document, "mouseup", dragEnd);
+ on(display.scroller, "drop", dragEnd);
+ }
+
+ // Normal selection, as opposed to text dragging.
+ function leftButtonSelect(cm, e, start, type, addNew) {
+ var display = cm.display, doc = cm.doc;
+ e_preventDefault(e);
+
+ var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;
+ if (addNew && !e.shiftKey) {
+ ourIndex = doc.sel.contains(start);
+ if (ourIndex > -1)
+ ourRange = ranges[ourIndex];
+ else
+ ourRange = new Range(start, start);
+ } else {
+ ourRange = doc.sel.primary();
+ ourIndex = doc.sel.primIndex;
+ }
+
+ if (e.altKey) {
+ type = "rect";
+ if (!addNew) ourRange = new Range(start, start);
+ start = posFromMouse(cm, e, true, true);
+ ourIndex = -1;
+ } else if (type == "double") {
+ var word = cm.findWordAt(start);
+ if (cm.display.shift || doc.extend)
+ ourRange = extendRange(doc, ourRange, word.anchor, word.head);
+ else
+ ourRange = word;
+ } else if (type == "triple") {
+ var line = new Range(Pos(start.line, 0), clipPos(doc, Pos(start.line + 1, 0)));
+ if (cm.display.shift || doc.extend)
+ ourRange = extendRange(doc, ourRange, line.anchor, line.head);
+ else
+ ourRange = line;
+ } else {
+ ourRange = extendRange(doc, ourRange, start);
+ }
+
+ if (!addNew) {
+ ourIndex = 0;
+ setSelection(doc, new Selection([ourRange], 0), sel_mouse);
+ startSel = doc.sel;
+ } else if (ourIndex == -1) {
+ ourIndex = ranges.length;
+ setSelection(doc, normalizeSelection(ranges.concat([ourRange]), ourIndex),
+ {scroll: false, origin: "*mouse"});
+ } else if (ranges.length > 1 && ranges[ourIndex].empty() && type == "single" && !e.shiftKey) {
+ setSelection(doc, normalizeSelection(ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),
+ {scroll: false, origin: "*mouse"});
+ startSel = doc.sel;
+ } else {
+ replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);
+ }
+
+ var lastPos = start;
+ function extendTo(pos) {
+ if (cmp(lastPos, pos) == 0) return;
+ lastPos = pos;
+
+ if (type == "rect") {
+ var ranges = [], tabSize = cm.options.tabSize;
+ var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);
+ var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);
+ var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);
+ for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));
+ line <= end; line++) {
+ var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);
+ if (left == right)
+ ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos)));
+ else if (text.length > leftPos)
+ ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize))));
+ }
+ if (!ranges.length) ranges.push(new Range(start, start));
+ setSelection(doc, normalizeSelection(startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),
+ {origin: "*mouse", scroll: false});
+ cm.scrollIntoView(pos);
+ } else {
+ var oldRange = ourRange;
+ var anchor = oldRange.anchor, head = pos;
+ if (type != "single") {
+ if (type == "double")
+ var range = cm.findWordAt(pos);
+ else
+ var range = new Range(Pos(pos.line, 0), clipPos(doc, Pos(pos.line + 1, 0)));
+ if (cmp(range.anchor, anchor) > 0) {
+ head = range.head;
+ anchor = minPos(oldRange.from(), range.anchor);
+ } else {
+ head = range.anchor;
+ anchor = maxPos(oldRange.to(), range.head);
+ }
+ }
+ var ranges = startSel.ranges.slice(0);
+ ranges[ourIndex] = new Range(clipPos(doc, anchor), head);
+ setSelection(doc, normalizeSelection(ranges, ourIndex), sel_mouse);
+ }
+ }
+
+ var editorSize = display.wrapper.getBoundingClientRect();
+ // Used to ensure timeout re-tries don't fire when another extend
+ // happened in the meantime (clearTimeout isn't reliable -- at
+ // least on Chrome, the timeouts still happen even when cleared,
+ // if the clear happens after their scheduled firing time).
+ var counter = 0;
+
+ function extend(e) {
+ var curCount = ++counter;
+ var cur = posFromMouse(cm, e, true, type == "rect");
+ if (!cur) return;
+ if (cmp(cur, lastPos) != 0) {
+ cm.curOp.focus = activeElt();
+ extendTo(cur);
+ var visible = visibleLines(display, doc);
+ if (cur.line >= visible.to || cur.line < visible.from)
+ setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150);
+ } else {
+ var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;
+ if (outside) setTimeout(operation(cm, function() {
+ if (counter != curCount) return;
+ display.scroller.scrollTop += outside;
+ extend(e);
+ }), 50);
+ }
+ }
+
+ function done(e) {
+ cm.state.selectingText = false;
+ counter = Infinity;
+ e_preventDefault(e);
+ display.input.focus();
+ off(document, "mousemove", move);
+ off(document, "mouseup", up);
+ doc.history.lastSelOrigin = null;
+ }
+
+ var move = operation(cm, function(e) {
+ if (!e_button(e)) done(e);
+ else extend(e);
+ });
+ var up = operation(cm, done);
+ cm.state.selectingText = up;
+ on(document, "mousemove", move);
+ on(document, "mouseup", up);
+ }
+
+ // Determines whether an event happened in the gutter, and fires the
+ // handlers for the corresponding event.
+ function gutterEvent(cm, e, type, prevent) {
+ try { var mX = e.clientX, mY = e.clientY; }
+ catch(e) { return false; }
+ if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) return false;
+ if (prevent) e_preventDefault(e);
+
+ var display = cm.display;
+ var lineBox = display.lineDiv.getBoundingClientRect();
+
+ if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e);
+ mY -= lineBox.top - display.viewOffset;
+
+ for (var i = 0; i < cm.options.gutters.length; ++i) {
+ var g = display.gutters.childNodes[i];
+ if (g && g.getBoundingClientRect().right >= mX) {
+ var line = lineAtHeight(cm.doc, mY);
+ var gutter = cm.options.gutters[i];
+ signal(cm, type, cm, line, gutter, e);
+ return e_defaultPrevented(e);
+ }
+ }
+ }
+
+ function clickInGutter(cm, e) {
+ return gutterEvent(cm, e, "gutterClick", true);
+ }
+
+ // Kludge to work around strange IE behavior where it'll sometimes
+ // re-fire a series of drag-related events right after the drop (#1551)
+ var lastDrop = 0;
+
+ function onDrop(e) {
+ var cm = this;
+ clearDragCursor(cm);
+ if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))
+ return;
+ e_preventDefault(e);
+ if (ie) lastDrop = +new Date;
+ var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;
+ if (!pos || cm.isReadOnly()) return;
+ // Might be a file drop, in which case we simply extract the text
+ // and insert it.
+ if (files && files.length && window.FileReader && window.File) {
+ var n = files.length, text = Array(n), read = 0;
+ var loadFile = function(file, i) {
+ if (cm.options.allowDropFileTypes &&
+ indexOf(cm.options.allowDropFileTypes, file.type) == -1)
+ return;
+
+ var reader = new FileReader;
+ reader.onload = operation(cm, function() {
+ var content = reader.result;
+ if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) content = "";
+ text[i] = content;
+ if (++read == n) {
+ pos = clipPos(cm.doc, pos);
+ var change = {from: pos, to: pos,
+ text: cm.doc.splitLines(text.join(cm.doc.lineSeparator())),
+ origin: "paste"};
+ makeChange(cm.doc, change);
+ setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change)));
+ }
+ });
+ reader.readAsText(file);
+ };
+ for (var i = 0; i < n; ++i) loadFile(files[i], i);
+ } else { // Normal drop
+ // Don't do a replace if the drop happened inside of the selected text.
+ if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {
+ cm.state.draggingText(e);
+ // Ensure the editor is re-focused
+ setTimeout(function() {cm.display.input.focus();}, 20);
+ return;
+ }
+ try {
+ var text = e.dataTransfer.getData("Text");
+ if (text) {
+ if (cm.state.draggingText && !(mac ? e.altKey : e.ctrlKey))
+ var selected = cm.listSelections();
+ setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));
+ if (selected) for (var i = 0; i < selected.length; ++i)
+ replaceRange(cm.doc, "", selected[i].anchor, selected[i].head, "drag");
+ cm.replaceSelection(text, "around", "paste");
+ cm.display.input.focus();
+ }
+ }
+ catch(e){}
+ }
+ }
+
+ function onDragStart(cm, e) {
+ if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }
+ if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;
+
+ e.dataTransfer.setData("Text", cm.getSelection());
+
+ // Use dummy image instead of default browsers image.
+ // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
+ if (e.dataTransfer.setDragImage && !safari) {
+ var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");
+ img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
+ if (presto) {
+ img.width = img.height = 1;
+ cm.display.wrapper.appendChild(img);
+ // Force a relayout, or Opera won't use our image for some obscure reason
+ img._top = img.offsetTop;
+ }
+ e.dataTransfer.setDragImage(img, 0, 0);
+ if (presto) img.parentNode.removeChild(img);
+ }
+ }
+
+ function onDragOver(cm, e) {
+ var pos = posFromMouse(cm, e);
+ if (!pos) return;
+ var frag = document.createDocumentFragment();
+ drawSelectionCursor(cm, pos, frag);
+ if (!cm.display.dragCursor) {
+ cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors");
+ cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv);
+ }
+ removeChildrenAndAdd(cm.display.dragCursor, frag);
+ }
+
+ function clearDragCursor(cm) {
+ if (cm.display.dragCursor) {
+ cm.display.lineSpace.removeChild(cm.display.dragCursor);
+ cm.display.dragCursor = null;
+ }
+ }
+
+ // SCROLL EVENTS
+
+ // Sync the scrollable area and scrollbars, ensure the viewport
+ // covers the visible area.
+ function setScrollTop(cm, val) {
+ if (Math.abs(cm.doc.scrollTop - val) < 2) return;
+ cm.doc.scrollTop = val;
+ if (!gecko) updateDisplaySimple(cm, {top: val});
+ if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val;
+ cm.display.scrollbars.setScrollTop(val);
+ if (gecko) updateDisplaySimple(cm);
+ startWorker(cm, 100);
+ }
+ // Sync scroller and scrollbar, ensure the gutter elements are
+ // aligned.
+ function setScrollLeft(cm, val, isScroller) {
+ if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return;
+ val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);
+ cm.doc.scrollLeft = val;
+ alignHorizontally(cm);
+ if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val;
+ cm.display.scrollbars.setScrollLeft(val);
+ }
+
+ // Since the delta values reported on mouse wheel events are
+ // unstandardized between browsers and even browser versions, and
+ // generally horribly unpredictable, this code starts by measuring
+ // the scroll effect that the first few mouse wheel events have,
+ // and, from that, detects the way it can convert deltas to pixel
+ // offsets afterwards.
+ //
+ // The reason we want to know the amount a wheel event will scroll
+ // is that it gives us a chance to update the display before the
+ // actual scrolling happens, reducing flickering.
+
+ var wheelSamples = 0, wheelPixelsPerUnit = null;
+ // Fill in a browser-detected starting value on browsers where we
+ // know one. These don't have to be accurate -- the result of them
+ // being wrong would just be a slight flicker on the first wheel
+ // scroll (if it is large enough).
+ if (ie) wheelPixelsPerUnit = -.53;
+ else if (gecko) wheelPixelsPerUnit = 15;
+ else if (chrome) wheelPixelsPerUnit = -.7;
+ else if (safari) wheelPixelsPerUnit = -1/3;
+
+ var wheelEventDelta = function(e) {
+ var dx = e.wheelDeltaX, dy = e.wheelDeltaY;
+ if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail;
+ if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail;
+ else if (dy == null) dy = e.wheelDelta;
+ return {x: dx, y: dy};
+ };
+ CodeMirror.wheelEventPixels = function(e) {
+ var delta = wheelEventDelta(e);
+ delta.x *= wheelPixelsPerUnit;
+ delta.y *= wheelPixelsPerUnit;
+ return delta;
+ };
+
+ function onScrollWheel(cm, e) {
+ var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;
+
+ var display = cm.display, scroll = display.scroller;
+ // Quit if there's nothing to scroll here
+ var canScrollX = scroll.scrollWidth > scroll.clientWidth;
+ var canScrollY = scroll.scrollHeight > scroll.clientHeight;
+ if (!(dx && canScrollX || dy && canScrollY)) return;
+
+ // Webkit browsers on OS X abort momentum scrolls when the target
+ // of the scroll event is removed from the scrollable element.
+ // This hack (see related code in patchDisplay) makes sure the
+ // element is kept around.
+ if (dy && mac && webkit) {
+ outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {
+ for (var i = 0; i < view.length; i++) {
+ if (view[i].node == cur) {
+ cm.display.currentWheelTarget = cur;
+ break outer;
+ }
+ }
+ }
+ }
+
+ // On some browsers, horizontal scrolling will cause redraws to
+ // happen before the gutter has been realigned, causing it to
+ // wriggle around in a most unseemly way. When we have an
+ // estimated pixels/delta value, we just handle horizontal
+ // scrolling entirely here. It'll be slightly off from native, but
+ // better than glitching out.
+ if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {
+ if (dy && canScrollY)
+ setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight)));
+ setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth)));
+ // Only prevent default scrolling if vertical scrolling is
+ // actually possible. Otherwise, it causes vertical scroll
+ // jitter on OSX trackpads when deltaX is small and deltaY
+ // is large (issue #3579)
+ if (!dy || (dy && canScrollY))
+ e_preventDefault(e);
+ display.wheelStartX = null; // Abort measurement, if in progress
+ return;
+ }
+
+ // 'Project' the visible viewport to cover the area that is being
+ // scrolled into view (if we know enough to estimate it).
+ if (dy && wheelPixelsPerUnit != null) {
+ var pixels = dy * wheelPixelsPerUnit;
+ var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;
+ if (pixels < 0) top = Math.max(0, top + pixels - 50);
+ else bot = Math.min(cm.doc.height, bot + pixels + 50);
+ updateDisplaySimple(cm, {top: top, bottom: bot});
+ }
+
+ if (wheelSamples < 20) {
+ if (display.wheelStartX == null) {
+ display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;
+ display.wheelDX = dx; display.wheelDY = dy;
+ setTimeout(function() {
+ if (display.wheelStartX == null) return;
+ var movedX = scroll.scrollLeft - display.wheelStartX;
+ var movedY = scroll.scrollTop - display.wheelStartY;
+ var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||
+ (movedX && display.wheelDX && movedX / display.wheelDX);
+ display.wheelStartX = display.wheelStartY = null;
+ if (!sample) return;
+ wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);
+ ++wheelSamples;
+ }, 200);
+ } else {
+ display.wheelDX += dx; display.wheelDY += dy;
+ }
+ }
+ }
+
+ // KEY EVENTS
+
+ // Run a handler that was bound to a key.
+ function doHandleBinding(cm, bound, dropShift) {
+ if (typeof bound == "string") {
+ bound = commands[bound];
+ if (!bound) return false;
+ }
+ // Ensure previous input has been read, so that the handler sees a
+ // consistent view of the document
+ cm.display.input.ensurePolled();
+ var prevShift = cm.display.shift, done = false;
+ try {
+ if (cm.isReadOnly()) cm.state.suppressEdits = true;
+ if (dropShift) cm.display.shift = false;
+ done = bound(cm) != Pass;
+ } finally {
+ cm.display.shift = prevShift;
+ cm.state.suppressEdits = false;
+ }
+ return done;
+ }
+
+ function lookupKeyForEditor(cm, name, handle) {
+ for (var i = 0; i < cm.state.keyMaps.length; i++) {
+ var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);
+ if (result) return result;
+ }
+ return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))
+ || lookupKey(name, cm.options.keyMap, handle, cm);
+ }
+
+ var stopSeq = new Delayed;
+ function dispatchKey(cm, name, e, handle) {
+ var seq = cm.state.keySeq;
+ if (seq) {
+ if (isModifierKey(name)) return "handled";
+ stopSeq.set(50, function() {
+ if (cm.state.keySeq == seq) {
+ cm.state.keySeq = null;
+ cm.display.input.reset();
+ }
+ });
+ name = seq + " " + name;
+ }
+ var result = lookupKeyForEditor(cm, name, handle);
+
+ if (result == "multi")
+ cm.state.keySeq = name;
+ if (result == "handled")
+ signalLater(cm, "keyHandled", cm, name, e);
+
+ if (result == "handled" || result == "multi") {
+ e_preventDefault(e);
+ restartBlink(cm);
+ }
+
+ if (seq && !result && /\'$/.test(name)) {
+ e_preventDefault(e);
+ return true;
+ }
+ return !!result;
+ }
+
+ // Handle a key from the keydown event.
+ function handleKeyBinding(cm, e) {
+ var name = keyName(e, true);
+ if (!name) return false;
+
+ if (e.shiftKey && !cm.state.keySeq) {
+ // First try to resolve full name (including 'Shift-'). Failing
+ // that, see if there is a cursor-motion command (starting with
+ // 'go') bound to the keyname without 'Shift-'.
+ return dispatchKey(cm, "Shift-" + name, e, function(b) {return doHandleBinding(cm, b, true);})
+ || dispatchKey(cm, name, e, function(b) {
+ if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion)
+ return doHandleBinding(cm, b);
+ });
+ } else {
+ return dispatchKey(cm, name, e, function(b) { return doHandleBinding(cm, b); });
+ }
+ }
+
+ // Handle a key from the keypress event
+ function handleCharBinding(cm, e, ch) {
+ return dispatchKey(cm, "'" + ch + "'", e,
+ function(b) { return doHandleBinding(cm, b, true); });
+ }
+
+ var lastStoppedKey = null;
+ function onKeyDown(e) {
+ var cm = this;
+ cm.curOp.focus = activeElt();
+ if (signalDOMEvent(cm, e)) return;
+ // IE does strange things with escape.
+ if (ie && ie_version < 11 && e.keyCode == 27) e.returnValue = false;
+ var code = e.keyCode;
+ cm.display.shift = code == 16 || e.shiftKey;
+ var handled = handleKeyBinding(cm, e);
+ if (presto) {
+ lastStoppedKey = handled ? code : null;
+ // Opera has no cut event... we try to at least catch the key combo
+ if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))
+ cm.replaceSelection("", null, "cut");
+ }
+
+ // Turn mouse into crosshair when Alt is held on Mac.
+ if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className))
+ showCrossHair(cm);
+ }
+
+ function showCrossHair(cm) {
+ var lineDiv = cm.display.lineDiv;
+ addClass(lineDiv, "CodeMirror-crosshair");
+
+ function up(e) {
+ if (e.keyCode == 18 || !e.altKey) {
+ rmClass(lineDiv, "CodeMirror-crosshair");
+ off(document, "keyup", up);
+ off(document, "mouseover", up);
+ }
+ }
+ on(document, "keyup", up);
+ on(document, "mouseover", up);
+ }
+
+ function onKeyUp(e) {
+ if (e.keyCode == 16) this.doc.sel.shift = false;
+ signalDOMEvent(this, e);
+ }
+
+ function onKeyPress(e) {
+ var cm = this;
+ if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) return;
+ var keyCode = e.keyCode, charCode = e.charCode;
+ if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}
+ if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) return;
+ var ch = String.fromCharCode(charCode == null ? keyCode : charCode);
+ if (handleCharBinding(cm, e, ch)) return;
+ cm.display.input.onKeyPress(e);
+ }
+
+ // FOCUS/BLUR EVENTS
+
+ function delayBlurEvent(cm) {
+ cm.state.delayingBlurEvent = true;
+ setTimeout(function() {
+ if (cm.state.delayingBlurEvent) {
+ cm.state.delayingBlurEvent = false;
+ onBlur(cm);
+ }
+ }, 100);
+ }
+
+ function onFocus(cm) {
+ if (cm.state.delayingBlurEvent) cm.state.delayingBlurEvent = false;
+
+ if (cm.options.readOnly == "nocursor") return;
+ if (!cm.state.focused) {
+ signal(cm, "focus", cm);
+ cm.state.focused = true;
+ addClass(cm.display.wrapper, "CodeMirror-focused");
+ // This test prevents this from firing when a context
+ // menu is closed (since the input reset would kill the
+ // select-all detection hack)
+ if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {
+ cm.display.input.reset();
+ if (webkit) setTimeout(function() { cm.display.input.reset(true); }, 20); // Issue #1730
+ }
+ cm.display.input.receivedFocus();
+ }
+ restartBlink(cm);
+ }
+ function onBlur(cm) {
+ if (cm.state.delayingBlurEvent) return;
+
+ if (cm.state.focused) {
+ signal(cm, "blur", cm);
+ cm.state.focused = false;
+ rmClass(cm.display.wrapper, "CodeMirror-focused");
+ }
+ clearInterval(cm.display.blinker);
+ setTimeout(function() {if (!cm.state.focused) cm.display.shift = false;}, 150);
+ }
+
+ // CONTEXT MENU HANDLING
+
+ // To make the context menu work, we need to briefly unhide the
+ // textarea (making it as unobtrusive as possible) to let the
+ // right-click take effect on it.
+ function onContextMenu(cm, e) {
+ if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) return;
+ if (signalDOMEvent(cm, e, "contextmenu")) return;
+ cm.display.input.onContextMenu(e);
+ }
+
+ function contextMenuInGutter(cm, e) {
+ if (!hasHandler(cm, "gutterContextMenu")) return false;
+ return gutterEvent(cm, e, "gutterContextMenu", false);
+ }
+
+ // UPDATING
+
+ // Compute the position of the end of a change (its 'to' property
+ // refers to the pre-change end).
+ var changeEnd = CodeMirror.changeEnd = function(change) {
+ if (!change.text) return change.to;
+ return Pos(change.from.line + change.text.length - 1,
+ lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0));
+ };
+
+ // Adjust a position to refer to the post-change position of the
+ // same text, or the end of the change if the change covers it.
+ function adjustForChange(pos, change) {
+ if (cmp(pos, change.from) < 0) return pos;
+ if (cmp(pos, change.to) <= 0) return changeEnd(change);
+
+ var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;
+ if (pos.line == change.to.line) ch += changeEnd(change).ch - change.to.ch;
+ return Pos(line, ch);
+ }
+
+ function computeSelAfterChange(doc, change) {
+ var out = [];
+ for (var i = 0; i < doc.sel.ranges.length; i++) {
+ var range = doc.sel.ranges[i];
+ out.push(new Range(adjustForChange(range.anchor, change),
+ adjustForChange(range.head, change)));
+ }
+ return normalizeSelection(out, doc.sel.primIndex);
+ }
+
+ function offsetPos(pos, old, nw) {
+ if (pos.line == old.line)
+ return Pos(nw.line, pos.ch - old.ch + nw.ch);
+ else
+ return Pos(nw.line + (pos.line - old.line), pos.ch);
+ }
+
+ // Used by replaceSelections to allow moving the selection to the
+ // start or around the replaced test. Hint may be "start" or "around".
+ function computeReplacedSel(doc, changes, hint) {
+ var out = [];
+ var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;
+ for (var i = 0; i < changes.length; i++) {
+ var change = changes[i];
+ var from = offsetPos(change.from, oldPrev, newPrev);
+ var to = offsetPos(changeEnd(change), oldPrev, newPrev);
+ oldPrev = change.to;
+ newPrev = to;
+ if (hint == "around") {
+ var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;
+ out[i] = new Range(inv ? to : from, inv ? from : to);
+ } else {
+ out[i] = new Range(from, from);
+ }
+ }
+ return new Selection(out, doc.sel.primIndex);
+ }
+
+ // Allow "beforeChange" event handlers to influence a change
+ function filterChange(doc, change, update) {
+ var obj = {
+ canceled: false,
+ from: change.from,
+ to: change.to,
+ text: change.text,
+ origin: change.origin,
+ cancel: function() { this.canceled = true; }
+ };
+ if (update) obj.update = function(from, to, text, origin) {
+ if (from) this.from = clipPos(doc, from);
+ if (to) this.to = clipPos(doc, to);
+ if (text) this.text = text;
+ if (origin !== undefined) this.origin = origin;
+ };
+ signal(doc, "beforeChange", doc, obj);
+ if (doc.cm) signal(doc.cm, "beforeChange", doc.cm, obj);
+
+ if (obj.canceled) return null;
+ return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin};
+ }
+
+ // Apply a change to a document, and add it to the document's
+ // history, and propagating it to all linked documents.
+ function makeChange(doc, change, ignoreReadOnly) {
+ if (doc.cm) {
+ if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly);
+ if (doc.cm.state.suppressEdits) return;
+ }
+
+ if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) {
+ change = filterChange(doc, change, true);
+ if (!change) return;
+ }
+
+ // Possibly split or suppress the update based on the presence
+ // of read-only spans in its range.
+ var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);
+ if (split) {
+ for (var i = split.length - 1; i >= 0; --i)
+ makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text});
+ } else {
+ makeChangeInner(doc, change);
+ }
+ }
+
+ function makeChangeInner(doc, change) {
+ if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) return;
+ var selAfter = computeSelAfterChange(doc, change);
+ addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);
+
+ makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));
+ var rebased = [];
+
+ linkedDocs(doc, function(doc, sharedHist) {
+ if (!sharedHist && indexOf(rebased, doc.history) == -1) {
+ rebaseHist(doc.history, change);
+ rebased.push(doc.history);
+ }
+ makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));
+ });
+ }
+
+ // Revert a change stored in a document's history.
+ function makeChangeFromHistory(doc, type, allowSelectionOnly) {
+ if (doc.cm && doc.cm.state.suppressEdits) return;
+
+ var hist = doc.history, event, selAfter = doc.sel;
+ var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done;
+
+ // Verify that there is a useable event (so that ctrl-z won't
+ // needlessly clear selection events)
+ for (var i = 0; i < source.length; i++) {
+ event = source[i];
+ if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)
+ break;
+ }
+ if (i == source.length) return;
+ hist.lastOrigin = hist.lastSelOrigin = null;
+
+ for (;;) {
+ event = source.pop();
+ if (event.ranges) {
+ pushSelectionToHistory(event, dest);
+ if (allowSelectionOnly && !event.equals(doc.sel)) {
+ setSelection(doc, event, {clearRedo: false});
+ return;
+ }
+ selAfter = event;
+ }
+ else break;
+ }
+
+ // Build up a reverse change object to add to the opposite history
+ // stack (redo when undoing, and vice versa).
+ var antiChanges = [];
+ pushSelectionToHistory(selAfter, dest);
+ dest.push({changes: antiChanges, generation: hist.generation});
+ hist.generation = event.generation || ++hist.maxGeneration;
+
+ var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange");
+
+ for (var i = event.changes.length - 1; i >= 0; --i) {
+ var change = event.changes[i];
+ change.origin = type;
+ if (filter && !filterChange(doc, change, false)) {
+ source.length = 0;
+ return;
+ }
+
+ antiChanges.push(historyChangeFromChange(doc, change));
+
+ var after = i ? computeSelAfterChange(doc, change) : lst(source);
+ makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));
+ if (!i && doc.cm) doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)});
+ var rebased = [];
+
+ // Propagate to the linked documents
+ linkedDocs(doc, function(doc, sharedHist) {
+ if (!sharedHist && indexOf(rebased, doc.history) == -1) {
+ rebaseHist(doc.history, change);
+ rebased.push(doc.history);
+ }
+ makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));
+ });
+ }
+ }
+
+ // Sub-views need their line numbers shifted when text is added
+ // above or below them in the parent document.
+ function shiftDoc(doc, distance) {
+ if (distance == 0) return;
+ doc.first += distance;
+ doc.sel = new Selection(map(doc.sel.ranges, function(range) {
+ return new Range(Pos(range.anchor.line + distance, range.anchor.ch),
+ Pos(range.head.line + distance, range.head.ch));
+ }), doc.sel.primIndex);
+ if (doc.cm) {
+ regChange(doc.cm, doc.first, doc.first - distance, distance);
+ for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)
+ regLineChange(doc.cm, l, "gutter");
+ }
+ }
+
+ // More lower-level change function, handling only a single document
+ // (not linked ones).
+ function makeChangeSingleDoc(doc, change, selAfter, spans) {
+ if (doc.cm && !doc.cm.curOp)
+ return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans);
+
+ if (change.to.line < doc.first) {
+ shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));
+ return;
+ }
+ if (change.from.line > doc.lastLine()) return;
+
+ // Clip the change to the size of this doc
+ if (change.from.line < doc.first) {
+ var shift = change.text.length - 1 - (doc.first - change.from.line);
+ shiftDoc(doc, shift);
+ change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),
+ text: [lst(change.text)], origin: change.origin};
+ }
+ var last = doc.lastLine();
+ if (change.to.line > last) {
+ change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),
+ text: [change.text[0]], origin: change.origin};
+ }
+
+ change.removed = getBetween(doc, change.from, change.to);
+
+ if (!selAfter) selAfter = computeSelAfterChange(doc, change);
+ if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans);
+ else updateDoc(doc, change, spans);
+ setSelectionNoUndo(doc, selAfter, sel_dontScroll);
+ }
+
+ // Handle the interaction of a change to a document with the editor
+ // that this document is part of.
+ function makeChangeSingleDocInEditor(cm, change, spans) {
+ var doc = cm.doc, display = cm.display, from = change.from, to = change.to;
+
+ var recomputeMaxLength = false, checkWidthStart = from.line;
+ if (!cm.options.lineWrapping) {
+ checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));
+ doc.iter(checkWidthStart, to.line + 1, function(line) {
+ if (line == display.maxLine) {
+ recomputeMaxLength = true;
+ return true;
+ }
+ });
+ }
+
+ if (doc.sel.contains(change.from, change.to) > -1)
+ signalCursorActivity(cm);
+
+ updateDoc(doc, change, spans, estimateHeight(cm));
+
+ if (!cm.options.lineWrapping) {
+ doc.iter(checkWidthStart, from.line + change.text.length, function(line) {
+ var len = lineLength(line);
+ if (len > display.maxLineLength) {
+ display.maxLine = line;
+ display.maxLineLength = len;
+ display.maxLineChanged = true;
+ recomputeMaxLength = false;
+ }
+ });
+ if (recomputeMaxLength) cm.curOp.updateMaxLine = true;
+ }
+
+ // Adjust frontier, schedule worker
+ doc.frontier = Math.min(doc.frontier, from.line);
+ startWorker(cm, 400);
+
+ var lendiff = change.text.length - (to.line - from.line) - 1;
+ // Remember that these lines changed, for updating the display
+ if (change.full)
+ regChange(cm);
+ else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))
+ regLineChange(cm, from.line, "text");
+ else
+ regChange(cm, from.line, to.line + 1, lendiff);
+
+ var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change");
+ if (changeHandler || changesHandler) {
+ var obj = {
+ from: from, to: to,
+ text: change.text,
+ removed: change.removed,
+ origin: change.origin
+ };
+ if (changeHandler) signalLater(cm, "change", cm, obj);
+ if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj);
+ }
+ cm.display.selForContextMenu = null;
+ }
+
+ function replaceRange(doc, code, from, to, origin) {
+ if (!to) to = from;
+ if (cmp(to, from) < 0) { var tmp = to; to = from; from = tmp; }
+ if (typeof code == "string") code = doc.splitLines(code);
+ makeChange(doc, {from: from, to: to, text: code, origin: origin});
+ }
+
+ // SCROLLING THINGS INTO VIEW
+
+ // If an editor sits on the top or bottom of the window, partially
+ // scrolled out of view, this ensures that the cursor is visible.
+ function maybeScrollWindow(cm, coords) {
+ if (signalDOMEvent(cm, "scrollCursorIntoView")) return;
+
+ var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;
+ if (coords.top + box.top < 0) doScroll = true;
+ else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false;
+ if (doScroll != null && !phantom) {
+ var scrollNode = elt("div", "\u200b", null, "position: absolute; top: " +
+ (coords.top - display.viewOffset - paddingTop(cm.display)) + "px; height: " +
+ (coords.bottom - coords.top + scrollGap(cm) + display.barHeight) + "px; left: " +
+ coords.left + "px; width: 2px;");
+ cm.display.lineSpace.appendChild(scrollNode);
+ scrollNode.scrollIntoView(doScroll);
+ cm.display.lineSpace.removeChild(scrollNode);
+ }
+ }
+
+ // Scroll a given position into view (immediately), verifying that
+ // it actually became visible (as line heights are accurately
+ // measured, the position of something may 'drift' during drawing).
+ function scrollPosIntoView(cm, pos, end, margin) {
+ if (margin == null) margin = 0;
+ for (var limit = 0; limit < 5; limit++) {
+ var changed = false, coords = cursorCoords(cm, pos);
+ var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);
+ var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left),
+ Math.min(coords.top, endCoords.top) - margin,
+ Math.max(coords.left, endCoords.left),
+ Math.max(coords.bottom, endCoords.bottom) + margin);
+ var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;
+ if (scrollPos.scrollTop != null) {
+ setScrollTop(cm, scrollPos.scrollTop);
+ if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true;
+ }
+ if (scrollPos.scrollLeft != null) {
+ setScrollLeft(cm, scrollPos.scrollLeft);
+ if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true;
+ }
+ if (!changed) break;
+ }
+ return coords;
+ }
+
+ // Scroll a given set of coordinates into view (immediately).
+ function scrollIntoView(cm, x1, y1, x2, y2) {
+ var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2);
+ if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop);
+ if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft);
+ }
+
+ // Calculate a new scroll position needed to scroll the given
+ // rectangle into view. Returns an object with scrollTop and
+ // scrollLeft properties. When these are undefined, the
+ // vertical/horizontal position does not need to be adjusted.
+ function calculateScrollPos(cm, x1, y1, x2, y2) {
+ var display = cm.display, snapMargin = textHeight(cm.display);
+ if (y1 < 0) y1 = 0;
+ var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;
+ var screen = displayHeight(cm), result = {};
+ if (y2 - y1 > screen) y2 = y1 + screen;
+ var docBottom = cm.doc.height + paddingVert(display);
+ var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin;
+ if (y1 < screentop) {
+ result.scrollTop = atTop ? 0 : y1;
+ } else if (y2 > screentop + screen) {
+ var newTop = Math.min(y1, (atBottom ? docBottom : y2) - screen);
+ if (newTop != screentop) result.scrollTop = newTop;
+ }
+
+ var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;
+ var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0);
+ var tooWide = x2 - x1 > screenw;
+ if (tooWide) x2 = x1 + screenw;
+ if (x1 < 10)
+ result.scrollLeft = 0;
+ else if (x1 < screenleft)
+ result.scrollLeft = Math.max(0, x1 - (tooWide ? 0 : 10));
+ else if (x2 > screenw + screenleft - 3)
+ result.scrollLeft = x2 + (tooWide ? 0 : 10) - screenw;
+ return result;
+ }
+
+ // Store a relative adjustment to the scroll position in the current
+ // operation (to be applied when the operation finishes).
+ function addToScrollPos(cm, left, top) {
+ if (left != null || top != null) resolveScrollToPos(cm);
+ if (left != null)
+ cm.curOp.scrollLeft = (cm.curOp.scrollLeft == null ? cm.doc.scrollLeft : cm.curOp.scrollLeft) + left;
+ if (top != null)
+ cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;
+ }
+
+ // Make sure that at the end of the operation the current cursor is
+ // shown.
+ function ensureCursorVisible(cm) {
+ resolveScrollToPos(cm);
+ var cur = cm.getCursor(), from = cur, to = cur;
+ if (!cm.options.lineWrapping) {
+ from = cur.ch ? Pos(cur.line, cur.ch - 1) : cur;
+ to = Pos(cur.line, cur.ch + 1);
+ }
+ cm.curOp.scrollToPos = {from: from, to: to, margin: cm.options.cursorScrollMargin, isCursor: true};
+ }
+
+ // When an operation has its scrollToPos property set, and another
+ // scroll action is applied before the end of the operation, this
+ // 'simulates' scrolling that position into view in a cheap way, so
+ // that the effect of intermediate scroll commands is not ignored.
+ function resolveScrollToPos(cm) {
+ var range = cm.curOp.scrollToPos;
+ if (range) {
+ cm.curOp.scrollToPos = null;
+ var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);
+ var sPos = calculateScrollPos(cm, Math.min(from.left, to.left),
+ Math.min(from.top, to.top) - range.margin,
+ Math.max(from.right, to.right),
+ Math.max(from.bottom, to.bottom) + range.margin);
+ cm.scrollTo(sPos.scrollLeft, sPos.scrollTop);
+ }
+ }
+
+ // API UTILITIES
+
+ // Indent the given line. The how parameter can be "smart",
+ // "add"/null, "subtract", or "prev". When aggressive is false
+ // (typically set to true for forced single-line indents), empty
+ // lines are not indented, and places where the mode returns Pass
+ // are left alone.
+ function indentLine(cm, n, how, aggressive) {
+ var doc = cm.doc, state;
+ if (how == null) how = "add";
+ if (how == "smart") {
+ // Fall back to "prev" when the mode doesn't have an indentation
+ // method.
+ if (!doc.mode.indent) how = "prev";
+ else state = getStateBefore(cm, n);
+ }
+
+ var tabSize = cm.options.tabSize;
+ var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);
+ if (line.stateAfter) line.stateAfter = null;
+ var curSpaceString = line.text.match(/^\s*/)[0], indentation;
+ if (!aggressive && !/\S/.test(line.text)) {
+ indentation = 0;
+ how = "not";
+ } else if (how == "smart") {
+ indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);
+ if (indentation == Pass || indentation > 150) {
+ if (!aggressive) return;
+ how = "prev";
+ }
+ }
+ if (how == "prev") {
+ if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize);
+ else indentation = 0;
+ } else if (how == "add") {
+ indentation = curSpace + cm.options.indentUnit;
+ } else if (how == "subtract") {
+ indentation = curSpace - cm.options.indentUnit;
+ } else if (typeof how == "number") {
+ indentation = curSpace + how;
+ }
+ indentation = Math.max(0, indentation);
+
+ var indentString = "", pos = 0;
+ if (cm.options.indentWithTabs)
+ for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";}
+ if (pos < indentation) indentString += spaceStr(indentation - pos);
+
+ if (indentString != curSpaceString) {
+ replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input");
+ line.stateAfter = null;
+ return true;
+ } else {
+ // Ensure that, if the cursor was in the whitespace at the start
+ // of the line, it is moved to the end of that space.
+ for (var i = 0; i < doc.sel.ranges.length; i++) {
+ var range = doc.sel.ranges[i];
+ if (range.head.line == n && range.head.ch < curSpaceString.length) {
+ var pos = Pos(n, curSpaceString.length);
+ replaceOneSelection(doc, i, new Range(pos, pos));
+ break;
+ }
+ }
+ }
+ }
+
+ // Utility for applying a change to a line by handle or number,
+ // returning the number and optionally registering the line as
+ // changed.
+ function changeLine(doc, handle, changeType, op) {
+ var no = handle, line = handle;
+ if (typeof handle == "number") line = getLine(doc, clipLine(doc, handle));
+ else no = lineNo(handle);
+ if (no == null) return null;
+ if (op(line, no) && doc.cm) regLineChange(doc.cm, no, changeType);
+ return line;
+ }
+
+ // Helper for deleting text near the selection(s), used to implement
+ // backspace, delete, and similar functionality.
+ function deleteNearSelection(cm, compute) {
+ var ranges = cm.doc.sel.ranges, kill = [];
+ // Build up a set of ranges to kill first, merging overlapping
+ // ranges.
+ for (var i = 0; i < ranges.length; i++) {
+ var toKill = compute(ranges[i]);
+ while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {
+ var replaced = kill.pop();
+ if (cmp(replaced.from, toKill.from) < 0) {
+ toKill.from = replaced.from;
+ break;
+ }
+ }
+ kill.push(toKill);
+ }
+ // Next, remove those actual ranges.
+ runInOp(cm, function() {
+ for (var i = kill.length - 1; i >= 0; i--)
+ replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete");
+ ensureCursorVisible(cm);
+ });
+ }
+
+ // Used for horizontal relative motion. Dir is -1 or 1 (left or
+ // right), unit can be "char", "column" (like char, but doesn't
+ // cross line boundaries), "word" (across next word), or "group" (to
+ // the start of next group of word or non-word-non-whitespace
+ // chars). The visually param controls whether, in right-to-left
+ // text, direction 1 means to move towards the next index in the
+ // string, or towards the character to the right of the current
+ // position. The resulting position will have a hitSide=true
+ // property if it reached the end of the document.
+ function findPosH(doc, pos, dir, unit, visually) {
+ var line = pos.line, ch = pos.ch, origDir = dir;
+ var lineObj = getLine(doc, line);
+ function findNextLine() {
+ var l = line + dir;
+ if (l < doc.first || l >= doc.first + doc.size) return false
+ line = l;
+ return lineObj = getLine(doc, l);
+ }
+ function moveOnce(boundToLine) {
+ var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true);
+ if (next == null) {
+ if (!boundToLine && findNextLine()) {
+ if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj);
+ else ch = dir < 0 ? lineObj.text.length : 0;
+ } else return false
+ } else ch = next;
+ return true;
+ }
+
+ if (unit == "char") {
+ moveOnce()
+ } else if (unit == "column") {
+ moveOnce(true)
+ } else if (unit == "word" || unit == "group") {
+ var sawType = null, group = unit == "group";
+ var helper = doc.cm && doc.cm.getHelper(pos, "wordChars");
+ for (var first = true;; first = false) {
+ if (dir < 0 && !moveOnce(!first)) break;
+ var cur = lineObj.text.charAt(ch) || "\n";
+ var type = isWordChar(cur, helper) ? "w"
+ : group && cur == "\n" ? "n"
+ : !group || /\s/.test(cur) ? null
+ : "p";
+ if (group && !first && !type) type = "s";
+ if (sawType && sawType != type) {
+ if (dir < 0) {dir = 1; moveOnce();}
+ break;
+ }
+
+ if (type) sawType = type;
+ if (dir > 0 && !moveOnce(!first)) break;
+ }
+ }
+ var result = skipAtomic(doc, Pos(line, ch), pos, origDir, true);
+ if (!cmp(pos, result)) result.hitSide = true;
+ return result;
+ }
+
+ // For relative vertical movement. Dir may be -1 or 1. Unit can be
+ // "page" or "line". The resulting position will have a hitSide=true
+ // property if it reached the end of the document.
+ function findPosV(cm, pos, dir, unit) {
+ var doc = cm.doc, x = pos.left, y;
+ if (unit == "page") {
+ var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);
+ y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display));
+ } else if (unit == "line") {
+ y = dir > 0 ? pos.bottom + 3 : pos.top - 3;
+ }
+ for (;;) {
+ var target = coordsChar(cm, x, y);
+ if (!target.outside) break;
+ if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; }
+ y += dir * 5;
+ }
+ return target;
+ }
+
+ // EDITOR METHODS
+
+ // The publicly visible API. Note that methodOp(f) means
+ // 'wrap f in an operation, performed on its `this` parameter'.
+
+ // This is not the complete set of editor methods. Most of the
+ // methods defined on the Doc type are also injected into
+ // CodeMirror.prototype, for backwards compatibility and
+ // convenience.
+
+ CodeMirror.prototype = {
+ constructor: CodeMirror,
+ focus: function(){window.focus(); this.display.input.focus();},
+
+ setOption: function(option, value) {
+ var options = this.options, old = options[option];
+ if (options[option] == value && option != "mode") return;
+ options[option] = value;
+ if (optionHandlers.hasOwnProperty(option))
+ operation(this, optionHandlers[option])(this, value, old);
+ },
+
+ getOption: function(option) {return this.options[option];},
+ getDoc: function() {return this.doc;},
+
+ addKeyMap: function(map, bottom) {
+ this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map));
+ },
+ removeKeyMap: function(map) {
+ var maps = this.state.keyMaps;
+ for (var i = 0; i < maps.length; ++i)
+ if (maps[i] == map || maps[i].name == map) {
+ maps.splice(i, 1);
+ return true;
+ }
+ },
+
+ addOverlay: methodOp(function(spec, options) {
+ var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);
+ if (mode.startState) throw new Error("Overlays may not be stateful.");
+ this.state.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque});
+ this.state.modeGen++;
+ regChange(this);
+ }),
+ removeOverlay: methodOp(function(spec) {
+ var overlays = this.state.overlays;
+ for (var i = 0; i < overlays.length; ++i) {
+ var cur = overlays[i].modeSpec;
+ if (cur == spec || typeof spec == "string" && cur.name == spec) {
+ overlays.splice(i, 1);
+ this.state.modeGen++;
+ regChange(this);
+ return;
+ }
+ }
+ }),
+
+ indentLine: methodOp(function(n, dir, aggressive) {
+ if (typeof dir != "string" && typeof dir != "number") {
+ if (dir == null) dir = this.options.smartIndent ? "smart" : "prev";
+ else dir = dir ? "add" : "subtract";
+ }
+ if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive);
+ }),
+ indentSelection: methodOp(function(how) {
+ var ranges = this.doc.sel.ranges, end = -1;
+ for (var i = 0; i < ranges.length; i++) {
+ var range = ranges[i];
+ if (!range.empty()) {
+ var from = range.from(), to = range.to();
+ var start = Math.max(end, from.line);
+ end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;
+ for (var j = start; j < end; ++j)
+ indentLine(this, j, how);
+ var newRanges = this.doc.sel.ranges;
+ if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)
+ replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll);
+ } else if (range.head.line > end) {
+ indentLine(this, range.head.line, how, true);
+ end = range.head.line;
+ if (i == this.doc.sel.primIndex) ensureCursorVisible(this);
+ }
+ }
+ }),
+
+ // Fetch the parser token for a given character. Useful for hacks
+ // that want to inspect the mode state (say, for completion).
+ getTokenAt: function(pos, precise) {
+ return takeToken(this, pos, precise);
+ },
+
+ getLineTokens: function(line, precise) {
+ return takeToken(this, Pos(line), precise, true);
+ },
+
+ getTokenTypeAt: function(pos) {
+ pos = clipPos(this.doc, pos);
+ var styles = getLineStyles(this, getLine(this.doc, pos.line));
+ var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;
+ var type;
+ if (ch == 0) type = styles[2];
+ else for (;;) {
+ var mid = (before + after) >> 1;
+ if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;
+ else if (styles[mid * 2 + 1] < ch) before = mid + 1;
+ else { type = styles[mid * 2 + 2]; break; }
+ }
+ var cut = type ? type.indexOf("cm-overlay ") : -1;
+ return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1);
+ },
+
+ getModeAt: function(pos) {
+ var mode = this.doc.mode;
+ if (!mode.innerMode) return mode;
+ return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode;
+ },
+
+ getHelper: function(pos, type) {
+ return this.getHelpers(pos, type)[0];
+ },
+
+ getHelpers: function(pos, type) {
+ var found = [];
+ if (!helpers.hasOwnProperty(type)) return found;
+ var help = helpers[type], mode = this.getModeAt(pos);
+ if (typeof mode[type] == "string") {
+ if (help[mode[type]]) found.push(help[mode[type]]);
+ } else if (mode[type]) {
+ for (var i = 0; i < mode[type].length; i++) {
+ var val = help[mode[type][i]];
+ if (val) found.push(val);
+ }
+ } else if (mode.helperType && help[mode.helperType]) {
+ found.push(help[mode.helperType]);
+ } else if (help[mode.name]) {
+ found.push(help[mode.name]);
+ }
+ for (var i = 0; i < help._global.length; i++) {
+ var cur = help._global[i];
+ if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)
+ found.push(cur.val);
+ }
+ return found;
+ },
+
+ getStateAfter: function(line, precise) {
+ var doc = this.doc;
+ line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);
+ return getStateBefore(this, line + 1, precise);
+ },
+
+ cursorCoords: function(start, mode) {
+ var pos, range = this.doc.sel.primary();
+ if (start == null) pos = range.head;
+ else if (typeof start == "object") pos = clipPos(this.doc, start);
+ else pos = start ? range.from() : range.to();
+ return cursorCoords(this, pos, mode || "page");
+ },
+
+ charCoords: function(pos, mode) {
+ return charCoords(this, clipPos(this.doc, pos), mode || "page");
+ },
+
+ coordsChar: function(coords, mode) {
+ coords = fromCoordSystem(this, coords, mode || "page");
+ return coordsChar(this, coords.left, coords.top);
+ },
+
+ lineAtHeight: function(height, mode) {
+ height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top;
+ return lineAtHeight(this.doc, height + this.display.viewOffset);
+ },
+ heightAtLine: function(line, mode) {
+ var end = false, lineObj;
+ if (typeof line == "number") {
+ var last = this.doc.first + this.doc.size - 1;
+ if (line < this.doc.first) line = this.doc.first;
+ else if (line > last) { line = last; end = true; }
+ lineObj = getLine(this.doc, line);
+ } else {
+ lineObj = line;
+ }
+ return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page").top +
+ (end ? this.doc.height - heightAtLine(lineObj) : 0);
+ },
+
+ defaultTextHeight: function() { return textHeight(this.display); },
+ defaultCharWidth: function() { return charWidth(this.display); },
+
+ setGutterMarker: methodOp(function(line, gutterID, value) {
+ return changeLine(this.doc, line, "gutter", function(line) {
+ var markers = line.gutterMarkers || (line.gutterMarkers = {});
+ markers[gutterID] = value;
+ if (!value && isEmpty(markers)) line.gutterMarkers = null;
+ return true;
+ });
+ }),
+
+ clearGutter: methodOp(function(gutterID) {
+ var cm = this, doc = cm.doc, i = doc.first;
+ doc.iter(function(line) {
+ if (line.gutterMarkers && line.gutterMarkers[gutterID]) {
+ line.gutterMarkers[gutterID] = null;
+ regLineChange(cm, i, "gutter");
+ if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null;
+ }
+ ++i;
+ });
+ }),
+
+ lineInfo: function(line) {
+ if (typeof line == "number") {
+ if (!isLine(this.doc, line)) return null;
+ var n = line;
+ line = getLine(this.doc, line);
+ if (!line) return null;
+ } else {
+ var n = lineNo(line);
+ if (n == null) return null;
+ }
+ return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,
+ textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,
+ widgets: line.widgets};
+ },
+
+ getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo};},
+
+ addWidget: function(pos, node, scroll, vert, horiz) {
+ var display = this.display;
+ pos = cursorCoords(this, clipPos(this.doc, pos));
+ var top = pos.bottom, left = pos.left;
+ node.style.position = "absolute";
+ node.setAttribute("cm-ignore-events", "true");
+ this.display.input.setUneditable(node);
+ display.sizer.appendChild(node);
+ if (vert == "over") {
+ top = pos.top;
+ } else if (vert == "above" || vert == "near") {
+ var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),
+ hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);
+ // Default to positioning above (if specified and possible); otherwise default to positioning below
+ if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)
+ top = pos.top - node.offsetHeight;
+ else if (pos.bottom + node.offsetHeight <= vspace)
+ top = pos.bottom;
+ if (left + node.offsetWidth > hspace)
+ left = hspace - node.offsetWidth;
+ }
+ node.style.top = top + "px";
+ node.style.left = node.style.right = "";
+ if (horiz == "right") {
+ left = display.sizer.clientWidth - node.offsetWidth;
+ node.style.right = "0px";
+ } else {
+ if (horiz == "left") left = 0;
+ else if (horiz == "middle") left = (display.sizer.clientWidth - node.offsetWidth) / 2;
+ node.style.left = left + "px";
+ }
+ if (scroll)
+ scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight);
+ },
+
+ triggerOnKeyDown: methodOp(onKeyDown),
+ triggerOnKeyPress: methodOp(onKeyPress),
+ triggerOnKeyUp: onKeyUp,
+
+ execCommand: function(cmd) {
+ if (commands.hasOwnProperty(cmd))
+ return commands[cmd].call(null, this);
+ },
+
+ triggerElectric: methodOp(function(text) { triggerElectric(this, text); }),
+
+ findPosH: function(from, amount, unit, visually) {
+ var dir = 1;
+ if (amount < 0) { dir = -1; amount = -amount; }
+ for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {
+ cur = findPosH(this.doc, cur, dir, unit, visually);
+ if (cur.hitSide) break;
+ }
+ return cur;
+ },
+
+ moveH: methodOp(function(dir, unit) {
+ var cm = this;
+ cm.extendSelectionsBy(function(range) {
+ if (cm.display.shift || cm.doc.extend || range.empty())
+ return findPosH(cm.doc, range.head, dir, unit, cm.options.rtlMoveVisually);
+ else
+ return dir < 0 ? range.from() : range.to();
+ }, sel_move);
+ }),
+
+ deleteH: methodOp(function(dir, unit) {
+ var sel = this.doc.sel, doc = this.doc;
+ if (sel.somethingSelected())
+ doc.replaceSelection("", null, "+delete");
+ else
+ deleteNearSelection(this, function(range) {
+ var other = findPosH(doc, range.head, dir, unit, false);
+ return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other};
+ });
+ }),
+
+ findPosV: function(from, amount, unit, goalColumn) {
+ var dir = 1, x = goalColumn;
+ if (amount < 0) { dir = -1; amount = -amount; }
+ for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {
+ var coords = cursorCoords(this, cur, "div");
+ if (x == null) x = coords.left;
+ else coords.left = x;
+ cur = findPosV(this, coords, dir, unit);
+ if (cur.hitSide) break;
+ }
+ return cur;
+ },
+
+ moveV: methodOp(function(dir, unit) {
+ var cm = this, doc = this.doc, goals = [];
+ var collapse = !cm.display.shift && !doc.extend && doc.sel.somethingSelected();
+ doc.extendSelectionsBy(function(range) {
+ if (collapse)
+ return dir < 0 ? range.from() : range.to();
+ var headPos = cursorCoords(cm, range.head, "div");
+ if (range.goalColumn != null) headPos.left = range.goalColumn;
+ goals.push(headPos.left);
+ var pos = findPosV(cm, headPos, dir, unit);
+ if (unit == "page" && range == doc.sel.primary())
+ addToScrollPos(cm, null, charCoords(cm, pos, "div").top - headPos.top);
+ return pos;
+ }, sel_move);
+ if (goals.length) for (var i = 0; i < doc.sel.ranges.length; i++)
+ doc.sel.ranges[i].goalColumn = goals[i];
+ }),
+
+ // Find the word at the given position (as returned by coordsChar).
+ findWordAt: function(pos) {
+ var doc = this.doc, line = getLine(doc, pos.line).text;
+ var start = pos.ch, end = pos.ch;
+ if (line) {
+ var helper = this.getHelper(pos, "wordChars");
+ if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end;
+ var startChar = line.charAt(start);
+ var check = isWordChar(startChar, helper)
+ ? function(ch) { return isWordChar(ch, helper); }
+ : /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);}
+ : function(ch) {return !/\s/.test(ch) && !isWordChar(ch);};
+ while (start > 0 && check(line.charAt(start - 1))) --start;
+ while (end < line.length && check(line.charAt(end))) ++end;
+ }
+ return new Range(Pos(pos.line, start), Pos(pos.line, end));
+ },
+
+ toggleOverwrite: function(value) {
+ if (value != null && value == this.state.overwrite) return;
+ if (this.state.overwrite = !this.state.overwrite)
+ addClass(this.display.cursorDiv, "CodeMirror-overwrite");
+ else
+ rmClass(this.display.cursorDiv, "CodeMirror-overwrite");
+
+ signal(this, "overwriteToggle", this, this.state.overwrite);
+ },
+ hasFocus: function() { return this.display.input.getField() == activeElt(); },
+ isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit); },
+
+ scrollTo: methodOp(function(x, y) {
+ if (x != null || y != null) resolveScrollToPos(this);
+ if (x != null) this.curOp.scrollLeft = x;
+ if (y != null) this.curOp.scrollTop = y;
+ }),
+ getScrollInfo: function() {
+ var scroller = this.display.scroller;
+ return {left: scroller.scrollLeft, top: scroller.scrollTop,
+ height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,
+ width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,
+ clientHeight: displayHeight(this), clientWidth: displayWidth(this)};
+ },
+
+ scrollIntoView: methodOp(function(range, margin) {
+ if (range == null) {
+ range = {from: this.doc.sel.primary().head, to: null};
+ if (margin == null) margin = this.options.cursorScrollMargin;
+ } else if (typeof range == "number") {
+ range = {from: Pos(range, 0), to: null};
+ } else if (range.from == null) {
+ range = {from: range, to: null};
+ }
+ if (!range.to) range.to = range.from;
+ range.margin = margin || 0;
+
+ if (range.from.line != null) {
+ resolveScrollToPos(this);
+ this.curOp.scrollToPos = range;
+ } else {
+ var sPos = calculateScrollPos(this, Math.min(range.from.left, range.to.left),
+ Math.min(range.from.top, range.to.top) - range.margin,
+ Math.max(range.from.right, range.to.right),
+ Math.max(range.from.bottom, range.to.bottom) + range.margin);
+ this.scrollTo(sPos.scrollLeft, sPos.scrollTop);
+ }
+ }),
+
+ setSize: methodOp(function(width, height) {
+ var cm = this;
+ function interpret(val) {
+ return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val;
+ }
+ if (width != null) cm.display.wrapper.style.width = interpret(width);
+ if (height != null) cm.display.wrapper.style.height = interpret(height);
+ if (cm.options.lineWrapping) clearLineMeasurementCache(this);
+ var lineNo = cm.display.viewFrom;
+ cm.doc.iter(lineNo, cm.display.viewTo, function(line) {
+ if (line.widgets) for (var i = 0; i < line.widgets.length; i++)
+ if (line.widgets[i].noHScroll) { regLineChange(cm, lineNo, "widget"); break; }
+ ++lineNo;
+ });
+ cm.curOp.forceUpdate = true;
+ signal(cm, "refresh", this);
+ }),
+
+ operation: function(f){return runInOp(this, f);},
+
+ refresh: methodOp(function() {
+ var oldHeight = this.display.cachedTextHeight;
+ regChange(this);
+ this.curOp.forceUpdate = true;
+ clearCaches(this);
+ this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop);
+ updateGutterSpace(this);
+ if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5)
+ estimateLineHeights(this);
+ signal(this, "refresh", this);
+ }),
+
+ swapDoc: methodOp(function(doc) {
+ var old = this.doc;
+ old.cm = null;
+ attachDoc(this, doc);
+ clearCaches(this);
+ this.display.input.reset();
+ this.scrollTo(doc.scrollLeft, doc.scrollTop);
+ this.curOp.forceScroll = true;
+ signalLater(this, "swapDoc", this, old);
+ return old;
+ }),
+
+ getInputField: function(){return this.display.input.getField();},
+ getWrapperElement: function(){return this.display.wrapper;},
+ getScrollerElement: function(){return this.display.scroller;},
+ getGutterElement: function(){return this.display.gutters;}
+ };
+ eventMixin(CodeMirror);
+
+ // OPTION DEFAULTS
+
+ // The default configuration options.
+ var defaults = CodeMirror.defaults = {};
+ // Functions to run when options are changed.
+ var optionHandlers = CodeMirror.optionHandlers = {};
+
+ function option(name, deflt, handle, notOnInit) {
+ CodeMirror.defaults[name] = deflt;
+ if (handle) optionHandlers[name] =
+ notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle;
+ }
+
+ // Passed to option handlers when there is no old value.
+ var Init = CodeMirror.Init = {toString: function(){return "CodeMirror.Init";}};
+
+ // These two are, on init, called from the constructor because they
+ // have to be initialized before the editor can start at all.
+ option("value", "", function(cm, val) {
+ cm.setValue(val);
+ }, true);
+ option("mode", null, function(cm, val) {
+ cm.doc.modeOption = val;
+ loadMode(cm);
+ }, true);
+
+ option("indentUnit", 2, loadMode, true);
+ option("indentWithTabs", false);
+ option("smartIndent", true);
+ option("tabSize", 4, function(cm) {
+ resetModeState(cm);
+ clearCaches(cm);
+ regChange(cm);
+ }, true);
+ option("lineSeparator", null, function(cm, val) {
+ cm.doc.lineSep = val;
+ if (!val) return;
+ var newBreaks = [], lineNo = cm.doc.first;
+ cm.doc.iter(function(line) {
+ for (var pos = 0;;) {
+ var found = line.text.indexOf(val, pos);
+ if (found == -1) break;
+ pos = found + val.length;
+ newBreaks.push(Pos(lineNo, found));
+ }
+ lineNo++;
+ });
+ for (var i = newBreaks.length - 1; i >= 0; i--)
+ replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length))
+ });
+ option("specialChars", /[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function(cm, val, old) {
+ cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g");
+ if (old != CodeMirror.Init) cm.refresh();
+ });
+ option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function(cm) {cm.refresh();}, true);
+ option("electricChars", true);
+ option("inputStyle", mobile ? "contenteditable" : "textarea", function() {
+ throw new Error("inputStyle can not (yet) be changed in a running editor"); // FIXME
+ }, true);
+ option("rtlMoveVisually", !windows);
+ option("wholeLineUpdateBefore", true);
+
+ option("theme", "default", function(cm) {
+ themeChanged(cm);
+ guttersChanged(cm);
+ }, true);
+ option("keyMap", "default", function(cm, val, old) {
+ var next = getKeyMap(val);
+ var prev = old != CodeMirror.Init && getKeyMap(old);
+ if (prev && prev.detach) prev.detach(cm, next);
+ if (next.attach) next.attach(cm, prev || null);
+ });
+ option("extraKeys", null);
+
+ option("lineWrapping", false, wrappingChanged, true);
+ option("gutters", [], function(cm) {
+ setGuttersForLineNumbers(cm.options);
+ guttersChanged(cm);
+ }, true);
+ option("fixedGutter", true, function(cm, val) {
+ cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0";
+ cm.refresh();
+ }, true);
+ option("coverGutterNextToScrollbar", false, function(cm) {updateScrollbars(cm);}, true);
+ option("scrollbarStyle", "native", function(cm) {
+ initScrollbars(cm);
+ updateScrollbars(cm);
+ cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);
+ cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);
+ }, true);
+ option("lineNumbers", false, function(cm) {
+ setGuttersForLineNumbers(cm.options);
+ guttersChanged(cm);
+ }, true);
+ option("firstLineNumber", 1, guttersChanged, true);
+ option("lineNumberFormatter", function(integer) {return integer;}, guttersChanged, true);
+ option("showCursorWhenSelecting", false, updateSelection, true);
+
+ option("resetSelectionOnContextMenu", true);
+ option("lineWiseCopyCut", true);
+
+ option("readOnly", false, function(cm, val) {
+ if (val == "nocursor") {
+ onBlur(cm);
+ cm.display.input.blur();
+ cm.display.disabled = true;
+ } else {
+ cm.display.disabled = false;
+ }
+ cm.display.input.readOnlyChanged(val)
+ });
+ option("disableInput", false, function(cm, val) {if (!val) cm.display.input.reset();}, true);
+ option("dragDrop", true, dragDropChanged);
+ option("allowDropFileTypes", null);
+
+ option("cursorBlinkRate", 530);
+ option("cursorScrollMargin", 0);
+ option("cursorHeight", 1, updateSelection, true);
+ option("singleCursorHeightPerLine", true, updateSelection, true);
+ option("workTime", 100);
+ option("workDelay", 100);
+ option("flattenSpans", true, resetModeState, true);
+ option("addModeClass", false, resetModeState, true);
+ option("pollInterval", 100);
+ option("undoDepth", 200, function(cm, val){cm.doc.history.undoDepth = val;});
+ option("historyEventDelay", 1250);
+ option("viewportMargin", 10, function(cm){cm.refresh();}, true);
+ option("maxHighlightLength", 10000, resetModeState, true);
+ option("moveInputWithCursor", true, function(cm, val) {
+ if (!val) cm.display.input.resetPosition();
+ });
+
+ option("tabindex", null, function(cm, val) {
+ cm.display.input.getField().tabIndex = val || "";
+ });
+ option("autofocus", null);
+
+ // MODE DEFINITION AND QUERYING
+
+ // Known modes, by name and by MIME
+ var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {};
+
+ // Extra arguments are stored as the mode's dependencies, which is
+ // used by (legacy) mechanisms like loadmode.js to automatically
+ // load a mode. (Preferred mechanism is the require/define calls.)
+ CodeMirror.defineMode = function(name, mode) {
+ if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name;
+ if (arguments.length > 2)
+ mode.dependencies = Array.prototype.slice.call(arguments, 2);
+ modes[name] = mode;
+ };
+
+ CodeMirror.defineMIME = function(mime, spec) {
+ mimeModes[mime] = spec;
+ };
+
+ // Given a MIME type, a {name, ...options} config object, or a name
+ // string, return a mode config object.
+ CodeMirror.resolveMode = function(spec) {
+ if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) {
+ spec = mimeModes[spec];
+ } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) {
+ var found = mimeModes[spec.name];
+ if (typeof found == "string") found = {name: found};
+ spec = createObj(found, spec);
+ spec.name = found.name;
+ } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {
+ return CodeMirror.resolveMode("application/xml");
+ }
+ if (typeof spec == "string") return {name: spec};
+ else return spec || {name: "null"};
+ };
+
+ // Given a mode spec (anything that resolveMode accepts), find and
+ // initialize an actual mode object.
+ CodeMirror.getMode = function(options, spec) {
+ var spec = CodeMirror.resolveMode(spec);
+ var mfactory = modes[spec.name];
+ if (!mfactory) return CodeMirror.getMode(options, "text/plain");
+ var modeObj = mfactory(options, spec);
+ if (modeExtensions.hasOwnProperty(spec.name)) {
+ var exts = modeExtensions[spec.name];
+ for (var prop in exts) {
+ if (!exts.hasOwnProperty(prop)) continue;
+ if (modeObj.hasOwnProperty(prop)) modeObj["_" + prop] = modeObj[prop];
+ modeObj[prop] = exts[prop];
+ }
+ }
+ modeObj.name = spec.name;
+ if (spec.helperType) modeObj.helperType = spec.helperType;
+ if (spec.modeProps) for (var prop in spec.modeProps)
+ modeObj[prop] = spec.modeProps[prop];
+
+ return modeObj;
+ };
+
+ // Minimal default mode.
+ CodeMirror.defineMode("null", function() {
+ return {token: function(stream) {stream.skipToEnd();}};
+ });
+ CodeMirror.defineMIME("text/plain", "null");
+
+ // This can be used to attach properties to mode objects from
+ // outside the actual mode definition.
+ var modeExtensions = CodeMirror.modeExtensions = {};
+ CodeMirror.extendMode = function(mode, properties) {
+ var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});
+ copyObj(properties, exts);
+ };
+
+ // EXTENSIONS
+
+ CodeMirror.defineExtension = function(name, func) {
+ CodeMirror.prototype[name] = func;
+ };
+ CodeMirror.defineDocExtension = function(name, func) {
+ Doc.prototype[name] = func;
+ };
+ CodeMirror.defineOption = option;
+
+ var initHooks = [];
+ CodeMirror.defineInitHook = function(f) {initHooks.push(f);};
+
+ var helpers = CodeMirror.helpers = {};
+ CodeMirror.registerHelper = function(type, name, value) {
+ if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {_global: []};
+ helpers[type][name] = value;
+ };
+ CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {
+ CodeMirror.registerHelper(type, name, value);
+ helpers[type]._global.push({pred: predicate, val: value});
+ };
+
+ // MODE STATE HANDLING
+
+ // Utility functions for working with state. Exported because nested
+ // modes need to do this for their inner modes.
+
+ var copyState = CodeMirror.copyState = function(mode, state) {
+ if (state === true) return state;
+ if (mode.copyState) return mode.copyState(state);
+ var nstate = {};
+ for (var n in state) {
+ var val = state[n];
+ if (val instanceof Array) val = val.concat([]);
+ nstate[n] = val;
+ }
+ return nstate;
+ };
+
+ var startState = CodeMirror.startState = function(mode, a1, a2) {
+ return mode.startState ? mode.startState(a1, a2) : true;
+ };
+
+ // Given a mode and a state (for that mode), find the inner mode and
+ // state at the position that the state refers to.
+ CodeMirror.innerMode = function(mode, state) {
+ while (mode.innerMode) {
+ var info = mode.innerMode(state);
+ if (!info || info.mode == mode) break;
+ state = info.state;
+ mode = info.mode;
+ }
+ return info || {mode: mode, state: state};
+ };
+
+ // STANDARD COMMANDS
+
+ // Commands are parameter-less actions that can be performed on an
+ // editor, mostly used for keybindings.
+ var commands = CodeMirror.commands = {
+ selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);},
+ singleSelection: function(cm) {
+ cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll);
+ },
+ killLine: function(cm) {
+ deleteNearSelection(cm, function(range) {
+ if (range.empty()) {
+ var len = getLine(cm.doc, range.head.line).text.length;
+ if (range.head.ch == len && range.head.line < cm.lastLine())
+ return {from: range.head, to: Pos(range.head.line + 1, 0)};
+ else
+ return {from: range.head, to: Pos(range.head.line, len)};
+ } else {
+ return {from: range.from(), to: range.to()};
+ }
+ });
+ },
+ deleteLine: function(cm) {
+ deleteNearSelection(cm, function(range) {
+ return {from: Pos(range.from().line, 0),
+ to: clipPos(cm.doc, Pos(range.to().line + 1, 0))};
+ });
+ },
+ delLineLeft: function(cm) {
+ deleteNearSelection(cm, function(range) {
+ return {from: Pos(range.from().line, 0), to: range.from()};
+ });
+ },
+ delWrappedLineLeft: function(cm) {
+ deleteNearSelection(cm, function(range) {
+ var top = cm.charCoords(range.head, "div").top + 5;
+ var leftPos = cm.coordsChar({left: 0, top: top}, "div");
+ return {from: leftPos, to: range.from()};
+ });
+ },
+ delWrappedLineRight: function(cm) {
+ deleteNearSelection(cm, function(range) {
+ var top = cm.charCoords(range.head, "div").top + 5;
+ var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div");
+ return {from: range.from(), to: rightPos };
+ });
+ },
+ undo: function(cm) {cm.undo();},
+ redo: function(cm) {cm.redo();},
+ undoSelection: function(cm) {cm.undoSelection();},
+ redoSelection: function(cm) {cm.redoSelection();},
+ goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));},
+ goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));},
+ goLineStart: function(cm) {
+ cm.extendSelectionsBy(function(range) { return lineStart(cm, range.head.line); },
+ {origin: "+move", bias: 1});
+ },
+ goLineStartSmart: function(cm) {
+ cm.extendSelectionsBy(function(range) {
+ return lineStartSmart(cm, range.head);
+ }, {origin: "+move", bias: 1});
+ },
+ goLineEnd: function(cm) {
+ cm.extendSelectionsBy(function(range) { return lineEnd(cm, range.head.line); },
+ {origin: "+move", bias: -1});
+ },
+ goLineRight: function(cm) {
+ cm.extendSelectionsBy(function(range) {
+ var top = cm.charCoords(range.head, "div").top + 5;
+ return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div");
+ }, sel_move);
+ },
+ goLineLeft: function(cm) {
+ cm.extendSelectionsBy(function(range) {
+ var top = cm.charCoords(range.head, "div").top + 5;
+ return cm.coordsChar({left: 0, top: top}, "div");
+ }, sel_move);
+ },
+ goLineLeftSmart: function(cm) {
+ cm.extendSelectionsBy(function(range) {
+ var top = cm.charCoords(range.head, "div").top + 5;
+ var pos = cm.coordsChar({left: 0, top: top}, "div");
+ if (pos.ch < cm.getLine(pos.line).search(/\S/)) return lineStartSmart(cm, range.head);
+ return pos;
+ }, sel_move);
+ },
+ goLineUp: function(cm) {cm.moveV(-1, "line");},
+ goLineDown: function(cm) {cm.moveV(1, "line");},
+ goPageUp: function(cm) {cm.moveV(-1, "page");},
+ goPageDown: function(cm) {cm.moveV(1, "page");},
+ goCharLeft: function(cm) {cm.moveH(-1, "char");},
+ goCharRight: function(cm) {cm.moveH(1, "char");},
+ goColumnLeft: function(cm) {cm.moveH(-1, "column");},
+ goColumnRight: function(cm) {cm.moveH(1, "column");},
+ goWordLeft: function(cm) {cm.moveH(-1, "word");},
+ goGroupRight: function(cm) {cm.moveH(1, "group");},
+ goGroupLeft: function(cm) {cm.moveH(-1, "group");},
+ goWordRight: function(cm) {cm.moveH(1, "word");},
+ delCharBefore: function(cm) {cm.deleteH(-1, "char");},
+ delCharAfter: function(cm) {cm.deleteH(1, "char");},
+ delWordBefore: function(cm) {cm.deleteH(-1, "word");},
+ delWordAfter: function(cm) {cm.deleteH(1, "word");},
+ delGroupBefore: function(cm) {cm.deleteH(-1, "group");},
+ delGroupAfter: function(cm) {cm.deleteH(1, "group");},
+ indentAuto: function(cm) {cm.indentSelection("smart");},
+ indentMore: function(cm) {cm.indentSelection("add");},
+ indentLess: function(cm) {cm.indentSelection("subtract");},
+ insertTab: function(cm) {cm.replaceSelection("\t");},
+ insertSoftTab: function(cm) {
+ var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;
+ for (var i = 0; i < ranges.length; i++) {
+ var pos = ranges[i].from();
+ var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);
+ spaces.push(new Array(tabSize - col % tabSize + 1).join(" "));
+ }
+ cm.replaceSelections(spaces);
+ },
+ defaultTab: function(cm) {
+ if (cm.somethingSelected()) cm.indentSelection("add");
+ else cm.execCommand("insertTab");
+ },
+ transposeChars: function(cm) {
+ runInOp(cm, function() {
+ var ranges = cm.listSelections(), newSel = [];
+ for (var i = 0; i < ranges.length; i++) {
+ var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;
+ if (line) {
+ if (cur.ch == line.length) cur = new Pos(cur.line, cur.ch - 1);
+ if (cur.ch > 0) {
+ cur = new Pos(cur.line, cur.ch + 1);
+ cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),
+ Pos(cur.line, cur.ch - 2), cur, "+transpose");
+ } else if (cur.line > cm.doc.first) {
+ var prev = getLine(cm.doc, cur.line - 1).text;
+ if (prev)
+ cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +
+ prev.charAt(prev.length - 1),
+ Pos(cur.line - 1, prev.length - 1), Pos(cur.line, 1), "+transpose");
+ }
+ }
+ newSel.push(new Range(cur, cur));
+ }
+ cm.setSelections(newSel);
+ });
+ },
+ newlineAndIndent: function(cm) {
+ runInOp(cm, function() {
+ var len = cm.listSelections().length;
+ for (var i = 0; i < len; i++) {
+ var range = cm.listSelections()[i];
+ cm.replaceRange(cm.doc.lineSeparator(), range.anchor, range.head, "+input");
+ cm.indentLine(range.from().line + 1, null, true);
+ }
+ ensureCursorVisible(cm);
+ });
+ },
+ toggleOverwrite: function(cm) {cm.toggleOverwrite();}
+ };
+
+
+ // STANDARD KEYMAPS
+
+ var keyMap = CodeMirror.keyMap = {};
+
+ keyMap.basic = {
+ "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",
+ "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",
+ "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore",
+ "Tab": "defaultTab", "Shift-Tab": "indentAuto",
+ "Enter": "newlineAndIndent", "Insert": "toggleOverwrite",
+ "Esc": "singleSelection"
+ };
+ // Note that the save and find-related commands aren't defined by
+ // default. User code or addons can define them. Unknown commands
+ // are simply ignored.
+ keyMap.pcDefault = {
+ "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
+ "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown",
+ "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
+ "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find",
+ "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
+ "Ctrl-[": "indentLess", "Ctrl-]": "indentMore",
+ "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection",
+ fallthrough: "basic"
+ };
+ // Very basic readline/emacs-style bindings, which are standard on Mac.
+ keyMap.emacsy = {
+ "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
+ "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
+ "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore",
+ "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars"
+ };
+ keyMap.macDefault = {
+ "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
+ "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft",
+ "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore",
+ "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find",
+ "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
+ "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight",
+ "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd",
+ fallthrough: ["basic", "emacsy"]
+ };
+ keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;
+
+ // KEYMAP DISPATCH
+
+ function normalizeKeyName(name) {
+ var parts = name.split(/-(?!$)/), name = parts[parts.length - 1];
+ var alt, ctrl, shift, cmd;
+ for (var i = 0; i < parts.length - 1; i++) {
+ var mod = parts[i];
+ if (/^(cmd|meta|m)$/i.test(mod)) cmd = true;
+ else if (/^a(lt)?$/i.test(mod)) alt = true;
+ else if (/^(c|ctrl|control)$/i.test(mod)) ctrl = true;
+ else if (/^s(hift)$/i.test(mod)) shift = true;
+ else throw new Error("Unrecognized modifier name: " + mod);
+ }
+ if (alt) name = "Alt-" + name;
+ if (ctrl) name = "Ctrl-" + name;
+ if (cmd) name = "Cmd-" + name;
+ if (shift) name = "Shift-" + name;
+ return name;
+ }
+
+ // This is a kludge to keep keymaps mostly working as raw objects
+ // (backwards compatibility) while at the same time support features
+ // like normalization and multi-stroke key bindings. It compiles a
+ // new normalized keymap, and then updates the old object to reflect
+ // this.
+ CodeMirror.normalizeKeyMap = function(keymap) {
+ var copy = {};
+ for (var keyname in keymap) if (keymap.hasOwnProperty(keyname)) {
+ var value = keymap[keyname];
+ if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) continue;
+ if (value == "...") { delete keymap[keyname]; continue; }
+
+ var keys = map(keyname.split(" "), normalizeKeyName);
+ for (var i = 0; i < keys.length; i++) {
+ var val, name;
+ if (i == keys.length - 1) {
+ name = keys.join(" ");
+ val = value;
+ } else {
+ name = keys.slice(0, i + 1).join(" ");
+ val = "...";
+ }
+ var prev = copy[name];
+ if (!prev) copy[name] = val;
+ else if (prev != val) throw new Error("Inconsistent bindings for " + name);
+ }
+ delete keymap[keyname];
+ }
+ for (var prop in copy) keymap[prop] = copy[prop];
+ return keymap;
+ };
+
+ var lookupKey = CodeMirror.lookupKey = function(key, map, handle, context) {
+ map = getKeyMap(map);
+ var found = map.call ? map.call(key, context) : map[key];
+ if (found === false) return "nothing";
+ if (found === "...") return "multi";
+ if (found != null && handle(found)) return "handled";
+
+ if (map.fallthrough) {
+ if (Object.prototype.toString.call(map.fallthrough) != "[object Array]")
+ return lookupKey(key, map.fallthrough, handle, context);
+ for (var i = 0; i < map.fallthrough.length; i++) {
+ var result = lookupKey(key, map.fallthrough[i], handle, context);
+ if (result) return result;
+ }
+ }
+ };
+
+ // Modifier key presses don't count as 'real' key presses for the
+ // purpose of keymap fallthrough.
+ var isModifierKey = CodeMirror.isModifierKey = function(value) {
+ var name = typeof value == "string" ? value : keyNames[value.keyCode];
+ return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod";
+ };
+
+ // Look up the name of a key as indicated by an event object.
+ var keyName = CodeMirror.keyName = function(event, noShift) {
+ if (presto && event.keyCode == 34 && event["char"]) return false;
+ var base = keyNames[event.keyCode], name = base;
+ if (name == null || event.altGraphKey) return false;
+ if (event.altKey && base != "Alt") name = "Alt-" + name;
+ if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") name = "Ctrl-" + name;
+ if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Cmd") name = "Cmd-" + name;
+ if (!noShift && event.shiftKey && base != "Shift") name = "Shift-" + name;
+ return name;
+ };
+
+ function getKeyMap(val) {
+ return typeof val == "string" ? keyMap[val] : val;
+ }
+
+ // FROMTEXTAREA
+
+ CodeMirror.fromTextArea = function(textarea, options) {
+ options = options ? copyObj(options) : {};
+ options.value = textarea.value;
+ if (!options.tabindex && textarea.tabIndex)
+ options.tabindex = textarea.tabIndex;
+ if (!options.placeholder && textarea.placeholder)
+ options.placeholder = textarea.placeholder;
+ // Set autofocus to true if this textarea is focused, or if it has
+ // autofocus and no other element is focused.
+ if (options.autofocus == null) {
+ var hasFocus = activeElt();
+ options.autofocus = hasFocus == textarea ||
+ textarea.getAttribute("autofocus") != null && hasFocus == document.body;
+ }
+
+ function save() {textarea.value = cm.getValue();}
+ if (textarea.form) {
+ on(textarea.form, "submit", save);
+ // Deplorable hack to make the submit method do the right thing.
+ if (!options.leaveSubmitMethodAlone) {
+ var form = textarea.form, realSubmit = form.submit;
+ try {
+ var wrappedSubmit = form.submit = function() {
+ save();
+ form.submit = realSubmit;
+ form.submit();
+ form.submit = wrappedSubmit;
+ };
+ } catch(e) {}
+ }
+ }
+
+ options.finishInit = function(cm) {
+ cm.save = save;
+ cm.getTextArea = function() { return textarea; };
+ cm.toTextArea = function() {
+ cm.toTextArea = isNaN; // Prevent this from being ran twice
+ save();
+ textarea.parentNode.removeChild(cm.getWrapperElement());
+ textarea.style.display = "";
+ if (textarea.form) {
+ off(textarea.form, "submit", save);
+ if (typeof textarea.form.submit == "function")
+ textarea.form.submit = realSubmit;
+ }
+ };
+ };
+
+ textarea.style.display = "none";
+ var cm = CodeMirror(function(node) {
+ textarea.parentNode.insertBefore(node, textarea.nextSibling);
+ }, options);
+ return cm;
+ };
+
+ // STRING STREAM
+
+ // Fed to the mode parsers, provides helper functions to make
+ // parsers more succinct.
+
+ var StringStream = CodeMirror.StringStream = function(string, tabSize) {
+ this.pos = this.start = 0;
+ this.string = string;
+ this.tabSize = tabSize || 8;
+ this.lastColumnPos = this.lastColumnValue = 0;
+ this.lineStart = 0;
+ };
+
+ StringStream.prototype = {
+ eol: function() {return this.pos >= this.string.length;},
+ sol: function() {return this.pos == this.lineStart;},
+ peek: function() {return this.string.charAt(this.pos) || undefined;},
+ next: function() {
+ if (this.pos < this.string.length)
+ return this.string.charAt(this.pos++);
+ },
+ eat: function(match) {
+ var ch = this.string.charAt(this.pos);
+ if (typeof match == "string") var ok = ch == match;
+ else var ok = ch && (match.test ? match.test(ch) : match(ch));
+ if (ok) {++this.pos; return ch;}
+ },
+ eatWhile: function(match) {
+ var start = this.pos;
+ while (this.eat(match)){}
+ return this.pos > start;
+ },
+ eatSpace: function() {
+ var start = this.pos;
+ while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;
+ return this.pos > start;
+ },
+ skipToEnd: function() {this.pos = this.string.length;},
+ skipTo: function(ch) {
+ var found = this.string.indexOf(ch, this.pos);
+ if (found > -1) {this.pos = found; return true;}
+ },
+ backUp: function(n) {this.pos -= n;},
+ column: function() {
+ if (this.lastColumnPos < this.start) {
+ this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);
+ this.lastColumnPos = this.start;
+ }
+ return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);
+ },
+ indentation: function() {
+ return countColumn(this.string, null, this.tabSize) -
+ (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);
+ },
+ match: function(pattern, consume, caseInsensitive) {
+ if (typeof pattern == "string") {
+ var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};
+ var substr = this.string.substr(this.pos, pattern.length);
+ if (cased(substr) == cased(pattern)) {
+ if (consume !== false) this.pos += pattern.length;
+ return true;
+ }
+ } else {
+ var match = this.string.slice(this.pos).match(pattern);
+ if (match && match.index > 0) return null;
+ if (match && consume !== false) this.pos += match[0].length;
+ return match;
+ }
+ },
+ current: function(){return this.string.slice(this.start, this.pos);},
+ hideFirstChars: function(n, inner) {
+ this.lineStart += n;
+ try { return inner(); }
+ finally { this.lineStart -= n; }
+ }
+ };
+
+ // TEXTMARKERS
+
+ // Created with markText and setBookmark methods. A TextMarker is a
+ // handle that can be used to clear or find a marked position in the
+ // document. Line objects hold arrays (markedSpans) containing
+ // {from, to, marker} object pointing to such marker objects, and
+ // indicating that such a marker is present on that line. Multiple
+ // lines may point to the same marker when it spans across lines.
+ // The spans will have null for their from/to properties when the
+ // marker continues beyond the start/end of the line. Markers have
+ // links back to the lines they currently touch.
+
+ var nextMarkerId = 0;
+
+ var TextMarker = CodeMirror.TextMarker = function(doc, type) {
+ this.lines = [];
+ this.type = type;
+ this.doc = doc;
+ this.id = ++nextMarkerId;
+ };
+ eventMixin(TextMarker);
+
+ // Clear the marker.
+ TextMarker.prototype.clear = function() {
+ if (this.explicitlyCleared) return;
+ var cm = this.doc.cm, withOp = cm && !cm.curOp;
+ if (withOp) startOperation(cm);
+ if (hasHandler(this, "clear")) {
+ var found = this.find();
+ if (found) signalLater(this, "clear", found.from, found.to);
+ }
+ var min = null, max = null;
+ for (var i = 0; i < this.lines.length; ++i) {
+ var line = this.lines[i];
+ var span = getMarkedSpanFor(line.markedSpans, this);
+ if (cm && !this.collapsed) regLineChange(cm, lineNo(line), "text");
+ else if (cm) {
+ if (span.to != null) max = lineNo(line);
+ if (span.from != null) min = lineNo(line);
+ }
+ line.markedSpans = removeMarkedSpan(line.markedSpans, span);
+ if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)
+ updateLineHeight(line, textHeight(cm.display));
+ }
+ if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) {
+ var visual = visualLine(this.lines[i]), len = lineLength(visual);
+ if (len > cm.display.maxLineLength) {
+ cm.display.maxLine = visual;
+ cm.display.maxLineLength = len;
+ cm.display.maxLineChanged = true;
+ }
+ }
+
+ if (min != null && cm && this.collapsed) regChange(cm, min, max + 1);
+ this.lines.length = 0;
+ this.explicitlyCleared = true;
+ if (this.atomic && this.doc.cantEdit) {
+ this.doc.cantEdit = false;
+ if (cm) reCheckSelection(cm.doc);
+ }
+ if (cm) signalLater(cm, "markerCleared", cm, this);
+ if (withOp) endOperation(cm);
+ if (this.parent) this.parent.clear();
+ };
+
+ // Find the position of the marker in the document. Returns a {from,
+ // to} object by default. Side can be passed to get a specific side
+ // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the
+ // Pos objects returned contain a line object, rather than a line
+ // number (used to prevent looking up the same line twice).
+ TextMarker.prototype.find = function(side, lineObj) {
+ if (side == null && this.type == "bookmark") side = 1;
+ var from, to;
+ for (var i = 0; i < this.lines.length; ++i) {
+ var line = this.lines[i];
+ var span = getMarkedSpanFor(line.markedSpans, this);
+ if (span.from != null) {
+ from = Pos(lineObj ? line : lineNo(line), span.from);
+ if (side == -1) return from;
+ }
+ if (span.to != null) {
+ to = Pos(lineObj ? line : lineNo(line), span.to);
+ if (side == 1) return to;
+ }
+ }
+ return from && {from: from, to: to};
+ };
+
+ // Signals that the marker's widget changed, and surrounding layout
+ // should be recomputed.
+ TextMarker.prototype.changed = function() {
+ var pos = this.find(-1, true), widget = this, cm = this.doc.cm;
+ if (!pos || !cm) return;
+ runInOp(cm, function() {
+ var line = pos.line, lineN = lineNo(pos.line);
+ var view = findViewForLine(cm, lineN);
+ if (view) {
+ clearLineMeasurementCacheFor(view);
+ cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;
+ }
+ cm.curOp.updateMaxLine = true;
+ if (!lineIsHidden(widget.doc, line) && widget.height != null) {
+ var oldHeight = widget.height;
+ widget.height = null;
+ var dHeight = widgetHeight(widget) - oldHeight;
+ if (dHeight)
+ updateLineHeight(line, line.height + dHeight);
+ }
+ });
+ };
+
+ TextMarker.prototype.attachLine = function(line) {
+ if (!this.lines.length && this.doc.cm) {
+ var op = this.doc.cm.curOp;
+ if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)
+ (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this);
+ }
+ this.lines.push(line);
+ };
+ TextMarker.prototype.detachLine = function(line) {
+ this.lines.splice(indexOf(this.lines, line), 1);
+ if (!this.lines.length && this.doc.cm) {
+ var op = this.doc.cm.curOp;
+ (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);
+ }
+ };
+
+ // Collapsed markers have unique ids, in order to be able to order
+ // them, which is needed for uniquely determining an outer marker
+ // when they overlap (they may nest, but not partially overlap).
+ var nextMarkerId = 0;
+
+ // Create a marker, wire it up to the right lines, and
+ function markText(doc, from, to, options, type) {
+ // Shared markers (across linked documents) are handled separately
+ // (markTextShared will call out to this again, once per
+ // document).
+ if (options && options.shared) return markTextShared(doc, from, to, options, type);
+ // Ensure we are in an operation.
+ if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type);
+
+ var marker = new TextMarker(doc, type), diff = cmp(from, to);
+ if (options) copyObj(options, marker, false);
+ // Don't connect empty markers unless clearWhenEmpty is false
+ if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)
+ return marker;
+ if (marker.replacedWith) {
+ // Showing up as a widget implies collapsed (widget replaces text)
+ marker.collapsed = true;
+ marker.widgetNode = elt("span", [marker.replacedWith], "CodeMirror-widget");
+ if (!options.handleMouseEvents) marker.widgetNode.setAttribute("cm-ignore-events", "true");
+ if (options.insertLeft) marker.widgetNode.insertLeft = true;
+ }
+ if (marker.collapsed) {
+ if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||
+ from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))
+ throw new Error("Inserting collapsed marker partially overlapping an existing one");
+ sawCollapsedSpans = true;
+ }
+
+ if (marker.addToHistory)
+ addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN);
+
+ var curLine = from.line, cm = doc.cm, updateMaxLine;
+ doc.iter(curLine, to.line + 1, function(line) {
+ if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)
+ updateMaxLine = true;
+ if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0);
+ addMarkedSpan(line, new MarkedSpan(marker,
+ curLine == from.line ? from.ch : null,
+ curLine == to.line ? to.ch : null));
+ ++curLine;
+ });
+ // lineIsHidden depends on the presence of the spans, so needs a second pass
+ if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) {
+ if (lineIsHidden(doc, line)) updateLineHeight(line, 0);
+ });
+
+ if (marker.clearOnEnter) on(marker, "beforeCursorEnter", function() { marker.clear(); });
+
+ if (marker.readOnly) {
+ sawReadOnlySpans = true;
+ if (doc.history.done.length || doc.history.undone.length)
+ doc.clearHistory();
+ }
+ if (marker.collapsed) {
+ marker.id = ++nextMarkerId;
+ marker.atomic = true;
+ }
+ if (cm) {
+ // Sync editor state
+ if (updateMaxLine) cm.curOp.updateMaxLine = true;
+ if (marker.collapsed)
+ regChange(cm, from.line, to.line + 1);
+ else if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.css)
+ for (var i = from.line; i <= to.line; i++) regLineChange(cm, i, "text");
+ if (marker.atomic) reCheckSelection(cm.doc);
+ signalLater(cm, "markerAdded", cm, marker);
+ }
+ return marker;
+ }
+
+ // SHARED TEXTMARKERS
+
+ // A shared marker spans multiple linked documents. It is
+ // implemented as a meta-marker-object controlling multiple normal
+ // markers.
+ var SharedTextMarker = CodeMirror.SharedTextMarker = function(markers, primary) {
+ this.markers = markers;
+ this.primary = primary;
+ for (var i = 0; i < markers.length; ++i)
+ markers[i].parent = this;
+ };
+ eventMixin(SharedTextMarker);
+
+ SharedTextMarker.prototype.clear = function() {
+ if (this.explicitlyCleared) return;
+ this.explicitlyCleared = true;
+ for (var i = 0; i < this.markers.length; ++i)
+ this.markers[i].clear();
+ signalLater(this, "clear");
+ };
+ SharedTextMarker.prototype.find = function(side, lineObj) {
+ return this.primary.find(side, lineObj);
+ };
+
+ function markTextShared(doc, from, to, options, type) {
+ options = copyObj(options);
+ options.shared = false;
+ var markers = [markText(doc, from, to, options, type)], primary = markers[0];
+ var widget = options.widgetNode;
+ linkedDocs(doc, function(doc) {
+ if (widget) options.widgetNode = widget.cloneNode(true);
+ markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));
+ for (var i = 0; i < doc.linked.length; ++i)
+ if (doc.linked[i].isParent) return;
+ primary = lst(markers);
+ });
+ return new SharedTextMarker(markers, primary);
+ }
+
+ function findSharedMarkers(doc) {
+ return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())),
+ function(m) { return m.parent; });
+ }
+
+ function copySharedMarkers(doc, markers) {
+ for (var i = 0; i < markers.length; i++) {
+ var marker = markers[i], pos = marker.find();
+ var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);
+ if (cmp(mFrom, mTo)) {
+ var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);
+ marker.markers.push(subMark);
+ subMark.parent = marker;
+ }
+ }
+ }
+
+ function detachSharedMarkers(markers) {
+ for (var i = 0; i < markers.length; i++) {
+ var marker = markers[i], linked = [marker.primary.doc];;
+ linkedDocs(marker.primary.doc, function(d) { linked.push(d); });
+ for (var j = 0; j < marker.markers.length; j++) {
+ var subMarker = marker.markers[j];
+ if (indexOf(linked, subMarker.doc) == -1) {
+ subMarker.parent = null;
+ marker.markers.splice(j--, 1);
+ }
+ }
+ }
+ }
+
+ // TEXTMARKER SPANS
+
+ function MarkedSpan(marker, from, to) {
+ this.marker = marker;
+ this.from = from; this.to = to;
+ }
+
+ // Search an array of spans for a span matching the given marker.
+ function getMarkedSpanFor(spans, marker) {
+ if (spans) for (var i = 0; i < spans.length; ++i) {
+ var span = spans[i];
+ if (span.marker == marker) return span;
+ }
+ }
+ // Remove a span from an array, returning undefined if no spans are
+ // left (we don't store arrays for lines without spans).
+ function removeMarkedSpan(spans, span) {
+ for (var r, i = 0; i < spans.length; ++i)
+ if (spans[i] != span) (r || (r = [])).push(spans[i]);
+ return r;
+ }
+ // Add a span to a line.
+ function addMarkedSpan(line, span) {
+ line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];
+ span.marker.attachLine(line);
+ }
+
+ // Used for the algorithm that adjusts markers for a change in the
+ // document. These functions cut an array of spans at a given
+ // character position, returning an array of remaining chunks (or
+ // undefined if nothing remains).
+ function markedSpansBefore(old, startCh, isInsert) {
+ if (old) for (var i = 0, nw; i < old.length; ++i) {
+ var span = old[i], marker = span.marker;
+ var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);
+ if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) {
+ var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);
+ (nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));
+ }
+ }
+ return nw;
+ }
+ function markedSpansAfter(old, endCh, isInsert) {
+ if (old) for (var i = 0, nw; i < old.length; ++i) {
+ var span = old[i], marker = span.marker;
+ var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);
+ if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) {
+ var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);
+ (nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,
+ span.to == null ? null : span.to - endCh));
+ }
+ }
+ return nw;
+ }
+
+ // Given a change object, compute the new set of marker spans that
+ // cover the line in which the change took place. Removes spans
+ // entirely within the change, reconnects spans belonging to the
+ // same marker that appear on both sides of the change, and cuts off
+ // spans partially within the change. Returns an array of span
+ // arrays with one element for each line in (after) the change.
+ function stretchSpansOverChange(doc, change) {
+ if (change.full) return null;
+ var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;
+ var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;
+ if (!oldFirst && !oldLast) return null;
+
+ var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;
+ // Get the spans that 'stick out' on both sides
+ var first = markedSpansBefore(oldFirst, startCh, isInsert);
+ var last = markedSpansAfter(oldLast, endCh, isInsert);
+
+ // Next, merge those two ends
+ var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);
+ if (first) {
+ // Fix up .to properties of first
+ for (var i = 0; i < first.length; ++i) {
+ var span = first[i];
+ if (span.to == null) {
+ var found = getMarkedSpanFor(last, span.marker);
+ if (!found) span.to = startCh;
+ else if (sameLine) span.to = found.to == null ? null : found.to + offset;
+ }
+ }
+ }
+ if (last) {
+ // Fix up .from in last (or move them into first in case of sameLine)
+ for (var i = 0; i < last.length; ++i) {
+ var span = last[i];
+ if (span.to != null) span.to += offset;
+ if (span.from == null) {
+ var found = getMarkedSpanFor(first, span.marker);
+ if (!found) {
+ span.from = offset;
+ if (sameLine) (first || (first = [])).push(span);
+ }
+ } else {
+ span.from += offset;
+ if (sameLine) (first || (first = [])).push(span);
+ }
+ }
+ }
+ // Make sure we didn't create any zero-length spans
+ if (first) first = clearEmptySpans(first);
+ if (last && last != first) last = clearEmptySpans(last);
+
+ var newMarkers = [first];
+ if (!sameLine) {
+ // Fill gap with whole-line-spans
+ var gap = change.text.length - 2, gapMarkers;
+ if (gap > 0 && first)
+ for (var i = 0; i < first.length; ++i)
+ if (first[i].to == null)
+ (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i].marker, null, null));
+ for (var i = 0; i < gap; ++i)
+ newMarkers.push(gapMarkers);
+ newMarkers.push(last);
+ }
+ return newMarkers;
+ }
+
+ // Remove spans that are empty and don't have a clearWhenEmpty
+ // option of false.
+ function clearEmptySpans(spans) {
+ for (var i = 0; i < spans.length; ++i) {
+ var span = spans[i];
+ if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)
+ spans.splice(i--, 1);
+ }
+ if (!spans.length) return null;
+ return spans;
+ }
+
+ // Used for un/re-doing changes from the history. Combines the
+ // result of computing the existing spans with the set of spans that
+ // existed in the history (so that deleting around a span and then
+ // undoing brings back the span).
+ function mergeOldSpans(doc, change) {
+ var old = getOldSpans(doc, change);
+ var stretched = stretchSpansOverChange(doc, change);
+ if (!old) return stretched;
+ if (!stretched) return old;
+
+ for (var i = 0; i < old.length; ++i) {
+ var oldCur = old[i], stretchCur = stretched[i];
+ if (oldCur && stretchCur) {
+ spans: for (var j = 0; j < stretchCur.length; ++j) {
+ var span = stretchCur[j];
+ for (var k = 0; k < oldCur.length; ++k)
+ if (oldCur[k].marker == span.marker) continue spans;
+ oldCur.push(span);
+ }
+ } else if (stretchCur) {
+ old[i] = stretchCur;
+ }
+ }
+ return old;
+ }
+
+ // Used to 'clip' out readOnly ranges when making a change.
+ function removeReadOnlyRanges(doc, from, to) {
+ var markers = null;
+ doc.iter(from.line, to.line + 1, function(line) {
+ if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) {
+ var mark = line.markedSpans[i].marker;
+ if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))
+ (markers || (markers = [])).push(mark);
+ }
+ });
+ if (!markers) return null;
+ var parts = [{from: from, to: to}];
+ for (var i = 0; i < markers.length; ++i) {
+ var mk = markers[i], m = mk.find(0);
+ for (var j = 0; j < parts.length; ++j) {
+ var p = parts[j];
+ if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) continue;
+ var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);
+ if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)
+ newParts.push({from: p.from, to: m.from});
+ if (dto > 0 || !mk.inclusiveRight && !dto)
+ newParts.push({from: m.to, to: p.to});
+ parts.splice.apply(parts, newParts);
+ j += newParts.length - 1;
+ }
+ }
+ return parts;
+ }
+
+ // Connect or disconnect spans from a line.
+ function detachMarkedSpans(line) {
+ var spans = line.markedSpans;
+ if (!spans) return;
+ for (var i = 0; i < spans.length; ++i)
+ spans[i].marker.detachLine(line);
+ line.markedSpans = null;
+ }
+ function attachMarkedSpans(line, spans) {
+ if (!spans) return;
+ for (var i = 0; i < spans.length; ++i)
+ spans[i].marker.attachLine(line);
+ line.markedSpans = spans;
+ }
+
+ // Helpers used when computing which overlapping collapsed span
+ // counts as the larger one.
+ function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0; }
+ function extraRight(marker) { return marker.inclusiveRight ? 1 : 0; }
+
+ // Returns a number indicating which of two overlapping collapsed
+ // spans is larger (and thus includes the other). Falls back to
+ // comparing ids when the spans cover exactly the same range.
+ function compareCollapsedMarkers(a, b) {
+ var lenDiff = a.lines.length - b.lines.length;
+ if (lenDiff != 0) return lenDiff;
+ var aPos = a.find(), bPos = b.find();
+ var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);
+ if (fromCmp) return -fromCmp;
+ var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);
+ if (toCmp) return toCmp;
+ return b.id - a.id;
+ }
+
+ // Find out whether a line ends or starts in a collapsed span. If
+ // so, return the marker for that span.
+ function collapsedSpanAtSide(line, start) {
+ var sps = sawCollapsedSpans && line.markedSpans, found;
+ if (sps) for (var sp, i = 0; i < sps.length; ++i) {
+ sp = sps[i];
+ if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&
+ (!found || compareCollapsedMarkers(found, sp.marker) < 0))
+ found = sp.marker;
+ }
+ return found;
+ }
+ function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true); }
+ function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false); }
+
+ // Test whether there exists a collapsed span that partially
+ // overlaps (covers the start or end, but not both) of a new span.
+ // Such overlap is not allowed.
+ function conflictingCollapsedRange(doc, lineNo, from, to, marker) {
+ var line = getLine(doc, lineNo);
+ var sps = sawCollapsedSpans && line.markedSpans;
+ if (sps) for (var i = 0; i < sps.length; ++i) {
+ var sp = sps[i];
+ if (!sp.marker.collapsed) continue;
+ var found = sp.marker.find(0);
+ var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);
+ var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);
+ if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue;
+ if (fromCmp <= 0 && (cmp(found.to, from) > 0 || (sp.marker.inclusiveRight && marker.inclusiveLeft)) ||
+ fromCmp >= 0 && (cmp(found.from, to) < 0 || (sp.marker.inclusiveLeft && marker.inclusiveRight)))
+ return true;
+ }
+ }
+
+ // A visual line is a line as drawn on the screen. Folding, for
+ // example, can cause multiple logical lines to appear on the same
+ // visual line. This finds the start of the visual line that the
+ // given line is part of (usually that is the line itself).
+ function visualLine(line) {
+ var merged;
+ while (merged = collapsedSpanAtStart(line))
+ line = merged.find(-1, true).line;
+ return line;
+ }
+
+ // Returns an array of logical lines that continue the visual line
+ // started by the argument, or undefined if there are no such lines.
+ function visualLineContinued(line) {
+ var merged, lines;
+ while (merged = collapsedSpanAtEnd(line)) {
+ line = merged.find(1, true).line;
+ (lines || (lines = [])).push(line);
+ }
+ return lines;
+ }
+
+ // Get the line number of the start of the visual line that the
+ // given line number is part of.
+ function visualLineNo(doc, lineN) {
+ var line = getLine(doc, lineN), vis = visualLine(line);
+ if (line == vis) return lineN;
+ return lineNo(vis);
+ }
+ // Get the line number of the start of the next visual line after
+ // the given line.
+ function visualLineEndNo(doc, lineN) {
+ if (lineN > doc.lastLine()) return lineN;
+ var line = getLine(doc, lineN), merged;
+ if (!lineIsHidden(doc, line)) return lineN;
+ while (merged = collapsedSpanAtEnd(line))
+ line = merged.find(1, true).line;
+ return lineNo(line) + 1;
+ }
+
+ // Compute whether a line is hidden. Lines count as hidden when they
+ // are part of a visual line that starts with another line, or when
+ // they are entirely covered by collapsed, non-widget span.
+ function lineIsHidden(doc, line) {
+ var sps = sawCollapsedSpans && line.markedSpans;
+ if (sps) for (var sp, i = 0; i < sps.length; ++i) {
+ sp = sps[i];
+ if (!sp.marker.collapsed) continue;
+ if (sp.from == null) return true;
+ if (sp.marker.widgetNode) continue;
+ if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))
+ return true;
+ }
+ }
+ function lineIsHiddenInner(doc, line, span) {
+ if (span.to == null) {
+ var end = span.marker.find(1, true);
+ return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker));
+ }
+ if (span.marker.inclusiveRight && span.to == line.text.length)
+ return true;
+ for (var sp, i = 0; i < line.markedSpans.length; ++i) {
+ sp = line.markedSpans[i];
+ if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&
+ (sp.to == null || sp.to != span.from) &&
+ (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&
+ lineIsHiddenInner(doc, line, sp)) return true;
+ }
+ }
+
+ // LINE WIDGETS
+
+ // Line widgets are block elements displayed above or below a line.
+
+ var LineWidget = CodeMirror.LineWidget = function(doc, node, options) {
+ if (options) for (var opt in options) if (options.hasOwnProperty(opt))
+ this[opt] = options[opt];
+ this.doc = doc;
+ this.node = node;
+ };
+ eventMixin(LineWidget);
+
+ function adjustScrollWhenAboveVisible(cm, line, diff) {
+ if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))
+ addToScrollPos(cm, null, diff);
+ }
+
+ LineWidget.prototype.clear = function() {
+ var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);
+ if (no == null || !ws) return;
+ for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1);
+ if (!ws.length) line.widgets = null;
+ var height = widgetHeight(this);
+ updateLineHeight(line, Math.max(0, line.height - height));
+ if (cm) runInOp(cm, function() {
+ adjustScrollWhenAboveVisible(cm, line, -height);
+ regLineChange(cm, no, "widget");
+ });
+ };
+ LineWidget.prototype.changed = function() {
+ var oldH = this.height, cm = this.doc.cm, line = this.line;
+ this.height = null;
+ var diff = widgetHeight(this) - oldH;
+ if (!diff) return;
+ updateLineHeight(line, line.height + diff);
+ if (cm) runInOp(cm, function() {
+ cm.curOp.forceUpdate = true;
+ adjustScrollWhenAboveVisible(cm, line, diff);
+ });
+ };
+
+ function widgetHeight(widget) {
+ if (widget.height != null) return widget.height;
+ var cm = widget.doc.cm;
+ if (!cm) return 0;
+ if (!contains(document.body, widget.node)) {
+ var parentStyle = "position: relative;";
+ if (widget.coverGutter)
+ parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;";
+ if (widget.noHScroll)
+ parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;";
+ removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle));
+ }
+ return widget.height = widget.node.parentNode.offsetHeight;
+ }
+
+ function addLineWidget(doc, handle, node, options) {
+ var widget = new LineWidget(doc, node, options);
+ var cm = doc.cm;
+ if (cm && widget.noHScroll) cm.display.alignWidgets = true;
+ changeLine(doc, handle, "widget", function(line) {
+ var widgets = line.widgets || (line.widgets = []);
+ if (widget.insertAt == null) widgets.push(widget);
+ else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget);
+ widget.line = line;
+ if (cm && !lineIsHidden(doc, line)) {
+ var aboveVisible = heightAtLine(line) < doc.scrollTop;
+ updateLineHeight(line, line.height + widgetHeight(widget));
+ if (aboveVisible) addToScrollPos(cm, null, widget.height);
+ cm.curOp.forceUpdate = true;
+ }
+ return true;
+ });
+ return widget;
+ }
+
+ // LINE DATA STRUCTURE
+
+ // Line objects. These hold state related to a line, including
+ // highlighting info (the styles array).
+ var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) {
+ this.text = text;
+ attachMarkedSpans(this, markedSpans);
+ this.height = estimateHeight ? estimateHeight(this) : 1;
+ };
+ eventMixin(Line);
+ Line.prototype.lineNo = function() { return lineNo(this); };
+
+ // Change the content (text, markers) of a line. Automatically
+ // invalidates cached information and tries to re-estimate the
+ // line's height.
+ function updateLine(line, text, markedSpans, estimateHeight) {
+ line.text = text;
+ if (line.stateAfter) line.stateAfter = null;
+ if (line.styles) line.styles = null;
+ if (line.order != null) line.order = null;
+ detachMarkedSpans(line);
+ attachMarkedSpans(line, markedSpans);
+ var estHeight = estimateHeight ? estimateHeight(line) : 1;
+ if (estHeight != line.height) updateLineHeight(line, estHeight);
+ }
+
+ // Detach a line from the document tree and its markers.
+ function cleanUpLine(line) {
+ line.parent = null;
+ detachMarkedSpans(line);
+ }
+
+ function extractLineClasses(type, output) {
+ if (type) for (;;) {
+ var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/);
+ if (!lineClass) break;
+ type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);
+ var prop = lineClass[1] ? "bgClass" : "textClass";
+ if (output[prop] == null)
+ output[prop] = lineClass[2];
+ else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(output[prop]))
+ output[prop] += " " + lineClass[2];
+ }
+ return type;
+ }
+
+ function callBlankLine(mode, state) {
+ if (mode.blankLine) return mode.blankLine(state);
+ if (!mode.innerMode) return;
+ var inner = CodeMirror.innerMode(mode, state);
+ if (inner.mode.blankLine) return inner.mode.blankLine(inner.state);
+ }
+
+ function readToken(mode, stream, state, inner) {
+ for (var i = 0; i < 10; i++) {
+ if (inner) inner[0] = CodeMirror.innerMode(mode, state).mode;
+ var style = mode.token(stream, state);
+ if (stream.pos > stream.start) return style;
+ }
+ throw new Error("Mode " + mode.name + " failed to advance stream.");
+ }
+
+ // Utility for getTokenAt and getLineTokens
+ function takeToken(cm, pos, precise, asArray) {
+ function getObj(copy) {
+ return {start: stream.start, end: stream.pos,
+ string: stream.current(),
+ type: style || null,
+ state: copy ? copyState(doc.mode, state) : state};
+ }
+
+ var doc = cm.doc, mode = doc.mode, style;
+ pos = clipPos(doc, pos);
+ var line = getLine(doc, pos.line), state = getStateBefore(cm, pos.line, precise);
+ var stream = new StringStream(line.text, cm.options.tabSize), tokens;
+ if (asArray) tokens = [];
+ while ((asArray || stream.pos < pos.ch) && !stream.eol()) {
+ stream.start = stream.pos;
+ style = readToken(mode, stream, state);
+ if (asArray) tokens.push(getObj(true));
+ }
+ return asArray ? tokens : getObj();
+ }
+
+ // Run the given mode's parser over a line, calling f for each token.
+ function runMode(cm, text, mode, state, f, lineClasses, forceToEnd) {
+ var flattenSpans = mode.flattenSpans;
+ if (flattenSpans == null) flattenSpans = cm.options.flattenSpans;
+ var curStart = 0, curStyle = null;
+ var stream = new StringStream(text, cm.options.tabSize), style;
+ var inner = cm.options.addModeClass && [null];
+ if (text == "") extractLineClasses(callBlankLine(mode, state), lineClasses);
+ while (!stream.eol()) {
+ if (stream.pos > cm.options.maxHighlightLength) {
+ flattenSpans = false;
+ if (forceToEnd) processLine(cm, text, state, stream.pos);
+ stream.pos = text.length;
+ style = null;
+ } else {
+ style = extractLineClasses(readToken(mode, stream, state, inner), lineClasses);
+ }
+ if (inner) {
+ var mName = inner[0].name;
+ if (mName) style = "m-" + (style ? mName + " " + style : mName);
+ }
+ if (!flattenSpans || curStyle != style) {
+ while (curStart < stream.start) {
+ curStart = Math.min(stream.start, curStart + 50000);
+ f(curStart, curStyle);
+ }
+ curStyle = style;
+ }
+ stream.start = stream.pos;
+ }
+ while (curStart < stream.pos) {
+ // Webkit seems to refuse to render text nodes longer than 57444 characters
+ var pos = Math.min(stream.pos, curStart + 50000);
+ f(pos, curStyle);
+ curStart = pos;
+ }
+ }
+
+ // Compute a style array (an array starting with a mode generation
+ // -- for invalidation -- followed by pairs of end positions and
+ // style strings), which is used to highlight the tokens on the
+ // line.
+ function highlightLine(cm, line, state, forceToEnd) {
+ // A styles array always starts with a number identifying the
+ // mode/overlays that it is based on (for easy invalidation).
+ var st = [cm.state.modeGen], lineClasses = {};
+ // Compute the base array of styles
+ runMode(cm, line.text, cm.doc.mode, state, function(end, style) {
+ st.push(end, style);
+ }, lineClasses, forceToEnd);
+
+ // Run overlays, adjust style array.
+ for (var o = 0; o < cm.state.overlays.length; ++o) {
+ var overlay = cm.state.overlays[o], i = 1, at = 0;
+ runMode(cm, line.text, overlay.mode, true, function(end, style) {
+ var start = i;
+ // Ensure there's a token end at the current position, and that i points at it
+ while (at < end) {
+ var i_end = st[i];
+ if (i_end > end)
+ st.splice(i, 1, end, st[i+1], i_end);
+ i += 2;
+ at = Math.min(end, i_end);
+ }
+ if (!style) return;
+ if (overlay.opaque) {
+ st.splice(start, i - start, end, "cm-overlay " + style);
+ i = start + 2;
+ } else {
+ for (; start < i; start += 2) {
+ var cur = st[start+1];
+ st[start+1] = (cur ? cur + " " : "") + "cm-overlay " + style;
+ }
+ }
+ }, lineClasses);
+ }
+
+ return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null};
+ }
+
+ function getLineStyles(cm, line, updateFrontier) {
+ if (!line.styles || line.styles[0] != cm.state.modeGen) {
+ var state = getStateBefore(cm, lineNo(line));
+ var result = highlightLine(cm, line, line.text.length > cm.options.maxHighlightLength ? copyState(cm.doc.mode, state) : state);
+ line.stateAfter = state;
+ line.styles = result.styles;
+ if (result.classes) line.styleClasses = result.classes;
+ else if (line.styleClasses) line.styleClasses = null;
+ if (updateFrontier === cm.doc.frontier) cm.doc.frontier++;
+ }
+ return line.styles;
+ }
+
+ // Lightweight form of highlight -- proceed over this line and
+ // update state, but don't save a style array. Used for lines that
+ // aren't currently visible.
+ function processLine(cm, text, state, startAt) {
+ var mode = cm.doc.mode;
+ var stream = new StringStream(text, cm.options.tabSize);
+ stream.start = stream.pos = startAt || 0;
+ if (text == "") callBlankLine(mode, state);
+ while (!stream.eol()) {
+ readToken(mode, stream, state);
+ stream.start = stream.pos;
+ }
+ }
+
+ // Convert a style as returned by a mode (either null, or a string
+ // containing one or more styles) to a CSS style. This is cached,
+ // and also looks for line-wide styles.
+ var styleToClassCache = {}, styleToClassCacheWithMode = {};
+ function interpretTokenStyle(style, options) {
+ if (!style || /^\s*$/.test(style)) return null;
+ var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;
+ return cache[style] ||
+ (cache[style] = style.replace(/\S+/g, "cm-$&"));
+ }
+
+ // Render the DOM representation of the text of a line. Also builds
+ // up a 'line map', which points at the DOM nodes that represent
+ // specific stretches of text, and is used by the measuring code.
+ // The returned object contains the DOM node, this map, and
+ // information about line-wide styles that were set by the mode.
+ function buildLineContent(cm, lineView) {
+ // The padding-right forces the element to have a 'border', which
+ // is needed on Webkit to be able to get line-level bounding
+ // rectangles for it (in measureChar).
+ var content = elt("span", null, null, webkit ? "padding-right: .1px" : null);
+ var builder = {pre: elt("pre", [content], "CodeMirror-line"), content: content,
+ col: 0, pos: 0, cm: cm,
+ splitSpaces: (ie || webkit) && cm.getOption("lineWrapping")};
+ lineView.measure = {};
+
+ // Iterate over the logical lines that make up this visual line.
+ for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {
+ var line = i ? lineView.rest[i - 1] : lineView.line, order;
+ builder.pos = 0;
+ builder.addToken = buildToken;
+ // Optionally wire in some hacks into the token-rendering
+ // algorithm, to deal with browser quirks.
+ if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line)))
+ builder.addToken = buildTokenBadBidi(builder.addToken, order);
+ builder.map = [];
+ var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);
+ insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));
+ if (line.styleClasses) {
+ if (line.styleClasses.bgClass)
+ builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || "");
+ if (line.styleClasses.textClass)
+ builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || "");
+ }
+
+ // Ensure at least a single node is present, for measuring.
+ if (builder.map.length == 0)
+ builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure)));
+
+ // Store the map and a cache object for the current logical line
+ if (i == 0) {
+ lineView.measure.map = builder.map;
+ lineView.measure.cache = {};
+ } else {
+ (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map);
+ (lineView.measure.caches || (lineView.measure.caches = [])).push({});
+ }
+ }
+
+ // See issue #2901
+ if (webkit && /\bcm-tab\b/.test(builder.content.lastChild.className))
+ builder.content.className = "cm-tab-wrap-hack";
+
+ signal(cm, "renderLine", cm, lineView.line, builder.pre);
+ if (builder.pre.className)
+ builder.textClass = joinClasses(builder.pre.className, builder.textClass || "");
+
+ return builder;
+ }
+
+ function defaultSpecialCharPlaceholder(ch) {
+ var token = elt("span", "\u2022", "cm-invalidchar");
+ token.title = "\\u" + ch.charCodeAt(0).toString(16);
+ token.setAttribute("aria-label", token.title);
+ return token;
+ }
+
+ // Build up the DOM representation for a single token, and add it to
+ // the line map. Takes care to render special characters separately.
+ function buildToken(builder, text, style, startStyle, endStyle, title, css) {
+ if (!text) return;
+ var displayText = builder.splitSpaces ? text.replace(/ {3,}/g, splitSpaces) : text;
+ var special = builder.cm.state.specialChars, mustWrap = false;
+ if (!special.test(text)) {
+ builder.col += text.length;
+ var content = document.createTextNode(displayText);
+ builder.map.push(builder.pos, builder.pos + text.length, content);
+ if (ie && ie_version < 9) mustWrap = true;
+ builder.pos += text.length;
+ } else {
+ var content = document.createDocumentFragment(), pos = 0;
+ while (true) {
+ special.lastIndex = pos;
+ var m = special.exec(text);
+ var skipped = m ? m.index - pos : text.length - pos;
+ if (skipped) {
+ var txt = document.createTextNode(displayText.slice(pos, pos + skipped));
+ if (ie && ie_version < 9) content.appendChild(elt("span", [txt]));
+ else content.appendChild(txt);
+ builder.map.push(builder.pos, builder.pos + skipped, txt);
+ builder.col += skipped;
+ builder.pos += skipped;
+ }
+ if (!m) break;
+ pos += skipped + 1;
+ if (m[0] == "\t") {
+ var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;
+ var txt = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab"));
+ txt.setAttribute("role", "presentation");
+ txt.setAttribute("cm-text", "\t");
+ builder.col += tabWidth;
+ } else if (m[0] == "\r" || m[0] == "\n") {
+ var txt = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar"));
+ txt.setAttribute("cm-text", m[0]);
+ builder.col += 1;
+ } else {
+ var txt = builder.cm.options.specialCharPlaceholder(m[0]);
+ txt.setAttribute("cm-text", m[0]);
+ if (ie && ie_version < 9) content.appendChild(elt("span", [txt]));
+ else content.appendChild(txt);
+ builder.col += 1;
+ }
+ builder.map.push(builder.pos, builder.pos + 1, txt);
+ builder.pos++;
+ }
+ }
+ if (style || startStyle || endStyle || mustWrap || css) {
+ var fullStyle = style || "";
+ if (startStyle) fullStyle += startStyle;
+ if (endStyle) fullStyle += endStyle;
+ var token = elt("span", [content], fullStyle, css);
+ if (title) token.title = title;
+ return builder.content.appendChild(token);
+ }
+ builder.content.appendChild(content);
+ }
+
+ function splitSpaces(old) {
+ var out = " ";
+ for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? " " : "\u00a0";
+ out += " ";
+ return out;
+ }
+
+ // Work around nonsense dimensions being reported for stretches of
+ // right-to-left text.
+ function buildTokenBadBidi(inner, order) {
+ return function(builder, text, style, startStyle, endStyle, title, css) {
+ style = style ? style + " cm-force-border" : "cm-force-border";
+ var start = builder.pos, end = start + text.length;
+ for (;;) {
+ // Find the part that overlaps with the start of this text
+ for (var i = 0; i < order.length; i++) {
+ var part = order[i];
+ if (part.to > start && part.from <= start) break;
+ }
+ if (part.to >= end) return inner(builder, text, style, startStyle, endStyle, title, css);
+ inner(builder, text.slice(0, part.to - start), style, startStyle, null, title, css);
+ startStyle = null;
+ text = text.slice(part.to - start);
+ start = part.to;
+ }
+ };
+ }
+
+ function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
+ var widget = !ignoreWidget && marker.widgetNode;
+ if (widget) builder.map.push(builder.pos, builder.pos + size, widget);
+ if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {
+ if (!widget)
+ widget = builder.content.appendChild(document.createElement("span"));
+ widget.setAttribute("cm-marker", marker.id);
+ }
+ if (widget) {
+ builder.cm.display.input.setUneditable(widget);
+ builder.content.appendChild(widget);
+ }
+ builder.pos += size;
+ }
+
+ // Outputs a number of spans to make up a line, taking highlighting
+ // and marked text into account.
+ function insertLineContent(line, builder, styles) {
+ var spans = line.markedSpans, allText = line.text, at = 0;
+ if (!spans) {
+ for (var i = 1; i < styles.length; i+=2)
+ builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder.cm.options));
+ return;
+ }
+
+ var len = allText.length, pos = 0, i = 1, text = "", style, css;
+ var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed;
+ for (;;) {
+ if (nextChange == pos) { // Update current marker set
+ spanStyle = spanEndStyle = spanStartStyle = title = css = "";
+ collapsed = null; nextChange = Infinity;
+ var foundBookmarks = [], endStyles
+ for (var j = 0; j < spans.length; ++j) {
+ var sp = spans[j], m = sp.marker;
+ if (m.type == "bookmark" && sp.from == pos && m.widgetNode) {
+ foundBookmarks.push(m);
+ } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {
+ if (sp.to != null && sp.to != pos && nextChange > sp.to) {
+ nextChange = sp.to;
+ spanEndStyle = "";
+ }
+ if (m.className) spanStyle += " " + m.className;
+ if (m.css) css = (css ? css + ";" : "") + m.css;
+ if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle;
+ if (m.endStyle && sp.to == nextChange) (endStyles || (endStyles = [])).push(m.endStyle, sp.to)
+ if (m.title && !title) title = m.title;
+ if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))
+ collapsed = sp;
+ } else if (sp.from > pos && nextChange > sp.from) {
+ nextChange = sp.from;
+ }
+ }
+ if (endStyles) for (var j = 0; j < endStyles.length; j += 2)
+ if (endStyles[j + 1] == nextChange) spanEndStyle += " " + endStyles[j]
+
+ if (!collapsed || collapsed.from == pos) for (var j = 0; j < foundBookmarks.length; ++j)
+ buildCollapsedSpan(builder, 0, foundBookmarks[j]);
+ if (collapsed && (collapsed.from || 0) == pos) {
+ buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,
+ collapsed.marker, collapsed.from == null);
+ if (collapsed.to == null) return;
+ if (collapsed.to == pos) collapsed = false;
+ }
+ }
+ if (pos >= len) break;
+
+ var upto = Math.min(len, nextChange);
+ while (true) {
+ if (text) {
+ var end = pos + text.length;
+ if (!collapsed) {
+ var tokenText = end > upto ? text.slice(0, upto - pos) : text;
+ builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,
+ spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title, css);
+ }
+ if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}
+ pos = end;
+ spanStartStyle = "";
+ }
+ text = allText.slice(at, at = styles[i++]);
+ style = interpretTokenStyle(styles[i++], builder.cm.options);
+ }
+ }
+ }
+
+ // DOCUMENT DATA STRUCTURE
+
+ // By default, updates that start and end at the beginning of a line
+ // are treated specially, in order to make the association of line
+ // widgets and marker elements with the text behave more intuitive.
+ function isWholeLineUpdate(doc, change) {
+ return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" &&
+ (!doc.cm || doc.cm.options.wholeLineUpdateBefore);
+ }
+
+ // Perform a change on the document data structure.
+ function updateDoc(doc, change, markedSpans, estimateHeight) {
+ function spansFor(n) {return markedSpans ? markedSpans[n] : null;}
+ function update(line, text, spans) {
+ updateLine(line, text, spans, estimateHeight);
+ signalLater(line, "change", line, change);
+ }
+ function linesFor(start, end) {
+ for (var i = start, result = []; i < end; ++i)
+ result.push(new Line(text[i], spansFor(i), estimateHeight));
+ return result;
+ }
+
+ var from = change.from, to = change.to, text = change.text;
+ var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);
+ var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;
+
+ // Adjust the line structure
+ if (change.full) {
+ doc.insert(0, linesFor(0, text.length));
+ doc.remove(text.length, doc.size - text.length);
+ } else if (isWholeLineUpdate(doc, change)) {
+ // This is a whole-line replace. Treated specially to make
+ // sure line objects move the way they are supposed to.
+ var added = linesFor(0, text.length - 1);
+ update(lastLine, lastLine.text, lastSpans);
+ if (nlines) doc.remove(from.line, nlines);
+ if (added.length) doc.insert(from.line, added);
+ } else if (firstLine == lastLine) {
+ if (text.length == 1) {
+ update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);
+ } else {
+ var added = linesFor(1, text.length - 1);
+ added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));
+ update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
+ doc.insert(from.line + 1, added);
+ }
+ } else if (text.length == 1) {
+ update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));
+ doc.remove(from.line + 1, nlines);
+ } else {
+ update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
+ update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);
+ var added = linesFor(1, text.length - 1);
+ if (nlines > 1) doc.remove(from.line + 1, nlines - 1);
+ doc.insert(from.line + 1, added);
+ }
+
+ signalLater(doc, "change", doc, change);
+ }
+
+ // The document is represented as a BTree consisting of leaves, with
+ // chunk of lines in them, and branches, with up to ten leaves or
+ // other branch nodes below them. The top node is always a branch
+ // node, and is the document object itself (meaning it has
+ // additional methods and properties).
+ //
+ // All nodes have parent links. The tree is used both to go from
+ // line numbers to line objects, and to go from objects to numbers.
+ // It also indexes by height, and is used to convert between height
+ // and line object, and to find the total height of the document.
+ //
+ // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html
+
+ function LeafChunk(lines) {
+ this.lines = lines;
+ this.parent = null;
+ for (var i = 0, height = 0; i < lines.length; ++i) {
+ lines[i].parent = this;
+ height += lines[i].height;
+ }
+ this.height = height;
+ }
+
+ LeafChunk.prototype = {
+ chunkSize: function() { return this.lines.length; },
+ // Remove the n lines at offset 'at'.
+ removeInner: function(at, n) {
+ for (var i = at, e = at + n; i < e; ++i) {
+ var line = this.lines[i];
+ this.height -= line.height;
+ cleanUpLine(line);
+ signalLater(line, "delete");
+ }
+ this.lines.splice(at, n);
+ },
+ // Helper used to collapse a small branch into a single leaf.
+ collapse: function(lines) {
+ lines.push.apply(lines, this.lines);
+ },
+ // Insert the given array of lines at offset 'at', count them as
+ // having the given height.
+ insertInner: function(at, lines, height) {
+ this.height += height;
+ this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));
+ for (var i = 0; i < lines.length; ++i) lines[i].parent = this;
+ },
+ // Used to iterate over a part of the tree.
+ iterN: function(at, n, op) {
+ for (var e = at + n; at < e; ++at)
+ if (op(this.lines[at])) return true;
+ }
+ };
+
+ function BranchChunk(children) {
+ this.children = children;
+ var size = 0, height = 0;
+ for (var i = 0; i < children.length; ++i) {
+ var ch = children[i];
+ size += ch.chunkSize(); height += ch.height;
+ ch.parent = this;
+ }
+ this.size = size;
+ this.height = height;
+ this.parent = null;
+ }
+
+ BranchChunk.prototype = {
+ chunkSize: function() { return this.size; },
+ removeInner: function(at, n) {
+ this.size -= n;
+ for (var i = 0; i < this.children.length; ++i) {
+ var child = this.children[i], sz = child.chunkSize();
+ if (at < sz) {
+ var rm = Math.min(n, sz - at), oldHeight = child.height;
+ child.removeInner(at, rm);
+ this.height -= oldHeight - child.height;
+ if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }
+ if ((n -= rm) == 0) break;
+ at = 0;
+ } else at -= sz;
+ }
+ // If the result is smaller than 25 lines, ensure that it is a
+ // single leaf node.
+ if (this.size - n < 25 &&
+ (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {
+ var lines = [];
+ this.collapse(lines);
+ this.children = [new LeafChunk(lines)];
+ this.children[0].parent = this;
+ }
+ },
+ collapse: function(lines) {
+ for (var i = 0; i < this.children.length; ++i) this.children[i].collapse(lines);
+ },
+ insertInner: function(at, lines, height) {
+ this.size += lines.length;
+ this.height += height;
+ for (var i = 0; i < this.children.length; ++i) {
+ var child = this.children[i], sz = child.chunkSize();
+ if (at <= sz) {
+ child.insertInner(at, lines, height);
+ if (child.lines && child.lines.length > 50) {
+ while (child.lines.length > 50) {
+ var spilled = child.lines.splice(child.lines.length - 25, 25);
+ var newleaf = new LeafChunk(spilled);
+ child.height -= newleaf.height;
+ this.children.splice(i + 1, 0, newleaf);
+ newleaf.parent = this;
+ }
+ this.maybeSpill();
+ }
+ break;
+ }
+ at -= sz;
+ }
+ },
+ // When a node has grown, check whether it should be split.
+ maybeSpill: function() {
+ if (this.children.length <= 10) return;
+ var me = this;
+ do {
+ var spilled = me.children.splice(me.children.length - 5, 5);
+ var sibling = new BranchChunk(spilled);
+ if (!me.parent) { // Become the parent node
+ var copy = new BranchChunk(me.children);
+ copy.parent = me;
+ me.children = [copy, sibling];
+ me = copy;
+ } else {
+ me.size -= sibling.size;
+ me.height -= sibling.height;
+ var myIndex = indexOf(me.parent.children, me);
+ me.parent.children.splice(myIndex + 1, 0, sibling);
+ }
+ sibling.parent = me.parent;
+ } while (me.children.length > 10);
+ me.parent.maybeSpill();
+ },
+ iterN: function(at, n, op) {
+ for (var i = 0; i < this.children.length; ++i) {
+ var child = this.children[i], sz = child.chunkSize();
+ if (at < sz) {
+ var used = Math.min(n, sz - at);
+ if (child.iterN(at, used, op)) return true;
+ if ((n -= used) == 0) break;
+ at = 0;
+ } else at -= sz;
+ }
+ }
+ };
+
+ var nextDocId = 0;
+ var Doc = CodeMirror.Doc = function(text, mode, firstLine, lineSep) {
+ if (!(this instanceof Doc)) return new Doc(text, mode, firstLine, lineSep);
+ if (firstLine == null) firstLine = 0;
+
+ BranchChunk.call(this, [new LeafChunk([new Line("", null)])]);
+ this.first = firstLine;
+ this.scrollTop = this.scrollLeft = 0;
+ this.cantEdit = false;
+ this.cleanGeneration = 1;
+ this.frontier = firstLine;
+ var start = Pos(firstLine, 0);
+ this.sel = simpleSelection(start);
+ this.history = new History(null);
+ this.id = ++nextDocId;
+ this.modeOption = mode;
+ this.lineSep = lineSep;
+ this.extend = false;
+
+ if (typeof text == "string") text = this.splitLines(text);
+ updateDoc(this, {from: start, to: start, text: text});
+ setSelection(this, simpleSelection(start), sel_dontScroll);
+ };
+
+ Doc.prototype = createObj(BranchChunk.prototype, {
+ constructor: Doc,
+ // Iterate over the document. Supports two forms -- with only one
+ // argument, it calls that for each line in the document. With
+ // three, it iterates over the range given by the first two (with
+ // the second being non-inclusive).
+ iter: function(from, to, op) {
+ if (op) this.iterN(from - this.first, to - from, op);
+ else this.iterN(this.first, this.first + this.size, from);
+ },
+
+ // Non-public interface for adding and removing lines.
+ insert: function(at, lines) {
+ var height = 0;
+ for (var i = 0; i < lines.length; ++i) height += lines[i].height;
+ this.insertInner(at - this.first, lines, height);
+ },
+ remove: function(at, n) { this.removeInner(at - this.first, n); },
+
+ // From here, the methods are part of the public interface. Most
+ // are also available from CodeMirror (editor) instances.
+
+ getValue: function(lineSep) {
+ var lines = getLines(this, this.first, this.first + this.size);
+ if (lineSep === false) return lines;
+ return lines.join(lineSep || this.lineSeparator());
+ },
+ setValue: docMethodOp(function(code) {
+ var top = Pos(this.first, 0), last = this.first + this.size - 1;
+ makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),
+ text: this.splitLines(code), origin: "setValue", full: true}, true);
+ setSelection(this, simpleSelection(top));
+ }),
+ replaceRange: function(code, from, to, origin) {
+ from = clipPos(this, from);
+ to = to ? clipPos(this, to) : from;
+ replaceRange(this, code, from, to, origin);
+ },
+ getRange: function(from, to, lineSep) {
+ var lines = getBetween(this, clipPos(this, from), clipPos(this, to));
+ if (lineSep === false) return lines;
+ return lines.join(lineSep || this.lineSeparator());
+ },
+
+ getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;},
+
+ getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);},
+ getLineNumber: function(line) {return lineNo(line);},
+
+ getLineHandleVisualStart: function(line) {
+ if (typeof line == "number") line = getLine(this, line);
+ return visualLine(line);
+ },
+
+ lineCount: function() {return this.size;},
+ firstLine: function() {return this.first;},
+ lastLine: function() {return this.first + this.size - 1;},
+
+ clipPos: function(pos) {return clipPos(this, pos);},
+
+ getCursor: function(start) {
+ var range = this.sel.primary(), pos;
+ if (start == null || start == "head") pos = range.head;
+ else if (start == "anchor") pos = range.anchor;
+ else if (start == "end" || start == "to" || start === false) pos = range.to();
+ else pos = range.from();
+ return pos;
+ },
+ listSelections: function() { return this.sel.ranges; },
+ somethingSelected: function() {return this.sel.somethingSelected();},
+
+ setCursor: docMethodOp(function(line, ch, options) {
+ setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options);
+ }),
+ setSelection: docMethodOp(function(anchor, head, options) {
+ setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);
+ }),
+ extendSelection: docMethodOp(function(head, other, options) {
+ extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);
+ }),
+ extendSelections: docMethodOp(function(heads, options) {
+ extendSelections(this, clipPosArray(this, heads), options);
+ }),
+ extendSelectionsBy: docMethodOp(function(f, options) {
+ var heads = map(this.sel.ranges, f);
+ extendSelections(this, clipPosArray(this, heads), options);
+ }),
+ setSelections: docMethodOp(function(ranges, primary, options) {
+ if (!ranges.length) return;
+ for (var i = 0, out = []; i < ranges.length; i++)
+ out[i] = new Range(clipPos(this, ranges[i].anchor),
+ clipPos(this, ranges[i].head));
+ if (primary == null) primary = Math.min(ranges.length - 1, this.sel.primIndex);
+ setSelection(this, normalizeSelection(out, primary), options);
+ }),
+ addSelection: docMethodOp(function(anchor, head, options) {
+ var ranges = this.sel.ranges.slice(0);
+ ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));
+ setSelection(this, normalizeSelection(ranges, ranges.length - 1), options);
+ }),
+
+ getSelection: function(lineSep) {
+ var ranges = this.sel.ranges, lines;
+ for (var i = 0; i < ranges.length; i++) {
+ var sel = getBetween(this, ranges[i].from(), ranges[i].to());
+ lines = lines ? lines.concat(sel) : sel;
+ }
+ if (lineSep === false) return lines;
+ else return lines.join(lineSep || this.lineSeparator());
+ },
+ getSelections: function(lineSep) {
+ var parts = [], ranges = this.sel.ranges;
+ for (var i = 0; i < ranges.length; i++) {
+ var sel = getBetween(this, ranges[i].from(), ranges[i].to());
+ if (lineSep !== false) sel = sel.join(lineSep || this.lineSeparator());
+ parts[i] = sel;
+ }
+ return parts;
+ },
+ replaceSelection: function(code, collapse, origin) {
+ var dup = [];
+ for (var i = 0; i < this.sel.ranges.length; i++)
+ dup[i] = code;
+ this.replaceSelections(dup, collapse, origin || "+input");
+ },
+ replaceSelections: docMethodOp(function(code, collapse, origin) {
+ var changes = [], sel = this.sel;
+ for (var i = 0; i < sel.ranges.length; i++) {
+ var range = sel.ranges[i];
+ changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin};
+ }
+ var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse);
+ for (var i = changes.length - 1; i >= 0; i--)
+ makeChange(this, changes[i]);
+ if (newSel) setSelectionReplaceHistory(this, newSel);
+ else if (this.cm) ensureCursorVisible(this.cm);
+ }),
+ undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}),
+ redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}),
+ undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}),
+ redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}),
+
+ setExtending: function(val) {this.extend = val;},
+ getExtending: function() {return this.extend;},
+
+ historySize: function() {
+ var hist = this.history, done = 0, undone = 0;
+ for (var i = 0; i < hist.done.length; i++) if (!hist.done[i].ranges) ++done;
+ for (var i = 0; i < hist.undone.length; i++) if (!hist.undone[i].ranges) ++undone;
+ return {undo: done, redo: undone};
+ },
+ clearHistory: function() {this.history = new History(this.history.maxGeneration);},
+
+ markClean: function() {
+ this.cleanGeneration = this.changeGeneration(true);
+ },
+ changeGeneration: function(forceSplit) {
+ if (forceSplit)
+ this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null;
+ return this.history.generation;
+ },
+ isClean: function (gen) {
+ return this.history.generation == (gen || this.cleanGeneration);
+ },
+
+ getHistory: function() {
+ return {done: copyHistoryArray(this.history.done),
+ undone: copyHistoryArray(this.history.undone)};
+ },
+ setHistory: function(histData) {
+ var hist = this.history = new History(this.history.maxGeneration);
+ hist.done = copyHistoryArray(histData.done.slice(0), null, true);
+ hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);
+ },
+
+ addLineClass: docMethodOp(function(handle, where, cls) {
+ return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function(line) {
+ var prop = where == "text" ? "textClass"
+ : where == "background" ? "bgClass"
+ : where == "gutter" ? "gutterClass" : "wrapClass";
+ if (!line[prop]) line[prop] = cls;
+ else if (classTest(cls).test(line[prop])) return false;
+ else line[prop] += " " + cls;
+ return true;
+ });
+ }),
+ removeLineClass: docMethodOp(function(handle, where, cls) {
+ return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function(line) {
+ var prop = where == "text" ? "textClass"
+ : where == "background" ? "bgClass"
+ : where == "gutter" ? "gutterClass" : "wrapClass";
+ var cur = line[prop];
+ if (!cur) return false;
+ else if (cls == null) line[prop] = null;
+ else {
+ var found = cur.match(classTest(cls));
+ if (!found) return false;
+ var end = found.index + found[0].length;
+ line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null;
+ }
+ return true;
+ });
+ }),
+
+ addLineWidget: docMethodOp(function(handle, node, options) {
+ return addLineWidget(this, handle, node, options);
+ }),
+ removeLineWidget: function(widget) { widget.clear(); },
+
+ markText: function(from, to, options) {
+ return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range");
+ },
+ setBookmark: function(pos, options) {
+ var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),
+ insertLeft: options && options.insertLeft,
+ clearWhenEmpty: false, shared: options && options.shared,
+ handleMouseEvents: options && options.handleMouseEvents};
+ pos = clipPos(this, pos);
+ return markText(this, pos, pos, realOpts, "bookmark");
+ },
+ findMarksAt: function(pos) {
+ pos = clipPos(this, pos);
+ var markers = [], spans = getLine(this, pos.line).markedSpans;
+ if (spans) for (var i = 0; i < spans.length; ++i) {
+ var span = spans[i];
+ if ((span.from == null || span.from <= pos.ch) &&
+ (span.to == null || span.to >= pos.ch))
+ markers.push(span.marker.parent || span.marker);
+ }
+ return markers;
+ },
+ findMarks: function(from, to, filter) {
+ from = clipPos(this, from); to = clipPos(this, to);
+ var found = [], lineNo = from.line;
+ this.iter(from.line, to.line + 1, function(line) {
+ var spans = line.markedSpans;
+ if (spans) for (var i = 0; i < spans.length; i++) {
+ var span = spans[i];
+ if (!(span.to != null && lineNo == from.line && from.ch > span.to ||
+ span.from == null && lineNo != from.line ||
+ span.from != null && lineNo == to.line && span.from > to.ch) &&
+ (!filter || filter(span.marker)))
+ found.push(span.marker.parent || span.marker);
+ }
+ ++lineNo;
+ });
+ return found;
+ },
+ getAllMarks: function() {
+ var markers = [];
+ this.iter(function(line) {
+ var sps = line.markedSpans;
+ if (sps) for (var i = 0; i < sps.length; ++i)
+ if (sps[i].from != null) markers.push(sps[i].marker);
+ });
+ return markers;
+ },
+
+ posFromIndex: function(off) {
+ var ch, lineNo = this.first;
+ this.iter(function(line) {
+ var sz = line.text.length + 1;
+ if (sz > off) { ch = off; return true; }
+ off -= sz;
+ ++lineNo;
+ });
+ return clipPos(this, Pos(lineNo, ch));
+ },
+ indexFromPos: function (coords) {
+ coords = clipPos(this, coords);
+ var index = coords.ch;
+ if (coords.line < this.first || coords.ch < 0) return 0;
+ this.iter(this.first, coords.line, function (line) {
+ index += line.text.length + 1;
+ });
+ return index;
+ },
+
+ copy: function(copyHistory) {
+ var doc = new Doc(getLines(this, this.first, this.first + this.size),
+ this.modeOption, this.first, this.lineSep);
+ doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;
+ doc.sel = this.sel;
+ doc.extend = false;
+ if (copyHistory) {
+ doc.history.undoDepth = this.history.undoDepth;
+ doc.setHistory(this.getHistory());
+ }
+ return doc;
+ },
+
+ linkedDoc: function(options) {
+ if (!options) options = {};
+ var from = this.first, to = this.first + this.size;
+ if (options.from != null && options.from > from) from = options.from;
+ if (options.to != null && options.to < to) to = options.to;
+ var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep);
+ if (options.sharedHist) copy.history = this.history;
+ (this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});
+ copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];
+ copySharedMarkers(copy, findSharedMarkers(this));
+ return copy;
+ },
+ unlinkDoc: function(other) {
+ if (other instanceof CodeMirror) other = other.doc;
+ if (this.linked) for (var i = 0; i < this.linked.length; ++i) {
+ var link = this.linked[i];
+ if (link.doc != other) continue;
+ this.linked.splice(i, 1);
+ other.unlinkDoc(this);
+ detachSharedMarkers(findSharedMarkers(this));
+ break;
+ }
+ // If the histories were shared, split them again
+ if (other.history == this.history) {
+ var splitIds = [other.id];
+ linkedDocs(other, function(doc) {splitIds.push(doc.id);}, true);
+ other.history = new History(null);
+ other.history.done = copyHistoryArray(this.history.done, splitIds);
+ other.history.undone = copyHistoryArray(this.history.undone, splitIds);
+ }
+ },
+ iterLinkedDocs: function(f) {linkedDocs(this, f);},
+
+ getMode: function() {return this.mode;},
+ getEditor: function() {return this.cm;},
+
+ splitLines: function(str) {
+ if (this.lineSep) return str.split(this.lineSep);
+ return splitLinesAuto(str);
+ },
+ lineSeparator: function() { return this.lineSep || "\n"; }
+ });
+
+ // Public alias.
+ Doc.prototype.eachLine = Doc.prototype.iter;
+
+ // Set up methods on CodeMirror's prototype to redirect to the editor's document.
+ var dontDelegate = "iter insert remove copy getEditor constructor".split(" ");
+ for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)
+ CodeMirror.prototype[prop] = (function(method) {
+ return function() {return method.apply(this.doc, arguments);};
+ })(Doc.prototype[prop]);
+
+ eventMixin(Doc);
+
+ // Call f for all linked documents.
+ function linkedDocs(doc, f, sharedHistOnly) {
+ function propagate(doc, skip, sharedHist) {
+ if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) {
+ var rel = doc.linked[i];
+ if (rel.doc == skip) continue;
+ var shared = sharedHist && rel.sharedHist;
+ if (sharedHistOnly && !shared) continue;
+ f(rel.doc, shared);
+ propagate(rel.doc, doc, shared);
+ }
+ }
+ propagate(doc, null, true);
+ }
+
+ // Attach a document to an editor.
+ function attachDoc(cm, doc) {
+ if (doc.cm) throw new Error("This document is already in use.");
+ cm.doc = doc;
+ doc.cm = cm;
+ estimateLineHeights(cm);
+ loadMode(cm);
+ if (!cm.options.lineWrapping) findMaxLine(cm);
+ cm.options.mode = doc.modeOption;
+ regChange(cm);
+ }
+
+ // LINE UTILITIES
+
+ // Find the line object corresponding to the given line number.
+ function getLine(doc, n) {
+ n -= doc.first;
+ if (n < 0 || n >= doc.size) throw new Error("There is no line " + (n + doc.first) + " in the document.");
+ for (var chunk = doc; !chunk.lines;) {
+ for (var i = 0;; ++i) {
+ var child = chunk.children[i], sz = child.chunkSize();
+ if (n < sz) { chunk = child; break; }
+ n -= sz;
+ }
+ }
+ return chunk.lines[n];
+ }
+
+ // Get the part of a document between two positions, as an array of
+ // strings.
+ function getBetween(doc, start, end) {
+ var out = [], n = start.line;
+ doc.iter(start.line, end.line + 1, function(line) {
+ var text = line.text;
+ if (n == end.line) text = text.slice(0, end.ch);
+ if (n == start.line) text = text.slice(start.ch);
+ out.push(text);
+ ++n;
+ });
+ return out;
+ }
+ // Get the lines between from and to, as array of strings.
+ function getLines(doc, from, to) {
+ var out = [];
+ doc.iter(from, to, function(line) { out.push(line.text); });
+ return out;
+ }
+
+ // Update the height of a line, propagating the height change
+ // upwards to parent nodes.
+ function updateLineHeight(line, height) {
+ var diff = height - line.height;
+ if (diff) for (var n = line; n; n = n.parent) n.height += diff;
+ }
+
+ // Given a line object, find its line number by walking up through
+ // its parent links.
+ function lineNo(line) {
+ if (line.parent == null) return null;
+ var cur = line.parent, no = indexOf(cur.lines, line);
+ for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
+ for (var i = 0;; ++i) {
+ if (chunk.children[i] == cur) break;
+ no += chunk.children[i].chunkSize();
+ }
+ }
+ return no + cur.first;
+ }
+
+ // Find the line at the given vertical position, using the height
+ // information in the document tree.
+ function lineAtHeight(chunk, h) {
+ var n = chunk.first;
+ outer: do {
+ for (var i = 0; i < chunk.children.length; ++i) {
+ var child = chunk.children[i], ch = child.height;
+ if (h < ch) { chunk = child; continue outer; }
+ h -= ch;
+ n += child.chunkSize();
+ }
+ return n;
+ } while (!chunk.lines);
+ for (var i = 0; i < chunk.lines.length; ++i) {
+ var line = chunk.lines[i], lh = line.height;
+ if (h < lh) break;
+ h -= lh;
+ }
+ return n + i;
+ }
+
+
+ // Find the height above the given line.
+ function heightAtLine(lineObj) {
+ lineObj = visualLine(lineObj);
+
+ var h = 0, chunk = lineObj.parent;
+ for (var i = 0; i < chunk.lines.length; ++i) {
+ var line = chunk.lines[i];
+ if (line == lineObj) break;
+ else h += line.height;
+ }
+ for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {
+ for (var i = 0; i < p.children.length; ++i) {
+ var cur = p.children[i];
+ if (cur == chunk) break;
+ else h += cur.height;
+ }
+ }
+ return h;
+ }
+
+ // Get the bidi ordering for the given line (and cache it). Returns
+ // false for lines that are fully left-to-right, and an array of
+ // BidiSpan objects otherwise.
+ function getOrder(line) {
+ var order = line.order;
+ if (order == null) order = line.order = bidiOrdering(line.text);
+ return order;
+ }
+
+ // HISTORY
+
+ function History(startGen) {
+ // Arrays of change events and selections. Doing something adds an
+ // event to done and clears undo. Undoing moves events from done
+ // to undone, redoing moves them in the other direction.
+ this.done = []; this.undone = [];
+ this.undoDepth = Infinity;
+ // Used to track when changes can be merged into a single undo
+ // event
+ this.lastModTime = this.lastSelTime = 0;
+ this.lastOp = this.lastSelOp = null;
+ this.lastOrigin = this.lastSelOrigin = null;
+ // Used by the isClean() method
+ this.generation = this.maxGeneration = startGen || 1;
+ }
+
+ // Create a history change event from an updateDoc-style change
+ // object.
+ function historyChangeFromChange(doc, change) {
+ var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};
+ attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);
+ linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true);
+ return histChange;
+ }
+
+ // Pop all selection events off the end of a history array. Stop at
+ // a change event.
+ function clearSelectionEvents(array) {
+ while (array.length) {
+ var last = lst(array);
+ if (last.ranges) array.pop();
+ else break;
+ }
+ }
+
+ // Find the top change event in the history. Pop off selection
+ // events that are in the way.
+ function lastChangeEvent(hist, force) {
+ if (force) {
+ clearSelectionEvents(hist.done);
+ return lst(hist.done);
+ } else if (hist.done.length && !lst(hist.done).ranges) {
+ return lst(hist.done);
+ } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {
+ hist.done.pop();
+ return lst(hist.done);
+ }
+ }
+
+ // Register a change in the history. Merges changes that are within
+ // a single operation, ore are close together with an origin that
+ // allows merging (starting with "+") into a single event.
+ function addChangeToHistory(doc, change, selAfter, opId) {
+ var hist = doc.history;
+ hist.undone.length = 0;
+ var time = +new Date, cur;
+
+ if ((hist.lastOp == opId ||
+ hist.lastOrigin == change.origin && change.origin &&
+ ((change.origin.charAt(0) == "+" && doc.cm && hist.lastModTime > time - doc.cm.options.historyEventDelay) ||
+ change.origin.charAt(0) == "*")) &&
+ (cur = lastChangeEvent(hist, hist.lastOp == opId))) {
+ // Merge this change into the last event
+ var last = lst(cur.changes);
+ if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {
+ // Optimized case for simple insertion -- don't want to add
+ // new changesets for every character typed
+ last.to = changeEnd(change);
+ } else {
+ // Add new sub-event
+ cur.changes.push(historyChangeFromChange(doc, change));
+ }
+ } else {
+ // Can not be merged, start a new event.
+ var before = lst(hist.done);
+ if (!before || !before.ranges)
+ pushSelectionToHistory(doc.sel, hist.done);
+ cur = {changes: [historyChangeFromChange(doc, change)],
+ generation: hist.generation};
+ hist.done.push(cur);
+ while (hist.done.length > hist.undoDepth) {
+ hist.done.shift();
+ if (!hist.done[0].ranges) hist.done.shift();
+ }
+ }
+ hist.done.push(selAfter);
+ hist.generation = ++hist.maxGeneration;
+ hist.lastModTime = hist.lastSelTime = time;
+ hist.lastOp = hist.lastSelOp = opId;
+ hist.lastOrigin = hist.lastSelOrigin = change.origin;
+
+ if (!last) signal(doc, "historyAdded");
+ }
+
+ function selectionEventCanBeMerged(doc, origin, prev, sel) {
+ var ch = origin.charAt(0);
+ return ch == "*" ||
+ ch == "+" &&
+ prev.ranges.length == sel.ranges.length &&
+ prev.somethingSelected() == sel.somethingSelected() &&
+ new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500);
+ }
+
+ // Called whenever the selection changes, sets the new selection as
+ // the pending selection in the history, and pushes the old pending
+ // selection into the 'done' array when it was significantly
+ // different (in number of selected ranges, emptiness, or time).
+ function addSelectionToHistory(doc, sel, opId, options) {
+ var hist = doc.history, origin = options && options.origin;
+
+ // A new event is started when the previous origin does not match
+ // the current, or the origins don't allow matching. Origins
+ // starting with * are always merged, those starting with + are
+ // merged when similar and close together in time.
+ if (opId == hist.lastSelOp ||
+ (origin && hist.lastSelOrigin == origin &&
+ (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||
+ selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))
+ hist.done[hist.done.length - 1] = sel;
+ else
+ pushSelectionToHistory(sel, hist.done);
+
+ hist.lastSelTime = +new Date;
+ hist.lastSelOrigin = origin;
+ hist.lastSelOp = opId;
+ if (options && options.clearRedo !== false)
+ clearSelectionEvents(hist.undone);
+ }
+
+ function pushSelectionToHistory(sel, dest) {
+ var top = lst(dest);
+ if (!(top && top.ranges && top.equals(sel)))
+ dest.push(sel);
+ }
+
+ // Used to store marked span information in the history.
+ function attachLocalSpans(doc, change, from, to) {
+ var existing = change["spans_" + doc.id], n = 0;
+ doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function(line) {
+ if (line.markedSpans)
+ (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans;
+ ++n;
+ });
+ }
+
+ // When un/re-doing restores text containing marked spans, those
+ // that have been explicitly cleared should not be restored.
+ function removeClearedSpans(spans) {
+ if (!spans) return null;
+ for (var i = 0, out; i < spans.length; ++i) {
+ if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); }
+ else if (out) out.push(spans[i]);
+ }
+ return !out ? spans : out.length ? out : null;
+ }
+
+ // Retrieve and filter the old marked spans stored in a change event.
+ function getOldSpans(doc, change) {
+ var found = change["spans_" + doc.id];
+ if (!found) return null;
+ for (var i = 0, nw = []; i < change.text.length; ++i)
+ nw.push(removeClearedSpans(found[i]));
+ return nw;
+ }
+
+ // Used both to provide a JSON-safe object in .getHistory, and, when
+ // detaching a document, to split the history in two
+ function copyHistoryArray(events, newGroup, instantiateSel) {
+ for (var i = 0, copy = []; i < events.length; ++i) {
+ var event = events[i];
+ if (event.ranges) {
+ copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);
+ continue;
+ }
+ var changes = event.changes, newChanges = [];
+ copy.push({changes: newChanges});
+ for (var j = 0; j < changes.length; ++j) {
+ var change = changes[j], m;
+ newChanges.push({from: change.from, to: change.to, text: change.text});
+ if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\d+)$/)) {
+ if (indexOf(newGroup, Number(m[1])) > -1) {
+ lst(newChanges)[prop] = change[prop];
+ delete change[prop];
+ }
+ }
+ }
+ }
+ return copy;
+ }
+
+ // Rebasing/resetting history to deal with externally-sourced changes
+
+ function rebaseHistSelSingle(pos, from, to, diff) {
+ if (to < pos.line) {
+ pos.line += diff;
+ } else if (from < pos.line) {
+ pos.line = from;
+ pos.ch = 0;
+ }
+ }
+
+ // Tries to rebase an array of history events given a change in the
+ // document. If the change touches the same lines as the event, the
+ // event, and everything 'behind' it, is discarded. If the change is
+ // before the event, the event's positions are updated. Uses a
+ // copy-on-write scheme for the positions, to avoid having to
+ // reallocate them all on every rebase, but also avoid problems with
+ // shared position objects being unsafely updated.
+ function rebaseHistArray(array, from, to, diff) {
+ for (var i = 0; i < array.length; ++i) {
+ var sub = array[i], ok = true;
+ if (sub.ranges) {
+ if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }
+ for (var j = 0; j < sub.ranges.length; j++) {
+ rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);
+ rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);
+ }
+ continue;
+ }
+ for (var j = 0; j < sub.changes.length; ++j) {
+ var cur = sub.changes[j];
+ if (to < cur.from.line) {
+ cur.from = Pos(cur.from.line + diff, cur.from.ch);
+ cur.to = Pos(cur.to.line + diff, cur.to.ch);
+ } else if (from <= cur.to.line) {
+ ok = false;
+ break;
+ }
+ }
+ if (!ok) {
+ array.splice(0, i + 1);
+ i = 0;
+ }
+ }
+ }
+
+ function rebaseHist(hist, change) {
+ var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;
+ rebaseHistArray(hist.done, from, to, diff);
+ rebaseHistArray(hist.undone, from, to, diff);
+ }
+
+ // EVENT UTILITIES
+
+ // Due to the fact that we still support jurassic IE versions, some
+ // compatibility wrappers are needed.
+
+ var e_preventDefault = CodeMirror.e_preventDefault = function(e) {
+ if (e.preventDefault) e.preventDefault();
+ else e.returnValue = false;
+ };
+ var e_stopPropagation = CodeMirror.e_stopPropagation = function(e) {
+ if (e.stopPropagation) e.stopPropagation();
+ else e.cancelBubble = true;
+ };
+ function e_defaultPrevented(e) {
+ return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false;
+ }
+ var e_stop = CodeMirror.e_stop = function(e) {e_preventDefault(e); e_stopPropagation(e);};
+
+ function e_target(e) {return e.target || e.srcElement;}
+ function e_button(e) {
+ var b = e.which;
+ if (b == null) {
+ if (e.button & 1) b = 1;
+ else if (e.button & 2) b = 3;
+ else if (e.button & 4) b = 2;
+ }
+ if (mac && e.ctrlKey && b == 1) b = 3;
+ return b;
+ }
+
+ // EVENT HANDLING
+
+ // Lightweight event framework. on/off also work on DOM nodes,
+ // registering native DOM handlers.
+
+ var on = CodeMirror.on = function(emitter, type, f) {
+ if (emitter.addEventListener)
+ emitter.addEventListener(type, f, false);
+ else if (emitter.attachEvent)
+ emitter.attachEvent("on" + type, f);
+ else {
+ var map = emitter._handlers || (emitter._handlers = {});
+ var arr = map[type] || (map[type] = []);
+ arr.push(f);
+ }
+ };
+
+ var noHandlers = []
+ function getHandlers(emitter, type, copy) {
+ var arr = emitter._handlers && emitter._handlers[type]
+ if (copy) return arr && arr.length > 0 ? arr.slice() : noHandlers
+ else return arr || noHandlers
+ }
+
+ var off = CodeMirror.off = function(emitter, type, f) {
+ if (emitter.removeEventListener)
+ emitter.removeEventListener(type, f, false);
+ else if (emitter.detachEvent)
+ emitter.detachEvent("on" + type, f);
+ else {
+ var handlers = getHandlers(emitter, type, false)
+ for (var i = 0; i < handlers.length; ++i)
+ if (handlers[i] == f) { handlers.splice(i, 1); break; }
+ }
+ };
+
+ var signal = CodeMirror.signal = function(emitter, type /*, values...*/) {
+ var handlers = getHandlers(emitter, type, true)
+ if (!handlers.length) return;
+ var args = Array.prototype.slice.call(arguments, 2);
+ for (var i = 0; i < handlers.length; ++i) handlers[i].apply(null, args);
+ };
+
+ var orphanDelayedCallbacks = null;
+
+ // Often, we want to signal events at a point where we are in the
+ // middle of some work, but don't want the handler to start calling
+ // other methods on the editor, which might be in an inconsistent
+ // state or simply not expect any other events to happen.
+ // signalLater looks whether there are any handlers, and schedules
+ // them to be executed when the last operation ends, or, if no
+ // operation is active, when a timeout fires.
+ function signalLater(emitter, type /*, values...*/) {
+ var arr = getHandlers(emitter, type, false)
+ if (!arr.length) return;
+ var args = Array.prototype.slice.call(arguments, 2), list;
+ if (operationGroup) {
+ list = operationGroup.delayedCallbacks;
+ } else if (orphanDelayedCallbacks) {
+ list = orphanDelayedCallbacks;
+ } else {
+ list = orphanDelayedCallbacks = [];
+ setTimeout(fireOrphanDelayed, 0);
+ }
+ function bnd(f) {return function(){f.apply(null, args);};};
+ for (var i = 0; i < arr.length; ++i)
+ list.push(bnd(arr[i]));
+ }
+
+ function fireOrphanDelayed() {
+ var delayed = orphanDelayedCallbacks;
+ orphanDelayedCallbacks = null;
+ for (var i = 0; i < delayed.length; ++i) delayed[i]();
+ }
+
+ // The DOM events that CodeMirror handles can be overridden by
+ // registering a (non-DOM) handler on the editor for the event name,
+ // and preventDefault-ing the event in that handler.
+ function signalDOMEvent(cm, e, override) {
+ if (typeof e == "string")
+ e = {type: e, preventDefault: function() { this.defaultPrevented = true; }};
+ signal(cm, override || e.type, cm, e);
+ return e_defaultPrevented(e) || e.codemirrorIgnore;
+ }
+
+ function signalCursorActivity(cm) {
+ var arr = cm._handlers && cm._handlers.cursorActivity;
+ if (!arr) return;
+ var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);
+ for (var i = 0; i < arr.length; ++i) if (indexOf(set, arr[i]) == -1)
+ set.push(arr[i]);
+ }
+
+ function hasHandler(emitter, type) {
+ return getHandlers(emitter, type).length > 0
+ }
+
+ // Add on and off methods to a constructor's prototype, to make
+ // registering events on such objects more convenient.
+ function eventMixin(ctor) {
+ ctor.prototype.on = function(type, f) {on(this, type, f);};
+ ctor.prototype.off = function(type, f) {off(this, type, f);};
+ }
+
+ // MISC UTILITIES
+
+ // Number of pixels added to scroller and sizer to hide scrollbar
+ var scrollerGap = 30;
+
+ // Returned or thrown by various protocols to signal 'I'm not
+ // handling this'.
+ var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}};
+
+ // Reused option objects for setSelection & friends
+ var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"};
+
+ function Delayed() {this.id = null;}
+ Delayed.prototype.set = function(ms, f) {
+ clearTimeout(this.id);
+ this.id = setTimeout(f, ms);
+ };
+
+ // Counts the column offset in a string, taking tabs into account.
+ // Used mostly to find indentation.
+ var countColumn = CodeMirror.countColumn = function(string, end, tabSize, startIndex, startValue) {
+ if (end == null) {
+ end = string.search(/[^\s\u00a0]/);
+ if (end == -1) end = string.length;
+ }
+ for (var i = startIndex || 0, n = startValue || 0;;) {
+ var nextTab = string.indexOf("\t", i);
+ if (nextTab < 0 || nextTab >= end)
+ return n + (end - i);
+ n += nextTab - i;
+ n += tabSize - (n % tabSize);
+ i = nextTab + 1;
+ }
+ };
+
+ // The inverse of countColumn -- find the offset that corresponds to
+ // a particular column.
+ var findColumn = CodeMirror.findColumn = function(string, goal, tabSize) {
+ for (var pos = 0, col = 0;;) {
+ var nextTab = string.indexOf("\t", pos);
+ if (nextTab == -1) nextTab = string.length;
+ var skipped = nextTab - pos;
+ if (nextTab == string.length || col + skipped >= goal)
+ return pos + Math.min(skipped, goal - col);
+ col += nextTab - pos;
+ col += tabSize - (col % tabSize);
+ pos = nextTab + 1;
+ if (col >= goal) return pos;
+ }
+ }
+
+ var spaceStrs = [""];
+ function spaceStr(n) {
+ while (spaceStrs.length <= n)
+ spaceStrs.push(lst(spaceStrs) + " ");
+ return spaceStrs[n];
+ }
+
+ function lst(arr) { return arr[arr.length-1]; }
+
+ var selectInput = function(node) { node.select(); };
+ if (ios) // Mobile Safari apparently has a bug where select() is broken.
+ selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; };
+ else if (ie) // Suppress mysterious IE10 errors
+ selectInput = function(node) { try { node.select(); } catch(_e) {} };
+
+ function indexOf(array, elt) {
+ for (var i = 0; i < array.length; ++i)
+ if (array[i] == elt) return i;
+ return -1;
+ }
+ function map(array, f) {
+ var out = [];
+ for (var i = 0; i < array.length; i++) out[i] = f(array[i], i);
+ return out;
+ }
+
+ function nothing() {}
+
+ function createObj(base, props) {
+ var inst;
+ if (Object.create) {
+ inst = Object.create(base);
+ } else {
+ nothing.prototype = base;
+ inst = new nothing();
+ }
+ if (props) copyObj(props, inst);
+ return inst;
+ };
+
+ function copyObj(obj, target, overwrite) {
+ if (!target) target = {};
+ for (var prop in obj)
+ if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))
+ target[prop] = obj[prop];
+ return target;
+ }
+
+ function bind(f) {
+ var args = Array.prototype.slice.call(arguments, 1);
+ return function(){return f.apply(null, args);};
+ }
+
+ var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
+ var isWordCharBasic = CodeMirror.isWordChar = function(ch) {
+ return /\w/.test(ch) || ch > "\x80" &&
+ (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch));
+ };
+ function isWordChar(ch, helper) {
+ if (!helper) return isWordCharBasic(ch);
+ if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) return true;
+ return helper.test(ch);
+ }
+
+ function isEmpty(obj) {
+ for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false;
+ return true;
+ }
+
+ // Extending unicode characters. A series of a non-extending char +
+ // any number of extending chars is treated as a single unit as far
+ // as editing and measuring is concerned. This is not fully correct,
+ // since some scripts/fonts/browsers also treat other configurations
+ // of code points as a group.
+ var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;
+ function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); }
+
+ // DOM UTILITIES
+
+ function elt(tag, content, className, style) {
+ var e = document.createElement(tag);
+ if (className) e.className = className;
+ if (style) e.style.cssText = style;
+ if (typeof content == "string") e.appendChild(document.createTextNode(content));
+ else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]);
+ return e;
+ }
+
+ var range;
+ if (document.createRange) range = function(node, start, end, endNode) {
+ var r = document.createRange();
+ r.setEnd(endNode || node, end);
+ r.setStart(node, start);
+ return r;
+ };
+ else range = function(node, start, end) {
+ var r = document.body.createTextRange();
+ try { r.moveToElementText(node.parentNode); }
+ catch(e) { return r; }
+ r.collapse(true);
+ r.moveEnd("character", end);
+ r.moveStart("character", start);
+ return r;
+ };
+
+ function removeChildren(e) {
+ for (var count = e.childNodes.length; count > 0; --count)
+ e.removeChild(e.firstChild);
+ return e;
+ }
+
+ function removeChildrenAndAdd(parent, e) {
+ return removeChildren(parent).appendChild(e);
+ }
+
+ var contains = CodeMirror.contains = function(parent, child) {
+ if (child.nodeType == 3) // Android browser always returns false when child is a textnode
+ child = child.parentNode;
+ if (parent.contains)
+ return parent.contains(child);
+ do {
+ if (child.nodeType == 11) child = child.host;
+ if (child == parent) return true;
+ } while (child = child.parentNode);
+ };
+
+ function activeElt() {
+ var activeElement = document.activeElement;
+ while (activeElement && activeElement.root && activeElement.root.activeElement)
+ activeElement = activeElement.root.activeElement;
+ return activeElement;
+ }
+ // Older versions of IE throws unspecified error when touching
+ // document.activeElement in some cases (during loading, in iframe)
+ if (ie && ie_version < 11) activeElt = function() {
+ try { return document.activeElement; }
+ catch(e) { return document.body; }
+ };
+
+ function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); }
+ var rmClass = CodeMirror.rmClass = function(node, cls) {
+ var current = node.className;
+ var match = classTest(cls).exec(current);
+ if (match) {
+ var after = current.slice(match.index + match[0].length);
+ node.className = current.slice(0, match.index) + (after ? match[1] + after : "");
+ }
+ };
+ var addClass = CodeMirror.addClass = function(node, cls) {
+ var current = node.className;
+ if (!classTest(cls).test(current)) node.className += (current ? " " : "") + cls;
+ };
+ function joinClasses(a, b) {
+ var as = a.split(" ");
+ for (var i = 0; i < as.length; i++)
+ if (as[i] && !classTest(as[i]).test(b)) b += " " + as[i];
+ return b;
+ }
+
+ // WINDOW-WIDE EVENTS
+
+ // These must be handled carefully, because naively registering a
+ // handler for each editor will cause the editors to never be
+ // garbage collected.
+
+ function forEachCodeMirror(f) {
+ if (!document.body.getElementsByClassName) return;
+ var byClass = document.body.getElementsByClassName("CodeMirror");
+ for (var i = 0; i < byClass.length; i++) {
+ var cm = byClass[i].CodeMirror;
+ if (cm) f(cm);
+ }
+ }
+
+ var globalsRegistered = false;
+ function ensureGlobalHandlers() {
+ if (globalsRegistered) return;
+ registerGlobalHandlers();
+ globalsRegistered = true;
+ }
+ function registerGlobalHandlers() {
+ // When the window resizes, we need to refresh active editors.
+ var resizeTimer;
+ on(window, "resize", function() {
+ if (resizeTimer == null) resizeTimer = setTimeout(function() {
+ resizeTimer = null;
+ forEachCodeMirror(onResize);
+ }, 100);
+ });
+ // When the window loses focus, we want to show the editor as blurred
+ on(window, "blur", function() {
+ forEachCodeMirror(onBlur);
+ });
+ }
+
+ // FEATURE DETECTION
+
+ // Detect drag-and-drop
+ var dragAndDrop = function() {
+ // There is *some* kind of drag-and-drop support in IE6-8, but I
+ // couldn't get it to work yet.
+ if (ie && ie_version < 9) return false;
+ var div = elt('div');
+ return "draggable" in div || "dragDrop" in div;
+ }();
+
+ var zwspSupported;
+ function zeroWidthElement(measure) {
+ if (zwspSupported == null) {
+ var test = elt("span", "\u200b");
+ removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")]));
+ if (measure.firstChild.offsetHeight != 0)
+ zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8);
+ }
+ var node = zwspSupported ? elt("span", "\u200b") :
+ elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px");
+ node.setAttribute("cm-text", "");
+ return node;
+ }
+
+ // Feature-detect IE's crummy client rect reporting for bidi text
+ var badBidiRects;
+ function hasBadBidiRects(measure) {
+ if (badBidiRects != null) return badBidiRects;
+ var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA"));
+ var r0 = range(txt, 0, 1).getBoundingClientRect();
+ if (!r0 || r0.left == r0.right) return false; // Safari returns null in some cases (#2780)
+ var r1 = range(txt, 1, 2).getBoundingClientRect();
+ return badBidiRects = (r1.right - r0.right < 3);
+ }
+
+ // See if "".split is the broken IE version, if so, provide an
+ // alternative way to split lines.
+ var splitLinesAuto = CodeMirror.splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) {
+ var pos = 0, result = [], l = string.length;
+ while (pos <= l) {
+ var nl = string.indexOf("\n", pos);
+ if (nl == -1) nl = string.length;
+ var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl);
+ var rt = line.indexOf("\r");
+ if (rt != -1) {
+ result.push(line.slice(0, rt));
+ pos += rt + 1;
+ } else {
+ result.push(line);
+ pos = nl + 1;
+ }
+ }
+ return result;
+ } : function(string){return string.split(/\r\n?|\n/);};
+
+ var hasSelection = window.getSelection ? function(te) {
+ try { return te.selectionStart != te.selectionEnd; }
+ catch(e) { return false; }
+ } : function(te) {
+ try {var range = te.ownerDocument.selection.createRange();}
+ catch(e) {}
+ if (!range || range.parentElement() != te) return false;
+ return range.compareEndPoints("StartToEnd", range) != 0;
+ };
+
+ var hasCopyEvent = (function() {
+ var e = elt("div");
+ if ("oncopy" in e) return true;
+ e.setAttribute("oncopy", "return;");
+ return typeof e.oncopy == "function";
+ })();
+
+ var badZoomedRects = null;
+ function hasBadZoomedRects(measure) {
+ if (badZoomedRects != null) return badZoomedRects;
+ var node = removeChildrenAndAdd(measure, elt("span", "x"));
+ var normal = node.getBoundingClientRect();
+ var fromRange = range(node, 0, 1).getBoundingClientRect();
+ return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1;
+ }
+
+ // KEY NAMES
+
+ var keyNames = CodeMirror.keyNames = {
+ 3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
+ 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
+ 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
+ 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod",
+ 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 127: "Delete",
+ 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\",
+ 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete",
+ 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert"
+ };
+ (function() {
+ // Number keys
+ for (var i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = String(i);
+ // Alphabetic keys
+ for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);
+ // Function keys
+ for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i;
+ })();
+
+ // BIDI HELPERS
+
+ function iterateBidiSections(order, from, to, f) {
+ if (!order) return f(from, to, "ltr");
+ var found = false;
+ for (var i = 0; i < order.length; ++i) {
+ var part = order[i];
+ if (part.from < to && part.to > from || from == to && part.to == from) {
+ f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr");
+ found = true;
+ }
+ }
+ if (!found) f(from, to, "ltr");
+ }
+
+ function bidiLeft(part) { return part.level % 2 ? part.to : part.from; }
+ function bidiRight(part) { return part.level % 2 ? part.from : part.to; }
+
+ function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; }
+ function lineRight(line) {
+ var order = getOrder(line);
+ if (!order) return line.text.length;
+ return bidiRight(lst(order));
+ }
+
+ function lineStart(cm, lineN) {
+ var line = getLine(cm.doc, lineN);
+ var visual = visualLine(line);
+ if (visual != line) lineN = lineNo(visual);
+ var order = getOrder(visual);
+ var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual);
+ return Pos(lineN, ch);
+ }
+ function lineEnd(cm, lineN) {
+ var merged, line = getLine(cm.doc, lineN);
+ while (merged = collapsedSpanAtEnd(line)) {
+ line = merged.find(1, true).line;
+ lineN = null;
+ }
+ var order = getOrder(line);
+ var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line);
+ return Pos(lineN == null ? lineNo(line) : lineN, ch);
+ }
+ function lineStartSmart(cm, pos) {
+ var start = lineStart(cm, pos.line);
+ var line = getLine(cm.doc, start.line);
+ var order = getOrder(line);
+ if (!order || order[0].level == 0) {
+ var firstNonWS = Math.max(0, line.text.search(/\S/));
+ var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;
+ return Pos(start.line, inWS ? 0 : firstNonWS);
+ }
+ return start;
+ }
+
+ function compareBidiLevel(order, a, b) {
+ var linedir = order[0].level;
+ if (a == linedir) return true;
+ if (b == linedir) return false;
+ return a < b;
+ }
+ var bidiOther;
+ function getBidiPartAt(order, pos) {
+ bidiOther = null;
+ for (var i = 0, found; i < order.length; ++i) {
+ var cur = order[i];
+ if (cur.from < pos && cur.to > pos) return i;
+ if ((cur.from == pos || cur.to == pos)) {
+ if (found == null) {
+ found = i;
+ } else if (compareBidiLevel(order, cur.level, order[found].level)) {
+ if (cur.from != cur.to) bidiOther = found;
+ return i;
+ } else {
+ if (cur.from != cur.to) bidiOther = i;
+ return found;
+ }
+ }
+ }
+ return found;
+ }
+
+ function moveInLine(line, pos, dir, byUnit) {
+ if (!byUnit) return pos + dir;
+ do pos += dir;
+ while (pos > 0 && isExtendingChar(line.text.charAt(pos)));
+ return pos;
+ }
+
+ // This is needed in order to move 'visually' through bi-directional
+ // text -- i.e., pressing left should make the cursor go left, even
+ // when in RTL text. The tricky part is the 'jumps', where RTL and
+ // LTR text touch each other. This often requires the cursor offset
+ // to move more than one unit, in order to visually move one unit.
+ function moveVisually(line, start, dir, byUnit) {
+ var bidi = getOrder(line);
+ if (!bidi) return moveLogically(line, start, dir, byUnit);
+ var pos = getBidiPartAt(bidi, start), part = bidi[pos];
+ var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit);
+
+ for (;;) {
+ if (target > part.from && target < part.to) return target;
+ if (target == part.from || target == part.to) {
+ if (getBidiPartAt(bidi, target) == pos) return target;
+ part = bidi[pos += dir];
+ return (dir > 0) == part.level % 2 ? part.to : part.from;
+ } else {
+ part = bidi[pos += dir];
+ if (!part) return null;
+ if ((dir > 0) == part.level % 2)
+ target = moveInLine(line, part.to, -1, byUnit);
+ else
+ target = moveInLine(line, part.from, 1, byUnit);
+ }
+ }
+ }
+
+ function moveLogically(line, start, dir, byUnit) {
+ var target = start + dir;
+ if (byUnit) while (target > 0 && isExtendingChar(line.text.charAt(target))) target += dir;
+ return target < 0 || target > line.text.length ? null : target;
+ }
+
+ // Bidirectional ordering algorithm
+ // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm
+ // that this (partially) implements.
+
+ // One-char codes used for character types:
+ // L (L): Left-to-Right
+ // R (R): Right-to-Left
+ // r (AL): Right-to-Left Arabic
+ // 1 (EN): European Number
+ // + (ES): European Number Separator
+ // % (ET): European Number Terminator
+ // n (AN): Arabic Number
+ // , (CS): Common Number Separator
+ // m (NSM): Non-Spacing Mark
+ // b (BN): Boundary Neutral
+ // s (B): Paragraph Separator
+ // t (S): Segment Separator
+ // w (WS): Whitespace
+ // N (ON): Other Neutrals
+
+ // Returns null if characters are ordered as they appear
+ // (left-to-right), or an array of sections ({from, to, level}
+ // objects) in the order in which they occur visually.
+ var bidiOrdering = (function() {
+ // Character types for codepoints 0 to 0xff
+ var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN";
+ // Character types for codepoints 0x600 to 0x6ff
+ var arabicTypes = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm";
+ function charType(code) {
+ if (code <= 0xf7) return lowTypes.charAt(code);
+ else if (0x590 <= code && code <= 0x5f4) return "R";
+ else if (0x600 <= code && code <= 0x6ed) return arabicTypes.charAt(code - 0x600);
+ else if (0x6ee <= code && code <= 0x8ac) return "r";
+ else if (0x2000 <= code && code <= 0x200b) return "w";
+ else if (code == 0x200c) return "b";
+ else return "L";
+ }
+
+ var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;
+ var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;
+ // Browsers seem to always treat the boundaries of block elements as being L.
+ var outerType = "L";
+
+ function BidiSpan(level, from, to) {
+ this.level = level;
+ this.from = from; this.to = to;
+ }
+
+ return function(str) {
+ if (!bidiRE.test(str)) return false;
+ var len = str.length, types = [];
+ for (var i = 0, type; i < len; ++i)
+ types.push(type = charType(str.charCodeAt(i)));
+
+ // W1. Examine each non-spacing mark (NSM) in the level run, and
+ // change the type of the NSM to the type of the previous
+ // character. If the NSM is at the start of the level run, it will
+ // get the type of sor.
+ for (var i = 0, prev = outerType; i < len; ++i) {
+ var type = types[i];
+ if (type == "m") types[i] = prev;
+ else prev = type;
+ }
+
+ // W2. Search backwards from each instance of a European number
+ // until the first strong type (R, L, AL, or sor) is found. If an
+ // AL is found, change the type of the European number to Arabic
+ // number.
+ // W3. Change all ALs to R.
+ for (var i = 0, cur = outerType; i < len; ++i) {
+ var type = types[i];
+ if (type == "1" && cur == "r") types[i] = "n";
+ else if (isStrong.test(type)) { cur = type; if (type == "r") types[i] = "R"; }
+ }
+
+ // W4. A single European separator between two European numbers
+ // changes to a European number. A single common separator between
+ // two numbers of the same type changes to that type.
+ for (var i = 1, prev = types[0]; i < len - 1; ++i) {
+ var type = types[i];
+ if (type == "+" && prev == "1" && types[i+1] == "1") types[i] = "1";
+ else if (type == "," && prev == types[i+1] &&
+ (prev == "1" || prev == "n")) types[i] = prev;
+ prev = type;
+ }
+
+ // W5. A sequence of European terminators adjacent to European
+ // numbers changes to all European numbers.
+ // W6. Otherwise, separators and terminators change to Other
+ // Neutral.
+ for (var i = 0; i < len; ++i) {
+ var type = types[i];
+ if (type == ",") types[i] = "N";
+ else if (type == "%") {
+ for (var end = i + 1; end < len && types[end] == "%"; ++end) {}
+ var replace = (i && types[i-1] == "!") || (end < len && types[end] == "1") ? "1" : "N";
+ for (var j = i; j < end; ++j) types[j] = replace;
+ i = end - 1;
+ }
+ }
+
+ // W7. Search backwards from each instance of a European number
+ // until the first strong type (R, L, or sor) is found. If an L is
+ // found, then change the type of the European number to L.
+ for (var i = 0, cur = outerType; i < len; ++i) {
+ var type = types[i];
+ if (cur == "L" && type == "1") types[i] = "L";
+ else if (isStrong.test(type)) cur = type;
+ }
+
+ // N1. A sequence of neutrals takes the direction of the
+ // surrounding strong text if the text on both sides has the same
+ // direction. European and Arabic numbers act as if they were R in
+ // terms of their influence on neutrals. Start-of-level-run (sor)
+ // and end-of-level-run (eor) are used at level run boundaries.
+ // N2. Any remaining neutrals take the embedding direction.
+ for (var i = 0; i < len; ++i) {
+ if (isNeutral.test(types[i])) {
+ for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {}
+ var before = (i ? types[i-1] : outerType) == "L";
+ var after = (end < len ? types[end] : outerType) == "L";
+ var replace = before || after ? "L" : "R";
+ for (var j = i; j < end; ++j) types[j] = replace;
+ i = end - 1;
+ }
+ }
+
+ // Here we depart from the documented algorithm, in order to avoid
+ // building up an actual levels array. Since there are only three
+ // levels (0, 1, 2) in an implementation that doesn't take
+ // explicit embedding into account, we can build up the order on
+ // the fly, without following the level-based algorithm.
+ var order = [], m;
+ for (var i = 0; i < len;) {
+ if (countsAsLeft.test(types[i])) {
+ var start = i;
+ for (++i; i < len && countsAsLeft.test(types[i]); ++i) {}
+ order.push(new BidiSpan(0, start, i));
+ } else {
+ var pos = i, at = order.length;
+ for (++i; i < len && types[i] != "L"; ++i) {}
+ for (var j = pos; j < i;) {
+ if (countsAsNum.test(types[j])) {
+ if (pos < j) order.splice(at, 0, new BidiSpan(1, pos, j));
+ var nstart = j;
+ for (++j; j < i && countsAsNum.test(types[j]); ++j) {}
+ order.splice(at, 0, new BidiSpan(2, nstart, j));
+ pos = j;
+ } else ++j;
+ }
+ if (pos < i) order.splice(at, 0, new BidiSpan(1, pos, i));
+ }
+ }
+ if (order[0].level == 1 && (m = str.match(/^\s+/))) {
+ order[0].from = m[0].length;
+ order.unshift(new BidiSpan(0, 0, m[0].length));
+ }
+ if (lst(order).level == 1 && (m = str.match(/\s+$/))) {
+ lst(order).to -= m[0].length;
+ order.push(new BidiSpan(0, len - m[0].length, len));
+ }
+ if (order[0].level == 2)
+ order.unshift(new BidiSpan(1, order[0].to, order[0].to));
+ if (order[0].level != lst(order).level)
+ order.push(new BidiSpan(order[0].level, len, len));
+
+ return order;
+ };
+ })();
+
+ // THE END
+
+ CodeMirror.version = "5.13.4";
+
+ return CodeMirror;
+});
+
+;// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+(function(mod) {
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
+ mod(require("../../lib/codemirror"));
+ else if (typeof define == "function" && define.amd) // AMD
+ define(["../../lib/codemirror"], mod);
+ else // Plain browser env
+ mod(CodeMirror);
+})(function(CodeMirror) {
+ "use strict";
+
+ CodeMirror.defineSimpleMode = function(name, states) {
+ CodeMirror.defineMode(name, function(config) {
+ return CodeMirror.simpleMode(config, states);
+ });
+ };
+
+ CodeMirror.simpleMode = function(config, states) {
+ ensureState(states, "start");
+ var states_ = {}, meta = states.meta || {}, hasIndentation = false;
+ for (var state in states) if (state != meta && states.hasOwnProperty(state)) {
+ var list = states_[state] = [], orig = states[state];
+ for (var i = 0; i < orig.length; i++) {
+ var data = orig[i];
+ list.push(new Rule(data, states));
+ if (data.indent || data.dedent) hasIndentation = true;
+ }
+ }
+ var mode = {
+ startState: function() {
+ return {state: "start", pending: null,
+ local: null, localState: null,
+ indent: hasIndentation ? [] : null};
+ },
+ copyState: function(state) {
+ var s = {state: state.state, pending: state.pending,
+ local: state.local, localState: null,
+ indent: state.indent && state.indent.slice(0)};
+ if (state.localState)
+ s.localState = CodeMirror.copyState(state.local.mode, state.localState);
+ if (state.stack)
+ s.stack = state.stack.slice(0);
+ for (var pers = state.persistentStates; pers; pers = pers.next)
+ s.persistentStates = {mode: pers.mode,
+ spec: pers.spec,
+ state: pers.state == state.localState ? s.localState : CodeMirror.copyState(pers.mode, pers.state),
+ next: s.persistentStates};
+ return s;
+ },
+ token: tokenFunction(states_, config),
+ innerMode: function(state) { return state.local && {mode: state.local.mode, state: state.localState}; },
+ indent: indentFunction(states_, meta)
+ };
+ if (meta) for (var prop in meta) if (meta.hasOwnProperty(prop))
+ mode[prop] = meta[prop];
+ return mode;
+ };
+
+ function ensureState(states, name) {
+ if (!states.hasOwnProperty(name))
+ throw new Error("Undefined state " + name + " in simple mode");
+ }
+
+ function toRegex(val, caret) {
+ if (!val) return /(?:)/;
+ var flags = "";
+ if (val instanceof RegExp) {
+ if (val.ignoreCase) flags = "i";
+ val = val.source;
+ } else {
+ val = String(val);
+ }
+ return new RegExp((caret === false ? "" : "^") + "(?:" + val + ")", flags);
+ }
+
+ function asToken(val) {
+ if (!val) return null;
+ if (typeof val == "string") return val.replace(/\./g, " ");
+ var result = [];
+ for (var i = 0; i < val.length; i++)
+ result.push(val[i] && val[i].replace(/\./g, " "));
+ return result;
+ }
+
+ function Rule(data, states) {
+ if (data.next || data.push) ensureState(states, data.next || data.push);
+ this.regex = toRegex(data.regex);
+ this.token = asToken(data.token);
+ this.data = data;
+ }
+
+ function tokenFunction(states, config) {
+ return function(stream, state) {
+ if (state.pending) {
+ var pend = state.pending.shift();
+ if (state.pending.length == 0) state.pending = null;
+ stream.pos += pend.text.length;
+ return pend.token;
+ }
+
+ if (state.local) {
+ if (state.local.end && stream.match(state.local.end)) {
+ var tok = state.local.endToken || null;
+ state.local = state.localState = null;
+ return tok;
+ } else {
+ var tok = state.local.mode.token(stream, state.localState), m;
+ if (state.local.endScan && (m = state.local.endScan.exec(stream.current())))
+ stream.pos = stream.start + m.index;
+ return tok;
+ }
+ }
+
+ var curState = states[state.state];
+ for (var i = 0; i < curState.length; i++) {
+ var rule = curState[i];
+ var matches = (!rule.data.sol || stream.sol()) && stream.match(rule.regex);
+ if (matches) {
+ if (rule.data.next) {
+ state.state = rule.data.next;
+ } else if (rule.data.push) {
+ (state.stack || (state.stack = [])).push(state.state);
+ state.state = rule.data.push;
+ } else if (rule.data.pop && state.stack && state.stack.length) {
+ state.state = state.stack.pop();
+ }
+
+ if (rule.data.mode)
+ enterLocalMode(config, state, rule.data.mode, rule.token);
+ if (rule.data.indent)
+ state.indent.push(stream.indentation() + config.indentUnit);
+ if (rule.data.dedent)
+ state.indent.pop();
+ if (matches.length > 2) {
+ state.pending = [];
+ for (var j = 2; j < matches.length; j++)
+ if (matches[j])
+ state.pending.push({text: matches[j], token: rule.token[j - 1]});
+ stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0));
+ return rule.token[0];
+ } else if (rule.token && rule.token.join) {
+ return rule.token[0];
+ } else {
+ return rule.token;
+ }
+ }
+ }
+ stream.next();
+ return null;
+ };
+ }
+
+ function cmp(a, b) {
+ if (a === b) return true;
+ if (!a || typeof a != "object" || !b || typeof b != "object") return false;
+ var props = 0;
+ for (var prop in a) if (a.hasOwnProperty(prop)) {
+ if (!b.hasOwnProperty(prop) || !cmp(a[prop], b[prop])) return false;
+ props++;
+ }
+ for (var prop in b) if (b.hasOwnProperty(prop)) props--;
+ return props == 0;
+ }
+
+ function enterLocalMode(config, state, spec, token) {
+ var pers;
+ if (spec.persistent) for (var p = state.persistentStates; p && !pers; p = p.next)
+ if (spec.spec ? cmp(spec.spec, p.spec) : spec.mode == p.mode) pers = p;
+ var mode = pers ? pers.mode : spec.mode || CodeMirror.getMode(config, spec.spec);
+ var lState = pers ? pers.state : CodeMirror.startState(mode);
+ if (spec.persistent && !pers)
+ state.persistentStates = {mode: mode, spec: spec.spec, state: lState, next: state.persistentStates};
+
+ state.localState = lState;
+ state.local = {mode: mode,
+ end: spec.end && toRegex(spec.end),
+ endScan: spec.end && spec.forceEnd !== false && toRegex(spec.end, false),
+ endToken: token && token.join ? token[token.length - 1] : token};
+ }
+
+ function indexOf(val, arr) {
+ for (var i = 0; i < arr.length; i++) if (arr[i] === val) return true;
+ }
+
+ function indentFunction(states, meta) {
+ return function(state, textAfter, line) {
+ if (state.local && state.local.mode.indent)
+ return state.local.mode.indent(state.localState, textAfter, line);
+ if (state.indent == null || state.local || meta.dontIndentStates && indexOf(state.state, meta.dontIndentStates) > -1)
+ return CodeMirror.Pass;
+
+ var pos = state.indent.length - 1, rules = states[state.state];
+ scan: for (;;) {
+ for (var i = 0; i < rules.length; i++) {
+ var rule = rules[i];
+ if (rule.data.dedent && rule.data.dedentIfLineStart !== false) {
+ var m = rule.regex.exec(textAfter);
+ if (m && m[0]) {
+ pos--;
+ if (rule.next || rule.push) rules = states[rule.next || rule.push];
+ textAfter = textAfter.slice(m[0].length);
+ continue scan;
+ }
+ }
+ }
+ break;
+ }
+ return pos < 0 ? 0 : state.indent[pos];
+ };
+ }
+});
+
+;// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+(function(mod) {
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
+ mod(require("../../lib/codemirror"));
+ else if (typeof define == "function" && define.amd) // AMD
+ define(["../../lib/codemirror"], mod);
+ else // Plain browser env
+ mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+CodeMirror.multiplexingMode = function(outer /*, others */) {
+ // Others should be {open, close, mode [, delimStyle] [, innerStyle]} objects
+ var others = Array.prototype.slice.call(arguments, 1);
+
+ function indexOf(string, pattern, from, returnEnd) {
+ if (typeof pattern == "string") {
+ var found = string.indexOf(pattern, from);
+ return returnEnd && found > -1 ? found + pattern.length : found;
+ }
+ var m = pattern.exec(from ? string.slice(from) : string);
+ return m ? m.index + from + (returnEnd ? m[0].length : 0) : -1;
+ }
+
+ return {
+ startState: function() {
+ return {
+ outer: CodeMirror.startState(outer),
+ innerActive: null,
+ inner: null
+ };
+ },
+
+ copyState: function(state) {
+ return {
+ outer: CodeMirror.copyState(outer, state.outer),
+ innerActive: state.innerActive,
+ inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner)
+ };
+ },
+
+ token: function(stream, state) {
+ if (!state.innerActive) {
+ var cutOff = Infinity, oldContent = stream.string;
+ for (var i = 0; i < others.length; ++i) {
+ var other = others[i];
+ var found = indexOf(oldContent, other.open, stream.pos);
+ if (found == stream.pos) {
+ if (!other.parseDelimiters) stream.match(other.open);
+ state.innerActive = other;
+ state.inner = CodeMirror.startState(other.mode, outer.indent ? outer.indent(state.outer, "") : 0);
+ return other.delimStyle && (other.delimStyle + " " + other.delimStyle + "-open");
+ } else if (found != -1 && found < cutOff) {
+ cutOff = found;
+ }
+ }
+ if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff);
+ var outerToken = outer.token(stream, state.outer);
+ if (cutOff != Infinity) stream.string = oldContent;
+ return outerToken;
+ } else {
+ var curInner = state.innerActive, oldContent = stream.string;
+ if (!curInner.close && stream.sol()) {
+ state.innerActive = state.inner = null;
+ return this.token(stream, state);
+ }
+ var found = curInner.close ? indexOf(oldContent, curInner.close, stream.pos, curInner.parseDelimiters) : -1;
+ if (found == stream.pos && !curInner.parseDelimiters) {
+ stream.match(curInner.close);
+ state.innerActive = state.inner = null;
+ return curInner.delimStyle && (curInner.delimStyle + " " + curInner.delimStyle + "-close");
+ }
+ if (found > -1) stream.string = oldContent.slice(0, found);
+ var innerToken = curInner.mode.token(stream, state.inner);
+ if (found > -1) stream.string = oldContent;
+
+ if (found == stream.pos && curInner.parseDelimiters)
+ state.innerActive = state.inner = null;
+
+ if (curInner.innerStyle) {
+ if (innerToken) innerToken = innerToken + " " + curInner.innerStyle;
+ else innerToken = curInner.innerStyle;
+ }
+
+ return innerToken;
+ }
+ },
+
+ indent: function(state, textAfter) {
+ var mode = state.innerActive ? state.innerActive.mode : outer;
+ if (!mode.indent) return CodeMirror.Pass;
+ return mode.indent(state.innerActive ? state.inner : state.outer, textAfter);
+ },
+
+ blankLine: function(state) {
+ var mode = state.innerActive ? state.innerActive.mode : outer;
+ if (mode.blankLine) {
+ mode.blankLine(state.innerActive ? state.inner : state.outer);
+ }
+ if (!state.innerActive) {
+ for (var i = 0; i < others.length; ++i) {
+ var other = others[i];
+ if (other.open === "\n") {
+ state.innerActive = other;
+ state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, "") : 0);
+ }
+ }
+ } else if (state.innerActive.close === "\n") {
+ state.innerActive = state.inner = null;
+ }
+ },
+
+ electricChars: outer.electricChars,
+
+ innerMode: function(state) {
+ return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer};
+ }
+ };
+};
+
+});
+
+;// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+(function(mod) {
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
+ mod(require("bower_components/codemirror/lib/codemirror"),
+ require("bower_components/codemirror/addon/mode/simple"));
+ else if (typeof define == "function" && define.amd) // AMD
+ define(["bower_components/codemirror/lib/codemirror",
+ "bower_components/codemirror/addon/mode/simple"], mod);
+ else // Plain browser env
+ mod(CodeMirror);
+})(function(CodeMirror) {
+ "use strict";
+
+ CodeMirror.defineMode("htmlhandlebars", function(config) {
+ return CodeMirror.multiplexingMode(
+ CodeMirror.getMode(config, "text/html"),
+ {open: "{{", close: "}}",
+ mode: CodeMirror.getMode(config, "handlebars"),
+ parseDelimiters: true});
+ });
+
+ CodeMirror.defineMIME("text/x-handlebars-template", "htmlhandlebars");
+});
+
+;// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+// TODO actually recognize syntax of TypeScript constructs
+
+(function(mod) {
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
+ mod(require("../../lib/codemirror"));
+ else if (typeof define == "function" && define.amd) // AMD
+ define(["../../lib/codemirror"], mod);
+ else // Plain browser env
+ mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+function expressionAllowed(stream, state, backUp) {
+ return /^(?:operator|sof|keyword c|case|new|[\[{}\(,;:]|=>)$/.test(state.lastType) ||
+ (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))))
+}
+
+CodeMirror.defineMode("javascript", function(config, parserConfig) {
+ var indentUnit = config.indentUnit;
+ var statementIndent = parserConfig.statementIndent;
+ var jsonldMode = parserConfig.jsonld;
+ var jsonMode = parserConfig.json || jsonldMode;
+ var isTS = parserConfig.typescript;
+ var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/;
+
+ // Tokenizer
+
+ var keywords = function(){
+ function kw(type) {return {type: type, style: "keyword"};}
+ var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
+ var operator = kw("operator"), atom = {type: "atom", style: "atom"};
+
+ var jsKeywords = {
+ "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,
+ "return": C, "break": C, "continue": C, "new": kw("new"), "delete": C, "throw": C, "debugger": C,
+ "var": kw("var"), "const": kw("var"), "let": kw("var"),
+ "function": kw("function"), "catch": kw("catch"),
+ "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
+ "in": operator, "typeof": operator, "instanceof": operator,
+ "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom,
+ "this": kw("this"), "class": kw("class"), "super": kw("atom"),
+ "yield": C, "export": kw("export"), "import": kw("import"), "extends": C
+ };
+
+ // Extend the 'normal' keywords with the TypeScript language extensions
+ if (isTS) {
+ var type = {type: "variable", style: "variable-3"};
+ var tsKeywords = {
+ // object-like things
+ "interface": kw("class"),
+ "implements": C,
+ "namespace": C,
+ "module": kw("module"),
+ "enum": kw("module"),
+
+ // scope modifiers
+ "public": kw("modifier"),
+ "private": kw("modifier"),
+ "protected": kw("modifier"),
+ "abstract": kw("modifier"),
+
+ // operators
+ "as": operator,
+
+ // types
+ "string": type, "number": type, "boolean": type, "any": type
+ };
+
+ for (var attr in tsKeywords) {
+ jsKeywords[attr] = tsKeywords[attr];
+ }
+ }
+
+ return jsKeywords;
+ }();
+
+ var isOperatorChar = /[+\-*&%=<>!?|~^]/;
+ var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;
+
+ function readRegexp(stream) {
+ var escaped = false, next, inSet = false;
+ while ((next = stream.next()) != null) {
+ if (!escaped) {
+ if (next == "/" && !inSet) return;
+ if (next == "[") inSet = true;
+ else if (inSet && next == "]") inSet = false;
+ }
+ escaped = !escaped && next == "\\";
+ }
+ }
+
+ // Used as scratch variables to communicate multiple values without
+ // consing up tons of objects.
+ var type, content;
+ function ret(tp, style, cont) {
+ type = tp; content = cont;
+ return style;
+ }
+ function tokenBase(stream, state) {
+ var ch = stream.next();
+ if (ch == '"' || ch == "'") {
+ state.tokenize = tokenString(ch);
+ return state.tokenize(stream, state);
+ } else if (ch == "." && stream.match(/^\d+(?:[eE][+\-]?\d+)?/)) {
+ return ret("number", "number");
+ } else if (ch == "." && stream.match("..")) {
+ return ret("spread", "meta");
+ } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
+ return ret(ch);
+ } else if (ch == "=" && stream.eat(">")) {
+ return ret("=>", "operator");
+ } else if (ch == "0" && stream.eat(/x/i)) {
+ stream.eatWhile(/[\da-f]/i);
+ return ret("number", "number");
+ } else if (ch == "0" && stream.eat(/o/i)) {
+ stream.eatWhile(/[0-7]/i);
+ return ret("number", "number");
+ } else if (ch == "0" && stream.eat(/b/i)) {
+ stream.eatWhile(/[01]/i);
+ return ret("number", "number");
+ } else if (/\d/.test(ch)) {
+ stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);
+ return ret("number", "number");
+ } else if (ch == "/") {
+ if (stream.eat("*")) {
+ state.tokenize = tokenComment;
+ return tokenComment(stream, state);
+ } else if (stream.eat("/")) {
+ stream.skipToEnd();
+ return ret("comment", "comment");
+ } else if (expressionAllowed(stream, state, 1)) {
+ readRegexp(stream);
+ stream.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/);
+ return ret("regexp", "string-2");
+ } else {
+ stream.eatWhile(isOperatorChar);
+ return ret("operator", "operator", stream.current());
+ }
+ } else if (ch == "`") {
+ state.tokenize = tokenQuasi;
+ return tokenQuasi(stream, state);
+ } else if (ch == "#") {
+ stream.skipToEnd();
+ return ret("error", "error");
+ } else if (isOperatorChar.test(ch)) {
+ stream.eatWhile(isOperatorChar);
+ return ret("operator", "operator", stream.current());
+ } else if (wordRE.test(ch)) {
+ stream.eatWhile(wordRE);
+ var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
+ return (known && state.lastType != ".") ? ret(known.type, known.style, word) :
+ ret("variable", "variable", word);
+ }
+ }
+
+ function tokenString(quote) {
+ return function(stream, state) {
+ var escaped = false, next;
+ if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)){
+ state.tokenize = tokenBase;
+ return ret("jsonld-keyword", "meta");
+ }
+ while ((next = stream.next()) != null) {
+ if (next == quote && !escaped) break;
+ escaped = !escaped && next == "\\";
+ }
+ if (!escaped) state.tokenize = tokenBase;
+ return ret("string", "string");
+ };
+ }
+
+ function tokenComment(stream, state) {
+ var maybeEnd = false, ch;
+ while (ch = stream.next()) {
+ if (ch == "/" && maybeEnd) {
+ state.tokenize = tokenBase;
+ break;
+ }
+ maybeEnd = (ch == "*");
+ }
+ return ret("comment", "comment");
+ }
+
+ function tokenQuasi(stream, state) {
+ var escaped = false, next;
+ while ((next = stream.next()) != null) {
+ if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) {
+ state.tokenize = tokenBase;
+ break;
+ }
+ escaped = !escaped && next == "\\";
+ }
+ return ret("quasi", "string-2", stream.current());
+ }
+
+ var brackets = "([{}])";
+ // This is a crude lookahead trick to try and notice that we're
+ // parsing the argument patterns for a fat-arrow function before we
+ // actually hit the arrow token. It only works if the arrow is on
+ // the same line as the arguments and there's no strange noise
+ // (comments) in between. Fallback is to only notice when we hit the
+ // arrow, and not declare the arguments as locals for the arrow
+ // body.
+ function findFatArrow(stream, state) {
+ if (state.fatArrowAt) state.fatArrowAt = null;
+ var arrow = stream.string.indexOf("=>", stream.start);
+ if (arrow < 0) return;
+
+ var depth = 0, sawSomething = false;
+ for (var pos = arrow - 1; pos >= 0; --pos) {
+ var ch = stream.string.charAt(pos);
+ var bracket = brackets.indexOf(ch);
+ if (bracket >= 0 && bracket < 3) {
+ if (!depth) { ++pos; break; }
+ if (--depth == 0) break;
+ } else if (bracket >= 3 && bracket < 6) {
+ ++depth;
+ } else if (wordRE.test(ch)) {
+ sawSomething = true;
+ } else if (/["'\/]/.test(ch)) {
+ return;
+ } else if (sawSomething && !depth) {
+ ++pos;
+ break;
+ }
+ }
+ if (sawSomething && !depth) state.fatArrowAt = pos;
+ }
+
+ // Parser
+
+ var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true, "jsonld-keyword": true};
+
+ function JSLexical(indented, column, type, align, prev, info) {
+ this.indented = indented;
+ this.column = column;
+ this.type = type;
+ this.prev = prev;
+ this.info = info;
+ if (align != null) this.align = align;
+ }
+
+ function inScope(state, varname) {
+ for (var v = state.localVars; v; v = v.next)
+ if (v.name == varname) return true;
+ for (var cx = state.context; cx; cx = cx.prev) {
+ for (var v = cx.vars; v; v = v.next)
+ if (v.name == varname) return true;
+ }
+ }
+
+ function parseJS(state, style, type, content, stream) {
+ var cc = state.cc;
+ // Communicate our context to the combinators.
+ // (Less wasteful than consing up a hundred closures on every call.)
+ cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style;
+
+ if (!state.lexical.hasOwnProperty("align"))
+ state.lexical.align = true;
+
+ while(true) {
+ var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;
+ if (combinator(type, content)) {
+ while(cc.length && cc[cc.length - 1].lex)
+ cc.pop()();
+ if (cx.marked) return cx.marked;
+ if (type == "variable" && inScope(state, content)) return "variable-2";
+ return style;
+ }
+ }
+ }
+
+ // Combinator utils
+
+ var cx = {state: null, column: null, marked: null, cc: null};
+ function pass() {
+ for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
+ }
+ function cont() {
+ pass.apply(null, arguments);
+ return true;
+ }
+ function register(varname) {
+ function inList(list) {
+ for (var v = list; v; v = v.next)
+ if (v.name == varname) return true;
+ return false;
+ }
+ var state = cx.state;
+ cx.marked = "def";
+ if (state.context) {
+ if (inList(state.localVars)) return;
+ state.localVars = {name: varname, next: state.localVars};
+ } else {
+ if (inList(state.globalVars)) return;
+ if (parserConfig.globalVars)
+ state.globalVars = {name: varname, next: state.globalVars};
+ }
+ }
+
+ // Combinators
+
+ var defaultVars = {name: "this", next: {name: "arguments"}};
+ function pushcontext() {
+ cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
+ cx.state.localVars = defaultVars;
+ }
+ function popcontext() {
+ cx.state.localVars = cx.state.context.vars;
+ cx.state.context = cx.state.context.prev;
+ }
+ function pushlex(type, info) {
+ var result = function() {
+ var state = cx.state, indent = state.indented;
+ if (state.lexical.type == "stat") indent = state.lexical.indented;
+ else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev)
+ indent = outer.indented;
+ state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);
+ };
+ result.lex = true;
+ return result;
+ }
+ function poplex() {
+ var state = cx.state;
+ if (state.lexical.prev) {
+ if (state.lexical.type == ")")
+ state.indented = state.lexical.indented;
+ state.lexical = state.lexical.prev;
+ }
+ }
+ poplex.lex = true;
+
+ function expect(wanted) {
+ function exp(type) {
+ if (type == wanted) return cont();
+ else if (wanted == ";") return pass();
+ else return cont(exp);
+ };
+ return exp;
+ }
+
+ function statement(type, value) {
+ if (type == "var") return cont(pushlex("vardef", value.length), vardef, expect(";"), poplex);
+ if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);
+ if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
+ if (type == "{") return cont(pushlex("}"), block, poplex);
+ if (type == ";") return cont();
+ if (type == "if") {
+ if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex)
+ cx.state.cc.pop()();
+ return cont(pushlex("form"), expression, statement, poplex, maybeelse);
+ }
+ if (type == "function") return cont(functiondef);
+ if (type == "for") return cont(pushlex("form"), forspec, statement, poplex);
+ if (type == "variable") return cont(pushlex("stat"), maybelabel);
+ if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
+ block, poplex, poplex);
+ if (type == "case") return cont(expression, expect(":"));
+ if (type == "default") return cont(expect(":"));
+ if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
+ statement, poplex, popcontext);
+ if (type == "class") return cont(pushlex("form"), className, poplex);
+ if (type == "export") return cont(pushlex("stat"), afterExport, poplex);
+ if (type == "import") return cont(pushlex("stat"), afterImport, poplex);
+ if (type == "module") return cont(pushlex("form"), pattern, pushlex("}"), expect("{"), block, poplex, poplex)
+ return pass(pushlex("stat"), expression, expect(";"), poplex);
+ }
+ function expression(type) {
+ return expressionInner(type, false);
+ }
+ function expressionNoComma(type) {
+ return expressionInner(type, true);
+ }
+ function expressionInner(type, noComma) {
+ if (cx.state.fatArrowAt == cx.stream.start) {
+ var body = noComma ? arrowBodyNoComma : arrowBody;
+ if (type == "(") return cont(pushcontext, pushlex(")"), commasep(pattern, ")"), poplex, expect("=>"), body, popcontext);
+ else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext);
+ }
+
+ var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;
+ if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);
+ if (type == "function") return cont(functiondef, maybeop);
+ if (type == "keyword c") return cont(noComma ? maybeexpressionNoComma : maybeexpression);
+ if (type == "(") return cont(pushlex(")"), maybeexpression, comprehension, expect(")"), poplex, maybeop);
+ if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression);
+ if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop);
+ if (type == "{") return contCommasep(objprop, "}", null, maybeop);
+ if (type == "quasi") return pass(quasi, maybeop);
+ if (type == "new") return cont(maybeTarget(noComma));
+ return cont();
+ }
+ function maybeexpression(type) {
+ if (type.match(/[;\}\)\],]/)) return pass();
+ return pass(expression);
+ }
+ function maybeexpressionNoComma(type) {
+ if (type.match(/[;\}\)\],]/)) return pass();
+ return pass(expressionNoComma);
+ }
+
+ function maybeoperatorComma(type, value) {
+ if (type == ",") return cont(expression);
+ return maybeoperatorNoComma(type, value, false);
+ }
+ function maybeoperatorNoComma(type, value, noComma) {
+ var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;
+ var expr = noComma == false ? expression : expressionNoComma;
+ if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);
+ if (type == "operator") {
+ if (/\+\+|--/.test(value)) return cont(me);
+ if (value == "?") return cont(expression, expect(":"), expr);
+ return cont(expr);
+ }
+ if (type == "quasi") { return pass(quasi, me); }
+ if (type == ";") return;
+ if (type == "(") return contCommasep(expressionNoComma, ")", "call", me);
+ if (type == ".") return cont(property, me);
+ if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me);
+ }
+ function quasi(type, value) {
+ if (type != "quasi") return pass();
+ if (value.slice(value.length - 2) != "${") return cont(quasi);
+ return cont(expression, continueQuasi);
+ }
+ function continueQuasi(type) {
+ if (type == "}") {
+ cx.marked = "string-2";
+ cx.state.tokenize = tokenQuasi;
+ return cont(quasi);
+ }
+ }
+ function arrowBody(type) {
+ findFatArrow(cx.stream, cx.state);
+ return pass(type == "{" ? statement : expression);
+ }
+ function arrowBodyNoComma(type) {
+ findFatArrow(cx.stream, cx.state);
+ return pass(type == "{" ? statement : expressionNoComma);
+ }
+ function maybeTarget(noComma) {
+ return function(type) {
+ if (type == ".") return cont(noComma ? targetNoComma : target);
+ else return pass(noComma ? expressionNoComma : expression);
+ };
+ }
+ function target(_, value) {
+ if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorComma); }
+ }
+ function targetNoComma(_, value) {
+ if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorNoComma); }
+ }
+ function maybelabel(type) {
+ if (type == ":") return cont(poplex, statement);
+ return pass(maybeoperatorComma, expect(";"), poplex);
+ }
+ function property(type) {
+ if (type == "variable") {cx.marked = "property"; return cont();}
+ }
+ function objprop(type, value) {
+ if (type == "variable" || cx.style == "keyword") {
+ cx.marked = "property";
+ if (value == "get" || value == "set") return cont(getterSetter);
+ return cont(afterprop);
+ } else if (type == "number" || type == "string") {
+ cx.marked = jsonldMode ? "property" : (cx.style + " property");
+ return cont(afterprop);
+ } else if (type == "jsonld-keyword") {
+ return cont(afterprop);
+ } else if (type == "modifier") {
+ return cont(objprop)
+ } else if (type == "[") {
+ return cont(expression, expect("]"), afterprop);
+ } else if (type == "spread") {
+ return cont(expression);
+ }
+ }
+ function getterSetter(type) {
+ if (type != "variable") return pass(afterprop);
+ cx.marked = "property";
+ return cont(functiondef);
+ }
+ function afterprop(type) {
+ if (type == ":") return cont(expressionNoComma);
+ if (type == "(") return pass(functiondef);
+ }
+ function commasep(what, end) {
+ function proceed(type) {
+ if (type == ",") {
+ var lex = cx.state.lexical;
+ if (lex.info == "call") lex.pos = (lex.pos || 0) + 1;
+ return cont(what, proceed);
+ }
+ if (type == end) return cont();
+ return cont(expect(end));
+ }
+ return function(type) {
+ if (type == end) return cont();
+ return pass(what, proceed);
+ };
+ }
+ function contCommasep(what, end, info) {
+ for (var i = 3; i < arguments.length; i++)
+ cx.cc.push(arguments[i]);
+ return cont(pushlex(end, info), commasep(what, end), poplex);
+ }
+ function block(type) {
+ if (type == "}") return cont();
+ return pass(statement, block);
+ }
+ function maybetype(type) {
+ if (isTS && type == ":") return cont(typedef);
+ }
+ function maybedefault(_, value) {
+ if (value == "=") return cont(expressionNoComma);
+ }
+ function typedef(type) {
+ if (type == "variable") {cx.marked = "variable-3"; return cont();}
+ }
+ function vardef() {
+ return pass(pattern, maybetype, maybeAssign, vardefCont);
+ }
+ function pattern(type, value) {
+ if (type == "modifier") return cont(pattern)
+ if (type == "variable") { register(value); return cont(); }
+ if (type == "spread") return cont(pattern);
+ if (type == "[") return contCommasep(pattern, "]");
+ if (type == "{") return contCommasep(proppattern, "}");
+ }
+ function proppattern(type, value) {
+ if (type == "variable" && !cx.stream.match(/^\s*:/, false)) {
+ register(value);
+ return cont(maybeAssign);
+ }
+ if (type == "variable") cx.marked = "property";
+ if (type == "spread") return cont(pattern);
+ if (type == "}") return pass();
+ return cont(expect(":"), pattern, maybeAssign);
+ }
+ function maybeAssign(_type, value) {
+ if (value == "=") return cont(expressionNoComma);
+ }
+ function vardefCont(type) {
+ if (type == ",") return cont(vardef);
+ }
+ function maybeelse(type, value) {
+ if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex);
+ }
+ function forspec(type) {
+ if (type == "(") return cont(pushlex(")"), forspec1, expect(")"), poplex);
+ }
+ function forspec1(type) {
+ if (type == "var") return cont(vardef, expect(";"), forspec2);
+ if (type == ";") return cont(forspec2);
+ if (type == "variable") return cont(formaybeinof);
+ return pass(expression, expect(";"), forspec2);
+ }
+ function formaybeinof(_type, value) {
+ if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); }
+ return cont(maybeoperatorComma, forspec2);
+ }
+ function forspec2(type, value) {
+ if (type == ";") return cont(forspec3);
+ if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); }
+ return pass(expression, expect(";"), forspec3);
+ }
+ function forspec3(type) {
+ if (type != ")") cont(expression);
+ }
+ function functiondef(type, value) {
+ if (value == "*") {cx.marked = "keyword"; return cont(functiondef);}
+ if (type == "variable") {register(value); return cont(functiondef);}
+ if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, statement, popcontext);
+ }
+ function funarg(type) {
+ if (type == "spread") return cont(funarg);
+ return pass(pattern, maybetype, maybedefault);
+ }
+ function className(type, value) {
+ if (type == "variable") {register(value); return cont(classNameAfter);}
+ }
+ function classNameAfter(type, value) {
+ if (value == "extends") return cont(expression, classNameAfter);
+ if (type == "{") return cont(pushlex("}"), classBody, poplex);
+ }
+ function classBody(type, value) {
+ if (type == "variable" || cx.style == "keyword") {
+ if (value == "static") {
+ cx.marked = "keyword";
+ return cont(classBody);
+ }
+ cx.marked = "property";
+ if (value == "get" || value == "set") return cont(classGetterSetter, functiondef, classBody);
+ return cont(functiondef, classBody);
+ }
+ if (value == "*") {
+ cx.marked = "keyword";
+ return cont(classBody);
+ }
+ if (type == ";") return cont(classBody);
+ if (type == "}") return cont();
+ }
+ function classGetterSetter(type) {
+ if (type != "variable") return pass();
+ cx.marked = "property";
+ return cont();
+ }
+ function afterExport(_type, value) {
+ if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); }
+ if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); }
+ return pass(statement);
+ }
+ function afterImport(type) {
+ if (type == "string") return cont();
+ return pass(importSpec, maybeFrom);
+ }
+ function importSpec(type, value) {
+ if (type == "{") return contCommasep(importSpec, "}");
+ if (type == "variable") register(value);
+ if (value == "*") cx.marked = "keyword";
+ return cont(maybeAs);
+ }
+ function maybeAs(_type, value) {
+ if (value == "as") { cx.marked = "keyword"; return cont(importSpec); }
+ }
+ function maybeFrom(_type, value) {
+ if (value == "from") { cx.marked = "keyword"; return cont(expression); }
+ }
+ function arrayLiteral(type) {
+ if (type == "]") return cont();
+ return pass(expressionNoComma, maybeArrayComprehension);
+ }
+ function maybeArrayComprehension(type) {
+ if (type == "for") return pass(comprehension, expect("]"));
+ if (type == ",") return cont(commasep(maybeexpressionNoComma, "]"));
+ return pass(commasep(expressionNoComma, "]"));
+ }
+ function comprehension(type) {
+ if (type == "for") return cont(forspec, comprehension);
+ if (type == "if") return cont(expression, comprehension);
+ }
+
+ function isContinuedStatement(state, textAfter) {
+ return state.lastType == "operator" || state.lastType == "," ||
+ isOperatorChar.test(textAfter.charAt(0)) ||
+ /[,.]/.test(textAfter.charAt(0));
+ }
+
+ // Interface
+
+ return {
+ startState: function(basecolumn) {
+ var state = {
+ tokenize: tokenBase,
+ lastType: "sof",
+ cc: [],
+ lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
+ localVars: parserConfig.localVars,
+ context: parserConfig.localVars && {vars: parserConfig.localVars},
+ indented: basecolumn || 0
+ };
+ if (parserConfig.globalVars && typeof parserConfig.globalVars == "object")
+ state.globalVars = parserConfig.globalVars;
+ return state;
+ },
+
+ token: function(stream, state) {
+ if (stream.sol()) {
+ if (!state.lexical.hasOwnProperty("align"))
+ state.lexical.align = false;
+ state.indented = stream.indentation();
+ findFatArrow(stream, state);
+ }
+ if (state.tokenize != tokenComment && stream.eatSpace()) return null;
+ var style = state.tokenize(stream, state);
+ if (type == "comment") return style;
+ state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type;
+ return parseJS(state, style, type, content, stream);
+ },
+
+ indent: function(state, textAfter) {
+ if (state.tokenize == tokenComment) return CodeMirror.Pass;
+ if (state.tokenize != tokenBase) return 0;
+ var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;
+ // Kludge to prevent 'maybelse' from blocking lexical scope pops
+ if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {
+ var c = state.cc[i];
+ if (c == poplex) lexical = lexical.prev;
+ else if (c != maybeelse) break;
+ }
+ if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev;
+ if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat")
+ lexical = lexical.prev;
+ var type = lexical.type, closing = firstChar == type;
+
+ if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info + 1 : 0);
+ else if (type == "form" && firstChar == "{") return lexical.indented;
+ else if (type == "form") return lexical.indented + indentUnit;
+ else if (type == "stat")
+ return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);
+ else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false)
+ return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
+ else if (lexical.align) return lexical.column + (closing ? 0 : 1);
+ else return lexical.indented + (closing ? 0 : indentUnit);
+ },
+
+ electricInput: /^\s*(?:case .*?:|default:|\{|\})$/,
+ blockCommentStart: jsonMode ? null : "/*",
+ blockCommentEnd: jsonMode ? null : "*/",
+ lineComment: jsonMode ? null : "//",
+ fold: "brace",
+ closeBrackets: "()[]{}''\"\"``",
+
+ helperType: jsonMode ? "json" : "javascript",
+ jsonldMode: jsonldMode,
+ jsonMode: jsonMode,
+
+ expressionAllowed: expressionAllowed,
+ skipExpression: function(state) {
+ var top = state.cc[state.cc.length - 1]
+ if (top == expression || top == expressionNoComma) state.cc.pop()
+ }
+ };
+});
+
+CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/);
+
+CodeMirror.defineMIME("text/javascript", "javascript");
+CodeMirror.defineMIME("text/ecmascript", "javascript");
+CodeMirror.defineMIME("application/javascript", "javascript");
+CodeMirror.defineMIME("application/x-javascript", "javascript");
+CodeMirror.defineMIME("application/ecmascript", "javascript");
+CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
+CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true});
+CodeMirror.defineMIME("application/ld+json", {name: "javascript", jsonld: true});
+CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true });
+CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true });
+
+});
+
+;// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+(function(mod) {
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
+ mod(require("../../lib/codemirror"));
+ else if (typeof define == "function" && define.amd) // AMD
+ define(["../../lib/codemirror"], mod);
+ else // Plain browser env
+ mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+CodeMirror.defineMode("sql", function(config, parserConfig) {
+ "use strict";
+
+ var client = parserConfig.client || {},
+ atoms = parserConfig.atoms || {"false": true, "true": true, "null": true},
+ builtin = parserConfig.builtin || {},
+ keywords = parserConfig.keywords || {},
+ operatorChars = parserConfig.operatorChars || /^[*+\-%<>!=&|~^]/,
+ support = parserConfig.support || {},
+ hooks = parserConfig.hooks || {},
+ dateSQL = parserConfig.dateSQL || {"date" : true, "time" : true, "timestamp" : true};
+
+ function tokenBase(stream, state) {
+ var ch = stream.next();
+
+ // call hooks from the mime type
+ if (hooks[ch]) {
+ var result = hooks[ch](stream, state);
+ if (result !== false) return result;
+ }
+
+ if (support.hexNumber == true &&
+ ((ch == "0" && stream.match(/^[xX][0-9a-fA-F]+/))
+ || (ch == "x" || ch == "X") && stream.match(/^'[0-9a-fA-F]+'/))) {
+ // hex
+ // ref: http://dev.mysql.com/doc/refman/5.5/en/hexadecimal-literals.html
+ return "number";
+ } else if (support.binaryNumber == true &&
+ (((ch == "b" || ch == "B") && stream.match(/^'[01]+'/))
+ || (ch == "0" && stream.match(/^b[01]+/)))) {
+ // bitstring
+ // ref: http://dev.mysql.com/doc/refman/5.5/en/bit-field-literals.html
+ return "number";
+ } else if (ch.charCodeAt(0) > 47 && ch.charCodeAt(0) < 58) {
+ // numbers
+ // ref: http://dev.mysql.com/doc/refman/5.5/en/number-literals.html
+ stream.match(/^[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/);
+ support.decimallessFloat == true && stream.eat('.');
+ return "number";
+ } else if (ch == "?" && (stream.eatSpace() || stream.eol() || stream.eat(";"))) {
+ // placeholders
+ return "variable-3";
+ } else if (ch == "'" || (ch == '"' && support.doubleQuote)) {
+ // strings
+ // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html
+ state.tokenize = tokenLiteral(ch);
+ return state.tokenize(stream, state);
+ } else if ((((support.nCharCast == true && (ch == "n" || ch == "N"))
+ || (support.charsetCast == true && ch == "_" && stream.match(/[a-z][a-z0-9]*/i)))
+ && (stream.peek() == "'" || stream.peek() == '"'))) {
+ // charset casting: _utf8'str', N'str', n'str'
+ // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html
+ return "keyword";
+ } else if (/^[\(\),\;\[\]]/.test(ch)) {
+ // no highlightning
+ return null;
+ } else if (support.commentSlashSlash && ch == "/" && stream.eat("/")) {
+ // 1-line comment
+ stream.skipToEnd();
+ return "comment";
+ } else if ((support.commentHash && ch == "#")
+ || (ch == "-" && stream.eat("-") && (!support.commentSpaceRequired || stream.eat(" ")))) {
+ // 1-line comments
+ // ref: https://kb.askmonty.org/en/comment-syntax/
+ stream.skipToEnd();
+ return "comment";
+ } else if (ch == "/" && stream.eat("*")) {
+ // multi-line comments
+ // ref: https://kb.askmonty.org/en/comment-syntax/
+ state.tokenize = tokenComment;
+ return state.tokenize(stream, state);
+ } else if (ch == ".") {
+ // .1 for 0.1
+ if (support.zerolessFloat == true && stream.match(/^(?:\d+(?:e[+-]?\d+)?)/i)) {
+ return "number";
+ }
+ // .table_name (ODBC)
+ // // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html
+ if (support.ODBCdotTable == true && stream.match(/^[a-zA-Z_]+/)) {
+ return "variable-2";
+ }
+ } else if (operatorChars.test(ch)) {
+ // operators
+ stream.eatWhile(operatorChars);
+ return null;
+ } else if (ch == '{' &&
+ (stream.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/) || stream.match(/^( )*(d|D|t|T|ts|TS)( )*"[^"]*"( )*}/))) {
+ // dates (weird ODBC syntax)
+ // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html
+ return "number";
+ } else {
+ stream.eatWhile(/^[_\w\d]/);
+ var word = stream.current().toLowerCase();
+ // dates (standard SQL syntax)
+ // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html
+ if (dateSQL.hasOwnProperty(word) && (stream.match(/^( )+'[^']*'/) || stream.match(/^( )+"[^"]*"/)))
+ return "number";
+ if (atoms.hasOwnProperty(word)) return "atom";
+ if (builtin.hasOwnProperty(word)) return "builtin";
+ if (keywords.hasOwnProperty(word)) return "keyword";
+ if (client.hasOwnProperty(word)) return "string-2";
+ return null;
+ }
+ }
+
+ // 'string', with char specified in quote escaped by '\'
+ function tokenLiteral(quote) {
+ return function(stream, state) {
+ var escaped = false, ch;
+ while ((ch = stream.next()) != null) {
+ if (ch == quote && !escaped) {
+ state.tokenize = tokenBase;
+ break;
+ }
+ escaped = !escaped && ch == "\\";
+ }
+ return "string";
+ };
+ }
+ function tokenComment(stream, state) {
+ while (true) {
+ if (stream.skipTo("*")) {
+ stream.next();
+ if (stream.eat("/")) {
+ state.tokenize = tokenBase;
+ break;
+ }
+ } else {
+ stream.skipToEnd();
+ break;
+ }
+ }
+ return "comment";
+ }
+
+ function pushContext(stream, state, type) {
+ state.context = {
+ prev: state.context,
+ indent: stream.indentation(),
+ col: stream.column(),
+ type: type
+ };
+ }
+
+ function popContext(state) {
+ state.indent = state.context.indent;
+ state.context = state.context.prev;
+ }
+
+ return {
+ startState: function() {
+ return {tokenize: tokenBase, context: null};
+ },
+
+ token: function(stream, state) {
+ if (stream.sol()) {
+ if (state.context && state.context.align == null)
+ state.context.align = false;
+ }
+ if (stream.eatSpace()) return null;
+
+ var style = state.tokenize(stream, state);
+ if (style == "comment") return style;
+
+ if (state.context && state.context.align == null)
+ state.context.align = true;
+
+ var tok = stream.current();
+ if (tok == "(")
+ pushContext(stream, state, ")");
+ else if (tok == "[")
+ pushContext(stream, state, "]");
+ else if (state.context && state.context.type == tok)
+ popContext(state);
+ return style;
+ },
+
+ indent: function(state, textAfter) {
+ var cx = state.context;
+ if (!cx) return CodeMirror.Pass;
+ var closing = textAfter.charAt(0) == cx.type;
+ if (cx.align) return cx.col + (closing ? 0 : 1);
+ else return cx.indent + (closing ? 0 : config.indentUnit);
+ },
+
+ blockCommentStart: "/*",
+ blockCommentEnd: "*/",
+ lineComment: support.commentSlashSlash ? "//" : support.commentHash ? "#" : null
+ };
+});
+
+(function() {
+ "use strict";
+
+ // `identifier`
+ function hookIdentifier(stream) {
+ // MySQL/MariaDB identifiers
+ // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html
+ var ch;
+ while ((ch = stream.next()) != null) {
+ if (ch == "`" && !stream.eat("`")) return "variable-2";
+ }
+ stream.backUp(stream.current().length - 1);
+ return stream.eatWhile(/\w/) ? "variable-2" : null;
+ }
+
+ // variable token
+ function hookVar(stream) {
+ // variables
+ // @@prefix.varName @varName
+ // varName can be quoted with ` or ' or "
+ // ref: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html
+ if (stream.eat("@")) {
+ stream.match(/^session\./);
+ stream.match(/^local\./);
+ stream.match(/^global\./);
+ }
+
+ if (stream.eat("'")) {
+ stream.match(/^.*'/);
+ return "variable-2";
+ } else if (stream.eat('"')) {
+ stream.match(/^.*"/);
+ return "variable-2";
+ } else if (stream.eat("`")) {
+ stream.match(/^.*`/);
+ return "variable-2";
+ } else if (stream.match(/^[0-9a-zA-Z$\.\_]+/)) {
+ return "variable-2";
+ }
+ return null;
+ };
+
+ // short client keyword token
+ function hookClient(stream) {
+ // \N means NULL
+ // ref: http://dev.mysql.com/doc/refman/5.5/en/null-values.html
+ if (stream.eat("N")) {
+ return "atom";
+ }
+ // \g, etc
+ // ref: http://dev.mysql.com/doc/refman/5.5/en/mysql-commands.html
+ return stream.match(/^[a-zA-Z.#!?]/) ? "variable-2" : null;
+ }
+
+ // these keywords are used by all SQL dialects (however, a mode can still overwrite it)
+ var sqlKeywords = "alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit ";
+
+ // turn a space-separated list into an array
+ function set(str) {
+ var obj = {}, words = str.split(" ");
+ for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
+ return obj;
+ }
+
+ // A generic SQL Mode. It's not a standard, it just try to support what is generally supported
+ CodeMirror.defineMIME("text/x-sql", {
+ name: "sql",
+ keywords: set(sqlKeywords + "begin"),
+ builtin: set("bool boolean bit blob enum long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision real date datetime year unsigned signed decimal numeric"),
+ atoms: set("false true null unknown"),
+ operatorChars: /^[*+\-%<>!=]/,
+ dateSQL: set("date time timestamp"),
+ support: set("ODBCdotTable doubleQuote binaryNumber hexNumber")
+ });
+
+ CodeMirror.defineMIME("text/x-mssql", {
+ name: "sql",
+ client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"),
+ keywords: set(sqlKeywords + "begin trigger proc view index for add constraint key primary foreign collate clustered nonclustered declare"),
+ builtin: set("bigint numeric bit smallint decimal smallmoney int tinyint money float real char varchar text nchar nvarchar ntext binary varbinary image cursor timestamp hierarchyid uniqueidentifier sql_variant xml table "),
+ atoms: set("false true null unknown"),
+ operatorChars: /^[*+\-%<>!=]/,
+ dateSQL: set("date datetimeoffset datetime2 smalldatetime datetime time"),
+ hooks: {
+ "@": hookVar
+ }
+ });
+
+ CodeMirror.defineMIME("text/x-mysql", {
+ name: "sql",
+ client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"),
+ keywords: set(sqlKeywords + "accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group group_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"),
+ builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"),
+ atoms: set("false true null unknown"),
+ operatorChars: /^[*+\-%<>!=&|^]/,
+ dateSQL: set("date time timestamp"),
+ support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"),
+ hooks: {
+ "@": hookVar,
+ "`": hookIdentifier,
+ "\\": hookClient
+ }
+ });
+
+ CodeMirror.defineMIME("text/x-mariadb", {
+ name: "sql",
+ client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"),
+ keywords: set(sqlKeywords + "accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group groupby_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"),
+ builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"),
+ atoms: set("false true null unknown"),
+ operatorChars: /^[*+\-%<>!=&|^]/,
+ dateSQL: set("date time timestamp"),
+ support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"),
+ hooks: {
+ "@": hookVar,
+ "`": hookIdentifier,
+ "\\": hookClient
+ }
+ });
+
+ // the query language used by Apache Cassandra is called CQL, but this mime type
+ // is called Cassandra to avoid confusion with Contextual Query Language
+ CodeMirror.defineMIME("text/x-cassandra", {
+ name: "sql",
+ client: { },
+ keywords: set("add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime"),
+ builtin: set("ascii bigint blob boolean counter decimal double float frozen inet int list map static text timestamp timeuuid tuple uuid varchar varint"),
+ atoms: set("false true infinity NaN"),
+ operatorChars: /^[<>=]/,
+ dateSQL: { },
+ support: set("commentSlashSlash decimallessFloat"),
+ hooks: { }
+ });
+
+ // this is based on Peter Raganitsch's 'plsql' mode
+ CodeMirror.defineMIME("text/x-plsql", {
+ name: "sql",
+ client: set("appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap"),
+ keywords: set("abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work"),
+ builtin: set("abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least lenght lenghtb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml"),
+ operatorChars: /^[*+\-%<>!=~]/,
+ dateSQL: set("date time timestamp"),
+ support: set("doubleQuote nCharCast zerolessFloat binaryNumber hexNumber")
+ });
+
+ // Created to support specific hive keywords
+ CodeMirror.defineMIME("text/x-hive", {
+ name: "sql",
+ keywords: set("select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external false fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger true unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with"),
+ builtin: set("bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype"),
+ atoms: set("false true null unknown"),
+ operatorChars: /^[*+\-%<>!=]/,
+ dateSQL: set("date timestamp"),
+ support: set("ODBCdotTable doubleQuote binaryNumber hexNumber")
+ });
+
+ CodeMirror.defineMIME("text/x-pgsql", {
+ name: "sql",
+ client: set("source"),
+ // http://www.postgresql.org/docs/9.5/static/sql-keywords-appendix.html
+ keywords: set(sqlKeywords + "a abort abs absent absolute access according action ada add admin after aggregate all allocate also always analyse analyze any are array array_agg array_max_cardinality asensitive assertion assignment asymmetric at atomic attribute attributes authorization avg backward base64 before begin begin_frame begin_partition bernoulli binary bit_length blob blocked bom both breadth c cache call called cardinality cascade cascaded case cast catalog catalog_name ceil ceiling chain characteristics characters character_length character_set_catalog character_set_name character_set_schema char_length check checkpoint class class_origin clob close cluster coalesce cobol collate collation collation_catalog collation_name collation_schema collect column columns column_name command_function command_function_code comment comments commit committed concurrently condition condition_number configuration conflict connect connection connection_name constraint constraints constraint_catalog constraint_name constraint_schema constructor contains content continue control conversion convert copy corr corresponding cost covar_pop covar_samp cross csv cube cume_dist current current_catalog current_date current_default_transform_group current_path current_role current_row current_schema current_time current_timestamp current_transform_group_for_type current_user cursor cursor_name cycle data database datalink datetime_interval_code datetime_interval_precision day db deallocate dec declare default defaults deferrable deferred defined definer degree delimiter delimiters dense_rank depth deref derived describe descriptor deterministic diagnostics dictionary disable discard disconnect dispatch dlnewcopy dlpreviouscopy dlurlcomplete dlurlcompleteonly dlurlcompletewrite dlurlpath dlurlpathonly dlurlpathwrite dlurlscheme dlurlserver dlvalue do document domain dynamic dynamic_function dynamic_function_code each element else empty enable encoding encrypted end end-exec end_frame end_partition enforced enum equals escape event every except exception exclude excluding exclusive exec execute exists exp explain expression extension external extract false family fetch file filter final first first_value flag float floor following for force foreign fortran forward found frame_row free freeze fs full function functions fusion g general generated get global go goto grant granted greatest grouping groups handler header hex hierarchy hold hour id identity if ignore ilike immediate immediately immutable implementation implicit import including increment indent index indexes indicator inherit inherits initially inline inner inout input insensitive instance instantiable instead integrity intersect intersection invoker isnull isolation k key key_member key_type label lag language large last last_value lateral lead leading leakproof least left length level library like_regex link listen ln load local localtime localtimestamp location locator lock locked logged lower m map mapping match matched materialized max maxvalue max_cardinality member merge message_length message_octet_length message_text method min minute minvalue mod mode modifies module month more move multiset mumps name names namespace national natural nchar nclob nesting new next nfc nfd nfkc nfkd nil no none normalize normalized nothing notify notnull nowait nth_value ntile null nullable nullif nulls number object occurrences_regex octets octet_length of off offset oids old only open operator option options ordering ordinality others out outer output over overlaps overlay overriding owned owner p pad parameter parameter_mode parameter_name parameter_ordinal_position parameter_specific_catalog parameter_specific_name parameter_specific_schema parser partial partition pascal passing passthrough password percent percentile_cont percentile_disc percent_rank period permission placing plans pli policy portion position position_regex power precedes preceding prepare prepared preserve primary prior privileges procedural procedure program public quote range rank read reads reassign recheck recovery recursive ref references referencing refresh regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy regr_syy reindex relative release rename repeatable replace replica requiring reset respect restart restore restrict result return returned_cardinality returned_length returned_octet_length returned_sqlstate returning returns revoke right role rollback rollup routine routine_catalog routine_name routine_schema row rows row_count row_number rule savepoint scale schema schema_name scope scope_catalog scope_name scope_schema scroll search second section security selective self sensitive sequence sequences serializable server server_name session session_user setof sets share show similar simple size skip snapshot some source space specific specifictype specific_name sql sqlcode sqlerror sqlexception sqlstate sqlwarning sqrt stable standalone start state statement static statistics stddev_pop stddev_samp stdin stdout storage strict strip structure style subclass_origin submultiset substring substring_regex succeeds sum symmetric sysid system system_time system_user t tables tablesample tablespace table_name temp template temporary then ties timezone_hour timezone_minute to token top_level_count trailing transaction transactions_committed transactions_rolled_back transaction_active transform transforms translate translate_regex translation treat trigger trigger_catalog trigger_name trigger_schema trim trim_array true truncate trusted type types uescape unbounded uncommitted under unencrypted unique unknown unlink unlisten unlogged unnamed unnest until untyped upper uri usage user user_defined_type_catalog user_defined_type_code user_defined_type_name user_defined_type_schema using vacuum valid validate validator value value_of varbinary variadic var_pop var_samp verbose version versioning view views volatile when whenever whitespace width_bucket window within work wrapper write xmlagg xmlattributes xmlbinary xmlcast xmlcomment xmlconcat xmldeclaration xmldocument xmlelement xmlexists xmlforest xmliterate xmlnamespaces xmlparse xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltext xmlvalidate year yes loop repeat"),
+ // http://www.postgresql.org/docs/9.5/static/datatype.html
+ builtin: set("bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float8 inet integer int int4 interval json jsonb line lseg macaddr money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml"),
+ atoms: set("false true null unknown"),
+ operatorChars: /^[*+\-%<>!=&|^]/,
+ dateSQL: set("date time timestamp"),
+ support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast commentHash commentSpaceRequired")
+ });
+
+}());
+
+});
+
+/*
+ How Properties of Mime Types are used by SQL Mode
+ =================================================
+
+ keywords:
+ A list of keywords you want to be highlighted.
+ builtin:
+ A list of builtin types you want to be highlighted (if you want types to be of class "builtin" instead of "keyword").
+ operatorChars:
+ All characters that must be handled as operators.
+ client:
+ Commands parsed and executed by the client (not the server).
+ support:
+ A list of supported syntaxes which are not common, but are supported by more than 1 DBMS.
+ * ODBCdotTable: .tableName
+ * zerolessFloat: .1
+ * doubleQuote
+ * nCharCast: N'string'
+ * charsetCast: _utf8'string'
+ * commentHash: use # char for comments
+ * commentSlashSlash: use // for comments
+ * commentSpaceRequired: require a space after -- for comments
+ atoms:
+ Keywords that must be highlighted as atoms,. Some DBMS's support more atoms than others:
+ UNKNOWN, INFINITY, UNDERFLOW, NaN...
+ dateSQL:
+ Used for date/time SQL standard syntax, because not all DBMS's support same temporal types.
+*/
+
+;// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+/*jshint unused:true, eqnull:true, curly:true, bitwise:true */
+/*jshint undef:true, latedef:true, trailing:true */
+/*global CodeMirror:true */
+
+// erlang mode.
+// tokenizer -> token types -> CodeMirror styles
+// tokenizer maintains a parse stack
+// indenter uses the parse stack
+
+// TODO indenter:
+// bit syntax
+// old guard/bif/conversion clashes (e.g. "float/1")
+// type/spec/opaque
+
+(function(mod) {
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
+ mod(require("../../lib/codemirror"));
+ else if (typeof define == "function" && define.amd) // AMD
+ define(["../../lib/codemirror"], mod);
+ else // Plain browser env
+ mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+CodeMirror.defineMIME("text/x-erlang", "erlang");
+
+CodeMirror.defineMode("erlang", function(cmCfg) {
+ "use strict";
+
+/////////////////////////////////////////////////////////////////////////////
+// constants
+
+ var typeWords = [
+ "-type", "-spec", "-export_type", "-opaque"];
+
+ var keywordWords = [
+ "after","begin","catch","case","cond","end","fun","if",
+ "let","of","query","receive","try","when"];
+
+ var separatorRE = /[\->,;]/;
+ var separatorWords = [
+ "->",";",","];
+
+ var operatorAtomWords = [
+ "and","andalso","band","bnot","bor","bsl","bsr","bxor",
+ "div","not","or","orelse","rem","xor"];
+
+ var operatorSymbolRE = /[\+\-\*\/<>=\|:!]/;
+ var operatorSymbolWords = [
+ "=","+","-","*","/",">",">=","<","=<","=:=","==","=/=","/=","||","<-","!"];
+
+ var openParenRE = /[<\(\[\{]/;
+ var openParenWords = [
+ "<<","(","[","{"];
+
+ var closeParenRE = /[>\)\]\}]/;
+ var closeParenWords = [
+ "}","]",")",">>"];
+
+ var guardWords = [
+ "is_atom","is_binary","is_bitstring","is_boolean","is_float",
+ "is_function","is_integer","is_list","is_number","is_pid",
+ "is_port","is_record","is_reference","is_tuple",
+ "atom","binary","bitstring","boolean","function","integer","list",
+ "number","pid","port","record","reference","tuple"];
+
+ var bifWords = [
+ "abs","adler32","adler32_combine","alive","apply","atom_to_binary",
+ "atom_to_list","binary_to_atom","binary_to_existing_atom",
+ "binary_to_list","binary_to_term","bit_size","bitstring_to_list",
+ "byte_size","check_process_code","contact_binary","crc32",
+ "crc32_combine","date","decode_packet","delete_module",
+ "disconnect_node","element","erase","exit","float","float_to_list",
+ "garbage_collect","get","get_keys","group_leader","halt","hd",
+ "integer_to_list","internal_bif","iolist_size","iolist_to_binary",
+ "is_alive","is_atom","is_binary","is_bitstring","is_boolean",
+ "is_float","is_function","is_integer","is_list","is_number","is_pid",
+ "is_port","is_process_alive","is_record","is_reference","is_tuple",
+ "length","link","list_to_atom","list_to_binary","list_to_bitstring",
+ "list_to_existing_atom","list_to_float","list_to_integer",
+ "list_to_pid","list_to_tuple","load_module","make_ref","module_loaded",
+ "monitor_node","node","node_link","node_unlink","nodes","notalive",
+ "now","open_port","pid_to_list","port_close","port_command",
+ "port_connect","port_control","pre_loaded","process_flag",
+ "process_info","processes","purge_module","put","register",
+ "registered","round","self","setelement","size","spawn","spawn_link",
+ "spawn_monitor","spawn_opt","split_binary","statistics",
+ "term_to_binary","time","throw","tl","trunc","tuple_size",
+ "tuple_to_list","unlink","unregister","whereis"];
+
+// upper case: [A-Z] [Ø-Þ] [À-Ö]
+// lower case: [a-z] [ß-ö] [ø-ÿ]
+ var anumRE = /[\w@Ø-ÞÀ-Öß-öø-ÿ]/;
+ var escapesRE =
+ /[0-7]{1,3}|[bdefnrstv\\"']|\^[a-zA-Z]|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+}/;
+
+/////////////////////////////////////////////////////////////////////////////
+// tokenizer
+
+ function tokenizer(stream,state) {
+ // in multi-line string
+ if (state.in_string) {
+ state.in_string = (!doubleQuote(stream));
+ return rval(state,stream,"string");
+ }
+
+ // in multi-line atom
+ if (state.in_atom) {
+ state.in_atom = (!singleQuote(stream));
+ return rval(state,stream,"atom");
+ }
+
+ // whitespace
+ if (stream.eatSpace()) {
+ return rval(state,stream,"whitespace");
+ }
+
+ // attributes and type specs
+ if (!peekToken(state) &&
+ stream.match(/-\s*[a-zß-öø-ÿ][\wØ-ÞÀ-Öß-öø-ÿ]*/)) {
+ if (is_member(stream.current(),typeWords)) {
+ return rval(state,stream,"type");
+ }else{
+ return rval(state,stream,"attribute");
+ }
+ }
+
+ var ch = stream.next();
+
+ // comment
+ if (ch == '%') {
+ stream.skipToEnd();
+ return rval(state,stream,"comment");
+ }
+
+ // colon
+ if (ch == ":") {
+ return rval(state,stream,"colon");
+ }
+
+ // macro
+ if (ch == '?') {
+ stream.eatSpace();
+ stream.eatWhile(anumRE);
+ return rval(state,stream,"macro");
+ }
+
+ // record
+ if (ch == "#") {
+ stream.eatSpace();
+ stream.eatWhile(anumRE);
+ return rval(state,stream,"record");
+ }
+
+ // dollar escape
+ if (ch == "$") {
+ if (stream.next() == "\\" && !stream.match(escapesRE)) {
+ return rval(state,stream,"error");
+ }
+ return rval(state,stream,"number");
+ }
+
+ // dot
+ if (ch == ".") {
+ return rval(state,stream,"dot");
+ }
+
+ // quoted atom
+ if (ch == '\'') {
+ if (!(state.in_atom = (!singleQuote(stream)))) {
+ if (stream.match(/\s*\/\s*[0-9]/,false)) {
+ stream.match(/\s*\/\s*[0-9]/,true);
+ return rval(state,stream,"fun"); // 'f'/0 style fun
+ }
+ if (stream.match(/\s*\(/,false) || stream.match(/\s*:/,false)) {
+ return rval(state,stream,"function");
+ }
+ }
+ return rval(state,stream,"atom");
+ }
+
+ // string
+ if (ch == '"') {
+ state.in_string = (!doubleQuote(stream));
+ return rval(state,stream,"string");
+ }
+
+ // variable
+ if (/[A-Z_Ø-ÞÀ-Ö]/.test(ch)) {
+ stream.eatWhile(anumRE);
+ return rval(state,stream,"variable");
+ }
+
+ // atom/keyword/BIF/function
+ if (/[a-z_ß-öø-ÿ]/.test(ch)) {
+ stream.eatWhile(anumRE);
+
+ if (stream.match(/\s*\/\s*[0-9]/,false)) {
+ stream.match(/\s*\/\s*[0-9]/,true);
+ return rval(state,stream,"fun"); // f/0 style fun
+ }
+
+ var w = stream.current();
+
+ if (is_member(w,keywordWords)) {
+ return rval(state,stream,"keyword");
+ }else if (is_member(w,operatorAtomWords)) {
+ return rval(state,stream,"operator");
+ }else if (stream.match(/\s*\(/,false)) {
+ // 'put' and 'erlang:put' are bifs, 'foo:put' is not
+ if (is_member(w,bifWords) &&
+ ((peekToken(state).token != ":") ||
+ (peekToken(state,2).token == "erlang"))) {
+ return rval(state,stream,"builtin");
+ }else if (is_member(w,guardWords)) {
+ return rval(state,stream,"guard");
+ }else{
+ return rval(state,stream,"function");
+ }
+ }else if (lookahead(stream) == ":") {
+ if (w == "erlang") {
+ return rval(state,stream,"builtin");
+ } else {
+ return rval(state,stream,"function");
+ }
+ }else if (is_member(w,["true","false"])) {
+ return rval(state,stream,"boolean");
+ }else{
+ return rval(state,stream,"atom");
+ }
+ }
+
+ // number
+ var digitRE = /[0-9]/;
+ var radixRE = /[0-9a-zA-Z]/; // 36#zZ style int
+ if (digitRE.test(ch)) {
+ stream.eatWhile(digitRE);
+ if (stream.eat('#')) { // 36#aZ style integer
+ if (!stream.eatWhile(radixRE)) {
+ stream.backUp(1); //"36#" - syntax error
+ }
+ } else if (stream.eat('.')) { // float
+ if (!stream.eatWhile(digitRE)) {
+ stream.backUp(1); // "3." - probably end of function
+ } else {
+ if (stream.eat(/[eE]/)) { // float with exponent
+ if (stream.eat(/[-+]/)) {
+ if (!stream.eatWhile(digitRE)) {
+ stream.backUp(2); // "2e-" - syntax error
+ }
+ } else {
+ if (!stream.eatWhile(digitRE)) {
+ stream.backUp(1); // "2e" - syntax error
+ }
+ }
+ }
+ }
+ }
+ return rval(state,stream,"number"); // normal integer
+ }
+
+ // open parens
+ if (nongreedy(stream,openParenRE,openParenWords)) {
+ return rval(state,stream,"open_paren");
+ }
+
+ // close parens
+ if (nongreedy(stream,closeParenRE,closeParenWords)) {
+ return rval(state,stream,"close_paren");
+ }
+
+ // separators
+ if (greedy(stream,separatorRE,separatorWords)) {
+ return rval(state,stream,"separator");
+ }
+
+ // operators
+ if (greedy(stream,operatorSymbolRE,operatorSymbolWords)) {
+ return rval(state,stream,"operator");
+ }
+
+ return rval(state,stream,null);
+ }
+
+/////////////////////////////////////////////////////////////////////////////
+// utilities
+ function nongreedy(stream,re,words) {
+ if (stream.current().length == 1 && re.test(stream.current())) {
+ stream.backUp(1);
+ while (re.test(stream.peek())) {
+ stream.next();
+ if (is_member(stream.current(),words)) {
+ return true;
+ }
+ }
+ stream.backUp(stream.current().length-1);
+ }
+ return false;
+ }
+
+ function greedy(stream,re,words) {
+ if (stream.current().length == 1 && re.test(stream.current())) {
+ while (re.test(stream.peek())) {
+ stream.next();
+ }
+ while (0 < stream.current().length) {
+ if (is_member(stream.current(),words)) {
+ return true;
+ }else{
+ stream.backUp(1);
+ }
+ }
+ stream.next();
+ }
+ return false;
+ }
+
+ function doubleQuote(stream) {
+ return quote(stream, '"', '\\');
+ }
+
+ function singleQuote(stream) {
+ return quote(stream,'\'','\\');
+ }
+
+ function quote(stream,quoteChar,escapeChar) {
+ while (!stream.eol()) {
+ var ch = stream.next();
+ if (ch == quoteChar) {
+ return true;
+ }else if (ch == escapeChar) {
+ stream.next();
+ }
+ }
+ return false;
+ }
+
+ function lookahead(stream) {
+ var m = stream.match(/([\n\s]+|%[^\n]*\n)*(.)/,false);
+ return m ? m.pop() : "";
+ }
+
+ function is_member(element,list) {
+ return (-1 < list.indexOf(element));
+ }
+
+ function rval(state,stream,type) {
+
+ // parse stack
+ pushToken(state,realToken(type,stream));
+
+ // map erlang token type to CodeMirror style class
+ // erlang -> CodeMirror tag
+ switch (type) {
+ case "atom": return "atom";
+ case "attribute": return "attribute";
+ case "boolean": return "atom";
+ case "builtin": return "builtin";
+ case "close_paren": return null;
+ case "colon": return null;
+ case "comment": return "comment";
+ case "dot": return null;
+ case "error": return "error";
+ case "fun": return "meta";
+ case "function": return "tag";
+ case "guard": return "property";
+ case "keyword": return "keyword";
+ case "macro": return "variable-2";
+ case "number": return "number";
+ case "open_paren": return null;
+ case "operator": return "operator";
+ case "record": return "bracket";
+ case "separator": return null;
+ case "string": return "string";
+ case "type": return "def";
+ case "variable": return "variable";
+ default: return null;
+ }
+ }
+
+ function aToken(tok,col,ind,typ) {
+ return {token: tok,
+ column: col,
+ indent: ind,
+ type: typ};
+ }
+
+ function realToken(type,stream) {
+ return aToken(stream.current(),
+ stream.column(),
+ stream.indentation(),
+ type);
+ }
+
+ function fakeToken(type) {
+ return aToken(type,0,0,type);
+ }
+
+ function peekToken(state,depth) {
+ var len = state.tokenStack.length;
+ var dep = (depth ? depth : 1);
+
+ if (len < dep) {
+ return false;
+ }else{
+ return state.tokenStack[len-dep];
+ }
+ }
+
+ function pushToken(state,token) {
+
+ if (!(token.type == "comment" || token.type == "whitespace")) {
+ state.tokenStack = maybe_drop_pre(state.tokenStack,token);
+ state.tokenStack = maybe_drop_post(state.tokenStack);
+ }
+ }
+
+ function maybe_drop_pre(s,token) {
+ var last = s.length-1;
+
+ if (0 < last && s[last].type === "record" && token.type === "dot") {
+ s.pop();
+ }else if (0 < last && s[last].type === "group") {
+ s.pop();
+ s.push(token);
+ }else{
+ s.push(token);
+ }
+ return s;
+ }
+
+ function maybe_drop_post(s) {
+ var last = s.length-1;
+
+ if (s[last].type === "dot") {
+ return [];
+ }
+ if (s[last].type === "fun" && s[last-1].token === "fun") {
+ return s.slice(0,last-1);
+ }
+ switch (s[s.length-1].token) {
+ case "}": return d(s,{g:["{"]});
+ case "]": return d(s,{i:["["]});
+ case ")": return d(s,{i:["("]});
+ case ">>": return d(s,{i:["<<"]});
+ case "end": return d(s,{i:["begin","case","fun","if","receive","try"]});
+ case ",": return d(s,{e:["begin","try","when","->",
+ ",","(","[","{","<<"]});
+ case "->": return d(s,{r:["when"],
+ m:["try","if","case","receive"]});
+ case ";": return d(s,{E:["case","fun","if","receive","try","when"]});
+ case "catch":return d(s,{e:["try"]});
+ case "of": return d(s,{e:["case"]});
+ case "after":return d(s,{e:["receive","try"]});
+ default: return s;
+ }
+ }
+
+ function d(stack,tt) {
+ // stack is a stack of Token objects.
+ // tt is an object; {type:tokens}
+ // type is a char, tokens is a list of token strings.
+ // The function returns (possibly truncated) stack.
+ // It will descend the stack, looking for a Token such that Token.token
+ // is a member of tokens. If it does not find that, it will normally (but
+ // see "E" below) return stack. If it does find a match, it will remove
+ // all the Tokens between the top and the matched Token.
+ // If type is "m", that is all it does.
+ // If type is "i", it will also remove the matched Token and the top Token.
+ // If type is "g", like "i", but add a fake "group" token at the top.
+ // If type is "r", it will remove the matched Token, but not the top Token.
+ // If type is "e", it will keep the matched Token but not the top Token.
+ // If type is "E", it behaves as for type "e", except if there is no match,
+ // in which case it will return an empty stack.
+
+ for (var type in tt) {
+ var len = stack.length-1;
+ var tokens = tt[type];
+ for (var i = len-1; -1 < i ; i--) {
+ if (is_member(stack[i].token,tokens)) {
+ var ss = stack.slice(0,i);
+ switch (type) {
+ case "m": return ss.concat(stack[i]).concat(stack[len]);
+ case "r": return ss.concat(stack[len]);
+ case "i": return ss;
+ case "g": return ss.concat(fakeToken("group"));
+ case "E": return ss.concat(stack[i]);
+ case "e": return ss.concat(stack[i]);
+ }
+ }
+ }
+ }
+ return (type == "E" ? [] : stack);
+ }
+
+/////////////////////////////////////////////////////////////////////////////
+// indenter
+
+ function indenter(state,textAfter) {
+ var t;
+ var unit = cmCfg.indentUnit;
+ var wordAfter = wordafter(textAfter);
+ var currT = peekToken(state,1);
+ var prevT = peekToken(state,2);
+
+ if (state.in_string || state.in_atom) {
+ return CodeMirror.Pass;
+ }else if (!prevT) {
+ return 0;
+ }else if (currT.token == "when") {
+ return currT.column+unit;
+ }else if (wordAfter === "when" && prevT.type === "function") {
+ return prevT.indent+unit;
+ }else if (wordAfter === "(" && currT.token === "fun") {
+ return currT.column+3;
+ }else if (wordAfter === "catch" && (t = getToken(state,["try"]))) {
+ return t.column;
+ }else if (is_member(wordAfter,["end","after","of"])) {
+ t = getToken(state,["begin","case","fun","if","receive","try"]);
+ return t ? t.column : CodeMirror.Pass;
+ }else if (is_member(wordAfter,closeParenWords)) {
+ t = getToken(state,openParenWords);
+ return t ? t.column : CodeMirror.Pass;
+ }else if (is_member(currT.token,[",","|","||"]) ||
+ is_member(wordAfter,[",","|","||"])) {
+ t = postcommaToken(state);
+ return t ? t.column+t.token.length : unit;
+ }else if (currT.token == "->") {
+ if (is_member(prevT.token, ["receive","case","if","try"])) {
+ return prevT.column+unit+unit;
+ }else{
+ return prevT.column+unit;
+ }
+ }else if (is_member(currT.token,openParenWords)) {
+ return currT.column+currT.token.length;
+ }else{
+ t = defaultToken(state);
+ return truthy(t) ? t.column+unit : 0;
+ }
+ }
+
+ function wordafter(str) {
+ var m = str.match(/,|[a-z]+|\}|\]|\)|>>|\|+|\(/);
+
+ return truthy(m) && (m.index === 0) ? m[0] : "";
+ }
+
+ function postcommaToken(state) {
+ var objs = state.tokenStack.slice(0,-1);
+ var i = getTokenIndex(objs,"type",["open_paren"]);
+
+ return truthy(objs[i]) ? objs[i] : false;
+ }
+
+ function defaultToken(state) {
+ var objs = state.tokenStack;
+ var stop = getTokenIndex(objs,"type",["open_paren","separator","keyword"]);
+ var oper = getTokenIndex(objs,"type",["operator"]);
+
+ if (truthy(stop) && truthy(oper) && stop < oper) {
+ return objs[stop+1];
+ } else if (truthy(stop)) {
+ return objs[stop];
+ } else {
+ return false;
+ }
+ }
+
+ function getToken(state,tokens) {
+ var objs = state.tokenStack;
+ var i = getTokenIndex(objs,"token",tokens);
+
+ return truthy(objs[i]) ? objs[i] : false;
+ }
+
+ function getTokenIndex(objs,propname,propvals) {
+
+ for (var i = objs.length-1; -1 < i ; i--) {
+ if (is_member(objs[i][propname],propvals)) {
+ return i;
+ }
+ }
+ return false;
+ }
+
+ function truthy(x) {
+ return (x !== false) && (x != null);
+ }
+
+/////////////////////////////////////////////////////////////////////////////
+// this object defines the mode
+
+ return {
+ startState:
+ function() {
+ return {tokenStack: [],
+ in_string: false,
+ in_atom: false};
+ },
+
+ token:
+ function(stream, state) {
+ return tokenizer(stream, state);
+ },
+
+ indent:
+ function(state, textAfter) {
+ return indenter(state,textAfter);
+ },
+
+ lineComment: "%"
+ };
+});
+
+});
+
+;// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+(function(mod) {
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
+ mod(require("../../lib/codemirror"));
+ else if (typeof define == "function" && define.amd) // AMD
+ define(["../../lib/codemirror"], mod);
+ else // Plain browser env
+ mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+var htmlConfig = {
+ autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true,
+ 'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true,
+ 'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true,
+ 'track': true, 'wbr': true, 'menuitem': true},
+ implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true,
+ 'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true,
+ 'th': true, 'tr': true},
+ contextGrabbers: {
+ 'dd': {'dd': true, 'dt': true},
+ 'dt': {'dd': true, 'dt': true},
+ 'li': {'li': true},
+ 'option': {'option': true, 'optgroup': true},
+ 'optgroup': {'optgroup': true},
+ 'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true,
+ 'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true,
+ 'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true,
+ 'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true,
+ 'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true},
+ 'rp': {'rp': true, 'rt': true},
+ 'rt': {'rp': true, 'rt': true},
+ 'tbody': {'tbody': true, 'tfoot': true},
+ 'td': {'td': true, 'th': true},
+ 'tfoot': {'tbody': true},
+ 'th': {'td': true, 'th': true},
+ 'thead': {'tbody': true, 'tfoot': true},
+ 'tr': {'tr': true}
+ },
+ doNotIndent: {"pre": true},
+ allowUnquoted: true,
+ allowMissing: true,
+ caseFold: true
+}
+
+var xmlConfig = {
+ autoSelfClosers: {},
+ implicitlyClosed: {},
+ contextGrabbers: {},
+ doNotIndent: {},
+ allowUnquoted: false,
+ allowMissing: false,
+ caseFold: false
+}
+
+CodeMirror.defineMode("xml", function(editorConf, config_) {
+ var indentUnit = editorConf.indentUnit
+ var config = {}
+ var defaults = config_.htmlMode ? htmlConfig : xmlConfig
+ for (var prop in defaults) config[prop] = defaults[prop]
+ for (var prop in config_) config[prop] = config_[prop]
+
+ // Return variables for tokenizers
+ var type, setStyle;
+
+ function inText(stream, state) {
+ function chain(parser) {
+ state.tokenize = parser;
+ return parser(stream, state);
+ }
+
+ var ch = stream.next();
+ if (ch == "<") {
+ if (stream.eat("!")) {
+ if (stream.eat("[")) {
+ if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>"));
+ else return null;
+ } else if (stream.match("--")) {
+ return chain(inBlock("comment", "-->"));
+ } else if (stream.match("DOCTYPE", true, true)) {
+ stream.eatWhile(/[\w\._\-]/);
+ return chain(doctype(1));
+ } else {
+ return null;
+ }
+ } else if (stream.eat("?")) {
+ stream.eatWhile(/[\w\._\-]/);
+ state.tokenize = inBlock("meta", "?>");
+ return "meta";
+ } else {
+ type = stream.eat("/") ? "closeTag" : "openTag";
+ state.tokenize = inTag;
+ return "tag bracket";
+ }
+ } else if (ch == "&") {
+ var ok;
+ if (stream.eat("#")) {
+ if (stream.eat("x")) {
+ ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";");
+ } else {
+ ok = stream.eatWhile(/[\d]/) && stream.eat(";");
+ }
+ } else {
+ ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";");
+ }
+ return ok ? "atom" : "error";
+ } else {
+ stream.eatWhile(/[^&<]/);
+ return null;
+ }
+ }
+ inText.isInText = true;
+
+ function inTag(stream, state) {
+ var ch = stream.next();
+ if (ch == ">" || (ch == "/" && stream.eat(">"))) {
+ state.tokenize = inText;
+ type = ch == ">" ? "endTag" : "selfcloseTag";
+ return "tag bracket";
+ } else if (ch == "=") {
+ type = "equals";
+ return null;
+ } else if (ch == "<") {
+ state.tokenize = inText;
+ state.state = baseState;
+ state.tagName = state.tagStart = null;
+ var next = state.tokenize(stream, state);
+ return next ? next + " tag error" : "tag error";
+ } else if (/[\'\"]/.test(ch)) {
+ state.tokenize = inAttribute(ch);
+ state.stringStartCol = stream.column();
+ return state.tokenize(stream, state);
+ } else {
+ stream.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/);
+ return "word";
+ }
+ }
+
+ function inAttribute(quote) {
+ var closure = function(stream, state) {
+ while (!stream.eol()) {
+ if (stream.next() == quote) {
+ state.tokenize = inTag;
+ break;
+ }
+ }
+ return "string";
+ };
+ closure.isInAttribute = true;
+ return closure;
+ }
+
+ function inBlock(style, terminator) {
+ return function(stream, state) {
+ while (!stream.eol()) {
+ if (stream.match(terminator)) {
+ state.tokenize = inText;
+ break;
+ }
+ stream.next();
+ }
+ return style;
+ };
+ }
+ function doctype(depth) {
+ return function(stream, state) {
+ var ch;
+ while ((ch = stream.next()) != null) {
+ if (ch == "<") {
+ state.tokenize = doctype(depth + 1);
+ return state.tokenize(stream, state);
+ } else if (ch == ">") {
+ if (depth == 1) {
+ state.tokenize = inText;
+ break;
+ } else {
+ state.tokenize = doctype(depth - 1);
+ return state.tokenize(stream, state);
+ }
+ }
+ }
+ return "meta";
+ };
+ }
+
+ function Context(state, tagName, startOfLine) {
+ this.prev = state.context;
+ this.tagName = tagName;
+ this.indent = state.indented;
+ this.startOfLine = startOfLine;
+ if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))
+ this.noIndent = true;
+ }
+ function popContext(state) {
+ if (state.context) state.context = state.context.prev;
+ }
+ function maybePopContext(state, nextTagName) {
+ var parentTagName;
+ while (true) {
+ if (!state.context) {
+ return;
+ }
+ parentTagName = state.context.tagName;
+ if (!config.contextGrabbers.hasOwnProperty(parentTagName) ||
+ !config.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) {
+ return;
+ }
+ popContext(state);
+ }
+ }
+
+ function baseState(type, stream, state) {
+ if (type == "openTag") {
+ state.tagStart = stream.column();
+ return tagNameState;
+ } else if (type == "closeTag") {
+ return closeTagNameState;
+ } else {
+ return baseState;
+ }
+ }
+ function tagNameState(type, stream, state) {
+ if (type == "word") {
+ state.tagName = stream.current();
+ setStyle = "tag";
+ return attrState;
+ } else {
+ setStyle = "error";
+ return tagNameState;
+ }
+ }
+ function closeTagNameState(type, stream, state) {
+ if (type == "word") {
+ var tagName = stream.current();
+ if (state.context && state.context.tagName != tagName &&
+ config.implicitlyClosed.hasOwnProperty(state.context.tagName))
+ popContext(state);
+ if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) {
+ setStyle = "tag";
+ return closeState;
+ } else {
+ setStyle = "tag error";
+ return closeStateErr;
+ }
+ } else {
+ setStyle = "error";
+ return closeStateErr;
+ }
+ }
+
+ function closeState(type, _stream, state) {
+ if (type != "endTag") {
+ setStyle = "error";
+ return closeState;
+ }
+ popContext(state);
+ return baseState;
+ }
+ function closeStateErr(type, stream, state) {
+ setStyle = "error";
+ return closeState(type, stream, state);
+ }
+
+ function attrState(type, _stream, state) {
+ if (type == "word") {
+ setStyle = "attribute";
+ return attrEqState;
+ } else if (type == "endTag" || type == "selfcloseTag") {
+ var tagName = state.tagName, tagStart = state.tagStart;
+ state.tagName = state.tagStart = null;
+ if (type == "selfcloseTag" ||
+ config.autoSelfClosers.hasOwnProperty(tagName)) {
+ maybePopContext(state, tagName);
+ } else {
+ maybePopContext(state, tagName);
+ state.context = new Context(state, tagName, tagStart == state.indented);
+ }
+ return baseState;
+ }
+ setStyle = "error";
+ return attrState;
+ }
+ function attrEqState(type, stream, state) {
+ if (type == "equals") return attrValueState;
+ if (!config.allowMissing) setStyle = "error";
+ return attrState(type, stream, state);
+ }
+ function attrValueState(type, stream, state) {
+ if (type == "string") return attrContinuedState;
+ if (type == "word" && config.allowUnquoted) {setStyle = "string"; return attrState;}
+ setStyle = "error";
+ return attrState(type, stream, state);
+ }
+ function attrContinuedState(type, stream, state) {
+ if (type == "string") return attrContinuedState;
+ return attrState(type, stream, state);
+ }
+
+ return {
+ startState: function(baseIndent) {
+ var state = {tokenize: inText,
+ state: baseState,
+ indented: baseIndent || 0,
+ tagName: null, tagStart: null,
+ context: null}
+ if (baseIndent != null) state.baseIndent = baseIndent
+ return state
+ },
+
+ token: function(stream, state) {
+ if (!state.tagName && stream.sol())
+ state.indented = stream.indentation();
+
+ if (stream.eatSpace()) return null;
+ type = null;
+ var style = state.tokenize(stream, state);
+ if ((style || type) && style != "comment") {
+ setStyle = null;
+ state.state = state.state(type || style, stream, state);
+ if (setStyle)
+ style = setStyle == "error" ? style + " error" : setStyle;
+ }
+ return style;
+ },
+
+ indent: function(state, textAfter, fullLine) {
+ var context = state.context;
+ // Indent multi-line strings (e.g. css).
+ if (state.tokenize.isInAttribute) {
+ if (state.tagStart == state.indented)
+ return state.stringStartCol + 1;
+ else
+ return state.indented + indentUnit;
+ }
+ if (context && context.noIndent) return CodeMirror.Pass;
+ if (state.tokenize != inTag && state.tokenize != inText)
+ return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0;
+ // Indent the starts of attribute names.
+ if (state.tagName) {
+ if (config.multilineTagIndentPastTag !== false)
+ return state.tagStart + state.tagName.length + 2;
+ else
+ return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1);
+ }
+ if (config.alignCDATA && /$/,
+ blockCommentStart: "",
+
+ configuration: config.htmlMode ? "html" : "xml",
+ helperType: config.htmlMode ? "html" : "xml",
+
+ skipAttribute: function(state) {
+ if (state.state == attrValueState)
+ state.state = attrState
+ }
+ };
+});
+
+CodeMirror.defineMIME("text/xml", "xml");
+CodeMirror.defineMIME("application/xml", "xml");
+if (!CodeMirror.mimeModes.hasOwnProperty("text/html"))
+ CodeMirror.defineMIME("text/html", {name: "xml", htmlMode: true});
+
+});
+
+;define('codemirror', [], function() {
+ 'use strict';
+
+ return {
+ 'default': CodeMirror
+ };
+});
+
+;define('ember-ajax/errors', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports.AjaxError = AjaxError;
+ exports.InvalidError = InvalidError;
+ exports.UnauthorizedError = UnauthorizedError;
+ exports.ForbiddenError = ForbiddenError;
+
+ var EmberError = _ember['default'].Error;
+
+ /**
+ @class AjaxError
+ @namespace DS
+ */
+
+ function AjaxError(errors) {
+ var message = arguments.length <= 1 || arguments[1] === undefined ? 'Ajax operation failed' : arguments[1];
+
+ EmberError.call(this, message);
+
+ this.errors = errors || [{
+ title: 'Ajax Error',
+ detail: message
+ }];
+ }
+
+ AjaxError.prototype = Object.create(EmberError.prototype);
+
+ function InvalidError(errors) {
+ AjaxError.call(this, errors, 'Request was rejected because it was invalid');
+ }
+
+ InvalidError.prototype = Object.create(AjaxError.prototype);
+
+ function UnauthorizedError(errors) {
+ AjaxError.call(this, errors, 'Ajax authorization failed');
+ }
+
+ UnauthorizedError.prototype = Object.create(AjaxError.prototype);
+
+ function ForbiddenError(errors) {
+ AjaxError.call(this, errors, 'Request was rejected because user is not permitted to perform this operation.');
+ }
+
+ ForbiddenError.prototype = Object.create(AjaxError.prototype);
+});
+define('ember-ajax/index', ['exports', 'ember-ajax/request'], function (exports, _emberAjaxRequest) {
+ 'use strict';
+
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberAjaxRequest['default'];
+ }
+ });
+});
+define('ember-ajax/make-promise', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports['default'] = makePromise;
+
+ var run = _ember['default'].run;
+ var RSVP = _ember['default'].RSVP;
+
+ function makePromise(settings) {
+ var type = settings.type || 'GET';
+ return new RSVP.Promise(function (resolve, reject) {
+ settings.success = makeSuccess(resolve);
+ settings.error = makeError(reject);
+ _ember['default'].$.ajax(settings);
+ }, 'ember-ajax: ' + type + ' to ' + settings.url);
+ }
+
+ function makeSuccess(resolve) {
+ return function success(response, textStatus, jqXHR) {
+ run(null, resolve, {
+ response: response,
+ textStatus: textStatus,
+ jqXHR: jqXHR
+ });
+ };
+ }
+
+ function makeError(reject) {
+ return function error(jqXHR, textStatus, errorThrown) {
+ run(null, reject, {
+ jqXHR: jqXHR,
+ textStatus: textStatus,
+ errorThrown: errorThrown
+ });
+ };
+ }
+});
+define('ember-ajax/raw', ['exports', 'ember-ajax/make-promise', 'ember-ajax/utils/parse-args', 'ember'], function (exports, _emberAjaxMakePromise, _emberAjaxUtilsParseArgs, _ember) {
+ 'use strict';
+
+ var _slicedToArray = (function () {
+ function sliceIterator(arr, i) {
+ var _arr = [];var _n = true;var _d = false;var _e = undefined;try {
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
+ _arr.push(_s.value);if (i && _arr.length === i) break;
+ }
+ } catch (err) {
+ _d = true;_e = err;
+ } finally {
+ try {
+ if (!_n && _i['return']) _i['return']();
+ } finally {
+ if (_d) throw _e;
+ }
+ }return _arr;
+ }return function (arr, i) {
+ if (Array.isArray(arr)) {
+ return arr;
+ } else if (Symbol.iterator in Object(arr)) {
+ return sliceIterator(arr, i);
+ } else {
+ throw new TypeError('Invalid attempt to destructure non-iterable instance');
+ }
+ };
+ })();
+
+ exports['default'] = raw;
+
+ var deprecate = _ember['default'].deprecate;
+
+ /*
+ * Same as `request` except it resolves an object with `{response, textStatus,
+ * jqXHR}`, useful if you need access to the jqXHR object for headers, etc.
+ */
+ function raw() {
+ deprecate('ember-ajax/raw is deprecated and will be removed in ember-ajax@2.0.0', false, { id: 'ember-ajax.raw' });
+
+ var _parseArgs$apply = _emberAjaxUtilsParseArgs['default'].apply(null, arguments);
+
+ var _parseArgs$apply2 = _slicedToArray(_parseArgs$apply, 3);
+
+ var url = _parseArgs$apply2[0];
+ var type = _parseArgs$apply2[1];
+ var settings = _parseArgs$apply2[2];
+
+ if (!settings) {
+ settings = {};
+ }
+ settings.url = url;
+ settings.type = type;
+ return (0, _emberAjaxMakePromise['default'])(settings);
+ }
+});
+define('ember-ajax/request', ['exports', 'ember-ajax/raw', 'ember'], function (exports, _emberAjaxRaw, _ember) {
+ 'use strict';
+
+ exports['default'] = request;
+
+ var deprecate = _ember['default'].deprecate;
+
+ /*
+ * jQuery.ajax wrapper, supports the same signature except providing
+ * `success` and `error` handlers will throw an error (use promises instead)
+ * and it resolves only the response (no access to jqXHR or textStatus).
+ */
+ function request() {
+ deprecate('ember-ajax/request is deprecated and will be removed in ember-ajax@2.0.0', false, { id: 'ember-ajax.raw' });
+ return _emberAjaxRaw['default'].apply(undefined, arguments).then(function (result) {
+ return result.response;
+ }, null, 'ember-ajax: unwrap raw ajax response');
+ }
+});
+define('ember-ajax/services/ajax', ['exports', 'ember', 'ember-ajax/errors', 'ember-ajax/utils/parse-response-headers'], function (exports, _ember, _emberAjaxErrors, _emberAjaxUtilsParseResponseHeaders) {
+ 'use strict';
+
+ var deprecate = _ember['default'].deprecate;
+ var get = _ember['default'].get;
+ var isBlank = _ember['default'].isBlank;
+
+ /**
+ ### Headers customization
+
+ Some APIs require HTTP headers, e.g. to provide an API key. Arbitrary
+ headers can be set as key/value pairs on the `RESTAdapter`'s `headers`
+ object and Ember Data will send them along with each ajax request.
+
+ ```app/services/ajax
+ import AjaxService from 'ember-ajax/services/ajax';
+
+ export default AjaxService.extend({
+ headers: {
+ "API_KEY": "secret key",
+ "ANOTHER_HEADER": "Some header value"
+ }
+ });
+ ```
+
+ `headers` can also be used as a computed property to support dynamic
+ headers.
+
+ ```app/services/ajax.js
+ import Ember from 'ember';
+ import AjaxService from 'ember-ajax/services/ajax';
+
+ export default AjaxService.extend({
+ session: Ember.inject.service(),
+ headers: Ember.computed("session.authToken", function() {
+ return {
+ "API_KEY": this.get("session.authToken"),
+ "ANOTHER_HEADER": "Some header value"
+ };
+ })
+ });
+ ```
+
+ In some cases, your dynamic headers may require data from some
+ object outside of Ember's observer system (for example
+ `document.cookie`). You can use the
+ [volatile](/api/classes/Ember.ComputedProperty.html#method_volatile)
+ function to set the property into a non-cached mode causing the headers to
+ be recomputed with every request.
+
+ ```app/services/ajax.js
+ import Ember from 'ember';
+ import AjaxService from 'ember-ajax/services/ajax';
+
+ export default AjaxService.extend({
+ session: Ember.inject.service(),
+ headers: Ember.computed("session.authToken", function() {
+ return {
+ "API_KEY": Ember.get(document.cookie.match(/apiKey\=([^;]*)/), "1"),
+ "ANOTHER_HEADER": "Some header value"
+ };
+ }).volatile()
+ });
+ ```
+
+ **/
+ exports['default'] = _ember['default'].Service.extend({
+
+ request: function request(url, options) {
+ var _this = this;
+
+ var opts;
+
+ if (arguments.length > 2 || typeof options === 'string') {
+ deprecate('ember-ajax/ajax#request calling request with `type` is deprecated and will be removed in ember-ajax@1.0.0. If you want to specify a type pass an object like {type: \'DELETE\'}', false, { id: 'ember-ajax.service.request' });
+
+ if (arguments.length > 2) {
+ opts = arguments[2];
+ opts.type = options;
+ } else {
+ opts = { type: options };
+ }
+ } else {
+ opts = options;
+ }
+
+ var hash = this.options(url, opts);
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+
+ hash.success = function (payload, textStatus, jqXHR) {
+ var response = _this.handleResponse(jqXHR.status, (0, _emberAjaxUtilsParseResponseHeaders['default'])(jqXHR.getAllResponseHeaders()), payload);
+
+ if (response instanceof _emberAjaxErrors.AjaxError) {
+ reject(response);
+ } else {
+ resolve(response);
+ }
+ };
+
+ hash.error = function (jqXHR, textStatus, errorThrown) {
+ var error = undefined;
+
+ if (!(error instanceof Error)) {
+ if (errorThrown instanceof Error) {
+ error = errorThrown;
+ } else {
+ error = _this.handleResponse(jqXHR.status, (0, _emberAjaxUtilsParseResponseHeaders['default'])(jqXHR.getAllResponseHeaders()), _this.parseErrorResponse(jqXHR.responseText) || errorThrown);
+ }
+ }
+ reject(error);
+ };
+
+ _ember['default'].$.ajax(hash);
+ }, 'ember-ajax: ' + hash.type + ' to ' + url);
+ },
+
+ // calls `request()` but forces `options.type` to `POST`
+ post: function post(url, options) {
+ return this.request(url, this._addTypeToOptionsFor(options, 'POST'));
+ },
+
+ // calls `request()` but forces `options.type` to `PUT`
+ put: function put(url, options) {
+ return this.request(url, this._addTypeToOptionsFor(options, 'PUT'));
+ },
+
+ // calls `request()` but forces `options.type` to `PATCH`
+ patch: function patch(url, options) {
+ return this.request(url, this._addTypeToOptionsFor(options, 'PATCH'));
+ },
+
+ // calls `request()` but forces `options.type` to `DELETE`
+ del: function del(url, options) {
+ return this.request(url, this._addTypeToOptionsFor(options, 'DELETE'));
+ },
+
+ // forcibly manipulates the options hash to include the HTTP method on the type key
+ _addTypeToOptionsFor: function _addTypeToOptionsFor(options, method) {
+ options = options || {};
+ options.type = method;
+ return options;
+ },
+
+ /**
+ @method options
+ @private
+ @param {String} url
+ @param {Object} options
+ @return {Object}
+ */
+ options: function options(url, _options) {
+ var hash = _options || {};
+ hash.url = this._buildURL(url);
+ hash.type = hash.type || 'GET';
+ hash.dataType = hash.dataType || 'json';
+ hash.context = this;
+
+ var headers = get(this, 'headers');
+ if (headers !== undefined) {
+ hash.beforeSend = function (xhr) {
+ Object.keys(headers).forEach(function (key) {
+ return xhr.setRequestHeader(key, headers[key]);
+ });
+ };
+ }
+
+ return hash;
+ },
+
+ _buildURL: function _buildURL(url) {
+ var host = get(this, 'host');
+ if (isBlank(host)) {
+ return url;
+ }
+ var startsWith = String.prototype.startsWith || function (searchString, position) {
+ position = position || 0;
+ return this.indexOf(searchString, position) === position;
+ };
+ if (startsWith.call(url, '/')) {
+ return '' + host + url;
+ } else {
+ return host + '/' + url;
+ }
+ },
+
+ /**
+ Takes an ajax response, and returns the json payload or an error.
+ By default this hook just returns the json payload passed to it.
+ You might want to override it in two cases:
+ 1. Your API might return useful results in the response headers.
+ Response headers are passed in as the second argument.
+ 2. Your API might return errors as successful responses with status code
+ 200 and an Errors text or object.
+ @method handleResponse
+ @param {Number} status
+ @param {Object} headers
+ @param {Object} payload
+ @return {Object | DS.AdapterError} response
+ */
+ handleResponse: function handleResponse(status, headers, payload) {
+ if (this.isSuccess(status, headers, payload)) {
+ return payload;
+ } else if (this.isUnauthorized(status, headers, payload)) {
+ return new _emberAjaxErrors.UnauthorizedError(payload.errors);
+ } else if (this.isForbidden(status, headers, payload)) {
+ return new _emberAjaxErrors.ForbiddenError(payload.errors);
+ } else if (this.isInvalid(status, headers, payload)) {
+ return new _emberAjaxErrors.InvalidError(payload.errors);
+ }
+
+ var errors = this.normalizeErrorResponse(status, headers, payload);
+
+ return new _emberAjaxErrors.AjaxError(errors);
+ },
+
+ /**
+ Default `handleResponse` implementation uses this hook to decide if the
+ response is a an authorized error.
+ @method isUnauthorized
+ @param {Number} status
+ @param {Object} headers
+ @param {Object} payload
+ @return {Boolean}
+ */
+ isUnauthorized: function isUnauthorized(status /*, headers, payload */) {
+ return status === 401;
+ },
+
+ /**
+ Default `handleResponse` implementation uses this hook to decide if the
+ response is a forbidden error.
+ @method isForbidden
+ @param {Number} status
+ @param {Object} headers
+ @param {Object} payload
+ @return {Boolean}
+ */
+ isForbidden: function isForbidden(status /*, headers, payload */) {
+ return status === 403;
+ },
+
+ /**
+ Default `handleResponse` implementation uses this hook to decide if the
+ response is a an invalid error.
+ @method isInvalid
+ @param {Number} status
+ @param {Object} headers
+ @param {Object} payload
+ @return {Boolean}
+ */
+ isInvalid: function isInvalid(status /*, headers, payload */) {
+ return status === 422;
+ },
+
+ /**
+ Default `handleResponse` implementation uses this hook to decide if the
+ response is a success.
+ @method isSuccess
+ @param {Number} status
+ @param {Object} headers
+ @param {Object} payload
+ @return {Boolean}
+ */
+ isSuccess: function isSuccess(status /*, headers, payload */) {
+ return status >= 200 && status < 300 || status === 304;
+ },
+
+ /**
+ @method parseErrorResponse
+ @private
+ @param {String} responseText
+ @return {Object}
+ */
+ parseErrorResponse: function parseErrorResponse(responseText) {
+ var json = responseText;
+
+ try {
+ json = _ember['default'].$.parseJSON(responseText);
+ } catch (e) {}
+
+ return json;
+ },
+
+ /**
+ @method normalizeErrorResponse
+ @private
+ @param {Number} status
+ @param {Object} headers
+ @param {Object} payload
+ @return {Object} errors payload
+ */
+ normalizeErrorResponse: function normalizeErrorResponse(status, headers, payload) {
+ if (payload && typeof payload === 'object' && payload.errors) {
+ return payload.errors;
+ } else {
+ return [{
+ status: '' + status,
+ title: "The backend responded with an error",
+ detail: '' + payload
+ }];
+ }
+ }
+ });
+});
+define("ember-ajax/utils/parse-args", ["exports"], function (exports) {
+ "use strict";
+
+ var _slicedToArray = (function () {
+ function sliceIterator(arr, i) {
+ var _arr = [];var _n = true;var _d = false;var _e = undefined;try {
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
+ _arr.push(_s.value);if (i && _arr.length === i) break;
+ }
+ } catch (err) {
+ _d = true;_e = err;
+ } finally {
+ try {
+ if (!_n && _i["return"]) _i["return"]();
+ } finally {
+ if (_d) throw _e;
+ }
+ }return _arr;
+ }return function (arr, i) {
+ if (Array.isArray(arr)) {
+ return arr;
+ } else if (Symbol.iterator in Object(arr)) {
+ return sliceIterator(arr, i);
+ } else {
+ throw new TypeError("Invalid attempt to destructure non-iterable instance");
+ }
+ };
+ })();
+
+ exports["default"] = parseArgs;
+
+ function parseArgs() {
+ var args = [].slice.apply(arguments);
+ if (args.length === 1) {
+ if (typeof args[0] === "string") {
+ var _args = _slicedToArray(args, 1);
+
+ var url = _args[0];
+
+ return [url];
+ } else {
+ var _args2 = _slicedToArray(args, 1);
+
+ var options = _args2[0];
+ var url = options.url;
+
+ delete options.url;
+ var type = options.type || options.method;
+ delete options.type;
+ delete options.method;
+ return [url, type, options];
+ }
+ }
+ if (args.length === 2) {
+ var _args3 = _slicedToArray(args, 1);
+
+ var url = _args3[0];
+
+ if (typeof args[1] === 'object') {
+ var options = args[1];
+ var type = options.type || options.method;
+ delete options.type;
+ delete options.method;
+ return [url, type, options];
+ } else {
+ var type = args[1];
+ return [url, type];
+ }
+ }
+ return args;
+ }
+});
+define('ember-ajax/utils/parse-response-headers', ['exports'], function (exports) {
+ 'use strict';
+
+ exports['default'] = parseResponseHeaders;
+
+ function parseResponseHeaders(headerStr) {
+ var headers = Object.create(null);
+ if (!headerStr) {
+ return headers;
+ }
+
+ var headerPairs = headerStr.split('\r\n');
+ for (var i = 0; i < headerPairs.length; i++) {
+ var headerPair = headerPairs[i];
+ // Can't use split() here because it does the wrong thing
+ // if the header value has the string ": " in it.
+ var index = headerPair.indexOf(': ');
+ if (index > 0) {
+ var key = headerPair.substring(0, index);
+ var val = headerPair.substring(index + 2);
+ headers[key] = val;
+ }
+ }
+
+ return headers;
+ }
+});
+define('ember-basic-dropdown/components/basic-dropdown', ['exports', 'ember', 'ember-basic-dropdown/templates/components/basic-dropdown', 'ember-getowner-polyfill'], function (exports, _ember, _emberBasicDropdownTemplatesComponentsBasicDropdown, _emberGetownerPolyfill) {
+ 'use strict';
+
+ var Component = _ember['default'].Component;
+ var run = _ember['default'].run;
+ var computed = _ember['default'].computed;
+
+ var MutObserver = window.MutationObserver || window.WebKitMutationObserver;
+
+ exports['default'] = Component.extend({
+ layout: _emberBasicDropdownTemplatesComponentsBasicDropdown['default'],
+ disabled: false,
+ renderInPlace: false,
+ dropdownPosition: 'auto', // auto | above | below
+ classNames: ['ember-basic-dropdown'],
+ attributeBindings: ['dir'],
+ classNameBindings: ['publicAPI.isOpen:ember-basic-dropdown--opened', 'disabled:ember-basic-dropdown--disabled', 'renderInPlace:ember-basic-dropdown--in-place', '_dropdownPositionClass'],
+ _wormholeDestination: _ember['default'].testing ? 'ember-testing' : 'ember-basic-dropdown-wormhole',
+
+ // Lifecycle hooks
+ init: function init() {
+ this._super.apply(this, arguments);
+ var rootSelector = _ember['default'].testing ? '#ember-testing' : (0, _emberGetownerPolyfill['default'])(this).lookup('application:main').rootElement;
+ this.appRoot = document.querySelector(rootSelector);
+ this.handleRootMouseDown = this.handleRootMouseDown.bind(this);
+ this.handleRepositioningEvent = this.handleRepositioningEvent.bind(this);
+ this.repositionDropdown = this.repositionDropdown.bind(this);
+ },
+
+ didInitAttrs: function didInitAttrs() {
+ this._super.apply(this, arguments);
+ var registerActionsInParent = this.get('registerActionsInParent');
+ if (registerActionsInParent) {
+ registerActionsInParent(this.get('publicAPI'));
+ }
+ },
+
+ willDestroy: function willDestroy() {
+ this._super.apply(this, arguments);
+ this.removeGlobalEvents();
+ },
+
+ // CPs
+ tabIndex: computed('disabled', function () {
+ return !this.get('disabled') ? this.get('tabindex') || '0' : "-1";
+ }),
+
+ publicAPI: computed(function () {
+ return {
+ isOpen: false,
+ actions: {
+ open: this.open.bind(this),
+ close: this.close.bind(this),
+ toggle: this.toggle.bind(this)
+ }
+ };
+ }),
+
+ opened: computed('publicAPI.isOpen', {
+ get: function get() {
+ return this.get('publicAPI.isOpen');
+ },
+ set: function set(_, newOpened) {
+ var oldOpened = this.get('publicAPI.isOpen');
+ if (!oldOpened && newOpened) {
+ this.open();
+ } else if (oldOpened && !newOpened) {
+ this.close();
+ }
+ return this.get('publicAPI.isOpen');
+ }
+ }),
+
+ // Actions
+ actions: {
+ toggle: function toggle(e) {
+ this.toggle(e);
+ },
+
+ keydown: function keydown(e) {
+ this.handleKeydown(e);
+ },
+
+ focusTrigger: function focusTrigger(e) {
+ var onFocus = this.get('onFocus');
+ if (onFocus) {
+ onFocus(this.get('publicAPI'), e);
+ }
+ }
+ },
+
+ // Methods
+ toggle: function toggle(e) {
+ if (this.get('publicAPI.isOpen')) {
+ this.close(e);
+ } else {
+ this.open(e);
+ }
+ },
+
+ open: function open(e) {
+ if (this.get('disabled') || this.get('publicAPI.isOpen')) {
+ return;
+ }
+ if (e) {
+ e.preventDefault();
+ }
+ this.set('publicAPI.isOpen', true);
+ this.addGlobalEventsTimer = run.scheduleOnce('afterRender', this, this.addGlobalEvents);
+ this.repositionDropdownTimer = run.scheduleOnce('afterRender', this, this.repositionDropdown);
+ var onOpen = this.get('onOpen');
+ if (onOpen) {
+ onOpen(this.get('publicAPI'), e);
+ }
+ },
+
+ close: function close(e, skipFocus) {
+ if (!this.get('publicAPI.isOpen')) {
+ return;
+ }
+ this.set('publicAPI.isOpen', false);
+ this.set('_dropdownPositionClass', null);
+ run.cancel(this.addGlobalEventsTimer);
+ run.cancel(this.repositionDropdownTimer);
+ this.addGlobalEventsTimer = this.repositionDropdownTimer = null;
+ this.removeGlobalEvents();
+ var onClose = this.get('onClose');
+ if (onClose) {
+ onClose(this.get('publicAPI'), e);
+ }
+ if (skipFocus) {
+ return;
+ }
+ var trigger = this.element.querySelector('.ember-basic-dropdown-trigger');
+ if (trigger.tabIndex > -1) {
+ trigger.focus();
+ }
+ },
+
+ handleKeydown: function handleKeydown(e) {
+ if (this.get('disabled')) {
+ return;
+ }
+ var onKeydown = this.get('onKeydown');
+ if (onKeydown) {
+ onKeydown(this.get('publicAPI'), e);
+ }
+ if (e.defaultPrevented) {
+ return;
+ }
+ if (e.keyCode === 13) {
+ // Enter
+ this.toggle(e);
+ } else if (e.keyCode === 27) {
+ this.close(e);
+ }
+ },
+
+ repositionDropdown: function repositionDropdown() {
+ run(this, this._runloopAwareRepositionDropdown);
+ },
+
+ handleRootMouseDown: function handleRootMouseDown(e) {
+ if (!this.element.contains(e.target) && !this.appRoot.querySelector('.ember-basic-dropdown-content').contains(e.target)) {
+ this.close(e, true);
+ }
+ },
+
+ handleRepositioningEvent: function handleRepositioningEvent() /* e */{
+ run.throttle(this, 'repositionDropdown', 60, true);
+ },
+
+ addGlobalEvents: function addGlobalEvents() {
+ var _this = this;
+
+ this.appRoot.addEventListener('mousedown', this.handleRootMouseDown, true);
+ window.addEventListener('scroll', this.handleRepositioningEvent);
+ window.addEventListener('resize', this.handleRepositioningEvent);
+ window.addEventListener('orientationchange', this.handleRepositioningEvent);
+ if (MutObserver) {
+ this.mutationObserver = new MutObserver(function (mutations) {
+ if (mutations[0].addedNodes.length || mutations[0].removedNodes.length) {
+ _this.repositionDropdown();
+ }
+ });
+ run.schedule('afterRender', this, function () {
+ var dropdown = this.appRoot.querySelector('.ember-basic-dropdown-content');
+ if (!dropdown) {
+ return;
+ }
+ this.mutationObserver.observe(dropdown, { childList: true, subtree: true });
+ });
+ } else {
+ run.schedule('afterRender', this, function () {
+ var dropdown = this.appRoot.querySelector('.ember-basic-dropdown-content');
+ dropdown.addEventListener('DOMNodeInserted', this.repositionDropdown, false);
+ dropdown.addEventListener('DOMNodeRemoved', this.repositionDropdown, false);
+ });
+ }
+ },
+
+ removeGlobalEvents: function removeGlobalEvents() {
+ this.appRoot.removeEventListener('mousedown', this.handleRootMouseDown, true);
+ window.removeEventListener('scroll', this.handleRepositioningEvent);
+ window.removeEventListener('resize', this.handleRepositioningEvent);
+ window.removeEventListener('orientationchange', this.handleRepositioningEvent);
+ if (MutObserver) {
+ if (this.mutationObserver) {
+ this.mutationObserver.disconnect();
+ this.mutationObserver = null;
+ }
+ } else {
+ var dropdown = this.appRoot.querySelector('.ember-basic-dropdown-content');
+ dropdown.removeEventListener('DOMNodeInserted', this.repositionDropdown);
+ dropdown.removeEventListener('DOMNodeRemoved', this.repositionDropdown);
+ }
+ },
+
+ _runloopAwareRepositionDropdown: function _runloopAwareRepositionDropdown() {
+ if (this.get('renderInPlace') || !this.get('publicAPI.isOpen')) {
+ return;
+ }
+ var dropdownPositionStrategy = this.get('dropdownPosition');
+ var dropdown = this.appRoot.querySelector('.ember-basic-dropdown-content');
+ var trigger = this.element.querySelector('.ember-basic-dropdown-trigger');
+
+ var _trigger$getBoundingClientRect = trigger.getBoundingClientRect();
+
+ var left = _trigger$getBoundingClientRect.left;
+ var topWithoutScroll = _trigger$getBoundingClientRect.top;
+ var width = _trigger$getBoundingClientRect.width;
+ var height = _trigger$getBoundingClientRect.height;
+
+ var viewportTop = _ember['default'].$(window).scrollTop();
+ var top = topWithoutScroll + viewportTop;
+ if (this.get('matchTriggerWidth')) {
+ dropdown.style.width = width + 'px';
+ }
+ if (dropdownPositionStrategy === 'above') {
+ top = top - dropdown.getBoundingClientRect().height;
+ this.set('_dropdownPositionClass', 'ember-basic-dropdown--above');
+ } else if (dropdownPositionStrategy === 'below') {
+ top = top + height;
+ this.set('_dropdownPositionClass', 'ember-basic-dropdown--below');
+ } else {
+ // auto
+ var viewportBottom = window.scrollY + window.innerHeight;
+ var dropdownHeight = dropdown.getBoundingClientRect().height;
+ var enoughRoomBelow = top + height + dropdownHeight < viewportBottom;
+ var enoughRoomAbove = topWithoutScroll > dropdownHeight;
+ var positionClass = this.get('_dropdownPositionClass');
+ if (positionClass === 'ember-basic-dropdown--below' && !enoughRoomBelow && enoughRoomAbove) {
+ this.set('_dropdownPositionClass', 'ember-basic-dropdown--above');
+ } else if (positionClass === 'ember-basic-dropdown--above' && !enoughRoomAbove && enoughRoomBelow) {
+ this.set('_dropdownPositionClass', 'ember-basic-dropdown--below');
+ } else if (!positionClass) {
+ this.set('_dropdownPositionClass', enoughRoomBelow ? 'ember-basic-dropdown--below' : 'ember-basic-dropdown--above');
+ }
+ positionClass = this.get('_dropdownPositionClass'); // It might have changed
+ top = top + (positionClass === 'ember-basic-dropdown--below' ? height : -dropdownHeight);
+ }
+ dropdown.style.top = top + 'px';
+ dropdown.style.left = left + 'px';
+ }
+ });
+});
+define("ember-basic-dropdown/templates/components/basic-dropdown", ["exports"], function (exports) {
+ "use strict";
+
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 5,
+ "column": 2
+ },
+ "end": {
+ "line": 9,
+ "column": 2
+ }
+ },
+ "moduleName": "modules/ember-basic-dropdown/templates/components/basic-dropdown.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createAttrMorph(element0, 'class');
+ morphs[1] = dom.createAttrMorph(element0, 'dir');
+ morphs[2] = dom.createMorphAt(element0, 1, 1);
+ return morphs;
+ },
+ statements: [["attribute", "class", ["concat", ["ember-basic-dropdown-content ", ["get", "dropdownClass", ["loc", [null, [6, 47], [6, 60]]]], " ", ["get", "_dropdownPositionClass", ["loc", [null, [6, 65], [6, 87]]]]]]], ["attribute", "dir", ["get", "dir", ["loc", [null, [6, 97], [6, 100]]]]], ["inline", "yield", [["get", "publicAPI", ["loc", [null, [7, 14], [7, 23]]]]], [], ["loc", [null, [7, 6], [7, 25]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 4,
+ "column": 0
+ },
+ "end": {
+ "line": 10,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-basic-dropdown/templates/components/basic-dropdown.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "ember-wormhole", [], ["to", ["subexpr", "@mut", [["get", "_wormholeDestination", ["loc", [null, [5, 23], [5, 43]]]]], [], []], "renderInPlace", ["subexpr", "@mut", [["get", "renderInPlace", ["loc", [null, [5, 58], [5, 71]]]]], [], []]], 0, null, ["loc", [null, [5, 2], [9, 21]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["multiple-nodes", "wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 10,
+ "column": 7
+ }
+ },
+ "moduleName": "modules/ember-basic-dropdown/templates/components/basic-dropdown.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createElement("div");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element1 = dom.childAt(fragment, [0]);
+ var morphs = new Array(7);
+ morphs[0] = dom.createAttrMorph(element1, 'class');
+ morphs[1] = dom.createAttrMorph(element1, 'tabindex');
+ morphs[2] = dom.createAttrMorph(element1, 'onkeydown');
+ morphs[3] = dom.createAttrMorph(element1, 'onmousedown');
+ morphs[4] = dom.createAttrMorph(element1, 'onfocus');
+ morphs[5] = dom.createMorphAt(element1, 1, 1);
+ morphs[6] = dom.createMorphAt(fragment, 2, 2, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["attribute", "class", ["concat", ["ember-basic-dropdown-trigger ", ["get", "triggerClass", ["loc", [null, [1, 43], [1, 55]]]]]]], ["attribute", "tabindex", ["get", "tabIndex", ["loc", [null, [1, 70], [1, 78]]]]], ["attribute", "onkeydown", ["subexpr", "action", ["keydown"], [], ["loc", [null, [1, 91], [1, 111]]]]], ["attribute", "onmousedown", ["subexpr", "action", ["toggle"], [], ["loc", [null, [1, 124], [1, 143]]]]], ["attribute", "onfocus", ["subexpr", "action", ["focusTrigger"], [], ["loc", [null, [1, 152], [1, 177]]]]], ["inline", "yield", [], ["to", "inverse"], ["loc", [null, [2, 2], [2, 24]]]], ["block", "if", [["get", "opened", ["loc", [null, [4, 6], [4, 12]]]]], [], 0, null, ["loc", [null, [4, 0], [10, 7]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define('ember-cli-app-version/components/app-version', ['exports', 'ember', 'ember-cli-app-version/templates/app-version'], function (exports, _ember, _emberCliAppVersionTemplatesAppVersion) {
+ 'use strict';
+
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'span',
+ layout: _emberCliAppVersionTemplatesAppVersion['default']
+ });
+});
+define('ember-cli-app-version/initializer-factory', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports['default'] = initializerFactory;
+
+ var classify = _ember['default'].String.classify;
+
+ function initializerFactory(name, version) {
+ var registered = false;
+
+ return function () {
+ if (!registered && name && version) {
+ var appName = classify(name);
+ _ember['default'].libraries.register(appName, version);
+ registered = true;
+ }
+ };
+ }
+});
+define("ember-cli-app-version/templates/app-version", ["exports"], function (exports) {
+ "use strict";
+
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 2,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-cli-app-version/templates/app-version.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["content", "version", ["loc", [null, [1, 0], [1, 11]]]]],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define('ember-content-editable/components/content-editable', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports['default'] = _ember['default'].Component.extend({
+ classNames: ['ember-content-editable'],
+ classNameBindings: ['extraClass'],
+ attributeBindings: ['contenteditable', 'placeholder', 'spellcheck', 'tabindex', 'readonly', 'disabled'],
+ contenteditable: _ember['default'].computed('editable', 'disabled', function () {
+ if (this.get('editable') !== null) {
+ if (this.get('editable')) {
+ _ember['default'].deprecate("You set editable=true on content-editable, " + "but this has been deprecated in favour of disabled=false");
+ } else {
+ _ember['default'].deprecate("You set editable=false on content-editable, " + "but this has been deprecated in favour of disabled=true");
+ }
+ return this.get('editable');
+ } else {
+ return !this.get('disabled');
+ }
+ }),
+ editable: null,
+ disabled: null,
+ spellcheck: null,
+ isText: null,
+ type: null,
+ readonly: null,
+ allowNewlines: true,
+
+ inputType: _ember['default'].computed('type', 'isText', function () {
+ if (this.get('isText') !== null) {
+ if (this.get('isText')) {
+ _ember['default'].deprecate("You set isText=true on content-editable, " + "but this has been deprecated in favour of type='text'");
+ return "text";
+ } else {
+ _ember['default'].deprecate("You set isText=false on content-editable, " + "but this has been deprecated in favour of type='html'");
+ return "html";
+ }
+ } else {
+ return this.get('type') || "html";
+ }
+ }),
+
+ setup: _ember['default'].on('didInsertElement', function () {
+ var _this2 = this;
+
+ this.setValue();
+ _ember['default'].run.once(function () {
+ return _this2._processInput();
+ });
+
+ this.$().on('paste', function (event) {
+ _this2.handlePaste(event, _this2);
+ });
+ }),
+
+ tidy: _ember['default'].on('willDestroyElement', function () {
+ this.$().off('paste');
+ }),
+
+ _observeValue: true,
+ valueChanged: _ember['default'].observer('value', function () {
+ if (this.get('_observeValue')) {
+ this.setValue();
+ }
+ }),
+
+ setValue: function setValue() {
+ if (this.element) {
+ this.$().text(this.get('value'));
+ }
+ },
+
+ stringInterpolator: function stringInterpolator(s) {
+ return s;
+ },
+
+ _getInputValue: function _getInputValue() {
+ if (this.get('inputType') === "html") {
+ // Deocde html entities
+ var val = this.$().html();
+ val = this.$('
').html(val).text();
+ return val;
+ } else {
+ return this.element.innerText || this.element.textContent;
+ }
+ },
+
+ _processInput: function _processInput() {
+ var val = this._getInputValue();
+ val = this.stringInterpolator(val);
+ val = this.htmlSafe(val);
+
+ this.set('_observeValue', false);
+ this.set('value', val);
+ this.set('_observeValue', true);
+ },
+
+ htmlSafe: function htmlSafe(val) {
+ if (this.get('inputType') === "html") {
+ return _ember['default'].String.htmlSafe(val).toString();
+ } else {
+ return val;
+ }
+ },
+
+ isUnderMaxLength: function isUnderMaxLength(val) {
+ return _ember['default'].isEmpty(this.get('maxlength')) || val.length < this.get('maxlength');
+ },
+
+ updateValue: _ember['default'].on('keyUp', function (event) {
+ this._processInput();
+ this.handleKeyUp(event);
+ }),
+
+ handleKeyUp: function handleKeyUp(event) {
+ if (this.get('readonly')) {
+ event.preventDefault();
+ return false;
+ }
+
+ this.sendAction('key-up', this.get('value'), event);
+ },
+
+ /* Events */
+ handlePaste: function handlePaste(event, _this) {
+ var content = event.originalEvent.clipboardData.getData('text');
+ var currentVal = _this._getInputValue();
+
+ if (!_ember['default'].isEmpty(_this.get('maxlength'))) {
+ event.preventDefault();
+
+ if (window.getSelection().rangeCount > 0) {
+ var start = window.getSelection().getRangeAt(0).startOffset;
+ var end = window.getSelection().getRangeAt(0).endOffset;
+
+ var freeSpace = _this.get('maxlength') - currentVal.length + (end - start);
+ content = content.substring(0, freeSpace);
+
+ var newVal = currentVal.substring(0, start) + content + currentVal.substring(end, _this.get('maxlength'));
+ _this.set('value', newVal);
+
+ var range = document.createRange();
+ range.setStart(_this.element.childNodes[0], start + freeSpace);
+ var sel = window.getSelection();
+ range.collapse(true);
+ sel.removeAllRanges();
+ sel.addRange(range);
+ }
+ }
+
+ var value = this.get('value');
+ this.set('_observeValue', false);
+
+ if (!this.get('allowNewlines')) {
+ value = value.toString().replace(/\n/g, ' ');
+ }
+
+ if (this.get('type') === 'number') {
+ value = value.toString().replace(/[^0-9]/g, '');
+ }
+
+ this.set('value', value);
+ this.set('_observeValue', true);
+ },
+
+ keyDown: function keyDown(event) {
+ if (this.get('readonly')) {
+ event.preventDefault();
+ return false;
+ }
+
+ if (event.keyCode === 27) {
+ // Escape
+ this.sendAction('escape-press', this, event);
+ } else if (event.keyCode === 13) {
+ // Enter
+ this.sendAction('enter', this, event);
+ if (this.get('allowNewlines')) {
+ this.sendAction('insert-newline', this, event);
+ } else {
+ event.preventDefault();
+ return false;
+ }
+ }
+
+ this.sendAction('key-down', this.get('value'), event);
+ },
+
+ keyPress: function keyPress(event) {
+ if (this.get('readonly')) {
+ event.preventDefault();
+ return false;
+ }
+
+ var val = this._getInputValue();
+ if (!this.isUnderMaxLength(val)) {
+ // Check if text is selected (typing will replace)
+ if (window.getSelection().rangeCount > 0) {
+ var start = window.getSelection().getRangeAt(0).startOffset;
+ var end = window.getSelection().getRangeAt(0).endOffset;
+ if (start === end) {
+ event.preventDefault();
+ }
+ } else {
+ event.preventDefault();
+ }
+ }
+
+ if (this.get('type') === 'number') {
+ var key = event.which || event.keyCode;
+ if (key < 48 || key >= 58) {
+ event.preventDefault();
+ return false;
+ }
+ }
+
+ this.sendAction('key-press', this, event);
+ },
+
+ focusIn: function focusIn(event) {
+ this.sendAction('focus-in', this, event);
+ },
+
+ focusOut: function focusOut(event) {
+ this.sendAction('focus-out', this, event);
+ },
+
+ mouseEnter: function mouseEnter(event) {
+ this.sendAction('mouse-enter', this, event);
+ },
+
+ mouseLeave: function mouseLeave(event) {
+ this.sendAction('mouse-leave', this, event);
+ }
+ });
+});
+define("ember-data/-private/adapters", ["exports", "ember-data/adapters/json-api", "ember-data/adapters/rest"], function (exports, _emberDataAdaptersJsonApi, _emberDataAdaptersRest) {
+ /**
+ @module ember-data
+ */
+
+ "use strict";
+
+ exports.JSONAPIAdapter = _emberDataAdaptersJsonApi["default"];
+ exports.RESTAdapter = _emberDataAdaptersRest["default"];
+});
+define('ember-data/-private/adapters/build-url-mixin', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ var get = _ember['default'].get;
+
+ /**
+
+ WARNING: This interface is likely to change in order to accomodate https://github.com/emberjs/rfcs/pull/4
+
+ ## Using BuildURLMixin
+
+ To use url building, include the mixin when extending an adapter, and call `buildURL` where needed.
+ The default behaviour is designed for RESTAdapter.
+
+ ### Example
+
+ ```javascript
+ export default DS.Adapter.extend(BuildURLMixin, {
+ findRecord: function(store, type, id, snapshot) {
+ var url = this.buildURL(type.modelName, id, snapshot, 'findRecord');
+ return this.ajax(url, 'GET');
+ }
+ });
+ ```
+
+ ### Attributes
+
+ The `host` and `namespace` attributes will be used if defined, and are optional.
+
+ @class BuildURLMixin
+ @namespace DS
+ */
+ exports['default'] = _ember['default'].Mixin.create({
+ /**
+ Builds a URL for a given type and optional ID.
+ By default, it pluralizes the type's name (for example, 'post'
+ becomes 'posts' and 'person' becomes 'people'). To override the
+ pluralization see [pathForType](#method_pathForType).
+ If an ID is specified, it adds the ID to the path generated
+ for the type, separated by a `/`.
+ When called by RESTAdapter.findMany() the `id` and `snapshot` parameters
+ will be arrays of ids and snapshots.
+ @method buildURL
+ @param {String} modelName
+ @param {(String|Array|Object)} id single id or array of ids or query
+ @param {(DS.Snapshot|Array)} snapshot single snapshot or array of snapshots
+ @param {String} requestType
+ @param {Object} query object of query parameters to send for query requests.
+ @return {String} url
+ */
+ buildURL: function buildURL(modelName, id, snapshot, requestType, query) {
+ switch (requestType) {
+ case 'findRecord':
+ return this.urlForFindRecord(id, modelName, snapshot);
+ case 'findAll':
+ return this.urlForFindAll(modelName, snapshot);
+ case 'query':
+ return this.urlForQuery(query, modelName);
+ case 'queryRecord':
+ return this.urlForQueryRecord(query, modelName);
+ case 'findMany':
+ return this.urlForFindMany(id, modelName, snapshot);
+ case 'findHasMany':
+ return this.urlForFindHasMany(id, modelName, snapshot);
+ case 'findBelongsTo':
+ return this.urlForFindBelongsTo(id, modelName, snapshot);
+ case 'createRecord':
+ return this.urlForCreateRecord(modelName, snapshot);
+ case 'updateRecord':
+ return this.urlForUpdateRecord(id, modelName, snapshot);
+ case 'deleteRecord':
+ return this.urlForDeleteRecord(id, modelName, snapshot);
+ default:
+ return this._buildURL(modelName, id);
+ }
+ },
+
+ /**
+ @method _buildURL
+ @private
+ @param {String} modelName
+ @param {String} id
+ @return {String} url
+ */
+ _buildURL: function _buildURL(modelName, id) {
+ var url = [];
+ var host = get(this, 'host');
+ var prefix = this.urlPrefix();
+ var path;
+
+ if (modelName) {
+ path = this.pathForType(modelName);
+ if (path) {
+ url.push(path);
+ }
+ }
+
+ if (id) {
+ url.push(encodeURIComponent(id));
+ }
+ if (prefix) {
+ url.unshift(prefix);
+ }
+
+ url = url.join('/');
+ if (!host && url && url.charAt(0) !== '/') {
+ url = '/' + url;
+ }
+
+ return url;
+ },
+
+ /**
+ * @method urlForFindRecord
+ * @param {String} id
+ * @param {String} modelName
+ * @param {DS.Snapshot} snapshot
+ * @return {String} url
+ */
+ urlForFindRecord: function urlForFindRecord(id, modelName, snapshot) {
+ return this._buildURL(modelName, id);
+ },
+
+ /**
+ * @method urlForFindAll
+ * @param {String} modelName
+ * @param {DS.SnapshotRecordArray} snapshot
+ * @return {String} url
+ */
+ urlForFindAll: function urlForFindAll(modelName, snapshot) {
+ return this._buildURL(modelName);
+ },
+
+ /**
+ * @method urlForQuery
+ * @param {Object} query
+ * @param {String} modelName
+ * @return {String} url
+ */
+ urlForQuery: function urlForQuery(query, modelName) {
+ return this._buildURL(modelName);
+ },
+
+ /**
+ * @method urlForQueryRecord
+ * @param {Object} query
+ * @param {String} modelName
+ * @return {String} url
+ */
+ urlForQueryRecord: function urlForQueryRecord(query, modelName) {
+ return this._buildURL(modelName);
+ },
+
+ /**
+ * @method urlForFindMany
+ * @param {Array} ids
+ * @param {String} modelName
+ * @param {Array} snapshots
+ * @return {String} url
+ */
+ urlForFindMany: function urlForFindMany(ids, modelName, snapshots) {
+ return this._buildURL(modelName);
+ },
+
+ /**
+ * @method urlForFindHasMany
+ * @param {String} id
+ * @param {String} modelName
+ * @param {DS.Snapshot} snapshot
+ * @return {String} url
+ */
+ urlForFindHasMany: function urlForFindHasMany(id, modelName, snapshot) {
+ return this._buildURL(modelName, id);
+ },
+
+ /**
+ * @method urlForFindBelongsTo
+ * @param {String} id
+ * @param {String} modelName
+ * @param {DS.Snapshot} snapshot
+ * @return {String} url
+ */
+ urlForFindBelongsTo: function urlForFindBelongsTo(id, modelName, snapshot) {
+ return this._buildURL(modelName, id);
+ },
+
+ /**
+ * @method urlForCreateRecord
+ * @param {String} modelName
+ * @param {DS.Snapshot} snapshot
+ * @return {String} url
+ */
+ urlForCreateRecord: function urlForCreateRecord(modelName, snapshot) {
+ return this._buildURL(modelName);
+ },
+
+ /**
+ * @method urlForUpdateRecord
+ * @param {String} id
+ * @param {String} modelName
+ * @param {DS.Snapshot} snapshot
+ * @return {String} url
+ */
+ urlForUpdateRecord: function urlForUpdateRecord(id, modelName, snapshot) {
+ return this._buildURL(modelName, id);
+ },
+
+ /**
+ * @method urlForDeleteRecord
+ * @param {String} id
+ * @param {String} modelName
+ * @param {DS.Snapshot} snapshot
+ * @return {String} url
+ */
+ urlForDeleteRecord: function urlForDeleteRecord(id, modelName, snapshot) {
+ return this._buildURL(modelName, id);
+ },
+
+ /**
+ @method urlPrefix
+ @private
+ @param {String} path
+ @param {String} parentURL
+ @return {String} urlPrefix
+ */
+ urlPrefix: function urlPrefix(path, parentURL) {
+ var host = get(this, 'host');
+ var namespace = get(this, 'namespace');
+
+ if (!host || host === '/') {
+ host = '';
+ }
+
+ if (path) {
+ // Protocol relative url
+ if (/^\/\//.test(path) || /http(s)?:\/\//.test(path)) {
+ // Do nothing, the full host is already included.
+ return path;
+
+ // Absolute path
+ } else if (path.charAt(0) === '/') {
+ return '' + host + path;
+ // Relative path
+ } else {
+ return parentURL + '/' + path;
+ }
+ }
+
+ // No path provided
+ var url = [];
+ if (host) {
+ url.push(host);
+ }
+ if (namespace) {
+ url.push(namespace);
+ }
+ return url.join('/');
+ },
+
+ /**
+ Determines the pathname for a given type.
+ By default, it pluralizes the type's name (for example,
+ 'post' becomes 'posts' and 'person' becomes 'people').
+ ### Pathname customization
+ For example if you have an object LineItem with an
+ endpoint of "/line_items/".
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.RESTAdapter.extend({
+ pathForType: function(modelName) {
+ var decamelized = Ember.String.decamelize(modelName);
+ return Ember.String.pluralize(decamelized);
+ }
+ });
+ ```
+ @method pathForType
+ @param {String} modelName
+ @return {String} path
+ **/
+ pathForType: function pathForType(modelName) {
+ var camelized = _ember['default'].String.camelize(modelName);
+ return _ember['default'].String.pluralize(camelized);
+ }
+ });
+});
+define('ember-data/-private/core', ['exports', 'ember', 'ember-data/version'], function (exports, _ember, _emberDataVersion) {
+ 'use strict';
+
+ /**
+ @module ember-data
+ */
+
+ /**
+ All Ember Data classes, methods and functions are defined inside of this namespace.
+
+ @class DS
+ @static
+ */
+
+ /**
+ @property VERSION
+ @type String
+ @static
+ */
+ var DS = _ember['default'].Namespace.create({
+ VERSION: _emberDataVersion['default'],
+ name: "DS"
+ });
+
+ if (_ember['default'].libraries) {
+ _ember['default'].libraries.registerCoreLibrary('Ember Data', DS.VERSION);
+ }
+
+ exports['default'] = DS;
+});
+define('ember-data/-private/debug', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports.assert = assert;
+ exports.debug = debug;
+ exports.deprecate = deprecate;
+ exports.info = info;
+ exports.runInDebug = runInDebug;
+ exports.warn = warn;
+ exports.debugSeal = debugSeal;
+ exports.assertPolymorphicType = assertPolymorphicType;
+
+ function assert() {
+ return _ember['default'].assert.apply(_ember['default'], arguments);
+ }
+
+ function debug() {
+ return _ember['default'].debug.apply(_ember['default'], arguments);
+ }
+
+ function deprecate() {
+ return _ember['default'].deprecate.apply(_ember['default'], arguments);
+ }
+
+ function info() {
+ return _ember['default'].info.apply(_ember['default'], arguments);
+ }
+
+ function runInDebug() {
+ return _ember['default'].runInDebug.apply(_ember['default'], arguments);
+ }
+
+ function warn() {
+ return _ember['default'].warn.apply(_ember['default'], arguments);
+ }
+
+ function debugSeal() {
+ return _ember['default'].debugSeal.apply(_ember['default'], arguments);
+ }
+
+ function checkPolymorphic(typeClass, addedRecord) {
+ if (typeClass.__isMixin) {
+ //TODO Need to do this in order to support mixins, should convert to public api
+ //once it exists in Ember
+ return typeClass.__mixin.detect(addedRecord.type.PrototypeMixin);
+ }
+ if (_ember['default'].MODEL_FACTORY_INJECTIONS) {
+ typeClass = typeClass.superclass;
+ }
+ return typeClass.detect(addedRecord.type);
+ }
+
+ /*
+ Assert that `addedRecord` has a valid type so it can be added to the
+ relationship of the `record`.
+
+ The assert basically checks if the `addedRecord` can be added to the
+ relationship (specified via `relationshipMeta`) of the `record`.
+
+ This utility should only be used internally, as both record parameters must
+ be an InternalModel and the `relationshipMeta` needs to be the meta
+ information about the relationship, retrieved via
+ `record.relationshipFor(key)`.
+
+ @method assertPolymorphicType
+ @param {InternalModel} record
+ @param {RelationshipMeta} relationshipMeta retrieved via
+ `record.relationshipFor(key)`
+ @param {InternalModel} addedRecord record which
+ should be added/set for the relationship
+ */
+
+ function assertPolymorphicType(record, relationshipMeta, addedRecord) {
+ var addedType = addedRecord.type.modelName;
+ var recordType = record.type.modelName;
+ var key = relationshipMeta.key;
+ var typeClass = record.store.modelFor(relationshipMeta.type);
+
+ var assertionMessage = 'You cannot add a record of type \'' + addedType + '\' to the \'' + recordType + '.' + key + '\' relationship (only \'' + typeClass.modelName + '\' allowed)';
+
+ assert(assertionMessage, checkPolymorphic(typeClass, addedRecord));
+ }
+});
+define('ember-data/-private/ext/date', ['exports', 'ember', 'ember-data/-private/debug'], function (exports, _ember, _emberDataPrivateDebug) {
+ /**
+ @module ember-data
+ */
+
+ 'use strict';
+
+ /**
+ Date.parse with progressive enhancement for ISO 8601
+
+ © 2011 Colin Snover
+
+ Released under MIT license.
+
+ @class Date
+ @namespace Ember
+ @static
+ @deprecated
+ */
+ _ember['default'].Date = _ember['default'].Date || {};
+
+ var origParse = Date.parse;
+ var numericKeys = [1, 4, 5, 6, 7, 10, 11];
+
+ var parseDate = function parseDate(date) {
+ var timestamp, struct;
+ var minutesOffset = 0;
+
+ // ES5 §15.9.4.2 states that the string should attempt to be parsed as a Date Time String Format string
+ // before falling back to any implementation-specific date parsing, so that’s what we do, even if native
+ // implementations could be faster
+ // 1 YYYY 2 MM 3 DD 4 HH 5 mm 6 ss 7 msec 8 Z 9 ± 10 tzHH 11 tzmm
+ if (struct = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?:(\d{2}))?)?)?$/.exec(date)) {
+ // avoid NaN timestamps caused by “undefined” values being passed to Date.UTC
+ for (var i = 0, k; k = numericKeys[i]; ++i) {
+ struct[k] = +struct[k] || 0;
+ }
+
+ // allow undefined days and months
+ struct[2] = (+struct[2] || 1) - 1;
+ struct[3] = +struct[3] || 1;
+
+ if (struct[8] !== 'Z' && struct[9] !== undefined) {
+ minutesOffset = struct[10] * 60 + struct[11];
+
+ if (struct[9] === '+') {
+ minutesOffset = 0 - minutesOffset;
+ }
+ }
+
+ timestamp = Date.UTC(struct[1], struct[2], struct[3], struct[4], struct[5] + minutesOffset, struct[6], struct[7]);
+ } else {
+ timestamp = origParse ? origParse(date) : NaN;
+ }
+
+ return timestamp;
+ };
+
+ exports.parseDate = parseDate;
+
+ _ember['default'].Date.parse = function (date) {
+ // throw deprecation
+ (0, _emberDataPrivateDebug.deprecate)('Ember.Date.parse is deprecated because Safari 5-, IE8-, and\n Firefox 3.6- are no longer supported (see\n https://github.com/csnover/js-iso8601 for the history of this issue).\n Please use Date.parse instead', false, {
+ id: 'ds.ember.date.parse-deprecate',
+ until: '3.0.0'
+ });
+
+ return parseDate(date);
+ };
+
+ if (_ember['default'].EXTEND_PROTOTYPES === true || _ember['default'].EXTEND_PROTOTYPES.Date) {
+ (0, _emberDataPrivateDebug.deprecate)('Overriding Date.parse with Ember.Date.parse is deprecated. Please set ENV.EmberENV.EXTEND_PROTOTYPES.Date to false in config/environment.js\n\n\n// config/environment.js\nENV = {\n EmberENV: {\n EXTEND_PROTOTYPES: {\n Date: false,\n }\n }\n}\n', false, {
+ id: 'ds.date.parse-deprecate',
+ until: '3.0.0'
+ });
+ Date.parse = parseDate;
+ }
+});
+define('ember-data/-private/features', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports['default'] = isEnabled;
+
+ function isEnabled() {
+ var _Ember$FEATURES;
+
+ return (_Ember$FEATURES = _ember['default'].FEATURES).isEnabled.apply(_Ember$FEATURES, arguments);
+ }
+});
+define('ember-data/-private/global', ['exports'], function (exports) {
+ /* globals global, window, self */
+
+ // originally from https://github.com/emberjs/ember.js/blob/c0bd26639f50efd6a03ee5b87035fd200e313b8e/packages/ember-environment/lib/global.js
+
+ // from lodash to catch fake globals
+ 'use strict';
+
+ function checkGlobal(value) {
+ return value && value.Object === Object ? value : undefined;
+ }
+
+ // element ids can ruin global miss checks
+ function checkElementIdShadowing(value) {
+ return value && value.nodeType === undefined ? value : undefined;
+ }
+
+ // export real global
+ exports['default'] = checkGlobal(checkElementIdShadowing(typeof global === 'object' && global)) || checkGlobal(typeof self === 'object' && self) || checkGlobal(typeof window === 'object' && window) || new Function('return this')();
+ // eval outside of strict mode
+});
+define("ember-data/-private/initializers/data-adapter", ["exports", "ember-data/-private/system/debug/debug-adapter"], function (exports, _emberDataPrivateSystemDebugDebugAdapter) {
+ "use strict";
+
+ exports["default"] = initializeDebugAdapter;
+
+ /*
+ Configures a registry with injections on Ember applications
+ for the Ember-Data store. Accepts an optional namespace argument.
+
+ @method initializeDebugAdapter
+ @param {Ember.Registry} registry
+ */
+ function initializeDebugAdapter(registry) {
+ registry.register('data-adapter:main', _emberDataPrivateSystemDebugDebugAdapter["default"]);
+ }
+});
+define('ember-data/-private/initializers/store-injections', ['exports'], function (exports) {
+ 'use strict';
+
+ exports['default'] = initializeStoreInjections;
+
+ /*
+ Configures a registry with injections on Ember applications
+ for the Ember-Data store. Accepts an optional namespace argument.
+
+ @method initializeStoreInjections
+ @param {Ember.Registry} registry
+ */
+ function initializeStoreInjections(registry) {
+ // registry.injection for Ember < 2.1.0
+ // application.inject for Ember 2.1.0+
+ var inject = registry.inject || registry.injection;
+ inject.call(registry, 'controller', 'store', 'service:store');
+ inject.call(registry, 'route', 'store', 'service:store');
+ inject.call(registry, 'data-adapter', 'store', 'service:store');
+ }
+});
+define("ember-data/-private/initializers/store", ["exports", "ember-data/-private/system/store", "ember-data/-private/serializers", "ember-data/-private/adapters"], function (exports, _emberDataPrivateSystemStore, _emberDataPrivateSerializers, _emberDataPrivateAdapters) {
+ "use strict";
+
+ exports["default"] = initializeStore;
+
+ function has(applicationOrRegistry, fullName) {
+ if (applicationOrRegistry.has) {
+ // < 2.1.0
+ return applicationOrRegistry.has(fullName);
+ } else {
+ // 2.1.0+
+ return applicationOrRegistry.hasRegistration(fullName);
+ }
+ }
+
+ /*
+ Configures a registry for use with an Ember-Data
+ store. Accepts an optional namespace argument.
+
+ @method initializeStore
+ @param {Ember.Registry} registry
+ */
+ function initializeStore(registry) {
+ // registry.optionsForType for Ember < 2.1.0
+ // application.registerOptionsForType for Ember 2.1.0+
+ var registerOptionsForType = registry.registerOptionsForType || registry.optionsForType;
+ registerOptionsForType.call(registry, 'serializer', { singleton: false });
+ registerOptionsForType.call(registry, 'adapter', { singleton: false });
+
+ registry.register('serializer:-default', _emberDataPrivateSerializers.JSONSerializer);
+ registry.register('serializer:-rest', _emberDataPrivateSerializers.RESTSerializer);
+ registry.register('adapter:-rest', _emberDataPrivateAdapters.RESTAdapter);
+
+ registry.register('adapter:-json-api', _emberDataPrivateAdapters.JSONAPIAdapter);
+ registry.register('serializer:-json-api', _emberDataPrivateSerializers.JSONAPISerializer);
+
+ if (!has(registry, 'service:store')) {
+ registry.register('service:store', _emberDataPrivateSystemStore["default"]);
+ }
+ }
+});
+define('ember-data/-private/initializers/transforms', ['exports', 'ember-data/-private/transforms'], function (exports, _emberDataPrivateTransforms) {
+ 'use strict';
+
+ exports['default'] = initializeTransforms;
+
+ /*
+ Configures a registry for use with Ember-Data
+ transforms.
+
+ @method initializeTransforms
+ @param {Ember.Registry} registry
+ */
+ function initializeTransforms(registry) {
+ registry.register('transform:boolean', _emberDataPrivateTransforms.BooleanTransform);
+ registry.register('transform:date', _emberDataPrivateTransforms.DateTransform);
+ registry.register('transform:number', _emberDataPrivateTransforms.NumberTransform);
+ registry.register('transform:string', _emberDataPrivateTransforms.StringTransform);
+ }
+});
+define('ember-data/-private/instance-initializers/initialize-store-service', ['exports'], function (exports) {
+ 'use strict';
+
+ exports['default'] = initializeStoreService;
+
+ /*
+ Configures a registry for use with an Ember-Data
+ store.
+
+ @method initializeStoreService
+ @param {Ember.ApplicationInstance} applicationOrRegistry
+ */
+ function initializeStoreService(application) {
+ var container = application.lookup ? application : application.container;
+ // Eagerly generate the store so defaultStore is populated.
+ container.lookup('service:store');
+ }
+});
+define("ember-data/-private/serializers", ["exports", "ember-data/serializers/json-api", "ember-data/serializers/json", "ember-data/serializers/rest"], function (exports, _emberDataSerializersJsonApi, _emberDataSerializersJson, _emberDataSerializersRest) {
+ /**
+ @module ember-data
+ */
+
+ "use strict";
+
+ exports.JSONAPISerializer = _emberDataSerializersJsonApi["default"];
+ exports.JSONSerializer = _emberDataSerializersJson["default"];
+ exports.RESTSerializer = _emberDataSerializersRest["default"];
+});
+define("ember-data/-private/system/clone-null", ["exports", "ember-data/-private/system/empty-object"], function (exports, _emberDataPrivateSystemEmptyObject) {
+ "use strict";
+
+ exports["default"] = cloneNull;
+
+ function cloneNull(source) {
+ var clone = new _emberDataPrivateSystemEmptyObject["default"]();
+ for (var key in source) {
+ clone[key] = source[key];
+ }
+ return clone;
+ }
+});
+define('ember-data/-private/system/coerce-id', ['exports'], function (exports) {
+ 'use strict';
+
+ exports['default'] = coerceId;
+
+ // Used by the store to normalize IDs entering the store. Despite the fact
+ // that developers may provide IDs as numbers (e.g., `store.findRecord('person', 1)`),
+ // it is important that internally we use strings, since IDs may be serialized
+ // and lose type information. For example, Ember's router may put a record's
+ // ID into the URL, and if we later try to deserialize that URL and find the
+ // corresponding record, we will not know if it is a string or a number.
+
+ function coerceId(id) {
+ return id === null || id === undefined || id === '' ? null : id + '';
+ }
+});
+define('ember-data/-private/system/container-proxy', ['exports', 'ember-data/-private/debug'], function (exports, _emberDataPrivateDebug) {
+ 'use strict';
+
+ exports['default'] = ContainerProxy;
+
+ /*
+ This is used internally to enable deprecation of container paths and provide
+ a decent message to the user indicating how to fix the issue.
+
+ @class ContainerProxy
+ @namespace DS
+ @private
+ */
+ function ContainerProxy(container) {
+ this.container = container;
+ }
+
+ ContainerProxy.prototype.aliasedFactory = function (path, preLookup) {
+ var _this = this;
+
+ return {
+ create: function create() {
+ if (preLookup) {
+ preLookup();
+ }
+
+ return _this.container.lookup(path);
+ }
+ };
+ };
+
+ ContainerProxy.prototype.registerAlias = function (source, dest, preLookup) {
+ var factory = this.aliasedFactory(dest, preLookup);
+
+ return this.container.register(source, factory);
+ };
+
+ ContainerProxy.prototype.registerDeprecation = function (deprecated, valid) {
+ var preLookupCallback = function preLookupCallback() {
+ (0, _emberDataPrivateDebug.deprecate)('You tried to look up \'' + deprecated + '\', but this has been deprecated in favor of \'' + valid + '\'.', false, {
+ id: 'ds.store.deprecated-lookup',
+ until: '2.0.0'
+ });
+ };
+
+ return this.registerAlias(deprecated, valid, preLookupCallback);
+ };
+
+ ContainerProxy.prototype.registerDeprecations = function (proxyPairs) {
+ var i, proxyPair, deprecated, valid;
+
+ for (i = proxyPairs.length; i > 0; i--) {
+ proxyPair = proxyPairs[i - 1];
+ deprecated = proxyPair['deprecated'];
+ valid = proxyPair['valid'];
+
+ this.registerDeprecation(deprecated, valid);
+ }
+ };
+});
+define("ember-data/-private/system/debug", ["exports", "ember-data/-private/system/debug/debug-adapter"], function (exports, _emberDataPrivateSystemDebugDebugAdapter) {
+ /**
+ @module ember-data
+ */
+
+ "use strict";
+
+ exports["default"] = _emberDataPrivateSystemDebugDebugAdapter["default"];
+});
+define('ember-data/-private/system/debug/debug-adapter', ['exports', 'ember', 'ember-data/model'], function (exports, _ember, _emberDataModel) {
+ /**
+ @module ember-data
+ */
+ 'use strict';
+
+ var get = _ember['default'].get;
+ var capitalize = _ember['default'].String.capitalize;
+ var underscore = _ember['default'].String.underscore;
+ var assert = _ember['default'].assert;
+
+ /*
+ Extend `Ember.DataAdapter` with ED specific code.
+
+ @class DebugAdapter
+ @namespace DS
+ @extends Ember.DataAdapter
+ @private
+ */
+ exports['default'] = _ember['default'].DataAdapter.extend({
+ getFilters: function getFilters() {
+ return [{ name: 'isNew', desc: 'New' }, { name: 'isModified', desc: 'Modified' }, { name: 'isClean', desc: 'Clean' }];
+ },
+
+ detect: function detect(typeClass) {
+ return typeClass !== _emberDataModel['default'] && _emberDataModel['default'].detect(typeClass);
+ },
+
+ columnsForType: function columnsForType(typeClass) {
+ var columns = [{
+ name: 'id',
+ desc: 'Id'
+ }];
+ var count = 0;
+ var self = this;
+ get(typeClass, 'attributes').forEach(function (meta, name) {
+ if (count++ > self.attributeLimit) {
+ return false;
+ }
+ var desc = capitalize(underscore(name).replace('_', ' '));
+ columns.push({ name: name, desc: desc });
+ });
+ return columns;
+ },
+
+ getRecords: function getRecords(modelClass, modelName) {
+ if (arguments.length < 2) {
+ // Legacy Ember.js < 1.13 support
+ var containerKey = modelClass._debugContainerKey;
+ if (containerKey) {
+ var match = containerKey.match(/model:(.*)/);
+ if (match) {
+ modelName = match[1];
+ }
+ }
+ }
+ assert("Cannot find model name. Please upgrade to Ember.js >= 1.13 for Ember Inspector support", !!modelName);
+ return this.get('store').peekAll(modelName);
+ },
+
+ getRecordColumnValues: function getRecordColumnValues(record) {
+ var _this = this;
+
+ var count = 0;
+ var columnValues = { id: get(record, 'id') };
+
+ record.eachAttribute(function (key) {
+ if (count++ > _this.attributeLimit) {
+ return false;
+ }
+ var value = get(record, key);
+ columnValues[key] = value;
+ });
+ return columnValues;
+ },
+
+ getRecordKeywords: function getRecordKeywords(record) {
+ var keywords = [];
+ var keys = _ember['default'].A(['id']);
+ record.eachAttribute(function (key) {
+ return keys.push(key);
+ });
+ keys.forEach(function (key) {
+ return keywords.push(get(record, key));
+ });
+ return keywords;
+ },
+
+ getRecordFilterValues: function getRecordFilterValues(record) {
+ return {
+ isNew: record.get('isNew'),
+ isModified: record.get('hasDirtyAttributes') && !record.get('isNew'),
+ isClean: !record.get('hasDirtyAttributes')
+ };
+ },
+
+ getRecordColor: function getRecordColor(record) {
+ var color = 'black';
+ if (record.get('isNew')) {
+ color = 'green';
+ } else if (record.get('hasDirtyAttributes')) {
+ color = 'blue';
+ }
+ return color;
+ },
+
+ observeRecord: function observeRecord(record, recordUpdated) {
+ var releaseMethods = _ember['default'].A();
+ var keysToObserve = _ember['default'].A(['id', 'isNew', 'hasDirtyAttributes']);
+
+ record.eachAttribute(function (key) {
+ return keysToObserve.push(key);
+ });
+ var adapter = this;
+
+ keysToObserve.forEach(function (key) {
+ var handler = function handler() {
+ recordUpdated(adapter.wrapRecord(record));
+ };
+ _ember['default'].addObserver(record, key, handler);
+ releaseMethods.push(function () {
+ _ember['default'].removeObserver(record, key, handler);
+ });
+ });
+
+ var release = function release() {
+ releaseMethods.forEach(function (fn) {
+ return fn();
+ });
+ };
+
+ return release;
+ }
+ });
+});
+define('ember-data/-private/system/debug/debug-info', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports['default'] = _ember['default'].Mixin.create({
+
+ /**
+ Provides info about the model for debugging purposes
+ by grouping the properties into more semantic groups.
+ Meant to be used by debugging tools such as the Chrome Ember Extension.
+ - Groups all attributes in "Attributes" group.
+ - Groups all belongsTo relationships in "Belongs To" group.
+ - Groups all hasMany relationships in "Has Many" group.
+ - Groups all flags in "Flags" group.
+ - Flags relationship CPs as expensive properties.
+ @method _debugInfo
+ @for DS.Model
+ @private
+ */
+ _debugInfo: function _debugInfo() {
+ var attributes = ['id'];
+ var relationships = { belongsTo: [], hasMany: [] };
+ var expensiveProperties = [];
+
+ this.eachAttribute(function (name, meta) {
+ return attributes.push(name);
+ });
+
+ this.eachRelationship(function (name, relationship) {
+ relationships[relationship.kind].push(name);
+ expensiveProperties.push(name);
+ });
+
+ var groups = [{
+ name: 'Attributes',
+ properties: attributes,
+ expand: true
+ }, {
+ name: 'Belongs To',
+ properties: relationships.belongsTo,
+ expand: true
+ }, {
+ name: 'Has Many',
+ properties: relationships.hasMany,
+ expand: true
+ }, {
+ name: 'Flags',
+ properties: ['isLoaded', 'hasDirtyAttributes', 'isSaving', 'isDeleted', 'isError', 'isNew', 'isValid']
+ }];
+
+ return {
+ propertyInfo: {
+ // include all other mixins / properties (not just the grouped ones)
+ includeOtherProperties: true,
+ groups: groups,
+ // don't pre-calculate unless cached
+ expensiveProperties: expensiveProperties
+ }
+ };
+ }
+ });
+});
+define("ember-data/-private/system/empty-object", ["exports"], function (exports) {
+ "use strict";
+
+ exports["default"] = EmptyObject;
+
+ // This exists because `Object.create(null)` is absurdly slow compared
+ // to `new EmptyObject()`. In either case, you want a null prototype
+ // when you're treating the object instances as arbitrary dictionaries
+ // and don't want your keys colliding with build-in methods on the
+ // default object prototype.
+ var proto = Object.create(null, {
+ // without this, we will always still end up with (new
+ // EmptyObject()).constructor === Object
+ constructor: {
+ value: undefined,
+ enumerable: false,
+ writable: true
+ }
+ });
+ function EmptyObject() {}
+
+ EmptyObject.prototype = proto;
+});
+define('ember-data/-private/system/is-array-like', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports['default'] = isArrayLike;
+
+ /*
+ We're using this to detect arrays and "array-like" objects.
+
+ This is a copy of the `isArray` method found in `ember-runtime/utils` as we're
+ currently unable to import non-exposed modules.
+
+ This method was previously exposed as `Ember.isArray` but since
+ https://github.com/emberjs/ember.js/pull/11463 `Ember.isArray` is an alias of
+ `Array.isArray` hence removing the "array-like" part.
+ */
+ function isArrayLike(obj) {
+ if (!obj || obj.setInterval) {
+ return false;
+ }
+ if (Array.isArray(obj)) {
+ return true;
+ }
+ if (_ember['default'].Array.detect(obj)) {
+ return true;
+ }
+
+ var type = _ember['default'].typeOf(obj);
+ if ('array' === type) {
+ return true;
+ }
+ if (obj.length !== undefined && 'object' === type) {
+ return true;
+ }
+ return false;
+ }
+});
+define("ember-data/-private/system/many-array", ["exports", "ember", "ember-data/-private/debug", "ember-data/-private/system/promise-proxies", "ember-data/-private/system/store/common"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateSystemPromiseProxies, _emberDataPrivateSystemStoreCommon) {
+ /**
+ @module ember-data
+ */
+ "use strict";
+
+ var get = _ember["default"].get;
+ var set = _ember["default"].set;
+
+ /**
+ A `ManyArray` is a `MutableArray` that represents the contents of a has-many
+ relationship.
+
+ The `ManyArray` is instantiated lazily the first time the relationship is
+ requested.
+
+ ### Inverses
+
+ Often, the relationships in Ember Data applications will have
+ an inverse. For example, imagine the following models are
+ defined:
+
+ ```app/models/post.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ comments: DS.hasMany('comment')
+ });
+ ```
+
+ ```app/models/comment.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ post: DS.belongsTo('post')
+ });
+ ```
+
+ If you created a new instance of `App.Post` and added
+ a `App.Comment` record to its `comments` has-many
+ relationship, you would expect the comment's `post`
+ property to be set to the post that contained
+ the has-many.
+
+ We call the record to which a relationship belongs the
+ relationship's _owner_.
+
+ @class ManyArray
+ @namespace DS
+ @extends Ember.Object
+ @uses Ember.MutableArray, Ember.Evented
+ */
+ exports["default"] = _ember["default"].Object.extend(_ember["default"].MutableArray, _ember["default"].Evented, {
+ init: function init() {
+ this._super.apply(this, arguments);
+ this.currentState = _ember["default"].A([]);
+ },
+
+ record: null,
+
+ canonicalState: null,
+ currentState: null,
+
+ length: 0,
+
+ objectAt: function objectAt(index) {
+ //Ember observers such as 'firstObject', 'lastObject' might do out of bounds accesses
+ if (!this.currentState[index]) {
+ return undefined;
+ }
+ return this.currentState[index].getRecord();
+ },
+
+ flushCanonical: function flushCanonical() {
+ //TODO make this smarter, currently its plenty stupid
+ var toSet = this.canonicalState.filter(function (internalModel) {
+ return !internalModel.isDeleted();
+ });
+
+ //a hack for not removing new records
+ //TODO remove once we have proper diffing
+ var newRecords = this.currentState.filter(
+ // only add new records which are not yet in the canonical state of this
+ // relationship (a new record can be in the canonical state if it has
+ function (internalModel) {
+ return internalModel.isNew() && toSet.indexOf(internalModel) === -1;
+ });
+ toSet = toSet.concat(newRecords);
+ var oldLength = this.length;
+ this.arrayContentWillChange(0, this.length, toSet.length);
+ // It’s possible the parent side of the relationship may have been unloaded by this point
+ if ((0, _emberDataPrivateSystemStoreCommon._objectIsAlive)(this)) {
+ this.set('length', toSet.length);
+ }
+ this.currentState = toSet;
+ this.arrayContentDidChange(0, oldLength, this.length);
+ //TODO Figure out to notify only on additions and maybe only if unloaded
+ this.relationship.notifyHasManyChanged();
+ this.record.updateRecordArrays();
+ },
+ /**
+ `true` if the relationship is polymorphic, `false` otherwise.
+ @property {Boolean} isPolymorphic
+ @private
+ */
+ isPolymorphic: false,
+
+ /**
+ The loading state of this array
+ @property {Boolean} isLoaded
+ */
+ isLoaded: false,
+
+ /**
+ The relationship which manages this array.
+ @property {ManyRelationship} relationship
+ @private
+ */
+ relationship: null,
+
+ /**
+ Metadata associated with the request for async hasMany relationships.
+ Example
+ Given that the server returns the following JSON payload when fetching a
+ hasMany relationship:
+ ```js
+ {
+ "comments": [{
+ "id": 1,
+ "comment": "This is the first comment",
+ }, {
+ // ...
+ }],
+ "meta": {
+ "page": 1,
+ "total": 5
+ }
+ }
+ ```
+ You can then access the metadata via the `meta` property:
+ ```js
+ post.get('comments').then(function(comments) {
+ var meta = comments.get('meta');
+ // meta.page => 1
+ // meta.total => 5
+ });
+ ```
+ @property {Object} meta
+ @public
+ */
+ meta: null,
+
+ internalReplace: function internalReplace(idx, amt, objects) {
+ if (!objects) {
+ objects = [];
+ }
+ this.arrayContentWillChange(idx, amt, objects.length);
+ this.currentState.splice.apply(this.currentState, [idx, amt].concat(objects));
+ this.set('length', this.currentState.length);
+ this.arrayContentDidChange(idx, amt, objects.length);
+ if (objects) {
+ //TODO(Igor) probably needed only for unloaded records
+ this.relationship.notifyHasManyChanged();
+ }
+ this.record.updateRecordArrays();
+ },
+
+ //TODO(Igor) optimize
+ internalRemoveRecords: function internalRemoveRecords(records) {
+ var index;
+ for (var i = 0; i < records.length; i++) {
+ index = this.currentState.indexOf(records[i]);
+ this.internalReplace(index, 1);
+ }
+ },
+
+ //TODO(Igor) optimize
+ internalAddRecords: function internalAddRecords(records, idx) {
+ if (idx === undefined) {
+ idx = this.currentState.length;
+ }
+ this.internalReplace(idx, 0, records);
+ },
+
+ replace: function replace(idx, amt, objects) {
+ var records;
+ if (amt > 0) {
+ records = this.currentState.slice(idx, idx + amt);
+ this.get('relationship').removeRecords(records);
+ }
+ if (objects) {
+ this.get('relationship').addRecords(objects.map(function (obj) {
+ return obj._internalModel;
+ }), idx);
+ }
+ },
+ /**
+ Used for async `hasMany` arrays
+ to keep track of when they will resolve.
+ @property {Ember.RSVP.Promise} promise
+ @private
+ */
+ promise: null,
+
+ /**
+ @method loadingRecordsCount
+ @param {Number} count
+ @private
+ */
+ loadingRecordsCount: function loadingRecordsCount(count) {
+ this.loadingRecordsCount = count;
+ },
+
+ /**
+ @method loadedRecord
+ @private
+ */
+ loadedRecord: function loadedRecord() {
+ this.loadingRecordsCount--;
+ if (this.loadingRecordsCount === 0) {
+ set(this, 'isLoaded', true);
+ this.trigger('didLoad');
+ }
+ },
+
+ /**
+ @method reload
+ @public
+ */
+ reload: function reload() {
+ return this.relationship.reload();
+ },
+
+ /**
+ Saves all of the records in the `ManyArray`.
+ Example
+ ```javascript
+ store.findRecord('inbox', 1).then(function(inbox) {
+ inbox.get('messages').then(function(messages) {
+ messages.forEach(function(message) {
+ message.set('isRead', true);
+ });
+ messages.save()
+ });
+ });
+ ```
+ @method save
+ @return {DS.PromiseArray} promise
+ */
+ save: function save() {
+ var manyArray = this;
+ var promiseLabel = "DS: ManyArray#save " + get(this, 'type');
+ var promise = _ember["default"].RSVP.all(this.invoke("save"), promiseLabel).then(function (array) {
+ return manyArray;
+ }, null, "DS: ManyArray#save return ManyArray");
+
+ return _emberDataPrivateSystemPromiseProxies.PromiseArray.create({ promise: promise });
+ },
+
+ /**
+ Create a child record within the owner
+ @method createRecord
+ @private
+ @param {Object} hash
+ @return {DS.Model} record
+ */
+ createRecord: function createRecord(hash) {
+ var store = get(this, 'store');
+ var type = get(this, 'type');
+ var record;
+
+ (0, _emberDataPrivateDebug.assert)("You cannot add '" + type.modelName + "' records to this polymorphic relationship.", !get(this, 'isPolymorphic'));
+ record = store.createRecord(type.modelName, hash);
+ this.pushObject(record);
+
+ return record;
+ }
+ });
+});
+// been 'acknowleged' to be in the relationship via a store.push)
+define("ember-data/-private/system/model", ["exports", "ember-data/-private/system/model/model", "ember-data/attr", "ember-data/-private/system/model/states", "ember-data/-private/system/model/errors"], function (exports, _emberDataPrivateSystemModelModel, _emberDataAttr, _emberDataPrivateSystemModelStates, _emberDataPrivateSystemModelErrors) {
+ /**
+ @module ember-data
+ */
+
+ "use strict";
+
+ exports.RootState = _emberDataPrivateSystemModelStates["default"];
+ exports.attr = _emberDataAttr["default"];
+ exports.Errors = _emberDataPrivateSystemModelErrors["default"];
+ exports["default"] = _emberDataPrivateSystemModelModel["default"];
+});
+define("ember-data/-private/system/model/attr", ["exports", "ember", "ember-data/-private/debug"], function (exports, _ember, _emberDataPrivateDebug) {
+ "use strict";
+
+ var get = _ember["default"].get;
+ var Map = _ember["default"].Map;
+
+ /**
+ @module ember-data
+ */
+
+ /**
+ @class Model
+ @namespace DS
+ */
+
+ var AttrClassMethodsMixin = _ember["default"].Mixin.create({
+ /**
+ A map whose keys are the attributes of the model (properties
+ described by DS.attr) and whose values are the meta object for the
+ property.
+ Example
+ ```app/models/person.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ firstName: attr('string'),
+ lastName: attr('string'),
+ birthday: attr('date')
+ });
+ ```
+ ```javascript
+ import Ember from 'ember';
+ import Person from 'app/models/person';
+ var attributes = Ember.get(Person, 'attributes')
+ attributes.forEach(function(meta, name) {
+ console.log(name, meta);
+ });
+ // prints:
+ // firstName {type: "string", isAttribute: true, options: Object, parentType: function, name: "firstName"}
+ // lastName {type: "string", isAttribute: true, options: Object, parentType: function, name: "lastName"}
+ // birthday {type: "date", isAttribute: true, options: Object, parentType: function, name: "birthday"}
+ ```
+ @property attributes
+ @static
+ @type {Ember.Map}
+ @readOnly
+ */
+ attributes: _ember["default"].computed(function () {
+ var _this = this;
+
+ var map = Map.create();
+
+ this.eachComputedProperty(function (name, meta) {
+ if (meta.isAttribute) {
+ (0, _emberDataPrivateDebug.assert)("You may not set `id` as an attribute on your model. Please remove any lines that look like: `id: DS.attr('')` from " + _this.toString(), name !== 'id');
+
+ meta.name = name;
+ map.set(name, meta);
+ }
+ });
+
+ return map;
+ }).readOnly(),
+
+ /**
+ A map whose keys are the attributes of the model (properties
+ described by DS.attr) and whose values are type of transformation
+ applied to each attribute. This map does not include any
+ attributes that do not have an transformation type.
+ Example
+ ```app/models/person.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ firstName: attr(),
+ lastName: attr('string'),
+ birthday: attr('date')
+ });
+ ```
+ ```javascript
+ import Ember from 'ember';
+ import Person from 'app/models/person';
+ var transformedAttributes = Ember.get(Person, 'transformedAttributes')
+ transformedAttributes.forEach(function(field, type) {
+ console.log(field, type);
+ });
+ // prints:
+ // lastName string
+ // birthday date
+ ```
+ @property transformedAttributes
+ @static
+ @type {Ember.Map}
+ @readOnly
+ */
+ transformedAttributes: _ember["default"].computed(function () {
+ var map = Map.create();
+
+ this.eachAttribute(function (key, meta) {
+ if (meta.type) {
+ map.set(key, meta.type);
+ }
+ });
+
+ return map;
+ }).readOnly(),
+
+ /**
+ Iterates through the attributes of the model, calling the passed function on each
+ attribute.
+ The callback method you provide should have the following signature (all
+ parameters are optional):
+ ```javascript
+ function(name, meta);
+ ```
+ - `name` the name of the current property in the iteration
+ - `meta` the meta object for the attribute property in the iteration
+ Note that in addition to a callback, you can also pass an optional target
+ object that will be set as `this` on the context.
+ Example
+ ```javascript
+ import DS from 'ember-data';
+ var Person = DS.Model.extend({
+ firstName: attr('string'),
+ lastName: attr('string'),
+ birthday: attr('date')
+ });
+ Person.eachAttribute(function(name, meta) {
+ console.log(name, meta);
+ });
+ // prints:
+ // firstName {type: "string", isAttribute: true, options: Object, parentType: function, name: "firstName"}
+ // lastName {type: "string", isAttribute: true, options: Object, parentType: function, name: "lastName"}
+ // birthday {type: "date", isAttribute: true, options: Object, parentType: function, name: "birthday"}
+ ```
+ @method eachAttribute
+ @param {Function} callback The callback to execute
+ @param {Object} [binding] the value to which the callback's `this` should be bound
+ @static
+ */
+ eachAttribute: function eachAttribute(callback, binding) {
+ get(this, 'attributes').forEach(function (meta, name) {
+ callback.call(binding, name, meta);
+ });
+ },
+
+ /**
+ Iterates through the transformedAttributes of the model, calling
+ the passed function on each attribute. Note the callback will not be
+ called for any attributes that do not have an transformation type.
+ The callback method you provide should have the following signature (all
+ parameters are optional):
+ ```javascript
+ function(name, type);
+ ```
+ - `name` the name of the current property in the iteration
+ - `type` a string containing the name of the type of transformed
+ applied to the attribute
+ Note that in addition to a callback, you can also pass an optional target
+ object that will be set as `this` on the context.
+ Example
+ ```javascript
+ import DS from 'ember-data';
+ var Person = DS.Model.extend({
+ firstName: attr(),
+ lastName: attr('string'),
+ birthday: attr('date')
+ });
+ Person.eachTransformedAttribute(function(name, type) {
+ console.log(name, type);
+ });
+ // prints:
+ // lastName string
+ // birthday date
+ ```
+ @method eachTransformedAttribute
+ @param {Function} callback The callback to execute
+ @param {Object} [binding] the value to which the callback's `this` should be bound
+ @static
+ */
+ eachTransformedAttribute: function eachTransformedAttribute(callback, binding) {
+ get(this, 'transformedAttributes').forEach(function (type, name) {
+ callback.call(binding, name, type);
+ });
+ }
+ });
+
+ exports.AttrClassMethodsMixin = AttrClassMethodsMixin;
+
+ var AttrInstanceMethodsMixin = _ember["default"].Mixin.create({
+ eachAttribute: function eachAttribute(callback, binding) {
+ this.constructor.eachAttribute(callback, binding);
+ }
+ });
+ exports.AttrInstanceMethodsMixin = AttrInstanceMethodsMixin;
+});
+define('ember-data/-private/system/model/errors', ['exports', 'ember', 'ember-data/-private/debug'], function (exports, _ember, _emberDataPrivateDebug) {
+ 'use strict';
+
+ var get = _ember['default'].get;
+ var set = _ember['default'].set;
+ var isEmpty = _ember['default'].isEmpty;
+ var makeArray = _ember['default'].makeArray;
+
+ var MapWithDefault = _ember['default'].MapWithDefault;
+
+ /**
+ @module ember-data
+ */
+
+ /**
+ Holds validation errors for a given record, organized by attribute names.
+
+ Every `DS.Model` has an `errors` property that is an instance of
+ `DS.Errors`. This can be used to display validation error
+ messages returned from the server when a `record.save()` rejects.
+
+ For Example, if you had a `User` model that looked like this:
+
+ ```app/models/user.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ username: attr('string'),
+ email: attr('string')
+ });
+ ```
+ And you attempted to save a record that did not validate on the backend:
+
+ ```javascript
+ var user = store.createRecord('user', {
+ username: 'tomster',
+ email: 'invalidEmail'
+ });
+ user.save();
+ ```
+
+ Your backend would be expected to return an error response that described
+ the problem, so that error messages can be generated on the app.
+
+ API responses will be translated into instances of `DS.Errors` differently,
+ depending on the specific combination of adapter and serializer used. You
+ may want to check the documentation or the source code of the libraries
+ that you are using, to know how they expect errors to be communicated.
+
+ Errors can be displayed to the user by accessing their property name
+ to get an array of all the error objects for that property. Each
+ error object is a JavaScript object with two keys:
+
+ - `message` A string containing the error message from the backend
+ - `attribute` The name of the property associated with this error message
+
+ ```handlebars
+ Username: {{input value=username}}
+ {{#each model.errors.username as |error|}}
+
+ {{error.message}}
+
+ {{/each}}
+
+ Email: {{input value=email}}
+ {{#each model.errors.email as |error|}}
+
+ {{error.message}}
+
+ {{/each}}
+ ```
+
+ You can also access the special `messages` property on the error
+ object to get an array of all the error strings.
+
+ ```handlebars
+ {{#each model.errors.messages as |message|}}
+
+ {{message}}
+
+ {{/each}}
+ ```
+
+ @class Errors
+ @namespace DS
+ @extends Ember.Object
+ @uses Ember.Enumerable
+ @uses Ember.Evented
+ */
+ exports['default'] = _ember['default'].ArrayProxy.extend(_ember['default'].Evented, {
+ /**
+ Register with target handler
+ @method registerHandlers
+ @param {Object} target
+ @param {Function} becameInvalid
+ @param {Function} becameValid
+ @deprecated
+ */
+ registerHandlers: function registerHandlers(target, becameInvalid, becameValid) {
+ (0, _emberDataPrivateDebug.deprecate)('Record errors will no longer be evented.', false, {
+ id: 'ds.errors.registerHandlers',
+ until: '3.0.0'
+ });
+
+ this._registerHandlers(target, becameInvalid, becameValid);
+ },
+
+ /**
+ Register with target handler
+ @method _registerHandlers
+ @private
+ */
+ _registerHandlers: function _registerHandlers(target, becameInvalid, becameValid) {
+ this.on('becameInvalid', target, becameInvalid);
+ this.on('becameValid', target, becameValid);
+ },
+
+ /**
+ @property errorsByAttributeName
+ @type {Ember.MapWithDefault}
+ @private
+ */
+ errorsByAttributeName: _ember['default'].computed(function () {
+ return MapWithDefault.create({
+ defaultValue: function defaultValue() {
+ return _ember['default'].A();
+ }
+ });
+ }),
+
+ /**
+ Returns errors for a given attribute
+ ```javascript
+ var user = store.createRecord('user', {
+ username: 'tomster',
+ email: 'invalidEmail'
+ });
+ user.save().catch(function(){
+ user.get('errors').errorsFor('email'); // returns:
+ // [{attribute: "email", message: "Doesn't look like a valid email."}]
+ });
+ ```
+ @method errorsFor
+ @param {String} attribute
+ @return {Array}
+ */
+ errorsFor: function errorsFor(attribute) {
+ return get(this, 'errorsByAttributeName').get(attribute);
+ },
+
+ /**
+ An array containing all of the error messages for this
+ record. This is useful for displaying all errors to the user.
+ ```handlebars
+ {{#each model.errors.messages as |message|}}
+
+ {{message}}
+
+ {{/each}}
+ ```
+ @property messages
+ @type {Array}
+ */
+ messages: _ember['default'].computed.mapBy('content', 'message'),
+
+ /**
+ @property content
+ @type {Array}
+ @private
+ */
+ content: _ember['default'].computed(function () {
+ return _ember['default'].A();
+ }),
+
+ /**
+ @method unknownProperty
+ @private
+ */
+ unknownProperty: function unknownProperty(attribute) {
+ var errors = this.errorsFor(attribute);
+ if (isEmpty(errors)) {
+ return null;
+ }
+ return errors;
+ },
+
+ /**
+ Total number of errors.
+ @property length
+ @type {Number}
+ @readOnly
+ */
+
+ /**
+ @property isEmpty
+ @type {Boolean}
+ @readOnly
+ */
+ isEmpty: _ember['default'].computed.not('length').readOnly(),
+
+ /**
+ Adds error messages to a given attribute and sends
+ `becameInvalid` event to the record.
+ Example:
+ ```javascript
+ if (!user.get('username') {
+ user.get('errors').add('username', 'This field is required');
+ }
+ ```
+ @method add
+ @param {String} attribute
+ @param {(Array|String)} messages
+ @deprecated
+ */
+ add: function add(attribute, messages) {
+ (0, _emberDataPrivateDebug.warn)('Interacting with a record errors object will no longer change the record state.', false, {
+ id: 'ds.errors.add'
+ });
+
+ var wasEmpty = get(this, 'isEmpty');
+
+ this._add(attribute, messages);
+
+ if (wasEmpty && !get(this, 'isEmpty')) {
+ this.trigger('becameInvalid');
+ }
+ },
+
+ /**
+ Adds error messages to a given attribute without sending event.
+ @method _add
+ @private
+ */
+ _add: function _add(attribute, messages) {
+ messages = this._findOrCreateMessages(attribute, messages);
+ this.addObjects(messages);
+ get(this, 'errorsByAttributeName').get(attribute).addObjects(messages);
+
+ this.notifyPropertyChange(attribute);
+ },
+
+ /**
+ @method _findOrCreateMessages
+ @private
+ */
+ _findOrCreateMessages: function _findOrCreateMessages(attribute, messages) {
+ var errors = this.errorsFor(attribute);
+ var messagesArray = makeArray(messages);
+ var _messages = new Array(messagesArray.length);
+
+ for (var i = 0; i < messagesArray.length; i++) {
+ var message = messagesArray[i];
+ var err = errors.findBy('message', message);
+ if (err) {
+ _messages[i] = err;
+ } else {
+ _messages[i] = {
+ attribute: attribute,
+ message: message
+ };
+ }
+ }
+
+ return _messages;
+ },
+
+ /**
+ Removes all error messages from the given attribute and sends
+ `becameValid` event to the record if there no more errors left.
+ Example:
+ ```app/models/user.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ email: DS.attr('string'),
+ twoFactorAuth: DS.attr('boolean'),
+ phone: DS.attr('string')
+ });
+ ```
+ ```app/routes/user/edit.js
+ import Ember from 'ember';
+ export default Ember.Route.extend({
+ actions: {
+ save: function(user) {
+ if (!user.get('twoFactorAuth')) {
+ user.get('errors').remove('phone');
+ }
+ user.save();
+ }
+ }
+ });
+ ```
+ @method remove
+ @param {String} attribute
+ @deprecated
+ */
+ remove: function remove(attribute) {
+ (0, _emberDataPrivateDebug.warn)('Interacting with a record errors object will no longer change the record state.', false, {
+ id: 'ds.errors.remove'
+ });
+
+ if (get(this, 'isEmpty')) {
+ return;
+ }
+
+ this._remove(attribute);
+
+ if (get(this, 'isEmpty')) {
+ this.trigger('becameValid');
+ }
+ },
+
+ /**
+ Removes all error messages from the given attribute without sending event.
+ @method _remove
+ @private
+ */
+ _remove: function _remove(attribute) {
+ if (get(this, 'isEmpty')) {
+ return;
+ }
+
+ var content = this.rejectBy('attribute', attribute);
+ set(this, 'content', content);
+ get(this, 'errorsByAttributeName')['delete'](attribute);
+
+ this.notifyPropertyChange(attribute);
+ },
+
+ /**
+ Removes all error messages and sends `becameValid` event
+ to the record.
+ Example:
+ ```app/routes/user/edit.js
+ import Ember from 'ember';
+ export default Ember.Route.extend({
+ actions: {
+ retrySave: function(user) {
+ user.get('errors').clear();
+ user.save();
+ }
+ }
+ });
+ ```
+ @method clear
+ @deprecated
+ */
+ clear: function clear() {
+ (0, _emberDataPrivateDebug.warn)('Interacting with a record errors object will no longer change the record state.', false, {
+ id: 'ds.errors.clear'
+ });
+
+ if (get(this, 'isEmpty')) {
+ return;
+ }
+
+ this._clear();
+ this.trigger('becameValid');
+ },
+
+ /**
+ Removes all error messages.
+ to the record.
+ @method _clear
+ @private
+ */
+ _clear: function _clear() {
+ if (get(this, 'isEmpty')) {
+ return;
+ }
+
+ var errorsByAttributeName = get(this, 'errorsByAttributeName');
+ var attributes = _ember['default'].A();
+
+ errorsByAttributeName.forEach(function (_, attribute) {
+ attributes.push(attribute);
+ });
+
+ errorsByAttributeName.clear();
+ attributes.forEach(function (attribute) {
+ this.notifyPropertyChange(attribute);
+ }, this);
+
+ _ember['default'].ArrayProxy.prototype.clear.call(this);
+ },
+
+ /**
+ Checks if there is error messages for the given attribute.
+ ```app/routes/user/edit.js
+ import Ember from 'ember';
+ export default Ember.Route.extend({
+ actions: {
+ save: function(user) {
+ if (user.get('errors').has('email')) {
+ return alert('Please update your email before attempting to save.');
+ }
+ user.save();
+ }
+ }
+ });
+ ```
+ @method has
+ @param {String} attribute
+ @return {Boolean} true if there some errors on given attribute
+ */
+ has: function has(attribute) {
+ return !isEmpty(this.errorsFor(attribute));
+ }
+ });
+});
+define("ember-data/-private/system/model/internal-model", ["exports", "ember", "ember-data/-private/debug", "ember-data/-private/system/model/states", "ember-data/-private/system/relationships/state/create", "ember-data/-private/system/snapshot", "ember-data/-private/system/empty-object", "ember-data/-private/features", "ember-data/-private/utils", "ember-data/-private/system/references"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateSystemModelStates, _emberDataPrivateSystemRelationshipsStateCreate, _emberDataPrivateSystemSnapshot, _emberDataPrivateSystemEmptyObject, _emberDataPrivateFeatures, _emberDataPrivateUtils, _emberDataPrivateSystemReferences) {
+ "use strict";
+
+ var _slicedToArray = (function () {
+ function sliceIterator(arr, i) {
+ var _arr = [];var _n = true;var _d = false;var _e = undefined;try {
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
+ _arr.push(_s.value);if (i && _arr.length === i) break;
+ }
+ } catch (err) {
+ _d = true;_e = err;
+ } finally {
+ try {
+ if (!_n && _i["return"]) _i["return"]();
+ } finally {
+ if (_d) throw _e;
+ }
+ }return _arr;
+ }return function (arr, i) {
+ if (Array.isArray(arr)) {
+ return arr;
+ } else if (Symbol.iterator in Object(arr)) {
+ return sliceIterator(arr, i);
+ } else {
+ throw new TypeError("Invalid attempt to destructure non-iterable instance");
+ }
+ };
+ })();
+
+ exports["default"] = InternalModel;
+
+ var Promise = _ember["default"].RSVP.Promise;
+ var get = _ember["default"].get;
+ var set = _ember["default"].set;
+ var copy = _ember["default"].copy;
+ var assign = _ember["default"].assign || _ember["default"].merge;
+
+ var _extractPivotNameCache = new _emberDataPrivateSystemEmptyObject["default"]();
+ var _splitOnDotCache = new _emberDataPrivateSystemEmptyObject["default"]();
+
+ function splitOnDot(name) {
+ return _splitOnDotCache[name] || (_splitOnDotCache[name] = name.split('.'));
+ }
+
+ function extractPivotName(name) {
+ return _extractPivotNameCache[name] || (_extractPivotNameCache[name] = splitOnDot(name)[0]);
+ }
+
+ function retrieveFromCurrentState(key) {
+ return function () {
+ return get(this.currentState, key);
+ };
+ }
+
+ var guid = 0;
+ /*
+ `InternalModel` is the Model class that we use internally inside Ember Data to represent models.
+ Internal ED methods should only deal with `InternalModel` objects. It is a fast, plain Javascript class.
+
+ We expose `DS.Model` to application code, by materializing a `DS.Model` from `InternalModel` lazily, as
+ a performance optimization.
+
+ `InternalModel` should never be exposed to application code. At the boundaries of the system, in places
+ like `find`, `push`, etc. we convert between Models and InternalModels.
+
+ We need to make sure that the properties from `InternalModel` are correctly exposed/proxied on `Model`
+ if they are needed.
+
+ @private
+ @class InternalModel
+ */
+ function InternalModel(type, id, store, _, data) {
+ this.type = type;
+ this.id = id;
+ this.store = store;
+ this._data = data || new _emberDataPrivateSystemEmptyObject["default"]();
+ this.modelName = type.modelName;
+ this.dataHasInitialized = false;
+ //Look into making this lazy
+ this._deferredTriggers = [];
+ this._attributes = new _emberDataPrivateSystemEmptyObject["default"]();
+ this._inFlightAttributes = new _emberDataPrivateSystemEmptyObject["default"]();
+ this._relationships = new _emberDataPrivateSystemRelationshipsStateCreate["default"](this);
+ this._recordArrays = undefined;
+ this.currentState = _emberDataPrivateSystemModelStates["default"].empty;
+ this.recordReference = new _emberDataPrivateSystemReferences.RecordReference(store, this);
+ this.references = {};
+ this.isReloading = false;
+ this.isError = false;
+ this.error = null;
+ this.__ember_meta__ = null;
+ this[_ember["default"].GUID_KEY] = guid++ + 'internal-model';
+ /*
+ implicit relationships are relationship which have not been declared but the inverse side exists on
+ another record somewhere
+ For example if there was
+ ```app/models/comment.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ name: DS.attr()
+ })
+ ```
+ but there is also
+ ```app/models/post.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ name: DS.attr(),
+ comments: DS.hasMany('comment')
+ })
+ ```
+ would have a implicit post relationship in order to be do things like remove ourselves from the post
+ when we are deleted
+ */
+ this._implicitRelationships = new _emberDataPrivateSystemEmptyObject["default"]();
+ }
+
+ InternalModel.prototype = {
+ isEmpty: retrieveFromCurrentState('isEmpty'),
+ isLoading: retrieveFromCurrentState('isLoading'),
+ isLoaded: retrieveFromCurrentState('isLoaded'),
+ hasDirtyAttributes: retrieveFromCurrentState('hasDirtyAttributes'),
+ isSaving: retrieveFromCurrentState('isSaving'),
+ isDeleted: retrieveFromCurrentState('isDeleted'),
+ isNew: retrieveFromCurrentState('isNew'),
+ isValid: retrieveFromCurrentState('isValid'),
+ dirtyType: retrieveFromCurrentState('dirtyType'),
+
+ constructor: InternalModel,
+ materializeRecord: function materializeRecord() {
+ (0, _emberDataPrivateDebug.assert)("Materialized " + this.modelName + " record with id:" + this.id + "more than once", this.record === null || this.record === undefined);
+
+ // lookupFactory should really return an object that creates
+ // instances with the injections applied
+ var createOptions = {
+ store: this.store,
+ _internalModel: this,
+ id: this.id,
+ currentState: get(this, 'currentState'),
+ isError: this.isError,
+ adapterError: this.error
+ };
+
+ if (_ember["default"].setOwner) {
+ // ensure that `Ember.getOwner(this)` works inside a model instance
+ _ember["default"].setOwner(createOptions, (0, _emberDataPrivateUtils.getOwner)(this.store));
+ } else {
+ createOptions.container = this.store.container;
+ }
+
+ this.record = this.type._create(createOptions);
+
+ this._triggerDeferredTriggers();
+ },
+
+ recordObjectWillDestroy: function recordObjectWillDestroy() {
+ this.record = null;
+ },
+
+ deleteRecord: function deleteRecord() {
+ this.send('deleteRecord');
+ },
+
+ save: function save(options) {
+ var promiseLabel = "DS: Model#save " + this;
+ var resolver = _ember["default"].RSVP.defer(promiseLabel);
+
+ this.store.scheduleSave(this, resolver, options);
+ return resolver.promise;
+ },
+
+ startedReloading: function startedReloading() {
+ this.isReloading = true;
+ if (this.record) {
+ set(this.record, 'isReloading', true);
+ }
+ },
+
+ finishedReloading: function finishedReloading() {
+ this.isReloading = false;
+ if (this.record) {
+ set(this.record, 'isReloading', false);
+ }
+ },
+
+ reload: function reload() {
+ this.startedReloading();
+ var record = this;
+ var promiseLabel = "DS: Model#reload of " + this;
+ return new Promise(function (resolve) {
+ record.send('reloadRecord', resolve);
+ }, promiseLabel).then(function () {
+ record.didCleanError();
+ return record;
+ }, function (error) {
+ record.didError(error);
+ throw error;
+ }, "DS: Model#reload complete, update flags")["finally"](function () {
+ record.finishedReloading();
+ record.updateRecordArrays();
+ });
+ },
+
+ getRecord: function getRecord() {
+ if (!this.record) {
+ this.materializeRecord();
+ }
+ return this.record;
+ },
+
+ unloadRecord: function unloadRecord() {
+ this.send('unloadRecord');
+ },
+
+ eachRelationship: function eachRelationship(callback, binding) {
+ return this.type.eachRelationship(callback, binding);
+ },
+
+ eachAttribute: function eachAttribute(callback, binding) {
+ return this.type.eachAttribute(callback, binding);
+ },
+
+ inverseFor: function inverseFor(key) {
+ return this.type.inverseFor(key);
+ },
+
+ setupData: function setupData(data) {
+ var changedKeys = this._changedKeys(data.attributes);
+ assign(this._data, data.attributes);
+ this.pushedData();
+ if (this.record) {
+ this.record._notifyProperties(changedKeys);
+ }
+ this.didInitalizeData();
+ },
+
+ becameReady: function becameReady() {
+ _ember["default"].run.schedule('actions', this.store.recordArrayManager, this.store.recordArrayManager.recordWasLoaded, this);
+ },
+
+ didInitalizeData: function didInitalizeData() {
+ if (!this.dataHasInitialized) {
+ this.becameReady();
+ this.dataHasInitialized = true;
+ }
+ },
+
+ destroy: function destroy() {
+ if (this.record) {
+ return this.record.destroy();
+ }
+ },
+
+ /*
+ @method createSnapshot
+ @private
+ */
+ createSnapshot: function createSnapshot(options) {
+ return new _emberDataPrivateSystemSnapshot["default"](this, options);
+ },
+
+ /*
+ @method loadingData
+ @private
+ @param {Promise} promise
+ */
+ loadingData: function loadingData(promise) {
+ this.send('loadingData', promise);
+ },
+
+ /*
+ @method loadedData
+ @private
+ */
+ loadedData: function loadedData() {
+ this.send('loadedData');
+ this.didInitalizeData();
+ },
+
+ /*
+ @method notFound
+ @private
+ */
+ notFound: function notFound() {
+ this.send('notFound');
+ },
+
+ /*
+ @method pushedData
+ @private
+ */
+ pushedData: function pushedData() {
+ this.send('pushedData');
+ },
+
+ flushChangedAttributes: function flushChangedAttributes() {
+ this._inFlightAttributes = this._attributes;
+ this._attributes = new _emberDataPrivateSystemEmptyObject["default"]();
+ },
+
+ hasChangedAttributes: function hasChangedAttributes() {
+ return Object.keys(this._attributes).length > 0;
+ },
+
+ /*
+ Checks if the attributes which are considered as changed are still
+ different to the state which is acknowledged by the server.
+ This method is needed when data for the internal model is pushed and the
+ pushed data might acknowledge dirty attributes as confirmed.
+ @method updateChangedAttributes
+ @private
+ */
+ updateChangedAttributes: function updateChangedAttributes() {
+ var changedAttributes = this.changedAttributes();
+ var changedAttributeNames = Object.keys(changedAttributes);
+
+ for (var i = 0, _length = changedAttributeNames.length; i < _length; i++) {
+ var attribute = changedAttributeNames[i];
+
+ var _changedAttributes$attribute = _slicedToArray(changedAttributes[attribute], 2);
+
+ var oldData = _changedAttributes$attribute[0];
+ var newData = _changedAttributes$attribute[1];
+
+ if (oldData === newData) {
+ delete this._attributes[attribute];
+ }
+ }
+ },
+
+ /*
+ Returns an object, whose keys are changed properties, and value is an
+ [oldProp, newProp] array.
+ @method changedAttributes
+ @private
+ */
+ changedAttributes: function changedAttributes() {
+ var oldData = this._data;
+ var currentData = this._attributes;
+ var inFlightData = this._inFlightAttributes;
+ var newData = assign(copy(inFlightData), currentData);
+ var diffData = new _emberDataPrivateSystemEmptyObject["default"]();
+
+ var newDataKeys = Object.keys(newData);
+
+ for (var i = 0, _length2 = newDataKeys.length; i < _length2; i++) {
+ var key = newDataKeys[i];
+ diffData[key] = [oldData[key], newData[key]];
+ }
+
+ return diffData;
+ },
+
+ /*
+ @method adapterWillCommit
+ @private
+ */
+ adapterWillCommit: function adapterWillCommit() {
+ this.send('willCommit');
+ },
+
+ /*
+ @method adapterDidDirty
+ @private
+ */
+ adapterDidDirty: function adapterDidDirty() {
+ this.send('becomeDirty');
+ this.updateRecordArraysLater();
+ },
+
+ /*
+ @method send
+ @private
+ @param {String} name
+ @param {Object} context
+ */
+ send: function send(name, context) {
+ var currentState = get(this, 'currentState');
+
+ if (!currentState[name]) {
+ this._unhandledEvent(currentState, name, context);
+ }
+
+ return currentState[name](this, context);
+ },
+
+ notifyHasManyAdded: function notifyHasManyAdded(key, record, idx) {
+ if (this.record) {
+ this.record.notifyHasManyAdded(key, record, idx);
+ }
+ },
+
+ notifyHasManyRemoved: function notifyHasManyRemoved(key, record, idx) {
+ if (this.record) {
+ this.record.notifyHasManyRemoved(key, record, idx);
+ }
+ },
+
+ notifyBelongsToChanged: function notifyBelongsToChanged(key, record) {
+ if (this.record) {
+ this.record.notifyBelongsToChanged(key, record);
+ }
+ },
+
+ notifyPropertyChange: function notifyPropertyChange(key) {
+ if (this.record) {
+ this.record.notifyPropertyChange(key);
+ }
+ },
+
+ rollbackAttributes: function rollbackAttributes() {
+ var dirtyKeys = Object.keys(this._attributes);
+
+ this._attributes = new _emberDataPrivateSystemEmptyObject["default"]();
+
+ if (get(this, 'isError')) {
+ this._inFlightAttributes = new _emberDataPrivateSystemEmptyObject["default"]();
+ this.didCleanError();
+ }
+
+ //Eventually rollback will always work for relationships
+ //For now we support it only out of deleted state, because we
+ //have an explicit way of knowing when the server acked the relationship change
+ if (this.isDeleted()) {
+ //TODO: Should probably move this to the state machine somehow
+ this.becameReady();
+ }
+
+ if (this.isNew()) {
+ this.clearRelationships();
+ }
+
+ if (this.isValid()) {
+ this._inFlightAttributes = new _emberDataPrivateSystemEmptyObject["default"]();
+ }
+
+ this.send('rolledBack');
+
+ this.record._notifyProperties(dirtyKeys);
+ },
+
+ /*
+ @method transitionTo
+ @private
+ @param {String} name
+ */
+ transitionTo: function transitionTo(name) {
+ // POSSIBLE TODO: Remove this code and replace with
+ // always having direct reference to state objects
+
+ var pivotName = extractPivotName(name);
+ var currentState = get(this, 'currentState');
+ var state = currentState;
+
+ do {
+ if (state.exit) {
+ state.exit(this);
+ }
+ state = state.parentState;
+ } while (!state.hasOwnProperty(pivotName));
+
+ var path = splitOnDot(name);
+ var setups = [];
+ var enters = [];
+ var i, l;
+
+ for (i = 0, l = path.length; i < l; i++) {
+ state = state[path[i]];
+
+ if (state.enter) {
+ enters.push(state);
+ }
+ if (state.setup) {
+ setups.push(state);
+ }
+ }
+
+ for (i = 0, l = enters.length; i < l; i++) {
+ enters[i].enter(this);
+ }
+
+ set(this, 'currentState', state);
+ //TODO Consider whether this is the best approach for keeping these two in sync
+ if (this.record) {
+ set(this.record, 'currentState', state);
+ }
+
+ for (i = 0, l = setups.length; i < l; i++) {
+ setups[i].setup(this);
+ }
+
+ this.updateRecordArraysLater();
+ },
+
+ _unhandledEvent: function _unhandledEvent(state, name, context) {
+ var errorMessage = "Attempted to handle event `" + name + "` ";
+ errorMessage += "on " + String(this) + " while in state ";
+ errorMessage += state.stateName + ". ";
+
+ if (context !== undefined) {
+ errorMessage += "Called with " + _ember["default"].inspect(context) + ".";
+ }
+
+ throw new _ember["default"].Error(errorMessage);
+ },
+
+ triggerLater: function triggerLater() {
+ var length = arguments.length;
+ var args = new Array(length);
+
+ for (var i = 0; i < length; i++) {
+ args[i] = arguments[i];
+ }
+
+ if (this._deferredTriggers.push(args) !== 1) {
+ return;
+ }
+ _ember["default"].run.scheduleOnce('actions', this, '_triggerDeferredTriggers');
+ },
+
+ _triggerDeferredTriggers: function _triggerDeferredTriggers() {
+ //TODO: Before 1.0 we want to remove all the events that happen on the pre materialized record,
+ //but for now, we queue up all the events triggered before the record was materialized, and flush
+ //them once we have the record
+ if (!this.record) {
+ return;
+ }
+ for (var i = 0, l = this._deferredTriggers.length; i < l; i++) {
+ this.record.trigger.apply(this.record, this._deferredTriggers[i]);
+ }
+
+ this._deferredTriggers.length = 0;
+ },
+ /*
+ @method clearRelationships
+ @private
+ */
+ clearRelationships: function clearRelationships() {
+ var _this = this;
+
+ this.eachRelationship(function (name, relationship) {
+ if (_this._relationships.has(name)) {
+ var rel = _this._relationships.get(name);
+ rel.clear();
+ rel.destroy();
+ }
+ });
+ Object.keys(this._implicitRelationships).forEach(function (key) {
+ _this._implicitRelationships[key].clear();
+ _this._implicitRelationships[key].destroy();
+ });
+ },
+
+ /*
+ When a find request is triggered on the store, the user can optionally pass in
+ attributes and relationships to be preloaded. These are meant to behave as if they
+ came back from the server, except the user obtained them out of band and is informing
+ the store of their existence. The most common use case is for supporting client side
+ nested URLs, such as `/posts/1/comments/2` so the user can do
+ `store.findRecord('comment', 2, { preload: { post: 1 } })` without having to fetch the post.
+ Preloaded data can be attributes and relationships passed in either as IDs or as actual
+ models.
+ @method _preloadData
+ @private
+ @param {Object} preload
+ */
+ _preloadData: function _preloadData(preload) {
+ var _this2 = this;
+
+ //TODO(Igor) consider the polymorphic case
+ Object.keys(preload).forEach(function (key) {
+ var preloadValue = get(preload, key);
+ var relationshipMeta = _this2.type.metaForProperty(key);
+ if (relationshipMeta.isRelationship) {
+ _this2._preloadRelationship(key, preloadValue);
+ } else {
+ _this2._data[key] = preloadValue;
+ }
+ });
+ },
+
+ _preloadRelationship: function _preloadRelationship(key, preloadValue) {
+ var relationshipMeta = this.type.metaForProperty(key);
+ var type = relationshipMeta.type;
+ if (relationshipMeta.kind === 'hasMany') {
+ this._preloadHasMany(key, preloadValue, type);
+ } else {
+ this._preloadBelongsTo(key, preloadValue, type);
+ }
+ },
+
+ _preloadHasMany: function _preloadHasMany(key, preloadValue, type) {
+ (0, _emberDataPrivateDebug.assert)("You need to pass in an array to set a hasMany property on a record", Array.isArray(preloadValue));
+ var recordsToSet = new Array(preloadValue.length);
+
+ for (var i = 0; i < preloadValue.length; i++) {
+ var recordToPush = preloadValue[i];
+ recordsToSet[i] = this._convertStringOrNumberIntoInternalModel(recordToPush, type);
+ }
+
+ //We use the pathway of setting the hasMany as if it came from the adapter
+ //because the user told us that they know this relationships exists already
+ this._relationships.get(key).updateRecordsFromAdapter(recordsToSet);
+ },
+
+ _preloadBelongsTo: function _preloadBelongsTo(key, preloadValue, type) {
+ var recordToSet = this._convertStringOrNumberIntoInternalModel(preloadValue, type);
+
+ //We use the pathway of setting the hasMany as if it came from the adapter
+ //because the user told us that they know this relationships exists already
+ this._relationships.get(key).setRecord(recordToSet);
+ },
+
+ _convertStringOrNumberIntoInternalModel: function _convertStringOrNumberIntoInternalModel(value, type) {
+ if (typeof value === 'string' || typeof value === 'number') {
+ return this.store._internalModelForId(type, value);
+ }
+ if (value._internalModel) {
+ return value._internalModel;
+ }
+ return value;
+ },
+
+ /*
+ @method updateRecordArrays
+ @private
+ */
+ updateRecordArrays: function updateRecordArrays() {
+ this._updatingRecordArraysLater = false;
+ this.store.dataWasUpdated(this.type, this);
+ },
+
+ setId: function setId(id) {
+ (0, _emberDataPrivateDebug.assert)('A record\'s id cannot be changed once it is in the loaded state', this.id === null || this.id === id || this.isNew());
+ this.id = id;
+ if (this.record.get('id') !== id) {
+ this.record.set('id', id);
+ }
+ },
+
+ didError: function didError(error) {
+ this.error = error;
+ this.isError = true;
+
+ if (this.record) {
+ this.record.setProperties({
+ isError: true,
+ adapterError: error
+ });
+ }
+ },
+
+ didCleanError: function didCleanError() {
+ this.error = null;
+ this.isError = false;
+
+ if (this.record) {
+ this.record.setProperties({
+ isError: false,
+ adapterError: null
+ });
+ }
+ },
+ /*
+ If the adapter did not return a hash in response to a commit,
+ merge the changed attributes and relationships into the existing
+ saved data.
+ @method adapterDidCommit
+ */
+ adapterDidCommit: function adapterDidCommit(data) {
+ if (data) {
+ data = data.attributes;
+ }
+
+ this.didCleanError();
+ var changedKeys = this._changedKeys(data);
+
+ assign(this._data, this._inFlightAttributes);
+ if (data) {
+ assign(this._data, data);
+ }
+
+ this._inFlightAttributes = new _emberDataPrivateSystemEmptyObject["default"]();
+
+ this.send('didCommit');
+ this.updateRecordArraysLater();
+
+ if (!data) {
+ return;
+ }
+
+ this.record._notifyProperties(changedKeys);
+ },
+
+ /*
+ @method updateRecordArraysLater
+ @private
+ */
+ updateRecordArraysLater: function updateRecordArraysLater() {
+ // quick hack (something like this could be pushed into run.once
+ if (this._updatingRecordArraysLater) {
+ return;
+ }
+ this._updatingRecordArraysLater = true;
+ _ember["default"].run.schedule('actions', this, this.updateRecordArrays);
+ },
+
+ addErrorMessageToAttribute: function addErrorMessageToAttribute(attribute, message) {
+ var record = this.getRecord();
+ get(record, 'errors')._add(attribute, message);
+ },
+
+ removeErrorMessageFromAttribute: function removeErrorMessageFromAttribute(attribute) {
+ var record = this.getRecord();
+ get(record, 'errors')._remove(attribute);
+ },
+
+ clearErrorMessages: function clearErrorMessages() {
+ var record = this.getRecord();
+ get(record, 'errors')._clear();
+ },
+
+ hasErrors: function hasErrors() {
+ var record = this.getRecord();
+ var errors = get(record, 'errors');
+
+ return !_ember["default"].isEmpty(errors);
+ },
+
+ // FOR USE DURING COMMIT PROCESS
+
+ /*
+ @method adapterDidInvalidate
+ @private
+ */
+ adapterDidInvalidate: function adapterDidInvalidate(errors) {
+ var attribute;
+
+ for (attribute in errors) {
+ if (errors.hasOwnProperty(attribute)) {
+ this.addErrorMessageToAttribute(attribute, errors[attribute]);
+ }
+ }
+
+ this.send('becameInvalid');
+
+ this._saveWasRejected();
+ },
+
+ /*
+ @method adapterDidError
+ @private
+ */
+ adapterDidError: function adapterDidError(error) {
+ this.send('becameError');
+ this.didError(error);
+ this._saveWasRejected();
+ },
+
+ _saveWasRejected: function _saveWasRejected() {
+ var keys = Object.keys(this._inFlightAttributes);
+ for (var i = 0; i < keys.length; i++) {
+ if (this._attributes[keys[i]] === undefined) {
+ this._attributes[keys[i]] = this._inFlightAttributes[keys[i]];
+ }
+ }
+ this._inFlightAttributes = new _emberDataPrivateSystemEmptyObject["default"]();
+ },
+
+ /*
+ Ember Data has 3 buckets for storing the value of an attribute on an internalModel.
+ `_data` holds all of the attributes that have been acknowledged by
+ a backend via the adapter. When rollbackAttributes is called on a model all
+ attributes will revert to the record's state in `_data`.
+ `_attributes` holds any change the user has made to an attribute
+ that has not been acknowledged by the adapter. Any values in
+ `_attributes` are have priority over values in `_data`.
+ `_inFlightAttributes`. When a record is being synced with the
+ backend the values in `_attributes` are copied to
+ `_inFlightAttributes`. This way if the backend acknowledges the
+ save but does not return the new state Ember Data can copy the
+ values from `_inFlightAttributes` to `_data`. Without having to
+ worry about changes made to `_attributes` while the save was
+ happenign.
+ Changed keys builds a list of all of the values that may have been
+ changed by the backend after a successful save.
+ It does this by iterating over each key, value pair in the payload
+ returned from the server after a save. If the `key` is found in
+ `_attributes` then the user has a local changed to the attribute
+ that has not been synced with the server and the key is not
+ included in the list of changed keys.
+
+ If the value, for a key differs from the value in what Ember Data
+ believes to be the truth about the backend state (A merger of the
+ `_data` and `_inFlightAttributes` objects where
+ `_inFlightAttributes` has priority) then that means the backend
+ has updated the value and the key is added to the list of changed
+ keys.
+ @method _changedKeys
+ @private
+ */
+ _changedKeys: function _changedKeys(updates) {
+ var changedKeys = [];
+
+ if (updates) {
+ var original, i, value, key;
+ var keys = Object.keys(updates);
+ var length = keys.length;
+
+ original = assign(new _emberDataPrivateSystemEmptyObject["default"](), this._data);
+ original = assign(original, this._inFlightAttributes);
+
+ for (i = 0; i < length; i++) {
+ key = keys[i];
+ value = updates[key];
+
+ // A value in _attributes means the user has a local change to
+ // this attributes. We never override this value when merging
+ // updates from the backend so we should not sent a change
+ // notification if the server value differs from the original.
+ if (this._attributes[key] !== undefined) {
+ continue;
+ }
+
+ if (!_ember["default"].isEqual(original[key], value)) {
+ changedKeys.push(key);
+ }
+ }
+ }
+
+ return changedKeys;
+ },
+
+ toString: function toString() {
+ if (this.record) {
+ return this.record.toString();
+ } else {
+ return "<" + this.modelName + ":" + this.id + ">";
+ }
+ },
+
+ referenceFor: function referenceFor(type, name) {
+ var reference = this.references[name];
+
+ if (!reference) {
+ var relationship = this._relationships.get(name);
+
+ if (type === "belongsTo") {
+ reference = new _emberDataPrivateSystemReferences.BelongsToReference(this.store, this, relationship);
+ } else if (type === "hasMany") {
+ reference = new _emberDataPrivateSystemReferences.HasManyReference(this.store, this, relationship);
+ }
+
+ this.references[name] = reference;
+ }
+
+ return reference;
+ }
+ };
+
+ if (false) {
+ /*
+ Returns the latest truth for an attribute - the canonical value, or the
+ in-flight value.
+ @method lastAcknowledgedValue
+ @private
+ */
+ InternalModel.prototype.lastAcknowledgedValue = function lastAcknowledgedValue(key) {
+ if (key in this._inFlightAttributes) {
+ return this._inFlightAttributes[key];
+ } else {
+ return this._data[key];
+ }
+ };
+ }
+});
+define("ember-data/-private/system/model/model", ["exports", "ember", "ember-data/-private/debug", "ember-data/-private/system/promise-proxies", "ember-data/-private/system/model/errors", "ember-data/-private/system/debug/debug-info", "ember-data/-private/system/relationships/belongs-to", "ember-data/-private/system/relationships/has-many", "ember-data/-private/system/relationships/ext", "ember-data/-private/system/model/attr", "ember-data/-private/features"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateSystemPromiseProxies, _emberDataPrivateSystemModelErrors, _emberDataPrivateSystemDebugDebugInfo, _emberDataPrivateSystemRelationshipsBelongsTo, _emberDataPrivateSystemRelationshipsHasMany, _emberDataPrivateSystemRelationshipsExt, _emberDataPrivateSystemModelAttr, _emberDataPrivateFeatures) {
+ "use strict";
+
+ /**
+ @module ember-data
+ */
+
+ var get = _ember["default"].get;
+
+ function intersection(array1, array2) {
+ var result = [];
+ array1.forEach(function (element) {
+ if (array2.indexOf(element) >= 0) {
+ result.push(element);
+ }
+ });
+
+ return result;
+ }
+
+ var RESERVED_MODEL_PROPS = ['currentState', 'data', 'store'];
+
+ var retrieveFromCurrentState = _ember["default"].computed('currentState', function (key) {
+ return get(this._internalModel.currentState, key);
+ }).readOnly();
+
+ /**
+
+ The model class that all Ember Data records descend from.
+ This is the public API of Ember Data models. If you are using Ember Data
+ in your application, this is the class you should use.
+ If you are working on Ember Data internals, you most likely want to be dealing
+ with `InternalModel`
+
+ @class Model
+ @namespace DS
+ @extends Ember.Object
+ @uses Ember.Evented
+ */
+ var Model = _ember["default"].Object.extend(_ember["default"].Evented, {
+ _internalModel: null,
+ store: null,
+
+ /**
+ If this property is `true` the record is in the `empty`
+ state. Empty is the first state all records enter after they have
+ been created. Most records created by the store will quickly
+ transition to the `loading` state if data needs to be fetched from
+ the server or the `created` state if the record is created on the
+ client. A record can also enter the empty state if the adapter is
+ unable to locate the record.
+ @property isEmpty
+ @type {Boolean}
+ @readOnly
+ */
+ isEmpty: retrieveFromCurrentState,
+ /**
+ If this property is `true` the record is in the `loading` state. A
+ record enters this state when the store asks the adapter for its
+ data. It remains in this state until the adapter provides the
+ requested data.
+ @property isLoading
+ @type {Boolean}
+ @readOnly
+ */
+ isLoading: retrieveFromCurrentState,
+ /**
+ If this property is `true` the record is in the `loaded` state. A
+ record enters this state when its data is populated. Most of a
+ record's lifecycle is spent inside substates of the `loaded`
+ state.
+ Example
+ ```javascript
+ var record = store.createRecord('model');
+ record.get('isLoaded'); // true
+ store.findRecord('model', 1).then(function(model) {
+ model.get('isLoaded'); // true
+ });
+ ```
+ @property isLoaded
+ @type {Boolean}
+ @readOnly
+ */
+ isLoaded: retrieveFromCurrentState,
+ /**
+ If this property is `true` the record is in the `dirty` state. The
+ record has local changes that have not yet been saved by the
+ adapter. This includes records that have been created (but not yet
+ saved) or deleted.
+ Example
+ ```javascript
+ var record = store.createRecord('model');
+ record.get('hasDirtyAttributes'); // true
+ store.findRecord('model', 1).then(function(model) {
+ model.get('hasDirtyAttributes'); // false
+ model.set('foo', 'some value');
+ model.get('hasDirtyAttributes'); // true
+ });
+ ```
+ @since 1.13.0
+ @property hasDirtyAttributes
+ @type {Boolean}
+ @readOnly
+ */
+ hasDirtyAttributes: _ember["default"].computed('currentState.isDirty', function () {
+ return this.get('currentState.isDirty');
+ }),
+ /**
+ If this property is `true` the record is in the `saving` state. A
+ record enters the saving state when `save` is called, but the
+ adapter has not yet acknowledged that the changes have been
+ persisted to the backend.
+ Example
+ ```javascript
+ var record = store.createRecord('model');
+ record.get('isSaving'); // false
+ var promise = record.save();
+ record.get('isSaving'); // true
+ promise.then(function() {
+ record.get('isSaving'); // false
+ });
+ ```
+ @property isSaving
+ @type {Boolean}
+ @readOnly
+ */
+ isSaving: retrieveFromCurrentState,
+ /**
+ If this property is `true` the record is in the `deleted` state
+ and has been marked for deletion. When `isDeleted` is true and
+ `hasDirtyAttributes` is true, the record is deleted locally but the deletion
+ was not yet persisted. When `isSaving` is true, the change is
+ in-flight. When both `hasDirtyAttributes` and `isSaving` are false, the
+ change has persisted.
+ Example
+ ```javascript
+ var record = store.createRecord('model');
+ record.get('isDeleted'); // false
+ record.deleteRecord();
+ // Locally deleted
+ record.get('isDeleted'); // true
+ record.get('hasDirtyAttributes'); // true
+ record.get('isSaving'); // false
+ // Persisting the deletion
+ var promise = record.save();
+ record.get('isDeleted'); // true
+ record.get('isSaving'); // true
+ // Deletion Persisted
+ promise.then(function() {
+ record.get('isDeleted'); // true
+ record.get('isSaving'); // false
+ record.get('hasDirtyAttributes'); // false
+ });
+ ```
+ @property isDeleted
+ @type {Boolean}
+ @readOnly
+ */
+ isDeleted: retrieveFromCurrentState,
+ /**
+ If this property is `true` the record is in the `new` state. A
+ record will be in the `new` state when it has been created on the
+ client and the adapter has not yet report that it was successfully
+ saved.
+ Example
+ ```javascript
+ var record = store.createRecord('model');
+ record.get('isNew'); // true
+ record.save().then(function(model) {
+ model.get('isNew'); // false
+ });
+ ```
+ @property isNew
+ @type {Boolean}
+ @readOnly
+ */
+ isNew: retrieveFromCurrentState,
+ /**
+ If this property is `true` the record is in the `valid` state.
+ A record will be in the `valid` state when the adapter did not report any
+ server-side validation failures.
+ @property isValid
+ @type {Boolean}
+ @readOnly
+ */
+ isValid: retrieveFromCurrentState,
+ /**
+ If the record is in the dirty state this property will report what
+ kind of change has caused it to move into the dirty
+ state. Possible values are:
+ - `created` The record has been created by the client and not yet saved to the adapter.
+ - `updated` The record has been updated by the client and not yet saved to the adapter.
+ - `deleted` The record has been deleted by the client and not yet saved to the adapter.
+ Example
+ ```javascript
+ var record = store.createRecord('model');
+ record.get('dirtyType'); // 'created'
+ ```
+ @property dirtyType
+ @type {String}
+ @readOnly
+ */
+ dirtyType: retrieveFromCurrentState,
+
+ /**
+ If `true` the adapter reported that it was unable to save local
+ changes to the backend for any reason other than a server-side
+ validation error.
+ Example
+ ```javascript
+ record.get('isError'); // false
+ record.set('foo', 'valid value');
+ record.save().then(null, function() {
+ record.get('isError'); // true
+ });
+ ```
+ @property isError
+ @type {Boolean}
+ @readOnly
+ */
+ isError: false,
+
+ /**
+ If `true` the store is attempting to reload the record form the adapter.
+ Example
+ ```javascript
+ record.get('isReloading'); // false
+ record.reload();
+ record.get('isReloading'); // true
+ ```
+ @property isReloading
+ @type {Boolean}
+ @readOnly
+ */
+ isReloading: false,
+
+ /**
+ All ember models have an id property. This is an identifier
+ managed by an external source. These are always coerced to be
+ strings before being used internally. Note when declaring the
+ attributes for a model it is an error to declare an id
+ attribute.
+ ```javascript
+ var record = store.createRecord('model');
+ record.get('id'); // null
+ store.findRecord('model', 1).then(function(model) {
+ model.get('id'); // '1'
+ });
+ ```
+ @property id
+ @type {String}
+ */
+ id: null,
+
+ /**
+ @property currentState
+ @private
+ @type {Object}
+ */
+
+ /**
+ When the record is in the `invalid` state this object will contain
+ any errors returned by the adapter. When present the errors hash
+ contains keys corresponding to the invalid property names
+ and values which are arrays of Javascript objects with two keys:
+ - `message` A string containing the error message from the backend
+ - `attribute` The name of the property associated with this error message
+ ```javascript
+ record.get('errors.length'); // 0
+ record.set('foo', 'invalid value');
+ record.save().catch(function() {
+ record.get('errors').get('foo');
+ // [{message: 'foo should be a number.', attribute: 'foo'}]
+ });
+ ```
+ The `errors` property us useful for displaying error messages to
+ the user.
+ ```handlebars
+ Username: {{input value=username}}
+ {{#each model.errors.username as |error|}}
+
+ {{error.message}}
+
+ {{/each}}
+ Email: {{input value=email}}
+ {{#each model.errors.email as |error|}}
+
+ {{error.message}}
+
+ {{/each}}
+ ```
+ You can also access the special `messages` property on the error
+ object to get an array of all the error strings.
+ ```handlebars
+ {{#each model.errors.messages as |message|}}
+
+ {{message}}
+
+ {{/each}}
+ ```
+ @property errors
+ @type {DS.Errors}
+ */
+ errors: _ember["default"].computed(function () {
+ var errors = _emberDataPrivateSystemModelErrors["default"].create();
+
+ errors._registerHandlers(this._internalModel, function () {
+ this.send('becameInvalid');
+ }, function () {
+ this.send('becameValid');
+ });
+ return errors;
+ }).readOnly(),
+
+ /**
+ This property holds the `DS.AdapterError` object with which
+ last adapter operation was rejected.
+ @property adapterError
+ @type {DS.AdapterError}
+ */
+ adapterError: null,
+
+ /**
+ Create a JSON representation of the record, using the serialization
+ strategy of the store's adapter.
+ `serialize` takes an optional hash as a parameter, currently
+ supported options are:
+ - `includeId`: `true` if the record's ID should be included in the
+ JSON representation.
+ @method serialize
+ @param {Object} options
+ @return {Object} an object whose values are primitive JSON values only
+ */
+ serialize: function serialize(options) {
+ return this.store.serialize(this, options);
+ },
+
+ /**
+ Use [DS.JSONSerializer](DS.JSONSerializer.html) to
+ get the JSON representation of a record.
+ `toJSON` takes an optional hash as a parameter, currently
+ supported options are:
+ - `includeId`: `true` if the record's ID should be included in the
+ JSON representation.
+ @method toJSON
+ @param {Object} options
+ @return {Object} A JSON representation of the object.
+ */
+ toJSON: function toJSON(options) {
+ // container is for lazy transform lookups
+ var serializer = this.store.serializerFor('-default');
+ var snapshot = this._internalModel.createSnapshot();
+
+ return serializer.serialize(snapshot, options);
+ },
+
+ /**
+ Fired when the record is ready to be interacted with,
+ that is either loaded from the server or created locally.
+ @event ready
+ */
+ ready: _ember["default"].K,
+
+ /**
+ Fired when the record is loaded from the server.
+ @event didLoad
+ */
+ didLoad: _ember["default"].K,
+
+ /**
+ Fired when the record is updated.
+ @event didUpdate
+ */
+ didUpdate: _ember["default"].K,
+
+ /**
+ Fired when a new record is commited to the server.
+ @event didCreate
+ */
+ didCreate: _ember["default"].K,
+
+ /**
+ Fired when the record is deleted.
+ @event didDelete
+ */
+ didDelete: _ember["default"].K,
+
+ /**
+ Fired when the record becomes invalid.
+ @event becameInvalid
+ */
+ becameInvalid: _ember["default"].K,
+
+ /**
+ Fired when the record enters the error state.
+ @event becameError
+ */
+ becameError: _ember["default"].K,
+
+ /**
+ Fired when the record is rolled back.
+ @event rolledBack
+ */
+ rolledBack: _ember["default"].K,
+
+ //TODO Do we want to deprecate these?
+ /**
+ @method send
+ @private
+ @param {String} name
+ @param {Object} context
+ */
+ send: function send(name, context) {
+ return this._internalModel.send(name, context);
+ },
+
+ /**
+ @method transitionTo
+ @private
+ @param {String} name
+ */
+ transitionTo: function transitionTo(name) {
+ return this._internalModel.transitionTo(name);
+ },
+
+ /**
+ Marks the record as deleted but does not save it. You must call
+ `save` afterwards if you want to persist it. You might use this
+ method if you want to allow the user to still `rollbackAttributes()`
+ after a delete it was made.
+ Example
+ ```app/routes/model/delete.js
+ import Ember from 'ember';
+ export default Ember.Route.extend({
+ actions: {
+ softDelete: function() {
+ this.controller.get('model').deleteRecord();
+ },
+ confirm: function() {
+ this.controller.get('model').save();
+ },
+ undo: function() {
+ this.controller.get('model').rollbackAttributes();
+ }
+ }
+ });
+ ```
+ @method deleteRecord
+ */
+ deleteRecord: function deleteRecord() {
+ this._internalModel.deleteRecord();
+ },
+
+ /**
+ Same as `deleteRecord`, but saves the record immediately.
+ Example
+ ```app/routes/model/delete.js
+ import Ember from 'ember';
+ export default Ember.Route.extend({
+ actions: {
+ delete: function() {
+ var controller = this.controller;
+ controller.get('model').destroyRecord().then(function() {
+ controller.transitionToRoute('model.index');
+ });
+ }
+ }
+ });
+ ```
+ If you pass an object on the `adapterOptions` property of the options
+ argument it will be passed to you adapter via the snapshot
+ ```js
+ record.destroyRecord({ adapterOptions: { subscribe: false } });
+ ```
+ ```app/adapters/post.js
+ import MyCustomAdapter from './custom-adapter';
+ export default MyCustomAdapter.extend({
+ deleteRecord: function(store, type, snapshot) {
+ if (snapshot.adapterOptions.subscribe) {
+ // ...
+ }
+ // ...
+ }
+ });
+ ```
+ @method destroyRecord
+ @param {Object} options
+ @return {Promise} a promise that will be resolved when the adapter returns
+ successfully or rejected if the adapter returns with an error.
+ */
+ destroyRecord: function destroyRecord(options) {
+ this.deleteRecord();
+ return this.save(options);
+ },
+
+ /**
+ @method unloadRecord
+ @private
+ */
+ unloadRecord: function unloadRecord() {
+ if (this.isDestroyed) {
+ return;
+ }
+ this._internalModel.unloadRecord();
+ },
+
+ /**
+ @method _notifyProperties
+ @private
+ */
+ _notifyProperties: function _notifyProperties(keys) {
+ _ember["default"].beginPropertyChanges();
+ var key;
+ for (var i = 0, length = keys.length; i < length; i++) {
+ key = keys[i];
+ this.notifyPropertyChange(key);
+ }
+ _ember["default"].endPropertyChanges();
+ },
+
+ /**
+ Returns an object, whose keys are changed properties, and value is
+ an [oldProp, newProp] array.
+ The array represents the diff of the canonical state with the local state
+ of the model. Note: if the model is created locally, the canonical state is
+ empty since the adapter hasn't acknowledged the attributes yet:
+ Example
+ ```app/models/mascot.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ name: attr('string'),
+ isAdmin: attr('boolean', {
+ defaultValue: false
+ })
+ });
+ ```
+ ```javascript
+ var mascot = store.createRecord('mascot');
+ mascot.changedAttributes(); // {}
+ mascot.set('name', 'Tomster');
+ mascot.changedAttributes(); // { name: [undefined, 'Tomster'] }
+ mascot.set('isAdmin', true);
+ mascot.changedAttributes(); // { isAdmin: [undefined, true], name: [undefined, 'Tomster'] }
+ mascot.save().then(function() {
+ mascot.changedAttributes(); // {}
+ mascot.set('isAdmin', false);
+ mascot.changedAttributes(); // { isAdmin: [true, false] }
+ });
+ ```
+ @method changedAttributes
+ @return {Object} an object, whose keys are changed properties,
+ and value is an [oldProp, newProp] array.
+ */
+ changedAttributes: function changedAttributes() {
+ return this._internalModel.changedAttributes();
+ },
+
+ //TODO discuss with tomhuda about events/hooks
+ //Bring back as hooks?
+ /**
+ @method adapterWillCommit
+ @private
+ adapterWillCommit: function() {
+ this.send('willCommit');
+ },
+ /**
+ @method adapterDidDirty
+ @private
+ adapterDidDirty: function() {
+ this.send('becomeDirty');
+ this.updateRecordArraysLater();
+ },
+ */
+
+ /**
+ If the model `hasDirtyAttributes` this function will discard any unsaved
+ changes. If the model `isNew` it will be removed from the store.
+ Example
+ ```javascript
+ record.get('name'); // 'Untitled Document'
+ record.set('name', 'Doc 1');
+ record.get('name'); // 'Doc 1'
+ record.rollbackAttributes();
+ record.get('name'); // 'Untitled Document'
+ ```
+ @since 1.13.0
+ @method rollbackAttributes
+ */
+ rollbackAttributes: function rollbackAttributes() {
+ this._internalModel.rollbackAttributes();
+ },
+
+ /*
+ @method _createSnapshot
+ @private
+ */
+ _createSnapshot: function _createSnapshot() {
+ return this._internalModel.createSnapshot();
+ },
+
+ toStringExtension: function toStringExtension() {
+ return get(this, 'id');
+ },
+
+ /**
+ Save the record and persist any changes to the record to an
+ external source via the adapter.
+ Example
+ ```javascript
+ record.set('name', 'Tomster');
+ record.save().then(function() {
+ // Success callback
+ }, function() {
+ // Error callback
+ });
+ ```
+ If you pass an object on the `adapterOptions` property of the options
+ argument it will be passed to you adapter via the snapshot
+ ```js
+ record.save({ adapterOptions: { subscribe: false } });
+ ```
+ ```app/adapters/post.js
+ import MyCustomAdapter from './custom-adapter';
+ export default MyCustomAdapter.extend({
+ updateRecord: function(store, type, snapshot) {
+ if (snapshot.adapterOptions.subscribe) {
+ // ...
+ }
+ // ...
+ }
+ });
+ ```
+ @method save
+ @param {Object} options
+ @return {Promise} a promise that will be resolved when the adapter returns
+ successfully or rejected if the adapter returns with an error.
+ */
+ save: function save(options) {
+ var _this = this;
+
+ return _emberDataPrivateSystemPromiseProxies.PromiseObject.create({
+ promise: this._internalModel.save(options).then(function () {
+ return _this;
+ })
+ });
+ },
+
+ /**
+ Reload the record from the adapter.
+ This will only work if the record has already finished loading.
+ Example
+ ```app/routes/model/view.js
+ import Ember from 'ember';
+ export default Ember.Route.extend({
+ actions: {
+ reload: function() {
+ this.controller.get('model').reload().then(function(model) {
+ // do something with the reloaded model
+ });
+ }
+ }
+ });
+ ```
+ @method reload
+ @return {Promise} a promise that will be resolved with the record when the
+ adapter returns successfully or rejected if the adapter returns
+ with an error.
+ */
+ reload: function reload() {
+ var _this2 = this;
+
+ return _emberDataPrivateSystemPromiseProxies.PromiseObject.create({
+ promise: this._internalModel.reload().then(function () {
+ return _this2;
+ })
+ });
+ },
+
+ /**
+ Override the default event firing from Ember.Evented to
+ also call methods with the given name.
+ @method trigger
+ @private
+ @param {String} name
+ */
+ trigger: function trigger(name) {
+ var length = arguments.length;
+ var args = new Array(length - 1);
+
+ for (var i = 1; i < length; i++) {
+ args[i - 1] = arguments[i];
+ }
+
+ _ember["default"].tryInvoke(this, name, args);
+ this._super.apply(this, arguments);
+ },
+
+ willDestroy: function willDestroy() {
+ //TODO Move!
+ this._super.apply(this, arguments);
+ this._internalModel.clearRelationships();
+ this._internalModel.recordObjectWillDestroy();
+ //TODO should we set internalModel to null here?
+ },
+
+ // This is a temporary solution until we refactor DS.Model to not
+ // rely on the data property.
+ willMergeMixin: function willMergeMixin(props) {
+ var constructor = this.constructor;
+ (0, _emberDataPrivateDebug.assert)('`' + intersection(Object.keys(props), RESERVED_MODEL_PROPS)[0] + '` is a reserved property name on DS.Model objects. Please choose a different property name for ' + constructor.toString(), !intersection(Object.keys(props), RESERVED_MODEL_PROPS)[0]);
+ (0, _emberDataPrivateDebug.assert)("You may not set `id` as an attribute on your model. Please remove any lines that look like: `id: DS.attr('')` from " + constructor.toString(), Object.keys(props).indexOf('id') === -1);
+ },
+
+ attr: function attr() {
+ (0, _emberDataPrivateDebug.assert)("The `attr` method is not available on DS.Model, a DS.Snapshot was probably expected. Are you passing a DS.Model instead of a DS.Snapshot to your serializer?", false);
+ },
+
+ /**
+ Get the reference for the specified belongsTo relationship.
+ Example
+ ```javascript
+ // models/blog.js
+ export default DS.Model.extend({
+ user: DS.belongsTo({ async: true })
+ });
+ var blog = store.push({
+ type: 'blog',
+ id: 1,
+ relationships: {
+ user: { type: 'user', id: 1 }
+ }
+ });
+ var userRef = blog.belongsTo('user');
+ // check if the user relationship is loaded
+ var isLoaded = userRef.value() !== null;
+ // get the record of the reference (null if not yet available)
+ var user = userRef.value();
+ // get the identifier of the reference
+ if (userRef.remoteType() === "id") {
+ var id = userRef.id();
+ } else if (userRef.remoteType() === "link") {
+ var link = userRef.link();
+ }
+ // load user (via store.findRecord or store.findBelongsTo)
+ userRef.load().then(...)
+ // or trigger a reload
+ userRef.reload().then(...)
+ // provide data for reference
+ userRef.push({
+ type: 'user',
+ id: 1,
+ attributes: {
+ username: "@user"
+ }
+ }).then(function(user) {
+ userRef.value() === user;
+ });
+ ```
+ @method belongsTo
+ @param {String} name of the relationship
+ @since 2.5.0
+ @return {BelongsToReference} reference for this relationship
+ */
+ belongsTo: function belongsTo(name) {
+ return this._internalModel.referenceFor('belongsTo', name);
+ },
+
+ /**
+ Get the reference for the specified hasMany relationship.
+ Example
+ ```javascript
+ // models/blog.js
+ export default DS.Model.extend({
+ comments: DS.hasMany({ async: true })
+ });
+ var blog = store.push({
+ type: 'blog',
+ id: 1,
+ relationships: {
+ comments: {
+ data: [
+ { type: 'comment', id: 1 },
+ { type: 'comment', id: 2 }
+ ]
+ }
+ }
+ });
+ var commentsRef = blog.hasMany('comments');
+ // check if the comments are loaded already
+ var isLoaded = commentsRef.value() !== null;
+ // get the records of the reference (null if not yet available)
+ var comments = commentsRef.value();
+ // get the identifier of the reference
+ if (commentsRef.remoteType() === "ids") {
+ var ids = commentsRef.ids();
+ } else if (commentsRef.remoteType() === "link") {
+ var link = commentsRef.link();
+ }
+ // load comments (via store.findMany or store.findHasMany)
+ commentsRef.load().then(...)
+ // or trigger a reload
+ commentsRef.reload().then(...)
+ // provide data for reference
+ commentsRef.push([{ type: 'comment', id: 1 }, { type: 'comment', id: 2 }]).then(function(comments) {
+ commentsRef.value() === comments;
+ });
+ ```
+ @method hasMany
+ @param {String} name of the relationship
+ @since 2.5.0
+ @return {HasManyReference} reference for this relationship
+ */
+ hasMany: function hasMany(name) {
+ return this._internalModel.referenceFor('hasMany', name);
+ },
+
+ setId: _ember["default"].observer('id', function () {
+ this._internalModel.setId(this.get('id'));
+ })
+ });
+
+ /**
+ @property data
+ @private
+ @type {Object}
+ */
+ Object.defineProperty(Model.prototype, 'data', {
+ get: function get() {
+ return this._internalModel._data;
+ }
+ });
+
+ Model.reopenClass({
+ /**
+ Alias DS.Model's `create` method to `_create`. This allows us to create DS.Model
+ instances from within the store, but if end users accidentally call `create()`
+ (instead of `createRecord()`), we can raise an error.
+ @method _create
+ @private
+ @static
+ */
+ _create: Model.create,
+
+ /**
+ Override the class' `create()` method to raise an error. This
+ prevents end users from inadvertently calling `create()` instead
+ of `createRecord()`. The store is still able to create instances
+ by calling the `_create()` method. To create an instance of a
+ `DS.Model` use [store.createRecord](DS.Store.html#method_createRecord).
+ @method create
+ @private
+ @static
+ */
+ create: function create() {
+ throw new _ember["default"].Error("You should not call `create` on a model. Instead, call `store.createRecord` with the attributes you would like to set.");
+ },
+
+ /**
+ Represents the model's class name as a string. This can be used to look up the model through
+ DS.Store's modelFor method.
+ `modelName` is generated for you by Ember Data. It will be a lowercased, dasherized string.
+ For example:
+ ```javascript
+ store.modelFor('post').modelName; // 'post'
+ store.modelFor('blog-post').modelName; // 'blog-post'
+ ```
+ The most common place you'll want to access `modelName` is in your serializer's `payloadKeyFromModelName` method. For example, to change payload
+ keys to underscore (instead of dasherized), you might use the following code:
+ ```javascript
+ export default var PostSerializer = DS.RESTSerializer.extend({
+ payloadKeyFromModelName: function(modelName) {
+ return Ember.String.underscore(modelName);
+ }
+ });
+ ```
+ @property modelName
+ @type String
+ @readonly
+ */
+ modelName: null
+ });
+
+ // if `Ember.setOwner` is defined, accessing `this.container` is
+ // deprecated (but functional). In "standard" Ember usage, this
+ // deprecation is actually created via an `.extend` of the factory
+ // inside the container itself, but that only happens on models
+ // with MODEL_FACTORY_INJECTIONS enabled :(
+ if (_ember["default"].setOwner) {
+ Object.defineProperty(Model.prototype, 'container', {
+ configurable: true,
+ enumerable: false,
+ get: function get() {
+ (0, _emberDataPrivateDebug.deprecate)('Using the injected `container` is deprecated. Please use the `getOwner` helper instead to access the owner of this object.', false, { id: 'ember-application.injected-container', until: '3.0.0' });
+
+ return this.store.container;
+ }
+ });
+ }
+
+ if (false) {
+ Model.reopen({
+ /**
+ Discards any unsaved changes to the given attribute.
+ Example
+ ```javascript
+ record.get('name'); // 'Untitled Document'
+ record.set('name', 'Doc 1');
+ record.get('name'); // 'Doc 1'
+ record.resetAttribute('name');
+ record.get('name'); // 'Untitled Document'
+ ```
+ @method resetAttribute
+ */
+ resetAttribute: function resetAttribute(attributeName) {
+ if (attributeName in this._internalModel._attributes) {
+ this.set(attributeName, this._internalModel.lastAcknowledgedValue(attributeName));
+ }
+ }
+ });
+ }
+
+ Model.reopenClass(_emberDataPrivateSystemRelationshipsExt.RelationshipsClassMethodsMixin);
+ Model.reopenClass(_emberDataPrivateSystemModelAttr.AttrClassMethodsMixin);
+
+ exports["default"] = Model.extend(_emberDataPrivateSystemDebugDebugInfo["default"], _emberDataPrivateSystemRelationshipsBelongsTo.BelongsToMixin, _emberDataPrivateSystemRelationshipsExt.DidDefinePropertyMixin, _emberDataPrivateSystemRelationshipsExt.RelationshipsInstanceMethodsMixin, _emberDataPrivateSystemRelationshipsHasMany.HasManyMixin, _emberDataPrivateSystemModelAttr.AttrInstanceMethodsMixin);
+});
+define('ember-data/-private/system/model/states', ['exports', 'ember', 'ember-data/-private/debug'], function (exports, _ember, _emberDataPrivateDebug) {
+ /**
+ @module ember-data
+ */
+ 'use strict';
+
+ var get = _ember['default'].get;
+ /*
+ This file encapsulates the various states that a record can transition
+ through during its lifecycle.
+ */
+ /**
+ ### State
+
+ Each record has a `currentState` property that explicitly tracks what
+ state a record is in at any given time. For instance, if a record is
+ newly created and has not yet been sent to the adapter to be saved,
+ it would be in the `root.loaded.created.uncommitted` state. If a
+ record has had local modifications made to it that are in the
+ process of being saved, the record would be in the
+ `root.loaded.updated.inFlight` state. (This state paths will be
+ explained in more detail below.)
+
+ Events are sent by the record or its store to the record's
+ `currentState` property. How the state reacts to these events is
+ dependent on which state it is in. In some states, certain events
+ will be invalid and will cause an exception to be raised.
+
+ States are hierarchical and every state is a substate of the
+ `RootState`. For example, a record can be in the
+ `root.deleted.uncommitted` state, then transition into the
+ `root.deleted.inFlight` state. If a child state does not implement
+ an event handler, the state manager will attempt to invoke the event
+ on all parent states until the root state is reached. The state
+ hierarchy of a record is described in terms of a path string. You
+ can determine a record's current state by getting the state's
+ `stateName` property:
+
+ ```javascript
+ record.get('currentState.stateName');
+ //=> "root.created.uncommitted"
+ ```
+
+ The hierarchy of valid states that ship with ember data looks like
+ this:
+
+ ```text
+ * root
+ * deleted
+ * saved
+ * uncommitted
+ * inFlight
+ * empty
+ * loaded
+ * created
+ * uncommitted
+ * inFlight
+ * saved
+ * updated
+ * uncommitted
+ * inFlight
+ * loading
+ ```
+
+ The `DS.Model` states are themselves stateless. What that means is
+ that, the hierarchical states that each of *those* points to is a
+ shared data structure. For performance reasons, instead of each
+ record getting its own copy of the hierarchy of states, each record
+ points to this global, immutable shared instance. How does a state
+ know which record it should be acting on? We pass the record
+ instance into the state's event handlers as the first argument.
+
+ The record passed as the first parameter is where you should stash
+ state about the record if needed; you should never store data on the state
+ object itself.
+
+ ### Events and Flags
+
+ A state may implement zero or more events and flags.
+
+ #### Events
+
+ Events are named functions that are invoked when sent to a record. The
+ record will first look for a method with the given name on the
+ current state. If no method is found, it will search the current
+ state's parent, and then its grandparent, and so on until reaching
+ the top of the hierarchy. If the root is reached without an event
+ handler being found, an exception will be raised. This can be very
+ helpful when debugging new features.
+
+ Here's an example implementation of a state with a `myEvent` event handler:
+
+ ```javascript
+ aState: DS.State.create({
+ myEvent: function(manager, param) {
+ console.log("Received myEvent with", param);
+ }
+ })
+ ```
+
+ To trigger this event:
+
+ ```javascript
+ record.send('myEvent', 'foo');
+ //=> "Received myEvent with foo"
+ ```
+
+ Note that an optional parameter can be sent to a record's `send()` method,
+ which will be passed as the second parameter to the event handler.
+
+ Events should transition to a different state if appropriate. This can be
+ done by calling the record's `transitionTo()` method with a path to the
+ desired state. The state manager will attempt to resolve the state path
+ relative to the current state. If no state is found at that path, it will
+ attempt to resolve it relative to the current state's parent, and then its
+ parent, and so on until the root is reached. For example, imagine a hierarchy
+ like this:
+
+ * created
+ * uncommitted <-- currentState
+ * inFlight
+ * updated
+ * inFlight
+
+ If we are currently in the `uncommitted` state, calling
+ `transitionTo('inFlight')` would transition to the `created.inFlight` state,
+ while calling `transitionTo('updated.inFlight')` would transition to
+ the `updated.inFlight` state.
+
+ Remember that *only events* should ever cause a state transition. You should
+ never call `transitionTo()` from outside a state's event handler. If you are
+ tempted to do so, create a new event and send that to the state manager.
+
+ #### Flags
+
+ Flags are Boolean values that can be used to introspect a record's current
+ state in a more user-friendly way than examining its state path. For example,
+ instead of doing this:
+
+ ```javascript
+ var statePath = record.get('stateManager.currentPath');
+ if (statePath === 'created.inFlight') {
+ doSomething();
+ }
+ ```
+
+ You can say:
+
+ ```javascript
+ if (record.get('isNew') && record.get('isSaving')) {
+ doSomething();
+ }
+ ```
+
+ If your state does not set a value for a given flag, the value will
+ be inherited from its parent (or the first place in the state hierarchy
+ where it is defined).
+
+ The current set of flags are defined below. If you want to add a new flag,
+ in addition to the area below, you will also need to declare it in the
+ `DS.Model` class.
+
+
+ * [isEmpty](DS.Model.html#property_isEmpty)
+ * [isLoading](DS.Model.html#property_isLoading)
+ * [isLoaded](DS.Model.html#property_isLoaded)
+ * [isDirty](DS.Model.html#property_isDirty)
+ * [isSaving](DS.Model.html#property_isSaving)
+ * [isDeleted](DS.Model.html#property_isDeleted)
+ * [isNew](DS.Model.html#property_isNew)
+ * [isValid](DS.Model.html#property_isValid)
+
+ @namespace DS
+ @class RootState
+ */
+
+ function _didSetProperty(internalModel, context) {
+ if (context.value === context.originalValue) {
+ delete internalModel._attributes[context.name];
+ internalModel.send('propertyWasReset', context.name);
+ } else if (context.value !== context.oldValue) {
+ internalModel.send('becomeDirty');
+ }
+
+ internalModel.updateRecordArraysLater();
+ }
+
+ // Implementation notes:
+ //
+ // Each state has a boolean value for all of the following flags:
+ //
+ // * isLoaded: The record has a populated `data` property. When a
+ // record is loaded via `store.find`, `isLoaded` is false
+ // until the adapter sets it. When a record is created locally,
+ // its `isLoaded` property is always true.
+ // * isDirty: The record has local changes that have not yet been
+ // saved by the adapter. This includes records that have been
+ // created (but not yet saved) or deleted.
+ // * isSaving: The record has been committed, but
+ // the adapter has not yet acknowledged that the changes have
+ // been persisted to the backend.
+ // * isDeleted: The record was marked for deletion. When `isDeleted`
+ // is true and `isDirty` is true, the record is deleted locally
+ // but the deletion was not yet persisted. When `isSaving` is
+ // true, the change is in-flight. When both `isDirty` and
+ // `isSaving` are false, the change has persisted.
+ // * isNew: The record was created on the client and the adapter
+ // did not yet report that it was successfully saved.
+ // * isValid: The adapter did not report any server-side validation
+ // failures.
+
+ // The dirty state is a abstract state whose functionality is
+ // shared between the `created` and `updated` states.
+ //
+ // The deleted state shares the `isDirty` flag with the
+ // subclasses of `DirtyState`, but with a very different
+ // implementation.
+ //
+ // Dirty states have three child states:
+ //
+ // `uncommitted`: the store has not yet handed off the record
+ // to be saved.
+ // `inFlight`: the store has handed off the record to be saved,
+ // but the adapter has not yet acknowledged success.
+ // `invalid`: the record has invalid information and cannot be
+ // sent to the adapter yet.
+ var DirtyState = {
+ initialState: 'uncommitted',
+
+ // FLAGS
+ isDirty: true,
+
+ // SUBSTATES
+
+ // When a record first becomes dirty, it is `uncommitted`.
+ // This means that there are local pending changes, but they
+ // have not yet begun to be saved, and are not invalid.
+ uncommitted: {
+ // EVENTS
+ didSetProperty: _didSetProperty,
+
+ //TODO(Igor) reloading now triggers a
+ //loadingData event, though it seems fine?
+ loadingData: _ember['default'].K,
+
+ propertyWasReset: function propertyWasReset(internalModel, name) {
+ if (!internalModel.hasChangedAttributes()) {
+ internalModel.send('rolledBack');
+ }
+ },
+
+ pushedData: function pushedData(internalModel) {
+ internalModel.updateChangedAttributes();
+
+ if (!internalModel.hasChangedAttributes()) {
+ internalModel.transitionTo('loaded.saved');
+ }
+ },
+
+ becomeDirty: _ember['default'].K,
+
+ willCommit: function willCommit(internalModel) {
+ internalModel.transitionTo('inFlight');
+ },
+
+ reloadRecord: function reloadRecord(internalModel, resolve) {
+ resolve(internalModel.store.reloadRecord(internalModel));
+ },
+
+ rolledBack: function rolledBack(internalModel) {
+ internalModel.transitionTo('loaded.saved');
+ },
+
+ becameInvalid: function becameInvalid(internalModel) {
+ internalModel.transitionTo('invalid');
+ },
+
+ rollback: function rollback(internalModel) {
+ internalModel.rollbackAttributes();
+ internalModel.triggerLater('ready');
+ }
+ },
+
+ // Once a record has been handed off to the adapter to be
+ // saved, it is in the 'in flight' state. Changes to the
+ // record cannot be made during this window.
+ inFlight: {
+ // FLAGS
+ isSaving: true,
+
+ // EVENTS
+ didSetProperty: _didSetProperty,
+ becomeDirty: _ember['default'].K,
+ pushedData: _ember['default'].K,
+
+ unloadRecord: assertAgainstUnloadRecord,
+
+ // TODO: More robust semantics around save-while-in-flight
+ willCommit: _ember['default'].K,
+
+ didCommit: function didCommit(internalModel) {
+ var dirtyType = get(this, 'dirtyType');
+
+ internalModel.transitionTo('saved');
+ internalModel.send('invokeLifecycleCallbacks', dirtyType);
+ },
+
+ becameInvalid: function becameInvalid(internalModel) {
+ internalModel.transitionTo('invalid');
+ internalModel.send('invokeLifecycleCallbacks');
+ },
+
+ becameError: function becameError(internalModel) {
+ internalModel.transitionTo('uncommitted');
+ internalModel.triggerLater('becameError', internalModel);
+ }
+ },
+
+ // A record is in the `invalid` if the adapter has indicated
+ // the the record failed server-side invalidations.
+ invalid: {
+ // FLAGS
+ isValid: false,
+
+ // EVENTS
+ deleteRecord: function deleteRecord(internalModel) {
+ internalModel.transitionTo('deleted.uncommitted');
+ },
+
+ didSetProperty: function didSetProperty(internalModel, context) {
+ internalModel.removeErrorMessageFromAttribute(context.name);
+
+ _didSetProperty(internalModel, context);
+
+ if (!internalModel.hasErrors()) {
+ this.becameValid(internalModel);
+ }
+ },
+
+ becameInvalid: _ember['default'].K,
+ becomeDirty: _ember['default'].K,
+ pushedData: _ember['default'].K,
+
+ willCommit: function willCommit(internalModel) {
+ internalModel.clearErrorMessages();
+ internalModel.transitionTo('inFlight');
+ },
+
+ rolledBack: function rolledBack(internalModel) {
+ internalModel.clearErrorMessages();
+ internalModel.transitionTo('loaded.saved');
+ internalModel.triggerLater('ready');
+ },
+
+ becameValid: function becameValid(internalModel) {
+ internalModel.transitionTo('uncommitted');
+ },
+
+ invokeLifecycleCallbacks: function invokeLifecycleCallbacks(internalModel) {
+ internalModel.triggerLater('becameInvalid', internalModel);
+ }
+ }
+ };
+
+ // The created and updated states are created outside the state
+ // chart so we can reopen their substates and add mixins as
+ // necessary.
+
+ function deepClone(object) {
+ var clone = {};
+ var value;
+
+ for (var prop in object) {
+ value = object[prop];
+ if (value && typeof value === 'object') {
+ clone[prop] = deepClone(value);
+ } else {
+ clone[prop] = value;
+ }
+ }
+
+ return clone;
+ }
+
+ function mixin(original, hash) {
+ for (var prop in hash) {
+ original[prop] = hash[prop];
+ }
+
+ return original;
+ }
+
+ function dirtyState(options) {
+ var newState = deepClone(DirtyState);
+ return mixin(newState, options);
+ }
+
+ var createdState = dirtyState({
+ dirtyType: 'created',
+ // FLAGS
+ isNew: true
+ });
+
+ createdState.invalid.rolledBack = function (internalModel) {
+ internalModel.transitionTo('deleted.saved');
+ };
+ createdState.uncommitted.rolledBack = function (internalModel) {
+ internalModel.transitionTo('deleted.saved');
+ };
+
+ var updatedState = dirtyState({
+ dirtyType: 'updated'
+ });
+
+ function createdStateDeleteRecord(internalModel) {
+ internalModel.transitionTo('deleted.saved');
+ internalModel.send('invokeLifecycleCallbacks');
+ }
+
+ createdState.uncommitted.deleteRecord = createdStateDeleteRecord;
+
+ createdState.invalid.deleteRecord = createdStateDeleteRecord;
+
+ createdState.uncommitted.rollback = function (internalModel) {
+ DirtyState.uncommitted.rollback.apply(this, arguments);
+ internalModel.transitionTo('deleted.saved');
+ };
+
+ createdState.uncommitted.pushedData = function (internalModel) {
+ internalModel.transitionTo('loaded.updated.uncommitted');
+ internalModel.triggerLater('didLoad');
+ };
+
+ createdState.uncommitted.propertyWasReset = _ember['default'].K;
+
+ function assertAgainstUnloadRecord(internalModel) {
+ (0, _emberDataPrivateDebug.assert)("You can only unload a record which is not inFlight. `" + internalModel + "`", false);
+ }
+
+ updatedState.inFlight.unloadRecord = assertAgainstUnloadRecord;
+
+ updatedState.uncommitted.deleteRecord = function (internalModel) {
+ internalModel.transitionTo('deleted.uncommitted');
+ };
+
+ var RootState = {
+ // FLAGS
+ isEmpty: false,
+ isLoading: false,
+ isLoaded: false,
+ isDirty: false,
+ isSaving: false,
+ isDeleted: false,
+ isNew: false,
+ isValid: true,
+
+ // DEFAULT EVENTS
+
+ // Trying to roll back if you're not in the dirty state
+ // doesn't change your state. For example, if you're in the
+ // in-flight state, rolling back the record doesn't move
+ // you out of the in-flight state.
+ rolledBack: _ember['default'].K,
+ unloadRecord: function unloadRecord(internalModel) {
+ // clear relationships before moving to deleted state
+ // otherwise it fails
+ internalModel.clearRelationships();
+ internalModel.transitionTo('deleted.saved');
+ },
+
+ propertyWasReset: _ember['default'].K,
+
+ // SUBSTATES
+
+ // A record begins its lifecycle in the `empty` state.
+ // If its data will come from the adapter, it will
+ // transition into the `loading` state. Otherwise, if
+ // the record is being created on the client, it will
+ // transition into the `created` state.
+ empty: {
+ isEmpty: true,
+
+ // EVENTS
+ loadingData: function loadingData(internalModel, promise) {
+ internalModel._loadingPromise = promise;
+ internalModel.transitionTo('loading');
+ },
+
+ loadedData: function loadedData(internalModel) {
+ internalModel.transitionTo('loaded.created.uncommitted');
+ internalModel.triggerLater('ready');
+ },
+
+ pushedData: function pushedData(internalModel) {
+ internalModel.transitionTo('loaded.saved');
+ internalModel.triggerLater('didLoad');
+ internalModel.triggerLater('ready');
+ }
+ },
+
+ // A record enters this state when the store asks
+ // the adapter for its data. It remains in this state
+ // until the adapter provides the requested data.
+ //
+ // Usually, this process is asynchronous, using an
+ // XHR to retrieve the data.
+ loading: {
+ // FLAGS
+ isLoading: true,
+
+ exit: function exit(internalModel) {
+ internalModel._loadingPromise = null;
+ },
+
+ // EVENTS
+ pushedData: function pushedData(internalModel) {
+ internalModel.transitionTo('loaded.saved');
+ internalModel.triggerLater('didLoad');
+ internalModel.triggerLater('ready');
+ //TODO this seems out of place here
+ internalModel.didCleanError();
+ },
+
+ becameError: function becameError(internalModel) {
+ internalModel.triggerLater('becameError', internalModel);
+ },
+
+ notFound: function notFound(internalModel) {
+ internalModel.transitionTo('empty');
+ }
+ },
+
+ // A record enters this state when its data is populated.
+ // Most of a record's lifecycle is spent inside substates
+ // of the `loaded` state.
+ loaded: {
+ initialState: 'saved',
+
+ // FLAGS
+ isLoaded: true,
+
+ //TODO(Igor) Reloading now triggers a loadingData event,
+ //but it should be ok?
+ loadingData: _ember['default'].K,
+
+ // SUBSTATES
+
+ // If there are no local changes to a record, it remains
+ // in the `saved` state.
+ saved: {
+ setup: function setup(internalModel) {
+ if (internalModel.hasChangedAttributes()) {
+ internalModel.adapterDidDirty();
+ }
+ },
+
+ // EVENTS
+ didSetProperty: _didSetProperty,
+
+ pushedData: _ember['default'].K,
+
+ becomeDirty: function becomeDirty(internalModel) {
+ internalModel.transitionTo('updated.uncommitted');
+ },
+
+ willCommit: function willCommit(internalModel) {
+ internalModel.transitionTo('updated.inFlight');
+ },
+
+ reloadRecord: function reloadRecord(internalModel, resolve) {
+ resolve(internalModel.store.reloadRecord(internalModel));
+ },
+
+ deleteRecord: function deleteRecord(internalModel) {
+ internalModel.transitionTo('deleted.uncommitted');
+ },
+
+ unloadRecord: function unloadRecord(internalModel) {
+ // clear relationships before moving to deleted state
+ // otherwise it fails
+ internalModel.clearRelationships();
+ internalModel.transitionTo('deleted.saved');
+ },
+
+ didCommit: function didCommit(internalModel) {
+ internalModel.send('invokeLifecycleCallbacks', get(internalModel, 'lastDirtyType'));
+ },
+
+ // loaded.saved.notFound would be triggered by a failed
+ // `reload()` on an unchanged record
+ notFound: _ember['default'].K
+
+ },
+
+ // A record is in this state after it has been locally
+ // created but before the adapter has indicated that
+ // it has been saved.
+ created: createdState,
+
+ // A record is in this state if it has already been
+ // saved to the server, but there are new local changes
+ // that have not yet been saved.
+ updated: updatedState
+ },
+
+ // A record is in this state if it was deleted from the store.
+ deleted: {
+ initialState: 'uncommitted',
+ dirtyType: 'deleted',
+
+ // FLAGS
+ isDeleted: true,
+ isLoaded: true,
+ isDirty: true,
+
+ // TRANSITIONS
+ setup: function setup(internalModel) {
+ internalModel.updateRecordArrays();
+ },
+
+ // SUBSTATES
+
+ // When a record is deleted, it enters the `start`
+ // state. It will exit this state when the record
+ // starts to commit.
+ uncommitted: {
+
+ // EVENTS
+
+ willCommit: function willCommit(internalModel) {
+ internalModel.transitionTo('inFlight');
+ },
+
+ rollback: function rollback(internalModel) {
+ internalModel.rollbackAttributes();
+ internalModel.triggerLater('ready');
+ },
+
+ pushedData: _ember['default'].K,
+ becomeDirty: _ember['default'].K,
+ deleteRecord: _ember['default'].K,
+
+ rolledBack: function rolledBack(internalModel) {
+ internalModel.transitionTo('loaded.saved');
+ internalModel.triggerLater('ready');
+ }
+ },
+
+ // After a record starts committing, but
+ // before the adapter indicates that the deletion
+ // has saved to the server, a record is in the
+ // `inFlight` substate of `deleted`.
+ inFlight: {
+ // FLAGS
+ isSaving: true,
+
+ // EVENTS
+
+ unloadRecord: assertAgainstUnloadRecord,
+
+ // TODO: More robust semantics around save-while-in-flight
+ willCommit: _ember['default'].K,
+ didCommit: function didCommit(internalModel) {
+ internalModel.transitionTo('saved');
+
+ internalModel.send('invokeLifecycleCallbacks');
+ },
+
+ becameError: function becameError(internalModel) {
+ internalModel.transitionTo('uncommitted');
+ internalModel.triggerLater('becameError', internalModel);
+ },
+
+ becameInvalid: function becameInvalid(internalModel) {
+ internalModel.transitionTo('invalid');
+ internalModel.triggerLater('becameInvalid', internalModel);
+ }
+ },
+
+ // Once the adapter indicates that the deletion has
+ // been saved, the record enters the `saved` substate
+ // of `deleted`.
+ saved: {
+ // FLAGS
+ isDirty: false,
+
+ setup: function setup(internalModel) {
+ internalModel.clearRelationships();
+ var store = internalModel.store;
+ store._dematerializeRecord(internalModel);
+ },
+
+ invokeLifecycleCallbacks: function invokeLifecycleCallbacks(internalModel) {
+ internalModel.triggerLater('didDelete', internalModel);
+ internalModel.triggerLater('didCommit', internalModel);
+ },
+
+ willCommit: _ember['default'].K,
+
+ didCommit: _ember['default'].K
+ },
+
+ invalid: {
+ isValid: false,
+
+ didSetProperty: function didSetProperty(internalModel, context) {
+ internalModel.removeErrorMessageFromAttribute(context.name);
+
+ _didSetProperty(internalModel, context);
+
+ if (!internalModel.hasErrors()) {
+ this.becameValid(internalModel);
+ }
+ },
+
+ becameInvalid: _ember['default'].K,
+ becomeDirty: _ember['default'].K,
+ deleteRecord: _ember['default'].K,
+ willCommit: _ember['default'].K,
+
+ rolledBack: function rolledBack(internalModel) {
+ internalModel.clearErrorMessages();
+ internalModel.transitionTo('loaded.saved');
+ internalModel.triggerLater('ready');
+ },
+
+ becameValid: function becameValid(internalModel) {
+ internalModel.transitionTo('uncommitted');
+ }
+
+ }
+ },
+
+ invokeLifecycleCallbacks: function invokeLifecycleCallbacks(internalModel, dirtyType) {
+ if (dirtyType === 'created') {
+ internalModel.triggerLater('didCreate', internalModel);
+ } else {
+ internalModel.triggerLater('didUpdate', internalModel);
+ }
+
+ internalModel.triggerLater('didCommit', internalModel);
+ }
+ };
+
+ function wireState(object, parent, name) {
+ // TODO: Use Object.create and copy instead
+ object = mixin(parent ? Object.create(parent) : {}, object);
+ object.parentState = parent;
+ object.stateName = name;
+
+ for (var prop in object) {
+ if (!object.hasOwnProperty(prop) || prop === 'parentState' || prop === 'stateName') {
+ continue;
+ }
+ if (typeof object[prop] === 'object') {
+ object[prop] = wireState(object[prop], object, name + "." + prop);
+ }
+ }
+
+ return object;
+ }
+
+ RootState = wireState(RootState, null, "root");
+
+ exports['default'] = RootState;
+});
+define('ember-data/-private/system/normalize-link', ['exports'], function (exports) {
+ 'use strict';
+
+ exports['default'] = _normalizeLink;
+
+ /*
+ This method normalizes a link to an "links object". If the passed link is
+ already an object it's returned without any modifications.
+
+ See http://jsonapi.org/format/#document-links for more information.
+
+ @method _normalizeLink
+ @private
+ @param {String} link
+ @return {Object|null}
+ @for DS
+ */
+ function _normalizeLink(link) {
+ switch (typeof link) {
+ case 'object':
+ return link;
+ case 'string':
+ return { href: link };
+ }
+ return null;
+ }
+});
+define('ember-data/-private/system/normalize-model-name', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports['default'] = normalizeModelName;
+
+ /**
+ All modelNames are dasherized internally. Changing this function may
+ require changes to other normalization hooks (such as typeForRoot).
+ @method normalizeModelName
+ @public
+ @param {String} modelName
+ @return {String} if the adapter can generate one, an ID
+ @for DS
+ */
+ function normalizeModelName(modelName) {
+ return _ember['default'].String.dasherize(modelName);
+ }
+});
+define('ember-data/-private/system/ordered-set', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports['default'] = OrderedSet;
+
+ var EmberOrderedSet = _ember['default'].OrderedSet;
+ var guidFor = _ember['default'].guidFor;
+ function OrderedSet() {
+ this._super$constructor();
+ }
+
+ OrderedSet.create = function () {
+ var Constructor = this;
+ return new Constructor();
+ };
+
+ OrderedSet.prototype = Object.create(EmberOrderedSet.prototype);
+ OrderedSet.prototype.constructor = OrderedSet;
+ OrderedSet.prototype._super$constructor = EmberOrderedSet;
+
+ OrderedSet.prototype.addWithIndex = function (obj, idx) {
+ var guid = guidFor(obj);
+ var presenceSet = this.presenceSet;
+ var list = this.list;
+
+ if (presenceSet[guid] === true) {
+ return;
+ }
+
+ presenceSet[guid] = true;
+
+ if (idx === undefined || idx === null) {
+ list.push(obj);
+ } else {
+ list.splice(idx, 0, obj);
+ }
+
+ this.size += 1;
+
+ return this;
+ };
+});
+define('ember-data/-private/system/promise-proxies', ['exports', 'ember', 'ember-data/-private/debug'], function (exports, _ember, _emberDataPrivateDebug) {
+ 'use strict';
+
+ var Promise = _ember['default'].RSVP.Promise;
+ var get = _ember['default'].get;
+
+ /**
+ A `PromiseArray` is an object that acts like both an `Ember.Array`
+ and a promise. When the promise is resolved the resulting value
+ will be set to the `PromiseArray`'s `content` property. This makes
+ it easy to create data bindings with the `PromiseArray` that will be
+ updated when the promise resolves.
+
+ For more information see the [Ember.PromiseProxyMixin
+ documentation](/api/classes/Ember.PromiseProxyMixin.html).
+
+ Example
+
+ ```javascript
+ var promiseArray = DS.PromiseArray.create({
+ promise: $.getJSON('/some/remote/data.json')
+ });
+
+ promiseArray.get('length'); // 0
+
+ promiseArray.then(function() {
+ promiseArray.get('length'); // 100
+ });
+ ```
+
+ @class PromiseArray
+ @namespace DS
+ @extends Ember.ArrayProxy
+ @uses Ember.PromiseProxyMixin
+ */
+ var PromiseArray = _ember['default'].ArrayProxy.extend(_ember['default'].PromiseProxyMixin);
+
+ /**
+ A `PromiseObject` is an object that acts like both an `Ember.Object`
+ and a promise. When the promise is resolved, then the resulting value
+ will be set to the `PromiseObject`'s `content` property. This makes
+ it easy to create data bindings with the `PromiseObject` that will
+ be updated when the promise resolves.
+
+ For more information see the [Ember.PromiseProxyMixin
+ documentation](/api/classes/Ember.PromiseProxyMixin.html).
+
+ Example
+
+ ```javascript
+ var promiseObject = DS.PromiseObject.create({
+ promise: $.getJSON('/some/remote/data.json')
+ });
+
+ promiseObject.get('name'); // null
+
+ promiseObject.then(function() {
+ promiseObject.get('name'); // 'Tomster'
+ });
+ ```
+
+ @class PromiseObject
+ @namespace DS
+ @extends Ember.ObjectProxy
+ @uses Ember.PromiseProxyMixin
+ */
+ var PromiseObject = _ember['default'].ObjectProxy.extend(_ember['default'].PromiseProxyMixin);
+
+ var promiseObject = function promiseObject(promise, label) {
+ return PromiseObject.create({
+ promise: Promise.resolve(promise, label)
+ });
+ };
+
+ var promiseArray = function promiseArray(promise, label) {
+ return PromiseArray.create({
+ promise: Promise.resolve(promise, label)
+ });
+ };
+
+ /**
+ A PromiseManyArray is a PromiseArray that also proxies certain method calls
+ to the underlying manyArray.
+ Right now we proxy:
+
+ * `reload()`
+ * `createRecord()`
+ * `on()`
+ * `one()`
+ * `trigger()`
+ * `off()`
+ * `has()`
+
+ @class PromiseManyArray
+ @namespace DS
+ @extends Ember.ArrayProxy
+ */
+
+ function proxyToContent(method) {
+ return function () {
+ var content = get(this, 'content');
+ return content[method].apply(content, arguments);
+ };
+ }
+
+ var PromiseManyArray = PromiseArray.extend({
+ reload: function reload() {
+ //I don't think this should ever happen right now, but worth guarding if we refactor the async relationships
+ (0, _emberDataPrivateDebug.assert)('You are trying to reload an async manyArray before it has been created', get(this, 'content'));
+ return PromiseManyArray.create({
+ promise: get(this, 'content').reload()
+ });
+ },
+
+ createRecord: proxyToContent('createRecord'),
+
+ on: proxyToContent('on'),
+
+ one: proxyToContent('one'),
+
+ trigger: proxyToContent('trigger'),
+
+ off: proxyToContent('off'),
+
+ has: proxyToContent('has')
+ });
+
+ var promiseManyArray = function promiseManyArray(promise, label) {
+ return PromiseManyArray.create({
+ promise: Promise.resolve(promise, label)
+ });
+ };
+
+ exports.PromiseArray = PromiseArray;
+ exports.PromiseObject = PromiseObject;
+ exports.PromiseManyArray = PromiseManyArray;
+ exports.promiseArray = promiseArray;
+ exports.promiseObject = promiseObject;
+ exports.promiseManyArray = promiseManyArray;
+});
+define("ember-data/-private/system/record-array-manager", ["exports", "ember", "ember-data/-private/system/record-arrays", "ember-data/-private/system/ordered-set"], function (exports, _ember, _emberDataPrivateSystemRecordArrays, _emberDataPrivateSystemOrderedSet) {
+ /**
+ @module ember-data
+ */
+
+ "use strict";
+
+ var MapWithDefault = _ember["default"].MapWithDefault;var get = _ember["default"].get;
+
+ /**
+ @class RecordArrayManager
+ @namespace DS
+ @private
+ @extends Ember.Object
+ */
+ exports["default"] = _ember["default"].Object.extend({
+ init: function init() {
+ var _this = this;
+
+ this.filteredRecordArrays = MapWithDefault.create({
+ defaultValue: function defaultValue() {
+ return [];
+ }
+ });
+
+ this.liveRecordArrays = MapWithDefault.create({
+ defaultValue: function defaultValue(typeClass) {
+ return _this.createRecordArray(typeClass);
+ }
+ });
+
+ this.changedRecords = [];
+ this._adapterPopulatedRecordArrays = [];
+ },
+
+ recordDidChange: function recordDidChange(record) {
+ if (this.changedRecords.push(record) !== 1) {
+ return;
+ }
+
+ _ember["default"].run.schedule('actions', this, this.updateRecordArrays);
+ },
+
+ recordArraysForRecord: function recordArraysForRecord(record) {
+ record._recordArrays = record._recordArrays || _emberDataPrivateSystemOrderedSet["default"].create();
+ return record._recordArrays;
+ },
+
+ /**
+ This method is invoked whenever data is loaded into the store by the
+ adapter or updated by the adapter, or when a record has changed.
+ It updates all record arrays that a record belongs to.
+ To avoid thrashing, it only runs at most once per run loop.
+ @method updateRecordArrays
+ */
+ updateRecordArrays: function updateRecordArrays() {
+ var _this2 = this;
+
+ this.changedRecords.forEach(function (internalModel) {
+ if (get(internalModel, 'record.isDestroyed') || get(internalModel, 'record.isDestroying') || get(internalModel, 'currentState.stateName') === 'root.deleted.saved') {
+ _this2._recordWasDeleted(internalModel);
+ } else {
+ _this2._recordWasChanged(internalModel);
+ }
+ });
+
+ this.changedRecords.length = 0;
+ },
+
+ _recordWasDeleted: function _recordWasDeleted(record) {
+ var recordArrays = record._recordArrays;
+
+ if (!recordArrays) {
+ return;
+ }
+
+ recordArrays.forEach(function (array) {
+ return array.removeInternalModel(record);
+ });
+
+ record._recordArrays = null;
+ },
+
+ _recordWasChanged: function _recordWasChanged(record) {
+ var _this3 = this;
+
+ var typeClass = record.type;
+ var recordArrays = this.filteredRecordArrays.get(typeClass);
+ var filter;
+ recordArrays.forEach(function (array) {
+ filter = get(array, 'filterFunction');
+ _this3.updateFilterRecordArray(array, filter, typeClass, record);
+ });
+ },
+
+ //Need to update live arrays on loading
+ recordWasLoaded: function recordWasLoaded(record) {
+ var _this4 = this;
+
+ var typeClass = record.type;
+ var recordArrays = this.filteredRecordArrays.get(typeClass);
+ var filter;
+
+ recordArrays.forEach(function (array) {
+ filter = get(array, 'filterFunction');
+ _this4.updateFilterRecordArray(array, filter, typeClass, record);
+ });
+
+ if (this.liveRecordArrays.has(typeClass)) {
+ var liveRecordArray = this.liveRecordArrays.get(typeClass);
+ this._addRecordToRecordArray(liveRecordArray, record);
+ }
+ },
+ /**
+ Update an individual filter.
+ @method updateFilterRecordArray
+ @param {DS.FilteredRecordArray} array
+ @param {Function} filter
+ @param {DS.Model} typeClass
+ @param {InternalModel} record
+ */
+ updateFilterRecordArray: function updateFilterRecordArray(array, filter, typeClass, record) {
+ var shouldBeInArray = filter(record.getRecord());
+ var recordArrays = this.recordArraysForRecord(record);
+ if (shouldBeInArray) {
+ this._addRecordToRecordArray(array, record);
+ } else {
+ recordArrays["delete"](array);
+ array.removeInternalModel(record);
+ }
+ },
+
+ _addRecordToRecordArray: function _addRecordToRecordArray(array, record) {
+ var recordArrays = this.recordArraysForRecord(record);
+ if (!recordArrays.has(array)) {
+ array.addInternalModel(record);
+ recordArrays.add(array);
+ }
+ },
+
+ populateLiveRecordArray: function populateLiveRecordArray(array, modelName) {
+ var typeMap = this.store.typeMapFor(modelName);
+ var records = typeMap.records;
+ var record;
+
+ for (var i = 0; i < records.length; i++) {
+ record = records[i];
+
+ if (!record.isDeleted() && !record.isEmpty()) {
+ this._addRecordToRecordArray(array, record);
+ }
+ }
+ },
+
+ /**
+ This method is invoked if the `filterFunction` property is
+ changed on a `DS.FilteredRecordArray`.
+ It essentially re-runs the filter from scratch. This same
+ method is invoked when the filter is created in th first place.
+ @method updateFilter
+ @param {Array} array
+ @param {String} modelName
+ @param {Function} filter
+ */
+ updateFilter: function updateFilter(array, modelName, filter) {
+ var typeMap = this.store.typeMapFor(modelName);
+ var records = typeMap.records;
+ var record;
+
+ for (var i = 0; i < records.length; i++) {
+ record = records[i];
+
+ if (!record.isDeleted() && !record.isEmpty()) {
+ this.updateFilterRecordArray(array, filter, modelName, record);
+ }
+ }
+ },
+
+ /**
+ Get the `DS.RecordArray` for a type, which contains all loaded records of
+ given type.
+ @method liveRecordArrayFor
+ @param {Class} typeClass
+ @return {DS.RecordArray}
+ */
+ liveRecordArrayFor: function liveRecordArrayFor(typeClass) {
+ return this.liveRecordArrays.get(typeClass);
+ },
+
+ /**
+ Create a `DS.RecordArray` for a type.
+ @method createRecordArray
+ @param {Class} typeClass
+ @return {DS.RecordArray}
+ */
+ createRecordArray: function createRecordArray(typeClass) {
+ var array = _emberDataPrivateSystemRecordArrays.RecordArray.create({
+ type: typeClass,
+ content: _ember["default"].A(),
+ store: this.store,
+ isLoaded: true,
+ manager: this
+ });
+
+ return array;
+ },
+
+ /**
+ Create a `DS.FilteredRecordArray` for a type and register it for updates.
+ @method createFilteredRecordArray
+ @param {DS.Model} typeClass
+ @param {Function} filter
+ @param {Object} query (optional
+ @return {DS.FilteredRecordArray}
+ */
+ createFilteredRecordArray: function createFilteredRecordArray(typeClass, filter, query) {
+ var array = _emberDataPrivateSystemRecordArrays.FilteredRecordArray.create({
+ query: query,
+ type: typeClass,
+ content: _ember["default"].A(),
+ store: this.store,
+ manager: this,
+ filterFunction: filter
+ });
+
+ this.registerFilteredRecordArray(array, typeClass, filter);
+
+ return array;
+ },
+
+ /**
+ Create a `DS.AdapterPopulatedRecordArray` for a type with given query.
+ @method createAdapterPopulatedRecordArray
+ @param {DS.Model} typeClass
+ @param {Object} query
+ @return {DS.AdapterPopulatedRecordArray}
+ */
+ createAdapterPopulatedRecordArray: function createAdapterPopulatedRecordArray(typeClass, query) {
+ var array = _emberDataPrivateSystemRecordArrays.AdapterPopulatedRecordArray.create({
+ type: typeClass,
+ query: query,
+ content: _ember["default"].A(),
+ store: this.store,
+ manager: this
+ });
+
+ this._adapterPopulatedRecordArrays.push(array);
+
+ return array;
+ },
+
+ /**
+ Register a RecordArray for a given type to be backed by
+ a filter function. This will cause the array to update
+ automatically when records of that type change attribute
+ values or states.
+ @method registerFilteredRecordArray
+ @param {DS.RecordArray} array
+ @param {DS.Model} typeClass
+ @param {Function} filter
+ */
+ registerFilteredRecordArray: function registerFilteredRecordArray(array, typeClass, filter) {
+ var recordArrays = this.filteredRecordArrays.get(typeClass);
+ recordArrays.push(array);
+
+ this.updateFilter(array, typeClass, filter);
+ },
+
+ /**
+ Unregister a RecordArray.
+ So manager will not update this array.
+ @method unregisterRecordArray
+ @param {DS.RecordArray} array
+ */
+ unregisterRecordArray: function unregisterRecordArray(array) {
+ var typeClass = array.type;
+
+ // unregister filtered record array
+ var recordArrays = this.filteredRecordArrays.get(typeClass);
+ var removedFromFiltered = remove(recordArrays, array);
+
+ // remove from adapter populated record array
+ var removedFromAdapterPopulated = remove(this._adapterPopulatedRecordArrays, array);
+
+ if (!removedFromFiltered && !removedFromAdapterPopulated) {
+
+ // unregister live record array
+ if (this.liveRecordArrays.has(typeClass)) {
+ var liveRecordArrayForType = this.liveRecordArrayFor(typeClass);
+ if (array === liveRecordArrayForType) {
+ this.liveRecordArrays["delete"](typeClass);
+ }
+ }
+ }
+ },
+
+ willDestroy: function willDestroy() {
+ this._super.apply(this, arguments);
+
+ this.filteredRecordArrays.forEach(function (value) {
+ return flatten(value).forEach(destroy);
+ });
+ this.liveRecordArrays.forEach(destroy);
+ this._adapterPopulatedRecordArrays.forEach(destroy);
+ }
+ });
+
+ function destroy(entry) {
+ entry.destroy();
+ }
+
+ function flatten(list) {
+ var length = list.length;
+ var result = _ember["default"].A();
+
+ for (var i = 0; i < length; i++) {
+ result = result.concat(list[i]);
+ }
+
+ return result;
+ }
+
+ function remove(array, item) {
+ var index = array.indexOf(item);
+
+ if (index !== -1) {
+ array.splice(index, 1);
+ return true;
+ }
+
+ return false;
+ }
+});
+define("ember-data/-private/system/record-arrays", ["exports", "ember-data/-private/system/record-arrays/record-array", "ember-data/-private/system/record-arrays/filtered-record-array", "ember-data/-private/system/record-arrays/adapter-populated-record-array"], function (exports, _emberDataPrivateSystemRecordArraysRecordArray, _emberDataPrivateSystemRecordArraysFilteredRecordArray, _emberDataPrivateSystemRecordArraysAdapterPopulatedRecordArray) {
+ /**
+ @module ember-data
+ */
+
+ "use strict";
+
+ exports.RecordArray = _emberDataPrivateSystemRecordArraysRecordArray["default"];
+ exports.FilteredRecordArray = _emberDataPrivateSystemRecordArraysFilteredRecordArray["default"];
+ exports.AdapterPopulatedRecordArray = _emberDataPrivateSystemRecordArraysAdapterPopulatedRecordArray["default"];
+});
+define("ember-data/-private/system/record-arrays/adapter-populated-record-array", ["exports", "ember", "ember-data/-private/system/record-arrays/record-array", "ember-data/-private/system/clone-null", "ember-data/-private/features"], function (exports, _ember, _emberDataPrivateSystemRecordArraysRecordArray, _emberDataPrivateSystemCloneNull, _emberDataPrivateFeatures) {
+ "use strict";
+
+ /**
+ @module ember-data
+ */
+
+ var get = _ember["default"].get;
+
+ /**
+ Represents an ordered list of records whose order and membership is
+ determined by the adapter. For example, a query sent to the adapter
+ may trigger a search on the server, whose results would be loaded
+ into an instance of the `AdapterPopulatedRecordArray`.
+
+ @class AdapterPopulatedRecordArray
+ @namespace DS
+ @extends DS.RecordArray
+ */
+ exports["default"] = _emberDataPrivateSystemRecordArraysRecordArray["default"].extend({
+ query: null,
+
+ replace: function replace() {
+ var type = get(this, 'type').toString();
+ throw new Error("The result of a server query (on " + type + ") is immutable.");
+ },
+
+ _update: function _update() {
+ var store = get(this, 'store');
+ var modelName = get(this, 'type.modelName');
+ var query = get(this, 'query');
+
+ return store._query(modelName, query, this);
+ },
+
+ /**
+ @method loadRecords
+ @param {Array} records
+ @param {Object} payload normalized payload
+ @private
+ */
+ loadRecords: function loadRecords(records, payload) {
+ var _this = this;
+
+ //TODO Optimize
+ var internalModels = _ember["default"].A(records).mapBy('_internalModel');
+ this.setProperties({
+ content: _ember["default"].A(internalModels),
+ isLoaded: true,
+ isUpdating: false,
+ meta: (0, _emberDataPrivateSystemCloneNull["default"])(payload.meta)
+ });
+
+ if (true) {
+ this.set('links', (0, _emberDataPrivateSystemCloneNull["default"])(payload.links));
+ }
+
+ internalModels.forEach(function (record) {
+ _this.manager.recordArraysForRecord(record).add(_this);
+ });
+
+ // TODO: should triggering didLoad event be the last action of the runLoop?
+ _ember["default"].run.once(this, 'trigger', 'didLoad');
+ }
+ });
+});
+define('ember-data/-private/system/record-arrays/filtered-record-array', ['exports', 'ember', 'ember-data/-private/system/record-arrays/record-array'], function (exports, _ember, _emberDataPrivateSystemRecordArraysRecordArray) {
+ 'use strict';
+
+ /**
+ @module ember-data
+ */
+
+ var get = _ember['default'].get;
+
+ /**
+ Represents a list of records whose membership is determined by the
+ store. As records are created, loaded, or modified, the store
+ evaluates them to determine if they should be part of the record
+ array.
+
+ @class FilteredRecordArray
+ @namespace DS
+ @extends DS.RecordArray
+ */
+ exports['default'] = _emberDataPrivateSystemRecordArraysRecordArray['default'].extend({
+ /**
+ The filterFunction is a function used to test records from the store to
+ determine if they should be part of the record array.
+ Example
+ ```javascript
+ var allPeople = store.peekAll('person');
+ allPeople.mapBy('name'); // ["Tom Dale", "Yehuda Katz", "Trek Glowacki"]
+ var people = store.filter('person', function(person) {
+ if (person.get('name').match(/Katz$/)) { return true; }
+ });
+ people.mapBy('name'); // ["Yehuda Katz"]
+ var notKatzFilter = function(person) {
+ return !person.get('name').match(/Katz$/);
+ };
+ people.set('filterFunction', notKatzFilter);
+ people.mapBy('name'); // ["Tom Dale", "Trek Glowacki"]
+ ```
+ @method filterFunction
+ @param {DS.Model} record
+ @return {Boolean} `true` if the record should be in the array
+ */
+ filterFunction: null,
+ isLoaded: true,
+
+ replace: function replace() {
+ var type = get(this, 'type').toString();
+ throw new Error("The result of a client-side filter (on " + type + ") is immutable.");
+ },
+
+ /**
+ @method updateFilter
+ @private
+ */
+ _updateFilter: function _updateFilter() {
+ var manager = get(this, 'manager');
+ manager.updateFilter(this, get(this, 'type'), get(this, 'filterFunction'));
+ },
+
+ updateFilter: _ember['default'].observer('filterFunction', function () {
+ _ember['default'].run.once(this, this._updateFilter);
+ })
+ });
+});
+define("ember-data/-private/system/record-arrays/record-array", ["exports", "ember", "ember-data/-private/system/promise-proxies", "ember-data/-private/system/snapshot-record-array"], function (exports, _ember, _emberDataPrivateSystemPromiseProxies, _emberDataPrivateSystemSnapshotRecordArray) {
+ /**
+ @module ember-data
+ */
+
+ "use strict";
+
+ var get = _ember["default"].get;
+ var set = _ember["default"].set;
+
+ /**
+ A record array is an array that contains records of a certain type. The record
+ array materializes records as needed when they are retrieved for the first
+ time. You should not create record arrays yourself. Instead, an instance of
+ `DS.RecordArray` or its subclasses will be returned by your application's store
+ in response to queries.
+
+ @class RecordArray
+ @namespace DS
+ @extends Ember.ArrayProxy
+ @uses Ember.Evented
+ */
+
+ exports["default"] = _ember["default"].ArrayProxy.extend(_ember["default"].Evented, {
+ /**
+ The model type contained by this record array.
+ @property type
+ @type DS.Model
+ */
+ type: null,
+
+ /**
+ The array of client ids backing the record array. When a
+ record is requested from the record array, the record
+ for the client id at the same index is materialized, if
+ necessary, by the store.
+ @property content
+ @private
+ @type Ember.Array
+ */
+ content: null,
+
+ /**
+ The flag to signal a `RecordArray` is finished loading data.
+ Example
+ ```javascript
+ var people = store.peekAll('person');
+ people.get('isLoaded'); // true
+ ```
+ @property isLoaded
+ @type Boolean
+ */
+ isLoaded: false,
+ /**
+ The flag to signal a `RecordArray` is currently loading data.
+ Example
+ ```javascript
+ var people = store.peekAll('person');
+ people.get('isUpdating'); // false
+ people.update();
+ people.get('isUpdating'); // true
+ ```
+ @property isUpdating
+ @type Boolean
+ */
+ isUpdating: false,
+
+ /**
+ The store that created this record array.
+ @property store
+ @private
+ @type DS.Store
+ */
+ store: null,
+
+ /**
+ Retrieves an object from the content by index.
+ @method objectAtContent
+ @private
+ @param {Number} index
+ @return {DS.Model} record
+ */
+ objectAtContent: function objectAtContent(index) {
+ var content = get(this, 'content');
+ var internalModel = content.objectAt(index);
+ return internalModel && internalModel.getRecord();
+ },
+
+ /**
+ Used to get the latest version of all of the records in this array
+ from the adapter.
+ Example
+ ```javascript
+ var people = store.peekAll('person');
+ people.get('isUpdating'); // false
+ people.update().then(function() {
+ people.get('isUpdating'); // false
+ });
+ people.get('isUpdating'); // true
+ ```
+ @method update
+ */
+ update: function update() {
+ if (get(this, 'isUpdating')) {
+ return;
+ }
+
+ this.set('isUpdating', true);
+ return this._update();
+ },
+
+ /*
+ Update this RecordArray and return a promise which resolves once the update
+ is finished.
+ */
+ _update: function _update() {
+ var store = get(this, 'store');
+ var modelName = get(this, 'type.modelName');
+
+ return store.findAll(modelName, { reload: true });
+ },
+
+ /**
+ Adds an internal model to the `RecordArray` without duplicates
+ @method addInternalModel
+ @private
+ @param {InternalModel} internalModel
+ @param {number} an optional index to insert at
+ */
+ addInternalModel: function addInternalModel(internalModel, idx) {
+ var content = get(this, 'content');
+ if (idx === undefined) {
+ content.addObject(internalModel);
+ } else if (!content.includes(internalModel)) {
+ content.insertAt(idx, internalModel);
+ }
+ },
+
+ /**
+ Removes an internalModel to the `RecordArray`.
+ @method removeInternalModel
+ @private
+ @param {InternalModel} internalModel
+ */
+ removeInternalModel: function removeInternalModel(internalModel) {
+ get(this, 'content').removeObject(internalModel);
+ },
+
+ /**
+ Saves all of the records in the `RecordArray`.
+ Example
+ ```javascript
+ var messages = store.peekAll('message');
+ messages.forEach(function(message) {
+ message.set('hasBeenSeen', true);
+ });
+ messages.save();
+ ```
+ @method save
+ @return {DS.PromiseArray} promise
+ */
+ save: function save() {
+ var recordArray = this;
+ var promiseLabel = "DS: RecordArray#save " + get(this, 'type');
+ var promise = _ember["default"].RSVP.all(this.invoke("save"), promiseLabel).then(function (array) {
+ return recordArray;
+ }, null, "DS: RecordArray#save return RecordArray");
+
+ return _emberDataPrivateSystemPromiseProxies.PromiseArray.create({ promise: promise });
+ },
+
+ _dissociateFromOwnRecords: function _dissociateFromOwnRecords() {
+ var _this = this;
+
+ this.get('content').forEach(function (record) {
+ var recordArrays = record._recordArrays;
+
+ if (recordArrays) {
+ recordArrays["delete"](_this);
+ }
+ });
+ },
+
+ /**
+ @method _unregisterFromManager
+ @private
+ */
+ _unregisterFromManager: function _unregisterFromManager() {
+ var manager = get(this, 'manager');
+ manager.unregisterRecordArray(this);
+ },
+
+ willDestroy: function willDestroy() {
+ this._unregisterFromManager();
+ this._dissociateFromOwnRecords();
+ set(this, 'content', undefined);
+ this._super.apply(this, arguments);
+ },
+
+ createSnapshot: function createSnapshot(options) {
+ var meta = this.get('meta');
+ return new _emberDataPrivateSystemSnapshotRecordArray["default"](this, meta, options);
+ }
+ });
+});
+define('ember-data/-private/system/references', ['exports', 'ember-data/-private/system/references/record', 'ember-data/-private/system/references/belongs-to', 'ember-data/-private/system/references/has-many'], function (exports, _emberDataPrivateSystemReferencesRecord, _emberDataPrivateSystemReferencesBelongsTo, _emberDataPrivateSystemReferencesHasMany) {
+ 'use strict';
+
+ exports.RecordReference = _emberDataPrivateSystemReferencesRecord['default'];
+ exports.BelongsToReference = _emberDataPrivateSystemReferencesBelongsTo['default'];
+ exports.HasManyReference = _emberDataPrivateSystemReferencesHasMany['default'];
+});
+define('ember-data/-private/system/references/belongs-to', ['exports', 'ember-data/model', 'ember', 'ember-data/-private/system/references/reference', 'ember-data/-private/features', 'ember-data/-private/debug'], function (exports, _emberDataModel, _ember, _emberDataPrivateSystemReferencesReference, _emberDataPrivateFeatures, _emberDataPrivateDebug) {
+ 'use strict';
+
+ var BelongsToReference = function BelongsToReference(store, parentInternalModel, belongsToRelationship) {
+ this._super$constructor(store, parentInternalModel);
+ this.belongsToRelationship = belongsToRelationship;
+ this.type = belongsToRelationship.relationshipMeta.type;
+ this.parent = parentInternalModel.recordReference;
+
+ // TODO inverse
+ };
+
+ BelongsToReference.prototype = Object.create(_emberDataPrivateSystemReferencesReference['default'].prototype);
+ BelongsToReference.prototype.constructor = BelongsToReference;
+ BelongsToReference.prototype._super$constructor = _emberDataPrivateSystemReferencesReference['default'];
+
+ BelongsToReference.prototype.remoteType = function () {
+ if (this.belongsToRelationship.link) {
+ return "link";
+ }
+
+ return "id";
+ };
+
+ BelongsToReference.prototype.id = function () {
+ var inverseRecord = this.belongsToRelationship.inverseRecord;
+ return inverseRecord && inverseRecord.id;
+ };
+
+ BelongsToReference.prototype.link = function () {
+ return this.belongsToRelationship.link;
+ };
+
+ BelongsToReference.prototype.meta = function () {
+ return this.belongsToRelationship.meta;
+ };
+
+ BelongsToReference.prototype.push = function (objectOrPromise) {
+ var _this = this;
+
+ return _ember['default'].RSVP.resolve(objectOrPromise).then(function (data) {
+ var record;
+
+ if (data instanceof _emberDataModel['default']) {
+ if (false) {
+ (0, _emberDataPrivateDebug.deprecate)("BelongsToReference#push(DS.Model) is deprecated. Update relationship via `model.set('relationshipName', value)` instead.", false, {
+ id: 'ds.references.belongs-to.push-record',
+ until: '3.0'
+ });
+ }
+ record = data;
+ } else {
+ record = _this.store.push(data);
+ }
+
+ (0, _emberDataPrivateDebug.assertPolymorphicType)(_this.internalModel, _this.belongsToRelationship.relationshipMeta, record._internalModel);
+
+ _this.belongsToRelationship.setCanonicalRecord(record._internalModel);
+
+ return record;
+ });
+ };
+
+ BelongsToReference.prototype.value = function () {
+ var inverseRecord = this.belongsToRelationship.inverseRecord;
+
+ if (inverseRecord && inverseRecord.record) {
+ return inverseRecord.record;
+ }
+
+ return null;
+ };
+
+ BelongsToReference.prototype.load = function () {
+ var _this2 = this;
+
+ if (this.remoteType() === "id") {
+ return this.belongsToRelationship.getRecord();
+ }
+
+ if (this.remoteType() === "link") {
+ return this.belongsToRelationship.findLink().then(function (internalModel) {
+ return _this2.value();
+ });
+ }
+ };
+
+ BelongsToReference.prototype.reload = function () {
+ var _this3 = this;
+
+ return this.belongsToRelationship.reload().then(function (internalModel) {
+ return _this3.value();
+ });
+ };
+
+ exports['default'] = BelongsToReference;
+});
+define('ember-data/-private/system/references/has-many', ['exports', 'ember', 'ember-data/-private/system/references/reference', 'ember-data/-private/debug', 'ember-data/-private/features'], function (exports, _ember, _emberDataPrivateSystemReferencesReference, _emberDataPrivateDebug, _emberDataPrivateFeatures) {
+ 'use strict';
+
+ var get = _ember['default'].get;
+
+ var HasManyReference = function HasManyReference(store, parentInternalModel, hasManyRelationship) {
+ this._super$constructor(store, parentInternalModel);
+ this.hasManyRelationship = hasManyRelationship;
+ this.type = hasManyRelationship.relationshipMeta.type;
+ this.parent = parentInternalModel.recordReference;
+
+ // TODO inverse
+ };
+
+ HasManyReference.prototype = Object.create(_emberDataPrivateSystemReferencesReference['default'].prototype);
+ HasManyReference.prototype.constructor = HasManyReference;
+ HasManyReference.prototype._super$constructor = _emberDataPrivateSystemReferencesReference['default'];
+
+ HasManyReference.prototype.remoteType = function () {
+ if (this.hasManyRelationship.link) {
+ return "link";
+ }
+
+ return "ids";
+ };
+
+ HasManyReference.prototype.link = function () {
+ return this.hasManyRelationship.link;
+ };
+
+ HasManyReference.prototype.ids = function () {
+ var members = this.hasManyRelationship.members;
+ var ids = members.toArray().map(function (internalModel) {
+ return internalModel.id;
+ });
+
+ return ids;
+ };
+
+ HasManyReference.prototype.meta = function () {
+ return this.hasManyRelationship.manyArray.meta;
+ };
+
+ HasManyReference.prototype.push = function (objectOrPromise) {
+ var _this = this;
+
+ return _ember['default'].RSVP.resolve(objectOrPromise).then(function (payload) {
+ var array = payload;
+
+ if (false) {
+ (0, _emberDataPrivateDebug.deprecate)("HasManyReference#push(array) is deprecated. Push a JSON-API document instead.", !Array.isArray(payload), {
+ id: 'ds.references.has-many.push-array',
+ until: '3.0'
+ });
+ }
+
+ var useLegacyArrayPush = true;
+ if (typeof payload === "object" && payload.data) {
+ array = payload.data;
+ useLegacyArrayPush = array.length && array[0].data;
+
+ if (false) {
+ (0, _emberDataPrivateDebug.deprecate)("HasManyReference#push() expects a valid JSON-API document.", !useLegacyArrayPush, {
+ id: 'ds.references.has-many.push-invalid-json-api',
+ until: '3.0'
+ });
+ }
+ }
+
+ if (!false) {
+ useLegacyArrayPush = true;
+ }
+
+ var internalModels = undefined;
+ if (useLegacyArrayPush) {
+ internalModels = array.map(function (obj) {
+ var record = _this.store.push(obj);
+
+ (0, _emberDataPrivateDebug.runInDebug)(function () {
+ var relationshipMeta = _this.hasManyRelationship.relationshipMeta;
+ (0, _emberDataPrivateDebug.assertPolymorphicType)(_this.internalModel, relationshipMeta, record._internalModel);
+ });
+
+ return record._internalModel;
+ });
+ } else {
+ var records = _this.store.push(payload);
+ internalModels = _ember['default'].A(records).mapBy('_internalModel');
+
+ (0, _emberDataPrivateDebug.runInDebug)(function () {
+ internalModels.forEach(function (internalModel) {
+ var relationshipMeta = _this.hasManyRelationship.relationshipMeta;
+ (0, _emberDataPrivateDebug.assertPolymorphicType)(_this.internalModel, relationshipMeta, internalModel);
+ });
+ });
+ }
+
+ _this.hasManyRelationship.computeChanges(internalModels);
+
+ return _this.hasManyRelationship.manyArray;
+ });
+ };
+
+ HasManyReference.prototype._isLoaded = function () {
+ var hasData = get(this.hasManyRelationship, 'hasData');
+ if (!hasData) {
+ return false;
+ }
+
+ var members = this.hasManyRelationship.members.toArray();
+ var isEveryLoaded = members.every(function (internalModel) {
+ return internalModel.isLoaded() === true;
+ });
+
+ return isEveryLoaded;
+ };
+
+ HasManyReference.prototype.value = function () {
+ if (this._isLoaded()) {
+ return this.hasManyRelationship.manyArray;
+ }
+
+ return null;
+ };
+
+ HasManyReference.prototype.load = function () {
+ if (!this._isLoaded()) {
+ return this.hasManyRelationship.getRecords();
+ }
+
+ var manyArray = this.hasManyRelationship.manyArray;
+ return _ember['default'].RSVP.resolve(manyArray);
+ };
+
+ HasManyReference.prototype.reload = function () {
+ return this.hasManyRelationship.reload();
+ };
+
+ exports['default'] = HasManyReference;
+});
+define('ember-data/-private/system/references/record', ['exports', 'ember', 'ember-data/-private/system/references/reference'], function (exports, _ember, _emberDataPrivateSystemReferencesReference) {
+ 'use strict';
+
+ var RecordReference = function RecordReference(store, internalModel) {
+ this._super$constructor(store, internalModel);
+ this.type = internalModel.modelName;
+ this._id = internalModel.id;
+ };
+
+ RecordReference.prototype = Object.create(_emberDataPrivateSystemReferencesReference['default'].prototype);
+ RecordReference.prototype.constructor = RecordReference;
+ RecordReference.prototype._super$constructor = _emberDataPrivateSystemReferencesReference['default'];
+
+ RecordReference.prototype.id = function () {
+ return this._id;
+ };
+
+ RecordReference.prototype.remoteType = function () {
+ return 'identity';
+ };
+
+ RecordReference.prototype.push = function (objectOrPromise) {
+ var _this = this;
+
+ return _ember['default'].RSVP.resolve(objectOrPromise).then(function (data) {
+ var record = _this.store.push(data);
+ return record;
+ });
+ };
+
+ RecordReference.prototype.value = function () {
+ return this.internalModel.record;
+ };
+
+ RecordReference.prototype.load = function () {
+ return this.store.findRecord(this.type, this._id);
+ };
+
+ RecordReference.prototype.reload = function () {
+ var record = this.value();
+ if (record) {
+ return record.reload();
+ }
+
+ return this.load();
+ };
+
+ exports['default'] = RecordReference;
+});
+define("ember-data/-private/system/references/reference", ["exports"], function (exports) {
+ "use strict";
+
+ var Reference = function Reference(store, internalModel) {
+ this.store = store;
+ this.internalModel = internalModel;
+ };
+
+ Reference.prototype = {
+ constructor: Reference
+ };
+
+ exports["default"] = Reference;
+});
+define('ember-data/-private/system/relationship-meta', ['exports', 'ember-inflector', 'ember-data/-private/system/normalize-model-name'], function (exports, _emberInflector, _emberDataPrivateSystemNormalizeModelName) {
+ 'use strict';
+
+ exports.typeForRelationshipMeta = typeForRelationshipMeta;
+ exports.relationshipFromMeta = relationshipFromMeta;
+
+ function typeForRelationshipMeta(meta) {
+ var modelName;
+
+ modelName = meta.type || meta.key;
+ if (meta.kind === 'hasMany') {
+ modelName = (0, _emberInflector.singularize)((0, _emberDataPrivateSystemNormalizeModelName['default'])(modelName));
+ }
+ return modelName;
+ }
+
+ function relationshipFromMeta(meta) {
+ return {
+ key: meta.key,
+ kind: meta.kind,
+ type: typeForRelationshipMeta(meta),
+ options: meta.options,
+ parentType: meta.parentType,
+ isRelationship: true
+ };
+ }
+});
+define("ember-data/-private/system/relationships/belongs-to", ["exports", "ember", "ember-data/-private/debug", "ember-data/-private/system/normalize-model-name"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateSystemNormalizeModelName) {
+ "use strict";
+
+ exports["default"] = belongsTo;
+
+ /**
+ `DS.belongsTo` is used to define One-To-One and One-To-Many
+ relationships on a [DS.Model](/api/data/classes/DS.Model.html).
+
+
+ `DS.belongsTo` takes an optional hash as a second parameter, currently
+ supported options are:
+
+ - `async`: A boolean value used to explicitly declare this to be an async relationship.
+ - `inverse`: A string used to identify the inverse property on a
+ related model in a One-To-Many relationship. See [Explicit Inverses](#toc_explicit-inverses)
+
+ #### One-To-One
+ To declare a one-to-one relationship between two models, use
+ `DS.belongsTo`:
+
+ ```app/models/user.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ profile: DS.belongsTo('profile')
+ });
+ ```
+
+ ```app/models/profile.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ user: DS.belongsTo('user')
+ });
+ ```
+
+ #### One-To-Many
+ To declare a one-to-many relationship between two models, use
+ `DS.belongsTo` in combination with `DS.hasMany`, like this:
+
+ ```app/models/post.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ comments: DS.hasMany('comment')
+ });
+ ```
+
+ ```app/models/comment.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ post: DS.belongsTo('post')
+ });
+ ```
+
+ You can avoid passing a string as the first parameter. In that case Ember Data
+ will infer the type from the key name.
+
+ ```app/models/comment.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ post: DS.belongsTo()
+ });
+ ```
+
+ will lookup for a Post type.
+
+ @namespace
+ @method belongsTo
+ @for DS
+ @param {String} modelName (optional) type of the relationship
+ @param {Object} options (optional) a hash of options
+ @return {Ember.computed} relationship
+ */
+ function belongsTo(modelName, options) {
+ var opts, userEnteredModelName;
+ if (typeof modelName === 'object') {
+ opts = modelName;
+ userEnteredModelName = undefined;
+ } else {
+ opts = options;
+ userEnteredModelName = modelName;
+ }
+
+ if (typeof userEnteredModelName === 'string') {
+ userEnteredModelName = (0, _emberDataPrivateSystemNormalizeModelName["default"])(userEnteredModelName);
+ }
+
+ (0, _emberDataPrivateDebug.assert)("The first argument to DS.belongsTo must be a string representing a model type key, not an instance of " + _ember["default"].inspect(userEnteredModelName) + ". E.g., to define a relation to the Person model, use DS.belongsTo('person')", typeof userEnteredModelName === 'string' || typeof userEnteredModelName === 'undefined');
+
+ opts = opts || {};
+
+ var meta = {
+ type: userEnteredModelName,
+ isRelationship: true,
+ options: opts,
+ kind: 'belongsTo',
+ key: null
+ };
+
+ return _ember["default"].computed({
+ get: function get(key) {
+ if (opts.hasOwnProperty('serialize')) {
+ (0, _emberDataPrivateDebug.warn)("You provided a serialize option on the \"" + key + "\" property in the \"" + this._internalModel.modelName + "\" class, this belongs in the serializer. See DS.Serializer and it's implementations http://emberjs.com/api/data/classes/DS.Serializer.html", false, {
+ id: 'ds.model.serialize-option-in-belongs-to'
+ });
+ }
+
+ if (opts.hasOwnProperty('embedded')) {
+ (0, _emberDataPrivateDebug.warn)("You provided an embedded option on the \"" + key + "\" property in the \"" + this._internalModel.modelName + "\" class, this belongs in the serializer. See DS.EmbeddedRecordsMixin http://emberjs.com/api/data/classes/DS.EmbeddedRecordsMixin.html", false, {
+ id: 'ds.model.embedded-option-in-belongs-to'
+ });
+ }
+
+ return this._internalModel._relationships.get(key).getRecord();
+ },
+ set: function set(key, value) {
+ if (value === undefined) {
+ value = null;
+ }
+ if (value && value.then) {
+ this._internalModel._relationships.get(key).setRecordPromise(value);
+ } else if (value) {
+ this._internalModel._relationships.get(key).setRecord(value._internalModel);
+ } else {
+ this._internalModel._relationships.get(key).setRecord(value);
+ }
+
+ return this._internalModel._relationships.get(key).getRecord();
+ }
+ }).meta(meta);
+ }
+
+ /*
+ These observers observe all `belongsTo` relationships on the record. See
+ `relationships/ext` to see how these observers get their dependencies.
+ */
+ var BelongsToMixin = _ember["default"].Mixin.create({
+ notifyBelongsToChanged: function notifyBelongsToChanged(key) {
+ this.notifyPropertyChange(key);
+ }
+ });
+ exports.BelongsToMixin = BelongsToMixin;
+});
+define("ember-data/-private/system/relationships/ext", ["exports", "ember", "ember-data/-private/debug", "ember-data/-private/system/relationship-meta", "ember-data/-private/system/empty-object"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateSystemRelationshipMeta, _emberDataPrivateSystemEmptyObject) {
+ "use strict";
+
+ var get = _ember["default"].get;
+ var Map = _ember["default"].Map;
+ var MapWithDefault = _ember["default"].MapWithDefault;
+
+ var relationshipsDescriptor = _ember["default"].computed(function () {
+ if (_ember["default"].testing === true && relationshipsDescriptor._cacheable === true) {
+ relationshipsDescriptor._cacheable = false;
+ }
+
+ var map = new MapWithDefault({
+ defaultValue: function defaultValue() {
+ return [];
+ }
+ });
+
+ // Loop through each computed property on the class
+ this.eachComputedProperty(function (name, meta) {
+ // If the computed property is a relationship, add
+ // it to the map.
+ if (meta.isRelationship) {
+ meta.key = name;
+ var relationshipsForType = map.get((0, _emberDataPrivateSystemRelationshipMeta.typeForRelationshipMeta)(meta));
+
+ relationshipsForType.push({
+ name: name,
+ kind: meta.kind
+ });
+ }
+ });
+
+ return map;
+ }).readOnly();
+
+ var relatedTypesDescriptor = _ember["default"].computed(function () {
+ var _this = this;
+
+ if (_ember["default"].testing === true && relatedTypesDescriptor._cacheable === true) {
+ relatedTypesDescriptor._cacheable = false;
+ }
+
+ var modelName;
+ var types = _ember["default"].A();
+
+ // Loop through each computed property on the class,
+ // and create an array of the unique types involved
+ // in relationships
+ this.eachComputedProperty(function (name, meta) {
+ if (meta.isRelationship) {
+ meta.key = name;
+ modelName = (0, _emberDataPrivateSystemRelationshipMeta.typeForRelationshipMeta)(meta);
+
+ (0, _emberDataPrivateDebug.assert)("You specified a hasMany (" + meta.type + ") on " + meta.parentType + " but " + meta.type + " was not found.", modelName);
+
+ if (!types.includes(modelName)) {
+ (0, _emberDataPrivateDebug.assert)("Trying to sideload " + name + " on " + _this.toString() + " but the type doesn't exist.", !!modelName);
+ types.push(modelName);
+ }
+ }
+ });
+
+ return types;
+ }).readOnly();
+
+ var relationshipsByNameDescriptor = _ember["default"].computed(function () {
+ if (_ember["default"].testing === true && relationshipsByNameDescriptor._cacheable === true) {
+ relationshipsByNameDescriptor._cacheable = false;
+ }
+
+ var map = Map.create();
+
+ this.eachComputedProperty(function (name, meta) {
+ if (meta.isRelationship) {
+ meta.key = name;
+ var relationship = (0, _emberDataPrivateSystemRelationshipMeta.relationshipFromMeta)(meta);
+ relationship.type = (0, _emberDataPrivateSystemRelationshipMeta.typeForRelationshipMeta)(meta);
+ map.set(name, relationship);
+ }
+ });
+
+ return map;
+ }).readOnly();
+
+ /**
+ @module ember-data
+ */
+
+ /*
+ This file defines several extensions to the base `DS.Model` class that
+ add support for one-to-many relationships.
+ */
+
+ /**
+ @class Model
+ @namespace DS
+ */
+ var DidDefinePropertyMixin = _ember["default"].Mixin.create({
+
+ /**
+ This Ember.js hook allows an object to be notified when a property
+ is defined.
+ In this case, we use it to be notified when an Ember Data user defines a
+ belongs-to relationship. In that case, we need to set up observers for
+ each one, allowing us to track relationship changes and automatically
+ reflect changes in the inverse has-many array.
+ This hook passes the class being set up, as well as the key and value
+ being defined. So, for example, when the user does this:
+ ```javascript
+ DS.Model.extend({
+ parent: DS.belongsTo('user')
+ });
+ ```
+ This hook would be called with "parent" as the key and the computed
+ property returned by `DS.belongsTo` as the value.
+ @method didDefineProperty
+ @param {Object} proto
+ @param {String} key
+ @param {Ember.ComputedProperty} value
+ */
+ didDefineProperty: function didDefineProperty(proto, key, value) {
+ // Check if the value being set is a computed property.
+ if (value instanceof _ember["default"].ComputedProperty) {
+
+ // If it is, get the metadata for the relationship. This is
+ // populated by the `DS.belongsTo` helper when it is creating
+ // the computed property.
+ var meta = value.meta();
+
+ meta.parentType = proto.constructor;
+ }
+ }
+ });
+
+ exports.DidDefinePropertyMixin = DidDefinePropertyMixin;
+
+ /*
+ These DS.Model extensions add class methods that provide relationship
+ introspection abilities about relationships.
+
+ A note about the computed properties contained here:
+
+ **These properties are effectively sealed once called for the first time.**
+ To avoid repeatedly doing expensive iteration over a model's fields, these
+ values are computed once and then cached for the remainder of the runtime of
+ your application.
+
+ If your application needs to modify a class after its initial definition
+ (for example, using `reopen()` to add additional attributes), make sure you
+ do it before using your model with the store, which uses these properties
+ extensively.
+ */
+
+ var RelationshipsClassMethodsMixin = _ember["default"].Mixin.create({
+
+ /**
+ For a given relationship name, returns the model type of the relationship.
+ For example, if you define a model like this:
+ ```app/models/post.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ comments: DS.hasMany('comment')
+ });
+ ```
+ Calling `App.Post.typeForRelationship('comments')` will return `App.Comment`.
+ @method typeForRelationship
+ @static
+ @param {String} name the name of the relationship
+ @param {store} store an instance of DS.Store
+ @return {DS.Model} the type of the relationship, or undefined
+ */
+ typeForRelationship: function typeForRelationship(name, store) {
+ var relationship = get(this, 'relationshipsByName').get(name);
+ return relationship && store.modelFor(relationship.type);
+ },
+
+ inverseMap: _ember["default"].computed(function () {
+ return new _emberDataPrivateSystemEmptyObject["default"]();
+ }),
+
+ /**
+ Find the relationship which is the inverse of the one asked for.
+ For example, if you define models like this:
+ ```app/models/post.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ comments: DS.hasMany('message')
+ });
+ ```
+ ```app/models/message.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ owner: DS.belongsTo('post')
+ });
+ ```
+ App.Post.inverseFor('comments') -> { type: App.Message, name: 'owner', kind: 'belongsTo' }
+ App.Message.inverseFor('owner') -> { type: App.Post, name: 'comments', kind: 'hasMany' }
+ @method inverseFor
+ @static
+ @param {String} name the name of the relationship
+ @return {Object} the inverse relationship, or null
+ */
+ inverseFor: function inverseFor(name, store) {
+ var inverseMap = get(this, 'inverseMap');
+ if (inverseMap[name]) {
+ return inverseMap[name];
+ } else {
+ var inverse = this._findInverseFor(name, store);
+ inverseMap[name] = inverse;
+ return inverse;
+ }
+ },
+
+ //Calculate the inverse, ignoring the cache
+ _findInverseFor: function _findInverseFor(name, store) {
+
+ var inverseType = this.typeForRelationship(name, store);
+ if (!inverseType) {
+ return null;
+ }
+
+ var propertyMeta = this.metaForProperty(name);
+ //If inverse is manually specified to be null, like `comments: DS.hasMany('message', { inverse: null })`
+ var options = propertyMeta.options;
+ if (options.inverse === null) {
+ return null;
+ }
+
+ var inverseName, inverseKind, inverse;
+
+ //If inverse is specified manually, return the inverse
+ if (options.inverse) {
+ inverseName = options.inverse;
+ inverse = _ember["default"].get(inverseType, 'relationshipsByName').get(inverseName);
+
+ (0, _emberDataPrivateDebug.assert)("We found no inverse relationships by the name of '" + inverseName + "' on the '" + inverseType.modelName + "' model. This is most likely due to a missing attribute on your model definition.", !_ember["default"].isNone(inverse));
+
+ inverseKind = inverse.kind;
+ } else {
+ //No inverse was specified manually, we need to use a heuristic to guess one
+ if (propertyMeta.type === propertyMeta.parentType.modelName) {
+ (0, _emberDataPrivateDebug.warn)("Detected a reflexive relationship by the name of '" + name + "' without an inverse option. Look at http://emberjs.com/guides/models/defining-models/#toc_reflexive-relation for how to explicitly specify inverses.", false, {
+ id: 'ds.model.reflexive-relationship-without-inverse'
+ });
+ }
+
+ var possibleRelationships = findPossibleInverses(this, inverseType);
+
+ if (possibleRelationships.length === 0) {
+ return null;
+ }
+
+ var filteredRelationships = possibleRelationships.filter(function (possibleRelationship) {
+ var optionsForRelationship = inverseType.metaForProperty(possibleRelationship.name).options;
+ return name === optionsForRelationship.inverse;
+ });
+
+ (0, _emberDataPrivateDebug.assert)("You defined the '" + name + "' relationship on " + this + ", but you defined the inverse relationships of type " + inverseType.toString() + " multiple times. Look at http://emberjs.com/guides/models/defining-models/#toc_explicit-inverses for how to explicitly specify inverses", filteredRelationships.length < 2);
+
+ if (filteredRelationships.length === 1) {
+ possibleRelationships = filteredRelationships;
+ }
+
+ (0, _emberDataPrivateDebug.assert)("You defined the '" + name + "' relationship on " + this + ", but multiple possible inverse relationships of type " + this + " were found on " + inverseType + ". Look at http://emberjs.com/guides/models/defining-models/#toc_explicit-inverses for how to explicitly specify inverses", possibleRelationships.length === 1);
+
+ inverseName = possibleRelationships[0].name;
+ inverseKind = possibleRelationships[0].kind;
+ }
+
+ function findPossibleInverses(type, inverseType, relationshipsSoFar) {
+ var possibleRelationships = relationshipsSoFar || [];
+
+ var relationshipMap = get(inverseType, 'relationships');
+ if (!relationshipMap) {
+ return possibleRelationships;
+ }
+
+ var relationships = relationshipMap.get(type.modelName);
+
+ relationships = relationships.filter(function (relationship) {
+ var optionsForRelationship = inverseType.metaForProperty(relationship.name).options;
+
+ if (!optionsForRelationship.inverse) {
+ return true;
+ }
+
+ return name === optionsForRelationship.inverse;
+ });
+
+ if (relationships) {
+ possibleRelationships.push.apply(possibleRelationships, relationships);
+ }
+
+ //Recurse to support polymorphism
+ if (type.superclass) {
+ findPossibleInverses(type.superclass, inverseType, possibleRelationships);
+ }
+
+ return possibleRelationships;
+ }
+
+ return {
+ type: inverseType,
+ name: inverseName,
+ kind: inverseKind
+ };
+ },
+
+ /**
+ The model's relationships as a map, keyed on the type of the
+ relationship. The value of each entry is an array containing a descriptor
+ for each relationship with that type, describing the name of the relationship
+ as well as the type.
+ For example, given the following model definition:
+ ```app/models/blog.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ users: DS.hasMany('user'),
+ owner: DS.belongsTo('user'),
+ posts: DS.hasMany('post')
+ });
+ ```
+ This computed property would return a map describing these
+ relationships, like this:
+ ```javascript
+ import Ember from 'ember';
+ import Blog from 'app/models/blog';
+ var relationships = Ember.get(Blog, 'relationships');
+ relationships.get(App.User);
+ //=> [ { name: 'users', kind: 'hasMany' },
+ // { name: 'owner', kind: 'belongsTo' } ]
+ relationships.get(App.Post);
+ //=> [ { name: 'posts', kind: 'hasMany' } ]
+ ```
+ @property relationships
+ @static
+ @type Ember.Map
+ @readOnly
+ */
+
+ relationships: relationshipsDescriptor,
+
+ /**
+ A hash containing lists of the model's relationships, grouped
+ by the relationship kind. For example, given a model with this
+ definition:
+ ```app/models/blog.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ users: DS.hasMany('user'),
+ owner: DS.belongsTo('user'),
+ posts: DS.hasMany('post')
+ });
+ ```
+ This property would contain the following:
+ ```javascript
+ import Ember from 'ember';
+ import Blog from 'app/models/blog';
+ var relationshipNames = Ember.get(Blog, 'relationshipNames');
+ relationshipNames.hasMany;
+ //=> ['users', 'posts']
+ relationshipNames.belongsTo;
+ //=> ['owner']
+ ```
+ @property relationshipNames
+ @static
+ @type Object
+ @readOnly
+ */
+ relationshipNames: _ember["default"].computed(function () {
+ var names = {
+ hasMany: [],
+ belongsTo: []
+ };
+
+ this.eachComputedProperty(function (name, meta) {
+ if (meta.isRelationship) {
+ names[meta.kind].push(name);
+ }
+ });
+
+ return names;
+ }),
+
+ /**
+ An array of types directly related to a model. Each type will be
+ included once, regardless of the number of relationships it has with
+ the model.
+ For example, given a model with this definition:
+ ```app/models/blog.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ users: DS.hasMany('user'),
+ owner: DS.belongsTo('user'),
+ posts: DS.hasMany('post')
+ });
+ ```
+ This property would contain the following:
+ ```javascript
+ import Ember from 'ember';
+ import Blog from 'app/models/blog';
+ var relatedTypes = Ember.get(Blog, 'relatedTypes');
+ //=> [ App.User, App.Post ]
+ ```
+ @property relatedTypes
+ @static
+ @type Ember.Array
+ @readOnly
+ */
+ relatedTypes: relatedTypesDescriptor,
+
+ /**
+ A map whose keys are the relationships of a model and whose values are
+ relationship descriptors.
+ For example, given a model with this
+ definition:
+ ```app/models/blog.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ users: DS.hasMany('user'),
+ owner: DS.belongsTo('user'),
+ posts: DS.hasMany('post')
+ });
+ ```
+ This property would contain the following:
+ ```javascript
+ import Ember from 'ember';
+ import Blog from 'app/models/blog';
+ var relationshipsByName = Ember.get(Blog, 'relationshipsByName');
+ relationshipsByName.get('users');
+ //=> { key: 'users', kind: 'hasMany', type: 'user', options: Object, isRelationship: true }
+ relationshipsByName.get('owner');
+ //=> { key: 'owner', kind: 'belongsTo', type: 'user', options: Object, isRelationship: true }
+ ```
+ @property relationshipsByName
+ @static
+ @type Ember.Map
+ @readOnly
+ */
+ relationshipsByName: relationshipsByNameDescriptor,
+
+ /**
+ A map whose keys are the fields of the model and whose values are strings
+ describing the kind of the field. A model's fields are the union of all of its
+ attributes and relationships.
+ For example:
+ ```app/models/blog.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ users: DS.hasMany('user'),
+ owner: DS.belongsTo('user'),
+ posts: DS.hasMany('post'),
+ title: DS.attr('string')
+ });
+ ```
+ ```js
+ import Ember from 'ember';
+ import Blog from 'app/models/blog';
+ var fields = Ember.get(Blog, 'fields');
+ fields.forEach(function(kind, field) {
+ console.log(field, kind);
+ });
+ // prints:
+ // users, hasMany
+ // owner, belongsTo
+ // posts, hasMany
+ // title, attribute
+ ```
+ @property fields
+ @static
+ @type Ember.Map
+ @readOnly
+ */
+ fields: _ember["default"].computed(function () {
+ var map = Map.create();
+
+ this.eachComputedProperty(function (name, meta) {
+ if (meta.isRelationship) {
+ map.set(name, meta.kind);
+ } else if (meta.isAttribute) {
+ map.set(name, 'attribute');
+ }
+ });
+
+ return map;
+ }).readOnly(),
+
+ /**
+ Given a callback, iterates over each of the relationships in the model,
+ invoking the callback with the name of each relationship and its relationship
+ descriptor.
+ @method eachRelationship
+ @static
+ @param {Function} callback the callback to invoke
+ @param {any} binding the value to which the callback's `this` should be bound
+ */
+ eachRelationship: function eachRelationship(callback, binding) {
+ get(this, 'relationshipsByName').forEach(function (relationship, name) {
+ callback.call(binding, name, relationship);
+ });
+ },
+
+ /**
+ Given a callback, iterates over each of the types related to a model,
+ invoking the callback with the related type's class. Each type will be
+ returned just once, regardless of how many different relationships it has
+ with a model.
+ @method eachRelatedType
+ @static
+ @param {Function} callback the callback to invoke
+ @param {any} binding the value to which the callback's `this` should be bound
+ */
+ eachRelatedType: function eachRelatedType(callback, binding) {
+ var relationshipTypes = get(this, 'relatedTypes');
+
+ for (var i = 0; i < relationshipTypes.length; i++) {
+ var type = relationshipTypes[i];
+ callback.call(binding, type);
+ }
+ },
+
+ determineRelationshipType: function determineRelationshipType(knownSide, store) {
+ var knownKey = knownSide.key;
+ var knownKind = knownSide.kind;
+ var inverse = this.inverseFor(knownKey, store);
+ // let key;
+ var otherKind = undefined;
+
+ if (!inverse) {
+ return knownKind === 'belongsTo' ? 'oneToNone' : 'manyToNone';
+ }
+
+ // key = inverse.name;
+ otherKind = inverse.kind;
+
+ if (otherKind === 'belongsTo') {
+ return knownKind === 'belongsTo' ? 'oneToOne' : 'manyToOne';
+ } else {
+ return knownKind === 'belongsTo' ? 'oneToMany' : 'manyToMany';
+ }
+ }
+
+ });
+
+ exports.RelationshipsClassMethodsMixin = RelationshipsClassMethodsMixin;
+
+ var RelationshipsInstanceMethodsMixin = _ember["default"].Mixin.create({
+ /**
+ Given a callback, iterates over each of the relationships in the model,
+ invoking the callback with the name of each relationship and its relationship
+ descriptor.
+ The callback method you provide should have the following signature (all
+ parameters are optional):
+ ```javascript
+ function(name, descriptor);
+ ```
+ - `name` the name of the current property in the iteration
+ - `descriptor` the meta object that describes this relationship
+ The relationship descriptor argument is an object with the following properties.
+ - **key** String the name of this relationship on the Model
+ - **kind** String "hasMany" or "belongsTo"
+ - **options** Object the original options hash passed when the relationship was declared
+ - **parentType** DS.Model the type of the Model that owns this relationship
+ - **type** String the type name of the related Model
+ Note that in addition to a callback, you can also pass an optional target
+ object that will be set as `this` on the context.
+ Example
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ serialize: function(record, options) {
+ var json = {};
+ record.eachRelationship(function(name, descriptor) {
+ if (descriptor.kind === 'hasMany') {
+ var serializedHasManyName = name.toUpperCase() + '_IDS';
+ json[serializedHasManyName] = record.get(name).mapBy('id');
+ }
+ });
+ return json;
+ }
+ });
+ ```
+ @method eachRelationship
+ @param {Function} callback the callback to invoke
+ @param {any} binding the value to which the callback's `this` should be bound
+ */
+ eachRelationship: function eachRelationship(callback, binding) {
+ this.constructor.eachRelationship(callback, binding);
+ },
+
+ relationshipFor: function relationshipFor(name) {
+ return get(this.constructor, 'relationshipsByName').get(name);
+ },
+
+ inverseFor: function inverseFor(key) {
+ return this.constructor.inverseFor(key, this.store);
+ }
+
+ });
+ exports.RelationshipsInstanceMethodsMixin = RelationshipsInstanceMethodsMixin;
+});
+define("ember-data/-private/system/relationships/has-many", ["exports", "ember", "ember-data/-private/debug", "ember-data/-private/system/normalize-model-name", "ember-data/-private/system/is-array-like"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateSystemNormalizeModelName, _emberDataPrivateSystemIsArrayLike) {
+ "use strict";
+
+ exports["default"] = hasMany;
+
+ /**
+ @module ember-data
+ */
+
+ /**
+ `DS.hasMany` is used to define One-To-Many and Many-To-Many
+ relationships on a [DS.Model](/api/data/classes/DS.Model.html).
+
+ `DS.hasMany` takes an optional hash as a second parameter, currently
+ supported options are:
+
+ - `async`: A boolean value used to explicitly declare this to be an async relationship.
+ - `inverse`: A string used to identify the inverse property on a related model.
+
+ #### One-To-Many
+ To declare a one-to-many relationship between two models, use
+ `DS.belongsTo` in combination with `DS.hasMany`, like this:
+
+ ```app/models/post.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ comments: DS.hasMany('comment')
+ });
+ ```
+
+ ```app/models/comment.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ post: DS.belongsTo('post')
+ });
+ ```
+
+ #### Many-To-Many
+ To declare a many-to-many relationship between two models, use
+ `DS.hasMany`:
+
+ ```app/models/post.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ tags: DS.hasMany('tag')
+ });
+ ```
+
+ ```app/models/tag.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ posts: DS.hasMany('post')
+ });
+ ```
+
+ You can avoid passing a string as the first parameter. In that case Ember Data
+ will infer the type from the singularized key name.
+
+ ```app/models/post.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ tags: DS.hasMany()
+ });
+ ```
+
+ will lookup for a Tag type.
+
+ #### Explicit Inverses
+
+ Ember Data will do its best to discover which relationships map to
+ one another. In the one-to-many code above, for example, Ember Data
+ can figure out that changing the `comments` relationship should update
+ the `post` relationship on the inverse because post is the only
+ relationship to that model.
+
+ However, sometimes you may have multiple `belongsTo`/`hasManys` for the
+ same type. You can specify which property on the related model is
+ the inverse using `DS.hasMany`'s `inverse` option:
+
+ ```app/models/comment.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ onePost: DS.belongsTo('post'),
+ twoPost: DS.belongsTo('post'),
+ redPost: DS.belongsTo('post'),
+ bluePost: DS.belongsTo('post')
+ });
+ ```
+
+ ```app/models/post.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ comments: DS.hasMany('comment', {
+ inverse: 'redPost'
+ })
+ });
+ ```
+
+ You can also specify an inverse on a `belongsTo`, which works how
+ you'd expect.
+
+ @namespace
+ @method hasMany
+ @for DS
+ @param {String} type (optional) type of the relationship
+ @param {Object} options (optional) a hash of options
+ @return {Ember.computed} relationship
+ */
+ function hasMany(type, options) {
+ if (typeof type === 'object') {
+ options = type;
+ type = undefined;
+ }
+
+ (0, _emberDataPrivateDebug.assert)("The first argument to DS.hasMany must be a string representing a model type key, not an instance of " + _ember["default"].inspect(type) + ". E.g., to define a relation to the Comment model, use DS.hasMany('comment')", typeof type === 'string' || typeof type === 'undefined');
+
+ options = options || {};
+
+ if (typeof type === 'string') {
+ type = (0, _emberDataPrivateSystemNormalizeModelName["default"])(type);
+ }
+
+ // Metadata about relationships is stored on the meta of
+ // the relationship. This is used for introspection and
+ // serialization. Note that `key` is populated lazily
+ // the first time the CP is called.
+ var meta = {
+ type: type,
+ isRelationship: true,
+ options: options,
+ kind: 'hasMany',
+ key: null
+ };
+
+ return _ember["default"].computed({
+ get: function get(key) {
+ var relationship = this._internalModel._relationships.get(key);
+ return relationship.getRecords();
+ },
+ set: function set(key, records) {
+ (0, _emberDataPrivateDebug.assert)("You must pass an array of records to set a hasMany relationship", (0, _emberDataPrivateSystemIsArrayLike["default"])(records));
+ (0, _emberDataPrivateDebug.assert)("All elements of a hasMany relationship must be instances of DS.Model, you passed " + _ember["default"].inspect(records), (function () {
+ return _ember["default"].A(records).every(function (record) {
+ return record.hasOwnProperty('_internalModel') === true;
+ });
+ })());
+
+ var relationship = this._internalModel._relationships.get(key);
+ relationship.clear();
+ relationship.addRecords(_ember["default"].A(records).mapBy('_internalModel'));
+ return relationship.getRecords();
+ }
+ }).meta(meta);
+ }
+
+ var HasManyMixin = _ember["default"].Mixin.create({
+ notifyHasManyAdded: function notifyHasManyAdded(key) {
+ //We need to notifyPropertyChange in the adding case because we need to make sure
+ //we fetch the newly added record in case it is unloaded
+ //TODO(Igor): Consider whether we could do this only if the record state is unloaded
+
+ //Goes away once hasMany is double promisified
+ this.notifyPropertyChange(key);
+ }
+ });
+ exports.HasManyMixin = HasManyMixin;
+});
+define("ember-data/-private/system/relationships/state/belongs-to", ["exports", "ember", "ember-data/-private/debug", "ember-data/-private/system/promise-proxies", "ember-data/-private/system/relationships/state/relationship"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateSystemPromiseProxies, _emberDataPrivateSystemRelationshipsStateRelationship) {
+ "use strict";
+
+ exports["default"] = BelongsToRelationship;
+
+ function BelongsToRelationship(store, record, inverseKey, relationshipMeta) {
+ this._super$constructor(store, record, inverseKey, relationshipMeta);
+ this.record = record;
+ this.key = relationshipMeta.key;
+ this.inverseRecord = null;
+ this.canonicalState = null;
+ }
+
+ BelongsToRelationship.prototype = Object.create(_emberDataPrivateSystemRelationshipsStateRelationship["default"].prototype);
+ BelongsToRelationship.prototype.constructor = BelongsToRelationship;
+ BelongsToRelationship.prototype._super$constructor = _emberDataPrivateSystemRelationshipsStateRelationship["default"];
+
+ BelongsToRelationship.prototype.setRecord = function (newRecord) {
+ if (newRecord) {
+ this.addRecord(newRecord);
+ } else if (this.inverseRecord) {
+ this.removeRecord(this.inverseRecord);
+ }
+ this.setHasData(true);
+ this.setHasLoaded(true);
+ };
+
+ BelongsToRelationship.prototype.setCanonicalRecord = function (newRecord) {
+ if (newRecord) {
+ this.addCanonicalRecord(newRecord);
+ } else if (this.canonicalState) {
+ this.removeCanonicalRecord(this.canonicalState);
+ }
+ this.flushCanonicalLater();
+ this.setHasData(true);
+ this.setHasLoaded(true);
+ };
+
+ BelongsToRelationship.prototype._super$addCanonicalRecord = _emberDataPrivateSystemRelationshipsStateRelationship["default"].prototype.addCanonicalRecord;
+ BelongsToRelationship.prototype.addCanonicalRecord = function (newRecord) {
+ if (this.canonicalMembers.has(newRecord)) {
+ return;
+ }
+
+ if (this.canonicalState) {
+ this.removeCanonicalRecord(this.canonicalState);
+ }
+
+ this.canonicalState = newRecord;
+ this._super$addCanonicalRecord(newRecord);
+ };
+
+ BelongsToRelationship.prototype._super$flushCanonical = _emberDataPrivateSystemRelationshipsStateRelationship["default"].prototype.flushCanonical;
+ BelongsToRelationship.prototype.flushCanonical = function () {
+ //temporary fix to not remove newly created records if server returned null.
+ //TODO remove once we have proper diffing
+ if (this.inverseRecord && this.inverseRecord.isNew() && !this.canonicalState) {
+ return;
+ }
+ this.inverseRecord = this.canonicalState;
+ this.record.notifyBelongsToChanged(this.key);
+ this._super$flushCanonical();
+ };
+
+ BelongsToRelationship.prototype._super$addRecord = _emberDataPrivateSystemRelationshipsStateRelationship["default"].prototype.addRecord;
+ BelongsToRelationship.prototype.addRecord = function (newRecord) {
+ if (this.members.has(newRecord)) {
+ return;
+ }
+
+ (0, _emberDataPrivateDebug.assertPolymorphicType)(this.record, this.relationshipMeta, newRecord);
+
+ if (this.inverseRecord) {
+ this.removeRecord(this.inverseRecord);
+ }
+
+ this.inverseRecord = newRecord;
+ this._super$addRecord(newRecord);
+ this.record.notifyBelongsToChanged(this.key);
+ };
+
+ BelongsToRelationship.prototype.setRecordPromise = function (newPromise) {
+ var content = newPromise.get && newPromise.get('content');
+ (0, _emberDataPrivateDebug.assert)("You passed in a promise that did not originate from an EmberData relationship. You can only pass promises that come from a belongsTo or hasMany relationship to the get call.", content !== undefined);
+ this.setRecord(content ? content._internalModel : content);
+ };
+
+ BelongsToRelationship.prototype._super$removeRecordFromOwn = _emberDataPrivateSystemRelationshipsStateRelationship["default"].prototype.removeRecordFromOwn;
+ BelongsToRelationship.prototype.removeRecordFromOwn = function (record) {
+ if (!this.members.has(record)) {
+ return;
+ }
+ this.inverseRecord = null;
+ this._super$removeRecordFromOwn(record);
+ this.record.notifyBelongsToChanged(this.key);
+ };
+
+ BelongsToRelationship.prototype._super$removeCanonicalRecordFromOwn = _emberDataPrivateSystemRelationshipsStateRelationship["default"].prototype.removeCanonicalRecordFromOwn;
+ BelongsToRelationship.prototype.removeCanonicalRecordFromOwn = function (record) {
+ if (!this.canonicalMembers.has(record)) {
+ return;
+ }
+ this.canonicalState = null;
+ this._super$removeCanonicalRecordFromOwn(record);
+ };
+
+ BelongsToRelationship.prototype.findRecord = function () {
+ if (this.inverseRecord) {
+ return this.store._findByInternalModel(this.inverseRecord);
+ } else {
+ return _ember["default"].RSVP.Promise.resolve(null);
+ }
+ };
+
+ BelongsToRelationship.prototype.fetchLink = function () {
+ var _this = this;
+
+ return this.store.findBelongsTo(this.record, this.link, this.relationshipMeta).then(function (record) {
+ if (record) {
+ _this.addRecord(record);
+ }
+ return record;
+ });
+ };
+
+ BelongsToRelationship.prototype.getRecord = function () {
+ var _this2 = this;
+
+ //TODO(Igor) flushCanonical here once our syncing is not stupid
+ if (this.isAsync) {
+ var promise;
+ if (this.link) {
+ if (this.hasLoaded) {
+ promise = this.findRecord();
+ } else {
+ promise = this.findLink().then(function () {
+ return _this2.findRecord();
+ });
+ }
+ } else {
+ promise = this.findRecord();
+ }
+
+ return _emberDataPrivateSystemPromiseProxies.PromiseObject.create({
+ promise: promise,
+ content: this.inverseRecord ? this.inverseRecord.getRecord() : null
+ });
+ } else {
+ if (this.inverseRecord === null) {
+ return null;
+ }
+ var toReturn = this.inverseRecord.getRecord();
+ (0, _emberDataPrivateDebug.assert)("You looked up the '" + this.key + "' relationship on a '" + this.record.type.modelName + "' with id " + this.record.id + " but some of the associated records were not loaded. Either make sure they are all loaded together with the parent record, or specify that the relationship is async (`DS.belongsTo({ async: true })`)", toReturn === null || !toReturn.get('isEmpty'));
+ return toReturn;
+ }
+ };
+
+ BelongsToRelationship.prototype.reload = function () {
+ // TODO handle case when reload() is triggered multiple times
+
+ if (this.link) {
+ return this.fetchLink();
+ }
+
+ // reload record, if it is already loaded
+ if (this.inverseRecord && this.inverseRecord.record) {
+ return this.inverseRecord.record.reload();
+ }
+
+ return this.findRecord();
+ };
+});
+define("ember-data/-private/system/relationships/state/create", ["exports", "ember", "ember-data/-private/system/relationships/state/has-many", "ember-data/-private/system/relationships/state/belongs-to", "ember-data/-private/system/empty-object"], function (exports, _ember, _emberDataPrivateSystemRelationshipsStateHasMany, _emberDataPrivateSystemRelationshipsStateBelongsTo, _emberDataPrivateSystemEmptyObject) {
+ "use strict";
+
+ exports["default"] = Relationships;
+
+ var get = _ember["default"].get;
+
+ function shouldFindInverse(relationshipMeta) {
+ var options = relationshipMeta.options;
+ return !(options && options.inverse === null);
+ }
+
+ function createRelationshipFor(record, relationshipMeta, store) {
+ var inverseKey = undefined;
+ var inverse = null;
+ if (shouldFindInverse(relationshipMeta)) {
+ inverse = record.type.inverseFor(relationshipMeta.key, store);
+ }
+
+ if (inverse) {
+ inverseKey = inverse.name;
+ }
+
+ if (relationshipMeta.kind === 'hasMany') {
+ return new _emberDataPrivateSystemRelationshipsStateHasMany["default"](store, record, inverseKey, relationshipMeta);
+ } else {
+ return new _emberDataPrivateSystemRelationshipsStateBelongsTo["default"](store, record, inverseKey, relationshipMeta);
+ }
+ }
+ function Relationships(record) {
+ this.record = record;
+ this.initializedRelationships = new _emberDataPrivateSystemEmptyObject["default"]();
+ }
+
+ Relationships.prototype.has = function (key) {
+ return !!this.initializedRelationships[key];
+ };
+
+ Relationships.prototype.get = function (key) {
+ var relationships = this.initializedRelationships;
+ var relationshipsByName = get(this.record.type, 'relationshipsByName');
+ if (!relationships[key] && relationshipsByName.get(key)) {
+ relationships[key] = createRelationshipFor(this.record, relationshipsByName.get(key), this.record.store);
+ }
+ return relationships[key];
+ };
+});
+define("ember-data/-private/system/relationships/state/has-many", ["exports", "ember-data/-private/debug", "ember-data/-private/system/promise-proxies", "ember-data/-private/system/relationships/state/relationship", "ember-data/-private/system/ordered-set", "ember-data/-private/system/many-array"], function (exports, _emberDataPrivateDebug, _emberDataPrivateSystemPromiseProxies, _emberDataPrivateSystemRelationshipsStateRelationship, _emberDataPrivateSystemOrderedSet, _emberDataPrivateSystemManyArray) {
+ "use strict";
+
+ exports["default"] = ManyRelationship;
+
+ function ManyRelationship(store, record, inverseKey, relationshipMeta) {
+ this._super$constructor(store, record, inverseKey, relationshipMeta);
+ this.belongsToType = relationshipMeta.type;
+ this.canonicalState = [];
+ this.manyArray = _emberDataPrivateSystemManyArray["default"].create({
+ canonicalState: this.canonicalState,
+ store: this.store,
+ relationship: this,
+ type: this.store.modelFor(this.belongsToType),
+ record: record
+ });
+ this.isPolymorphic = relationshipMeta.options.polymorphic;
+ this.manyArray.isPolymorphic = this.isPolymorphic;
+ }
+
+ ManyRelationship.prototype = Object.create(_emberDataPrivateSystemRelationshipsStateRelationship["default"].prototype);
+ ManyRelationship.prototype.constructor = ManyRelationship;
+ ManyRelationship.prototype._super$constructor = _emberDataPrivateSystemRelationshipsStateRelationship["default"];
+
+ ManyRelationship.prototype.destroy = function () {
+ this.manyArray.destroy();
+ };
+
+ ManyRelationship.prototype._super$updateMeta = _emberDataPrivateSystemRelationshipsStateRelationship["default"].prototype.updateMeta;
+ ManyRelationship.prototype.updateMeta = function (meta) {
+ this._super$updateMeta(meta);
+ this.manyArray.set('meta', meta);
+ };
+
+ ManyRelationship.prototype._super$addCanonicalRecord = _emberDataPrivateSystemRelationshipsStateRelationship["default"].prototype.addCanonicalRecord;
+ ManyRelationship.prototype.addCanonicalRecord = function (record, idx) {
+ if (this.canonicalMembers.has(record)) {
+ return;
+ }
+ if (idx !== undefined) {
+ this.canonicalState.splice(idx, 0, record);
+ } else {
+ this.canonicalState.push(record);
+ }
+ this._super$addCanonicalRecord(record, idx);
+ };
+
+ ManyRelationship.prototype._super$addRecord = _emberDataPrivateSystemRelationshipsStateRelationship["default"].prototype.addRecord;
+ ManyRelationship.prototype.addRecord = function (record, idx) {
+ if (this.members.has(record)) {
+ return;
+ }
+ this._super$addRecord(record, idx);
+ this.manyArray.internalAddRecords([record], idx);
+ };
+
+ ManyRelationship.prototype._super$removeCanonicalRecordFromOwn = _emberDataPrivateSystemRelationshipsStateRelationship["default"].prototype.removeCanonicalRecordFromOwn;
+ ManyRelationship.prototype.removeCanonicalRecordFromOwn = function (record, idx) {
+ var i = idx;
+ if (!this.canonicalMembers.has(record)) {
+ return;
+ }
+ if (i === undefined) {
+ i = this.canonicalState.indexOf(record);
+ }
+ if (i > -1) {
+ this.canonicalState.splice(i, 1);
+ }
+ this._super$removeCanonicalRecordFromOwn(record, idx);
+ };
+
+ ManyRelationship.prototype._super$flushCanonical = _emberDataPrivateSystemRelationshipsStateRelationship["default"].prototype.flushCanonical;
+ ManyRelationship.prototype.flushCanonical = function () {
+ this.manyArray.flushCanonical();
+ this._super$flushCanonical();
+ };
+
+ ManyRelationship.prototype._super$removeRecordFromOwn = _emberDataPrivateSystemRelationshipsStateRelationship["default"].prototype.removeRecordFromOwn;
+ ManyRelationship.prototype.removeRecordFromOwn = function (record, idx) {
+ if (!this.members.has(record)) {
+ return;
+ }
+ this._super$removeRecordFromOwn(record, idx);
+ if (idx !== undefined) {
+ //TODO(Igor) not used currently, fix
+ this.manyArray.currentState.removeAt(idx);
+ } else {
+ this.manyArray.internalRemoveRecords([record]);
+ }
+ };
+
+ ManyRelationship.prototype.notifyRecordRelationshipAdded = function (record, idx) {
+ (0, _emberDataPrivateDebug.assertPolymorphicType)(this.record, this.relationshipMeta, record);
+
+ this.record.notifyHasManyAdded(this.key, record, idx);
+ };
+
+ ManyRelationship.prototype.reload = function () {
+ var _this = this;
+
+ var manyArrayLoadedState = this.manyArray.get('isLoaded');
+
+ if (this._loadingPromise) {
+ if (this._loadingPromise.get('isPending')) {
+ return this._loadingPromise;
+ }
+ if (this._loadingPromise.get('isRejected')) {
+ this.manyArray.set('isLoaded', manyArrayLoadedState);
+ }
+ }
+
+ if (this.link) {
+ this._loadingPromise = (0, _emberDataPrivateSystemPromiseProxies.promiseManyArray)(this.fetchLink(), 'Reload with link');
+ return this._loadingPromise;
+ } else {
+ this._loadingPromise = (0, _emberDataPrivateSystemPromiseProxies.promiseManyArray)(this.store.scheduleFetchMany(this.manyArray.toArray()).then(function () {
+ return _this.manyArray;
+ }), 'Reload with ids');
+ return this._loadingPromise;
+ }
+ };
+
+ ManyRelationship.prototype.computeChanges = function (records) {
+ var members = this.canonicalMembers;
+ var recordsToRemove = [];
+ var length;
+ var record;
+ var i;
+
+ records = setForArray(records);
+
+ members.forEach(function (member) {
+ if (records.has(member)) {
+ return;
+ }
+
+ recordsToRemove.push(member);
+ });
+
+ this.removeCanonicalRecords(recordsToRemove);
+
+ // Using records.toArray() since currently using
+ // removeRecord can modify length, messing stuff up
+ // forEach since it directly looks at "length" each
+ // iteration
+ records = records.toArray();
+ length = records.length;
+ for (i = 0; i < length; i++) {
+ record = records[i];
+ this.removeCanonicalRecord(record);
+ this.addCanonicalRecord(record, i);
+ }
+ };
+
+ ManyRelationship.prototype.fetchLink = function () {
+ var _this2 = this;
+
+ return this.store.findHasMany(this.record, this.link, this.relationshipMeta).then(function (records) {
+ if (records.hasOwnProperty('meta')) {
+ _this2.updateMeta(records.meta);
+ }
+ _this2.store._backburner.join(function () {
+ _this2.updateRecordsFromAdapter(records);
+ _this2.manyArray.set('isLoaded', true);
+ });
+ return _this2.manyArray;
+ });
+ };
+
+ ManyRelationship.prototype.findRecords = function () {
+ var _this3 = this;
+
+ var manyArray = this.manyArray.toArray();
+ var internalModels = new Array(manyArray.length);
+
+ for (var i = 0; i < manyArray.length; i++) {
+ internalModels[i] = manyArray[i]._internalModel;
+ }
+
+ //TODO CLEANUP
+ return this.store.findMany(internalModels).then(function () {
+ if (!_this3.manyArray.get('isDestroyed')) {
+ //Goes away after the manyArray refactor
+ _this3.manyArray.set('isLoaded', true);
+ }
+ return _this3.manyArray;
+ });
+ };
+ ManyRelationship.prototype.notifyHasManyChanged = function () {
+ this.record.notifyHasManyAdded(this.key);
+ };
+
+ ManyRelationship.prototype.getRecords = function () {
+ var _this4 = this;
+
+ //TODO(Igor) sync server here, once our syncing is not stupid
+ if (this.isAsync) {
+ var promise;
+ if (this.link) {
+ if (this.hasLoaded) {
+ promise = this.findRecords();
+ } else {
+ promise = this.findLink().then(function () {
+ return _this4.findRecords();
+ });
+ }
+ } else {
+ promise = this.findRecords();
+ }
+ this._loadingPromise = _emberDataPrivateSystemPromiseProxies.PromiseManyArray.create({
+ content: this.manyArray,
+ promise: promise
+ });
+ return this._loadingPromise;
+ } else {
+ (0, _emberDataPrivateDebug.assert)("You looked up the '" + this.key + "' relationship on a '" + this.record.type.modelName + "' with id " + this.record.id + " but some of the associated records were not loaded. Either make sure they are all loaded together with the parent record, or specify that the relationship is async (`DS.hasMany({ async: true })`)", this.manyArray.isEvery('isEmpty', false));
+
+ //TODO(Igor) WTF DO I DO HERE?
+ if (!this.manyArray.get('isDestroyed')) {
+ this.manyArray.set('isLoaded', true);
+ }
+ return this.manyArray;
+ }
+ };
+
+ function setForArray(array) {
+ var set = new _emberDataPrivateSystemOrderedSet["default"]();
+
+ if (array) {
+ for (var i = 0, l = array.length; i < l; i++) {
+ set.add(array[i]);
+ }
+ }
+
+ return set;
+ }
+});
+define("ember-data/-private/system/relationships/state/relationship", ["exports", "ember", "ember-data/-private/debug", "ember-data/-private/system/ordered-set"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateSystemOrderedSet) {
+ "use strict";
+
+ exports["default"] = Relationship;
+
+ function Relationship(store, record, inverseKey, relationshipMeta) {
+ var async = relationshipMeta.options.async;
+ this.members = new _emberDataPrivateSystemOrderedSet["default"]();
+ this.canonicalMembers = new _emberDataPrivateSystemOrderedSet["default"]();
+ this.store = store;
+ this.key = relationshipMeta.key;
+ this.inverseKey = inverseKey;
+ this.record = record;
+ this.isAsync = typeof async === 'undefined' ? true : async;
+ this.relationshipMeta = relationshipMeta;
+ //This probably breaks for polymorphic relationship in complex scenarios, due to
+ //multiple possible modelNames
+ this.inverseKeyForImplicit = this.record.constructor.modelName + this.key;
+ this.linkPromise = null;
+ this.meta = null;
+ this.hasData = false;
+ this.hasLoaded = false;
+ }
+
+ Relationship.prototype = {
+ constructor: Relationship,
+
+ destroy: _ember["default"].K,
+
+ updateMeta: function updateMeta(meta) {
+ this.meta = meta;
+ },
+
+ clear: function clear() {
+ var members = this.members.list;
+ var member;
+
+ while (members.length > 0) {
+ member = members[0];
+ this.removeRecord(member);
+ }
+ },
+
+ removeRecords: function removeRecords(records) {
+ var _this = this;
+
+ records.forEach(function (record) {
+ return _this.removeRecord(record);
+ });
+ },
+
+ addRecords: function addRecords(records, idx) {
+ var _this2 = this;
+
+ records.forEach(function (record) {
+ _this2.addRecord(record, idx);
+ if (idx !== undefined) {
+ idx++;
+ }
+ });
+ },
+
+ addCanonicalRecords: function addCanonicalRecords(records, idx) {
+ for (var i = 0; i < records.length; i++) {
+ if (idx !== undefined) {
+ this.addCanonicalRecord(records[i], i + idx);
+ } else {
+ this.addCanonicalRecord(records[i]);
+ }
+ }
+ },
+
+ addCanonicalRecord: function addCanonicalRecord(record, idx) {
+ if (!this.canonicalMembers.has(record)) {
+ this.canonicalMembers.add(record);
+ if (this.inverseKey) {
+ record._relationships.get(this.inverseKey).addCanonicalRecord(this.record);
+ } else {
+ if (!record._implicitRelationships[this.inverseKeyForImplicit]) {
+ record._implicitRelationships[this.inverseKeyForImplicit] = new Relationship(this.store, record, this.key, { options: {} });
+ }
+ record._implicitRelationships[this.inverseKeyForImplicit].addCanonicalRecord(this.record);
+ }
+ }
+ this.flushCanonicalLater();
+ this.setHasData(true);
+ },
+
+ removeCanonicalRecords: function removeCanonicalRecords(records, idx) {
+ for (var i = 0; i < records.length; i++) {
+ if (idx !== undefined) {
+ this.removeCanonicalRecord(records[i], i + idx);
+ } else {
+ this.removeCanonicalRecord(records[i]);
+ }
+ }
+ },
+
+ removeCanonicalRecord: function removeCanonicalRecord(record, idx) {
+ if (this.canonicalMembers.has(record)) {
+ this.removeCanonicalRecordFromOwn(record);
+ if (this.inverseKey) {
+ this.removeCanonicalRecordFromInverse(record);
+ } else {
+ if (record._implicitRelationships[this.inverseKeyForImplicit]) {
+ record._implicitRelationships[this.inverseKeyForImplicit].removeCanonicalRecord(this.record);
+ }
+ }
+ }
+ this.flushCanonicalLater();
+ },
+
+ addRecord: function addRecord(record, idx) {
+ if (!this.members.has(record)) {
+ this.members.addWithIndex(record, idx);
+ this.notifyRecordRelationshipAdded(record, idx);
+ if (this.inverseKey) {
+ record._relationships.get(this.inverseKey).addRecord(this.record);
+ } else {
+ if (!record._implicitRelationships[this.inverseKeyForImplicit]) {
+ record._implicitRelationships[this.inverseKeyForImplicit] = new Relationship(this.store, record, this.key, { options: {} });
+ }
+ record._implicitRelationships[this.inverseKeyForImplicit].addRecord(this.record);
+ }
+ this.record.updateRecordArraysLater();
+ }
+ this.setHasData(true);
+ },
+
+ removeRecord: function removeRecord(record) {
+ if (this.members.has(record)) {
+ this.removeRecordFromOwn(record);
+ if (this.inverseKey) {
+ this.removeRecordFromInverse(record);
+ } else {
+ if (record._implicitRelationships[this.inverseKeyForImplicit]) {
+ record._implicitRelationships[this.inverseKeyForImplicit].removeRecord(this.record);
+ }
+ }
+ }
+ },
+
+ removeRecordFromInverse: function removeRecordFromInverse(record) {
+ var inverseRelationship = record._relationships.get(this.inverseKey);
+ //Need to check for existence, as the record might unloading at the moment
+ if (inverseRelationship) {
+ inverseRelationship.removeRecordFromOwn(this.record);
+ }
+ },
+
+ removeRecordFromOwn: function removeRecordFromOwn(record) {
+ this.members["delete"](record);
+ this.notifyRecordRelationshipRemoved(record);
+ this.record.updateRecordArrays();
+ },
+
+ removeCanonicalRecordFromInverse: function removeCanonicalRecordFromInverse(record) {
+ var inverseRelationship = record._relationships.get(this.inverseKey);
+ //Need to check for existence, as the record might unloading at the moment
+ if (inverseRelationship) {
+ inverseRelationship.removeCanonicalRecordFromOwn(this.record);
+ }
+ },
+
+ removeCanonicalRecordFromOwn: function removeCanonicalRecordFromOwn(record) {
+ this.canonicalMembers["delete"](record);
+ this.flushCanonicalLater();
+ },
+
+ flushCanonical: function flushCanonical() {
+ this.willSync = false;
+ //a hack for not removing new records
+ //TODO remove once we have proper diffing
+ var newRecords = [];
+ for (var i = 0; i < this.members.list.length; i++) {
+ if (this.members.list[i].isNew()) {
+ newRecords.push(this.members.list[i]);
+ }
+ }
+ //TODO(Igor) make this less abysmally slow
+ this.members = this.canonicalMembers.copy();
+ for (i = 0; i < newRecords.length; i++) {
+ this.members.add(newRecords[i]);
+ }
+ },
+
+ flushCanonicalLater: function flushCanonicalLater() {
+ var _this3 = this;
+
+ if (this.willSync) {
+ return;
+ }
+ this.willSync = true;
+ this.store._backburner.join(function () {
+ return _this3.store._backburner.schedule('syncRelationships', _this3, _this3.flushCanonical);
+ });
+ },
+
+ updateLink: function updateLink(link) {
+ (0, _emberDataPrivateDebug.warn)("You have pushed a record of type '" + this.record.type.modelName + "' with '" + this.key + "' as a link, but the association is not an async relationship.", this.isAsync, {
+ id: 'ds.store.push-link-for-sync-relationship'
+ });
+ (0, _emberDataPrivateDebug.assert)("You have pushed a record of type '" + this.record.type.modelName + "' with '" + this.key + "' as a link, but the value of that link is not a string.", typeof link === 'string' || link === null);
+ if (link !== this.link) {
+ this.link = link;
+ this.linkPromise = null;
+ this.setHasLoaded(false);
+ this.record.notifyPropertyChange(this.key);
+ }
+ },
+
+ findLink: function findLink() {
+ if (this.linkPromise) {
+ return this.linkPromise;
+ } else {
+ var promise = this.fetchLink();
+ this.linkPromise = promise;
+ return promise.then(function (result) {
+ return result;
+ });
+ }
+ },
+
+ updateRecordsFromAdapter: function updateRecordsFromAdapter(records) {
+ //TODO(Igor) move this to a proper place
+ //TODO Once we have adapter support, we need to handle updated and canonical changes
+ this.computeChanges(records);
+ this.setHasData(true);
+ this.setHasLoaded(true);
+ },
+
+ notifyRecordRelationshipAdded: _ember["default"].K,
+ notifyRecordRelationshipRemoved: _ember["default"].K,
+
+ /*
+ `hasData` for a relationship is a flag to indicate if we consider the
+ content of this relationship "known". Snapshots uses this to tell the
+ difference between unknown (`undefined`) or empty (`null`). The reason for
+ this is that we wouldn't want to serialize unknown relationships as `null`
+ as that might overwrite remote state.
+ All relationships for a newly created (`store.createRecord()`) are
+ considered known (`hasData === true`).
+ */
+ setHasData: function setHasData(value) {
+ this.hasData = value;
+ },
+
+ /*
+ `hasLoaded` is a flag to indicate if we have gotten data from the adapter or
+ not when the relationship has a link.
+ This is used to be able to tell when to fetch the link and when to return
+ the local data in scenarios where the local state is considered known
+ (`hasData === true`).
+ Updating the link will automatically set `hasLoaded` to `false`.
+ */
+ setHasLoaded: function setHasLoaded(value) {
+ this.hasLoaded = value;
+ }
+ };
+});
+define('ember-data/-private/system/snapshot-record-array', ['exports'], function (exports) {
+ 'use strict';
+
+ exports['default'] = SnapshotRecordArray;
+
+ /**
+ @module ember-data
+ */
+
+ /**
+ @class SnapshotRecordArray
+ @namespace DS
+ @private
+ @constructor
+ @param {Array} snapshots An array of snapshots
+ @param {Object} meta
+ */
+ function SnapshotRecordArray(recordArray, meta) {
+ var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
+
+ /**
+ An array of snapshots
+ @private
+ @property _snapshots
+ @type {Array}
+ */
+ this._snapshots = null;
+ /**
+ An array of records
+ @private
+ @property _recordArray
+ @type {Array}
+ */
+ this._recordArray = recordArray;
+ /**
+ Number of records in the array
+ @property length
+ @type {Number}
+ */
+ this.length = recordArray.get('length');
+ /**
+ The type of the underlying records for the snapshots in the array, as a DS.Model
+ @property type
+ @type {DS.Model}
+ */
+ this.type = recordArray.get('type');
+ /**
+ Meta object
+ @property meta
+ @type {Object}
+ */
+ this.meta = meta;
+ /**
+ A hash of adapter options
+ @property adapterOptions
+ @type {Object}
+ */
+ this.adapterOptions = options.adapterOptions;
+
+ this.include = options.include;
+ }
+
+ /**
+ Get snapshots of the underlying record array
+ @method snapshots
+ @return {Array} Array of snapshots
+ */
+ SnapshotRecordArray.prototype.snapshots = function () {
+ if (this._snapshots) {
+ return this._snapshots;
+ }
+ var recordArray = this._recordArray;
+ this._snapshots = recordArray.invoke('createSnapshot');
+
+ return this._snapshots;
+ };
+});
+define("ember-data/-private/system/snapshot", ["exports", "ember", "ember-data/-private/system/empty-object"], function (exports, _ember, _emberDataPrivateSystemEmptyObject) {
+ "use strict";
+
+ exports["default"] = Snapshot;
+
+ /**
+ @module ember-data
+ */
+
+ var get = _ember["default"].get;
+
+ /**
+ @class Snapshot
+ @namespace DS
+ @private
+ @constructor
+ @param {DS.Model} internalModel The model to create a snapshot from
+ */
+ function Snapshot(internalModel) {
+ var _this = this;
+
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
+
+ this._attributes = new _emberDataPrivateSystemEmptyObject["default"]();
+ this._belongsToRelationships = new _emberDataPrivateSystemEmptyObject["default"]();
+ this._belongsToIds = new _emberDataPrivateSystemEmptyObject["default"]();
+ this._hasManyRelationships = new _emberDataPrivateSystemEmptyObject["default"]();
+ this._hasManyIds = new _emberDataPrivateSystemEmptyObject["default"]();
+
+ var record = internalModel.getRecord();
+ this.record = record;
+ record.eachAttribute(function (keyName) {
+ return _this._attributes[keyName] = get(record, keyName);
+ });
+
+ this.id = internalModel.id;
+ this._internalModel = internalModel;
+ this.type = internalModel.type;
+ this.modelName = internalModel.type.modelName;
+
+ /**
+ A hash of adapter options
+ @property adapterOptions
+ @type {Object}
+ */
+ this.adapterOptions = options.adapterOptions;
+
+ this.include = options.include;
+
+ this._changedAttributes = record.changedAttributes();
+ }
+
+ Snapshot.prototype = {
+ constructor: Snapshot,
+
+ /**
+ The id of the snapshot's underlying record
+ Example
+ ```javascript
+ // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });
+ postSnapshot.id; // => '1'
+ ```
+ @property id
+ @type {String}
+ */
+ id: null,
+
+ /**
+ The underlying record for this snapshot. Can be used to access methods and
+ properties defined on the record.
+ Example
+ ```javascript
+ var json = snapshot.record.toJSON();
+ ```
+ @property record
+ @type {DS.Model}
+ */
+ record: null,
+
+ /**
+ The type of the underlying record for this snapshot, as a DS.Model.
+ @property type
+ @type {DS.Model}
+ */
+ type: null,
+
+ /**
+ The name of the type of the underlying record for this snapshot, as a string.
+ @property modelName
+ @type {String}
+ */
+ modelName: null,
+
+ /**
+ Returns the value of an attribute.
+ Example
+ ```javascript
+ // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });
+ postSnapshot.attr('author'); // => 'Tomster'
+ postSnapshot.attr('title'); // => 'Ember.js rocks'
+ ```
+ Note: Values are loaded eagerly and cached when the snapshot is created.
+ @method attr
+ @param {String} keyName
+ @return {Object} The attribute value or undefined
+ */
+ attr: function attr(keyName) {
+ if (keyName in this._attributes) {
+ return this._attributes[keyName];
+ }
+ throw new _ember["default"].Error("Model '" + _ember["default"].inspect(this.record) + "' has no attribute named '" + keyName + "' defined.");
+ },
+
+ /**
+ Returns all attributes and their corresponding values.
+ Example
+ ```javascript
+ // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });
+ postSnapshot.attributes(); // => { author: 'Tomster', title: 'Ember.js rocks' }
+ ```
+ @method attributes
+ @return {Object} All attributes of the current snapshot
+ */
+ attributes: function attributes() {
+ return _ember["default"].copy(this._attributes);
+ },
+
+ /**
+ Returns all changed attributes and their old and new values.
+ Example
+ ```javascript
+ // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });
+ postModel.set('title', 'Ember.js rocks!');
+ postSnapshot.changedAttributes(); // => { title: ['Ember.js rocks', 'Ember.js rocks!'] }
+ ```
+ @method changedAttributes
+ @return {Object} All changed attributes of the current snapshot
+ */
+ changedAttributes: function changedAttributes() {
+ var changedAttributes = new _emberDataPrivateSystemEmptyObject["default"]();
+ var changedAttributeKeys = Object.keys(this._changedAttributes);
+
+ for (var i = 0, _length = changedAttributeKeys.length; i < _length; i++) {
+ var key = changedAttributeKeys[i];
+ changedAttributes[key] = _ember["default"].copy(this._changedAttributes[key]);
+ }
+
+ return changedAttributes;
+ },
+
+ /**
+ Returns the current value of a belongsTo relationship.
+ `belongsTo` takes an optional hash of options as a second parameter,
+ currently supported options are:
+ - `id`: set to `true` if you only want the ID of the related record to be
+ returned.
+ Example
+ ```javascript
+ // store.push('post', { id: 1, title: 'Hello World' });
+ // store.createRecord('comment', { body: 'Lorem ipsum', post: post });
+ commentSnapshot.belongsTo('post'); // => DS.Snapshot
+ commentSnapshot.belongsTo('post', { id: true }); // => '1'
+ // store.push('comment', { id: 1, body: 'Lorem ipsum' });
+ commentSnapshot.belongsTo('post'); // => undefined
+ ```
+ Calling `belongsTo` will return a new Snapshot as long as there's any known
+ data for the relationship available, such as an ID. If the relationship is
+ known but unset, `belongsTo` will return `null`. If the contents of the
+ relationship is unknown `belongsTo` will return `undefined`.
+ Note: Relationships are loaded lazily and cached upon first access.
+ @method belongsTo
+ @param {String} keyName
+ @param {Object} [options]
+ @return {(DS.Snapshot|String|null|undefined)} A snapshot or ID of a known
+ relationship or null if the relationship is known but unset. undefined
+ will be returned if the contents of the relationship is unknown.
+ */
+ belongsTo: function belongsTo(keyName, options) {
+ var id = options && options.id;
+ var relationship, inverseRecord, hasData;
+ var result;
+
+ if (id && keyName in this._belongsToIds) {
+ return this._belongsToIds[keyName];
+ }
+
+ if (!id && keyName in this._belongsToRelationships) {
+ return this._belongsToRelationships[keyName];
+ }
+
+ relationship = this._internalModel._relationships.get(keyName);
+ if (!(relationship && relationship.relationshipMeta.kind === 'belongsTo')) {
+ throw new _ember["default"].Error("Model '" + _ember["default"].inspect(this.record) + "' has no belongsTo relationship named '" + keyName + "' defined.");
+ }
+
+ hasData = get(relationship, 'hasData');
+ inverseRecord = get(relationship, 'inverseRecord');
+
+ if (hasData) {
+ if (inverseRecord && !inverseRecord.isDeleted()) {
+ if (id) {
+ result = get(inverseRecord, 'id');
+ } else {
+ result = inverseRecord.createSnapshot();
+ }
+ } else {
+ result = null;
+ }
+ }
+
+ if (id) {
+ this._belongsToIds[keyName] = result;
+ } else {
+ this._belongsToRelationships[keyName] = result;
+ }
+
+ return result;
+ },
+
+ /**
+ Returns the current value of a hasMany relationship.
+ `hasMany` takes an optional hash of options as a second parameter,
+ currently supported options are:
+ - `ids`: set to `true` if you only want the IDs of the related records to be
+ returned.
+ Example
+ ```javascript
+ // store.push('post', { id: 1, title: 'Hello World', comments: [2, 3] });
+ postSnapshot.hasMany('comments'); // => [DS.Snapshot, DS.Snapshot]
+ postSnapshot.hasMany('comments', { ids: true }); // => ['2', '3']
+ // store.push('post', { id: 1, title: 'Hello World' });
+ postSnapshot.hasMany('comments'); // => undefined
+ ```
+ Note: Relationships are loaded lazily and cached upon first access.
+ @method hasMany
+ @param {String} keyName
+ @param {Object} [options]
+ @return {(Array|undefined)} An array of snapshots or IDs of a known
+ relationship or an empty array if the relationship is known but unset.
+ undefined will be returned if the contents of the relationship is unknown.
+ */
+ hasMany: function hasMany(keyName, options) {
+ var ids = options && options.ids;
+ var relationship, members, hasData;
+ var results;
+
+ if (ids && keyName in this._hasManyIds) {
+ return this._hasManyIds[keyName];
+ }
+
+ if (!ids && keyName in this._hasManyRelationships) {
+ return this._hasManyRelationships[keyName];
+ }
+
+ relationship = this._internalModel._relationships.get(keyName);
+ if (!(relationship && relationship.relationshipMeta.kind === 'hasMany')) {
+ throw new _ember["default"].Error("Model '" + _ember["default"].inspect(this.record) + "' has no hasMany relationship named '" + keyName + "' defined.");
+ }
+
+ hasData = get(relationship, 'hasData');
+ members = get(relationship, 'members');
+
+ if (hasData) {
+ results = [];
+ members.forEach(function (member) {
+ if (!member.isDeleted()) {
+ if (ids) {
+ results.push(member.id);
+ } else {
+ results.push(member.createSnapshot());
+ }
+ }
+ });
+ }
+
+ if (ids) {
+ this._hasManyIds[keyName] = results;
+ } else {
+ this._hasManyRelationships[keyName] = results;
+ }
+
+ return results;
+ },
+
+ /**
+ Iterates through all the attributes of the model, calling the passed
+ function on each attribute.
+ Example
+ ```javascript
+ snapshot.eachAttribute(function(name, meta) {
+ // ...
+ });
+ ```
+ @method eachAttribute
+ @param {Function} callback the callback to execute
+ @param {Object} [binding] the value to which the callback's `this` should be bound
+ */
+ eachAttribute: function eachAttribute(callback, binding) {
+ this.record.eachAttribute(callback, binding);
+ },
+
+ /**
+ Iterates through all the relationships of the model, calling the passed
+ function on each relationship.
+ Example
+ ```javascript
+ snapshot.eachRelationship(function(name, relationship) {
+ // ...
+ });
+ ```
+ @method eachRelationship
+ @param {Function} callback the callback to execute
+ @param {Object} [binding] the value to which the callback's `this` should be bound
+ */
+ eachRelationship: function eachRelationship(callback, binding) {
+ this.record.eachRelationship(callback, binding);
+ },
+
+ /**
+ @method serialize
+ @param {Object} options
+ @return {Object} an object whose values are primitive JSON values only
+ */
+ serialize: function serialize(options) {
+ return this.record.store.serializerFor(this.modelName).serialize(this, options);
+ }
+ };
+});
+define('ember-data/-private/system/store', ['exports', 'ember', 'ember-data/model', 'ember-data/-private/debug', 'ember-data/-private/system/normalize-link', 'ember-data/-private/system/normalize-model-name', 'ember-data/adapters/errors', 'ember-data/-private/system/promise-proxies', 'ember-data/-private/system/store/common', 'ember-data/-private/system/store/serializer-response', 'ember-data/-private/system/store/serializers', 'ember-data/-private/system/store/finders', 'ember-data/-private/utils', 'ember-data/-private/system/coerce-id', 'ember-data/-private/system/record-array-manager', 'ember-data/-private/system/store/container-instance-cache', 'ember-data/-private/system/model/internal-model', 'ember-data/-private/system/empty-object', 'ember-data/-private/features'], function (exports, _ember, _emberDataModel, _emberDataPrivateDebug, _emberDataPrivateSystemNormalizeLink, _emberDataPrivateSystemNormalizeModelName, _emberDataAdaptersErrors, _emberDataPrivateSystemPromiseProxies, _emberDataPrivateSystemStoreCommon, _emberDataPrivateSystemStoreSerializerResponse, _emberDataPrivateSystemStoreSerializers, _emberDataPrivateSystemStoreFinders, _emberDataPrivateUtils, _emberDataPrivateSystemCoerceId, _emberDataPrivateSystemRecordArrayManager, _emberDataPrivateSystemStoreContainerInstanceCache, _emberDataPrivateSystemModelInternalModel, _emberDataPrivateSystemEmptyObject, _emberDataPrivateFeatures) {
+ /**
+ @module ember-data
+ */
+
+ 'use strict';
+
+ var badIdFormatAssertion = '`id` passed to `findRecord()` has to be non-empty string or number';
+
+ exports.badIdFormatAssertion = badIdFormatAssertion;
+
+ var Backburner = _ember['default']._Backburner;
+ var Map = _ember['default'].Map;
+
+ //Get the materialized model from the internalModel/promise that returns
+ //an internal model and return it in a promiseObject. Useful for returning
+ //from find methods
+ function promiseRecord(internalModel, label) {
+ var toReturn = internalModel.then(function (model) {
+ return model.getRecord();
+ });
+ return (0, _emberDataPrivateSystemPromiseProxies.promiseObject)(toReturn, label);
+ }
+
+ var get = _ember['default'].get;
+ var set = _ember['default'].set;
+ var once = _ember['default'].run.once;
+ var isNone = _ember['default'].isNone;
+ var isPresent = _ember['default'].isPresent;
+ var Promise = _ember['default'].RSVP.Promise;
+ var copy = _ember['default'].copy;
+ var Store;
+
+ var Service = _ember['default'].Service;
+
+ // Implementors Note:
+ //
+ // The variables in this file are consistently named according to the following
+ // scheme:
+ //
+ // * +id+ means an identifier managed by an external source, provided inside
+ // the data provided by that source. These are always coerced to be strings
+ // before being used internally.
+ // * +clientId+ means a transient numerical identifier generated at runtime by
+ // the data store. It is important primarily because newly created objects may
+ // not yet have an externally generated id.
+ // * +internalModel+ means a record internalModel object, which holds metadata about a
+ // record, even if it has not yet been fully materialized.
+ // * +type+ means a DS.Model.
+
+ /**
+ The store contains all of the data for records loaded from the server.
+ It is also responsible for creating instances of `DS.Model` that wrap
+ the individual data for a record, so that they can be bound to in your
+ Handlebars templates.
+
+ Define your application's store like this:
+
+ ```app/services/store.js
+ import DS from 'ember-data';
+
+ export default DS.Store.extend({
+ });
+ ```
+
+ Most Ember.js applications will only have a single `DS.Store` that is
+ automatically created by their `Ember.Application`.
+
+ You can retrieve models from the store in several ways. To retrieve a record
+ for a specific id, use `DS.Store`'s `findRecord()` method:
+
+ ```javascript
+ store.findRecord('person', 123).then(function (person) {
+ });
+ ```
+
+ By default, the store will talk to your backend using a standard
+ REST mechanism. You can customize how the store talks to your
+ backend by specifying a custom adapter:
+
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+
+ export default DS.Adapter.extend({
+ });
+ ```
+
+ You can learn more about writing a custom adapter by reading the `DS.Adapter`
+ documentation.
+
+ ### Store createRecord() vs. push() vs. pushPayload()
+
+ The store provides multiple ways to create new record objects. They have
+ some subtle differences in their use which are detailed below:
+
+ [createRecord](#method_createRecord) is used for creating new
+ records on the client side. This will return a new record in the
+ `created.uncommitted` state. In order to persist this record to the
+ backend you will need to call `record.save()`.
+
+ [push](#method_push) is used to notify Ember Data's store of new or
+ updated records that exist in the backend. This will return a record
+ in the `loaded.saved` state. The primary use-case for `store#push` is
+ to notify Ember Data about record updates (full or partial) that happen
+ outside of the normal adapter methods (for example
+ [SSE](http://dev.w3.org/html5/eventsource/) or [Web
+ Sockets](http://www.w3.org/TR/2009/WD-websockets-20091222/)).
+
+ [pushPayload](#method_pushPayload) is a convenience wrapper for
+ `store#push` that will deserialize payloads if the
+ Serializer implements a `pushPayload` method.
+
+ Note: When creating a new record using any of the above methods
+ Ember Data will update `DS.RecordArray`s such as those returned by
+ `store#peekAll()`, `store#findAll()` or `store#filter()`. This means any
+ data bindings or computed properties that depend on the RecordArray
+ will automatically be synced to include the new or updated record
+ values.
+
+ @class Store
+ @namespace DS
+ @extends Ember.Service
+ */
+ exports.Store = Store = Service.extend({
+
+ /**
+ @method init
+ @private
+ */
+ init: function init() {
+ this._super.apply(this, arguments);
+ this._backburner = new Backburner(['normalizeRelationships', 'syncRelationships', 'finished']);
+ // internal bookkeeping; not observable
+ this.typeMaps = {};
+ this.recordArrayManager = _emberDataPrivateSystemRecordArrayManager['default'].create({
+ store: this
+ });
+ this._pendingSave = [];
+ this._instanceCache = new _emberDataPrivateSystemStoreContainerInstanceCache['default']((0, _emberDataPrivateUtils.getOwner)(this));
+ //Used to keep track of all the find requests that need to be coalesced
+ this._pendingFetch = Map.create();
+ },
+
+ /**
+ The adapter to use to communicate to a backend server or other persistence layer.
+ This can be specified as an instance, class, or string.
+ If you want to specify `app/adapters/custom.js` as a string, do:
+ ```js
+ adapter: 'custom'
+ ```
+ @property adapter
+ @default DS.JSONAPIAdapter
+ @type {(DS.Adapter|String)}
+ */
+ adapter: '-json-api',
+
+ /**
+ Returns a JSON representation of the record using a custom
+ type-specific serializer, if one exists.
+ The available options are:
+ * `includeId`: `true` if the record's ID should be included in
+ the JSON representation
+ @method serialize
+ @private
+ @param {DS.Model} record the record to serialize
+ @param {Object} options an options hash
+ */
+ serialize: function serialize(record, options) {
+ var snapshot = record._internalModel.createSnapshot();
+ return snapshot.serialize(options);
+ },
+
+ /**
+ This property returns the adapter, after resolving a possible
+ string key.
+ If the supplied `adapter` was a class, or a String property
+ path resolved to a class, this property will instantiate the
+ class.
+ This property is cacheable, so the same instance of a specified
+ adapter class should be used for the lifetime of the store.
+ @property defaultAdapter
+ @private
+ @return DS.Adapter
+ */
+ defaultAdapter: _ember['default'].computed('adapter', function () {
+ var adapter = get(this, 'adapter');
+
+ (0, _emberDataPrivateDebug.assert)('You tried to set `adapter` property to an instance of `DS.Adapter`, where it should be a name', typeof adapter === 'string');
+
+ adapter = this.retrieveManagedInstance('adapter', adapter);
+
+ return adapter;
+ }),
+
+ // .....................
+ // . CREATE NEW RECORD .
+ // .....................
+
+ /**
+ Create a new record in the current store. The properties passed
+ to this method are set on the newly created record.
+ To create a new instance of a `Post`:
+ ```js
+ store.createRecord('post', {
+ title: "Rails is omakase"
+ });
+ ```
+ To create a new instance of a `Post` that has a relationship with a `User` record:
+ ```js
+ var user = this.store.peekRecord('user', 1);
+ store.createRecord('post', {
+ title: "Rails is omakase",
+ user: user
+ });
+ ```
+ @method createRecord
+ @param {String} modelName
+ @param {Object} inputProperties a hash of properties to set on the
+ newly created record.
+ @return {DS.Model} record
+ */
+ createRecord: function createRecord(modelName, inputProperties) {
+ (0, _emberDataPrivateDebug.assert)("You need to pass a model name to the store's createRecord method", isPresent(modelName));
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+ var typeClass = this.modelFor(modelName);
+ var properties = copy(inputProperties) || new _emberDataPrivateSystemEmptyObject['default']();
+
+ // If the passed properties do not include a primary key,
+ // give the adapter an opportunity to generate one. Typically,
+ // client-side ID generators will use something like uuid.js
+ // to avoid conflicts.
+
+ if (isNone(properties.id)) {
+ properties.id = this._generateId(modelName, properties);
+ }
+
+ // Coerce ID to a string
+ properties.id = (0, _emberDataPrivateSystemCoerceId['default'])(properties.id);
+
+ var internalModel = this.buildInternalModel(typeClass, properties.id);
+ var record = internalModel.getRecord();
+
+ // Move the record out of its initial `empty` state into
+ // the `loaded` state.
+ internalModel.loadedData();
+
+ // Set the properties specified on the record.
+ record.setProperties(properties);
+
+ internalModel.eachRelationship(function (key, descriptor) {
+ internalModel._relationships.get(key).setHasData(true);
+ });
+
+ return record;
+ },
+
+ /**
+ If possible, this method asks the adapter to generate an ID for
+ a newly created record.
+ @method _generateId
+ @private
+ @param {String} modelName
+ @param {Object} properties from the new record
+ @return {String} if the adapter can generate one, an ID
+ */
+ _generateId: function _generateId(modelName, properties) {
+ var adapter = this.adapterFor(modelName);
+
+ if (adapter && adapter.generateIdForRecord) {
+ return adapter.generateIdForRecord(this, modelName, properties);
+ }
+
+ return null;
+ },
+
+ // .................
+ // . DELETE RECORD .
+ // .................
+
+ /**
+ For symmetry, a record can be deleted via the store.
+ Example
+ ```javascript
+ var post = store.createRecord('post', {
+ title: "Rails is omakase"
+ });
+ store.deleteRecord(post);
+ ```
+ @method deleteRecord
+ @param {DS.Model} record
+ */
+ deleteRecord: function deleteRecord(record) {
+ record.deleteRecord();
+ },
+
+ /**
+ For symmetry, a record can be unloaded via the store. Only
+ non-dirty records can be unloaded.
+ Example
+ ```javascript
+ store.findRecord('post', 1).then(function(post) {
+ store.unloadRecord(post);
+ });
+ ```
+ @method unloadRecord
+ @param {DS.Model} record
+ */
+ unloadRecord: function unloadRecord(record) {
+ record.unloadRecord();
+ },
+
+ // ................
+ // . FIND RECORDS .
+ // ................
+
+ /**
+ @method find
+ @param {String} modelName
+ @param {String|Integer} id
+ @param {Object} options
+ @return {Promise} promise
+ @private
+ */
+ find: function find(modelName, id, options) {
+ // The default `model` hook in Ember.Route calls `find(modelName, id)`,
+ // that's why we have to keep this method around even though `findRecord` is
+ // the public way to get a record by modelName and id.
+
+ if (arguments.length === 1) {
+ (0, _emberDataPrivateDebug.assert)('Using store.find(type) has been removed. Use store.findAll(type) to retrieve all records for a given type.');
+ }
+
+ if (_ember['default'].typeOf(id) === 'object') {
+ (0, _emberDataPrivateDebug.assert)('Calling store.find() with a query object is no longer supported. Use store.query() instead.');
+ }
+
+ if (options) {
+ (0, _emberDataPrivateDebug.assert)('Calling store.find(type, id, { preload: preload }) is no longer supported. Use store.findRecord(type, id, { preload: preload }) instead.');
+ }
+
+ (0, _emberDataPrivateDebug.assert)("You need to pass the model name and id to the store's find method", arguments.length === 2);
+ (0, _emberDataPrivateDebug.assert)("You cannot pass `" + _ember['default'].inspect(id) + "` as id to the store's find method", _ember['default'].typeOf(id) === 'string' || _ember['default'].typeOf(id) === 'number');
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+
+ return this.findRecord(modelName, id);
+ },
+
+ /**
+ This method returns a record for a given type and id combination.
+ The `findRecord` method will always resolve its promise with the same
+ object for a given type and `id`.
+ The `findRecord` method will always return a **promise** that will be
+ resolved with the record.
+ Example
+ ```app/routes/post.js
+ import Ember from 'ember';
+ export default Ember.Route.extend({
+ model: function(params) {
+ return this.store.findRecord('post', params.post_id);
+ }
+ });
+ ```
+ If the record is not yet available, the store will ask the adapter's `find`
+ method to find the necessary data. If the record is already present in the
+ store, it depends on the reload behavior _when_ the returned promise
+ resolves.
+ ### Reloading
+ The reload behavior is configured either via the passed `options` hash or
+ the result of the adapter's `shouldReloadRecord`.
+ If `{ reload: true }` is passed or `adapter.shouldReloadRecord` evaluates
+ to `true`, then the returned promise resolves once the adapter returns
+ data, regardless if the requested record is already in the store:
+ ```js
+ store.push({
+ data: {
+ id: 1,
+ type: 'post',
+ revision: 1
+ }
+ });
+ // adapter#findRecord resolves with
+ // [
+ // {
+ // id: 1,
+ // type: 'post',
+ // revision: 2
+ // }
+ // ]
+ store.findRecord('post', 1, { reload: true }).then(function(post) {
+ post.get("revision"); // 2
+ });
+ ```
+ If no reload is indicated via the abovementioned ways, then the promise
+ immediately resolves with the cached version in the store.
+ ### Background Reloading
+ Optionally, if `adapter.shouldBackgroundReloadRecord` evaluates to `true`,
+ then a background reload is started, which updates the records' data, once
+ it is available:
+ ```js
+ // app/adapters/post.js
+ import ApplicationAdapter from "./application";
+ export default ApplicationAdapter.extend({
+ shouldReloadRecord(store, snapshot) {
+ return false;
+ },
+ shouldBackgroundReloadRecord(store, snapshot) {
+ return true;
+ }
+ });
+ // ...
+ store.push({
+ data: {
+ id: 1,
+ type: 'post',
+ revision: 1
+ }
+ });
+ var blogPost = store.findRecord('post', 1).then(function(post) {
+ post.get('revision'); // 1
+ });
+ // later, once adapter#findRecord resolved with
+ // [
+ // {
+ // id: 1,
+ // type: 'post',
+ // revision: 2
+ // }
+ // ]
+ blogPost.get('revision'); // 2
+ ```
+ If you would like to force or prevent background reloading, you can set a
+ boolean value for `backgroundReload` in the options object for
+ `findRecord`.
+ ```app/routes/post/edit.js
+ import Ember from 'ember';
+ export default Ember.Route.extend({
+ model: function(params) {
+ return this.store.findRecord('post', params.post_id, { backgroundReload: false });
+ }
+ });
+ ```
+ If you pass an object on the `adapterOptions` property of the options
+ argument it will be passed to you adapter via the snapshot
+ ```app/routes/post/edit.js
+ import Ember from 'ember';
+ export default Ember.Route.extend({
+ model: function(params) {
+ return this.store.findRecord('post', params.post_id, {
+ adapterOptions: { subscribe: false }
+ });
+ }
+ });
+ ```
+ ```app/adapters/post.js
+ import MyCustomAdapter from './custom-adapter';
+ export default MyCustomAdapter.extend({
+ findRecord: function(store, type, id, snapshot) {
+ if (snapshot.adapterOptions.subscribe) {
+ // ...
+ }
+ // ...
+ }
+ });
+ ```
+ See [peekRecord](#method_peekRecord) to get the cached version of a record.
+ @since 1.13.0
+ @method findRecord
+ @param {String} modelName
+ @param {(String|Integer)} id
+ @param {Object} options
+ @return {Promise} promise
+ */
+ findRecord: function findRecord(modelName, id, options) {
+ (0, _emberDataPrivateDebug.assert)("You need to pass a model name to the store's findRecord method", isPresent(modelName));
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+ (0, _emberDataPrivateDebug.assert)(badIdFormatAssertion, typeof id === 'string' && id.length > 0 || typeof id === 'number' && !isNaN(id));
+
+ var internalModel = this._internalModelForId(modelName, id);
+ options = options || {};
+
+ if (!this.hasRecordForId(modelName, id)) {
+ return this._findByInternalModel(internalModel, options);
+ }
+
+ var fetchedInternalModel = this._findRecord(internalModel, options);
+
+ return promiseRecord(fetchedInternalModel, "DS: Store#findRecord " + internalModel.typeKey + " with id: " + get(internalModel, 'id'));
+ },
+
+ _findRecord: function _findRecord(internalModel, options) {
+ // Refetch if the reload option is passed
+ if (options.reload) {
+ return this.scheduleFetch(internalModel, options);
+ }
+
+ var snapshot = internalModel.createSnapshot(options);
+ var typeClass = internalModel.type;
+ var adapter = this.adapterFor(typeClass.modelName);
+
+ // Refetch the record if the adapter thinks the record is stale
+ if (adapter.shouldReloadRecord(this, snapshot)) {
+ return this.scheduleFetch(internalModel, options);
+ }
+
+ if (options.backgroundReload === false) {
+ return Promise.resolve(internalModel);
+ }
+
+ // Trigger the background refetch if backgroundReload option is passed
+ if (options.backgroundReload || adapter.shouldBackgroundReloadRecord(this, snapshot)) {
+ this.scheduleFetch(internalModel, options);
+ }
+
+ // Return the cached record
+ return Promise.resolve(internalModel);
+ },
+
+ _findByInternalModel: function _findByInternalModel(internalModel, options) {
+ options = options || {};
+
+ if (options.preload) {
+ internalModel._preloadData(options.preload);
+ }
+
+ var fetchedInternalModel = this._findEmptyInternalModel(internalModel, options);
+
+ return promiseRecord(fetchedInternalModel, "DS: Store#findRecord " + internalModel.typeKey + " with id: " + get(internalModel, 'id'));
+ },
+
+ _findEmptyInternalModel: function _findEmptyInternalModel(internalModel, options) {
+ if (internalModel.isEmpty()) {
+ return this.scheduleFetch(internalModel, options);
+ }
+
+ //TODO double check about reloading
+ if (internalModel.isLoading()) {
+ return internalModel._loadingPromise;
+ }
+
+ return Promise.resolve(internalModel);
+ },
+
+ /**
+ This method makes a series of requests to the adapter's `find` method
+ and returns a promise that resolves once they are all loaded.
+ @private
+ @method findByIds
+ @param {String} modelName
+ @param {Array} ids
+ @return {Promise} promise
+ */
+ findByIds: function findByIds(modelName, ids) {
+ (0, _emberDataPrivateDebug.assert)("You need to pass a model name to the store's findByIds method", isPresent(modelName));
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+ var promises = new Array(ids.length);
+
+ for (var i = 0; i < ids.length; i++) {
+ promises[i] = this.findRecord(modelName, ids[i]);
+ }
+
+ return (0, _emberDataPrivateSystemPromiseProxies.promiseArray)(_ember['default'].RSVP.all(promises).then(_ember['default'].A, null, "DS: Store#findByIds of " + modelName + " complete"));
+ },
+
+ /**
+ This method is called by `findRecord` if it discovers that a particular
+ type/id pair hasn't been loaded yet to kick off a request to the
+ adapter.
+ @method fetchRecord
+ @private
+ @param {InternalModel} internalModel model
+ @return {Promise} promise
+ */
+ // TODO rename this to have an underscore
+ fetchRecord: function fetchRecord(internalModel, options) {
+ var typeClass = internalModel.type;
+ var id = internalModel.id;
+ var adapter = this.adapterFor(typeClass.modelName);
+
+ (0, _emberDataPrivateDebug.assert)("You tried to find a record but you have no adapter (for " + typeClass + ")", adapter);
+ (0, _emberDataPrivateDebug.assert)("You tried to find a record but your adapter (for " + typeClass + ") does not implement 'findRecord'", typeof adapter.findRecord === 'function' || typeof adapter.find === 'function');
+
+ var promise = (0, _emberDataPrivateSystemStoreFinders._find)(adapter, this, typeClass, id, internalModel, options);
+ return promise;
+ },
+
+ scheduleFetchMany: function scheduleFetchMany(records) {
+ var internalModels = new Array(records.length);
+ var fetches = new Array(records.length);
+ for (var i = 0; i < records.length; i++) {
+ internalModels[i] = records[i]._internalModel;
+ }
+
+ for (var i = 0; i < internalModels.length; i++) {
+ fetches[i] = this.scheduleFetch(internalModels[i]);
+ }
+
+ return _ember['default'].RSVP.Promise.all(fetches);
+ },
+
+ scheduleFetch: function scheduleFetch(internalModel, options) {
+ var typeClass = internalModel.type;
+
+ if (internalModel._loadingPromise) {
+ return internalModel._loadingPromise;
+ }
+
+ var resolver = _ember['default'].RSVP.defer('Fetching ' + typeClass + 'with id: ' + internalModel.id);
+ var pendingFetchItem = {
+ record: internalModel,
+ resolver: resolver,
+ options: options
+ };
+ var promise = resolver.promise;
+
+ internalModel.loadingData(promise);
+
+ if (!this._pendingFetch.get(typeClass)) {
+ this._pendingFetch.set(typeClass, [pendingFetchItem]);
+ } else {
+ this._pendingFetch.get(typeClass).push(pendingFetchItem);
+ }
+ _ember['default'].run.scheduleOnce('afterRender', this, this.flushAllPendingFetches);
+
+ return promise;
+ },
+
+ flushAllPendingFetches: function flushAllPendingFetches() {
+ if (this.isDestroyed || this.isDestroying) {
+ return;
+ }
+
+ this._pendingFetch.forEach(this._flushPendingFetchForType, this);
+ this._pendingFetch = Map.create();
+ },
+
+ _flushPendingFetchForType: function _flushPendingFetchForType(pendingFetchItems, typeClass) {
+ var store = this;
+ var adapter = store.adapterFor(typeClass.modelName);
+ var shouldCoalesce = !!adapter.findMany && adapter.coalesceFindRequests;
+ var records = _ember['default'].A(pendingFetchItems).mapBy('record');
+
+ function _fetchRecord(recordResolverPair) {
+ recordResolverPair.resolver.resolve(store.fetchRecord(recordResolverPair.record, recordResolverPair.options)); // TODO adapter options
+ }
+
+ function resolveFoundRecords(records) {
+ records.forEach(function (record) {
+ var pair = _ember['default'].A(pendingFetchItems).findBy('record', record);
+ if (pair) {
+ var resolver = pair.resolver;
+ resolver.resolve(record);
+ }
+ });
+ return records;
+ }
+
+ function makeMissingRecordsRejector(requestedRecords) {
+ return function rejectMissingRecords(resolvedRecords) {
+ resolvedRecords = _ember['default'].A(resolvedRecords);
+ var missingRecords = requestedRecords.reject(function (record) {
+ return resolvedRecords.includes(record);
+ });
+ if (missingRecords.length) {
+ (0, _emberDataPrivateDebug.warn)('Ember Data expected to find records with the following ids in the adapter response but they were missing: ' + _ember['default'].inspect(_ember['default'].A(missingRecords).mapBy('id')), false, {
+ id: 'ds.store.missing-records-from-adapter'
+ });
+ }
+ rejectRecords(missingRecords);
+ };
+ }
+
+ function makeRecordsRejector(records) {
+ return function (error) {
+ rejectRecords(records, error);
+ };
+ }
+
+ function rejectRecords(records, error) {
+ records.forEach(function (record) {
+ var pair = _ember['default'].A(pendingFetchItems).findBy('record', record);
+ if (pair) {
+ var resolver = pair.resolver;
+ resolver.reject(error);
+ }
+ });
+ }
+
+ if (pendingFetchItems.length === 1) {
+ _fetchRecord(pendingFetchItems[0]);
+ } else if (shouldCoalesce) {
+
+ // TODO: Improve records => snapshots => records => snapshots
+ //
+ // We want to provide records to all store methods and snapshots to all
+ // adapter methods. To make sure we're doing that we're providing an array
+ // of snapshots to adapter.groupRecordsForFindMany(), which in turn will
+ // return grouped snapshots instead of grouped records.
+ //
+ // But since the _findMany() finder is a store method we need to get the
+ // records from the grouped snapshots even though the _findMany() finder
+ // will once again convert the records to snapshots for adapter.findMany()
+
+ var snapshots = _ember['default'].A(records).invoke('createSnapshot');
+ var groups = adapter.groupRecordsForFindMany(this, snapshots);
+ groups.forEach(function (groupOfSnapshots) {
+ var groupOfRecords = _ember['default'].A(groupOfSnapshots).mapBy('_internalModel');
+ var requestedRecords = _ember['default'].A(groupOfRecords);
+ var ids = requestedRecords.mapBy('id');
+ if (ids.length > 1) {
+ (0, _emberDataPrivateSystemStoreFinders._findMany)(adapter, store, typeClass, ids, requestedRecords).then(resolveFoundRecords).then(makeMissingRecordsRejector(requestedRecords)).then(null, makeRecordsRejector(requestedRecords));
+ } else if (ids.length === 1) {
+ var pair = _ember['default'].A(pendingFetchItems).findBy('record', groupOfRecords[0]);
+ _fetchRecord(pair);
+ } else {
+ (0, _emberDataPrivateDebug.assert)("You cannot return an empty array from adapter's method groupRecordsForFindMany", false);
+ }
+ });
+ } else {
+ pendingFetchItems.forEach(_fetchRecord);
+ }
+ },
+
+ /**
+ Get the reference for the specified record.
+ Example
+ ```javascript
+ var userRef = store.getReference('user', 1);
+ // check if the user is loaded
+ var isLoaded = userRef.value() !== null;
+ // get the record of the reference (null if not yet available)
+ var user = userRef.value();
+ // get the identifier of the reference
+ if (userRef.remoteType() === "id") {
+ var id = userRef.id();
+ }
+ // load user (via store.find)
+ userRef.load().then(...)
+ // or trigger a reload
+ userRef.reload().then(...)
+ // provide data for reference
+ userRef.push({ id: 1, username: "@user" }).then(function(user) {
+ userRef.value() === user;
+ });
+ ```
+ @method getReference
+ @param {String} type
+ @param {String|Integer} id
+ @since 2.5.0
+ @return {RecordReference}
+ */
+ getReference: function getReference(type, id) {
+ return this._internalModelForId(type, id).recordReference;
+ },
+
+ /**
+ Get a record by a given type and ID without triggering a fetch.
+ This method will synchronously return the record if it is available in the store,
+ otherwise it will return `null`. A record is available if it has been fetched earlier, or
+ pushed manually into the store.
+ _Note: This is an synchronous method and does not return a promise._
+ ```js
+ var post = store.peekRecord('post', 1);
+ post.get('id'); // 1
+ ```
+ @since 1.13.0
+ @method peekRecord
+ @param {String} modelName
+ @param {String|Integer} id
+ @return {DS.Model|null} record
+ */
+ peekRecord: function peekRecord(modelName, id) {
+ (0, _emberDataPrivateDebug.assert)("You need to pass a model name to the store's peekRecord method", isPresent(modelName));
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+ if (this.hasRecordForId(modelName, id)) {
+ return this._internalModelForId(modelName, id).getRecord();
+ } else {
+ return null;
+ }
+ },
+
+ /**
+ This method is called by the record's `reload` method.
+ This method calls the adapter's `find` method, which returns a promise. When
+ **that** promise resolves, `reloadRecord` will resolve the promise returned
+ by the record's `reload`.
+ @method reloadRecord
+ @private
+ @param {DS.Model} internalModel
+ @return {Promise} promise
+ */
+ reloadRecord: function reloadRecord(internalModel) {
+ var modelName = internalModel.type.modelName;
+ var adapter = this.adapterFor(modelName);
+ var id = internalModel.id;
+
+ (0, _emberDataPrivateDebug.assert)("You cannot reload a record without an ID", id);
+ (0, _emberDataPrivateDebug.assert)("You tried to reload a record but you have no adapter (for " + modelName + ")", adapter);
+ (0, _emberDataPrivateDebug.assert)("You tried to reload a record but your adapter does not implement `findRecord`", typeof adapter.findRecord === 'function' || typeof adapter.find === 'function');
+
+ return this.scheduleFetch(internalModel);
+ },
+
+ /**
+ Returns true if a record for a given type and ID is already loaded.
+ @method hasRecordForId
+ @param {(String|DS.Model)} modelName
+ @param {(String|Integer)} inputId
+ @return {Boolean}
+ */
+ hasRecordForId: function hasRecordForId(modelName, inputId) {
+ (0, _emberDataPrivateDebug.assert)("You need to pass a model name to the store's hasRecordForId method", isPresent(modelName));
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+ var typeClass = this.modelFor(modelName);
+ var id = (0, _emberDataPrivateSystemCoerceId['default'])(inputId);
+ var internalModel = this.typeMapFor(typeClass).idToRecord[id];
+ return !!internalModel && internalModel.isLoaded();
+ },
+
+ /**
+ Returns id record for a given type and ID. If one isn't already loaded,
+ it builds a new record and leaves it in the `empty` state.
+ @method recordForId
+ @private
+ @param {String} modelName
+ @param {(String|Integer)} id
+ @return {DS.Model} record
+ */
+ recordForId: function recordForId(modelName, id) {
+ (0, _emberDataPrivateDebug.assert)("You need to pass a model name to the store's recordForId method", isPresent(modelName));
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+ return this._internalModelForId(modelName, id).getRecord();
+ },
+
+ _internalModelForId: function _internalModelForId(typeName, inputId) {
+ var typeClass = this.modelFor(typeName);
+ var id = (0, _emberDataPrivateSystemCoerceId['default'])(inputId);
+ var idToRecord = this.typeMapFor(typeClass).idToRecord;
+ var record = idToRecord[id];
+
+ if (!record || !idToRecord[id]) {
+ record = this.buildInternalModel(typeClass, id);
+ }
+
+ return record;
+ },
+
+ /**
+ @method findMany
+ @private
+ @param {Array} internalModels
+ @return {Promise} promise
+ */
+ findMany: function findMany(internalModels) {
+ var finds = new Array(internalModels.length);
+
+ for (var i = 0; i < internalModels.length; i++) {
+ finds[i] = this._findByInternalModel(internalModels[i]);
+ }
+
+ return Promise.all(finds);
+ },
+
+ /**
+ If a relationship was originally populated by the adapter as a link
+ (as opposed to a list of IDs), this method is called when the
+ relationship is fetched.
+ The link (which is usually a URL) is passed through unchanged, so the
+ adapter can make whatever request it wants.
+ The usual use-case is for the server to register a URL as a link, and
+ then use that URL in the future to make a request for the relationship.
+ @method findHasMany
+ @private
+ @param {DS.Model} owner
+ @param {any} link
+ @param {(Relationship)} relationship
+ @return {Promise} promise
+ */
+ findHasMany: function findHasMany(owner, link, relationship) {
+ var adapter = this.adapterFor(owner.type.modelName);
+
+ (0, _emberDataPrivateDebug.assert)("You tried to load a hasMany relationship but you have no adapter (for " + owner.type + ")", adapter);
+ (0, _emberDataPrivateDebug.assert)("You tried to load a hasMany relationship from a specified `link` in the original payload but your adapter does not implement `findHasMany`", typeof adapter.findHasMany === 'function');
+
+ return (0, _emberDataPrivateSystemStoreFinders._findHasMany)(adapter, this, owner, link, relationship);
+ },
+
+ /**
+ @method findBelongsTo
+ @private
+ @param {DS.Model} owner
+ @param {any} link
+ @param {Relationship} relationship
+ @return {Promise} promise
+ */
+ findBelongsTo: function findBelongsTo(owner, link, relationship) {
+ var adapter = this.adapterFor(owner.type.modelName);
+
+ (0, _emberDataPrivateDebug.assert)("You tried to load a belongsTo relationship but you have no adapter (for " + owner.type + ")", adapter);
+ (0, _emberDataPrivateDebug.assert)("You tried to load a belongsTo relationship from a specified `link` in the original payload but your adapter does not implement `findBelongsTo`", typeof adapter.findBelongsTo === 'function');
+
+ return (0, _emberDataPrivateSystemStoreFinders._findBelongsTo)(adapter, this, owner, link, relationship);
+ },
+
+ /**
+ This method delegates a query to the adapter. This is the one place where
+ adapter-level semantics are exposed to the application.
+ Exposing queries this way seems preferable to creating an abstract query
+ language for all server-side queries, and then require all adapters to
+ implement them.
+ ---
+ If you do something like this:
+ ```javascript
+ store.query('person', { page: 1 });
+ ```
+ The call made to the server, using a Rails backend, will look something like this:
+ ```
+ Started GET "/api/v1/person?page=1"
+ Processing by Api::V1::PersonsController#index as HTML
+ Parameters: { "page"=>"1" }
+ ```
+ ---
+ If you do something like this:
+ ```javascript
+ store.query('person', { ids: [1, 2, 3] });
+ ```
+ The call to the server, using a Rails backend, will look something like this:
+ ```
+ Started GET "/api/v1/person?ids%5B%5D=1&ids%5B%5D=2&ids%5B%5D=3"
+ Processing by Api::V1::PersonsController#index as HTML
+ Parameters: { "ids" => ["1", "2", "3"] }
+ ```
+ This method returns a promise, which is resolved with a `RecordArray`
+ once the server returns.
+ @since 1.13.0
+ @method query
+ @param {String} modelName
+ @param {any} query an opaque query to be used by the adapter
+ @return {Promise} promise
+ */
+ query: function query(modelName, _query2) {
+ return this._query(modelName, _query2);
+ },
+
+ _query: function _query(modelName, query, array) {
+ (0, _emberDataPrivateDebug.assert)("You need to pass a model name to the store's query method", isPresent(modelName));
+ (0, _emberDataPrivateDebug.assert)("You need to pass a query hash to the store's query method", query);
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+ var typeClass = this.modelFor(modelName);
+ array = array || this.recordArrayManager.createAdapterPopulatedRecordArray(typeClass, query);
+
+ var adapter = this.adapterFor(modelName);
+
+ (0, _emberDataPrivateDebug.assert)("You tried to load a query but you have no adapter (for " + typeClass + ")", adapter);
+ (0, _emberDataPrivateDebug.assert)("You tried to load a query but your adapter does not implement `query`", typeof adapter.query === 'function');
+
+ return (0, _emberDataPrivateSystemPromiseProxies.promiseArray)((0, _emberDataPrivateSystemStoreFinders._query)(adapter, this, typeClass, query, array));
+ },
+
+ /**
+ This method makes a request for one record, where the `id` is not known
+ beforehand (if the `id` is known, use `findRecord` instead).
+ This method can be used when it is certain that the server will return a
+ single object for the primary data.
+ Let's assume our API provides an endpoint for the currently logged in user
+ via:
+ ```
+ // GET /api/current_user
+ {
+ user: {
+ id: 1234,
+ username: 'admin'
+ }
+ }
+ ```
+ Since the specific `id` of the `user` is not known beforehand, we can use
+ `queryRecord` to get the user:
+ ```javascript
+ store.queryRecord('user', {}).then(function(user) {
+ let username = user.get('username');
+ console.log(`Currently logged in as ${username}`);
+ });
+ ```
+ The request is made through the adapters' `queryRecord`:
+ ```javascript
+ // app/adapters/user.js
+ import DS from "ember-data";
+ export default DS.Adapter.extend({
+ queryRecord(modelName, query) {
+ return Ember.$.getJSON("/api/current_user");
+ }
+ });
+ ```
+ Note: the primary use case for `store.queryRecord` is when a single record
+ is queried and the `id` is not known beforehand. In all other cases
+ `store.query` and using the first item of the array is likely the preferred
+ way:
+ ```
+ // GET /users?username=unique
+ {
+ data: [{
+ id: 1234,
+ type: 'user',
+ attributes: {
+ username: "unique"
+ }
+ }]
+ }
+ ```
+ ```javascript
+ store.query('user', { username: 'unique' }).then(function(users) {
+ return users.get('firstObject');
+ }).then(function(user) {
+ let id = user.get('id');
+ });
+ ```
+ This method returns a promise, which resolves with the found record.
+ If the adapter returns no data for the primary data of the payload, then
+ `queryRecord` resolves with `null`:
+ ```
+ // GET /users?username=unique
+ {
+ data: null
+ }
+ ```
+ ```javascript
+ store.queryRecord('user', { username: 'unique' }).then(function(user) {
+ console.log(user); // null
+ });
+ ```
+ @since 1.13.0
+ @method queryRecord
+ @param {String} modelName
+ @param {any} query an opaque query to be used by the adapter
+ @return {Promise} promise which resolves with the found record or `null`
+ */
+ queryRecord: function queryRecord(modelName, query) {
+ (0, _emberDataPrivateDebug.assert)("You need to pass a model name to the store's queryRecord method", isPresent(modelName));
+ (0, _emberDataPrivateDebug.assert)("You need to pass a query hash to the store's queryRecord method", query);
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+
+ var typeClass = this.modelFor(modelName);
+ var adapter = this.adapterFor(modelName);
+
+ (0, _emberDataPrivateDebug.assert)("You tried to make a query but you have no adapter (for " + typeClass + ")", adapter);
+ (0, _emberDataPrivateDebug.assert)("You tried to make a query but your adapter does not implement `queryRecord`", typeof adapter.queryRecord === 'function');
+
+ return (0, _emberDataPrivateSystemPromiseProxies.promiseObject)((0, _emberDataPrivateSystemStoreFinders._queryRecord)(adapter, this, typeClass, query));
+ },
+
+ /**
+ `findAll` asks the adapter's `findAll` method to find the records for the
+ given type, and returns a promise which will resolve with all records of
+ this type present in the store, even if the adapter only returns a subset
+ of them.
+ ```app/routes/authors.js
+ import Ember from 'ember';
+ export default Ember.Route.extend({
+ model: function(params) {
+ return this.store.findAll('author');
+ }
+ });
+ ```
+ _When_ the returned promise resolves depends on the reload behavior,
+ configured via the passed `options` hash and the result of the adapter's
+ `shouldReloadAll` method.
+ ### Reloading
+ If `{ reload: true }` is passed or `adapter.shouldReloadAll` evaluates to
+ `true`, then the returned promise resolves once the adapter returns data,
+ regardless if there are already records in the store:
+ ```js
+ store.push({
+ data: {
+ id: 'first',
+ type: 'author'
+ }
+ });
+ // adapter#findAll resolves with
+ // [
+ // {
+ // id: 'second',
+ // type: 'author'
+ // }
+ // ]
+ store.findAll('author', { reload: true }).then(function(authors) {
+ authors.getEach("id"); // ['first', 'second']
+ });
+ ```
+ If no reload is indicated via the abovementioned ways, then the promise
+ immediately resolves with all the records currently loaded in the store.
+ ### Background Reloading
+ Optionally, if `adapter.shouldBackgroundReloadAll` evaluates to `true`,
+ then a background reload is started. Once this resolves, the array with
+ which the promise resolves, is updated automatically so it contains all the
+ records in the store:
+ ```js
+ // app/adapters/application.js
+ export default DS.Adapter.extend({
+ shouldReloadAll(store, snapshotsArray) {
+ return false;
+ },
+ shouldBackgroundReloadAll(store, snapshotsArray) {
+ return true;
+ }
+ });
+ // ...
+ store.push({
+ data: {
+ id: 'first',
+ type: 'author'
+ }
+ });
+ var allAuthors;
+ store.findAll('author').then(function(authors) {
+ authors.getEach('id'); // ['first']
+ allAuthors = authors;
+ });
+ // later, once adapter#findAll resolved with
+ // [
+ // {
+ // id: 'second',
+ // type: 'author'
+ // }
+ // ]
+ allAuthors.getEach('id'); // ['first', 'second']
+ ```
+ If you would like to force or prevent background reloading, you can set a
+ boolean value for `backgroundReload` in the options object for
+ `findAll`.
+ ```app/routes/post/edit.js
+ import Ember from 'ember';
+ export default Ember.Route.extend({
+ model: function() {
+ return this.store.findAll('post', { backgroundReload: false });
+ }
+ });
+ ```
+ If you pass an object on the `adapterOptions` property of the options
+ argument it will be passed to you adapter via the `snapshotRecordArray`
+ ```app/routes/posts.js
+ import Ember from 'ember';
+ export default Ember.Route.extend({
+ model: function(params) {
+ return this.store.findAll('post', {
+ adapterOptions: { subscribe: false }
+ });
+ }
+ });
+ ```
+ ```app/adapters/post.js
+ import MyCustomAdapter from './custom-adapter';
+ export default MyCustomAdapter.extend({
+ findAll: function(store, type, sinceToken, snapshotRecordArray) {
+ if (snapshotRecordArray.adapterOptions.subscribe) {
+ // ...
+ }
+ // ...
+ }
+ });
+ ```
+ See [peekAll](#method_peekAll) to get an array of current records in the
+ store, without waiting until a reload is finished.
+ See [query](#method_query) to only get a subset of records from the server.
+ @since 1.13.0
+ @method findAll
+ @param {String} modelName
+ @param {Object} options
+ @return {Promise} promise
+ */
+ findAll: function findAll(modelName, options) {
+ (0, _emberDataPrivateDebug.assert)("You need to pass a model name to the store's findAll method", isPresent(modelName));
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+ var typeClass = this.modelFor(modelName);
+
+ return this._fetchAll(typeClass, this.peekAll(modelName), options);
+ },
+
+ /**
+ @method _fetchAll
+ @private
+ @param {DS.Model} typeClass
+ @param {DS.RecordArray} array
+ @return {Promise} promise
+ */
+ _fetchAll: function _fetchAll(typeClass, array, options) {
+ options = options || {};
+ var adapter = this.adapterFor(typeClass.modelName);
+ var sinceToken = this.typeMapFor(typeClass).metadata.since;
+
+ (0, _emberDataPrivateDebug.assert)("You tried to load all records but you have no adapter (for " + typeClass + ")", adapter);
+ (0, _emberDataPrivateDebug.assert)("You tried to load all records but your adapter does not implement `findAll`", typeof adapter.findAll === 'function');
+
+ set(array, 'isUpdating', true);
+
+ if (options.reload) {
+ return (0, _emberDataPrivateSystemPromiseProxies.promiseArray)((0, _emberDataPrivateSystemStoreFinders._findAll)(adapter, this, typeClass, sinceToken, options));
+ }
+
+ var snapshotArray = array.createSnapshot(options);
+
+ if (adapter.shouldReloadAll(this, snapshotArray)) {
+ return (0, _emberDataPrivateSystemPromiseProxies.promiseArray)((0, _emberDataPrivateSystemStoreFinders._findAll)(adapter, this, typeClass, sinceToken, options));
+ }
+
+ if (options.backgroundReload === false) {
+ return (0, _emberDataPrivateSystemPromiseProxies.promiseArray)(Promise.resolve(array));
+ }
+
+ if (options.backgroundReload || adapter.shouldBackgroundReloadAll(this, snapshotArray)) {
+ (0, _emberDataPrivateSystemStoreFinders._findAll)(adapter, this, typeClass, sinceToken, options);
+ }
+
+ return (0, _emberDataPrivateSystemPromiseProxies.promiseArray)(Promise.resolve(array));
+ },
+
+ /**
+ @method didUpdateAll
+ @param {DS.Model} typeClass
+ @private
+ */
+ didUpdateAll: function didUpdateAll(typeClass) {
+ var liveRecordArray = this.recordArrayManager.liveRecordArrayFor(typeClass);
+ set(liveRecordArray, 'isUpdating', false);
+ },
+
+ /**
+ This method returns a filtered array that contains all of the
+ known records for a given type in the store.
+ Note that because it's just a filter, the result will contain any
+ locally created records of the type, however, it will not make a
+ request to the backend to retrieve additional records. If you
+ would like to request all the records from the backend please use
+ [store.findAll](#method_findAll).
+ Also note that multiple calls to `peekAll` for a given type will always
+ return the same `RecordArray`.
+ Example
+ ```javascript
+ var localPosts = store.peekAll('post');
+ ```
+ @since 1.13.0
+ @method peekAll
+ @param {String} modelName
+ @return {DS.RecordArray}
+ */
+ peekAll: function peekAll(modelName) {
+ (0, _emberDataPrivateDebug.assert)("You need to pass a model name to the store's peekAll method", isPresent(modelName));
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+ var typeClass = this.modelFor(modelName);
+
+ var liveRecordArray = this.recordArrayManager.liveRecordArrayFor(typeClass);
+ this.recordArrayManager.populateLiveRecordArray(liveRecordArray, typeClass);
+
+ return liveRecordArray;
+ },
+
+ /**
+ This method unloads all records in the store.
+ Optionally you can pass a type which unload all records for a given type.
+ ```javascript
+ store.unloadAll();
+ store.unloadAll('post');
+ ```
+ @method unloadAll
+ @param {String=} modelName
+ */
+ unloadAll: function unloadAll(modelName) {
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), !modelName || typeof modelName === 'string');
+ if (arguments.length === 0) {
+ var typeMaps = this.typeMaps;
+ var keys = Object.keys(typeMaps);
+ var types = new Array(keys.length);
+
+ for (var i = 0; i < keys.length; i++) {
+ types[i] = typeMaps[keys[i]]['type'].modelName;
+ }
+
+ types.forEach(this.unloadAll, this);
+ } else {
+ var typeClass = this.modelFor(modelName);
+ var typeMap = this.typeMapFor(typeClass);
+ var records = typeMap.records.slice();
+ var record = undefined;
+
+ for (var i = 0; i < records.length; i++) {
+ record = records[i];
+ record.unloadRecord();
+ record.destroy(); // maybe within unloadRecord
+ }
+
+ typeMap.metadata = new _emberDataPrivateSystemEmptyObject['default']();
+ }
+ },
+
+ /**
+ Takes a type and filter function, and returns a live RecordArray that
+ remains up to date as new records are loaded into the store or created
+ locally.
+ The filter function takes a materialized record, and returns true
+ if the record should be included in the filter and false if it should
+ not.
+ Example
+ ```javascript
+ store.filter('post', function(post) {
+ return post.get('unread');
+ });
+ ```
+ The filter function is called once on all records for the type when
+ it is created, and then once on each newly loaded or created record.
+ If any of a record's properties change, or if it changes state, the
+ filter function will be invoked again to determine whether it should
+ still be in the array.
+ Optionally you can pass a query, which is the equivalent of calling
+ [query](#method_query) with that same query, to fetch additional records
+ from the server. The results returned by the server could then appear
+ in the filter if they match the filter function.
+ The query itself is not used to filter records, it's only sent to your
+ server for you to be able to do server-side filtering. The filter
+ function will be applied on the returned results regardless.
+ Example
+ ```javascript
+ store.filter('post', { unread: true }, function(post) {
+ return post.get('unread');
+ }).then(function(unreadPosts) {
+ unreadPosts.get('length'); // 5
+ var unreadPost = unreadPosts.objectAt(0);
+ unreadPost.set('unread', false);
+ unreadPosts.get('length'); // 4
+ });
+ ```
+ @method filter
+ @private
+ @param {String} modelName
+ @param {Object} query optional query
+ @param {Function} filter
+ @return {DS.PromiseArray}
+ @deprecated
+ */
+ filter: function filter(modelName, query, _filter) {
+ (0, _emberDataPrivateDebug.assert)("You need to pass a model name to the store's filter method", isPresent(modelName));
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+
+ if (!_ember['default'].ENV.ENABLE_DS_FILTER) {
+ (0, _emberDataPrivateDebug.assert)('The filter API has been moved to a plugin. To enable store.filter using an environment flag, or to use an alternative, you can visit the ember-data-filter addon page. https://github.com/ember-data/ember-data-filter', false);
+ }
+
+ var promise;
+ var length = arguments.length;
+ var array;
+ var hasQuery = length === 3;
+
+ // allow an optional server query
+ if (hasQuery) {
+ promise = this.query(modelName, query);
+ } else if (arguments.length === 2) {
+ _filter = query;
+ }
+
+ modelName = this.modelFor(modelName);
+
+ if (hasQuery) {
+ array = this.recordArrayManager.createFilteredRecordArray(modelName, _filter, query);
+ } else {
+ array = this.recordArrayManager.createFilteredRecordArray(modelName, _filter);
+ }
+
+ promise = promise || Promise.resolve(array);
+
+ return (0, _emberDataPrivateSystemPromiseProxies.promiseArray)(promise.then(function () {
+ return array;
+ }, null, 'DS: Store#filter of ' + modelName));
+ },
+
+ /**
+ This method returns if a certain record is already loaded
+ in the store. Use this function to know beforehand if a findRecord()
+ will result in a request or that it will be a cache hit.
+ Example
+ ```javascript
+ store.recordIsLoaded('post', 1); // false
+ store.findRecord('post', 1).then(function() {
+ store.recordIsLoaded('post', 1); // true
+ });
+ ```
+ @method recordIsLoaded
+ @param {String} modelName
+ @param {string} id
+ @return {boolean}
+ */
+ recordIsLoaded: function recordIsLoaded(modelName, id) {
+ (0, _emberDataPrivateDebug.assert)("You need to pass a model name to the store's recordIsLoaded method", isPresent(modelName));
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+ return this.hasRecordForId(modelName, id);
+ },
+
+ // ............
+ // . UPDATING .
+ // ............
+
+ /**
+ If the adapter updates attributes the record will notify
+ the store to update its membership in any filters.
+ To avoid thrashing, this method is invoked only once per
+ run loop per record.
+ @method dataWasUpdated
+ @private
+ @param {Class} type
+ @param {InternalModel} internalModel
+ */
+ dataWasUpdated: function dataWasUpdated(type, internalModel) {
+ this.recordArrayManager.recordDidChange(internalModel);
+ },
+
+ // ..............
+ // . PERSISTING .
+ // ..............
+
+ /**
+ This method is called by `record.save`, and gets passed a
+ resolver for the promise that `record.save` returns.
+ It schedules saving to happen at the end of the run loop.
+ @method scheduleSave
+ @private
+ @param {InternalModel} internalModel
+ @param {Resolver} resolver
+ @param {Object} options
+ */
+ scheduleSave: function scheduleSave(internalModel, resolver, options) {
+ var snapshot = internalModel.createSnapshot(options);
+ internalModel.flushChangedAttributes();
+ internalModel.adapterWillCommit();
+ this._pendingSave.push({
+ snapshot: snapshot,
+ resolver: resolver
+ });
+ once(this, 'flushPendingSave');
+ },
+
+ /**
+ This method is called at the end of the run loop, and
+ flushes any records passed into `scheduleSave`
+ @method flushPendingSave
+ @private
+ */
+ flushPendingSave: function flushPendingSave() {
+ var _this = this;
+
+ var pending = this._pendingSave.slice();
+ this._pendingSave = [];
+
+ pending.forEach(function (pendingItem) {
+ var snapshot = pendingItem.snapshot;
+ var resolver = pendingItem.resolver;
+ var record = snapshot._internalModel;
+ var adapter = _this.adapterFor(record.type.modelName);
+ var operation;
+
+ if (get(record, 'currentState.stateName') === 'root.deleted.saved') {
+ return resolver.resolve();
+ } else if (record.isNew()) {
+ operation = 'createRecord';
+ } else if (record.isDeleted()) {
+ operation = 'deleteRecord';
+ } else {
+ operation = 'updateRecord';
+ }
+
+ resolver.resolve(_commit(adapter, _this, operation, snapshot));
+ });
+ },
+
+ /**
+ This method is called once the promise returned by an
+ adapter's `createRecord`, `updateRecord` or `deleteRecord`
+ is resolved.
+ If the data provides a server-generated ID, it will
+ update the record and the store's indexes.
+ @method didSaveRecord
+ @private
+ @param {InternalModel} internalModel the in-flight internal model
+ @param {Object} data optional data (see above)
+ */
+ didSaveRecord: function didSaveRecord(internalModel, dataArg) {
+ var data;
+ if (dataArg) {
+ data = dataArg.data;
+ }
+ if (data) {
+ // normalize relationship IDs into records
+ this._backburner.schedule('normalizeRelationships', this, '_setupRelationships', internalModel, data);
+ this.updateId(internalModel, data);
+ }
+
+ //We first make sure the primary data has been updated
+ //TODO try to move notification to the user to the end of the runloop
+ internalModel.adapterDidCommit(data);
+ },
+
+ /**
+ This method is called once the promise returned by an
+ adapter's `createRecord`, `updateRecord` or `deleteRecord`
+ is rejected with a `DS.InvalidError`.
+ @method recordWasInvalid
+ @private
+ @param {InternalModel} internalModel
+ @param {Object} errors
+ */
+ recordWasInvalid: function recordWasInvalid(internalModel, errors) {
+ internalModel.adapterDidInvalidate(errors);
+ },
+
+ /**
+ This method is called once the promise returned by an
+ adapter's `createRecord`, `updateRecord` or `deleteRecord`
+ is rejected (with anything other than a `DS.InvalidError`).
+ @method recordWasError
+ @private
+ @param {InternalModel} internalModel
+ @param {Error} error
+ */
+ recordWasError: function recordWasError(internalModel, error) {
+ internalModel.adapterDidError(error);
+ },
+
+ /**
+ When an adapter's `createRecord`, `updateRecord` or `deleteRecord`
+ resolves with data, this method extracts the ID from the supplied
+ data.
+ @method updateId
+ @private
+ @param {InternalModel} internalModel
+ @param {Object} data
+ */
+ updateId: function updateId(internalModel, data) {
+ var oldId = internalModel.id;
+ var id = (0, _emberDataPrivateSystemCoerceId['default'])(data.id);
+
+ (0, _emberDataPrivateDebug.assert)("An adapter cannot assign a new id to a record that already has an id. " + internalModel + " had id: " + oldId + " and you tried to update it with " + id + ". This likely happened because your server returned data in response to a find or update that had a different id than the one you sent.", oldId === null || id === oldId);
+
+ this.typeMapFor(internalModel.type).idToRecord[id] = internalModel;
+
+ internalModel.setId(id);
+ },
+
+ /**
+ Returns a map of IDs to client IDs for a given type.
+ @method typeMapFor
+ @private
+ @param {DS.Model} typeClass
+ @return {Object} typeMap
+ */
+ typeMapFor: function typeMapFor(typeClass) {
+ var typeMaps = get(this, 'typeMaps');
+ var guid = _ember['default'].guidFor(typeClass);
+ var typeMap = typeMaps[guid];
+
+ if (typeMap) {
+ return typeMap;
+ }
+
+ typeMap = {
+ idToRecord: new _emberDataPrivateSystemEmptyObject['default'](),
+ records: [],
+ metadata: new _emberDataPrivateSystemEmptyObject['default'](),
+ type: typeClass
+ };
+
+ typeMaps[guid] = typeMap;
+
+ return typeMap;
+ },
+
+ // ................
+ // . LOADING DATA .
+ // ................
+
+ /**
+ This internal method is used by `push`.
+ @method _load
+ @private
+ @param {(String|DS.Model)} type
+ @param {Object} data
+ */
+ _load: function _load(data) {
+ var internalModel = this._internalModelForId(data.type, data.id);
+
+ internalModel.setupData(data);
+
+ this.recordArrayManager.recordDidChange(internalModel);
+
+ return internalModel;
+ },
+
+ /*
+ In case someone defined a relationship to a mixin, for example:
+ ```
+ var Comment = DS.Model.extend({
+ owner: belongsTo('commentable'. { polymorphic: true})
+ });
+ var Commentable = Ember.Mixin.create({
+ comments: hasMany('comment')
+ });
+ ```
+ we want to look up a Commentable class which has all the necessary
+ relationship metadata. Thus, we look up the mixin and create a mock
+ DS.Model, so we can access the relationship CPs of the mixin (`comments`)
+ in this case
+ */
+
+ _modelForMixin: function _modelForMixin(modelName) {
+ var normalizedModelName = (0, _emberDataPrivateSystemNormalizeModelName['default'])(modelName);
+ // container.registry = 2.1
+ // container._registry = 1.11 - 2.0
+ // container = < 1.11
+ var owner = (0, _emberDataPrivateUtils.getOwner)(this);
+
+ var mixin = owner._lookupFactory('mixin:' + normalizedModelName);
+ if (mixin) {
+ //Cache the class as a model
+ owner.register('model:' + normalizedModelName, _emberDataModel['default'].extend(mixin));
+ }
+ var factory = this.modelFactoryFor(normalizedModelName);
+ if (factory) {
+ factory.__isMixin = true;
+ factory.__mixin = mixin;
+ }
+
+ return factory;
+ },
+
+ /**
+ Returns a model class for a particular key. Used by
+ methods that take a type key (like `find`, `createRecord`,
+ etc.)
+ @method modelFor
+ @param {String} modelName
+ @return {DS.Model}
+ */
+ modelFor: function modelFor(modelName) {
+ (0, _emberDataPrivateDebug.assert)("You need to pass a model name to the store's modelFor method", isPresent(modelName));
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+
+ var factory = this.modelFactoryFor(modelName);
+ if (!factory) {
+ //Support looking up mixins as base types for polymorphic relationships
+ factory = this._modelForMixin(modelName);
+ }
+ if (!factory) {
+ throw new _ember['default'].Error("No model was found for '" + modelName + "'");
+ }
+ factory.modelName = factory.modelName || (0, _emberDataPrivateSystemNormalizeModelName['default'])(modelName);
+
+ return factory;
+ },
+
+ modelFactoryFor: function modelFactoryFor(modelName) {
+ (0, _emberDataPrivateDebug.assert)("You need to pass a model name to the store's modelFactoryFor method", isPresent(modelName));
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+ var normalizedKey = (0, _emberDataPrivateSystemNormalizeModelName['default'])(modelName);
+
+ var owner = (0, _emberDataPrivateUtils.getOwner)(this);
+
+ return owner._lookupFactory('model:' + normalizedKey);
+ },
+
+ /**
+ Push some data for a given type into the store.
+ This method expects normalized [JSON API](http://jsonapi.org/) document. This means you have to follow [JSON API specification](http://jsonapi.org/format/) with few minor adjustments:
+ - record's `type` should always be in singular, dasherized form
+ - members (properties) should be camelCased
+ [Your primary data should be wrapped inside `data` property](http://jsonapi.org/format/#document-top-level):
+ ```js
+ store.push({
+ data: {
+ // primary data for single record of type `Person`
+ id: '1',
+ type: 'person',
+ attributes: {
+ firstName: 'Daniel',
+ lastName: 'Kmak'
+ }
+ }
+ });
+ ```
+ [Demo.](http://ember-twiddle.com/fb99f18cd3b4d3e2a4c7)
+ `data` property can also hold an array (of records):
+ ```js
+ store.push({
+ data: [
+ // an array of records
+ {
+ id: '1',
+ type: 'person',
+ attributes: {
+ firstName: 'Daniel',
+ lastName: 'Kmak'
+ }
+ },
+ {
+ id: '2',
+ type: 'person',
+ attributes: {
+ firstName: 'Tom',
+ lastName: 'Dale'
+ }
+ }
+ ]
+ });
+ ```
+ [Demo.](http://ember-twiddle.com/69cdbeaa3702159dc355)
+ There are some typical properties for `JSONAPI` payload:
+ * `id` - mandatory, unique record's key
+ * `type` - mandatory string which matches `model`'s dasherized name in singular form
+ * `attributes` - object which holds data for record attributes - `DS.attr`'s declared in model
+ * `relationships` - object which must contain any of the following properties under each relationships' respective key (example path is `relationships.achievements.data`):
+ - [`links`](http://jsonapi.org/format/#document-links)
+ - [`data`](http://jsonapi.org/format/#document-resource-object-linkage) - place for primary data
+ - [`meta`](http://jsonapi.org/format/#document-meta) - object which contains meta-information about relationship
+ For this model:
+ ```app/models/person.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ firstName: DS.attr('string'),
+ lastName: DS.attr('string'),
+ children: DS.hasMany('person')
+ });
+ ```
+ To represent the children as IDs:
+ ```js
+ {
+ data: {
+ id: '1',
+ type: 'person',
+ attributes: {
+ firstName: 'Tom',
+ lastName: 'Dale'
+ },
+ relationships: {
+ children: {
+ data: [
+ {
+ id: '2',
+ type: 'person'
+ },
+ {
+ id: '3',
+ type: 'person'
+ },
+ {
+ id: '4',
+ type: 'person'
+ }
+ ]
+ }
+ }
+ }
+ }
+ ```
+ [Demo.](http://ember-twiddle.com/343e1735e034091f5bde)
+ To represent the children relationship as a URL:
+ ```js
+ {
+ data: {
+ id: '1',
+ type: 'person',
+ attributes: {
+ firstName: 'Tom',
+ lastName: 'Dale'
+ },
+ relationships: {
+ children: {
+ links: {
+ related: '/people/1/children'
+ }
+ }
+ }
+ }
+ }
+ ```
+ If you're streaming data or implementing an adapter, make sure
+ that you have converted the incoming data into this form. The
+ store's [normalize](#method_normalize) method is a convenience
+ helper for converting a json payload into the form Ember Data
+ expects.
+ ```js
+ store.push(store.normalize('person', data));
+ ```
+ This method can be used both to push in brand new
+ records, as well as to update existing records.
+ @method push
+ @param {Object} data
+ @return {DS.Model|Array} the record(s) that was created or
+ updated.
+ */
+ push: function push(data) {
+ var included = data.included;
+ var i, length;
+ if (included) {
+ for (i = 0, length = included.length; i < length; i++) {
+ this._pushInternalModel(included[i]);
+ }
+ }
+
+ if (Array.isArray(data.data)) {
+ length = data.data.length;
+ var internalModels = new Array(length);
+ for (i = 0; i < length; i++) {
+ internalModels[i] = this._pushInternalModel(data.data[i]).getRecord();
+ }
+ return internalModels;
+ }
+
+ if (data.data === null) {
+ return null;
+ }
+
+ (0, _emberDataPrivateDebug.assert)('Expected an object in the \'data\' property in a call to \'push\' for ' + data.type + ', but was ' + _ember['default'].typeOf(data.data), _ember['default'].typeOf(data.data) === 'object');
+
+ var internalModel = this._pushInternalModel(data.data);
+
+ return internalModel.getRecord();
+ },
+
+ _hasModelFor: function _hasModelFor(type) {
+ return !!(0, _emberDataPrivateUtils.getOwner)(this)._lookupFactory('model:' + type);
+ },
+
+ _pushInternalModel: function _pushInternalModel(data) {
+ var _this2 = this;
+
+ var modelName = data.type;
+ (0, _emberDataPrivateDebug.assert)('You must include an \'id\' for ' + modelName + ' in an object passed to \'push\'', data.id !== null && data.id !== undefined && data.id !== '');
+ (0, _emberDataPrivateDebug.assert)('You tried to push data with a type \'' + modelName + '\' but no model could be found with that name.', this._hasModelFor(modelName));
+
+ (0, _emberDataPrivateDebug.runInDebug)(function () {
+ // If Ember.ENV.DS_WARN_ON_UNKNOWN_KEYS is set to true and the payload
+ // contains unknown attributes or relationships, log a warning.
+
+ if (_ember['default'].ENV.DS_WARN_ON_UNKNOWN_KEYS) {
+ (function () {
+ var type = _this2.modelFor(modelName);
+
+ // Check unknown attributes
+ var unknownAttributes = Object.keys(data.attributes || {}).filter(function (key) {
+ return !get(type, 'fields').has(key);
+ });
+ var unknownAttributesMessage = 'The payload for \'' + type.modelName + '\' contains these unknown attributes: ' + unknownAttributes + '. Make sure they\'ve been defined in your model.';
+ (0, _emberDataPrivateDebug.warn)(unknownAttributesMessage, unknownAttributes.length === 0, { id: 'ds.store.unknown-keys-in-payload' });
+
+ // Check unknown relationships
+ var unknownRelationships = Object.keys(data.relationships || {}).filter(function (key) {
+ return !get(type, 'fields').has(key);
+ });
+ var unknownRelationshipsMessage = 'The payload for \'' + type.modelName + '\' contains these unknown relationships: ' + unknownRelationships + '. Make sure they\'ve been defined in your model.';
+ (0, _emberDataPrivateDebug.warn)(unknownRelationshipsMessage, unknownRelationships.length === 0, { id: 'ds.store.unknown-keys-in-payload' });
+ })();
+ }
+ });
+
+ // Actually load the record into the store.
+ var internalModel = this._load(data);
+
+ this._backburner.join(function () {
+ _this2._backburner.schedule('normalizeRelationships', _this2, '_setupRelationships', internalModel, data);
+ });
+
+ return internalModel;
+ },
+
+ _setupRelationships: function _setupRelationships(record, data) {
+ // This will convert relationships specified as IDs into DS.Model instances
+ // (possibly unloaded) and also create the data structures used to track
+ // relationships.
+ setupRelationships(this, record, data);
+ },
+
+ /**
+ Push some raw data into the store.
+ This method can be used both to push in brand new
+ records, as well as to update existing records. You
+ can push in more than one type of object at once.
+ All objects should be in the format expected by the
+ serializer.
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.ActiveModelSerializer;
+ ```
+ ```js
+ var pushData = {
+ posts: [
+ { id: 1, post_title: "Great post", comment_ids: [2] }
+ ],
+ comments: [
+ { id: 2, comment_body: "Insightful comment" }
+ ]
+ }
+ store.pushPayload(pushData);
+ ```
+ By default, the data will be deserialized using a default
+ serializer (the application serializer if it exists).
+ Alternatively, `pushPayload` will accept a model type which
+ will determine which serializer will process the payload.
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.ActiveModelSerializer;
+ ```
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer;
+ ```
+ ```js
+ store.pushPayload('comment', pushData); // Will use the application serializer
+ store.pushPayload('post', pushData); // Will use the post serializer
+ ```
+ @method pushPayload
+ @param {String} modelName Optionally, a model type used to determine which serializer will be used
+ @param {Object} inputPayload
+ */
+ pushPayload: function pushPayload(modelName, inputPayload) {
+ var _this3 = this;
+
+ var serializer;
+ var payload;
+ if (!inputPayload) {
+ payload = modelName;
+ serializer = defaultSerializer(this);
+ (0, _emberDataPrivateDebug.assert)("You cannot use `store#pushPayload` without a modelName unless your default serializer defines `pushPayload`", typeof serializer.pushPayload === 'function');
+ } else {
+ payload = inputPayload;
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+ serializer = this.serializerFor(modelName);
+ }
+ if (false) {
+ return this._adapterRun(function () {
+ return serializer.pushPayload(_this3, payload);
+ });
+ } else {
+ this._adapterRun(function () {
+ return serializer.pushPayload(_this3, payload);
+ });
+ }
+ },
+
+ /**
+ `normalize` converts a json payload into the normalized form that
+ [push](#method_push) expects.
+ Example
+ ```js
+ socket.on('message', function(message) {
+ var modelName = message.model;
+ var data = message.data;
+ store.push(store.normalize(modelName, data));
+ });
+ ```
+ @method normalize
+ @param {String} modelName The name of the model type for this payload
+ @param {Object} payload
+ @return {Object} The normalized payload
+ */
+ normalize: function normalize(modelName, payload) {
+ (0, _emberDataPrivateDebug.assert)("You need to pass a model name to the store's normalize method", isPresent(modelName));
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+ var serializer = this.serializerFor(modelName);
+ var model = this.modelFor(modelName);
+ return serializer.normalize(model, payload);
+ },
+
+ /**
+ Build a brand new record for a given type, ID, and
+ initial data.
+ @method buildRecord
+ @private
+ @param {DS.Model} type
+ @param {String} id
+ @param {Object} data
+ @return {InternalModel} internal model
+ */
+ buildInternalModel: function buildInternalModel(type, id, data) {
+ var typeMap = this.typeMapFor(type);
+ var idToRecord = typeMap.idToRecord;
+
+ (0, _emberDataPrivateDebug.assert)('The id ' + id + ' has already been used with another record of type ' + type.toString() + '.', !id || !idToRecord[id]);
+ (0, _emberDataPrivateDebug.assert)('\'' + _ember['default'].inspect(type) + '\' does not appear to be an ember-data model', typeof type._create === 'function');
+
+ // lookupFactory should really return an object that creates
+ // instances with the injections applied
+ var internalModel = new _emberDataPrivateSystemModelInternalModel['default'](type, id, this, null, data);
+
+ // if we're creating an item, this process will be done
+ // later, once the object has been persisted.
+ if (id) {
+ idToRecord[id] = internalModel;
+ }
+
+ typeMap.records.push(internalModel);
+
+ return internalModel;
+ },
+
+ //Called by the state machine to notify the store that the record is ready to be interacted with
+ recordWasLoaded: function recordWasLoaded(record) {
+ this.recordArrayManager.recordWasLoaded(record);
+ },
+
+ // ...............
+ // . DESTRUCTION .
+ // ...............
+
+ /**
+ When a record is destroyed, this un-indexes it and
+ removes it from any record arrays so it can be GCed.
+ @method _dematerializeRecord
+ @private
+ @param {InternalModel} internalModel
+ */
+ _dematerializeRecord: function _dematerializeRecord(internalModel) {
+ var type = internalModel.type;
+ var typeMap = this.typeMapFor(type);
+ var id = internalModel.id;
+
+ internalModel.updateRecordArrays();
+
+ if (id) {
+ delete typeMap.idToRecord[id];
+ }
+
+ var loc = typeMap.records.indexOf(internalModel);
+ typeMap.records.splice(loc, 1);
+ },
+
+ // ......................
+ // . PER-TYPE ADAPTERS
+ // ......................
+
+ /**
+ Returns an instance of the adapter for a given type. For
+ example, `adapterFor('person')` will return an instance of
+ `App.PersonAdapter`.
+ If no `App.PersonAdapter` is found, this method will look
+ for an `App.ApplicationAdapter` (the default adapter for
+ your entire application).
+ If no `App.ApplicationAdapter` is found, it will return
+ the value of the `defaultAdapter`.
+ @method adapterFor
+ @public
+ @param {String} modelName
+ @return DS.Adapter
+ */
+ adapterFor: function adapterFor(modelName) {
+ (0, _emberDataPrivateDebug.assert)("You need to pass a model name to the store's adapterFor method", isPresent(modelName));
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store.adapterFor has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+
+ return this.lookupAdapter(modelName);
+ },
+
+ _adapterRun: function _adapterRun(fn) {
+ return this._backburner.run(fn);
+ },
+
+ // ..............................
+ // . RECORD CHANGE NOTIFICATION .
+ // ..............................
+
+ /**
+ Returns an instance of the serializer for a given type. For
+ example, `serializerFor('person')` will return an instance of
+ `App.PersonSerializer`.
+ If no `App.PersonSerializer` is found, this method will look
+ for an `App.ApplicationSerializer` (the default serializer for
+ your entire application).
+ if no `App.ApplicationSerializer` is found, it will attempt
+ to get the `defaultSerializer` from the `PersonAdapter`
+ (`adapterFor('person')`).
+ If a serializer cannot be found on the adapter, it will fall back
+ to an instance of `DS.JSONSerializer`.
+ @method serializerFor
+ @public
+ @param {String} modelName the record to serialize
+ @return {DS.Serializer}
+ */
+ serializerFor: function serializerFor(modelName) {
+ (0, _emberDataPrivateDebug.assert)("You need to pass a model name to the store's serializerFor method", isPresent(modelName));
+ (0, _emberDataPrivateDebug.assert)('Passing classes to store.serializerFor has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');
+
+ var fallbacks = ['application', this.adapterFor(modelName).get('defaultSerializer'), '-default'];
+
+ var serializer = this.lookupSerializer(modelName, fallbacks);
+ return serializer;
+ },
+
+ /**
+ Retrieve a particular instance from the
+ container cache. If not found, creates it and
+ placing it in the cache.
+ Enabled a store to manage local instances of
+ adapters and serializers.
+ @method retrieveManagedInstance
+ @private
+ @param {String} modelName the object modelName
+ @param {String} name the object name
+ @param {Array} fallbacks the fallback objects to lookup if the lookup for modelName or 'application' fails
+ @return {Ember.Object}
+ */
+ retrieveManagedInstance: function retrieveManagedInstance(type, modelName, fallbacks) {
+ var normalizedModelName = (0, _emberDataPrivateSystemNormalizeModelName['default'])(modelName);
+
+ var instance = this._instanceCache.get(type, normalizedModelName, fallbacks);
+ set(instance, 'store', this);
+ return instance;
+ },
+
+ lookupAdapter: function lookupAdapter(name) {
+ return this.retrieveManagedInstance('adapter', name, this.get('_adapterFallbacks'));
+ },
+
+ _adapterFallbacks: _ember['default'].computed('adapter', function () {
+ var adapter = this.get('adapter');
+ return ['application', adapter, '-json-api'];
+ }),
+
+ lookupSerializer: function lookupSerializer(name, fallbacks) {
+ return this.retrieveManagedInstance('serializer', name, fallbacks);
+ },
+
+ willDestroy: function willDestroy() {
+ this._super.apply(this, arguments);
+ this.recordArrayManager.destroy();
+
+ this.unloadAll();
+ }
+
+ });
+
+ function deserializeRecordId(store, key, relationship, id) {
+ if (isNone(id)) {
+ return;
+ }
+
+ (0, _emberDataPrivateDebug.assert)('A ' + relationship.parentType + ' record was pushed into the store with the value of ' + key + ' being ' + _ember['default'].inspect(id) + ', but ' + key + ' is a belongsTo relationship so the value must not be an array. You should probably check your data payload or serializer.', !Array.isArray(id));
+
+ //TODO:Better asserts
+ return store._internalModelForId(id.type, id.id);
+ }
+
+ function deserializeRecordIds(store, key, relationship, ids) {
+ if (isNone(ids)) {
+ return;
+ }
+
+ (0, _emberDataPrivateDebug.assert)('A ' + relationship.parentType + ' record was pushed into the store with the value of ' + key + ' being \'' + _ember['default'].inspect(ids) + '\', but ' + key + ' is a hasMany relationship so the value must be an array. You should probably check your data payload or serializer.', Array.isArray(ids));
+ var _ids = new Array(ids.length);
+
+ for (var i = 0; i < ids.length; i++) {
+ _ids[i] = deserializeRecordId(store, key, relationship, ids[i]);
+ }
+
+ return _ids;
+ }
+
+ // Delegation to the adapter and promise management
+
+ function defaultSerializer(store) {
+ return store.serializerFor('application');
+ }
+
+ function _commit(adapter, store, operation, snapshot) {
+ var internalModel = snapshot._internalModel;
+ var modelName = snapshot.modelName;
+ var typeClass = store.modelFor(modelName);
+ var promise = adapter[operation](store, typeClass, snapshot);
+ var serializer = (0, _emberDataPrivateSystemStoreSerializers.serializerForAdapter)(store, adapter, modelName);
+ var label = 'DS: Extract and notify about ' + operation + ' completion of ' + internalModel;
+
+ (0, _emberDataPrivateDebug.assert)('Your adapter\'s \'' + operation + '\' method must return a value, but it returned \'undefined\'', promise !== undefined);
+
+ promise = Promise.resolve(promise, label);
+ promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, store));
+ promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, internalModel));
+
+ return promise.then(function (adapterPayload) {
+ store._adapterRun(function () {
+ var payload, data;
+ if (adapterPayload) {
+ payload = (0, _emberDataPrivateSystemStoreSerializerResponse.normalizeResponseHelper)(serializer, store, typeClass, adapterPayload, snapshot.id, operation);
+ if (payload.included) {
+ store.push({ data: payload.included });
+ }
+ data = payload.data;
+ }
+ store.didSaveRecord(internalModel, { data: data });
+ });
+
+ return internalModel;
+ }, function (error) {
+ if (error instanceof _emberDataAdaptersErrors.InvalidError) {
+ var errors = serializer.extractErrors(store, typeClass, error, snapshot.id);
+ store.recordWasInvalid(internalModel, errors);
+ } else {
+ store.recordWasError(internalModel, error);
+ }
+
+ throw error;
+ }, label);
+ }
+
+ function setupRelationships(store, record, data) {
+ if (!data.relationships) {
+ return;
+ }
+
+ record.type.eachRelationship(function (key, descriptor) {
+ var kind = descriptor.kind;
+
+ if (!data.relationships[key]) {
+ return;
+ }
+
+ var relationship;
+
+ if (data.relationships[key].links && data.relationships[key].links.related) {
+ var relatedLink = (0, _emberDataPrivateSystemNormalizeLink['default'])(data.relationships[key].links.related);
+ if (relatedLink && relatedLink.href) {
+ relationship = record._relationships.get(key);
+ relationship.updateLink(relatedLink.href);
+ }
+ }
+
+ if (data.relationships[key].meta) {
+ relationship = record._relationships.get(key);
+ relationship.updateMeta(data.relationships[key].meta);
+ }
+
+ // If the data contains a relationship that is specified as an ID (or IDs),
+ // normalizeRelationship will convert them into DS.Model instances
+ // (possibly unloaded) before we push the payload into the store.
+ normalizeRelationship(store, key, descriptor, data.relationships[key]);
+
+ var value = data.relationships[key].data;
+
+ if (value !== undefined) {
+ if (kind === 'belongsTo') {
+ relationship = record._relationships.get(key);
+ relationship.setCanonicalRecord(value);
+ } else if (kind === 'hasMany') {
+ relationship = record._relationships.get(key);
+ relationship.updateRecordsFromAdapter(value);
+ }
+ }
+ });
+ }
+
+ function normalizeRelationship(store, key, relationship, jsonPayload) {
+ var data = jsonPayload.data;
+ if (data) {
+ var kind = relationship.kind;
+ if (kind === 'belongsTo') {
+ jsonPayload.data = deserializeRecordId(store, key, relationship, data);
+ } else if (kind === 'hasMany') {
+ jsonPayload.data = deserializeRecordIds(store, key, relationship, data);
+ }
+ }
+ }
+
+ exports.Store = Store;
+ exports['default'] = Store;
+});
+define('ember-data/-private/system/store/common', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports._bind = _bind;
+ exports._guard = _guard;
+ exports._objectIsAlive = _objectIsAlive;
+
+ var get = _ember['default'].get;
+
+ function _bind(fn) {
+ var args = Array.prototype.slice.call(arguments, 1);
+
+ return function () {
+ return fn.apply(undefined, args);
+ };
+ }
+
+ function _guard(promise, test) {
+ var guarded = promise['finally'](function () {
+ if (!test()) {
+ guarded._subscribers.length = 0;
+ }
+ });
+
+ return guarded;
+ }
+
+ function _objectIsAlive(object) {
+ return !(get(object, "isDestroyed") || get(object, "isDestroying"));
+ }
+});
+define('ember-data/-private/system/store/container-instance-cache', ['exports', 'ember', 'ember-data/-private/system/empty-object'], function (exports, _ember, _emberDataPrivateSystemEmptyObject) {
+ 'use strict';
+
+ exports['default'] = ContainerInstanceCache;
+
+ var assign = _ember['default'].assign || _ember['default'].merge;
+
+ /**
+ * The `ContainerInstanceCache` serves as a lazy cache for looking up
+ * instances of serializers and adapters. It has some additional logic for
+ * finding the 'fallback' adapter or serializer.
+ *
+ * The 'fallback' adapter or serializer is an adapter or serializer that is looked up
+ * when the preferred lookup fails. For example, say you try to look up `adapter:post`,
+ * but there is no entry (app/adapters/post.js in EmberCLI) for `adapter:post` in the registry.
+ *
+ * The `fallbacks` array passed will then be used; the first entry in the fallbacks array
+ * that exists in the container will then be cached for `adapter:post`. So, the next time you
+ * look up `adapter:post`, you'll get the `adapter:application` instance (or whatever the fallback
+ * was if `adapter:application` doesn't exist).
+ *
+ * @private
+ * @class ContainerInstanceCache
+ *
+ */
+ function ContainerInstanceCache(owner) {
+ this._owner = owner;
+ this._cache = new _emberDataPrivateSystemEmptyObject['default']();
+ }
+
+ ContainerInstanceCache.prototype = new _emberDataPrivateSystemEmptyObject['default']();
+
+ assign(ContainerInstanceCache.prototype, {
+ get: function get(type, preferredKey, fallbacks) {
+ var cache = this._cache;
+ var preferredLookupKey = type + ':' + preferredKey;
+
+ if (!(preferredLookupKey in cache)) {
+ var instance = this.instanceFor(preferredLookupKey) || this._findInstance(type, fallbacks);
+ if (instance) {
+ cache[preferredLookupKey] = instance;
+ }
+ }
+ return cache[preferredLookupKey];
+ },
+
+ _findInstance: function _findInstance(type, fallbacks) {
+ for (var i = 0, _length = fallbacks.length; i < _length; i++) {
+ var fallback = fallbacks[i];
+ var lookupKey = type + ':' + fallback;
+ var instance = this.instanceFor(lookupKey);
+
+ if (instance) {
+ return instance;
+ }
+ }
+ },
+
+ instanceFor: function instanceFor(key) {
+ var cache = this._cache;
+ if (!cache[key]) {
+ var instance = this._owner.lookup(key);
+ if (instance) {
+ cache[key] = instance;
+ }
+ }
+ return cache[key];
+ },
+
+ destroy: function destroy() {
+ var cache = this._cache;
+ var cacheEntries = Object.keys(cache);
+
+ for (var i = 0, _length2 = cacheEntries.length; i < _length2; i++) {
+ var cacheKey = cacheEntries[i];
+ var cacheEntry = cache[cacheKey];
+ if (cacheEntry) {
+ cacheEntry.destroy();
+ }
+ }
+ this._owner = null;
+ },
+
+ constructor: ContainerInstanceCache,
+
+ toString: function toString() {
+ return 'ContainerInstanceCache';
+ }
+ });
+});
+define("ember-data/-private/system/store/finders", ["exports", "ember", "ember-data/-private/debug", "ember-data/-private/system/store/common", "ember-data/-private/system/store/serializer-response", "ember-data/-private/system/store/serializers"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateSystemStoreCommon, _emberDataPrivateSystemStoreSerializerResponse, _emberDataPrivateSystemStoreSerializers) {
+ "use strict";
+
+ exports._find = _find;
+ exports._findMany = _findMany;
+ exports._findHasMany = _findHasMany;
+ exports._findBelongsTo = _findBelongsTo;
+ exports._findAll = _findAll;
+ exports._query = _query;
+ exports._queryRecord = _queryRecord;
+
+ var Promise = _ember["default"].RSVP.Promise;
+
+ function payloadIsNotBlank(adapterPayload) {
+ if (Array.isArray(adapterPayload)) {
+ return true;
+ } else {
+ return Object.keys(adapterPayload || {}).length;
+ }
+ }
+
+ function _find(adapter, store, typeClass, id, internalModel, options) {
+ var snapshot = internalModel.createSnapshot(options);
+ var promise = adapter.findRecord(store, typeClass, id, snapshot);
+ var serializer = (0, _emberDataPrivateSystemStoreSerializers.serializerForAdapter)(store, adapter, internalModel.type.modelName);
+ var label = "DS: Handle Adapter#findRecord of " + typeClass + " with id: " + id;
+
+ promise = Promise.resolve(promise, label);
+ promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, store));
+
+ return promise.then(function (adapterPayload) {
+ (0, _emberDataPrivateDebug.assert)("You made a `findRecord` request for a " + typeClass.modelName + " with id " + id + ", but the adapter's response did not have any data", payloadIsNotBlank(adapterPayload));
+ return store._adapterRun(function () {
+ var payload = (0, _emberDataPrivateSystemStoreSerializerResponse.normalizeResponseHelper)(serializer, store, typeClass, adapterPayload, id, 'findRecord');
+ (0, _emberDataPrivateDebug.assert)('Ember Data expected the primary data returned from a `findRecord` response to be an object but instead it found an array.', !Array.isArray(payload.data));
+ //TODO Optimize
+ var record = store.push(payload);
+ return record._internalModel;
+ });
+ }, function (error) {
+ internalModel.notFound();
+ if (internalModel.isEmpty()) {
+ internalModel.unloadRecord();
+ }
+
+ throw error;
+ }, "DS: Extract payload of '" + typeClass + "'");
+ }
+
+ function _findMany(adapter, store, typeClass, ids, internalModels) {
+ var snapshots = _ember["default"].A(internalModels).invoke('createSnapshot');
+ var promise = adapter.findMany(store, typeClass, ids, snapshots);
+ var serializer = (0, _emberDataPrivateSystemStoreSerializers.serializerForAdapter)(store, adapter, typeClass.modelName);
+ var label = "DS: Handle Adapter#findMany of " + typeClass;
+
+ if (promise === undefined) {
+ throw new Error('adapter.findMany returned undefined, this was very likely a mistake');
+ }
+
+ promise = Promise.resolve(promise, label);
+ promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, store));
+
+ return promise.then(function (adapterPayload) {
+ (0, _emberDataPrivateDebug.assert)("You made a `findMany` request for " + typeClass.modelName + " records with ids " + ids + ", but the adapter's response did not have any data", payloadIsNotBlank(adapterPayload));
+ return store._adapterRun(function () {
+ var payload = (0, _emberDataPrivateSystemStoreSerializerResponse.normalizeResponseHelper)(serializer, store, typeClass, adapterPayload, null, 'findMany');
+ //TODO Optimize, no need to materialize here
+ var records = store.push(payload);
+ var internalModels = new Array(records.length);
+
+ for (var i = 0; i < records.length; i++) {
+ internalModels[i] = records[i]._internalModel;
+ }
+
+ return internalModels;
+ });
+ }, null, "DS: Extract payload of " + typeClass);
+ }
+
+ function _findHasMany(adapter, store, internalModel, link, relationship) {
+ var snapshot = internalModel.createSnapshot();
+ var typeClass = store.modelFor(relationship.type);
+ var promise = adapter.findHasMany(store, snapshot, link, relationship);
+ var serializer = (0, _emberDataPrivateSystemStoreSerializers.serializerForAdapter)(store, adapter, relationship.type);
+ var label = "DS: Handle Adapter#findHasMany of " + internalModel + " : " + relationship.type;
+
+ promise = Promise.resolve(promise, label);
+ promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, store));
+ promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, internalModel));
+
+ return promise.then(function (adapterPayload) {
+ (0, _emberDataPrivateDebug.assert)("You made a `findHasMany` request for a " + internalModel.modelName + "'s `" + relationship.key + "` relationship, using link " + link + ", but the adapter's response did not have any data", payloadIsNotBlank(adapterPayload));
+ return store._adapterRun(function () {
+ var payload = (0, _emberDataPrivateSystemStoreSerializerResponse.normalizeResponseHelper)(serializer, store, typeClass, adapterPayload, null, 'findHasMany');
+ //TODO Use a non record creating push
+ var records = store.push(payload);
+ var recordArray = records.map(function (record) {
+ return record._internalModel;
+ });
+ recordArray.meta = payload.meta;
+ return recordArray;
+ });
+ }, null, "DS: Extract payload of " + internalModel + " : hasMany " + relationship.type);
+ }
+
+ function _findBelongsTo(adapter, store, internalModel, link, relationship) {
+ var snapshot = internalModel.createSnapshot();
+ var typeClass = store.modelFor(relationship.type);
+ var promise = adapter.findBelongsTo(store, snapshot, link, relationship);
+ var serializer = (0, _emberDataPrivateSystemStoreSerializers.serializerForAdapter)(store, adapter, relationship.type);
+ var label = "DS: Handle Adapter#findBelongsTo of " + internalModel + " : " + relationship.type;
+
+ promise = Promise.resolve(promise, label);
+ promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, store));
+ promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, internalModel));
+
+ return promise.then(function (adapterPayload) {
+ return store._adapterRun(function () {
+ var payload = (0, _emberDataPrivateSystemStoreSerializerResponse.normalizeResponseHelper)(serializer, store, typeClass, adapterPayload, null, 'findBelongsTo');
+
+ if (!payload.data) {
+ return null;
+ }
+
+ //TODO Optimize
+ var record = store.push(payload);
+ return record._internalModel;
+ });
+ }, null, "DS: Extract payload of " + internalModel + " : " + relationship.type);
+ }
+
+ function _findAll(adapter, store, typeClass, sinceToken, options) {
+ var modelName = typeClass.modelName;
+ var recordArray = store.peekAll(modelName);
+ var snapshotArray = recordArray.createSnapshot(options);
+ var promise = adapter.findAll(store, typeClass, sinceToken, snapshotArray);
+ var serializer = (0, _emberDataPrivateSystemStoreSerializers.serializerForAdapter)(store, adapter, modelName);
+ var label = "DS: Handle Adapter#findAll of " + typeClass;
+
+ promise = Promise.resolve(promise, label);
+ promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, store));
+
+ return promise.then(function (adapterPayload) {
+ (0, _emberDataPrivateDebug.assert)("You made a `findAll` request for " + typeClass.modelName + " records, but the adapter's response did not have any data", payloadIsNotBlank(adapterPayload));
+ store._adapterRun(function () {
+ var payload = (0, _emberDataPrivateSystemStoreSerializerResponse.normalizeResponseHelper)(serializer, store, typeClass, adapterPayload, null, 'findAll');
+ //TODO Optimize
+ store.push(payload);
+ });
+
+ store.didUpdateAll(typeClass);
+ return store.peekAll(modelName);
+ }, null, "DS: Extract payload of findAll " + typeClass);
+ }
+
+ function _query(adapter, store, typeClass, query, recordArray) {
+ var modelName = typeClass.modelName;
+ var promise = adapter.query(store, typeClass, query, recordArray);
+
+ var serializer = (0, _emberDataPrivateSystemStoreSerializers.serializerForAdapter)(store, adapter, modelName);
+ var label = "DS: Handle Adapter#query of " + typeClass;
+
+ promise = Promise.resolve(promise, label);
+ promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, store));
+
+ return promise.then(function (adapterPayload) {
+ var records, payload;
+ store._adapterRun(function () {
+ payload = (0, _emberDataPrivateSystemStoreSerializerResponse.normalizeResponseHelper)(serializer, store, typeClass, adapterPayload, null, 'query');
+ //TODO Optimize
+ records = store.push(payload);
+ });
+
+ (0, _emberDataPrivateDebug.assert)('The response to store.query is expected to be an array but it was a single record. Please wrap your response in an array or use `store.queryRecord` to query for a single record.', Array.isArray(records));
+ recordArray.loadRecords(records, payload);
+ return recordArray;
+ }, null, "DS: Extract payload of query " + typeClass);
+ }
+
+ function _queryRecord(adapter, store, typeClass, query) {
+ var modelName = typeClass.modelName;
+ var promise = adapter.queryRecord(store, typeClass, query);
+ var serializer = (0, _emberDataPrivateSystemStoreSerializers.serializerForAdapter)(store, adapter, modelName);
+ var label = "DS: Handle Adapter#queryRecord of " + typeClass;
+
+ promise = Promise.resolve(promise, label);
+ promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, store));
+
+ return promise.then(function (adapterPayload) {
+ var record;
+ store._adapterRun(function () {
+ var payload = (0, _emberDataPrivateSystemStoreSerializerResponse.normalizeResponseHelper)(serializer, store, typeClass, adapterPayload, null, 'queryRecord');
+
+ (0, _emberDataPrivateDebug.assert)("Expected the primary data returned by the serializer for a `queryRecord` response to be a single object or null but instead it was an array.", !Array.isArray(payload.data), {
+ id: 'ds.store.queryRecord-array-response'
+ });
+
+ //TODO Optimize
+ record = store.push(payload);
+ });
+
+ return record;
+ }, null, "DS: Extract payload of queryRecord " + typeClass);
+ }
+});
+define('ember-data/-private/system/store/serializer-response', ['exports', 'ember', 'ember-data/-private/debug'], function (exports, _ember, _emberDataPrivateDebug) {
+ 'use strict';
+
+ exports.validateDocumentStructure = validateDocumentStructure;
+ exports.normalizeResponseHelper = normalizeResponseHelper;
+
+ /*
+ This is a helper method that validates a JSON API top-level document
+
+ The format of a document is described here:
+ http://jsonapi.org/format/#document-top-level
+
+ @method validateDocumentStructure
+ @param {Object} doc JSON API document
+ @return {array} An array of errors found in the document structure
+ */
+
+ function validateDocumentStructure(doc) {
+ var errors = [];
+ if (!doc || typeof doc !== 'object') {
+ errors.push('Top level of a JSON API document must be an object');
+ } else {
+ if (!('data' in doc) && !('errors' in doc) && !('meta' in doc)) {
+ errors.push('One or more of the following keys must be present: "data", "errors", "meta".');
+ } else {
+ if ('data' in doc && 'errors' in doc) {
+ errors.push('Top level keys "errors" and "data" cannot both be present in a JSON API document');
+ }
+ }
+ if ('data' in doc) {
+ if (!(doc.data === null || Array.isArray(doc.data) || typeof doc.data === 'object')) {
+ errors.push('data must be null, an object, or an array');
+ }
+ }
+ if ('meta' in doc) {
+ if (typeof doc.meta !== 'object') {
+ errors.push('meta must be an object');
+ }
+ }
+ if ('errors' in doc) {
+ if (!Array.isArray(doc.errors)) {
+ errors.push('errors must be an array');
+ }
+ }
+ if ('links' in doc) {
+ if (typeof doc.links !== 'object') {
+ errors.push('links must be an object');
+ }
+ }
+ if ('jsonapi' in doc) {
+ if (typeof doc.jsonapi !== 'object') {
+ errors.push('jsonapi must be an object');
+ }
+ }
+ if ('included' in doc) {
+ if (typeof doc.included !== 'object') {
+ errors.push('included must be an array');
+ }
+ }
+ }
+
+ return errors;
+ }
+
+ /*
+ This is a helper method that always returns a JSON-API Document.
+
+ @method normalizeResponseHelper
+ @param {DS.Serializer} serializer
+ @param {DS.Store} store
+ @param {subclass of DS.Model} modelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+
+ function normalizeResponseHelper(serializer, store, modelClass, payload, id, requestType) {
+ var normalizedResponse = serializer.normalizeResponse(store, modelClass, payload, id, requestType);
+ var validationErrors = [];
+ (0, _emberDataPrivateDebug.runInDebug)(function () {
+ validationErrors = validateDocumentStructure(normalizedResponse);
+ });
+ (0, _emberDataPrivateDebug.assert)('normalizeResponse must return a valid JSON API document:\n\t* ' + validationErrors.join('\n\t* '), _ember['default'].isEmpty(validationErrors));
+
+ return normalizedResponse;
+ }
+});
+define("ember-data/-private/system/store/serializers", ["exports"], function (exports) {
+ "use strict";
+
+ exports.serializerForAdapter = serializerForAdapter;
+
+ function serializerForAdapter(store, adapter, type) {
+ var serializer = adapter.serializer;
+
+ if (serializer === undefined) {
+ serializer = store.serializerFor(type);
+ }
+
+ if (serializer === null || serializer === undefined) {
+ serializer = {
+ extract: function extract(store, type, payload) {
+ return payload;
+ }
+ };
+ }
+
+ return serializer;
+ }
+});
+define("ember-data/-private/transforms", ["exports", "ember-data/transform", "ember-data/-private/transforms/number", "ember-data/-private/transforms/date", "ember-data/-private/transforms/string", "ember-data/-private/transforms/boolean"], function (exports, _emberDataTransform, _emberDataPrivateTransformsNumber, _emberDataPrivateTransformsDate, _emberDataPrivateTransformsString, _emberDataPrivateTransformsBoolean) {
+ "use strict";
+
+ exports.Transform = _emberDataTransform["default"];
+ exports.NumberTransform = _emberDataPrivateTransformsNumber["default"];
+ exports.DateTransform = _emberDataPrivateTransformsDate["default"];
+ exports.StringTransform = _emberDataPrivateTransformsString["default"];
+ exports.BooleanTransform = _emberDataPrivateTransformsBoolean["default"];
+});
+define('ember-data/-private/transforms/boolean', ['exports', 'ember', 'ember-data/transform', 'ember-data/-private/features'], function (exports, _ember, _emberDataTransform, _emberDataPrivateFeatures) {
+ 'use strict';
+
+ var isNone = _ember['default'].isNone;
+
+ /**
+ The `DS.BooleanTransform` class is used to serialize and deserialize
+ boolean attributes on Ember Data record objects. This transform is
+ used when `boolean` is passed as the type parameter to the
+ [DS.attr](../../data#method_attr) function.
+
+ Usage
+
+ ```app/models/user.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ isAdmin: DS.attr('boolean'),
+ name: DS.attr('string'),
+ email: DS.attr('string')
+ });
+ ```
+
+ @class BooleanTransform
+ @extends DS.Transform
+ @namespace DS
+ */
+ exports['default'] = _emberDataTransform['default'].extend({
+ deserialize: function deserialize(serialized, options) {
+ var type = typeof serialized;
+
+ if (true) {
+ if (isNone(serialized) && options.allowNull === true) {
+ return null;
+ }
+ }
+
+ if (type === "boolean") {
+ return serialized;
+ } else if (type === "string") {
+ return serialized.match(/^true$|^t$|^1$/i) !== null;
+ } else if (type === "number") {
+ return serialized === 1;
+ } else {
+ return false;
+ }
+ },
+
+ serialize: function serialize(deserialized, options) {
+ if (true) {
+ if (isNone(deserialized) && options.allowNull === true) {
+ return null;
+ }
+ }
+
+ return Boolean(deserialized);
+ }
+ });
+});
+define("ember-data/-private/transforms/date", ["exports", "ember-data/-private/ext/date", "ember-data/transform"], function (exports, _emberDataPrivateExtDate, _emberDataTransform) {
+ "use strict";
+
+ exports["default"] = _emberDataTransform["default"].extend({
+ deserialize: function deserialize(serialized) {
+ var type = typeof serialized;
+
+ if (type === "string") {
+ return new Date((0, _emberDataPrivateExtDate.parseDate)(serialized));
+ } else if (type === "number") {
+ return new Date(serialized);
+ } else if (serialized === null || serialized === undefined) {
+ // if the value is null return null
+ // if the value is not present in the data return undefined
+ return serialized;
+ } else {
+ return null;
+ }
+ },
+
+ serialize: function serialize(date) {
+ if (date instanceof Date) {
+ return date.toISOString();
+ } else {
+ return null;
+ }
+ }
+ });
+});
+
+/**
+ The `DS.DateTransform` class is used to serialize and deserialize
+ date attributes on Ember Data record objects. This transform is used
+ when `date` is passed as the type parameter to the
+ [DS.attr](../../data#method_attr) function.
+
+ ```app/models/score.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ value: DS.attr('number'),
+ player: DS.belongsTo('player'),
+ date: DS.attr('date')
+ });
+ ```
+
+ @class DateTransform
+ @extends DS.Transform
+ @namespace DS
+ */
+define("ember-data/-private/transforms/number", ["exports", "ember", "ember-data/transform"], function (exports, _ember, _emberDataTransform) {
+ "use strict";
+
+ var empty = _ember["default"].isEmpty;
+
+ function isNumber(value) {
+ return value === value && value !== Infinity && value !== -Infinity;
+ }
+
+ /**
+ The `DS.NumberTransform` class is used to serialize and deserialize
+ numeric attributes on Ember Data record objects. This transform is
+ used when `number` is passed as the type parameter to the
+ [DS.attr](../../data#method_attr) function.
+
+ Usage
+
+ ```app/models/score.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ value: DS.attr('number'),
+ player: DS.belongsTo('player'),
+ date: DS.attr('date')
+ });
+ ```
+
+ @class NumberTransform
+ @extends DS.Transform
+ @namespace DS
+ */
+ exports["default"] = _emberDataTransform["default"].extend({
+ deserialize: function deserialize(serialized) {
+ var transformed;
+
+ if (empty(serialized)) {
+ return null;
+ } else {
+ transformed = Number(serialized);
+
+ return isNumber(transformed) ? transformed : null;
+ }
+ },
+
+ serialize: function serialize(deserialized) {
+ var transformed;
+
+ if (empty(deserialized)) {
+ return null;
+ } else {
+ transformed = Number(deserialized);
+
+ return isNumber(transformed) ? transformed : null;
+ }
+ }
+ });
+});
+define("ember-data/-private/transforms/string", ["exports", "ember", "ember-data/transform"], function (exports, _ember, _emberDataTransform) {
+ "use strict";
+
+ var none = _ember["default"].isNone;
+
+ /**
+ The `DS.StringTransform` class is used to serialize and deserialize
+ string attributes on Ember Data record objects. This transform is
+ used when `string` is passed as the type parameter to the
+ [DS.attr](../../data#method_attr) function.
+
+ Usage
+
+ ```app/models/user.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ isAdmin: DS.attr('boolean'),
+ name: DS.attr('string'),
+ email: DS.attr('string')
+ });
+ ```
+
+ @class StringTransform
+ @extends DS.Transform
+ @namespace DS
+ */
+ exports["default"] = _emberDataTransform["default"].extend({
+ deserialize: function deserialize(serialized) {
+ return none(serialized) ? null : String(serialized);
+ },
+ serialize: function serialize(deserialized) {
+ return none(deserialized) ? null : String(deserialized);
+ }
+ });
+});
+define('ember-data/-private/utils', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ var get = _ember['default'].get;
+
+ /*
+ Check if the passed model has a `type` attribute or a relationship named `type`.
+
+ @method modelHasAttributeOrRelationshipNamedType
+ @param modelClass
+ */
+ function modelHasAttributeOrRelationshipNamedType(modelClass) {
+ return get(modelClass, 'attributes').has('type') || get(modelClass, 'relationshipsByName').has('type');
+ }
+
+ /*
+ ember-container-inject-owner is a new feature in Ember 2.3 that finally provides a public
+ API for looking items up. This function serves as a super simple polyfill to avoid
+ triggering deprecations.
+ */
+ function getOwner(context) {
+ var owner;
+
+ if (_ember['default'].getOwner) {
+ owner = _ember['default'].getOwner(context);
+ }
+
+ if (!owner && context.container) {
+ owner = context.container;
+ }
+
+ if (owner && owner.lookupFactory && !owner._lookupFactory) {
+ // `owner` is a container, we are just making this work
+ owner._lookupFactory = owner.lookupFactory;
+ owner.register = function () {
+ var registry = owner.registry || owner._registry || owner;
+
+ return registry.register.apply(registry, arguments);
+ };
+ }
+
+ return owner;
+ }
+
+ exports.modelHasAttributeOrRelationshipNamedType = modelHasAttributeOrRelationshipNamedType;
+ exports.getOwner = getOwner;
+});
+define('ember-data/-private/utils/parse-response-headers', ['exports', 'ember-data/-private/system/empty-object'], function (exports, _emberDataPrivateSystemEmptyObject) {
+ 'use strict';
+
+ exports['default'] = parseResponseHeaders;
+
+ function _toArray(arr) {
+ return Array.isArray(arr) ? arr : Array.from(arr);
+ }
+
+ var CLRF = '\r\n';
+ function parseResponseHeaders(headersString) {
+ var headers = new _emberDataPrivateSystemEmptyObject['default']();
+
+ if (!headersString) {
+ return headers;
+ }
+
+ var headerPairs = headersString.split(CLRF);
+
+ headerPairs.forEach(function (header) {
+ var _header$split = header.split(':');
+
+ var _header$split2 = _toArray(_header$split);
+
+ var field = _header$split2[0];
+
+ var value = _header$split2.slice(1);
+
+ field = field.trim();
+ value = value.join(':').trim();
+
+ if (value) {
+ headers[field] = value;
+ }
+ });
+
+ return headers;
+ }
+});
+define('ember-data/adapter', ['exports', 'ember'], function (exports, _ember) {
+ /**
+ @module ember-data
+ */
+
+ 'use strict';
+
+ var get = _ember['default'].get;
+
+ /**
+ An adapter is an object that receives requests from a store and
+ translates them into the appropriate action to take against your
+ persistence layer. The persistence layer is usually an HTTP API, but
+ may be anything, such as the browser's local storage. Typically the
+ adapter is not invoked directly instead its functionality is accessed
+ through the `store`.
+
+ ### Creating an Adapter
+
+ Create a new subclass of `DS.Adapter` in the `app/adapters` folder:
+
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+
+ export default DS.Adapter.extend({
+ // ...your code here
+ });
+ ```
+
+ Model-specific adapters can be created by putting your adapter
+ class in an `app/adapters/` + `model-name` + `.js` file of the application.
+
+ ```app/adapters/post.js
+ import DS from 'ember-data';
+
+ export default DS.Adapter.extend({
+ // ...Post-specific adapter code goes here
+ });
+ ```
+
+ `DS.Adapter` is an abstract base class that you should override in your
+ application to customize it for your backend. The minimum set of methods
+ that you should implement is:
+
+ * `findRecord()`
+ * `createRecord()`
+ * `updateRecord()`
+ * `deleteRecord()`
+ * `findAll()`
+ * `query()`
+
+ To improve the network performance of your application, you can optimize
+ your adapter by overriding these lower-level methods:
+
+ * `findMany()`
+
+
+ For an example implementation, see `DS.RESTAdapter`, the
+ included REST adapter.
+
+ @class Adapter
+ @namespace DS
+ @extends Ember.Object
+ */
+
+ exports['default'] = _ember['default'].Object.extend({
+
+ /**
+ If you would like your adapter to use a custom serializer you can
+ set the `defaultSerializer` property to be the name of the custom
+ serializer.
+ Note the `defaultSerializer` serializer has a lower priority than
+ a model specific serializer (i.e. `PostSerializer`) or the
+ `application` serializer.
+ ```app/adapters/django.js
+ import DS from 'ember-data';
+ export default DS.Adapter.extend({
+ defaultSerializer: 'django'
+ });
+ ```
+ @property defaultSerializer
+ @type {String}
+ */
+ defaultSerializer: '-default',
+
+ /**
+ The `findRecord()` method is invoked when the store is asked for a record that
+ has not previously been loaded. In response to `findRecord()` being called, you
+ should query your persistence layer for a record with the given ID. The `findRecord`
+ method should return a promise that will resolve to a JavaScript object that will be
+ normalized by the serializer.
+ Here is an example `findRecord` implementation:
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.Adapter.extend({
+ findRecord: function(store, type, id, snapshot) {
+ return new Ember.RSVP.Promise(function(resolve, reject) {
+ Ember.$.getJSON(`/${type.modelName}/${id}`).then(function(data) {
+ resolve(data);
+ }, function(jqXHR) {
+ reject(jqXHR);
+ });
+ });
+ }
+ });
+ ```
+ @method findRecord
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {String} id
+ @param {DS.Snapshot} snapshot
+ @return {Promise} promise
+ */
+ findRecord: null,
+
+ /**
+ The `findAll()` method is used to retrieve all records for a given type.
+ Example
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.Adapter.extend({
+ findAll: function(store, type, sinceToken) {
+ var query = { since: sinceToken };
+ return new Ember.RSVP.Promise(function(resolve, reject) {
+ Ember.$.getJSON(`/${type.modelName}`, query).then(function(data) {
+ resolve(data);
+ }, function(jqXHR) {
+ reject(jqXHR);
+ });
+ });
+ }
+ });
+ ```
+ @method findAll
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {String} sinceToken
+ @param {DS.SnapshotRecordArray} snapshotRecordArray
+ @return {Promise} promise
+ */
+ findAll: null,
+
+ /**
+ This method is called when you call `query` on the store.
+ Example
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.Adapter.extend({
+ query: function(store, type, query) {
+ return new Ember.RSVP.Promise(function(resolve, reject) {
+ Ember.$.getJSON(`/${type.modelName}`, query).then(function(data) {
+ resolve(data);
+ }, function(jqXHR) {
+ reject(jqXHR);
+ });
+ });
+ }
+ });
+ ```
+ @method query
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {Object} query
+ @param {DS.AdapterPopulatedRecordArray} recordArray
+ @return {Promise} promise
+ */
+ query: null,
+
+ /**
+ The `queryRecord()` method is invoked when the store is asked for a single
+ record through a query object.
+ In response to `queryRecord()` being called, you should always fetch fresh
+ data. Once found, you can asynchronously call the store's `push()` method
+ to push the record into the store.
+ Here is an example `queryRecord` implementation:
+ Example
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ import Ember from 'ember';
+ export default DS.Adapter.extend(DS.BuildURLMixin, {
+ queryRecord: function(store, type, query) {
+ return new Ember.RSVP.Promise(function(resolve, reject) {
+ Ember.$.getJSON(`/${type.modelName}`, query).then(function(data) {
+ resolve(data);
+ }, function(jqXHR) {
+ reject(jqXHR);
+ });
+ });
+ }
+ });
+ ```
+ @method queryRecord
+ @param {DS.Store} store
+ @param {subclass of DS.Model} type
+ @param {Object} query
+ @return {Promise} promise
+ */
+ queryRecord: null,
+
+ /**
+ If the globally unique IDs for your records should be generated on the client,
+ implement the `generateIdForRecord()` method. This method will be invoked
+ each time you create a new record, and the value returned from it will be
+ assigned to the record's `primaryKey`.
+ Most traditional REST-like HTTP APIs will not use this method. Instead, the ID
+ of the record will be set by the server, and your adapter will update the store
+ with the new ID when it calls `didCreateRecord()`. Only implement this method if
+ you intend to generate record IDs on the client-side.
+ The `generateIdForRecord()` method will be invoked with the requesting store as
+ the first parameter and the newly created record as the second parameter:
+ ```javascript
+ import DS from 'ember-data';
+ import { v4 } from 'uuid';
+ export default DS.Adapter.extend({
+ generateIdForRecord: function(store, inputProperties) {
+ return v4();
+ }
+ });
+ ```
+ @method generateIdForRecord
+ @param {DS.Store} store
+ @param {DS.Model} type the DS.Model class of the record
+ @param {Object} inputProperties a hash of properties to set on the
+ newly created record.
+ @return {(String|Number)} id
+ */
+ generateIdForRecord: null,
+
+ /**
+ Proxies to the serializer's `serialize` method.
+ Example
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.Adapter.extend({
+ createRecord: function(store, type, snapshot) {
+ var data = this.serialize(snapshot, { includeId: true });
+ var url = `/${type.modelName}`;
+ // ...
+ }
+ });
+ ```
+ @method serialize
+ @param {DS.Snapshot} snapshot
+ @param {Object} options
+ @return {Object} serialized snapshot
+ */
+ serialize: function serialize(snapshot, options) {
+ return get(snapshot.record, 'store').serializerFor(snapshot.modelName).serialize(snapshot, options);
+ },
+
+ /**
+ Implement this method in a subclass to handle the creation of
+ new records.
+ Serializes the record and sends it to the server.
+ Example
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.Adapter.extend({
+ createRecord: function(store, type, snapshot) {
+ var data = this.serialize(snapshot, { includeId: true });
+ return new Ember.RSVP.Promise(function(resolve, reject) {
+ Ember.$.ajax({
+ type: 'POST',
+ url: `/${type.modelName}`,
+ dataType: 'json',
+ data: data
+ }).then(function(data) {
+ Ember.run(null, resolve, data);
+ }, function(jqXHR) {
+ jqXHR.then = null; // tame jQuery's ill mannered promises
+ Ember.run(null, reject, jqXHR);
+ });
+ });
+ }
+ });
+ ```
+ @method createRecord
+ @param {DS.Store} store
+ @param {DS.Model} type the DS.Model class of the record
+ @param {DS.Snapshot} snapshot
+ @return {Promise} promise
+ */
+ createRecord: null,
+
+ /**
+ Implement this method in a subclass to handle the updating of
+ a record.
+ Serializes the record update and sends it to the server.
+ The updateRecord method is expected to return a promise that will
+ resolve with the serialized record. This allows the backend to
+ inform the Ember Data store the current state of this record after
+ the update. If it is not possible to return a serialized record
+ the updateRecord promise can also resolve with `undefined` and the
+ Ember Data store will assume all of the updates were successfully
+ applied on the backend.
+ Example
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.Adapter.extend({
+ updateRecord: function(store, type, snapshot) {
+ var data = this.serialize(snapshot, { includeId: true });
+ var id = snapshot.id;
+ return new Ember.RSVP.Promise(function(resolve, reject) {
+ Ember.$.ajax({
+ type: 'PUT',
+ url: `/${type.modelName}/${id}`,
+ dataType: 'json',
+ data: data
+ }).then(function(data) {
+ Ember.run(null, resolve, data);
+ }, function(jqXHR) {
+ jqXHR.then = null; // tame jQuery's ill mannered promises
+ Ember.run(null, reject, jqXHR);
+ });
+ });
+ }
+ });
+ ```
+ @method updateRecord
+ @param {DS.Store} store
+ @param {DS.Model} type the DS.Model class of the record
+ @param {DS.Snapshot} snapshot
+ @return {Promise} promise
+ */
+ updateRecord: null,
+
+ /**
+ Implement this method in a subclass to handle the deletion of
+ a record.
+ Sends a delete request for the record to the server.
+ Example
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.Adapter.extend({
+ deleteRecord: function(store, type, snapshot) {
+ var data = this.serialize(snapshot, { includeId: true });
+ var id = snapshot.id;
+ return new Ember.RSVP.Promise(function(resolve, reject) {
+ Ember.$.ajax({
+ type: 'DELETE',
+ url: `/${type.modelName}/${id}`,
+ dataType: 'json',
+ data: data
+ }).then(function(data) {
+ Ember.run(null, resolve, data);
+ }, function(jqXHR) {
+ jqXHR.then = null; // tame jQuery's ill mannered promises
+ Ember.run(null, reject, jqXHR);
+ });
+ });
+ }
+ });
+ ```
+ @method deleteRecord
+ @param {DS.Store} store
+ @param {DS.Model} type the DS.Model class of the record
+ @param {DS.Snapshot} snapshot
+ @return {Promise} promise
+ */
+ deleteRecord: null,
+
+ /**
+ By default the store will try to coalesce all `fetchRecord` calls within the same runloop
+ into as few requests as possible by calling groupRecordsForFindMany and passing it into a findMany call.
+ You can opt out of this behaviour by either not implementing the findMany hook or by setting
+ coalesceFindRequests to false.
+ @property coalesceFindRequests
+ @type {boolean}
+ */
+ coalesceFindRequests: true,
+
+ /**
+ The store will call `findMany` instead of multiple `findRecord`
+ requests to find multiple records at once if coalesceFindRequests
+ is true.
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.Adapter.extend({
+ findMany(store, type, ids, snapshots) {
+ return new Ember.RSVP.Promise(function(resolve, reject) {
+ Ember.$.ajax({
+ type: 'GET',
+ url: `/${type.modelName}/`,
+ dataType: 'json',
+ data: { filter: { id: ids.join(',') } }
+ }).then(function(data) {
+ Ember.run(null, resolve, data);
+ }, function(jqXHR) {
+ jqXHR.then = null; // tame jQuery's ill mannered promises
+ Ember.run(null, reject, jqXHR);
+ });
+ });
+ }
+ });
+ ```
+ @method findMany
+ @param {DS.Store} store
+ @param {DS.Model} type the DS.Model class of the records
+ @param {Array} ids
+ @param {Array} snapshots
+ @return {Promise} promise
+ */
+ findMany: null,
+
+ /**
+ Organize records into groups, each of which is to be passed to separate
+ calls to `findMany`.
+ For example, if your api has nested URLs that depend on the parent, you will
+ want to group records by their parent.
+ The default implementation returns the records as a single group.
+ @method groupRecordsForFindMany
+ @param {DS.Store} store
+ @param {Array} snapshots
+ @return {Array} an array of arrays of records, each of which is to be
+ loaded separately by `findMany`.
+ */
+ groupRecordsForFindMany: function groupRecordsForFindMany(store, snapshots) {
+ return [snapshots];
+ },
+
+ /**
+ This method is used by the store to determine if the store should
+ reload a record from the adapter when a record is requested by
+ `store.findRecord`.
+ If this method returns `true`, the store will re-fetch a record from
+ the adapter. If this method returns `false`, the store will resolve
+ immediately using the cached record.
+ For example, if you are building an events ticketing system, in which users
+ can only reserve tickets for 20 minutes at a time, and want to ensure that
+ in each route you have data that is no more than 20 minutes old you could
+ write:
+ ```javascript
+ shouldReloadRecord: function(store, ticketSnapshot) {
+ var timeDiff = moment().diff(ticketSnapshot.attr('lastAccessedAt')).minutes();
+ if (timeDiff > 20) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ ```
+ This method would ensure that whenever you do `store.findRecord('ticket',
+ id)` you will always get a ticket that is no more than 20 minutes old. In
+ case the cached version is more than 20 minutes old, `findRecord` will not
+ resolve until you fetched the latest version.
+ By default this hook returns `false`, as most UIs should not block user
+ interactions while waiting on data update.
+ @since 1.13.0
+ @method shouldReloadRecord
+ @param {DS.Store} store
+ @param {DS.Snapshot} snapshot
+ @return {Boolean}
+ */
+ shouldReloadRecord: function shouldReloadRecord(store, snapshot) {
+ return false;
+ },
+
+ /**
+ This method is used by the store to determine if the store should
+ reload all records from the adapter when records are requested by
+ `store.findAll`.
+ If this method returns `true`, the store will re-fetch all records from
+ the adapter. If this method returns `false`, the store will resolve
+ immediately using the cached records.
+ For example, if you are building an events ticketing system, in which users
+ can only reserve tickets for 20 minutes at a time, and want to ensure that
+ in each route you have data that is no more than 20 minutes old you could
+ write:
+ ```javascript
+ shouldReloadAll: function(store, snapshotArray) {
+ var snapshots = snapshotArray.snapshots();
+ return snapshots.any(function(ticketSnapshot) {
+ var timeDiff = moment().diff(ticketSnapshot.attr('lastAccessedAt')).minutes();
+ if (timeDiff > 20) {
+ return true;
+ } else {
+ return false;
+ }
+ });
+ }
+ ```
+ This method would ensure that whenever you do `store.findAll('ticket')` you
+ will always get a list of tickets that are no more than 20 minutes old. In
+ case a cached version is more than 20 minutes old, `findAll` will not
+ resolve until you fetched the latest versions.
+ By default this methods returns `true` if the passed `snapshotRecordArray`
+ is empty (meaning that there are no records locally available yet),
+ otherwise it returns `false`.
+ @since 1.13.0
+ @method shouldReloadAll
+ @param {DS.Store} store
+ @param {DS.SnapshotRecordArray} snapshotRecordArray
+ @return {Boolean}
+ */
+ shouldReloadAll: function shouldReloadAll(store, snapshotRecordArray) {
+ return !snapshotRecordArray.length;
+ },
+
+ /**
+ This method is used by the store to determine if the store should
+ reload a record after the `store.findRecord` method resolves a
+ cached record.
+ This method is *only* checked by the store when the store is
+ returning a cached record.
+ If this method returns `true` the store will re-fetch a record from
+ the adapter.
+ For example, if you do not want to fetch complex data over a mobile
+ connection, or if the network is down, you can implement
+ `shouldBackgroundReloadRecord` as follows:
+ ```javascript
+ shouldBackgroundReloadRecord: function(store, snapshot) {
+ var connection = window.navigator.connection;
+ if (connection === 'cellular' || connection === 'none') {
+ return false;
+ } else {
+ return true;
+ }
+ }
+ ```
+ By default this hook returns `true` so the data for the record is updated
+ in the background.
+ @since 1.13.0
+ @method shouldBackgroundReloadRecord
+ @param {DS.Store} store
+ @param {DS.Snapshot} snapshot
+ @return {Boolean}
+ */
+ shouldBackgroundReloadRecord: function shouldBackgroundReloadRecord(store, snapshot) {
+ return true;
+ },
+
+ /**
+ This method is used by the store to determine if the store should
+ reload a record array after the `store.findAll` method resolves
+ with a cached record array.
+ This method is *only* checked by the store when the store is
+ returning a cached record array.
+ If this method returns `true` the store will re-fetch all records
+ from the adapter.
+ For example, if you do not want to fetch complex data over a mobile
+ connection, or if the network is down, you can implement
+ `shouldBackgroundReloadAll` as follows:
+ ```javascript
+ shouldBackgroundReloadAll: function(store, snapshotArray) {
+ var connection = window.navigator.connection;
+ if (connection === 'cellular' || connection === 'none') {
+ return false;
+ } else {
+ return true;
+ }
+ }
+ ```
+ By default this method returns `true`, indicating that a background reload
+ should always be triggered.
+ @since 1.13.0
+ @method shouldBackgroundReloadAll
+ @param {DS.Store} store
+ @param {DS.SnapshotRecordArray} snapshotRecordArray
+ @return {Boolean}
+ */
+ shouldBackgroundReloadAll: function shouldBackgroundReloadAll(store, snapshotRecordArray) {
+ return true;
+ }
+ });
+});
+define('ember-data/adapters/errors', ['exports', 'ember', 'ember-data/-private/debug', 'ember-data/-private/features'], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateFeatures) {
+ 'use strict';
+
+ exports.AdapterError = AdapterError;
+ exports.errorsHashToArray = errorsHashToArray;
+ exports.errorsArrayToHash = errorsArrayToHash;
+
+ var EmberError = _ember['default'].Error;
+
+ var SOURCE_POINTER_REGEXP = /^\/?data\/(attributes|relationships)\/(.*)/;
+ var SOURCE_POINTER_PRIMARY_REGEXP = /^\/?data/;
+ var PRIMARY_ATTRIBUTE_KEY = 'base';
+
+ /**
+ @class AdapterError
+ @namespace DS
+ */
+
+ function AdapterError(errors) {
+ var message = arguments.length <= 1 || arguments[1] === undefined ? 'Adapter operation failed' : arguments[1];
+
+ this.isAdapterError = true;
+ EmberError.call(this, message);
+
+ this.errors = errors || [{
+ title: 'Adapter Error',
+ detail: message
+ }];
+ }
+
+ var extendedErrorsEnabled = false;
+ if (false) {
+ extendedErrorsEnabled = true;
+ }
+
+ function extendFn(ErrorClass) {
+ return function () {
+ var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
+
+ var defaultMessage = _ref.message;
+
+ return extend(ErrorClass, defaultMessage);
+ };
+ }
+
+ function extend(ParentErrorClass, defaultMessage) {
+ var ErrorClass = function ErrorClass(errors, message) {
+ (0, _emberDataPrivateDebug.assert)('`AdapterError` expects json-api formatted errors array.', Array.isArray(errors || []));
+ ParentErrorClass.call(this, errors, message || defaultMessage);
+ };
+ ErrorClass.prototype = Object.create(ParentErrorClass.prototype);
+
+ if (extendedErrorsEnabled) {
+ ErrorClass.extend = extendFn(ErrorClass);
+ }
+
+ return ErrorClass;
+ }
+
+ AdapterError.prototype = Object.create(EmberError.prototype);
+
+ if (extendedErrorsEnabled) {
+ AdapterError.extend = extendFn(AdapterError);
+ }
+
+ /**
+ A `DS.InvalidError` is used by an adapter to signal the external API
+ was unable to process a request because the content was not
+ semantically correct or meaningful per the API. Usually this means a
+ record failed some form of server side validation. When a promise
+ from an adapter is rejected with a `DS.InvalidError` the record will
+ transition to the `invalid` state and the errors will be set to the
+ `errors` property on the record.
+
+ For Ember Data to correctly map errors to their corresponding
+ properties on the model, Ember Data expects each error to be
+ a valid json-api error object with a `source/pointer` that matches
+ the property name. For example if you had a Post model that
+ looked like this.
+
+ ```app/models/post.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ title: DS.attr('string'),
+ content: DS.attr('string')
+ });
+ ```
+
+ To show an error from the server related to the `title` and
+ `content` properties your adapter could return a promise that
+ rejects with a `DS.InvalidError` object that looks like this:
+
+ ```app/adapters/post.js
+ import Ember from 'ember';
+ import DS from 'ember-data';
+
+ export default DS.RESTAdapter.extend({
+ updateRecord: function() {
+ // Fictional adapter that always rejects
+ return Ember.RSVP.reject(new DS.InvalidError([
+ {
+ detail: 'Must be unique',
+ source: { pointer: '/data/attributes/title' }
+ },
+ {
+ detail: 'Must not be blank',
+ source: { pointer: '/data/attributes/content'}
+ }
+ ]));
+ }
+ });
+ ```
+
+ Your backend may use different property names for your records the
+ store will attempt extract and normalize the errors using the
+ serializer's `extractErrors` method before the errors get added to
+ the the model. As a result, it is safe for the `InvalidError` to
+ wrap the error payload unaltered.
+
+ @class InvalidError
+ @namespace DS
+ */
+ var InvalidError = extend(AdapterError, 'The adapter rejected the commit because it was invalid');
+
+ exports.InvalidError = InvalidError;
+
+ /**
+ @class TimeoutError
+ @namespace DS
+ */
+ var TimeoutError = extend(AdapterError, 'The adapter operation timed out');
+
+ exports.TimeoutError = TimeoutError;
+
+ /**
+ @class AbortError
+ @namespace DS
+ */
+ var AbortError = extend(AdapterError, 'The adapter operation was aborted');
+
+ exports.AbortError = AbortError;
+
+ /**
+ @class UnauthorizedError
+ @namespace DS
+ */
+ var UnauthorizedError = extendedErrorsEnabled ? extend(AdapterError, 'The adapter operation is unauthorized') : null;
+
+ exports.UnauthorizedError = UnauthorizedError;
+
+ /**
+ @class ForbiddenError
+ @namespace DS
+ */
+ var ForbiddenError = extendedErrorsEnabled ? extend(AdapterError, 'The adapter operation is forbidden') : null;
+
+ exports.ForbiddenError = ForbiddenError;
+
+ /**
+ @class NotFoundError
+ @namespace DS
+ */
+ var NotFoundError = extendedErrorsEnabled ? extend(AdapterError, 'The adapter could not find the resource') : null;
+
+ exports.NotFoundError = NotFoundError;
+
+ /**
+ @class ConflictError
+ @namespace DS
+ */
+ var ConflictError = extendedErrorsEnabled ? extend(AdapterError, 'The adapter operation failed due to a conflict') : null;
+
+ exports.ConflictError = ConflictError;
+
+ /**
+ @class ServerError
+ @namespace DS
+ */
+ var ServerError = extendedErrorsEnabled ? extend(AdapterError, 'The adapter operation failed due to a server error') : null;
+
+ exports.ServerError = ServerError;
+
+ /**
+ @method errorsHashToArray
+ @private
+ */
+
+ function errorsHashToArray(errors) {
+ var out = [];
+
+ if (_ember['default'].isPresent(errors)) {
+ Object.keys(errors).forEach(function (key) {
+ var messages = _ember['default'].makeArray(errors[key]);
+ for (var i = 0; i < messages.length; i++) {
+ var title = 'Invalid Attribute';
+ var pointer = '/data/attributes/' + key;
+ if (key === PRIMARY_ATTRIBUTE_KEY) {
+ title = 'Invalid Document';
+ pointer = '/data';
+ }
+ out.push({
+ title: title,
+ detail: messages[i],
+ source: {
+ pointer: pointer
+ }
+ });
+ }
+ });
+ }
+
+ return out;
+ }
+
+ /**
+ @method errorsArrayToHash
+ @private
+ */
+
+ function errorsArrayToHash(errors) {
+ var out = {};
+
+ if (_ember['default'].isPresent(errors)) {
+ errors.forEach(function (error) {
+ if (error.source && error.source.pointer) {
+ var key = error.source.pointer.match(SOURCE_POINTER_REGEXP);
+
+ if (key) {
+ key = key[2];
+ } else if (error.source.pointer.search(SOURCE_POINTER_PRIMARY_REGEXP) !== -1) {
+ key = PRIMARY_ATTRIBUTE_KEY;
+ }
+
+ if (key) {
+ out[key] = out[key] || [];
+ out[key].push(error.detail || error.title);
+ }
+ }
+ });
+ }
+
+ return out;
+ }
+});
+define('ember-data/adapters/json-api', ['exports', 'ember', 'ember-data/adapters/rest', 'ember-data/-private/features', 'ember-data/-private/debug'], function (exports, _ember, _emberDataAdaptersRest, _emberDataPrivateFeatures, _emberDataPrivateDebug) {
+ /**
+ @module ember-data
+ */
+
+ 'use strict';
+
+ /**
+ @since 1.13.0
+ @class JSONAPIAdapter
+ @constructor
+ @namespace DS
+ @extends DS.RESTAdapter
+ */
+ var JSONAPIAdapter = _emberDataAdaptersRest['default'].extend({
+ defaultSerializer: '-json-api',
+
+ /**
+ @method ajaxOptions
+ @private
+ @param {String} url
+ @param {String} type The request type GET, POST, PUT, DELETE etc.
+ @param {Object} options
+ @return {Object}
+ */
+ ajaxOptions: function ajaxOptions(url, type, options) {
+ var hash = this._super.apply(this, arguments);
+
+ if (hash.contentType) {
+ hash.contentType = 'application/vnd.api+json';
+ }
+
+ var beforeSend = hash.beforeSend;
+ hash.beforeSend = function (xhr) {
+ xhr.setRequestHeader('Accept', 'application/vnd.api+json');
+ if (beforeSend) {
+ beforeSend(xhr);
+ }
+ };
+
+ return hash;
+ },
+
+ /**
+ By default the JSONAPIAdapter will send each find request coming from a `store.find`
+ or from accessing a relationship separately to the server. If your server supports passing
+ ids as a query string, you can set coalesceFindRequests to true to coalesce all find requests
+ within a single runloop.
+ For example, if you have an initial payload of:
+ ```javascript
+ {
+ post: {
+ id: 1,
+ comments: [1, 2]
+ }
+ }
+ ```
+ By default calling `post.get('comments')` will trigger the following requests(assuming the
+ comments haven't been loaded before):
+ ```
+ GET /comments/1
+ GET /comments/2
+ ```
+ If you set coalesceFindRequests to `true` it will instead trigger the following request:
+ ```
+ GET /comments?filter[id]=1,2
+ ```
+ Setting coalesceFindRequests to `true` also works for `store.find` requests and `belongsTo`
+ relationships accessed within the same runloop. If you set `coalesceFindRequests: true`
+ ```javascript
+ store.findRecord('comment', 1);
+ store.findRecord('comment', 2);
+ ```
+ will also send a request to: `GET /comments?filter[id]=1,2`
+ Note: Requests coalescing rely on URL building strategy. So if you override `buildURL` in your app
+ `groupRecordsForFindMany` more likely should be overridden as well in order for coalescing to work.
+ @property coalesceFindRequests
+ @type {boolean}
+ */
+ coalesceFindRequests: false,
+
+ /**
+ @method findMany
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {Array} ids
+ @param {Array} snapshots
+ @return {Promise} promise
+ */
+ findMany: function findMany(store, type, ids, snapshots) {
+ if (false && !this._hasCustomizedAjax()) {
+ return this._super.apply(this, arguments);
+ } else {
+ var url = this.buildURL(type.modelName, ids, snapshots, 'findMany');
+ return this.ajax(url, 'GET', { data: { filter: { id: ids.join(',') } } });
+ }
+ },
+
+ /**
+ @method pathForType
+ @param {String} modelName
+ @return {String} path
+ **/
+ pathForType: function pathForType(modelName) {
+ var dasherized = _ember['default'].String.dasherize(modelName);
+ return _ember['default'].String.pluralize(dasherized);
+ },
+
+ // TODO: Remove this once we have a better way to override HTTP verbs.
+ /**
+ @method updateRecord
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {DS.Snapshot} snapshot
+ @return {Promise} promise
+ */
+ updateRecord: function updateRecord(store, type, snapshot) {
+ if (false && !this._hasCustomizedAjax()) {
+ return this._super.apply(this, arguments);
+ } else {
+ var data = {};
+ var serializer = store.serializerFor(type.modelName);
+
+ serializer.serializeIntoHash(data, type, snapshot, { includeId: true });
+
+ var id = snapshot.id;
+ var url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');
+
+ return this.ajax(url, 'PATCH', { data: data });
+ }
+ },
+
+ _hasCustomizedAjax: function _hasCustomizedAjax() {
+ if (this.ajax !== JSONAPIAdapter.prototype.ajax) {
+ (0, _emberDataPrivateDebug.deprecate)('JSONAPIAdapter#ajax has been deprecated please use. `methodForRequest`, `urlForRequest`, `headersForRequest` or `dataForRequest` instead.', false, {
+ id: 'ds.json-api-adapter.ajax',
+ until: '3.0.0'
+ });
+ return true;
+ }
+
+ if (this.ajaxOptions !== JSONAPIAdapter.prototype.ajaxOptions) {
+ (0, _emberDataPrivateDebug.deprecate)('JSONAPIAdapterr#ajaxOptions has been deprecated please use. `methodForRequest`, `urlForRequest`, `headersForRequest` or `dataForRequest` instead.', false, {
+ id: 'ds.json-api-adapter.ajax-options',
+ until: '3.0.0'
+ });
+ return true;
+ }
+
+ return false;
+ }
+ });
+
+ if (false) {
+
+ JSONAPIAdapter.reopen({
+
+ methodForRequest: function methodForRequest(params) {
+ if (params.requestType === 'updateRecord') {
+ return 'PATCH';
+ }
+
+ return this._super.apply(this, arguments);
+ },
+
+ dataForRequest: function dataForRequest(params) {
+ var requestType = params.requestType;
+ var ids = params.ids;
+
+ if (requestType === 'findMany') {
+ return {
+ filter: { id: ids.join(',') }
+ };
+ }
+
+ if (requestType === 'updateRecord') {
+ var store = params.store;
+ var type = params.type;
+ var snapshot = params.snapshot;
+
+ var data = {};
+ var serializer = store.serializerFor(type.modelName);
+
+ serializer.serializeIntoHash(data, type, snapshot, { includeId: true });
+
+ return data;
+ }
+
+ return this._super.apply(this, arguments);
+ },
+
+ headersForRequest: function headersForRequest() {
+ var headers = this._super.apply(this, arguments) || {};
+
+ headers['Accept'] = 'application/vnd.api+json';
+
+ return headers;
+ },
+
+ _requestToJQueryAjaxHash: function _requestToJQueryAjaxHash() {
+ var hash = this._super.apply(this, arguments);
+
+ if (hash.contentType) {
+ hash.contentType = 'application/vnd.api+json';
+ }
+
+ return hash;
+ }
+
+ });
+ }
+
+ exports['default'] = JSONAPIAdapter;
+});
+define('ember-data/adapters/rest', ['exports', 'ember', 'ember-data/adapter', 'ember-data/adapters/errors', 'ember-data/-private/adapters/build-url-mixin', 'ember-data/-private/features', 'ember-data/-private/debug', 'ember-data/-private/utils/parse-response-headers'], function (exports, _ember, _emberDataAdapter, _emberDataAdaptersErrors, _emberDataPrivateAdaptersBuildUrlMixin, _emberDataPrivateFeatures, _emberDataPrivateDebug, _emberDataPrivateUtilsParseResponseHeaders) {
+ /**
+ @module ember-data
+ */
+
+ 'use strict';
+
+ var MapWithDefault = _ember['default'].MapWithDefault;
+ var get = _ember['default'].get;
+
+ var Promise = _ember['default'].RSVP.Promise;
+
+ /**
+ The REST adapter allows your store to communicate with an HTTP server by
+ transmitting JSON via XHR. Most Ember.js apps that consume a JSON API
+ should use the REST adapter.
+
+ This adapter is designed around the idea that the JSON exchanged with
+ the server should be conventional.
+
+ ## Success and failure
+
+ The REST adapter will consider a success any response with a status code
+ of the 2xx family ("Success"), as well as 304 ("Not Modified"). Any other
+ status code will be considered a failure.
+
+ On success, the request promise will be resolved with the full response
+ payload.
+
+ Failed responses with status code 422 ("Unprocessable Entity") will be
+ considered "invalid". The response will be discarded, except for the
+ `errors` key. The request promise will be rejected with a `DS.InvalidError`.
+ This error object will encapsulate the saved `errors` value.
+
+ Any other status codes will be treated as an "adapter error". The request
+ promise will be rejected, similarly to the "invalid" case, but with
+ an instance of `DS.AdapterError` instead.
+
+ ## JSON Structure
+
+ The REST adapter expects the JSON returned from your server to follow
+ these conventions.
+
+ ### Object Root
+
+ The JSON payload should be an object that contains the record inside a
+ root property. For example, in response to a `GET` request for
+ `/posts/1`, the JSON should look like this:
+
+ ```js
+ {
+ "post": {
+ "id": 1,
+ "title": "I'm Running to Reform the W3C's Tag",
+ "author": "Yehuda Katz"
+ }
+ }
+ ```
+
+ Similarly, in response to a `GET` request for `/posts`, the JSON should
+ look like this:
+
+ ```js
+ {
+ "posts": [
+ {
+ "id": 1,
+ "title": "I'm Running to Reform the W3C's Tag",
+ "author": "Yehuda Katz"
+ },
+ {
+ "id": 2,
+ "title": "Rails is omakase",
+ "author": "D2H"
+ }
+ ]
+ }
+ ```
+
+ Note that the object root can be pluralized for both a single-object response
+ and an array response: the REST adapter is not strict on this. Further, if the
+ HTTP server responds to a `GET` request to `/posts/1` (e.g. the response to a
+ `findRecord` query) with more than one object in the array, Ember Data will
+ only display the object with the matching ID.
+
+ ### Conventional Names
+
+ Attribute names in your JSON payload should be the camelCased versions of
+ the attributes in your Ember.js models.
+
+ For example, if you have a `Person` model:
+
+ ```app/models/person.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ firstName: DS.attr('string'),
+ lastName: DS.attr('string'),
+ occupation: DS.attr('string')
+ });
+ ```
+
+ The JSON returned should look like this:
+
+ ```js
+ {
+ "person": {
+ "id": 5,
+ "firstName": "Barack",
+ "lastName": "Obama",
+ "occupation": "President"
+ }
+ }
+ ```
+
+ ### Errors
+
+ If a response is considered a failure, the JSON payload is expected to include
+ a top-level key `errors`, detailing any specific issues. For example:
+
+ ```js
+ {
+ "errors": {
+ "msg": "Something went wrong"
+ }
+ }
+ ```
+
+ This adapter does not make any assumptions as to the format of the `errors`
+ object. It will simply be passed along as is, wrapped in an instance
+ of `DS.InvalidError` or `DS.AdapterError`. The serializer can interpret it
+ afterwards.
+
+ ## Customization
+
+ ### Endpoint path customization
+
+ Endpoint paths can be prefixed with a `namespace` by setting the namespace
+ property on the adapter:
+
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+
+ export default DS.RESTAdapter.extend({
+ namespace: 'api/1'
+ });
+ ```
+ Requests for the `Person` model would now target `/api/1/people/1`.
+
+ ### Host customization
+
+ An adapter can target other hosts by setting the `host` property.
+
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+
+ export default DS.RESTAdapter.extend({
+ host: 'https://api.example.com'
+ });
+ ```
+
+ ### Headers customization
+
+ Some APIs require HTTP headers, e.g. to provide an API key. Arbitrary
+ headers can be set as key/value pairs on the `RESTAdapter`'s `headers`
+ object and Ember Data will send them along with each ajax request.
+
+
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+
+ export default DS.RESTAdapter.extend({
+ headers: {
+ "API_KEY": "secret key",
+ "ANOTHER_HEADER": "Some header value"
+ }
+ });
+ ```
+
+ `headers` can also be used as a computed property to support dynamic
+ headers. In the example below, the `session` object has been
+ injected into an adapter by Ember's container.
+
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+
+ export default DS.RESTAdapter.extend({
+ headers: Ember.computed('session.authToken', function() {
+ return {
+ "API_KEY": this.get("session.authToken"),
+ "ANOTHER_HEADER": "Some header value"
+ };
+ })
+ });
+ ```
+
+ In some cases, your dynamic headers may require data from some
+ object outside of Ember's observer system (for example
+ `document.cookie`). You can use the
+ [volatile](/api/classes/Ember.ComputedProperty.html#method_volatile)
+ function to set the property into a non-cached mode causing the headers to
+ be recomputed with every request.
+
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+
+ export default DS.RESTAdapter.extend({
+ headers: Ember.computed(function() {
+ return {
+ "API_KEY": Ember.get(document.cookie.match(/apiKey\=([^;]*)/), "1"),
+ "ANOTHER_HEADER": "Some header value"
+ };
+ }).volatile()
+ });
+ ```
+
+ @class RESTAdapter
+ @constructor
+ @namespace DS
+ @extends DS.Adapter
+ @uses DS.BuildURLMixin
+ */
+ var RESTAdapter = _emberDataAdapter['default'].extend(_emberDataPrivateAdaptersBuildUrlMixin['default'], {
+ defaultSerializer: '-rest',
+
+ /**
+ By default, the RESTAdapter will send the query params sorted alphabetically to the
+ server.
+ For example:
+ ```js
+ store.query('posts', { sort: 'price', category: 'pets' });
+ ```
+ will generate a requests like this `/posts?category=pets&sort=price`, even if the
+ parameters were specified in a different order.
+ That way the generated URL will be deterministic and that simplifies caching mechanisms
+ in the backend.
+ Setting `sortQueryParams` to a falsey value will respect the original order.
+ In case you want to sort the query parameters with a different criteria, set
+ `sortQueryParams` to your custom sort function.
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.RESTAdapter.extend({
+ sortQueryParams: function(params) {
+ var sortedKeys = Object.keys(params).sort().reverse();
+ var len = sortedKeys.length, newParams = {};
+ for (var i = 0; i < len; i++) {
+ newParams[sortedKeys[i]] = params[sortedKeys[i]];
+ }
+ return newParams;
+ }
+ });
+ ```
+ @method sortQueryParams
+ @param {Object} obj
+ @return {Object}
+ */
+ sortQueryParams: function sortQueryParams(obj) {
+ var keys = Object.keys(obj);
+ var len = keys.length;
+ if (len < 2) {
+ return obj;
+ }
+ var newQueryParams = {};
+ var sortedKeys = keys.sort();
+
+ for (var i = 0; i < len; i++) {
+ newQueryParams[sortedKeys[i]] = obj[sortedKeys[i]];
+ }
+ return newQueryParams;
+ },
+
+ /**
+ By default the RESTAdapter will send each find request coming from a `store.find`
+ or from accessing a relationship separately to the server. If your server supports passing
+ ids as a query string, you can set coalesceFindRequests to true to coalesce all find requests
+ within a single runloop.
+ For example, if you have an initial payload of:
+ ```javascript
+ {
+ post: {
+ id: 1,
+ comments: [1, 2]
+ }
+ }
+ ```
+ By default calling `post.get('comments')` will trigger the following requests(assuming the
+ comments haven't been loaded before):
+ ```
+ GET /comments/1
+ GET /comments/2
+ ```
+ If you set coalesceFindRequests to `true` it will instead trigger the following request:
+ ```
+ GET /comments?ids[]=1&ids[]=2
+ ```
+ Setting coalesceFindRequests to `true` also works for `store.find` requests and `belongsTo`
+ relationships accessed within the same runloop. If you set `coalesceFindRequests: true`
+ ```javascript
+ store.findRecord('comment', 1);
+ store.findRecord('comment', 2);
+ ```
+ will also send a request to: `GET /comments?ids[]=1&ids[]=2`
+ Note: Requests coalescing rely on URL building strategy. So if you override `buildURL` in your app
+ `groupRecordsForFindMany` more likely should be overridden as well in order for coalescing to work.
+ @property coalesceFindRequests
+ @type {boolean}
+ */
+ coalesceFindRequests: false,
+
+ /**
+ Endpoint paths can be prefixed with a `namespace` by setting the namespace
+ property on the adapter:
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.RESTAdapter.extend({
+ namespace: 'api/1'
+ });
+ ```
+ Requests for the `Post` model would now target `/api/1/post/`.
+ @property namespace
+ @type {String}
+ */
+
+ /**
+ An adapter can target other hosts by setting the `host` property.
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.RESTAdapter.extend({
+ host: 'https://api.example.com'
+ });
+ ```
+ Requests for the `Post` model would now target `https://api.example.com/post/`.
+ @property host
+ @type {String}
+ */
+
+ /**
+ Some APIs require HTTP headers, e.g. to provide an API
+ key. Arbitrary headers can be set as key/value pairs on the
+ `RESTAdapter`'s `headers` object and Ember Data will send them
+ along with each ajax request. For dynamic headers see [headers
+ customization](/api/data/classes/DS.RESTAdapter.html#toc_headers-customization).
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.RESTAdapter.extend({
+ headers: {
+ "API_KEY": "secret key",
+ "ANOTHER_HEADER": "Some header value"
+ }
+ });
+ ```
+ @property headers
+ @type {Object}
+ */
+
+ /**
+ Called by the store in order to fetch the JSON for a given
+ type and ID.
+ The `findRecord` method makes an Ajax request to a URL computed by
+ `buildURL`, and returns a promise for the resulting payload.
+ This method performs an HTTP `GET` request with the id provided as part of the query string.
+ @since 1.13.0
+ @method findRecord
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {String} id
+ @param {DS.Snapshot} snapshot
+ @return {Promise} promise
+ */
+ findRecord: function findRecord(store, type, id, snapshot) {
+ if (false && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store: store, type: type, id: id, snapshot: snapshot,
+ requestType: 'findRecord'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var url = this.buildURL(type.modelName, id, snapshot, 'findRecord');
+ var query = this.buildQuery(snapshot);
+
+ return this.ajax(url, 'GET', { data: query });
+ }
+ },
+
+ /**
+ Called by the store in order to fetch a JSON array for all
+ of the records for a given type.
+ The `findAll` method makes an Ajax (HTTP GET) request to a URL computed by `buildURL`, and returns a
+ promise for the resulting payload.
+ @method findAll
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {String} sinceToken
+ @param {DS.SnapshotRecordArray} snapshotRecordArray
+ @return {Promise} promise
+ */
+ findAll: function findAll(store, type, sinceToken, snapshotRecordArray) {
+ var query = this.buildQuery(snapshotRecordArray);
+
+ if (false && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store: store, type: type, sinceToken: sinceToken, query: query,
+ snapshots: snapshotRecordArray,
+ requestType: 'findAll'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var url = this.buildURL(type.modelName, null, snapshotRecordArray, 'findAll');
+
+ if (sinceToken) {
+ query.since = sinceToken;
+ }
+
+ return this.ajax(url, 'GET', { data: query });
+ }
+ },
+
+ /**
+ Called by the store in order to fetch a JSON array for
+ the records that match a particular query.
+ The `query` method makes an Ajax (HTTP GET) request to a URL
+ computed by `buildURL`, and returns a promise for the resulting
+ payload.
+ The `query` argument is a simple JavaScript object that will be passed directly
+ to the server as parameters.
+ @method query
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {Object} query
+ @return {Promise} promise
+ */
+ query: function query(store, type, _query) {
+ if (false && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store: store, type: type, query: _query,
+ requestType: 'query'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var url = this.buildURL(type.modelName, null, null, 'query', _query);
+
+ if (this.sortQueryParams) {
+ _query = this.sortQueryParams(_query);
+ }
+
+ return this.ajax(url, 'GET', { data: _query });
+ }
+ },
+
+ /**
+ Called by the store in order to fetch a JSON object for
+ the record that matches a particular query.
+ The `queryRecord` method makes an Ajax (HTTP GET) request to a URL
+ computed by `buildURL`, and returns a promise for the resulting
+ payload.
+ The `query` argument is a simple JavaScript object that will be passed directly
+ to the server as parameters.
+ @since 1.13.0
+ @method queryRecord
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {Object} query
+ @return {Promise} promise
+ */
+ queryRecord: function queryRecord(store, type, query) {
+ if (false && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store: store, type: type, query: query,
+ requestType: 'queryRecord'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var url = this.buildURL(type.modelName, null, null, 'queryRecord', query);
+
+ if (this.sortQueryParams) {
+ query = this.sortQueryParams(query);
+ }
+
+ return this.ajax(url, 'GET', { data: query });
+ }
+ },
+
+ /**
+ Called by the store in order to fetch several records together if `coalesceFindRequests` is true
+ For example, if the original payload looks like:
+ ```js
+ {
+ "id": 1,
+ "title": "Rails is omakase",
+ "comments": [ 1, 2, 3 ]
+ }
+ ```
+ The IDs will be passed as a URL-encoded Array of IDs, in this form:
+ ```
+ ids[]=1&ids[]=2&ids[]=3
+ ```
+ Many servers, such as Rails and PHP, will automatically convert this URL-encoded array
+ into an Array for you on the server-side. If you want to encode the
+ IDs, differently, just override this (one-line) method.
+ The `findMany` method makes an Ajax (HTTP GET) request to a URL computed by `buildURL`, and returns a
+ promise for the resulting payload.
+ @method findMany
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {Array} ids
+ @param {Array} snapshots
+ @return {Promise} promise
+ */
+ findMany: function findMany(store, type, ids, snapshots) {
+ if (false && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store: store, type: type, ids: ids, snapshots: snapshots,
+ requestType: 'findMany'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var url = this.buildURL(type.modelName, ids, snapshots, 'findMany');
+ return this.ajax(url, 'GET', { data: { ids: ids } });
+ }
+ },
+
+ /**
+ Called by the store in order to fetch a JSON array for
+ the unloaded records in a has-many relationship that were originally
+ specified as a URL (inside of `links`).
+ For example, if your original payload looks like this:
+ ```js
+ {
+ "post": {
+ "id": 1,
+ "title": "Rails is omakase",
+ "links": { "comments": "/posts/1/comments" }
+ }
+ }
+ ```
+ This method will be called with the parent record and `/posts/1/comments`.
+ The `findHasMany` method will make an Ajax (HTTP GET) request to the originally specified URL.
+ The format of your `links` value will influence the final request URL via the `urlPrefix` method:
+ * Links beginning with `//`, `http://`, `https://`, will be used as is, with no further manipulation.
+ * Links beginning with a single `/` will have the current adapter's `host` value prepended to it.
+ * Links with no beginning `/` will have a parentURL prepended to it, via the current adapter's `buildURL`.
+ @method findHasMany
+ @param {DS.Store} store
+ @param {DS.Snapshot} snapshot
+ @param {String} url
+ @return {Promise} promise
+ */
+ findHasMany: function findHasMany(store, snapshot, url, relationship) {
+ if (false && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store: store, snapshot: snapshot, url: url, relationship: relationship,
+ requestType: 'findHasMany'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var id = snapshot.id;
+ var type = snapshot.modelName;
+
+ url = this.urlPrefix(url, this.buildURL(type, id, snapshot, 'findHasMany'));
+
+ return this.ajax(url, 'GET');
+ }
+ },
+
+ /**
+ Called by the store in order to fetch the JSON for the unloaded record in a
+ belongs-to relationship that was originally specified as a URL (inside of
+ `links`).
+ For example, if your original payload looks like this:
+ ```js
+ {
+ "person": {
+ "id": 1,
+ "name": "Tom Dale",
+ "links": { "group": "/people/1/group" }
+ }
+ }
+ ```
+ This method will be called with the parent record and `/people/1/group`.
+ The `findBelongsTo` method will make an Ajax (HTTP GET) request to the originally specified URL.
+ The format of your `links` value will influence the final request URL via the `urlPrefix` method:
+ * Links beginning with `//`, `http://`, `https://`, will be used as is, with no further manipulation.
+ * Links beginning with a single `/` will have the current adapter's `host` value prepended to it.
+ * Links with no beginning `/` will have a parentURL prepended to it, via the current adapter's `buildURL`.
+ @method findBelongsTo
+ @param {DS.Store} store
+ @param {DS.Snapshot} snapshot
+ @param {String} url
+ @return {Promise} promise
+ */
+ findBelongsTo: function findBelongsTo(store, snapshot, url, relationship) {
+ if (false && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store: store, snapshot: snapshot, url: url, relationship: relationship,
+ requestType: 'findBelongsTo'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var id = snapshot.id;
+ var type = snapshot.modelName;
+
+ url = this.urlPrefix(url, this.buildURL(type, id, snapshot, 'findBelongsTo'));
+ return this.ajax(url, 'GET');
+ }
+ },
+
+ /**
+ Called by the store when a newly created record is
+ saved via the `save` method on a model record instance.
+ The `createRecord` method serializes the record and makes an Ajax (HTTP POST) request
+ to a URL computed by `buildURL`.
+ See `serialize` for information on how to customize the serialized form
+ of a record.
+ @method createRecord
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {DS.Snapshot} snapshot
+ @return {Promise} promise
+ */
+ createRecord: function createRecord(store, type, snapshot) {
+ if (false && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store: store, type: type, snapshot: snapshot,
+ requestType: 'createRecord'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var data = {};
+ var serializer = store.serializerFor(type.modelName);
+ var url = this.buildURL(type.modelName, null, snapshot, 'createRecord');
+
+ serializer.serializeIntoHash(data, type, snapshot, { includeId: true });
+
+ return this.ajax(url, "POST", { data: data });
+ }
+ },
+
+ /**
+ Called by the store when an existing record is saved
+ via the `save` method on a model record instance.
+ The `updateRecord` method serializes the record and makes an Ajax (HTTP PUT) request
+ to a URL computed by `buildURL`.
+ See `serialize` for information on how to customize the serialized form
+ of a record.
+ @method updateRecord
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {DS.Snapshot} snapshot
+ @return {Promise} promise
+ */
+ updateRecord: function updateRecord(store, type, snapshot) {
+ if (false && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store: store, type: type, snapshot: snapshot,
+ requestType: 'updateRecord'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var data = {};
+ var serializer = store.serializerFor(type.modelName);
+
+ serializer.serializeIntoHash(data, type, snapshot);
+
+ var id = snapshot.id;
+ var url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');
+
+ return this.ajax(url, "PUT", { data: data });
+ }
+ },
+
+ /**
+ Called by the store when a record is deleted.
+ The `deleteRecord` method makes an Ajax (HTTP DELETE) request to a URL computed by `buildURL`.
+ @method deleteRecord
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {DS.Snapshot} snapshot
+ @return {Promise} promise
+ */
+ deleteRecord: function deleteRecord(store, type, snapshot) {
+ if (false && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store: store, type: type, snapshot: snapshot,
+ requestType: 'deleteRecord'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var id = snapshot.id;
+
+ return this.ajax(this.buildURL(type.modelName, id, snapshot, 'deleteRecord'), "DELETE");
+ }
+ },
+
+ _stripIDFromURL: function _stripIDFromURL(store, snapshot) {
+ var url = this.buildURL(snapshot.modelName, snapshot.id, snapshot);
+
+ var expandedURL = url.split('/');
+ // Case when the url is of the format ...something/:id
+ // We are decodeURIComponent-ing the lastSegment because if it represents
+ // the id, it has been encodeURIComponent-ified within `buildURL`. If we
+ // don't do this, then records with id having special characters are not
+ // coalesced correctly (see GH #4190 for the reported bug)
+ var lastSegment = expandedURL[expandedURL.length - 1];
+ var id = snapshot.id;
+ if (decodeURIComponent(lastSegment) === id) {
+ expandedURL[expandedURL.length - 1] = "";
+ } else if (endsWith(lastSegment, '?id=' + id)) {
+ //Case when the url is of the format ...something?id=:id
+ expandedURL[expandedURL.length - 1] = lastSegment.substring(0, lastSegment.length - id.length - 1);
+ }
+
+ return expandedURL.join('/');
+ },
+
+ // http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers
+ maxURLLength: 2048,
+
+ /**
+ Organize records into groups, each of which is to be passed to separate
+ calls to `findMany`.
+ This implementation groups together records that have the same base URL but
+ differing ids. For example `/comments/1` and `/comments/2` will be grouped together
+ because we know findMany can coalesce them together as `/comments?ids[]=1&ids[]=2`
+ It also supports urls where ids are passed as a query param, such as `/comments?id=1`
+ but not those where there is more than 1 query param such as `/comments?id=2&name=David`
+ Currently only the query param of `id` is supported. If you need to support others, please
+ override this or the `_stripIDFromURL` method.
+ It does not group records that have differing base urls, such as for example: `/posts/1/comments/2`
+ and `/posts/2/comments/3`
+ @method groupRecordsForFindMany
+ @param {DS.Store} store
+ @param {Array} snapshots
+ @return {Array} an array of arrays of records, each of which is to be
+ loaded separately by `findMany`.
+ */
+ groupRecordsForFindMany: function groupRecordsForFindMany(store, snapshots) {
+ var groups = MapWithDefault.create({ defaultValue: function defaultValue() {
+ return [];
+ } });
+ var adapter = this;
+ var maxURLLength = this.maxURLLength;
+
+ snapshots.forEach(function (snapshot) {
+ var baseUrl = adapter._stripIDFromURL(store, snapshot);
+ groups.get(baseUrl).push(snapshot);
+ });
+
+ function splitGroupToFitInUrl(group, maxURLLength, paramNameLength) {
+ var baseUrl = adapter._stripIDFromURL(store, group[0]);
+ var idsSize = 0;
+ var splitGroups = [[]];
+
+ group.forEach(function (snapshot) {
+ var additionalLength = encodeURIComponent(snapshot.id).length + paramNameLength;
+ if (baseUrl.length + idsSize + additionalLength >= maxURLLength) {
+ idsSize = 0;
+ splitGroups.push([]);
+ }
+
+ idsSize += additionalLength;
+
+ var lastGroupIndex = splitGroups.length - 1;
+ splitGroups[lastGroupIndex].push(snapshot);
+ });
+
+ return splitGroups;
+ }
+
+ var groupsArray = [];
+ groups.forEach(function (group, key) {
+ var paramNameLength = '&ids%5B%5D='.length;
+ var splitGroups = splitGroupToFitInUrl(group, maxURLLength, paramNameLength);
+
+ splitGroups.forEach(function (splitGroup) {
+ return groupsArray.push(splitGroup);
+ });
+ });
+
+ return groupsArray;
+ },
+
+ /**
+ Takes an ajax response, and returns the json payload or an error.
+ By default this hook just returns the json payload passed to it.
+ You might want to override it in two cases:
+ 1. Your API might return useful results in the response headers.
+ Response headers are passed in as the second argument.
+ 2. Your API might return errors as successful responses with status code
+ 200 and an Errors text or object. You can return a `DS.InvalidError` or a
+ `DS.AdapterError` (or a sub class) from this hook and it will automatically
+ reject the promise and put your record into the invalid or error state.
+ Returning a `DS.InvalidError` from this method will cause the
+ record to transition into the `invalid` state and make the
+ `errors` object available on the record. When returning an
+ `DS.InvalidError` the store will attempt to normalize the error data
+ returned from the server using the serializer's `extractErrors`
+ method.
+ @since 1.13.0
+ @method handleResponse
+ @param {Number} status
+ @param {Object} headers
+ @param {Object} payload
+ @param {Object} requestData - the original request information
+ @return {Object | DS.AdapterError} response
+ */
+ handleResponse: function handleResponse(status, headers, payload, requestData) {
+ if (this.isSuccess(status, headers, payload)) {
+ return payload;
+ } else if (this.isInvalid(status, headers, payload)) {
+ return new _emberDataAdaptersErrors.InvalidError(payload.errors);
+ }
+
+ var errors = this.normalizeErrorResponse(status, headers, payload);
+ var detailedMessage = this.generatedDetailedMessage(status, headers, payload, requestData);
+
+ if (false) {
+ switch (status) {
+ case 401:
+ return new _emberDataAdaptersErrors.UnauthorizedError(errors, detailedMessage);
+ case 403:
+ return new _emberDataAdaptersErrors.ForbiddenError(errors, detailedMessage);
+ case 404:
+ return new _emberDataAdaptersErrors.NotFoundError(errors, detailedMessage);
+ case 409:
+ return new _emberDataAdaptersErrors.ConflictError(errors, detailedMessage);
+ default:
+ if (status >= 500) {
+ return new _emberDataAdaptersErrors.ServerError(errors, detailedMessage);
+ }
+ }
+ }
+
+ return new _emberDataAdaptersErrors.AdapterError(errors, detailedMessage);
+ },
+
+ /**
+ Default `handleResponse` implementation uses this hook to decide if the
+ response is a success.
+ @since 1.13.0
+ @method isSuccess
+ @param {Number} status
+ @param {Object} headers
+ @param {Object} payload
+ @return {Boolean}
+ */
+ isSuccess: function isSuccess(status, headers, payload) {
+ return status >= 200 && status < 300 || status === 304;
+ },
+
+ /**
+ Default `handleResponse` implementation uses this hook to decide if the
+ response is a an invalid error.
+ @since 1.13.0
+ @method isInvalid
+ @param {Number} status
+ @param {Object} headers
+ @param {Object} payload
+ @return {Boolean}
+ */
+ isInvalid: function isInvalid(status, headers, payload) {
+ return status === 422;
+ },
+
+ /**
+ Takes a URL, an HTTP method and a hash of data, and makes an
+ HTTP request.
+ When the server responds with a payload, Ember Data will call into `extractSingle`
+ or `extractArray` (depending on whether the original query was for one record or
+ many records).
+ By default, `ajax` method has the following behavior:
+ * It sets the response `dataType` to `"json"`
+ * If the HTTP method is not `"GET"`, it sets the `Content-Type` to be
+ `application/json; charset=utf-8`
+ * If the HTTP method is not `"GET"`, it stringifies the data passed in. The
+ data is the serialized record in the case of a save.
+ * Registers success and failure handlers.
+ @method ajax
+ @private
+ @param {String} url
+ @param {String} type The request type GET, POST, PUT, DELETE etc.
+ @param {Object} options
+ @return {Promise} promise
+ */
+ ajax: function ajax(url, type, options) {
+ var adapter = this;
+
+ var requestData = {
+ url: url,
+ method: type
+ };
+
+ return new Promise(function (resolve, reject) {
+ var hash = adapter.ajaxOptions(url, type, options);
+
+ hash.success = function (payload, textStatus, jqXHR) {
+ var response = ajaxSuccess(adapter, jqXHR, payload, requestData);
+ _ember['default'].run.join(null, resolve, response);
+ };
+
+ hash.error = function (jqXHR, textStatus, errorThrown) {
+ var responseData = {
+ textStatus: textStatus,
+ errorThrown: errorThrown
+ };
+ var error = ajaxError(adapter, jqXHR, requestData, responseData);
+ _ember['default'].run.join(null, reject, error);
+ };
+
+ adapter._ajaxRequest(hash);
+ }, 'DS: RESTAdapter#ajax ' + type + ' to ' + url);
+ },
+
+ /**
+ @method _ajaxRequest
+ @private
+ @param {Object} options jQuery ajax options to be used for the ajax request
+ */
+ _ajaxRequest: function _ajaxRequest(options) {
+ _ember['default'].$.ajax(options);
+ },
+
+ /**
+ @method ajaxOptions
+ @private
+ @param {String} url
+ @param {String} type The request type GET, POST, PUT, DELETE etc.
+ @param {Object} options
+ @return {Object}
+ */
+ ajaxOptions: function ajaxOptions(url, type, options) {
+ var hash = options || {};
+ hash.url = url;
+ hash.type = type;
+ hash.dataType = 'json';
+ hash.context = this;
+
+ if (hash.data && type !== 'GET') {
+ hash.contentType = 'application/json; charset=utf-8';
+ hash.data = JSON.stringify(hash.data);
+ }
+
+ var headers = get(this, 'headers');
+ if (headers !== undefined) {
+ hash.beforeSend = function (xhr) {
+ Object.keys(headers).forEach(function (key) {
+ return xhr.setRequestHeader(key, headers[key]);
+ });
+ };
+ }
+
+ return hash;
+ },
+
+ /**
+ @method parseErrorResponse
+ @private
+ @param {String} responseText
+ @return {Object}
+ */
+ parseErrorResponse: function parseErrorResponse(responseText) {
+ var json = responseText;
+
+ try {
+ json = _ember['default'].$.parseJSON(responseText);
+ } catch (e) {
+ // ignored
+ }
+
+ return json;
+ },
+
+ /**
+ @method normalizeErrorResponse
+ @private
+ @param {Number} status
+ @param {Object} headers
+ @param {Object} payload
+ @return {Array} errors payload
+ */
+ normalizeErrorResponse: function normalizeErrorResponse(status, headers, payload) {
+ if (payload && typeof payload === 'object' && payload.errors) {
+ return payload.errors;
+ } else {
+ return [{
+ status: '' + status,
+ title: "The backend responded with an error",
+ detail: '' + payload
+ }];
+ }
+ },
+
+ /**
+ Generates a detailed ("friendly") error message, with plenty
+ of information for debugging (good luck!)
+ @method generatedDetailedMessage
+ @private
+ @param {Number} status
+ @param {Object} headers
+ @param {Object} payload
+ @param {Object} requestData
+ @return {String} detailed error message
+ */
+ generatedDetailedMessage: function generatedDetailedMessage(status, headers, payload, requestData) {
+ var shortenedPayload;
+ var payloadContentType = headers["Content-Type"] || "Empty Content-Type";
+
+ if (payloadContentType === "text/html" && payload.length > 250) {
+ shortenedPayload = "[Omitted Lengthy HTML]";
+ } else {
+ shortenedPayload = payload;
+ }
+
+ var requestDescription = requestData.method + ' ' + requestData.url;
+ var payloadDescription = 'Payload (' + payloadContentType + ')';
+
+ return ['Ember Data Request ' + requestDescription + ' returned a ' + status, payloadDescription, shortenedPayload].join('\n');
+ },
+
+ // @since 2.5.0
+ buildQuery: function buildQuery(snapshot) {
+ var query = {};
+
+ if (snapshot) {
+ var include = snapshot.include;
+
+ if (include) {
+ query.include = include;
+ }
+ }
+
+ return query;
+ },
+
+ _hasCustomizedAjax: function _hasCustomizedAjax() {
+ if (this.ajax !== RESTAdapter.prototype.ajax) {
+ (0, _emberDataPrivateDebug.deprecate)('RESTAdapter#ajax has been deprecated please use. `methodForRequest`, `urlForRequest`, `headersForRequest` or `dataForRequest` instead.', false, {
+ id: 'ds.rest-adapter.ajax',
+ until: '3.0.0'
+ });
+ return true;
+ }
+
+ if (this.ajaxOptions !== RESTAdapter.prototype.ajaxOptions) {
+ (0, _emberDataPrivateDebug.deprecate)('RESTAdapter#ajaxOptions has been deprecated please use. `methodForRequest`, `urlForRequest`, `headersForRequest` or `dataForRequest` instead.', false, {
+ id: 'ds.rest-adapter.ajax-options',
+ until: '3.0.0'
+ });
+ return true;
+ }
+
+ return false;
+ }
+ });
+
+ if (false) {
+
+ RESTAdapter.reopen({
+
+ /**
+ * Get the data (body or query params) for a request.
+ *
+ * @public
+ * @method dataForRequest
+ * @param {Object} params
+ * @return {Object} data
+ */
+ dataForRequest: function dataForRequest(params) {
+ var store = params.store;
+ var type = params.type;
+ var snapshot = params.snapshot;
+ var requestType = params.requestType;
+ var query = params.query;
+
+ // type is not passed to findBelongsTo and findHasMany
+ type = type || snapshot && snapshot.type;
+
+ var serializer = store.serializerFor(type.modelName);
+ var data = {};
+
+ switch (requestType) {
+ case 'createRecord':
+ serializer.serializeIntoHash(data, type, snapshot, { includeId: true });
+ break;
+
+ case 'updateRecord':
+ serializer.serializeIntoHash(data, type, snapshot);
+ break;
+
+ case 'findRecord':
+ data = this.buildQuery(snapshot);
+ break;
+
+ case 'findAll':
+ if (params.sinceToken) {
+ query = query || {};
+ query.since = params.sinceToken;
+ }
+ data = query;
+ break;
+
+ case 'query':
+ case 'queryRecord':
+ if (this.sortQueryParams) {
+ query = this.sortQueryParams(query);
+ }
+ data = query;
+ break;
+
+ case 'findMany':
+ data = { ids: params.ids };
+ break;
+
+ default:
+ data = undefined;
+ break;
+ }
+
+ return data;
+ },
+
+ /**
+ * Get the HTTP method for a request.
+ *
+ * @public
+ * @method methodForRequest
+ * @param {Object} params
+ * @return {String} HTTP method
+ */
+ methodForRequest: function methodForRequest(params) {
+ var requestType = params.requestType;
+
+ switch (requestType) {
+ case 'createRecord':
+ return 'POST';
+ case 'updateRecord':
+ return 'PUT';
+ case 'deleteRecord':
+ return 'DELETE';
+ }
+
+ return 'GET';
+ },
+
+ /**
+ * Get the URL for a request.
+ *
+ * @public
+ * @method urlForRequest
+ * @param {Object} params
+ * @return {String} URL
+ */
+ urlForRequest: function urlForRequest(params) {
+ var type = params.type;
+ var id = params.id;
+ var ids = params.ids;
+ var snapshot = params.snapshot;
+ var snapshots = params.snapshots;
+ var requestType = params.requestType;
+ var query = params.query;
+
+ // type and id are not passed from updateRecord and deleteRecord, hence they
+ // are defined if not set
+ type = type || snapshot && snapshot.type;
+ id = id || snapshot && snapshot.id;
+
+ switch (requestType) {
+ case 'findAll':
+ return this.buildURL(type.modelName, null, snapshots, requestType);
+
+ case 'query':
+ case 'queryRecord':
+ return this.buildURL(type.modelName, null, null, requestType, query);
+
+ case 'findMany':
+ return this.buildURL(type.modelName, ids, snapshots, requestType);
+
+ case 'findHasMany':
+ case 'findBelongsTo':
+ {
+ var url = this.buildURL(type.modelName, id, snapshot, requestType);
+ return this.urlPrefix(params.url, url);
+ }
+ }
+
+ return this.buildURL(type.modelName, id, snapshot, requestType, query);
+ },
+
+ /**
+ * Get the headers for a request.
+ *
+ * By default the value of the `headers` property of the adapter is
+ * returned.
+ *
+ * @public
+ * @method headersForRequest
+ * @param {Object} params
+ * @return {Object} headers
+ */
+ headersForRequest: function headersForRequest(params) {
+ return this.get('headers');
+ },
+
+ /**
+ * Get an object which contains all properties for a request which should
+ * be made.
+ *
+ * @private
+ * @method _requestFor
+ * @param {Object} params
+ * @return {Object} request object
+ */
+ _requestFor: function _requestFor(params) {
+ var method = this.methodForRequest(params);
+ var url = this.urlForRequest(params);
+ var headers = this.headersForRequest(params);
+ var data = this.dataForRequest(params);
+
+ return { method: method, url: url, headers: headers, data: data };
+ },
+
+ /**
+ * Convert a request object into a hash which can be passed to `jQuery.ajax`.
+ *
+ * @private
+ * @method _requestToJQueryAjaxHash
+ * @param {Object} request
+ * @return {Object} jQuery ajax hash
+ */
+ _requestToJQueryAjaxHash: function _requestToJQueryAjaxHash(request) {
+ var hash = {};
+
+ hash.type = request.method;
+ hash.url = request.url;
+ hash.dataType = 'json';
+ hash.context = this;
+
+ if (request.data) {
+ if (request.method !== 'GET') {
+ hash.contentType = 'application/json; charset=utf-8';
+ hash.data = JSON.stringify(request.data);
+ } else {
+ hash.data = request.data;
+ }
+ }
+
+ var headers = request.headers;
+ if (headers !== undefined) {
+ hash.beforeSend = function (xhr) {
+ Object.keys(headers).forEach(function (key) {
+ return xhr.setRequestHeader(key, headers[key]);
+ });
+ };
+ }
+
+ return hash;
+ },
+
+ /**
+ * Make a request using `jQuery.ajax`.
+ *
+ * @private
+ * @method _makeRequest
+ * @param {Object} request
+ * @return {Promise} promise
+ */
+ _makeRequest: function _makeRequest(request) {
+ var adapter = this;
+ var hash = this._requestToJQueryAjaxHash(request);
+
+ var method = request.method;
+ var url = request.url;
+
+ var requestData = { method: method, url: url };
+
+ return new _ember['default'].RSVP.Promise(function (resolve, reject) {
+
+ hash.success = function (payload, textStatus, jqXHR) {
+ var response = ajaxSuccess(adapter, jqXHR, payload, requestData);
+ _ember['default'].run.join(null, resolve, response);
+ };
+
+ hash.error = function (jqXHR, textStatus, errorThrown) {
+ var responseData = {
+ textStatus: textStatus,
+ errorThrown: errorThrown
+ };
+ var error = ajaxError(adapter, jqXHR, requestData, responseData);
+ _ember['default'].run.join(null, reject, error);
+ };
+
+ adapter._ajaxRequest(hash);
+ }, 'DS: RESTAdapter#makeRequest: ' + method + ' ' + url);
+ }
+ });
+ }
+
+ function ajaxSuccess(adapter, jqXHR, payload, requestData) {
+ var response = undefined;
+ try {
+ response = adapter.handleResponse(jqXHR.status, (0, _emberDataPrivateUtilsParseResponseHeaders['default'])(jqXHR.getAllResponseHeaders()), payload, requestData);
+ } catch (error) {
+ return Promise.reject(error);
+ }
+
+ if (response && response.isAdapterError) {
+ return Promise.reject(response);
+ } else {
+ return response;
+ }
+ }
+
+ function ajaxError(adapter, jqXHR, requestData, responseData) {
+ (0, _emberDataPrivateDebug.runInDebug)(function () {
+ var message = 'The server returned an empty string for ' + requestData.method + ' ' + requestData.url + ', which cannot be parsed into a valid JSON. Return either null or {}.';
+ var validJSONString = !(responseData.textStatus === "parsererror" && jqXHR.responseText === "");
+ (0, _emberDataPrivateDebug.warn)(message, validJSONString, {
+ id: 'ds.adapter.returned-empty-string-as-JSON'
+ });
+ });
+
+ var error = undefined;
+
+ if (responseData.errorThrown instanceof Error) {
+ error = responseData.errorThrown;
+ } else if (responseData.textStatus === 'timeout') {
+ error = new _emberDataAdaptersErrors.TimeoutError();
+ } else if (responseData.textStatus === 'abort') {
+ error = new _emberDataAdaptersErrors.AbortError();
+ } else {
+ try {
+ error = adapter.handleResponse(jqXHR.status, (0, _emberDataPrivateUtilsParseResponseHeaders['default'])(jqXHR.getAllResponseHeaders()), adapter.parseErrorResponse(jqXHR.responseText) || responseData.errorThrown, requestData);
+ } catch (e) {
+ error = e;
+ }
+ }
+
+ return error;
+ }
+
+ //From http://stackoverflow.com/questions/280634/endswith-in-javascript
+ function endsWith(string, suffix) {
+ if (typeof String.prototype.endsWith !== 'function') {
+ return string.indexOf(suffix, string.length - suffix.length) !== -1;
+ } else {
+ return string.endsWith(suffix);
+ }
+ }
+
+ exports['default'] = RESTAdapter;
+});
+define('ember-data/attr', ['exports', 'ember', 'ember-data/-private/debug'], function (exports, _ember, _emberDataPrivateDebug) {
+ 'use strict';
+
+ exports['default'] = attr;
+
+ /**
+ @module ember-data
+ */
+
+ function getDefaultValue(record, options, key) {
+ if (typeof options.defaultValue === 'function') {
+ return options.defaultValue.apply(null, arguments);
+ } else {
+ var defaultValue = options.defaultValue;
+ (0, _emberDataPrivateDebug.deprecate)('Non primitive defaultValues are deprecated because they are shared between all instances. If you would like to use a complex object as a default value please provide a function that returns the complex object.', typeof defaultValue !== 'object' || defaultValue === null, {
+ id: 'ds.defaultValue.complex-object',
+ until: '3.0.0'
+ });
+ return defaultValue;
+ }
+ }
+
+ function hasValue(record, key) {
+ return key in record._attributes || key in record._inFlightAttributes || key in record._data;
+ }
+
+ function getValue(record, key) {
+ if (key in record._attributes) {
+ return record._attributes[key];
+ } else if (key in record._inFlightAttributes) {
+ return record._inFlightAttributes[key];
+ } else {
+ return record._data[key];
+ }
+ }
+
+ /**
+ `DS.attr` defines an attribute on a [DS.Model](/api/data/classes/DS.Model.html).
+ By default, attributes are passed through as-is, however you can specify an
+ optional type to have the value automatically transformed.
+ Ember Data ships with four basic transform types: `string`, `number`,
+ `boolean` and `date`. You can define your own transforms by subclassing
+ [DS.Transform](/api/data/classes/DS.Transform.html).
+
+ Note that you cannot use `attr` to define an attribute of `id`.
+
+ `DS.attr` takes an optional hash as a second parameter, currently
+ supported options are:
+
+ - `defaultValue`: Pass a string or a function to be called to set the attribute
+ to a default value if none is supplied.
+
+ Example
+
+ ```app/models/user.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ username: DS.attr('string'),
+ email: DS.attr('string'),
+ verified: DS.attr('boolean', { defaultValue: false })
+ });
+ ```
+
+ Default value can also be a function. This is useful it you want to return
+ a new object for each attribute.
+
+ ```app/models/user.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ username: attr('string'),
+ email: attr('string'),
+ settings: attr({defaultValue: function() {
+ return {};
+ }})
+ });
+ ```
+
+ The `options` hash is passed as second argument to a transforms'
+ `serialize` and `deserialize` method. This allows to configure a
+ transformation and adapt the corresponding value, based on the config:
+
+ ```app/models/post.js
+ export default DS.Model.extend({
+ text: DS.attr('text', {
+ uppercase: true
+ })
+ });
+ ```
+
+ ```app/transforms/text.js
+ export default DS.Transform.extend({
+ serialize: function(value, options) {
+ if (options.uppercase) {
+ return value.toUpperCase();
+ }
+
+ return value;
+ },
+
+ deserialize: function(value) {
+ return value;
+ }
+ })
+ ```
+
+ @namespace
+ @method attr
+ @for DS
+ @param {String} type the attribute type
+ @param {Object} options a hash of options
+ @return {Attribute}
+ */
+ function attr(type, options) {
+ if (typeof type === 'object') {
+ options = type;
+ type = undefined;
+ } else {
+ options = options || {};
+ }
+
+ var meta = {
+ type: type,
+ isAttribute: true,
+ options: options
+ };
+
+ return _ember['default'].computed({
+ get: function get(key) {
+ var internalModel = this._internalModel;
+ if (hasValue(internalModel, key)) {
+ return getValue(internalModel, key);
+ } else {
+ return getDefaultValue(this, options, key);
+ }
+ },
+ set: function set(key, value) {
+ var internalModel = this._internalModel;
+ var oldValue = getValue(internalModel, key);
+ var originalValue;
+
+ if (value !== oldValue) {
+ // Add the new value to the changed attributes hash; it will get deleted by
+ // the 'didSetProperty' handler if it is no different from the original value
+ internalModel._attributes[key] = value;
+
+ if (key in internalModel._inFlightAttributes) {
+ originalValue = internalModel._inFlightAttributes[key];
+ } else {
+ originalValue = internalModel._data[key];
+ }
+
+ this._internalModel.send('didSetProperty', {
+ name: key,
+ oldValue: oldValue,
+ originalValue: originalValue,
+ value: value
+ });
+ }
+
+ return value;
+ }
+ }).meta(meta);
+ }
+});
+define("ember-data/index", ["exports", "ember", "ember-data/-private/debug", "ember-data/-private/features", "ember-data/-private/global", "ember-data/-private/core", "ember-data/-private/system/normalize-model-name", "ember-data/-private/system/model/internal-model", "ember-data/-private/system/promise-proxies", "ember-data/-private/system/store", "ember-data/-private/system/model", "ember-data/model", "ember-data/-private/system/snapshot", "ember-data/adapter", "ember-data/serializer", "ember-data/-private/system/debug", "ember-data/adapters/errors", "ember-data/-private/system/record-arrays", "ember-data/-private/system/many-array", "ember-data/-private/system/record-array-manager", "ember-data/-private/adapters", "ember-data/-private/adapters/build-url-mixin", "ember-data/-private/serializers", "ember-inflector", "ember-data/serializers/embedded-records-mixin", "ember-data/-private/transforms", "ember-data/relationships", "ember-data/setup-container", "ember-data/-private/instance-initializers/initialize-store-service", "ember-data/-private/system/container-proxy", "ember-data/-private/system/relationships/state/relationship"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateFeatures, _emberDataPrivateGlobal, _emberDataPrivateCore, _emberDataPrivateSystemNormalizeModelName, _emberDataPrivateSystemModelInternalModel, _emberDataPrivateSystemPromiseProxies, _emberDataPrivateSystemStore, _emberDataPrivateSystemModel, _emberDataModel, _emberDataPrivateSystemSnapshot, _emberDataAdapter, _emberDataSerializer, _emberDataPrivateSystemDebug, _emberDataAdaptersErrors, _emberDataPrivateSystemRecordArrays, _emberDataPrivateSystemManyArray, _emberDataPrivateSystemRecordArrayManager, _emberDataPrivateAdapters, _emberDataPrivateAdaptersBuildUrlMixin, _emberDataPrivateSerializers, _emberInflector, _emberDataSerializersEmbeddedRecordsMixin, _emberDataPrivateTransforms, _emberDataRelationships, _emberDataSetupContainer, _emberDataPrivateInstanceInitializersInitializeStoreService, _emberDataPrivateSystemContainerProxy, _emberDataPrivateSystemRelationshipsStateRelationship) {
+ "use strict";
+
+ if (_ember["default"].VERSION.match(/^1\.([0-9]|1[0-2])\./)) {
+ throw new _ember["default"].Error("Ember Data requires at least Ember 1.13.0, but you have " + _ember["default"].VERSION + ". Please upgrade your version of Ember, then upgrade Ember Data.");
+ }_emberDataPrivateCore["default"].Store = _emberDataPrivateSystemStore.Store;
+ _emberDataPrivateCore["default"].PromiseArray = _emberDataPrivateSystemPromiseProxies.PromiseArray;
+ _emberDataPrivateCore["default"].PromiseObject = _emberDataPrivateSystemPromiseProxies.PromiseObject;
+
+ _emberDataPrivateCore["default"].PromiseManyArray = _emberDataPrivateSystemPromiseProxies.PromiseManyArray;
+
+ _emberDataPrivateCore["default"].Model = _emberDataModel["default"];
+ _emberDataPrivateCore["default"].RootState = _emberDataPrivateSystemModel.RootState;
+ _emberDataPrivateCore["default"].attr = _emberDataPrivateSystemModel.attr;
+ _emberDataPrivateCore["default"].Errors = _emberDataPrivateSystemModel.Errors;
+
+ _emberDataPrivateCore["default"].InternalModel = _emberDataPrivateSystemModelInternalModel["default"];
+ _emberDataPrivateCore["default"].Snapshot = _emberDataPrivateSystemSnapshot["default"];
+
+ _emberDataPrivateCore["default"].Adapter = _emberDataAdapter["default"];
+
+ _emberDataPrivateCore["default"].AdapterError = _emberDataAdaptersErrors.AdapterError;
+ _emberDataPrivateCore["default"].InvalidError = _emberDataAdaptersErrors.InvalidError;
+ _emberDataPrivateCore["default"].TimeoutError = _emberDataAdaptersErrors.TimeoutError;
+ _emberDataPrivateCore["default"].AbortError = _emberDataAdaptersErrors.AbortError;
+
+ if (false) {
+ _emberDataPrivateCore["default"].UnauthorizedError = _emberDataAdaptersErrors.UnauthorizedError;
+ _emberDataPrivateCore["default"].ForbiddenError = _emberDataAdaptersErrors.ForbiddenError;
+ _emberDataPrivateCore["default"].NotFoundError = _emberDataAdaptersErrors.NotFoundError;
+ _emberDataPrivateCore["default"].ConflictError = _emberDataAdaptersErrors.ConflictError;
+ _emberDataPrivateCore["default"].ServerError = _emberDataAdaptersErrors.ServerError;
+ }
+
+ _emberDataPrivateCore["default"].errorsHashToArray = _emberDataAdaptersErrors.errorsHashToArray;
+ _emberDataPrivateCore["default"].errorsArrayToHash = _emberDataAdaptersErrors.errorsArrayToHash;
+
+ _emberDataPrivateCore["default"].Serializer = _emberDataSerializer["default"];
+
+ _emberDataPrivateCore["default"].DebugAdapter = _emberDataPrivateSystemDebug["default"];
+
+ _emberDataPrivateCore["default"].RecordArray = _emberDataPrivateSystemRecordArrays.RecordArray;
+ _emberDataPrivateCore["default"].FilteredRecordArray = _emberDataPrivateSystemRecordArrays.FilteredRecordArray;
+ _emberDataPrivateCore["default"].AdapterPopulatedRecordArray = _emberDataPrivateSystemRecordArrays.AdapterPopulatedRecordArray;
+ _emberDataPrivateCore["default"].ManyArray = _emberDataPrivateSystemManyArray["default"];
+
+ _emberDataPrivateCore["default"].RecordArrayManager = _emberDataPrivateSystemRecordArrayManager["default"];
+
+ _emberDataPrivateCore["default"].RESTAdapter = _emberDataPrivateAdapters.RESTAdapter;
+ _emberDataPrivateCore["default"].BuildURLMixin = _emberDataPrivateAdaptersBuildUrlMixin["default"];
+
+ _emberDataPrivateCore["default"].RESTSerializer = _emberDataPrivateSerializers.RESTSerializer;
+ _emberDataPrivateCore["default"].JSONSerializer = _emberDataPrivateSerializers.JSONSerializer;
+
+ _emberDataPrivateCore["default"].JSONAPIAdapter = _emberDataPrivateAdapters.JSONAPIAdapter;
+ _emberDataPrivateCore["default"].JSONAPISerializer = _emberDataPrivateSerializers.JSONAPISerializer;
+
+ _emberDataPrivateCore["default"].Transform = _emberDataPrivateTransforms.Transform;
+ _emberDataPrivateCore["default"].DateTransform = _emberDataPrivateTransforms.DateTransform;
+ _emberDataPrivateCore["default"].StringTransform = _emberDataPrivateTransforms.StringTransform;
+ _emberDataPrivateCore["default"].NumberTransform = _emberDataPrivateTransforms.NumberTransform;
+ _emberDataPrivateCore["default"].BooleanTransform = _emberDataPrivateTransforms.BooleanTransform;
+
+ _emberDataPrivateCore["default"].EmbeddedRecordsMixin = _emberDataSerializersEmbeddedRecordsMixin["default"];
+
+ _emberDataPrivateCore["default"].belongsTo = _emberDataRelationships.belongsTo;
+ _emberDataPrivateCore["default"].hasMany = _emberDataRelationships.hasMany;
+
+ _emberDataPrivateCore["default"].Relationship = _emberDataPrivateSystemRelationshipsStateRelationship["default"];
+
+ _emberDataPrivateCore["default"].ContainerProxy = _emberDataPrivateSystemContainerProxy["default"];
+
+ _emberDataPrivateCore["default"]._setupContainer = _emberDataSetupContainer["default"];
+ _emberDataPrivateCore["default"]._initializeStoreService = _emberDataPrivateInstanceInitializersInitializeStoreService["default"];
+
+ Object.defineProperty(_emberDataPrivateCore["default"], 'normalizeModelName', {
+ enumerable: true,
+ writable: false,
+ configurable: false,
+ value: _emberDataPrivateSystemNormalizeModelName["default"]
+ });
+
+ Object.defineProperty(_emberDataPrivateGlobal["default"], 'DS', {
+ configurable: true,
+ get: function get() {
+ (0, _emberDataPrivateDebug.deprecate)('Using the global version of DS is deprecated. Please either import ' + 'the specific modules needed or `import DS from \'ember-data\';`.', false, { id: 'ember-data.global-ds', until: '3.0.0' });
+
+ return _emberDataPrivateCore["default"];
+ }
+ });
+
+ exports["default"] = _emberDataPrivateCore["default"];
+});
+
+/**
+ Ember Data
+ @module ember-data
+ @main ember-data
+*/
+define("ember-data/model", ["exports", "ember-data/-private/system/model"], function (exports, _emberDataPrivateSystemModel) {
+ "use strict";
+
+ exports["default"] = _emberDataPrivateSystemModel["default"];
+});
+define("ember-data/relationships", ["exports", "ember-data/-private/system/relationships/belongs-to", "ember-data/-private/system/relationships/has-many"], function (exports, _emberDataPrivateSystemRelationshipsBelongsTo, _emberDataPrivateSystemRelationshipsHasMany) {
+ /**
+ @module ember-data
+ */
+
+ "use strict";
+
+ exports.belongsTo = _emberDataPrivateSystemRelationshipsBelongsTo["default"];
+ exports.hasMany = _emberDataPrivateSystemRelationshipsHasMany["default"];
+});
+define('ember-data/serializer', ['exports', 'ember'], function (exports, _ember) {
+ /**
+ @module ember-data
+ */
+
+ 'use strict';
+
+ /**
+ `DS.Serializer` is an abstract base class that you should override in your
+ application to customize it for your backend. The minimum set of methods
+ that you should implement is:
+
+ * `normalizeResponse()`
+ * `serialize()`
+
+ And you can optionally override the following methods:
+
+ * `normalize()`
+
+ For an example implementation, see
+ [DS.JSONSerializer](DS.JSONSerializer.html), the included JSON serializer.
+
+ @class Serializer
+ @namespace DS
+ @extends Ember.Object
+ */
+
+ exports['default'] = _ember['default'].Object.extend({
+
+ /**
+ The `store` property is the application's `store` that contains all records.
+ It's injected as a service.
+ It can be used to push records from a non flat data structure server
+ response.
+ @property store
+ @type {DS.Store}
+ @public
+ */
+
+ /**
+ The `normalizeResponse` method is used to normalize a payload from the
+ server to a JSON-API Document.
+ http://jsonapi.org/format/#document-structure
+ @since 1.13.0
+ @method normalizeResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeResponse: null,
+
+ /**
+ The `serialize` method is used when a record is saved in order to convert
+ the record into the form that your external data source expects.
+ `serialize` takes an optional `options` hash with a single option:
+ - `includeId`: If this is `true`, `serialize` should include the ID
+ in the serialized object it builds.
+ @method serialize
+ @param {DS.Model} record
+ @param {Object} [options]
+ @return {Object}
+ */
+ serialize: null,
+
+ /**
+ The `normalize` method is used to convert a payload received from your
+ external data source into the normalized form `store.push()` expects. You
+ should override this method, munge the hash and return the normalized
+ payload.
+ @method normalize
+ @param {DS.Model} typeClass
+ @param {Object} hash
+ @return {Object}
+ */
+ normalize: function normalize(typeClass, hash) {
+ return hash;
+ }
+
+ });
+});
+define('ember-data/serializers/embedded-records-mixin', ['exports', 'ember', 'ember-data/-private/debug'], function (exports, _ember, _emberDataPrivateDebug) {
+ 'use strict';
+
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];return arr2;
+ } else {
+ return Array.from(arr);
+ }
+ }
+
+ var get = _ember['default'].get;
+ var set = _ember['default'].set;
+ var camelize = _ember['default'].String.camelize;
+
+ /**
+ ## Using Embedded Records
+
+ `DS.EmbeddedRecordsMixin` supports serializing embedded records.
+
+ To set up embedded records, include the mixin when extending a serializer,
+ then define and configure embedded (model) relationships.
+
+ Below is an example of a per-type serializer (`post` type).
+
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+
+ export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
+ attrs: {
+ author: { embedded: 'always' },
+ comments: { serialize: 'ids' }
+ }
+ });
+ ```
+ Note that this use of `{ embedded: 'always' }` is unrelated to
+ the `{ embedded: 'always' }` that is defined as an option on `DS.attr` as part of
+ defining a model while working with the `ActiveModelSerializer`. Nevertheless,
+ using `{ embedded: 'always' }` as an option to `DS.attr` is not a valid way to setup
+ embedded records.
+
+ The `attrs` option for a resource `{ embedded: 'always' }` is shorthand for:
+
+ ```js
+ {
+ serialize: 'records',
+ deserialize: 'records'
+ }
+ ```
+
+ ### Configuring Attrs
+
+ A resource's `attrs` option may be set to use `ids`, `records` or false for the
+ `serialize` and `deserialize` settings.
+
+ The `attrs` property can be set on the `ApplicationSerializer` or a per-type
+ serializer.
+
+ In the case where embedded JSON is expected while extracting a payload (reading)
+ the setting is `deserialize: 'records'`, there is no need to use `ids` when
+ extracting as that is the default behavior without this mixin if you are using
+ the vanilla `EmbeddedRecordsMixin`. Likewise, to embed JSON in the payload while
+ serializing `serialize: 'records'` is the setting to use. There is an option of
+ not embedding JSON in the serialized payload by using `serialize: 'ids'`. If you
+ do not want the relationship sent at all, you can use `serialize: false`.
+
+
+ ### EmbeddedRecordsMixin defaults
+ If you do not overwrite `attrs` for a specific relationship, the `EmbeddedRecordsMixin`
+ will behave in the following way:
+
+ BelongsTo: `{ serialize: 'id', deserialize: 'id' }`
+ HasMany: `{ serialize: false, deserialize: 'ids' }`
+
+ ### Model Relationships
+
+ Embedded records must have a model defined to be extracted and serialized. Note that
+ when defining any relationships on your model such as `belongsTo` and `hasMany`, you
+ should not both specify `async: true` and also indicate through the serializer's
+ `attrs` attribute that the related model should be embedded for deserialization.
+ If a model is declared embedded for deserialization (`embedded: 'always'` or `deserialize: 'records'`),
+ then do not use `async: true`.
+
+ To successfully extract and serialize embedded records the model relationships
+ must be setup correcty. See the
+ [defining relationships](/guides/models/defining-models/#toc_defining-relationships)
+ section of the **Defining Models** guide page.
+
+ Records without an `id` property are not considered embedded records, model
+ instances must have an `id` property to be used with Ember Data.
+
+ ### Example JSON payloads, Models and Serializers
+
+ **When customizing a serializer it is important to grok what the customizations
+ are. Please read the docs for the methods this mixin provides, in case you need
+ to modify it to fit your specific needs.**
+
+ For example review the docs for each method of this mixin:
+ * [normalize](/api/data/classes/DS.EmbeddedRecordsMixin.html#method_normalize)
+ * [serializeBelongsTo](/api/data/classes/DS.EmbeddedRecordsMixin.html#method_serializeBelongsTo)
+ * [serializeHasMany](/api/data/classes/DS.EmbeddedRecordsMixin.html#method_serializeHasMany)
+
+ @class EmbeddedRecordsMixin
+ @namespace DS
+ */
+ exports['default'] = _ember['default'].Mixin.create({
+
+ /**
+ Normalize the record and recursively normalize/extract all the embedded records
+ while pushing them into the store as they are encountered
+ A payload with an attr configured for embedded records needs to be extracted:
+ ```js
+ {
+ "post": {
+ "id": "1"
+ "title": "Rails is omakase",
+ "comments": [{
+ "id": "1",
+ "body": "Rails is unagi"
+ }, {
+ "id": "2",
+ "body": "Omakase O_o"
+ }]
+ }
+ }
+ ```
+ @method normalize
+ @param {DS.Model} typeClass
+ @param {Object} hash to be normalized
+ @param {String} prop the hash has been referenced by
+ @return {Object} the normalized hash
+ **/
+ normalize: function normalize(typeClass, hash, prop) {
+ var normalizedHash = this._super(typeClass, hash, prop);
+ return this._extractEmbeddedRecords(this, this.store, typeClass, normalizedHash);
+ },
+
+ keyForRelationship: function keyForRelationship(key, typeClass, method) {
+ if (method === 'serialize' && this.hasSerializeRecordsOption(key) || method === 'deserialize' && this.hasDeserializeRecordsOption(key)) {
+ return this.keyForAttribute(key, method);
+ } else {
+ return this._super(key, typeClass, method) || key;
+ }
+ },
+
+ /**
+ Serialize `belongsTo` relationship when it is configured as an embedded object.
+ This example of an author model belongs to a post model:
+ ```js
+ Post = DS.Model.extend({
+ title: DS.attr('string'),
+ body: DS.attr('string'),
+ author: DS.belongsTo('author')
+ });
+ Author = DS.Model.extend({
+ name: DS.attr('string'),
+ post: DS.belongsTo('post')
+ });
+ ```
+ Use a custom (type) serializer for the post model to configure embedded author
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
+ attrs: {
+ author: { embedded: 'always' }
+ }
+ })
+ ```
+ A payload with an attribute configured for embedded records can serialize
+ the records together under the root attribute's payload:
+ ```js
+ {
+ "post": {
+ "id": "1"
+ "title": "Rails is omakase",
+ "author": {
+ "id": "2"
+ "name": "dhh"
+ }
+ }
+ }
+ ```
+ @method serializeBelongsTo
+ @param {DS.Snapshot} snapshot
+ @param {Object} json
+ @param {Object} relationship
+ */
+ serializeBelongsTo: function serializeBelongsTo(snapshot, json, relationship) {
+ var attr = relationship.key;
+ if (this.noSerializeOptionSpecified(attr)) {
+ this._super(snapshot, json, relationship);
+ return;
+ }
+ var includeIds = this.hasSerializeIdsOption(attr);
+ var includeRecords = this.hasSerializeRecordsOption(attr);
+ var embeddedSnapshot = snapshot.belongsTo(attr);
+ if (includeIds) {
+ var serializedKey = this._getMappedKey(relationship.key, snapshot.type);
+ if (serializedKey === relationship.key && this.keyForRelationship) {
+ serializedKey = this.keyForRelationship(relationship.key, relationship.kind, "serialize");
+ }
+
+ if (!embeddedSnapshot) {
+ json[serializedKey] = null;
+ } else {
+ json[serializedKey] = embeddedSnapshot.id;
+
+ if (relationship.options.polymorphic) {
+ this.serializePolymorphicType(snapshot, json, relationship);
+ }
+ }
+ } else if (includeRecords) {
+ this._serializeEmbeddedBelongsTo(snapshot, json, relationship);
+ }
+ },
+
+ _serializeEmbeddedBelongsTo: function _serializeEmbeddedBelongsTo(snapshot, json, relationship) {
+ var embeddedSnapshot = snapshot.belongsTo(relationship.key);
+ var serializedKey = this._getMappedKey(relationship.key, snapshot.type);
+ if (serializedKey === relationship.key && this.keyForRelationship) {
+ serializedKey = this.keyForRelationship(relationship.key, relationship.kind, "serialize");
+ }
+
+ if (!embeddedSnapshot) {
+ json[serializedKey] = null;
+ } else {
+ json[serializedKey] = embeddedSnapshot.serialize({ includeId: true });
+ this.removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, json[serializedKey]);
+
+ if (relationship.options.polymorphic) {
+ this.serializePolymorphicType(snapshot, json, relationship);
+ }
+ }
+ },
+
+ /**
+ Serializes `hasMany` relationships when it is configured as embedded objects.
+ This example of a post model has many comments:
+ ```js
+ Post = DS.Model.extend({
+ title: DS.attr('string'),
+ body: DS.attr('string'),
+ comments: DS.hasMany('comment')
+ });
+ Comment = DS.Model.extend({
+ body: DS.attr('string'),
+ post: DS.belongsTo('post')
+ });
+ ```
+ Use a custom (type) serializer for the post model to configure embedded comments
+ ```app/serializers/post.js
+ import DS from 'ember-data;
+ export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
+ attrs: {
+ comments: { embedded: 'always' }
+ }
+ })
+ ```
+ A payload with an attribute configured for embedded records can serialize
+ the records together under the root attribute's payload:
+ ```js
+ {
+ "post": {
+ "id": "1"
+ "title": "Rails is omakase",
+ "body": "I want this for my ORM, I want that for my template language..."
+ "comments": [{
+ "id": "1",
+ "body": "Rails is unagi"
+ }, {
+ "id": "2",
+ "body": "Omakase O_o"
+ }]
+ }
+ }
+ ```
+ The attrs options object can use more specific instruction for extracting and
+ serializing. When serializing, an option to embed `ids`, `ids-and-types` or `records` can be set.
+ When extracting the only option is `records`.
+ So `{ embedded: 'always' }` is shorthand for:
+ `{ serialize: 'records', deserialize: 'records' }`
+ To embed the `ids` for a related object (using a hasMany relationship):
+ ```app/serializers/post.js
+ import DS from 'ember-data;
+ export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
+ attrs: {
+ comments: { serialize: 'ids', deserialize: 'records' }
+ }
+ })
+ ```
+ ```js
+ {
+ "post": {
+ "id": "1"
+ "title": "Rails is omakase",
+ "body": "I want this for my ORM, I want that for my template language..."
+ "comments": ["1", "2"]
+ }
+ }
+ ```
+ To embed the relationship as a collection of objects with `id` and `type` keys, set
+ `ids-and-types` for the related object.
+ This is particularly useful for polymorphic relationships where records don't share
+ the same table and the `id` is not enough information.
+ By example having a user that has many pets:
+ ```js
+ User = DS.Model.extend({
+ name: DS.attr('string'),
+ pets: DS.hasMany('pet', { polymorphic: true })
+ });
+ Pet = DS.Model.extend({
+ name: DS.attr('string'),
+ });
+ Cat = Pet.extend({
+ // ...
+ });
+ Parrot = Pet.extend({
+ // ...
+ });
+ ```
+ ```app/serializers/user.js
+ import DS from 'ember-data;
+ export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
+ attrs: {
+ pets: { serialize: 'ids-and-types', deserialize: 'records' }
+ }
+ });
+ ```
+ ```js
+ {
+ "user": {
+ "id": "1"
+ "name": "Bertin Osborne",
+ "pets": [
+ { "id": "1", "type": "Cat" },
+ { "id": "1", "type": "Parrot"}
+ ]
+ }
+ }
+ ```
+ @method serializeHasMany
+ @param {DS.Snapshot} snapshot
+ @param {Object} json
+ @param {Object} relationship
+ */
+ serializeHasMany: function serializeHasMany(snapshot, json, relationship) {
+ var attr = relationship.key;
+ if (this.noSerializeOptionSpecified(attr)) {
+ this._super(snapshot, json, relationship);
+ return;
+ }
+
+ if (this.hasSerializeIdsOption(attr)) {
+ var serializedKey = this._getMappedKey(relationship.key, snapshot.type);
+ if (serializedKey === relationship.key && this.keyForRelationship) {
+ serializedKey = this.keyForRelationship(relationship.key, relationship.kind, "serialize");
+ }
+
+ json[serializedKey] = snapshot.hasMany(attr, { ids: true });
+ } else if (this.hasSerializeRecordsOption(attr)) {
+ this._serializeEmbeddedHasMany(snapshot, json, relationship);
+ } else {
+ if (this.hasSerializeIdsAndTypesOption(attr)) {
+ this._serializeHasManyAsIdsAndTypes(snapshot, json, relationship);
+ }
+ }
+ },
+
+ /**
+ Serializes a hasMany relationship as an array of objects containing only `id` and `type`
+ keys.
+ This has its use case on polymorphic hasMany relationships where the server is not storing
+ all records in the same table using STI, and therefore the `id` is not enough information
+ TODO: Make the default in Ember-data 3.0??
+ */
+ _serializeHasManyAsIdsAndTypes: function _serializeHasManyAsIdsAndTypes(snapshot, json, relationship) {
+ var serializedKey = this.keyForAttribute(relationship.key, 'serialize');
+ var hasMany = snapshot.hasMany(relationship.key);
+
+ json[serializedKey] = _ember['default'].A(hasMany).map(function (recordSnapshot) {
+ //
+ // I'm sure I'm being utterly naive here. Propably id is a configurate property and
+ // type too, and the modelName has to be normalized somehow.
+ //
+ return { id: recordSnapshot.id, type: recordSnapshot.modelName };
+ });
+ },
+
+ _serializeEmbeddedHasMany: function _serializeEmbeddedHasMany(snapshot, json, relationship) {
+ var serializedKey = this._getMappedKey(relationship.key, snapshot.type);
+ if (serializedKey === relationship.key && this.keyForRelationship) {
+ serializedKey = this.keyForRelationship(relationship.key, relationship.kind, "serialize");
+ }
+
+ (0, _emberDataPrivateDebug.warn)('The embedded relationship \'' + serializedKey + '\' is undefined for \'' + snapshot.modelName + '\' with id \'' + snapshot.id + '\'. Please include it in your original payload.', _ember['default'].typeOf(snapshot.hasMany(relationship.key)) !== 'undefined', { id: 'ds.serializer.embedded-relationship-undefined' });
+
+ json[serializedKey] = this._generateSerializedHasMany(snapshot, relationship);
+ },
+
+ /*
+ Returns an array of embedded records serialized to JSON
+ */
+ _generateSerializedHasMany: function _generateSerializedHasMany(snapshot, relationship) {
+ var hasMany = snapshot.hasMany(relationship.key);
+ var manyArray = _ember['default'].A(hasMany);
+ var ret = new Array(manyArray.length);
+
+ for (var i = 0; i < manyArray.length; i++) {
+ var embeddedSnapshot = manyArray[i];
+ var embeddedJson = embeddedSnapshot.serialize({ includeId: true });
+ this.removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, embeddedJson);
+ ret[i] = embeddedJson;
+ }
+
+ return ret;
+ },
+
+ /**
+ When serializing an embedded record, modify the property (in the json payload)
+ that refers to the parent record (foreign key for relationship).
+ Serializing a `belongsTo` relationship removes the property that refers to the
+ parent record
+ Serializing a `hasMany` relationship does not remove the property that refers to
+ the parent record.
+ @method removeEmbeddedForeignKey
+ @param {DS.Snapshot} snapshot
+ @param {DS.Snapshot} embeddedSnapshot
+ @param {Object} relationship
+ @param {Object} json
+ */
+ removeEmbeddedForeignKey: function removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, json) {
+ if (relationship.kind === 'hasMany') {
+ return;
+ } else if (relationship.kind === 'belongsTo') {
+ var parentRecord = snapshot.type.inverseFor(relationship.key, this.store);
+ if (parentRecord) {
+ var name = parentRecord.name;
+ var embeddedSerializer = this.store.serializerFor(embeddedSnapshot.modelName);
+ var parentKey = embeddedSerializer.keyForRelationship(name, parentRecord.kind, 'deserialize');
+ if (parentKey) {
+ delete json[parentKey];
+ }
+ }
+ }
+ },
+
+ // checks config for attrs option to embedded (always) - serialize and deserialize
+ hasEmbeddedAlwaysOption: function hasEmbeddedAlwaysOption(attr) {
+ var option = this.attrsOption(attr);
+ return option && option.embedded === 'always';
+ },
+
+ // checks config for attrs option to serialize ids
+ hasSerializeRecordsOption: function hasSerializeRecordsOption(attr) {
+ var alwaysEmbed = this.hasEmbeddedAlwaysOption(attr);
+ var option = this.attrsOption(attr);
+ return alwaysEmbed || option && option.serialize === 'records';
+ },
+
+ // checks config for attrs option to serialize records
+ hasSerializeIdsOption: function hasSerializeIdsOption(attr) {
+ var option = this.attrsOption(attr);
+ return option && (option.serialize === 'ids' || option.serialize === 'id');
+ },
+
+ // checks config for attrs option to serialize records as objects containing id and types
+ hasSerializeIdsAndTypesOption: function hasSerializeIdsAndTypesOption(attr) {
+ var option = this.attrsOption(attr);
+ return option && (option.serialize === 'ids-and-types' || option.serialize === 'id-and-type');
+ },
+
+ // checks config for attrs option to serialize records
+ noSerializeOptionSpecified: function noSerializeOptionSpecified(attr) {
+ var option = this.attrsOption(attr);
+ return !(option && (option.serialize || option.embedded));
+ },
+
+ // checks config for attrs option to deserialize records
+ // a defined option object for a resource is treated the same as
+ // `deserialize: 'records'`
+ hasDeserializeRecordsOption: function hasDeserializeRecordsOption(attr) {
+ var alwaysEmbed = this.hasEmbeddedAlwaysOption(attr);
+ var option = this.attrsOption(attr);
+ return alwaysEmbed || option && option.deserialize === 'records';
+ },
+
+ attrsOption: function attrsOption(attr) {
+ var attrs = this.get('attrs');
+ return attrs && (attrs[camelize(attr)] || attrs[attr]);
+ },
+
+ /**
+ @method _extractEmbeddedRecords
+ @private
+ */
+ _extractEmbeddedRecords: function _extractEmbeddedRecords(serializer, store, typeClass, partial) {
+ var _this = this;
+
+ typeClass.eachRelationship(function (key, relationship) {
+ if (serializer.hasDeserializeRecordsOption(key)) {
+ if (relationship.kind === "hasMany") {
+ _this._extractEmbeddedHasMany(store, key, partial, relationship);
+ }
+ if (relationship.kind === "belongsTo") {
+ _this._extractEmbeddedBelongsTo(store, key, partial, relationship);
+ }
+ }
+ });
+ return partial;
+ },
+
+ /**
+ @method _extractEmbeddedHasMany
+ @private
+ */
+ _extractEmbeddedHasMany: function _extractEmbeddedHasMany(store, key, hash, relationshipMeta) {
+ var relationshipHash = get(hash, 'data.relationships.' + key + '.data');
+
+ if (!relationshipHash) {
+ return;
+ }
+
+ var hasMany = new Array(relationshipHash.length);
+
+ for (var i = 0; i < relationshipHash.length; i++) {
+ var item = relationshipHash[i];
+
+ var _normalizeEmbeddedRelationship2 = this._normalizeEmbeddedRelationship(store, relationshipMeta, item);
+
+ var data = _normalizeEmbeddedRelationship2.data;
+ var included = _normalizeEmbeddedRelationship2.included;
+
+ hash.included = hash.included || [];
+ hash.included.push(data);
+ if (included) {
+ var _hash$included;
+
+ (_hash$included = hash.included).push.apply(_hash$included, _toConsumableArray(included));
+ }
+
+ hasMany[i] = { id: data.id, type: data.type };
+ }
+
+ var relationship = { data: hasMany };
+ set(hash, 'data.relationships.' + key, relationship);
+ },
+
+ /**
+ @method _extractEmbeddedBelongsTo
+ @private
+ */
+ _extractEmbeddedBelongsTo: function _extractEmbeddedBelongsTo(store, key, hash, relationshipMeta) {
+ var relationshipHash = get(hash, 'data.relationships.' + key + '.data');
+ if (!relationshipHash) {
+ return;
+ }
+
+ var _normalizeEmbeddedRelationship3 = this._normalizeEmbeddedRelationship(store, relationshipMeta, relationshipHash);
+
+ var data = _normalizeEmbeddedRelationship3.data;
+ var included = _normalizeEmbeddedRelationship3.included;
+
+ hash.included = hash.included || [];
+ hash.included.push(data);
+ if (included) {
+ var _hash$included2;
+
+ (_hash$included2 = hash.included).push.apply(_hash$included2, _toConsumableArray(included));
+ }
+
+ var belongsTo = { id: data.id, type: data.type };
+ var relationship = { data: belongsTo };
+
+ set(hash, 'data.relationships.' + key, relationship);
+ },
+
+ /**
+ @method _normalizeEmbeddedRelationship
+ @private
+ */
+ _normalizeEmbeddedRelationship: function _normalizeEmbeddedRelationship(store, relationshipMeta, relationshipHash) {
+ var modelName = relationshipMeta.type;
+ if (relationshipMeta.options.polymorphic) {
+ modelName = relationshipHash.type;
+ }
+ var modelClass = store.modelFor(modelName);
+ var serializer = store.serializerFor(modelName);
+
+ return serializer.normalize(modelClass, relationshipHash, null);
+ },
+ isEmbeddedRecordsMixin: true
+ });
+});
+define('ember-data/serializers/json-api', ['exports', 'ember', 'ember-data/-private/debug', 'ember-data/serializers/json', 'ember-data/-private/system/normalize-model-name', 'ember-inflector', 'ember-data/-private/features'], function (exports, _ember, _emberDataPrivateDebug, _emberDataSerializersJson, _emberDataPrivateSystemNormalizeModelName, _emberInflector, _emberDataPrivateFeatures) {
+ /**
+ @module ember-data
+ */
+
+ 'use strict';
+
+ var dasherize = _ember['default'].String.dasherize;
+
+ /**
+ Ember Data 2.0 Serializer:
+
+ In Ember Data a Serializer is used to serialize and deserialize
+ records when they are transferred in and out of an external source.
+ This process involves normalizing property names, transforming
+ attribute values and serializing relationships.
+
+ `JSONAPISerializer` supports the http://jsonapi.org/ spec and is the
+ serializer recommended by Ember Data.
+
+ This serializer normalizes a JSON API payload that looks like:
+
+ ```js
+
+ // models/player.js
+ import DS from "ember-data";
+
+ export default DS.Model.extend({
+ name: DS.attr(),
+ skill: DS.attr(),
+ gamesPlayed: DS.attr(),
+ club: DS.belongsTo('club')
+ });
+
+ // models/club.js
+ import DS from "ember-data";
+
+ export default DS.Model.extend({
+ name: DS.attr(),
+ location: DS.attr(),
+ players: DS.hasMany('player')
+ });
+ ```
+
+ ```js
+
+ {
+ "data": [
+ {
+ "attributes": {
+ "name": "Benfica",
+ "location": "Portugal"
+ },
+ "id": "1",
+ "relationships": {
+ "players": {
+ "data": [
+ {
+ "id": "3",
+ "type": "players"
+ }
+ ]
+ }
+ },
+ "type": "clubs"
+ }
+ ],
+ "included": [
+ {
+ "attributes": {
+ "name": "Eusebio Silva Ferreira",
+ "skill": "Rocket shot",
+ "games-played": 431
+ },
+ "id": "3",
+ "relationships": {
+ "club": {
+ "data": {
+ "id": "1",
+ "type": "clubs"
+ }
+ }
+ },
+ "type": "players"
+ }
+ ]
+ }
+ ```
+
+ to the format that the Ember Data store expects.
+
+ @since 1.13.0
+ @class JSONAPISerializer
+ @namespace DS
+ @extends DS.JSONSerializer
+ */
+ var JSONAPISerializer = _emberDataSerializersJson['default'].extend({
+
+ /**
+ @method _normalizeDocumentHelper
+ @param {Object} documentHash
+ @return {Object}
+ @private
+ */
+ _normalizeDocumentHelper: function _normalizeDocumentHelper(documentHash) {
+
+ if (_ember['default'].typeOf(documentHash.data) === 'object') {
+ documentHash.data = this._normalizeResourceHelper(documentHash.data);
+ } else if (Array.isArray(documentHash.data)) {
+ var ret = new Array(documentHash.data.length);
+
+ for (var i = 0; i < documentHash.data.length; i++) {
+ var data = documentHash.data[i];
+ ret[i] = this._normalizeResourceHelper(data);
+ }
+
+ documentHash.data = ret;
+ }
+
+ if (Array.isArray(documentHash.included)) {
+ var ret = new Array(documentHash.included.length);
+
+ for (var i = 0; i < documentHash.included.length; i++) {
+ var included = documentHash.included[i];
+ ret[i] = this._normalizeResourceHelper(included);
+ }
+
+ documentHash.included = ret;
+ }
+
+ return documentHash;
+ },
+
+ /**
+ @method _normalizeRelationshipDataHelper
+ @param {Object} relationshipDataHash
+ @return {Object}
+ @private
+ */
+ _normalizeRelationshipDataHelper: function _normalizeRelationshipDataHelper(relationshipDataHash) {
+ if (false) {
+ var modelName = this.modelNameFromPayloadType(relationshipDataHash.type);
+ var deprecatedModelNameLookup = this.modelNameFromPayloadKey(relationshipDataHash.type);
+
+ if (modelName !== deprecatedModelNameLookup && this._hasCustomModelNameFromPayloadKey()) {
+ (0, _emberDataPrivateDebug.deprecate)("You are using modelNameFromPayloadKey to normalize the type for a relationship. This has been deprecated in favor of modelNameFromPayloadType", false, {
+ id: 'ds.json-api-serializer.deprecated-model-name-for-relationship',
+ until: '3.0.0'
+ });
+
+ modelName = deprecatedModelNameLookup;
+ }
+
+ relationshipDataHash.type = modelName;
+ } else {
+ var type = this.modelNameFromPayloadKey(relationshipDataHash.type);
+ relationshipDataHash.type = type;
+ }
+
+ return relationshipDataHash;
+ },
+
+ /**
+ @method _normalizeResourceHelper
+ @param {Object} resourceHash
+ @return {Object}
+ @private
+ */
+ _normalizeResourceHelper: function _normalizeResourceHelper(resourceHash) {
+ (0, _emberDataPrivateDebug.assert)(this.warnMessageForUndefinedType(), !_ember['default'].isNone(resourceHash.type), {
+ id: 'ds.serializer.type-is-undefined'
+ });
+
+ var modelName = undefined,
+ usedLookup = undefined;
+
+ if (false) {
+ modelName = this.modelNameFromPayloadType(resourceHash.type);
+ var deprecatedModelNameLookup = this.modelNameFromPayloadKey(resourceHash.type);
+
+ usedLookup = 'modelNameFromPayloadType';
+
+ if (modelName !== deprecatedModelNameLookup && this._hasCustomModelNameFromPayloadKey()) {
+ (0, _emberDataPrivateDebug.deprecate)("You are using modelNameFromPayloadKey to normalize the type for a resource. This has been deprecated in favor of modelNameFromPayloadType", false, {
+ id: 'ds.json-api-serializer.deprecated-model-name-for-resource',
+ until: '3.0.0'
+ });
+
+ modelName = deprecatedModelNameLookup;
+ usedLookup = 'modelNameFromPayloadKey';
+ }
+ } else {
+ modelName = this.modelNameFromPayloadKey(resourceHash.type);
+ usedLookup = 'modelNameFromPayloadKey';
+ }
+
+ if (!this.store._hasModelFor(modelName)) {
+ (0, _emberDataPrivateDebug.warn)(this.warnMessageNoModelForType(modelName, resourceHash.type, usedLookup), false, {
+ id: 'ds.serializer.model-for-type-missing'
+ });
+ return null;
+ }
+
+ var modelClass = this.store.modelFor(modelName);
+ var serializer = this.store.serializerFor(modelName);
+
+ var _serializer$normalize = serializer.normalize(modelClass, resourceHash);
+
+ var data = _serializer$normalize.data;
+
+ return data;
+ },
+
+ /**
+ @method pushPayload
+ @param {DS.Store} store
+ @param {Object} payload
+ */
+ pushPayload: function pushPayload(store, payload) {
+ var normalizedPayload = this._normalizeDocumentHelper(payload);
+ if (false) {
+ return store.push(normalizedPayload);
+ } else {
+ store.push(normalizedPayload);
+ }
+ },
+
+ /**
+ @method _normalizeResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @param {Boolean} isSingle
+ @return {Object} JSON-API Document
+ @private
+ */
+ _normalizeResponse: function _normalizeResponse(store, primaryModelClass, payload, id, requestType, isSingle) {
+ var normalizedPayload = this._normalizeDocumentHelper(payload);
+ return normalizedPayload;
+ },
+
+ normalizeQueryRecordResponse: function normalizeQueryRecordResponse() {
+ var normalized = this._super.apply(this, arguments);
+
+ (0, _emberDataPrivateDebug.assert)('Expected the primary data returned by the serializer for a `queryRecord` response to be a single object but instead it was an array.', !Array.isArray(normalized.data), {
+ id: 'ds.serializer.json-api.queryRecord-array-response'
+ });
+
+ return normalized;
+ },
+
+ /**
+ @method extractAttributes
+ @param {DS.Model} modelClass
+ @param {Object} resourceHash
+ @return {Object}
+ */
+ extractAttributes: function extractAttributes(modelClass, resourceHash) {
+ var _this = this;
+
+ var attributes = {};
+
+ if (resourceHash.attributes) {
+ modelClass.eachAttribute(function (key) {
+ var attributeKey = _this.keyForAttribute(key, 'deserialize');
+ if (resourceHash.attributes[attributeKey] !== undefined) {
+ attributes[key] = resourceHash.attributes[attributeKey];
+ }
+ });
+ }
+
+ return attributes;
+ },
+
+ /**
+ @method extractRelationship
+ @param {Object} relationshipHash
+ @return {Object}
+ */
+ extractRelationship: function extractRelationship(relationshipHash) {
+
+ if (_ember['default'].typeOf(relationshipHash.data) === 'object') {
+ relationshipHash.data = this._normalizeRelationshipDataHelper(relationshipHash.data);
+ }
+
+ if (Array.isArray(relationshipHash.data)) {
+ var ret = new Array(relationshipHash.data.length);
+
+ for (var i = 0; i < relationshipHash.data.length; i++) {
+ var data = relationshipHash.data[i];
+ ret[i] = this._normalizeRelationshipDataHelper(data);
+ }
+
+ relationshipHash.data = ret;
+ }
+
+ return relationshipHash;
+ },
+
+ /**
+ @method extractRelationships
+ @param {Object} modelClass
+ @param {Object} resourceHash
+ @return {Object}
+ */
+ extractRelationships: function extractRelationships(modelClass, resourceHash) {
+ var _this2 = this;
+
+ var relationships = {};
+
+ if (resourceHash.relationships) {
+ modelClass.eachRelationship(function (key, relationshipMeta) {
+ var relationshipKey = _this2.keyForRelationship(key, relationshipMeta.kind, 'deserialize');
+ if (resourceHash.relationships[relationshipKey] !== undefined) {
+
+ var relationshipHash = resourceHash.relationships[relationshipKey];
+ relationships[key] = _this2.extractRelationship(relationshipHash);
+ }
+ });
+ }
+
+ return relationships;
+ },
+
+ /**
+ @method _extractType
+ @param {DS.Model} modelClass
+ @param {Object} resourceHash
+ @return {String}
+ @private
+ */
+ _extractType: function _extractType(modelClass, resourceHash) {
+ if (false) {
+ var modelName = this.modelNameFromPayloadType(resourceHash.type);
+ var deprecatedModelNameLookup = this.modelNameFromPayloadKey(resourceHash.type);
+
+ if (modelName !== deprecatedModelNameLookup && this._hasCustomModelNameFromPayloadKey()) {
+ (0, _emberDataPrivateDebug.deprecate)("You are using modelNameFromPayloadKey to normalize the type for a polymorphic relationship. This has been deprecated in favor of modelNameFromPayloadType", false, {
+ id: 'ds.json-api-serializer.deprecated-model-name-for-polymorphic-type',
+ until: '3.0.0'
+ });
+
+ modelName = deprecatedModelNameLookup;
+ }
+
+ return modelName;
+ } else {
+ return this.modelNameFromPayloadKey(resourceHash.type);
+ }
+ },
+
+ /**
+ @method modelNameFromPayloadKey
+ @param {String} key
+ @return {String} the model's modelName
+ */
+ // TODO @deprecated Use modelNameFromPayloadType instead
+ modelNameFromPayloadKey: function modelNameFromPayloadKey(key) {
+ return (0, _emberInflector.singularize)((0, _emberDataPrivateSystemNormalizeModelName['default'])(key));
+ },
+
+ /**
+ @method payloadKeyFromModelName
+ @param {String} modelName
+ @return {String}
+ */
+ // TODO @deprecated Use payloadTypeFromModelName instead
+ payloadKeyFromModelName: function payloadKeyFromModelName(modelName) {
+ return (0, _emberInflector.pluralize)(modelName);
+ },
+
+ /**
+ @method normalize
+ @param {DS.Model} modelClass
+ @param {Object} resourceHash the resource hash from the adapter
+ @return {Object} the normalized resource hash
+ */
+ normalize: function normalize(modelClass, resourceHash) {
+ if (resourceHash.attributes) {
+ this.normalizeUsingDeclaredMapping(modelClass, resourceHash.attributes);
+ }
+
+ if (resourceHash.relationships) {
+ this.normalizeUsingDeclaredMapping(modelClass, resourceHash.relationships);
+ }
+
+ var data = {
+ id: this.extractId(modelClass, resourceHash),
+ type: this._extractType(modelClass, resourceHash),
+ attributes: this.extractAttributes(modelClass, resourceHash),
+ relationships: this.extractRelationships(modelClass, resourceHash)
+ };
+
+ this.applyTransforms(modelClass, data.attributes);
+
+ return { data: data };
+ },
+
+ /**
+ `keyForAttribute` can be used to define rules for how to convert an
+ attribute name in your model to a key in your JSON.
+ By default `JSONAPISerializer` follows the format used on the examples of
+ http://jsonapi.org/format and uses dashes as the word separator in the JSON
+ attribute keys.
+ This behaviour can be easily customized by extending this method.
+ Example
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.JSONAPISerializer.extend({
+ keyForAttribute: function(attr, method) {
+ return Ember.String.dasherize(attr).toUpperCase();
+ }
+ });
+ ```
+ @method keyForAttribute
+ @param {String} key
+ @param {String} method
+ @return {String} normalized key
+ */
+ keyForAttribute: function keyForAttribute(key, method) {
+ return dasherize(key);
+ },
+
+ /**
+ `keyForRelationship` can be used to define a custom key when
+ serializing and deserializing relationship properties.
+ By default `JSONAPISerializer` follows the format used on the examples of
+ http://jsonapi.org/format and uses dashes as word separators in
+ relationship properties.
+ This behaviour can be easily customized by extending this method.
+ Example
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.JSONAPISerializer.extend({
+ keyForRelationship: function(key, relationship, method) {
+ return Ember.String.underscore(key);
+ }
+ });
+ ```
+ @method keyForRelationship
+ @param {String} key
+ @param {String} typeClass
+ @param {String} method
+ @return {String} normalized key
+ */
+ keyForRelationship: function keyForRelationship(key, typeClass, method) {
+ return dasherize(key);
+ },
+
+ /**
+ @method serialize
+ @param {DS.Snapshot} snapshot
+ @param {Object} options
+ @return {Object} json
+ */
+ serialize: function serialize(snapshot, options) {
+ var data = this._super.apply(this, arguments);
+
+ var payloadType = undefined;
+ if (false) {
+ payloadType = this.payloadTypeFromModelName(snapshot.modelName);
+ var deprecatedPayloadTypeLookup = this.payloadKeyFromModelName(snapshot.modelName);
+
+ if (payloadType !== deprecatedPayloadTypeLookup && this._hasCustomPayloadKeyFromModelName()) {
+ (0, _emberDataPrivateDebug.deprecate)("You used payloadKeyFromModelName to customize how a type is serialized. Use payloadTypeFromModelName instead.", false, {
+ id: 'ds.json-api-serializer.deprecated-payload-type-for-model',
+ until: '3.0.0'
+ });
+
+ payloadType = deprecatedPayloadTypeLookup;
+ }
+ } else {
+ payloadType = this.payloadKeyFromModelName(snapshot.modelName);
+ }
+
+ data.type = payloadType;
+ return { data: data };
+ },
+
+ /**
+ @method serializeAttribute
+ @param {DS.Snapshot} snapshot
+ @param {Object} json
+ @param {String} key
+ @param {Object} attribute
+ */
+ serializeAttribute: function serializeAttribute(snapshot, json, key, attribute) {
+ var type = attribute.type;
+
+ if (this._canSerialize(key)) {
+ json.attributes = json.attributes || {};
+
+ var value = snapshot.attr(key);
+ if (type) {
+ var transform = this.transformFor(type);
+ value = transform.serialize(value, attribute.options);
+ }
+
+ var payloadKey = this._getMappedKey(key, snapshot.type);
+
+ if (payloadKey === key) {
+ payloadKey = this.keyForAttribute(key, 'serialize');
+ }
+
+ json.attributes[payloadKey] = value;
+ }
+ },
+
+ /**
+ @method serializeBelongsTo
+ @param {DS.Snapshot} snapshot
+ @param {Object} json
+ @param {Object} relationship
+ */
+ serializeBelongsTo: function serializeBelongsTo(snapshot, json, relationship) {
+ var key = relationship.key;
+
+ if (this._canSerialize(key)) {
+ var belongsTo = snapshot.belongsTo(key);
+ if (belongsTo !== undefined) {
+
+ json.relationships = json.relationships || {};
+
+ var payloadKey = this._getMappedKey(key, snapshot.type);
+ if (payloadKey === key) {
+ payloadKey = this.keyForRelationship(key, 'belongsTo', 'serialize');
+ }
+
+ var data = null;
+ if (belongsTo) {
+ var payloadType = undefined;
+
+ if (false) {
+ payloadType = this.payloadTypeFromModelName(belongsTo.modelName);
+ var deprecatedPayloadTypeLookup = this.payloadKeyFromModelName(belongsTo.modelName);
+
+ if (payloadType !== deprecatedPayloadTypeLookup && this._hasCustomPayloadKeyFromModelName()) {
+ (0, _emberDataPrivateDebug.deprecate)("You used payloadKeyFromModelName to serialize type for belongs-to relationship. Use payloadTypeFromModelName instead.", false, {
+ id: 'ds.json-api-serializer.deprecated-payload-type-for-belongs-to',
+ until: '3.0.0'
+ });
+
+ payloadType = deprecatedPayloadTypeLookup;
+ }
+ } else {
+ payloadType = this.payloadKeyFromModelName(belongsTo.modelName);
+ }
+
+ data = {
+ type: payloadType,
+ id: belongsTo.id
+ };
+ }
+
+ json.relationships[payloadKey] = { data: data };
+ }
+ }
+ },
+
+ /**
+ @method serializeHasMany
+ @param {DS.Snapshot} snapshot
+ @param {Object} json
+ @param {Object} relationship
+ */
+ serializeHasMany: function serializeHasMany(snapshot, json, relationship) {
+ var key = relationship.key;
+ var shouldSerializeHasMany = '_shouldSerializeHasMany';
+ if (false) {
+ shouldSerializeHasMany = 'shouldSerializeHasMany';
+ }
+
+ if (this[shouldSerializeHasMany](snapshot, key, relationship)) {
+ var hasMany = snapshot.hasMany(key);
+ if (hasMany !== undefined) {
+
+ json.relationships = json.relationships || {};
+
+ var payloadKey = this._getMappedKey(key, snapshot.type);
+ if (payloadKey === key && this.keyForRelationship) {
+ payloadKey = this.keyForRelationship(key, 'hasMany', 'serialize');
+ }
+
+ var data = new Array(hasMany.length);
+
+ for (var i = 0; i < hasMany.length; i++) {
+ var item = hasMany[i];
+
+ var payloadType = undefined;
+
+ if (false) {
+ payloadType = this.payloadTypeFromModelName(item.modelName);
+ var deprecatedPayloadTypeLookup = this.payloadKeyFromModelName(item.modelName);
+
+ if (payloadType !== deprecatedPayloadTypeLookup && this._hasCustomPayloadKeyFromModelName()) {
+ (0, _emberDataPrivateDebug.deprecate)("You used payloadKeyFromModelName to serialize type for belongs-to relationship. Use payloadTypeFromModelName instead.", false, {
+ id: 'ds.json-api-serializer.deprecated-payload-type-for-has-many',
+ until: '3.0.0'
+ });
+
+ payloadType = deprecatedPayloadTypeLookup;
+ }
+ } else {
+ payloadType = this.payloadKeyFromModelName(item.modelName);
+ }
+
+ data[i] = {
+ type: payloadType,
+ id: item.id
+ };
+ }
+
+ json.relationships[payloadKey] = { data: data };
+ }
+ }
+ }
+ });
+
+ if (false) {
+
+ JSONAPISerializer.reopen({
+
+ /**
+ `modelNameFromPayloadType` can be used to change the mapping for a DS model
+ name, taken from the value in the payload.
+ Say your API namespaces the type of a model and returns the following
+ payload for the `post` model:
+ ```javascript
+ // GET /api/posts/1
+ {
+ "data": {
+ "id": 1,
+ "type: "api::v1::post"
+ }
+ }
+ ```
+ By overwriting `modelNameFromPayloadType` you can specify that the
+ `posr` model should be used:
+ ```app/serializers/application.js
+ import DS from "ember-data";
+ export default DS.JSONAPISerializer.extend({
+ modelNameFromPayloadType(payloadType) {
+ return payloadType.replace('api::v1::', '');
+ }
+ });
+ ```
+ By default the modelName for a model is its singularized name in dasherized
+ form. Usually, Ember Data can use the correct inflection to do this for
+ you. Most of the time, you won't need to override
+ `modelNameFromPayloadType` for this purpose.
+ Also take a look at
+ [payloadTypeFromModelName](#method_payloadTypeFromModelName) to customize
+ how the type of a record should be serialized.
+ @method modelNameFromPayloadType
+ @public
+ @param {String} payloadType type from payload
+ @return {String} modelName
+ */
+ modelNameFromPayloadType: function modelNameFromPayloadType(type) {
+ return (0, _emberInflector.singularize)((0, _emberDataPrivateSystemNormalizeModelName['default'])(type));
+ },
+
+ /**
+ `payloadTypeFromModelName` can be used to change the mapping for the type in
+ the payload, taken from the model name.
+ Say your API namespaces the type of a model and expects the following
+ payload when you update the `post` model:
+ ```javascript
+ // POST /api/posts/1
+ {
+ "data": {
+ "id": 1,
+ "type": "api::v1::post"
+ }
+ }
+ ```
+ By overwriting `payloadTypeFromModelName` you can specify that the
+ namespaces model name for the `post` should be used:
+ ```app/serializers/application.js
+ import DS from "ember-data";
+ export default JSONAPISerializer.extend({
+ payloadTypeFromModelName(modelName) {
+ return "api::v1::" + modelName;
+ }
+ });
+ ```
+ By default the payload type is the pluralized model name. Usually, Ember
+ Data can use the correct inflection to do this for you. Most of the time,
+ you won't need to override `payloadTypeFromModelName` for this purpose.
+ Also take a look at
+ [modelNameFromPayloadType](#method_modelNameFromPayloadType) to customize
+ how the model name from should be mapped from the payload.
+ @method payloadTypeFromModelName
+ @public
+ @param {String} modelname modelName from the record
+ @return {String} payloadType
+ */
+ payloadTypeFromModelName: function payloadTypeFromModelName(modelName) {
+ return (0, _emberInflector.pluralize)(modelName);
+ },
+
+ _hasCustomModelNameFromPayloadKey: function _hasCustomModelNameFromPayloadKey() {
+ return this.modelNameFromPayloadKey !== JSONAPISerializer.prototype.modelNameFromPayloadKey;
+ },
+
+ _hasCustomPayloadKeyFromModelName: function _hasCustomPayloadKeyFromModelName() {
+ return this.payloadKeyFromModelName !== JSONAPISerializer.prototype.payloadKeyFromModelName;
+ }
+
+ });
+ }
+
+ (0, _emberDataPrivateDebug.runInDebug)(function () {
+ JSONAPISerializer.reopen({
+ willMergeMixin: function willMergeMixin(props) {
+ (0, _emberDataPrivateDebug.warn)('The JSONAPISerializer does not work with the EmbeddedRecordsMixin because the JSON API spec does not describe how to format embedded resources.', !props.isEmbeddedRecordsMixin, {
+ id: 'ds.serializer.embedded-records-mixin-not-supported'
+ });
+ },
+ warnMessageForUndefinedType: function warnMessageForUndefinedType() {
+ return 'Encountered a resource object with an undefined type (resolved resource using ' + this.constructor.toString() + ')';
+ },
+ warnMessageNoModelForType: function warnMessageNoModelForType(modelName, originalType, usedLookup) {
+ return 'Encountered a resource object with type "' + originalType + '", but no model was found for model name "' + modelName + '" (resolved model name using \'' + this.constructor.toString() + '.' + usedLookup + '("' + originalType + '")).';
+ }
+ });
+ });
+
+ exports['default'] = JSONAPISerializer;
+});
+define('ember-data/serializers/json', ['exports', 'ember', 'ember-data/-private/debug', 'ember-data/serializer', 'ember-data/-private/system/coerce-id', 'ember-data/-private/system/normalize-model-name', 'ember-data/-private/utils', 'ember-data/-private/features', 'ember-data/adapters/errors'], function (exports, _ember, _emberDataPrivateDebug, _emberDataSerializer, _emberDataPrivateSystemCoerceId, _emberDataPrivateSystemNormalizeModelName, _emberDataPrivateUtils, _emberDataPrivateFeatures, _emberDataAdaptersErrors) {
+ 'use strict';
+
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];return arr2;
+ } else {
+ return Array.from(arr);
+ }
+ }
+
+ var get = _ember['default'].get;
+ var isNone = _ember['default'].isNone;
+ var assign = _ember['default'].assign || _ember['default'].merge;
+
+ /**
+ Ember Data 2.0 Serializer:
+
+ In Ember Data a Serializer is used to serialize and deserialize
+ records when they are transferred in and out of an external source.
+ This process involves normalizing property names, transforming
+ attribute values and serializing relationships.
+
+ By default, Ember Data uses and recommends the `JSONAPISerializer`.
+
+ `JSONSerializer` is useful for simpler or legacy backends that may
+ not support the http://jsonapi.org/ spec.
+
+ For example, given the following `User` model and JSON payload:
+
+ ```app/models/user.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ friends: DS.hasMany('user'),
+ house: DS.belongsTo('location'),
+
+ name: DS.attr('string')
+ });
+ ```
+
+ ```js
+ {
+ id: 1,
+ name: 'Sebastian',
+ friends: [3, 4],
+ links: {
+ house: '/houses/lefkada'
+ }
+ }
+ ```
+
+ `JSONSerializer` will normalize the JSON payload to the JSON API format that the
+ Ember Data store expects.
+
+ You can customize how JSONSerializer processes its payload by passing options in
+ the `attrs` hash or by subclassing the `JSONSerializer` and overriding hooks:
+
+ - To customize how a single record is normalized, use the `normalize` hook.
+ - To customize how `JSONSerializer` normalizes the whole server response, use the
+ `normalizeResponse` hook.
+ - To customize how `JSONSerializer` normalizes a specific response from the server,
+ use one of the many specific `normalizeResponse` hooks.
+ - To customize how `JSONSerializer` normalizes your id, attributes or relationships,
+ use the `extractId`, `extractAttributes` and `extractRelationships` hooks.
+
+ The `JSONSerializer` normalization process follows these steps:
+
+ - `normalizeResponse` - entry method to the serializer.
+ - `normalizeCreateRecordResponse` - a `normalizeResponse` for a specific operation is called.
+ - `normalizeSingleResponse`|`normalizeArrayResponse` - for methods like `createRecord` we expect
+ a single record back, while for methods like `findAll` we expect multiple methods back.
+ - `normalize` - `normalizeArray` iterates and calls `normalize` for each of its records while `normalizeSingle`
+ calls it once. This is the method you most likely want to subclass.
+ - `extractId` | `extractAttributes` | `extractRelationships` - `normalize` delegates to these methods to
+ turn the record payload into the JSON API format.
+
+ @class JSONSerializer
+ @namespace DS
+ @extends DS.Serializer
+ */
+ var JSONSerializer = _emberDataSerializer['default'].extend({
+
+ /**
+ The `primaryKey` is used when serializing and deserializing
+ data. Ember Data always uses the `id` property to store the id of
+ the record. The external source may not always follow this
+ convention. In these cases it is useful to override the
+ `primaryKey` property to match the `primaryKey` of your external
+ store.
+ Example
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ primaryKey: '_id'
+ });
+ ```
+ @property primaryKey
+ @type {String}
+ @default 'id'
+ */
+ primaryKey: 'id',
+
+ /**
+ The `attrs` object can be used to declare a simple mapping between
+ property names on `DS.Model` records and payload keys in the
+ serialized JSON object representing the record. An object with the
+ property `key` can also be used to designate the attribute's key on
+ the response payload.
+ Example
+ ```app/models/person.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ firstName: DS.attr('string'),
+ lastName: DS.attr('string'),
+ occupation: DS.attr('string'),
+ admin: DS.attr('boolean')
+ });
+ ```
+ ```app/serializers/person.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ attrs: {
+ admin: 'is_admin',
+ occupation: { key: 'career' }
+ }
+ });
+ ```
+ You can also remove attributes by setting the `serialize` key to
+ `false` in your mapping object.
+ Example
+ ```app/serializers/person.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ attrs: {
+ admin: { serialize: false },
+ occupation: { key: 'career' }
+ }
+ });
+ ```
+ When serialized:
+ ```javascript
+ {
+ "firstName": "Harry",
+ "lastName": "Houdini",
+ "career": "magician"
+ }
+ ```
+ Note that the `admin` is now not included in the payload.
+ @property attrs
+ @type {Object}
+ */
+ mergedProperties: ['attrs'],
+
+ /**
+ Given a subclass of `DS.Model` and a JSON object this method will
+ iterate through each attribute of the `DS.Model` and invoke the
+ `DS.Transform#deserialize` method on the matching property of the
+ JSON object. This method is typically called after the
+ serializer's `normalize` method.
+ @method applyTransforms
+ @private
+ @param {DS.Model} typeClass
+ @param {Object} data The data to transform
+ @return {Object} data The transformed data object
+ */
+ applyTransforms: function applyTransforms(typeClass, data) {
+ var _this = this;
+
+ var attributes = get(typeClass, 'attributes');
+
+ typeClass.eachTransformedAttribute(function (key, typeClass) {
+ if (data[key] === undefined) {
+ return;
+ }
+
+ var transform = _this.transformFor(typeClass);
+ var transformMeta = attributes.get(key);
+ data[key] = transform.deserialize(data[key], transformMeta.options);
+ });
+
+ return data;
+ },
+
+ /**
+ The `normalizeResponse` method is used to normalize a payload from the
+ server to a JSON-API Document.
+ http://jsonapi.org/format/#document-structure
+ This method delegates to a more specific normalize method based on
+ the `requestType`.
+ To override this method with a custom one, make sure to call
+ `return this._super(store, primaryModelClass, payload, id, requestType)` with your
+ pre-processed data.
+ Here's an example of using `normalizeResponse` manually:
+ ```javascript
+ socket.on('message', function(message) {
+ var data = message.data;
+ var modelClass = store.modelFor(data.modelName);
+ var serializer = store.serializerFor(data.modelName);
+ var normalized = serializer.normalizeSingleResponse(store, modelClass, data, data.id);
+ store.push(normalized);
+ });
+ ```
+ @since 1.13.0
+ @method normalizeResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeResponse: function normalizeResponse(store, primaryModelClass, payload, id, requestType) {
+ switch (requestType) {
+ case 'findRecord':
+ return this.normalizeFindRecordResponse.apply(this, arguments);
+ case 'queryRecord':
+ return this.normalizeQueryRecordResponse.apply(this, arguments);
+ case 'findAll':
+ return this.normalizeFindAllResponse.apply(this, arguments);
+ case 'findBelongsTo':
+ return this.normalizeFindBelongsToResponse.apply(this, arguments);
+ case 'findHasMany':
+ return this.normalizeFindHasManyResponse.apply(this, arguments);
+ case 'findMany':
+ return this.normalizeFindManyResponse.apply(this, arguments);
+ case 'query':
+ return this.normalizeQueryResponse.apply(this, arguments);
+ case 'createRecord':
+ return this.normalizeCreateRecordResponse.apply(this, arguments);
+ case 'deleteRecord':
+ return this.normalizeDeleteRecordResponse.apply(this, arguments);
+ case 'updateRecord':
+ return this.normalizeUpdateRecordResponse.apply(this, arguments);
+ }
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeFindRecordResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeFindRecordResponse: function normalizeFindRecordResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeSingleResponse.apply(this, arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeQueryRecordResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeQueryRecordResponse: function normalizeQueryRecordResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeSingleResponse.apply(this, arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeFindAllResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeFindAllResponse: function normalizeFindAllResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeArrayResponse.apply(this, arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeFindBelongsToResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeFindBelongsToResponse: function normalizeFindBelongsToResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeSingleResponse.apply(this, arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeFindHasManyResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeFindHasManyResponse: function normalizeFindHasManyResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeArrayResponse.apply(this, arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeFindManyResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeFindManyResponse: function normalizeFindManyResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeArrayResponse.apply(this, arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeQueryResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeQueryResponse: function normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeArrayResponse.apply(this, arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeCreateRecordResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeCreateRecordResponse: function normalizeCreateRecordResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeSaveResponse.apply(this, arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeDeleteRecordResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeDeleteRecordResponse: function normalizeDeleteRecordResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeSaveResponse.apply(this, arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeUpdateRecordResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeUpdateRecordResponse: function normalizeUpdateRecordResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeSaveResponse.apply(this, arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeSaveResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeSaveResponse: function normalizeSaveResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeSingleResponse.apply(this, arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeSingleResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeSingleResponse: function normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {
+ return this._normalizeResponse(store, primaryModelClass, payload, id, requestType, true);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeArrayResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeArrayResponse: function normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {
+ return this._normalizeResponse(store, primaryModelClass, payload, id, requestType, false);
+ },
+
+ /**
+ @method _normalizeResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @param {Boolean} isSingle
+ @return {Object} JSON-API Document
+ @private
+ */
+ _normalizeResponse: function _normalizeResponse(store, primaryModelClass, payload, id, requestType, isSingle) {
+ var documentHash = {
+ data: null,
+ included: []
+ };
+
+ var meta = this.extractMeta(store, primaryModelClass, payload);
+ if (meta) {
+ (0, _emberDataPrivateDebug.assert)('The `meta` returned from `extractMeta` has to be an object, not "' + _ember['default'].typeOf(meta) + '".', _ember['default'].typeOf(meta) === 'object');
+ documentHash.meta = meta;
+ }
+
+ if (isSingle) {
+ var _normalize = this.normalize(primaryModelClass, payload);
+
+ var data = _normalize.data;
+ var included = _normalize.included;
+
+ documentHash.data = data;
+ if (included) {
+ documentHash.included = included;
+ }
+ } else {
+ var ret = new Array(payload.length);
+ for (var i = 0, l = payload.length; i < l; i++) {
+ var item = payload[i];
+
+ var _normalize2 = this.normalize(primaryModelClass, item);
+
+ var data = _normalize2.data;
+ var included = _normalize2.included;
+
+ if (included) {
+ var _documentHash$included;
+
+ (_documentHash$included = documentHash.included).push.apply(_documentHash$included, _toConsumableArray(included));
+ }
+ ret[i] = data;
+ }
+
+ documentHash.data = ret;
+ }
+
+ return documentHash;
+ },
+
+ /**
+ Normalizes a part of the JSON payload returned by
+ the server. You should override this method, munge the hash
+ and call super if you have generic normalization to do.
+ It takes the type of the record that is being normalized
+ (as a DS.Model class), the property where the hash was
+ originally found, and the hash to normalize.
+ You can use this method, for example, to normalize underscored keys to camelized
+ or other general-purpose normalizations.
+ Example
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ normalize: function(typeClass, hash) {
+ var fields = Ember.get(typeClass, 'fields');
+ fields.forEach(function(field) {
+ var payloadField = Ember.String.underscore(field);
+ if (field === payloadField) { return; }
+ hash[field] = hash[payloadField];
+ delete hash[payloadField];
+ });
+ return this._super.apply(this, arguments);
+ }
+ });
+ ```
+ @method normalize
+ @param {DS.Model} typeClass
+ @param {Object} hash
+ @return {Object}
+ */
+ normalize: function normalize(modelClass, resourceHash) {
+ var data = null;
+
+ if (resourceHash) {
+ this.normalizeUsingDeclaredMapping(modelClass, resourceHash);
+ if (_ember['default'].typeOf(resourceHash.links) === 'object') {
+ this.normalizeUsingDeclaredMapping(modelClass, resourceHash.links);
+ }
+
+ data = {
+ id: this.extractId(modelClass, resourceHash),
+ type: modelClass.modelName,
+ attributes: this.extractAttributes(modelClass, resourceHash),
+ relationships: this.extractRelationships(modelClass, resourceHash)
+ };
+
+ this.applyTransforms(modelClass, data.attributes);
+ }
+
+ return { data: data };
+ },
+
+ /**
+ Returns the resource's ID.
+ @method extractId
+ @param {Object} modelClass
+ @param {Object} resourceHash
+ @return {String}
+ */
+ extractId: function extractId(modelClass, resourceHash) {
+ var primaryKey = get(this, 'primaryKey');
+ var id = resourceHash[primaryKey];
+ return (0, _emberDataPrivateSystemCoerceId['default'])(id);
+ },
+
+ /**
+ Returns the resource's attributes formatted as a JSON-API "attributes object".
+ http://jsonapi.org/format/#document-resource-object-attributes
+ @method extractAttributes
+ @param {Object} modelClass
+ @param {Object} resourceHash
+ @return {Object}
+ */
+ extractAttributes: function extractAttributes(modelClass, resourceHash) {
+ var _this2 = this;
+
+ var attributeKey;
+ var attributes = {};
+
+ modelClass.eachAttribute(function (key) {
+ attributeKey = _this2.keyForAttribute(key, 'deserialize');
+ if (resourceHash[attributeKey] !== undefined) {
+ attributes[key] = resourceHash[attributeKey];
+ }
+ });
+
+ return attributes;
+ },
+
+ /**
+ Returns a relationship formatted as a JSON-API "relationship object".
+ http://jsonapi.org/format/#document-resource-object-relationships
+ @method extractRelationship
+ @param {Object} relationshipModelName
+ @param {Object} relationshipHash
+ @return {Object}
+ */
+ extractRelationship: function extractRelationship(relationshipModelName, relationshipHash) {
+ if (_ember['default'].isNone(relationshipHash)) {
+ return null;
+ }
+ /*
+ When `relationshipHash` is an object it usually means that the relationship
+ is polymorphic. It could however also be embedded resources that the
+ EmbeddedRecordsMixin has be able to process.
+ */
+ if (_ember['default'].typeOf(relationshipHash) === 'object') {
+ if (relationshipHash.id) {
+ relationshipHash.id = (0, _emberDataPrivateSystemCoerceId['default'])(relationshipHash.id);
+ }
+
+ var modelClass = this.store.modelFor(relationshipModelName);
+ if (relationshipHash.type && !(0, _emberDataPrivateUtils.modelHasAttributeOrRelationshipNamedType)(modelClass)) {
+
+ if (false) {
+ var modelName = this.modelNameFromPayloadType(relationshipHash.type);
+ var deprecatedModelNameLookup = this.modelNameFromPayloadKey(relationshipHash.type);
+
+ if (modelName !== deprecatedModelNameLookup && this._hasCustomModelNameFromPayloadKey()) {
+ (0, _emberDataPrivateDebug.deprecate)("You used modelNameFromPayloadKey to customize how a type is normalized. Use modelNameFromPayloadType instead", false, {
+ id: 'ds.json-serializer.deprecated-type-for-polymorphic-relationship',
+ until: '3.0.0'
+ });
+
+ modelName = deprecatedModelNameLookup;
+ }
+
+ relationshipHash.type = modelName;
+ } else {
+ relationshipHash.type = this.modelNameFromPayloadKey(relationshipHash.type);
+ }
+ }
+ return relationshipHash;
+ }
+ return { id: (0, _emberDataPrivateSystemCoerceId['default'])(relationshipHash), type: relationshipModelName };
+ },
+
+ /**
+ Returns a polymorphic relationship formatted as a JSON-API "relationship object".
+ http://jsonapi.org/format/#document-resource-object-relationships
+ `relationshipOptions` is a hash which contains more information about the
+ polymorphic relationship which should be extracted:
+ - `resourceHash` complete hash of the resource the relationship should be
+ extracted from
+ - `relationshipKey` key under which the value for the relationship is
+ extracted from the resourceHash
+ - `relationshipMeta` meta information about the relationship
+ @method extractPolymorphicRelationship
+ @param {Object} relationshipModelName
+ @param {Object} relationshipHash
+ @param {Object} relationshipOptions
+ @return {Object}
+ */
+ extractPolymorphicRelationship: function extractPolymorphicRelationship(relationshipModelName, relationshipHash, relationshipOptions) {
+ return this.extractRelationship(relationshipModelName, relationshipHash);
+ },
+
+ /**
+ Returns the resource's relationships formatted as a JSON-API "relationships object".
+ http://jsonapi.org/format/#document-resource-object-relationships
+ @method extractRelationships
+ @param {Object} modelClass
+ @param {Object} resourceHash
+ @return {Object}
+ */
+ extractRelationships: function extractRelationships(modelClass, resourceHash) {
+ var _this3 = this;
+
+ var relationships = {};
+
+ modelClass.eachRelationship(function (key, relationshipMeta) {
+ var relationship = null;
+ var relationshipKey = _this3.keyForRelationship(key, relationshipMeta.kind, 'deserialize');
+ if (resourceHash[relationshipKey] !== undefined) {
+ var data = null;
+ var relationshipHash = resourceHash[relationshipKey];
+ if (relationshipMeta.kind === 'belongsTo') {
+ if (relationshipMeta.options.polymorphic) {
+ // extracting a polymorphic belongsTo may need more information
+ // than the type and the hash (which might only be an id) for the
+ // relationship, hence we pass the key, resource and
+ // relationshipMeta too
+ data = _this3.extractPolymorphicRelationship(relationshipMeta.type, relationshipHash, { key: key, resourceHash: resourceHash, relationshipMeta: relationshipMeta });
+ } else {
+ data = _this3.extractRelationship(relationshipMeta.type, relationshipHash);
+ }
+ } else if (relationshipMeta.kind === 'hasMany') {
+ if (!_ember['default'].isNone(relationshipHash)) {
+ data = new Array(relationshipHash.length);
+ for (var i = 0, l = relationshipHash.length; i < l; i++) {
+ var item = relationshipHash[i];
+ data[i] = _this3.extractRelationship(relationshipMeta.type, item);
+ }
+ }
+ }
+ relationship = { data: data };
+ }
+
+ var linkKey = _this3.keyForLink(key, relationshipMeta.kind);
+ if (resourceHash.links && resourceHash.links[linkKey] !== undefined) {
+ var related = resourceHash.links[linkKey];
+ relationship = relationship || {};
+ relationship.links = { related: related };
+ }
+
+ if (relationship) {
+ relationships[key] = relationship;
+ }
+ });
+
+ return relationships;
+ },
+
+ /**
+ @method modelNameFromPayloadKey
+ @param {String} key
+ @return {String} the model's modelName
+ */
+ // TODO @deprecated Use modelNameFromPayloadType instead
+ modelNameFromPayloadKey: function modelNameFromPayloadKey(key) {
+ return (0, _emberDataPrivateSystemNormalizeModelName['default'])(key);
+ },
+
+ /**
+ @method normalizeAttributes
+ @private
+ */
+ normalizeAttributes: function normalizeAttributes(typeClass, hash) {
+ var _this4 = this;
+
+ var payloadKey;
+
+ if (this.keyForAttribute) {
+ typeClass.eachAttribute(function (key) {
+ payloadKey = _this4.keyForAttribute(key, 'deserialize');
+ if (key === payloadKey) {
+ return;
+ }
+ if (hash[payloadKey] === undefined) {
+ return;
+ }
+
+ hash[key] = hash[payloadKey];
+ delete hash[payloadKey];
+ });
+ }
+ },
+
+ /**
+ @method normalizeRelationships
+ @private
+ */
+ normalizeRelationships: function normalizeRelationships(typeClass, hash) {
+ var _this5 = this;
+
+ var payloadKey;
+
+ if (this.keyForRelationship) {
+ typeClass.eachRelationship(function (key, relationship) {
+ payloadKey = _this5.keyForRelationship(key, relationship.kind, 'deserialize');
+ if (key === payloadKey) {
+ return;
+ }
+ if (hash[payloadKey] === undefined) {
+ return;
+ }
+
+ hash[key] = hash[payloadKey];
+ delete hash[payloadKey];
+ });
+ }
+ },
+
+ /**
+ @method normalizeUsingDeclaredMapping
+ @private
+ */
+ normalizeUsingDeclaredMapping: function normalizeUsingDeclaredMapping(modelClass, hash) {
+ var attrs = get(this, 'attrs');
+ var normalizedKey, payloadKey, key;
+
+ if (attrs) {
+ for (key in attrs) {
+ normalizedKey = payloadKey = this._getMappedKey(key, modelClass);
+
+ if (hash[payloadKey] === undefined) {
+ continue;
+ }
+
+ if (get(modelClass, 'attributes').has(key)) {
+ normalizedKey = this.keyForAttribute(key);
+ }
+
+ if (get(modelClass, 'relationshipsByName').has(key)) {
+ normalizedKey = this.keyForRelationship(key);
+ }
+
+ if (payloadKey !== normalizedKey) {
+ hash[normalizedKey] = hash[payloadKey];
+ delete hash[payloadKey];
+ }
+ }
+ }
+ },
+
+ /**
+ Looks up the property key that was set by the custom `attr` mapping
+ passed to the serializer.
+ @method _getMappedKey
+ @private
+ @param {String} key
+ @return {String} key
+ */
+ _getMappedKey: function _getMappedKey(key, modelClass) {
+ (0, _emberDataPrivateDebug.warn)('There is no attribute or relationship with the name `' + key + '` on `' + modelClass.modelName + '`. Check your serializers attrs hash.', get(modelClass, 'attributes').has(key) || get(modelClass, 'relationshipsByName').has(key), {
+ id: 'ds.serializer.no-mapped-attrs-key'
+ });
+
+ var attrs = get(this, 'attrs');
+ var mappedKey;
+ if (attrs && attrs[key]) {
+ mappedKey = attrs[key];
+ //We need to account for both the { title: 'post_title' } and
+ //{ title: { key: 'post_title' }} forms
+ if (mappedKey.key) {
+ mappedKey = mappedKey.key;
+ }
+ if (typeof mappedKey === 'string') {
+ key = mappedKey;
+ }
+ }
+
+ return key;
+ },
+
+ /**
+ Check attrs.key.serialize property to inform if the `key`
+ can be serialized
+ @method _canSerialize
+ @private
+ @param {String} key
+ @return {boolean} true if the key can be serialized
+ */
+ _canSerialize: function _canSerialize(key) {
+ var attrs = get(this, 'attrs');
+
+ return !attrs || !attrs[key] || attrs[key].serialize !== false;
+ },
+
+ /**
+ When attrs.key.serialize is set to true then
+ it takes priority over the other checks and the related
+ attribute/relationship will be serialized
+ @method _mustSerialize
+ @private
+ @param {String} key
+ @return {boolean} true if the key must be serialized
+ */
+ _mustSerialize: function _mustSerialize(key) {
+ var attrs = get(this, 'attrs');
+
+ return attrs && attrs[key] && attrs[key].serialize === true;
+ },
+
+ /**
+ Check if the given hasMany relationship should be serialized
+ @method shouldSerializeHasMany
+ @param {DS.Snapshot} snapshot
+ @param {String} key
+ @param {String} relationshipType
+ @return {boolean} true if the hasMany relationship should be serialized
+ */
+
+ shouldSerializeHasMany: function shouldSerializeHasMany(snapshot, key, relationship) {
+ if (this._shouldSerializeHasMany !== JSONSerializer.prototype._shouldSerializeHasMany) {
+ (0, _emberDataPrivateDebug.deprecate)('The private method _shouldSerializeHasMany has been promoted to the public API. Please remove the underscore to use the public shouldSerializeHasMany method.', false, {
+ id: 'ds.serializer.private-should-serialize-has-many',
+ until: '3.0.0'
+ });
+ }
+
+ return this._shouldSerializeHasMany(snapshot, key, relationship);
+ },
+
+ /**
+ Check if the given hasMany relationship should be serialized
+ @method _shouldSerializeHasMany
+ @private
+ @param {DS.Snapshot} snapshot
+ @param {String} key
+ @param {String} relationshipType
+ @return {boolean} true if the hasMany relationship should be serialized
+ */
+ _shouldSerializeHasMany: function _shouldSerializeHasMany(snapshot, key, relationship) {
+ var relationshipType = snapshot.type.determineRelationshipType(relationship, this.store);
+ if (this._mustSerialize(key)) {
+ return true;
+ }
+ return this._canSerialize(key) && (relationshipType === 'manyToNone' || relationshipType === 'manyToMany');
+ },
+
+ // SERIALIZE
+ /**
+ Called when a record is saved in order to convert the
+ record into JSON.
+ By default, it creates a JSON object with a key for
+ each attribute and belongsTo relationship.
+ For example, consider this model:
+ ```app/models/comment.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ title: DS.attr(),
+ body: DS.attr(),
+ author: DS.belongsTo('user')
+ });
+ ```
+ The default serialization would create a JSON object like:
+ ```javascript
+ {
+ "title": "Rails is unagi",
+ "body": "Rails? Omakase? O_O",
+ "author": 12
+ }
+ ```
+ By default, attributes are passed through as-is, unless
+ you specified an attribute type (`DS.attr('date')`). If
+ you specify a transform, the JavaScript value will be
+ serialized when inserted into the JSON hash.
+ By default, belongs-to relationships are converted into
+ IDs when inserted into the JSON hash.
+ ## IDs
+ `serialize` takes an options hash with a single option:
+ `includeId`. If this option is `true`, `serialize` will,
+ by default include the ID in the JSON object it builds.
+ The adapter passes in `includeId: true` when serializing
+ a record for `createRecord`, but not for `updateRecord`.
+ ## Customization
+ Your server may expect a different JSON format than the
+ built-in serialization format.
+ In that case, you can implement `serialize` yourself and
+ return a JSON hash of your choosing.
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ serialize: function(snapshot, options) {
+ var json = {
+ POST_TTL: snapshot.attr('title'),
+ POST_BDY: snapshot.attr('body'),
+ POST_CMS: snapshot.hasMany('comments', { ids: true })
+ }
+ if (options.includeId) {
+ json.POST_ID_ = snapshot.id;
+ }
+ return json;
+ }
+ });
+ ```
+ ## Customizing an App-Wide Serializer
+ If you want to define a serializer for your entire
+ application, you'll probably want to use `eachAttribute`
+ and `eachRelationship` on the record.
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ serialize: function(snapshot, options) {
+ var json = {};
+ snapshot.eachAttribute(function(name) {
+ json[serverAttributeName(name)] = snapshot.attr(name);
+ })
+ snapshot.eachRelationship(function(name, relationship) {
+ if (relationship.kind === 'hasMany') {
+ json[serverHasManyName(name)] = snapshot.hasMany(name, { ids: true });
+ }
+ });
+ if (options.includeId) {
+ json.ID_ = snapshot.id;
+ }
+ return json;
+ }
+ });
+ function serverAttributeName(attribute) {
+ return attribute.underscore().toUpperCase();
+ }
+ function serverHasManyName(name) {
+ return serverAttributeName(name.singularize()) + "_IDS";
+ }
+ ```
+ This serializer will generate JSON that looks like this:
+ ```javascript
+ {
+ "TITLE": "Rails is omakase",
+ "BODY": "Yep. Omakase.",
+ "COMMENT_IDS": [ 1, 2, 3 ]
+ }
+ ```
+ ## Tweaking the Default JSON
+ If you just want to do some small tweaks on the default JSON,
+ you can call super first and make the tweaks on the returned
+ JSON.
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ serialize: function(snapshot, options) {
+ var json = this._super.apply(this, arguments);
+ json.subject = json.title;
+ delete json.title;
+ return json;
+ }
+ });
+ ```
+ @method serialize
+ @param {DS.Snapshot} snapshot
+ @param {Object} options
+ @return {Object} json
+ */
+ serialize: function serialize(snapshot, options) {
+ var _this6 = this;
+
+ var json = {};
+
+ if (options && options.includeId) {
+ var id = snapshot.id;
+
+ if (id) {
+ json[get(this, 'primaryKey')] = id;
+ }
+ }
+
+ snapshot.eachAttribute(function (key, attribute) {
+ _this6.serializeAttribute(snapshot, json, key, attribute);
+ });
+
+ snapshot.eachRelationship(function (key, relationship) {
+ if (relationship.kind === 'belongsTo') {
+ _this6.serializeBelongsTo(snapshot, json, relationship);
+ } else if (relationship.kind === 'hasMany') {
+ _this6.serializeHasMany(snapshot, json, relationship);
+ }
+ });
+
+ return json;
+ },
+
+ /**
+ You can use this method to customize how a serialized record is added to the complete
+ JSON hash to be sent to the server. By default the JSON Serializer does not namespace
+ the payload and just sends the raw serialized JSON object.
+ If your server expects namespaced keys, you should consider using the RESTSerializer.
+ Otherwise you can override this method to customize how the record is added to the hash.
+ The hash property should be modified by reference.
+ For example, your server may expect underscored root objects.
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend({
+ serializeIntoHash: function(data, type, snapshot, options) {
+ var root = Ember.String.decamelize(type.modelName);
+ data[root] = this.serialize(snapshot, options);
+ }
+ });
+ ```
+ @method serializeIntoHash
+ @param {Object} hash
+ @param {DS.Model} typeClass
+ @param {DS.Snapshot} snapshot
+ @param {Object} options
+ */
+ serializeIntoHash: function serializeIntoHash(hash, typeClass, snapshot, options) {
+ assign(hash, this.serialize(snapshot, options));
+ },
+
+ /**
+ `serializeAttribute` can be used to customize how `DS.attr`
+ properties are serialized
+ For example if you wanted to ensure all your attributes were always
+ serialized as properties on an `attributes` object you could
+ write:
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ serializeAttribute: function(snapshot, json, key, attributes) {
+ json.attributes = json.attributes || {};
+ this._super(snapshot, json.attributes, key, attributes);
+ }
+ });
+ ```
+ @method serializeAttribute
+ @param {DS.Snapshot} snapshot
+ @param {Object} json
+ @param {String} key
+ @param {Object} attribute
+ */
+ serializeAttribute: function serializeAttribute(snapshot, json, key, attribute) {
+ var type = attribute.type;
+
+ if (this._canSerialize(key)) {
+ var value = snapshot.attr(key);
+ if (type) {
+ var transform = this.transformFor(type);
+ value = transform.serialize(value, attribute.options);
+ }
+
+ // if provided, use the mapping provided by `attrs` in
+ // the serializer
+ var payloadKey = this._getMappedKey(key, snapshot.type);
+
+ if (payloadKey === key && this.keyForAttribute) {
+ payloadKey = this.keyForAttribute(key, 'serialize');
+ }
+
+ json[payloadKey] = value;
+ }
+ },
+
+ /**
+ `serializeBelongsTo` can be used to customize how `DS.belongsTo`
+ properties are serialized.
+ Example
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ serializeBelongsTo: function(snapshot, json, relationship) {
+ var key = relationship.key;
+ var belongsTo = snapshot.belongsTo(key);
+ key = this.keyForRelationship ? this.keyForRelationship(key, "belongsTo", "serialize") : key;
+ json[key] = Ember.isNone(belongsTo) ? belongsTo : belongsTo.record.toJSON();
+ }
+ });
+ ```
+ @method serializeBelongsTo
+ @param {DS.Snapshot} snapshot
+ @param {Object} json
+ @param {Object} relationship
+ */
+ serializeBelongsTo: function serializeBelongsTo(snapshot, json, relationship) {
+ var key = relationship.key;
+
+ if (this._canSerialize(key)) {
+ var belongsToId = snapshot.belongsTo(key, { id: true });
+
+ // if provided, use the mapping provided by `attrs` in
+ // the serializer
+ var payloadKey = this._getMappedKey(key, snapshot.type);
+ if (payloadKey === key && this.keyForRelationship) {
+ payloadKey = this.keyForRelationship(key, "belongsTo", "serialize");
+ }
+
+ //Need to check whether the id is there for new&async records
+ if (isNone(belongsToId)) {
+ json[payloadKey] = null;
+ } else {
+ json[payloadKey] = belongsToId;
+ }
+
+ if (relationship.options.polymorphic) {
+ this.serializePolymorphicType(snapshot, json, relationship);
+ }
+ }
+ },
+
+ /**
+ `serializeHasMany` can be used to customize how `DS.hasMany`
+ properties are serialized.
+ Example
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ serializeHasMany: function(snapshot, json, relationship) {
+ var key = relationship.key;
+ if (key === 'comments') {
+ return;
+ } else {
+ this._super.apply(this, arguments);
+ }
+ }
+ });
+ ```
+ @method serializeHasMany
+ @param {DS.Snapshot} snapshot
+ @param {Object} json
+ @param {Object} relationship
+ */
+ serializeHasMany: function serializeHasMany(snapshot, json, relationship) {
+ var key = relationship.key;
+ var shouldSerializeHasMany = '_shouldSerializeHasMany';
+ if (false) {
+ shouldSerializeHasMany = 'shouldSerializeHasMany';
+ }
+
+ if (this[shouldSerializeHasMany](snapshot, key, relationship)) {
+ var hasMany = snapshot.hasMany(key, { ids: true });
+ if (hasMany !== undefined) {
+ // if provided, use the mapping provided by `attrs` in
+ // the serializer
+ var payloadKey = this._getMappedKey(key, snapshot.type);
+ if (payloadKey === key && this.keyForRelationship) {
+ payloadKey = this.keyForRelationship(key, "hasMany", "serialize");
+ }
+
+ json[payloadKey] = hasMany;
+ // TODO support for polymorphic manyToNone and manyToMany relationships
+ }
+ }
+ },
+
+ /**
+ You can use this method to customize how polymorphic objects are
+ serialized. Objects are considered to be polymorphic if
+ `{ polymorphic: true }` is pass as the second argument to the
+ `DS.belongsTo` function.
+ Example
+ ```app/serializers/comment.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ serializePolymorphicType: function(snapshot, json, relationship) {
+ var key = relationship.key,
+ belongsTo = snapshot.belongsTo(key);
+ key = this.keyForAttribute ? this.keyForAttribute(key, "serialize") : key;
+ if (Ember.isNone(belongsTo)) {
+ json[key + "_type"] = null;
+ } else {
+ json[key + "_type"] = belongsTo.modelName;
+ }
+ }
+ });
+ ```
+ @method serializePolymorphicType
+ @param {DS.Snapshot} snapshot
+ @param {Object} json
+ @param {Object} relationship
+ */
+ serializePolymorphicType: _ember['default'].K,
+
+ /**
+ `extractMeta` is used to deserialize any meta information in the
+ adapter payload. By default Ember Data expects meta information to
+ be located on the `meta` property of the payload object.
+ Example
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ extractMeta: function(store, typeClass, payload) {
+ if (payload && payload.hasOwnProperty('_pagination')) {
+ let meta = payload._pagination;
+ delete payload._pagination;
+ return meta;
+ }
+ }
+ });
+ ```
+ @method extractMeta
+ @param {DS.Store} store
+ @param {DS.Model} modelClass
+ @param {Object} payload
+ */
+ extractMeta: function extractMeta(store, modelClass, payload) {
+ if (payload && payload['meta'] !== undefined) {
+ var meta = payload.meta;
+ delete payload.meta;
+ return meta;
+ }
+ },
+
+ /**
+ `extractErrors` is used to extract model errors when a call
+ to `DS.Model#save` fails with an `InvalidError`. By default
+ Ember Data expects error information to be located on the `errors`
+ property of the payload object.
+ This serializer expects this `errors` object to be an Array similar
+ to the following, compliant with the JSON-API specification:
+ ```js
+ {
+ "errors": [
+ {
+ "detail": "This username is already taken!",
+ "source": {
+ "pointer": "data/attributes/username"
+ }
+ }, {
+ "detail": "Doesn't look like a valid email.",
+ "source": {
+ "pointer": "data/attributes/email"
+ }
+ }
+ ]
+ }
+ ```
+ The key `detail` provides a textual description of the problem.
+ Alternatively, the key `title` can be used for the same purpose.
+ The nested keys `source.pointer` detail which specific element
+ of the request data was invalid.
+ Note that JSON-API also allows for object-level errors to be placed
+ in an object with pointer `data`, signifying that the problem
+ cannot be traced to a specific attribute:
+ ```javascript
+ {
+ "errors": [
+ {
+ "detail": "Some generic non property error message",
+ "source": {
+ "pointer": "data"
+ }
+ }
+ ]
+ }
+ ```
+ When turn into a `DS.Errors` object, you can read these errors
+ through the property `base`:
+ ```handlebars
+ {{#each model.errors.base as |error|}}
+
+ {{error.message}}
+
+ {{/each}}
+ ```
+ Example of alternative implementation, overriding the default
+ behavior to deal with a different format of errors:
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ extractErrors: function(store, typeClass, payload, id) {
+ if (payload && typeof payload === 'object' && payload._problems) {
+ payload = payload._problems;
+ this.normalizeErrors(typeClass, payload);
+ }
+ return payload;
+ }
+ });
+ ```
+ @method extractErrors
+ @param {DS.Store} store
+ @param {DS.Model} typeClass
+ @param {Object} payload
+ @param {(String|Number)} id
+ @return {Object} json The deserialized errors
+ */
+ extractErrors: function extractErrors(store, typeClass, payload, id) {
+ var _this7 = this;
+
+ if (payload && typeof payload === 'object' && payload.errors) {
+ payload = (0, _emberDataAdaptersErrors.errorsArrayToHash)(payload.errors);
+
+ this.normalizeUsingDeclaredMapping(typeClass, payload);
+
+ typeClass.eachAttribute(function (name) {
+ var key = _this7.keyForAttribute(name, 'deserialize');
+ if (key !== name && payload[key] !== undefined) {
+ payload[name] = payload[key];
+ delete payload[key];
+ }
+ });
+
+ typeClass.eachRelationship(function (name) {
+ var key = _this7.keyForRelationship(name, 'deserialize');
+ if (key !== name && payload[key] !== undefined) {
+ payload[name] = payload[key];
+ delete payload[key];
+ }
+ });
+ }
+
+ return payload;
+ },
+
+ /**
+ `keyForAttribute` can be used to define rules for how to convert an
+ attribute name in your model to a key in your JSON.
+ Example
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend({
+ keyForAttribute: function(attr, method) {
+ return Ember.String.underscore(attr).toUpperCase();
+ }
+ });
+ ```
+ @method keyForAttribute
+ @param {String} key
+ @param {String} method
+ @return {String} normalized key
+ */
+ keyForAttribute: function keyForAttribute(key, method) {
+ return key;
+ },
+
+ /**
+ `keyForRelationship` can be used to define a custom key when
+ serializing and deserializing relationship properties. By default
+ `JSONSerializer` does not provide an implementation of this method.
+ Example
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ keyForRelationship: function(key, relationship, method) {
+ return 'rel_' + Ember.String.underscore(key);
+ }
+ });
+ ```
+ @method keyForRelationship
+ @param {String} key
+ @param {String} typeClass
+ @param {String} method
+ @return {String} normalized key
+ */
+ keyForRelationship: function keyForRelationship(key, typeClass, method) {
+ return key;
+ },
+
+ /**
+ `keyForLink` can be used to define a custom key when deserializing link
+ properties.
+ @method keyForLink
+ @param {String} key
+ @param {String} kind `belongsTo` or `hasMany`
+ @return {String} normalized key
+ */
+ keyForLink: function keyForLink(key, kind) {
+ return key;
+ },
+
+ // HELPERS
+
+ /**
+ @method transformFor
+ @private
+ @param {String} attributeType
+ @param {Boolean} skipAssertion
+ @return {DS.Transform} transform
+ */
+ transformFor: function transformFor(attributeType, skipAssertion) {
+ var transform = (0, _emberDataPrivateUtils.getOwner)(this).lookup('transform:' + attributeType);
+
+ (0, _emberDataPrivateDebug.assert)("Unable to find transform for '" + attributeType + "'", skipAssertion || !!transform);
+
+ return transform;
+ }
+ });
+
+ if (false) {
+
+ JSONSerializer.reopen({
+
+ /**
+ @method modelNameFromPayloadType
+ @public
+ @param {String} type
+ @return {String} the model's modelName
+ */
+ modelNameFromPayloadType: function modelNameFromPayloadType(type) {
+ return (0, _emberDataPrivateSystemNormalizeModelName['default'])(type);
+ },
+
+ _hasCustomModelNameFromPayloadKey: function _hasCustomModelNameFromPayloadKey() {
+ return this.modelNameFromPayloadKey !== JSONSerializer.prototype.modelNameFromPayloadKey;
+ }
+
+ });
+ }
+
+ exports['default'] = JSONSerializer;
+});
+define("ember-data/serializers/rest", ["exports", "ember", "ember-data/-private/debug", "ember-data/serializers/json", "ember-data/-private/system/normalize-model-name", "ember-inflector", "ember-data/-private/system/coerce-id", "ember-data/-private/utils", "ember-data/-private/features"], function (exports, _ember, _emberDataPrivateDebug, _emberDataSerializersJson, _emberDataPrivateSystemNormalizeModelName, _emberInflector, _emberDataPrivateSystemCoerceId, _emberDataPrivateUtils, _emberDataPrivateFeatures) {
+ "use strict";
+
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];return arr2;
+ } else {
+ return Array.from(arr);
+ }
+ }
+
+ /**
+ @module ember-data
+ */
+
+ var camelize = _ember["default"].String.camelize;
+
+ /**
+ Normally, applications will use the `RESTSerializer` by implementing
+ the `normalize` method.
+
+ This allows you to do whatever kind of munging you need, and is
+ especially useful if your server is inconsistent and you need to
+ do munging differently for many different kinds of responses.
+
+ See the `normalize` documentation for more information.
+
+ ## Across the Board Normalization
+
+ There are also a number of hooks that you might find useful to define
+ across-the-board rules for your payload. These rules will be useful
+ if your server is consistent, or if you're building an adapter for
+ an infrastructure service, like Firebase, and want to encode service
+ conventions.
+
+ For example, if all of your keys are underscored and all-caps, but
+ otherwise consistent with the names you use in your models, you
+ can implement across-the-board rules for how to convert an attribute
+ name in your model to a key in your JSON.
+
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+
+ export default DS.RESTSerializer.extend({
+ keyForAttribute: function(attr, method) {
+ return Ember.String.underscore(attr).toUpperCase();
+ }
+ });
+ ```
+
+ You can also implement `keyForRelationship`, which takes the name
+ of the relationship as the first parameter, the kind of
+ relationship (`hasMany` or `belongsTo`) as the second parameter, and
+ the method (`serialize` or `deserialize`) as the third parameter.
+
+ @class RESTSerializer
+ @namespace DS
+ @extends DS.JSONSerializer
+ */
+ var RESTSerializer = _emberDataSerializersJson["default"].extend({
+
+ /**
+ `keyForPolymorphicType` can be used to define a custom key when
+ serializing and deserializing a polymorphic type. By default, the
+ returned key is `${key}Type`.
+ Example
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend({
+ keyForPolymorphicType: function(key, relationship) {
+ var relationshipKey = this.keyForRelationship(key);
+ return 'type-' + relationshipKey;
+ }
+ });
+ ```
+ @method keyForPolymorphicType
+ @param {String} key
+ @param {String} typeClass
+ @param {String} method
+ @return {String} normalized key
+ */
+ keyForPolymorphicType: function keyForPolymorphicType(key, typeClass, method) {
+ var relationshipKey = this.keyForRelationship(key);
+
+ return relationshipKey + "Type";
+ },
+
+ /**
+ Normalizes a part of the JSON payload returned by
+ the server. You should override this method, munge the hash
+ and call super if you have generic normalization to do.
+ It takes the type of the record that is being normalized
+ (as a DS.Model class), the property where the hash was
+ originally found, and the hash to normalize.
+ For example, if you have a payload that looks like this:
+ ```js
+ {
+ "post": {
+ "id": 1,
+ "title": "Rails is omakase",
+ "comments": [ 1, 2 ]
+ },
+ "comments": [{
+ "id": 1,
+ "body": "FIRST"
+ }, {
+ "id": 2,
+ "body": "Rails is unagi"
+ }]
+ }
+ ```
+ The `normalize` method will be called three times:
+ * With `App.Post`, `"posts"` and `{ id: 1, title: "Rails is omakase", ... }`
+ * With `App.Comment`, `"comments"` and `{ id: 1, body: "FIRST" }`
+ * With `App.Comment`, `"comments"` and `{ id: 2, body: "Rails is unagi" }`
+ You can use this method, for example, to normalize underscored keys to camelized
+ or other general-purpose normalizations. You will only need to implement
+ `normalize` and manipulate the payload as desired.
+ For example, if the `IDs` under `"comments"` are provided as `_id` instead of
+ `id`, you can specify how to normalize just the comments:
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend({
+ normalize(model, hash, prop) {
+ if (prop === 'comments') {
+ hash.id = hash._id;
+ delete hash._id;
+ }
+ return this._super(...arguments);
+ }
+ });
+ ```
+ On each call to the `normalize` method, the third parameter (`prop`) is always
+ one of the keys that were in the original payload or in the result of another
+ normalization as `normalizeResponse`.
+ @method normalize
+ @param {DS.Model} modelClass
+ @param {Object} resourceHash
+ @param {String} prop
+ @return {Object}
+ */
+ normalize: function normalize(modelClass, resourceHash, prop) {
+ if (this.normalizeHash && this.normalizeHash[prop]) {
+ (0, _emberDataPrivateDebug.deprecate)('`RESTSerializer.normalizeHash` has been deprecated. Please use `serializer.normalize` to modify the payload of single resources.', false, {
+ id: 'ds.serializer.normalize-hash-deprecated',
+ until: '3.0.0'
+ });
+ this.normalizeHash[prop](resourceHash);
+ }
+ return this._super(modelClass, resourceHash);
+ },
+
+ /**
+ Normalizes an array of resource payloads and returns a JSON-API Document
+ with primary data and, if any, included data as `{ data, included }`.
+ @method _normalizeArray
+ @param {DS.Store} store
+ @param {String} modelName
+ @param {Object} arrayHash
+ @param {String} prop
+ @return {Object}
+ @private
+ */
+ _normalizeArray: function _normalizeArray(store, modelName, arrayHash, prop) {
+ var _this = this;
+
+ var documentHash = {
+ data: [],
+ included: []
+ };
+
+ var modelClass = store.modelFor(modelName);
+ var serializer = store.serializerFor(modelName);
+
+ _ember["default"].makeArray(arrayHash).forEach(function (hash) {
+ var _normalizePolymorphicRecord2 = _this._normalizePolymorphicRecord(store, hash, prop, modelClass, serializer);
+
+ var data = _normalizePolymorphicRecord2.data;
+ var included = _normalizePolymorphicRecord2.included;
+
+ documentHash.data.push(data);
+ if (included) {
+ var _documentHash$included;
+
+ (_documentHash$included = documentHash.included).push.apply(_documentHash$included, _toConsumableArray(included));
+ }
+ });
+
+ return documentHash;
+ },
+
+ _normalizePolymorphicRecord: function _normalizePolymorphicRecord(store, hash, prop, primaryModelClass, primarySerializer) {
+ var serializer = primarySerializer;
+ var modelClass = primaryModelClass;
+
+ var primaryHasTypeAttribute = (0, _emberDataPrivateUtils.modelHasAttributeOrRelationshipNamedType)(primaryModelClass);
+
+ if (!primaryHasTypeAttribute && hash.type) {
+ // Support polymorphic records in async relationships
+ var modelName = undefined;
+ if (false) {
+ modelName = this.modelNameFromPayloadType(hash.type);
+ var deprecatedModelNameLookup = this.modelNameFromPayloadKey(hash.type);
+
+ if (modelName !== deprecatedModelNameLookup && !this._hasCustomModelNameFromPayloadType() && this._hasCustomModelNameFromPayloadKey()) {
+ (0, _emberDataPrivateDebug.deprecate)("You are using modelNameFromPayloadKey to normalize the type for a polymorphic relationship. This is has been deprecated in favor of modelNameFromPayloadType", false, {
+ id: 'ds.rest-serializer.deprecated-model-name-for-polymorphic-type',
+ until: '3.0.0'
+ });
+
+ modelName = deprecatedModelNameLookup;
+ }
+ } else {
+ modelName = this.modelNameFromPayloadKey(hash.type);
+ }
+
+ if (store._hasModelFor(modelName)) {
+ serializer = store.serializerFor(modelName);
+ modelClass = store.modelFor(modelName);
+ }
+ }
+
+ return serializer.normalize(modelClass, hash, prop);
+ },
+
+ /*
+ @method _normalizeResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @param {Boolean} isSingle
+ @return {Object} JSON-API Document
+ @private
+ */
+ _normalizeResponse: function _normalizeResponse(store, primaryModelClass, payload, id, requestType, isSingle) {
+ var documentHash = {
+ data: null,
+ included: []
+ };
+
+ var meta = this.extractMeta(store, primaryModelClass, payload);
+ if (meta) {
+ (0, _emberDataPrivateDebug.assert)('The `meta` returned from `extractMeta` has to be an object, not "' + _ember["default"].typeOf(meta) + '".', _ember["default"].typeOf(meta) === 'object');
+ documentHash.meta = meta;
+ }
+
+ var keys = Object.keys(payload);
+
+ for (var i = 0, _length = keys.length; i < _length; i++) {
+ var prop = keys[i];
+ var modelName = prop;
+ var forcedSecondary = false;
+
+ /*
+ If you want to provide sideloaded records of the same type that the
+ primary data you can do that by prefixing the key with `_`.
+ Example
+ ```
+ {
+ users: [
+ { id: 1, title: 'Tom', manager: 3 },
+ { id: 2, title: 'Yehuda', manager: 3 }
+ ],
+ _users: [
+ { id: 3, title: 'Tomster' }
+ ]
+ }
+ ```
+ This forces `_users` to be added to `included` instead of `data`.
+ */
+ if (prop.charAt(0) === '_') {
+ forcedSecondary = true;
+ modelName = prop.substr(1);
+ }
+
+ var typeName = this.modelNameFromPayloadKey(modelName);
+ if (!store.modelFactoryFor(typeName)) {
+ (0, _emberDataPrivateDebug.warn)(this.warnMessageNoModelForKey(modelName, typeName), false, {
+ id: 'ds.serializer.model-for-key-missing'
+ });
+ continue;
+ }
+
+ var isPrimary = !forcedSecondary && this.isPrimaryType(store, typeName, primaryModelClass);
+ var value = payload[prop];
+
+ if (value === null) {
+ continue;
+ }
+
+ (0, _emberDataPrivateDebug.runInDebug)(function () {
+ var isQueryRecordAnArray = requestType === 'queryRecord' && isPrimary && Array.isArray(value);
+ var message = "The adapter returned an array for the primary data of a `queryRecord` response. This is deprecated as `queryRecord` should return a single record.";
+
+ (0, _emberDataPrivateDebug.deprecate)(message, !isQueryRecordAnArray, {
+ id: 'ds.serializer.rest.queryRecord-array-response',
+ until: '3.0'
+ });
+ });
+
+ /*
+ Support primary data as an object instead of an array.
+ Example
+ ```
+ {
+ user: { id: 1, title: 'Tom', manager: 3 }
+ }
+ ```
+ */
+ if (isPrimary && _ember["default"].typeOf(value) !== 'array') {
+ var _normalizePolymorphicRecord3 = this._normalizePolymorphicRecord(store, value, prop, primaryModelClass, this);
+
+ var _data = _normalizePolymorphicRecord3.data;
+ var _included = _normalizePolymorphicRecord3.included;
+
+ documentHash.data = _data;
+ if (_included) {
+ var _documentHash$included2;
+
+ (_documentHash$included2 = documentHash.included).push.apply(_documentHash$included2, _toConsumableArray(_included));
+ }
+ continue;
+ }
+
+ var _normalizeArray2 = this._normalizeArray(store, typeName, value, prop);
+
+ var data = _normalizeArray2.data;
+ var included = _normalizeArray2.included;
+
+ if (included) {
+ var _documentHash$included3;
+
+ (_documentHash$included3 = documentHash.included).push.apply(_documentHash$included3, _toConsumableArray(included));
+ }
+
+ if (isSingle) {
+ data.forEach(function (resource) {
+
+ /*
+ Figures out if this is the primary record or not.
+ It's either:
+ 1. The record with the same ID as the original request
+ 2. If it's a newly created record without an ID, the first record
+ in the array
+ */
+ var isUpdatedRecord = isPrimary && (0, _emberDataPrivateSystemCoerceId["default"])(resource.id) === id;
+ var isFirstCreatedRecord = isPrimary && !id && !documentHash.data;
+
+ if (isFirstCreatedRecord || isUpdatedRecord) {
+ documentHash.data = resource;
+ } else {
+ documentHash.included.push(resource);
+ }
+ });
+ } else {
+ if (isPrimary) {
+ documentHash.data = data;
+ } else {
+ if (data) {
+ var _documentHash$included4;
+
+ (_documentHash$included4 = documentHash.included).push.apply(_documentHash$included4, _toConsumableArray(data));
+ }
+ }
+ }
+ }
+
+ return documentHash;
+ },
+
+ isPrimaryType: function isPrimaryType(store, typeName, primaryTypeClass) {
+ var typeClass = store.modelFor(typeName);
+ return typeClass.modelName === primaryTypeClass.modelName;
+ },
+
+ /**
+ This method allows you to push a payload containing top-level
+ collections of records organized per type.
+ ```js
+ {
+ "posts": [{
+ "id": "1",
+ "title": "Rails is omakase",
+ "author", "1",
+ "comments": [ "1" ]
+ }],
+ "comments": [{
+ "id": "1",
+ "body": "FIRST"
+ }],
+ "users": [{
+ "id": "1",
+ "name": "@d2h"
+ }]
+ }
+ ```
+ It will first normalize the payload, so you can use this to push
+ in data streaming in from your server structured the same way
+ that fetches and saves are structured.
+ @method pushPayload
+ @param {DS.Store} store
+ @param {Object} payload
+ */
+ pushPayload: function pushPayload(store, payload) {
+ var documentHash = {
+ data: [],
+ included: []
+ };
+
+ for (var prop in payload) {
+ var modelName = this.modelNameFromPayloadKey(prop);
+ if (!store.modelFactoryFor(modelName)) {
+ (0, _emberDataPrivateDebug.warn)(this.warnMessageNoModelForKey(prop, modelName), false, {
+ id: 'ds.serializer.model-for-key-missing'
+ });
+ continue;
+ }
+ var type = store.modelFor(modelName);
+ var typeSerializer = store.serializerFor(type.modelName);
+
+ _ember["default"].makeArray(payload[prop]).forEach(function (hash) {
+ var _typeSerializer$normalize = typeSerializer.normalize(type, hash, prop);
+
+ var data = _typeSerializer$normalize.data;
+ var included = _typeSerializer$normalize.included;
+
+ documentHash.data.push(data);
+ if (included) {
+ var _documentHash$included5;
+
+ (_documentHash$included5 = documentHash.included).push.apply(_documentHash$included5, _toConsumableArray(included));
+ }
+ });
+ }
+
+ if (false) {
+ return store.push(documentHash);
+ } else {
+ store.push(documentHash);
+ }
+ },
+
+ /**
+ This method is used to convert each JSON root key in the payload
+ into a modelName that it can use to look up the appropriate model for
+ that part of the payload.
+ For example, your server may send a model name that does not correspond with
+ the name of the model in your app. Let's take a look at an example model,
+ and an example payload:
+ ```app/models/post.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ });
+ ```
+ ```javascript
+ {
+ "blog/post": {
+ "id": "1
+ }
+ }
+ ```
+ Ember Data is going to normalize the payload's root key for the modelName. As a result,
+ it will try to look up the "blog/post" model. Since we don't have a model called "blog/post"
+ (or a file called app/models/blog/post.js in ember-cli), Ember Data will throw an error
+ because it cannot find the "blog/post" model.
+ Since we want to remove this namespace, we can define a serializer for the application that will
+ remove "blog/" from the payload key whenver it's encountered by Ember Data:
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend({
+ modelNameFromPayloadKey: function(payloadKey) {
+ if (payloadKey === 'blog/post') {
+ return this._super(payloadKey.replace('blog/', ''));
+ } else {
+ return this._super(payloadKey);
+ }
+ }
+ });
+ ```
+ After refreshing, Ember Data will appropriately look up the "post" model.
+ By default the modelName for a model is its
+ name in dasherized form. This means that a payload key like "blogPost" would be
+ normalized to "blog-post" when Ember Data looks up the model. Usually, Ember Data
+ can use the correct inflection to do this for you. Most of the time, you won't
+ need to override `modelNameFromPayloadKey` for this purpose.
+ @method modelNameFromPayloadKey
+ @param {String} key
+ @return {String} the model's modelName
+ */
+ modelNameFromPayloadKey: function modelNameFromPayloadKey(key) {
+ return (0, _emberInflector.singularize)((0, _emberDataPrivateSystemNormalizeModelName["default"])(key));
+ },
+
+ // SERIALIZE
+
+ /**
+ Called when a record is saved in order to convert the
+ record into JSON.
+ By default, it creates a JSON object with a key for
+ each attribute and belongsTo relationship.
+ For example, consider this model:
+ ```app/models/comment.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ title: DS.attr(),
+ body: DS.attr(),
+ author: DS.belongsTo('user')
+ });
+ ```
+ The default serialization would create a JSON object like:
+ ```js
+ {
+ "title": "Rails is unagi",
+ "body": "Rails? Omakase? O_O",
+ "author": 12
+ }
+ ```
+ By default, attributes are passed through as-is, unless
+ you specified an attribute type (`DS.attr('date')`). If
+ you specify a transform, the JavaScript value will be
+ serialized when inserted into the JSON hash.
+ By default, belongs-to relationships are converted into
+ IDs when inserted into the JSON hash.
+ ## IDs
+ `serialize` takes an options hash with a single option:
+ `includeId`. If this option is `true`, `serialize` will,
+ by default include the ID in the JSON object it builds.
+ The adapter passes in `includeId: true` when serializing
+ a record for `createRecord`, but not for `updateRecord`.
+ ## Customization
+ Your server may expect a different JSON format than the
+ built-in serialization format.
+ In that case, you can implement `serialize` yourself and
+ return a JSON hash of your choosing.
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend({
+ serialize: function(snapshot, options) {
+ var json = {
+ POST_TTL: snapshot.attr('title'),
+ POST_BDY: snapshot.attr('body'),
+ POST_CMS: snapshot.hasMany('comments', { ids: true })
+ }
+ if (options.includeId) {
+ json.POST_ID_ = snapshot.id;
+ }
+ return json;
+ }
+ });
+ ```
+ ## Customizing an App-Wide Serializer
+ If you want to define a serializer for your entire
+ application, you'll probably want to use `eachAttribute`
+ and `eachRelationship` on the record.
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend({
+ serialize: function(snapshot, options) {
+ var json = {};
+ snapshot.eachAttribute(function(name) {
+ json[serverAttributeName(name)] = snapshot.attr(name);
+ })
+ snapshot.eachRelationship(function(name, relationship) {
+ if (relationship.kind === 'hasMany') {
+ json[serverHasManyName(name)] = snapshot.hasMany(name, { ids: true });
+ }
+ });
+ if (options.includeId) {
+ json.ID_ = snapshot.id;
+ }
+ return json;
+ }
+ });
+ function serverAttributeName(attribute) {
+ return attribute.underscore().toUpperCase();
+ }
+ function serverHasManyName(name) {
+ return serverAttributeName(name.singularize()) + "_IDS";
+ }
+ ```
+ This serializer will generate JSON that looks like this:
+ ```js
+ {
+ "TITLE": "Rails is omakase",
+ "BODY": "Yep. Omakase.",
+ "COMMENT_IDS": [ 1, 2, 3 ]
+ }
+ ```
+ ## Tweaking the Default JSON
+ If you just want to do some small tweaks on the default JSON,
+ you can call super first and make the tweaks on the returned
+ JSON.
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend({
+ serialize: function(snapshot, options) {
+ var json = this._super(snapshot, options);
+ json.subject = json.title;
+ delete json.title;
+ return json;
+ }
+ });
+ ```
+ @method serialize
+ @param {DS.Snapshot} snapshot
+ @param {Object} options
+ @return {Object} json
+ */
+ serialize: function serialize(snapshot, options) {
+ return this._super.apply(this, arguments);
+ },
+
+ /**
+ You can use this method to customize the root keys serialized into the JSON.
+ The hash property should be modified by reference (possibly using something like _.extend)
+ By default the REST Serializer sends the modelName of a model, which is a camelized
+ version of the name.
+ For example, your server may expect underscored root objects.
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend({
+ serializeIntoHash: function(data, type, record, options) {
+ var root = Ember.String.decamelize(type.modelName);
+ data[root] = this.serialize(record, options);
+ }
+ });
+ ```
+ @method serializeIntoHash
+ @param {Object} hash
+ @param {DS.Model} typeClass
+ @param {DS.Snapshot} snapshot
+ @param {Object} options
+ */
+ serializeIntoHash: function serializeIntoHash(hash, typeClass, snapshot, options) {
+ var normalizedRootKey = this.payloadKeyFromModelName(typeClass.modelName);
+ hash[normalizedRootKey] = this.serialize(snapshot, options);
+ },
+
+ /**
+ You can use `payloadKeyFromModelName` to override the root key for an outgoing
+ request. By default, the RESTSerializer returns a camelized version of the
+ model's name.
+ For a model called TacoParty, its `modelName` would be the string `taco-party`. The RESTSerializer
+ will send it to the server with `tacoParty` as the root key in the JSON payload:
+ ```js
+ {
+ "tacoParty": {
+ "id": "1",
+ "location": "Matthew Beale's House"
+ }
+ }
+ ```
+ For example, your server may expect dasherized root objects:
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend({
+ payloadKeyFromModelName: function(modelName) {
+ return Ember.String.dasherize(modelName);
+ }
+ });
+ ```
+ Given a `TacoParty` model, calling `save` on it would produce an outgoing
+ request like:
+ ```js
+ {
+ "taco-party": {
+ "id": "1",
+ "location": "Matthew Beale's House"
+ }
+ }
+ ```
+ @method payloadKeyFromModelName
+ @param {String} modelName
+ @return {String}
+ */
+ payloadKeyFromModelName: function payloadKeyFromModelName(modelName) {
+ return camelize(modelName);
+ },
+
+ /**
+ You can use this method to customize how polymorphic objects are serialized.
+ By default the REST Serializer creates the key by appending `Type` to
+ the attribute and value from the model's camelcased model name.
+ @method serializePolymorphicType
+ @param {DS.Snapshot} snapshot
+ @param {Object} json
+ @param {Object} relationship
+ */
+ serializePolymorphicType: function serializePolymorphicType(snapshot, json, relationship) {
+ var key = relationship.key;
+ var belongsTo = snapshot.belongsTo(key);
+ var typeKey = this.keyForPolymorphicType(key, relationship.type, 'serialize');
+
+ // old way of getting the key for the polymorphic type
+ key = this.keyForAttribute ? this.keyForAttribute(key, "serialize") : key;
+ key = key + "Type";
+
+ // The old way of serializing the type of a polymorphic record used
+ // `keyForAttribute`, which is not correct. The next code checks if the old
+ // way is used and if it differs from the new way of using
+ // `keyForPolymorphicType`. If this is the case, a deprecation warning is
+ // logged and the old way is restored (so nothing breaks).
+ if (key !== typeKey && this.keyForPolymorphicType === RESTSerializer.prototype.keyForPolymorphicType) {
+ (0, _emberDataPrivateDebug.deprecate)("The key to serialize the type of a polymorphic record is created via keyForAttribute which has been deprecated. Use the keyForPolymorphicType hook instead.", false, {
+ id: 'ds.rest-serializer.deprecated-key-for-polymorphic-type',
+ until: '3.0.0'
+ });
+
+ typeKey = key;
+ }
+
+ if (_ember["default"].isNone(belongsTo)) {
+ json[typeKey] = null;
+ } else {
+ if (false) {
+ json[typeKey] = this.payloadTypeFromModelName(belongsTo.modelName);
+ } else {
+ json[typeKey] = camelize(belongsTo.modelName);
+ }
+ }
+ },
+
+ /**
+ You can use this method to customize how a polymorphic relationship should
+ be extracted.
+ @method extractPolymorphicRelationship
+ @param {Object} relationshipType
+ @param {Object} relationshipHash
+ @param {Object} relationshipOptions
+ @return {Object}
+ */
+ extractPolymorphicRelationship: function extractPolymorphicRelationship(relationshipType, relationshipHash, relationshipOptions) {
+ var key = relationshipOptions.key;
+ var resourceHash = relationshipOptions.resourceHash;
+ var relationshipMeta = relationshipOptions.relationshipMeta;
+
+ // A polymorphic belongsTo relationship can be present in the payload
+ // either in the form where the `id` and the `type` are given:
+ //
+ // {
+ // message: { id: 1, type: 'post' }
+ // }
+ //
+ // or by the `id` and a `Type` attribute:
+ //
+ // {
+ // message: 1,
+ // messageType: 'post'
+ // }
+ //
+ // The next code checks if the latter case is present and returns the
+ // corresponding JSON-API representation. The former case is handled within
+ // the base class JSONSerializer.
+ var isPolymorphic = relationshipMeta.options.polymorphic;
+ var typeProperty = this.keyForPolymorphicType(key, relationshipType, 'deserialize');
+
+ if (isPolymorphic && resourceHash[typeProperty] !== undefined && typeof relationshipHash !== 'object') {
+
+ if (false) {
+
+ var payloadType = resourceHash[typeProperty];
+ var type = this.modelNameFromPayloadType(payloadType);
+ var deprecatedTypeLookup = this.modelNameFromPayloadKey(payloadType);
+
+ if (payloadType !== deprecatedTypeLookup && !this._hasCustomModelNameFromPayloadType() && this._hasCustomModelNameFromPayloadKey()) {
+ (0, _emberDataPrivateDebug.deprecate)("You are using modelNameFromPayloadKey to normalize the type for a polymorphic relationship. This has been deprecated in favor of modelNameFromPayloadType", false, {
+ id: 'ds.rest-serializer.deprecated-model-name-for-polymorphic-type',
+ until: '3.0.0'
+ });
+
+ type = deprecatedTypeLookup;
+ }
+
+ return {
+ id: relationshipHash,
+ type: type
+ };
+ } else {
+
+ var type = this.modelNameFromPayloadKey(resourceHash[typeProperty]);
+ return {
+ id: relationshipHash,
+ type: type
+ };
+ }
+ }
+
+ return this._super.apply(this, arguments);
+ }
+ });
+
+ if (false) {
+
+ RESTSerializer.reopen({
+
+ /**
+ `modelNameFromPayloadType` can be used to change the mapping for a DS model
+ name, taken from the value in the payload.
+ Say your API namespaces the type of a model and returns the following
+ payload for the `post` model, which has a polymorphic `user` relationship:
+ ```javascript
+ // GET /api/posts/1
+ {
+ "post": {
+ "id": 1,
+ "user": 1,
+ "userType: "api::v1::administrator"
+ }
+ }
+ ```
+ By overwriting `modelNameFromPayloadType` you can specify that the
+ `administrator` model should be used:
+ ```app/serializers/application.js
+ import DS from "ember-data";
+ export default DS.RESTSerializer.extend({
+ modelNameFromPayloadType(payloadType) {
+ return payloadType.replace('api::v1::', '');
+ }
+ });
+ ```
+ By default the modelName for a model is its name in dasherized form.
+ Usually, Ember Data can use the correct inflection to do this for you. Most
+ of the time, you won't need to override `modelNameFromPayloadType` for this
+ purpose.
+ Also take a look at
+ [payloadTypeFromModelName](#method_payloadTypeFromModelName) to customize
+ how the type of a record should be serialized.
+ @method modelNameFromPayloadType
+ @public
+ @param {String} payloadType type from payload
+ @return {String} modelName
+ */
+ modelNameFromPayloadType: function modelNameFromPayloadType(payloadType) {
+ return (0, _emberInflector.singularize)((0, _emberDataPrivateSystemNormalizeModelName["default"])(payloadType));
+ },
+
+ /**
+ `payloadTypeFromModelName` can be used to change the mapping for the type in
+ the payload, taken from the model name.
+ Say your API namespaces the type of a model and expects the following
+ payload when you update the `post` model, which has a polymorphic `user`
+ relationship:
+ ```javascript
+ // POST /api/posts/1
+ {
+ "post": {
+ "id": 1,
+ "user": 1,
+ "userType": "api::v1::administrator"
+ }
+ }
+ ```
+ By overwriting `payloadTypeFromModelName` you can specify that the
+ namespaces model name for the `administrator` should be used:
+ ```app/serializers/application.js
+ import DS from "ember-data";
+ export default DS.RESTSerializer.extend({
+ payloadTypeFromModelName(modelName) {
+ return "api::v1::" + modelName;
+ }
+ });
+ ```
+ By default the payload type is the camelized model name. Usually, Ember
+ Data can use the correct inflection to do this for you. Most of the time,
+ you won't need to override `payloadTypeFromModelName` for this purpose.
+ Also take a look at
+ [modelNameFromPayloadType](#method_modelNameFromPayloadType) to customize
+ how the model name from should be mapped from the payload.
+ @method payloadTypeFromModelName
+ @public
+ @param {String} modelname modelName from the record
+ @return {String} payloadType
+ */
+ payloadTypeFromModelName: function payloadTypeFromModelName(modelName) {
+ return camelize(modelName);
+ },
+
+ _hasCustomModelNameFromPayloadKey: function _hasCustomModelNameFromPayloadKey() {
+ return this.modelNameFromPayloadKey !== RESTSerializer.prototype.modelNameFromPayloadKey;
+ },
+
+ _hasCustomModelNameFromPayloadType: function _hasCustomModelNameFromPayloadType() {
+ return this.modelNameFromPayloadType !== RESTSerializer.prototype.modelNameFromPayloadType;
+ },
+
+ _hasCustomPayloadTypeFromModelName: function _hasCustomPayloadTypeFromModelName() {
+ return this.payloadTypeFromModelName !== RESTSerializer.prototype.payloadTypeFromModelName;
+ },
+
+ _hasCustomPayloadKeyFromModelName: function _hasCustomPayloadKeyFromModelName() {
+ return this.payloadKeyFromModelName !== RESTSerializer.prototype.payloadKeyFromModelName;
+ }
+
+ });
+ }
+
+ (0, _emberDataPrivateDebug.runInDebug)(function () {
+ RESTSerializer.reopen({
+ warnMessageNoModelForKey: function warnMessageNoModelForKey(prop, typeKey) {
+ return 'Encountered "' + prop + '" in payload, but no model was found for model name "' + typeKey + '" (resolved model name using ' + this.constructor.toString() + '.modelNameFromPayloadKey("' + prop + '"))';
+ }
+ });
+ });
+
+ exports["default"] = RESTSerializer;
+});
+define('ember-data/setup-container', ['exports', 'ember-data/-private/initializers/store', 'ember-data/-private/initializers/transforms', 'ember-data/-private/initializers/store-injections', 'ember-data/-private/initializers/data-adapter'], function (exports, _emberDataPrivateInitializersStore, _emberDataPrivateInitializersTransforms, _emberDataPrivateInitializersStoreInjections, _emberDataPrivateInitializersDataAdapter) {
+ 'use strict';
+
+ exports['default'] = setupContainer;
+
+ function setupContainer(application) {
+ (0, _emberDataPrivateInitializersDataAdapter['default'])(application);
+ (0, _emberDataPrivateInitializersTransforms['default'])(application);
+ (0, _emberDataPrivateInitializersStoreInjections['default'])(application);
+ (0, _emberDataPrivateInitializersStore['default'])(application);
+ }
+});
+define("ember-data/store", ["exports", "ember-data/-private/system/store"], function (exports, _emberDataPrivateSystemStore) {
+ "use strict";
+
+ exports["default"] = _emberDataPrivateSystemStore["default"];
+});
+define('ember-data/transform', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ /**
+ The `DS.Transform` class is used to serialize and deserialize model
+ attributes when they are saved or loaded from an
+ adapter. Subclassing `DS.Transform` is useful for creating custom
+ attributes. All subclasses of `DS.Transform` must implement a
+ `serialize` and a `deserialize` method.
+
+ Example
+
+ ```app/transforms/temperature.js
+ import DS from 'ember-data';
+
+ // Converts centigrade in the JSON to fahrenheit in the app
+ export default DS.Transform.extend({
+ deserialize: function(serialized) {
+ return (serialized * 1.8) + 32;
+ },
+ serialize: function(deserialized) {
+ return (deserialized - 32) / 1.8;
+ }
+ });
+ ```
+
+ Usage
+
+ ```app/models/requirement.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ name: DS.attr('string'),
+ temperature: DS.attr('temperature')
+ });
+ ```
+
+ @class Transform
+ @namespace DS
+ */
+ exports['default'] = _ember['default'].Object.extend({
+ /**
+ When given a deserialized value from a record attribute this
+ method must return the serialized value.
+ Example
+ ```javascript
+ serialize: function(deserialized, options) {
+ return Ember.isEmpty(deserialized) ? null : Number(deserialized);
+ }
+ ```
+ @method serialize
+ @param deserialized The deserialized value
+ @param options hash of options passed to `DS.attr`
+ @return The serialized value
+ */
+ serialize: null,
+
+ /**
+ When given a serialize value from a JSON object this method must
+ return the deserialized value for the record attribute.
+ Example
+ ```javascript
+ deserialize: function(serialized, options) {
+ return empty(serialized) ? null : Number(serialized);
+ }
+ ```
+ @method deserialize
+ @param serialized The serialized value
+ @param options hash of options passed to `DS.attr`
+ @return The deserialized value
+ */
+ deserialize: null
+ });
+});
+define("ember-data/version", ["exports"], function (exports) {
+ "use strict";
+
+ exports["default"] = "2.8.1";
+});
+define('ember-getowner-polyfill/fake-owner', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ var _createClass = (function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ('value' in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
+ };
+ })();
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError('Cannot call a class as a function');
+ }
+ }
+
+ var CONTAINER = '__' + new Date() + '_container';
+ var REGISTRY = '__' + new Date() + '_registry';
+
+ var FakeOwner = (function () {
+ function FakeOwner(object) {
+ _classCallCheck(this, FakeOwner);
+
+ this[CONTAINER] = object.container;
+
+ if (_ember['default'].Registry) {
+ // object.container._registry is used by 1.11
+ this[REGISTRY] = object.container.registry || object.container._registry;
+ } else {
+ // Ember < 1.12
+ this[REGISTRY] = object.container;
+ }
+ }
+
+ // ContainerProxyMixin methods
+ //
+ // => http://emberjs.com/api/classes/ContainerProxyMixin.html
+ //
+
+ _createClass(FakeOwner, [{
+ key: 'lookup',
+ value: function lookup() {
+ var _CONTAINER;
+
+ return (_CONTAINER = this[CONTAINER]).lookup.apply(_CONTAINER, arguments);
+ }
+ }, {
+ key: '_lookupFactory',
+ value: function _lookupFactory() {
+ var _CONTAINER2;
+
+ return (_CONTAINER2 = this[CONTAINER]).lookupFactory.apply(_CONTAINER2, arguments);
+ }
+ }, {
+ key: 'ownerInjection',
+ value: function ownerInjection() {
+ return {
+ container: this[CONTAINER]
+ };
+ }
+
+ // RegistryProxyMixin methods
+ //
+ // => http://emberjs.com/api/classes/RegistryProxyMixin.html
+ //
+ }, {
+ key: 'hasRegistration',
+ value: function hasRegistration() {
+ var _REGISTRY;
+
+ return (_REGISTRY = this[REGISTRY]).has.apply(_REGISTRY, arguments);
+ }
+ }, {
+ key: 'inject',
+ value: function inject() {
+ var _REGISTRY2;
+
+ return (_REGISTRY2 = this[REGISTRY]).injection.apply(_REGISTRY2, arguments);
+ }
+ }, {
+ key: 'register',
+ value: function register() {
+ var _REGISTRY3;
+
+ return (_REGISTRY3 = this[REGISTRY]).register.apply(_REGISTRY3, arguments);
+ }
+ }, {
+ key: 'registerOption',
+ value: function registerOption() {
+ var _REGISTRY4;
+
+ return (_REGISTRY4 = this[REGISTRY]).option.apply(_REGISTRY4, arguments);
+ }
+ }, {
+ key: 'registerOptions',
+ value: function registerOptions() {
+ var _REGISTRY5;
+
+ return (_REGISTRY5 = this[REGISTRY]).options.apply(_REGISTRY5, arguments);
+ }
+ }, {
+ key: 'registerOptionsForType',
+ value: function registerOptionsForType() {
+ var _REGISTRY6;
+
+ return (_REGISTRY6 = this[REGISTRY]).optionsForType.apply(_REGISTRY6, arguments);
+ }
+ }, {
+ key: 'registeredOption',
+ value: function registeredOption() {
+ var _REGISTRY7;
+
+ return (_REGISTRY7 = this[REGISTRY]).getOption.apply(_REGISTRY7, arguments);
+ }
+ }, {
+ key: 'registeredOptions',
+ value: function registeredOptions() {
+ var _REGISTRY8;
+
+ return (_REGISTRY8 = this[REGISTRY]).getOptions.apply(_REGISTRY8, arguments);
+ }
+ }, {
+ key: 'registeredOptionsForType',
+ value: function registeredOptionsForType(type) {
+ if (this[REGISTRY].getOptionsForType) {
+ var _REGISTRY9;
+
+ return (_REGISTRY9 = this[REGISTRY]).getOptionsForType.apply(_REGISTRY9, arguments);
+ } else {
+ // used for Ember 1.10
+ return this[REGISTRY]._typeOptions[type];
+ }
+ }
+ }, {
+ key: 'resolveRegistration',
+ value: function resolveRegistration() {
+ var _REGISTRY10;
+
+ return (_REGISTRY10 = this[REGISTRY]).resolve.apply(_REGISTRY10, arguments);
+ }
+ }, {
+ key: 'unregister',
+ value: function unregister() {
+ var _REGISTRY11;
+
+ return (_REGISTRY11 = this[REGISTRY]).unregister.apply(_REGISTRY11, arguments);
+ }
+ }]);
+
+ return FakeOwner;
+ })();
+
+ exports['default'] = FakeOwner;
+});
+define('ember-getowner-polyfill/index', ['exports', 'ember', 'ember-getowner-polyfill/fake-owner'], function (exports, _ember, _emberGetownerPolyfillFakeOwner) {
+ 'use strict';
+
+ var hasGetOwner = !!_ember['default'].getOwner;
+
+ exports['default'] = function (object) {
+ var owner = undefined;
+
+ if (hasGetOwner) {
+ owner = _ember['default'].getOwner(object);
+ }
+
+ if (!owner && object.container) {
+ owner = new _emberGetownerPolyfillFakeOwner['default'](object);
+ }
+
+ return owner;
+ };
+});
+define('ember-highcharts/components/high-charts', ['exports', 'ember', 'ember-highcharts/utils/option-loader', 'ember-getowner-polyfill'], function (exports, _ember, _emberHighchartsUtilsOptionLoader, _emberGetownerPolyfill) {
+ 'use strict';
+
+ var Component = _ember['default'].Component;
+ var computed = _ember['default'].computed;
+ var get = _ember['default'].get;
+ var set = _ember['default'].set;
+ var on = _ember['default'].on;
+ var run = _ember['default'].run;
+ var $ = _ember['default'].$;
+
+ var assign = _ember['default'].assign || _ember['default'].merge;
+
+ exports['default'] = Component.extend({
+ classNames: ['highcharts-wrapper'],
+ content: undefined,
+ mode: undefined,
+ chartOptions: undefined,
+ chart: null,
+ theme: undefined,
+ callback: undefined,
+
+ buildOptions: computed('chartOptions', 'content.[]', function () {
+ var chartOptions = $.extend(true, {}, get(this, 'theme'), get(this, 'chartOptions'));
+ var chartContent = get(this, 'content.length') ? get(this, 'content') : [{
+ id: 'noData',
+ data: 0,
+ color: '#aaaaaa'
+ }];
+
+ var defaults = { series: chartContent };
+
+ return assign(defaults, chartOptions);
+ }),
+
+ didReceiveAttrs: function didReceiveAttrs() {
+ this._super.apply(this, arguments);
+
+ var _getProperties = this.getProperties('content', 'chart', 'mode');
+
+ var content = _getProperties.content;
+ var chart = _getProperties.chart;
+ var mode = _getProperties.mode;
+
+ if (!content || !chart) {
+ return;
+ }
+
+ var isStockChart = mode === 'StockChart';
+
+ // create maps to make series data easier to work with
+ var contentSeriesMap = content.reduce(function (contentSeriesMap, contentSeries) {
+ contentSeriesMap[contentSeries.name] = contentSeries;
+ return contentSeriesMap;
+ }, {});
+
+ var chartSeriesMap = chart.series.reduce(function (chartSeriesMap, chartSeries) {
+ chartSeriesMap[chartSeries.name] = chartSeries;
+ return chartSeriesMap;
+ }, {});
+
+ // remove and update current series
+ var chartSeriesToRemove = [];
+
+ chart.series.forEach(function (series) {
+ if (isStockChart && series.name === 'Navigator') {
+ return;
+ }
+
+ var contentSeries = contentSeriesMap[series.name];
+
+ if (!contentSeries) {
+ return chartSeriesToRemove.push(series);
+ }
+
+ series.setData(contentSeries.data, false);
+ });
+
+ chartSeriesToRemove.forEach(function (series) {
+ return series.remove(false);
+ });
+
+ // add new series
+ content.forEach(function (contentSeries) {
+ if (!chartSeriesMap.hasOwnProperty(contentSeries.name)) {
+ chart.addSeries(contentSeries, false);
+ }
+ });
+
+ // reset navigator data
+ if (isStockChart && chart.xAxis.length) {
+ chart.xAxis[0].setExtremes();
+ }
+
+ return chart.redraw();
+ },
+
+ drawAfterRender: function drawAfterRender() {
+ run.scheduleOnce('afterRender', this, 'draw');
+ },
+
+ draw: function draw() {
+ var completeChartOptions = [get(this, 'buildOptions'), get(this, 'callback')];
+ var mode = get(this, 'mode');
+
+ if (typeof mode === 'string' && !!mode) {
+ completeChartOptions.unshift(mode);
+ }
+
+ var $element = this.$();
+ if ($element) {
+ var chart = $element.highcharts.apply($element, completeChartOptions).highcharts();
+ set(this, 'chart', chart);
+ }
+ },
+
+ _renderChart: on('didInsertElement', function () {
+ this.drawAfterRender();
+ (0, _emberHighchartsUtilsOptionLoader.setDefaultHighChartOptions)((0, _emberGetownerPolyfill['default'])(this));
+ }),
+
+ _destroyChart: on('willDestroyElement', function () {
+ if (get(this, 'chart')) {
+ get(this, 'chart').destroy();
+ }
+ })
+ });
+});
+define('ember-highcharts/utils/option-loader', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.setDefaultHighChartOptions = setDefaultHighChartOptions;
+
+ var localConfig = null;
+
+ function setDefaultHighChartOptions(owner) {
+ if (!localConfig) {
+ // use options defined in highcharts-configs/application.js if they exist
+ var localConfigBuilder = owner._lookupFactory('highcharts-config:application');
+ if (localConfigBuilder) {
+ localConfig = localConfigBuilder(defaultOptions);
+ } else {
+ localConfig = defaultOptions;
+ }
+ }
+
+ Highcharts.setOptions(localConfig);
+ }
+
+ var defaultOptions = {
+ plotOptions: {
+ series: {
+ shadow: false
+ }
+ },
+
+ global: {
+ timezoneOffset: new Date().getTimezoneOffset()
+ },
+
+ credits: {
+ enabled: false
+ }
+ };
+});
+define("ember-inflector/index", ["exports", "ember", "ember-inflector/lib/system", "ember-inflector/lib/ext/string"], function (exports, _ember, _emberInflectorLibSystem, _emberInflectorLibExtString) {
+ /* global define, module */
+
+ "use strict";
+
+ _emberInflectorLibSystem.Inflector.defaultRules = _emberInflectorLibSystem.defaultRules;
+ _ember["default"].Inflector = _emberInflectorLibSystem.Inflector;
+
+ _ember["default"].String.pluralize = _emberInflectorLibSystem.pluralize;
+ _ember["default"].String.singularize = _emberInflectorLibSystem.singularize;exports["default"] = _emberInflectorLibSystem.Inflector;
+ exports.pluralize = _emberInflectorLibSystem.pluralize;
+ exports.singularize = _emberInflectorLibSystem.singularize;
+ exports.defaultRules = _emberInflectorLibSystem.defaultRules;
+
+ if (typeof define !== 'undefined' && define.amd) {
+ define('ember-inflector', ['exports'], function (__exports__) {
+ __exports__['default'] = _emberInflectorLibSystem.Inflector;
+ return _emberInflectorLibSystem.Inflector;
+ });
+ } else if (typeof module !== 'undefined' && module['exports']) {
+ module['exports'] = _emberInflectorLibSystem.Inflector;
+ }
+});
+define('ember-inflector/lib/ext/string', ['exports', 'ember', 'ember-inflector/lib/system/string'], function (exports, _ember, _emberInflectorLibSystemString) {
+ 'use strict';
+
+ if (_ember['default'].EXTEND_PROTOTYPES === true || _ember['default'].EXTEND_PROTOTYPES.String) {
+ /**
+ See {{#crossLink "Ember.String/pluralize"}}{{/crossLink}}
+ @method pluralize
+ @for String
+ */
+ String.prototype.pluralize = function () {
+ return (0, _emberInflectorLibSystemString.pluralize)(this);
+ };
+
+ /**
+ See {{#crossLink "Ember.String/singularize"}}{{/crossLink}}
+ @method singularize
+ @for String
+ */
+ String.prototype.singularize = function () {
+ return (0, _emberInflectorLibSystemString.singularize)(this);
+ };
+ }
+});
+define('ember-inflector/lib/helpers/pluralize', ['exports', 'ember-inflector', 'ember-inflector/lib/utils/make-helper'], function (exports, _emberInflector, _emberInflectorLibUtilsMakeHelper) {
+ 'use strict';
+
+ /**
+ *
+ * If you have Ember Inflector (such as if Ember Data is present),
+ * pluralize a word. For example, turn "ox" into "oxen".
+ *
+ * Example:
+ *
+ * {{pluralize count myProperty}}
+ * {{pluralize 1 "oxen"}}
+ * {{pluralize myProperty}}
+ * {{pluralize "ox"}}
+ *
+ * @for Ember.HTMLBars.helpers
+ * @method pluralize
+ * @param {Number|Property} [count] count of objects
+ * @param {String|Property} word word to pluralize
+ */
+ exports['default'] = (0, _emberInflectorLibUtilsMakeHelper['default'])(function (params) {
+ var count = undefined,
+ word = undefined;
+
+ if (params.length === 1) {
+ word = params[0];
+ return (0, _emberInflector.pluralize)(word);
+ } else {
+ count = params[0];
+ word = params[1];
+
+ if (parseFloat(count) !== 1) {
+ word = (0, _emberInflector.pluralize)(word);
+ }
+
+ return count + " " + word;
+ }
+ });
+});
+define('ember-inflector/lib/helpers/singularize', ['exports', 'ember-inflector', 'ember-inflector/lib/utils/make-helper'], function (exports, _emberInflector, _emberInflectorLibUtilsMakeHelper) {
+ 'use strict';
+
+ /**
+ *
+ * If you have Ember Inflector (such as if Ember Data is present),
+ * singularize a word. For example, turn "oxen" into "ox".
+ *
+ * Example:
+ *
+ * {{singularize myProperty}}
+ * {{singularize "oxen"}}
+ *
+ * @for Ember.HTMLBars.helpers
+ * @method singularize
+ * @param {String|Property} word word to singularize
+ */
+ exports['default'] = (0, _emberInflectorLibUtilsMakeHelper['default'])(function (params) {
+ return (0, _emberInflector.singularize)(params[0]);
+ });
+});
+define("ember-inflector/lib/system", ["exports", "ember-inflector/lib/system/inflector", "ember-inflector/lib/system/string", "ember-inflector/lib/system/inflections"], function (exports, _emberInflectorLibSystemInflector, _emberInflectorLibSystemString, _emberInflectorLibSystemInflections) {
+ "use strict";
+
+ _emberInflectorLibSystemInflector["default"].inflector = new _emberInflectorLibSystemInflector["default"](_emberInflectorLibSystemInflections["default"]);
+
+ exports.Inflector = _emberInflectorLibSystemInflector["default"];
+ exports.singularize = _emberInflectorLibSystemString.singularize;
+ exports.pluralize = _emberInflectorLibSystemString.pluralize;
+ exports.defaultRules = _emberInflectorLibSystemInflections["default"];
+});
+define('ember-inflector/lib/system/inflections', ['exports'], function (exports) {
+ 'use strict';
+
+ exports['default'] = {
+ plurals: [[/$/, 's'], [/s$/i, 's'], [/^(ax|test)is$/i, '$1es'], [/(octop|vir)us$/i, '$1i'], [/(octop|vir)i$/i, '$1i'], [/(alias|status|bonus)$/i, '$1es'], [/(bu)s$/i, '$1ses'], [/(buffal|tomat)o$/i, '$1oes'], [/([ti])um$/i, '$1a'], [/([ti])a$/i, '$1a'], [/sis$/i, 'ses'], [/(?:([^f])fe|([lr])f)$/i, '$1$2ves'], [/(hive)$/i, '$1s'], [/([^aeiouy]|qu)y$/i, '$1ies'], [/(x|ch|ss|sh)$/i, '$1es'], [/(matr|vert|ind)(?:ix|ex)$/i, '$1ices'], [/^(m|l)ouse$/i, '$1ice'], [/^(m|l)ice$/i, '$1ice'], [/^(ox)$/i, '$1en'], [/^(oxen)$/i, '$1'], [/(quiz)$/i, '$1zes']],
+
+ singular: [[/s$/i, ''], [/(ss)$/i, '$1'], [/(n)ews$/i, '$1ews'], [/([ti])a$/i, '$1um'], [/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)$/i, '$1sis'], [/(^analy)(sis|ses)$/i, '$1sis'], [/([^f])ves$/i, '$1fe'], [/(hive)s$/i, '$1'], [/(tive)s$/i, '$1'], [/([lr])ves$/i, '$1f'], [/([^aeiouy]|qu)ies$/i, '$1y'], [/(s)eries$/i, '$1eries'], [/(m)ovies$/i, '$1ovie'], [/(x|ch|ss|sh)es$/i, '$1'], [/^(m|l)ice$/i, '$1ouse'], [/(bus)(es)?$/i, '$1'], [/(o)es$/i, '$1'], [/(shoe)s$/i, '$1'], [/(cris|test)(is|es)$/i, '$1is'], [/^(a)x[ie]s$/i, '$1xis'], [/(octop|vir)(us|i)$/i, '$1us'], [/(alias|status|bonus)(es)?$/i, '$1'], [/^(ox)en/i, '$1'], [/(vert|ind)ices$/i, '$1ex'], [/(matr)ices$/i, '$1ix'], [/(quiz)zes$/i, '$1'], [/(database)s$/i, '$1']],
+
+ irregularPairs: [['person', 'people'], ['man', 'men'], ['child', 'children'], ['sex', 'sexes'], ['move', 'moves'], ['cow', 'kine'], ['zombie', 'zombies']],
+
+ uncountable: ['equipment', 'information', 'rice', 'money', 'species', 'series', 'fish', 'sheep', 'jeans', 'police']
+ };
+});
+define('ember-inflector/lib/system/inflector', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ var capitalize = _ember['default'].String.capitalize;
+
+ var BLANK_REGEX = /^\s*$/;
+ var LAST_WORD_DASHED_REGEX = /([\w/-]+[_/\s-])([a-z\d]+$)/;
+ var LAST_WORD_CAMELIZED_REGEX = /([\w/\s-]+)([A-Z][a-z\d]*$)/;
+ var CAMELIZED_REGEX = /[A-Z][a-z\d]*$/;
+
+ function loadUncountable(rules, uncountable) {
+ for (var i = 0, length = uncountable.length; i < length; i++) {
+ rules.uncountable[uncountable[i].toLowerCase()] = true;
+ }
+ }
+
+ function loadIrregular(rules, irregularPairs) {
+ var pair;
+
+ for (var i = 0, length = irregularPairs.length; i < length; i++) {
+ pair = irregularPairs[i];
+
+ //pluralizing
+ rules.irregular[pair[0].toLowerCase()] = pair[1];
+ rules.irregular[pair[1].toLowerCase()] = pair[1];
+
+ //singularizing
+ rules.irregularInverse[pair[1].toLowerCase()] = pair[0];
+ rules.irregularInverse[pair[0].toLowerCase()] = pair[0];
+ }
+ }
+
+ /**
+ Inflector.Ember provides a mechanism for supplying inflection rules for your
+ application. Ember includes a default set of inflection rules, and provides an
+ API for providing additional rules.
+
+ Examples:
+
+ Creating an inflector with no rules.
+
+ ```js
+ var inflector = new Ember.Inflector();
+ ```
+
+ Creating an inflector with the default ember ruleset.
+
+ ```js
+ var inflector = new Ember.Inflector(Ember.Inflector.defaultRules);
+
+ inflector.pluralize('cow'); //=> 'kine'
+ inflector.singularize('kine'); //=> 'cow'
+ ```
+
+ Creating an inflector and adding rules later.
+
+ ```javascript
+ var inflector = Ember.Inflector.inflector;
+
+ inflector.pluralize('advice'); // => 'advices'
+ inflector.uncountable('advice');
+ inflector.pluralize('advice'); // => 'advice'
+
+ inflector.pluralize('formula'); // => 'formulas'
+ inflector.irregular('formula', 'formulae');
+ inflector.pluralize('formula'); // => 'formulae'
+
+ // you would not need to add these as they are the default rules
+ inflector.plural(/$/, 's');
+ inflector.singular(/s$/i, '');
+ ```
+
+ Creating an inflector with a nondefault ruleset.
+
+ ```javascript
+ var rules = {
+ plurals: [ /$/, 's' ],
+ singular: [ /\s$/, '' ],
+ irregularPairs: [
+ [ 'cow', 'kine' ]
+ ],
+ uncountable: [ 'fish' ]
+ };
+
+ var inflector = new Ember.Inflector(rules);
+ ```
+
+ @class Inflector
+ @namespace Ember
+ */
+ function Inflector(ruleSet) {
+ ruleSet = ruleSet || {};
+ ruleSet.uncountable = ruleSet.uncountable || makeDictionary();
+ ruleSet.irregularPairs = ruleSet.irregularPairs || makeDictionary();
+
+ var rules = this.rules = {
+ plurals: ruleSet.plurals || [],
+ singular: ruleSet.singular || [],
+ irregular: makeDictionary(),
+ irregularInverse: makeDictionary(),
+ uncountable: makeDictionary()
+ };
+
+ loadUncountable(rules, ruleSet.uncountable);
+ loadIrregular(rules, ruleSet.irregularPairs);
+
+ this.enableCache();
+ }
+
+ if (!Object.create && !Object.create(null).hasOwnProperty) {
+ throw new Error("This browser does not support Object.create(null), please polyfil with es5-sham: http://git.io/yBU2rg");
+ }
+
+ function makeDictionary() {
+ var cache = Object.create(null);
+ cache['_dict'] = null;
+ delete cache['_dict'];
+ return cache;
+ }
+
+ Inflector.prototype = {
+ /**
+ @public
+ As inflections can be costly, and commonly the same subset of words are repeatedly
+ inflected an optional cache is provided.
+ @method enableCache
+ */
+ enableCache: function enableCache() {
+ this.purgeCache();
+
+ this.singularize = function (word) {
+ this._cacheUsed = true;
+ return this._sCache[word] || (this._sCache[word] = this._singularize(word));
+ };
+
+ this.pluralize = function (word) {
+ this._cacheUsed = true;
+ return this._pCache[word] || (this._pCache[word] = this._pluralize(word));
+ };
+ },
+
+ /**
+ @public
+ @method purgedCache
+ */
+ purgeCache: function purgeCache() {
+ this._cacheUsed = false;
+ this._sCache = makeDictionary();
+ this._pCache = makeDictionary();
+ },
+
+ /**
+ @public
+ disable caching
+ @method disableCache;
+ */
+ disableCache: function disableCache() {
+ this._sCache = null;
+ this._pCache = null;
+ this.singularize = function (word) {
+ return this._singularize(word);
+ };
+
+ this.pluralize = function (word) {
+ return this._pluralize(word);
+ };
+ },
+
+ /**
+ @method plural
+ @param {RegExp} regex
+ @param {String} string
+ */
+ plural: function plural(regex, string) {
+ if (this._cacheUsed) {
+ this.purgeCache();
+ }
+ this.rules.plurals.push([regex, string.toLowerCase()]);
+ },
+
+ /**
+ @method singular
+ @param {RegExp} regex
+ @param {String} string
+ */
+ singular: function singular(regex, string) {
+ if (this._cacheUsed) {
+ this.purgeCache();
+ }
+ this.rules.singular.push([regex, string.toLowerCase()]);
+ },
+
+ /**
+ @method uncountable
+ @param {String} regex
+ */
+ uncountable: function uncountable(string) {
+ if (this._cacheUsed) {
+ this.purgeCache();
+ }
+ loadUncountable(this.rules, [string.toLowerCase()]);
+ },
+
+ /**
+ @method irregular
+ @param {String} singular
+ @param {String} plural
+ */
+ irregular: function irregular(singular, plural) {
+ if (this._cacheUsed) {
+ this.purgeCache();
+ }
+ loadIrregular(this.rules, [[singular, plural]]);
+ },
+
+ /**
+ @method pluralize
+ @param {String} word
+ */
+ pluralize: function pluralize(word) {
+ return this._pluralize(word);
+ },
+
+ _pluralize: function _pluralize(word) {
+ return this.inflect(word, this.rules.plurals, this.rules.irregular);
+ },
+ /**
+ @method singularize
+ @param {String} word
+ */
+ singularize: function singularize(word) {
+ return this._singularize(word);
+ },
+
+ _singularize: function _singularize(word) {
+ return this.inflect(word, this.rules.singular, this.rules.irregularInverse);
+ },
+
+ /**
+ @protected
+ @method inflect
+ @param {String} word
+ @param {Object} typeRules
+ @param {Object} irregular
+ */
+ inflect: function inflect(word, typeRules, irregular) {
+ var inflection, substitution, result, lowercase, wordSplit, firstPhrase, lastWord, isBlank, isCamelized, rule, isUncountable;
+
+ isBlank = !word || BLANK_REGEX.test(word);
+
+ isCamelized = CAMELIZED_REGEX.test(word);
+ firstPhrase = "";
+
+ if (isBlank) {
+ return word;
+ }
+
+ lowercase = word.toLowerCase();
+ wordSplit = LAST_WORD_DASHED_REGEX.exec(word) || LAST_WORD_CAMELIZED_REGEX.exec(word);
+
+ if (wordSplit) {
+ firstPhrase = wordSplit[1];
+ lastWord = wordSplit[2].toLowerCase();
+ }
+
+ isUncountable = this.rules.uncountable[lowercase] || this.rules.uncountable[lastWord];
+
+ if (isUncountable) {
+ return word;
+ }
+
+ for (rule in irregular) {
+ if (lowercase.match(rule + "$")) {
+ substitution = irregular[rule];
+
+ if (isCamelized && irregular[lastWord]) {
+ substitution = capitalize(substitution);
+ rule = capitalize(rule);
+ }
+
+ return word.replace(new RegExp(rule, 'i'), substitution);
+ }
+ }
+
+ for (var i = typeRules.length, min = 0; i > min; i--) {
+ inflection = typeRules[i - 1];
+ rule = inflection[0];
+
+ if (rule.test(word)) {
+ break;
+ }
+ }
+
+ inflection = inflection || [];
+
+ rule = inflection[0];
+ substitution = inflection[1];
+
+ result = word.replace(rule, substitution);
+
+ return result;
+ }
+ };
+
+ exports['default'] = Inflector;
+});
+define('ember-inflector/lib/system/string', ['exports', 'ember-inflector/lib/system/inflector'], function (exports, _emberInflectorLibSystemInflector) {
+ 'use strict';
+
+ function pluralize(word) {
+ return _emberInflectorLibSystemInflector['default'].inflector.pluralize(word);
+ }
+
+ function singularize(word) {
+ return _emberInflectorLibSystemInflector['default'].inflector.singularize(word);
+ }
+
+ exports.pluralize = pluralize;
+ exports.singularize = singularize;
+});
+define('ember-inflector/lib/utils/make-helper', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports['default'] = makeHelper;
+
+ function makeHelper(helperFunction) {
+ if (_ember['default'].Helper) {
+ return _ember['default'].Helper.helper(helperFunction);
+ }
+ if (_ember['default'].HTMLBars) {
+ return _ember['default'].HTMLBars.makeBoundHelper(helperFunction);
+ }
+ return _ember['default'].Handlebars.makeBoundHelper(helperFunction);
+ }
+});
+define('ember-load-initializers/index', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports['default'] = function (app, prefix) {
+ var regex = new RegExp('^' + prefix + '\/((?:instance-)?initializers)\/');
+ var getKeys = Object.keys || _ember['default'].keys;
+
+ getKeys(requirejs._eak_seen).map(function (moduleName) {
+ return {
+ moduleName: moduleName,
+ matches: regex.exec(moduleName)
+ };
+ }).filter(function (dep) {
+ return dep.matches && dep.matches.length === 2;
+ }).forEach(function (dep) {
+ var moduleName = dep.moduleName;
+
+ var module = require(moduleName, null, null, true);
+ if (!module) {
+ throw new Error(moduleName + ' must export an initializer.');
+ }
+
+ var initializerType = _ember['default'].String.camelize(dep.matches[1].substring(0, dep.matches[1].length - 1));
+ var initializer = module['default'];
+ if (!initializer.name) {
+ var initializerName = moduleName.match(/[^\/]+\/?$/)[0];
+ initializer.name = initializerName;
+ }
+
+ if (app[initializerType]) {
+ app[initializerType](initializer);
+ }
+ });
+ };
+});
+define('ember-local-storage/adapters/adapter', ['exports', 'ember-local-storage/adapters/local'], function (exports, _emberLocalStorageAdaptersLocal) {
+ 'use strict';
+
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberLocalStorageAdaptersLocal['default'];
+ }
+ });
+});
+define('ember-local-storage/adapters/base', ['exports', 'ember', 'ember-data', 'ember-local-storage/mixins/adapters/import-export'], function (exports, _ember, _emberData, _emberLocalStorageMixinsAdaptersImportExport) {
+ 'use strict';
+
+ var keys = Object.keys || _ember['default'].keys;
+
+ var JSONAPIAdapter = _emberData['default'].JSONAPIAdapter;
+ var get = _ember['default'].get;
+ var RSVP = _ember['default'].RSVP;
+ var run = _ember['default'].run;
+ var Inflector = _ember['default'].Inflector;
+ var typeOf = _ember['default'].typeOf;
+ var isEmpty = _ember['default'].isEmpty;
+
+ // Ember data ships with ember-inflector
+ var inflector = Inflector.inflector;
+
+ exports['default'] = JSONAPIAdapter.extend(_emberLocalStorageMixinsAdaptersImportExport['default'], {
+ _debug: false,
+ _indices: {},
+ isNewSerializerAPI: true,
+ coalesceFindRequests: false,
+
+ // Reload behavior
+ shouldReloadRecord: function shouldReloadRecord() {
+ return true;
+ },
+ shouldReloadAll: function shouldReloadAll() {
+ return true;
+ },
+ shouldBackgroundReloadRecord: function shouldBackgroundReloadRecord() {
+ return true;
+ },
+ shouldBackgroundReloadAll: function shouldBackgroundReloadAll() {
+ return true;
+ },
+
+ generateIdForRecord: function generateIdForRecord() {
+ return Math.random().toString(32).slice(2).substr(0, 8);
+ },
+
+ // Relationship sugar
+ createRecord: function createRecord(store, type, snapshot) {
+ snapshot.eachRelationship(function (name, relationship) {
+ var kind = relationship.kind;
+ var options = relationship.options;
+
+ if (kind === 'belongsTo' && options.autoSave) {
+ snapshot.record.get(name).then(function (record) {
+ if (record) {
+ record.save();
+ }
+ });
+ }
+ });
+
+ return this._super.apply(this, arguments);
+ },
+
+ deleteRecord: function deleteRecord(store, type, snapshot) {
+ snapshot.eachRelationship(function (name, relationship) {
+ var kind = relationship.kind;
+ var options = relationship.options;
+
+ if (kind === 'hasMany' && options.dependent === 'destroy') {
+ snapshot.record.get(name).then(function (records) {
+ records.forEach(function (record) {
+ record.destroyRecord();
+ });
+ });
+ }
+
+ if (kind === 'belongsTo' && options.autoSave) {
+ snapshot.record.get(name).then(function (record) {
+ if (record) {
+ record.save();
+ }
+ });
+ }
+ });
+
+ return this._super.apply(this, arguments);
+ },
+
+ // Polyfill queryRecord
+ queryRecord: function queryRecord(store, type, query) {
+ var records = this._super.apply(this, arguments);
+
+ if (!records) {
+ var url = this.buildURL(type.modelName, null, null, 'queryRecord', query);
+
+ if (this.sortQueryParams) {
+ query = this.sortQueryParams(query);
+ }
+
+ records = this.ajax(url, 'GET', { data: query });
+ }
+
+ return records.then(function (result) {
+ result = result.data[0];
+ // hack to fix https://github.com/emberjs/data/issues/3790
+ // and https://github.com/emberjs/data/pull/3866
+ try {
+ store.push({ data: null });
+ return { data: result || null };
+ } catch (e) {
+ return { data: result || [] };
+ }
+ });
+ },
+
+ // Delegate to _handleStorageRequest
+ ajax: function ajax() {
+ return this._handleStorageRequest.apply(this, arguments);
+ },
+
+ // Delegate to _handleStorageRequest
+ makeRequest: function makeRequest(request) {
+ return this._handleStorageRequest(request.url, request.method, { data: request.data });
+ },
+
+ // Work arround ds-improved-ajax Feature Flag
+ _makeRequest: function _makeRequest() {
+ return this.makeRequest.apply(this, arguments);
+ },
+
+ // Remove the ajax() deprecation warning
+ _hasCustomizedAjax: function _hasCustomizedAjax() {
+ return false;
+ },
+
+ // Delegate to _handle${type}Request
+ _handleStorageRequest: function _handleStorageRequest(url, type) {
+ var _this = this;
+
+ var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
+
+ if (this._debug) {
+ console.log(url, type, options);
+ }
+
+ return new RSVP.Promise(function (resolve, reject) {
+ var handler = _this['_handle' + type + 'Request'];
+ if (handler) {
+ var data = handler.call(_this, url, options.data);
+ run(null, resolve, { data: data });
+ } else {
+ run(null, reject, 'There is nothing to handle _handle' + type + 'Request');
+ }
+ }, 'DS: LocalStorageAdapter#_handleStorageRequest ' + type + ' to ' + url);
+ },
+
+ _handleGETRequest: function _handleGETRequest(url, query) {
+ var _this2 = this;
+
+ var _urlParts2 = this._urlParts(url);
+
+ var type = _urlParts2.type;
+ var id = _urlParts2.id;
+
+ var storage = get(this, '_storage'),
+ storageKey = this._storageKey(type, id);
+
+ if (id) {
+ return storage[storageKey] ? JSON.parse(storage[storageKey]) : null;
+ }
+
+ var records = this._getIndex(type).filter(function (storageKey) {
+ return storage[storageKey];
+ }).map(function (storageKey) {
+ return JSON.parse(storage[storageKey]);
+ });
+
+ if (query && query.filter) {
+ var _ret = (function () {
+ var serializer = _this2.store.serializerFor(inflector.singularize(type));
+
+ return {
+ v: records.filter(function (record) {
+ return _this2._queryFilter(record, serializer, query.filter);
+ })
+ };
+ })();
+
+ if (typeof _ret === 'object') return _ret.v;
+ }
+
+ return records;
+ },
+
+ _handlePOSTRequest: function _handlePOSTRequest(url, record) {
+ var _record$data = record.data;
+ var type = _record$data.type;
+ var id = _record$data.id;
+
+ var storageKey = this._storageKey(type, id);
+
+ this._addToIndex(type, storageKey);
+ get(this, '_storage')[storageKey] = JSON.stringify(record.data);
+
+ return null;
+ },
+
+ _handlePATCHRequest: function _handlePATCHRequest(url, record) {
+ var _record$data2 = record.data;
+ var type = _record$data2.type;
+ var id = _record$data2.id;
+
+ var storageKey = this._storageKey(type, id);
+
+ this._addToIndex(type, storageKey);
+ get(this, '_storage')[storageKey] = JSON.stringify(record.data);
+
+ return null;
+ },
+
+ _handleDELETERequest: function _handleDELETERequest(url) {
+ var _urlParts3 = this._urlParts(url);
+
+ var type = _urlParts3.type;
+ var id = _urlParts3.id;
+
+ var storageKey = this._storageKey(type, id);
+
+ this._removeFromIndex(type, storageKey);
+ delete get(this, '_storage')[storageKey];
+
+ return null;
+ },
+
+ _queryFilter: function _queryFilter(data, serializer) {
+ var _this3 = this;
+
+ var query = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
+
+ var queryType = typeOf(query),
+ dataType = typeOf(data);
+
+ if (queryType === 'object' && dataType === 'object') {
+ return keys(query).every(function (key) {
+ var queryValue = query[key],
+ recordValue = undefined;
+
+ // normalize type
+ if (key === 'type' && typeOf(queryValue) === 'string') {
+ queryValue = inflector.pluralize(queryValue);
+ }
+
+ // Attributes
+ if (key === 'id' || key === 'type') {
+ recordValue = data[key];
+ } else {
+ key = serializer.keyForAttribute(key);
+ recordValue = data.attributes ? data.attributes[key] : null;
+ }
+
+ if (recordValue !== undefined) {
+ return _this3._matches(recordValue, queryValue);
+ }
+
+ // Relationships
+ key = serializer.keyForRelationship(key);
+ if (data.relationships && data.relationships[key]) {
+ if (isEmpty(data.relationships[key].data)) {
+ return;
+ }
+
+ return _this3._queryFilter(data.relationships[key].data, serializer, queryValue);
+ }
+ });
+ } else if (queryType === 'array') {
+ // belongsTo
+ if (dataType === 'object') {
+ var queryMessage = query.map(function (item) {
+ return keys(item).map(function (key) {
+ return key + ': ' + item[key];
+ });
+ }).join(', ');
+
+ throw new Error('You can not provide an array with a belongsTo relation. ' + 'Query: ' + queryMessage);
+
+ // hasMany
+ } else {
+ return query.every(function (queryValue) {
+ return _this3._queryFilter(data, serializer, queryValue);
+ });
+ }
+ } else {
+ // belongsTo
+ if (dataType === 'object') {
+ return this._matches(data.id, query);
+
+ // hasMany
+ } else {
+ return data.some(function (record) {
+ return _this3._queryFilter(record, serializer, query);
+ });
+ }
+ }
+ },
+
+ _matches: function _matches(recordValue, queryValue) {
+ if (typeOf(queryValue) === 'regexp') {
+ return queryValue.test(recordValue);
+ }
+
+ return recordValue === queryValue;
+ },
+
+ _urlParts: function _urlParts(url) {
+ var parts = url.split('/');
+
+ // remove empty part
+ parts.shift();
+
+ var type = parts.shift();
+ var id = parts.shift();
+
+ if (type === this.modelNamespace) {
+ type = type + '/' + id;
+ id = parts.shift();
+ }
+
+ return {
+ type: type,
+ id: id
+ };
+ },
+
+ _storageKey: function _storageKey(type, id) {
+ return type + '-' + id;
+ },
+
+ // Should be overwriten
+ // Signature: _getIndex(type)
+ _getIndex: function _getIndex() {},
+
+ _indexHasKey: function _indexHasKey(type, id) {
+ return this._getIndex(type).indexOf(id) !== -1;
+ },
+
+ _addToIndex: function _addToIndex(type, id) {
+ if (!this._indexHasKey(type, id)) {
+ this._getIndex(type).addObject(id);
+ }
+ },
+
+ _removeFromIndex: function _removeFromIndex(type, id) {
+ this._getIndex(type).removeObject(id);
+ }
+ });
+});
+define('ember-local-storage/adapters/local', ['exports', 'ember', 'ember-local-storage/adapters/base', 'ember-local-storage/helpers/storage', 'ember-local-storage/local/array'], function (exports, _ember, _emberLocalStorageAdaptersBase, _emberLocalStorageHelpersStorage, _emberLocalStorageLocalArray) {
+ 'use strict';
+
+ var get = _ember['default'].get;
+
+ exports['default'] = _emberLocalStorageAdaptersBase['default'].extend({
+ _storage: (0, _emberLocalStorageHelpersStorage.getStorage)('local'),
+
+ _getIndex: function _getIndex(type) {
+ var indices = get(this, '_indices');
+
+ if (!indices[type]) {
+ indices[type] = _emberLocalStorageLocalArray['default'].extend({ _storageKey: 'index-' + type }).create();
+ }
+
+ return indices[type];
+ }
+ });
+});
+define('ember-local-storage/adapters/session', ['exports', 'ember', 'ember-local-storage/adapters/base', 'ember-local-storage/helpers/storage', 'ember-local-storage/session/array'], function (exports, _ember, _emberLocalStorageAdaptersBase, _emberLocalStorageHelpersStorage, _emberLocalStorageSessionArray) {
+ 'use strict';
+
+ var get = _ember['default'].get;
+
+ exports['default'] = _emberLocalStorageAdaptersBase['default'].extend({
+ _storage: (0, _emberLocalStorageHelpersStorage.getStorage)('session'),
+
+ _getIndex: function _getIndex(type) {
+ var indices = get(this, '_indices');
+
+ if (!indices[type]) {
+ indices[type] = _emberLocalStorageSessionArray['default'].extend({ _storageKey: 'index-' + type }).create();
+ }
+
+ return indices[type];
+ }
+ });
+});
+define('ember-local-storage/helpers/storage', ['exports', 'ember', 'ember-getowner-polyfill'], function (exports, _ember, _emberGetownerPolyfill) {
+ 'use strict';
+
+ var assert = _ember['default'].assert;
+ var computed = _ember['default'].computed;
+ var dasherize = _ember['default'].String.dasherize;
+
+ var assign = _ember['default'].assign || _ember['default'].merge;
+
+ var storage = {};
+
+ function tryStorage(name) {
+ var nativeStorage = undefined;
+
+ // safari private mode exposes xStorage but fails on setItem
+ try {
+ nativeStorage = name === 'local' ? localStorage : sessionStorage;
+ nativeStorage.setItem('emberlocalstorage.test', 'ok');
+ nativeStorage.removeItem('emberlocalstorage.test');
+ } catch (e) {
+ nativeStorage = null;
+ }
+
+ return nativeStorage;
+ }
+
+ function getStorage(name) {
+ if (storage[name]) {
+ return storage[name];
+ } else {
+ return storage[name] = tryStorage(name) || {};
+ }
+ }
+
+ var storages = {};
+
+ function storageFor(key, modelName) {
+ var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
+
+ if (arguments.length === 2 && typeof modelName === 'object') {
+ options = modelName;
+ modelName = null;
+ }
+
+ assert('The options argument must be an object', typeof options === 'object');
+
+ // normalize key
+ key = dasherize(key);
+
+ if (!modelName) {
+ return computed(function () {
+ if (!storages[key]) {
+ storages[key] = createStorage(this, key, null, options);
+ }
+
+ return storages[key];
+ });
+ }
+
+ assert('The second argument must be a string', typeof modelName === 'string');
+
+ return computed(modelName, function () {
+ var model = this.get(modelName);
+
+ // if the propertyValue is null/undefined we simply return null/undefined
+ if (!model || typeof model === 'undefined') {
+ return model;
+ }
+
+ var modelKey = _modelKey(model);
+ // TODO allow callbacks to delete the storage if model gets deleted
+
+ if (!storages[modelKey]) {
+ storages[modelKey] = createStorage(this, key, modelKey, options);
+ }
+
+ return storages[modelKey];
+ });
+ }
+
+ /*
+ * Looks up the storage factory on the container and sets initial state
+ * on the instance if desired.
+ */
+ function createStorage(context, key, modelKey, options) {
+ var owner = (0, _emberGetownerPolyfill['default'])(context);
+ var factoryType = 'storage';
+ var storageFactory = factoryType + ':' + key;
+
+ var storageKey = undefined;
+
+ owner.registerOptionsForType(factoryType, { instantiate: false });
+
+ if (options.legacyKey) {
+ storageKey = options.legacyKey;
+ } else {
+ storageKey = modelKey ? storageFactory + ':' + modelKey : storageFactory;
+ }
+
+ var initialState = {},
+ defaultState = {
+ _storageKey: storageKey
+ },
+ StorageFactory = owner.lookup(storageFactory);
+
+ if (!StorageFactory) {
+ throw new TypeError('Unknown StorageFactory: ' + storageFactory);
+ }
+
+ if (typeof StorageFactory.initialState === 'function') {
+ initialState._initialContent = StorageFactory.initialState.call(context);
+ } else if (StorageFactory.initialState) {
+ throw new TypeError('initialState property must be a function');
+ }
+
+ assign(initialState, defaultState);
+
+ if (StorageFactory.create) {
+ return StorageFactory.create(initialState);
+ }
+
+ return _ember['default'].Object.create(StorageFactory);
+ }
+
+ function _modelKey(model) {
+ var modelName = model.modelName || model.constructor.typeKey,
+ id = model.get('id');
+
+ if (!modelName || !id) {
+ throw new TypeError('The model must have a `modelName` and `id` on it');
+ }
+
+ return modelName + ':' + id;
+ }
+
+ // Testing helper
+ function _resetStorages() {
+ storages = {};
+ }
+
+ exports.tryStorage = tryStorage;
+ exports.getStorage = getStorage;
+ exports.storageFor = storageFor;
+ exports._resetStorages = _resetStorages;
+});
+define('ember-local-storage/index', ['exports', 'ember-local-storage/helpers/storage'], function (exports, _emberLocalStorageHelpersStorage) {
+ 'use strict';
+
+ exports.storageFor = _emberLocalStorageHelpersStorage.storageFor;
+});
+define('ember-local-storage/initializers/local-storage-adapter', ['exports', 'ember-data', 'ember-local-storage/adapters/adapter'], function (exports, _emberData, _emberLocalStorageAdaptersAdapter) {
+ 'use strict';
+
+ exports.initialize = initialize;
+
+ function initialize() {
+ if (!_emberData['default'].Store.prototype._emberLocalStoragePatched) {
+ (function () {
+ var adapter = _emberLocalStorageAdaptersAdapter['default'].create();
+
+ _emberData['default'].Store.reopen({
+ _emberLocalStoragePatched: true,
+ importData: function importData(json, options) {
+ return adapter.importData.call(adapter, this, json, options);
+ },
+ exportData: function exportData(types, options) {
+ return adapter.exportData.call(adapter, this, types, options);
+ }
+ });
+ })();
+ }
+ }
+
+ exports['default'] = {
+ name: 'local-storage-adapter',
+ after: 'ember-data',
+ initialize: initialize
+ };
+});
+define('ember-local-storage/local/array', ['exports', 'ember', 'ember-local-storage/mixins/array'], function (exports, _ember, _emberLocalStorageMixinsArray) {
+ 'use strict';
+
+ exports['default'] = _ember['default'].ArrayProxy.extend(_emberLocalStorageMixinsArray['default'], {
+ _storageType: 'local'
+ });
+});
+define('ember-local-storage/local/object', ['exports', 'ember', 'ember-local-storage/mixins/object'], function (exports, _ember, _emberLocalStorageMixinsObject) {
+ 'use strict';
+
+ exports['default'] = _ember['default'].ObjectProxy.extend(_emberLocalStorageMixinsObject['default'], {
+ _storageType: 'local'
+ });
+});
+define('ember-local-storage/mixins/adapters/import-export', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ var get = _ember['default'].get;
+
+ var Mixin = _ember['default'].Mixin;
+ var singularize = _ember['default'].String.singularize;
+
+ var assign = _ember['default'].assign || _ember['default'].merge;
+
+ exports['default'] = Mixin.create({
+ importData: function importData(store, content, options) {
+ var _this = this;
+
+ // merge defaults
+ options = assign({
+ json: true,
+ truncate: true
+ }, options || {});
+
+ var reloadTypes = [];
+
+ content = options.json ? JSON.parse(content) : content;
+
+ if (options.truncate) {
+ content.data.forEach(function (record) {
+ var type = record.type;
+
+ _this._getIndex(type).forEach(function (storageKey) {
+ delete get(_this, '_storage')[storageKey];
+ });
+
+ _this._getIndex(type).reset();
+
+ // unload from store
+ store.unloadAll(singularize(type));
+ });
+ }
+
+ var promises = content.data.map(function (record) {
+ // collect types to reload
+ reloadTypes.push(singularize(record.type));
+
+ return _this._handleStorageRequest(null, 'POST', {
+ data: { data: record }
+ });
+ });
+
+ return _ember['default'].RSVP.all(promises).then(function () {
+ // reload from store
+ reloadTypes.forEach(function (type) {
+ store.findAll(type);
+ });
+ });
+ },
+
+ exportData: function exportData(store, types, options) {
+ var _this2 = this;
+
+ // merge defaults
+ options = assign({
+ json: true,
+ download: false,
+ filename: 'ember-data.json'
+ }, options || {});
+
+ var json = undefined,
+ data = undefined;
+
+ // collect data
+ data = types.reduce(function (records, type) {
+ var url = _this2.buildURL(type),
+ exportData = _this2._handleGETRequest(url);
+
+ records.data = records.data.concat(exportData);
+ return records;
+ }, { data: [] });
+
+ if (options.json || options.download) {
+ json = JSON.stringify(data);
+ }
+
+ if (options.json) {
+ data = json;
+ }
+
+ if (options.download) {
+ window.saveAs(new Blob([json], { type: 'application/json;charset=utf-8' }), options.filename);
+ }
+
+ return new _ember['default'].RSVP.Promise(function (resolve) {
+ _ember['default'].run(null, resolve, data);
+ }, 'DS: LocalStorageAdapter#exportData');
+ }
+ });
+});
+define('ember-local-storage/mixins/array', ['exports', 'ember', 'ember-local-storage/mixins/storage'], function (exports, _ember, _emberLocalStorageMixinsStorage) {
+ 'use strict';
+
+ var set = _ember['default'].set;
+
+ exports['default'] = _ember['default'].Mixin.create(_emberLocalStorageMixinsStorage['default'], {
+ _initialContent: _ember['default'].A(),
+
+ replaceContent: function replaceContent() {
+ this._super.apply(this, arguments);
+ this._save();
+ },
+
+ // we need to save
+ reset: function reset() {
+ this._super.apply(this, arguments);
+ this._save();
+ },
+
+ _clear: function _clear() {
+ set(this, 'content', _ember['default'].A());
+ }
+ });
+});
+define('ember-local-storage/mixins/object', ['exports', 'ember', 'ember-local-storage/mixins/storage'], function (exports, _ember, _emberLocalStorageMixinsStorage) {
+ 'use strict';
+
+ var set = _ember['default'].set;
+
+ exports['default'] = _ember['default'].Mixin.create(_emberLocalStorageMixinsStorage['default'], {
+ _initialContent: {},
+
+ setUnknownProperty: function setUnknownProperty(key) {
+ this._super.apply(this, arguments);
+
+ if (key !== '_isInitialContent') {
+ this._save();
+ }
+ },
+
+ set: function set(key) {
+ this._super.apply(this, arguments);
+
+ if (key !== '_isInitialContent') {
+ this._save();
+ }
+ },
+
+ setProperties: function setProperties() {
+ this._super.apply(this, arguments);
+ this._save();
+ },
+
+ _clear: function _clear() {
+ set(this, 'content', {});
+ }
+ });
+});
+define('ember-local-storage/mixins/storage', ['exports', 'ember', 'ember-local-storage/helpers/storage'], function (exports, _ember, _emberLocalStorageHelpersStorage) {
+ 'use strict';
+
+ var get = _ember['default'].get;
+ var set = _ember['default'].set;
+
+ var Mixin = _ember['default'].Mixin;
+ var deprecate = _ember['default'].deprecate;
+ var copy = _ember['default'].copy;
+ var isArray = _ember['default'].isArray;
+
+ var assign = _ember['default'].assign || _ember['default'].merge;
+
+ exports['default'] = Mixin.create({
+ // TODO remove on 2.0 release
+ _storageKey: null,
+ // TODO remove on 2.0 release
+ initialContent: null,
+ _initialContent: null,
+ _initialContentString: null,
+ _isInitialContent: true,
+ // we need it for storage event testing
+ _testing: false,
+
+ // Shorthand for the storage
+ _storage: function _storage() {
+ return (0, _emberLocalStorageHelpersStorage.getStorage)(get(this, '_storageType'));
+ },
+
+ init: function init() {
+ var storage = this._storage();
+
+ var serialized = undefined,
+ content = undefined,
+ storageKey = get(this, '_storageKey'),
+ initialContent = get(this, '_initialContent');
+
+ // TODO remove on 2.0 release and make storageKey a const
+ if (get(this, 'storageKey')) {
+ storageKey = get(this, 'storageKey');
+ deprecate('Usage of storageKey is deprecated use the generator instead: ember g storage -h');
+ }
+
+ // TODO remove on 2.0 release and make initialContent a const
+ if (get(this, 'initialContent')) {
+ initialContent = get(this, 'initialContent');
+ deprecate('Usage of initialContent is deprecated use the generator instead: ember g storage -h');
+ }
+
+ // TODO remove on 2.0 release
+ if (!initialContent) {
+ throw new Error('You must specify the initialContent.');
+ }
+
+ set(this, '_initialContentString', JSON.stringify(initialContent));
+
+ // Retrieve the serialized version from storage..
+ serialized = storage[storageKey];
+
+ // Merge the serialized version into defaults.
+ content = this._getInitialContentCopy();
+
+ if (serialized) {
+ assign(content, JSON.parse(serialized));
+ }
+
+ // Do not change to set(this, 'content', content)
+ this.set('content', content);
+
+ // Keep in sync with other windows
+ this._addStorageListener();
+
+ return this._super.apply(this, arguments);
+ },
+
+ _getInitialContentCopy: function _getInitialContentCopy() {
+ var initialContent = get(this, '_initialContent'),
+ content = copy(initialContent, true);
+
+ // Ember.copy returns a normal array when prototype extensions are off
+ // This ensures that we wrap it in an Ember Array.
+ return isArray(content) ? _ember['default'].A(content) : content;
+ },
+
+ _addStorageListener: function _addStorageListener() {
+ var _this = this;
+
+ var storage = this._storage(),
+ storageKey = get(this, '_storageKey');
+
+ if (window.addEventListener) {
+ window.addEventListener('storage', function (event) {
+ if (event.storageArea === storage && event.key === storageKey) {
+ if ('hidden' in document && !document.hidden && !_this._testing || event.newValue === event.oldValue || event.newValue === JSON.stringify(_this.get('content'))) {
+ return;
+ }
+
+ if (event.newValue) {
+ _this.set('content', JSON.parse(event.newValue));
+ } else {
+ _this.clear();
+ }
+ }
+ }, false);
+ }
+ },
+
+ _save: function _save() {
+ var storage = this._storage(),
+ content = get(this, 'content'),
+ storageKey = get(this, '_storageKey'),
+ initialContentString = get(this, '_initialContentString');
+
+ if (storageKey) {
+ var json = JSON.stringify(content);
+
+ if (json !== initialContentString) {
+ set(this, '_isInitialContent', false);
+ }
+
+ storage[storageKey] = json;
+ }
+ },
+
+ // Public API
+
+ // returns boolean
+ isInitialContent: function isInitialContent() {
+ return get(this, '_isInitialContent');
+ },
+
+ // reset the content
+ // returns void
+ reset: function reset() {
+ var content = this._getInitialContentCopy();
+
+ // Do not change to set(this, 'content', content)
+ this.set('content', content);
+ set(this, '_isInitialContent', true);
+ },
+
+ // clear the content
+ // returns void
+ clear: function clear() {
+ this._clear();
+ delete this._storage()[get(this, '_storageKey')];
+ }
+ });
+});
+define('ember-local-storage/serializers/serializer', ['exports', 'ember-data'], function (exports, _emberData) {
+ 'use strict';
+
+ var JSONAPISerializer = _emberData['default'].JSONAPISerializer;
+
+ exports['default'] = JSONAPISerializer.extend({
+ // Serialization behavior
+ _shouldSerializeHasMany: function _shouldSerializeHasMany() {
+ return true;
+ }
+ });
+});
+define('ember-local-storage/session/array', ['exports', 'ember', 'ember-local-storage/mixins/array'], function (exports, _ember, _emberLocalStorageMixinsArray) {
+ 'use strict';
+
+ exports['default'] = _ember['default'].ArrayProxy.extend(_emberLocalStorageMixinsArray['default'], {
+ _storageType: 'session'
+ });
+});
+define('ember-local-storage/session/object', ['exports', 'ember', 'ember-local-storage/mixins/object'], function (exports, _ember, _emberLocalStorageMixinsObject) {
+ 'use strict';
+
+ exports['default'] = _ember['default'].ObjectProxy.extend(_emberLocalStorageMixinsObject['default'], {
+ _storageType: 'session'
+ });
+});
+define('ember-modal-dialog/components/modal-dialog-overlay', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports['default'] = _ember['default'].Component.extend({
+ attributeBindings: ['data-ember-modal-dialog-overlay'],
+ 'data-ember-modal-dialog-overlay': true,
+
+ // trigger only when clicking the overlay itself, not its children
+ click: function click(event) {
+ if (event.target === this.get('element')) {
+ this.sendAction();
+ }
+ }
+ });
+});
+define('ember-modal-dialog/components/modal-dialog', ['exports', 'ember', 'ember-modal-dialog/templates/components/modal-dialog'], function (exports, _ember, _emberModalDialogTemplatesComponentsModalDialog) {
+ 'use strict';
+
+ var dasherize = _ember['default'].String.dasherize;
+ var $ = _ember['default'].$;
+ var computed = _ember['default'].computed;
+ var inject = _ember['default'].inject;
+ var oneWay = computed.oneWay;
+
+ var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);
+ var computedJoin = function computedJoin(prop) {
+ return computed(prop, function () {
+ return this.get(prop).join(' ');
+ });
+ };
+
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: '',
+ layout: _emberModalDialogTemplatesComponentsModalDialog['default'],
+ modalService: inject.service('modal-dialog'),
+ destinationElementId: oneWay('modalService.destinationElementId'),
+
+ // container-class - set this from templates
+ containerClassNames: ['ember-modal-dialog'], // set this in a subclass definition
+ containerClassNamesString: computedJoin('containerClassNames'),
+
+ // 'overlay-class - set this from templates
+ overlayClassNames: ['ember-modal-overlay'], // set this in a subclass definition
+ overlayClassNamesString: computedJoin('overlayClassNames'),
+
+ // 'wrapper-class - set this from templates
+ wrapperClassNames: ['ember-modal-wrapper'], // set this in a subclass definition
+ wrapperClassNamesString: computedJoin('wrapperClassNames'),
+
+ concatenatedProperties: ['containerClassNames', 'overlayClassNames', 'wrapperClassNames'],
+
+ targetAttachmentClass: computed('targetAttachment', function () {
+ var targetAttachment = this.get('targetAttachment') || '';
+ // Convert tether-styled values like 'middle right' to 'right'
+ targetAttachment = targetAttachment.split(' ').slice(-1)[0];
+ return 'ember-modal-dialog-target-attachment-' + dasherize(targetAttachment);
+ }),
+
+ target: 'body', // element, css selector, or view instance
+ targetAttachment: 'middle center',
+
+ translucentOverlay: false,
+ clickOutsideToClose: false,
+ renderInPlace: false,
+
+ makeOverlayClickableOnIOS: _ember['default'].on('didInsertElement', function () {
+ if (isIOS) {
+ _ember['default'].$('div[data-ember-modal-dialog-overlay]').css('cursor', 'pointer');
+ }
+ }),
+
+ didInsertElement: function didInsertElement() {
+ var _this = this;
+
+ if (!this.get('clickOutsideToClose')) {
+ return;
+ }
+
+ var handleClick = function handleClick(event) {
+ if (!$(event.target).closest('.ember-modal-dialog').length) {
+ _this.send('close');
+ }
+ };
+ var registerClick = function registerClick() {
+ return $(document).on('click.ember-modal-dialog', handleClick);
+ };
+
+ // setTimeout needed or else the click handler will catch the click that spawned this modal dialog
+ setTimeout(registerClick);
+ this._super.apply(this, arguments);
+ },
+ willDestroyElement: function willDestroyElement() {
+ $(document).off('click.ember-modal-dialog');
+ this._super.apply(this, arguments);
+ },
+
+ actions: {
+ close: function close() {
+ this.sendAction('close');
+ }
+ }
+ });
+});
+define('ember-modal-dialog/components/positioned-container', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ var computed = _ember['default'].computed;
+ var observer = _ember['default'].observer;
+ var on = _ember['default'].on;
+ var capitalize = _ember['default'].String.capitalize;
+
+ var SUPPORTED_TARGET_ATTACHMENTS = ['top', 'right', 'bottom', 'left', 'center', 'none'];
+
+ exports['default'] = _ember['default'].Component.extend({
+
+ // target - element selector, element, or Ember View
+ // targetAttachment - top, right, bottom, left, center, or none
+ // left, right, top, bottom (relative to target)
+ // center (relative to container)
+ targetAttachment: 'center',
+
+ isPositioned: computed('targetAttachment', 'target', 'renderInPlace', function () {
+ if (this.get('renderInPlace')) {
+ return false;
+ }
+ if (this.get('target') && this.get('targetAttachment')) {
+ return true;
+ }
+ var targetAttachment = this.get('targetAttachment');
+ return targetAttachment === 'center' || targetAttachment === 'middle center';
+ }),
+
+ didGetPositioned: observer('isPositioned', on('didInsertElement', function () {
+ if (this._state !== 'inDOM') {
+ return;
+ }
+
+ if (this.get('isPositioned')) {
+ this.updateTargetAttachment();
+ } else {
+ this.$().css('left', '').css('top', '');
+ }
+ })),
+
+ getWrappedTargetAttachmentElement: function getWrappedTargetAttachmentElement() {
+ var target = this.get('target');
+ if (!target) {
+ return null;
+ }
+
+ if (_ember['default'].typeOf(target) === 'string') {
+ var targetSelector = target;
+ var wrappedElement = _ember['default'].$(targetSelector).eq(0);
+ _ember['default'].assert('No element found for modal-dialog\'s target selector \'' + targetSelector + '\'.', wrappedElement);
+ return wrappedElement;
+ }
+
+ // passed an ember view or component
+ if (target.element) {
+ return _ember['default'].$(target.element);
+ }
+
+ // passed an element directly
+ return _ember['default'].$(target);
+ },
+
+ updateTargetAttachment: function updateTargetAttachment() {
+ var targetAttachment = this.get('targetAttachment');
+ // Convert tether-styled values like 'middle right' to 'right'
+ targetAttachment = targetAttachment.split(' ').slice(-1)[0];
+ _ember['default'].assert('Positioned container supports targetAttachments of ' + SUPPORTED_TARGET_ATTACHMENTS.join(', '), SUPPORTED_TARGET_ATTACHMENTS.indexOf(targetAttachment) > -1);
+ var targetAttachmentMethod = 'align' + capitalize(targetAttachment);
+ var targetAttachmentElement = this.getWrappedTargetAttachmentElement();
+
+ this[targetAttachmentMethod](targetAttachmentElement);
+ },
+
+ alignCenter: function alignCenter() {
+ var elementWidth = this.$().outerWidth();
+ var elementHeight = this.$().outerHeight();
+
+ this.$().css('left', '50%').css('top', '50%').css('margin-left', elementWidth * -0.5).css('margin-top', elementHeight * -0.5);
+ },
+
+ alignLeft: function alignLeft(targetAttachmentElement) {
+ _ember['default'].assert('Left targetAttachment requires a target', targetAttachmentElement.length > 0);
+
+ var elementWidth = this.$().outerWidth();
+ var originOffset = targetAttachmentElement.offset();
+ var originOffsetTop = originOffset.top - _ember['default'].$(window).scrollTop();
+
+ this.$().css('left', originOffset.left - elementWidth).css('top', originOffsetTop);
+ },
+
+ alignRight: function alignRight(targetAttachmentElement) {
+ _ember['default'].assert('Right targetAttachment requires a target', targetAttachmentElement.length > 0);
+
+ var targetWidth = targetAttachmentElement.outerWidth();
+ var originOffset = targetAttachmentElement.offset();
+ var originOffsetTop = originOffset.top - _ember['default'].$(window).scrollTop();
+
+ this.$().css('left', originOffset.left + targetWidth).css('top', originOffsetTop);
+ },
+
+ alignTop: function alignTop(targetAttachmentElement) {
+ _ember['default'].assert('Top targetAttachment requires a target', targetAttachmentElement.length > 0);
+
+ var elementWidth = this.$().outerWidth();
+ var elementHeight = this.$().outerHeight();
+ var originOffset = targetAttachmentElement.offset();
+ var originOffsetTop = originOffset.top - _ember['default'].$(window).scrollTop();
+ var targetWidth = targetAttachmentElement.outerWidth();
+
+ this.$().css('left', originOffset.left + targetWidth / 2 - elementWidth / 2).css('top', originOffsetTop - elementHeight);
+ },
+
+ alignBottom: function alignBottom(targetAttachmentElement) {
+ _ember['default'].assert('Bottom targetAttachment requires a target', targetAttachmentElement.length > 0);
+
+ var elementWidth = this.$().outerWidth();
+ var originOffset = targetAttachmentElement.offset();
+ var originOffsetTop = originOffset.top - _ember['default'].$(window).scrollTop();
+ var targetWidth = targetAttachmentElement.outerWidth();
+ var targetHeight = targetAttachmentElement.outerHeight();
+
+ this.$().css('left', originOffset.left + targetWidth / 2 - elementWidth / 2).css('top', originOffsetTop + targetHeight);
+ },
+
+ alignNone: function alignNone() {}
+ });
+});
+define('ember-modal-dialog/components/tether-dialog', ['exports', 'ember', 'ember-modal-dialog/components/modal-dialog', 'ember-modal-dialog/templates/components/tether-dialog'], function (exports, _ember, _emberModalDialogComponentsModalDialog, _emberModalDialogTemplatesComponentsTetherDialog) {
+ 'use strict';
+
+ var dasherize = _ember['default'].String.dasherize;
+ var computed = _ember['default'].computed;
+ var get = _ember['default'].get;
+
+ var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);
+
+ exports['default'] = _emberModalDialogComponentsModalDialog['default'].extend({
+ layout: _emberModalDialogTemplatesComponentsTetherDialog['default'],
+
+ targetAttachmentClass: computed('targetAttachment', function () {
+ var targetAttachment = this.get('targetAttachment') || '';
+ return 'ember-modal-dialog-target-attachment-' + dasherize(targetAttachment);
+ }),
+
+ targetAttachment: 'middle center',
+ attachment: 'middle center',
+ hasOverlay: true,
+ target: 'viewport', // element, css selector, view instance, 'viewport', or 'scroll-handle'
+
+ tetherClassPrefix: 'ember-tether',
+ // offset - passed in
+ // targetOffset - passed in
+ // targetModifier - passed in
+
+ makeOverlayClickableOnIOS: _ember['default'].on('didInsertElement', function () {
+ if (isIOS && get(this, 'hasOverlay')) {
+ _ember['default'].$('div[data-ember-modal-dialog-overlay]').css('cursor', 'pointer');
+ }
+ })
+
+ });
+});
+define('ember-modal-dialog/initializers/add-modals-container', ['exports'], function (exports) {
+ /*globals document */
+ 'use strict';
+
+ var hasDOM = typeof document !== 'undefined';
+
+ function appendContainerElement(rootElementId, id) {
+ if (!hasDOM) {
+ return;
+ }
+
+ if (document.getElementById(id)) {
+ return;
+ }
+
+ var rootEl = document.querySelector(rootElementId);
+ var modalContainerEl = document.createElement('div');
+ modalContainerEl.id = id;
+ rootEl.appendChild(modalContainerEl);
+ }
+
+ exports['default'] = function () {
+ var application = arguments[1] || arguments[0];
+ var emberModalDialog = application.emberModalDialog || {};
+ var modalContainerElId = emberModalDialog.modalRootElementId || 'modal-overlays';
+
+ application.register('config:modals-container-id', modalContainerElId, { instantiate: false });
+
+ application.inject('service:modal-dialog', 'destinationElementId', 'config:modals-container-id');
+
+ appendContainerElement(application.rootElement, modalContainerElId);
+ };
+});
+define('ember-modal-dialog/services/modal-dialog', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports['default'] = _ember['default'].Service.extend({
+ // destinationElementId - injected
+ });
+});
+define("ember-modal-dialog/templates/components/modal-dialog", ["exports"], function (exports) {
+ "use strict";
+
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 7,
+ "column": 6
+ },
+ "end": {
+ "line": 12,
+ "column": 6
+ }
+ },
+ "moduleName": "modules/ember-modal-dialog/templates/components/modal-dialog.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [11, 8], [11, 17]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 4
+ },
+ "end": {
+ "line": 13,
+ "column": 4
+ }
+ },
+ "moduleName": "modules/ember-modal-dialog/templates/components/modal-dialog.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "ember-modal-dialog-positioned-container", [], ["targetAttachment", ["subexpr", "@mut", [["get", "targetAttachment", ["loc", [null, [8, 27], [8, 43]]]]], [], []], "target", ["subexpr", "@mut", [["get", "target", ["loc", [null, [9, 17], [9, 23]]]]], [], []], "class", ["subexpr", "concat", [["subexpr", "if", [["get", "containerClassNamesString", []], ["subexpr", "-normalize-class", ["containerClassNamesString", ["get", "containerClassNamesString", []]], [], []]], [], []], " ", ["subexpr", "if", [["get", "targetAttachmentClass", []], ["subexpr", "-normalize-class", ["targetAttachmentClass", ["get", "targetAttachmentClass", []]], [], []]], [], []], " ", ["subexpr", "if", [["get", "container-class", []], ["subexpr", "-normalize-class", ["container-class", ["get", "container-class", []]], [], []]], [], []], " "], [], []]], 0, null, ["loc", [null, [7, 6], [12, 50]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "triple-curlies"
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 15,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-modal-dialog/templates/components/modal-dialog.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createAttrMorph(element0, 'class');
+ morphs[1] = dom.createMorphAt(element0, 1, 1);
+ return morphs;
+ },
+ statements: [["attribute", "class", ["concat", [["get", "wrapperClassNamesString", ["loc", [null, [2, 16], [2, 39]]]], " ", ["get", "wrapper-class", ["loc", [null, [2, 44], [2, 57]]]]]]], ["block", "modal-dialog-overlay", [], ["action", "close", "class", ["subexpr", "concat", [["subexpr", "if", [["get", "overlayClassNamesString", []], ["subexpr", "-normalize-class", ["overlayClassNamesString", ["get", "overlayClassNamesString", []]], [], []]], [], []], " ", ["subexpr", "if", [["get", "translucentOverlay", []], "translucent"], [], []], " ", ["subexpr", "if", [["get", "overlay-class", []], ["subexpr", "-normalize-class", ["overlay-class", ["get", "overlay-class", []]], [], []]], [], []], " "], [], []]], 0, null, ["loc", [null, [3, 4], [13, 29]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 16,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-modal-dialog/templates/components/modal-dialog.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "ember-wormhole", [], ["to", ["subexpr", "@mut", [["get", "destinationElementId", ["loc", [null, [1, 21], [1, 41]]]]], [], []], "renderInPlace", ["subexpr", "@mut", [["get", "renderInPlace", ["loc", [null, [1, 56], [1, 69]]]]], [], []]], 0, null, ["loc", [null, [1, 0], [15, 19]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-modal-dialog/templates/components/tether-dialog", ["exports"], function (exports) {
+ "use strict";
+
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 7,
+ "column": 2
+ }
+ },
+ "moduleName": "modules/ember-modal-dialog/templates/components/tether-dialog.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "modal-dialog-overlay", [], ["action", "close", "class", ["subexpr", "concat", [["subexpr", "if", [["get", "overlayClassNamesString", []], ["subexpr", "-normalize-class", ["overlayClassNamesString", ["get", "overlayClassNamesString", []]], [], []]], [], []], " ", ["subexpr", "if", [["get", "translucentOverlay", []], "translucent"], [], []], " ", ["subexpr", "if", [["get", "overlay-class", []], ["subexpr", "-normalize-class", ["overlay-class", ["get", "overlay-class", []]], [], []]], [], []], " "], [], []]], ["loc", [null, [3, 4], [6, 6]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 8,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-modal-dialog/templates/components/tether-dialog.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "hasOverlay", ["loc", [null, [2, 8], [2, 18]]]]], [], 0, null, ["loc", [null, [2, 2], [7, 9]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 10,
+ "column": 2
+ },
+ "end": {
+ "line": 16,
+ "column": 2
+ }
+ },
+ "moduleName": "modules/ember-modal-dialog/templates/components/tether-dialog.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [15, 4], [15, 13]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 9,
+ "column": 0
+ },
+ "end": {
+ "line": 17,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-modal-dialog/templates/components/tether-dialog.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "ember-modal-dialog-positioned-container", [], ["targetAttachment", ["subexpr", "@mut", [["get", "targetAttachment", ["loc", [null, [11, 23], [11, 39]]]]], [], []], "target", ["subexpr", "@mut", [["get", "target", ["loc", [null, [12, 13], [12, 19]]]]], [], []], "renderInPlace", ["subexpr", "@mut", [["get", "renderInPlace", ["loc", [null, [13, 20], [13, 33]]]]], [], []], "class", ["subexpr", "concat", [["subexpr", "if", [["get", "containerClassNamesString", []], ["subexpr", "-normalize-class", ["containerClassNamesString", ["get", "containerClassNamesString", []]], [], []]], [], []], " ", ["subexpr", "if", [["get", "targetAttachmentClass", []], ["subexpr", "-normalize-class", ["targetAttachmentClass", ["get", "targetAttachmentClass", []]], [], []]], [], []], " ", ["subexpr", "if", [["get", "container-class", []], ["subexpr", "-normalize-class", ["container-class", ["get", "container-class", []]], [], []]], [], []], " "], [], []]], 0, null, ["loc", [null, [10, 2], [16, 46]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child2 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 18,
+ "column": 2
+ },
+ "end": {
+ "line": 29,
+ "column": 2
+ }
+ },
+ "moduleName": "modules/ember-modal-dialog/templates/components/tether-dialog.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [28, 4], [28, 13]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 17,
+ "column": 0
+ },
+ "end": {
+ "line": 30,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-modal-dialog/templates/components/tether-dialog.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "ember-tether", [], ["target", ["subexpr", "@mut", [["get", "target", ["loc", [null, [19, 13], [19, 19]]]]], [], []], "attachment", ["subexpr", "@mut", [["get", "attachment", ["loc", [null, [20, 17], [20, 27]]]]], [], []], "targetAttachment", ["subexpr", "@mut", [["get", "targetAttachment", ["loc", [null, [21, 23], [21, 39]]]]], [], []], "targetModifier", ["subexpr", "@mut", [["get", "targetModifier", ["loc", [null, [22, 21], [22, 35]]]]], [], []], "classPrefix", ["subexpr", "@mut", [["get", "tetherClassPrefix", ["loc", [null, [23, 18], [23, 35]]]]], [], []], "offset", ["subexpr", "@mut", [["get", "offset", ["loc", [null, [24, 13], [24, 19]]]]], [], []], "targetOffset", ["subexpr", "@mut", [["get", "targetOffset", ["loc", [null, [25, 19], [25, 31]]]]], [], []], "constraints", ["subexpr", "@mut", [["get", "constraints", ["loc", [null, [26, 18], [26, 29]]]]], [], []], "class", ["subexpr", "concat", [["subexpr", "if", [["get", "containerClassNamesString", []], ["subexpr", "-normalize-class", ["containerClassNamesString", ["get", "containerClassNamesString", []]], [], []]], [], []], " ", ["subexpr", "if", [["get", "container-class", []], ["subexpr", "-normalize-class", ["container-class", ["get", "container-class", []]], [], []]], [], []], " "], [], []]], 0, null, ["loc", [null, [18, 2], [29, 19]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 31,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-modal-dialog/templates/components/tether-dialog.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "ember-wormhole", [], ["to", ["subexpr", "@mut", [["get", "destinationElementId", ["loc", [null, [1, 21], [1, 41]]]]], [], []], "renderInPlace", ["subexpr", "@mut", [["get", "renderInPlace", ["loc", [null, [1, 56], [1, 69]]]]], [], []]], 0, null, ["loc", [null, [1, 0], [8, 19]]]], ["block", "if", [["get", "renderInPlace", ["loc", [null, [9, 6], [9, 19]]]]], [], 1, 2, ["loc", [null, [9, 0], [30, 7]]]]],
+ locals: [],
+ templates: [child0, child1, child2]
+ };
+ })());
+});
+define('ember-power-select/components/power-select', ['exports', 'ember', 'ember-power-select/templates/components/power-select', 'ember-power-select/utils/group-utils'], function (exports, _ember, _emberPowerSelectTemplatesComponentsPowerSelect, _emberPowerSelectUtilsGroupUtils) {
+ 'use strict';
+
+ var computed = _ember['default'].computed;
+
+ function fallbackIfUndefined(fallback) {
+ return computed({
+ get: function get() {
+ return fallback;
+ },
+ set: function set(_, v) {
+ return v === undefined ? fallback : v;
+ }
+ });
+ }
+
+ exports['default'] = _ember['default'].Component.extend({
+ layout: _emberPowerSelectTemplatesComponentsPowerSelect['default'],
+
+ // Universal config
+ tagName: fallbackIfUndefined(''),
+ disabled: fallbackIfUndefined(false),
+ placeholder: fallbackIfUndefined(null),
+ loadingMessage: fallbackIfUndefined('Loading options...'),
+ noMatchesMessage: fallbackIfUndefined('No results found'),
+ optionsComponent: fallbackIfUndefined('power-select/options'),
+ afterOptionsComponent: fallbackIfUndefined(null),
+ dropdownPosition: fallbackIfUndefined('auto'),
+ matcher: fallbackIfUndefined(_emberPowerSelectUtilsGroupUtils.defaultMatcher),
+ searchField: fallbackIfUndefined(null),
+ search: fallbackIfUndefined(null),
+ closeOnSelect: fallbackIfUndefined(true),
+ dropdownClass: fallbackIfUndefined(null),
+ triggerClass: fallbackIfUndefined(null),
+ dir: fallbackIfUndefined(null),
+ opened: fallbackIfUndefined(false),
+
+ // Select single config
+ searchEnabled: fallbackIfUndefined(true),
+ searchMessage: fallbackIfUndefined("Type to search"),
+ searchPlaceholder: fallbackIfUndefined(null),
+ allowClear: fallbackIfUndefined(false),
+
+ // Lifecycle hooks
+ didInitAttrs: function didInitAttrs() {
+ this._super.apply(this, arguments);
+ _ember['default'].assert('{{power-select}} requires an `onchange` function', this.get('onchange') && typeof this.get('onchange') === 'function');
+ },
+
+ // CPs
+ concreteComponentName: _ember['default'].computed('multiple', function () {
+ return 'power-select/' + (this.get('multiple') ? 'multiple' : 'single');
+ }),
+
+ selectedComponentOrDefault: _ember['default'].computed('multiple', 'selectedComponent', function () {
+ var givenComponent = this.get('selectedComponent');
+ if (givenComponent) {
+ return givenComponent;
+ }
+ return 'power-select/' + (this.get('multiple') ? 'multiple' : 'single') + '/selected';
+ }),
+
+ beforeOptionsComponentOrDefault: _ember['default'].computed('multiple', 'beforeOptionsComponent', function () {
+ var givenComponent = this.get('beforeOptionsComponent');
+ if (givenComponent) {
+ return givenComponent;
+ }
+ return this.get('multiple') ? null : 'power-select/before-options';
+ })
+ });
+});
+define('ember-power-select/components/power-select/base', ['exports', 'ember', 'ember-power-select/utils/group-utils'], function (exports, _ember, _emberPowerSelectUtilsGroupUtils) {
+ 'use strict';
+
+ var RSVP = _ember['default'].RSVP;
+ var computed = _ember['default'].computed;
+ var run = _ember['default'].run;
+ var get = _ember['default'].get;
+ var isBlank = _ember['default'].isBlank;
+
+ var Promise = RSVP.Promise;
+ var PromiseArray = _ember['default'].ArrayProxy.extend(_ember['default'].PromiseProxyMixin);
+
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: '',
+ searchText: '',
+ searchReturnedUndefined: false,
+ activeSearch: null,
+ attributeBindings: ['dir'],
+
+ init: function init() {
+ this._super.apply(this, arguments);
+ var randomUUID = Math.random().toString().slice(-10);
+ this.triggerUniqueClass = 'ember-power-select-trigger-' + randomUUID;
+ this.dropdownUniqueClass = 'ember-power-select-dropdown-' + randomUUID;
+ },
+
+ // CPs
+ concatenatedTriggerClasses: computed('class', function () {
+ var classes = ['ember-power-select-trigger', this.triggerUniqueClass];
+ if (this.get('triggerClass')) {
+ classes.push(this.get('triggerClass'));
+ }
+ if (this.get('class')) {
+ classes.push(this.get('class') + '-trigger');
+ }
+ return classes.join(' ');
+ }),
+
+ concatenatedDropdownClasses: computed('class', function () {
+ var classes = ['ember-power-select-dropdown', this.dropdownUniqueClass];
+ if (this.get('dropdownClass')) {
+ classes.push(this.get('dropdownClass'));
+ }
+ if (this.get('class')) {
+ classes.push(this.get('class') + '-dropdown');
+ }
+ return classes.join(' ');
+ }),
+
+ mustShowSearchMessage: computed('searchText', 'search', 'searchMessage', 'results.length', function () {
+ return this.get('searchText.length') === 0 && !!this.get('search') && !!this.get('searchMessage') && this.get('results.length') === 0;
+ }),
+
+ mustShowNoMessages: computed('results.{isFulfilled,length}', function () {
+ return this.get('results.isFulfilled') && this.get('results.length') === 0;
+ }),
+
+ results: computed('options.[]', 'searchText', function () {
+ var _this = this;
+
+ var _getProperties = this.getProperties('options', 'searchText', 'previousResults');
+
+ var options = _getProperties.options;
+ var searchText = _getProperties.searchText;
+ var _getProperties$previousResults = _getProperties.previousResults;
+ var previousResults = _getProperties$previousResults === undefined ? _ember['default'].A() : _getProperties$previousResults;
+ // jshint ignore:line
+ var promise = undefined;
+ if (isBlank(searchText) || this.searchReturnedUndefined) {
+ promise = Promise.resolve(options).then(function (opts) {
+ return _ember['default'].A(opts);
+ });
+ } else if (this.get('search')) {
+ var result = this.get('search')(searchText);
+ if (!result) {
+ promise = Promise.resolve(previousResults);
+ this.searchReturnedUndefined = true;
+ } else {
+ (function () {
+ _this.searchReturnedUndefined = false;
+ var search = _this.activeSearch = Promise.resolve(result);
+ promise = search.then(function (opts) {
+ return search !== _this.activeSearch ? previousResults : _ember['default'].A(opts);
+ });
+ })();
+ }
+ } else {
+ promise = Promise.resolve(options).then(function (opts) {
+ return _this.filter(_ember['default'].A(opts), _this.get('searchText'));
+ });
+ }
+ promise.then(function (opts) {
+ return _this.setProperties({ currentlyHighlighted: undefined, previousResults: opts });
+ });
+ return PromiseArray.create({ promise: promise, content: previousResults });
+ }),
+
+ highlighted: computed('results.[]', 'currentlyHighlighted', 'selected', function () {
+ return this.get('currentlyHighlighted') || this.defaultHighlighted();
+ }),
+
+ resultsLength: computed('results.[]', function () {
+ return (0, _emberPowerSelectUtilsGroupUtils.countOptions)(this.get('results'));
+ }),
+
+ // Actions
+ actions: {
+ open: function open(dropdown, e) {
+ dropdown.actions.open(e);
+ },
+
+ close: function close(dropdown, e) {
+ dropdown.actions.close(e);
+ },
+
+ highlight: function highlight(dropdown, option) {
+ this._doHighlight(option);
+ },
+
+ search: function search(dropdown, term /*, e */) {
+ this._doSearch(term);
+ },
+
+ removeOption: function removeOption(dropdown, option, e) {
+ e.stopPropagation();
+ this.removeOption(dropdown, option, e);
+ },
+
+ handleKeydown: function handleKeydown(dropdown, e) {
+ if (e.defaultPrevented) {
+ return;
+ }
+ if (e.keyCode === 38 || e.keyCode === 40) {
+ // Up & Down
+ if (dropdown.isOpen) {
+ this.handleVerticalArrowKey(e);
+ } else {
+ dropdown.actions.open(e);
+ }
+ } else if (e.keyCode === 9) {
+ // Tab
+ dropdown.actions.close(e);
+ } else if (e.keyCode === 27) {
+ // ESC
+ dropdown.actions.close(e);
+ }
+ },
+
+ // It is not evident what is going on here, so I'll explain why.
+ //
+ // As of this writting, Ember doesn allow to yield data to the "inverse" block.
+ // Because of that, elements of this component rendered in the trigger can't receive the
+ // yielded object contaning the public API of the ember-basic-dropdown, with actions for open,
+ // close and toggle.
+ //
+ // The only possible workaround for this is to on initialization inject a similar object
+ // to the one yielded and store it to make it available in the entire component.
+ //
+ // This this limitation on ember should be fixed soon, this is temporary. Because of that this
+ // object will be passed to the action from the inverse block like if it was yielded.
+ //
+ registerDropdown: function registerDropdown(dropdown) {
+ this.set('registeredDropdown', dropdown);
+ }
+ },
+
+ // Methods
+
+ handleOpen: function handleOpen(dropdown, e) {
+ var action = this.get('onopen');
+ if (action) {
+ action(this.buildPublicAPI(dropdown), e);
+ }
+ run.scheduleOnce('afterRender', this, this.focusSearch, e);
+ run.scheduleOnce('afterRender', this, this.scrollIfHighlightedIsOutOfViewport);
+ },
+
+ handleClose: function handleClose(dropdown, e) {
+ var action = this.get('onclose');
+ if (action) {
+ action(this.buildPublicAPI(dropdown), e);
+ }
+ this._doSearch('');
+ this._doHighlight(null);
+ },
+
+ handleVerticalArrowKey: function handleVerticalArrowKey(e) {
+ e.preventDefault();
+ var newHighlighted = this.advanceSelectableOption(this.get('highlighted'), e.keyCode === 40 ? 1 : -1);
+ this._doHighlight(newHighlighted);
+ run.scheduleOnce('afterRender', this, this.scrollIfHighlightedIsOutOfViewport);
+ },
+
+ scrollIfHighlightedIsOutOfViewport: function scrollIfHighlightedIsOutOfViewport() {
+ var optionsList = document.querySelector('.ember-power-select-options');
+ if (!optionsList) {
+ return;
+ }
+ var highlightedOption = optionsList.querySelector('.ember-power-select-option--highlighted');
+ if (!highlightedOption) {
+ return;
+ }
+ var optionTopScroll = highlightedOption.offsetTop - optionsList.offsetTop;
+ var optionBottomScroll = optionTopScroll + highlightedOption.offsetHeight;
+ if (optionBottomScroll > optionsList.offsetHeight + optionsList.scrollTop) {
+ optionsList.scrollTop = optionBottomScroll - optionsList.offsetHeight;
+ } else if (optionTopScroll < optionsList.scrollTop) {
+ optionsList.scrollTop = optionTopScroll;
+ }
+ },
+
+ indexOfOption: function indexOfOption(option) {
+ return (0, _emberPowerSelectUtilsGroupUtils.indexOfOption)(this.get('results'), option);
+ },
+
+ optionAtIndex: function optionAtIndex(index) {
+ return (0, _emberPowerSelectUtilsGroupUtils.optionAtIndex)(this.get('results'), index);
+ },
+
+ advanceSelectableOption: function advanceSelectableOption(activeHighlighted, step) {
+ var resultsLength = this.get('resultsLength');
+ var startIndex = Math.min(Math.max(this.indexOfOption(activeHighlighted) + step, 0), resultsLength - 1);
+ var nextOption = this.optionAtIndex(startIndex);
+ while (nextOption && get(nextOption, 'disabled')) {
+ nextOption = this.optionAtIndex(startIndex += step);
+ }
+ return nextOption;
+ },
+
+ filter: function filter(options, searchText) {
+ var _this2 = this;
+
+ var matcher = undefined;
+ if (this.get('searchField')) {
+ matcher = function (option, text) {
+ return _this2.matcher(get(option, _this2.get('searchField')), text);
+ };
+ } else {
+ matcher = function (option, text) {
+ return _this2.matcher(option, text);
+ };
+ }
+ return (0, _emberPowerSelectUtilsGroupUtils.filterOptions)(options || [], searchText, matcher);
+ },
+
+ _doSearch: function _doSearch(term) {
+ this.set('searchText', term);
+ },
+
+ _doHighlight: function _doHighlight(option) {
+ if (option && get(option, 'disabled')) {
+ return;
+ }
+ this.set('currentlyHighlighted', option);
+ },
+
+ buildPublicAPI: function buildPublicAPI(dropdown) {
+ var ownActions = { search: this._doSearch.bind(this), highlight: this._doHighlight.bind(this) };
+ return {
+ isOpen: dropdown.isOpen,
+ actions: _ember['default'].merge(ownActions, dropdown.actions)
+ };
+ }
+ });
+});
+define('ember-power-select/components/power-select/before-options', ['exports', 'ember', 'ember-power-select/templates/components/power-select/before-options'], function (exports, _ember, _emberPowerSelectTemplatesComponentsPowerSelectBeforeOptions) {
+ 'use strict';
+
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: '',
+ layout: _emberPowerSelectTemplatesComponentsPowerSelectBeforeOptions['default']
+ });
+});
+define('ember-power-select/components/power-select/multiple', ['exports', 'ember', 'ember-power-select/components/power-select/base', 'ember-power-select/templates/components/power-select/main'], function (exports, _ember, _emberPowerSelectComponentsPowerSelectBase, _emberPowerSelectTemplatesComponentsPowerSelectMain) {
+ 'use strict';
+
+ var computed = _ember['default'].computed;
+ var get = _ember['default'].get;
+
+ exports['default'] = _emberPowerSelectComponentsPowerSelectBase['default'].extend({
+ layout: _emberPowerSelectTemplatesComponentsPowerSelectMain['default'],
+
+ // CPs
+ selection: computed('selected', {
+ get: function get() {
+ return _ember['default'].A(this.get('selected'));
+ },
+ set: function set(_, v) {
+ return v;
+ }
+ }),
+
+ concatenatedClasses: computed('class', function () {
+ var classes = ['ember-power-select', 'multiple'];
+ if (this.get('class')) {
+ classes.push(this.get('class'));
+ }
+ return classes.join(' ');
+ }),
+
+ // Actions
+ actions: {
+ select: function select(dropdown, option, e) {
+ e.preventDefault();
+ e.stopPropagation();
+ var newSelection = this.cloneSelection();
+ if (newSelection.indexOf(option) > -1) {
+ newSelection.removeObject(option);
+ } else {
+ newSelection.addObject(option);
+ }
+ if (this.get('closeOnSelect')) {
+ dropdown.actions.close(e);
+ }
+ this.get('onchange')(newSelection, this.buildPublicAPI(dropdown));
+ },
+
+ handleKeydown: function handleKeydown(dropdown, e) {
+ var onkeydown = this.get('onkeydown');
+ if (onkeydown) {
+ onkeydown(this.buildPublicAPI(dropdown), e);
+ }
+ if (e.defaultPrevented) {
+ return;
+ }
+ if (e.keyCode === 8) {
+ // BACKSPACE
+ this.removeLastOptionIfSearchIsEmpty(dropdown, e);
+ dropdown.actions.open(e);
+ } else if (e.keyCode === 13) {
+ e.stopPropagation();
+ if (dropdown.isOpen) {
+ var highlighted = this.get('highlighted');
+ if (highlighted && (this.get('selected') || []).indexOf(highlighted) === -1) {
+ this.send('select', dropdown, highlighted, e);
+ } else {
+ dropdown.actions.close(e);
+ }
+ } else {
+ dropdown.actions.open(e);
+ }
+ } else {
+ this._super.apply(this, arguments);
+ }
+ },
+
+ handleFocus: function handleFocus(dropdown, evt) {
+ var action = this.get('onfocus');
+ if (action) {
+ action(this.buildPublicAPI(dropdown), evt);
+ }
+ this.focusSearch();
+ }
+ },
+
+ // Methods
+ defaultHighlighted: function defaultHighlighted() {
+ return this.optionAtIndex(0);
+ },
+
+ removeLastOptionIfSearchIsEmpty: function removeLastOptionIfSearchIsEmpty(dropdown, e) {
+ if (this.get('searchText.length') !== 0) {
+ return;
+ }
+ var lastSelection = this.get('selection.lastObject');
+ if (!lastSelection) {
+ return;
+ }
+ var lastText = typeof lastSelection === 'string' ? lastSelection : get(lastSelection, this.get('searchField'));
+ this.removeOption(dropdown, lastSelection, e);
+ this.set('searchText', lastText);
+ },
+
+ removeOption: function removeOption(dropdown, option, e) {
+ var newSelection = this.cloneSelection();
+ newSelection.removeObject(option);
+ this.get('onchange')(newSelection, this.buildPublicAPI(dropdown), e);
+ },
+
+ focusSearch: function focusSearch() {
+ var el = _ember['default'].$('.' + this.get('triggerUniqueClass'))[0];
+ if (el) {
+ el.querySelector('.ember-power-select-trigger-multiple-input').focus();
+ }
+ },
+
+ cloneSelection: function cloneSelection() {
+ return _ember['default'].A((this.get('selection') || []).slice(0));
+ }
+ });
+});
+define('ember-power-select/components/power-select/multiple/selected', ['exports', 'ember', 'ember-power-select/templates/components/power-select/multiple/selected'], function (exports, _ember, _emberPowerSelectTemplatesComponentsPowerSelectMultipleSelected) {
+ 'use strict';
+
+ var computed = _ember['default'].computed;
+ var htmlSafe = _ember['default'].String.htmlSafe;
+
+ exports['default'] = _ember['default'].Component.extend({
+ layout: _emberPowerSelectTemplatesComponentsPowerSelectMultipleSelected['default'],
+ tagName: '',
+
+ // CPs
+ triggerMultipleInputStyle: computed('searchText.length', 'selection.length', function () {
+ if (this.get('selection.length') === 0) {
+ return htmlSafe('width: 100%;');
+ } else {
+ return htmlSafe('width: ' + ((this.get('searchText.length') || 0) * 0.5 + 2) + 'em');
+ }
+ }),
+
+ maybePlaceholder: computed('placeholder', 'selection.length', function () {
+ return this.get('selection.length') === 0 ? this.get('placeholder') || '' : '';
+ }),
+
+ actions: {
+ search: function search(term, e) {
+ var _get = this.get('select.actions');
+
+ var search = _get.search;
+ var open = _get.open;
+
+ search(term, e);
+ open(e);
+ }
+ }
+ });
+});
+define('ember-power-select/components/power-select/options', ['exports', 'ember', 'ember-power-select/templates/components/power-select/options'], function (exports, _ember, _emberPowerSelectTemplatesComponentsPowerSelectOptions) {
+ 'use strict';
+
+ // TODO: Do I really need a component? A recursive template would do ...
+ exports['default'] = _ember['default'].Component.extend({
+ layout: _emberPowerSelectTemplatesComponentsPowerSelectOptions['default'],
+ tagName: 'ul',
+ attributeBindings: ['role'],
+ role: 'listbox'
+ });
+});
+define('ember-power-select/components/power-select/single', ['exports', 'ember', 'ember-power-select/components/power-select/base', 'ember-power-select/templates/components/power-select/main'], function (exports, _ember, _emberPowerSelectComponentsPowerSelectBase, _emberPowerSelectTemplatesComponentsPowerSelectMain) {
+ 'use strict';
+
+ var computed = _ember['default'].computed;
+
+ exports['default'] = _emberPowerSelectComponentsPowerSelectBase['default'].extend({
+ layout: _emberPowerSelectTemplatesComponentsPowerSelectMain['default'],
+
+ // CPs
+ selection: computed('selected', {
+ get: function get() {
+ return this.get('selected');
+ },
+ set: function set(_, v) {
+ return v;
+ }
+ }),
+
+ concatenatedClasses: computed('class', function () {
+ var classes = ['ember-power-select'];
+ if (this.get('class')) {
+ classes.push(this.get('class'));
+ }
+ return classes.join(' ');
+ }),
+
+ // Actions
+ actions: {
+ select: function select(dropdown, option, e) {
+ e.preventDefault();
+ e.stopPropagation();
+ if (this.get('closeOnSelect')) {
+ dropdown.actions.close(e);
+ }
+ if (this.get('selection') !== option) {
+ this.get('onchange')(option, this.buildPublicAPI(dropdown));
+ }
+ },
+
+ handleKeydown: function handleKeydown(dropdown, e) {
+ var onkeydown = this.get('onkeydown');
+ if (onkeydown) {
+ onkeydown(this.buildPublicAPI(dropdown), e);
+ }
+ if (e.defaultPrevented) {
+ return;
+ }
+ if (e.keyCode === 13 && dropdown.isOpen) {
+ // Enter
+ this.send('select', dropdown, this.get('highlighted'), e);
+ } else {
+ this._super.apply(this, arguments);
+ }
+ },
+
+ handleFocus: function handleFocus(dropdown, event) {
+ var action = this.get('onfocus');
+ if (action) {
+ action(this.buildPublicAPI(dropdown), event);
+ }
+ }
+ },
+
+ // Methods
+ removeOption: function removeOption(dropdown, option, e) {
+ this.get('onchange')(null, this.buildPublicAPI(dropdown), e);
+ },
+
+ defaultHighlighted: function defaultHighlighted() {
+ var selection = this.get('selection');
+
+ if (!selection || this.indexOfOption(selection) === -1) {
+ return this.optionAtIndex(0);
+ }
+
+ return selection;
+ },
+
+ focusSearch: function focusSearch() {
+ _ember['default'].$('.ember-power-select-search input').focus();
+ }
+ });
+});
+define('ember-power-select/components/power-select/single/selected', ['exports', 'ember', 'ember-power-select/templates/components/power-select/single/selected'], function (exports, _ember, _emberPowerSelectTemplatesComponentsPowerSelectSingleSelected) {
+ 'use strict';
+
+ exports['default'] = _ember['default'].Component.extend({
+ layout: _emberPowerSelectTemplatesComponentsPowerSelectSingleSelected['default'],
+ tagName: ''
+ });
+});
+define('ember-power-select/helpers/ember-power-select-option-classes', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ var _slicedToArray = (function () {
+ function sliceIterator(arr, i) {
+ var _arr = [];var _n = true;var _d = false;var _e = undefined;try {
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
+ _arr.push(_s.value);if (i && _arr.length === i) break;
+ }
+ } catch (err) {
+ _d = true;_e = err;
+ } finally {
+ try {
+ if (!_n && _i['return']) _i['return']();
+ } finally {
+ if (_d) throw _e;
+ }
+ }return _arr;
+ }return function (arr, i) {
+ if (Array.isArray(arr)) {
+ return arr;
+ } else if (Symbol.iterator in Object(arr)) {
+ return sliceIterator(arr, i);
+ } else {
+ throw new TypeError('Invalid attempt to destructure non-iterable instance');
+ }
+ };
+ })();
+
+ exports.emberPowerSelectOptionClasses = emberPowerSelectOptionClasses;
+
+ var isArray = _ember['default'].isArray;
+ var get = _ember['default'].get;
+
+ // TODO: Make it private or scoped to the component
+
+ function emberPowerSelectOptionClasses(_ref /*, hash*/) {
+ var _ref2 = _slicedToArray(_ref, 3);
+
+ var option = _ref2[0];
+ var selected = _ref2[1];
+ var highlighted = _ref2[2];
+
+ var classes = undefined;
+ if (isArray(selected)) {
+ classes = selected.indexOf(option) > -1 ? 'ember-power-select-option--selected' : '';
+ } else {
+ classes = option === selected ? 'ember-power-select-option--selected' : '';
+ }
+ if (get(option, 'disabled')) {
+ classes += ' ember-power-select-option--disabled';
+ }
+ if (option === highlighted) {
+ classes += ' ember-power-select-option--highlighted';
+ }
+ return classes;
+ }
+
+ exports['default'] = _ember['default'].Helper.helper(emberPowerSelectOptionClasses);
+});
+define("ember-power-select/templates/components/power-select", ["exports"], function (exports) {
+ "use strict";
+
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 37,
+ "column": 2
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select.hbs"
+ },
+ isEmpty: false,
+ arity: 2,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "yield", [["get", "option", ["loc", [null, [36, 12], [36, 18]]]], ["get", "term", ["loc", [null, [36, 19], [36, 23]]]]], [], ["loc", [null, [36, 4], [36, 25]]]]],
+ locals: ["option", "term"],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 37,
+ "column": 2
+ },
+ "end": {
+ "line": 39,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "yield", [], ["to", "inverse"], ["loc", [null, [38, 4], [38, 26]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 40,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "component", [["get", "concreteComponentName", ["loc", [null, [1, 13], [1, 34]]]]], ["options", ["subexpr", "@mut", [["get", "options", ["loc", [null, [2, 12], [2, 19]]]]], [], []], "selected", ["subexpr", "@mut", [["get", "selected", ["loc", [null, [3, 13], [3, 21]]]]], [], []], "onchange", ["subexpr", "@mut", [["get", "onchange", ["loc", [null, [4, 13], [4, 21]]]]], [], []], "onkeydown", ["subexpr", "@mut", [["get", "onkeydown", ["loc", [null, [5, 14], [5, 23]]]]], [], []], "onfocus", ["subexpr", "@mut", [["get", "onfocus", ["loc", [null, [6, 12], [6, 19]]]]], [], []], "onopen", ["subexpr", "@mut", [["get", "onopen", ["loc", [null, [7, 11], [7, 17]]]]], [], []], "onclose", ["subexpr", "@mut", [["get", "onclose", ["loc", [null, [8, 12], [8, 19]]]]], [], []], "disabled", ["subexpr", "@mut", [["get", "disabled", ["loc", [null, [9, 13], [9, 21]]]]], [], []], "placeholder", ["subexpr", "@mut", [["get", "placeholder", ["loc", [null, [10, 16], [10, 27]]]]], [], []], "searchEnabled", ["subexpr", "@mut", [["get", "searchEnabled", ["loc", [null, [11, 18], [11, 31]]]]], [], []], "searchPlaceholder", ["subexpr", "@mut", [["get", "searchPlaceholder", ["loc", [null, [12, 22], [12, 39]]]]], [], []], "loadingMessage", ["subexpr", "@mut", [["get", "loadingMessage", ["loc", [null, [13, 19], [13, 33]]]]], [], []], "noMatchesMessage", ["subexpr", "@mut", [["get", "noMatchesMessage", ["loc", [null, [14, 21], [14, 37]]]]], [], []], "searchMessage", ["subexpr", "@mut", [["get", "searchMessage", ["loc", [null, [15, 18], [15, 31]]]]], [], []], "selectedComponent", ["subexpr", "@mut", [["get", "selectedComponentOrDefault", ["loc", [null, [16, 22], [16, 48]]]]], [], []], "beforeOptionsComponent", ["subexpr", "@mut", [["get", "beforeOptionsComponentOrDefault", ["loc", [null, [17, 27], [17, 58]]]]], [], []], "optionsComponent", ["subexpr", "@mut", [["get", "optionsComponent", ["loc", [null, [18, 21], [18, 37]]]]], [], []], "afterOptionsComponent", ["subexpr", "@mut", [["get", "afterOptionsComponent", ["loc", [null, [19, 26], [19, 47]]]]], [], []], "matcher", ["subexpr", "@mut", [["get", "matcher", ["loc", [null, [20, 12], [20, 19]]]]], [], []], "searchField", ["subexpr", "@mut", [["get", "searchField", ["loc", [null, [21, 16], [21, 27]]]]], [], []], "renderInPlace", ["subexpr", "@mut", [["get", "renderInPlace", ["loc", [null, [22, 18], [22, 31]]]]], [], []], "search", ["subexpr", "@mut", [["get", "search", ["loc", [null, [23, 11], [23, 17]]]]], [], []], "allowClear", ["subexpr", "@mut", [["get", "allowClear", ["loc", [null, [24, 15], [24, 25]]]]], [], []], "dropdownPosition", ["subexpr", "@mut", [["get", "dropdownPosition", ["loc", [null, [25, 21], [25, 37]]]]], [], []], "closeOnSelect", ["subexpr", "@mut", [["get", "closeOnSelect", ["loc", [null, [26, 18], [26, 31]]]]], [], []], "opened", ["subexpr", "@mut", [["get", "opened", ["loc", [null, [27, 11], [27, 17]]]]], [], []], "hasInverseBlock", ["subexpr", "hasBlock", ["inverse"], [], ["loc", [null, [28, 20], [28, 40]]]], "tabindex", ["subexpr", "@mut", [["get", "tabindex", ["loc", [null, [29, 13], [29, 21]]]]], [], []], "dir", ["subexpr", "@mut", [["get", "dir", ["loc", [null, [30, 8], [30, 11]]]]], [], []], "class", ["subexpr", "@mut", [["get", "class", ["loc", [null, [31, 10], [31, 15]]]]], [], []], "triggerClass", ["subexpr", "@mut", [["get", "triggerClass", ["loc", [null, [32, 17], [32, 29]]]]], [], []], "dropdownClass", ["subexpr", "@mut", [["get", "dropdownClass", ["loc", [null, [33, 18], [33, 31]]]]], [], []], "extra", ["subexpr", "@mut", [["get", "extra", ["loc", [null, [34, 10], [34, 15]]]]], [], []]], 0, 1, ["loc", [null, [1, 0], [39, 14]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })());
+});
+define("ember-power-select/templates/components/power-select/before-options", ["exports"], function (exports) {
+ "use strict";
+
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "triple-curlies"
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 7,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/before-options.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("div");
+ dom.setAttribute(el1, "class", "ember-power-select-search");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("input");
+ dom.setAttribute(el2, "type", "search");
+ dom.setAttribute(el2, "autocomplete", "off");
+ dom.setAttribute(el2, "autocorrect", "off");
+ dom.setAttribute(el2, "autocapitalize", "off");
+ dom.setAttribute(el2, "spellcheck", "false");
+ dom.setAttribute(el2, "role", "combobox");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1, 1]);
+ var morphs = new Array(3);
+ morphs[0] = dom.createAttrMorph(element0, 'oninput');
+ morphs[1] = dom.createAttrMorph(element0, 'onkeydown');
+ morphs[2] = dom.createAttrMorph(element0, 'placeholder');
+ return morphs;
+ },
+ statements: [["attribute", "oninput", ["subexpr", "action", [["get", "select.actions.search", ["loc", [null, [4, 56], [4, 77]]]]], ["value", "target.value"], ["loc", [null, [4, 47], [4, 100]]]]], ["attribute", "onkeydown", ["get", "select.actions.handleKeydown", ["loc", [null, [5, 16], [5, 44]]]]], ["attribute", "placeholder", ["get", "searchPlaceholder", ["loc", [null, [5, 61], [5, 78]]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 7,
+ "column": 7
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/before-options.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "searchEnabled", ["loc", [null, [1, 6], [1, 19]]]]], [], 0, null, ["loc", [null, [1, 0], [7, 7]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-power-select/templates/components/power-select/main", ["exports"], function (exports) {
+ "use strict";
+
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 16,
+ "column": 6
+ },
+ "end": {
+ "line": 18,
+ "column": 6
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/main.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ dom.setAttribute(el1, "class", "ember-power-select-options");
+ dom.setAttribute(el1, "role", "listbox");
+ var el2 = dom.createElement("li");
+ dom.setAttribute(el2, "class", "ember-power-select-option");
+ dom.setAttribute(el2, "role", "option");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 0]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "searchMessage", ["loc", [null, [17, 114], [17, 131]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 19,
+ "column": 8
+ },
+ "end": {
+ "line": 21,
+ "column": 8
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/main.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "yield", [], ["to", "inverse"], ["loc", [null, [20, 10], [20, 32]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 21,
+ "column": 8
+ },
+ "end": {
+ "line": 23,
+ "column": 8
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/main.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("ul");
+ dom.setAttribute(el1, "class", "ember-power-select-options");
+ dom.setAttribute(el1, "role", "listbox");
+ var el2 = dom.createElement("li");
+ dom.setAttribute(el2, "class", "ember-power-select-option");
+ dom.setAttribute(el2, "role", "option");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n ");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 0]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "noMatchesMessage", ["loc", [null, [22, 116], [22, 136]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 21,
+ "column": 8
+ },
+ "end": {
+ "line": 23,
+ "column": 8
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/main.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "noMatchesMessage", ["loc", [null, [21, 18], [21, 34]]]]], [], 0, null, ["loc", [null, [21, 8], [23, 8]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 18,
+ "column": 6
+ },
+ "end": {
+ "line": 24,
+ "column": 6
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/main.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "hasInverseBlock", ["loc", [null, [19, 14], [19, 29]]]]], [], 0, 1, ["loc", [null, [19, 8], [23, 15]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 25,
+ "column": 8
+ },
+ "end": {
+ "line": 30,
+ "column": 8
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/main.hbs"
+ },
+ isEmpty: false,
+ arity: 2,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "yield", [["get", "option", ["loc", [null, [29, 18], [29, 24]]]], ["get", "term", ["loc", [null, [29, 25], [29, 29]]]]], [], ["loc", [null, [29, 10], [29, 31]]]]],
+ locals: ["option", "term"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 24,
+ "column": 6
+ },
+ "end": {
+ "line": 31,
+ "column": 6
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/main.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "component", [["get", "optionsComponent", ["loc", [null, [25, 21], [25, 37]]]]], ["options", ["subexpr", "readonly", [["get", "results", ["loc", [null, [25, 56], [25, 63]]]]], [], ["loc", [null, [25, 46], [25, 64]]]], "highlighted", ["subexpr", "readonly", [["get", "highlighted", ["loc", [null, [25, 87], [25, 98]]]]], [], ["loc", [null, [25, 77], [25, 99]]]], "selection", ["subexpr", "readonly", [["get", "selection", ["loc", [null, [26, 30], [26, 39]]]]], [], ["loc", [null, [26, 20], [26, 40]]]], "optionsComponent", ["subexpr", "readonly", [["get", "optionsComponent", ["loc", [null, [26, 68], [26, 84]]]]], [], ["loc", [null, [26, 58], [26, 85]]]], "searchText", ["subexpr", "readonly", [["get", "searchText", ["loc", [null, [26, 107], [26, 117]]]]], [], ["loc", [null, [26, 97], [26, 118]]]], "select", ["subexpr", "readonly", [["get", "select", ["loc", [null, [27, 27], [27, 33]]]]], [], ["loc", [null, [27, 17], [27, 34]]]], "extra", ["subexpr", "readonly", [["get", "extra", ["loc", [null, [27, 51], [27, 56]]]]], [], ["loc", [null, [27, 41], [27, 57]]]], "loadingMessage", ["subexpr", "readonly", [["get", "loadingMessage", ["loc", [null, [27, 83], [27, 97]]]]], [], ["loc", [null, [27, 73], [27, 98]]]], "class", "ember-power-select-options"], 0, null, ["loc", [null, [25, 8], [30, 22]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 18,
+ "column": 6
+ },
+ "end": {
+ "line": 31,
+ "column": 6
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/main.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "mustShowNoMessages", ["loc", [null, [18, 16], [18, 34]]]]], [], 0, 1, ["loc", [null, [18, 6], [31, 6]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 4,
+ "column": 2
+ },
+ "end": {
+ "line": 33,
+ "column": 2
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/main.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(3);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ morphs[2] = dom.createMorphAt(fragment, 5, 5, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "component", [["get", "beforeOptionsComponent", ["loc", [null, [15, 18], [15, 40]]]]], ["select", ["subexpr", "readonly", [["get", "select", ["loc", [null, [15, 58], [15, 64]]]]], [], ["loc", [null, [15, 48], [15, 65]]]], "searchPlaceholder", ["subexpr", "readonly", [["get", "searchPlaceholder", ["loc", [null, [15, 94], [15, 111]]]]], [], ["loc", [null, [15, 84], [15, 112]]]], "searchEnabled", ["subexpr", "readonly", [["get", "searchEnabled", ["loc", [null, [15, 137], [15, 150]]]]], [], ["loc", [null, [15, 127], [15, 151]]]]], ["loc", [null, [15, 6], [15, 153]]]], ["block", "if", [["get", "mustShowSearchMessage", ["loc", [null, [16, 12], [16, 33]]]]], [], 0, 1, ["loc", [null, [16, 6], [31, 13]]]], ["inline", "component", [["get", "afterOptionsComponent", ["loc", [null, [32, 18], [32, 39]]]]], ["select", ["subexpr", "readonly", [["get", "select", ["loc", [null, [32, 57], [32, 63]]]]], [], ["loc", [null, [32, 47], [32, 64]]]], "options", ["subexpr", "readonly", [["get", "results", ["loc", [null, [32, 83], [32, 90]]]]], [], ["loc", [null, [32, 73], [32, 91]]]], "searchPlaceholder", ["subexpr", "readonly", [["get", "searchPlaceholder", ["loc", [null, [32, 120], [32, 137]]]]], [], ["loc", [null, [32, 110], [32, 138]]]], "searchEnabled", ["subexpr", "readonly", [["get", "searchEnabled", ["loc", [null, [32, 163], [32, 176]]]]], [], ["loc", [null, [32, 153], [32, 177]]]]], ["loc", [null, [32, 6], [32, 179]]]]],
+ locals: ["select"],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 34,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/main.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "with", [["subexpr", "hash", [], ["isOpen", ["get", "dropdown.isOpen", ["loc", [null, [5, 11], [5, 26]]]], "actions", ["subexpr", "hash", [], ["open", ["subexpr", "action", ["open", ["get", "dropdown", ["loc", [null, [7, 26], [7, 34]]]]], [], ["loc", [null, [7, 11], [7, 35]]]], "close", ["subexpr", "action", ["close", ["get", "dropdown", ["loc", [null, [8, 28], [8, 36]]]]], [], ["loc", [null, [8, 12], [8, 37]]]], "select", ["subexpr", "action", ["select", ["get", "dropdown", ["loc", [null, [9, 30], [9, 38]]]]], [], ["loc", [null, [9, 13], [9, 39]]]], "highlight", ["subexpr", "action", ["highlight", ["get", "dropdown", ["loc", [null, [10, 36], [10, 44]]]]], [], ["loc", [null, [10, 16], [10, 45]]]], "search", ["subexpr", "action", ["search", ["get", "dropdown", ["loc", [null, [11, 30], [11, 38]]]]], [], ["loc", [null, [11, 13], [11, 39]]]], "removeOption", ["subexpr", "action", ["removeOption", ["get", "dropdown", ["loc", [null, [12, 42], [12, 50]]]]], [], ["loc", [null, [12, 19], [12, 51]]]], "handleKeydown", ["subexpr", "action", ["handleKeydown", ["get", "dropdown", ["loc", [null, [13, 44], [13, 52]]]]], [], ["loc", [null, [13, 20], [13, 53]]]]], ["loc", [null, [6, 12], [14, 5]]]]], ["loc", [null, [4, 10], [14, 6]]]]], [], 0, null, ["loc", [null, [4, 2], [33, 11]]]]],
+ locals: ["dropdown"],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 47,
+ "column": 4
+ },
+ "end": {
+ "line": 51,
+ "column": 4
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/main.hbs"
+ },
+ isEmpty: false,
+ arity: 2,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "yield", [["get", "opt", ["loc", [null, [50, 14], [50, 17]]]], ["get", "term", ["loc", [null, [50, 18], [50, 22]]]]], [], ["loc", [null, [50, 6], [50, 24]]]]],
+ locals: ["opt", "term"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 35,
+ "column": 2
+ },
+ "end": {
+ "line": 52,
+ "column": 2
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/main.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "component", [["get", "selectedComponent", ["loc", [null, [47, 17], [47, 34]]]]], ["options", ["subexpr", "readonly", [["get", "results", ["loc", [null, [47, 53], [47, 60]]]]], [], ["loc", [null, [47, 43], [47, 61]]]], "selection", ["subexpr", "readonly", [["get", "selection", ["loc", [null, [47, 82], [47, 91]]]]], [], ["loc", [null, [47, 72], [47, 92]]]], "searchText", ["subexpr", "readonly", [["get", "searchText", ["loc", [null, [47, 114], [47, 124]]]]], [], ["loc", [null, [47, 104], [47, 125]]]], "placeholder", ["subexpr", "readonly", [["get", "placeholder", ["loc", [null, [48, 28], [48, 39]]]]], [], ["loc", [null, [48, 18], [48, 40]]]], "disabled", ["subexpr", "readonly", [["get", "disabled", ["loc", [null, [48, 60], [48, 68]]]]], [], ["loc", [null, [48, 50], [48, 69]]]], "highlighted", ["subexpr", "readonly", [["get", "highlighted", ["loc", [null, [48, 92], [48, 103]]]]], [], ["loc", [null, [48, 82], [48, 104]]]], "select", ["subexpr", "readonly", [["get", "select", ["loc", [null, [49, 23], [49, 29]]]]], [], ["loc", [null, [49, 13], [49, 30]]]], "extra", ["subexpr", "readonly", [["get", "extra", ["loc", [null, [49, 47], [49, 52]]]]], [], ["loc", [null, [49, 37], [49, 53]]]]], 0, null, ["loc", [null, [47, 4], [51, 18]]]]],
+ locals: ["select"],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 34,
+ "column": 0
+ },
+ "end": {
+ "line": 53,
+ "column": 1
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/main.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "with", [["subexpr", "hash", [], ["isOpen", ["get", "registeredDropdown.isOpen", ["loc", [null, [36, 11], [36, 36]]]], "actions", ["subexpr", "hash", [], ["open", ["subexpr", "action", ["open", ["get", "registeredDropdown", ["loc", [null, [38, 26], [38, 44]]]]], [], ["loc", [null, [38, 11], [38, 45]]]], "close", ["subexpr", "action", ["close", ["get", "registeredDropdown", ["loc", [null, [39, 28], [39, 46]]]]], [], ["loc", [null, [39, 12], [39, 47]]]], "select", ["subexpr", "action", ["select", ["get", "registeredDropdown", ["loc", [null, [40, 30], [40, 48]]]]], [], ["loc", [null, [40, 13], [40, 49]]]], "highlight", ["subexpr", "action", ["highlight", ["get", "registeredDropdown", ["loc", [null, [41, 36], [41, 54]]]]], [], ["loc", [null, [41, 16], [41, 55]]]], "search", ["subexpr", "action", ["search", ["get", "registeredDropdown", ["loc", [null, [42, 30], [42, 48]]]]], [], ["loc", [null, [42, 13], [42, 49]]]], "removeOption", ["subexpr", "action", ["removeOption", ["get", "registeredDropdown", ["loc", [null, [43, 42], [43, 60]]]]], [], ["loc", [null, [43, 19], [43, 61]]]], "clear", ["subexpr", "if", [["get", "allowClear", ["loc", [null, [44, 16], [44, 26]]]], ["subexpr", "action", ["select", ["get", "registeredDropdown", ["loc", [null, [44, 44], [44, 62]]]], null], [], ["loc", [null, [44, 27], [44, 68]]]]], [], ["loc", [null, [44, 12], [44, 69]]]], "handleKeydown", ["subexpr", "action", ["handleKeydown", ["get", "registeredDropdown", ["loc", [null, [45, 44], [45, 62]]]]], [], ["loc", [null, [45, 20], [45, 63]]]]], ["loc", [null, [37, 12], [46, 5]]]]], ["loc", [null, [35, 10], [46, 6]]]]], [], 0, null, ["loc", [null, [35, 2], [52, 11]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 54,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/main.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "basic-dropdown", [], ["class", ["subexpr", "readonly", [["get", "concatenatedClasses", ["loc", [null, [1, 34], [1, 53]]]]], [], ["loc", [null, [1, 24], [1, 54]]]], "dir", ["subexpr", "readonly", [["get", "dir", ["loc", [null, [1, 69], [1, 72]]]]], [], ["loc", [null, [1, 59], [1, 73]]]], "tabindex", ["subexpr", "readonly", [["get", "tabindex", ["loc", [null, [1, 93], [1, 101]]]]], [], ["loc", [null, [1, 83], [1, 102]]]], "renderInPlace", ["subexpr", "readonly", [["get", "renderInPlace", ["loc", [null, [1, 127], [1, 140]]]]], [], ["loc", [null, [1, 117], [1, 141]]]], "matchTriggerWidth", true, "disabled", ["subexpr", "readonly", [["get", "disabled", ["loc", [null, [2, 21], [2, 29]]]]], [], ["loc", [null, [2, 11], [2, 30]]]], "dropdownPosition", ["subexpr", "readonly", [["get", "dropdownPosition", ["loc", [null, [2, 58], [2, 74]]]]], [], ["loc", [null, [2, 48], [2, 75]]]], "triggerClass", ["subexpr", "readonly", [["get", "concatenatedTriggerClasses", ["loc", [null, [2, 99], [2, 125]]]]], [], ["loc", [null, [2, 89], [2, 126]]]], "dropdownClass", ["subexpr", "readonly", [["get", "concatenatedDropdownClasses", ["loc", [null, [2, 151], [2, 178]]]]], [], ["loc", [null, [2, 141], [2, 179]]]], "opened", ["subexpr", "@mut", [["get", "opened", ["loc", [null, [3, 9], [3, 15]]]]], [], []], "onOpen", ["subexpr", "action", [["get", "handleOpen", ["loc", [null, [3, 31], [3, 41]]]]], [], ["loc", [null, [3, 23], [3, 42]]]], "onClose", ["subexpr", "action", [["get", "handleClose", ["loc", [null, [3, 59], [3, 70]]]]], [], ["loc", [null, [3, 51], [3, 71]]]], "onFocus", ["subexpr", "action", ["handleFocus"], [], ["loc", [null, [3, 80], [3, 102]]]], "onKeydown", ["subexpr", "action", ["handleKeydown"], [], ["loc", [null, [3, 113], [3, 137]]]], "registerActionsInParent", ["subexpr", "action", ["registerDropdown"], [], ["loc", [null, [3, 162], [3, 189]]]]], 0, 1, ["loc", [null, [1, 0], [53, 20]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })());
+});
+define("ember-power-select/templates/components/power-select/multiple/selected", ["exports"], function (exports) {
+ "use strict";
+
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 4
+ },
+ "end": {
+ "line": 5,
+ "column": 4
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/multiple/selected.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "aria-label", "remove element");
+ dom.setAttribute(el1, "class", "ember-power-select-multiple-remove-btn");
+ var el2 = dom.createTextNode("×");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createAttrMorph(element0, 'onmousedown');
+ return morphs;
+ },
+ statements: [["attribute", "onmousedown", ["subexpr", "action", [["get", "select.actions.removeOption", ["loc", [null, [4, 108], [4, 135]]]], ["get", "opt", ["loc", [null, [4, 136], [4, 139]]]]], [], ["loc", [null, [4, 99], [4, 141]]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "triple-curlies"
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 8,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/multiple/selected.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ember-power-select-multiple-option");
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element1 = dom.childAt(fragment, [1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(element1, 1, 1);
+ morphs[1] = dom.createMorphAt(element1, 3, 3);
+ return morphs;
+ },
+ statements: [["block", "unless", [["get", "disabled", ["loc", [null, [3, 14], [3, 22]]]]], [], 0, null, ["loc", [null, [3, 4], [5, 15]]]], ["inline", "yield", [["get", "opt", ["loc", [null, [6, 12], [6, 15]]]], ["get", "searchText", ["loc", [null, [6, 16], [6, 26]]]]], [], ["loc", [null, [6, 4], [6, 28]]]]],
+ locals: ["opt"],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 13,
+ "column": 52
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/multiple/selected.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("input");
+ dom.setAttribute(el1, "type", "search");
+ dom.setAttribute(el1, "class", "ember-power-select-trigger-multiple-input");
+ dom.setAttribute(el1, "tabindex", "0");
+ dom.setAttribute(el1, "autocomplete", "off");
+ dom.setAttribute(el1, "autocorrect", "off");
+ dom.setAttribute(el1, "autocapitalize", "off");
+ dom.setAttribute(el1, "spellcheck", "false");
+ dom.setAttribute(el1, "role", "combobox");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ember-power-select-status-icon");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element2 = dom.childAt(fragment, [1]);
+ var morphs = new Array(7);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createAttrMorph(element2, 'style');
+ morphs[2] = dom.createAttrMorph(element2, 'placeholder');
+ morphs[3] = dom.createAttrMorph(element2, 'value');
+ morphs[4] = dom.createAttrMorph(element2, 'disabled');
+ morphs[5] = dom.createAttrMorph(element2, 'oninput');
+ morphs[6] = dom.createAttrMorph(element2, 'onkeydown');
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "each", [["get", "selection", ["loc", [null, [1, 8], [1, 17]]]]], [], 0, null, ["loc", [null, [1, 0], [8, 9]]]], ["attribute", "style", ["get", "triggerMultipleInputStyle", ["loc", [null, [10, 84], [10, 109]]]]], ["attribute", "placeholder", ["get", "maybePlaceholder", ["loc", [null, [11, 16], [11, 32]]]]], ["attribute", "value", ["get", "searchText", ["loc", [null, [11, 43], [11, 53]]]]], ["attribute", "disabled", ["get", "disabled", ["loc", [null, [11, 67], [11, 75]]]]], ["attribute", "oninput", ["subexpr", "action", ["search"], ["value", "target.value"], ["loc", [null, [12, 10], [12, 50]]]]], ["attribute", "onkeydown", ["get", "select.actions.handleKeydown", ["loc", [null, [12, 63], [12, 91]]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })());
+});
+define("ember-power-select/templates/components/power-select/options", ["exports"], function (exports) {
+ "use strict";
+
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 4,
+ "column": 2
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/options.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ dom.setAttribute(el1, "class", "ember-power-select-option");
+ dom.setAttribute(el1, "role", "option");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "loadingMessage", ["loc", [null, [3, 56], [3, 74]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 5,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/options.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "loadingMessage", ["loc", [null, [2, 8], [2, 22]]]]], [], 0, null, ["loc", [null, [2, 2], [4, 9]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 10,
+ "column": 6
+ },
+ "end": {
+ "line": 14,
+ "column": 6
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/options.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ return morphs;
+ },
+ statements: [["inline", "yield", [["get", "option", ["loc", [null, [13, 16], [13, 22]]]], ["get", "searchText", ["loc", [null, [13, 23], [13, 33]]]]], [], ["loc", [null, [13, 8], [13, 35]]]]],
+ locals: ["option"],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 7,
+ "column": 2
+ },
+ "end": {
+ "line": 16,
+ "column": 2
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/options.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ dom.setAttribute(el1, "class", "ember-power-select-group");
+ dom.setAttribute(el1, "role", "option");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createElement("span");
+ dom.setAttribute(el2, "class", "ember-power-select-group-name");
+ var el3 = dom.createComment("");
+ dom.appendChild(el2, el3);
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode(" ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element1 = dom.childAt(fragment, [1]);
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(dom.childAt(element1, [1]), 0, 0);
+ morphs[1] = dom.createMorphAt(element1, 3, 3);
+ return morphs;
+ },
+ statements: [["content", "opt.groupName", ["loc", [null, [9, 50], [9, 67]]]], ["block", "component", [["get", "optionsComponent", ["loc", [null, [10, 19], [10, 35]]]]], ["highlighted", ["subexpr", "readonly", [["get", "highlighted", ["loc", [null, [10, 58], [10, 69]]]]], [], ["loc", [null, [10, 48], [10, 70]]]], "selection", ["subexpr", "readonly", [["get", "selection", ["loc", [null, [10, 91], [10, 100]]]]], [], ["loc", [null, [10, 81], [10, 101]]]], "options", ["subexpr", "readonly", [["get", "opt.options", ["loc", [null, [11, 26], [11, 37]]]]], [], ["loc", [null, [11, 16], [11, 38]]]], "optionsComponent", ["subexpr", "readonly", [["get", "optionsComponent", ["loc", [null, [11, 66], [11, 82]]]]], [], ["loc", [null, [11, 56], [11, 83]]]], "select", ["subexpr", "readonly", [["get", "select", ["loc", [null, [11, 101], [11, 107]]]]], [], ["loc", [null, [11, 91], [11, 108]]]], "class", "ember-power-select-options ember-power-select-options--nested"], 0, null, ["loc", [null, [10, 6], [14, 20]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 16,
+ "column": 2
+ },
+ "end": {
+ "line": 21,
+ "column": 2
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/options.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("li");
+ dom.setAttribute(el1, "role", "option");
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ var el2 = dom.createTextNode("\n ");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(4);
+ morphs[0] = dom.createAttrMorph(element0, 'class');
+ morphs[1] = dom.createAttrMorph(element0, 'onmouseup');
+ morphs[2] = dom.createAttrMorph(element0, 'onmouseover');
+ morphs[3] = dom.createMorphAt(element0, 1, 1);
+ return morphs;
+ },
+ statements: [["attribute", "class", ["concat", ["ember-power-select-option ", ["subexpr", "ember-power-select-option-classes", [["get", "opt", ["loc", [null, [17, 77], [17, 80]]]], ["get", "selection", ["loc", [null, [17, 81], [17, 90]]]], ["get", "highlighted", ["loc", [null, [17, 91], [17, 102]]]]], [], ["loc", [null, [17, 41], [17, 104]]]]]]], ["attribute", "onmouseup", ["subexpr", "action", [["get", "select.actions.select", ["loc", [null, [18, 25], [18, 46]]]], ["get", "opt", ["loc", [null, [18, 47], [18, 50]]]]], [], ["loc", [null, [18, 16], [18, 52]]]]], ["attribute", "onmouseover", ["subexpr", "action", [["get", "select.actions.highlight", ["loc", [null, [18, 74], [18, 98]]]], ["get", "opt", ["loc", [null, [18, 99], [18, 102]]]]], [], ["loc", [null, [18, 65], [18, 104]]]]], ["inline", "yield", [["get", "opt", ["loc", [null, [19, 14], [19, 17]]]], ["get", "searchText", ["loc", [null, [19, 18], [19, 28]]]]], [], ["loc", [null, [19, 6], [19, 30]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 6,
+ "column": 0
+ },
+ "end": {
+ "line": 22,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/options.hbs"
+ },
+ isEmpty: false,
+ arity: 1,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "opt.groupName", ["loc", [null, [7, 8], [7, 21]]]]], [], 0, 1, ["loc", [null, [7, 2], [21, 9]]]]],
+ locals: ["opt"],
+ templates: [child0, child1]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 23,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/options.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "options.isPending", ["loc", [null, [1, 6], [1, 23]]]]], [], 0, null, ["loc", [null, [1, 0], [5, 7]]]], ["block", "each", [["get", "options", ["loc", [null, [6, 8], [6, 15]]]]], [], 1, null, ["loc", [null, [6, 0], [22, 9]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })());
+});
+define("ember-power-select/templates/components/power-select/single/selected", ["exports"], function (exports) {
+ "use strict";
+
+ exports["default"] = Ember.HTMLBars.template((function () {
+ var child0 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 3,
+ "column": 2
+ },
+ "end": {
+ "line": 5,
+ "column": 2
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/single/selected.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ember-power-select-clear-btn");
+ var el2 = dom.createTextNode("×");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var element0 = dom.childAt(fragment, [1]);
+ var morphs = new Array(1);
+ morphs[0] = dom.createAttrMorph(element0, 'onmousedown');
+ return morphs;
+ },
+ statements: [["attribute", "onmousedown", ["get", "select.actions.clear", ["loc", [null, [4, 61], [4, 81]]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 6,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/single/selected.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(2);
+ morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);
+ morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["inline", "yield", [["get", "selection", ["loc", [null, [2, 10], [2, 19]]]], ["get", "searchText", ["loc", [null, [2, 20], [2, 30]]]]], [], ["loc", [null, [2, 2], [2, 32]]]], ["block", "if", [["get", "select.actions.clear", ["loc", [null, [3, 8], [3, 28]]]]], [], 0, null, ["loc", [null, [3, 2], [5, 9]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ var child1 = (function () {
+ var child0 = (function () {
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 6,
+ "column": 0
+ },
+ "end": {
+ "line": 8,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/single/selected.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createTextNode(" ");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ember-power-select-placeholder");
+ var el2 = dom.createComment("");
+ dom.appendChild(el1, el2);
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);
+ return morphs;
+ },
+ statements: [["content", "placeholder", ["loc", [null, [7, 47], [7, 62]]]]],
+ locals: [],
+ templates: []
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": false,
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 6,
+ "column": 0
+ },
+ "end": {
+ "line": 8,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/single/selected.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ dom.insertBoundary(fragment, null);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "placeholder", ["loc", [null, [6, 10], [6, 21]]]]], [], 0, null, ["loc", [null, [6, 0], [8, 0]]]]],
+ locals: [],
+ templates: [child0]
+ };
+ })();
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type", "multiple-nodes"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 9,
+ "column": 52
+ }
+ },
+ "moduleName": "modules/ember-power-select/templates/components/power-select/single/selected.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createElement("span");
+ dom.setAttribute(el1, "class", "ember-power-select-status-icon");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["block", "if", [["get", "selection", ["loc", [null, [1, 6], [1, 15]]]]], [], 0, 1, ["loc", [null, [1, 0], [8, 7]]]]],
+ locals: [],
+ templates: [child0, child1]
+ };
+ })());
+});
+define('ember-power-select/utils/group-utils', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports.isGroup = isGroup;
+ exports.countOptions = countOptions;
+ exports.indexOfOption = indexOfOption;
+ exports.optionAtIndex = optionAtIndex;
+ exports.filterOptions = filterOptions;
+ exports.stripDiacritics = stripDiacritics;
+ exports.defaultMatcher = defaultMatcher;
+
+ var get = _ember['default'].get;
+
+ function isGroup(entry) {
+ return !!entry && !!get(entry, 'groupName') && !!get(entry, 'options');
+ }
+
+ function countOptions(collection) {
+ var counter = 0;
+ (function walk(collection) {
+ if (!collection) {
+ return null;
+ }
+ if (!collection.objectAt) {
+ collection = _ember['default'].A(collection);
+ }
+ for (var i = 0; i < get(collection, 'length'); i++) {
+ var entry = collection.objectAt(i);
+ if (isGroup(entry)) {
+ walk(get(entry, 'options'));
+ } else {
+ counter++;
+ }
+ }
+ })(collection);
+ return counter;
+ }
+
+ function indexOfOption(collection, option) {
+ var index = 0;
+ return (function walk(collection) {
+ if (!collection) {
+ return null;
+ }
+ if (!collection.objectAt) {
+ collection = _ember['default'].A(collection);
+ }
+ for (var i = 0; i < get(collection, 'length'); i++) {
+ var entry = collection.objectAt(i);
+ if (isGroup(entry)) {
+ var result = walk(get(entry, 'options'));
+ if (result > -1) {
+ return result;
+ }
+ } else if (entry === option) {
+ return index;
+ } else {
+ index++;
+ }
+ }
+ return -1;
+ })(collection);
+ }
+
+ function optionAtIndex(originalCollection, index) {
+ var counter = 0;
+ return (function walk(collection) {
+ if (!collection) {
+ return null;
+ }
+ if (!collection.objectAt) {
+ collection = _ember['default'].A(collection);
+ }
+ var localCounter = 0;
+ var length = get(collection, 'length');
+ while (counter <= index && localCounter < length) {
+ var entry = collection.objectAt(localCounter);
+ if (isGroup(entry)) {
+ var found = walk(get(entry, 'options'));
+ if (found) {
+ return found;
+ }
+ } else if (counter === index) {
+ return entry;
+ } else {
+ counter++;
+ }
+ localCounter++;
+ }
+ })(originalCollection);
+ }
+
+ function filterOptions(options, text, matcher) {
+ var sanitizedOptions = options.objectAt ? options : _ember['default'].A(options);
+ var opts = _ember['default'].A();
+ var length = get(options, 'length');
+ for (var i = 0; i < length; i++) {
+ var entry = sanitizedOptions.objectAt(i);
+ if (isGroup(entry)) {
+ var suboptions = filterOptions(get(entry, 'options'), text, matcher);
+ if (get(suboptions, 'length') > 0) {
+ opts.push({ groupName: entry.groupName, options: suboptions });
+ }
+ } else if (matcher(entry, text)) {
+ opts.push(entry);
+ }
+ }
+ return opts;
+ }
+
+ var DIACRITICS = {
+ 'Ⓐ': 'A',
+ 'A': 'A',
+ 'À': 'A',
+ 'Á': 'A',
+ 'Â': 'A',
+ 'Ầ': 'A',
+ 'Ấ': 'A',
+ 'Ẫ': 'A',
+ 'Ẩ': 'A',
+ 'Ã': 'A',
+ 'Ā': 'A',
+ 'Ă': 'A',
+ 'Ằ': 'A',
+ 'Ắ': 'A',
+ 'Ẵ': 'A',
+ 'Ẳ': 'A',
+ 'Ȧ': 'A',
+ 'Ǡ': 'A',
+ 'Ä': 'A',
+ 'Ǟ': 'A',
+ 'Ả': 'A',
+ 'Å': 'A',
+ 'Ǻ': 'A',
+ 'Ǎ': 'A',
+ 'Ȁ': 'A',
+ 'Ȃ': 'A',
+ 'Ạ': 'A',
+ 'Ậ': 'A',
+ 'Ặ': 'A',
+ 'Ḁ': 'A',
+ 'Ą': 'A',
+ 'Ⱥ': 'A',
+ 'Ɐ': 'A',
+ 'Ꜳ': 'AA',
+ 'Æ': 'AE',
+ 'Ǽ': 'AE',
+ 'Ǣ': 'AE',
+ 'Ꜵ': 'AO',
+ 'Ꜷ': 'AU',
+ 'Ꜹ': 'AV',
+ 'Ꜻ': 'AV',
+ 'Ꜽ': 'AY',
+ 'Ⓑ': 'B',
+ 'B': 'B',
+ 'Ḃ': 'B',
+ 'Ḅ': 'B',
+ 'Ḇ': 'B',
+ 'Ƀ': 'B',
+ 'Ƃ': 'B',
+ 'Ɓ': 'B',
+ 'Ⓒ': 'C',
+ 'C': 'C',
+ 'Ć': 'C',
+ 'Ĉ': 'C',
+ 'Ċ': 'C',
+ 'Č': 'C',
+ 'Ç': 'C',
+ 'Ḉ': 'C',
+ 'Ƈ': 'C',
+ 'Ȼ': 'C',
+ 'Ꜿ': 'C',
+ 'Ⓓ': 'D',
+ 'D': 'D',
+ 'Ḋ': 'D',
+ 'Ď': 'D',
+ 'Ḍ': 'D',
+ 'Ḑ': 'D',
+ 'Ḓ': 'D',
+ 'Ḏ': 'D',
+ 'Đ': 'D',
+ 'Ƌ': 'D',
+ 'Ɗ': 'D',
+ 'Ɖ': 'D',
+ 'Ꝺ': 'D',
+ 'DZ': 'DZ',
+ 'DŽ': 'DZ',
+ 'Dz': 'Dz',
+ 'Dž': 'Dz',
+ 'Ⓔ': 'E',
+ 'E': 'E',
+ 'È': 'E',
+ 'É': 'E',
+ 'Ê': 'E',
+ 'Ề': 'E',
+ 'Ế': 'E',
+ 'Ễ': 'E',
+ 'Ể': 'E',
+ 'Ẽ': 'E',
+ 'Ē': 'E',
+ 'Ḕ': 'E',
+ 'Ḗ': 'E',
+ 'Ĕ': 'E',
+ 'Ė': 'E',
+ 'Ë': 'E',
+ 'Ẻ': 'E',
+ 'Ě': 'E',
+ 'Ȅ': 'E',
+ 'Ȇ': 'E',
+ 'Ẹ': 'E',
+ 'Ệ': 'E',
+ 'Ȩ': 'E',
+ 'Ḝ': 'E',
+ 'Ę': 'E',
+ 'Ḙ': 'E',
+ 'Ḛ': 'E',
+ 'Ɛ': 'E',
+ 'Ǝ': 'E',
+ 'Ⓕ': 'F',
+ 'F': 'F',
+ 'Ḟ': 'F',
+ 'Ƒ': 'F',
+ 'Ꝼ': 'F',
+ 'Ⓖ': 'G',
+ 'G': 'G',
+ 'Ǵ': 'G',
+ 'Ĝ': 'G',
+ 'Ḡ': 'G',
+ 'Ğ': 'G',
+ 'Ġ': 'G',
+ 'Ǧ': 'G',
+ 'Ģ': 'G',
+ 'Ǥ': 'G',
+ 'Ɠ': 'G',
+ 'Ꞡ': 'G',
+ 'Ᵹ': 'G',
+ 'Ꝿ': 'G',
+ 'Ⓗ': 'H',
+ 'H': 'H',
+ 'Ĥ': 'H',
+ 'Ḣ': 'H',
+ 'Ḧ': 'H',
+ 'Ȟ': 'H',
+ 'Ḥ': 'H',
+ 'Ḩ': 'H',
+ 'Ḫ': 'H',
+ 'Ħ': 'H',
+ 'Ⱨ': 'H',
+ 'Ⱶ': 'H',
+ 'Ɥ': 'H',
+ 'Ⓘ': 'I',
+ 'I': 'I',
+ 'Ì': 'I',
+ 'Í': 'I',
+ 'Î': 'I',
+ 'Ĩ': 'I',
+ 'Ī': 'I',
+ 'Ĭ': 'I',
+ 'İ': 'I',
+ 'Ï': 'I',
+ 'Ḯ': 'I',
+ 'Ỉ': 'I',
+ 'Ǐ': 'I',
+ 'Ȉ': 'I',
+ 'Ȋ': 'I',
+ 'Ị': 'I',
+ 'Į': 'I',
+ 'Ḭ': 'I',
+ 'Ɨ': 'I',
+ 'Ⓙ': 'J',
+ 'J': 'J',
+ 'Ĵ': 'J',
+ 'Ɉ': 'J',
+ 'Ⓚ': 'K',
+ 'K': 'K',
+ 'Ḱ': 'K',
+ 'Ǩ': 'K',
+ 'Ḳ': 'K',
+ 'Ķ': 'K',
+ 'Ḵ': 'K',
+ 'Ƙ': 'K',
+ 'Ⱪ': 'K',
+ 'Ꝁ': 'K',
+ 'Ꝃ': 'K',
+ 'Ꝅ': 'K',
+ 'Ꞣ': 'K',
+ 'Ⓛ': 'L',
+ 'L': 'L',
+ 'Ŀ': 'L',
+ 'Ĺ': 'L',
+ 'Ľ': 'L',
+ 'Ḷ': 'L',
+ 'Ḹ': 'L',
+ 'Ļ': 'L',
+ 'Ḽ': 'L',
+ 'Ḻ': 'L',
+ 'Ł': 'L',
+ 'Ƚ': 'L',
+ 'Ɫ': 'L',
+ 'Ⱡ': 'L',
+ 'Ꝉ': 'L',
+ 'Ꝇ': 'L',
+ 'Ꞁ': 'L',
+ 'LJ': 'LJ',
+ 'Lj': 'Lj',
+ 'Ⓜ': 'M',
+ 'M': 'M',
+ 'Ḿ': 'M',
+ 'Ṁ': 'M',
+ 'Ṃ': 'M',
+ 'Ɱ': 'M',
+ 'Ɯ': 'M',
+ 'Ⓝ': 'N',
+ 'N': 'N',
+ 'Ǹ': 'N',
+ 'Ń': 'N',
+ 'Ñ': 'N',
+ 'Ṅ': 'N',
+ 'Ň': 'N',
+ 'Ṇ': 'N',
+ 'Ņ': 'N',
+ 'Ṋ': 'N',
+ 'Ṉ': 'N',
+ 'Ƞ': 'N',
+ 'Ɲ': 'N',
+ 'Ꞑ': 'N',
+ 'Ꞥ': 'N',
+ 'NJ': 'NJ',
+ 'Nj': 'Nj',
+ 'Ⓞ': 'O',
+ 'O': 'O',
+ 'Ò': 'O',
+ 'Ó': 'O',
+ 'Ô': 'O',
+ 'Ồ': 'O',
+ 'Ố': 'O',
+ 'Ỗ': 'O',
+ 'Ổ': 'O',
+ 'Õ': 'O',
+ 'Ṍ': 'O',
+ 'Ȭ': 'O',
+ 'Ṏ': 'O',
+ 'Ō': 'O',
+ 'Ṑ': 'O',
+ 'Ṓ': 'O',
+ 'Ŏ': 'O',
+ 'Ȯ': 'O',
+ 'Ȱ': 'O',
+ 'Ö': 'O',
+ 'Ȫ': 'O',
+ 'Ỏ': 'O',
+ 'Ő': 'O',
+ 'Ǒ': 'O',
+ 'Ȍ': 'O',
+ 'Ȏ': 'O',
+ 'Ơ': 'O',
+ 'Ờ': 'O',
+ 'Ớ': 'O',
+ 'Ỡ': 'O',
+ 'Ở': 'O',
+ 'Ợ': 'O',
+ 'Ọ': 'O',
+ 'Ộ': 'O',
+ 'Ǫ': 'O',
+ 'Ǭ': 'O',
+ 'Ø': 'O',
+ 'Ǿ': 'O',
+ 'Ɔ': 'O',
+ 'Ɵ': 'O',
+ 'Ꝋ': 'O',
+ 'Ꝍ': 'O',
+ 'Ƣ': 'OI',
+ 'Ꝏ': 'OO',
+ 'Ȣ': 'OU',
+ 'Ⓟ': 'P',
+ 'P': 'P',
+ 'Ṕ': 'P',
+ 'Ṗ': 'P',
+ 'Ƥ': 'P',
+ 'Ᵽ': 'P',
+ 'Ꝑ': 'P',
+ 'Ꝓ': 'P',
+ 'Ꝕ': 'P',
+ 'Ⓠ': 'Q',
+ 'Q': 'Q',
+ 'Ꝗ': 'Q',
+ 'Ꝙ': 'Q',
+ 'Ɋ': 'Q',
+ 'Ⓡ': 'R',
+ 'R': 'R',
+ 'Ŕ': 'R',
+ 'Ṙ': 'R',
+ 'Ř': 'R',
+ 'Ȑ': 'R',
+ 'Ȓ': 'R',
+ 'Ṛ': 'R',
+ 'Ṝ': 'R',
+ 'Ŗ': 'R',
+ 'Ṟ': 'R',
+ 'Ɍ': 'R',
+ 'Ɽ': 'R',
+ 'Ꝛ': 'R',
+ 'Ꞧ': 'R',
+ 'Ꞃ': 'R',
+ 'Ⓢ': 'S',
+ 'S': 'S',
+ 'ẞ': 'S',
+ 'Ś': 'S',
+ 'Ṥ': 'S',
+ 'Ŝ': 'S',
+ 'Ṡ': 'S',
+ 'Š': 'S',
+ 'Ṧ': 'S',
+ 'Ṣ': 'S',
+ 'Ṩ': 'S',
+ 'Ș': 'S',
+ 'Ş': 'S',
+ 'Ȿ': 'S',
+ 'Ꞩ': 'S',
+ 'Ꞅ': 'S',
+ 'Ⓣ': 'T',
+ 'T': 'T',
+ 'Ṫ': 'T',
+ 'Ť': 'T',
+ 'Ṭ': 'T',
+ 'Ț': 'T',
+ 'Ţ': 'T',
+ 'Ṱ': 'T',
+ 'Ṯ': 'T',
+ 'Ŧ': 'T',
+ 'Ƭ': 'T',
+ 'Ʈ': 'T',
+ 'Ⱦ': 'T',
+ 'Ꞇ': 'T',
+ 'Ꜩ': 'TZ',
+ 'Ⓤ': 'U',
+ 'U': 'U',
+ 'Ù': 'U',
+ 'Ú': 'U',
+ 'Û': 'U',
+ 'Ũ': 'U',
+ 'Ṹ': 'U',
+ 'Ū': 'U',
+ 'Ṻ': 'U',
+ 'Ŭ': 'U',
+ 'Ü': 'U',
+ 'Ǜ': 'U',
+ 'Ǘ': 'U',
+ 'Ǖ': 'U',
+ 'Ǚ': 'U',
+ 'Ủ': 'U',
+ 'Ů': 'U',
+ 'Ű': 'U',
+ 'Ǔ': 'U',
+ 'Ȕ': 'U',
+ 'Ȗ': 'U',
+ 'Ư': 'U',
+ 'Ừ': 'U',
+ 'Ứ': 'U',
+ 'Ữ': 'U',
+ 'Ử': 'U',
+ 'Ự': 'U',
+ 'Ụ': 'U',
+ 'Ṳ': 'U',
+ 'Ų': 'U',
+ 'Ṷ': 'U',
+ 'Ṵ': 'U',
+ 'Ʉ': 'U',
+ 'Ⓥ': 'V',
+ 'V': 'V',
+ 'Ṽ': 'V',
+ 'Ṿ': 'V',
+ 'Ʋ': 'V',
+ 'Ꝟ': 'V',
+ 'Ʌ': 'V',
+ 'Ꝡ': 'VY',
+ 'Ⓦ': 'W',
+ 'W': 'W',
+ 'Ẁ': 'W',
+ 'Ẃ': 'W',
+ 'Ŵ': 'W',
+ 'Ẇ': 'W',
+ 'Ẅ': 'W',
+ 'Ẉ': 'W',
+ 'Ⱳ': 'W',
+ 'Ⓧ': 'X',
+ 'X': 'X',
+ 'Ẋ': 'X',
+ 'Ẍ': 'X',
+ 'Ⓨ': 'Y',
+ 'Y': 'Y',
+ 'Ỳ': 'Y',
+ 'Ý': 'Y',
+ 'Ŷ': 'Y',
+ 'Ỹ': 'Y',
+ 'Ȳ': 'Y',
+ 'Ẏ': 'Y',
+ 'Ÿ': 'Y',
+ 'Ỷ': 'Y',
+ 'Ỵ': 'Y',
+ 'Ƴ': 'Y',
+ 'Ɏ': 'Y',
+ 'Ỿ': 'Y',
+ 'Ⓩ': 'Z',
+ 'Z': 'Z',
+ 'Ź': 'Z',
+ 'Ẑ': 'Z',
+ 'Ż': 'Z',
+ 'Ž': 'Z',
+ 'Ẓ': 'Z',
+ 'Ẕ': 'Z',
+ 'Ƶ': 'Z',
+ 'Ȥ': 'Z',
+ 'Ɀ': 'Z',
+ 'Ⱬ': 'Z',
+ 'Ꝣ': 'Z',
+ 'ⓐ': 'a',
+ 'a': 'a',
+ 'ẚ': 'a',
+ 'à': 'a',
+ 'á': 'a',
+ 'â': 'a',
+ 'ầ': 'a',
+ 'ấ': 'a',
+ 'ẫ': 'a',
+ 'ẩ': 'a',
+ 'ã': 'a',
+ 'ā': 'a',
+ 'ă': 'a',
+ 'ằ': 'a',
+ 'ắ': 'a',
+ 'ẵ': 'a',
+ 'ẳ': 'a',
+ 'ȧ': 'a',
+ 'ǡ': 'a',
+ 'ä': 'a',
+ 'ǟ': 'a',
+ 'ả': 'a',
+ 'å': 'a',
+ 'ǻ': 'a',
+ 'ǎ': 'a',
+ 'ȁ': 'a',
+ 'ȃ': 'a',
+ 'ạ': 'a',
+ 'ậ': 'a',
+ 'ặ': 'a',
+ 'ḁ': 'a',
+ 'ą': 'a',
+ 'ⱥ': 'a',
+ 'ɐ': 'a',
+ 'ꜳ': 'aa',
+ 'æ': 'ae',
+ 'ǽ': 'ae',
+ 'ǣ': 'ae',
+ 'ꜵ': 'ao',
+ 'ꜷ': 'au',
+ 'ꜹ': 'av',
+ 'ꜻ': 'av',
+ 'ꜽ': 'ay',
+ 'ⓑ': 'b',
+ 'b': 'b',
+ 'ḃ': 'b',
+ 'ḅ': 'b',
+ 'ḇ': 'b',
+ 'ƀ': 'b',
+ 'ƃ': 'b',
+ 'ɓ': 'b',
+ 'ⓒ': 'c',
+ 'c': 'c',
+ 'ć': 'c',
+ 'ĉ': 'c',
+ 'ċ': 'c',
+ 'č': 'c',
+ 'ç': 'c',
+ 'ḉ': 'c',
+ 'ƈ': 'c',
+ 'ȼ': 'c',
+ 'ꜿ': 'c',
+ 'ↄ': 'c',
+ 'ⓓ': 'd',
+ 'd': 'd',
+ 'ḋ': 'd',
+ 'ď': 'd',
+ 'ḍ': 'd',
+ 'ḑ': 'd',
+ 'ḓ': 'd',
+ 'ḏ': 'd',
+ 'đ': 'd',
+ 'ƌ': 'd',
+ 'ɖ': 'd',
+ 'ɗ': 'd',
+ 'ꝺ': 'd',
+ 'dz': 'dz',
+ 'dž': 'dz',
+ 'ⓔ': 'e',
+ 'e': 'e',
+ 'è': 'e',
+ 'é': 'e',
+ 'ê': 'e',
+ 'ề': 'e',
+ 'ế': 'e',
+ 'ễ': 'e',
+ 'ể': 'e',
+ 'ẽ': 'e',
+ 'ē': 'e',
+ 'ḕ': 'e',
+ 'ḗ': 'e',
+ 'ĕ': 'e',
+ 'ė': 'e',
+ 'ë': 'e',
+ 'ẻ': 'e',
+ 'ě': 'e',
+ 'ȅ': 'e',
+ 'ȇ': 'e',
+ 'ẹ': 'e',
+ 'ệ': 'e',
+ 'ȩ': 'e',
+ 'ḝ': 'e',
+ 'ę': 'e',
+ 'ḙ': 'e',
+ 'ḛ': 'e',
+ 'ɇ': 'e',
+ 'ɛ': 'e',
+ 'ǝ': 'e',
+ 'ⓕ': 'f',
+ 'f': 'f',
+ 'ḟ': 'f',
+ 'ƒ': 'f',
+ 'ꝼ': 'f',
+ 'ⓖ': 'g',
+ 'g': 'g',
+ 'ǵ': 'g',
+ 'ĝ': 'g',
+ 'ḡ': 'g',
+ 'ğ': 'g',
+ 'ġ': 'g',
+ 'ǧ': 'g',
+ 'ģ': 'g',
+ 'ǥ': 'g',
+ 'ɠ': 'g',
+ 'ꞡ': 'g',
+ 'ᵹ': 'g',
+ 'ꝿ': 'g',
+ 'ⓗ': 'h',
+ 'h': 'h',
+ 'ĥ': 'h',
+ 'ḣ': 'h',
+ 'ḧ': 'h',
+ 'ȟ': 'h',
+ 'ḥ': 'h',
+ 'ḩ': 'h',
+ 'ḫ': 'h',
+ 'ẖ': 'h',
+ 'ħ': 'h',
+ 'ⱨ': 'h',
+ 'ⱶ': 'h',
+ 'ɥ': 'h',
+ 'ƕ': 'hv',
+ 'ⓘ': 'i',
+ 'i': 'i',
+ 'ì': 'i',
+ 'í': 'i',
+ 'î': 'i',
+ 'ĩ': 'i',
+ 'ī': 'i',
+ 'ĭ': 'i',
+ 'ï': 'i',
+ 'ḯ': 'i',
+ 'ỉ': 'i',
+ 'ǐ': 'i',
+ 'ȉ': 'i',
+ 'ȋ': 'i',
+ 'ị': 'i',
+ 'į': 'i',
+ 'ḭ': 'i',
+ 'ɨ': 'i',
+ 'ı': 'i',
+ 'ⓙ': 'j',
+ 'j': 'j',
+ 'ĵ': 'j',
+ 'ǰ': 'j',
+ 'ɉ': 'j',
+ 'ⓚ': 'k',
+ 'k': 'k',
+ 'ḱ': 'k',
+ 'ǩ': 'k',
+ 'ḳ': 'k',
+ 'ķ': 'k',
+ 'ḵ': 'k',
+ 'ƙ': 'k',
+ 'ⱪ': 'k',
+ 'ꝁ': 'k',
+ 'ꝃ': 'k',
+ 'ꝅ': 'k',
+ 'ꞣ': 'k',
+ 'ⓛ': 'l',
+ 'l': 'l',
+ 'ŀ': 'l',
+ 'ĺ': 'l',
+ 'ľ': 'l',
+ 'ḷ': 'l',
+ 'ḹ': 'l',
+ 'ļ': 'l',
+ 'ḽ': 'l',
+ 'ḻ': 'l',
+ 'ſ': 'l',
+ 'ł': 'l',
+ 'ƚ': 'l',
+ 'ɫ': 'l',
+ 'ⱡ': 'l',
+ 'ꝉ': 'l',
+ 'ꞁ': 'l',
+ 'ꝇ': 'l',
+ 'lj': 'lj',
+ 'ⓜ': 'm',
+ 'm': 'm',
+ 'ḿ': 'm',
+ 'ṁ': 'm',
+ 'ṃ': 'm',
+ 'ɱ': 'm',
+ 'ɯ': 'm',
+ 'ⓝ': 'n',
+ 'n': 'n',
+ 'ǹ': 'n',
+ 'ń': 'n',
+ 'ñ': 'n',
+ 'ṅ': 'n',
+ 'ň': 'n',
+ 'ṇ': 'n',
+ 'ņ': 'n',
+ 'ṋ': 'n',
+ 'ṉ': 'n',
+ 'ƞ': 'n',
+ 'ɲ': 'n',
+ 'ʼn': 'n',
+ 'ꞑ': 'n',
+ 'ꞥ': 'n',
+ 'nj': 'nj',
+ 'ⓞ': 'o',
+ 'o': 'o',
+ 'ò': 'o',
+ 'ó': 'o',
+ 'ô': 'o',
+ 'ồ': 'o',
+ 'ố': 'o',
+ 'ỗ': 'o',
+ 'ổ': 'o',
+ 'õ': 'o',
+ 'ṍ': 'o',
+ 'ȭ': 'o',
+ 'ṏ': 'o',
+ 'ō': 'o',
+ 'ṑ': 'o',
+ 'ṓ': 'o',
+ 'ŏ': 'o',
+ 'ȯ': 'o',
+ 'ȱ': 'o',
+ 'ö': 'o',
+ 'ȫ': 'o',
+ 'ỏ': 'o',
+ 'ő': 'o',
+ 'ǒ': 'o',
+ 'ȍ': 'o',
+ 'ȏ': 'o',
+ 'ơ': 'o',
+ 'ờ': 'o',
+ 'ớ': 'o',
+ 'ỡ': 'o',
+ 'ở': 'o',
+ 'ợ': 'o',
+ 'ọ': 'o',
+ 'ộ': 'o',
+ 'ǫ': 'o',
+ 'ǭ': 'o',
+ 'ø': 'o',
+ 'ǿ': 'o',
+ 'ɔ': 'o',
+ 'ꝋ': 'o',
+ 'ꝍ': 'o',
+ 'ɵ': 'o',
+ 'ƣ': 'oi',
+ 'ȣ': 'ou',
+ 'ꝏ': 'oo',
+ 'ⓟ': 'p',
+ 'p': 'p',
+ 'ṕ': 'p',
+ 'ṗ': 'p',
+ 'ƥ': 'p',
+ 'ᵽ': 'p',
+ 'ꝑ': 'p',
+ 'ꝓ': 'p',
+ 'ꝕ': 'p',
+ 'ⓠ': 'q',
+ 'q': 'q',
+ 'ɋ': 'q',
+ 'ꝗ': 'q',
+ 'ꝙ': 'q',
+ 'ⓡ': 'r',
+ 'r': 'r',
+ 'ŕ': 'r',
+ 'ṙ': 'r',
+ 'ř': 'r',
+ 'ȑ': 'r',
+ 'ȓ': 'r',
+ 'ṛ': 'r',
+ 'ṝ': 'r',
+ 'ŗ': 'r',
+ 'ṟ': 'r',
+ 'ɍ': 'r',
+ 'ɽ': 'r',
+ 'ꝛ': 'r',
+ 'ꞧ': 'r',
+ 'ꞃ': 'r',
+ 'ⓢ': 's',
+ 's': 's',
+ 'ß': 's',
+ 'ś': 's',
+ 'ṥ': 's',
+ 'ŝ': 's',
+ 'ṡ': 's',
+ 'š': 's',
+ 'ṧ': 's',
+ 'ṣ': 's',
+ 'ṩ': 's',
+ 'ș': 's',
+ 'ş': 's',
+ 'ȿ': 's',
+ 'ꞩ': 's',
+ 'ꞅ': 's',
+ 'ẛ': 's',
+ 'ⓣ': 't',
+ 't': 't',
+ 'ṫ': 't',
+ 'ẗ': 't',
+ 'ť': 't',
+ 'ṭ': 't',
+ 'ț': 't',
+ 'ţ': 't',
+ 'ṱ': 't',
+ 'ṯ': 't',
+ 'ŧ': 't',
+ 'ƭ': 't',
+ 'ʈ': 't',
+ 'ⱦ': 't',
+ 'ꞇ': 't',
+ 'ꜩ': 'tz',
+ 'ⓤ': 'u',
+ 'u': 'u',
+ 'ù': 'u',
+ 'ú': 'u',
+ 'û': 'u',
+ 'ũ': 'u',
+ 'ṹ': 'u',
+ 'ū': 'u',
+ 'ṻ': 'u',
+ 'ŭ': 'u',
+ 'ü': 'u',
+ 'ǜ': 'u',
+ 'ǘ': 'u',
+ 'ǖ': 'u',
+ 'ǚ': 'u',
+ 'ủ': 'u',
+ 'ů': 'u',
+ 'ű': 'u',
+ 'ǔ': 'u',
+ 'ȕ': 'u',
+ 'ȗ': 'u',
+ 'ư': 'u',
+ 'ừ': 'u',
+ 'ứ': 'u',
+ 'ữ': 'u',
+ 'ử': 'u',
+ 'ự': 'u',
+ 'ụ': 'u',
+ 'ṳ': 'u',
+ 'ų': 'u',
+ 'ṷ': 'u',
+ 'ṵ': 'u',
+ 'ʉ': 'u',
+ 'ⓥ': 'v',
+ 'v': 'v',
+ 'ṽ': 'v',
+ 'ṿ': 'v',
+ 'ʋ': 'v',
+ 'ꝟ': 'v',
+ 'ʌ': 'v',
+ 'ꝡ': 'vy',
+ 'ⓦ': 'w',
+ 'w': 'w',
+ 'ẁ': 'w',
+ 'ẃ': 'w',
+ 'ŵ': 'w',
+ 'ẇ': 'w',
+ 'ẅ': 'w',
+ 'ẘ': 'w',
+ 'ẉ': 'w',
+ 'ⱳ': 'w',
+ 'ⓧ': 'x',
+ 'x': 'x',
+ 'ẋ': 'x',
+ 'ẍ': 'x',
+ 'ⓨ': 'y',
+ 'y': 'y',
+ 'ỳ': 'y',
+ 'ý': 'y',
+ 'ŷ': 'y',
+ 'ỹ': 'y',
+ 'ȳ': 'y',
+ 'ẏ': 'y',
+ 'ÿ': 'y',
+ 'ỷ': 'y',
+ 'ẙ': 'y',
+ 'ỵ': 'y',
+ 'ƴ': 'y',
+ 'ɏ': 'y',
+ 'ỿ': 'y',
+ 'ⓩ': 'z',
+ 'z': 'z',
+ 'ź': 'z',
+ 'ẑ': 'z',
+ 'ż': 'z',
+ 'ž': 'z',
+ 'ẓ': 'z',
+ 'ẕ': 'z',
+ 'ƶ': 'z',
+ 'ȥ': 'z',
+ 'ɀ': 'z',
+ 'ⱬ': 'z',
+ 'ꝣ': 'z',
+ 'Ά': 'Α',
+ 'Έ': 'Ε',
+ 'Ή': 'Η',
+ 'Ί': 'Ι',
+ 'Ϊ': 'Ι',
+ 'Ό': 'Ο',
+ 'Ύ': 'Υ',
+ 'Ϋ': 'Υ',
+ 'Ώ': 'Ω',
+ 'ά': 'α',
+ 'έ': 'ε',
+ 'ή': 'η',
+ 'ί': 'ι',
+ 'ϊ': 'ι',
+ 'ΐ': 'ι',
+ 'ό': 'ο',
+ 'ύ': 'υ',
+ 'ϋ': 'υ',
+ 'ΰ': 'υ',
+ 'ω': 'ω',
+ 'ς': 'σ'
+ };
+
+ // Copied from Select2
+
+ function stripDiacritics(text) {
+ // Used 'uni range + named function' from http://jsperf.com/diacritics/18
+ function match(a) {
+ return DIACRITICS[a] || a;
+ }
+
+ return ('' + text).replace(/[^\u0000-\u007E]/g, match);
+ }
+
+ function defaultMatcher(value, text) {
+ return text === '' || stripDiacritics(value).toUpperCase().indexOf(stripDiacritics(text).toUpperCase()) > -1;
+ }
+});
+define('ember-resolver/container-debug-adapter', ['exports', 'ember', 'ember-resolver/utils/module-registry'], function (exports, _ember, _emberResolverUtilsModuleRegistry) {
+ 'use strict';
+
+ var ContainerDebugAdapter = _ember['default'].ContainerDebugAdapter;
+
+ var ModulesContainerDebugAdapter = null;
+
+ function getPod(type, key, prefix) {
+ var match = key.match(new RegExp('^/?' + prefix + '/(.+)/' + type + '$'));
+ if (match) {
+ return match[1];
+ }
+ }
+
+ // Support Ember < 1.5-beta.4
+ // TODO: Remove this after 1.5.0 is released
+ if (typeof ContainerDebugAdapter !== 'undefined') {
+
+ /*
+ * This module defines a subclass of Ember.ContainerDebugAdapter that adds two
+ * important features:
+ *
+ * 1) is able provide injections to classes that implement `extend`
+ * (as is typical with Ember).
+ */
+
+ ModulesContainerDebugAdapter = ContainerDebugAdapter.extend({
+ _moduleRegistry: null,
+
+ init: function init() {
+ this._super.apply(this, arguments);
+
+ if (!this._moduleRegistry) {
+ this._moduleRegistry = new _emberResolverUtilsModuleRegistry['default']();
+ }
+ },
+
+ /**
+ The container of the application being debugged.
+ This property will be injected
+ on creation.
+ @property container
+ @default null
+ */
+
+ /**
+ The resolver instance of the application
+ being debugged. This property will be injected
+ on creation.
+ @property resolver
+ @default null
+ */
+
+ /**
+ Returns true if it is possible to catalog a list of available
+ classes in the resolver for a given type.
+ @method canCatalogEntriesByType
+ @param {string} type The type. e.g. "model", "controller", "route"
+ @return {boolean} whether a list is available for this type.
+ */
+ canCatalogEntriesByType: function canCatalogEntriesByType() /* type */{
+ return true;
+ },
+
+ /**
+ Returns the available classes a given type.
+ @method catalogEntriesByType
+ @param {string} type The type. e.g. "model", "controller", "route"
+ @return {Array} An array of classes.
+ */
+ catalogEntriesByType: function catalogEntriesByType(type) {
+ var moduleNames = this._moduleRegistry.moduleNames();
+ var types = _ember['default'].A();
+
+ var prefix = this.namespace.modulePrefix;
+
+ for (var i = 0, l = moduleNames.length; i < l; i++) {
+ var key = moduleNames[i];
+
+ if (key.indexOf(type) !== -1) {
+ // Check if it's a pod module
+ var name = getPod(type, key, this.namespace.podModulePrefix || prefix);
+ if (!name) {
+ // Not pod
+ name = key.split(type + 's/').pop();
+
+ // Support for different prefix (such as ember-cli addons).
+ // Uncomment the code below when
+ // https://github.com/ember-cli/ember-resolver/pull/80 is merged.
+
+ //var match = key.match('^/?(.+)/' + type);
+ //if (match && match[1] !== prefix) {
+ // Different prefix such as an addon
+ //name = match[1] + '@' + name;
+ //}
+ }
+ types.addObject(name);
+ }
+ }
+ return types;
+ }
+ });
+ }
+
+ exports['default'] = ModulesContainerDebugAdapter;
+});
+define('ember-resolver/index', ['exports', 'ember-resolver/resolver'], function (exports, _emberResolverResolver) {
+ 'use strict';
+
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _emberResolverResolver['default'];
+ }
+ });
+});
+define('ember-resolver/resolver', ['exports', 'ember', 'ember-resolver/utils/module-registry', 'ember-resolver/utils/class-factory', 'ember-resolver/utils/make-dictionary'], function (exports, _ember, _emberResolverUtilsModuleRegistry, _emberResolverUtilsClassFactory, _emberResolverUtilsMakeDictionary) {
+ /*globals require */
+
+ 'use strict';
+
+ /*
+ * This module defines a subclass of Ember.DefaultResolver that adds two
+ * important features:
+ *
+ * 1) The resolver makes the container aware of es6 modules via the AMD
+ * output. The loader's _moduleEntries is consulted so that classes can be
+ * resolved directly via the module loader, without needing a manual
+ * `import`.
+ * 2) is able to provide injections to classes that implement `extend`
+ * (as is typical with Ember).
+ */
+
+ var _Ember$String = _ember['default'].String;
+ var underscore = _Ember$String.underscore;
+ var classify = _Ember$String.classify;
+ var get = _ember['default'].get;
+ var DefaultResolver = _ember['default'].DefaultResolver;
+
+ function parseName(fullName) {
+ /*jshint validthis:true */
+
+ if (fullName.parsedName === true) {
+ return fullName;
+ }
+
+ var prefix, type, name;
+ var fullNameParts = fullName.split('@');
+
+ // HTMLBars uses helper:@content-helper which collides
+ // with ember-cli namespace detection.
+ // This will be removed in a future release of HTMLBars.
+ if (fullName !== 'helper:@content-helper' && fullNameParts.length === 2) {
+ var prefixParts = fullNameParts[0].split(':');
+
+ if (prefixParts.length === 2) {
+ prefix = prefixParts[1];
+ type = prefixParts[0];
+ name = fullNameParts[1];
+ } else {
+ var nameParts = fullNameParts[1].split(':');
+
+ prefix = fullNameParts[0];
+ type = nameParts[0];
+ name = nameParts[1];
+ }
+ } else {
+ fullNameParts = fullName.split(':');
+ type = fullNameParts[0];
+ name = fullNameParts[1];
+ }
+
+ var fullNameWithoutType = name;
+ var namespace = get(this, 'namespace');
+ var root = namespace;
+
+ return {
+ parsedName: true,
+ fullName: fullName,
+ prefix: prefix || this.prefix({ type: type }),
+ type: type,
+ fullNameWithoutType: fullNameWithoutType,
+ name: name,
+ root: root,
+ resolveMethodName: "resolve" + classify(type)
+ };
+ }
+
+ function resolveOther(parsedName) {
+ /*jshint validthis:true */
+
+ _ember['default'].assert('`modulePrefix` must be defined', this.namespace.modulePrefix);
+
+ var normalizedModuleName = this.findModuleName(parsedName);
+
+ if (normalizedModuleName) {
+ var defaultExport = this._extractDefaultExport(normalizedModuleName, parsedName);
+
+ if (defaultExport === undefined) {
+ throw new Error(" Expected to find: '" + parsedName.fullName + "' within '" + normalizedModuleName + "' but got 'undefined'. Did you forget to `export default` within '" + normalizedModuleName + "'?");
+ }
+
+ if (this.shouldWrapInClassFactory(defaultExport, parsedName)) {
+ defaultExport = (0, _emberResolverUtilsClassFactory['default'])(defaultExport);
+ }
+
+ return defaultExport;
+ } else {
+ return this._super(parsedName);
+ }
+ }
+
+ // Ember.DefaultResolver docs:
+ // https://github.com/emberjs/ember.js/blob/master/packages/ember-application/lib/system/resolver.js
+ var Resolver = DefaultResolver.extend({
+ resolveOther: resolveOther,
+ parseName: parseName,
+ resolveTemplate: resolveOther,
+ pluralizedTypes: null,
+ moduleRegistry: null,
+
+ makeToString: function makeToString(factory, fullName) {
+ return '' + this.namespace.modulePrefix + '@' + fullName + ':';
+ },
+
+ shouldWrapInClassFactory: function shouldWrapInClassFactory() /* module, parsedName */{
+ return false;
+ },
+
+ init: function init() {
+ this._super();
+ this.moduleBasedResolver = true;
+
+ if (!this._moduleRegistry) {
+ this._moduleRegistry = new _emberResolverUtilsModuleRegistry['default']();
+ }
+
+ this._normalizeCache = (0, _emberResolverUtilsMakeDictionary['default'])();
+
+ this.pluralizedTypes = this.pluralizedTypes || (0, _emberResolverUtilsMakeDictionary['default'])();
+
+ if (!this.pluralizedTypes.config) {
+ this.pluralizedTypes.config = 'config';
+ }
+
+ this._deprecatedPodModulePrefix = false;
+ },
+
+ normalize: function normalize(fullName) {
+ return this._normalizeCache[fullName] || (this._normalizeCache[fullName] = this._normalize(fullName));
+ },
+
+ _normalize: function _normalize(fullName) {
+ // replace `.` with `/` in order to make nested controllers work in the following cases
+ // 1. `needs: ['posts/post']`
+ // 2. `{{render "posts/post"}}`
+ // 3. `this.render('posts/post')` from Route
+ var split = fullName.split(':');
+ if (split.length > 1) {
+ return split[0] + ':' + _ember['default'].String.dasherize(split[1].replace(/\./g, '/'));
+ } else {
+ return fullName;
+ }
+ },
+
+ pluralize: function pluralize(type) {
+ return this.pluralizedTypes[type] || (this.pluralizedTypes[type] = type + 's');
+ },
+
+ podBasedLookupWithPrefix: function podBasedLookupWithPrefix(podPrefix, parsedName) {
+ var fullNameWithoutType = parsedName.fullNameWithoutType;
+
+ if (parsedName.type === 'template') {
+ fullNameWithoutType = fullNameWithoutType.replace(/^components\//, '');
+ }
+
+ return podPrefix + '/' + fullNameWithoutType + '/' + parsedName.type;
+ },
+
+ podBasedModuleName: function podBasedModuleName(parsedName) {
+ var podPrefix = this.namespace.podModulePrefix || this.namespace.modulePrefix;
+
+ return this.podBasedLookupWithPrefix(podPrefix, parsedName);
+ },
+
+ podBasedComponentsInSubdir: function podBasedComponentsInSubdir(parsedName) {
+ var podPrefix = this.namespace.podModulePrefix || this.namespace.modulePrefix;
+ podPrefix = podPrefix + '/components';
+
+ if (parsedName.type === 'component' || parsedName.fullNameWithoutType.match(/^components/)) {
+ return this.podBasedLookupWithPrefix(podPrefix, parsedName);
+ }
+ },
+
+ resolveEngine: function resolveEngine(parsedName) {
+ var engineName = parsedName.fullNameWithoutType;
+ var engineModule = engineName + '/engine';
+
+ if (this._moduleRegistry.has(engineModule)) {
+ return this._extractDefaultExport(engineModule);
+ }
+ },
+
+ resolveRouteMap: function resolveRouteMap(parsedName) {
+ var engineName = parsedName.fullNameWithoutType;
+ var engineRoutesModule = engineName + '/routes';
+
+ if (this._moduleRegistry.has(engineRoutesModule)) {
+ var routeMap = this._extractDefaultExport(engineRoutesModule);
+
+ _ember['default'].assert('The route map for ' + engineName + ' should be wrapped by \'buildRoutes\' before exporting.', routeMap.isRouteMap);
+
+ return routeMap;
+ }
+ },
+
+ mainModuleName: function mainModuleName(parsedName) {
+ // if router:main or adapter:main look for a module with just the type first
+ var tmpModuleName = parsedName.prefix + '/' + parsedName.type;
+
+ if (parsedName.fullNameWithoutType === 'main') {
+ return tmpModuleName;
+ }
+ },
+
+ defaultModuleName: function defaultModuleName(parsedName) {
+ return parsedName.prefix + '/' + this.pluralize(parsedName.type) + '/' + parsedName.fullNameWithoutType;
+ },
+
+ prefix: function prefix(parsedName) {
+ var tmpPrefix = this.namespace.modulePrefix;
+
+ if (this.namespace[parsedName.type + 'Prefix']) {
+ tmpPrefix = this.namespace[parsedName.type + 'Prefix'];
+ }
+
+ return tmpPrefix;
+ },
+
+ /**
+ A listing of functions to test for moduleName's based on the provided
+ `parsedName`. This allows easy customization of additional module based
+ lookup patterns.
+ @property moduleNameLookupPatterns
+ @returns {Ember.Array}
+ */
+ moduleNameLookupPatterns: _ember['default'].computed(function () {
+ return [this.podBasedModuleName, this.podBasedComponentsInSubdir, this.mainModuleName, this.defaultModuleName];
+ }),
+
+ findModuleName: function findModuleName(parsedName, loggingDisabled) {
+ var moduleNameLookupPatterns = this.get('moduleNameLookupPatterns');
+ var moduleName;
+
+ for (var index = 0, _length = moduleNameLookupPatterns.length; index < _length; index++) {
+ var item = moduleNameLookupPatterns[index];
+
+ var tmpModuleName = item.call(this, parsedName);
+
+ // allow treat all dashed and all underscored as the same thing
+ // supports components with dashes and other stuff with underscores.
+ if (tmpModuleName) {
+ tmpModuleName = this.chooseModuleName(tmpModuleName);
+ }
+
+ if (tmpModuleName && this._moduleRegistry.has(tmpModuleName)) {
+ moduleName = tmpModuleName;
+ }
+
+ if (!loggingDisabled) {
+ this._logLookup(moduleName, parsedName, tmpModuleName);
+ }
+
+ if (moduleName) {
+ return moduleName;
+ }
+ }
+ },
+
+ chooseModuleName: function chooseModuleName(moduleName) {
+ var underscoredModuleName = underscore(moduleName);
+
+ if (moduleName !== underscoredModuleName && this._moduleRegistry.has(moduleName) && this._moduleRegistry.has(underscoredModuleName)) {
+ throw new TypeError("Ambiguous module names: `" + moduleName + "` and `" + underscoredModuleName + "`");
+ }
+
+ if (this._moduleRegistry.has(moduleName)) {
+ return moduleName;
+ } else if (this._moduleRegistry.has(underscoredModuleName)) {
+ return underscoredModuleName;
+ } else {
+ // workaround for dasherized partials:
+ // something/something/-something => something/something/_something
+ var partializedModuleName = moduleName.replace(/\/-([^\/]*)$/, '/_$1');
+
+ if (this._moduleRegistry.has(partializedModuleName)) {
+ _ember['default'].deprecate('Modules should not contain underscores. ' + 'Attempted to lookup "' + moduleName + '" which ' + 'was not found. Please rename "' + partializedModuleName + '" ' + 'to "' + moduleName + '" instead.', false, { id: 'ember-resolver.underscored-modules', until: '3.0.0' });
+
+ return partializedModuleName;
+ } else {
+ return moduleName;
+ }
+ }
+ },
+
+ // used by Ember.DefaultResolver.prototype._logLookup
+ lookupDescription: function lookupDescription(fullName) {
+ var parsedName = this.parseName(fullName);
+
+ var moduleName = this.findModuleName(parsedName, true);
+
+ return moduleName;
+ },
+
+ // only needed until 1.6.0-beta.2 can be required
+ _logLookup: function _logLookup(found, parsedName, description) {
+ if (!_ember['default'].ENV.LOG_MODULE_RESOLVER && !parsedName.root.LOG_RESOLVER) {
+ return;
+ }
+
+ var symbol, padding;
+
+ if (found) {
+ symbol = '[✓]';
+ } else {
+ symbol = '[ ]';
+ }
+
+ if (parsedName.fullName.length > 60) {
+ padding = '.';
+ } else {
+ padding = new Array(60 - parsedName.fullName.length).join('.');
+ }
+
+ if (!description) {
+ description = this.lookupDescription(parsedName);
+ }
+
+ _ember['default'].Logger.info(symbol, parsedName.fullName, padding, description);
+ },
+
+ knownForType: function knownForType(type) {
+ var moduleKeys = this._moduleRegistry.moduleNames();
+
+ var items = (0, _emberResolverUtilsMakeDictionary['default'])();
+ for (var index = 0, length = moduleKeys.length; index < length; index++) {
+ var moduleName = moduleKeys[index];
+ var fullname = this.translateToContainerFullname(type, moduleName);
+
+ if (fullname) {
+ items[fullname] = true;
+ }
+ }
+
+ return items;
+ },
+
+ translateToContainerFullname: function translateToContainerFullname(type, moduleName) {
+ var prefix = this.prefix({ type: type });
+
+ // Note: using string manipulation here rather than regexes for better performance.
+ // pod modules
+ // '^' + prefix + '/(.+)/' + type + '$'
+ var podPrefix = prefix + '/';
+ var podSuffix = '/' + type;
+ var start = moduleName.indexOf(podPrefix);
+ var end = moduleName.indexOf(podSuffix);
+
+ if (start === 0 && end === moduleName.length - podSuffix.length && moduleName.length > podPrefix.length + podSuffix.length) {
+ return type + ':' + moduleName.slice(start + podPrefix.length, end);
+ }
+
+ // non-pod modules
+ // '^' + prefix + '/' + pluralizedType + '/(.+)$'
+ var pluralizedType = this.pluralize(type);
+ var nonPodPrefix = prefix + '/' + pluralizedType + '/';
+
+ if (moduleName.indexOf(nonPodPrefix) === 0 && moduleName.length > nonPodPrefix.length) {
+ return type + ':' + moduleName.slice(nonPodPrefix.length);
+ }
+ },
+
+ _extractDefaultExport: function _extractDefaultExport(normalizedModuleName) {
+ var module = require(normalizedModuleName, null, null, true /* force sync */);
+
+ if (module && module['default']) {
+ module = module['default'];
+ }
+
+ return module;
+ }
+ });
+
+ Resolver.reopenClass({
+ moduleBasedResolver: true
+ });
+
+ exports['default'] = Resolver;
+});
+define('ember-resolver/utils/class-factory', ['exports'], function (exports) {
+ 'use strict';
+
+ exports['default'] = classFactory;
+
+ function classFactory(klass) {
+ return {
+ create: function create(injections) {
+ if (typeof klass.extend === 'function') {
+ return klass.extend(injections);
+ } else {
+ return klass;
+ }
+ }
+ };
+ }
+});
+define("ember-resolver/utils/create", ["exports", "ember"], function (exports, _ember) {
+ "use strict";
+
+ var create = Object.create || _ember["default"].create;
+ if (!(create && !create(null).hasOwnProperty)) {
+ throw new Error("This browser does not support Object.create(null), please polyfil with es5-sham: http://git.io/yBU2rg");
+ }
+
+ exports["default"] = create;
+});
+define('ember-resolver/utils/make-dictionary', ['exports', 'ember-resolver/utils/create'], function (exports, _emberResolverUtilsCreate) {
+ 'use strict';
+
+ exports['default'] = makeDictionary;
+
+ function makeDictionary() {
+ var cache = (0, _emberResolverUtilsCreate['default'])(null);
+ cache['_dict'] = null;
+ delete cache['_dict'];
+ return cache;
+ }
+});
+define('ember-resolver/utils/module-registry', ['exports', 'ember'], function (exports, _ember) {
+ /*globals requirejs, require */
+
+ 'use strict';
+
+ if (typeof requirejs.entries === 'undefined') {
+ requirejs.entries = requirejs._eak_seen;
+ }
+
+ function ModuleRegistry(entries) {
+ this._entries = entries || requirejs.entries;
+ }
+
+ ModuleRegistry.prototype.moduleNames = function ModuleRegistry_moduleNames() {
+ return (Object.keys || _ember['default'].keys)(this._entries);
+ };
+
+ ModuleRegistry.prototype.has = function ModuleRegistry_has(moduleName) {
+ return moduleName in this._entries;
+ };
+
+ ModuleRegistry.prototype.get = function ModuleRegistry_get(moduleName) {
+ var exportName = arguments.length <= 1 || arguments[1] === undefined ? 'default' : arguments[1];
+
+ var module = require(moduleName);
+ return module && module[exportName];
+ };
+
+ exports['default'] = ModuleRegistry;
+});
+define('ember-tooltips/components/tooltip-on-parent', ['exports', 'ember', 'ember-tooltips/templates/components/tooltip-on-parent'], function (exports, _ember, _emberTooltipsTemplatesComponentsTooltipOnParent) {
+ 'use strict';
+
+ var computed = _ember['default'].computed;
+ var run = _ember['default'].run;
+ var get = _ember['default'].get;
+
+ exports['default'] = _ember['default'].Component.extend({
+ attributeBindings: ['style'],
+ layout: _emberTooltipsTemplatesComponentsTooltipOnParent['default'],
+
+ style: computed(function () {
+ return _ember['default'].String.htmlSafe('display:none;');
+ }),
+
+ init: function init() {
+ var _this = this;
+
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ this._super(args);
+
+ run.schedule('afterRender', function () {
+ var parentView = _this.get('parentView');
+
+ if (!parentView) {
+ console.warn('No parentView found');
+ } else if (parentView.renderTooltip) {
+ parentView.renderTooltip(_this);
+ } else {
+ console.warn('No renderTooltip method found on the parent view of the {{tooltip-on-parent}} component');
+ }
+
+ _this.remove();
+ });
+ }
+
+ });
+});
+define('ember-tooltips/mixins/components/tooltips', ['exports', 'ember', 'ember-tooltips/utils/render-tooltip'], function (exports, _ember, _emberTooltipsUtilsRenderTooltip) {
+ 'use strict';
+
+ var on = _ember['default'].on;
+ var run = _ember['default'].run;
+ var Tooltip = window.Tooltip;
+
+ exports['default'] = _ember['default'].Mixin.create({
+
+ /**
+ The tooltip object
+ @property tooltip
+ @type Object
+ */
+
+ tooltip: null,
+
+ /**
+ A list of Tooltip properties currently supported
+ by this addon
+ @property tooltipSupportedProperties
+ @type Array
+ */
+
+ tooltipSupportedProperties: ['auto', 'content', 'duration', 'delay', 'delayOnChange', 'effectClass', 'event', 'hideOn', 'place', 'showOn', 'spacing', 'tabIndex', 'typeClass', 'visibility'],
+
+ /* Tooltip options - see http://darsa.in/tooltip/ */
+
+ tooltipAuto: true,
+ tooltipContent: null,
+ tooltipDuration: null,
+ tooltipEffectClass: 'slide', // fade, grow, slide, null
+ tooltipEvent: 'hover', // hover, click, focus, ready, or none
+ tooltipHideOn: null,
+ tooltipPlace: 'top',
+ tooltipShowOn: null,
+ tooltipSpacing: 10,
+ tooltipDelay: 0,
+ tooltipDelayOnChange: true, // tooltips should listen to the above `delay` option by default
+ tooltipTabIndex: 0, // A positive integer (to enable) or -1 (to disable)
+ tooltipTypeClass: null,
+ tooltipVisibility: null, // for manual-mode triggering
+
+ /**
+ Removes a tooltip from the DOM if the element it is attached
+ to is destroyed.
+ @method destroyTooltip
+ */
+
+ destroyTooltip: on('willDestroyElement', function () {
+ var tooltip = this.get('tooltip');
+
+ if (tooltip && tooltip instanceof Tooltip) {
+ tooltip.effect(null); // Remove animation
+ tooltip.detach(); // Remove the tooltip from the document
+ this.$().off(); // Remove all event listeners
+ }
+
+ /* Remove observer, even if it was never added */
+
+ this.removeObserver('tooltipVisibility', this, this._tooltipVisibilityDidChange);
+ this.removeObserver('tooltipContent', this, this._tooltipContentDidChange);
+ }),
+
+ /**
+ Adds a tooltip to the current component using the values of the tooltip
+ properties on this component's helper or, if a `{{tooltip-on-parent}}` component is
+ passed, the values set on that component.
+ In the latter case, the `{{tooltip-on-parent}}` block template will
+ be used for the tooltip content.
+ ## Example 1 - Setting values on a component
+ ```hbs
+ {{#some-component tooltipContent='This will show' tooltipPlace='right'}}
+ Hover over me
+ {{/some-component}}
+ ```
+ ## Example 2 - Using a child component
+ ```hbs
+ {{#some-component}}
+ {{#tooltip-on-parent place='right'}}
+ This will show
+ {{/tooltip-on-parent}}
+ Hover over me
+ {{/some-component}}
+ ```
+ Usually you won't have to call the `renderTooltip` method directly but it's still
+ made publically available. In the above examples, the components handle calling
+ this `renderTooltip()` method at the correct time.
+ Supported options are in the format tooltip{$capitalizedProperty} where
+ capitalizedProperty is each property, capitalized, in tooltipSupportedProperties.
+ @method renderTooltip
+ @param [maybeTooltipComponent] An optionally-passed component for a `{{tooltip-on-parent}}` class
+ */
+
+ renderTooltip: on('didInsertElement', function (maybeTooltipComponent) {
+ var componentWasPassed = _ember['default'].typeOf(maybeTooltipComponent) === 'instance';
+ var component = componentWasPassed ? maybeTooltipComponent : _ember['default'].Object.create({});
+ var renderContext = componentWasPassed ? component : this;
+
+ var content = this.get('tooltipContent');
+ var tooltip = undefined,
+ tooltipOptions = undefined;
+
+ var keys = Object.keys(this);
+ var hasTooltipContentProperty = _ember['default'].$.inArray('tooltipContent', keys) !== -1;
+
+ if (componentWasPassed) {
+ var componentContent = component.get('content');
+
+ if (componentContent) {
+ content = componentContent;
+ } else {
+ content = component.get('element').innerHTML;
+ }
+ }
+
+ if (!content && !hasTooltipContentProperty) {
+ return;
+ }
+
+ tooltipOptions = {
+ content: content
+ };
+
+ this.get('tooltipSupportedProperties').forEach(function (property) {
+
+ /* Ignore content because we dealt with it already */
+
+ if (property === 'content') {
+ return;
+ }
+
+ var capitalizedProperty = _ember['default'].String.capitalize(property);
+
+ tooltipOptions[property] = component.get(property) || this.get('tooltip' + capitalizedProperty);
+ }, this);
+
+ tooltip = (0, _emberTooltipsUtilsRenderTooltip['default'])(this.get('element'), tooltipOptions, renderContext);
+
+ this.set('tooltip', tooltip);
+
+ /* Bind observer if tooltipContent changes */
+
+ this.addObserver('tooltipContent', this, this._tooltipContentDidChange);
+
+ /* Bind observer if in manual-triggering mode */
+
+ if (tooltipOptions.event === 'manual' || tooltipOptions.event === 'none') {
+ if (componentWasPassed) {
+
+ /* Keep track of child tooltip component */
+
+ this.set('tooltipChildComponent', component);
+
+ /* Turn 'tooltipVisibility' into a computed property, reading
+ from child tooltip component's 'visibility' option */
+
+ _ember['default'].defineProperty(this, 'tooltipVisibility', _ember['default'].computed.reads('tooltipChildComponent.visibility'));
+ }
+
+ this.addObserver('tooltipVisibility', this, this._tooltipVisibilityDidChange);
+ this._tooltipVisibilityDidChange();
+ }
+ }),
+
+ /**
+ Updates the content value of the tooltip with value of 'tooltipContent'.
+ @method _tooltipContentDidChange
+ @private
+ */
+
+ _tooltipContentDidChange: function _tooltipContentDidChange() {
+ var tooltip = this.get('tooltip');
+
+ if (tooltip) {
+ var tooltipContent = this.get('tooltipContent');
+ if (tooltipContent instanceof _ember['default'].Handlebars.SafeString) {
+ // Convert SafeString to regular string
+ tooltipContent = tooltipContent.toString();
+ }
+ tooltip.content(tooltipContent);
+ }
+ },
+
+ /**
+ Opens or closes tooltip based on value of 'tooltipVisibility'.
+ Only used when event is 'manual'.
+ @method _tooltipVisibilityDidChange
+ @private
+ */
+
+ _tooltipVisibilityDidChange: function _tooltipVisibilityDidChange() {
+ var tooltip = this.get('tooltip');
+
+ run.cancel(this._delayTimer);
+ if (this.get('tooltipVisibility')) {
+ this._delayTimer = run.later(tooltip, 'show', this.get('tooltipDelay'));
+ } else {
+ tooltip.hide();
+ }
+ },
+
+ /**
+ Call this method on any component to attach tooltips to all elements in its
+ template that have a `.tooltip` class. Tooltip options are set using
+ data attributes.
+ ```hbs
+ {{!--app/templates/components/some-widget.hbs--}}
+
+ Hover over me!
+
+ ```
+ ```js
+ // app/components/some-widget.js
+ export default Ember.Component.extend({
+ renderTooltipsInTemplate: function() {
+ this.renderTooltip();
+ }.on('didInsertElement'),
+ });
+ ```
+ Supported options are in the format data-tooltip-{$dasherizedProperty} where
+ dasherizedProperty is each property, dasherized, in tooltipSupportedProperties.
+ @method renderChildTooltips
+ */
+
+ renderChildTooltips: function renderChildTooltips() {
+ var _this = this;
+ var tooltipSupportedProperties = this.get('tooltipSupportedProperties');
+
+ _ember['default'].run.scheduleOnce('render', this, function () {
+ var tooltipOptions = {};
+
+ this.$().find('.has-tooltip').each(function () {
+ var $element = _ember['default'].$(this);
+
+ tooltipSupportedProperties.forEach(function (property) {
+ var capitalizedProperty = _ember['default'].String.capitalize(property);
+ var dasherizedProperty = _ember['default'].String.dasherize(property);
+ var value = $element.data('tooltip-' + dasherizedProperty);
+
+ tooltipOptions[property] = value || _this.get('tooltip' + capitalizedProperty);
+ }, this);
+
+ (0, _emberTooltipsUtilsRenderTooltip['default'])(this, tooltipOptions);
+ });
+ });
+ }
+
+ });
+});
+define("ember-tooltips/templates/components/tooltip-on-parent", ["exports"], function (exports) {
+ "use strict";
+
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 2,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ember-tooltips/templates/components/tooltip-on-parent.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["content", "yield", ["loc", [null, [1, 0], [1, 9]]]]],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define('ember-tooltips/utils/render-tooltip', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports['default'] = renderTooltip;
+
+ var Tooltip = window.Tooltip;
+ var $ = _ember['default'].$;
+ var run = _ember['default'].run;
+ var SafeString = _ember['default'].Handlebars.SafeString;
+
+ var tooltipIndex = 1;
+
+ /**
+ A utility to attach a tooltip to a DOM element.
+
+ @submodule utils
+ @method renderTooltip
+ @param {Element} domElement The DOM element, not jQuery element, to attach the tooltip to
+ @param {Object} options The tooltip options to render the tooltip with
+ */
+ function renderTooltip(domElement, options, context) {
+
+ _ember['default'].assert('You must pass a DOM element as the first argument to the renderTooltip util', !domElement || domElement && !!domElement.tagName);
+
+ var $domElement = $(domElement);
+ var parsedOptions = parseTooltipOptions(options);
+ var content = parsedOptions.content;
+ var duration = parsedOptions.duration;
+ var event = parsedOptions.event;
+ var hideOn = parsedOptions.hideOn;
+ var tabIndex = parsedOptions.tabIndex;
+ var showOn = parsedOptions.showOn;
+ var delay = parsedOptions.delay;
+ var delayOnChange = parsedOptions.delayOnChange;
+
+ var tooltipId = 'tooltip-' + tooltipIndex;
+
+ var $tooltip = undefined,
+ tooltip = undefined;
+
+ /**
+ @method setTooltipVisibility
+ @private
+ */
+
+ function setTooltipVisibility(shouldShow) {
+
+ /* We debounce to avoid focus causing issues
+ when showOn and hideOn are the same event */
+
+ run.debounce(function () {
+
+ run.cancel(tooltip._delayTimer);
+
+ /* If we're setting visibility to the value
+ it already is, do nothing... */
+
+ if (tooltip.hidden === shouldShow) {
+ return;
+ }
+
+ if (context && context.isDestroying) {
+ return;
+ }
+
+ /* Clean previously queued removal (if present) */
+ run.cancel(tooltip._hideTimer);
+
+ if (shouldShow) {
+
+ var showTooltipDelay = delay;
+ if (!delayOnChange) {
+ // If the `delayOnChange` property is set to false, we don't want to delay opening this tooltip if there is
+ // already a tooltip visible in the DOM. Check that here and adjust the delay as needed.
+ var visibleTooltips = _ember['default'].$('.tooltip').length;
+ showTooltipDelay = visibleTooltips ? 0 : delay;
+ }
+
+ tooltip._delayTimer = run.later(function () {
+ tooltip.show();
+ $tooltip.attr('aria-hidden', false);
+ if (context) {
+ context.set('tooltipVisibility', true);
+ }
+ $domElement.attr('aria-describedby', tooltipId);
+ if (duration) {
+ /* Hide tooltip after specified duration */
+ var hideTimer = run.later(tooltip, 'hide', duration);
+
+ /* Save timer ID for cancelling should an event
+ hide the tooltop before the duration */
+ tooltip._hideTimer = hideTimer;
+ }
+ }, showTooltipDelay);
+ } else {
+ tooltip.hide();
+ $tooltip.attr('aria-hidden', true);
+ if (context) {
+ context.set('tooltipVisibility', false);
+ }
+ $domElement.removeAttr('aria-describedby');
+ }
+ }, 150);
+ }
+
+ /**
+ @method parseTooltipOptions
+ @private
+ Manipulate the options object
+ */
+
+ function parseTooltipOptions() {
+ var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
+
+ var newOptions = options;
+ var content = newOptions.content;
+ var duration = newOptions.duration;
+ var event = newOptions.event;
+ var tabIndex = newOptions.tabIndex;
+ var typeClass = newOptions.typeClass;
+ var delay = newOptions.delay;
+
+ /* Prefix type class */
+
+ if (typeClass) {
+ newOptions.typeClass = 'tooltip-' + typeClass;
+ }
+
+ /* Set the correct hide and show events */
+
+ if (!newOptions.showOn) {
+ if (event === 'hover') {
+ newOptions.showOn = 'mouseenter';
+ } else {
+ newOptions.showOn = event;
+ }
+ }
+
+ if (!newOptions.hideOn) {
+ if (event === 'hover') {
+ newOptions.hideOn = 'mouseleave';
+ } else if (event === 'focus') {
+ newOptions.hideOn = 'blur';
+ } else if (event === 'ready') {
+ newOptions.hideOn = null;
+ } else {
+ newOptions.hideOn = event;
+ }
+ }
+
+ /* If duration is passed as a string, make it a number */
+
+ if (duration && typeof duration === 'string') {
+ var cleanDuration = parseInt(duration, 10);
+
+ /* Remove invalid parseInt results */
+
+ if (isNaN(cleanDuration) || !isFinite(cleanDuration)) {
+ cleanDuration = null;
+ }
+
+ newOptions.duration = cleanDuration;
+ }
+
+ if (delay && typeof delay === 'string') {
+ var cleanDelay = parseInt(delay, 10);
+
+ /* Remove invalid parseInt results */
+
+ if (isNaN(cleanDelay) || !isFinite(cleanDelay)) {
+ cleanDelay = 0;
+ }
+
+ newOptions.delay = cleanDelay;
+ }
+ /* Make tab index a string */
+
+ if (typeof tabIndex === 'number') {
+ newOptions.tabIndex = tabIndex.toString();
+ } else if (!tabIndex) {
+ newOptions.tabIndex = '-1';
+ }
+
+ /* Make sure content can be passed as a SafeString */
+
+ if (content instanceof SafeString) {
+ newOptions.content = content.toString();
+ }
+
+ return newOptions;
+ }
+
+ /* First, create the tooltip and set the variables */
+
+ tooltip = new Tooltip(content, parsedOptions);
+ $tooltip = $(tooltip.element);
+
+ tooltip.attach(domElement);
+
+ if (event !== 'manual' && event !== 'none') {
+
+ /* If show and hide are the same (e.g. click), toggle
+ the visibility */
+
+ if (showOn === hideOn) {
+ $domElement.on(showOn, function () {
+ setTooltipVisibility(!!tooltip.hidden);
+ });
+ } else {
+
+ /* Else, add the show and hide events individually */
+
+ if (showOn !== 'none') {
+ $domElement.on(showOn, function () {
+ setTooltipVisibility(true);
+ });
+ }
+
+ if (hideOn !== 'none') {
+ $domElement.on(hideOn, function () {
+ setTooltipVisibility(false);
+ });
+ }
+ }
+
+ /* Hide and show the tooltip on focus and escape
+ for acessibility */
+
+ if (event !== 'focus') {
+ $domElement.focusin(function () {
+ setTooltipVisibility(true);
+ });
+
+ $domElement.focusout(function () {
+ setTooltipVisibility(false);
+ });
+ }
+
+ $domElement.keydown(function (keyEvent) {
+ if (keyEvent.which === 27) {
+ setTooltipVisibility(false);
+ keyEvent.preventDefault();
+
+ return false;
+ }
+ });
+ }
+
+ /* Setup ARIA attributes for acessibility */
+
+ $tooltip.attr({
+ id: tooltipId,
+ role: 'tooltip'
+ });
+
+ $domElement.attr({
+ tabindex: $domElement.attr('tabindex') || tabIndex
+ });
+
+ // title: $domElement.attr('title') || content.toString(), // Removed for #9
+ tooltipIndex++;
+
+ return tooltip;
+ }
+});
+define('ember-truth-helpers/helpers/and', ['exports', 'ember-truth-helpers/utils/truth-convert'], function (exports, _emberTruthHelpersUtilsTruthConvert) {
+ 'use strict';
+
+ exports.andHelper = andHelper;
+
+ function andHelper(params) {
+ for (var i = 0, len = params.length; i < len; i++) {
+ if ((0, _emberTruthHelpersUtilsTruthConvert['default'])(params[i]) === false) {
+ return params[i];
+ }
+ }
+ return params[params.length - 1];
+ }
+});
+define("ember-truth-helpers/helpers/equal", ["exports"], function (exports) {
+ "use strict";
+
+ exports.equalHelper = equalHelper;
+
+ function equalHelper(params) {
+ return params[0] === params[1];
+ }
+});
+define('ember-truth-helpers/helpers/gt', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.gtHelper = gtHelper;
+
+ function gtHelper(params, hash) {
+ var left = params[0];
+ var right = params[1];
+ if (hash.forceNumber) {
+ if (typeof left !== 'number') {
+ left = Number(left);
+ }
+ if (typeof right !== 'number') {
+ right = Number(right);
+ }
+ }
+ return left > right;
+ }
+});
+define('ember-truth-helpers/helpers/gte', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.gteHelper = gteHelper;
+
+ function gteHelper(params, hash) {
+ var left = params[0];
+ var right = params[1];
+ if (hash.forceNumber) {
+ if (typeof left !== 'number') {
+ left = Number(left);
+ }
+ if (typeof right !== 'number') {
+ right = Number(right);
+ }
+ }
+ return left >= right;
+ }
+});
+define('ember-truth-helpers/helpers/is-array', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports.isArrayHelper = isArrayHelper;
+
+ function isArrayHelper(params) {
+ for (var i = 0, len = params.length; i < len; i++) {
+ if (_ember['default'].isArray(params[i]) === false) {
+ return false;
+ }
+ }
+ return true;
+ }
+});
+define('ember-truth-helpers/helpers/lt', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.ltHelper = ltHelper;
+
+ function ltHelper(params, hash) {
+ var left = params[0];
+ var right = params[1];
+ if (hash.forceNumber) {
+ if (typeof left !== 'number') {
+ left = Number(left);
+ }
+ if (typeof right !== 'number') {
+ right = Number(right);
+ }
+ }
+ return left < right;
+ }
+});
+define('ember-truth-helpers/helpers/lte', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.lteHelper = lteHelper;
+
+ function lteHelper(params, hash) {
+ var left = params[0];
+ var right = params[1];
+ if (hash.forceNumber) {
+ if (typeof left !== 'number') {
+ left = Number(left);
+ }
+ if (typeof right !== 'number') {
+ right = Number(right);
+ }
+ }
+ return left <= right;
+ }
+});
+define("ember-truth-helpers/helpers/not-equal", ["exports"], function (exports) {
+ "use strict";
+
+ exports.notEqualHelper = notEqualHelper;
+
+ function notEqualHelper(params) {
+ return params[0] !== params[1];
+ }
+});
+define('ember-truth-helpers/helpers/not', ['exports', 'ember-truth-helpers/utils/truth-convert'], function (exports, _emberTruthHelpersUtilsTruthConvert) {
+ 'use strict';
+
+ exports.notHelper = notHelper;
+
+ function notHelper(params) {
+ for (var i = 0, len = params.length; i < len; i++) {
+ if ((0, _emberTruthHelpersUtilsTruthConvert['default'])(params[i]) === true) {
+ return false;
+ }
+ }
+ return true;
+ }
+});
+define('ember-truth-helpers/helpers/or', ['exports', 'ember-truth-helpers/utils/truth-convert'], function (exports, _emberTruthHelpersUtilsTruthConvert) {
+ 'use strict';
+
+ exports.orHelper = orHelper;
+
+ function orHelper(params) {
+ for (var i = 0, len = params.length; i < len; i++) {
+ if ((0, _emberTruthHelpersUtilsTruthConvert['default'])(params[i]) === true) {
+ return params[i];
+ }
+ }
+ return params[params.length - 1];
+ }
+});
+define('ember-truth-helpers/helpers/xor', ['exports', 'ember-truth-helpers/utils/truth-convert'], function (exports, _emberTruthHelpersUtilsTruthConvert) {
+ 'use strict';
+
+ exports.xorHelper = xorHelper;
+
+ function xorHelper(params) {
+ return (0, _emberTruthHelpersUtilsTruthConvert['default'])(params[0]) !== (0, _emberTruthHelpersUtilsTruthConvert['default'])(params[1]);
+ }
+});
+define('ember-truth-helpers/utils/register-helper', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports.registerHelper = registerHelper;
+
+ function registerHelperIteration1(name, helperFunction) {
+ //earlier versions of ember with htmlbars used this
+ _ember['default'].HTMLBars.helpers[name] = _ember['default'].HTMLBars.makeBoundHelper(helperFunction);
+ }
+
+ function registerHelperIteration2(name, helperFunction) {
+ //registerHelper has been made private as _registerHelper
+ //this is kept here if anyone is using it
+ _ember['default'].HTMLBars.registerHelper(name, _ember['default'].HTMLBars.makeBoundHelper(helperFunction));
+ }
+
+ function registerHelperIteration3(name, helperFunction) {
+ //latest versin of ember uses this
+ _ember['default'].HTMLBars._registerHelper(name, _ember['default'].HTMLBars.makeBoundHelper(helperFunction));
+ }
+
+ function registerHelper(name, helperFunction) {
+ // Do not register helpers from Ember 1.13 onwards, starting from 1.13 they
+ // will be auto-discovered.
+ if (_ember['default'].Helper) {
+ return;
+ }
+
+ if (_ember['default'].HTMLBars._registerHelper) {
+ if (_ember['default'].HTMLBars.helpers) {
+ registerHelperIteration1(name, helperFunction);
+ } else {
+ registerHelperIteration3(name, helperFunction);
+ }
+ } else if (_ember['default'].HTMLBars.registerHelper) {
+ registerHelperIteration2(name, helperFunction);
+ }
+ }
+});
+define('ember-truth-helpers/utils/truth-convert', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ exports['default'] = truthConvert;
+
+ function truthConvert(result) {
+ var truthy = result && _ember['default'].get(result, 'isTruthy');
+ if (typeof truthy === 'boolean') {
+ return truthy;
+ }
+
+ if (_ember['default'].isArray(result)) {
+ return _ember['default'].get(result, 'length') !== 0;
+ } else {
+ return !!result;
+ }
+ }
+});
+define('ember-wormhole/components/ember-wormhole', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ var computed = _ember['default'].computed;
+ var observer = _ember['default'].observer;
+ var run = _ember['default'].run;
+
+ exports['default'] = _ember['default'].Component.extend({
+ to: computed.alias('destinationElementId'),
+ destinationElementId: null,
+ destinationElement: computed('destinationElementId', 'renderInPlace', function () {
+ return this.get('renderInPlace') ? this.element : document.getElementById(this.get('destinationElementId'));
+ }),
+ renderInPlace: false,
+
+ didInsertElement: function didInsertElement() {
+ this._super.apply(this, arguments);
+ this._firstNode = this.element.firstChild;
+ this._lastNode = this.element.lastChild;
+ this.appendToDestination();
+ },
+
+ willDestroyElement: function willDestroyElement() {
+ var _this = this;
+
+ this._super.apply(this, arguments);
+ var firstNode = this._firstNode;
+ var lastNode = this._lastNode;
+ run.schedule('render', function () {
+ _this.removeRange(firstNode, lastNode);
+ });
+ },
+
+ destinationDidChange: observer('destinationElement', function () {
+ var destinationElement = this.get('destinationElement');
+ if (destinationElement !== this._firstNode.parentNode) {
+ run.schedule('render', this, 'appendToDestination');
+ }
+ }),
+
+ appendToDestination: function appendToDestination() {
+ var destinationElement = this.get('destinationElement');
+ var currentActiveElement = document.activeElement;
+ if (!destinationElement) {
+ var destinationElementId = this.get('destinationElementId');
+ if (destinationElementId) {
+ throw new Error('ember-wormhole failed to render into \'#' + this.get('destinationElementId') + '\' because the element is not in the DOM');
+ }
+ throw new Error('ember-wormhole failed to render content because the destinationElementId was set to an undefined or falsy value.');
+ }
+
+ this.appendRange(destinationElement, this._firstNode, this._lastNode);
+ if (document.activeElement !== currentActiveElement) {
+ currentActiveElement.focus();
+ }
+ },
+
+ appendRange: function appendRange(destinationElement, firstNode, lastNode) {
+ while (firstNode) {
+ destinationElement.insertBefore(firstNode, null);
+ firstNode = firstNode !== lastNode ? lastNode.parentNode.firstChild : null;
+ }
+ },
+
+ removeRange: function removeRange(firstNode, lastNode) {
+ var node = lastNode;
+ do {
+ var next = node.previousSibling;
+ if (node.parentNode) {
+ node.parentNode.removeChild(node);
+ if (node === firstNode) {
+ break;
+ }
+ }
+ node = next;
+ } while (node);
+ }
+
+ });
+});
+define('ivy-codemirror/components/ivy-codemirror', ['exports', 'codemirror', 'ember'], function (exports, _codemirror, _ember) {
+ 'use strict';
+
+ exports['default'] = _ember['default'].Component.extend({
+ /**
+ * The value of the editor.
+ *
+ * @property value
+ * @type {String}
+ * @default null
+ */
+ value: null,
+
+ autofocus: false,
+ coverGutterNextToScrollbar: false,
+ electricChars: true,
+ extraKeys: null,
+ firstLineNumber: 1,
+ fixedGutter: true,
+ historyEventDelay: 1250,
+ indentUnit: 2,
+ indentWithTabs: false,
+ keyMap: 'default',
+ lineNumbers: false,
+ lineWrapping: false,
+ mode: null,
+ readOnly: false,
+ rtlMoveVisually: true,
+ showCursorWhenSelecting: false,
+ smartIndent: true,
+ tabSize: 4,
+ tabindex: null,
+ theme: 'default',
+ undoDepth: 200,
+
+ tagName: 'textarea',
+
+ /**
+ * Force CodeMirror to refresh.
+ *
+ * @method refresh
+ */
+ refresh: function refresh() {
+ this.get('codeMirror').refresh();
+ },
+
+ _initCodemirror: _ember['default'].on('didInsertElement', function () {
+ var codeMirror = _codemirror['default'].fromTextArea(this.get('element'));
+
+ // Stash away the CodeMirror instance.
+ this.set('codeMirror', codeMirror);
+
+ // Set up handlers for CodeMirror events.
+ this._bindCodeMirrorEvent('change', this, '_updateValue');
+
+ // Set up bindings for CodeMirror options.
+ this._bindCodeMirrorOption('autofocus');
+ this._bindCodeMirrorOption('coverGutterNextToScrollbar');
+ this._bindCodeMirrorOption('electricChars');
+ this._bindCodeMirrorOption('extraKeys');
+ this._bindCodeMirrorOption('firstLineNumber');
+ this._bindCodeMirrorOption('fixedGutter');
+ this._bindCodeMirrorOption('historyEventDelay');
+ this._bindCodeMirrorOption('indentUnit');
+ this._bindCodeMirrorOption('indentWithTabs');
+ this._bindCodeMirrorOption('keyMap');
+ this._bindCodeMirrorOption('lineNumbers');
+ this._bindCodeMirrorOption('lineWrapping');
+ this._bindCodeMirrorOption('mode');
+ this._bindCodeMirrorOption('readOnly');
+ this._bindCodeMirrorOption('rtlMoveVisually');
+ this._bindCodeMirrorOption('showCursorWhenSelecting');
+ this._bindCodeMirrorOption('smartIndent');
+ this._bindCodeMirrorOption('tabSize');
+ this._bindCodeMirrorOption('tabindex');
+ this._bindCodeMirrorOption('theme');
+ this._bindCodeMirrorOption('undoDepth');
+
+ this._bindCodeMirrorProperty('value', this, '_valueDidChange');
+ this._valueDidChange();
+
+ // Force a refresh on `becameVisible`, since CodeMirror won't render itself
+ // onto a hidden element.
+ this.on('becameVisible', this, 'refresh');
+ }),
+
+ /**
+ * Bind a handler for `event`, to be torn down in `willDestroyElement`.
+ *
+ * @private
+ * @method _bindCodeMirrorEvent
+ */
+ _bindCodeMirrorEvent: function _bindCodeMirrorEvent(event, target, method) {
+ var callback = _ember['default'].run.bind(target, method);
+
+ this.get('codeMirror').on(event, callback);
+
+ this.on('willDestroyElement', this, function () {
+ this.get('codeMirror').off(event, callback);
+ });
+ },
+
+ /**
+ * @private
+ * @method _bindCodeMirrorProperty
+ */
+ _bindCodeMirrorOption: function _bindCodeMirrorOption(key) {
+ this._bindCodeMirrorProperty(key, this, '_optionDidChange');
+
+ // Set the initial option synchronously.
+ this._optionDidChange(this, key);
+ },
+
+ /**
+ * Bind an observer on `key`, to be torn down in `willDestroyElement`.
+ *
+ * @private
+ * @method _bindCodeMirrorProperty
+ */
+ _bindCodeMirrorProperty: function _bindCodeMirrorProperty(key, target, method) {
+ this.addObserver(key, target, method);
+
+ this.on('willDestroyElement', this, function () {
+ this.removeObserver(key, target, method);
+ });
+ },
+
+ /**
+ * Sync a local option value with CodeMirror.
+ *
+ * @private
+ * @method _optionDidChange
+ */
+ _optionDidChange: function _optionDidChange(sender, key) {
+ this.get('codeMirror').setOption(key, this.get(key));
+ },
+
+ /**
+ * Update the `value` property when a CodeMirror `change` event occurs.
+ *
+ * @private
+ * @method _updateValue
+ */
+ _updateValue: function _updateValue(instance, changeObj) {
+ var value = instance.getValue();
+ this.set('value', value);
+ this.sendAction('valueUpdated', value, instance, changeObj);
+ },
+
+ _valueDidChange: function _valueDidChange() {
+ var codeMirror = this.get('codeMirror'),
+ value = this.get('value');
+
+ if (value !== codeMirror.getValue()) {
+ codeMirror.setValue(value || '');
+ }
+ }
+ });
+});
+define('ivy-tabs/components/ivy-tab-list', ['exports', 'ember', 'ivy-tabs/templates/components/ivy-tab-list'], function (exports, _ember, _ivyTabsTemplatesComponentsIvyTabList) {
+ 'use strict';
+
+ /**
+ * @module ivy-tabs
+ */
+
+ /**
+ * @class IvyTabListComponent
+ * @namespace IvyTabs
+ * @extends Ember.Component
+ */
+ exports['default'] = _ember['default'].Component.extend({
+ layout: _ivyTabsTemplatesComponentsIvyTabList['default'],
+
+ tagName: 'ul',
+ attributeBindings: ['aria-multiselectable', 'role'],
+ classNames: ['ivy-tab-list'],
+
+ init: function init() {
+ this._super.apply(this, arguments);
+ _ember['default'].run.once(this, this._registerWithTabsContainer);
+ },
+
+ willDestroy: function willDestroy() {
+ this._super.apply(this, arguments);
+ _ember['default'].run.once(this, this._unregisterWithTabsContainer);
+ },
+
+ /**
+ * Tells screenreaders that only one tab can be selected at a time.
+ *
+ * @property aria-multiselectable
+ * @type String
+ * @default 'false'
+ */
+ 'aria-multiselectable': 'false',
+
+ /**
+ * The `role` attribute of the tab list element.
+ *
+ * See http://www.w3.org/TR/wai-aria/roles#tablist
+ *
+ * @property role
+ * @type String
+ * @default 'tablist'
+ */
+ role: 'tablist',
+
+ /**
+ * Gives focus to the selected tab.
+ *
+ * @method focusSelectedTab
+ */
+ focusSelectedTab: function focusSelectedTab() {
+ this.get('selectedTab').$().focus();
+ },
+
+ /**
+ * Event handler for navigating tabs via arrow keys. The left (or up) arrow
+ * selects the previous tab, while the right (or down) arrow selects the next
+ * tab.
+ *
+ * @method navigateOnKeyDown
+ * @param {Event} event
+ */
+ navigateOnKeyDown: _ember['default'].on('keyDown', function (event) {
+ switch (event.keyCode) {
+ case 37: /* left */
+ case 38:
+ /* up */
+ this.selectPreviousTab();
+ break;
+ case 39: /* right */
+ case 40:
+ /* down */
+ this.selectNextTab();
+ break;
+ default:
+ return;
+ }
+
+ event.preventDefault();
+ _ember['default'].run.scheduleOnce('afterRender', this, this.focusSelectedTab);
+ }),
+
+ /**
+ * Adds a tab to the `tabs` array.
+ *
+ * @method registerTab
+ * @param {IvyTabs.IvyTabComponent} tab
+ */
+ registerTab: function registerTab(tab) {
+ this.get('tabs').pushObject(tab);
+ },
+
+ /**
+ * Selects the next tab in the list, if any.
+ *
+ * @method selectNextTab
+ */
+ selectNextTab: function selectNextTab() {
+ var index = this.get('selected-index') + 1;
+ if (index === this.get('tabs.length')) {
+ index = 0;
+ }
+ this.selectTabByIndex(index);
+ },
+
+ /**
+ * Selects the previous tab in the list, if any.
+ *
+ * @method selectPreviousTab
+ */
+ selectPreviousTab: function selectPreviousTab() {
+ var index = this.get('selected-index') - 1;
+
+ // Previous from the first tab should select the last tab.
+ if (index < 0) {
+ index = this.get('tabs.length') - 1;
+ }
+ // This would only happen if there are no tabs, so stay at 0.
+ if (index < 0) {
+ index = 0;
+ }
+
+ this.selectTabByIndex(index);
+ },
+
+ 'selected-index': _ember['default'].computed.alias('tabsContainer.selected-index'),
+
+ /**
+ * The currently-selected `ivy-tab` instance.
+ *
+ * @property selectedTab
+ * @type IvyTabs.IvyTabComponent
+ */
+ selectedTab: _ember['default'].computed(function () {
+ return this.get('tabs').objectAt(this.get('selected-index'));
+ }).property('selected-index', 'tabs.[]'),
+
+ /**
+ * Select the given tab.
+ *
+ * @method selectTab
+ * @param {IvyTabs.IvyTabComponent} tab
+ */
+ selectTab: function selectTab(tab) {
+ this.selectTabByIndex(this.get('tabs').indexOf(tab));
+ },
+
+ /**
+ * Select the tab at `index`.
+ *
+ * @method selectTabByIndex
+ * @param {Number} index
+ */
+ selectTabByIndex: function selectTabByIndex(index) {
+ this.sendAction('on-select', index);
+ },
+
+ tabs: _ember['default'].computed(function () {
+ return _ember['default'].A();
+ }).readOnly(),
+
+ /**
+ * The `ivy-tabs` component.
+ *
+ * @property tabsContainer
+ * @type IvyTabs.IvyTabsComponent
+ * @default null
+ */
+ tabsContainer: null,
+
+ /**
+ * Removes a tab from the `tabs` array.
+ *
+ * @method unregisterTab
+ * @param {IvyTabs.IvyTabComponent} tab
+ */
+ unregisterTab: function unregisterTab(tab) {
+ var index = tab.get('index');
+ this.get('tabs').removeObject(tab);
+
+ if (index < this.get('selected-index')) {
+ this.selectPreviousTab();
+ } else if (tab.get('isSelected')) {
+ if (index !== 0) {
+ this.selectPreviousTab();
+ }
+ }
+ },
+
+ _registerWithTabsContainer: function _registerWithTabsContainer() {
+ this.get('tabsContainer').registerTabList(this);
+ },
+
+ _unregisterWithTabsContainer: function _unregisterWithTabsContainer() {
+ this.get('tabsContainer').unregisterTabList(this);
+ }
+ });
+});
+define('ivy-tabs/components/ivy-tab-panel', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ /**
+ * @module ivy-tabs
+ */
+
+ /**
+ * @class IvyTabPanelComponent
+ * @namespace IvyTabs
+ * @extends Ember.Component
+ */
+ exports['default'] = _ember['default'].Component.extend({
+ attributeBindings: ['aria-hidden', 'aria-labelledby', 'role'],
+ classNames: ['ivy-tab-panel'],
+ classNameBindings: ['active'],
+
+ init: function init() {
+ this._super.apply(this, arguments);
+ _ember['default'].run.once(this, this._registerWithTabsContainer);
+ },
+
+ willDestroy: function willDestroy() {
+ this._super.apply(this, arguments);
+ _ember['default'].run.once(this, this._unregisterWithTabsContainer);
+ },
+
+ /**
+ * Tells screenreaders whether or not the panel is visible.
+ *
+ * See http://www.w3.org/TR/wai-aria/states_and_properties#aria-hidden
+ *
+ * @property aria-hidden
+ * @type Boolean
+ * @readOnly
+ */
+ 'aria-hidden': _ember['default'].computed.not('isSelected').readOnly(),
+
+ /**
+ * Tells screenreaders which tab labels this panel.
+ *
+ * See http://www.w3.org/TR/wai-aria/states_and_properties#aria-labelledby
+ *
+ * @property aria-labelledby
+ * @type String
+ * @readOnly
+ */
+ 'aria-labelledby': _ember['default'].computed.alias('tab.elementId').readOnly(),
+
+ /**
+ * See http://www.w3.org/TR/wai-aria/roles#tabpanel
+ *
+ * @property role
+ * @type String
+ * @default 'tabpanel'
+ */
+ role: 'tabpanel',
+
+ /**
+ * Accessed as a className binding to apply the panel's `activeClass` CSS
+ * class to the element when the panel's `isSelected` property is true.
+ *
+ * @property active
+ * @type String
+ * @readOnly
+ */
+ active: _ember['default'].computed(function () {
+ if (this.get('isSelected')) {
+ return this.get('activeClass');
+ }
+ }).property('isSelected'),
+
+ /**
+ * The CSS class to apply to a panel's element when its `isSelected` property
+ * is `true`.
+ *
+ * @property activeClass
+ * @type String
+ * @default 'active'
+ */
+ activeClass: 'active',
+
+ /**
+ * The index of this panel in the `ivy-tabs` component.
+ *
+ * @property index
+ * @type Number
+ */
+ index: _ember['default'].computed(function () {
+ return this.get('tabPanels').indexOf(this);
+ }).property('tabPanels.[]'),
+
+ /**
+ * Whether or not this panel's associated tab is selected.
+ *
+ * @property isSelected
+ * @type Boolean
+ * @readOnly
+ */
+ isSelected: _ember['default'].computed.alias('tab.isSelected').readOnly(),
+
+ /**
+ * If `false`, this panel will appear hidden in the DOM. This is an alias to
+ * `isSelected`.
+ *
+ * @property isVisible
+ * @type Boolean
+ * @readOnly
+ */
+ isVisible: _ember['default'].computed.alias('isSelected').readOnly(),
+
+ /**
+ * The `ivy-tab` associated with this panel.
+ *
+ * @property tab
+ * @type IvyTabs.IvyTabComponent
+ */
+ tab: _ember['default'].computed(function () {
+ var tabs = this.get('tabs');
+ if (tabs) {
+ return tabs.objectAt(this.get('index'));
+ }
+ }).property('tabs.[]', 'index'),
+
+ /**
+ * The `ivy-tab-list` component this panel belongs to.
+ *
+ * @property tabList
+ * @type IvyTabs.IvyTabListComponent
+ * @readOnly
+ */
+ tabList: _ember['default'].computed.alias('tabsContainer.tabList').readOnly(),
+
+ /**
+ * The array of all `ivy-tab-panel` instances within the `ivy-tabs`
+ * component.
+ *
+ * @property tabPanels
+ * @type Array | IvyTabs.IvyTabPanelComponent
+ * @readOnly
+ */
+ tabPanels: _ember['default'].computed.alias('tabsContainer.tabPanels').readOnly(),
+
+ /**
+ * The array of all `ivy-tab` instances within the `ivy-tab-list` component.
+ *
+ * @property tabs
+ * @type Array | IvyTabs.IvyTabComponent
+ * @readOnly
+ */
+ tabs: _ember['default'].computed.alias('tabList.tabs').readOnly(),
+
+ /**
+ * The `ivy-tabs` component.
+ *
+ * @property tabsContainer
+ * @type IvyTabs.IvyTabsComponent
+ * @default null
+ */
+ tabsContainer: null,
+
+ _registerWithTabsContainer: function _registerWithTabsContainer() {
+ this.get('tabsContainer').registerTabPanel(this);
+ },
+
+ _unregisterWithTabsContainer: function _unregisterWithTabsContainer() {
+ this.get('tabsContainer').unregisterTabPanel(this);
+ }
+ });
+});
+define('ivy-tabs/components/ivy-tab', ['exports', 'ember'], function (exports, _ember) {
+ 'use strict';
+
+ /**
+ * @module ivy-tabs
+ */
+
+ /**
+ * @class IvyTabComponent
+ * @namespace IvyTabs
+ * @extends Ember.Component
+ */
+ exports['default'] = _ember['default'].Component.extend({
+ tagName: 'li',
+ attributeBindings: ['aria-controls', 'aria-expanded', 'aria-selected', 'role', 'selected', 'tabindex'],
+ classNames: ['ivy-tab'],
+ classNameBindings: ['active'],
+
+ init: function init() {
+ this._super.apply(this, arguments);
+ _ember['default'].run.once(this, this._registerWithTabList);
+ },
+
+ willDestroy: function willDestroy() {
+ this._super.apply(this, arguments);
+ _ember['default'].run.once(this, this._unregisterWithTabList);
+ },
+
+ /**
+ * Tells screenreaders which panel this tab controls.
+ *
+ * See http://www.w3.org/TR/wai-aria/states_and_properties#aria-controls
+ *
+ * @property aria-controls
+ * @type String
+ * @readOnly
+ */
+ 'aria-controls': _ember['default'].computed.alias('tabPanel.elementId').readOnly(),
+
+ /**
+ * Tells screenreaders whether or not this tab's panel is expanded.
+ *
+ * See http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded
+ *
+ * @property aria-expanded
+ * @type String
+ * @readOnly
+ */
+ 'aria-expanded': _ember['default'].computed.alias('aria-selected').readOnly(),
+
+ /**
+ * Tells screenreaders whether or not this tab is selected.
+ *
+ * See http://www.w3.org/TR/wai-aria/states_and_properties#aria-selected
+ *
+ * @property aria-selected
+ * @type String
+ */
+ 'aria-selected': _ember['default'].computed(function () {
+ return this.get('isSelected') + ''; // coerce to 'true' or 'false'
+ }).property('isSelected'),
+
+ /**
+ * The `role` attribute of the tab element.
+ *
+ * See http://www.w3.org/TR/wai-aria/roles#tab
+ *
+ * @property role
+ * @type String
+ * @default 'tab'
+ */
+ role: 'tab',
+
+ /**
+ * The `selected` attribute of the tab element. If the tab's `isSelected`
+ * property is `true` this will be the literal string 'selected', otherwise
+ * it will be `undefined`.
+ *
+ * @property selected
+ * @type String
+ */
+ selected: _ember['default'].computed(function () {
+ if (this.get('isSelected')) {
+ return 'selected';
+ }
+ }).property('isSelected'),
+
+ /**
+ * Makes the selected tab keyboard tabbable, and prevents tabs from getting
+ * focus when clicked with a mouse.
+ *
+ * @property tabindex
+ * @type Number
+ */
+ tabindex: _ember['default'].computed(function () {
+ if (this.get('isSelected')) {
+ return 0;
+ }
+ }).property('isSelected'),
+
+ /**
+ * Accessed as a className binding to apply the tab's `activeClass` CSS class
+ * to the element when the tab's `isSelected` property is true.
+ *
+ * @property active
+ * @type String
+ * @readOnly
+ */
+ active: _ember['default'].computed(function () {
+ if (this.get('isSelected')) {
+ return this.get('activeClass');
+ }
+ }).property('isSelected'),
+
+ /**
+ * The CSS class to apply to a tab's element when its `isSelected` property
+ * is `true`.
+ *
+ * @property activeClass
+ * @type String
+ * @default 'active'
+ */
+ activeClass: 'active',
+
+ /**
+ * The index of this tab in the `ivy-tab-list` component.
+ *
+ * @property index
+ * @type Number
+ */
+ index: _ember['default'].computed(function () {
+ return this.get('tabs').indexOf(this);
+ }).property('tabs.[]'),
+
+ /**
+ * Whether or not this tab is selected.
+ *
+ * @property isSelected
+ * @type Boolean
+ */
+ isSelected: _ember['default'].computed(function () {
+ return this.get('tabList.selectedTab') === this;
+ }).property('tabList.selectedTab'),
+
+ /**
+ * Called when the user clicks on the tab. Selects this tab.
+ *
+ * @method select
+ */
+ select: _ember['default'].on('click', 'touchEnd', function () {
+ this.get('tabList').selectTab(this);
+ }),
+
+ /**
+ * The `ivy-tab-list` component this tab belongs to.
+ *
+ * @property tabList
+ * @type IvyTabs.IvyTabListComponent
+ * @default null
+ */
+ tabList: null,
+
+ /**
+ * The `ivy-tab-panel` associated with this tab.
+ *
+ * @property tabPanel
+ * @type IvyTabs.IvyTabPanelComponent
+ */
+ tabPanel: _ember['default'].computed(function () {
+ return this.get('tabPanels').objectAt(this.get('index'));
+ }).property('tabPanels.[]', 'index'),
+
+ /**
+ * The array of all `ivy-tab-panel` instances within the `ivy-tabs`
+ * component.
+ *
+ * @property tabPanels
+ * @type Array | IvyTabs.IvyTabPanelComponent
+ * @readOnly
+ */
+ tabPanels: _ember['default'].computed.alias('tabsContainer.tabPanels').readOnly(),
+
+ /**
+ * The array of all `ivy-tab` instances within the `ivy-tab-list` component.
+ *
+ * @property tabs
+ * @type Array | IvyTabs.IvyTabComponent
+ * @readOnly
+ */
+ tabs: _ember['default'].computed.alias('tabList.tabs').readOnly(),
+
+ /**
+ * The `ivy-tabs` component.
+ *
+ * @property tabsContainer
+ * @type IvyTabs.IvyTabsComponent
+ * @readOnly
+ */
+ tabsContainer: _ember['default'].computed.alias('tabList.tabsContainer').readOnly(),
+
+ _registerWithTabList: function _registerWithTabList() {
+ this.get('tabList').registerTab(this);
+ },
+
+ _unregisterWithTabList: function _unregisterWithTabList() {
+ this.get('tabList').unregisterTab(this);
+ }
+ });
+});
+define('ivy-tabs/components/ivy-tabs', ['exports', 'ember', 'ivy-tabs/templates/components/ivy-tabs'], function (exports, _ember, _ivyTabsTemplatesComponentsIvyTabs) {
+ 'use strict';
+
+ /**
+ * @module ivy-tabs
+ */
+
+ /**
+ * @class IvyTabsComponent
+ * @namespace IvyTabs
+ * @extends Ember.Component
+ */
+ exports['default'] = _ember['default'].Component.extend({
+ layout: _ivyTabsTemplatesComponentsIvyTabs['default'],
+
+ classNames: ['ivy-tabs'],
+
+ /**
+ * Set this to the index of the tab you'd like to be selected. Usually it is
+ * bound to a controller property that is used as a query parameter, but can
+ * be bound to anything.
+ *
+ * @property selected-index
+ * @type Number
+ * @default 0
+ */
+ 'selected-index': 0,
+
+ /**
+ * Registers the `ivy-tab-list` instance.
+ *
+ * @method registerTabList
+ * @param {IvyTabs.IvyTabListComponent} tabList
+ */
+ registerTabList: function registerTabList(tabList) {
+ this.set('tabList', tabList);
+ _ember['default'].run.once(this, this._selectTabByIndex);
+ },
+
+ /**
+ * Adds a panel to the `tabPanels` array.
+ *
+ * @method registerTabPanel
+ * @param {IvyTabs.IvyTabPanelComponent} tabPanel
+ */
+ registerTabPanel: function registerTabPanel(tabPanel) {
+ this.get('tabPanels').pushObject(tabPanel);
+ },
+
+ tabPanels: _ember['default'].computed(function () {
+ return _ember['default'].A();
+ }).readOnly(),
+
+ /**
+ * Removes the `ivy-tab-list` component.
+ *
+ * @method unregisterTabList
+ * @param {IvyTabs.IvyTabListComponent} tabList
+ */
+ unregisterTabList: function unregisterTabList() /* tabList */{
+ this.set('tabList', null);
+ },
+
+ /**
+ * Removes a panel from the `tabPanels` array.
+ *
+ * @method unregisterTabPanel
+ * @param {IvyTabs.IvyTabPanelComponent} tabPanel
+ */
+ unregisterTabPanel: function unregisterTabPanel(tabPanel) {
+ this.get('tabPanels').removeObject(tabPanel);
+ },
+
+ _selectTabByIndex: function _selectTabByIndex() {
+ var selectedIndex = this.get('selected-index');
+ if (_ember['default'].isNone(selectedIndex)) {
+ selectedIndex = 0;
+ }
+ this.get('tabList').selectTabByIndex(selectedIndex);
+ }
+ });
+});
+define("ivy-tabs/templates/components/ivy-tab-list", ["exports"], function (exports) {
+ "use strict";
+
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 2,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ivy-tabs/templates/components/ivy-tab-list.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["inline", "yield", [["subexpr", "hash", [], ["tab", ["subexpr", "component", ["ivy-tab"], ["tabList", ["subexpr", "@mut", [["get", "this", ["loc", [null, [1, 47], [1, 51]]]]], [], []]], ["loc", [null, [1, 18], [1, 52]]]]], ["loc", [null, [1, 8], [1, 53]]]]], [], ["loc", [null, [1, 0], [1, 55]]]]],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define("ivy-tabs/templates/components/ivy-tabs", ["exports"], function (exports) {
+ "use strict";
+
+ exports["default"] = Ember.HTMLBars.template((function () {
+ return {
+ meta: {
+ "fragmentReason": {
+ "name": "missing-wrapper",
+ "problems": ["wrong-type"]
+ },
+ "revision": "Ember@2.5.1",
+ "loc": {
+ "source": null,
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 2,
+ "column": 0
+ }
+ },
+ "moduleName": "modules/ivy-tabs/templates/components/ivy-tabs.hbs"
+ },
+ isEmpty: false,
+ arity: 0,
+ cachedFragment: null,
+ hasRendered: false,
+ buildFragment: function buildFragment(dom) {
+ var el0 = dom.createDocumentFragment();
+ var el1 = dom.createComment("");
+ dom.appendChild(el0, el1);
+ var el1 = dom.createTextNode("\n");
+ dom.appendChild(el0, el1);
+ return el0;
+ },
+ buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {
+ var morphs = new Array(1);
+ morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);
+ dom.insertBoundary(fragment, 0);
+ return morphs;
+ },
+ statements: [["inline", "yield", [["subexpr", "hash", [], ["tablist", ["subexpr", "component", ["ivy-tab-list"], ["on-select", ["subexpr", "@mut", [["get", "on-select", ["loc", [null, [1, 58], [1, 67]]]]], [], []], "tabsContainer", ["subexpr", "@mut", [["get", "this", ["loc", [null, [1, 82], [1, 86]]]]], [], []]], ["loc", [null, [1, 22], [1, 87]]]], "tabpanel", ["subexpr", "component", ["ivy-tab-panel"], ["tabsContainer", ["subexpr", "@mut", [["get", "this", ["loc", [null, [1, 138], [1, 142]]]]], [], []]], ["loc", [null, [1, 97], [1, 143]]]]], ["loc", [null, [1, 8], [1, 144]]]]], [], ["loc", [null, [1, 0], [1, 146]]]]],
+ locals: [],
+ templates: []
+ };
+ })());
+});
+define('lodash/array', ['exports', 'lodash/array/chunk', 'lodash/array/compact', 'lodash/array/difference', 'lodash/array/drop', 'lodash/array/dropRight', 'lodash/array/dropRightWhile', 'lodash/array/dropWhile', 'lodash/array/fill', 'lodash/array/findIndex', 'lodash/array/findLastIndex', 'lodash/array/first', 'lodash/array/flatten', 'lodash/array/flattenDeep', 'lodash/array/head', 'lodash/array/indexOf', 'lodash/array/initial', 'lodash/array/intersection', 'lodash/array/last', 'lodash/array/lastIndexOf', 'lodash/array/object', 'lodash/array/pull', 'lodash/array/pullAt', 'lodash/array/remove', 'lodash/array/rest', 'lodash/array/slice', 'lodash/array/sortedIndex', 'lodash/array/sortedLastIndex', 'lodash/array/tail', 'lodash/array/take', 'lodash/array/takeRight', 'lodash/array/takeRightWhile', 'lodash/array/takeWhile', 'lodash/array/union', 'lodash/array/uniq', 'lodash/array/unique', 'lodash/array/unzip', 'lodash/array/unzipWith', 'lodash/array/without', 'lodash/array/xor', 'lodash/array/zip', 'lodash/array/zipObject', 'lodash/array/zipWith'], function (exports, _lodashArrayChunk, _lodashArrayCompact, _lodashArrayDifference, _lodashArrayDrop, _lodashArrayDropRight, _lodashArrayDropRightWhile, _lodashArrayDropWhile, _lodashArrayFill, _lodashArrayFindIndex, _lodashArrayFindLastIndex, _lodashArrayFirst, _lodashArrayFlatten, _lodashArrayFlattenDeep, _lodashArrayHead, _lodashArrayIndexOf, _lodashArrayInitial, _lodashArrayIntersection, _lodashArrayLast, _lodashArrayLastIndexOf, _lodashArrayObject, _lodashArrayPull, _lodashArrayPullAt, _lodashArrayRemove, _lodashArrayRest, _lodashArraySlice, _lodashArraySortedIndex, _lodashArraySortedLastIndex, _lodashArrayTail, _lodashArrayTake, _lodashArrayTakeRight, _lodashArrayTakeRightWhile, _lodashArrayTakeWhile, _lodashArrayUnion, _lodashArrayUniq, _lodashArrayUnique, _lodashArrayUnzip, _lodashArrayUnzipWith, _lodashArrayWithout, _lodashArrayXor, _lodashArrayZip, _lodashArrayZipObject, _lodashArrayZipWith) {
+ 'use strict';
+
+ exports['default'] = {
+ 'chunk': _lodashArrayChunk['default'],
+ 'compact': _lodashArrayCompact['default'],
+ 'difference': _lodashArrayDifference['default'],
+ 'drop': _lodashArrayDrop['default'],
+ 'dropRight': _lodashArrayDropRight['default'],
+ 'dropRightWhile': _lodashArrayDropRightWhile['default'],
+ 'dropWhile': _lodashArrayDropWhile['default'],
+ 'fill': _lodashArrayFill['default'],
+ 'findIndex': _lodashArrayFindIndex['default'],
+ 'findLastIndex': _lodashArrayFindLastIndex['default'],
+ 'first': _lodashArrayFirst['default'],
+ 'flatten': _lodashArrayFlatten['default'],
+ 'flattenDeep': _lodashArrayFlattenDeep['default'],
+ 'head': _lodashArrayHead['default'],
+ 'indexOf': _lodashArrayIndexOf['default'],
+ 'initial': _lodashArrayInitial['default'],
+ 'intersection': _lodashArrayIntersection['default'],
+ 'last': _lodashArrayLast['default'],
+ 'lastIndexOf': _lodashArrayLastIndexOf['default'],
+ 'object': _lodashArrayObject['default'],
+ 'pull': _lodashArrayPull['default'],
+ 'pullAt': _lodashArrayPullAt['default'],
+ 'remove': _lodashArrayRemove['default'],
+ 'rest': _lodashArrayRest['default'],
+ 'slice': _lodashArraySlice['default'],
+ 'sortedIndex': _lodashArraySortedIndex['default'],
+ 'sortedLastIndex': _lodashArraySortedLastIndex['default'],
+ 'tail': _lodashArrayTail['default'],
+ 'take': _lodashArrayTake['default'],
+ 'takeRight': _lodashArrayTakeRight['default'],
+ 'takeRightWhile': _lodashArrayTakeRightWhile['default'],
+ 'takeWhile': _lodashArrayTakeWhile['default'],
+ 'union': _lodashArrayUnion['default'],
+ 'uniq': _lodashArrayUniq['default'],
+ 'unique': _lodashArrayUnique['default'],
+ 'unzip': _lodashArrayUnzip['default'],
+ 'unzipWith': _lodashArrayUnzipWith['default'],
+ 'without': _lodashArrayWithout['default'],
+ 'xor': _lodashArrayXor['default'],
+ 'zip': _lodashArrayZip['default'],
+ 'zipObject': _lodashArrayZipObject['default'],
+ 'zipWith': _lodashArrayZipWith['default']
+ };
+});
+define('lodash/array/chunk', ['exports', 'lodash/internal/baseSlice', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseSlice, _lodashInternalIsIterateeCall) {
+ 'use strict';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeCeil = Math.ceil,
+ nativeFloor = Math.floor,
+ nativeMax = Math.max;
+
+ /**
+ * Creates an array of elements split into groups the length of `size`.
+ * If `collection` can't be split evenly, the final chunk will be the remaining
+ * elements.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to process.
+ * @param {number} [size=1] The length of each chunk.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Array} Returns the new array containing chunks.
+ * @example
+ *
+ * _.chunk(['a', 'b', 'c', 'd'], 2);
+ * // => [['a', 'b'], ['c', 'd']]
+ *
+ * _.chunk(['a', 'b', 'c', 'd'], 3);
+ * // => [['a', 'b', 'c'], ['d']]
+ */
+ function chunk(array, size, guard) {
+ if (guard ? (0, _lodashInternalIsIterateeCall['default'])(array, size, guard) : size == null) {
+ size = 1;
+ } else {
+ size = nativeMax(nativeFloor(size) || 1, 1);
+ }
+ var index = 0,
+ length = array ? array.length : 0,
+ resIndex = -1,
+ result = Array(nativeCeil(length / size));
+
+ while (index < length) {
+ result[++resIndex] = (0, _lodashInternalBaseSlice['default'])(array, index, index += size);
+ }
+ return result;
+ }
+
+ exports['default'] = chunk;
+});
+define("lodash/array/compact", ["exports"], function (exports) {
+ /**
+ * Creates an array with all falsey values removed. The values `false`, `null`,
+ * `0`, `""`, `undefined`, and `NaN` are falsey.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to compact.
+ * @returns {Array} Returns the new array of filtered values.
+ * @example
+ *
+ * _.compact([0, 1, false, 2, '', 3]);
+ * // => [1, 2, 3]
+ */
+ "use strict";
+
+ function compact(array) {
+ var index = -1,
+ length = array ? array.length : 0,
+ resIndex = -1,
+ result = [];
+
+ while (++index < length) {
+ var value = array[index];
+ if (value) {
+ result[++resIndex] = value;
+ }
+ }
+ return result;
+ }
+
+ exports["default"] = compact;
+});
+define('lodash/array/difference', ['exports', 'lodash/internal/baseDifference', 'lodash/internal/baseFlatten', 'lodash/internal/isArrayLike', 'lodash/internal/isObjectLike', 'lodash/function/restParam'], function (exports, _lodashInternalBaseDifference, _lodashInternalBaseFlatten, _lodashInternalIsArrayLike, _lodashInternalIsObjectLike, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /**
+ * Creates an array of unique `array` values not included in the other
+ * provided arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {...Array} [values] The arrays of values to exclude.
+ * @returns {Array} Returns the new array of filtered values.
+ * @example
+ *
+ * _.difference([1, 2, 3], [4, 2]);
+ * // => [1, 3]
+ */
+ var difference = (0, _lodashFunctionRestParam['default'])(function (array, values) {
+ return (0, _lodashInternalIsObjectLike['default'])(array) && (0, _lodashInternalIsArrayLike['default'])(array) ? (0, _lodashInternalBaseDifference['default'])(array, (0, _lodashInternalBaseFlatten['default'])(values, false, true)) : [];
+ });
+
+ exports['default'] = difference;
+});
+define('lodash/array/drop', ['exports', 'lodash/internal/baseSlice', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseSlice, _lodashInternalIsIterateeCall) {
+ 'use strict';
+
+ /**
+ * Creates a slice of `array` with `n` elements dropped from the beginning.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {number} [n=1] The number of elements to drop.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.drop([1, 2, 3]);
+ * // => [2, 3]
+ *
+ * _.drop([1, 2, 3], 2);
+ * // => [3]
+ *
+ * _.drop([1, 2, 3], 5);
+ * // => []
+ *
+ * _.drop([1, 2, 3], 0);
+ * // => [1, 2, 3]
+ */
+ function drop(array, n, guard) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return [];
+ }
+ if (guard ? (0, _lodashInternalIsIterateeCall['default'])(array, n, guard) : n == null) {
+ n = 1;
+ }
+ return (0, _lodashInternalBaseSlice['default'])(array, n < 0 ? 0 : n);
+ }
+
+ exports['default'] = drop;
+});
+define('lodash/array/dropRight', ['exports', 'lodash/internal/baseSlice', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseSlice, _lodashInternalIsIterateeCall) {
+ 'use strict';
+
+ /**
+ * Creates a slice of `array` with `n` elements dropped from the end.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {number} [n=1] The number of elements to drop.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.dropRight([1, 2, 3]);
+ * // => [1, 2]
+ *
+ * _.dropRight([1, 2, 3], 2);
+ * // => [1]
+ *
+ * _.dropRight([1, 2, 3], 5);
+ * // => []
+ *
+ * _.dropRight([1, 2, 3], 0);
+ * // => [1, 2, 3]
+ */
+ function dropRight(array, n, guard) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return [];
+ }
+ if (guard ? (0, _lodashInternalIsIterateeCall['default'])(array, n, guard) : n == null) {
+ n = 1;
+ }
+ n = length - (+n || 0);
+ return (0, _lodashInternalBaseSlice['default'])(array, 0, n < 0 ? 0 : n);
+ }
+
+ exports['default'] = dropRight;
+});
+define('lodash/array/dropRightWhile', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseWhile'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseWhile) {
+ 'use strict';
+
+ /**
+ * Creates a slice of `array` excluding elements dropped from the end.
+ * Elements are dropped until `predicate` returns falsey. The predicate is
+ * bound to `thisArg` and invoked with three arguments: (value, index, array).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that match the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.dropRightWhile([1, 2, 3], function(n) {
+ * return n > 1;
+ * });
+ * // => [1]
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': true },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': false }
+ * ];
+ *
+ * // using the `_.matches` callback shorthand
+ * _.pluck(_.dropRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');
+ * // => ['barney', 'fred']
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.pluck(_.dropRightWhile(users, 'active', false), 'user');
+ * // => ['barney']
+ *
+ * // using the `_.property` callback shorthand
+ * _.pluck(_.dropRightWhile(users, 'active'), 'user');
+ * // => ['barney', 'fred', 'pebbles']
+ */
+ function dropRightWhile(array, predicate, thisArg) {
+ return array && array.length ? (0, _lodashInternalBaseWhile['default'])(array, (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3), true, true) : [];
+ }
+
+ exports['default'] = dropRightWhile;
+});
+define('lodash/array/dropWhile', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseWhile'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseWhile) {
+ 'use strict';
+
+ /**
+ * Creates a slice of `array` excluding elements dropped from the beginning.
+ * Elements are dropped until `predicate` returns falsey. The predicate is
+ * bound to `thisArg` and invoked with three arguments: (value, index, array).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.dropWhile([1, 2, 3], function(n) {
+ * return n < 3;
+ * });
+ * // => [3]
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': false },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': true }
+ * ];
+ *
+ * // using the `_.matches` callback shorthand
+ * _.pluck(_.dropWhile(users, { 'user': 'barney', 'active': false }), 'user');
+ * // => ['fred', 'pebbles']
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.pluck(_.dropWhile(users, 'active', false), 'user');
+ * // => ['pebbles']
+ *
+ * // using the `_.property` callback shorthand
+ * _.pluck(_.dropWhile(users, 'active'), 'user');
+ * // => ['barney', 'fred', 'pebbles']
+ */
+ function dropWhile(array, predicate, thisArg) {
+ return array && array.length ? (0, _lodashInternalBaseWhile['default'])(array, (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3), true) : [];
+ }
+
+ exports['default'] = dropWhile;
+});
+define('lodash/array/fill', ['exports', 'lodash/internal/baseFill', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseFill, _lodashInternalIsIterateeCall) {
+ 'use strict';
+
+ /**
+ * Fills elements of `array` with `value` from `start` up to, but not
+ * including, `end`.
+ *
+ * **Note:** This method mutates `array`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to fill.
+ * @param {*} value The value to fill `array` with.
+ * @param {number} [start=0] The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns `array`.
+ * @example
+ *
+ * var array = [1, 2, 3];
+ *
+ * _.fill(array, 'a');
+ * console.log(array);
+ * // => ['a', 'a', 'a']
+ *
+ * _.fill(Array(3), 2);
+ * // => [2, 2, 2]
+ *
+ * _.fill([4, 6, 8], '*', 1, 2);
+ * // => [4, '*', 8]
+ */
+ function fill(array, value, start, end) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return [];
+ }
+ if (start && typeof start != 'number' && (0, _lodashInternalIsIterateeCall['default'])(array, value, start)) {
+ start = 0;
+ end = length;
+ }
+ return (0, _lodashInternalBaseFill['default'])(array, value, start, end);
+ }
+
+ exports['default'] = fill;
+});
+define('lodash/array/findIndex', ['exports', 'lodash/internal/createFindIndex'], function (exports, _lodashInternalCreateFindIndex) {
+ 'use strict';
+
+ /**
+ * This method is like `_.find` except that it returns the index of the first
+ * element `predicate` returns truthy for instead of the element itself.
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to search.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {number} Returns the index of the found element, else `-1`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': false },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': true }
+ * ];
+ *
+ * _.findIndex(users, function(chr) {
+ * return chr.user == 'barney';
+ * });
+ * // => 0
+ *
+ * // using the `_.matches` callback shorthand
+ * _.findIndex(users, { 'user': 'fred', 'active': false });
+ * // => 1
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.findIndex(users, 'active', false);
+ * // => 0
+ *
+ * // using the `_.property` callback shorthand
+ * _.findIndex(users, 'active');
+ * // => 2
+ */
+ var findIndex = (0, _lodashInternalCreateFindIndex['default'])();
+
+ exports['default'] = findIndex;
+});
+define('lodash/array/findLastIndex', ['exports', 'lodash/internal/createFindIndex'], function (exports, _lodashInternalCreateFindIndex) {
+ 'use strict';
+
+ /**
+ * This method is like `_.findIndex` except that it iterates over elements
+ * of `collection` from right to left.
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to search.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {number} Returns the index of the found element, else `-1`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': true },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': false }
+ * ];
+ *
+ * _.findLastIndex(users, function(chr) {
+ * return chr.user == 'pebbles';
+ * });
+ * // => 2
+ *
+ * // using the `_.matches` callback shorthand
+ * _.findLastIndex(users, { 'user': 'barney', 'active': true });
+ * // => 0
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.findLastIndex(users, 'active', false);
+ * // => 2
+ *
+ * // using the `_.property` callback shorthand
+ * _.findLastIndex(users, 'active');
+ * // => 0
+ */
+ var findLastIndex = (0, _lodashInternalCreateFindIndex['default'])(true);
+
+ exports['default'] = findLastIndex;
+});
+define("lodash/array/first", ["exports"], function (exports) {
+ /**
+ * Gets the first element of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @alias head
+ * @category Array
+ * @param {Array} array The array to query.
+ * @returns {*} Returns the first element of `array`.
+ * @example
+ *
+ * _.first([1, 2, 3]);
+ * // => 1
+ *
+ * _.first([]);
+ * // => undefined
+ */
+ "use strict";
+
+ function first(array) {
+ return array ? array[0] : undefined;
+ }
+
+ exports["default"] = first;
+});
+define('lodash/array/flatten', ['exports', 'lodash/internal/baseFlatten', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseFlatten, _lodashInternalIsIterateeCall) {
+ 'use strict';
+
+ /**
+ * Flattens a nested array. If `isDeep` is `true` the array is recursively
+ * flattened, otherwise it's only flattened a single level.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to flatten.
+ * @param {boolean} [isDeep] Specify a deep flatten.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Array} Returns the new flattened array.
+ * @example
+ *
+ * _.flatten([1, [2, 3, [4]]]);
+ * // => [1, 2, 3, [4]]
+ *
+ * // using `isDeep`
+ * _.flatten([1, [2, 3, [4]]], true);
+ * // => [1, 2, 3, 4]
+ */
+ function flatten(array, isDeep, guard) {
+ var length = array ? array.length : 0;
+ if (guard && (0, _lodashInternalIsIterateeCall['default'])(array, isDeep, guard)) {
+ isDeep = false;
+ }
+ return length ? (0, _lodashInternalBaseFlatten['default'])(array, isDeep) : [];
+ }
+
+ exports['default'] = flatten;
+});
+define('lodash/array/flattenDeep', ['exports', 'lodash/internal/baseFlatten'], function (exports, _lodashInternalBaseFlatten) {
+ 'use strict';
+
+ /**
+ * Recursively flattens a nested array.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to recursively flatten.
+ * @returns {Array} Returns the new flattened array.
+ * @example
+ *
+ * _.flattenDeep([1, [2, 3, [4]]]);
+ * // => [1, 2, 3, 4]
+ */
+ function flattenDeep(array) {
+ var length = array ? array.length : 0;
+ return length ? (0, _lodashInternalBaseFlatten['default'])(array, true) : [];
+ }
+
+ exports['default'] = flattenDeep;
+});
+define('lodash/array/head', ['exports', 'lodash/array/first'], function (exports, _lodashArrayFirst) {
+ 'use strict';
+
+ exports['default'] = _lodashArrayFirst['default'];
+});
+define('lodash/array/indexOf', ['exports', 'lodash/internal/baseIndexOf', 'lodash/internal/binaryIndex'], function (exports, _lodashInternalBaseIndexOf, _lodashInternalBinaryIndex) {
+ 'use strict';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeMax = Math.max;
+
+ /**
+ * Gets the index at which the first occurrence of `value` is found in `array`
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * for equality comparisons. If `fromIndex` is negative, it's used as the offset
+ * from the end of `array`. If `array` is sorted providing `true` for `fromIndex`
+ * performs a faster binary search.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to search.
+ * @param {*} value The value to search for.
+ * @param {boolean|number} [fromIndex=0] The index to search from or `true`
+ * to perform a binary search on a sorted array.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ * @example
+ *
+ * _.indexOf([1, 2, 1, 2], 2);
+ * // => 1
+ *
+ * // using `fromIndex`
+ * _.indexOf([1, 2, 1, 2], 2, 2);
+ * // => 3
+ *
+ * // performing a binary search
+ * _.indexOf([1, 1, 2, 2], 2, true);
+ * // => 2
+ */
+ function indexOf(array, value, fromIndex) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return -1;
+ }
+ if (typeof fromIndex == 'number') {
+ fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;
+ } else if (fromIndex) {
+ var index = (0, _lodashInternalBinaryIndex['default'])(array, value);
+ if (index < length && (value === value ? value === array[index] : array[index] !== array[index])) {
+ return index;
+ }
+ return -1;
+ }
+ return (0, _lodashInternalBaseIndexOf['default'])(array, value, fromIndex || 0);
+ }
+
+ exports['default'] = indexOf;
+});
+define('lodash/array/initial', ['exports', 'lodash/array/dropRight'], function (exports, _lodashArrayDropRight) {
+ 'use strict';
+
+ /**
+ * Gets all but the last element of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.initial([1, 2, 3]);
+ * // => [1, 2]
+ */
+ function initial(array) {
+ return (0, _lodashArrayDropRight['default'])(array, 1);
+ }
+
+ exports['default'] = initial;
+});
+define('lodash/array/intersection', ['exports', 'lodash/internal/baseIndexOf', 'lodash/internal/cacheIndexOf', 'lodash/internal/createCache', 'lodash/internal/isArrayLike', 'lodash/function/restParam'], function (exports, _lodashInternalBaseIndexOf, _lodashInternalCacheIndexOf, _lodashInternalCreateCache, _lodashInternalIsArrayLike, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /**
+ * Creates an array of unique values that are included in all of the provided
+ * arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @returns {Array} Returns the new array of shared values.
+ * @example
+ * _.intersection([1, 2], [4, 2], [2, 1]);
+ * // => [2]
+ */
+ var intersection = (0, _lodashFunctionRestParam['default'])(function (arrays) {
+ var othLength = arrays.length,
+ othIndex = othLength,
+ caches = Array(length),
+ indexOf = _lodashInternalBaseIndexOf['default'],
+ isCommon = true,
+ result = [];
+
+ while (othIndex--) {
+ var value = arrays[othIndex] = (0, _lodashInternalIsArrayLike['default'])(value = arrays[othIndex]) ? value : [];
+ caches[othIndex] = isCommon && value.length >= 120 ? (0, _lodashInternalCreateCache['default'])(othIndex && value) : null;
+ }
+ var array = arrays[0],
+ index = -1,
+ length = array ? array.length : 0,
+ seen = caches[0];
+
+ outer: while (++index < length) {
+ value = array[index];
+ if ((seen ? (0, _lodashInternalCacheIndexOf['default'])(seen, value) : indexOf(result, value, 0)) < 0) {
+ var othIndex = othLength;
+ while (--othIndex) {
+ var cache = caches[othIndex];
+ if ((cache ? (0, _lodashInternalCacheIndexOf['default'])(cache, value) : indexOf(arrays[othIndex], value, 0)) < 0) {
+ continue outer;
+ }
+ }
+ if (seen) {
+ seen.push(value);
+ }
+ result.push(value);
+ }
+ }
+ return result;
+ });
+
+ exports['default'] = intersection;
+});
+define("lodash/array/last", ["exports"], function (exports) {
+ /**
+ * Gets the last element of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @returns {*} Returns the last element of `array`.
+ * @example
+ *
+ * _.last([1, 2, 3]);
+ * // => 3
+ */
+ "use strict";
+
+ function last(array) {
+ var length = array ? array.length : 0;
+ return length ? array[length - 1] : undefined;
+ }
+
+ exports["default"] = last;
+});
+define('lodash/array/lastIndexOf', ['exports', 'lodash/internal/binaryIndex', 'lodash/internal/indexOfNaN'], function (exports, _lodashInternalBinaryIndex, _lodashInternalIndexOfNaN) {
+ 'use strict';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeMax = Math.max,
+ nativeMin = Math.min;
+
+ /**
+ * This method is like `_.indexOf` except that it iterates over elements of
+ * `array` from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to search.
+ * @param {*} value The value to search for.
+ * @param {boolean|number} [fromIndex=array.length-1] The index to search from
+ * or `true` to perform a binary search on a sorted array.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ * @example
+ *
+ * _.lastIndexOf([1, 2, 1, 2], 2);
+ * // => 3
+ *
+ * // using `fromIndex`
+ * _.lastIndexOf([1, 2, 1, 2], 2, 2);
+ * // => 1
+ *
+ * // performing a binary search
+ * _.lastIndexOf([1, 1, 2, 2], 2, true);
+ * // => 3
+ */
+ function lastIndexOf(array, value, fromIndex) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return -1;
+ }
+ var index = length;
+ if (typeof fromIndex == 'number') {
+ index = (fromIndex < 0 ? nativeMax(length + fromIndex, 0) : nativeMin(fromIndex || 0, length - 1)) + 1;
+ } else if (fromIndex) {
+ index = (0, _lodashInternalBinaryIndex['default'])(array, value, true) - 1;
+ var other = array[index];
+ if (value === value ? value === other : other !== other) {
+ return index;
+ }
+ return -1;
+ }
+ if (value !== value) {
+ return (0, _lodashInternalIndexOfNaN['default'])(array, index, true);
+ }
+ while (index--) {
+ if (array[index] === value) {
+ return index;
+ }
+ }
+ return -1;
+ }
+
+ exports['default'] = lastIndexOf;
+});
+define('lodash/array/object', ['exports', 'lodash/array/zipObject'], function (exports, _lodashArrayZipObject) {
+ 'use strict';
+
+ exports['default'] = _lodashArrayZipObject['default'];
+});
+define('lodash/array/pull', ['exports', 'lodash/internal/baseIndexOf'], function (exports, _lodashInternalBaseIndexOf) {
+ 'use strict';
+
+ /** Used for native method references. */
+ var arrayProto = Array.prototype;
+
+ /** Native method references. */
+ var splice = arrayProto.splice;
+
+ /**
+ * Removes all provided values from `array` using
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * **Note:** Unlike `_.without`, this method mutates `array`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @param {...*} [values] The values to remove.
+ * @returns {Array} Returns `array`.
+ * @example
+ *
+ * var array = [1, 2, 3, 1, 2, 3];
+ *
+ * _.pull(array, 2, 3);
+ * console.log(array);
+ * // => [1, 1]
+ */
+ function pull() {
+ var args = arguments,
+ array = args[0];
+
+ if (!(array && array.length)) {
+ return array;
+ }
+ var index = 0,
+ indexOf = _lodashInternalBaseIndexOf['default'],
+ length = args.length;
+
+ while (++index < length) {
+ var fromIndex = 0,
+ value = args[index];
+
+ while ((fromIndex = indexOf(array, value, fromIndex)) > -1) {
+ splice.call(array, fromIndex, 1);
+ }
+ }
+ return array;
+ }
+
+ exports['default'] = pull;
+});
+define('lodash/array/pullAt', ['exports', 'lodash/internal/baseAt', 'lodash/internal/baseCompareAscending', 'lodash/internal/baseFlatten', 'lodash/internal/basePullAt', 'lodash/function/restParam'], function (exports, _lodashInternalBaseAt, _lodashInternalBaseCompareAscending, _lodashInternalBaseFlatten, _lodashInternalBasePullAt, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /**
+ * Removes elements from `array` corresponding to the given indexes and returns
+ * an array of the removed elements. Indexes may be specified as an array of
+ * indexes or as individual arguments.
+ *
+ * **Note:** Unlike `_.at`, this method mutates `array`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @param {...(number|number[])} [indexes] The indexes of elements to remove,
+ * specified as individual indexes or arrays of indexes.
+ * @returns {Array} Returns the new array of removed elements.
+ * @example
+ *
+ * var array = [5, 10, 15, 20];
+ * var evens = _.pullAt(array, 1, 3);
+ *
+ * console.log(array);
+ * // => [5, 15]
+ *
+ * console.log(evens);
+ * // => [10, 20]
+ */
+ var pullAt = (0, _lodashFunctionRestParam['default'])(function (array, indexes) {
+ indexes = (0, _lodashInternalBaseFlatten['default'])(indexes);
+
+ var result = (0, _lodashInternalBaseAt['default'])(array, indexes);
+ (0, _lodashInternalBasePullAt['default'])(array, indexes.sort(_lodashInternalBaseCompareAscending['default']));
+ return result;
+ });
+
+ exports['default'] = pullAt;
+});
+define('lodash/array/remove', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/basePullAt'], function (exports, _lodashInternalBaseCallback, _lodashInternalBasePullAt) {
+ 'use strict';
+
+ /**
+ * Removes all elements from `array` that `predicate` returns truthy for
+ * and returns an array of the removed elements. The predicate is bound to
+ * `thisArg` and invoked with three arguments: (value, index, array).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * **Note:** Unlike `_.filter`, this method mutates `array`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Array} Returns the new array of removed elements.
+ * @example
+ *
+ * var array = [1, 2, 3, 4];
+ * var evens = _.remove(array, function(n) {
+ * return n % 2 == 0;
+ * });
+ *
+ * console.log(array);
+ * // => [1, 3]
+ *
+ * console.log(evens);
+ * // => [2, 4]
+ */
+ function remove(array, predicate, thisArg) {
+ var result = [];
+ if (!(array && array.length)) {
+ return result;
+ }
+ var index = -1,
+ indexes = [],
+ length = array.length;
+
+ predicate = (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3);
+ while (++index < length) {
+ var value = array[index];
+ if (predicate(value, index, array)) {
+ result.push(value);
+ indexes.push(index);
+ }
+ }
+ (0, _lodashInternalBasePullAt['default'])(array, indexes);
+ return result;
+ }
+
+ exports['default'] = remove;
+});
+define('lodash/array/rest', ['exports', 'lodash/array/drop'], function (exports, _lodashArrayDrop) {
+ 'use strict';
+
+ /**
+ * Gets all but the first element of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @alias tail
+ * @category Array
+ * @param {Array} array The array to query.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.rest([1, 2, 3]);
+ * // => [2, 3]
+ */
+ function rest(array) {
+ return (0, _lodashArrayDrop['default'])(array, 1);
+ }
+
+ exports['default'] = rest;
+});
+define('lodash/array/slice', ['exports', 'lodash/internal/baseSlice', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseSlice, _lodashInternalIsIterateeCall) {
+ 'use strict';
+
+ /**
+ * Creates a slice of `array` from `start` up to, but not including, `end`.
+ *
+ * **Note:** This method is used instead of `Array#slice` to support node
+ * lists in IE < 9 and to ensure dense arrays are returned.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to slice.
+ * @param {number} [start=0] The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns the slice of `array`.
+ */
+ function slice(array, start, end) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return [];
+ }
+ if (end && typeof end != 'number' && (0, _lodashInternalIsIterateeCall['default'])(array, start, end)) {
+ start = 0;
+ end = length;
+ }
+ return (0, _lodashInternalBaseSlice['default'])(array, start, end);
+ }
+
+ exports['default'] = slice;
+});
+define('lodash/array/sortedIndex', ['exports', 'lodash/internal/createSortedIndex'], function (exports, _lodashInternalCreateSortedIndex) {
+ 'use strict';
+
+ /**
+ * Uses a binary search to determine the lowest index at which `value` should
+ * be inserted into `array` in order to maintain its sort order. If an iteratee
+ * function is provided it's invoked for `value` and each element of `array`
+ * to compute their sort ranking. The iteratee is bound to `thisArg` and
+ * invoked with one argument; (value).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The sorted array to inspect.
+ * @param {*} value The value to evaluate.
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {number} Returns the index at which `value` should be inserted
+ * into `array`.
+ * @example
+ *
+ * _.sortedIndex([30, 50], 40);
+ * // => 1
+ *
+ * _.sortedIndex([4, 4, 5, 5], 5);
+ * // => 2
+ *
+ * var dict = { 'data': { 'thirty': 30, 'forty': 40, 'fifty': 50 } };
+ *
+ * // using an iteratee function
+ * _.sortedIndex(['thirty', 'fifty'], 'forty', function(word) {
+ * return this.data[word];
+ * }, dict);
+ * // => 1
+ *
+ * // using the `_.property` callback shorthand
+ * _.sortedIndex([{ 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');
+ * // => 1
+ */
+ var sortedIndex = (0, _lodashInternalCreateSortedIndex['default'])();
+
+ exports['default'] = sortedIndex;
+});
+define('lodash/array/sortedLastIndex', ['exports', 'lodash/internal/createSortedIndex'], function (exports, _lodashInternalCreateSortedIndex) {
+ 'use strict';
+
+ /**
+ * This method is like `_.sortedIndex` except that it returns the highest
+ * index at which `value` should be inserted into `array` in order to
+ * maintain its sort order.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The sorted array to inspect.
+ * @param {*} value The value to evaluate.
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {number} Returns the index at which `value` should be inserted
+ * into `array`.
+ * @example
+ *
+ * _.sortedLastIndex([4, 4, 5, 5], 5);
+ * // => 4
+ */
+ var sortedLastIndex = (0, _lodashInternalCreateSortedIndex['default'])(true);
+
+ exports['default'] = sortedLastIndex;
+});
+define('lodash/array/tail', ['exports', 'lodash/array/rest'], function (exports, _lodashArrayRest) {
+ 'use strict';
+
+ exports['default'] = _lodashArrayRest['default'];
+});
+define('lodash/array/take', ['exports', 'lodash/internal/baseSlice', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseSlice, _lodashInternalIsIterateeCall) {
+ 'use strict';
+
+ /**
+ * Creates a slice of `array` with `n` elements taken from the beginning.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {number} [n=1] The number of elements to take.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.take([1, 2, 3]);
+ * // => [1]
+ *
+ * _.take([1, 2, 3], 2);
+ * // => [1, 2]
+ *
+ * _.take([1, 2, 3], 5);
+ * // => [1, 2, 3]
+ *
+ * _.take([1, 2, 3], 0);
+ * // => []
+ */
+ function take(array, n, guard) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return [];
+ }
+ if (guard ? (0, _lodashInternalIsIterateeCall['default'])(array, n, guard) : n == null) {
+ n = 1;
+ }
+ return (0, _lodashInternalBaseSlice['default'])(array, 0, n < 0 ? 0 : n);
+ }
+
+ exports['default'] = take;
+});
+define('lodash/array/takeRight', ['exports', 'lodash/internal/baseSlice', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseSlice, _lodashInternalIsIterateeCall) {
+ 'use strict';
+
+ /**
+ * Creates a slice of `array` with `n` elements taken from the end.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {number} [n=1] The number of elements to take.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.takeRight([1, 2, 3]);
+ * // => [3]
+ *
+ * _.takeRight([1, 2, 3], 2);
+ * // => [2, 3]
+ *
+ * _.takeRight([1, 2, 3], 5);
+ * // => [1, 2, 3]
+ *
+ * _.takeRight([1, 2, 3], 0);
+ * // => []
+ */
+ function takeRight(array, n, guard) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return [];
+ }
+ if (guard ? (0, _lodashInternalIsIterateeCall['default'])(array, n, guard) : n == null) {
+ n = 1;
+ }
+ n = length - (+n || 0);
+ return (0, _lodashInternalBaseSlice['default'])(array, n < 0 ? 0 : n);
+ }
+
+ exports['default'] = takeRight;
+});
+define('lodash/array/takeRightWhile', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseWhile'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseWhile) {
+ 'use strict';
+
+ /**
+ * Creates a slice of `array` with elements taken from the end. Elements are
+ * taken until `predicate` returns falsey. The predicate is bound to `thisArg`
+ * and invoked with three arguments: (value, index, array).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.takeRightWhile([1, 2, 3], function(n) {
+ * return n > 1;
+ * });
+ * // => [2, 3]
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': true },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': false }
+ * ];
+ *
+ * // using the `_.matches` callback shorthand
+ * _.pluck(_.takeRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');
+ * // => ['pebbles']
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.pluck(_.takeRightWhile(users, 'active', false), 'user');
+ * // => ['fred', 'pebbles']
+ *
+ * // using the `_.property` callback shorthand
+ * _.pluck(_.takeRightWhile(users, 'active'), 'user');
+ * // => []
+ */
+ function takeRightWhile(array, predicate, thisArg) {
+ return array && array.length ? (0, _lodashInternalBaseWhile['default'])(array, (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3), false, true) : [];
+ }
+
+ exports['default'] = takeRightWhile;
+});
+define('lodash/array/takeWhile', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseWhile'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseWhile) {
+ 'use strict';
+
+ /**
+ * Creates a slice of `array` with elements taken from the beginning. Elements
+ * are taken until `predicate` returns falsey. The predicate is bound to
+ * `thisArg` and invoked with three arguments: (value, index, array).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.takeWhile([1, 2, 3], function(n) {
+ * return n < 3;
+ * });
+ * // => [1, 2]
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': false },
+ * { 'user': 'fred', 'active': false},
+ * { 'user': 'pebbles', 'active': true }
+ * ];
+ *
+ * // using the `_.matches` callback shorthand
+ * _.pluck(_.takeWhile(users, { 'user': 'barney', 'active': false }), 'user');
+ * // => ['barney']
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.pluck(_.takeWhile(users, 'active', false), 'user');
+ * // => ['barney', 'fred']
+ *
+ * // using the `_.property` callback shorthand
+ * _.pluck(_.takeWhile(users, 'active'), 'user');
+ * // => []
+ */
+ function takeWhile(array, predicate, thisArg) {
+ return array && array.length ? (0, _lodashInternalBaseWhile['default'])(array, (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3)) : [];
+ }
+
+ exports['default'] = takeWhile;
+});
+define('lodash/array/union', ['exports', 'lodash/internal/baseFlatten', 'lodash/internal/baseUniq', 'lodash/function/restParam'], function (exports, _lodashInternalBaseFlatten, _lodashInternalBaseUniq, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /**
+ * Creates an array of unique values, in order, from all of the provided arrays
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @returns {Array} Returns the new array of combined values.
+ * @example
+ *
+ * _.union([1, 2], [4, 2], [2, 1]);
+ * // => [1, 2, 4]
+ */
+ var union = (0, _lodashFunctionRestParam['default'])(function (arrays) {
+ return (0, _lodashInternalBaseUniq['default'])((0, _lodashInternalBaseFlatten['default'])(arrays, false, true));
+ });
+
+ exports['default'] = union;
+});
+define('lodash/array/uniq', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseUniq', 'lodash/internal/isIterateeCall', 'lodash/internal/sortedUniq'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseUniq, _lodashInternalIsIterateeCall, _lodashInternalSortedUniq) {
+ 'use strict';
+
+ /**
+ * Creates a duplicate-free version of an array, using
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * for equality comparisons, in which only the first occurence of each element
+ * is kept. Providing `true` for `isSorted` performs a faster search algorithm
+ * for sorted arrays. If an iteratee function is provided it's invoked for
+ * each element in the array to generate the criterion by which uniqueness
+ * is computed. The `iteratee` is bound to `thisArg` and invoked with three
+ * arguments: (value, index, array).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @alias unique
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {boolean} [isSorted] Specify the array is sorted.
+ * @param {Function|Object|string} [iteratee] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Array} Returns the new duplicate-value-free array.
+ * @example
+ *
+ * _.uniq([2, 1, 2]);
+ * // => [2, 1]
+ *
+ * // using `isSorted`
+ * _.uniq([1, 1, 2], true);
+ * // => [1, 2]
+ *
+ * // using an iteratee function
+ * _.uniq([1, 2.5, 1.5, 2], function(n) {
+ * return this.floor(n);
+ * }, Math);
+ * // => [1, 2.5]
+ *
+ * // using the `_.property` callback shorthand
+ * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
+ * // => [{ 'x': 1 }, { 'x': 2 }]
+ */
+ function uniq(array, isSorted, iteratee, thisArg) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return [];
+ }
+ if (isSorted != null && typeof isSorted != 'boolean') {
+ thisArg = iteratee;
+ iteratee = (0, _lodashInternalIsIterateeCall['default'])(array, isSorted, thisArg) ? undefined : isSorted;
+ isSorted = false;
+ }
+ iteratee = iteratee == null ? iteratee : (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 3);
+ return isSorted ? (0, _lodashInternalSortedUniq['default'])(array, iteratee) : (0, _lodashInternalBaseUniq['default'])(array, iteratee);
+ }
+
+ exports['default'] = uniq;
+});
+define('lodash/array/unique', ['exports', 'lodash/array/uniq'], function (exports, _lodashArrayUniq) {
+ 'use strict';
+
+ exports['default'] = _lodashArrayUniq['default'];
+});
+define('lodash/array/unzip', ['exports', 'lodash/internal/arrayFilter', 'lodash/internal/arrayMap', 'lodash/internal/baseProperty', 'lodash/internal/isArrayLike'], function (exports, _lodashInternalArrayFilter, _lodashInternalArrayMap, _lodashInternalBaseProperty, _lodashInternalIsArrayLike) {
+ 'use strict';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeMax = Math.max;
+
+ /**
+ * This method is like `_.zip` except that it accepts an array of grouped
+ * elements and creates an array regrouping the elements to their pre-zip
+ * configuration.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array of grouped elements to process.
+ * @returns {Array} Returns the new array of regrouped elements.
+ * @example
+ *
+ * var zipped = _.zip(['fred', 'barney'], [30, 40], [true, false]);
+ * // => [['fred', 30, true], ['barney', 40, false]]
+ *
+ * _.unzip(zipped);
+ * // => [['fred', 'barney'], [30, 40], [true, false]]
+ */
+ function unzip(array) {
+ if (!(array && array.length)) {
+ return [];
+ }
+ var index = -1,
+ length = 0;
+
+ array = (0, _lodashInternalArrayFilter['default'])(array, function (group) {
+ if ((0, _lodashInternalIsArrayLike['default'])(group)) {
+ length = nativeMax(group.length, length);
+ return true;
+ }
+ });
+ var result = Array(length);
+ while (++index < length) {
+ result[index] = (0, _lodashInternalArrayMap['default'])(array, (0, _lodashInternalBaseProperty['default'])(index));
+ }
+ return result;
+ }
+
+ exports['default'] = unzip;
+});
+define('lodash/array/unzipWith', ['exports', 'lodash/internal/arrayMap', 'lodash/internal/arrayReduce', 'lodash/internal/bindCallback', 'lodash/array/unzip'], function (exports, _lodashInternalArrayMap, _lodashInternalArrayReduce, _lodashInternalBindCallback, _lodashArrayUnzip) {
+ 'use strict';
+
+ /**
+ * This method is like `_.unzip` except that it accepts an iteratee to specify
+ * how regrouped values should be combined. The `iteratee` is bound to `thisArg`
+ * and invoked with four arguments: (accumulator, value, index, group).
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array of grouped elements to process.
+ * @param {Function} [iteratee] The function to combine regrouped values.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Array} Returns the new array of regrouped elements.
+ * @example
+ *
+ * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
+ * // => [[1, 10, 100], [2, 20, 200]]
+ *
+ * _.unzipWith(zipped, _.add);
+ * // => [3, 30, 300]
+ */
+ function unzipWith(array, iteratee, thisArg) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return [];
+ }
+ var result = (0, _lodashArrayUnzip['default'])(array);
+ if (iteratee == null) {
+ return result;
+ }
+ iteratee = (0, _lodashInternalBindCallback['default'])(iteratee, thisArg, 4);
+ return (0, _lodashInternalArrayMap['default'])(result, function (group) {
+ return (0, _lodashInternalArrayReduce['default'])(group, iteratee, undefined, true);
+ });
+ }
+
+ exports['default'] = unzipWith;
+});
+define('lodash/array/without', ['exports', 'lodash/internal/baseDifference', 'lodash/internal/isArrayLike', 'lodash/function/restParam'], function (exports, _lodashInternalBaseDifference, _lodashInternalIsArrayLike, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /**
+ * Creates an array excluding all provided values using
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to filter.
+ * @param {...*} [values] The values to exclude.
+ * @returns {Array} Returns the new array of filtered values.
+ * @example
+ *
+ * _.without([1, 2, 1, 3], 1, 2);
+ * // => [3]
+ */
+ var without = (0, _lodashFunctionRestParam['default'])(function (array, values) {
+ return (0, _lodashInternalIsArrayLike['default'])(array) ? (0, _lodashInternalBaseDifference['default'])(array, values) : [];
+ });
+
+ exports['default'] = without;
+});
+define('lodash/array/xor', ['exports', 'lodash/internal/arrayPush', 'lodash/internal/baseDifference', 'lodash/internal/baseUniq', 'lodash/internal/isArrayLike'], function (exports, _lodashInternalArrayPush, _lodashInternalBaseDifference, _lodashInternalBaseUniq, _lodashInternalIsArrayLike) {
+ 'use strict';
+
+ /**
+ * Creates an array of unique values that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
+ * of the provided arrays.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @returns {Array} Returns the new array of values.
+ * @example
+ *
+ * _.xor([1, 2], [4, 2]);
+ * // => [1, 4]
+ */
+ function xor() {
+ var index = -1,
+ length = arguments.length;
+
+ while (++index < length) {
+ var array = arguments[index];
+ if ((0, _lodashInternalIsArrayLike['default'])(array)) {
+ var result = result ? (0, _lodashInternalArrayPush['default'])((0, _lodashInternalBaseDifference['default'])(result, array), (0, _lodashInternalBaseDifference['default'])(array, result)) : array;
+ }
+ }
+ return result ? (0, _lodashInternalBaseUniq['default'])(result) : [];
+ }
+
+ exports['default'] = xor;
+});
+define('lodash/array/zip', ['exports', 'lodash/function/restParam', 'lodash/array/unzip'], function (exports, _lodashFunctionRestParam, _lodashArrayUnzip) {
+ 'use strict';
+
+ /**
+ * Creates an array of grouped elements, the first of which contains the first
+ * elements of the given arrays, the second of which contains the second elements
+ * of the given arrays, and so on.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {...Array} [arrays] The arrays to process.
+ * @returns {Array} Returns the new array of grouped elements.
+ * @example
+ *
+ * _.zip(['fred', 'barney'], [30, 40], [true, false]);
+ * // => [['fred', 30, true], ['barney', 40, false]]
+ */
+ var zip = (0, _lodashFunctionRestParam['default'])(_lodashArrayUnzip['default']);
+
+ exports['default'] = zip;
+});
+define('lodash/array/zipObject', ['exports', 'lodash/lang/isArray'], function (exports, _lodashLangIsArray) {
+ 'use strict';
+
+ /**
+ * The inverse of `_.pairs`; this method returns an object composed from arrays
+ * of property names and values. Provide either a single two dimensional array,
+ * e.g. `[[key1, value1], [key2, value2]]` or two arrays, one of property names
+ * and one of corresponding values.
+ *
+ * @static
+ * @memberOf _
+ * @alias object
+ * @category Array
+ * @param {Array} props The property names.
+ * @param {Array} [values=[]] The property values.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * _.zipObject([['fred', 30], ['barney', 40]]);
+ * // => { 'fred': 30, 'barney': 40 }
+ *
+ * _.zipObject(['fred', 'barney'], [30, 40]);
+ * // => { 'fred': 30, 'barney': 40 }
+ */
+ function zipObject(props, values) {
+ var index = -1,
+ length = props ? props.length : 0,
+ result = {};
+
+ if (length && !values && !(0, _lodashLangIsArray['default'])(props[0])) {
+ values = [];
+ }
+ while (++index < length) {
+ var key = props[index];
+ if (values) {
+ result[key] = values[index];
+ } else if (key) {
+ result[key[0]] = key[1];
+ }
+ }
+ return result;
+ }
+
+ exports['default'] = zipObject;
+});
+define('lodash/array/zipWith', ['exports', 'lodash/function/restParam', 'lodash/array/unzipWith'], function (exports, _lodashFunctionRestParam, _lodashArrayUnzipWith) {
+ 'use strict';
+
+ /**
+ * This method is like `_.zip` except that it accepts an iteratee to specify
+ * how grouped values should be combined. The `iteratee` is bound to `thisArg`
+ * and invoked with four arguments: (accumulator, value, index, group).
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {...Array} [arrays] The arrays to process.
+ * @param {Function} [iteratee] The function to combine grouped values.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Array} Returns the new array of grouped elements.
+ * @example
+ *
+ * _.zipWith([1, 2], [10, 20], [100, 200], _.add);
+ * // => [111, 222]
+ */
+ var zipWith = (0, _lodashFunctionRestParam['default'])(function (arrays) {
+ var length = arrays.length,
+ iteratee = length > 2 ? arrays[length - 2] : undefined,
+ thisArg = length > 1 ? arrays[length - 1] : undefined;
+
+ if (length > 2 && typeof iteratee == 'function') {
+ length -= 2;
+ } else {
+ iteratee = length > 1 && typeof thisArg == 'function' ? (--length, thisArg) : undefined;
+ thisArg = undefined;
+ }
+ arrays.length = length;
+ return (0, _lodashArrayUnzipWith['default'])(arrays, iteratee, thisArg);
+ });
+
+ exports['default'] = zipWith;
+});
+define('lodash/chain', ['exports', 'lodash/chain/chain', 'lodash/chain/commit', 'lodash/chain/concat', 'lodash/chain/lodash', 'lodash/chain/plant', 'lodash/chain/reverse', 'lodash/chain/run', 'lodash/chain/tap', 'lodash/chain/thru', 'lodash/chain/toJSON', 'lodash/chain/toString', 'lodash/chain/value', 'lodash/chain/valueOf', 'lodash/chain/wrapperChain'], function (exports, _lodashChainChain, _lodashChainCommit, _lodashChainConcat, _lodashChainLodash, _lodashChainPlant, _lodashChainReverse, _lodashChainRun, _lodashChainTap, _lodashChainThru, _lodashChainToJSON, _lodashChainToString, _lodashChainValue, _lodashChainValueOf, _lodashChainWrapperChain) {
+ 'use strict';
+
+ exports['default'] = {
+ 'chain': _lodashChainChain['default'],
+ 'commit': _lodashChainCommit['default'],
+ 'concat': _lodashChainConcat['default'],
+ 'lodash': _lodashChainLodash['default'],
+ 'plant': _lodashChainPlant['default'],
+ 'reverse': _lodashChainReverse['default'],
+ 'run': _lodashChainRun['default'],
+ 'tap': _lodashChainTap['default'],
+ 'thru': _lodashChainThru['default'],
+ 'toJSON': _lodashChainToJSON['default'],
+ 'toString': _lodashChainToString['default'],
+ 'value': _lodashChainValue['default'],
+ 'valueOf': _lodashChainValueOf['default'],
+ 'wrapperChain': _lodashChainWrapperChain['default']
+ };
+});
+define('lodash/chain/chain', ['exports', 'lodash/chain/lodash'], function (exports, _lodashChainLodash) {
+ 'use strict';
+
+ /**
+ * Creates a `lodash` object that wraps `value` with explicit method
+ * chaining enabled.
+ *
+ * @static
+ * @memberOf _
+ * @category Chain
+ * @param {*} value The value to wrap.
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 40 },
+ * { 'user': 'pebbles', 'age': 1 }
+ * ];
+ *
+ * var youngest = _.chain(users)
+ * .sortBy('age')
+ * .map(function(chr) {
+ * return chr.user + ' is ' + chr.age;
+ * })
+ * .first()
+ * .value();
+ * // => 'pebbles is 1'
+ */
+ function chain(value) {
+ var result = (0, _lodashChainLodash['default'])(value);
+ result.__chain__ = true;
+ return result;
+ }
+
+ exports['default'] = chain;
+});
+define('lodash/chain/commit', ['exports', 'lodash/chain/wrapperCommit'], function (exports, _lodashChainWrapperCommit) {
+ 'use strict';
+
+ exports['default'] = _lodashChainWrapperCommit['default'];
+});
+define('lodash/chain/concat', ['exports', 'lodash/chain/wrapperConcat'], function (exports, _lodashChainWrapperConcat) {
+ 'use strict';
+
+ exports['default'] = _lodashChainWrapperConcat['default'];
+});
+define('lodash/chain/lodash', ['exports', 'lodash/internal/LazyWrapper', 'lodash/internal/LodashWrapper', 'lodash/internal/baseLodash', 'lodash/lang/isArray', 'lodash/internal/isObjectLike', 'lodash/internal/wrapperClone'], function (exports, _lodashInternalLazyWrapper, _lodashInternalLodashWrapper, _lodashInternalBaseLodash, _lodashLangIsArray, _lodashInternalIsObjectLike, _lodashInternalWrapperClone) {
+ 'use strict';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty = objectProto.hasOwnProperty;
+
+ /**
+ * Creates a `lodash` object which wraps `value` to enable implicit chaining.
+ * Methods that operate on and return arrays, collections, and functions can
+ * be chained together. Methods that retrieve a single value or may return a
+ * primitive value will automatically end the chain returning the unwrapped
+ * value. Explicit chaining may be enabled using `_.chain`. The execution of
+ * chained methods is lazy, that is, execution is deferred until `_#value`
+ * is implicitly or explicitly called.
+ *
+ * Lazy evaluation allows several methods to support shortcut fusion. Shortcut
+ * fusion is an optimization strategy which merge iteratee calls; this can help
+ * to avoid the creation of intermediate data structures and greatly reduce the
+ * number of iteratee executions.
+ *
+ * Chaining is supported in custom builds as long as the `_#value` method is
+ * directly or indirectly included in the build.
+ *
+ * In addition to lodash methods, wrappers have `Array` and `String` methods.
+ *
+ * The wrapper `Array` methods are:
+ * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`,
+ * `splice`, and `unshift`
+ *
+ * The wrapper `String` methods are:
+ * `replace` and `split`
+ *
+ * The wrapper methods that support shortcut fusion are:
+ * `compact`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `filter`,
+ * `first`, `initial`, `last`, `map`, `pluck`, `reject`, `rest`, `reverse`,
+ * `slice`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `toArray`,
+ * and `where`
+ *
+ * The chainable wrapper methods are:
+ * `after`, `ary`, `assign`, `at`, `before`, `bind`, `bindAll`, `bindKey`,
+ * `callback`, `chain`, `chunk`, `commit`, `compact`, `concat`, `constant`,
+ * `countBy`, `create`, `curry`, `debounce`, `defaults`, `defaultsDeep`,
+ * `defer`, `delay`, `difference`, `drop`, `dropRight`, `dropRightWhile`,
+ * `dropWhile`, `fill`, `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`,
+ * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,
+ * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,
+ * `invoke`, `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`,
+ * `matchesProperty`, `memoize`, `merge`, `method`, `methodOf`, `mixin`,
+ * `modArgs`, `negate`, `omit`, `once`, `pairs`, `partial`, `partialRight`,
+ * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`,
+ * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `restParam`,
+ * `reverse`, `set`, `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`,
+ * `sortByOrder`, `splice`, `spread`, `take`, `takeRight`, `takeRightWhile`,
+ * `takeWhile`, `tap`, `throttle`, `thru`, `times`, `toArray`, `toPlainObject`,
+ * `transform`, `union`, `uniq`, `unshift`, `unzip`, `unzipWith`, `values`,
+ * `valuesIn`, `where`, `without`, `wrap`, `xor`, `zip`, `zipObject`, `zipWith`
+ *
+ * The wrapper methods that are **not** chainable by default are:
+ * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clone`, `cloneDeep`,
+ * `deburr`, `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`,
+ * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`,
+ * `floor`, `get`, `gt`, `gte`, `has`, `identity`, `includes`, `indexOf`,
+ * `inRange`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,
+ * `isEmpty`, `isEqual`, `isError`, `isFinite` `isFunction`, `isMatch`,
+ * `isNative`, `isNaN`, `isNull`, `isNumber`, `isObject`, `isPlainObject`,
+ * `isRegExp`, `isString`, `isUndefined`, `isTypedArray`, `join`, `kebabCase`,
+ * `last`, `lastIndexOf`, `lt`, `lte`, `max`, `min`, `noConflict`, `noop`,
+ * `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, `random`, `reduce`,
+ * `reduceRight`, `repeat`, `result`, `round`, `runInContext`, `shift`, `size`,
+ * `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`, `startCase`,
+ * `startsWith`, `sum`, `template`, `trim`, `trimLeft`, `trimRight`, `trunc`,
+ * `unescape`, `uniqueId`, `value`, and `words`
+ *
+ * The wrapper method `sample` will return a wrapped value when `n` is provided,
+ * otherwise an unwrapped value is returned.
+ *
+ * @name _
+ * @constructor
+ * @category Chain
+ * @param {*} value The value to wrap in a `lodash` instance.
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var wrapped = _([1, 2, 3]);
+ *
+ * // returns an unwrapped value
+ * wrapped.reduce(function(total, n) {
+ * return total + n;
+ * });
+ * // => 6
+ *
+ * // returns a wrapped value
+ * var squares = wrapped.map(function(n) {
+ * return n * n;
+ * });
+ *
+ * _.isArray(squares);
+ * // => false
+ *
+ * _.isArray(squares.value());
+ * // => true
+ */
+ function lodash(value) {
+ if ((0, _lodashInternalIsObjectLike['default'])(value) && !(0, _lodashLangIsArray['default'])(value) && !(value instanceof _lodashInternalLazyWrapper['default'])) {
+ if (value instanceof _lodashInternalLodashWrapper['default']) {
+ return value;
+ }
+ if (hasOwnProperty.call(value, '__chain__') && hasOwnProperty.call(value, '__wrapped__')) {
+ return (0, _lodashInternalWrapperClone['default'])(value);
+ }
+ }
+ return new _lodashInternalLodashWrapper['default'](value);
+ }
+
+ // Ensure wrappers are instances of `baseLodash`.
+ lodash.prototype = _lodashInternalBaseLodash['default'].prototype;
+
+ exports['default'] = lodash;
+});
+define('lodash/chain/plant', ['exports', 'lodash/chain/wrapperPlant'], function (exports, _lodashChainWrapperPlant) {
+ 'use strict';
+
+ exports['default'] = _lodashChainWrapperPlant['default'];
+});
+define('lodash/chain/reverse', ['exports', 'lodash/chain/wrapperReverse'], function (exports, _lodashChainWrapperReverse) {
+ 'use strict';
+
+ exports['default'] = _lodashChainWrapperReverse['default'];
+});
+define('lodash/chain/run', ['exports', 'lodash/chain/wrapperValue'], function (exports, _lodashChainWrapperValue) {
+ 'use strict';
+
+ exports['default'] = _lodashChainWrapperValue['default'];
+});
+define("lodash/chain/tap", ["exports"], function (exports) {
+ /**
+ * This method invokes `interceptor` and returns `value`. The interceptor is
+ * bound to `thisArg` and invoked with one argument; (value). The purpose of
+ * this method is to "tap into" a method chain in order to perform operations
+ * on intermediate results within the chain.
+ *
+ * @static
+ * @memberOf _
+ * @category Chain
+ * @param {*} value The value to provide to `interceptor`.
+ * @param {Function} interceptor The function to invoke.
+ * @param {*} [thisArg] The `this` binding of `interceptor`.
+ * @returns {*} Returns `value`.
+ * @example
+ *
+ * _([1, 2, 3])
+ * .tap(function(array) {
+ * array.pop();
+ * })
+ * .reverse()
+ * .value();
+ * // => [2, 1]
+ */
+ "use strict";
+
+ function tap(value, interceptor, thisArg) {
+ interceptor.call(thisArg, value);
+ return value;
+ }
+
+ exports["default"] = tap;
+});
+define("lodash/chain/thru", ["exports"], function (exports) {
+ /**
+ * This method is like `_.tap` except that it returns the result of `interceptor`.
+ *
+ * @static
+ * @memberOf _
+ * @category Chain
+ * @param {*} value The value to provide to `interceptor`.
+ * @param {Function} interceptor The function to invoke.
+ * @param {*} [thisArg] The `this` binding of `interceptor`.
+ * @returns {*} Returns the result of `interceptor`.
+ * @example
+ *
+ * _(' abc ')
+ * .chain()
+ * .trim()
+ * .thru(function(value) {
+ * return [value];
+ * })
+ * .value();
+ * // => ['abc']
+ */
+ "use strict";
+
+ function thru(value, interceptor, thisArg) {
+ return interceptor.call(thisArg, value);
+ }
+
+ exports["default"] = thru;
+});
+define('lodash/chain/toJSON', ['exports', 'lodash/chain/wrapperValue'], function (exports, _lodashChainWrapperValue) {
+ 'use strict';
+
+ exports['default'] = _lodashChainWrapperValue['default'];
+});
+define('lodash/chain/toString', ['exports', 'lodash/chain/wrapperToString'], function (exports, _lodashChainWrapperToString) {
+ 'use strict';
+
+ exports['default'] = _lodashChainWrapperToString['default'];
+});
+define('lodash/chain/value', ['exports', 'lodash/chain/wrapperValue'], function (exports, _lodashChainWrapperValue) {
+ 'use strict';
+
+ exports['default'] = _lodashChainWrapperValue['default'];
+});
+define('lodash/chain/valueOf', ['exports', 'lodash/chain/wrapperValue'], function (exports, _lodashChainWrapperValue) {
+ 'use strict';
+
+ exports['default'] = _lodashChainWrapperValue['default'];
+});
+define('lodash/chain/wrapperChain', ['exports', 'lodash/chain/chain'], function (exports, _lodashChainChain) {
+ 'use strict';
+
+ /**
+ * Enables explicit method chaining on the wrapper object.
+ *
+ * @name chain
+ * @memberOf _
+ * @category Chain
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 40 }
+ * ];
+ *
+ * // without explicit chaining
+ * _(users).first();
+ * // => { 'user': 'barney', 'age': 36 }
+ *
+ * // with explicit chaining
+ * _(users).chain()
+ * .first()
+ * .pick('user')
+ * .value();
+ * // => { 'user': 'barney' }
+ */
+ function wrapperChain() {
+ return (0, _lodashChainChain['default'])(this);
+ }
+
+ exports['default'] = wrapperChain;
+});
+define('lodash/chain/wrapperCommit', ['exports', 'lodash/internal/LodashWrapper'], function (exports, _lodashInternalLodashWrapper) {
+ 'use strict';
+
+ /**
+ * Executes the chained sequence and returns the wrapped result.
+ *
+ * @name commit
+ * @memberOf _
+ * @category Chain
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var array = [1, 2];
+ * var wrapped = _(array).push(3);
+ *
+ * console.log(array);
+ * // => [1, 2]
+ *
+ * wrapped = wrapped.commit();
+ * console.log(array);
+ * // => [1, 2, 3]
+ *
+ * wrapped.last();
+ * // => 3
+ *
+ * console.log(array);
+ * // => [1, 2, 3]
+ */
+ function wrapperCommit() {
+ return new _lodashInternalLodashWrapper['default'](this.value(), this.__chain__);
+ }
+
+ exports['default'] = wrapperCommit;
+});
+define('lodash/chain/wrapperConcat', ['exports', 'lodash/internal/arrayConcat', 'lodash/internal/baseFlatten', 'lodash/lang/isArray', 'lodash/function/restParam', 'lodash/internal/toObject'], function (exports, _lodashInternalArrayConcat, _lodashInternalBaseFlatten, _lodashLangIsArray, _lodashFunctionRestParam, _lodashInternalToObject) {
+ 'use strict';
+
+ /**
+ * Creates a new array joining a wrapped array with any additional arrays
+ * and/or values.
+ *
+ * @name concat
+ * @memberOf _
+ * @category Chain
+ * @param {...*} [values] The values to concatenate.
+ * @returns {Array} Returns the new concatenated array.
+ * @example
+ *
+ * var array = [1];
+ * var wrapped = _(array).concat(2, [3], [[4]]);
+ *
+ * console.log(wrapped.value());
+ * // => [1, 2, 3, [4]]
+ *
+ * console.log(array);
+ * // => [1]
+ */
+ var wrapperConcat = (0, _lodashFunctionRestParam['default'])(function (values) {
+ values = (0, _lodashInternalBaseFlatten['default'])(values);
+ return this.thru(function (array) {
+ return (0, _lodashInternalArrayConcat['default'])((0, _lodashLangIsArray['default'])(array) ? array : [(0, _lodashInternalToObject['default'])(array)], values);
+ });
+ });
+
+ exports['default'] = wrapperConcat;
+});
+define('lodash/chain/wrapperPlant', ['exports', 'lodash/internal/baseLodash', 'lodash/internal/wrapperClone'], function (exports, _lodashInternalBaseLodash, _lodashInternalWrapperClone) {
+ 'use strict';
+
+ /**
+ * Creates a clone of the chained sequence planting `value` as the wrapped value.
+ *
+ * @name plant
+ * @memberOf _
+ * @category Chain
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var array = [1, 2];
+ * var wrapped = _(array).map(function(value) {
+ * return Math.pow(value, 2);
+ * });
+ *
+ * var other = [3, 4];
+ * var otherWrapped = wrapped.plant(other);
+ *
+ * otherWrapped.value();
+ * // => [9, 16]
+ *
+ * wrapped.value();
+ * // => [1, 4]
+ */
+ function wrapperPlant(value) {
+ var result,
+ parent = this;
+
+ while (parent instanceof _lodashInternalBaseLodash['default']) {
+ var clone = (0, _lodashInternalWrapperClone['default'])(parent);
+ if (result) {
+ previous.__wrapped__ = clone;
+ } else {
+ result = clone;
+ }
+ var previous = clone;
+ parent = parent.__wrapped__;
+ }
+ previous.__wrapped__ = value;
+ return result;
+ }
+
+ exports['default'] = wrapperPlant;
+});
+define('lodash/chain/wrapperReverse', ['exports', 'lodash/internal/LazyWrapper', 'lodash/internal/LodashWrapper', 'lodash/chain/thru'], function (exports, _lodashInternalLazyWrapper, _lodashInternalLodashWrapper, _lodashChainThru) {
+ 'use strict';
+
+ /**
+ * Reverses the wrapped array so the first element becomes the last, the
+ * second element becomes the second to last, and so on.
+ *
+ * **Note:** This method mutates the wrapped array.
+ *
+ * @name reverse
+ * @memberOf _
+ * @category Chain
+ * @returns {Object} Returns the new reversed `lodash` wrapper instance.
+ * @example
+ *
+ * var array = [1, 2, 3];
+ *
+ * _(array).reverse().value()
+ * // => [3, 2, 1]
+ *
+ * console.log(array);
+ * // => [3, 2, 1]
+ */
+ function wrapperReverse() {
+ var value = this.__wrapped__;
+
+ var interceptor = function interceptor(value) {
+ return value.reverse();
+ };
+ if (value instanceof _lodashInternalLazyWrapper['default']) {
+ var wrapped = value;
+ if (this.__actions__.length) {
+ wrapped = new _lodashInternalLazyWrapper['default'](this);
+ }
+ wrapped = wrapped.reverse();
+ wrapped.__actions__.push({ 'func': _lodashChainThru['default'], 'args': [interceptor], 'thisArg': undefined });
+ return new _lodashInternalLodashWrapper['default'](wrapped, this.__chain__);
+ }
+ return this.thru(interceptor);
+ }
+
+ exports['default'] = wrapperReverse;
+});
+define('lodash/chain/wrapperToString', ['exports'], function (exports) {
+ /**
+ * Produces the result of coercing the unwrapped value to a string.
+ *
+ * @name toString
+ * @memberOf _
+ * @category Chain
+ * @returns {string} Returns the coerced string value.
+ * @example
+ *
+ * _([1, 2, 3]).toString();
+ * // => '1,2,3'
+ */
+ 'use strict';
+
+ function wrapperToString() {
+ return this.value() + '';
+ }
+
+ exports['default'] = wrapperToString;
+});
+define('lodash/chain/wrapperValue', ['exports', 'lodash/internal/baseWrapperValue'], function (exports, _lodashInternalBaseWrapperValue) {
+ 'use strict';
+
+ /**
+ * Executes the chained sequence to extract the unwrapped value.
+ *
+ * @name value
+ * @memberOf _
+ * @alias run, toJSON, valueOf
+ * @category Chain
+ * @returns {*} Returns the resolved unwrapped value.
+ * @example
+ *
+ * _([1, 2, 3]).value();
+ * // => [1, 2, 3]
+ */
+ function wrapperValue() {
+ return (0, _lodashInternalBaseWrapperValue['default'])(this.__wrapped__, this.__actions__);
+ }
+
+ exports['default'] = wrapperValue;
+});
+define('lodash/collection', ['exports', 'lodash/collection/all', 'lodash/collection/any', 'lodash/collection/at', 'lodash/collection/collect', 'lodash/collection/contains', 'lodash/collection/countBy', 'lodash/collection/detect', 'lodash/collection/each', 'lodash/collection/eachRight', 'lodash/collection/every', 'lodash/collection/filter', 'lodash/collection/find', 'lodash/collection/findLast', 'lodash/collection/findWhere', 'lodash/collection/foldl', 'lodash/collection/foldr', 'lodash/collection/forEach', 'lodash/collection/forEachRight', 'lodash/collection/groupBy', 'lodash/collection/include', 'lodash/collection/includes', 'lodash/collection/indexBy', 'lodash/collection/inject', 'lodash/collection/invoke', 'lodash/collection/map', 'lodash/math/max', 'lodash/math/min', 'lodash/collection/partition', 'lodash/collection/pluck', 'lodash/collection/reduce', 'lodash/collection/reduceRight', 'lodash/collection/reject', 'lodash/collection/sample', 'lodash/collection/select', 'lodash/collection/shuffle', 'lodash/collection/size', 'lodash/collection/some', 'lodash/collection/sortBy', 'lodash/collection/sortByAll', 'lodash/collection/sortByOrder', 'lodash/math/sum', 'lodash/collection/where'], function (exports, _lodashCollectionAll, _lodashCollectionAny, _lodashCollectionAt, _lodashCollectionCollect, _lodashCollectionContains, _lodashCollectionCountBy, _lodashCollectionDetect, _lodashCollectionEach, _lodashCollectionEachRight, _lodashCollectionEvery, _lodashCollectionFilter, _lodashCollectionFind, _lodashCollectionFindLast, _lodashCollectionFindWhere, _lodashCollectionFoldl, _lodashCollectionFoldr, _lodashCollectionForEach, _lodashCollectionForEachRight, _lodashCollectionGroupBy, _lodashCollectionInclude, _lodashCollectionIncludes, _lodashCollectionIndexBy, _lodashCollectionInject, _lodashCollectionInvoke, _lodashCollectionMap, _lodashMathMax, _lodashMathMin, _lodashCollectionPartition, _lodashCollectionPluck, _lodashCollectionReduce, _lodashCollectionReduceRight, _lodashCollectionReject, _lodashCollectionSample, _lodashCollectionSelect, _lodashCollectionShuffle, _lodashCollectionSize, _lodashCollectionSome, _lodashCollectionSortBy, _lodashCollectionSortByAll, _lodashCollectionSortByOrder, _lodashMathSum, _lodashCollectionWhere) {
+ 'use strict';
+
+ exports['default'] = {
+ 'all': _lodashCollectionAll['default'],
+ 'any': _lodashCollectionAny['default'],
+ 'at': _lodashCollectionAt['default'],
+ 'collect': _lodashCollectionCollect['default'],
+ 'contains': _lodashCollectionContains['default'],
+ 'countBy': _lodashCollectionCountBy['default'],
+ 'detect': _lodashCollectionDetect['default'],
+ 'each': _lodashCollectionEach['default'],
+ 'eachRight': _lodashCollectionEachRight['default'],
+ 'every': _lodashCollectionEvery['default'],
+ 'filter': _lodashCollectionFilter['default'],
+ 'find': _lodashCollectionFind['default'],
+ 'findLast': _lodashCollectionFindLast['default'],
+ 'findWhere': _lodashCollectionFindWhere['default'],
+ 'foldl': _lodashCollectionFoldl['default'],
+ 'foldr': _lodashCollectionFoldr['default'],
+ 'forEach': _lodashCollectionForEach['default'],
+ 'forEachRight': _lodashCollectionForEachRight['default'],
+ 'groupBy': _lodashCollectionGroupBy['default'],
+ 'include': _lodashCollectionInclude['default'],
+ 'includes': _lodashCollectionIncludes['default'],
+ 'indexBy': _lodashCollectionIndexBy['default'],
+ 'inject': _lodashCollectionInject['default'],
+ 'invoke': _lodashCollectionInvoke['default'],
+ 'map': _lodashCollectionMap['default'],
+ 'max': _lodashMathMax['default'],
+ 'min': _lodashMathMin['default'],
+ 'partition': _lodashCollectionPartition['default'],
+ 'pluck': _lodashCollectionPluck['default'],
+ 'reduce': _lodashCollectionReduce['default'],
+ 'reduceRight': _lodashCollectionReduceRight['default'],
+ 'reject': _lodashCollectionReject['default'],
+ 'sample': _lodashCollectionSample['default'],
+ 'select': _lodashCollectionSelect['default'],
+ 'shuffle': _lodashCollectionShuffle['default'],
+ 'size': _lodashCollectionSize['default'],
+ 'some': _lodashCollectionSome['default'],
+ 'sortBy': _lodashCollectionSortBy['default'],
+ 'sortByAll': _lodashCollectionSortByAll['default'],
+ 'sortByOrder': _lodashCollectionSortByOrder['default'],
+ 'sum': _lodashMathSum['default'],
+ 'where': _lodashCollectionWhere['default']
+ };
+});
+define('lodash/collection/all', ['exports', 'lodash/collection/every'], function (exports, _lodashCollectionEvery) {
+ 'use strict';
+
+ exports['default'] = _lodashCollectionEvery['default'];
+});
+define('lodash/collection/any', ['exports', 'lodash/collection/some'], function (exports, _lodashCollectionSome) {
+ 'use strict';
+
+ exports['default'] = _lodashCollectionSome['default'];
+});
+define('lodash/collection/at', ['exports', 'lodash/internal/baseAt', 'lodash/internal/baseFlatten', 'lodash/function/restParam'], function (exports, _lodashInternalBaseAt, _lodashInternalBaseFlatten, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /**
+ * Creates an array of elements corresponding to the given keys, or indexes,
+ * of `collection`. Keys may be specified as individual arguments or as arrays
+ * of keys.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {...(number|number[]|string|string[])} [props] The property names
+ * or indexes of elements to pick, specified individually or in arrays.
+ * @returns {Array} Returns the new array of picked elements.
+ * @example
+ *
+ * _.at(['a', 'b', 'c'], [0, 2]);
+ * // => ['a', 'c']
+ *
+ * _.at(['barney', 'fred', 'pebbles'], 0, 2);
+ * // => ['barney', 'pebbles']
+ */
+ var at = (0, _lodashFunctionRestParam['default'])(function (collection, props) {
+ return (0, _lodashInternalBaseAt['default'])(collection, (0, _lodashInternalBaseFlatten['default'])(props));
+ });
+
+ exports['default'] = at;
+});
+define('lodash/collection/collect', ['exports', 'lodash/collection/map'], function (exports, _lodashCollectionMap) {
+ 'use strict';
+
+ exports['default'] = _lodashCollectionMap['default'];
+});
+define('lodash/collection/contains', ['exports', 'lodash/collection/includes'], function (exports, _lodashCollectionIncludes) {
+ 'use strict';
+
+ exports['default'] = _lodashCollectionIncludes['default'];
+});
+define('lodash/collection/countBy', ['exports', 'lodash/internal/createAggregator'], function (exports, _lodashInternalCreateAggregator) {
+ 'use strict';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty = objectProto.hasOwnProperty;
+
+ /**
+ * Creates an object composed of keys generated from the results of running
+ * each element of `collection` through `iteratee`. The corresponding value
+ * of each key is the number of times the key was returned by `iteratee`.
+ * The `iteratee` is bound to `thisArg` and invoked with three arguments:
+ * (value, index|key, collection).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Object} Returns the composed aggregate object.
+ * @example
+ *
+ * _.countBy([4.3, 6.1, 6.4], function(n) {
+ * return Math.floor(n);
+ * });
+ * // => { '4': 1, '6': 2 }
+ *
+ * _.countBy([4.3, 6.1, 6.4], function(n) {
+ * return this.floor(n);
+ * }, Math);
+ * // => { '4': 1, '6': 2 }
+ *
+ * _.countBy(['one', 'two', 'three'], 'length');
+ * // => { '3': 2, '5': 1 }
+ */
+ var countBy = (0, _lodashInternalCreateAggregator['default'])(function (result, value, key) {
+ hasOwnProperty.call(result, key) ? ++result[key] : result[key] = 1;
+ });
+
+ exports['default'] = countBy;
+});
+define('lodash/collection/detect', ['exports', 'lodash/collection/find'], function (exports, _lodashCollectionFind) {
+ 'use strict';
+
+ exports['default'] = _lodashCollectionFind['default'];
+});
+define('lodash/collection/each', ['exports', 'lodash/collection/forEach'], function (exports, _lodashCollectionForEach) {
+ 'use strict';
+
+ exports['default'] = _lodashCollectionForEach['default'];
+});
+define('lodash/collection/eachRight', ['exports', 'lodash/collection/forEachRight'], function (exports, _lodashCollectionForEachRight) {
+ 'use strict';
+
+ exports['default'] = _lodashCollectionForEachRight['default'];
+});
+define('lodash/collection/every', ['exports', 'lodash/internal/arrayEvery', 'lodash/internal/baseCallback', 'lodash/internal/baseEvery', 'lodash/lang/isArray', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalArrayEvery, _lodashInternalBaseCallback, _lodashInternalBaseEvery, _lodashLangIsArray, _lodashInternalIsIterateeCall) {
+ 'use strict';
+
+ /**
+ * Checks if `predicate` returns truthy for **all** elements of `collection`.
+ * The predicate is bound to `thisArg` and invoked with three arguments:
+ * (value, index|key, collection).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @alias all
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {boolean} Returns `true` if all elements pass the predicate check,
+ * else `false`.
+ * @example
+ *
+ * _.every([true, 1, null, 'yes'], Boolean);
+ * // => false
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': false },
+ * { 'user': 'fred', 'active': false }
+ * ];
+ *
+ * // using the `_.matches` callback shorthand
+ * _.every(users, { 'user': 'barney', 'active': false });
+ * // => false
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.every(users, 'active', false);
+ * // => true
+ *
+ * // using the `_.property` callback shorthand
+ * _.every(users, 'active');
+ * // => false
+ */
+ function every(collection, predicate, thisArg) {
+ var func = (0, _lodashLangIsArray['default'])(collection) ? _lodashInternalArrayEvery['default'] : _lodashInternalBaseEvery['default'];
+ if (thisArg && (0, _lodashInternalIsIterateeCall['default'])(collection, predicate, thisArg)) {
+ predicate = undefined;
+ }
+ if (typeof predicate != 'function' || thisArg !== undefined) {
+ predicate = (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3);
+ }
+ return func(collection, predicate);
+ }
+
+ exports['default'] = every;
+});
+define('lodash/collection/filter', ['exports', 'lodash/internal/arrayFilter', 'lodash/internal/baseCallback', 'lodash/internal/baseFilter', 'lodash/lang/isArray'], function (exports, _lodashInternalArrayFilter, _lodashInternalBaseCallback, _lodashInternalBaseFilter, _lodashLangIsArray) {
+ 'use strict';
+
+ /**
+ * Iterates over elements of `collection`, returning an array of all elements
+ * `predicate` returns truthy for. The predicate is bound to `thisArg` and
+ * invoked with three arguments: (value, index|key, collection).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @alias select
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Array} Returns the new filtered array.
+ * @example
+ *
+ * _.filter([4, 5, 6], function(n) {
+ * return n % 2 == 0;
+ * });
+ * // => [4, 6]
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': true },
+ * { 'user': 'fred', 'age': 40, 'active': false }
+ * ];
+ *
+ * // using the `_.matches` callback shorthand
+ * _.pluck(_.filter(users, { 'age': 36, 'active': true }), 'user');
+ * // => ['barney']
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.pluck(_.filter(users, 'active', false), 'user');
+ * // => ['fred']
+ *
+ * // using the `_.property` callback shorthand
+ * _.pluck(_.filter(users, 'active'), 'user');
+ * // => ['barney']
+ */
+ function filter(collection, predicate, thisArg) {
+ var func = (0, _lodashLangIsArray['default'])(collection) ? _lodashInternalArrayFilter['default'] : _lodashInternalBaseFilter['default'];
+ predicate = (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3);
+ return func(collection, predicate);
+ }
+
+ exports['default'] = filter;
+});
+define('lodash/collection/find', ['exports', 'lodash/internal/baseEach', 'lodash/internal/createFind'], function (exports, _lodashInternalBaseEach, _lodashInternalCreateFind) {
+ 'use strict';
+
+ /**
+ * Iterates over elements of `collection`, returning the first element
+ * `predicate` returns truthy for. The predicate is bound to `thisArg` and
+ * invoked with three arguments: (value, index|key, collection).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @alias detect
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to search.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {*} Returns the matched element, else `undefined`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': true },
+ * { 'user': 'fred', 'age': 40, 'active': false },
+ * { 'user': 'pebbles', 'age': 1, 'active': true }
+ * ];
+ *
+ * _.result(_.find(users, function(chr) {
+ * return chr.age < 40;
+ * }), 'user');
+ * // => 'barney'
+ *
+ * // using the `_.matches` callback shorthand
+ * _.result(_.find(users, { 'age': 1, 'active': true }), 'user');
+ * // => 'pebbles'
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.result(_.find(users, 'active', false), 'user');
+ * // => 'fred'
+ *
+ * // using the `_.property` callback shorthand
+ * _.result(_.find(users, 'active'), 'user');
+ * // => 'barney'
+ */
+ var find = (0, _lodashInternalCreateFind['default'])(_lodashInternalBaseEach['default']);
+
+ exports['default'] = find;
+});
+define('lodash/collection/findLast', ['exports', 'lodash/internal/baseEachRight', 'lodash/internal/createFind'], function (exports, _lodashInternalBaseEachRight, _lodashInternalCreateFind) {
+ 'use strict';
+
+ /**
+ * This method is like `_.find` except that it iterates over elements of
+ * `collection` from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to search.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {*} Returns the matched element, else `undefined`.
+ * @example
+ *
+ * _.findLast([1, 2, 3, 4], function(n) {
+ * return n % 2 == 1;
+ * });
+ * // => 3
+ */
+ var findLast = (0, _lodashInternalCreateFind['default'])(_lodashInternalBaseEachRight['default'], true);
+
+ exports['default'] = findLast;
+});
+define('lodash/collection/findWhere', ['exports', 'lodash/internal/baseMatches', 'lodash/collection/find'], function (exports, _lodashInternalBaseMatches, _lodashCollectionFind) {
+ 'use strict';
+
+ /**
+ * Performs a deep comparison between each element in `collection` and the
+ * source object, returning the first element that has equivalent property
+ * values.
+ *
+ * **Note:** This method supports comparing arrays, booleans, `Date` objects,
+ * numbers, `Object` objects, regexes, and strings. Objects are compared by
+ * their own, not inherited, enumerable properties. For comparing a single
+ * own or inherited property value see `_.matchesProperty`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to search.
+ * @param {Object} source The object of property values to match.
+ * @returns {*} Returns the matched element, else `undefined`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': true },
+ * { 'user': 'fred', 'age': 40, 'active': false }
+ * ];
+ *
+ * _.result(_.findWhere(users, { 'age': 36, 'active': true }), 'user');
+ * // => 'barney'
+ *
+ * _.result(_.findWhere(users, { 'age': 40, 'active': false }), 'user');
+ * // => 'fred'
+ */
+ function findWhere(collection, source) {
+ return (0, _lodashCollectionFind['default'])(collection, (0, _lodashInternalBaseMatches['default'])(source));
+ }
+
+ exports['default'] = findWhere;
+});
+define('lodash/collection/foldl', ['exports', 'lodash/collection/reduce'], function (exports, _lodashCollectionReduce) {
+ 'use strict';
+
+ exports['default'] = _lodashCollectionReduce['default'];
+});
+define('lodash/collection/foldr', ['exports', 'lodash/collection/reduceRight'], function (exports, _lodashCollectionReduceRight) {
+ 'use strict';
+
+ exports['default'] = _lodashCollectionReduceRight['default'];
+});
+define('lodash/collection/forEach', ['exports', 'lodash/internal/arrayEach', 'lodash/internal/baseEach', 'lodash/internal/createForEach'], function (exports, _lodashInternalArrayEach, _lodashInternalBaseEach, _lodashInternalCreateForEach) {
+ 'use strict';
+
+ /**
+ * Iterates over elements of `collection` invoking `iteratee` for each element.
+ * The `iteratee` is bound to `thisArg` and invoked with three arguments:
+ * (value, index|key, collection). Iteratee functions may exit iteration early
+ * by explicitly returning `false`.
+ *
+ * **Note:** As with other "Collections" methods, objects with a "length" property
+ * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`
+ * may be used for object iteration.
+ *
+ * @static
+ * @memberOf _
+ * @alias each
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Array|Object|string} Returns `collection`.
+ * @example
+ *
+ * _([1, 2]).forEach(function(n) {
+ * console.log(n);
+ * }).value();
+ * // => logs each value from left to right and returns the array
+ *
+ * _.forEach({ 'a': 1, 'b': 2 }, function(n, key) {
+ * console.log(n, key);
+ * });
+ * // => logs each value-key pair and returns the object (iteration order is not guaranteed)
+ */
+ var forEach = (0, _lodashInternalCreateForEach['default'])(_lodashInternalArrayEach['default'], _lodashInternalBaseEach['default']);
+
+ exports['default'] = forEach;
+});
+define('lodash/collection/forEachRight', ['exports', 'lodash/internal/arrayEachRight', 'lodash/internal/baseEachRight', 'lodash/internal/createForEach'], function (exports, _lodashInternalArrayEachRight, _lodashInternalBaseEachRight, _lodashInternalCreateForEach) {
+ 'use strict';
+
+ /**
+ * This method is like `_.forEach` except that it iterates over elements of
+ * `collection` from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @alias eachRight
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Array|Object|string} Returns `collection`.
+ * @example
+ *
+ * _([1, 2]).forEachRight(function(n) {
+ * console.log(n);
+ * }).value();
+ * // => logs each value from right to left and returns the array
+ */
+ var forEachRight = (0, _lodashInternalCreateForEach['default'])(_lodashInternalArrayEachRight['default'], _lodashInternalBaseEachRight['default']);
+
+ exports['default'] = forEachRight;
+});
+define('lodash/collection/groupBy', ['exports', 'lodash/internal/createAggregator'], function (exports, _lodashInternalCreateAggregator) {
+ 'use strict';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty = objectProto.hasOwnProperty;
+
+ /**
+ * Creates an object composed of keys generated from the results of running
+ * each element of `collection` through `iteratee`. The corresponding value
+ * of each key is an array of the elements responsible for generating the key.
+ * The `iteratee` is bound to `thisArg` and invoked with three arguments:
+ * (value, index|key, collection).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Object} Returns the composed aggregate object.
+ * @example
+ *
+ * _.groupBy([4.2, 6.1, 6.4], function(n) {
+ * return Math.floor(n);
+ * });
+ * // => { '4': [4.2], '6': [6.1, 6.4] }
+ *
+ * _.groupBy([4.2, 6.1, 6.4], function(n) {
+ * return this.floor(n);
+ * }, Math);
+ * // => { '4': [4.2], '6': [6.1, 6.4] }
+ *
+ * // using the `_.property` callback shorthand
+ * _.groupBy(['one', 'two', 'three'], 'length');
+ * // => { '3': ['one', 'two'], '5': ['three'] }
+ */
+ var groupBy = (0, _lodashInternalCreateAggregator['default'])(function (result, value, key) {
+ if (hasOwnProperty.call(result, key)) {
+ result[key].push(value);
+ } else {
+ result[key] = [value];
+ }
+ });
+
+ exports['default'] = groupBy;
+});
+define('lodash/collection/include', ['exports', 'lodash/collection/includes'], function (exports, _lodashCollectionIncludes) {
+ 'use strict';
+
+ exports['default'] = _lodashCollectionIncludes['default'];
+});
+define('lodash/collection/includes', ['exports', 'lodash/internal/baseIndexOf', 'lodash/internal/getLength', 'lodash/lang/isArray', 'lodash/internal/isIterateeCall', 'lodash/internal/isLength', 'lodash/lang/isString', 'lodash/object/values'], function (exports, _lodashInternalBaseIndexOf, _lodashInternalGetLength, _lodashLangIsArray, _lodashInternalIsIterateeCall, _lodashInternalIsLength, _lodashLangIsString, _lodashObjectValues) {
+ 'use strict';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeMax = Math.max;
+
+ /**
+ * Checks if `target` is in `collection` using
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * for equality comparisons. If `fromIndex` is negative, it's used as the offset
+ * from the end of `collection`.
+ *
+ * @static
+ * @memberOf _
+ * @alias contains, include
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to search.
+ * @param {*} target The value to search for.
+ * @param {number} [fromIndex=0] The index to search from.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.
+ * @returns {boolean} Returns `true` if a matching element is found, else `false`.
+ * @example
+ *
+ * _.includes([1, 2, 3], 1);
+ * // => true
+ *
+ * _.includes([1, 2, 3], 1, 2);
+ * // => false
+ *
+ * _.includes({ 'user': 'fred', 'age': 40 }, 'fred');
+ * // => true
+ *
+ * _.includes('pebbles', 'eb');
+ * // => true
+ */
+ function includes(collection, target, fromIndex, guard) {
+ var length = collection ? (0, _lodashInternalGetLength['default'])(collection) : 0;
+ if (!(0, _lodashInternalIsLength['default'])(length)) {
+ collection = (0, _lodashObjectValues['default'])(collection);
+ length = collection.length;
+ }
+ if (typeof fromIndex != 'number' || guard && (0, _lodashInternalIsIterateeCall['default'])(target, fromIndex, guard)) {
+ fromIndex = 0;
+ } else {
+ fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex || 0;
+ }
+ return typeof collection == 'string' || !(0, _lodashLangIsArray['default'])(collection) && (0, _lodashLangIsString['default'])(collection) ? fromIndex <= length && collection.indexOf(target, fromIndex) > -1 : !!length && (0, _lodashInternalBaseIndexOf['default'])(collection, target, fromIndex) > -1;
+ }
+
+ exports['default'] = includes;
+});
+define('lodash/collection/indexBy', ['exports', 'lodash/internal/createAggregator'], function (exports, _lodashInternalCreateAggregator) {
+ 'use strict';
+
+ /**
+ * Creates an object composed of keys generated from the results of running
+ * each element of `collection` through `iteratee`. The corresponding value
+ * of each key is the last element responsible for generating the key. The
+ * iteratee function is bound to `thisArg` and invoked with three arguments:
+ * (value, index|key, collection).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Object} Returns the composed aggregate object.
+ * @example
+ *
+ * var keyData = [
+ * { 'dir': 'left', 'code': 97 },
+ * { 'dir': 'right', 'code': 100 }
+ * ];
+ *
+ * _.indexBy(keyData, 'dir');
+ * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
+ *
+ * _.indexBy(keyData, function(object) {
+ * return String.fromCharCode(object.code);
+ * });
+ * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
+ *
+ * _.indexBy(keyData, function(object) {
+ * return this.fromCharCode(object.code);
+ * }, String);
+ * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
+ */
+ var indexBy = (0, _lodashInternalCreateAggregator['default'])(function (result, value, key) {
+ result[key] = value;
+ });
+
+ exports['default'] = indexBy;
+});
+define('lodash/collection/inject', ['exports', 'lodash/collection/reduce'], function (exports, _lodashCollectionReduce) {
+ 'use strict';
+
+ exports['default'] = _lodashCollectionReduce['default'];
+});
+define('lodash/collection/invoke', ['exports', 'lodash/internal/baseEach', 'lodash/internal/invokePath', 'lodash/internal/isArrayLike', 'lodash/internal/isKey', 'lodash/function/restParam'], function (exports, _lodashInternalBaseEach, _lodashInternalInvokePath, _lodashInternalIsArrayLike, _lodashInternalIsKey, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /**
+ * Invokes the method at `path` of each element in `collection`, returning
+ * an array of the results of each invoked method. Any additional arguments
+ * are provided to each invoked method. If `methodName` is a function it's
+ * invoked for, and `this` bound to, each element in `collection`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Array|Function|string} path The path of the method to invoke or
+ * the function invoked per iteration.
+ * @param {...*} [args] The arguments to invoke the method with.
+ * @returns {Array} Returns the array of results.
+ * @example
+ *
+ * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');
+ * // => [[1, 5, 7], [1, 2, 3]]
+ *
+ * _.invoke([123, 456], String.prototype.split, '');
+ * // => [['1', '2', '3'], ['4', '5', '6']]
+ */
+ var invoke = (0, _lodashFunctionRestParam['default'])(function (collection, path, args) {
+ var index = -1,
+ isFunc = typeof path == 'function',
+ isProp = (0, _lodashInternalIsKey['default'])(path),
+ result = (0, _lodashInternalIsArrayLike['default'])(collection) ? Array(collection.length) : [];
+
+ (0, _lodashInternalBaseEach['default'])(collection, function (value) {
+ var func = isFunc ? path : isProp && value != null ? value[path] : undefined;
+ result[++index] = func ? func.apply(value, args) : (0, _lodashInternalInvokePath['default'])(value, path, args);
+ });
+ return result;
+ });
+
+ exports['default'] = invoke;
+});
+define('lodash/collection/map', ['exports', 'lodash/internal/arrayMap', 'lodash/internal/baseCallback', 'lodash/internal/baseMap', 'lodash/lang/isArray'], function (exports, _lodashInternalArrayMap, _lodashInternalBaseCallback, _lodashInternalBaseMap, _lodashLangIsArray) {
+ 'use strict';
+
+ /**
+ * Creates an array of values by running each element in `collection` through
+ * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three
+ * arguments: (value, index|key, collection).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * Many lodash methods are guarded to work as iteratees for methods like
+ * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
+ *
+ * The guarded methods are:
+ * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`,
+ * `drop`, `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`,
+ * `parseInt`, `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`,
+ * `trimLeft`, `trimRight`, `trunc`, `random`, `range`, `sample`, `some`,
+ * `sum`, `uniq`, and `words`
+ *
+ * @static
+ * @memberOf _
+ * @alias collect
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Array} Returns the new mapped array.
+ * @example
+ *
+ * function timesThree(n) {
+ * return n * 3;
+ * }
+ *
+ * _.map([1, 2], timesThree);
+ * // => [3, 6]
+ *
+ * _.map({ 'a': 1, 'b': 2 }, timesThree);
+ * // => [3, 6] (iteration order is not guaranteed)
+ *
+ * var users = [
+ * { 'user': 'barney' },
+ * { 'user': 'fred' }
+ * ];
+ *
+ * // using the `_.property` callback shorthand
+ * _.map(users, 'user');
+ * // => ['barney', 'fred']
+ */
+ function map(collection, iteratee, thisArg) {
+ var func = (0, _lodashLangIsArray['default'])(collection) ? _lodashInternalArrayMap['default'] : _lodashInternalBaseMap['default'];
+ iteratee = (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 3);
+ return func(collection, iteratee);
+ }
+
+ exports['default'] = map;
+});
+define('lodash/collection/max', ['exports', 'lodash/math/max'], function (exports, _lodashMathMax) {
+ 'use strict';
+
+ exports['default'] = _lodashMathMax['default'];
+});
+define('lodash/collection/min', ['exports', 'lodash/math/min'], function (exports, _lodashMathMin) {
+ 'use strict';
+
+ exports['default'] = _lodashMathMin['default'];
+});
+define('lodash/collection/partition', ['exports', 'lodash/internal/createAggregator'], function (exports, _lodashInternalCreateAggregator) {
+ 'use strict';
+
+ /**
+ * Creates an array of elements split into two groups, the first of which
+ * contains elements `predicate` returns truthy for, while the second of which
+ * contains elements `predicate` returns falsey for. The predicate is bound
+ * to `thisArg` and invoked with three arguments: (value, index|key, collection).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Array} Returns the array of grouped elements.
+ * @example
+ *
+ * _.partition([1, 2, 3], function(n) {
+ * return n % 2;
+ * });
+ * // => [[1, 3], [2]]
+ *
+ * _.partition([1.2, 2.3, 3.4], function(n) {
+ * return this.floor(n) % 2;
+ * }, Math);
+ * // => [[1.2, 3.4], [2.3]]
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': false },
+ * { 'user': 'fred', 'age': 40, 'active': true },
+ * { 'user': 'pebbles', 'age': 1, 'active': false }
+ * ];
+ *
+ * var mapper = function(array) {
+ * return _.pluck(array, 'user');
+ * };
+ *
+ * // using the `_.matches` callback shorthand
+ * _.map(_.partition(users, { 'age': 1, 'active': false }), mapper);
+ * // => [['pebbles'], ['barney', 'fred']]
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.map(_.partition(users, 'active', false), mapper);
+ * // => [['barney', 'pebbles'], ['fred']]
+ *
+ * // using the `_.property` callback shorthand
+ * _.map(_.partition(users, 'active'), mapper);
+ * // => [['fred'], ['barney', 'pebbles']]
+ */
+ var partition = (0, _lodashInternalCreateAggregator['default'])(function (result, value, key) {
+ result[key ? 0 : 1].push(value);
+ }, function () {
+ return [[], []];
+ });
+
+ exports['default'] = partition;
+});
+define('lodash/collection/pluck', ['exports', 'lodash/collection/map', 'lodash/utility/property'], function (exports, _lodashCollectionMap, _lodashUtilityProperty) {
+ 'use strict';
+
+ /**
+ * Gets the property value of `path` from all elements in `collection`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Array|string} path The path of the property to pluck.
+ * @returns {Array} Returns the property values.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 40 }
+ * ];
+ *
+ * _.pluck(users, 'user');
+ * // => ['barney', 'fred']
+ *
+ * var userIndex = _.indexBy(users, 'user');
+ * _.pluck(userIndex, 'age');
+ * // => [36, 40] (iteration order is not guaranteed)
+ */
+ function pluck(collection, path) {
+ return (0, _lodashCollectionMap['default'])(collection, (0, _lodashUtilityProperty['default'])(path));
+ }
+
+ exports['default'] = pluck;
+});
+define('lodash/collection/reduce', ['exports', 'lodash/internal/arrayReduce', 'lodash/internal/baseEach', 'lodash/internal/createReduce'], function (exports, _lodashInternalArrayReduce, _lodashInternalBaseEach, _lodashInternalCreateReduce) {
+ 'use strict';
+
+ /**
+ * Reduces `collection` to a value which is the accumulated result of running
+ * each element in `collection` through `iteratee`, where each successive
+ * invocation is supplied the return value of the previous. If `accumulator`
+ * is not provided the first element of `collection` is used as the initial
+ * value. The `iteratee` is bound to `thisArg` and invoked with four arguments:
+ * (accumulator, value, index|key, collection).
+ *
+ * Many lodash methods are guarded to work as iteratees for methods like
+ * `_.reduce`, `_.reduceRight`, and `_.transform`.
+ *
+ * The guarded methods are:
+ * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `sortByAll`,
+ * and `sortByOrder`
+ *
+ * @static
+ * @memberOf _
+ * @alias foldl, inject
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {*} Returns the accumulated value.
+ * @example
+ *
+ * _.reduce([1, 2], function(total, n) {
+ * return total + n;
+ * });
+ * // => 3
+ *
+ * _.reduce({ 'a': 1, 'b': 2 }, function(result, n, key) {
+ * result[key] = n * 3;
+ * return result;
+ * }, {});
+ * // => { 'a': 3, 'b': 6 } (iteration order is not guaranteed)
+ */
+ var reduce = (0, _lodashInternalCreateReduce['default'])(_lodashInternalArrayReduce['default'], _lodashInternalBaseEach['default']);
+
+ exports['default'] = reduce;
+});
+define('lodash/collection/reduceRight', ['exports', 'lodash/internal/arrayReduceRight', 'lodash/internal/baseEachRight', 'lodash/internal/createReduce'], function (exports, _lodashInternalArrayReduceRight, _lodashInternalBaseEachRight, _lodashInternalCreateReduce) {
+ 'use strict';
+
+ /**
+ * This method is like `_.reduce` except that it iterates over elements of
+ * `collection` from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @alias foldr
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {*} Returns the accumulated value.
+ * @example
+ *
+ * var array = [[0, 1], [2, 3], [4, 5]];
+ *
+ * _.reduceRight(array, function(flattened, other) {
+ * return flattened.concat(other);
+ * }, []);
+ * // => [4, 5, 2, 3, 0, 1]
+ */
+ var reduceRight = (0, _lodashInternalCreateReduce['default'])(_lodashInternalArrayReduceRight['default'], _lodashInternalBaseEachRight['default']);
+
+ exports['default'] = reduceRight;
+});
+define('lodash/collection/reject', ['exports', 'lodash/internal/arrayFilter', 'lodash/internal/baseCallback', 'lodash/internal/baseFilter', 'lodash/lang/isArray'], function (exports, _lodashInternalArrayFilter, _lodashInternalBaseCallback, _lodashInternalBaseFilter, _lodashLangIsArray) {
+ 'use strict';
+
+ /**
+ * The opposite of `_.filter`; this method returns the elements of `collection`
+ * that `predicate` does **not** return truthy for.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Array} Returns the new filtered array.
+ * @example
+ *
+ * _.reject([1, 2, 3, 4], function(n) {
+ * return n % 2 == 0;
+ * });
+ * // => [1, 3]
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': false },
+ * { 'user': 'fred', 'age': 40, 'active': true }
+ * ];
+ *
+ * // using the `_.matches` callback shorthand
+ * _.pluck(_.reject(users, { 'age': 40, 'active': true }), 'user');
+ * // => ['barney']
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.pluck(_.reject(users, 'active', false), 'user');
+ * // => ['fred']
+ *
+ * // using the `_.property` callback shorthand
+ * _.pluck(_.reject(users, 'active'), 'user');
+ * // => ['barney']
+ */
+ function reject(collection, predicate, thisArg) {
+ var func = (0, _lodashLangIsArray['default'])(collection) ? _lodashInternalArrayFilter['default'] : _lodashInternalBaseFilter['default'];
+ predicate = (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3);
+ return func(collection, function (value, index, collection) {
+ return !predicate(value, index, collection);
+ });
+ }
+
+ exports['default'] = reject;
+});
+define('lodash/collection/sample', ['exports', 'lodash/internal/baseRandom', 'lodash/internal/isIterateeCall', 'lodash/lang/toArray', 'lodash/internal/toIterable'], function (exports, _lodashInternalBaseRandom, _lodashInternalIsIterateeCall, _lodashLangToArray, _lodashInternalToIterable) {
+ 'use strict';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeMin = Math.min;
+
+ /**
+ * Gets a random element or `n` random elements from a collection.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to sample.
+ * @param {number} [n] The number of elements to sample.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {*} Returns the random sample(s).
+ * @example
+ *
+ * _.sample([1, 2, 3, 4]);
+ * // => 2
+ *
+ * _.sample([1, 2, 3, 4], 2);
+ * // => [3, 1]
+ */
+ function sample(collection, n, guard) {
+ if (guard ? (0, _lodashInternalIsIterateeCall['default'])(collection, n, guard) : n == null) {
+ collection = (0, _lodashInternalToIterable['default'])(collection);
+ var length = collection.length;
+ return length > 0 ? collection[(0, _lodashInternalBaseRandom['default'])(0, length - 1)] : undefined;
+ }
+ var index = -1,
+ result = (0, _lodashLangToArray['default'])(collection),
+ length = result.length,
+ lastIndex = length - 1;
+
+ n = nativeMin(n < 0 ? 0 : +n || 0, length);
+ while (++index < n) {
+ var rand = (0, _lodashInternalBaseRandom['default'])(index, lastIndex),
+ value = result[rand];
+
+ result[rand] = result[index];
+ result[index] = value;
+ }
+ result.length = n;
+ return result;
+ }
+
+ exports['default'] = sample;
+});
+define('lodash/collection/select', ['exports', 'lodash/collection/filter'], function (exports, _lodashCollectionFilter) {
+ 'use strict';
+
+ exports['default'] = _lodashCollectionFilter['default'];
+});
+define('lodash/collection/shuffle', ['exports', 'lodash/collection/sample'], function (exports, _lodashCollectionSample) {
+ 'use strict';
+
+ /** Used as references for `-Infinity` and `Infinity`. */
+ var POSITIVE_INFINITY = Number.POSITIVE_INFINITY;
+
+ /**
+ * Creates an array of shuffled values, using a version of the
+ * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to shuffle.
+ * @returns {Array} Returns the new shuffled array.
+ * @example
+ *
+ * _.shuffle([1, 2, 3, 4]);
+ * // => [4, 1, 3, 2]
+ */
+ function shuffle(collection) {
+ return (0, _lodashCollectionSample['default'])(collection, POSITIVE_INFINITY);
+ }
+
+ exports['default'] = shuffle;
+});
+define('lodash/collection/size', ['exports', 'lodash/internal/getLength', 'lodash/internal/isLength', 'lodash/object/keys'], function (exports, _lodashInternalGetLength, _lodashInternalIsLength, _lodashObjectKeys) {
+ 'use strict';
+
+ /**
+ * Gets the size of `collection` by returning its length for array-like
+ * values or the number of own enumerable properties for objects.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to inspect.
+ * @returns {number} Returns the size of `collection`.
+ * @example
+ *
+ * _.size([1, 2, 3]);
+ * // => 3
+ *
+ * _.size({ 'a': 1, 'b': 2 });
+ * // => 2
+ *
+ * _.size('pebbles');
+ * // => 7
+ */
+ function size(collection) {
+ var length = collection ? (0, _lodashInternalGetLength['default'])(collection) : 0;
+ return (0, _lodashInternalIsLength['default'])(length) ? length : (0, _lodashObjectKeys['default'])(collection).length;
+ }
+
+ exports['default'] = size;
+});
+define('lodash/collection/some', ['exports', 'lodash/internal/arraySome', 'lodash/internal/baseCallback', 'lodash/internal/baseSome', 'lodash/lang/isArray', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalArraySome, _lodashInternalBaseCallback, _lodashInternalBaseSome, _lodashLangIsArray, _lodashInternalIsIterateeCall) {
+ 'use strict';
+
+ /**
+ * Checks if `predicate` returns truthy for **any** element of `collection`.
+ * The function returns as soon as it finds a passing value and does not iterate
+ * over the entire collection. The predicate is bound to `thisArg` and invoked
+ * with three arguments: (value, index|key, collection).
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @alias any
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {boolean} Returns `true` if any element passes the predicate check,
+ * else `false`.
+ * @example
+ *
+ * _.some([null, 0, 'yes', false], Boolean);
+ * // => true
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': true },
+ * { 'user': 'fred', 'active': false }
+ * ];
+ *
+ * // using the `_.matches` callback shorthand
+ * _.some(users, { 'user': 'barney', 'active': false });
+ * // => false
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.some(users, 'active', false);
+ * // => true
+ *
+ * // using the `_.property` callback shorthand
+ * _.some(users, 'active');
+ * // => true
+ */
+ function some(collection, predicate, thisArg) {
+ var func = (0, _lodashLangIsArray['default'])(collection) ? _lodashInternalArraySome['default'] : _lodashInternalBaseSome['default'];
+ if (thisArg && (0, _lodashInternalIsIterateeCall['default'])(collection, predicate, thisArg)) {
+ predicate = undefined;
+ }
+ if (typeof predicate != 'function' || thisArg !== undefined) {
+ predicate = (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3);
+ }
+ return func(collection, predicate);
+ }
+
+ exports['default'] = some;
+});
+define('lodash/collection/sortBy', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseMap', 'lodash/internal/baseSortBy', 'lodash/internal/compareAscending', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseMap, _lodashInternalBaseSortBy, _lodashInternalCompareAscending, _lodashInternalIsIterateeCall) {
+ 'use strict';
+
+ /**
+ * Creates an array of elements, sorted in ascending order by the results of
+ * running each element in a collection through `iteratee`. This method performs
+ * a stable sort, that is, it preserves the original sort order of equal elements.
+ * The `iteratee` is bound to `thisArg` and invoked with three arguments:
+ * (value, index|key, collection).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Array} Returns the new sorted array.
+ * @example
+ *
+ * _.sortBy([1, 2, 3], function(n) {
+ * return Math.sin(n);
+ * });
+ * // => [3, 1, 2]
+ *
+ * _.sortBy([1, 2, 3], function(n) {
+ * return this.sin(n);
+ * }, Math);
+ * // => [3, 1, 2]
+ *
+ * var users = [
+ * { 'user': 'fred' },
+ * { 'user': 'pebbles' },
+ * { 'user': 'barney' }
+ * ];
+ *
+ * // using the `_.property` callback shorthand
+ * _.pluck(_.sortBy(users, 'user'), 'user');
+ * // => ['barney', 'fred', 'pebbles']
+ */
+ function sortBy(collection, iteratee, thisArg) {
+ if (collection == null) {
+ return [];
+ }
+ if (thisArg && (0, _lodashInternalIsIterateeCall['default'])(collection, iteratee, thisArg)) {
+ iteratee = undefined;
+ }
+ var index = -1;
+ iteratee = (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 3);
+
+ var result = (0, _lodashInternalBaseMap['default'])(collection, function (value, key, collection) {
+ return { 'criteria': iteratee(value, key, collection), 'index': ++index, 'value': value };
+ });
+ return (0, _lodashInternalBaseSortBy['default'])(result, _lodashInternalCompareAscending['default']);
+ }
+
+ exports['default'] = sortBy;
+});
+define('lodash/collection/sortByAll', ['exports', 'lodash/internal/baseFlatten', 'lodash/internal/baseSortByOrder', 'lodash/internal/isIterateeCall', 'lodash/function/restParam'], function (exports, _lodashInternalBaseFlatten, _lodashInternalBaseSortByOrder, _lodashInternalIsIterateeCall, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /**
+ * This method is like `_.sortBy` except that it can sort by multiple iteratees
+ * or property names.
+ *
+ * If a property name is provided for an iteratee the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If an object is provided for an iteratee the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {...(Function|Function[]|Object|Object[]|string|string[])} iteratees
+ * The iteratees to sort by, specified as individual values or arrays of values.
+ * @returns {Array} Returns the new sorted array.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'fred', 'age': 48 },
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 42 },
+ * { 'user': 'barney', 'age': 34 }
+ * ];
+ *
+ * _.map(_.sortByAll(users, ['user', 'age']), _.values);
+ * // => [['barney', 34], ['barney', 36], ['fred', 42], ['fred', 48]]
+ *
+ * _.map(_.sortByAll(users, 'user', function(chr) {
+ * return Math.floor(chr.age / 10);
+ * }), _.values);
+ * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
+ */
+ var sortByAll = (0, _lodashFunctionRestParam['default'])(function (collection, iteratees) {
+ if (collection == null) {
+ return [];
+ }
+ var guard = iteratees[2];
+ if (guard && (0, _lodashInternalIsIterateeCall['default'])(iteratees[0], iteratees[1], guard)) {
+ iteratees.length = 1;
+ }
+ return (0, _lodashInternalBaseSortByOrder['default'])(collection, (0, _lodashInternalBaseFlatten['default'])(iteratees), []);
+ });
+
+ exports['default'] = sortByAll;
+});
+define('lodash/collection/sortByOrder', ['exports', 'lodash/internal/baseSortByOrder', 'lodash/lang/isArray', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseSortByOrder, _lodashLangIsArray, _lodashInternalIsIterateeCall) {
+ 'use strict';
+
+ /**
+ * This method is like `_.sortByAll` except that it allows specifying the
+ * sort orders of the iteratees to sort by. If `orders` is unspecified, all
+ * values are sorted in ascending order. Otherwise, a value is sorted in
+ * ascending order if its corresponding order is "asc", and descending if "desc".
+ *
+ * If a property name is provided for an iteratee the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If an object is provided for an iteratee the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
+ * @param {boolean[]} [orders] The sort orders of `iteratees`.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.
+ * @returns {Array} Returns the new sorted array.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'fred', 'age': 48 },
+ * { 'user': 'barney', 'age': 34 },
+ * { 'user': 'fred', 'age': 42 },
+ * { 'user': 'barney', 'age': 36 }
+ * ];
+ *
+ * // sort by `user` in ascending order and by `age` in descending order
+ * _.map(_.sortByOrder(users, ['user', 'age'], ['asc', 'desc']), _.values);
+ * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
+ */
+ function sortByOrder(collection, iteratees, orders, guard) {
+ if (collection == null) {
+ return [];
+ }
+ if (guard && (0, _lodashInternalIsIterateeCall['default'])(iteratees, orders, guard)) {
+ orders = undefined;
+ }
+ if (!(0, _lodashLangIsArray['default'])(iteratees)) {
+ iteratees = iteratees == null ? [] : [iteratees];
+ }
+ if (!(0, _lodashLangIsArray['default'])(orders)) {
+ orders = orders == null ? [] : [orders];
+ }
+ return (0, _lodashInternalBaseSortByOrder['default'])(collection, iteratees, orders);
+ }
+
+ exports['default'] = sortByOrder;
+});
+define('lodash/collection/sum', ['exports', 'lodash/math/sum'], function (exports, _lodashMathSum) {
+ 'use strict';
+
+ exports['default'] = _lodashMathSum['default'];
+});
+define('lodash/collection/where', ['exports', 'lodash/internal/baseMatches', 'lodash/collection/filter'], function (exports, _lodashInternalBaseMatches, _lodashCollectionFilter) {
+ 'use strict';
+
+ /**
+ * Performs a deep comparison between each element in `collection` and the
+ * source object, returning an array of all elements that have equivalent
+ * property values.
+ *
+ * **Note:** This method supports comparing arrays, booleans, `Date` objects,
+ * numbers, `Object` objects, regexes, and strings. Objects are compared by
+ * their own, not inherited, enumerable properties. For comparing a single
+ * own or inherited property value see `_.matchesProperty`.
+ *
+ * @static
+ * @memberOf _
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to search.
+ * @param {Object} source The object of property values to match.
+ * @returns {Array} Returns the new filtered array.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': false, 'pets': ['hoppy'] },
+ * { 'user': 'fred', 'age': 40, 'active': true, 'pets': ['baby puss', 'dino'] }
+ * ];
+ *
+ * _.pluck(_.where(users, { 'age': 36, 'active': false }), 'user');
+ * // => ['barney']
+ *
+ * _.pluck(_.where(users, { 'pets': ['dino'] }), 'user');
+ * // => ['fred']
+ */
+ function where(collection, source) {
+ return (0, _lodashCollectionFilter['default'])(collection, (0, _lodashInternalBaseMatches['default'])(source));
+ }
+
+ exports['default'] = where;
+});
+define('lodash/date', ['exports', 'lodash/date/now'], function (exports, _lodashDateNow) {
+ 'use strict';
+
+ exports['default'] = {
+ 'now': _lodashDateNow['default']
+ };
+});
+define('lodash/date/now', ['exports', 'lodash/internal/getNative'], function (exports, _lodashInternalGetNative) {
+ 'use strict';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeNow = (0, _lodashInternalGetNative['default'])(Date, 'now');
+
+ /**
+ * Gets the number of milliseconds that have elapsed since the Unix epoch
+ * (1 January 1970 00:00:00 UTC).
+ *
+ * @static
+ * @memberOf _
+ * @category Date
+ * @example
+ *
+ * _.defer(function(stamp) {
+ * console.log(_.now() - stamp);
+ * }, _.now());
+ * // => logs the number of milliseconds it took for the deferred function to be invoked
+ */
+ var now = nativeNow || function () {
+ return new Date().getTime();
+ };
+
+ exports['default'] = now;
+});
+define('lodash/function', ['exports', 'lodash/function/after', 'lodash/function/ary', 'lodash/function/backflow', 'lodash/function/before', 'lodash/function/bind', 'lodash/function/bindAll', 'lodash/function/bindKey', 'lodash/function/compose', 'lodash/function/curry', 'lodash/function/curryRight', 'lodash/function/debounce', 'lodash/function/defer', 'lodash/function/delay', 'lodash/function/flow', 'lodash/function/flowRight', 'lodash/function/memoize', 'lodash/function/modArgs', 'lodash/function/negate', 'lodash/function/once', 'lodash/function/partial', 'lodash/function/partialRight', 'lodash/function/rearg', 'lodash/function/restParam', 'lodash/function/spread', 'lodash/function/throttle', 'lodash/function/wrap'], function (exports, _lodashFunctionAfter, _lodashFunctionAry, _lodashFunctionBackflow, _lodashFunctionBefore, _lodashFunctionBind, _lodashFunctionBindAll, _lodashFunctionBindKey, _lodashFunctionCompose, _lodashFunctionCurry, _lodashFunctionCurryRight, _lodashFunctionDebounce, _lodashFunctionDefer, _lodashFunctionDelay, _lodashFunctionFlow, _lodashFunctionFlowRight, _lodashFunctionMemoize, _lodashFunctionModArgs, _lodashFunctionNegate, _lodashFunctionOnce, _lodashFunctionPartial, _lodashFunctionPartialRight, _lodashFunctionRearg, _lodashFunctionRestParam, _lodashFunctionSpread, _lodashFunctionThrottle, _lodashFunctionWrap) {
+ 'use strict';
+
+ exports['default'] = {
+ 'after': _lodashFunctionAfter['default'],
+ 'ary': _lodashFunctionAry['default'],
+ 'backflow': _lodashFunctionBackflow['default'],
+ 'before': _lodashFunctionBefore['default'],
+ 'bind': _lodashFunctionBind['default'],
+ 'bindAll': _lodashFunctionBindAll['default'],
+ 'bindKey': _lodashFunctionBindKey['default'],
+ 'compose': _lodashFunctionCompose['default'],
+ 'curry': _lodashFunctionCurry['default'],
+ 'curryRight': _lodashFunctionCurryRight['default'],
+ 'debounce': _lodashFunctionDebounce['default'],
+ 'defer': _lodashFunctionDefer['default'],
+ 'delay': _lodashFunctionDelay['default'],
+ 'flow': _lodashFunctionFlow['default'],
+ 'flowRight': _lodashFunctionFlowRight['default'],
+ 'memoize': _lodashFunctionMemoize['default'],
+ 'modArgs': _lodashFunctionModArgs['default'],
+ 'negate': _lodashFunctionNegate['default'],
+ 'once': _lodashFunctionOnce['default'],
+ 'partial': _lodashFunctionPartial['default'],
+ 'partialRight': _lodashFunctionPartialRight['default'],
+ 'rearg': _lodashFunctionRearg['default'],
+ 'restParam': _lodashFunctionRestParam['default'],
+ 'spread': _lodashFunctionSpread['default'],
+ 'throttle': _lodashFunctionThrottle['default'],
+ 'wrap': _lodashFunctionWrap['default']
+ };
+});
+define('lodash/function/after', ['exports', 'lodash/internal/root'], function (exports, _lodashInternalRoot) {
+ 'use strict';
+
+ /** Used as the `TypeError` message for "Functions" methods. */
+ var FUNC_ERROR_TEXT = 'Expected a function';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeIsFinite = _lodashInternalRoot['default'].isFinite;
+
+ /**
+ * The opposite of `_.before`; this method creates a function that invokes
+ * `func` once it's called `n` or more times.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {number} n The number of calls before `func` is invoked.
+ * @param {Function} func The function to restrict.
+ * @returns {Function} Returns the new restricted function.
+ * @example
+ *
+ * var saves = ['profile', 'settings'];
+ *
+ * var done = _.after(saves.length, function() {
+ * console.log('done saving!');
+ * });
+ *
+ * _.forEach(saves, function(type) {
+ * asyncSave({ 'type': type, 'complete': done });
+ * });
+ * // => logs 'done saving!' after the two async saves have completed
+ */
+ function after(n, func) {
+ if (typeof func != 'function') {
+ if (typeof n == 'function') {
+ var temp = n;
+ n = func;
+ func = temp;
+ } else {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ }
+ n = nativeIsFinite(n = +n) ? n : 0;
+ return function () {
+ if (--n < 1) {
+ return func.apply(this, arguments);
+ }
+ };
+ }
+
+ exports['default'] = after;
+});
+define('lodash/function/ary', ['exports', 'lodash/internal/createWrapper', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalCreateWrapper, _lodashInternalIsIterateeCall) {
+ 'use strict';
+
+ /** Used to compose bitmasks for wrapper metadata. */
+ var ARY_FLAG = 128;
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeMax = Math.max;
+
+ /**
+ * Creates a function that accepts up to `n` arguments ignoring any
+ * additional arguments.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to cap arguments for.
+ * @param {number} [n=func.length] The arity cap.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * _.map(['6', '8', '10'], _.ary(parseInt, 1));
+ * // => [6, 8, 10]
+ */
+ function ary(func, n, guard) {
+ if (guard && (0, _lodashInternalIsIterateeCall['default'])(func, n, guard)) {
+ n = undefined;
+ }
+ n = func && n == null ? func.length : nativeMax(+n || 0, 0);
+ return (0, _lodashInternalCreateWrapper['default'])(func, ARY_FLAG, undefined, undefined, undefined, undefined, n);
+ }
+
+ exports['default'] = ary;
+});
+define('lodash/function/backflow', ['exports', 'lodash/function/flowRight'], function (exports, _lodashFunctionFlowRight) {
+ 'use strict';
+
+ exports['default'] = _lodashFunctionFlowRight['default'];
+});
+define('lodash/function/before', ['exports'], function (exports) {
+ /** Used as the `TypeError` message for "Functions" methods. */
+ 'use strict';
+
+ var FUNC_ERROR_TEXT = 'Expected a function';
+
+ /**
+ * Creates a function that invokes `func`, with the `this` binding and arguments
+ * of the created function, while it's called less than `n` times. Subsequent
+ * calls to the created function return the result of the last `func` invocation.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {number} n The number of calls at which `func` is no longer invoked.
+ * @param {Function} func The function to restrict.
+ * @returns {Function} Returns the new restricted function.
+ * @example
+ *
+ * jQuery('#add').on('click', _.before(5, addContactToList));
+ * // => allows adding up to 4 contacts to the list
+ */
+ function before(n, func) {
+ var result;
+ if (typeof func != 'function') {
+ if (typeof n == 'function') {
+ var temp = n;
+ n = func;
+ func = temp;
+ } else {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ }
+ return function () {
+ if (--n > 0) {
+ result = func.apply(this, arguments);
+ }
+ if (n <= 1) {
+ func = undefined;
+ }
+ return result;
+ };
+ }
+
+ exports['default'] = before;
+});
+define('lodash/function/bind', ['exports', 'lodash/internal/createWrapper', 'lodash/internal/replaceHolders', 'lodash/function/restParam'], function (exports, _lodashInternalCreateWrapper, _lodashInternalReplaceHolders, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /** Used to compose bitmasks for wrapper metadata. */
+ var BIND_FLAG = 1,
+ PARTIAL_FLAG = 32;
+
+ /**
+ * Creates a function that invokes `func` with the `this` binding of `thisArg`
+ * and prepends any additional `_.bind` arguments to those provided to the
+ * bound function.
+ *
+ * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
+ * may be used as a placeholder for partially applied arguments.
+ *
+ * **Note:** Unlike native `Function#bind` this method does not set the "length"
+ * property of bound functions.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to bind.
+ * @param {*} thisArg The `this` binding of `func`.
+ * @param {...*} [partials] The arguments to be partially applied.
+ * @returns {Function} Returns the new bound function.
+ * @example
+ *
+ * var greet = function(greeting, punctuation) {
+ * return greeting + ' ' + this.user + punctuation;
+ * };
+ *
+ * var object = { 'user': 'fred' };
+ *
+ * var bound = _.bind(greet, object, 'hi');
+ * bound('!');
+ * // => 'hi fred!'
+ *
+ * // using placeholders
+ * var bound = _.bind(greet, object, _, '!');
+ * bound('hi');
+ * // => 'hi fred!'
+ */
+ var bind = (0, _lodashFunctionRestParam['default'])(function (func, thisArg, partials) {
+ var bitmask = BIND_FLAG;
+ if (partials.length) {
+ var holders = (0, _lodashInternalReplaceHolders['default'])(partials, bind.placeholder);
+ bitmask |= PARTIAL_FLAG;
+ }
+ return (0, _lodashInternalCreateWrapper['default'])(func, bitmask, thisArg, partials, holders);
+ });
+
+ // Assign default placeholders.
+ bind.placeholder = {};
+
+ exports['default'] = bind;
+});
+define('lodash/function/bindAll', ['exports', 'lodash/internal/baseFlatten', 'lodash/internal/createWrapper', 'lodash/object/functions', 'lodash/function/restParam'], function (exports, _lodashInternalBaseFlatten, _lodashInternalCreateWrapper, _lodashObjectFunctions, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /** Used to compose bitmasks for wrapper metadata. */
+ var BIND_FLAG = 1;
+
+ /**
+ * Binds methods of an object to the object itself, overwriting the existing
+ * method. Method names may be specified as individual arguments or as arrays
+ * of method names. If no method names are provided all enumerable function
+ * properties, own and inherited, of `object` are bound.
+ *
+ * **Note:** This method does not set the "length" property of bound functions.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Object} object The object to bind and assign the bound methods to.
+ * @param {...(string|string[])} [methodNames] The object method names to bind,
+ * specified as individual method names or arrays of method names.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var view = {
+ * 'label': 'docs',
+ * 'onClick': function() {
+ * console.log('clicked ' + this.label);
+ * }
+ * };
+ *
+ * _.bindAll(view);
+ * jQuery('#docs').on('click', view.onClick);
+ * // => logs 'clicked docs' when the element is clicked
+ */
+ var bindAll = (0, _lodashFunctionRestParam['default'])(function (object, methodNames) {
+ methodNames = methodNames.length ? (0, _lodashInternalBaseFlatten['default'])(methodNames) : (0, _lodashObjectFunctions['default'])(object);
+
+ var index = -1,
+ length = methodNames.length;
+
+ while (++index < length) {
+ var key = methodNames[index];
+ object[key] = (0, _lodashInternalCreateWrapper['default'])(object[key], BIND_FLAG, object);
+ }
+ return object;
+ });
+
+ exports['default'] = bindAll;
+});
+define('lodash/function/bindKey', ['exports', 'lodash/internal/createWrapper', 'lodash/internal/replaceHolders', 'lodash/function/restParam'], function (exports, _lodashInternalCreateWrapper, _lodashInternalReplaceHolders, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /** Used to compose bitmasks for wrapper metadata. */
+ var BIND_FLAG = 1,
+ BIND_KEY_FLAG = 2,
+ PARTIAL_FLAG = 32;
+
+ /**
+ * Creates a function that invokes the method at `object[key]` and prepends
+ * any additional `_.bindKey` arguments to those provided to the bound function.
+ *
+ * This method differs from `_.bind` by allowing bound functions to reference
+ * methods that may be redefined or don't yet exist.
+ * See [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
+ * for more details.
+ *
+ * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
+ * builds, may be used as a placeholder for partially applied arguments.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Object} object The object the method belongs to.
+ * @param {string} key The key of the method.
+ * @param {...*} [partials] The arguments to be partially applied.
+ * @returns {Function} Returns the new bound function.
+ * @example
+ *
+ * var object = {
+ * 'user': 'fred',
+ * 'greet': function(greeting, punctuation) {
+ * return greeting + ' ' + this.user + punctuation;
+ * }
+ * };
+ *
+ * var bound = _.bindKey(object, 'greet', 'hi');
+ * bound('!');
+ * // => 'hi fred!'
+ *
+ * object.greet = function(greeting, punctuation) {
+ * return greeting + 'ya ' + this.user + punctuation;
+ * };
+ *
+ * bound('!');
+ * // => 'hiya fred!'
+ *
+ * // using placeholders
+ * var bound = _.bindKey(object, 'greet', _, '!');
+ * bound('hi');
+ * // => 'hiya fred!'
+ */
+ var bindKey = (0, _lodashFunctionRestParam['default'])(function (object, key, partials) {
+ var bitmask = BIND_FLAG | BIND_KEY_FLAG;
+ if (partials.length) {
+ var holders = (0, _lodashInternalReplaceHolders['default'])(partials, bindKey.placeholder);
+ bitmask |= PARTIAL_FLAG;
+ }
+ return (0, _lodashInternalCreateWrapper['default'])(key, bitmask, object, partials, holders);
+ });
+
+ // Assign default placeholders.
+ bindKey.placeholder = {};
+
+ exports['default'] = bindKey;
+});
+define('lodash/function/compose', ['exports', 'lodash/function/flowRight'], function (exports, _lodashFunctionFlowRight) {
+ 'use strict';
+
+ exports['default'] = _lodashFunctionFlowRight['default'];
+});
+define('lodash/function/curry', ['exports', 'lodash/internal/createCurry'], function (exports, _lodashInternalCreateCurry) {
+ 'use strict';
+
+ /** Used to compose bitmasks for wrapper metadata. */
+ var CURRY_FLAG = 8;
+
+ /**
+ * Creates a function that accepts one or more arguments of `func` that when
+ * called either invokes `func` returning its result, if all `func` arguments
+ * have been provided, or returns a function that accepts one or more of the
+ * remaining `func` arguments, and so on. The arity of `func` may be specified
+ * if `func.length` is not sufficient.
+ *
+ * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
+ * may be used as a placeholder for provided arguments.
+ *
+ * **Note:** This method does not set the "length" property of curried functions.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to curry.
+ * @param {number} [arity=func.length] The arity of `func`.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Function} Returns the new curried function.
+ * @example
+ *
+ * var abc = function(a, b, c) {
+ * return [a, b, c];
+ * };
+ *
+ * var curried = _.curry(abc);
+ *
+ * curried(1)(2)(3);
+ * // => [1, 2, 3]
+ *
+ * curried(1, 2)(3);
+ * // => [1, 2, 3]
+ *
+ * curried(1, 2, 3);
+ * // => [1, 2, 3]
+ *
+ * // using placeholders
+ * curried(1)(_, 3)(2);
+ * // => [1, 2, 3]
+ */
+ var curry = (0, _lodashInternalCreateCurry['default'])(CURRY_FLAG);
+
+ // Assign default placeholders.
+ curry.placeholder = {};
+
+ exports['default'] = curry;
+});
+define('lodash/function/curryRight', ['exports', 'lodash/internal/createCurry'], function (exports, _lodashInternalCreateCurry) {
+ 'use strict';
+
+ /** Used to compose bitmasks for wrapper metadata. */
+ var CURRY_RIGHT_FLAG = 16;
+
+ /**
+ * This method is like `_.curry` except that arguments are applied to `func`
+ * in the manner of `_.partialRight` instead of `_.partial`.
+ *
+ * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
+ * builds, may be used as a placeholder for provided arguments.
+ *
+ * **Note:** This method does not set the "length" property of curried functions.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to curry.
+ * @param {number} [arity=func.length] The arity of `func`.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Function} Returns the new curried function.
+ * @example
+ *
+ * var abc = function(a, b, c) {
+ * return [a, b, c];
+ * };
+ *
+ * var curried = _.curryRight(abc);
+ *
+ * curried(3)(2)(1);
+ * // => [1, 2, 3]
+ *
+ * curried(2, 3)(1);
+ * // => [1, 2, 3]
+ *
+ * curried(1, 2, 3);
+ * // => [1, 2, 3]
+ *
+ * // using placeholders
+ * curried(3)(1, _)(2);
+ * // => [1, 2, 3]
+ */
+ var curryRight = (0, _lodashInternalCreateCurry['default'])(CURRY_RIGHT_FLAG);
+
+ // Assign default placeholders.
+ curryRight.placeholder = {};
+
+ exports['default'] = curryRight;
+});
+define('lodash/function/debounce', ['exports', 'lodash/lang/isObject', 'lodash/date/now'], function (exports, _lodashLangIsObject, _lodashDateNow) {
+ 'use strict';
+
+ /** Used as the `TypeError` message for "Functions" methods. */
+ var FUNC_ERROR_TEXT = 'Expected a function';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeMax = Math.max;
+
+ /**
+ * Creates a debounced function that delays invoking `func` until after `wait`
+ * milliseconds have elapsed since the last time the debounced function was
+ * invoked. The debounced function comes with a `cancel` method to cancel
+ * delayed invocations. Provide an options object to indicate that `func`
+ * should be invoked on the leading and/or trailing edge of the `wait` timeout.
+ * Subsequent calls to the debounced function return the result of the last
+ * `func` invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
+ * on the trailing edge of the timeout only if the the debounced function is
+ * invoked more than once during the `wait` timeout.
+ *
+ * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
+ * for details over the differences between `_.debounce` and `_.throttle`.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to debounce.
+ * @param {number} [wait=0] The number of milliseconds to delay.
+ * @param {Object} [options] The options object.
+ * @param {boolean} [options.leading=false] Specify invoking on the leading
+ * edge of the timeout.
+ * @param {number} [options.maxWait] The maximum time `func` is allowed to be
+ * delayed before it's invoked.
+ * @param {boolean} [options.trailing=true] Specify invoking on the trailing
+ * edge of the timeout.
+ * @returns {Function} Returns the new debounced function.
+ * @example
+ *
+ * // avoid costly calculations while the window size is in flux
+ * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
+ *
+ * // invoke `sendMail` when the click event is fired, debouncing subsequent calls
+ * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {
+ * 'leading': true,
+ * 'trailing': false
+ * }));
+ *
+ * // ensure `batchLog` is invoked once after 1 second of debounced calls
+ * var source = new EventSource('/stream');
+ * jQuery(source).on('message', _.debounce(batchLog, 250, {
+ * 'maxWait': 1000
+ * }));
+ *
+ * // cancel a debounced call
+ * var todoChanges = _.debounce(batchLog, 1000);
+ * Object.observe(models.todo, todoChanges);
+ *
+ * Object.observe(models, function(changes) {
+ * if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) {
+ * todoChanges.cancel();
+ * }
+ * }, ['delete']);
+ *
+ * // ...at some point `models.todo` is changed
+ * models.todo.completed = true;
+ *
+ * // ...before 1 second has passed `models.todo` is deleted
+ * // which cancels the debounced `todoChanges` call
+ * delete models.todo;
+ */
+ function debounce(func, wait, options) {
+ var args,
+ maxTimeoutId,
+ result,
+ stamp,
+ thisArg,
+ timeoutId,
+ trailingCall,
+ lastCalled = 0,
+ maxWait = false,
+ trailing = true;
+
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ wait = wait < 0 ? 0 : +wait || 0;
+ if (options === true) {
+ var leading = true;
+ trailing = false;
+ } else if ((0, _lodashLangIsObject['default'])(options)) {
+ leading = !!options.leading;
+ maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);
+ trailing = 'trailing' in options ? !!options.trailing : trailing;
+ }
+
+ function cancel() {
+ if (timeoutId) {
+ clearTimeout(timeoutId);
+ }
+ if (maxTimeoutId) {
+ clearTimeout(maxTimeoutId);
+ }
+ lastCalled = 0;
+ maxTimeoutId = timeoutId = trailingCall = undefined;
+ }
+
+ function complete(isCalled, id) {
+ if (id) {
+ clearTimeout(id);
+ }
+ maxTimeoutId = timeoutId = trailingCall = undefined;
+ if (isCalled) {
+ lastCalled = (0, _lodashDateNow['default'])();
+ result = func.apply(thisArg, args);
+ if (!timeoutId && !maxTimeoutId) {
+ args = thisArg = undefined;
+ }
+ }
+ }
+
+ function delayed() {
+ var remaining = wait - ((0, _lodashDateNow['default'])() - stamp);
+ if (remaining <= 0 || remaining > wait) {
+ complete(trailingCall, maxTimeoutId);
+ } else {
+ timeoutId = setTimeout(delayed, remaining);
+ }
+ }
+
+ function maxDelayed() {
+ complete(trailing, timeoutId);
+ }
+
+ function debounced() {
+ args = arguments;
+ stamp = (0, _lodashDateNow['default'])();
+ thisArg = this;
+ trailingCall = trailing && (timeoutId || !leading);
+
+ if (maxWait === false) {
+ var leadingCall = leading && !timeoutId;
+ } else {
+ if (!maxTimeoutId && !leading) {
+ lastCalled = stamp;
+ }
+ var remaining = maxWait - (stamp - lastCalled),
+ isCalled = remaining <= 0 || remaining > maxWait;
+
+ if (isCalled) {
+ if (maxTimeoutId) {
+ maxTimeoutId = clearTimeout(maxTimeoutId);
+ }
+ lastCalled = stamp;
+ result = func.apply(thisArg, args);
+ } else if (!maxTimeoutId) {
+ maxTimeoutId = setTimeout(maxDelayed, remaining);
+ }
+ }
+ if (isCalled && timeoutId) {
+ timeoutId = clearTimeout(timeoutId);
+ } else if (!timeoutId && wait !== maxWait) {
+ timeoutId = setTimeout(delayed, wait);
+ }
+ if (leadingCall) {
+ isCalled = true;
+ result = func.apply(thisArg, args);
+ }
+ if (isCalled && !timeoutId && !maxTimeoutId) {
+ args = thisArg = undefined;
+ }
+ return result;
+ }
+ debounced.cancel = cancel;
+ return debounced;
+ }
+
+ exports['default'] = debounce;
+});
+define('lodash/function/defer', ['exports', 'lodash/internal/baseDelay', 'lodash/function/restParam'], function (exports, _lodashInternalBaseDelay, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /**
+ * Defers invoking the `func` until the current call stack has cleared. Any
+ * additional arguments are provided to `func` when it's invoked.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to defer.
+ * @param {...*} [args] The arguments to invoke the function with.
+ * @returns {number} Returns the timer id.
+ * @example
+ *
+ * _.defer(function(text) {
+ * console.log(text);
+ * }, 'deferred');
+ * // logs 'deferred' after one or more milliseconds
+ */
+ var defer = (0, _lodashFunctionRestParam['default'])(function (func, args) {
+ return (0, _lodashInternalBaseDelay['default'])(func, 1, args);
+ });
+
+ exports['default'] = defer;
+});
+define('lodash/function/delay', ['exports', 'lodash/internal/baseDelay', 'lodash/function/restParam'], function (exports, _lodashInternalBaseDelay, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /**
+ * Invokes `func` after `wait` milliseconds. Any additional arguments are
+ * provided to `func` when it's invoked.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to delay.
+ * @param {number} wait The number of milliseconds to delay invocation.
+ * @param {...*} [args] The arguments to invoke the function with.
+ * @returns {number} Returns the timer id.
+ * @example
+ *
+ * _.delay(function(text) {
+ * console.log(text);
+ * }, 1000, 'later');
+ * // => logs 'later' after one second
+ */
+ var delay = (0, _lodashFunctionRestParam['default'])(function (func, wait, args) {
+ return (0, _lodashInternalBaseDelay['default'])(func, wait, args);
+ });
+
+ exports['default'] = delay;
+});
+define('lodash/function/flow', ['exports', 'lodash/internal/createFlow'], function (exports, _lodashInternalCreateFlow) {
+ 'use strict';
+
+ /**
+ * Creates a function that returns the result of invoking the provided
+ * functions with the `this` binding of the created function, where each
+ * successive invocation is supplied the return value of the previous.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {...Function} [funcs] Functions to invoke.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * function square(n) {
+ * return n * n;
+ * }
+ *
+ * var addSquare = _.flow(_.add, square);
+ * addSquare(1, 2);
+ * // => 9
+ */
+ var flow = (0, _lodashInternalCreateFlow['default'])();
+
+ exports['default'] = flow;
+});
+define('lodash/function/flowRight', ['exports', 'lodash/internal/createFlow'], function (exports, _lodashInternalCreateFlow) {
+ 'use strict';
+
+ /**
+ * This method is like `_.flow` except that it creates a function that
+ * invokes the provided functions from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @alias backflow, compose
+ * @category Function
+ * @param {...Function} [funcs] Functions to invoke.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * function square(n) {
+ * return n * n;
+ * }
+ *
+ * var addSquare = _.flowRight(square, _.add);
+ * addSquare(1, 2);
+ * // => 9
+ */
+ var flowRight = (0, _lodashInternalCreateFlow['default'])(true);
+
+ exports['default'] = flowRight;
+});
+define('lodash/function/memoize', ['exports', 'lodash/internal/MapCache'], function (exports, _lodashInternalMapCache) {
+ 'use strict';
+
+ /** Used as the `TypeError` message for "Functions" methods. */
+ var FUNC_ERROR_TEXT = 'Expected a function';
+
+ /**
+ * Creates a function that memoizes the result of `func`. If `resolver` is
+ * provided it determines the cache key for storing the result based on the
+ * arguments provided to the memoized function. By default, the first argument
+ * provided to the memoized function is coerced to a string and used as the
+ * cache key. The `func` is invoked with the `this` binding of the memoized
+ * function.
+ *
+ * **Note:** The cache is exposed as the `cache` property on the memoized
+ * function. Its creation may be customized by replacing the `_.memoize.Cache`
+ * constructor with one whose instances implement the [`Map`](http://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-map-prototype-object)
+ * method interface of `get`, `has`, and `set`.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to have its output memoized.
+ * @param {Function} [resolver] The function to resolve the cache key.
+ * @returns {Function} Returns the new memoizing function.
+ * @example
+ *
+ * var upperCase = _.memoize(function(string) {
+ * return string.toUpperCase();
+ * });
+ *
+ * upperCase('fred');
+ * // => 'FRED'
+ *
+ * // modifying the result cache
+ * upperCase.cache.set('fred', 'BARNEY');
+ * upperCase('fred');
+ * // => 'BARNEY'
+ *
+ * // replacing `_.memoize.Cache`
+ * var object = { 'user': 'fred' };
+ * var other = { 'user': 'barney' };
+ * var identity = _.memoize(_.identity);
+ *
+ * identity(object);
+ * // => { 'user': 'fred' }
+ * identity(other);
+ * // => { 'user': 'fred' }
+ *
+ * _.memoize.Cache = WeakMap;
+ * var identity = _.memoize(_.identity);
+ *
+ * identity(object);
+ * // => { 'user': 'fred' }
+ * identity(other);
+ * // => { 'user': 'barney' }
+ */
+ function memoize(func, resolver) {
+ if (typeof func != 'function' || resolver && typeof resolver != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ var memoized = function memoized() {
+ var args = arguments,
+ key = resolver ? resolver.apply(this, args) : args[0],
+ cache = memoized.cache;
+
+ if (cache.has(key)) {
+ return cache.get(key);
+ }
+ var result = func.apply(this, args);
+ memoized.cache = cache.set(key, result);
+ return result;
+ };
+ memoized.cache = new memoize.Cache();
+ return memoized;
+ }
+
+ // Assign cache to `_.memoize`.
+ memoize.Cache = _lodashInternalMapCache['default'];
+
+ exports['default'] = memoize;
+});
+define('lodash/function/modArgs', ['exports', 'lodash/internal/arrayEvery', 'lodash/internal/baseFlatten', 'lodash/internal/baseIsFunction', 'lodash/function/restParam'], function (exports, _lodashInternalArrayEvery, _lodashInternalBaseFlatten, _lodashInternalBaseIsFunction, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /** Used as the `TypeError` message for "Functions" methods. */
+ var FUNC_ERROR_TEXT = 'Expected a function';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeMin = Math.min;
+
+ /**
+ * Creates a function that runs each argument through a corresponding
+ * transform function.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to wrap.
+ * @param {...(Function|Function[])} [transforms] The functions to transform
+ * arguments, specified as individual functions or arrays of functions.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * function doubled(n) {
+ * return n * 2;
+ * }
+ *
+ * function square(n) {
+ * return n * n;
+ * }
+ *
+ * var modded = _.modArgs(function(x, y) {
+ * return [x, y];
+ * }, square, doubled);
+ *
+ * modded(1, 2);
+ * // => [1, 4]
+ *
+ * modded(5, 10);
+ * // => [25, 20]
+ */
+ var modArgs = (0, _lodashFunctionRestParam['default'])(function (func, transforms) {
+ transforms = (0, _lodashInternalBaseFlatten['default'])(transforms);
+ if (typeof func != 'function' || !(0, _lodashInternalArrayEvery['default'])(transforms, _lodashInternalBaseIsFunction['default'])) {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ var length = transforms.length;
+ return (0, _lodashFunctionRestParam['default'])(function (args) {
+ var index = nativeMin(args.length, length);
+ while (index--) {
+ args[index] = transforms[index](args[index]);
+ }
+ return func.apply(this, args);
+ });
+ });
+
+ exports['default'] = modArgs;
+});
+define('lodash/function/negate', ['exports'], function (exports) {
+ /** Used as the `TypeError` message for "Functions" methods. */
+ 'use strict';
+
+ var FUNC_ERROR_TEXT = 'Expected a function';
+
+ /**
+ * Creates a function that negates the result of the predicate `func`. The
+ * `func` predicate is invoked with the `this` binding and arguments of the
+ * created function.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} predicate The predicate to negate.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * function isEven(n) {
+ * return n % 2 == 0;
+ * }
+ *
+ * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
+ * // => [1, 3, 5]
+ */
+ function negate(predicate) {
+ if (typeof predicate != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ return function () {
+ return !predicate.apply(this, arguments);
+ };
+ }
+
+ exports['default'] = negate;
+});
+define('lodash/function/once', ['exports', 'lodash/function/before'], function (exports, _lodashFunctionBefore) {
+ 'use strict';
+
+ /**
+ * Creates a function that is restricted to invoking `func` once. Repeat calls
+ * to the function return the value of the first call. The `func` is invoked
+ * with the `this` binding and arguments of the created function.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to restrict.
+ * @returns {Function} Returns the new restricted function.
+ * @example
+ *
+ * var initialize = _.once(createApplication);
+ * initialize();
+ * initialize();
+ * // `initialize` invokes `createApplication` once
+ */
+ function once(func) {
+ return (0, _lodashFunctionBefore['default'])(2, func);
+ }
+
+ exports['default'] = once;
+});
+define('lodash/function/partial', ['exports', 'lodash/internal/createPartial'], function (exports, _lodashInternalCreatePartial) {
+ 'use strict';
+
+ /** Used to compose bitmasks for wrapper metadata. */
+ var PARTIAL_FLAG = 32;
+
+ /**
+ * Creates a function that invokes `func` with `partial` arguments prepended
+ * to those provided to the new function. This method is like `_.bind` except
+ * it does **not** alter the `this` binding.
+ *
+ * The `_.partial.placeholder` value, which defaults to `_` in monolithic
+ * builds, may be used as a placeholder for partially applied arguments.
+ *
+ * **Note:** This method does not set the "length" property of partially
+ * applied functions.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to partially apply arguments to.
+ * @param {...*} [partials] The arguments to be partially applied.
+ * @returns {Function} Returns the new partially applied function.
+ * @example
+ *
+ * var greet = function(greeting, name) {
+ * return greeting + ' ' + name;
+ * };
+ *
+ * var sayHelloTo = _.partial(greet, 'hello');
+ * sayHelloTo('fred');
+ * // => 'hello fred'
+ *
+ * // using placeholders
+ * var greetFred = _.partial(greet, _, 'fred');
+ * greetFred('hi');
+ * // => 'hi fred'
+ */
+ var partial = (0, _lodashInternalCreatePartial['default'])(PARTIAL_FLAG);
+
+ // Assign default placeholders.
+ partial.placeholder = {};
+
+ exports['default'] = partial;
+});
+define('lodash/function/partialRight', ['exports', 'lodash/internal/createPartial'], function (exports, _lodashInternalCreatePartial) {
+ 'use strict';
+
+ /** Used to compose bitmasks for wrapper metadata. */
+ var PARTIAL_RIGHT_FLAG = 64;
+
+ /**
+ * This method is like `_.partial` except that partially applied arguments
+ * are appended to those provided to the new function.
+ *
+ * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
+ * builds, may be used as a placeholder for partially applied arguments.
+ *
+ * **Note:** This method does not set the "length" property of partially
+ * applied functions.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to partially apply arguments to.
+ * @param {...*} [partials] The arguments to be partially applied.
+ * @returns {Function} Returns the new partially applied function.
+ * @example
+ *
+ * var greet = function(greeting, name) {
+ * return greeting + ' ' + name;
+ * };
+ *
+ * var greetFred = _.partialRight(greet, 'fred');
+ * greetFred('hi');
+ * // => 'hi fred'
+ *
+ * // using placeholders
+ * var sayHelloTo = _.partialRight(greet, 'hello', _);
+ * sayHelloTo('fred');
+ * // => 'hello fred'
+ */
+ var partialRight = (0, _lodashInternalCreatePartial['default'])(PARTIAL_RIGHT_FLAG);
+
+ // Assign default placeholders.
+ partialRight.placeholder = {};
+
+ exports['default'] = partialRight;
+});
+define('lodash/function/rearg', ['exports', 'lodash/internal/baseFlatten', 'lodash/internal/createWrapper', 'lodash/function/restParam'], function (exports, _lodashInternalBaseFlatten, _lodashInternalCreateWrapper, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /** Used to compose bitmasks for wrapper metadata. */
+ var REARG_FLAG = 256;
+
+ /**
+ * Creates a function that invokes `func` with arguments arranged according
+ * to the specified indexes where the argument value at the first index is
+ * provided as the first argument, the argument value at the second index is
+ * provided as the second argument, and so on.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to rearrange arguments for.
+ * @param {...(number|number[])} indexes The arranged argument indexes,
+ * specified as individual indexes or arrays of indexes.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var rearged = _.rearg(function(a, b, c) {
+ * return [a, b, c];
+ * }, 2, 0, 1);
+ *
+ * rearged('b', 'c', 'a')
+ * // => ['a', 'b', 'c']
+ *
+ * var map = _.rearg(_.map, [1, 0]);
+ * map(function(n) {
+ * return n * 3;
+ * }, [1, 2, 3]);
+ * // => [3, 6, 9]
+ */
+ var rearg = (0, _lodashFunctionRestParam['default'])(function (func, indexes) {
+ return (0, _lodashInternalCreateWrapper['default'])(func, REARG_FLAG, undefined, undefined, undefined, (0, _lodashInternalBaseFlatten['default'])(indexes));
+ });
+
+ exports['default'] = rearg;
+});
+define('lodash/function/restParam', ['exports'], function (exports) {
+ /** Used as the `TypeError` message for "Functions" methods. */
+ 'use strict';
+
+ var FUNC_ERROR_TEXT = 'Expected a function';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeMax = Math.max;
+
+ /**
+ * Creates a function that invokes `func` with the `this` binding of the
+ * created function and arguments from `start` and beyond provided as an array.
+ *
+ * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters).
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var say = _.restParam(function(what, names) {
+ * return what + ' ' + _.initial(names).join(', ') +
+ * (_.size(names) > 1 ? ', & ' : '') + _.last(names);
+ * });
+ *
+ * say('hello', 'fred', 'barney', 'pebbles');
+ * // => 'hello fred, barney, & pebbles'
+ */
+ function restParam(func, start) {
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ start = nativeMax(start === undefined ? func.length - 1 : +start || 0, 0);
+ return function () {
+ var args = arguments,
+ index = -1,
+ length = nativeMax(args.length - start, 0),
+ rest = Array(length);
+
+ while (++index < length) {
+ rest[index] = args[start + index];
+ }
+ switch (start) {
+ case 0:
+ return func.call(this, rest);
+ case 1:
+ return func.call(this, args[0], rest);
+ case 2:
+ return func.call(this, args[0], args[1], rest);
+ }
+ var otherArgs = Array(start + 1);
+ index = -1;
+ while (++index < start) {
+ otherArgs[index] = args[index];
+ }
+ otherArgs[start] = rest;
+ return func.apply(this, otherArgs);
+ };
+ }
+
+ exports['default'] = restParam;
+});
+define('lodash/function/spread', ['exports'], function (exports) {
+ /** Used as the `TypeError` message for "Functions" methods. */
+ 'use strict';
+
+ var FUNC_ERROR_TEXT = 'Expected a function';
+
+ /**
+ * Creates a function that invokes `func` with the `this` binding of the created
+ * function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3).
+ *
+ * **Note:** This method is based on the [spread operator](https://developer.mozilla.org/Web/JavaScript/Reference/Operators/Spread_operator).
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to spread arguments over.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var say = _.spread(function(who, what) {
+ * return who + ' says ' + what;
+ * });
+ *
+ * say(['fred', 'hello']);
+ * // => 'fred says hello'
+ *
+ * // with a Promise
+ * var numbers = Promise.all([
+ * Promise.resolve(40),
+ * Promise.resolve(36)
+ * ]);
+ *
+ * numbers.then(_.spread(function(x, y) {
+ * return x + y;
+ * }));
+ * // => a Promise of 76
+ */
+ function spread(func) {
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ return function (array) {
+ return func.apply(this, array);
+ };
+ }
+
+ exports['default'] = spread;
+});
+define('lodash/function/throttle', ['exports', 'lodash/function/debounce', 'lodash/lang/isObject'], function (exports, _lodashFunctionDebounce, _lodashLangIsObject) {
+ 'use strict';
+
+ /** Used as the `TypeError` message for "Functions" methods. */
+ var FUNC_ERROR_TEXT = 'Expected a function';
+
+ /**
+ * Creates a throttled function that only invokes `func` at most once per
+ * every `wait` milliseconds. The throttled function comes with a `cancel`
+ * method to cancel delayed invocations. Provide an options object to indicate
+ * that `func` should be invoked on the leading and/or trailing edge of the
+ * `wait` timeout. Subsequent calls to the throttled function return the
+ * result of the last `func` call.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
+ * on the trailing edge of the timeout only if the the throttled function is
+ * invoked more than once during the `wait` timeout.
+ *
+ * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
+ * for details over the differences between `_.throttle` and `_.debounce`.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to throttle.
+ * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
+ * @param {Object} [options] The options object.
+ * @param {boolean} [options.leading=true] Specify invoking on the leading
+ * edge of the timeout.
+ * @param {boolean} [options.trailing=true] Specify invoking on the trailing
+ * edge of the timeout.
+ * @returns {Function} Returns the new throttled function.
+ * @example
+ *
+ * // avoid excessively updating the position while scrolling
+ * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
+ *
+ * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes
+ * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {
+ * 'trailing': false
+ * }));
+ *
+ * // cancel a trailing throttled call
+ * jQuery(window).on('popstate', throttled.cancel);
+ */
+ function throttle(func, wait, options) {
+ var leading = true,
+ trailing = true;
+
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ if (options === false) {
+ leading = false;
+ } else if ((0, _lodashLangIsObject['default'])(options)) {
+ leading = 'leading' in options ? !!options.leading : leading;
+ trailing = 'trailing' in options ? !!options.trailing : trailing;
+ }
+ return (0, _lodashFunctionDebounce['default'])(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing });
+ }
+
+ exports['default'] = throttle;
+});
+define('lodash/function/wrap', ['exports', 'lodash/internal/createWrapper', 'lodash/utility/identity'], function (exports, _lodashInternalCreateWrapper, _lodashUtilityIdentity) {
+ 'use strict';
+
+ /** Used to compose bitmasks for wrapper metadata. */
+ var PARTIAL_FLAG = 32;
+
+ /**
+ * Creates a function that provides `value` to the wrapper function as its
+ * first argument. Any additional arguments provided to the function are
+ * appended to those provided to the wrapper function. The wrapper is invoked
+ * with the `this` binding of the created function.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {*} value The value to wrap.
+ * @param {Function} wrapper The wrapper function.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var p = _.wrap(_.escape, function(func, text) {
+ * return '' + func(text) + '
';
+ * });
+ *
+ * p('fred, barney, & pebbles');
+ * // => 'fred, barney, & pebbles
'
+ */
+ function wrap(value, wrapper) {
+ wrapper = wrapper == null ? _lodashUtilityIdentity['default'] : wrapper;
+ return (0, _lodashInternalCreateWrapper['default'])(wrapper, PARTIAL_FLAG, undefined, [value], []);
+ }
+
+ exports['default'] = wrap;
+});
+define('lodash/index', ['exports', 'lodash/lodash'], function (exports, _lodashLodash) {
+ 'use strict';
+
+ exports['default'] = _lodashLodash['default'];
+});
+define('lodash/internal/LazyWrapper', ['exports', 'lodash/internal/baseCreate', 'lodash/internal/baseLodash'], function (exports, _lodashInternalBaseCreate, _lodashInternalBaseLodash) {
+ 'use strict';
+
+ /** Used as references for `-Infinity` and `Infinity`. */
+ var POSITIVE_INFINITY = Number.POSITIVE_INFINITY;
+
+ /**
+ * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
+ *
+ * @private
+ * @param {*} value The value to wrap.
+ */
+ function LazyWrapper(value) {
+ this.__wrapped__ = value;
+ this.__actions__ = [];
+ this.__dir__ = 1;
+ this.__filtered__ = false;
+ this.__iteratees__ = [];
+ this.__takeCount__ = POSITIVE_INFINITY;
+ this.__views__ = [];
+ }
+
+ LazyWrapper.prototype = (0, _lodashInternalBaseCreate['default'])(_lodashInternalBaseLodash['default'].prototype);
+ LazyWrapper.prototype.constructor = LazyWrapper;
+
+ exports['default'] = LazyWrapper;
+});
+define('lodash/internal/LodashWrapper', ['exports', 'lodash/internal/baseCreate', 'lodash/internal/baseLodash'], function (exports, _lodashInternalBaseCreate, _lodashInternalBaseLodash) {
+ 'use strict';
+
+ /**
+ * The base constructor for creating `lodash` wrapper objects.
+ *
+ * @private
+ * @param {*} value The value to wrap.
+ * @param {boolean} [chainAll] Enable chaining for all wrapper methods.
+ * @param {Array} [actions=[]] Actions to peform to resolve the unwrapped value.
+ */
+ function LodashWrapper(value, chainAll, actions) {
+ this.__wrapped__ = value;
+ this.__actions__ = actions || [];
+ this.__chain__ = !!chainAll;
+ }
+
+ LodashWrapper.prototype = (0, _lodashInternalBaseCreate['default'])(_lodashInternalBaseLodash['default'].prototype);
+ LodashWrapper.prototype.constructor = LodashWrapper;
+
+ exports['default'] = LodashWrapper;
+});
+define('lodash/internal/MapCache', ['exports', 'lodash/internal/mapDelete', 'lodash/internal/mapGet', 'lodash/internal/mapHas', 'lodash/internal/mapSet'], function (exports, _lodashInternalMapDelete, _lodashInternalMapGet, _lodashInternalMapHas, _lodashInternalMapSet) {
+ 'use strict';
+
+ /**
+ * Creates a cache object to store key/value pairs.
+ *
+ * @private
+ * @static
+ * @name Cache
+ * @memberOf _.memoize
+ */
+ function MapCache() {
+ this.__data__ = {};
+ }
+
+ // Add functions to the `Map` cache.
+ MapCache.prototype['delete'] = _lodashInternalMapDelete['default'];
+ MapCache.prototype.get = _lodashInternalMapGet['default'];
+ MapCache.prototype.has = _lodashInternalMapHas['default'];
+ MapCache.prototype.set = _lodashInternalMapSet['default'];
+
+ exports['default'] = MapCache;
+});
+define('lodash/internal/SetCache', ['exports', 'lodash/internal/cachePush', 'lodash/internal/getNative', 'lodash/internal/root'], function (exports, _lodashInternalCachePush, _lodashInternalGetNative, _lodashInternalRoot) {
+ 'use strict';
+
+ /** Native method references. */
+ var Set = (0, _lodashInternalGetNative['default'])(_lodashInternalRoot['default'], 'Set');
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeCreate = (0, _lodashInternalGetNative['default'])(Object, 'create');
+
+ /**
+ *
+ * Creates a cache object to store unique values.
+ *
+ * @private
+ * @param {Array} [values] The values to cache.
+ */
+ function SetCache(values) {
+ var length = values ? values.length : 0;
+
+ this.data = { 'hash': nativeCreate(null), 'set': new Set() };
+ while (length--) {
+ this.push(values[length]);
+ }
+ }
+
+ // Add functions to the `Set` cache.
+ SetCache.prototype.push = _lodashInternalCachePush['default'];
+
+ exports['default'] = SetCache;
+});
+define("lodash/internal/arrayConcat", ["exports"], function (exports) {
+ /**
+ * Creates a new array joining `array` with `other`.
+ *
+ * @private
+ * @param {Array} array The array to join.
+ * @param {Array} other The other array to join.
+ * @returns {Array} Returns the new concatenated array.
+ */
+ "use strict";
+
+ function arrayConcat(array, other) {
+ var index = -1,
+ length = array.length,
+ othIndex = -1,
+ othLength = other.length,
+ result = Array(length + othLength);
+
+ while (++index < length) {
+ result[index] = array[index];
+ }
+ while (++othIndex < othLength) {
+ result[index++] = other[othIndex];
+ }
+ return result;
+ }
+
+ exports["default"] = arrayConcat;
+});
+define("lodash/internal/arrayCopy", ["exports"], function (exports) {
+ /**
+ * Copies the values of `source` to `array`.
+ *
+ * @private
+ * @param {Array} source The array to copy values from.
+ * @param {Array} [array=[]] The array to copy values to.
+ * @returns {Array} Returns `array`.
+ */
+ "use strict";
+
+ function arrayCopy(source, array) {
+ var index = -1,
+ length = source.length;
+
+ array || (array = Array(length));
+ while (++index < length) {
+ array[index] = source[index];
+ }
+ return array;
+ }
+
+ exports["default"] = arrayCopy;
+});
+define("lodash/internal/arrayEach", ["exports"], function (exports) {
+ /**
+ * A specialized version of `_.forEach` for arrays without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns `array`.
+ */
+ "use strict";
+
+ function arrayEach(array, iteratee) {
+ var index = -1,
+ length = array.length;
+
+ while (++index < length) {
+ if (iteratee(array[index], index, array) === false) {
+ break;
+ }
+ }
+ return array;
+ }
+
+ exports["default"] = arrayEach;
+});
+define("lodash/internal/arrayEachRight", ["exports"], function (exports) {
+ /**
+ * A specialized version of `_.forEachRight` for arrays without support for
+ * callback shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns `array`.
+ */
+ "use strict";
+
+ function arrayEachRight(array, iteratee) {
+ var length = array.length;
+
+ while (length--) {
+ if (iteratee(array[length], length, array) === false) {
+ break;
+ }
+ }
+ return array;
+ }
+
+ exports["default"] = arrayEachRight;
+});
+define("lodash/internal/arrayEvery", ["exports"], function (exports) {
+ /**
+ * A specialized version of `_.every` for arrays without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {boolean} Returns `true` if all elements pass the predicate check,
+ * else `false`.
+ */
+ "use strict";
+
+ function arrayEvery(array, predicate) {
+ var index = -1,
+ length = array.length;
+
+ while (++index < length) {
+ if (!predicate(array[index], index, array)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ exports["default"] = arrayEvery;
+});
+define("lodash/internal/arrayExtremum", ["exports"], function (exports) {
+ /**
+ * A specialized version of `baseExtremum` for arrays which invokes `iteratee`
+ * with one argument: (value).
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {Function} comparator The function used to compare values.
+ * @param {*} exValue The initial extremum value.
+ * @returns {*} Returns the extremum value.
+ */
+ "use strict";
+
+ function arrayExtremum(array, iteratee, comparator, exValue) {
+ var index = -1,
+ length = array.length,
+ computed = exValue,
+ result = computed;
+
+ while (++index < length) {
+ var value = array[index],
+ current = +iteratee(value);
+
+ if (comparator(current, computed)) {
+ computed = current;
+ result = value;
+ }
+ }
+ return result;
+ }
+
+ exports["default"] = arrayExtremum;
+});
+define("lodash/internal/arrayFilter", ["exports"], function (exports) {
+ /**
+ * A specialized version of `_.filter` for arrays without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {Array} Returns the new filtered array.
+ */
+ "use strict";
+
+ function arrayFilter(array, predicate) {
+ var index = -1,
+ length = array.length,
+ resIndex = -1,
+ result = [];
+
+ while (++index < length) {
+ var value = array[index];
+ if (predicate(value, index, array)) {
+ result[++resIndex] = value;
+ }
+ }
+ return result;
+ }
+
+ exports["default"] = arrayFilter;
+});
+define("lodash/internal/arrayMap", ["exports"], function (exports) {
+ /**
+ * A specialized version of `_.map` for arrays without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the new mapped array.
+ */
+ "use strict";
+
+ function arrayMap(array, iteratee) {
+ var index = -1,
+ length = array.length,
+ result = Array(length);
+
+ while (++index < length) {
+ result[index] = iteratee(array[index], index, array);
+ }
+ return result;
+ }
+
+ exports["default"] = arrayMap;
+});
+define("lodash/internal/arrayPush", ["exports"], function (exports) {
+ /**
+ * Appends the elements of `values` to `array`.
+ *
+ * @private
+ * @param {Array} array The array to modify.
+ * @param {Array} values The values to append.
+ * @returns {Array} Returns `array`.
+ */
+ "use strict";
+
+ function arrayPush(array, values) {
+ var index = -1,
+ length = values.length,
+ offset = array.length;
+
+ while (++index < length) {
+ array[offset + index] = values[index];
+ }
+ return array;
+ }
+
+ exports["default"] = arrayPush;
+});
+define("lodash/internal/arrayReduce", ["exports"], function (exports) {
+ /**
+ * A specialized version of `_.reduce` for arrays without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @param {boolean} [initFromArray] Specify using the first element of `array`
+ * as the initial value.
+ * @returns {*} Returns the accumulated value.
+ */
+ "use strict";
+
+ function arrayReduce(array, iteratee, accumulator, initFromArray) {
+ var index = -1,
+ length = array.length;
+
+ if (initFromArray && length) {
+ accumulator = array[++index];
+ }
+ while (++index < length) {
+ accumulator = iteratee(accumulator, array[index], index, array);
+ }
+ return accumulator;
+ }
+
+ exports["default"] = arrayReduce;
+});
+define("lodash/internal/arrayReduceRight", ["exports"], function (exports) {
+ /**
+ * A specialized version of `_.reduceRight` for arrays without support for
+ * callback shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @param {boolean} [initFromArray] Specify using the last element of `array`
+ * as the initial value.
+ * @returns {*} Returns the accumulated value.
+ */
+ "use strict";
+
+ function arrayReduceRight(array, iteratee, accumulator, initFromArray) {
+ var length = array.length;
+ if (initFromArray && length) {
+ accumulator = array[--length];
+ }
+ while (length--) {
+ accumulator = iteratee(accumulator, array[length], length, array);
+ }
+ return accumulator;
+ }
+
+ exports["default"] = arrayReduceRight;
+});
+define("lodash/internal/arraySome", ["exports"], function (exports) {
+ /**
+ * A specialized version of `_.some` for arrays without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {boolean} Returns `true` if any element passes the predicate check,
+ * else `false`.
+ */
+ "use strict";
+
+ function arraySome(array, predicate) {
+ var index = -1,
+ length = array.length;
+
+ while (++index < length) {
+ if (predicate(array[index], index, array)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ exports["default"] = arraySome;
+});
+define("lodash/internal/arraySum", ["exports"], function (exports) {
+ /**
+ * A specialized version of `_.sum` for arrays without support for callback
+ * shorthands and `this` binding..
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {number} Returns the sum.
+ */
+ "use strict";
+
+ function arraySum(array, iteratee) {
+ var length = array.length,
+ result = 0;
+
+ while (length--) {
+ result += +iteratee(array[length]) || 0;
+ }
+ return result;
+ }
+
+ exports["default"] = arraySum;
+});
+define("lodash/internal/assignDefaults", ["exports"], function (exports) {
+ /**
+ * Used by `_.defaults` to customize its `_.assign` use.
+ *
+ * @private
+ * @param {*} objectValue The destination object property value.
+ * @param {*} sourceValue The source object property value.
+ * @returns {*} Returns the value to assign to the destination object.
+ */
+ "use strict";
+
+ function assignDefaults(objectValue, sourceValue) {
+ return objectValue === undefined ? sourceValue : objectValue;
+ }
+
+ exports["default"] = assignDefaults;
+});
+define("lodash/internal/assignOwnDefaults", ["exports"], function (exports) {
+ /** Used for native method references. */
+ "use strict";
+
+ var objectProto = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty = objectProto.hasOwnProperty;
+
+ /**
+ * Used by `_.template` to customize its `_.assign` use.
+ *
+ * **Note:** This function is like `assignDefaults` except that it ignores
+ * inherited property values when checking if a property is `undefined`.
+ *
+ * @private
+ * @param {*} objectValue The destination object property value.
+ * @param {*} sourceValue The source object property value.
+ * @param {string} key The key associated with the object and source values.
+ * @param {Object} object The destination object.
+ * @returns {*} Returns the value to assign to the destination object.
+ */
+ function assignOwnDefaults(objectValue, sourceValue, key, object) {
+ return objectValue === undefined || !hasOwnProperty.call(object, key) ? sourceValue : objectValue;
+ }
+
+ exports["default"] = assignOwnDefaults;
+});
+define('lodash/internal/assignWith', ['exports', 'lodash/object/keys'], function (exports, _lodashObjectKeys) {
+ 'use strict';
+
+ /**
+ * A specialized version of `_.assign` for customizing assigned values without
+ * support for argument juggling, multiple sources, and `this` binding `customizer`
+ * functions.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @param {Function} customizer The function to customize assigned values.
+ * @returns {Object} Returns `object`.
+ */
+ function assignWith(object, source, customizer) {
+ var index = -1,
+ props = (0, _lodashObjectKeys['default'])(source),
+ length = props.length;
+
+ while (++index < length) {
+ var key = props[index],
+ value = object[key],
+ result = customizer(value, source[key], key, object, source);
+
+ if ((result === result ? result !== value : value === value) || value === undefined && !(key in object)) {
+ object[key] = result;
+ }
+ }
+ return object;
+ }
+
+ exports['default'] = assignWith;
+});
+define('lodash/internal/baseAssign', ['exports', 'lodash/internal/baseCopy', 'lodash/object/keys'], function (exports, _lodashInternalBaseCopy, _lodashObjectKeys) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.assign` without support for argument juggling,
+ * multiple sources, and `customizer` functions.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @returns {Object} Returns `object`.
+ */
+ function baseAssign(object, source) {
+ return source == null ? object : (0, _lodashInternalBaseCopy['default'])(source, (0, _lodashObjectKeys['default'])(source), object);
+ }
+
+ exports['default'] = baseAssign;
+});
+define('lodash/internal/baseAt', ['exports', 'lodash/internal/isArrayLike', 'lodash/internal/isIndex'], function (exports, _lodashInternalIsArrayLike, _lodashInternalIsIndex) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.at` without support for string collections
+ * and individual key arguments.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {number[]|string[]} props The property names or indexes of elements to pick.
+ * @returns {Array} Returns the new array of picked elements.
+ */
+ function baseAt(collection, props) {
+ var index = -1,
+ isNil = collection == null,
+ isArr = !isNil && (0, _lodashInternalIsArrayLike['default'])(collection),
+ length = isArr ? collection.length : 0,
+ propsLength = props.length,
+ result = Array(propsLength);
+
+ while (++index < propsLength) {
+ var key = props[index];
+ if (isArr) {
+ result[index] = (0, _lodashInternalIsIndex['default'])(key, length) ? collection[key] : undefined;
+ } else {
+ result[index] = isNil ? undefined : collection[key];
+ }
+ }
+ return result;
+ }
+
+ exports['default'] = baseAt;
+});
+define('lodash/internal/baseCallback', ['exports', 'lodash/internal/baseMatches', 'lodash/internal/baseMatchesProperty', 'lodash/internal/bindCallback', 'lodash/utility/identity', 'lodash/utility/property'], function (exports, _lodashInternalBaseMatches, _lodashInternalBaseMatchesProperty, _lodashInternalBindCallback, _lodashUtilityIdentity, _lodashUtilityProperty) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.callback` which supports specifying the
+ * number of arguments to provide to `func`.
+ *
+ * @private
+ * @param {*} [func=_.identity] The value to convert to a callback.
+ * @param {*} [thisArg] The `this` binding of `func`.
+ * @param {number} [argCount] The number of arguments to provide to `func`.
+ * @returns {Function} Returns the callback.
+ */
+ function baseCallback(func, thisArg, argCount) {
+ var type = typeof func;
+ if (type == 'function') {
+ return thisArg === undefined ? func : (0, _lodashInternalBindCallback['default'])(func, thisArg, argCount);
+ }
+ if (func == null) {
+ return _lodashUtilityIdentity['default'];
+ }
+ if (type == 'object') {
+ return (0, _lodashInternalBaseMatches['default'])(func);
+ }
+ return thisArg === undefined ? (0, _lodashUtilityProperty['default'])(func) : (0, _lodashInternalBaseMatchesProperty['default'])(func, thisArg);
+ }
+
+ exports['default'] = baseCallback;
+});
+define('lodash/internal/baseClone', ['exports', 'lodash/internal/arrayCopy', 'lodash/internal/arrayEach', 'lodash/internal/baseAssign', 'lodash/internal/baseForOwn', 'lodash/internal/initCloneArray', 'lodash/internal/initCloneByTag', 'lodash/internal/initCloneObject', 'lodash/lang/isArray', 'lodash/lang/isObject'], function (exports, _lodashInternalArrayCopy, _lodashInternalArrayEach, _lodashInternalBaseAssign, _lodashInternalBaseForOwn, _lodashInternalInitCloneArray, _lodashInternalInitCloneByTag, _lodashInternalInitCloneObject, _lodashLangIsArray, _lodashLangIsObject) {
+ 'use strict';
+
+ /** `Object#toString` result references. */
+ var argsTag = '[object Arguments]',
+ arrayTag = '[object Array]',
+ boolTag = '[object Boolean]',
+ dateTag = '[object Date]',
+ errorTag = '[object Error]',
+ funcTag = '[object Function]',
+ mapTag = '[object Map]',
+ numberTag = '[object Number]',
+ objectTag = '[object Object]',
+ regexpTag = '[object RegExp]',
+ setTag = '[object Set]',
+ stringTag = '[object String]',
+ weakMapTag = '[object WeakMap]';
+
+ var arrayBufferTag = '[object ArrayBuffer]',
+ float32Tag = '[object Float32Array]',
+ float64Tag = '[object Float64Array]',
+ int8Tag = '[object Int8Array]',
+ int16Tag = '[object Int16Array]',
+ int32Tag = '[object Int32Array]',
+ uint8Tag = '[object Uint8Array]',
+ uint8ClampedTag = '[object Uint8ClampedArray]',
+ uint16Tag = '[object Uint16Array]',
+ uint32Tag = '[object Uint32Array]';
+
+ /** Used to identify `toStringTag` values supported by `_.clone`. */
+ var cloneableTags = {};
+ cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[stringTag] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
+ cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[mapTag] = cloneableTags[setTag] = cloneableTags[weakMapTag] = false;
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var objToString = objectProto.toString;
+
+ /**
+ * The base implementation of `_.clone` without support for argument juggling
+ * and `this` binding `customizer` functions.
+ *
+ * @private
+ * @param {*} value The value to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @param {Function} [customizer] The function to customize cloning values.
+ * @param {string} [key] The key of `value`.
+ * @param {Object} [object] The object `value` belongs to.
+ * @param {Array} [stackA=[]] Tracks traversed source objects.
+ * @param {Array} [stackB=[]] Associates clones with source counterparts.
+ * @returns {*} Returns the cloned value.
+ */
+ function baseClone(value, isDeep, customizer, key, object, stackA, stackB) {
+ var result;
+ if (customizer) {
+ result = object ? customizer(value, key, object) : customizer(value);
+ }
+ if (result !== undefined) {
+ return result;
+ }
+ if (!(0, _lodashLangIsObject['default'])(value)) {
+ return value;
+ }
+ var isArr = (0, _lodashLangIsArray['default'])(value);
+ if (isArr) {
+ result = (0, _lodashInternalInitCloneArray['default'])(value);
+ if (!isDeep) {
+ return (0, _lodashInternalArrayCopy['default'])(value, result);
+ }
+ } else {
+ var tag = objToString.call(value),
+ isFunc = tag == funcTag;
+
+ if (tag == objectTag || tag == argsTag || isFunc && !object) {
+ result = (0, _lodashInternalInitCloneObject['default'])(isFunc ? {} : value);
+ if (!isDeep) {
+ return (0, _lodashInternalBaseAssign['default'])(result, value);
+ }
+ } else {
+ return cloneableTags[tag] ? (0, _lodashInternalInitCloneByTag['default'])(value, tag, isDeep) : object ? value : {};
+ }
+ }
+ // Check for circular references and return its corresponding clone.
+ stackA || (stackA = []);
+ stackB || (stackB = []);
+
+ var length = stackA.length;
+ while (length--) {
+ if (stackA[length] == value) {
+ return stackB[length];
+ }
+ }
+ // Add the source value to the stack of traversed objects and associate it with its clone.
+ stackA.push(value);
+ stackB.push(result);
+
+ // Recursively populate clone (susceptible to call stack limits).
+ (isArr ? _lodashInternalArrayEach['default'] : _lodashInternalBaseForOwn['default'])(value, function (subValue, key) {
+ result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB);
+ });
+ return result;
+ }
+
+ exports['default'] = baseClone;
+});
+define("lodash/internal/baseCompareAscending", ["exports"], function (exports) {
+ /**
+ * The base implementation of `compareAscending` which compares values and
+ * sorts them in ascending order without guaranteeing a stable sort.
+ *
+ * @private
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {number} Returns the sort order indicator for `value`.
+ */
+ "use strict";
+
+ function baseCompareAscending(value, other) {
+ if (value !== other) {
+ var valIsNull = value === null,
+ valIsUndef = value === undefined,
+ valIsReflexive = value === value;
+
+ var othIsNull = other === null,
+ othIsUndef = other === undefined,
+ othIsReflexive = other === other;
+
+ if (value > other && !othIsNull || !valIsReflexive || valIsNull && !othIsUndef && othIsReflexive || valIsUndef && othIsReflexive) {
+ return 1;
+ }
+ if (value < other && !valIsNull || !othIsReflexive || othIsNull && !valIsUndef && valIsReflexive || othIsUndef && valIsReflexive) {
+ return -1;
+ }
+ }
+ return 0;
+ }
+
+ exports["default"] = baseCompareAscending;
+});
+define("lodash/internal/baseCopy", ["exports"], function (exports) {
+ /**
+ * Copies properties of `source` to `object`.
+ *
+ * @private
+ * @param {Object} source The object to copy properties from.
+ * @param {Array} props The property names to copy.
+ * @param {Object} [object={}] The object to copy properties to.
+ * @returns {Object} Returns `object`.
+ */
+ "use strict";
+
+ function baseCopy(source, props, object) {
+ object || (object = {});
+
+ var index = -1,
+ length = props.length;
+
+ while (++index < length) {
+ var key = props[index];
+ object[key] = source[key];
+ }
+ return object;
+ }
+
+ exports["default"] = baseCopy;
+});
+define('lodash/internal/baseCreate', ['exports', 'lodash/lang/isObject'], function (exports, _lodashLangIsObject) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.create` without support for assigning
+ * properties to the created object.
+ *
+ * @private
+ * @param {Object} prototype The object to inherit from.
+ * @returns {Object} Returns the new object.
+ */
+ var baseCreate = (function () {
+ function object() {}
+ return function (prototype) {
+ if ((0, _lodashLangIsObject['default'])(prototype)) {
+ object.prototype = prototype;
+ var result = new object();
+ object.prototype = undefined;
+ }
+ return result || {};
+ };
+ })();
+
+ exports['default'] = baseCreate;
+});
+define('lodash/internal/baseDelay', ['exports'], function (exports) {
+ /** Used as the `TypeError` message for "Functions" methods. */
+ 'use strict';
+
+ var FUNC_ERROR_TEXT = 'Expected a function';
+
+ /**
+ * The base implementation of `_.delay` and `_.defer` which accepts an index
+ * of where to slice the arguments to provide to `func`.
+ *
+ * @private
+ * @param {Function} func The function to delay.
+ * @param {number} wait The number of milliseconds to delay invocation.
+ * @param {Object} args The arguments provide to `func`.
+ * @returns {number} Returns the timer id.
+ */
+ function baseDelay(func, wait, args) {
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ return setTimeout(function () {
+ func.apply(undefined, args);
+ }, wait);
+ }
+
+ exports['default'] = baseDelay;
+});
+define('lodash/internal/baseDifference', ['exports', 'lodash/internal/baseIndexOf', 'lodash/internal/cacheIndexOf', 'lodash/internal/createCache'], function (exports, _lodashInternalBaseIndexOf, _lodashInternalCacheIndexOf, _lodashInternalCreateCache) {
+ 'use strict';
+
+ /** Used as the size to enable large array optimizations. */
+ var LARGE_ARRAY_SIZE = 200;
+
+ /**
+ * The base implementation of `_.difference` which accepts a single array
+ * of values to exclude.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {Array} values The values to exclude.
+ * @returns {Array} Returns the new array of filtered values.
+ */
+ function baseDifference(array, values) {
+ var length = array ? array.length : 0,
+ result = [];
+
+ if (!length) {
+ return result;
+ }
+ var index = -1,
+ indexOf = _lodashInternalBaseIndexOf['default'],
+ isCommon = true,
+ cache = isCommon && values.length >= LARGE_ARRAY_SIZE ? (0, _lodashInternalCreateCache['default'])(values) : null,
+ valuesLength = values.length;
+
+ if (cache) {
+ indexOf = _lodashInternalCacheIndexOf['default'];
+ isCommon = false;
+ values = cache;
+ }
+ outer: while (++index < length) {
+ var value = array[index];
+
+ if (isCommon && value === value) {
+ var valuesIndex = valuesLength;
+ while (valuesIndex--) {
+ if (values[valuesIndex] === value) {
+ continue outer;
+ }
+ }
+ result.push(value);
+ } else if (indexOf(values, value, 0) < 0) {
+ result.push(value);
+ }
+ }
+ return result;
+ }
+
+ exports['default'] = baseDifference;
+});
+define('lodash/internal/baseEach', ['exports', 'lodash/internal/baseForOwn', 'lodash/internal/createBaseEach'], function (exports, _lodashInternalBaseForOwn, _lodashInternalCreateBaseEach) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.forEach` without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array|Object|string} Returns `collection`.
+ */
+ var baseEach = (0, _lodashInternalCreateBaseEach['default'])(_lodashInternalBaseForOwn['default']);
+
+ exports['default'] = baseEach;
+});
+define('lodash/internal/baseEachRight', ['exports', 'lodash/internal/baseForOwnRight', 'lodash/internal/createBaseEach'], function (exports, _lodashInternalBaseForOwnRight, _lodashInternalCreateBaseEach) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.forEachRight` without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array|Object|string} Returns `collection`.
+ */
+ var baseEachRight = (0, _lodashInternalCreateBaseEach['default'])(_lodashInternalBaseForOwnRight['default'], true);
+
+ exports['default'] = baseEachRight;
+});
+define('lodash/internal/baseEvery', ['exports', 'lodash/internal/baseEach'], function (exports, _lodashInternalBaseEach) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.every` without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {boolean} Returns `true` if all elements pass the predicate check,
+ * else `false`
+ */
+ function baseEvery(collection, predicate) {
+ var result = true;
+ (0, _lodashInternalBaseEach['default'])(collection, function (value, index, collection) {
+ result = !!predicate(value, index, collection);
+ return result;
+ });
+ return result;
+ }
+
+ exports['default'] = baseEvery;
+});
+define('lodash/internal/baseExtremum', ['exports', 'lodash/internal/baseEach'], function (exports, _lodashInternalBaseEach) {
+ 'use strict';
+
+ /**
+ * Gets the extremum value of `collection` invoking `iteratee` for each value
+ * in `collection` to generate the criterion by which the value is ranked.
+ * The `iteratee` is invoked with three arguments: (value, index|key, collection).
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {Function} comparator The function used to compare values.
+ * @param {*} exValue The initial extremum value.
+ * @returns {*} Returns the extremum value.
+ */
+ function baseExtremum(collection, iteratee, comparator, exValue) {
+ var computed = exValue,
+ result = computed;
+
+ (0, _lodashInternalBaseEach['default'])(collection, function (value, index, collection) {
+ var current = +iteratee(value, index, collection);
+ if (comparator(current, computed) || current === exValue && current === result) {
+ computed = current;
+ result = value;
+ }
+ });
+ return result;
+ }
+
+ exports['default'] = baseExtremum;
+});
+define("lodash/internal/baseFill", ["exports"], function (exports) {
+ /**
+ * The base implementation of `_.fill` without an iteratee call guard.
+ *
+ * @private
+ * @param {Array} array The array to fill.
+ * @param {*} value The value to fill `array` with.
+ * @param {number} [start=0] The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns `array`.
+ */
+ "use strict";
+
+ function baseFill(array, value, start, end) {
+ var length = array.length;
+
+ start = start == null ? 0 : +start || 0;
+ if (start < 0) {
+ start = -start > length ? 0 : length + start;
+ }
+ end = end === undefined || end > length ? length : +end || 0;
+ if (end < 0) {
+ end += length;
+ }
+ length = start > end ? 0 : end >>> 0;
+ start >>>= 0;
+
+ while (start < length) {
+ array[start++] = value;
+ }
+ return array;
+ }
+
+ exports["default"] = baseFill;
+});
+define('lodash/internal/baseFilter', ['exports', 'lodash/internal/baseEach'], function (exports, _lodashInternalBaseEach) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.filter` without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {Array} Returns the new filtered array.
+ */
+ function baseFilter(collection, predicate) {
+ var result = [];
+ (0, _lodashInternalBaseEach['default'])(collection, function (value, index, collection) {
+ if (predicate(value, index, collection)) {
+ result.push(value);
+ }
+ });
+ return result;
+ }
+
+ exports['default'] = baseFilter;
+});
+define("lodash/internal/baseFind", ["exports"], function (exports) {
+ /**
+ * The base implementation of `_.find`, `_.findLast`, `_.findKey`, and `_.findLastKey`,
+ * without support for callback shorthands and `this` binding, which iterates
+ * over `collection` using the provided `eachFunc`.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to search.
+ * @param {Function} predicate The function invoked per iteration.
+ * @param {Function} eachFunc The function to iterate over `collection`.
+ * @param {boolean} [retKey] Specify returning the key of the found element
+ * instead of the element itself.
+ * @returns {*} Returns the found element or its key, else `undefined`.
+ */
+ "use strict";
+
+ function baseFind(collection, predicate, eachFunc, retKey) {
+ var result;
+ eachFunc(collection, function (value, key, collection) {
+ if (predicate(value, key, collection)) {
+ result = retKey ? key : value;
+ return false;
+ }
+ });
+ return result;
+ }
+
+ exports["default"] = baseFind;
+});
+define("lodash/internal/baseFindIndex", ["exports"], function (exports) {
+ /**
+ * The base implementation of `_.findIndex` and `_.findLastIndex` without
+ * support for callback shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to search.
+ * @param {Function} predicate The function invoked per iteration.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+ "use strict";
+
+ function baseFindIndex(array, predicate, fromRight) {
+ var length = array.length,
+ index = fromRight ? length : -1;
+
+ while (fromRight ? index-- : ++index < length) {
+ if (predicate(array[index], index, array)) {
+ return index;
+ }
+ }
+ return -1;
+ }
+
+ exports["default"] = baseFindIndex;
+});
+define('lodash/internal/baseFlatten', ['exports', 'lodash/internal/arrayPush', 'lodash/lang/isArguments', 'lodash/lang/isArray', 'lodash/internal/isArrayLike', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalArrayPush, _lodashLangIsArguments, _lodashLangIsArray, _lodashInternalIsArrayLike, _lodashInternalIsObjectLike) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.flatten` with added support for restricting
+ * flattening and specifying the start index.
+ *
+ * @private
+ * @param {Array} array The array to flatten.
+ * @param {boolean} [isDeep] Specify a deep flatten.
+ * @param {boolean} [isStrict] Restrict flattening to arrays-like objects.
+ * @param {Array} [result=[]] The initial result value.
+ * @returns {Array} Returns the new flattened array.
+ */
+ function baseFlatten(array, isDeep, isStrict, result) {
+ result || (result = []);
+
+ var index = -1,
+ length = array.length;
+
+ while (++index < length) {
+ var value = array[index];
+ if ((0, _lodashInternalIsObjectLike['default'])(value) && (0, _lodashInternalIsArrayLike['default'])(value) && (isStrict || (0, _lodashLangIsArray['default'])(value) || (0, _lodashLangIsArguments['default'])(value))) {
+ if (isDeep) {
+ // Recursively flatten arrays (susceptible to call stack limits).
+ baseFlatten(value, isDeep, isStrict, result);
+ } else {
+ (0, _lodashInternalArrayPush['default'])(result, value);
+ }
+ } else if (!isStrict) {
+ result[result.length] = value;
+ }
+ }
+ return result;
+ }
+
+ exports['default'] = baseFlatten;
+});
+define('lodash/internal/baseFor', ['exports', 'lodash/internal/createBaseFor'], function (exports, _lodashInternalCreateBaseFor) {
+ 'use strict';
+
+ /**
+ * The base implementation of `baseForIn` and `baseForOwn` which iterates
+ * over `object` properties returned by `keysFunc` invoking `iteratee` for
+ * each property. Iteratee functions may exit iteration early by explicitly
+ * returning `false`.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {Function} keysFunc The function to get the keys of `object`.
+ * @returns {Object} Returns `object`.
+ */
+ var baseFor = (0, _lodashInternalCreateBaseFor['default'])();
+
+ exports['default'] = baseFor;
+});
+define('lodash/internal/baseForIn', ['exports', 'lodash/internal/baseFor', 'lodash/object/keysIn'], function (exports, _lodashInternalBaseFor, _lodashObjectKeysIn) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.forIn` without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ */
+ function baseForIn(object, iteratee) {
+ return (0, _lodashInternalBaseFor['default'])(object, iteratee, _lodashObjectKeysIn['default']);
+ }
+
+ exports['default'] = baseForIn;
+});
+define('lodash/internal/baseForOwn', ['exports', 'lodash/internal/baseFor', 'lodash/object/keys'], function (exports, _lodashInternalBaseFor, _lodashObjectKeys) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.forOwn` without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ */
+ function baseForOwn(object, iteratee) {
+ return (0, _lodashInternalBaseFor['default'])(object, iteratee, _lodashObjectKeys['default']);
+ }
+
+ exports['default'] = baseForOwn;
+});
+define('lodash/internal/baseForOwnRight', ['exports', 'lodash/internal/baseForRight', 'lodash/object/keys'], function (exports, _lodashInternalBaseForRight, _lodashObjectKeys) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.forOwnRight` without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ */
+ function baseForOwnRight(object, iteratee) {
+ return (0, _lodashInternalBaseForRight['default'])(object, iteratee, _lodashObjectKeys['default']);
+ }
+
+ exports['default'] = baseForOwnRight;
+});
+define('lodash/internal/baseForRight', ['exports', 'lodash/internal/createBaseFor'], function (exports, _lodashInternalCreateBaseFor) {
+ 'use strict';
+
+ /**
+ * This function is like `baseFor` except that it iterates over properties
+ * in the opposite order.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {Function} keysFunc The function to get the keys of `object`.
+ * @returns {Object} Returns `object`.
+ */
+ var baseForRight = (0, _lodashInternalCreateBaseFor['default'])(true);
+
+ exports['default'] = baseForRight;
+});
+define('lodash/internal/baseFunctions', ['exports', 'lodash/lang/isFunction'], function (exports, _lodashLangIsFunction) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.functions` which creates an array of
+ * `object` function property names filtered from those provided.
+ *
+ * @private
+ * @param {Object} object The object to inspect.
+ * @param {Array} props The property names to filter.
+ * @returns {Array} Returns the new array of filtered property names.
+ */
+ function baseFunctions(object, props) {
+ var index = -1,
+ length = props.length,
+ resIndex = -1,
+ result = [];
+
+ while (++index < length) {
+ var key = props[index];
+ if ((0, _lodashLangIsFunction['default'])(object[key])) {
+ result[++resIndex] = key;
+ }
+ }
+ return result;
+ }
+
+ exports['default'] = baseFunctions;
+});
+define('lodash/internal/baseGet', ['exports', 'lodash/internal/toObject'], function (exports, _lodashInternalToObject) {
+ 'use strict';
+
+ /**
+ * The base implementation of `get` without support for string paths
+ * and default values.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array} path The path of the property to get.
+ * @param {string} [pathKey] The key representation of path.
+ * @returns {*} Returns the resolved value.
+ */
+ function baseGet(object, path, pathKey) {
+ if (object == null) {
+ return;
+ }
+ if (pathKey !== undefined && pathKey in (0, _lodashInternalToObject['default'])(object)) {
+ path = [pathKey];
+ }
+ var index = 0,
+ length = path.length;
+
+ while (object != null && index < length) {
+ object = object[path[index++]];
+ }
+ return index && index == length ? object : undefined;
+ }
+
+ exports['default'] = baseGet;
+});
+define('lodash/internal/baseIndexOf', ['exports', 'lodash/internal/indexOfNaN'], function (exports, _lodashInternalIndexOfNaN) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.indexOf` without support for binary searches.
+ *
+ * @private
+ * @param {Array} array The array to search.
+ * @param {*} value The value to search for.
+ * @param {number} fromIndex The index to search from.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+ function baseIndexOf(array, value, fromIndex) {
+ if (value !== value) {
+ return (0, _lodashInternalIndexOfNaN['default'])(array, fromIndex);
+ }
+ var index = fromIndex - 1,
+ length = array.length;
+
+ while (++index < length) {
+ if (array[index] === value) {
+ return index;
+ }
+ }
+ return -1;
+ }
+
+ exports['default'] = baseIndexOf;
+});
+define('lodash/internal/baseIsEqual', ['exports', 'lodash/internal/baseIsEqualDeep', 'lodash/lang/isObject', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalBaseIsEqualDeep, _lodashLangIsObject, _lodashInternalIsObjectLike) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.isEqual` without support for `this` binding
+ * `customizer` functions.
+ *
+ * @private
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @param {Function} [customizer] The function to customize comparing values.
+ * @param {boolean} [isLoose] Specify performing partial comparisons.
+ * @param {Array} [stackA] Tracks traversed `value` objects.
+ * @param {Array} [stackB] Tracks traversed `other` objects.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+ */
+ function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {
+ if (value === other) {
+ return true;
+ }
+ if (value == null || other == null || !(0, _lodashLangIsObject['default'])(value) && !(0, _lodashInternalIsObjectLike['default'])(other)) {
+ return value !== value && other !== other;
+ }
+ return (0, _lodashInternalBaseIsEqualDeep['default'])(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);
+ }
+
+ exports['default'] = baseIsEqual;
+});
+define('lodash/internal/baseIsEqualDeep', ['exports', 'lodash/internal/equalArrays', 'lodash/internal/equalByTag', 'lodash/internal/equalObjects', 'lodash/lang/isArray', 'lodash/lang/isTypedArray'], function (exports, _lodashInternalEqualArrays, _lodashInternalEqualByTag, _lodashInternalEqualObjects, _lodashLangIsArray, _lodashLangIsTypedArray) {
+ 'use strict';
+
+ /** `Object#toString` result references. */
+ var argsTag = '[object Arguments]',
+ arrayTag = '[object Array]',
+ objectTag = '[object Object]';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty = objectProto.hasOwnProperty;
+
+ /**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var objToString = objectProto.toString;
+
+ /**
+ * A specialized version of `baseIsEqual` for arrays and objects which performs
+ * deep comparisons and tracks traversed objects enabling objects with circular
+ * references to be compared.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {Function} equalFunc The function to determine equivalents of values.
+ * @param {Function} [customizer] The function to customize comparing objects.
+ * @param {boolean} [isLoose] Specify performing partial comparisons.
+ * @param {Array} [stackA=[]] Tracks traversed `value` objects.
+ * @param {Array} [stackB=[]] Tracks traversed `other` objects.
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+ */
+ function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
+ var objIsArr = (0, _lodashLangIsArray['default'])(object),
+ othIsArr = (0, _lodashLangIsArray['default'])(other),
+ objTag = arrayTag,
+ othTag = arrayTag;
+
+ if (!objIsArr) {
+ objTag = objToString.call(object);
+ if (objTag == argsTag) {
+ objTag = objectTag;
+ } else if (objTag != objectTag) {
+ objIsArr = (0, _lodashLangIsTypedArray['default'])(object);
+ }
+ }
+ if (!othIsArr) {
+ othTag = objToString.call(other);
+ if (othTag == argsTag) {
+ othTag = objectTag;
+ } else if (othTag != objectTag) {
+ othIsArr = (0, _lodashLangIsTypedArray['default'])(other);
+ }
+ }
+ var objIsObj = objTag == objectTag,
+ othIsObj = othTag == objectTag,
+ isSameTag = objTag == othTag;
+
+ if (isSameTag && !(objIsArr || objIsObj)) {
+ return (0, _lodashInternalEqualByTag['default'])(object, other, objTag);
+ }
+ if (!isLoose) {
+ var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
+ othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
+
+ if (objIsWrapped || othIsWrapped) {
+ return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);
+ }
+ }
+ if (!isSameTag) {
+ return false;
+ }
+ // Assume cyclic values are equal.
+ // For more information on detecting circular references see https://es5.github.io/#JO.
+ stackA || (stackA = []);
+ stackB || (stackB = []);
+
+ var length = stackA.length;
+ while (length--) {
+ if (stackA[length] == object) {
+ return stackB[length] == other;
+ }
+ }
+ // Add `object` and `other` to the stack of traversed objects.
+ stackA.push(object);
+ stackB.push(other);
+
+ var result = (objIsArr ? _lodashInternalEqualArrays['default'] : _lodashInternalEqualObjects['default'])(object, other, equalFunc, customizer, isLoose, stackA, stackB);
+
+ stackA.pop();
+ stackB.pop();
+
+ return result;
+ }
+
+ exports['default'] = baseIsEqualDeep;
+});
+define('lodash/internal/baseIsFunction', ['exports'], function (exports) {
+ /**
+ * The base implementation of `_.isFunction` without support for environments
+ * with incorrect `typeof` results.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ */
+ 'use strict';
+
+ function baseIsFunction(value) {
+ // Avoid a Chakra JIT bug in compatibility modes of IE 11.
+ // See https://github.com/jashkenas/underscore/issues/1621 for more details.
+ return typeof value == 'function' || false;
+ }
+
+ exports['default'] = baseIsFunction;
+});
+define('lodash/internal/baseIsMatch', ['exports', 'lodash/internal/baseIsEqual', 'lodash/internal/toObject'], function (exports, _lodashInternalBaseIsEqual, _lodashInternalToObject) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.isMatch` without support for callback
+ * shorthands and `this` binding.
+ *
+ * @private
+ * @param {Object} object The object to inspect.
+ * @param {Array} matchData The propery names, values, and compare flags to match.
+ * @param {Function} [customizer] The function to customize comparing objects.
+ * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+ */
+ function baseIsMatch(object, matchData, customizer) {
+ var index = matchData.length,
+ length = index,
+ noCustomizer = !customizer;
+
+ if (object == null) {
+ return !length;
+ }
+ object = (0, _lodashInternalToObject['default'])(object);
+ while (index--) {
+ var data = matchData[index];
+ if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) {
+ return false;
+ }
+ }
+ while (++index < length) {
+ data = matchData[index];
+ var key = data[0],
+ objValue = object[key],
+ srcValue = data[1];
+
+ if (noCustomizer && data[2]) {
+ if (objValue === undefined && !(key in object)) {
+ return false;
+ }
+ } else {
+ var result = customizer ? customizer(objValue, srcValue, key) : undefined;
+ if (!(result === undefined ? (0, _lodashInternalBaseIsEqual['default'])(srcValue, objValue, customizer, true) : result)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ exports['default'] = baseIsMatch;
+});
+define("lodash/internal/baseLodash", ["exports"], function (exports) {
+ /**
+ * The function whose prototype all chaining wrappers inherit from.
+ *
+ * @private
+ */
+ "use strict";
+
+ function baseLodash() {
+ // No operation performed.
+ }
+
+ exports["default"] = baseLodash;
+});
+define('lodash/internal/baseMap', ['exports', 'lodash/internal/baseEach', 'lodash/internal/isArrayLike'], function (exports, _lodashInternalBaseEach, _lodashInternalIsArrayLike) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.map` without support for callback shorthands
+ * and `this` binding.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the new mapped array.
+ */
+ function baseMap(collection, iteratee) {
+ var index = -1,
+ result = (0, _lodashInternalIsArrayLike['default'])(collection) ? Array(collection.length) : [];
+
+ (0, _lodashInternalBaseEach['default'])(collection, function (value, key, collection) {
+ result[++index] = iteratee(value, key, collection);
+ });
+ return result;
+ }
+
+ exports['default'] = baseMap;
+});
+define('lodash/internal/baseMatches', ['exports', 'lodash/internal/baseIsMatch', 'lodash/internal/getMatchData', 'lodash/internal/toObject'], function (exports, _lodashInternalBaseIsMatch, _lodashInternalGetMatchData, _lodashInternalToObject) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.matches` which does not clone `source`.
+ *
+ * @private
+ * @param {Object} source The object of property values to match.
+ * @returns {Function} Returns the new function.
+ */
+ function baseMatches(source) {
+ var matchData = (0, _lodashInternalGetMatchData['default'])(source);
+ if (matchData.length == 1 && matchData[0][2]) {
+ var key = matchData[0][0],
+ value = matchData[0][1];
+
+ return function (object) {
+ if (object == null) {
+ return false;
+ }
+ return object[key] === value && (value !== undefined || key in (0, _lodashInternalToObject['default'])(object));
+ };
+ }
+ return function (object) {
+ return (0, _lodashInternalBaseIsMatch['default'])(object, matchData);
+ };
+ }
+
+ exports['default'] = baseMatches;
+});
+define('lodash/internal/baseMatchesProperty', ['exports', 'lodash/internal/baseGet', 'lodash/internal/baseIsEqual', 'lodash/internal/baseSlice', 'lodash/lang/isArray', 'lodash/internal/isKey', 'lodash/internal/isStrictComparable', 'lodash/array/last', 'lodash/internal/toObject', 'lodash/internal/toPath'], function (exports, _lodashInternalBaseGet, _lodashInternalBaseIsEqual, _lodashInternalBaseSlice, _lodashLangIsArray, _lodashInternalIsKey, _lodashInternalIsStrictComparable, _lodashArrayLast, _lodashInternalToObject, _lodashInternalToPath) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.matchesProperty` which does not clone `srcValue`.
+ *
+ * @private
+ * @param {string} path The path of the property to get.
+ * @param {*} srcValue The value to compare.
+ * @returns {Function} Returns the new function.
+ */
+ function baseMatchesProperty(path, srcValue) {
+ var isArr = (0, _lodashLangIsArray['default'])(path),
+ isCommon = (0, _lodashInternalIsKey['default'])(path) && (0, _lodashInternalIsStrictComparable['default'])(srcValue),
+ pathKey = path + '';
+
+ path = (0, _lodashInternalToPath['default'])(path);
+ return function (object) {
+ if (object == null) {
+ return false;
+ }
+ var key = pathKey;
+ object = (0, _lodashInternalToObject['default'])(object);
+ if ((isArr || !isCommon) && !(key in object)) {
+ object = path.length == 1 ? object : (0, _lodashInternalBaseGet['default'])(object, (0, _lodashInternalBaseSlice['default'])(path, 0, -1));
+ if (object == null) {
+ return false;
+ }
+ key = (0, _lodashArrayLast['default'])(path);
+ object = (0, _lodashInternalToObject['default'])(object);
+ }
+ return object[key] === srcValue ? srcValue !== undefined || key in object : (0, _lodashInternalBaseIsEqual['default'])(srcValue, object[key], undefined, true);
+ };
+ }
+
+ exports['default'] = baseMatchesProperty;
+});
+define('lodash/internal/baseMerge', ['exports', 'lodash/internal/arrayEach', 'lodash/internal/baseMergeDeep', 'lodash/lang/isArray', 'lodash/internal/isArrayLike', 'lodash/lang/isObject', 'lodash/internal/isObjectLike', 'lodash/lang/isTypedArray', 'lodash/object/keys'], function (exports, _lodashInternalArrayEach, _lodashInternalBaseMergeDeep, _lodashLangIsArray, _lodashInternalIsArrayLike, _lodashLangIsObject, _lodashInternalIsObjectLike, _lodashLangIsTypedArray, _lodashObjectKeys) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.merge` without support for argument juggling,
+ * multiple sources, and `this` binding `customizer` functions.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @param {Function} [customizer] The function to customize merged values.
+ * @param {Array} [stackA=[]] Tracks traversed source objects.
+ * @param {Array} [stackB=[]] Associates values with source counterparts.
+ * @returns {Object} Returns `object`.
+ */
+ function baseMerge(object, source, customizer, stackA, stackB) {
+ if (!(0, _lodashLangIsObject['default'])(object)) {
+ return object;
+ }
+ var isSrcArr = (0, _lodashInternalIsArrayLike['default'])(source) && ((0, _lodashLangIsArray['default'])(source) || (0, _lodashLangIsTypedArray['default'])(source)),
+ props = isSrcArr ? undefined : (0, _lodashObjectKeys['default'])(source);
+
+ (0, _lodashInternalArrayEach['default'])(props || source, function (srcValue, key) {
+ if (props) {
+ key = srcValue;
+ srcValue = source[key];
+ }
+ if ((0, _lodashInternalIsObjectLike['default'])(srcValue)) {
+ stackA || (stackA = []);
+ stackB || (stackB = []);
+ (0, _lodashInternalBaseMergeDeep['default'])(object, source, key, baseMerge, customizer, stackA, stackB);
+ } else {
+ var value = object[key],
+ result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
+ isCommon = result === undefined;
+
+ if (isCommon) {
+ result = srcValue;
+ }
+ if ((result !== undefined || isSrcArr && !(key in object)) && (isCommon || (result === result ? result !== value : value === value))) {
+ object[key] = result;
+ }
+ }
+ });
+ return object;
+ }
+
+ exports['default'] = baseMerge;
+});
+define('lodash/internal/baseMergeDeep', ['exports', 'lodash/internal/arrayCopy', 'lodash/lang/isArguments', 'lodash/lang/isArray', 'lodash/internal/isArrayLike', 'lodash/lang/isPlainObject', 'lodash/lang/isTypedArray', 'lodash/lang/toPlainObject'], function (exports, _lodashInternalArrayCopy, _lodashLangIsArguments, _lodashLangIsArray, _lodashInternalIsArrayLike, _lodashLangIsPlainObject, _lodashLangIsTypedArray, _lodashLangToPlainObject) {
+ 'use strict';
+
+ /**
+ * A specialized version of `baseMerge` for arrays and objects which performs
+ * deep merges and tracks traversed objects enabling objects with circular
+ * references to be merged.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @param {string} key The key of the value to merge.
+ * @param {Function} mergeFunc The function to merge values.
+ * @param {Function} [customizer] The function to customize merged values.
+ * @param {Array} [stackA=[]] Tracks traversed source objects.
+ * @param {Array} [stackB=[]] Associates values with source counterparts.
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+ */
+ function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {
+ var length = stackA.length,
+ srcValue = source[key];
+
+ while (length--) {
+ if (stackA[length] == srcValue) {
+ object[key] = stackB[length];
+ return;
+ }
+ }
+ var value = object[key],
+ result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
+ isCommon = result === undefined;
+
+ if (isCommon) {
+ result = srcValue;
+ if ((0, _lodashInternalIsArrayLike['default'])(srcValue) && ((0, _lodashLangIsArray['default'])(srcValue) || (0, _lodashLangIsTypedArray['default'])(srcValue))) {
+ result = (0, _lodashLangIsArray['default'])(value) ? value : (0, _lodashInternalIsArrayLike['default'])(value) ? (0, _lodashInternalArrayCopy['default'])(value) : [];
+ } else if ((0, _lodashLangIsPlainObject['default'])(srcValue) || (0, _lodashLangIsArguments['default'])(srcValue)) {
+ result = (0, _lodashLangIsArguments['default'])(value) ? (0, _lodashLangToPlainObject['default'])(value) : (0, _lodashLangIsPlainObject['default'])(value) ? value : {};
+ } else {
+ isCommon = false;
+ }
+ }
+ // Add the source value to the stack of traversed objects and associate
+ // it with its merged value.
+ stackA.push(srcValue);
+ stackB.push(result);
+
+ if (isCommon) {
+ // Recursively merge objects and arrays (susceptible to call stack limits).
+ object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);
+ } else if (result === result ? result !== value : value === value) {
+ object[key] = result;
+ }
+ }
+
+ exports['default'] = baseMergeDeep;
+});
+define("lodash/internal/baseProperty", ["exports"], function (exports) {
+ /**
+ * The base implementation of `_.property` without support for deep paths.
+ *
+ * @private
+ * @param {string} key The key of the property to get.
+ * @returns {Function} Returns the new function.
+ */
+ "use strict";
+
+ function baseProperty(key) {
+ return function (object) {
+ return object == null ? undefined : object[key];
+ };
+ }
+
+ exports["default"] = baseProperty;
+});
+define('lodash/internal/basePropertyDeep', ['exports', 'lodash/internal/baseGet', 'lodash/internal/toPath'], function (exports, _lodashInternalBaseGet, _lodashInternalToPath) {
+ 'use strict';
+
+ /**
+ * A specialized version of `baseProperty` which supports deep paths.
+ *
+ * @private
+ * @param {Array|string} path The path of the property to get.
+ * @returns {Function} Returns the new function.
+ */
+ function basePropertyDeep(path) {
+ var pathKey = path + '';
+ path = (0, _lodashInternalToPath['default'])(path);
+ return function (object) {
+ return (0, _lodashInternalBaseGet['default'])(object, path, pathKey);
+ };
+ }
+
+ exports['default'] = basePropertyDeep;
+});
+define('lodash/internal/basePullAt', ['exports', 'lodash/internal/isIndex'], function (exports, _lodashInternalIsIndex) {
+ 'use strict';
+
+ /** Used for native method references. */
+ var arrayProto = Array.prototype;
+
+ /** Native method references. */
+ var splice = arrayProto.splice;
+
+ /**
+ * The base implementation of `_.pullAt` without support for individual
+ * index arguments and capturing the removed elements.
+ *
+ * @private
+ * @param {Array} array The array to modify.
+ * @param {number[]} indexes The indexes of elements to remove.
+ * @returns {Array} Returns `array`.
+ */
+ function basePullAt(array, indexes) {
+ var length = array ? indexes.length : 0;
+ while (length--) {
+ var index = indexes[length];
+ if (index != previous && (0, _lodashInternalIsIndex['default'])(index)) {
+ var previous = index;
+ splice.call(array, index, 1);
+ }
+ }
+ return array;
+ }
+
+ exports['default'] = basePullAt;
+});
+define("lodash/internal/baseRandom", ["exports"], function (exports) {
+ /* Native method references for those with the same name as other `lodash` methods. */
+ "use strict";
+
+ var nativeFloor = Math.floor,
+ nativeRandom = Math.random;
+
+ /**
+ * The base implementation of `_.random` without support for argument juggling
+ * and returning floating-point numbers.
+ *
+ * @private
+ * @param {number} min The minimum possible value.
+ * @param {number} max The maximum possible value.
+ * @returns {number} Returns the random number.
+ */
+ function baseRandom(min, max) {
+ return min + nativeFloor(nativeRandom() * (max - min + 1));
+ }
+
+ exports["default"] = baseRandom;
+});
+define("lodash/internal/baseReduce", ["exports"], function (exports) {
+ /**
+ * The base implementation of `_.reduce` and `_.reduceRight` without support
+ * for callback shorthands and `this` binding, which iterates over `collection`
+ * using the provided `eachFunc`.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {*} accumulator The initial value.
+ * @param {boolean} initFromCollection Specify using the first or last element
+ * of `collection` as the initial value.
+ * @param {Function} eachFunc The function to iterate over `collection`.
+ * @returns {*} Returns the accumulated value.
+ */
+ "use strict";
+
+ function baseReduce(collection, iteratee, accumulator, initFromCollection, eachFunc) {
+ eachFunc(collection, function (value, index, collection) {
+ accumulator = initFromCollection ? (initFromCollection = false, value) : iteratee(accumulator, value, index, collection);
+ });
+ return accumulator;
+ }
+
+ exports["default"] = baseReduce;
+});
+define('lodash/internal/baseSetData', ['exports', 'lodash/utility/identity', 'lodash/internal/metaMap'], function (exports, _lodashUtilityIdentity, _lodashInternalMetaMap) {
+ 'use strict';
+
+ /**
+ * The base implementation of `setData` without support for hot loop detection.
+ *
+ * @private
+ * @param {Function} func The function to associate metadata with.
+ * @param {*} data The metadata.
+ * @returns {Function} Returns `func`.
+ */
+ var baseSetData = !_lodashInternalMetaMap['default'] ? _lodashUtilityIdentity['default'] : function (func, data) {
+ _lodashInternalMetaMap['default'].set(func, data);
+ return func;
+ };
+
+ exports['default'] = baseSetData;
+});
+define("lodash/internal/baseSlice", ["exports"], function (exports) {
+ /**
+ * The base implementation of `_.slice` without an iteratee call guard.
+ *
+ * @private
+ * @param {Array} array The array to slice.
+ * @param {number} [start=0] The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns the slice of `array`.
+ */
+ "use strict";
+
+ function baseSlice(array, start, end) {
+ var index = -1,
+ length = array.length;
+
+ start = start == null ? 0 : +start || 0;
+ if (start < 0) {
+ start = -start > length ? 0 : length + start;
+ }
+ end = end === undefined || end > length ? length : +end || 0;
+ if (end < 0) {
+ end += length;
+ }
+ length = start > end ? 0 : end - start >>> 0;
+ start >>>= 0;
+
+ var result = Array(length);
+ while (++index < length) {
+ result[index] = array[index + start];
+ }
+ return result;
+ }
+
+ exports["default"] = baseSlice;
+});
+define('lodash/internal/baseSome', ['exports', 'lodash/internal/baseEach'], function (exports, _lodashInternalBaseEach) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.some` without support for callback shorthands
+ * and `this` binding.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {boolean} Returns `true` if any element passes the predicate check,
+ * else `false`.
+ */
+ function baseSome(collection, predicate) {
+ var result;
+
+ (0, _lodashInternalBaseEach['default'])(collection, function (value, index, collection) {
+ result = predicate(value, index, collection);
+ return !result;
+ });
+ return !!result;
+ }
+
+ exports['default'] = baseSome;
+});
+define("lodash/internal/baseSortBy", ["exports"], function (exports) {
+ /**
+ * The base implementation of `_.sortBy` which uses `comparer` to define
+ * the sort order of `array` and replaces criteria objects with their
+ * corresponding values.
+ *
+ * @private
+ * @param {Array} array The array to sort.
+ * @param {Function} comparer The function to define sort order.
+ * @returns {Array} Returns `array`.
+ */
+ "use strict";
+
+ function baseSortBy(array, comparer) {
+ var length = array.length;
+
+ array.sort(comparer);
+ while (length--) {
+ array[length] = array[length].value;
+ }
+ return array;
+ }
+
+ exports["default"] = baseSortBy;
+});
+define('lodash/internal/baseSortByOrder', ['exports', 'lodash/internal/arrayMap', 'lodash/internal/baseCallback', 'lodash/internal/baseMap', 'lodash/internal/baseSortBy', 'lodash/internal/compareMultiple'], function (exports, _lodashInternalArrayMap, _lodashInternalBaseCallback, _lodashInternalBaseMap, _lodashInternalBaseSortBy, _lodashInternalCompareMultiple) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.sortByOrder` without param guards.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
+ * @param {boolean[]} orders The sort orders of `iteratees`.
+ * @returns {Array} Returns the new sorted array.
+ */
+ function baseSortByOrder(collection, iteratees, orders) {
+ var index = -1;
+
+ iteratees = (0, _lodashInternalArrayMap['default'])(iteratees, function (iteratee) {
+ return (0, _lodashInternalBaseCallback['default'])(iteratee);
+ });
+
+ var result = (0, _lodashInternalBaseMap['default'])(collection, function (value) {
+ var criteria = (0, _lodashInternalArrayMap['default'])(iteratees, function (iteratee) {
+ return iteratee(value);
+ });
+ return { 'criteria': criteria, 'index': ++index, 'value': value };
+ });
+
+ return (0, _lodashInternalBaseSortBy['default'])(result, function (object, other) {
+ return (0, _lodashInternalCompareMultiple['default'])(object, other, orders);
+ });
+ }
+
+ exports['default'] = baseSortByOrder;
+});
+define('lodash/internal/baseSum', ['exports', 'lodash/internal/baseEach'], function (exports, _lodashInternalBaseEach) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.sum` without support for callback shorthands
+ * and `this` binding.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {number} Returns the sum.
+ */
+ function baseSum(collection, iteratee) {
+ var result = 0;
+ (0, _lodashInternalBaseEach['default'])(collection, function (value, index, collection) {
+ result += +iteratee(value, index, collection) || 0;
+ });
+ return result;
+ }
+
+ exports['default'] = baseSum;
+});
+define('lodash/internal/baseToString', ['exports'], function (exports) {
+ /**
+ * Converts `value` to a string if it's not one. An empty string is returned
+ * for `null` or `undefined` values.
+ *
+ * @private
+ * @param {*} value The value to process.
+ * @returns {string} Returns the string.
+ */
+ 'use strict';
+
+ function baseToString(value) {
+ return value == null ? '' : value + '';
+ }
+
+ exports['default'] = baseToString;
+});
+define('lodash/internal/baseUniq', ['exports', 'lodash/internal/baseIndexOf', 'lodash/internal/cacheIndexOf', 'lodash/internal/createCache'], function (exports, _lodashInternalBaseIndexOf, _lodashInternalCacheIndexOf, _lodashInternalCreateCache) {
+ 'use strict';
+
+ /** Used as the size to enable large array optimizations. */
+ var LARGE_ARRAY_SIZE = 200;
+
+ /**
+ * The base implementation of `_.uniq` without support for callback shorthands
+ * and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {Function} [iteratee] The function invoked per iteration.
+ * @returns {Array} Returns the new duplicate free array.
+ */
+ function baseUniq(array, iteratee) {
+ var index = -1,
+ indexOf = _lodashInternalBaseIndexOf['default'],
+ length = array.length,
+ isCommon = true,
+ isLarge = isCommon && length >= LARGE_ARRAY_SIZE,
+ seen = isLarge ? (0, _lodashInternalCreateCache['default'])() : null,
+ result = [];
+
+ if (seen) {
+ indexOf = _lodashInternalCacheIndexOf['default'];
+ isCommon = false;
+ } else {
+ isLarge = false;
+ seen = iteratee ? [] : result;
+ }
+ outer: while (++index < length) {
+ var value = array[index],
+ computed = iteratee ? iteratee(value, index, array) : value;
+
+ if (isCommon && value === value) {
+ var seenIndex = seen.length;
+ while (seenIndex--) {
+ if (seen[seenIndex] === computed) {
+ continue outer;
+ }
+ }
+ if (iteratee) {
+ seen.push(computed);
+ }
+ result.push(value);
+ } else if (indexOf(seen, computed, 0) < 0) {
+ if (iteratee || isLarge) {
+ seen.push(computed);
+ }
+ result.push(value);
+ }
+ }
+ return result;
+ }
+
+ exports['default'] = baseUniq;
+});
+define("lodash/internal/baseValues", ["exports"], function (exports) {
+ /**
+ * The base implementation of `_.values` and `_.valuesIn` which creates an
+ * array of `object` property values corresponding to the property names
+ * of `props`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array} props The property names to get values for.
+ * @returns {Object} Returns the array of property values.
+ */
+ "use strict";
+
+ function baseValues(object, props) {
+ var index = -1,
+ length = props.length,
+ result = Array(length);
+
+ while (++index < length) {
+ result[index] = object[props[index]];
+ }
+ return result;
+ }
+
+ exports["default"] = baseValues;
+});
+define('lodash/internal/baseWhile', ['exports', 'lodash/internal/baseSlice'], function (exports, _lodashInternalBaseSlice) {
+ 'use strict';
+
+ /**
+ * The base implementation of `_.dropRightWhile`, `_.dropWhile`, `_.takeRightWhile`,
+ * and `_.takeWhile` without support for callback shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to query.
+ * @param {Function} predicate The function invoked per iteration.
+ * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Array} Returns the slice of `array`.
+ */
+ function baseWhile(array, predicate, isDrop, fromRight) {
+ var length = array.length,
+ index = fromRight ? length : -1;
+
+ while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {}
+ return isDrop ? (0, _lodashInternalBaseSlice['default'])(array, fromRight ? 0 : index, fromRight ? index + 1 : length) : (0, _lodashInternalBaseSlice['default'])(array, fromRight ? index + 1 : 0, fromRight ? length : index);
+ }
+
+ exports['default'] = baseWhile;
+});
+define('lodash/internal/baseWrapperValue', ['exports', 'lodash/internal/LazyWrapper', 'lodash/internal/arrayPush'], function (exports, _lodashInternalLazyWrapper, _lodashInternalArrayPush) {
+ 'use strict';
+
+ /**
+ * The base implementation of `wrapperValue` which returns the result of
+ * performing a sequence of actions on the unwrapped `value`, where each
+ * successive action is supplied the return value of the previous.
+ *
+ * @private
+ * @param {*} value The unwrapped value.
+ * @param {Array} actions Actions to peform to resolve the unwrapped value.
+ * @returns {*} Returns the resolved value.
+ */
+ function baseWrapperValue(value, actions) {
+ var result = value;
+ if (result instanceof _lodashInternalLazyWrapper['default']) {
+ result = result.value();
+ }
+ var index = -1,
+ length = actions.length;
+
+ while (++index < length) {
+ var action = actions[index];
+ result = action.func.apply(action.thisArg, (0, _lodashInternalArrayPush['default'])([result], action.args));
+ }
+ return result;
+ }
+
+ exports['default'] = baseWrapperValue;
+});
+define('lodash/internal/binaryIndex', ['exports', 'lodash/internal/binaryIndexBy', 'lodash/utility/identity'], function (exports, _lodashInternalBinaryIndexBy, _lodashUtilityIdentity) {
+ 'use strict';
+
+ /** Used as references for the maximum length and index of an array. */
+ var MAX_ARRAY_LENGTH = 4294967295,
+ HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
+
+ /**
+ * Performs a binary search of `array` to determine the index at which `value`
+ * should be inserted into `array` in order to maintain its sort order.
+ *
+ * @private
+ * @param {Array} array The sorted array to inspect.
+ * @param {*} value The value to evaluate.
+ * @param {boolean} [retHighest] Specify returning the highest qualified index.
+ * @returns {number} Returns the index at which `value` should be inserted
+ * into `array`.
+ */
+ function binaryIndex(array, value, retHighest) {
+ var low = 0,
+ high = array ? array.length : low;
+
+ if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
+ while (low < high) {
+ var mid = low + high >>> 1,
+ computed = array[mid];
+
+ if ((retHighest ? computed <= value : computed < value) && computed !== null) {
+ low = mid + 1;
+ } else {
+ high = mid;
+ }
+ }
+ return high;
+ }
+ return (0, _lodashInternalBinaryIndexBy['default'])(array, value, _lodashUtilityIdentity['default'], retHighest);
+ }
+
+ exports['default'] = binaryIndex;
+});
+define("lodash/internal/binaryIndexBy", ["exports"], function (exports) {
+ /* Native method references for those with the same name as other `lodash` methods. */
+ "use strict";
+
+ var nativeFloor = Math.floor,
+ nativeMin = Math.min;
+
+ /** Used as references for the maximum length and index of an array. */
+ var MAX_ARRAY_LENGTH = 4294967295,
+ MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1;
+
+ /**
+ * This function is like `binaryIndex` except that it invokes `iteratee` for
+ * `value` and each element of `array` to compute their sort ranking. The
+ * iteratee is invoked with one argument; (value).
+ *
+ * @private
+ * @param {Array} array The sorted array to inspect.
+ * @param {*} value The value to evaluate.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {boolean} [retHighest] Specify returning the highest qualified index.
+ * @returns {number} Returns the index at which `value` should be inserted
+ * into `array`.
+ */
+ function binaryIndexBy(array, value, iteratee, retHighest) {
+ value = iteratee(value);
+
+ var low = 0,
+ high = array ? array.length : 0,
+ valIsNaN = value !== value,
+ valIsNull = value === null,
+ valIsUndef = value === undefined;
+
+ while (low < high) {
+ var mid = nativeFloor((low + high) / 2),
+ computed = iteratee(array[mid]),
+ isDef = computed !== undefined,
+ isReflexive = computed === computed;
+
+ if (valIsNaN) {
+ var setLow = isReflexive || retHighest;
+ } else if (valIsNull) {
+ setLow = isReflexive && isDef && (retHighest || computed != null);
+ } else if (valIsUndef) {
+ setLow = isReflexive && (retHighest || isDef);
+ } else if (computed == null) {
+ setLow = false;
+ } else {
+ setLow = retHighest ? computed <= value : computed < value;
+ }
+ if (setLow) {
+ low = mid + 1;
+ } else {
+ high = mid;
+ }
+ }
+ return nativeMin(high, MAX_ARRAY_INDEX);
+ }
+
+ exports["default"] = binaryIndexBy;
+});
+define('lodash/internal/bindCallback', ['exports', 'lodash/utility/identity'], function (exports, _lodashUtilityIdentity) {
+ 'use strict';
+
+ /**
+ * A specialized version of `baseCallback` which only supports `this` binding
+ * and specifying the number of arguments to provide to `func`.
+ *
+ * @private
+ * @param {Function} func The function to bind.
+ * @param {*} thisArg The `this` binding of `func`.
+ * @param {number} [argCount] The number of arguments to provide to `func`.
+ * @returns {Function} Returns the callback.
+ */
+ function bindCallback(func, thisArg, argCount) {
+ if (typeof func != 'function') {
+ return _lodashUtilityIdentity['default'];
+ }
+ if (thisArg === undefined) {
+ return func;
+ }
+ switch (argCount) {
+ case 1:
+ return function (value) {
+ return func.call(thisArg, value);
+ };
+ case 3:
+ return function (value, index, collection) {
+ return func.call(thisArg, value, index, collection);
+ };
+ case 4:
+ return function (accumulator, value, index, collection) {
+ return func.call(thisArg, accumulator, value, index, collection);
+ };
+ case 5:
+ return function (value, other, key, object, source) {
+ return func.call(thisArg, value, other, key, object, source);
+ };
+ }
+ return function () {
+ return func.apply(thisArg, arguments);
+ };
+ }
+
+ exports['default'] = bindCallback;
+});
+define('lodash/internal/bufferClone', ['exports', 'lodash/internal/root'], function (exports, _lodashInternalRoot) {
+ 'use strict';
+
+ /** Native method references. */
+ var ArrayBuffer = _lodashInternalRoot['default'].ArrayBuffer,
+ Uint8Array = _lodashInternalRoot['default'].Uint8Array;
+
+ /**
+ * Creates a clone of the given array buffer.
+ *
+ * @private
+ * @param {ArrayBuffer} buffer The array buffer to clone.
+ * @returns {ArrayBuffer} Returns the cloned array buffer.
+ */
+ function bufferClone(buffer) {
+ var result = new ArrayBuffer(buffer.byteLength),
+ view = new Uint8Array(result);
+
+ view.set(new Uint8Array(buffer));
+ return result;
+ }
+
+ exports['default'] = bufferClone;
+});
+define('lodash/internal/cacheIndexOf', ['exports', 'lodash/lang/isObject'], function (exports, _lodashLangIsObject) {
+ 'use strict';
+
+ /**
+ * Checks if `value` is in `cache` mimicking the return signature of
+ * `_.indexOf` by returning `0` if the value is found, else `-1`.
+ *
+ * @private
+ * @param {Object} cache The cache to search.
+ * @param {*} value The value to search for.
+ * @returns {number} Returns `0` if `value` is found, else `-1`.
+ */
+ function cacheIndexOf(cache, value) {
+ var data = cache.data,
+ result = typeof value == 'string' || (0, _lodashLangIsObject['default'])(value) ? data.set.has(value) : data.hash[value];
+
+ return result ? 0 : -1;
+ }
+
+ exports['default'] = cacheIndexOf;
+});
+define('lodash/internal/cachePush', ['exports', 'lodash/lang/isObject'], function (exports, _lodashLangIsObject) {
+ 'use strict';
+
+ /**
+ * Adds `value` to the cache.
+ *
+ * @private
+ * @name push
+ * @memberOf SetCache
+ * @param {*} value The value to cache.
+ */
+ function cachePush(value) {
+ var data = this.data;
+ if (typeof value == 'string' || (0, _lodashLangIsObject['default'])(value)) {
+ data.set.add(value);
+ } else {
+ data.hash[value] = true;
+ }
+ }
+
+ exports['default'] = cachePush;
+});
+define("lodash/internal/charsLeftIndex", ["exports"], function (exports) {
+ /**
+ * Used by `_.trim` and `_.trimLeft` to get the index of the first character
+ * of `string` that is not found in `chars`.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @param {string} chars The characters to find.
+ * @returns {number} Returns the index of the first character not found in `chars`.
+ */
+ "use strict";
+
+ function charsLeftIndex(string, chars) {
+ var index = -1,
+ length = string.length;
+
+ while (++index < length && chars.indexOf(string.charAt(index)) > -1) {}
+ return index;
+ }
+
+ exports["default"] = charsLeftIndex;
+});
+define("lodash/internal/charsRightIndex", ["exports"], function (exports) {
+ /**
+ * Used by `_.trim` and `_.trimRight` to get the index of the last character
+ * of `string` that is not found in `chars`.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @param {string} chars The characters to find.
+ * @returns {number} Returns the index of the last character not found in `chars`.
+ */
+ "use strict";
+
+ function charsRightIndex(string, chars) {
+ var index = string.length;
+
+ while (index-- && chars.indexOf(string.charAt(index)) > -1) {}
+ return index;
+ }
+
+ exports["default"] = charsRightIndex;
+});
+define('lodash/internal/compareAscending', ['exports', 'lodash/internal/baseCompareAscending'], function (exports, _lodashInternalBaseCompareAscending) {
+ 'use strict';
+
+ /**
+ * Used by `_.sortBy` to compare transformed elements of a collection and stable
+ * sort them in ascending order.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @returns {number} Returns the sort order indicator for `object`.
+ */
+ function compareAscending(object, other) {
+ return (0, _lodashInternalBaseCompareAscending['default'])(object.criteria, other.criteria) || object.index - other.index;
+ }
+
+ exports['default'] = compareAscending;
+});
+define('lodash/internal/compareMultiple', ['exports', 'lodash/internal/baseCompareAscending'], function (exports, _lodashInternalBaseCompareAscending) {
+ 'use strict';
+
+ /**
+ * Used by `_.sortByOrder` to compare multiple properties of a value to another
+ * and stable sort them.
+ *
+ * If `orders` is unspecified, all valuess are sorted in ascending order. Otherwise,
+ * a value is sorted in ascending order if its corresponding order is "asc", and
+ * descending if "desc".
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {boolean[]} orders The order to sort by for each property.
+ * @returns {number} Returns the sort order indicator for `object`.
+ */
+ function compareMultiple(object, other, orders) {
+ var index = -1,
+ objCriteria = object.criteria,
+ othCriteria = other.criteria,
+ length = objCriteria.length,
+ ordersLength = orders.length;
+
+ while (++index < length) {
+ var result = (0, _lodashInternalBaseCompareAscending['default'])(objCriteria[index], othCriteria[index]);
+ if (result) {
+ if (index >= ordersLength) {
+ return result;
+ }
+ var order = orders[index];
+ return result * (order === 'asc' || order === true ? 1 : -1);
+ }
+ }
+ // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
+ // that causes it, under certain circumstances, to provide the same value for
+ // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
+ // for more details.
+ //
+ // This also ensures a stable sort in V8 and other engines.
+ // See https://code.google.com/p/v8/issues/detail?id=90 for more details.
+ return object.index - other.index;
+ }
+
+ exports['default'] = compareMultiple;
+});
+define("lodash/internal/composeArgs", ["exports"], function (exports) {
+ /* Native method references for those with the same name as other `lodash` methods. */
+ "use strict";
+
+ var nativeMax = Math.max;
+
+ /**
+ * Creates an array that is the composition of partially applied arguments,
+ * placeholders, and provided arguments into a single array of arguments.
+ *
+ * @private
+ * @param {Array|Object} args The provided arguments.
+ * @param {Array} partials The arguments to prepend to those provided.
+ * @param {Array} holders The `partials` placeholder indexes.
+ * @returns {Array} Returns the new array of composed arguments.
+ */
+ function composeArgs(args, partials, holders) {
+ var holdersLength = holders.length,
+ argsIndex = -1,
+ argsLength = nativeMax(args.length - holdersLength, 0),
+ leftIndex = -1,
+ leftLength = partials.length,
+ result = Array(leftLength + argsLength);
+
+ while (++leftIndex < leftLength) {
+ result[leftIndex] = partials[leftIndex];
+ }
+ while (++argsIndex < holdersLength) {
+ result[holders[argsIndex]] = args[argsIndex];
+ }
+ while (argsLength--) {
+ result[leftIndex++] = args[argsIndex++];
+ }
+ return result;
+ }
+
+ exports["default"] = composeArgs;
+});
+define("lodash/internal/composeArgsRight", ["exports"], function (exports) {
+ /* Native method references for those with the same name as other `lodash` methods. */
+ "use strict";
+
+ var nativeMax = Math.max;
+
+ /**
+ * This function is like `composeArgs` except that the arguments composition
+ * is tailored for `_.partialRight`.
+ *
+ * @private
+ * @param {Array|Object} args The provided arguments.
+ * @param {Array} partials The arguments to append to those provided.
+ * @param {Array} holders The `partials` placeholder indexes.
+ * @returns {Array} Returns the new array of composed arguments.
+ */
+ function composeArgsRight(args, partials, holders) {
+ var holdersIndex = -1,
+ holdersLength = holders.length,
+ argsIndex = -1,
+ argsLength = nativeMax(args.length - holdersLength, 0),
+ rightIndex = -1,
+ rightLength = partials.length,
+ result = Array(argsLength + rightLength);
+
+ while (++argsIndex < argsLength) {
+ result[argsIndex] = args[argsIndex];
+ }
+ var offset = argsIndex;
+ while (++rightIndex < rightLength) {
+ result[offset + rightIndex] = partials[rightIndex];
+ }
+ while (++holdersIndex < holdersLength) {
+ result[offset + holders[holdersIndex]] = args[argsIndex++];
+ }
+ return result;
+ }
+
+ exports["default"] = composeArgsRight;
+});
+define('lodash/internal/createAggregator', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseEach', 'lodash/lang/isArray'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseEach, _lodashLangIsArray) {
+ 'use strict';
+
+ /**
+ * Creates a `_.countBy`, `_.groupBy`, `_.indexBy`, or `_.partition` function.
+ *
+ * @private
+ * @param {Function} setter The function to set keys and values of the accumulator object.
+ * @param {Function} [initializer] The function to initialize the accumulator object.
+ * @returns {Function} Returns the new aggregator function.
+ */
+ function createAggregator(setter, initializer) {
+ return function (collection, iteratee, thisArg) {
+ var result = initializer ? initializer() : {};
+ iteratee = (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 3);
+
+ if ((0, _lodashLangIsArray['default'])(collection)) {
+ var index = -1,
+ length = collection.length;
+
+ while (++index < length) {
+ var value = collection[index];
+ setter(result, value, iteratee(value, index, collection), collection);
+ }
+ } else {
+ (0, _lodashInternalBaseEach['default'])(collection, function (value, key, collection) {
+ setter(result, value, iteratee(value, key, collection), collection);
+ });
+ }
+ return result;
+ };
+ }
+
+ exports['default'] = createAggregator;
+});
+define('lodash/internal/createAssigner', ['exports', 'lodash/internal/bindCallback', 'lodash/internal/isIterateeCall', 'lodash/function/restParam'], function (exports, _lodashInternalBindCallback, _lodashInternalIsIterateeCall, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /**
+ * Creates a `_.assign`, `_.defaults`, or `_.merge` function.
+ *
+ * @private
+ * @param {Function} assigner The function to assign values.
+ * @returns {Function} Returns the new assigner function.
+ */
+ function createAssigner(assigner) {
+ return (0, _lodashFunctionRestParam['default'])(function (object, sources) {
+ var index = -1,
+ length = object == null ? 0 : sources.length,
+ customizer = length > 2 ? sources[length - 2] : undefined,
+ guard = length > 2 ? sources[2] : undefined,
+ thisArg = length > 1 ? sources[length - 1] : undefined;
+
+ if (typeof customizer == 'function') {
+ customizer = (0, _lodashInternalBindCallback['default'])(customizer, thisArg, 5);
+ length -= 2;
+ } else {
+ customizer = typeof thisArg == 'function' ? thisArg : undefined;
+ length -= customizer ? 1 : 0;
+ }
+ if (guard && (0, _lodashInternalIsIterateeCall['default'])(sources[0], sources[1], guard)) {
+ customizer = length < 3 ? undefined : customizer;
+ length = 1;
+ }
+ while (++index < length) {
+ var source = sources[index];
+ if (source) {
+ assigner(object, source, customizer);
+ }
+ }
+ return object;
+ });
+ }
+
+ exports['default'] = createAssigner;
+});
+define('lodash/internal/createBaseEach', ['exports', 'lodash/internal/getLength', 'lodash/internal/isLength', 'lodash/internal/toObject'], function (exports, _lodashInternalGetLength, _lodashInternalIsLength, _lodashInternalToObject) {
+ 'use strict';
+
+ /**
+ * Creates a `baseEach` or `baseEachRight` function.
+ *
+ * @private
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new base function.
+ */
+ function createBaseEach(eachFunc, fromRight) {
+ return function (collection, iteratee) {
+ var length = collection ? (0, _lodashInternalGetLength['default'])(collection) : 0;
+ if (!(0, _lodashInternalIsLength['default'])(length)) {
+ return eachFunc(collection, iteratee);
+ }
+ var index = fromRight ? length : -1,
+ iterable = (0, _lodashInternalToObject['default'])(collection);
+
+ while (fromRight ? index-- : ++index < length) {
+ if (iteratee(iterable[index], index, iterable) === false) {
+ break;
+ }
+ }
+ return collection;
+ };
+ }
+
+ exports['default'] = createBaseEach;
+});
+define('lodash/internal/createBaseFor', ['exports', 'lodash/internal/toObject'], function (exports, _lodashInternalToObject) {
+ 'use strict';
+
+ /**
+ * Creates a base function for `_.forIn` or `_.forInRight`.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new base function.
+ */
+ function createBaseFor(fromRight) {
+ return function (object, iteratee, keysFunc) {
+ var iterable = (0, _lodashInternalToObject['default'])(object),
+ props = keysFunc(object),
+ length = props.length,
+ index = fromRight ? length : -1;
+
+ while (fromRight ? index-- : ++index < length) {
+ var key = props[index];
+ if (iteratee(iterable[key], key, iterable) === false) {
+ break;
+ }
+ }
+ return object;
+ };
+ }
+
+ exports['default'] = createBaseFor;
+});
+define('lodash/internal/createBindWrapper', ['exports', 'lodash/internal/createCtorWrapper', 'lodash/internal/root'], function (exports, _lodashInternalCreateCtorWrapper, _lodashInternalRoot) {
+ 'use strict';
+
+ /**
+ * Creates a function that wraps `func` and invokes it with the `this`
+ * binding of `thisArg`.
+ *
+ * @private
+ * @param {Function} func The function to bind.
+ * @param {*} [thisArg] The `this` binding of `func`.
+ * @returns {Function} Returns the new bound function.
+ */
+ function createBindWrapper(func, thisArg) {
+ var Ctor = (0, _lodashInternalCreateCtorWrapper['default'])(func);
+
+ function wrapper() {
+ var fn = this && this !== _lodashInternalRoot['default'] && this instanceof wrapper ? Ctor : func;
+ return fn.apply(thisArg, arguments);
+ }
+ return wrapper;
+ }
+
+ exports['default'] = createBindWrapper;
+});
+define('lodash/internal/createCache', ['exports', 'lodash/internal/SetCache', 'lodash/internal/getNative', 'lodash/internal/root'], function (exports, _lodashInternalSetCache, _lodashInternalGetNative, _lodashInternalRoot) {
+ 'use strict';
+
+ /** Native method references. */
+ var Set = (0, _lodashInternalGetNative['default'])(_lodashInternalRoot['default'], 'Set');
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeCreate = (0, _lodashInternalGetNative['default'])(Object, 'create');
+
+ /**
+ * Creates a `Set` cache object to optimize linear searches of large arrays.
+ *
+ * @private
+ * @param {Array} [values] The values to cache.
+ * @returns {null|Object} Returns the new cache object if `Set` is supported, else `null`.
+ */
+ function createCache(values) {
+ return nativeCreate && Set ? new _lodashInternalSetCache['default'](values) : null;
+ }
+
+ exports['default'] = createCache;
+});
+define('lodash/internal/createCompounder', ['exports', 'lodash/string/deburr', 'lodash/string/words'], function (exports, _lodashStringDeburr, _lodashStringWords) {
+ 'use strict';
+
+ /**
+ * Creates a function that produces compound words out of the words in a
+ * given string.
+ *
+ * @private
+ * @param {Function} callback The function to combine each word.
+ * @returns {Function} Returns the new compounder function.
+ */
+ function createCompounder(callback) {
+ return function (string) {
+ var index = -1,
+ array = (0, _lodashStringWords['default'])((0, _lodashStringDeburr['default'])(string)),
+ length = array.length,
+ result = '';
+
+ while (++index < length) {
+ result = callback(result, array[index], index);
+ }
+ return result;
+ };
+ }
+
+ exports['default'] = createCompounder;
+});
+define('lodash/internal/createCtorWrapper', ['exports', 'lodash/internal/baseCreate', 'lodash/lang/isObject'], function (exports, _lodashInternalBaseCreate, _lodashLangIsObject) {
+ 'use strict';
+
+ /**
+ * Creates a function that produces an instance of `Ctor` regardless of
+ * whether it was invoked as part of a `new` expression or by `call` or `apply`.
+ *
+ * @private
+ * @param {Function} Ctor The constructor to wrap.
+ * @returns {Function} Returns the new wrapped function.
+ */
+ function createCtorWrapper(Ctor) {
+ return function () {
+ // Use a `switch` statement to work with class constructors.
+ // See http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
+ // for more details.
+ var args = arguments;
+ switch (args.length) {
+ case 0:
+ return new Ctor();
+ case 1:
+ return new Ctor(args[0]);
+ case 2:
+ return new Ctor(args[0], args[1]);
+ case 3:
+ return new Ctor(args[0], args[1], args[2]);
+ case 4:
+ return new Ctor(args[0], args[1], args[2], args[3]);
+ case 5:
+ return new Ctor(args[0], args[1], args[2], args[3], args[4]);
+ case 6:
+ return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
+ case 7:
+ return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
+ }
+ var thisBinding = (0, _lodashInternalBaseCreate['default'])(Ctor.prototype),
+ result = Ctor.apply(thisBinding, args);
+
+ // Mimic the constructor's `return` behavior.
+ // See https://es5.github.io/#x13.2.2 for more details.
+ return (0, _lodashLangIsObject['default'])(result) ? result : thisBinding;
+ };
+ }
+
+ exports['default'] = createCtorWrapper;
+});
+define('lodash/internal/createCurry', ['exports', 'lodash/internal/createWrapper', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalCreateWrapper, _lodashInternalIsIterateeCall) {
+ 'use strict';
+
+ /**
+ * Creates a `_.curry` or `_.curryRight` function.
+ *
+ * @private
+ * @param {boolean} flag The curry bit flag.
+ * @returns {Function} Returns the new curry function.
+ */
+ function createCurry(flag) {
+ function curryFunc(func, arity, guard) {
+ if (guard && (0, _lodashInternalIsIterateeCall['default'])(func, arity, guard)) {
+ arity = undefined;
+ }
+ var result = (0, _lodashInternalCreateWrapper['default'])(func, flag, undefined, undefined, undefined, undefined, undefined, arity);
+ result.placeholder = curryFunc.placeholder;
+ return result;
+ }
+ return curryFunc;
+ }
+
+ exports['default'] = createCurry;
+});
+define('lodash/internal/createDefaults', ['exports', 'lodash/function/restParam'], function (exports, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /**
+ * Creates a `_.defaults` or `_.defaultsDeep` function.
+ *
+ * @private
+ * @param {Function} assigner The function to assign values.
+ * @param {Function} customizer The function to customize assigned values.
+ * @returns {Function} Returns the new defaults function.
+ */
+ function createDefaults(assigner, customizer) {
+ return (0, _lodashFunctionRestParam['default'])(function (args) {
+ var object = args[0];
+ if (object == null) {
+ return object;
+ }
+ args.push(customizer);
+ return assigner.apply(undefined, args);
+ });
+ }
+
+ exports['default'] = createDefaults;
+});
+define('lodash/internal/createExtremum', ['exports', 'lodash/internal/arrayExtremum', 'lodash/internal/baseCallback', 'lodash/internal/baseExtremum', 'lodash/lang/isArray', 'lodash/internal/isIterateeCall', 'lodash/internal/toIterable'], function (exports, _lodashInternalArrayExtremum, _lodashInternalBaseCallback, _lodashInternalBaseExtremum, _lodashLangIsArray, _lodashInternalIsIterateeCall, _lodashInternalToIterable) {
+ 'use strict';
+
+ /**
+ * Creates a `_.max` or `_.min` function.
+ *
+ * @private
+ * @param {Function} comparator The function used to compare values.
+ * @param {*} exValue The initial extremum value.
+ * @returns {Function} Returns the new extremum function.
+ */
+ function createExtremum(comparator, exValue) {
+ return function (collection, iteratee, thisArg) {
+ if (thisArg && (0, _lodashInternalIsIterateeCall['default'])(collection, iteratee, thisArg)) {
+ iteratee = undefined;
+ }
+ iteratee = (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 3);
+ if (iteratee.length == 1) {
+ collection = (0, _lodashLangIsArray['default'])(collection) ? collection : (0, _lodashInternalToIterable['default'])(collection);
+ var result = (0, _lodashInternalArrayExtremum['default'])(collection, iteratee, comparator, exValue);
+ if (!(collection.length && result === exValue)) {
+ return result;
+ }
+ }
+ return (0, _lodashInternalBaseExtremum['default'])(collection, iteratee, comparator, exValue);
+ };
+ }
+
+ exports['default'] = createExtremum;
+});
+define('lodash/internal/createFind', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseFind', 'lodash/internal/baseFindIndex', 'lodash/lang/isArray'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseFind, _lodashInternalBaseFindIndex, _lodashLangIsArray) {
+ 'use strict';
+
+ /**
+ * Creates a `_.find` or `_.findLast` function.
+ *
+ * @private
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new find function.
+ */
+ function createFind(eachFunc, fromRight) {
+ return function (collection, predicate, thisArg) {
+ predicate = (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3);
+ if ((0, _lodashLangIsArray['default'])(collection)) {
+ var index = (0, _lodashInternalBaseFindIndex['default'])(collection, predicate, fromRight);
+ return index > -1 ? collection[index] : undefined;
+ }
+ return (0, _lodashInternalBaseFind['default'])(collection, predicate, eachFunc);
+ };
+ }
+
+ exports['default'] = createFind;
+});
+define('lodash/internal/createFindIndex', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseFindIndex'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseFindIndex) {
+ 'use strict';
+
+ /**
+ * Creates a `_.findIndex` or `_.findLastIndex` function.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new find function.
+ */
+ function createFindIndex(fromRight) {
+ return function (array, predicate, thisArg) {
+ if (!(array && array.length)) {
+ return -1;
+ }
+ predicate = (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3);
+ return (0, _lodashInternalBaseFindIndex['default'])(array, predicate, fromRight);
+ };
+ }
+
+ exports['default'] = createFindIndex;
+});
+define('lodash/internal/createFindKey', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseFind'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseFind) {
+ 'use strict';
+
+ /**
+ * Creates a `_.findKey` or `_.findLastKey` function.
+ *
+ * @private
+ * @param {Function} objectFunc The function to iterate over an object.
+ * @returns {Function} Returns the new find function.
+ */
+ function createFindKey(objectFunc) {
+ return function (object, predicate, thisArg) {
+ predicate = (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3);
+ return (0, _lodashInternalBaseFind['default'])(object, predicate, objectFunc, true);
+ };
+ }
+
+ exports['default'] = createFindKey;
+});
+define('lodash/internal/createFlow', ['exports', 'lodash/internal/LodashWrapper', 'lodash/internal/getData', 'lodash/internal/getFuncName', 'lodash/lang/isArray', 'lodash/internal/isLaziable'], function (exports, _lodashInternalLodashWrapper, _lodashInternalGetData, _lodashInternalGetFuncName, _lodashLangIsArray, _lodashInternalIsLaziable) {
+ 'use strict';
+
+ /** Used to compose bitmasks for wrapper metadata. */
+ var CURRY_FLAG = 8,
+ PARTIAL_FLAG = 32,
+ ARY_FLAG = 128,
+ REARG_FLAG = 256;
+
+ /** Used as the size to enable large array optimizations. */
+ var LARGE_ARRAY_SIZE = 200;
+
+ /** Used as the `TypeError` message for "Functions" methods. */
+ var FUNC_ERROR_TEXT = 'Expected a function';
+
+ /**
+ * Creates a `_.flow` or `_.flowRight` function.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new flow function.
+ */
+ function createFlow(fromRight) {
+ return function () {
+ var wrapper,
+ length = arguments.length,
+ index = fromRight ? length : -1,
+ leftIndex = 0,
+ funcs = Array(length);
+
+ while (fromRight ? index-- : ++index < length) {
+ var func = funcs[leftIndex++] = arguments[index];
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ if (!wrapper && _lodashInternalLodashWrapper['default'].prototype.thru && (0, _lodashInternalGetFuncName['default'])(func) == 'wrapper') {
+ wrapper = new _lodashInternalLodashWrapper['default']([], true);
+ }
+ }
+ index = wrapper ? -1 : length;
+ while (++index < length) {
+ func = funcs[index];
+
+ var funcName = (0, _lodashInternalGetFuncName['default'])(func),
+ data = funcName == 'wrapper' ? (0, _lodashInternalGetData['default'])(func) : undefined;
+
+ if (data && (0, _lodashInternalIsLaziable['default'])(data[0]) && data[1] == (ARY_FLAG | CURRY_FLAG | PARTIAL_FLAG | REARG_FLAG) && !data[4].length && data[9] == 1) {
+ wrapper = wrapper[(0, _lodashInternalGetFuncName['default'])(data[0])].apply(wrapper, data[3]);
+ } else {
+ wrapper = func.length == 1 && (0, _lodashInternalIsLaziable['default'])(func) ? wrapper[funcName]() : wrapper.thru(func);
+ }
+ }
+ return function () {
+ var args = arguments,
+ value = args[0];
+
+ if (wrapper && args.length == 1 && (0, _lodashLangIsArray['default'])(value) && value.length >= LARGE_ARRAY_SIZE) {
+ return wrapper.plant(value).value();
+ }
+ var index = 0,
+ result = length ? funcs[index].apply(this, args) : value;
+
+ while (++index < length) {
+ result = funcs[index].call(this, result);
+ }
+ return result;
+ };
+ };
+ }
+
+ exports['default'] = createFlow;
+});
+define('lodash/internal/createForEach', ['exports', 'lodash/internal/bindCallback', 'lodash/lang/isArray'], function (exports, _lodashInternalBindCallback, _lodashLangIsArray) {
+ 'use strict';
+
+ /**
+ * Creates a function for `_.forEach` or `_.forEachRight`.
+ *
+ * @private
+ * @param {Function} arrayFunc The function to iterate over an array.
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @returns {Function} Returns the new each function.
+ */
+ function createForEach(arrayFunc, eachFunc) {
+ return function (collection, iteratee, thisArg) {
+ return typeof iteratee == 'function' && thisArg === undefined && (0, _lodashLangIsArray['default'])(collection) ? arrayFunc(collection, iteratee) : eachFunc(collection, (0, _lodashInternalBindCallback['default'])(iteratee, thisArg, 3));
+ };
+ }
+
+ exports['default'] = createForEach;
+});
+define('lodash/internal/createForIn', ['exports', 'lodash/internal/bindCallback', 'lodash/object/keysIn'], function (exports, _lodashInternalBindCallback, _lodashObjectKeysIn) {
+ 'use strict';
+
+ /**
+ * Creates a function for `_.forIn` or `_.forInRight`.
+ *
+ * @private
+ * @param {Function} objectFunc The function to iterate over an object.
+ * @returns {Function} Returns the new each function.
+ */
+ function createForIn(objectFunc) {
+ return function (object, iteratee, thisArg) {
+ if (typeof iteratee != 'function' || thisArg !== undefined) {
+ iteratee = (0, _lodashInternalBindCallback['default'])(iteratee, thisArg, 3);
+ }
+ return objectFunc(object, iteratee, _lodashObjectKeysIn['default']);
+ };
+ }
+
+ exports['default'] = createForIn;
+});
+define('lodash/internal/createForOwn', ['exports', 'lodash/internal/bindCallback'], function (exports, _lodashInternalBindCallback) {
+ 'use strict';
+
+ /**
+ * Creates a function for `_.forOwn` or `_.forOwnRight`.
+ *
+ * @private
+ * @param {Function} objectFunc The function to iterate over an object.
+ * @returns {Function} Returns the new each function.
+ */
+ function createForOwn(objectFunc) {
+ return function (object, iteratee, thisArg) {
+ if (typeof iteratee != 'function' || thisArg !== undefined) {
+ iteratee = (0, _lodashInternalBindCallback['default'])(iteratee, thisArg, 3);
+ }
+ return objectFunc(object, iteratee);
+ };
+ }
+
+ exports['default'] = createForOwn;
+});
+define('lodash/internal/createHybridWrapper', ['exports', 'lodash/internal/arrayCopy', 'lodash/internal/composeArgs', 'lodash/internal/composeArgsRight', 'lodash/internal/createCtorWrapper', 'lodash/internal/isLaziable', 'lodash/internal/reorder', 'lodash/internal/replaceHolders', 'lodash/internal/root', 'lodash/internal/setData'], function (exports, _lodashInternalArrayCopy, _lodashInternalComposeArgs, _lodashInternalComposeArgsRight, _lodashInternalCreateCtorWrapper, _lodashInternalIsLaziable, _lodashInternalReorder, _lodashInternalReplaceHolders, _lodashInternalRoot, _lodashInternalSetData) {
+ 'use strict';
+
+ /** Used to compose bitmasks for wrapper metadata. */
+ var BIND_FLAG = 1,
+ BIND_KEY_FLAG = 2,
+ CURRY_BOUND_FLAG = 4,
+ CURRY_FLAG = 8,
+ CURRY_RIGHT_FLAG = 16,
+ PARTIAL_FLAG = 32,
+ PARTIAL_RIGHT_FLAG = 64,
+ ARY_FLAG = 128;
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeMax = Math.max;
+
+ /**
+ * Creates a function that wraps `func` and invokes it with optional `this`
+ * binding of, partial application, and currying.
+ *
+ * @private
+ * @param {Function|string} func The function or method name to reference.
+ * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.
+ * @param {*} [thisArg] The `this` binding of `func`.
+ * @param {Array} [partials] The arguments to prepend to those provided to the new function.
+ * @param {Array} [holders] The `partials` placeholder indexes.
+ * @param {Array} [partialsRight] The arguments to append to those provided to the new function.
+ * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
+ * @param {Array} [argPos] The argument positions of the new function.
+ * @param {number} [ary] The arity cap of `func`.
+ * @param {number} [arity] The arity of `func`.
+ * @returns {Function} Returns the new wrapped function.
+ */
+ function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
+ var isAry = bitmask & ARY_FLAG,
+ isBind = bitmask & BIND_FLAG,
+ isBindKey = bitmask & BIND_KEY_FLAG,
+ isCurry = bitmask & CURRY_FLAG,
+ isCurryBound = bitmask & CURRY_BOUND_FLAG,
+ isCurryRight = bitmask & CURRY_RIGHT_FLAG,
+ Ctor = isBindKey ? undefined : (0, _lodashInternalCreateCtorWrapper['default'])(func);
+
+ function wrapper() {
+ // Avoid `arguments` object use disqualifying optimizations by
+ // converting it to an array before providing it to other functions.
+ var length = arguments.length,
+ index = length,
+ args = Array(length);
+
+ while (index--) {
+ args[index] = arguments[index];
+ }
+ if (partials) {
+ args = (0, _lodashInternalComposeArgs['default'])(args, partials, holders);
+ }
+ if (partialsRight) {
+ args = (0, _lodashInternalComposeArgsRight['default'])(args, partialsRight, holdersRight);
+ }
+ if (isCurry || isCurryRight) {
+ var placeholder = wrapper.placeholder,
+ argsHolders = (0, _lodashInternalReplaceHolders['default'])(args, placeholder);
+
+ length -= argsHolders.length;
+ if (length < arity) {
+ var newArgPos = argPos ? (0, _lodashInternalArrayCopy['default'])(argPos) : undefined,
+ newArity = nativeMax(arity - length, 0),
+ newsHolders = isCurry ? argsHolders : undefined,
+ newHoldersRight = isCurry ? undefined : argsHolders,
+ newPartials = isCurry ? args : undefined,
+ newPartialsRight = isCurry ? undefined : args;
+
+ bitmask |= isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG;
+ bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG);
+
+ if (!isCurryBound) {
+ bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);
+ }
+ var newData = [func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity],
+ result = createHybridWrapper.apply(undefined, newData);
+
+ if ((0, _lodashInternalIsLaziable['default'])(func)) {
+ (0, _lodashInternalSetData['default'])(result, newData);
+ }
+ result.placeholder = placeholder;
+ return result;
+ }
+ }
+ var thisBinding = isBind ? thisArg : this,
+ fn = isBindKey ? thisBinding[func] : func;
+
+ if (argPos) {
+ args = (0, _lodashInternalReorder['default'])(args, argPos);
+ }
+ if (isAry && ary < args.length) {
+ args.length = ary;
+ }
+ if (this && this !== _lodashInternalRoot['default'] && this instanceof wrapper) {
+ fn = Ctor || (0, _lodashInternalCreateCtorWrapper['default'])(func);
+ }
+ return fn.apply(thisBinding, args);
+ }
+ return wrapper;
+ }
+
+ exports['default'] = createHybridWrapper;
+});
+define('lodash/internal/createObjectMapper', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseForOwn'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseForOwn) {
+ 'use strict';
+
+ /**
+ * Creates a function for `_.mapKeys` or `_.mapValues`.
+ *
+ * @private
+ * @param {boolean} [isMapKeys] Specify mapping keys instead of values.
+ * @returns {Function} Returns the new map function.
+ */
+ function createObjectMapper(isMapKeys) {
+ return function (object, iteratee, thisArg) {
+ var result = {};
+ iteratee = (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 3);
+
+ (0, _lodashInternalBaseForOwn['default'])(object, function (value, key, object) {
+ var mapped = iteratee(value, key, object);
+ key = isMapKeys ? mapped : key;
+ value = isMapKeys ? value : mapped;
+ result[key] = value;
+ });
+ return result;
+ };
+ }
+
+ exports['default'] = createObjectMapper;
+});
+define('lodash/internal/createPadDir', ['exports', 'lodash/internal/baseToString', 'lodash/internal/createPadding'], function (exports, _lodashInternalBaseToString, _lodashInternalCreatePadding) {
+ 'use strict';
+
+ /**
+ * Creates a function for `_.padLeft` or `_.padRight`.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify padding from the right.
+ * @returns {Function} Returns the new pad function.
+ */
+ function createPadDir(fromRight) {
+ return function (string, length, chars) {
+ string = (0, _lodashInternalBaseToString['default'])(string);
+ return (fromRight ? string : '') + (0, _lodashInternalCreatePadding['default'])(string, length, chars) + (fromRight ? '' : string);
+ };
+ }
+
+ exports['default'] = createPadDir;
+});
+define('lodash/internal/createPadding', ['exports', 'lodash/string/repeat', 'lodash/internal/root'], function (exports, _lodashStringRepeat, _lodashInternalRoot) {
+ 'use strict';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeCeil = Math.ceil,
+ nativeIsFinite = _lodashInternalRoot['default'].isFinite;
+
+ /**
+ * Creates the padding required for `string` based on the given `length`.
+ * The `chars` string is truncated if the number of characters exceeds `length`.
+ *
+ * @private
+ * @param {string} string The string to create padding for.
+ * @param {number} [length=0] The padding length.
+ * @param {string} [chars=' '] The string used as padding.
+ * @returns {string} Returns the pad for `string`.
+ */
+ function createPadding(string, length, chars) {
+ var strLength = string.length;
+ length = +length;
+
+ if (strLength >= length || !nativeIsFinite(length)) {
+ return '';
+ }
+ var padLength = length - strLength;
+ chars = chars == null ? ' ' : chars + '';
+ return (0, _lodashStringRepeat['default'])(chars, nativeCeil(padLength / chars.length)).slice(0, padLength);
+ }
+
+ exports['default'] = createPadding;
+});
+define('lodash/internal/createPartial', ['exports', 'lodash/internal/createWrapper', 'lodash/internal/replaceHolders', 'lodash/function/restParam'], function (exports, _lodashInternalCreateWrapper, _lodashInternalReplaceHolders, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /**
+ * Creates a `_.partial` or `_.partialRight` function.
+ *
+ * @private
+ * @param {boolean} flag The partial bit flag.
+ * @returns {Function} Returns the new partial function.
+ */
+ function createPartial(flag) {
+ var partialFunc = (0, _lodashFunctionRestParam['default'])(function (func, partials) {
+ var holders = (0, _lodashInternalReplaceHolders['default'])(partials, partialFunc.placeholder);
+ return (0, _lodashInternalCreateWrapper['default'])(func, flag, undefined, partials, holders);
+ });
+ return partialFunc;
+ }
+
+ exports['default'] = createPartial;
+});
+define('lodash/internal/createPartialWrapper', ['exports', 'lodash/internal/createCtorWrapper', 'lodash/internal/root'], function (exports, _lodashInternalCreateCtorWrapper, _lodashInternalRoot) {
+ 'use strict';
+
+ /** Used to compose bitmasks for wrapper metadata. */
+ var BIND_FLAG = 1;
+
+ /**
+ * Creates a function that wraps `func` and invokes it with the optional `this`
+ * binding of `thisArg` and the `partials` prepended to those provided to
+ * the wrapper.
+ *
+ * @private
+ * @param {Function} func The function to partially apply arguments to.
+ * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.
+ * @param {*} thisArg The `this` binding of `func`.
+ * @param {Array} partials The arguments to prepend to those provided to the new function.
+ * @returns {Function} Returns the new bound function.
+ */
+ function createPartialWrapper(func, bitmask, thisArg, partials) {
+ var isBind = bitmask & BIND_FLAG,
+ Ctor = (0, _lodashInternalCreateCtorWrapper['default'])(func);
+
+ function wrapper() {
+ // Avoid `arguments` object use disqualifying optimizations by
+ // converting it to an array before providing it `func`.
+ var argsIndex = -1,
+ argsLength = arguments.length,
+ leftIndex = -1,
+ leftLength = partials.length,
+ args = Array(leftLength + argsLength);
+
+ while (++leftIndex < leftLength) {
+ args[leftIndex] = partials[leftIndex];
+ }
+ while (argsLength--) {
+ args[leftIndex++] = arguments[++argsIndex];
+ }
+ var fn = this && this !== _lodashInternalRoot['default'] && this instanceof wrapper ? Ctor : func;
+ return fn.apply(isBind ? thisArg : this, args);
+ }
+ return wrapper;
+ }
+
+ exports['default'] = createPartialWrapper;
+});
+define('lodash/internal/createReduce', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseReduce', 'lodash/lang/isArray'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseReduce, _lodashLangIsArray) {
+ 'use strict';
+
+ /**
+ * Creates a function for `_.reduce` or `_.reduceRight`.
+ *
+ * @private
+ * @param {Function} arrayFunc The function to iterate over an array.
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @returns {Function} Returns the new each function.
+ */
+ function createReduce(arrayFunc, eachFunc) {
+ return function (collection, iteratee, accumulator, thisArg) {
+ var initFromArray = arguments.length < 3;
+ return typeof iteratee == 'function' && thisArg === undefined && (0, _lodashLangIsArray['default'])(collection) ? arrayFunc(collection, iteratee, accumulator, initFromArray) : (0, _lodashInternalBaseReduce['default'])(collection, (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 4), accumulator, initFromArray, eachFunc);
+ };
+ }
+
+ exports['default'] = createReduce;
+});
+define("lodash/internal/createRound", ["exports"], function (exports) {
+ /** Native method references. */
+ "use strict";
+
+ var pow = Math.pow;
+
+ /**
+ * Creates a `_.ceil`, `_.floor`, or `_.round` function.
+ *
+ * @private
+ * @param {string} methodName The name of the `Math` method to use when rounding.
+ * @returns {Function} Returns the new round function.
+ */
+ function createRound(methodName) {
+ var func = Math[methodName];
+ return function (number, precision) {
+ precision = precision === undefined ? 0 : +precision || 0;
+ if (precision) {
+ precision = pow(10, precision);
+ return func(number * precision) / precision;
+ }
+ return func(number);
+ };
+ }
+
+ exports["default"] = createRound;
+});
+define('lodash/internal/createSortedIndex', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/binaryIndex', 'lodash/internal/binaryIndexBy'], function (exports, _lodashInternalBaseCallback, _lodashInternalBinaryIndex, _lodashInternalBinaryIndexBy) {
+ 'use strict';
+
+ /**
+ * Creates a `_.sortedIndex` or `_.sortedLastIndex` function.
+ *
+ * @private
+ * @param {boolean} [retHighest] Specify returning the highest qualified index.
+ * @returns {Function} Returns the new index function.
+ */
+ function createSortedIndex(retHighest) {
+ return function (array, value, iteratee, thisArg) {
+ return iteratee == null ? (0, _lodashInternalBinaryIndex['default'])(array, value, retHighest) : (0, _lodashInternalBinaryIndexBy['default'])(array, value, (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 1), retHighest);
+ };
+ }
+
+ exports['default'] = createSortedIndex;
+});
+define('lodash/internal/createWrapper', ['exports', 'lodash/internal/baseSetData', 'lodash/internal/createBindWrapper', 'lodash/internal/createHybridWrapper', 'lodash/internal/createPartialWrapper', 'lodash/internal/getData', 'lodash/internal/mergeData', 'lodash/internal/setData'], function (exports, _lodashInternalBaseSetData, _lodashInternalCreateBindWrapper, _lodashInternalCreateHybridWrapper, _lodashInternalCreatePartialWrapper, _lodashInternalGetData, _lodashInternalMergeData, _lodashInternalSetData) {
+ 'use strict';
+
+ /** Used to compose bitmasks for wrapper metadata. */
+ var BIND_FLAG = 1,
+ BIND_KEY_FLAG = 2,
+ PARTIAL_FLAG = 32,
+ PARTIAL_RIGHT_FLAG = 64;
+
+ /** Used as the `TypeError` message for "Functions" methods. */
+ var FUNC_ERROR_TEXT = 'Expected a function';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeMax = Math.max;
+
+ /**
+ * Creates a function that either curries or invokes `func` with optional
+ * `this` binding and partially applied arguments.
+ *
+ * @private
+ * @param {Function|string} func The function or method name to reference.
+ * @param {number} bitmask The bitmask of flags.
+ * The bitmask may be composed of the following flags:
+ * 1 - `_.bind`
+ * 2 - `_.bindKey`
+ * 4 - `_.curry` or `_.curryRight` of a bound function
+ * 8 - `_.curry`
+ * 16 - `_.curryRight`
+ * 32 - `_.partial`
+ * 64 - `_.partialRight`
+ * 128 - `_.rearg`
+ * 256 - `_.ary`
+ * @param {*} [thisArg] The `this` binding of `func`.
+ * @param {Array} [partials] The arguments to be partially applied.
+ * @param {Array} [holders] The `partials` placeholder indexes.
+ * @param {Array} [argPos] The argument positions of the new function.
+ * @param {number} [ary] The arity cap of `func`.
+ * @param {number} [arity] The arity of `func`.
+ * @returns {Function} Returns the new wrapped function.
+ */
+ function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
+ var isBindKey = bitmask & BIND_KEY_FLAG;
+ if (!isBindKey && typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ var length = partials ? partials.length : 0;
+ if (!length) {
+ bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);
+ partials = holders = undefined;
+ }
+ length -= holders ? holders.length : 0;
+ if (bitmask & PARTIAL_RIGHT_FLAG) {
+ var partialsRight = partials,
+ holdersRight = holders;
+
+ partials = holders = undefined;
+ }
+ var data = isBindKey ? undefined : (0, _lodashInternalGetData['default'])(func),
+ newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];
+
+ if (data) {
+ (0, _lodashInternalMergeData['default'])(newData, data);
+ bitmask = newData[1];
+ arity = newData[9];
+ }
+ newData[9] = arity == null ? isBindKey ? 0 : func.length : nativeMax(arity - length, 0) || 0;
+
+ if (bitmask == BIND_FLAG) {
+ var result = (0, _lodashInternalCreateBindWrapper['default'])(newData[0], newData[2]);
+ } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !newData[4].length) {
+ result = _lodashInternalCreatePartialWrapper['default'].apply(undefined, newData);
+ } else {
+ result = _lodashInternalCreateHybridWrapper['default'].apply(undefined, newData);
+ }
+ var setter = data ? _lodashInternalBaseSetData['default'] : _lodashInternalSetData['default'];
+ return setter(result, newData);
+ }
+
+ exports['default'] = createWrapper;
+});
+define('lodash/internal/deburrLetter', ['exports'], function (exports) {
+ /** Used to map latin-1 supplementary letters to basic latin letters. */
+ 'use strict';
+
+ var deburredLetters = {
+ '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
+ '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
+ '\xc7': 'C', '\xe7': 'c',
+ '\xd0': 'D', '\xf0': 'd',
+ '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
+ '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
+ '\xcC': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
+ '\xeC': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i',
+ '\xd1': 'N', '\xf1': 'n',
+ '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
+ '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
+ '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
+ '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
+ '\xdd': 'Y', '\xfd': 'y', '\xff': 'y',
+ '\xc6': 'Ae', '\xe6': 'ae',
+ '\xde': 'Th', '\xfe': 'th',
+ '\xdf': 'ss'
+ };
+
+ /**
+ * Used by `_.deburr` to convert latin-1 supplementary letters to basic latin letters.
+ *
+ * @private
+ * @param {string} letter The matched letter to deburr.
+ * @returns {string} Returns the deburred letter.
+ */
+ function deburrLetter(letter) {
+ return deburredLetters[letter];
+ }
+
+ exports['default'] = deburrLetter;
+});
+define('lodash/internal/equalArrays', ['exports', 'lodash/internal/arraySome'], function (exports, _lodashInternalArraySome) {
+ 'use strict';
+
+ /**
+ * A specialized version of `baseIsEqualDeep` for arrays with support for
+ * partial deep comparisons.
+ *
+ * @private
+ * @param {Array} array The array to compare.
+ * @param {Array} other The other array to compare.
+ * @param {Function} equalFunc The function to determine equivalents of values.
+ * @param {Function} [customizer] The function to customize comparing arrays.
+ * @param {boolean} [isLoose] Specify performing partial comparisons.
+ * @param {Array} [stackA] Tracks traversed `value` objects.
+ * @param {Array} [stackB] Tracks traversed `other` objects.
+ * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
+ */
+ function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {
+ var index = -1,
+ arrLength = array.length,
+ othLength = other.length;
+
+ if (arrLength != othLength && !(isLoose && othLength > arrLength)) {
+ return false;
+ }
+ // Ignore non-index properties.
+ while (++index < arrLength) {
+ var arrValue = array[index],
+ othValue = other[index],
+ result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined;
+
+ if (result !== undefined) {
+ if (result) {
+ continue;
+ }
+ return false;
+ }
+ // Recursively compare arrays (susceptible to call stack limits).
+ if (isLoose) {
+ if (!(0, _lodashInternalArraySome['default'])(other, function (othValue) {
+ return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
+ })) {
+ return false;
+ }
+ } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ exports['default'] = equalArrays;
+});
+define('lodash/internal/equalByTag', ['exports'], function (exports) {
+ /** `Object#toString` result references. */
+ 'use strict';
+
+ var boolTag = '[object Boolean]',
+ dateTag = '[object Date]',
+ errorTag = '[object Error]',
+ numberTag = '[object Number]',
+ regexpTag = '[object RegExp]',
+ stringTag = '[object String]';
+
+ /**
+ * A specialized version of `baseIsEqualDeep` for comparing objects of
+ * the same `toStringTag`.
+ *
+ * **Note:** This function only supports comparing values with tags of
+ * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {string} tag The `toStringTag` of the objects to compare.
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+ */
+ function equalByTag(object, other, tag) {
+ switch (tag) {
+ case boolTag:
+ case dateTag:
+ // Coerce dates and booleans to numbers, dates to milliseconds and booleans
+ // to `1` or `0` treating invalid dates coerced to `NaN` as not equal.
+ return +object == +other;
+
+ case errorTag:
+ return object.name == other.name && object.message == other.message;
+
+ case numberTag:
+ // Treat `NaN` vs. `NaN` as equal.
+ return object != +object ? other != +other : object == +other;
+
+ case regexpTag:
+ case stringTag:
+ // Coerce regexes to strings and treat strings primitives and string
+ // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.
+ return object == other + '';
+ }
+ return false;
+ }
+
+ exports['default'] = equalByTag;
+});
+define('lodash/internal/equalObjects', ['exports', 'lodash/object/keys'], function (exports, _lodashObjectKeys) {
+ 'use strict';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty = objectProto.hasOwnProperty;
+
+ /**
+ * A specialized version of `baseIsEqualDeep` for objects with support for
+ * partial deep comparisons.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {Function} equalFunc The function to determine equivalents of values.
+ * @param {Function} [customizer] The function to customize comparing values.
+ * @param {boolean} [isLoose] Specify performing partial comparisons.
+ * @param {Array} [stackA] Tracks traversed `value` objects.
+ * @param {Array} [stackB] Tracks traversed `other` objects.
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+ */
+ function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
+ var objProps = (0, _lodashObjectKeys['default'])(object),
+ objLength = objProps.length,
+ othProps = (0, _lodashObjectKeys['default'])(other),
+ othLength = othProps.length;
+
+ if (objLength != othLength && !isLoose) {
+ return false;
+ }
+ var index = objLength;
+ while (index--) {
+ var key = objProps[index];
+ if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {
+ return false;
+ }
+ }
+ var skipCtor = isLoose;
+ while (++index < objLength) {
+ key = objProps[index];
+ var objValue = object[key],
+ othValue = other[key],
+ result = customizer ? customizer(isLoose ? othValue : objValue, isLoose ? objValue : othValue, key) : undefined;
+
+ // Recursively compare objects (susceptible to call stack limits).
+ if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) {
+ return false;
+ }
+ skipCtor || (skipCtor = key == 'constructor');
+ }
+ if (!skipCtor) {
+ var objCtor = object.constructor,
+ othCtor = other.constructor;
+
+ // Non `Object` object instances with different constructors are not equal.
+ if (objCtor != othCtor && 'constructor' in object && 'constructor' in other && !(typeof objCtor == 'function' && objCtor instanceof objCtor && typeof othCtor == 'function' && othCtor instanceof othCtor)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ exports['default'] = equalObjects;
+});
+define('lodash/internal/escapeHtmlChar', ['exports'], function (exports) {
+ /** Used to map characters to HTML entities. */
+ 'use strict';
+
+ var htmlEscapes = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": ''',
+ '`': '`'
+ };
+
+ /**
+ * Used by `_.escape` to convert characters to HTML entities.
+ *
+ * @private
+ * @param {string} chr The matched character to escape.
+ * @returns {string} Returns the escaped character.
+ */
+ function escapeHtmlChar(chr) {
+ return htmlEscapes[chr];
+ }
+
+ exports['default'] = escapeHtmlChar;
+});
+define('lodash/internal/escapeRegExpChar', ['exports'], function (exports) {
+ /** Used to escape characters for inclusion in compiled regexes. */
+ 'use strict';
+
+ var regexpEscapes = {
+ '0': 'x30', '1': 'x31', '2': 'x32', '3': 'x33', '4': 'x34',
+ '5': 'x35', '6': 'x36', '7': 'x37', '8': 'x38', '9': 'x39',
+ 'A': 'x41', 'B': 'x42', 'C': 'x43', 'D': 'x44', 'E': 'x45', 'F': 'x46',
+ 'a': 'x61', 'b': 'x62', 'c': 'x63', 'd': 'x64', 'e': 'x65', 'f': 'x66',
+ 'n': 'x6e', 'r': 'x72', 't': 'x74', 'u': 'x75', 'v': 'x76', 'x': 'x78'
+ };
+
+ /** Used to escape characters for inclusion in compiled string literals. */
+ var stringEscapes = {
+ '\\': '\\',
+ "'": "'",
+ '\n': 'n',
+ '\r': 'r',
+ '\u2028': 'u2028',
+ '\u2029': 'u2029'
+ };
+
+ /**
+ * Used by `_.escapeRegExp` to escape characters for inclusion in compiled regexes.
+ *
+ * @private
+ * @param {string} chr The matched character to escape.
+ * @param {string} leadingChar The capture group for a leading character.
+ * @param {string} whitespaceChar The capture group for a whitespace character.
+ * @returns {string} Returns the escaped character.
+ */
+ function escapeRegExpChar(chr, leadingChar, whitespaceChar) {
+ if (leadingChar) {
+ chr = regexpEscapes[chr];
+ } else if (whitespaceChar) {
+ chr = stringEscapes[chr];
+ }
+ return '\\' + chr;
+ }
+
+ exports['default'] = escapeRegExpChar;
+});
+define('lodash/internal/escapeStringChar', ['exports'], function (exports) {
+ /** Used to escape characters for inclusion in compiled string literals. */
+ 'use strict';
+
+ var stringEscapes = {
+ '\\': '\\',
+ "'": "'",
+ '\n': 'n',
+ '\r': 'r',
+ '\u2028': 'u2028',
+ '\u2029': 'u2029'
+ };
+
+ /**
+ * Used by `_.template` to escape characters for inclusion in compiled string literals.
+ *
+ * @private
+ * @param {string} chr The matched character to escape.
+ * @returns {string} Returns the escaped character.
+ */
+ function escapeStringChar(chr) {
+ return '\\' + stringEscapes[chr];
+ }
+
+ exports['default'] = escapeStringChar;
+});
+define('lodash/internal/getData', ['exports', 'lodash/internal/metaMap', 'lodash/utility/noop'], function (exports, _lodashInternalMetaMap, _lodashUtilityNoop) {
+ 'use strict';
+
+ /**
+ * Gets metadata for `func`.
+ *
+ * @private
+ * @param {Function} func The function to query.
+ * @returns {*} Returns the metadata for `func`.
+ */
+ var getData = !_lodashInternalMetaMap['default'] ? _lodashUtilityNoop['default'] : function (func) {
+ return _lodashInternalMetaMap['default'].get(func);
+ };
+
+ exports['default'] = getData;
+});
+define('lodash/internal/getFuncName', ['exports', 'lodash/internal/realNames'], function (exports, _lodashInternalRealNames) {
+ 'use strict';
+
+ /**
+ * Gets the name of `func`.
+ *
+ * @private
+ * @param {Function} func The function to query.
+ * @returns {string} Returns the function name.
+ */
+ function getFuncName(func) {
+ var result = func.name + '',
+ array = _lodashInternalRealNames['default'][result],
+ length = array ? array.length : 0;
+
+ while (length--) {
+ var data = array[length],
+ otherFunc = data.func;
+ if (otherFunc == null || otherFunc == func) {
+ return data.name;
+ }
+ }
+ return result;
+ }
+
+ exports['default'] = getFuncName;
+});
+define('lodash/internal/getLength', ['exports', 'lodash/internal/baseProperty'], function (exports, _lodashInternalBaseProperty) {
+ 'use strict';
+
+ /**
+ * Gets the "length" property value of `object`.
+ *
+ * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
+ * that affects Safari on at least iOS 8.1-8.3 ARM64.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {*} Returns the "length" value.
+ */
+ var getLength = (0, _lodashInternalBaseProperty['default'])('length');
+
+ exports['default'] = getLength;
+});
+define('lodash/internal/getMatchData', ['exports', 'lodash/internal/isStrictComparable', 'lodash/object/pairs'], function (exports, _lodashInternalIsStrictComparable, _lodashObjectPairs) {
+ 'use strict';
+
+ /**
+ * Gets the propery names, values, and compare flags of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the match data of `object`.
+ */
+ function getMatchData(object) {
+ var result = (0, _lodashObjectPairs['default'])(object),
+ length = result.length;
+
+ while (length--) {
+ result[length][2] = (0, _lodashInternalIsStrictComparable['default'])(result[length][1]);
+ }
+ return result;
+ }
+
+ exports['default'] = getMatchData;
+});
+define('lodash/internal/getNative', ['exports', 'lodash/lang/isNative'], function (exports, _lodashLangIsNative) {
+ 'use strict';
+
+ /**
+ * Gets the native function at `key` of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {string} key The key of the method to get.
+ * @returns {*} Returns the function if it's native, else `undefined`.
+ */
+ function getNative(object, key) {
+ var value = object == null ? undefined : object[key];
+ return (0, _lodashLangIsNative['default'])(value) ? value : undefined;
+ }
+
+ exports['default'] = getNative;
+});
+define('lodash/internal/getView', ['exports'], function (exports) {
+ /* Native method references for those with the same name as other `lodash` methods. */
+ 'use strict';
+
+ var nativeMax = Math.max,
+ nativeMin = Math.min;
+
+ /**
+ * Gets the view, applying any `transforms` to the `start` and `end` positions.
+ *
+ * @private
+ * @param {number} start The start of the view.
+ * @param {number} end The end of the view.
+ * @param {Array} transforms The transformations to apply to the view.
+ * @returns {Object} Returns an object containing the `start` and `end`
+ * positions of the view.
+ */
+ function getView(start, end, transforms) {
+ var index = -1,
+ length = transforms.length;
+
+ while (++index < length) {
+ var data = transforms[index],
+ size = data.size;
+
+ switch (data.type) {
+ case 'drop':
+ start += size;break;
+ case 'dropRight':
+ end -= size;break;
+ case 'take':
+ end = nativeMin(end, start + size);break;
+ case 'takeRight':
+ start = nativeMax(start, end - size);break;
+ }
+ }
+ return { 'start': start, 'end': end };
+ }
+
+ exports['default'] = getView;
+});
+define("lodash/internal/indexOfNaN", ["exports"], function (exports) {
+ /**
+ * Gets the index at which the first occurrence of `NaN` is found in `array`.
+ *
+ * @private
+ * @param {Array} array The array to search.
+ * @param {number} fromIndex The index to search from.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {number} Returns the index of the matched `NaN`, else `-1`.
+ */
+ "use strict";
+
+ function indexOfNaN(array, fromIndex, fromRight) {
+ var length = array.length,
+ index = fromIndex + (fromRight ? 0 : -1);
+
+ while (fromRight ? index-- : ++index < length) {
+ var other = array[index];
+ if (other !== other) {
+ return index;
+ }
+ }
+ return -1;
+ }
+
+ exports["default"] = indexOfNaN;
+});
+define('lodash/internal/initCloneArray', ['exports'], function (exports) {
+ /** Used for native method references. */
+ 'use strict';
+
+ var objectProto = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty = objectProto.hasOwnProperty;
+
+ /**
+ * Initializes an array clone.
+ *
+ * @private
+ * @param {Array} array The array to clone.
+ * @returns {Array} Returns the initialized clone.
+ */
+ function initCloneArray(array) {
+ var length = array.length,
+ result = new array.constructor(length);
+
+ // Add array properties assigned by `RegExp#exec`.
+ if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
+ result.index = array.index;
+ result.input = array.input;
+ }
+ return result;
+ }
+
+ exports['default'] = initCloneArray;
+});
+define('lodash/internal/initCloneByTag', ['exports', 'lodash/internal/bufferClone'], function (exports, _lodashInternalBufferClone) {
+ 'use strict';
+
+ /** `Object#toString` result references. */
+ var boolTag = '[object Boolean]',
+ dateTag = '[object Date]',
+ numberTag = '[object Number]',
+ regexpTag = '[object RegExp]',
+ stringTag = '[object String]';
+
+ var arrayBufferTag = '[object ArrayBuffer]',
+ float32Tag = '[object Float32Array]',
+ float64Tag = '[object Float64Array]',
+ int8Tag = '[object Int8Array]',
+ int16Tag = '[object Int16Array]',
+ int32Tag = '[object Int32Array]',
+ uint8Tag = '[object Uint8Array]',
+ uint8ClampedTag = '[object Uint8ClampedArray]',
+ uint16Tag = '[object Uint16Array]',
+ uint32Tag = '[object Uint32Array]';
+
+ /** Used to match `RegExp` flags from their coerced string values. */
+ var reFlags = /\w*$/;
+
+ /**
+ * Initializes an object clone based on its `toStringTag`.
+ *
+ * **Note:** This function only supports cloning values with tags of
+ * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
+ *
+ * @private
+ * @param {Object} object The object to clone.
+ * @param {string} tag The `toStringTag` of the object to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the initialized clone.
+ */
+ function initCloneByTag(object, tag, isDeep) {
+ var Ctor = object.constructor;
+ switch (tag) {
+ case arrayBufferTag:
+ return (0, _lodashInternalBufferClone['default'])(object);
+
+ case boolTag:
+ case dateTag:
+ return new Ctor(+object);
+
+ case float32Tag:case float64Tag:
+ case int8Tag:case int16Tag:case int32Tag:
+ case uint8Tag:case uint8ClampedTag:case uint16Tag:case uint32Tag:
+ var buffer = object.buffer;
+ return new Ctor(isDeep ? (0, _lodashInternalBufferClone['default'])(buffer) : buffer, object.byteOffset, object.length);
+
+ case numberTag:
+ case stringTag:
+ return new Ctor(object);
+
+ case regexpTag:
+ var result = new Ctor(object.source, reFlags.exec(object));
+ result.lastIndex = object.lastIndex;
+ }
+ return result;
+ }
+
+ exports['default'] = initCloneByTag;
+});
+define('lodash/internal/initCloneObject', ['exports'], function (exports) {
+ /**
+ * Initializes an object clone.
+ *
+ * @private
+ * @param {Object} object The object to clone.
+ * @returns {Object} Returns the initialized clone.
+ */
+ 'use strict';
+
+ function initCloneObject(object) {
+ var Ctor = object.constructor;
+ if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) {
+ Ctor = Object;
+ }
+ return new Ctor();
+ }
+
+ exports['default'] = initCloneObject;
+});
+define('lodash/internal/invokePath', ['exports', 'lodash/internal/baseGet', 'lodash/internal/baseSlice', 'lodash/internal/isKey', 'lodash/array/last', 'lodash/internal/toPath'], function (exports, _lodashInternalBaseGet, _lodashInternalBaseSlice, _lodashInternalIsKey, _lodashArrayLast, _lodashInternalToPath) {
+ 'use strict';
+
+ /**
+ * Invokes the method at `path` on `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the method to invoke.
+ * @param {Array} args The arguments to invoke the method with.
+ * @returns {*} Returns the result of the invoked method.
+ */
+ function invokePath(object, path, args) {
+ if (object != null && !(0, _lodashInternalIsKey['default'])(path, object)) {
+ path = (0, _lodashInternalToPath['default'])(path);
+ object = path.length == 1 ? object : (0, _lodashInternalBaseGet['default'])(object, (0, _lodashInternalBaseSlice['default'])(path, 0, -1));
+ path = (0, _lodashArrayLast['default'])(path);
+ }
+ var func = object == null ? object : object[path];
+ return func == null ? undefined : func.apply(object, args);
+ }
+
+ exports['default'] = invokePath;
+});
+define('lodash/internal/isArrayLike', ['exports', 'lodash/internal/getLength', 'lodash/internal/isLength'], function (exports, _lodashInternalGetLength, _lodashInternalIsLength) {
+ 'use strict';
+
+ /**
+ * Checks if `value` is array-like.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+ */
+ function isArrayLike(value) {
+ return value != null && (0, _lodashInternalIsLength['default'])((0, _lodashInternalGetLength['default'])(value));
+ }
+
+ exports['default'] = isArrayLike;
+});
+define('lodash/internal/isIndex', ['exports'], function (exports) {
+ /** Used to detect unsigned integer values. */
+ 'use strict';
+
+ var reIsUint = /^\d+$/;
+
+ /**
+ * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
+ * of an array-like value.
+ */
+ var MAX_SAFE_INTEGER = 9007199254740991;
+
+ /**
+ * Checks if `value` is a valid array-like index.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
+ * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
+ */
+ function isIndex(value, length) {
+ value = typeof value == 'number' || reIsUint.test(value) ? +value : -1;
+ length = length == null ? MAX_SAFE_INTEGER : length;
+ return value > -1 && value % 1 == 0 && value < length;
+ }
+
+ exports['default'] = isIndex;
+});
+define('lodash/internal/isIterateeCall', ['exports', 'lodash/internal/isArrayLike', 'lodash/internal/isIndex', 'lodash/lang/isObject'], function (exports, _lodashInternalIsArrayLike, _lodashInternalIsIndex, _lodashLangIsObject) {
+ 'use strict';
+
+ /**
+ * Checks if the provided arguments are from an iteratee call.
+ *
+ * @private
+ * @param {*} value The potential iteratee value argument.
+ * @param {*} index The potential iteratee index or key argument.
+ * @param {*} object The potential iteratee object argument.
+ * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.
+ */
+ function isIterateeCall(value, index, object) {
+ if (!(0, _lodashLangIsObject['default'])(object)) {
+ return false;
+ }
+ var type = typeof index;
+ if (type == 'number' ? (0, _lodashInternalIsArrayLike['default'])(object) && (0, _lodashInternalIsIndex['default'])(index, object.length) : type == 'string' && index in object) {
+ var other = object[index];
+ return value === value ? value === other : other !== other;
+ }
+ return false;
+ }
+
+ exports['default'] = isIterateeCall;
+});
+define('lodash/internal/isKey', ['exports', 'lodash/lang/isArray', 'lodash/internal/toObject'], function (exports, _lodashLangIsArray, _lodashInternalToObject) {
+ 'use strict';
+
+ /** Used to match property names within property paths. */
+ var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/,
+ reIsPlainProp = /^\w*$/;
+
+ /**
+ * Checks if `value` is a property name and not a property path.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {Object} [object] The object to query keys on.
+ * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
+ */
+ function isKey(value, object) {
+ var type = typeof value;
+ if (type == 'string' && reIsPlainProp.test(value) || type == 'number') {
+ return true;
+ }
+ if ((0, _lodashLangIsArray['default'])(value)) {
+ return false;
+ }
+ var result = !reIsDeepProp.test(value);
+ return result || object != null && value in (0, _lodashInternalToObject['default'])(object);
+ }
+
+ exports['default'] = isKey;
+});
+define('lodash/internal/isLaziable', ['exports', 'lodash/internal/LazyWrapper', 'lodash/internal/getData', 'lodash/internal/getFuncName', 'lodash/chain/lodash'], function (exports, _lodashInternalLazyWrapper, _lodashInternalGetData, _lodashInternalGetFuncName, _lodashChainLodash) {
+ 'use strict';
+
+ /**
+ * Checks if `func` has a lazy counterpart.
+ *
+ * @private
+ * @param {Function} func The function to check.
+ * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`.
+ */
+ function isLaziable(func) {
+ var funcName = (0, _lodashInternalGetFuncName['default'])(func),
+ other = _lodashChainLodash['default'][funcName];
+
+ if (typeof other != 'function' || !(funcName in _lodashInternalLazyWrapper['default'].prototype)) {
+ return false;
+ }
+ if (func === other) {
+ return true;
+ }
+ var data = (0, _lodashInternalGetData['default'])(other);
+ return !!data && func === data[0];
+ }
+
+ exports['default'] = isLaziable;
+});
+define('lodash/internal/isLength', ['exports'], function (exports) {
+ /**
+ * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
+ * of an array-like value.
+ */
+ 'use strict';
+
+ var MAX_SAFE_INTEGER = 9007199254740991;
+
+ /**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ */
+ function isLength(value) {
+ return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+ }
+
+ exports['default'] = isLength;
+});
+define('lodash/internal/isObjectLike', ['exports'], function (exports) {
+ /**
+ * Checks if `value` is object-like.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ */
+ 'use strict';
+
+ function isObjectLike(value) {
+ return !!value && typeof value == 'object';
+ }
+
+ exports['default'] = isObjectLike;
+});
+define("lodash/internal/isSpace", ["exports"], function (exports) {
+ /**
+ * Used by `trimmedLeftIndex` and `trimmedRightIndex` to determine if a
+ * character code is whitespace.
+ *
+ * @private
+ * @param {number} charCode The character code to inspect.
+ * @returns {boolean} Returns `true` if `charCode` is whitespace, else `false`.
+ */
+ "use strict";
+
+ function isSpace(charCode) {
+ return charCode <= 160 && charCode >= 9 && charCode <= 13 || charCode == 32 || charCode == 160 || charCode == 5760 || charCode == 6158 || charCode >= 8192 && (charCode <= 8202 || charCode == 8232 || charCode == 8233 || charCode == 8239 || charCode == 8287 || charCode == 12288 || charCode == 65279);
+ }
+
+ exports["default"] = isSpace;
+});
+define('lodash/internal/isStrictComparable', ['exports', 'lodash/lang/isObject'], function (exports, _lodashLangIsObject) {
+ 'use strict';
+
+ /**
+ * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` if suitable for strict
+ * equality comparisons, else `false`.
+ */
+ function isStrictComparable(value) {
+ return value === value && !(0, _lodashLangIsObject['default'])(value);
+ }
+
+ exports['default'] = isStrictComparable;
+});
+define('lodash/internal/lazyClone', ['exports', 'lodash/internal/LazyWrapper', 'lodash/internal/arrayCopy'], function (exports, _lodashInternalLazyWrapper, _lodashInternalArrayCopy) {
+ 'use strict';
+
+ /**
+ * Creates a clone of the lazy wrapper object.
+ *
+ * @private
+ * @name clone
+ * @memberOf LazyWrapper
+ * @returns {Object} Returns the cloned `LazyWrapper` object.
+ */
+ function lazyClone() {
+ var result = new _lodashInternalLazyWrapper['default'](this.__wrapped__);
+ result.__actions__ = (0, _lodashInternalArrayCopy['default'])(this.__actions__);
+ result.__dir__ = this.__dir__;
+ result.__filtered__ = this.__filtered__;
+ result.__iteratees__ = (0, _lodashInternalArrayCopy['default'])(this.__iteratees__);
+ result.__takeCount__ = this.__takeCount__;
+ result.__views__ = (0, _lodashInternalArrayCopy['default'])(this.__views__);
+ return result;
+ }
+
+ exports['default'] = lazyClone;
+});
+define('lodash/internal/lazyReverse', ['exports', 'lodash/internal/LazyWrapper'], function (exports, _lodashInternalLazyWrapper) {
+ 'use strict';
+
+ /**
+ * Reverses the direction of lazy iteration.
+ *
+ * @private
+ * @name reverse
+ * @memberOf LazyWrapper
+ * @returns {Object} Returns the new reversed `LazyWrapper` object.
+ */
+ function lazyReverse() {
+ if (this.__filtered__) {
+ var result = new _lodashInternalLazyWrapper['default'](this);
+ result.__dir__ = -1;
+ result.__filtered__ = true;
+ } else {
+ result = this.clone();
+ result.__dir__ *= -1;
+ }
+ return result;
+ }
+
+ exports['default'] = lazyReverse;
+});
+define('lodash/internal/lazyValue', ['exports', 'lodash/internal/baseWrapperValue', 'lodash/internal/getView', 'lodash/lang/isArray'], function (exports, _lodashInternalBaseWrapperValue, _lodashInternalGetView, _lodashLangIsArray) {
+ 'use strict';
+
+ /** Used as the size to enable large array optimizations. */
+ var LARGE_ARRAY_SIZE = 200;
+
+ /** Used to indicate the type of lazy iteratees. */
+ var LAZY_FILTER_FLAG = 1,
+ LAZY_MAP_FLAG = 2;
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeMin = Math.min;
+
+ /**
+ * Extracts the unwrapped value from its lazy wrapper.
+ *
+ * @private
+ * @name value
+ * @memberOf LazyWrapper
+ * @returns {*} Returns the unwrapped value.
+ */
+ function lazyValue() {
+ var array = this.__wrapped__.value(),
+ dir = this.__dir__,
+ isArr = (0, _lodashLangIsArray['default'])(array),
+ isRight = dir < 0,
+ arrLength = isArr ? array.length : 0,
+ view = (0, _lodashInternalGetView['default'])(0, arrLength, this.__views__),
+ start = view.start,
+ end = view.end,
+ length = end - start,
+ index = isRight ? end : start - 1,
+ iteratees = this.__iteratees__,
+ iterLength = iteratees.length,
+ resIndex = 0,
+ takeCount = nativeMin(length, this.__takeCount__);
+
+ if (!isArr || arrLength < LARGE_ARRAY_SIZE || arrLength == length && takeCount == length) {
+ return (0, _lodashInternalBaseWrapperValue['default'])(array, this.__actions__);
+ }
+ var result = [];
+
+ outer: while (length-- && resIndex < takeCount) {
+ index += dir;
+
+ var iterIndex = -1,
+ value = array[index];
+
+ while (++iterIndex < iterLength) {
+ var data = iteratees[iterIndex],
+ iteratee = data.iteratee,
+ type = data.type,
+ computed = iteratee(value);
+
+ if (type == LAZY_MAP_FLAG) {
+ value = computed;
+ } else if (!computed) {
+ if (type == LAZY_FILTER_FLAG) {
+ continue outer;
+ } else {
+ break outer;
+ }
+ }
+ }
+ result[resIndex++] = value;
+ }
+ return result;
+ }
+
+ exports['default'] = lazyValue;
+});
+define("lodash/internal/mapDelete", ["exports"], function (exports) {
+ /**
+ * Removes `key` and its value from the cache.
+ *
+ * @private
+ * @name delete
+ * @memberOf _.memoize.Cache
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed successfully, else `false`.
+ */
+ "use strict";
+
+ function mapDelete(key) {
+ return this.has(key) && delete this.__data__[key];
+ }
+
+ exports["default"] = mapDelete;
+});
+define('lodash/internal/mapGet', ['exports'], function (exports) {
+ /**
+ * Gets the cached value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf _.memoize.Cache
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the cached value.
+ */
+ 'use strict';
+
+ function mapGet(key) {
+ return key == '__proto__' ? undefined : this.__data__[key];
+ }
+
+ exports['default'] = mapGet;
+});
+define('lodash/internal/mapHas', ['exports'], function (exports) {
+ /** Used for native method references. */
+ 'use strict';
+
+ var objectProto = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty = objectProto.hasOwnProperty;
+
+ /**
+ * Checks if a cached value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf _.memoize.Cache
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+ function mapHas(key) {
+ return key != '__proto__' && hasOwnProperty.call(this.__data__, key);
+ }
+
+ exports['default'] = mapHas;
+});
+define('lodash/internal/mapSet', ['exports'], function (exports) {
+ /**
+ * Sets `value` to `key` of the cache.
+ *
+ * @private
+ * @name set
+ * @memberOf _.memoize.Cache
+ * @param {string} key The key of the value to cache.
+ * @param {*} value The value to cache.
+ * @returns {Object} Returns the cache object.
+ */
+ 'use strict';
+
+ function mapSet(key, value) {
+ if (key != '__proto__') {
+ this.__data__[key] = value;
+ }
+ return this;
+ }
+
+ exports['default'] = mapSet;
+});
+define('lodash/internal/mergeData', ['exports', 'lodash/internal/arrayCopy', 'lodash/internal/composeArgs', 'lodash/internal/composeArgsRight', 'lodash/internal/replaceHolders'], function (exports, _lodashInternalArrayCopy, _lodashInternalComposeArgs, _lodashInternalComposeArgsRight, _lodashInternalReplaceHolders) {
+ 'use strict';
+
+ /** Used to compose bitmasks for wrapper metadata. */
+ var BIND_FLAG = 1,
+ CURRY_BOUND_FLAG = 4,
+ CURRY_FLAG = 8,
+ ARY_FLAG = 128,
+ REARG_FLAG = 256;
+
+ /** Used as the internal argument placeholder. */
+ var PLACEHOLDER = '__lodash_placeholder__';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeMin = Math.min;
+
+ /**
+ * Merges the function metadata of `source` into `data`.
+ *
+ * Merging metadata reduces the number of wrappers required to invoke a function.
+ * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
+ * may be applied regardless of execution order. Methods like `_.ary` and `_.rearg`
+ * augment function arguments, making the order in which they are executed important,
+ * preventing the merging of metadata. However, we make an exception for a safe
+ * common case where curried functions have `_.ary` and or `_.rearg` applied.
+ *
+ * @private
+ * @param {Array} data The destination metadata.
+ * @param {Array} source The source metadata.
+ * @returns {Array} Returns `data`.
+ */
+ function mergeData(data, source) {
+ var bitmask = data[1],
+ srcBitmask = source[1],
+ newBitmask = bitmask | srcBitmask,
+ isCommon = newBitmask < ARY_FLAG;
+
+ var isCombo = srcBitmask == ARY_FLAG && bitmask == CURRY_FLAG || srcBitmask == ARY_FLAG && bitmask == REARG_FLAG && data[7].length <= source[8] || srcBitmask == (ARY_FLAG | REARG_FLAG) && bitmask == CURRY_FLAG;
+
+ // Exit early if metadata can't be merged.
+ if (!(isCommon || isCombo)) {
+ return data;
+ }
+ // Use source `thisArg` if available.
+ if (srcBitmask & BIND_FLAG) {
+ data[2] = source[2];
+ // Set when currying a bound function.
+ newBitmask |= bitmask & BIND_FLAG ? 0 : CURRY_BOUND_FLAG;
+ }
+ // Compose partial arguments.
+ var value = source[3];
+ if (value) {
+ var partials = data[3];
+ data[3] = partials ? (0, _lodashInternalComposeArgs['default'])(partials, value, source[4]) : (0, _lodashInternalArrayCopy['default'])(value);
+ data[4] = partials ? (0, _lodashInternalReplaceHolders['default'])(data[3], PLACEHOLDER) : (0, _lodashInternalArrayCopy['default'])(source[4]);
+ }
+ // Compose partial right arguments.
+ value = source[5];
+ if (value) {
+ partials = data[5];
+ data[5] = partials ? (0, _lodashInternalComposeArgsRight['default'])(partials, value, source[6]) : (0, _lodashInternalArrayCopy['default'])(value);
+ data[6] = partials ? (0, _lodashInternalReplaceHolders['default'])(data[5], PLACEHOLDER) : (0, _lodashInternalArrayCopy['default'])(source[6]);
+ }
+ // Use source `argPos` if available.
+ value = source[7];
+ if (value) {
+ data[7] = (0, _lodashInternalArrayCopy['default'])(value);
+ }
+ // Use source `ary` if it's smaller.
+ if (srcBitmask & ARY_FLAG) {
+ data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
+ }
+ // Use source `arity` if one is not provided.
+ if (data[9] == null) {
+ data[9] = source[9];
+ }
+ // Use source `func` and merge bitmasks.
+ data[0] = source[0];
+ data[1] = newBitmask;
+
+ return data;
+ }
+
+ exports['default'] = mergeData;
+});
+define('lodash/internal/mergeDefaults', ['exports', 'lodash/object/merge'], function (exports, _lodashObjectMerge) {
+ 'use strict';
+
+ /**
+ * Used by `_.defaultsDeep` to customize its `_.merge` use.
+ *
+ * @private
+ * @param {*} objectValue The destination object property value.
+ * @param {*} sourceValue The source object property value.
+ * @returns {*} Returns the value to assign to the destination object.
+ */
+ function mergeDefaults(objectValue, sourceValue) {
+ return objectValue === undefined ? sourceValue : (0, _lodashObjectMerge['default'])(objectValue, sourceValue, mergeDefaults);
+ }
+
+ exports['default'] = mergeDefaults;
+});
+define('lodash/internal/metaMap', ['exports', 'lodash/internal/getNative', 'lodash/internal/root'], function (exports, _lodashInternalGetNative, _lodashInternalRoot) {
+ 'use strict';
+
+ /** Native method references. */
+ var WeakMap = (0, _lodashInternalGetNative['default'])(_lodashInternalRoot['default'], 'WeakMap');
+
+ /** Used to store function metadata. */
+ var metaMap = WeakMap && new WeakMap();
+
+ exports['default'] = metaMap;
+});
+define('lodash/internal/pickByArray', ['exports', 'lodash/internal/toObject'], function (exports, _lodashInternalToObject) {
+ 'use strict';
+
+ /**
+ * A specialized version of `_.pick` which picks `object` properties specified
+ * by `props`.
+ *
+ * @private
+ * @param {Object} object The source object.
+ * @param {string[]} props The property names to pick.
+ * @returns {Object} Returns the new object.
+ */
+ function pickByArray(object, props) {
+ object = (0, _lodashInternalToObject['default'])(object);
+
+ var index = -1,
+ length = props.length,
+ result = {};
+
+ while (++index < length) {
+ var key = props[index];
+ if (key in object) {
+ result[key] = object[key];
+ }
+ }
+ return result;
+ }
+
+ exports['default'] = pickByArray;
+});
+define('lodash/internal/pickByCallback', ['exports', 'lodash/internal/baseForIn'], function (exports, _lodashInternalBaseForIn) {
+ 'use strict';
+
+ /**
+ * A specialized version of `_.pick` which picks `object` properties `predicate`
+ * returns truthy for.
+ *
+ * @private
+ * @param {Object} object The source object.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {Object} Returns the new object.
+ */
+ function pickByCallback(object, predicate) {
+ var result = {};
+ (0, _lodashInternalBaseForIn['default'])(object, function (value, key, object) {
+ if (predicate(value, key, object)) {
+ result[key] = value;
+ }
+ });
+ return result;
+ }
+
+ exports['default'] = pickByCallback;
+});
+define("lodash/internal/reEscape", ["exports"], function (exports) {
+ /** Used to match template delimiters. */
+ "use strict";
+
+ var reEscape = /<%-([\s\S]+?)%>/g;
+
+ exports["default"] = reEscape;
+});
+define("lodash/internal/reEvaluate", ["exports"], function (exports) {
+ /** Used to match template delimiters. */
+ "use strict";
+
+ var reEvaluate = /<%([\s\S]+?)%>/g;
+
+ exports["default"] = reEvaluate;
+});
+define("lodash/internal/reInterpolate", ["exports"], function (exports) {
+ /** Used to match template delimiters. */
+ "use strict";
+
+ var reInterpolate = /<%=([\s\S]+?)%>/g;
+
+ exports["default"] = reInterpolate;
+});
+define("lodash/internal/realNames", ["exports"], function (exports) {
+ /** Used to lookup unminified function names. */
+ "use strict";
+
+ var realNames = {};
+
+ exports["default"] = realNames;
+});
+define('lodash/internal/reorder', ['exports', 'lodash/internal/arrayCopy', 'lodash/internal/isIndex'], function (exports, _lodashInternalArrayCopy, _lodashInternalIsIndex) {
+ 'use strict';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeMin = Math.min;
+
+ /**
+ * Reorder `array` according to the specified indexes where the element at
+ * the first index is assigned as the first element, the element at
+ * the second index is assigned as the second element, and so on.
+ *
+ * @private
+ * @param {Array} array The array to reorder.
+ * @param {Array} indexes The arranged array indexes.
+ * @returns {Array} Returns `array`.
+ */
+ function reorder(array, indexes) {
+ var arrLength = array.length,
+ length = nativeMin(indexes.length, arrLength),
+ oldArray = (0, _lodashInternalArrayCopy['default'])(array);
+
+ while (length--) {
+ var index = indexes[length];
+ array[length] = (0, _lodashInternalIsIndex['default'])(index, arrLength) ? oldArray[index] : undefined;
+ }
+ return array;
+ }
+
+ exports['default'] = reorder;
+});
+define('lodash/internal/replaceHolders', ['exports'], function (exports) {
+ /** Used as the internal argument placeholder. */
+ 'use strict';
+
+ var PLACEHOLDER = '__lodash_placeholder__';
+
+ /**
+ * Replaces all `placeholder` elements in `array` with an internal placeholder
+ * and returns an array of their indexes.
+ *
+ * @private
+ * @param {Array} array The array to modify.
+ * @param {*} placeholder The placeholder to replace.
+ * @returns {Array} Returns the new array of placeholder indexes.
+ */
+ function replaceHolders(array, placeholder) {
+ var index = -1,
+ length = array.length,
+ resIndex = -1,
+ result = [];
+
+ while (++index < length) {
+ if (array[index] === placeholder) {
+ array[index] = PLACEHOLDER;
+ result[++resIndex] = index;
+ }
+ }
+ return result;
+ }
+
+ exports['default'] = replaceHolders;
+});
+define('lodash/internal/root', ['exports'], function (exports) {
+ /** Used to determine if values are of the language type `Object`. */
+ 'use strict';
+
+ var objectTypes = {
+ 'function': true,
+ 'object': true
+ };
+
+ /** Detect free variable `exports`. */
+ var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;
+
+ /** Detect free variable `module`. */
+ var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;
+
+ /** Detect free variable `global` from Node.js. */
+ var freeGlobal = freeExports && freeModule && typeof global == 'object' && global && global.Object && global;
+
+ /** Detect free variable `self`. */
+ var freeSelf = objectTypes[typeof self] && self && self.Object && self;
+
+ /** Detect free variable `window`. */
+ var freeWindow = objectTypes[typeof window] && window && window.Object && window;
+
+ /**
+ * Used as a reference to the global object.
+ *
+ * The `this` value is used if it's the global object to avoid Greasemonkey's
+ * restricted `window` object, otherwise the `window` object is used.
+ */
+ var root = freeGlobal || window;
+ // var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this;
+
+ exports['default'] = root;
+});
+define('lodash/internal/setData', ['exports', 'lodash/internal/baseSetData', 'lodash/date/now'], function (exports, _lodashInternalBaseSetData, _lodashDateNow) {
+ 'use strict';
+
+ /** Used to detect when a function becomes hot. */
+ var HOT_COUNT = 150,
+ HOT_SPAN = 16;
+
+ /**
+ * Sets metadata for `func`.
+ *
+ * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
+ * period of time, it will trip its breaker and transition to an identity function
+ * to avoid garbage collection pauses in V8. See [V8 issue 2070](https://code.google.com/p/v8/issues/detail?id=2070)
+ * for more details.
+ *
+ * @private
+ * @param {Function} func The function to associate metadata with.
+ * @param {*} data The metadata.
+ * @returns {Function} Returns `func`.
+ */
+ var setData = (function () {
+ var count = 0,
+ lastCalled = 0;
+
+ return function (key, value) {
+ var stamp = (0, _lodashDateNow['default'])(),
+ remaining = HOT_SPAN - (stamp - lastCalled);
+
+ lastCalled = stamp;
+ if (remaining > 0) {
+ if (++count >= HOT_COUNT) {
+ return key;
+ }
+ } else {
+ count = 0;
+ }
+ return (0, _lodashInternalBaseSetData['default'])(key, value);
+ };
+ })();
+
+ exports['default'] = setData;
+});
+define('lodash/internal/shimKeys', ['exports', 'lodash/lang/isArguments', 'lodash/lang/isArray', 'lodash/internal/isIndex', 'lodash/internal/isLength', 'lodash/object/keysIn'], function (exports, _lodashLangIsArguments, _lodashLangIsArray, _lodashInternalIsIndex, _lodashInternalIsLength, _lodashObjectKeysIn) {
+ 'use strict';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty = objectProto.hasOwnProperty;
+
+ /**
+ * A fallback implementation of `Object.keys` which creates an array of the
+ * own enumerable property names of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
+ function shimKeys(object) {
+ var props = (0, _lodashObjectKeysIn['default'])(object),
+ propsLength = props.length,
+ length = propsLength && object.length;
+
+ var allowIndexes = !!length && (0, _lodashInternalIsLength['default'])(length) && ((0, _lodashLangIsArray['default'])(object) || (0, _lodashLangIsArguments['default'])(object));
+
+ var index = -1,
+ result = [];
+
+ while (++index < propsLength) {
+ var key = props[index];
+ if (allowIndexes && (0, _lodashInternalIsIndex['default'])(key, length) || hasOwnProperty.call(object, key)) {
+ result.push(key);
+ }
+ }
+ return result;
+ }
+
+ exports['default'] = shimKeys;
+});
+define("lodash/internal/sortedUniq", ["exports"], function (exports) {
+ /**
+ * An implementation of `_.uniq` optimized for sorted arrays without support
+ * for callback shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {Function} [iteratee] The function invoked per iteration.
+ * @returns {Array} Returns the new duplicate free array.
+ */
+ "use strict";
+
+ function sortedUniq(array, iteratee) {
+ var seen,
+ index = -1,
+ length = array.length,
+ resIndex = -1,
+ result = [];
+
+ while (++index < length) {
+ var value = array[index],
+ computed = iteratee ? iteratee(value, index, array) : value;
+
+ if (!index || seen !== computed) {
+ seen = computed;
+ result[++resIndex] = value;
+ }
+ }
+ return result;
+ }
+
+ exports["default"] = sortedUniq;
+});
+define('lodash/internal/toIterable', ['exports', 'lodash/internal/isArrayLike', 'lodash/lang/isObject', 'lodash/object/values'], function (exports, _lodashInternalIsArrayLike, _lodashLangIsObject, _lodashObjectValues) {
+ 'use strict';
+
+ /**
+ * Converts `value` to an array-like object if it's not one.
+ *
+ * @private
+ * @param {*} value The value to process.
+ * @returns {Array|Object} Returns the array-like object.
+ */
+ function toIterable(value) {
+ if (value == null) {
+ return [];
+ }
+ if (!(0, _lodashInternalIsArrayLike['default'])(value)) {
+ return (0, _lodashObjectValues['default'])(value);
+ }
+ return (0, _lodashLangIsObject['default'])(value) ? value : Object(value);
+ }
+
+ exports['default'] = toIterable;
+});
+define('lodash/internal/toObject', ['exports', 'lodash/lang/isObject'], function (exports, _lodashLangIsObject) {
+ 'use strict';
+
+ /**
+ * Converts `value` to an object if it's not one.
+ *
+ * @private
+ * @param {*} value The value to process.
+ * @returns {Object} Returns the object.
+ */
+ function toObject(value) {
+ return (0, _lodashLangIsObject['default'])(value) ? value : Object(value);
+ }
+
+ exports['default'] = toObject;
+});
+define('lodash/internal/toPath', ['exports', 'lodash/internal/baseToString', 'lodash/lang/isArray'], function (exports, _lodashInternalBaseToString, _lodashLangIsArray) {
+ 'use strict';
+
+ /** Used to match property names within property paths. */
+ var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g;
+
+ /** Used to match backslashes in property paths. */
+ var reEscapeChar = /\\(\\)?/g;
+
+ /**
+ * Converts `value` to property path array if it's not one.
+ *
+ * @private
+ * @param {*} value The value to process.
+ * @returns {Array} Returns the property path array.
+ */
+ function toPath(value) {
+ if ((0, _lodashLangIsArray['default'])(value)) {
+ return value;
+ }
+ var result = [];
+ (0, _lodashInternalBaseToString['default'])(value).replace(rePropName, function (match, number, quote, string) {
+ result.push(quote ? string.replace(reEscapeChar, '$1') : number || match);
+ });
+ return result;
+ }
+
+ exports['default'] = toPath;
+});
+define('lodash/internal/trimmedLeftIndex', ['exports', 'lodash/internal/isSpace'], function (exports, _lodashInternalIsSpace) {
+ 'use strict';
+
+ /**
+ * Used by `_.trim` and `_.trimLeft` to get the index of the first non-whitespace
+ * character of `string`.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @returns {number} Returns the index of the first non-whitespace character.
+ */
+ function trimmedLeftIndex(string) {
+ var index = -1,
+ length = string.length;
+
+ while (++index < length && (0, _lodashInternalIsSpace['default'])(string.charCodeAt(index))) {}
+ return index;
+ }
+
+ exports['default'] = trimmedLeftIndex;
+});
+define('lodash/internal/trimmedRightIndex', ['exports', 'lodash/internal/isSpace'], function (exports, _lodashInternalIsSpace) {
+ 'use strict';
+
+ /**
+ * Used by `_.trim` and `_.trimRight` to get the index of the last non-whitespace
+ * character of `string`.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @returns {number} Returns the index of the last non-whitespace character.
+ */
+ function trimmedRightIndex(string) {
+ var index = string.length;
+
+ while (index-- && (0, _lodashInternalIsSpace['default'])(string.charCodeAt(index))) {}
+ return index;
+ }
+
+ exports['default'] = trimmedRightIndex;
+});
+define('lodash/internal/unescapeHtmlChar', ['exports'], function (exports) {
+ /** Used to map HTML entities to characters. */
+ 'use strict';
+
+ var htmlUnescapes = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ ''': "'",
+ '`': '`'
+ };
+
+ /**
+ * Used by `_.unescape` to convert HTML entities to characters.
+ *
+ * @private
+ * @param {string} chr The matched character to unescape.
+ * @returns {string} Returns the unescaped character.
+ */
+ function unescapeHtmlChar(chr) {
+ return htmlUnescapes[chr];
+ }
+
+ exports['default'] = unescapeHtmlChar;
+});
+define('lodash/internal/wrapperClone', ['exports', 'lodash/internal/LazyWrapper', 'lodash/internal/LodashWrapper', 'lodash/internal/arrayCopy'], function (exports, _lodashInternalLazyWrapper, _lodashInternalLodashWrapper, _lodashInternalArrayCopy) {
+ 'use strict';
+
+ /**
+ * Creates a clone of `wrapper`.
+ *
+ * @private
+ * @param {Object} wrapper The wrapper to clone.
+ * @returns {Object} Returns the cloned wrapper.
+ */
+ function wrapperClone(wrapper) {
+ return wrapper instanceof _lodashInternalLazyWrapper['default'] ? wrapper.clone() : new _lodashInternalLodashWrapper['default'](wrapper.__wrapped__, wrapper.__chain__, (0, _lodashInternalArrayCopy['default'])(wrapper.__actions__));
+ }
+
+ exports['default'] = wrapperClone;
+});
+define('lodash/lang', ['exports', 'lodash/lang/clone', 'lodash/lang/cloneDeep', 'lodash/lang/eq', 'lodash/lang/gt', 'lodash/lang/gte', 'lodash/lang/isArguments', 'lodash/lang/isArray', 'lodash/lang/isBoolean', 'lodash/lang/isDate', 'lodash/lang/isElement', 'lodash/lang/isEmpty', 'lodash/lang/isEqual', 'lodash/lang/isError', 'lodash/lang/isFinite', 'lodash/lang/isFunction', 'lodash/lang/isMatch', 'lodash/lang/isNaN', 'lodash/lang/isNative', 'lodash/lang/isNull', 'lodash/lang/isNumber', 'lodash/lang/isObject', 'lodash/lang/isPlainObject', 'lodash/lang/isRegExp', 'lodash/lang/isString', 'lodash/lang/isTypedArray', 'lodash/lang/isUndefined', 'lodash/lang/lt', 'lodash/lang/lte', 'lodash/lang/toArray', 'lodash/lang/toPlainObject'], function (exports, _lodashLangClone, _lodashLangCloneDeep, _lodashLangEq, _lodashLangGt, _lodashLangGte, _lodashLangIsArguments, _lodashLangIsArray, _lodashLangIsBoolean, _lodashLangIsDate, _lodashLangIsElement, _lodashLangIsEmpty, _lodashLangIsEqual, _lodashLangIsError, _lodashLangIsFinite, _lodashLangIsFunction, _lodashLangIsMatch, _lodashLangIsNaN, _lodashLangIsNative, _lodashLangIsNull, _lodashLangIsNumber, _lodashLangIsObject, _lodashLangIsPlainObject, _lodashLangIsRegExp, _lodashLangIsString, _lodashLangIsTypedArray, _lodashLangIsUndefined, _lodashLangLt, _lodashLangLte, _lodashLangToArray, _lodashLangToPlainObject) {
+ 'use strict';
+
+ exports['default'] = {
+ 'clone': _lodashLangClone['default'],
+ 'cloneDeep': _lodashLangCloneDeep['default'],
+ 'eq': _lodashLangEq['default'],
+ 'gt': _lodashLangGt['default'],
+ 'gte': _lodashLangGte['default'],
+ 'isArguments': _lodashLangIsArguments['default'],
+ 'isArray': _lodashLangIsArray['default'],
+ 'isBoolean': _lodashLangIsBoolean['default'],
+ 'isDate': _lodashLangIsDate['default'],
+ 'isElement': _lodashLangIsElement['default'],
+ 'isEmpty': _lodashLangIsEmpty['default'],
+ 'isEqual': _lodashLangIsEqual['default'],
+ 'isError': _lodashLangIsError['default'],
+ 'isFinite': _lodashLangIsFinite['default'],
+ 'isFunction': _lodashLangIsFunction['default'],
+ 'isMatch': _lodashLangIsMatch['default'],
+ 'isNaN': _lodashLangIsNaN['default'],
+ 'isNative': _lodashLangIsNative['default'],
+ 'isNull': _lodashLangIsNull['default'],
+ 'isNumber': _lodashLangIsNumber['default'],
+ 'isObject': _lodashLangIsObject['default'],
+ 'isPlainObject': _lodashLangIsPlainObject['default'],
+ 'isRegExp': _lodashLangIsRegExp['default'],
+ 'isString': _lodashLangIsString['default'],
+ 'isTypedArray': _lodashLangIsTypedArray['default'],
+ 'isUndefined': _lodashLangIsUndefined['default'],
+ 'lt': _lodashLangLt['default'],
+ 'lte': _lodashLangLte['default'],
+ 'toArray': _lodashLangToArray['default'],
+ 'toPlainObject': _lodashLangToPlainObject['default']
+ };
+});
+define('lodash/lang/clone', ['exports', 'lodash/internal/baseClone', 'lodash/internal/bindCallback', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseClone, _lodashInternalBindCallback, _lodashInternalIsIterateeCall) {
+ 'use strict';
+
+ /**
+ * Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned,
+ * otherwise they are assigned by reference. If `customizer` is provided it's
+ * invoked to produce the cloned values. If `customizer` returns `undefined`
+ * cloning is handled by the method instead. The `customizer` is bound to
+ * `thisArg` and invoked with up to three argument; (value [, index|key, object]).
+ *
+ * **Note:** This method is loosely based on the
+ * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).
+ * The enumerable properties of `arguments` objects and objects created by
+ * constructors other than `Object` are cloned to plain `Object` objects. An
+ * empty object is returned for uncloneable values such as functions, DOM nodes,
+ * Maps, Sets, and WeakMaps.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @param {Function} [customizer] The function to customize cloning values.
+ * @param {*} [thisArg] The `this` binding of `customizer`.
+ * @returns {*} Returns the cloned value.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney' },
+ * { 'user': 'fred' }
+ * ];
+ *
+ * var shallow = _.clone(users);
+ * shallow[0] === users[0];
+ * // => true
+ *
+ * var deep = _.clone(users, true);
+ * deep[0] === users[0];
+ * // => false
+ *
+ * // using a customizer callback
+ * var el = _.clone(document.body, function(value) {
+ * if (_.isElement(value)) {
+ * return value.cloneNode(false);
+ * }
+ * });
+ *
+ * el === document.body
+ * // => false
+ * el.nodeName
+ * // => BODY
+ * el.childNodes.length;
+ * // => 0
+ */
+ function clone(value, isDeep, customizer, thisArg) {
+ if (isDeep && typeof isDeep != 'boolean' && (0, _lodashInternalIsIterateeCall['default'])(value, isDeep, customizer)) {
+ isDeep = false;
+ } else if (typeof isDeep == 'function') {
+ thisArg = customizer;
+ customizer = isDeep;
+ isDeep = false;
+ }
+ return typeof customizer == 'function' ? (0, _lodashInternalBaseClone['default'])(value, isDeep, (0, _lodashInternalBindCallback['default'])(customizer, thisArg, 3)) : (0, _lodashInternalBaseClone['default'])(value, isDeep);
+ }
+
+ exports['default'] = clone;
+});
+define('lodash/lang/cloneDeep', ['exports', 'lodash/internal/baseClone', 'lodash/internal/bindCallback'], function (exports, _lodashInternalBaseClone, _lodashInternalBindCallback) {
+ 'use strict';
+
+ /**
+ * Creates a deep clone of `value`. If `customizer` is provided it's invoked
+ * to produce the cloned values. If `customizer` returns `undefined` cloning
+ * is handled by the method instead. The `customizer` is bound to `thisArg`
+ * and invoked with up to three argument; (value [, index|key, object]).
+ *
+ * **Note:** This method is loosely based on the
+ * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).
+ * The enumerable properties of `arguments` objects and objects created by
+ * constructors other than `Object` are cloned to plain `Object` objects. An
+ * empty object is returned for uncloneable values such as functions, DOM nodes,
+ * Maps, Sets, and WeakMaps.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to deep clone.
+ * @param {Function} [customizer] The function to customize cloning values.
+ * @param {*} [thisArg] The `this` binding of `customizer`.
+ * @returns {*} Returns the deep cloned value.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney' },
+ * { 'user': 'fred' }
+ * ];
+ *
+ * var deep = _.cloneDeep(users);
+ * deep[0] === users[0];
+ * // => false
+ *
+ * // using a customizer callback
+ * var el = _.cloneDeep(document.body, function(value) {
+ * if (_.isElement(value)) {
+ * return value.cloneNode(true);
+ * }
+ * });
+ *
+ * el === document.body
+ * // => false
+ * el.nodeName
+ * // => BODY
+ * el.childNodes.length;
+ * // => 20
+ */
+ function cloneDeep(value, customizer, thisArg) {
+ return typeof customizer == 'function' ? (0, _lodashInternalBaseClone['default'])(value, true, (0, _lodashInternalBindCallback['default'])(customizer, thisArg, 3)) : (0, _lodashInternalBaseClone['default'])(value, true);
+ }
+
+ exports['default'] = cloneDeep;
+});
+define('lodash/lang/eq', ['exports', 'lodash/lang/isEqual'], function (exports, _lodashLangIsEqual) {
+ 'use strict';
+
+ exports['default'] = _lodashLangIsEqual['default'];
+});
+define("lodash/lang/gt", ["exports"], function (exports) {
+ /**
+ * Checks if `value` is greater than `other`.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is greater than `other`, else `false`.
+ * @example
+ *
+ * _.gt(3, 1);
+ * // => true
+ *
+ * _.gt(3, 3);
+ * // => false
+ *
+ * _.gt(1, 3);
+ * // => false
+ */
+ "use strict";
+
+ function gt(value, other) {
+ return value > other;
+ }
+
+ exports["default"] = gt;
+});
+define("lodash/lang/gte", ["exports"], function (exports) {
+ /**
+ * Checks if `value` is greater than or equal to `other`.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is greater than or equal to `other`, else `false`.
+ * @example
+ *
+ * _.gte(3, 1);
+ * // => true
+ *
+ * _.gte(3, 3);
+ * // => true
+ *
+ * _.gte(1, 3);
+ * // => false
+ */
+ "use strict";
+
+ function gte(value, other) {
+ return value >= other;
+ }
+
+ exports["default"] = gte;
+});
+define('lodash/lang/isArguments', ['exports', 'lodash/internal/isArrayLike', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalIsArrayLike, _lodashInternalIsObjectLike) {
+ 'use strict';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty = objectProto.hasOwnProperty;
+
+ /** Native method references. */
+ var propertyIsEnumerable = objectProto.propertyIsEnumerable;
+
+ /**
+ * Checks if `value` is classified as an `arguments` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isArguments(function() { return arguments; }());
+ * // => true
+ *
+ * _.isArguments([1, 2, 3]);
+ * // => false
+ */
+ function isArguments(value) {
+ return (0, _lodashInternalIsObjectLike['default'])(value) && (0, _lodashInternalIsArrayLike['default'])(value) && hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');
+ }
+
+ exports['default'] = isArguments;
+});
+define('lodash/lang/isArray', ['exports', 'lodash/internal/getNative', 'lodash/internal/isLength', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalGetNative, _lodashInternalIsLength, _lodashInternalIsObjectLike) {
+ 'use strict';
+
+ /** `Object#toString` result references. */
+ var arrayTag = '[object Array]';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var objToString = objectProto.toString;
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeIsArray = (0, _lodashInternalGetNative['default'])(Array, 'isArray');
+
+ /**
+ * Checks if `value` is classified as an `Array` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isArray([1, 2, 3]);
+ * // => true
+ *
+ * _.isArray(function() { return arguments; }());
+ * // => false
+ */
+ var isArray = nativeIsArray || function (value) {
+ return (0, _lodashInternalIsObjectLike['default'])(value) && (0, _lodashInternalIsLength['default'])(value.length) && objToString.call(value) == arrayTag;
+ };
+
+ exports['default'] = isArray;
+});
+define('lodash/lang/isBoolean', ['exports', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalIsObjectLike) {
+ 'use strict';
+
+ /** `Object#toString` result references. */
+ var boolTag = '[object Boolean]';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var objToString = objectProto.toString;
+
+ /**
+ * Checks if `value` is classified as a boolean primitive or object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isBoolean(false);
+ * // => true
+ *
+ * _.isBoolean(null);
+ * // => false
+ */
+ function isBoolean(value) {
+ return value === true || value === false || (0, _lodashInternalIsObjectLike['default'])(value) && objToString.call(value) == boolTag;
+ }
+
+ exports['default'] = isBoolean;
+});
+define('lodash/lang/isDate', ['exports', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalIsObjectLike) {
+ 'use strict';
+
+ /** `Object#toString` result references. */
+ var dateTag = '[object Date]';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var objToString = objectProto.toString;
+
+ /**
+ * Checks if `value` is classified as a `Date` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isDate(new Date);
+ * // => true
+ *
+ * _.isDate('Mon April 23 2012');
+ * // => false
+ */
+ function isDate(value) {
+ return (0, _lodashInternalIsObjectLike['default'])(value) && objToString.call(value) == dateTag;
+ }
+
+ exports['default'] = isDate;
+});
+define('lodash/lang/isElement', ['exports', 'lodash/internal/isObjectLike', 'lodash/lang/isPlainObject'], function (exports, _lodashInternalIsObjectLike, _lodashLangIsPlainObject) {
+ 'use strict';
+
+ /**
+ * Checks if `value` is a DOM element.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
+ * @example
+ *
+ * _.isElement(document.body);
+ * // => true
+ *
+ * _.isElement('');
+ * // => false
+ */
+ function isElement(value) {
+ return !!value && value.nodeType === 1 && (0, _lodashInternalIsObjectLike['default'])(value) && !(0, _lodashLangIsPlainObject['default'])(value);
+ }
+
+ exports['default'] = isElement;
+});
+define('lodash/lang/isEmpty', ['exports', 'lodash/lang/isArguments', 'lodash/lang/isArray', 'lodash/internal/isArrayLike', 'lodash/lang/isFunction', 'lodash/internal/isObjectLike', 'lodash/lang/isString', 'lodash/object/keys'], function (exports, _lodashLangIsArguments, _lodashLangIsArray, _lodashInternalIsArrayLike, _lodashLangIsFunction, _lodashInternalIsObjectLike, _lodashLangIsString, _lodashObjectKeys) {
+ 'use strict';
+
+ /**
+ * Checks if `value` is empty. A value is considered empty unless it's an
+ * `arguments` object, array, string, or jQuery-like collection with a length
+ * greater than `0` or an object with own enumerable properties.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {Array|Object|string} value The value to inspect.
+ * @returns {boolean} Returns `true` if `value` is empty, else `false`.
+ * @example
+ *
+ * _.isEmpty(null);
+ * // => true
+ *
+ * _.isEmpty(true);
+ * // => true
+ *
+ * _.isEmpty(1);
+ * // => true
+ *
+ * _.isEmpty([1, 2, 3]);
+ * // => false
+ *
+ * _.isEmpty({ 'a': 1 });
+ * // => false
+ */
+ function isEmpty(value) {
+ if (value == null) {
+ return true;
+ }
+ if ((0, _lodashInternalIsArrayLike['default'])(value) && ((0, _lodashLangIsArray['default'])(value) || (0, _lodashLangIsString['default'])(value) || (0, _lodashLangIsArguments['default'])(value) || (0, _lodashInternalIsObjectLike['default'])(value) && (0, _lodashLangIsFunction['default'])(value.splice))) {
+ return !value.length;
+ }
+ return !(0, _lodashObjectKeys['default'])(value).length;
+ }
+
+ exports['default'] = isEmpty;
+});
+define('lodash/lang/isEqual', ['exports', 'lodash/internal/baseIsEqual', 'lodash/internal/bindCallback'], function (exports, _lodashInternalBaseIsEqual, _lodashInternalBindCallback) {
+ 'use strict';
+
+ /**
+ * Performs a deep comparison between two values to determine if they are
+ * equivalent. If `customizer` is provided it's invoked to compare values.
+ * If `customizer` returns `undefined` comparisons are handled by the method
+ * instead. The `customizer` is bound to `thisArg` and invoked with up to
+ * three arguments: (value, other [, index|key]).
+ *
+ * **Note:** This method supports comparing arrays, booleans, `Date` objects,
+ * numbers, `Object` objects, regexes, and strings. Objects are compared by
+ * their own, not inherited, enumerable properties. Functions and DOM nodes
+ * are **not** supported. Provide a customizer function to extend support
+ * for comparing other values.
+ *
+ * @static
+ * @memberOf _
+ * @alias eq
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @param {Function} [customizer] The function to customize value comparisons.
+ * @param {*} [thisArg] The `this` binding of `customizer`.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+ * @example
+ *
+ * var object = { 'user': 'fred' };
+ * var other = { 'user': 'fred' };
+ *
+ * object == other;
+ * // => false
+ *
+ * _.isEqual(object, other);
+ * // => true
+ *
+ * // using a customizer callback
+ * var array = ['hello', 'goodbye'];
+ * var other = ['hi', 'goodbye'];
+ *
+ * _.isEqual(array, other, function(value, other) {
+ * if (_.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/)) {
+ * return true;
+ * }
+ * });
+ * // => true
+ */
+ function isEqual(value, other, customizer, thisArg) {
+ customizer = typeof customizer == 'function' ? (0, _lodashInternalBindCallback['default'])(customizer, thisArg, 3) : undefined;
+ var result = customizer ? customizer(value, other) : undefined;
+ return result === undefined ? (0, _lodashInternalBaseIsEqual['default'])(value, other, customizer) : !!result;
+ }
+
+ exports['default'] = isEqual;
+});
+define('lodash/lang/isError', ['exports', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalIsObjectLike) {
+ 'use strict';
+
+ /** `Object#toString` result references. */
+ var errorTag = '[object Error]';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var objToString = objectProto.toString;
+
+ /**
+ * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
+ * `SyntaxError`, `TypeError`, or `URIError` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
+ * @example
+ *
+ * _.isError(new Error);
+ * // => true
+ *
+ * _.isError(Error);
+ * // => false
+ */
+ function isError(value) {
+ return (0, _lodashInternalIsObjectLike['default'])(value) && typeof value.message == 'string' && objToString.call(value) == errorTag;
+ }
+
+ exports['default'] = isError;
+});
+define('lodash/lang/isFinite', ['exports', 'lodash/internal/root'], function (exports, _lodashInternalRoot) {
+ 'use strict';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeIsFinite = _lodashInternalRoot['default'].isFinite;
+
+ /**
+ * Checks if `value` is a finite primitive number.
+ *
+ * **Note:** This method is based on [`Number.isFinite`](http://ecma-international.org/ecma-262/6.0/#sec-number.isfinite).
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
+ * @example
+ *
+ * _.isFinite(10);
+ * // => true
+ *
+ * _.isFinite('10');
+ * // => false
+ *
+ * _.isFinite(true);
+ * // => false
+ *
+ * _.isFinite(Object(10));
+ * // => false
+ *
+ * _.isFinite(Infinity);
+ * // => false
+ */
+ function isFinite(value) {
+ return typeof value == 'number' && nativeIsFinite(value);
+ }
+
+ exports['default'] = isFinite;
+});
+define('lodash/lang/isFunction', ['exports', 'lodash/lang/isObject'], function (exports, _lodashLangIsObject) {
+ 'use strict';
+
+ /** `Object#toString` result references. */
+ var funcTag = '[object Function]';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var objToString = objectProto.toString;
+
+ /**
+ * Checks if `value` is classified as a `Function` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isFunction(_);
+ * // => true
+ *
+ * _.isFunction(/abc/);
+ * // => false
+ */
+ function isFunction(value) {
+ // The use of `Object#toString` avoids issues with the `typeof` operator
+ // in older versions of Chrome and Safari which return 'function' for regexes
+ // and Safari 8 which returns 'object' for typed array constructors.
+ return (0, _lodashLangIsObject['default'])(value) && objToString.call(value) == funcTag;
+ }
+
+ exports['default'] = isFunction;
+});
+define('lodash/lang/isMatch', ['exports', 'lodash/internal/baseIsMatch', 'lodash/internal/bindCallback', 'lodash/internal/getMatchData'], function (exports, _lodashInternalBaseIsMatch, _lodashInternalBindCallback, _lodashInternalGetMatchData) {
+ 'use strict';
+
+ /**
+ * Performs a deep comparison between `object` and `source` to determine if
+ * `object` contains equivalent property values. If `customizer` is provided
+ * it's invoked to compare values. If `customizer` returns `undefined`
+ * comparisons are handled by the method instead. The `customizer` is bound
+ * to `thisArg` and invoked with three arguments: (value, other, index|key).
+ *
+ * **Note:** This method supports comparing properties of arrays, booleans,
+ * `Date` objects, numbers, `Object` objects, regexes, and strings. Functions
+ * and DOM nodes are **not** supported. Provide a customizer function to extend
+ * support for comparing other values.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {Object} object The object to inspect.
+ * @param {Object} source The object of property values to match.
+ * @param {Function} [customizer] The function to customize value comparisons.
+ * @param {*} [thisArg] The `this` binding of `customizer`.
+ * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+ * @example
+ *
+ * var object = { 'user': 'fred', 'age': 40 };
+ *
+ * _.isMatch(object, { 'age': 40 });
+ * // => true
+ *
+ * _.isMatch(object, { 'age': 36 });
+ * // => false
+ *
+ * // using a customizer callback
+ * var object = { 'greeting': 'hello' };
+ * var source = { 'greeting': 'hi' };
+ *
+ * _.isMatch(object, source, function(value, other) {
+ * return _.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/) || undefined;
+ * });
+ * // => true
+ */
+ function isMatch(object, source, customizer, thisArg) {
+ customizer = typeof customizer == 'function' ? (0, _lodashInternalBindCallback['default'])(customizer, thisArg, 3) : undefined;
+ return (0, _lodashInternalBaseIsMatch['default'])(object, (0, _lodashInternalGetMatchData['default'])(source), customizer);
+ }
+
+ exports['default'] = isMatch;
+});
+define('lodash/lang/isNaN', ['exports', 'lodash/lang/isNumber'], function (exports, _lodashLangIsNumber) {
+ 'use strict';
+
+ /**
+ * Checks if `value` is `NaN`.
+ *
+ * **Note:** This method is not the same as [`isNaN`](https://es5.github.io/#x15.1.2.4)
+ * which returns `true` for `undefined` and other non-numeric values.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
+ * @example
+ *
+ * _.isNaN(NaN);
+ * // => true
+ *
+ * _.isNaN(new Number(NaN));
+ * // => true
+ *
+ * isNaN(undefined);
+ * // => true
+ *
+ * _.isNaN(undefined);
+ * // => false
+ */
+ function isNaN(value) {
+ // An `NaN` primitive is the only value that is not equal to itself.
+ // Perform the `toStringTag` check first to avoid errors with some host objects in IE.
+ return (0, _lodashLangIsNumber['default'])(value) && value != +value;
+ }
+
+ exports['default'] = isNaN;
+});
+define('lodash/lang/isNative', ['exports', 'lodash/lang/isFunction', 'lodash/internal/isObjectLike'], function (exports, _lodashLangIsFunction, _lodashInternalIsObjectLike) {
+ 'use strict';
+
+ /** Used to detect host constructors (Safari > 5). */
+ var reIsHostCtor = /^\[object .+?Constructor\]$/;
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /** Used to resolve the decompiled source of functions. */
+ var fnToString = Function.prototype.toString;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty = objectProto.hasOwnProperty;
+
+ /** Used to detect if a method is native. */
+ var reIsNative = RegExp('^' + fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&').replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$');
+
+ /**
+ * Checks if `value` is a native function.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
+ * @example
+ *
+ * _.isNative(Array.prototype.push);
+ * // => true
+ *
+ * _.isNative(_);
+ * // => false
+ */
+ function isNative(value) {
+ if (value == null) {
+ return false;
+ }
+ if ((0, _lodashLangIsFunction['default'])(value)) {
+ return reIsNative.test(fnToString.call(value));
+ }
+ return (0, _lodashInternalIsObjectLike['default'])(value) && reIsHostCtor.test(value);
+ }
+
+ exports['default'] = isNative;
+});
+define("lodash/lang/isNull", ["exports"], function (exports) {
+ /**
+ * Checks if `value` is `null`.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
+ * @example
+ *
+ * _.isNull(null);
+ * // => true
+ *
+ * _.isNull(void 0);
+ * // => false
+ */
+ "use strict";
+
+ function isNull(value) {
+ return value === null;
+ }
+
+ exports["default"] = isNull;
+});
+define('lodash/lang/isNumber', ['exports', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalIsObjectLike) {
+ 'use strict';
+
+ /** `Object#toString` result references. */
+ var numberTag = '[object Number]';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var objToString = objectProto.toString;
+
+ /**
+ * Checks if `value` is classified as a `Number` primitive or object.
+ *
+ * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are classified
+ * as numbers, use the `_.isFinite` method.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isNumber(8.4);
+ * // => true
+ *
+ * _.isNumber(NaN);
+ * // => true
+ *
+ * _.isNumber('8.4');
+ * // => false
+ */
+ function isNumber(value) {
+ return typeof value == 'number' || (0, _lodashInternalIsObjectLike['default'])(value) && objToString.call(value) == numberTag;
+ }
+
+ exports['default'] = isNumber;
+});
+define('lodash/lang/isObject', ['exports'], function (exports) {
+ /**
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(1);
+ * // => false
+ */
+ 'use strict';
+
+ function isObject(value) {
+ // Avoid a V8 JIT bug in Chrome 19-20.
+ // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
+ var type = typeof value;
+ return !!value && (type == 'object' || type == 'function');
+ }
+
+ exports['default'] = isObject;
+});
+define('lodash/lang/isPlainObject', ['exports', 'lodash/internal/baseForIn', 'lodash/lang/isArguments', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalBaseForIn, _lodashLangIsArguments, _lodashInternalIsObjectLike) {
+ 'use strict';
+
+ /** `Object#toString` result references. */
+ var objectTag = '[object Object]';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty = objectProto.hasOwnProperty;
+
+ /**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var objToString = objectProto.toString;
+
+ /**
+ * Checks if `value` is a plain object, that is, an object created by the
+ * `Object` constructor or one with a `[[Prototype]]` of `null`.
+ *
+ * **Note:** This method assumes objects created by the `Object` constructor
+ * have no inherited enumerable properties.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * }
+ *
+ * _.isPlainObject(new Foo);
+ * // => false
+ *
+ * _.isPlainObject([1, 2, 3]);
+ * // => false
+ *
+ * _.isPlainObject({ 'x': 0, 'y': 0 });
+ * // => true
+ *
+ * _.isPlainObject(Object.create(null));
+ * // => true
+ */
+ function isPlainObject(value) {
+ var Ctor;
+
+ // Exit early for non `Object` objects.
+ if (!((0, _lodashInternalIsObjectLike['default'])(value) && objToString.call(value) == objectTag && !(0, _lodashLangIsArguments['default'])(value)) || !hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor))) {
+ return false;
+ }
+ // IE < 9 iterates inherited properties before own properties. If the first
+ // iterated property is an object's own property then there are no inherited
+ // enumerable properties.
+ var result;
+ // In most environments an object's own properties are iterated before
+ // its inherited properties. If the last iterated property is an object's
+ // own property then there are no inherited enumerable properties.
+ (0, _lodashInternalBaseForIn['default'])(value, function (subValue, key) {
+ result = key;
+ });
+ return result === undefined || hasOwnProperty.call(value, result);
+ }
+
+ exports['default'] = isPlainObject;
+});
+define('lodash/lang/isRegExp', ['exports', 'lodash/lang/isObject'], function (exports, _lodashLangIsObject) {
+ 'use strict';
+
+ /** `Object#toString` result references. */
+ var regexpTag = '[object RegExp]';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var objToString = objectProto.toString;
+
+ /**
+ * Checks if `value` is classified as a `RegExp` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isRegExp(/abc/);
+ * // => true
+ *
+ * _.isRegExp('/abc/');
+ * // => false
+ */
+ function isRegExp(value) {
+ return (0, _lodashLangIsObject['default'])(value) && objToString.call(value) == regexpTag;
+ }
+
+ exports['default'] = isRegExp;
+});
+define('lodash/lang/isString', ['exports', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalIsObjectLike) {
+ 'use strict';
+
+ /** `Object#toString` result references. */
+ var stringTag = '[object String]';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var objToString = objectProto.toString;
+
+ /**
+ * Checks if `value` is classified as a `String` primitive or object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isString('abc');
+ * // => true
+ *
+ * _.isString(1);
+ * // => false
+ */
+ function isString(value) {
+ return typeof value == 'string' || (0, _lodashInternalIsObjectLike['default'])(value) && objToString.call(value) == stringTag;
+ }
+
+ exports['default'] = isString;
+});
+define('lodash/lang/isTypedArray', ['exports', 'lodash/internal/isLength', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalIsLength, _lodashInternalIsObjectLike) {
+ 'use strict';
+
+ /** `Object#toString` result references. */
+ var argsTag = '[object Arguments]',
+ arrayTag = '[object Array]',
+ boolTag = '[object Boolean]',
+ dateTag = '[object Date]',
+ errorTag = '[object Error]',
+ funcTag = '[object Function]',
+ mapTag = '[object Map]',
+ numberTag = '[object Number]',
+ objectTag = '[object Object]',
+ regexpTag = '[object RegExp]',
+ setTag = '[object Set]',
+ stringTag = '[object String]',
+ weakMapTag = '[object WeakMap]';
+
+ var arrayBufferTag = '[object ArrayBuffer]',
+ float32Tag = '[object Float32Array]',
+ float64Tag = '[object Float64Array]',
+ int8Tag = '[object Int8Array]',
+ int16Tag = '[object Int16Array]',
+ int32Tag = '[object Int32Array]',
+ uint8Tag = '[object Uint8Array]',
+ uint8ClampedTag = '[object Uint8ClampedArray]',
+ uint16Tag = '[object Uint16Array]',
+ uint32Tag = '[object Uint32Array]';
+
+ /** Used to identify `toStringTag` values of typed arrays. */
+ var typedArrayTags = {};
+ typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;
+ typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var objToString = objectProto.toString;
+
+ /**
+ * Checks if `value` is classified as a typed array.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isTypedArray(new Uint8Array);
+ * // => true
+ *
+ * _.isTypedArray([]);
+ * // => false
+ */
+ function isTypedArray(value) {
+ return (0, _lodashInternalIsObjectLike['default'])(value) && (0, _lodashInternalIsLength['default'])(value.length) && !!typedArrayTags[objToString.call(value)];
+ }
+
+ exports['default'] = isTypedArray;
+});
+define("lodash/lang/isUndefined", ["exports"], function (exports) {
+ /**
+ * Checks if `value` is `undefined`.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
+ * @example
+ *
+ * _.isUndefined(void 0);
+ * // => true
+ *
+ * _.isUndefined(null);
+ * // => false
+ */
+ "use strict";
+
+ function isUndefined(value) {
+ return value === undefined;
+ }
+
+ exports["default"] = isUndefined;
+});
+define("lodash/lang/lt", ["exports"], function (exports) {
+ /**
+ * Checks if `value` is less than `other`.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is less than `other`, else `false`.
+ * @example
+ *
+ * _.lt(1, 3);
+ * // => true
+ *
+ * _.lt(3, 3);
+ * // => false
+ *
+ * _.lt(3, 1);
+ * // => false
+ */
+ "use strict";
+
+ function lt(value, other) {
+ return value < other;
+ }
+
+ exports["default"] = lt;
+});
+define("lodash/lang/lte", ["exports"], function (exports) {
+ /**
+ * Checks if `value` is less than or equal to `other`.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is less than or equal to `other`, else `false`.
+ * @example
+ *
+ * _.lte(1, 3);
+ * // => true
+ *
+ * _.lte(3, 3);
+ * // => true
+ *
+ * _.lte(3, 1);
+ * // => false
+ */
+ "use strict";
+
+ function lte(value, other) {
+ return value <= other;
+ }
+
+ exports["default"] = lte;
+});
+define('lodash/lang/toArray', ['exports', 'lodash/internal/arrayCopy', 'lodash/internal/getLength', 'lodash/internal/isLength', 'lodash/object/values'], function (exports, _lodashInternalArrayCopy, _lodashInternalGetLength, _lodashInternalIsLength, _lodashObjectValues) {
+ 'use strict';
+
+ /**
+ * Converts `value` to an array.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {Array} Returns the converted array.
+ * @example
+ *
+ * (function() {
+ * return _.toArray(arguments).slice(1);
+ * }(1, 2, 3));
+ * // => [2, 3]
+ */
+ function toArray(value) {
+ var length = value ? (0, _lodashInternalGetLength['default'])(value) : 0;
+ if (!(0, _lodashInternalIsLength['default'])(length)) {
+ return (0, _lodashObjectValues['default'])(value);
+ }
+ if (!length) {
+ return [];
+ }
+ return (0, _lodashInternalArrayCopy['default'])(value);
+ }
+
+ exports['default'] = toArray;
+});
+define('lodash/lang/toPlainObject', ['exports', 'lodash/internal/baseCopy', 'lodash/object/keysIn'], function (exports, _lodashInternalBaseCopy, _lodashObjectKeysIn) {
+ 'use strict';
+
+ /**
+ * Converts `value` to a plain object flattening inherited enumerable
+ * properties of `value` to own properties of the plain object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {Object} Returns the converted plain object.
+ * @example
+ *
+ * function Foo() {
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.assign({ 'a': 1 }, new Foo);
+ * // => { 'a': 1, 'b': 2 }
+ *
+ * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
+ * // => { 'a': 1, 'b': 2, 'c': 3 }
+ */
+ function toPlainObject(value) {
+ return (0, _lodashInternalBaseCopy['default'])(value, (0, _lodashObjectKeysIn['default'])(value));
+ }
+
+ exports['default'] = toPlainObject;
+});
+define('lodash/lodash', ['exports', 'lodash/array', 'lodash/chain', 'lodash/collection', 'lodash/date', 'lodash/function', 'lodash/lang', 'lodash/math', 'lodash/number', 'lodash/object', 'lodash/string', 'lodash/utility', 'lodash/internal/LazyWrapper', 'lodash/internal/LodashWrapper', 'lodash/internal/arrayEach', 'lodash/internal/arrayPush', 'lodash/internal/baseCallback', 'lodash/internal/baseForOwn', 'lodash/internal/baseFunctions', 'lodash/internal/baseMatches', 'lodash/internal/createHybridWrapper', 'lodash/utility/identity', 'lodash/lang/isArray', 'lodash/lang/isObject', 'lodash/object/keys', 'lodash/array/last', 'lodash/internal/lazyClone', 'lodash/internal/lazyReverse', 'lodash/internal/lazyValue', 'lodash/chain/lodash', 'lodash/utility/mixin', 'lodash/utility/property', 'lodash/internal/realNames', 'lodash/support', 'lodash/chain/thru'], function (exports, _lodashArray, _lodashChain, _lodashCollection, _lodashDate, _lodashFunction, _lodashLang, _lodashMath, _lodashNumber, _lodashObject, _lodashString, _lodashUtility, _lodashInternalLazyWrapper, _lodashInternalLodashWrapper, _lodashInternalArrayEach, _lodashInternalArrayPush, _lodashInternalBaseCallback, _lodashInternalBaseForOwn, _lodashInternalBaseFunctions, _lodashInternalBaseMatches, _lodashInternalCreateHybridWrapper, _lodashUtilityIdentity, _lodashLangIsArray, _lodashLangIsObject, _lodashObjectKeys, _lodashArrayLast, _lodashInternalLazyClone, _lodashInternalLazyReverse, _lodashInternalLazyValue, _lodashChainLodash, _lodashUtilityMixin, _lodashUtilityProperty, _lodashInternalRealNames, _lodashSupport, _lodashChainThru) {
+ /**
+ * @license
+ * lodash 3.10.1 (Custom Build)
+ * Build: `lodash modularize modern exports="es" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation
+ * Based on Underscore.js 1.8.3
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license
+ */
+ 'use strict';
+
+ /** Used as the semantic version number. */
+ var VERSION = '3.10.1';
+
+ /** Used to compose bitmasks for wrapper metadata. */
+ var BIND_KEY_FLAG = 2;
+
+ /** Used to indicate the type of lazy iteratees. */
+ var LAZY_MAP_FLAG = 2;
+
+ /** Used for native method references. */
+ var arrayProto = Array.prototype,
+ stringProto = String.prototype;
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeFloor = Math.floor,
+ nativeMax = Math.max,
+ nativeMin = Math.min;
+
+ /** Used as references for `-Infinity` and `Infinity`. */
+ var POSITIVE_INFINITY = Number.POSITIVE_INFINITY;
+
+ // wrap `_.mixin` so it works when provided only one argument
+ var mixin = (function (func) {
+ return function (object, source, options) {
+ if (options == null) {
+ var isObj = (0, _lodashLangIsObject['default'])(source),
+ props = isObj && (0, _lodashObjectKeys['default'])(source),
+ methodNames = props && props.length && (0, _lodashInternalBaseFunctions['default'])(source, props);
+
+ if (!(methodNames ? methodNames.length : isObj)) {
+ options = source;
+ source = object;
+ object = this;
+ }
+ }
+ return func(object, source, options);
+ };
+ })(_lodashUtilityMixin['default']);
+
+ // Add functions that return wrapped values when chaining.
+ _lodashChainLodash['default'].after = _lodashFunction['default'].after;
+ _lodashChainLodash['default'].ary = _lodashFunction['default'].ary;
+ _lodashChainLodash['default'].assign = _lodashObject['default'].assign;
+ _lodashChainLodash['default'].at = _lodashCollection['default'].at;
+ _lodashChainLodash['default'].before = _lodashFunction['default'].before;
+ _lodashChainLodash['default'].bind = _lodashFunction['default'].bind;
+ _lodashChainLodash['default'].bindAll = _lodashFunction['default'].bindAll;
+ _lodashChainLodash['default'].bindKey = _lodashFunction['default'].bindKey;
+ _lodashChainLodash['default'].callback = _lodashUtility['default'].callback;
+ _lodashChainLodash['default'].chain = _lodashChain['default'].chain;
+ _lodashChainLodash['default'].chunk = _lodashArray['default'].chunk;
+ _lodashChainLodash['default'].compact = _lodashArray['default'].compact;
+ _lodashChainLodash['default'].constant = _lodashUtility['default'].constant;
+ _lodashChainLodash['default'].countBy = _lodashCollection['default'].countBy;
+ _lodashChainLodash['default'].create = _lodashObject['default'].create;
+ _lodashChainLodash['default'].curry = _lodashFunction['default'].curry;
+ _lodashChainLodash['default'].curryRight = _lodashFunction['default'].curryRight;
+ _lodashChainLodash['default'].debounce = _lodashFunction['default'].debounce;
+ _lodashChainLodash['default'].defaults = _lodashObject['default'].defaults;
+ _lodashChainLodash['default'].defaultsDeep = _lodashObject['default'].defaultsDeep;
+ _lodashChainLodash['default'].defer = _lodashFunction['default'].defer;
+ _lodashChainLodash['default'].delay = _lodashFunction['default'].delay;
+ _lodashChainLodash['default'].difference = _lodashArray['default'].difference;
+ _lodashChainLodash['default'].drop = _lodashArray['default'].drop;
+ _lodashChainLodash['default'].dropRight = _lodashArray['default'].dropRight;
+ _lodashChainLodash['default'].dropRightWhile = _lodashArray['default'].dropRightWhile;
+ _lodashChainLodash['default'].dropWhile = _lodashArray['default'].dropWhile;
+ _lodashChainLodash['default'].fill = _lodashArray['default'].fill;
+ _lodashChainLodash['default'].filter = _lodashCollection['default'].filter;
+ _lodashChainLodash['default'].flatten = _lodashArray['default'].flatten;
+ _lodashChainLodash['default'].flattenDeep = _lodashArray['default'].flattenDeep;
+ _lodashChainLodash['default'].flow = _lodashFunction['default'].flow;
+ _lodashChainLodash['default'].flowRight = _lodashFunction['default'].flowRight;
+ _lodashChainLodash['default'].forEach = _lodashCollection['default'].forEach;
+ _lodashChainLodash['default'].forEachRight = _lodashCollection['default'].forEachRight;
+ _lodashChainLodash['default'].forIn = _lodashObject['default'].forIn;
+ _lodashChainLodash['default'].forInRight = _lodashObject['default'].forInRight;
+ _lodashChainLodash['default'].forOwn = _lodashObject['default'].forOwn;
+ _lodashChainLodash['default'].forOwnRight = _lodashObject['default'].forOwnRight;
+ _lodashChainLodash['default'].functions = _lodashObject['default'].functions;
+ _lodashChainLodash['default'].groupBy = _lodashCollection['default'].groupBy;
+ _lodashChainLodash['default'].indexBy = _lodashCollection['default'].indexBy;
+ _lodashChainLodash['default'].initial = _lodashArray['default'].initial;
+ _lodashChainLodash['default'].intersection = _lodashArray['default'].intersection;
+ _lodashChainLodash['default'].invert = _lodashObject['default'].invert;
+ _lodashChainLodash['default'].invoke = _lodashCollection['default'].invoke;
+ _lodashChainLodash['default'].keys = _lodashObjectKeys['default'];
+ _lodashChainLodash['default'].keysIn = _lodashObject['default'].keysIn;
+ _lodashChainLodash['default'].map = _lodashCollection['default'].map;
+ _lodashChainLodash['default'].mapKeys = _lodashObject['default'].mapKeys;
+ _lodashChainLodash['default'].mapValues = _lodashObject['default'].mapValues;
+ _lodashChainLodash['default'].matches = _lodashUtility['default'].matches;
+ _lodashChainLodash['default'].matchesProperty = _lodashUtility['default'].matchesProperty;
+ _lodashChainLodash['default'].memoize = _lodashFunction['default'].memoize;
+ _lodashChainLodash['default'].merge = _lodashObject['default'].merge;
+ _lodashChainLodash['default'].method = _lodashUtility['default'].method;
+ _lodashChainLodash['default'].methodOf = _lodashUtility['default'].methodOf;
+ _lodashChainLodash['default'].mixin = mixin;
+ _lodashChainLodash['default'].modArgs = _lodashFunction['default'].modArgs;
+ _lodashChainLodash['default'].negate = _lodashFunction['default'].negate;
+ _lodashChainLodash['default'].omit = _lodashObject['default'].omit;
+ _lodashChainLodash['default'].once = _lodashFunction['default'].once;
+ _lodashChainLodash['default'].pairs = _lodashObject['default'].pairs;
+ _lodashChainLodash['default'].partial = _lodashFunction['default'].partial;
+ _lodashChainLodash['default'].partialRight = _lodashFunction['default'].partialRight;
+ _lodashChainLodash['default'].partition = _lodashCollection['default'].partition;
+ _lodashChainLodash['default'].pick = _lodashObject['default'].pick;
+ _lodashChainLodash['default'].pluck = _lodashCollection['default'].pluck;
+ _lodashChainLodash['default'].property = _lodashUtilityProperty['default'];
+ _lodashChainLodash['default'].propertyOf = _lodashUtility['default'].propertyOf;
+ _lodashChainLodash['default'].pull = _lodashArray['default'].pull;
+ _lodashChainLodash['default'].pullAt = _lodashArray['default'].pullAt;
+ _lodashChainLodash['default'].range = _lodashUtility['default'].range;
+ _lodashChainLodash['default'].rearg = _lodashFunction['default'].rearg;
+ _lodashChainLodash['default'].reject = _lodashCollection['default'].reject;
+ _lodashChainLodash['default'].remove = _lodashArray['default'].remove;
+ _lodashChainLodash['default'].rest = _lodashArray['default'].rest;
+ _lodashChainLodash['default'].restParam = _lodashFunction['default'].restParam;
+ _lodashChainLodash['default'].set = _lodashObject['default'].set;
+ _lodashChainLodash['default'].shuffle = _lodashCollection['default'].shuffle;
+ _lodashChainLodash['default'].slice = _lodashArray['default'].slice;
+ _lodashChainLodash['default'].sortBy = _lodashCollection['default'].sortBy;
+ _lodashChainLodash['default'].sortByAll = _lodashCollection['default'].sortByAll;
+ _lodashChainLodash['default'].sortByOrder = _lodashCollection['default'].sortByOrder;
+ _lodashChainLodash['default'].spread = _lodashFunction['default'].spread;
+ _lodashChainLodash['default'].take = _lodashArray['default'].take;
+ _lodashChainLodash['default'].takeRight = _lodashArray['default'].takeRight;
+ _lodashChainLodash['default'].takeRightWhile = _lodashArray['default'].takeRightWhile;
+ _lodashChainLodash['default'].takeWhile = _lodashArray['default'].takeWhile;
+ _lodashChainLodash['default'].tap = _lodashChain['default'].tap;
+ _lodashChainLodash['default'].throttle = _lodashFunction['default'].throttle;
+ _lodashChainLodash['default'].thru = _lodashChainThru['default'];
+ _lodashChainLodash['default'].times = _lodashUtility['default'].times;
+ _lodashChainLodash['default'].toArray = _lodashLang['default'].toArray;
+ _lodashChainLodash['default'].toPlainObject = _lodashLang['default'].toPlainObject;
+ _lodashChainLodash['default'].transform = _lodashObject['default'].transform;
+ _lodashChainLodash['default'].union = _lodashArray['default'].union;
+ _lodashChainLodash['default'].uniq = _lodashArray['default'].uniq;
+ _lodashChainLodash['default'].unzip = _lodashArray['default'].unzip;
+ _lodashChainLodash['default'].unzipWith = _lodashArray['default'].unzipWith;
+ _lodashChainLodash['default'].values = _lodashObject['default'].values;
+ _lodashChainLodash['default'].valuesIn = _lodashObject['default'].valuesIn;
+ _lodashChainLodash['default'].where = _lodashCollection['default'].where;
+ _lodashChainLodash['default'].without = _lodashArray['default'].without;
+ _lodashChainLodash['default'].wrap = _lodashFunction['default'].wrap;
+ _lodashChainLodash['default'].xor = _lodashArray['default'].xor;
+ _lodashChainLodash['default'].zip = _lodashArray['default'].zip;
+ _lodashChainLodash['default'].zipObject = _lodashArray['default'].zipObject;
+ _lodashChainLodash['default'].zipWith = _lodashArray['default'].zipWith;
+
+ // Add aliases.
+ _lodashChainLodash['default'].backflow = _lodashFunction['default'].flowRight;
+ _lodashChainLodash['default'].collect = _lodashCollection['default'].map;
+ _lodashChainLodash['default'].compose = _lodashFunction['default'].flowRight;
+ _lodashChainLodash['default'].each = _lodashCollection['default'].forEach;
+ _lodashChainLodash['default'].eachRight = _lodashCollection['default'].forEachRight;
+ _lodashChainLodash['default'].extend = _lodashObject['default'].assign;
+ _lodashChainLodash['default'].iteratee = _lodashUtility['default'].callback;
+ _lodashChainLodash['default'].methods = _lodashObject['default'].functions;
+ _lodashChainLodash['default'].object = _lodashArray['default'].zipObject;
+ _lodashChainLodash['default'].select = _lodashCollection['default'].filter;
+ _lodashChainLodash['default'].tail = _lodashArray['default'].rest;
+ _lodashChainLodash['default'].unique = _lodashArray['default'].uniq;
+
+ // Add functions to `lodash.prototype`.
+ mixin(_lodashChainLodash['default'], _lodashChainLodash['default']);
+
+ // Add functions that return unwrapped values when chaining.
+ _lodashChainLodash['default'].add = _lodashMath['default'].add;
+ _lodashChainLodash['default'].attempt = _lodashUtility['default'].attempt;
+ _lodashChainLodash['default'].camelCase = _lodashString['default'].camelCase;
+ _lodashChainLodash['default'].capitalize = _lodashString['default'].capitalize;
+ _lodashChainLodash['default'].ceil = _lodashMath['default'].ceil;
+ _lodashChainLodash['default'].clone = _lodashLang['default'].clone;
+ _lodashChainLodash['default'].cloneDeep = _lodashLang['default'].cloneDeep;
+ _lodashChainLodash['default'].deburr = _lodashString['default'].deburr;
+ _lodashChainLodash['default'].endsWith = _lodashString['default'].endsWith;
+ _lodashChainLodash['default'].escape = _lodashString['default'].escape;
+ _lodashChainLodash['default'].escapeRegExp = _lodashString['default'].escapeRegExp;
+ _lodashChainLodash['default'].every = _lodashCollection['default'].every;
+ _lodashChainLodash['default'].find = _lodashCollection['default'].find;
+ _lodashChainLodash['default'].findIndex = _lodashArray['default'].findIndex;
+ _lodashChainLodash['default'].findKey = _lodashObject['default'].findKey;
+ _lodashChainLodash['default'].findLast = _lodashCollection['default'].findLast;
+ _lodashChainLodash['default'].findLastIndex = _lodashArray['default'].findLastIndex;
+ _lodashChainLodash['default'].findLastKey = _lodashObject['default'].findLastKey;
+ _lodashChainLodash['default'].findWhere = _lodashCollection['default'].findWhere;
+ _lodashChainLodash['default'].first = _lodashArray['default'].first;
+ _lodashChainLodash['default'].floor = _lodashMath['default'].floor;
+ _lodashChainLodash['default'].get = _lodashObject['default'].get;
+ _lodashChainLodash['default'].gt = _lodashLang['default'].gt;
+ _lodashChainLodash['default'].gte = _lodashLang['default'].gte;
+ _lodashChainLodash['default'].has = _lodashObject['default'].has;
+ _lodashChainLodash['default'].identity = _lodashUtilityIdentity['default'];
+ _lodashChainLodash['default'].includes = _lodashCollection['default'].includes;
+ _lodashChainLodash['default'].indexOf = _lodashArray['default'].indexOf;
+ _lodashChainLodash['default'].inRange = _lodashNumber['default'].inRange;
+ _lodashChainLodash['default'].isArguments = _lodashLang['default'].isArguments;
+ _lodashChainLodash['default'].isArray = _lodashLangIsArray['default'];
+ _lodashChainLodash['default'].isBoolean = _lodashLang['default'].isBoolean;
+ _lodashChainLodash['default'].isDate = _lodashLang['default'].isDate;
+ _lodashChainLodash['default'].isElement = _lodashLang['default'].isElement;
+ _lodashChainLodash['default'].isEmpty = _lodashLang['default'].isEmpty;
+ _lodashChainLodash['default'].isEqual = _lodashLang['default'].isEqual;
+ _lodashChainLodash['default'].isError = _lodashLang['default'].isError;
+ _lodashChainLodash['default'].isFinite = _lodashLang['default'].isFinite;
+ _lodashChainLodash['default'].isFunction = _lodashLang['default'].isFunction;
+ _lodashChainLodash['default'].isMatch = _lodashLang['default'].isMatch;
+ _lodashChainLodash['default'].isNaN = _lodashLang['default'].isNaN;
+ _lodashChainLodash['default'].isNative = _lodashLang['default'].isNative;
+ _lodashChainLodash['default'].isNull = _lodashLang['default'].isNull;
+ _lodashChainLodash['default'].isNumber = _lodashLang['default'].isNumber;
+ _lodashChainLodash['default'].isObject = _lodashLangIsObject['default'];
+ _lodashChainLodash['default'].isPlainObject = _lodashLang['default'].isPlainObject;
+ _lodashChainLodash['default'].isRegExp = _lodashLang['default'].isRegExp;
+ _lodashChainLodash['default'].isString = _lodashLang['default'].isString;
+ _lodashChainLodash['default'].isTypedArray = _lodashLang['default'].isTypedArray;
+ _lodashChainLodash['default'].isUndefined = _lodashLang['default'].isUndefined;
+ _lodashChainLodash['default'].kebabCase = _lodashString['default'].kebabCase;
+ _lodashChainLodash['default'].last = _lodashArrayLast['default'];
+ _lodashChainLodash['default'].lastIndexOf = _lodashArray['default'].lastIndexOf;
+ _lodashChainLodash['default'].lt = _lodashLang['default'].lt;
+ _lodashChainLodash['default'].lte = _lodashLang['default'].lte;
+ _lodashChainLodash['default'].max = _lodashMath['default'].max;
+ _lodashChainLodash['default'].min = _lodashMath['default'].min;
+ _lodashChainLodash['default'].noop = _lodashUtility['default'].noop;
+ _lodashChainLodash['default'].now = _lodashDate['default'].now;
+ _lodashChainLodash['default'].pad = _lodashString['default'].pad;
+ _lodashChainLodash['default'].padLeft = _lodashString['default'].padLeft;
+ _lodashChainLodash['default'].padRight = _lodashString['default'].padRight;
+ _lodashChainLodash['default'].parseInt = _lodashString['default'].parseInt;
+ _lodashChainLodash['default'].random = _lodashNumber['default'].random;
+ _lodashChainLodash['default'].reduce = _lodashCollection['default'].reduce;
+ _lodashChainLodash['default'].reduceRight = _lodashCollection['default'].reduceRight;
+ _lodashChainLodash['default'].repeat = _lodashString['default'].repeat;
+ _lodashChainLodash['default'].result = _lodashObject['default'].result;
+ _lodashChainLodash['default'].round = _lodashMath['default'].round;
+ _lodashChainLodash['default'].size = _lodashCollection['default'].size;
+ _lodashChainLodash['default'].snakeCase = _lodashString['default'].snakeCase;
+ _lodashChainLodash['default'].some = _lodashCollection['default'].some;
+ _lodashChainLodash['default'].sortedIndex = _lodashArray['default'].sortedIndex;
+ _lodashChainLodash['default'].sortedLastIndex = _lodashArray['default'].sortedLastIndex;
+ _lodashChainLodash['default'].startCase = _lodashString['default'].startCase;
+ _lodashChainLodash['default'].startsWith = _lodashString['default'].startsWith;
+ _lodashChainLodash['default'].sum = _lodashMath['default'].sum;
+ _lodashChainLodash['default'].template = _lodashString['default'].template;
+ _lodashChainLodash['default'].trim = _lodashString['default'].trim;
+ _lodashChainLodash['default'].trimLeft = _lodashString['default'].trimLeft;
+ _lodashChainLodash['default'].trimRight = _lodashString['default'].trimRight;
+ _lodashChainLodash['default'].trunc = _lodashString['default'].trunc;
+ _lodashChainLodash['default'].unescape = _lodashString['default'].unescape;
+ _lodashChainLodash['default'].uniqueId = _lodashUtility['default'].uniqueId;
+ _lodashChainLodash['default'].words = _lodashString['default'].words;
+
+ // Add aliases.
+ _lodashChainLodash['default'].all = _lodashCollection['default'].every;
+ _lodashChainLodash['default'].any = _lodashCollection['default'].some;
+ _lodashChainLodash['default'].contains = _lodashCollection['default'].includes;
+ _lodashChainLodash['default'].eq = _lodashLang['default'].isEqual;
+ _lodashChainLodash['default'].detect = _lodashCollection['default'].find;
+ _lodashChainLodash['default'].foldl = _lodashCollection['default'].reduce;
+ _lodashChainLodash['default'].foldr = _lodashCollection['default'].reduceRight;
+ _lodashChainLodash['default'].head = _lodashArray['default'].first;
+ _lodashChainLodash['default'].include = _lodashCollection['default'].includes;
+ _lodashChainLodash['default'].inject = _lodashCollection['default'].reduce;
+
+ mixin(_lodashChainLodash['default'], (function () {
+ var source = {};
+ (0, _lodashInternalBaseForOwn['default'])(_lodashChainLodash['default'], function (func, methodName) {
+ if (!_lodashChainLodash['default'].prototype[methodName]) {
+ source[methodName] = func;
+ }
+ });
+ return source;
+ })(), false);
+
+ // Add functions capable of returning wrapped and unwrapped values when chaining.
+ _lodashChainLodash['default'].sample = _lodashCollection['default'].sample;
+
+ _lodashChainLodash['default'].prototype.sample = function (n) {
+ if (!this.__chain__ && n == null) {
+ return _lodashCollection['default'].sample(this.value());
+ }
+ return this.thru(function (value) {
+ return _lodashCollection['default'].sample(value, n);
+ });
+ };
+
+ /**
+ * The semantic version number.
+ *
+ * @static
+ * @memberOf _
+ * @type string
+ */
+ _lodashChainLodash['default'].VERSION = VERSION;
+
+ _lodashChainLodash['default'].support = _lodashSupport['default'];
+ (_lodashChainLodash['default'].templateSettings = _lodashString['default'].templateSettings).imports._ = _lodashChainLodash['default'];
+
+ // Assign default placeholders.
+ (0, _lodashInternalArrayEach['default'])(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function (methodName) {
+ _lodashChainLodash['default'][methodName].placeholder = _lodashChainLodash['default'];
+ });
+
+ // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
+ (0, _lodashInternalArrayEach['default'])(['drop', 'take'], function (methodName, index) {
+ _lodashInternalLazyWrapper['default'].prototype[methodName] = function (n) {
+ var filtered = this.__filtered__;
+ if (filtered && !index) {
+ return new _lodashInternalLazyWrapper['default'](this);
+ }
+ n = n == null ? 1 : nativeMax(nativeFloor(n) || 0, 0);
+
+ var result = this.clone();
+ if (filtered) {
+ result.__takeCount__ = nativeMin(result.__takeCount__, n);
+ } else {
+ result.__views__.push({ 'size': n, 'type': methodName + (result.__dir__ < 0 ? 'Right' : '') });
+ }
+ return result;
+ };
+
+ _lodashInternalLazyWrapper['default'].prototype[methodName + 'Right'] = function (n) {
+ return this.reverse()[methodName](n).reverse();
+ };
+ });
+
+ // Add `LazyWrapper` methods that accept an `iteratee` value.
+ (0, _lodashInternalArrayEach['default'])(['filter', 'map', 'takeWhile'], function (methodName, index) {
+ var type = index + 1,
+ isFilter = type != LAZY_MAP_FLAG;
+
+ _lodashInternalLazyWrapper['default'].prototype[methodName] = function (iteratee, thisArg) {
+ var result = this.clone();
+ result.__iteratees__.push({ 'iteratee': (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 1), 'type': type });
+ result.__filtered__ = result.__filtered__ || isFilter;
+ return result;
+ };
+ });
+
+ // Add `LazyWrapper` methods for `_.first` and `_.last`.
+ (0, _lodashInternalArrayEach['default'])(['first', 'last'], function (methodName, index) {
+ var takeName = 'take' + (index ? 'Right' : '');
+
+ _lodashInternalLazyWrapper['default'].prototype[methodName] = function () {
+ return this[takeName](1).value()[0];
+ };
+ });
+
+ // Add `LazyWrapper` methods for `_.initial` and `_.rest`.
+ (0, _lodashInternalArrayEach['default'])(['initial', 'rest'], function (methodName, index) {
+ var dropName = 'drop' + (index ? '' : 'Right');
+
+ _lodashInternalLazyWrapper['default'].prototype[methodName] = function () {
+ return this.__filtered__ ? new _lodashInternalLazyWrapper['default'](this) : this[dropName](1);
+ };
+ });
+
+ // Add `LazyWrapper` methods for `_.pluck` and `_.where`.
+ (0, _lodashInternalArrayEach['default'])(['pluck', 'where'], function (methodName, index) {
+ var operationName = index ? 'filter' : 'map',
+ createCallback = index ? _lodashInternalBaseMatches['default'] : _lodashUtilityProperty['default'];
+
+ _lodashInternalLazyWrapper['default'].prototype[methodName] = function (value) {
+ return this[operationName](createCallback(value));
+ };
+ });
+
+ _lodashInternalLazyWrapper['default'].prototype.compact = function () {
+ return this.filter(_lodashUtilityIdentity['default']);
+ };
+
+ _lodashInternalLazyWrapper['default'].prototype.reject = function (predicate, thisArg) {
+ predicate = (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 1);
+ return this.filter(function (value) {
+ return !predicate(value);
+ });
+ };
+
+ _lodashInternalLazyWrapper['default'].prototype.slice = function (start, end) {
+ start = start == null ? 0 : +start || 0;
+
+ var result = this;
+ if (result.__filtered__ && (start > 0 || end < 0)) {
+ return new _lodashInternalLazyWrapper['default'](result);
+ }
+ if (start < 0) {
+ result = result.takeRight(-start);
+ } else if (start) {
+ result = result.drop(start);
+ }
+ if (end !== undefined) {
+ end = +end || 0;
+ result = end < 0 ? result.dropRight(-end) : result.take(end - start);
+ }
+ return result;
+ };
+
+ _lodashInternalLazyWrapper['default'].prototype.takeRightWhile = function (predicate, thisArg) {
+ return this.reverse().takeWhile(predicate, thisArg).reverse();
+ };
+
+ _lodashInternalLazyWrapper['default'].prototype.toArray = function () {
+ return this.take(POSITIVE_INFINITY);
+ };
+
+ // Add `LazyWrapper` methods to `lodash.prototype`.
+ (0, _lodashInternalBaseForOwn['default'])(_lodashInternalLazyWrapper['default'].prototype, function (func, methodName) {
+ var checkIteratee = /^(?:filter|map|reject)|While$/.test(methodName),
+ retUnwrapped = /^(?:first|last)$/.test(methodName),
+ lodashFunc = _lodashChainLodash['default'][retUnwrapped ? 'take' + (methodName == 'last' ? 'Right' : '') : methodName];
+
+ if (!lodashFunc) {
+ return;
+ }
+ _lodashChainLodash['default'].prototype[methodName] = function () {
+ var args = retUnwrapped ? [1] : arguments,
+ chainAll = this.__chain__,
+ value = this.__wrapped__,
+ isHybrid = !!this.__actions__.length,
+ isLazy = value instanceof _lodashInternalLazyWrapper['default'],
+ iteratee = args[0],
+ useLazy = isLazy || (0, _lodashLangIsArray['default'])(value);
+
+ if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
+ // Avoid lazy use if the iteratee has a "length" value other than `1`.
+ isLazy = useLazy = false;
+ }
+ var interceptor = function interceptor(value) {
+ return retUnwrapped && chainAll ? lodashFunc(value, 1)[0] : lodashFunc.apply(undefined, (0, _lodashInternalArrayPush['default'])([value], args));
+ };
+
+ var action = { 'func': _lodashChainThru['default'], 'args': [interceptor], 'thisArg': undefined },
+ onlyLazy = isLazy && !isHybrid;
+
+ if (retUnwrapped && !chainAll) {
+ if (onlyLazy) {
+ value = value.clone();
+ value.__actions__.push(action);
+ return func.call(value);
+ }
+ return lodashFunc.call(undefined, this.value())[0];
+ }
+ if (!retUnwrapped && useLazy) {
+ value = onlyLazy ? value : new _lodashInternalLazyWrapper['default'](this);
+ var result = func.apply(value, args);
+ result.__actions__.push(action);
+ return new _lodashInternalLodashWrapper['default'](result, chainAll);
+ }
+ return this.thru(interceptor);
+ };
+ });
+
+ // Add `Array` and `String` methods to `lodash.prototype`.
+ (0, _lodashInternalArrayEach['default'])(['join', 'pop', 'push', 'replace', 'shift', 'sort', 'splice', 'split', 'unshift'], function (methodName) {
+ var func = (/^(?:replace|split)$/.test(methodName) ? stringProto : arrayProto)[methodName],
+ chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
+ retUnwrapped = /^(?:join|pop|replace|shift)$/.test(methodName);
+
+ _lodashChainLodash['default'].prototype[methodName] = function () {
+ var args = arguments;
+ if (retUnwrapped && !this.__chain__) {
+ return func.apply(this.value(), args);
+ }
+ return this[chainName](function (value) {
+ return func.apply(value, args);
+ });
+ };
+ });
+
+ // Map minified function names to their real names.
+ (0, _lodashInternalBaseForOwn['default'])(_lodashInternalLazyWrapper['default'].prototype, function (func, methodName) {
+ var lodashFunc = _lodashChainLodash['default'][methodName];
+ if (lodashFunc) {
+ var key = lodashFunc.name + '',
+ names = _lodashInternalRealNames['default'][key] || (_lodashInternalRealNames['default'][key] = []);
+
+ names.push({ 'name': methodName, 'func': lodashFunc });
+ }
+ });
+
+ _lodashInternalRealNames['default'][(0, _lodashInternalCreateHybridWrapper['default'])(undefined, BIND_KEY_FLAG).name] = [{ 'name': 'wrapper', 'func': undefined }];
+
+ // Add functions to the lazy wrapper.
+ _lodashInternalLazyWrapper['default'].prototype.clone = _lodashInternalLazyClone['default'];
+ _lodashInternalLazyWrapper['default'].prototype.reverse = _lodashInternalLazyReverse['default'];
+ _lodashInternalLazyWrapper['default'].prototype.value = _lodashInternalLazyValue['default'];
+
+ // Add chaining functions to the `lodash` wrapper.
+ _lodashChainLodash['default'].prototype.chain = _lodashChain['default'].wrapperChain;
+ _lodashChainLodash['default'].prototype.commit = _lodashChain['default'].commit;
+ _lodashChainLodash['default'].prototype.concat = _lodashChain['default'].concat;
+ _lodashChainLodash['default'].prototype.plant = _lodashChain['default'].plant;
+ _lodashChainLodash['default'].prototype.reverse = _lodashChain['default'].reverse;
+ _lodashChainLodash['default'].prototype.toString = _lodashChain['default'].toString;
+ _lodashChainLodash['default'].prototype.run = _lodashChainLodash['default'].prototype.toJSON = _lodashChainLodash['default'].prototype.valueOf = _lodashChainLodash['default'].prototype.value = _lodashChain['default'].value;
+
+ // Add function aliases to the `lodash` wrapper.
+ _lodashChainLodash['default'].prototype.collect = _lodashChainLodash['default'].prototype.map;
+ _lodashChainLodash['default'].prototype.head = _lodashChainLodash['default'].prototype.first;
+ _lodashChainLodash['default'].prototype.select = _lodashChainLodash['default'].prototype.filter;
+ _lodashChainLodash['default'].prototype.tail = _lodashChainLodash['default'].prototype.rest;
+
+ exports['default'] = _lodashChainLodash['default'];
+});
+define('lodash/math', ['exports', 'lodash/math/add', 'lodash/math/ceil', 'lodash/math/floor', 'lodash/math/max', 'lodash/math/min', 'lodash/math/round', 'lodash/math/sum'], function (exports, _lodashMathAdd, _lodashMathCeil, _lodashMathFloor, _lodashMathMax, _lodashMathMin, _lodashMathRound, _lodashMathSum) {
+ 'use strict';
+
+ exports['default'] = {
+ 'add': _lodashMathAdd['default'],
+ 'ceil': _lodashMathCeil['default'],
+ 'floor': _lodashMathFloor['default'],
+ 'max': _lodashMathMax['default'],
+ 'min': _lodashMathMin['default'],
+ 'round': _lodashMathRound['default'],
+ 'sum': _lodashMathSum['default']
+ };
+});
+define("lodash/math/add", ["exports"], function (exports) {
+ /**
+ * Adds two numbers.
+ *
+ * @static
+ * @memberOf _
+ * @category Math
+ * @param {number} augend The first number to add.
+ * @param {number} addend The second number to add.
+ * @returns {number} Returns the sum.
+ * @example
+ *
+ * _.add(6, 4);
+ * // => 10
+ */
+ "use strict";
+
+ function add(augend, addend) {
+ return (+augend || 0) + (+addend || 0);
+ }
+
+ exports["default"] = add;
+});
+define('lodash/math/ceil', ['exports', 'lodash/internal/createRound'], function (exports, _lodashInternalCreateRound) {
+ 'use strict';
+
+ /**
+ * Calculates `n` rounded up to `precision`.
+ *
+ * @static
+ * @memberOf _
+ * @category Math
+ * @param {number} n The number to round up.
+ * @param {number} [precision=0] The precision to round up to.
+ * @returns {number} Returns the rounded up number.
+ * @example
+ *
+ * _.ceil(4.006);
+ * // => 5
+ *
+ * _.ceil(6.004, 2);
+ * // => 6.01
+ *
+ * _.ceil(6040, -2);
+ * // => 6100
+ */
+ var ceil = (0, _lodashInternalCreateRound['default'])('ceil');
+
+ exports['default'] = ceil;
+});
+define('lodash/math/floor', ['exports', 'lodash/internal/createRound'], function (exports, _lodashInternalCreateRound) {
+ 'use strict';
+
+ /**
+ * Calculates `n` rounded down to `precision`.
+ *
+ * @static
+ * @memberOf _
+ * @category Math
+ * @param {number} n The number to round down.
+ * @param {number} [precision=0] The precision to round down to.
+ * @returns {number} Returns the rounded down number.
+ * @example
+ *
+ * _.floor(4.006);
+ * // => 4
+ *
+ * _.floor(0.046, 2);
+ * // => 0.04
+ *
+ * _.floor(4060, -2);
+ * // => 4000
+ */
+ var floor = (0, _lodashInternalCreateRound['default'])('floor');
+
+ exports['default'] = floor;
+});
+define('lodash/math/max', ['exports', 'lodash/internal/createExtremum', 'lodash/lang/gt'], function (exports, _lodashInternalCreateExtremum, _lodashLangGt) {
+ 'use strict';
+
+ /** Used as references for `-Infinity` and `Infinity`. */
+ var NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY;
+
+ /**
+ * Gets the maximum value of `collection`. If `collection` is empty or falsey
+ * `-Infinity` is returned. If an iteratee function is provided it's invoked
+ * for each value in `collection` to generate the criterion by which the value
+ * is ranked. The `iteratee` is bound to `thisArg` and invoked with three
+ * arguments: (value, index, collection).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Math
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [iteratee] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {*} Returns the maximum value.
+ * @example
+ *
+ * _.max([4, 2, 8, 6]);
+ * // => 8
+ *
+ * _.max([]);
+ * // => -Infinity
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 40 }
+ * ];
+ *
+ * _.max(users, function(chr) {
+ * return chr.age;
+ * });
+ * // => { 'user': 'fred', 'age': 40 }
+ *
+ * // using the `_.property` callback shorthand
+ * _.max(users, 'age');
+ * // => { 'user': 'fred', 'age': 40 }
+ */
+ var max = (0, _lodashInternalCreateExtremum['default'])(_lodashLangGt['default'], NEGATIVE_INFINITY);
+
+ exports['default'] = max;
+});
+define('lodash/math/min', ['exports', 'lodash/internal/createExtremum', 'lodash/lang/lt'], function (exports, _lodashInternalCreateExtremum, _lodashLangLt) {
+ 'use strict';
+
+ /** Used as references for `-Infinity` and `Infinity`. */
+ var POSITIVE_INFINITY = Number.POSITIVE_INFINITY;
+
+ /**
+ * Gets the minimum value of `collection`. If `collection` is empty or falsey
+ * `Infinity` is returned. If an iteratee function is provided it's invoked
+ * for each value in `collection` to generate the criterion by which the value
+ * is ranked. The `iteratee` is bound to `thisArg` and invoked with three
+ * arguments: (value, index, collection).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Math
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [iteratee] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {*} Returns the minimum value.
+ * @example
+ *
+ * _.min([4, 2, 8, 6]);
+ * // => 2
+ *
+ * _.min([]);
+ * // => Infinity
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 40 }
+ * ];
+ *
+ * _.min(users, function(chr) {
+ * return chr.age;
+ * });
+ * // => { 'user': 'barney', 'age': 36 }
+ *
+ * // using the `_.property` callback shorthand
+ * _.min(users, 'age');
+ * // => { 'user': 'barney', 'age': 36 }
+ */
+ var min = (0, _lodashInternalCreateExtremum['default'])(_lodashLangLt['default'], POSITIVE_INFINITY);
+
+ exports['default'] = min;
+});
+define('lodash/math/round', ['exports', 'lodash/internal/createRound'], function (exports, _lodashInternalCreateRound) {
+ 'use strict';
+
+ /**
+ * Calculates `n` rounded to `precision`.
+ *
+ * @static
+ * @memberOf _
+ * @category Math
+ * @param {number} n The number to round.
+ * @param {number} [precision=0] The precision to round to.
+ * @returns {number} Returns the rounded number.
+ * @example
+ *
+ * _.round(4.006);
+ * // => 4
+ *
+ * _.round(4.006, 2);
+ * // => 4.01
+ *
+ * _.round(4060, -2);
+ * // => 4100
+ */
+ var round = (0, _lodashInternalCreateRound['default'])('round');
+
+ exports['default'] = round;
+});
+define('lodash/math/sum', ['exports', 'lodash/internal/arraySum', 'lodash/internal/baseCallback', 'lodash/internal/baseSum', 'lodash/lang/isArray', 'lodash/internal/isIterateeCall', 'lodash/internal/toIterable'], function (exports, _lodashInternalArraySum, _lodashInternalBaseCallback, _lodashInternalBaseSum, _lodashLangIsArray, _lodashInternalIsIterateeCall, _lodashInternalToIterable) {
+ 'use strict';
+
+ /**
+ * Gets the sum of the values in `collection`.
+ *
+ * @static
+ * @memberOf _
+ * @category Math
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [iteratee] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {number} Returns the sum.
+ * @example
+ *
+ * _.sum([4, 6]);
+ * // => 10
+ *
+ * _.sum({ 'a': 4, 'b': 6 });
+ * // => 10
+ *
+ * var objects = [
+ * { 'n': 4 },
+ * { 'n': 6 }
+ * ];
+ *
+ * _.sum(objects, function(object) {
+ * return object.n;
+ * });
+ * // => 10
+ *
+ * // using the `_.property` callback shorthand
+ * _.sum(objects, 'n');
+ * // => 10
+ */
+ function sum(collection, iteratee, thisArg) {
+ if (thisArg && (0, _lodashInternalIsIterateeCall['default'])(collection, iteratee, thisArg)) {
+ iteratee = undefined;
+ }
+ iteratee = (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 3);
+ return iteratee.length == 1 ? (0, _lodashInternalArraySum['default'])((0, _lodashLangIsArray['default'])(collection) ? collection : (0, _lodashInternalToIterable['default'])(collection), iteratee) : (0, _lodashInternalBaseSum['default'])(collection, iteratee);
+ }
+
+ exports['default'] = sum;
+});
+define('lodash/number', ['exports', 'lodash/number/inRange', 'lodash/number/random'], function (exports, _lodashNumberInRange, _lodashNumberRandom) {
+ 'use strict';
+
+ exports['default'] = {
+ 'inRange': _lodashNumberInRange['default'],
+ 'random': _lodashNumberRandom['default']
+ };
+});
+define("lodash/number/inRange", ["exports"], function (exports) {
+ /* Native method references for those with the same name as other `lodash` methods. */
+ "use strict";
+
+ var nativeMax = Math.max,
+ nativeMin = Math.min;
+
+ /**
+ * Checks if `n` is between `start` and up to but not including, `end`. If
+ * `end` is not specified it's set to `start` with `start` then set to `0`.
+ *
+ * @static
+ * @memberOf _
+ * @category Number
+ * @param {number} n The number to check.
+ * @param {number} [start=0] The start of the range.
+ * @param {number} end The end of the range.
+ * @returns {boolean} Returns `true` if `n` is in the range, else `false`.
+ * @example
+ *
+ * _.inRange(3, 2, 4);
+ * // => true
+ *
+ * _.inRange(4, 8);
+ * // => true
+ *
+ * _.inRange(4, 2);
+ * // => false
+ *
+ * _.inRange(2, 2);
+ * // => false
+ *
+ * _.inRange(1.2, 2);
+ * // => true
+ *
+ * _.inRange(5.2, 4);
+ * // => false
+ */
+ function inRange(value, start, end) {
+ start = +start || 0;
+ if (end === undefined) {
+ end = start;
+ start = 0;
+ } else {
+ end = +end || 0;
+ }
+ return value >= nativeMin(start, end) && value < nativeMax(start, end);
+ }
+
+ exports["default"] = inRange;
+});
+define('lodash/number/random', ['exports', 'lodash/internal/baseRandom', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseRandom, _lodashInternalIsIterateeCall) {
+ 'use strict';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeMin = Math.min,
+ nativeRandom = Math.random;
+
+ /**
+ * Produces a random number between `min` and `max` (inclusive). If only one
+ * argument is provided a number between `0` and the given number is returned.
+ * If `floating` is `true`, or either `min` or `max` are floats, a floating-point
+ * number is returned instead of an integer.
+ *
+ * @static
+ * @memberOf _
+ * @category Number
+ * @param {number} [min=0] The minimum possible value.
+ * @param {number} [max=1] The maximum possible value.
+ * @param {boolean} [floating] Specify returning a floating-point number.
+ * @returns {number} Returns the random number.
+ * @example
+ *
+ * _.random(0, 5);
+ * // => an integer between 0 and 5
+ *
+ * _.random(5);
+ * // => also an integer between 0 and 5
+ *
+ * _.random(5, true);
+ * // => a floating-point number between 0 and 5
+ *
+ * _.random(1.2, 5.2);
+ * // => a floating-point number between 1.2 and 5.2
+ */
+ function random(min, max, floating) {
+ if (floating && (0, _lodashInternalIsIterateeCall['default'])(min, max, floating)) {
+ max = floating = undefined;
+ }
+ var noMin = min == null,
+ noMax = max == null;
+
+ if (floating == null) {
+ if (noMax && typeof min == 'boolean') {
+ floating = min;
+ min = 1;
+ } else if (typeof max == 'boolean') {
+ floating = max;
+ noMax = true;
+ }
+ }
+ if (noMin && noMax) {
+ max = 1;
+ noMax = false;
+ }
+ min = +min || 0;
+ if (noMax) {
+ max = min;
+ min = 0;
+ } else {
+ max = +max || 0;
+ }
+ if (floating || min % 1 || max % 1) {
+ var rand = nativeRandom();
+ return nativeMin(min + rand * (max - min + parseFloat('1e-' + ((rand + '').length - 1))), max);
+ }
+ return (0, _lodashInternalBaseRandom['default'])(min, max);
+ }
+
+ exports['default'] = random;
+});
+define('lodash/object', ['exports', 'lodash/object/assign', 'lodash/object/create', 'lodash/object/defaults', 'lodash/object/defaultsDeep', 'lodash/object/extend', 'lodash/object/findKey', 'lodash/object/findLastKey', 'lodash/object/forIn', 'lodash/object/forInRight', 'lodash/object/forOwn', 'lodash/object/forOwnRight', 'lodash/object/functions', 'lodash/object/get', 'lodash/object/has', 'lodash/object/invert', 'lodash/object/keys', 'lodash/object/keysIn', 'lodash/object/mapKeys', 'lodash/object/mapValues', 'lodash/object/merge', 'lodash/object/methods', 'lodash/object/omit', 'lodash/object/pairs', 'lodash/object/pick', 'lodash/object/result', 'lodash/object/set', 'lodash/object/transform', 'lodash/object/values', 'lodash/object/valuesIn'], function (exports, _lodashObjectAssign, _lodashObjectCreate, _lodashObjectDefaults, _lodashObjectDefaultsDeep, _lodashObjectExtend, _lodashObjectFindKey, _lodashObjectFindLastKey, _lodashObjectForIn, _lodashObjectForInRight, _lodashObjectForOwn, _lodashObjectForOwnRight, _lodashObjectFunctions, _lodashObjectGet, _lodashObjectHas, _lodashObjectInvert, _lodashObjectKeys, _lodashObjectKeysIn, _lodashObjectMapKeys, _lodashObjectMapValues, _lodashObjectMerge, _lodashObjectMethods, _lodashObjectOmit, _lodashObjectPairs, _lodashObjectPick, _lodashObjectResult, _lodashObjectSet, _lodashObjectTransform, _lodashObjectValues, _lodashObjectValuesIn) {
+ 'use strict';
+
+ exports['default'] = {
+ 'assign': _lodashObjectAssign['default'],
+ 'create': _lodashObjectCreate['default'],
+ 'defaults': _lodashObjectDefaults['default'],
+ 'defaultsDeep': _lodashObjectDefaultsDeep['default'],
+ 'extend': _lodashObjectExtend['default'],
+ 'findKey': _lodashObjectFindKey['default'],
+ 'findLastKey': _lodashObjectFindLastKey['default'],
+ 'forIn': _lodashObjectForIn['default'],
+ 'forInRight': _lodashObjectForInRight['default'],
+ 'forOwn': _lodashObjectForOwn['default'],
+ 'forOwnRight': _lodashObjectForOwnRight['default'],
+ 'functions': _lodashObjectFunctions['default'],
+ 'get': _lodashObjectGet['default'],
+ 'has': _lodashObjectHas['default'],
+ 'invert': _lodashObjectInvert['default'],
+ 'keys': _lodashObjectKeys['default'],
+ 'keysIn': _lodashObjectKeysIn['default'],
+ 'mapKeys': _lodashObjectMapKeys['default'],
+ 'mapValues': _lodashObjectMapValues['default'],
+ 'merge': _lodashObjectMerge['default'],
+ 'methods': _lodashObjectMethods['default'],
+ 'omit': _lodashObjectOmit['default'],
+ 'pairs': _lodashObjectPairs['default'],
+ 'pick': _lodashObjectPick['default'],
+ 'result': _lodashObjectResult['default'],
+ 'set': _lodashObjectSet['default'],
+ 'transform': _lodashObjectTransform['default'],
+ 'values': _lodashObjectValues['default'],
+ 'valuesIn': _lodashObjectValuesIn['default']
+ };
+});
+define('lodash/object/assign', ['exports', 'lodash/internal/assignWith', 'lodash/internal/baseAssign', 'lodash/internal/createAssigner'], function (exports, _lodashInternalAssignWith, _lodashInternalBaseAssign, _lodashInternalCreateAssigner) {
+ 'use strict';
+
+ /**
+ * Assigns own enumerable properties of source object(s) to the destination
+ * object. Subsequent sources overwrite property assignments of previous sources.
+ * If `customizer` is provided it's invoked to produce the assigned values.
+ * The `customizer` is bound to `thisArg` and invoked with five arguments:
+ * (objectValue, sourceValue, key, object, source).
+ *
+ * **Note:** This method mutates `object` and is based on
+ * [`Object.assign`](http://ecma-international.org/ecma-262/6.0/#sec-object.assign).
+ *
+ * @static
+ * @memberOf _
+ * @alias extend
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @param {Function} [customizer] The function to customize assigned values.
+ * @param {*} [thisArg] The `this` binding of `customizer`.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' });
+ * // => { 'user': 'fred', 'age': 40 }
+ *
+ * // using a customizer callback
+ * var defaults = _.partialRight(_.assign, function(value, other) {
+ * return _.isUndefined(value) ? other : value;
+ * });
+ *
+ * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
+ * // => { 'user': 'barney', 'age': 36 }
+ */
+ var assign = (0, _lodashInternalCreateAssigner['default'])(function (object, source, customizer) {
+ return customizer ? (0, _lodashInternalAssignWith['default'])(object, source, customizer) : (0, _lodashInternalBaseAssign['default'])(object, source);
+ });
+
+ exports['default'] = assign;
+});
+define('lodash/object/create', ['exports', 'lodash/internal/baseAssign', 'lodash/internal/baseCreate', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseAssign, _lodashInternalBaseCreate, _lodashInternalIsIterateeCall) {
+ 'use strict';
+
+ /**
+ * Creates an object that inherits from the given `prototype` object. If a
+ * `properties` object is provided its own enumerable properties are assigned
+ * to the created object.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} prototype The object to inherit from.
+ * @param {Object} [properties] The properties to assign to the object.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * function Shape() {
+ * this.x = 0;
+ * this.y = 0;
+ * }
+ *
+ * function Circle() {
+ * Shape.call(this);
+ * }
+ *
+ * Circle.prototype = _.create(Shape.prototype, {
+ * 'constructor': Circle
+ * });
+ *
+ * var circle = new Circle;
+ * circle instanceof Circle;
+ * // => true
+ *
+ * circle instanceof Shape;
+ * // => true
+ */
+ function create(prototype, properties, guard) {
+ var result = (0, _lodashInternalBaseCreate['default'])(prototype);
+ if (guard && (0, _lodashInternalIsIterateeCall['default'])(prototype, properties, guard)) {
+ properties = undefined;
+ }
+ return properties ? (0, _lodashInternalBaseAssign['default'])(result, properties) : result;
+ }
+
+ exports['default'] = create;
+});
+define('lodash/object/defaults', ['exports', 'lodash/object/assign', 'lodash/internal/assignDefaults', 'lodash/internal/createDefaults'], function (exports, _lodashObjectAssign, _lodashInternalAssignDefaults, _lodashInternalCreateDefaults) {
+ 'use strict';
+
+ /**
+ * Assigns own enumerable properties of source object(s) to the destination
+ * object for all destination properties that resolve to `undefined`. Once a
+ * property is set, additional values of the same property are ignored.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
+ * // => { 'user': 'barney', 'age': 36 }
+ */
+ var defaults = (0, _lodashInternalCreateDefaults['default'])(_lodashObjectAssign['default'], _lodashInternalAssignDefaults['default']);
+
+ exports['default'] = defaults;
+});
+define('lodash/object/defaultsDeep', ['exports', 'lodash/internal/createDefaults', 'lodash/object/merge', 'lodash/internal/mergeDefaults'], function (exports, _lodashInternalCreateDefaults, _lodashObjectMerge, _lodashInternalMergeDefaults) {
+ 'use strict';
+
+ /**
+ * This method is like `_.defaults` except that it recursively assigns
+ * default properties.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * _.defaultsDeep({ 'user': { 'name': 'barney' } }, { 'user': { 'name': 'fred', 'age': 36 } });
+ * // => { 'user': { 'name': 'barney', 'age': 36 } }
+ *
+ */
+ var defaultsDeep = (0, _lodashInternalCreateDefaults['default'])(_lodashObjectMerge['default'], _lodashInternalMergeDefaults['default']);
+
+ exports['default'] = defaultsDeep;
+});
+define('lodash/object/extend', ['exports', 'lodash/object/assign'], function (exports, _lodashObjectAssign) {
+ 'use strict';
+
+ exports['default'] = _lodashObjectAssign['default'];
+});
+define('lodash/object/findKey', ['exports', 'lodash/internal/baseForOwn', 'lodash/internal/createFindKey'], function (exports, _lodashInternalBaseForOwn, _lodashInternalCreateFindKey) {
+ 'use strict';
+
+ /**
+ * This method is like `_.find` except that it returns the key of the first
+ * element `predicate` returns truthy for instead of the element itself.
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to search.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {string|undefined} Returns the key of the matched element, else `undefined`.
+ * @example
+ *
+ * var users = {
+ * 'barney': { 'age': 36, 'active': true },
+ * 'fred': { 'age': 40, 'active': false },
+ * 'pebbles': { 'age': 1, 'active': true }
+ * };
+ *
+ * _.findKey(users, function(chr) {
+ * return chr.age < 40;
+ * });
+ * // => 'barney' (iteration order is not guaranteed)
+ *
+ * // using the `_.matches` callback shorthand
+ * _.findKey(users, { 'age': 1, 'active': true });
+ * // => 'pebbles'
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.findKey(users, 'active', false);
+ * // => 'fred'
+ *
+ * // using the `_.property` callback shorthand
+ * _.findKey(users, 'active');
+ * // => 'barney'
+ */
+ var findKey = (0, _lodashInternalCreateFindKey['default'])(_lodashInternalBaseForOwn['default']);
+
+ exports['default'] = findKey;
+});
+define('lodash/object/findLastKey', ['exports', 'lodash/internal/baseForOwnRight', 'lodash/internal/createFindKey'], function (exports, _lodashInternalBaseForOwnRight, _lodashInternalCreateFindKey) {
+ 'use strict';
+
+ /**
+ * This method is like `_.findKey` except that it iterates over elements of
+ * a collection in the opposite order.
+ *
+ * If a property name is provided for `predicate` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `predicate` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to search.
+ * @param {Function|Object|string} [predicate=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {string|undefined} Returns the key of the matched element, else `undefined`.
+ * @example
+ *
+ * var users = {
+ * 'barney': { 'age': 36, 'active': true },
+ * 'fred': { 'age': 40, 'active': false },
+ * 'pebbles': { 'age': 1, 'active': true }
+ * };
+ *
+ * _.findLastKey(users, function(chr) {
+ * return chr.age < 40;
+ * });
+ * // => returns `pebbles` assuming `_.findKey` returns `barney`
+ *
+ * // using the `_.matches` callback shorthand
+ * _.findLastKey(users, { 'age': 36, 'active': true });
+ * // => 'barney'
+ *
+ * // using the `_.matchesProperty` callback shorthand
+ * _.findLastKey(users, 'active', false);
+ * // => 'fred'
+ *
+ * // using the `_.property` callback shorthand
+ * _.findLastKey(users, 'active');
+ * // => 'pebbles'
+ */
+ var findLastKey = (0, _lodashInternalCreateFindKey['default'])(_lodashInternalBaseForOwnRight['default']);
+
+ exports['default'] = findLastKey;
+});
+define('lodash/object/forIn', ['exports', 'lodash/internal/baseFor', 'lodash/internal/createForIn'], function (exports, _lodashInternalBaseFor, _lodashInternalCreateForIn) {
+ 'use strict';
+
+ /**
+ * Iterates over own and inherited enumerable properties of an object invoking
+ * `iteratee` for each property. The `iteratee` is bound to `thisArg` and invoked
+ * with three arguments: (value, key, object). Iteratee functions may exit
+ * iteration early by explicitly returning `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.forIn(new Foo, function(value, key) {
+ * console.log(key);
+ * });
+ * // => logs 'a', 'b', and 'c' (iteration order is not guaranteed)
+ */
+ var forIn = (0, _lodashInternalCreateForIn['default'])(_lodashInternalBaseFor['default']);
+
+ exports['default'] = forIn;
+});
+define('lodash/object/forInRight', ['exports', 'lodash/internal/baseForRight', 'lodash/internal/createForIn'], function (exports, _lodashInternalBaseForRight, _lodashInternalCreateForIn) {
+ 'use strict';
+
+ /**
+ * This method is like `_.forIn` except that it iterates over properties of
+ * `object` in the opposite order.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.forInRight(new Foo, function(value, key) {
+ * console.log(key);
+ * });
+ * // => logs 'c', 'b', and 'a' assuming `_.forIn ` logs 'a', 'b', and 'c'
+ */
+ var forInRight = (0, _lodashInternalCreateForIn['default'])(_lodashInternalBaseForRight['default']);
+
+ exports['default'] = forInRight;
+});
+define('lodash/object/forOwn', ['exports', 'lodash/internal/baseForOwn', 'lodash/internal/createForOwn'], function (exports, _lodashInternalBaseForOwn, _lodashInternalCreateForOwn) {
+ 'use strict';
+
+ /**
+ * Iterates over own enumerable properties of an object invoking `iteratee`
+ * for each property. The `iteratee` is bound to `thisArg` and invoked with
+ * three arguments: (value, key, object). Iteratee functions may exit iteration
+ * early by explicitly returning `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.forOwn(new Foo, function(value, key) {
+ * console.log(key);
+ * });
+ * // => logs 'a' and 'b' (iteration order is not guaranteed)
+ */
+ var forOwn = (0, _lodashInternalCreateForOwn['default'])(_lodashInternalBaseForOwn['default']);
+
+ exports['default'] = forOwn;
+});
+define('lodash/object/forOwnRight', ['exports', 'lodash/internal/baseForOwnRight', 'lodash/internal/createForOwn'], function (exports, _lodashInternalBaseForOwnRight, _lodashInternalCreateForOwn) {
+ 'use strict';
+
+ /**
+ * This method is like `_.forOwn` except that it iterates over properties of
+ * `object` in the opposite order.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.forOwnRight(new Foo, function(value, key) {
+ * console.log(key);
+ * });
+ * // => logs 'b' and 'a' assuming `_.forOwn` logs 'a' and 'b'
+ */
+ var forOwnRight = (0, _lodashInternalCreateForOwn['default'])(_lodashInternalBaseForOwnRight['default']);
+
+ exports['default'] = forOwnRight;
+});
+define('lodash/object/functions', ['exports', 'lodash/internal/baseFunctions', 'lodash/object/keysIn'], function (exports, _lodashInternalBaseFunctions, _lodashObjectKeysIn) {
+ 'use strict';
+
+ /**
+ * Creates an array of function property names from all enumerable properties,
+ * own and inherited, of `object`.
+ *
+ * @static
+ * @memberOf _
+ * @alias methods
+ * @category Object
+ * @param {Object} object The object to inspect.
+ * @returns {Array} Returns the new array of property names.
+ * @example
+ *
+ * _.functions(_);
+ * // => ['after', 'ary', 'assign', ...]
+ */
+ function functions(object) {
+ return (0, _lodashInternalBaseFunctions['default'])(object, (0, _lodashObjectKeysIn['default'])(object));
+ }
+
+ exports['default'] = functions;
+});
+define('lodash/object/get', ['exports', 'lodash/internal/baseGet', 'lodash/internal/toPath'], function (exports, _lodashInternalBaseGet, _lodashInternalToPath) {
+ 'use strict';
+
+ /**
+ * Gets the property value at `path` of `object`. If the resolved value is
+ * `undefined` the `defaultValue` is used in its place.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the property to get.
+ * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.
+ * @returns {*} Returns the resolved value.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+ *
+ * _.get(object, 'a[0].b.c');
+ * // => 3
+ *
+ * _.get(object, ['a', '0', 'b', 'c']);
+ * // => 3
+ *
+ * _.get(object, 'a.b.c', 'default');
+ * // => 'default'
+ */
+ function get(object, path, defaultValue) {
+ var result = object == null ? undefined : (0, _lodashInternalBaseGet['default'])(object, (0, _lodashInternalToPath['default'])(path), path + '');
+ return result === undefined ? defaultValue : result;
+ }
+
+ exports['default'] = get;
+});
+define('lodash/object/has', ['exports', 'lodash/internal/baseGet', 'lodash/internal/baseSlice', 'lodash/lang/isArguments', 'lodash/lang/isArray', 'lodash/internal/isIndex', 'lodash/internal/isKey', 'lodash/internal/isLength', 'lodash/array/last', 'lodash/internal/toPath'], function (exports, _lodashInternalBaseGet, _lodashInternalBaseSlice, _lodashLangIsArguments, _lodashLangIsArray, _lodashInternalIsIndex, _lodashInternalIsKey, _lodashInternalIsLength, _lodashArrayLast, _lodashInternalToPath) {
+ 'use strict';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty = objectProto.hasOwnProperty;
+
+ /**
+ * Checks if `path` is a direct property.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path to check.
+ * @returns {boolean} Returns `true` if `path` is a direct property, else `false`.
+ * @example
+ *
+ * var object = { 'a': { 'b': { 'c': 3 } } };
+ *
+ * _.has(object, 'a');
+ * // => true
+ *
+ * _.has(object, 'a.b.c');
+ * // => true
+ *
+ * _.has(object, ['a', 'b', 'c']);
+ * // => true
+ */
+ function has(object, path) {
+ if (object == null) {
+ return false;
+ }
+ var result = hasOwnProperty.call(object, path);
+ if (!result && !(0, _lodashInternalIsKey['default'])(path)) {
+ path = (0, _lodashInternalToPath['default'])(path);
+ object = path.length == 1 ? object : (0, _lodashInternalBaseGet['default'])(object, (0, _lodashInternalBaseSlice['default'])(path, 0, -1));
+ if (object == null) {
+ return false;
+ }
+ path = (0, _lodashArrayLast['default'])(path);
+ result = hasOwnProperty.call(object, path);
+ }
+ return result || (0, _lodashInternalIsLength['default'])(object.length) && (0, _lodashInternalIsIndex['default'])(path, object.length) && ((0, _lodashLangIsArray['default'])(object) || (0, _lodashLangIsArguments['default'])(object));
+ }
+
+ exports['default'] = has;
+});
+define('lodash/object/invert', ['exports', 'lodash/internal/isIterateeCall', 'lodash/object/keys'], function (exports, _lodashInternalIsIterateeCall, _lodashObjectKeys) {
+ 'use strict';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty = objectProto.hasOwnProperty;
+
+ /**
+ * Creates an object composed of the inverted keys and values of `object`.
+ * If `object` contains duplicate values, subsequent values overwrite property
+ * assignments of previous values unless `multiValue` is `true`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to invert.
+ * @param {boolean} [multiValue] Allow multiple values per key.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {Object} Returns the new inverted object.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': 2, 'c': 1 };
+ *
+ * _.invert(object);
+ * // => { '1': 'c', '2': 'b' }
+ *
+ * // with `multiValue`
+ * _.invert(object, true);
+ * // => { '1': ['a', 'c'], '2': ['b'] }
+ */
+ function invert(object, multiValue, guard) {
+ if (guard && (0, _lodashInternalIsIterateeCall['default'])(object, multiValue, guard)) {
+ multiValue = undefined;
+ }
+ var index = -1,
+ props = (0, _lodashObjectKeys['default'])(object),
+ length = props.length,
+ result = {};
+
+ while (++index < length) {
+ var key = props[index],
+ value = object[key];
+
+ if (multiValue) {
+ if (hasOwnProperty.call(result, value)) {
+ result[value].push(key);
+ } else {
+ result[value] = [key];
+ }
+ } else {
+ result[value] = key;
+ }
+ }
+ return result;
+ }
+
+ exports['default'] = invert;
+});
+define('lodash/object/keys', ['exports', 'lodash/internal/getNative', 'lodash/internal/isArrayLike', 'lodash/lang/isObject', 'lodash/internal/shimKeys'], function (exports, _lodashInternalGetNative, _lodashInternalIsArrayLike, _lodashLangIsObject, _lodashInternalShimKeys) {
+ 'use strict';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeKeys = (0, _lodashInternalGetNative['default'])(Object, 'keys');
+
+ /**
+ * Creates an array of the own enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects. See the
+ * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)
+ * for more details.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keys(new Foo);
+ * // => ['a', 'b'] (iteration order is not guaranteed)
+ *
+ * _.keys('hi');
+ * // => ['0', '1']
+ */
+ var keys = !nativeKeys ? _lodashInternalShimKeys['default'] : function (object) {
+ var Ctor = object == null ? undefined : object.constructor;
+ if (typeof Ctor == 'function' && Ctor.prototype === object || typeof object != 'function' && (0, _lodashInternalIsArrayLike['default'])(object)) {
+ return (0, _lodashInternalShimKeys['default'])(object);
+ }
+ return (0, _lodashLangIsObject['default'])(object) ? nativeKeys(object) : [];
+ };
+
+ exports['default'] = keys;
+});
+define('lodash/object/keysIn', ['exports', 'lodash/lang/isArguments', 'lodash/lang/isArray', 'lodash/internal/isIndex', 'lodash/internal/isLength', 'lodash/lang/isObject'], function (exports, _lodashLangIsArguments, _lodashLangIsArray, _lodashInternalIsIndex, _lodashInternalIsLength, _lodashLangIsObject) {
+ 'use strict';
+
+ /** Used for native method references. */
+ var objectProto = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty = objectProto.hasOwnProperty;
+
+ /**
+ * Creates an array of the own and inherited enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keysIn(new Foo);
+ * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
+ */
+ function keysIn(object) {
+ if (object == null) {
+ return [];
+ }
+ if (!(0, _lodashLangIsObject['default'])(object)) {
+ object = Object(object);
+ }
+ var length = object.length;
+ length = length && (0, _lodashInternalIsLength['default'])(length) && ((0, _lodashLangIsArray['default'])(object) || (0, _lodashLangIsArguments['default'])(object)) && length || 0;
+
+ var Ctor = object.constructor,
+ index = -1,
+ isProto = typeof Ctor == 'function' && Ctor.prototype === object,
+ result = Array(length),
+ skipIndexes = length > 0;
+
+ while (++index < length) {
+ result[index] = index + '';
+ }
+ for (var key in object) {
+ if (!(skipIndexes && (0, _lodashInternalIsIndex['default'])(key, length)) && !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
+ result.push(key);
+ }
+ }
+ return result;
+ }
+
+ exports['default'] = keysIn;
+});
+define('lodash/object/mapKeys', ['exports', 'lodash/internal/createObjectMapper'], function (exports, _lodashInternalCreateObjectMapper) {
+ 'use strict';
+
+ /**
+ * The opposite of `_.mapValues`; this method creates an object with the
+ * same values as `object` and keys generated by running each own enumerable
+ * property of `object` through `iteratee`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Object} Returns the new mapped object.
+ * @example
+ *
+ * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
+ * return key + value;
+ * });
+ * // => { 'a1': 1, 'b2': 2 }
+ */
+ var mapKeys = (0, _lodashInternalCreateObjectMapper['default'])(true);
+
+ exports['default'] = mapKeys;
+});
+define('lodash/object/mapValues', ['exports', 'lodash/internal/createObjectMapper'], function (exports, _lodashInternalCreateObjectMapper) {
+ 'use strict';
+
+ /**
+ * Creates an object with the same keys as `object` and values generated by
+ * running each own enumerable property of `object` through `iteratee`. The
+ * iteratee function is bound to `thisArg` and invoked with three arguments:
+ * (value, key, object).
+ *
+ * If a property name is provided for `iteratee` the created `_.property`
+ * style callback returns the property value of the given element.
+ *
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
+ * style callback returns `true` for elements that have a matching property
+ * value, else `false`.
+ *
+ * If an object is provided for `iteratee` the created `_.matches` style
+ * callback returns `true` for elements that have the properties of the given
+ * object, else `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
+ * per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {Object} Returns the new mapped object.
+ * @example
+ *
+ * _.mapValues({ 'a': 1, 'b': 2 }, function(n) {
+ * return n * 3;
+ * });
+ * // => { 'a': 3, 'b': 6 }
+ *
+ * var users = {
+ * 'fred': { 'user': 'fred', 'age': 40 },
+ * 'pebbles': { 'user': 'pebbles', 'age': 1 }
+ * };
+ *
+ * // using the `_.property` callback shorthand
+ * _.mapValues(users, 'age');
+ * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
+ */
+ var mapValues = (0, _lodashInternalCreateObjectMapper['default'])();
+
+ exports['default'] = mapValues;
+});
+define('lodash/object/merge', ['exports', 'lodash/internal/baseMerge', 'lodash/internal/createAssigner'], function (exports, _lodashInternalBaseMerge, _lodashInternalCreateAssigner) {
+ 'use strict';
+
+ /**
+ * Recursively merges own enumerable properties of the source object(s), that
+ * don't resolve to `undefined` into the destination object. Subsequent sources
+ * overwrite property assignments of previous sources. If `customizer` is
+ * provided it's invoked to produce the merged values of the destination and
+ * source properties. If `customizer` returns `undefined` merging is handled
+ * by the method instead. The `customizer` is bound to `thisArg` and invoked
+ * with five arguments: (objectValue, sourceValue, key, object, source).
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @param {Function} [customizer] The function to customize assigned values.
+ * @param {*} [thisArg] The `this` binding of `customizer`.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var users = {
+ * 'data': [{ 'user': 'barney' }, { 'user': 'fred' }]
+ * };
+ *
+ * var ages = {
+ * 'data': [{ 'age': 36 }, { 'age': 40 }]
+ * };
+ *
+ * _.merge(users, ages);
+ * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }
+ *
+ * // using a customizer callback
+ * var object = {
+ * 'fruits': ['apple'],
+ * 'vegetables': ['beet']
+ * };
+ *
+ * var other = {
+ * 'fruits': ['banana'],
+ * 'vegetables': ['carrot']
+ * };
+ *
+ * _.merge(object, other, function(a, b) {
+ * if (_.isArray(a)) {
+ * return a.concat(b);
+ * }
+ * });
+ * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
+ */
+ var merge = (0, _lodashInternalCreateAssigner['default'])(_lodashInternalBaseMerge['default']);
+
+ exports['default'] = merge;
+});
+define('lodash/object/methods', ['exports', 'lodash/object/functions'], function (exports, _lodashObjectFunctions) {
+ 'use strict';
+
+ exports['default'] = _lodashObjectFunctions['default'];
+});
+define('lodash/object/omit', ['exports', 'lodash/internal/arrayMap', 'lodash/internal/baseDifference', 'lodash/internal/baseFlatten', 'lodash/internal/bindCallback', 'lodash/object/keysIn', 'lodash/internal/pickByArray', 'lodash/internal/pickByCallback', 'lodash/function/restParam'], function (exports, _lodashInternalArrayMap, _lodashInternalBaseDifference, _lodashInternalBaseFlatten, _lodashInternalBindCallback, _lodashObjectKeysIn, _lodashInternalPickByArray, _lodashInternalPickByCallback, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /**
+ * The opposite of `_.pick`; this method creates an object composed of the
+ * own and inherited enumerable properties of `object` that are not omitted.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The source object.
+ * @param {Function|...(string|string[])} [predicate] The function invoked per
+ * iteration or property names to omit, specified as individual property
+ * names or arrays of property names.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * var object = { 'user': 'fred', 'age': 40 };
+ *
+ * _.omit(object, 'age');
+ * // => { 'user': 'fred' }
+ *
+ * _.omit(object, _.isNumber);
+ * // => { 'user': 'fred' }
+ */
+ var omit = (0, _lodashFunctionRestParam['default'])(function (object, props) {
+ if (object == null) {
+ return {};
+ }
+ if (typeof props[0] != 'function') {
+ var props = (0, _lodashInternalArrayMap['default'])((0, _lodashInternalBaseFlatten['default'])(props), String);
+ return (0, _lodashInternalPickByArray['default'])(object, (0, _lodashInternalBaseDifference['default'])((0, _lodashObjectKeysIn['default'])(object), props));
+ }
+ var predicate = (0, _lodashInternalBindCallback['default'])(props[0], props[1], 3);
+ return (0, _lodashInternalPickByCallback['default'])(object, function (value, key, object) {
+ return !predicate(value, key, object);
+ });
+ });
+
+ exports['default'] = omit;
+});
+define('lodash/object/pairs', ['exports', 'lodash/object/keys', 'lodash/internal/toObject'], function (exports, _lodashObjectKeys, _lodashInternalToObject) {
+ 'use strict';
+
+ /**
+ * Creates a two dimensional array of the key-value pairs for `object`,
+ * e.g. `[[key1, value1], [key2, value2]]`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the new array of key-value pairs.
+ * @example
+ *
+ * _.pairs({ 'barney': 36, 'fred': 40 });
+ * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)
+ */
+ function pairs(object) {
+ object = (0, _lodashInternalToObject['default'])(object);
+
+ var index = -1,
+ props = (0, _lodashObjectKeys['default'])(object),
+ length = props.length,
+ result = Array(length);
+
+ while (++index < length) {
+ var key = props[index];
+ result[index] = [key, object[key]];
+ }
+ return result;
+ }
+
+ exports['default'] = pairs;
+});
+define('lodash/object/pick', ['exports', 'lodash/internal/baseFlatten', 'lodash/internal/bindCallback', 'lodash/internal/pickByArray', 'lodash/internal/pickByCallback', 'lodash/function/restParam'], function (exports, _lodashInternalBaseFlatten, _lodashInternalBindCallback, _lodashInternalPickByArray, _lodashInternalPickByCallback, _lodashFunctionRestParam) {
+ 'use strict';
+
+ /**
+ * Creates an object composed of the picked `object` properties. Property
+ * names may be specified as individual arguments or as arrays of property
+ * names. If `predicate` is provided it's invoked for each property of `object`
+ * picking the properties `predicate` returns truthy for. The predicate is
+ * bound to `thisArg` and invoked with three arguments: (value, key, object).
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The source object.
+ * @param {Function|...(string|string[])} [predicate] The function invoked per
+ * iteration or property names to pick, specified as individual property
+ * names or arrays of property names.
+ * @param {*} [thisArg] The `this` binding of `predicate`.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * var object = { 'user': 'fred', 'age': 40 };
+ *
+ * _.pick(object, 'user');
+ * // => { 'user': 'fred' }
+ *
+ * _.pick(object, _.isString);
+ * // => { 'user': 'fred' }
+ */
+ var pick = (0, _lodashFunctionRestParam['default'])(function (object, props) {
+ if (object == null) {
+ return {};
+ }
+ return typeof props[0] == 'function' ? (0, _lodashInternalPickByCallback['default'])(object, (0, _lodashInternalBindCallback['default'])(props[0], props[1], 3)) : (0, _lodashInternalPickByArray['default'])(object, (0, _lodashInternalBaseFlatten['default'])(props));
+ });
+
+ exports['default'] = pick;
+});
+define('lodash/object/result', ['exports', 'lodash/internal/baseGet', 'lodash/internal/baseSlice', 'lodash/lang/isFunction', 'lodash/internal/isKey', 'lodash/array/last', 'lodash/internal/toPath'], function (exports, _lodashInternalBaseGet, _lodashInternalBaseSlice, _lodashLangIsFunction, _lodashInternalIsKey, _lodashArrayLast, _lodashInternalToPath) {
+ 'use strict';
+
+ /**
+ * This method is like `_.get` except that if the resolved value is a function
+ * it's invoked with the `this` binding of its parent object and its result
+ * is returned.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the property to resolve.
+ * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.
+ * @returns {*} Returns the resolved value.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
+ *
+ * _.result(object, 'a[0].b.c1');
+ * // => 3
+ *
+ * _.result(object, 'a[0].b.c2');
+ * // => 4
+ *
+ * _.result(object, 'a.b.c', 'default');
+ * // => 'default'
+ *
+ * _.result(object, 'a.b.c', _.constant('default'));
+ * // => 'default'
+ */
+ function result(object, path, defaultValue) {
+ var result = object == null ? undefined : object[path];
+ if (result === undefined) {
+ if (object != null && !(0, _lodashInternalIsKey['default'])(path, object)) {
+ path = (0, _lodashInternalToPath['default'])(path);
+ object = path.length == 1 ? object : (0, _lodashInternalBaseGet['default'])(object, (0, _lodashInternalBaseSlice['default'])(path, 0, -1));
+ result = object == null ? undefined : object[(0, _lodashArrayLast['default'])(path)];
+ }
+ result = result === undefined ? defaultValue : result;
+ }
+ return (0, _lodashLangIsFunction['default'])(result) ? result.call(object) : result;
+ }
+
+ exports['default'] = result;
+});
+define('lodash/object/set', ['exports', 'lodash/internal/isIndex', 'lodash/internal/isKey', 'lodash/lang/isObject', 'lodash/internal/toPath'], function (exports, _lodashInternalIsIndex, _lodashInternalIsKey, _lodashLangIsObject, _lodashInternalToPath) {
+ 'use strict';
+
+ /**
+ * Sets the property value of `path` on `object`. If a portion of `path`
+ * does not exist it's created.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to augment.
+ * @param {Array|string} path The path of the property to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+ *
+ * _.set(object, 'a[0].b.c', 4);
+ * console.log(object.a[0].b.c);
+ * // => 4
+ *
+ * _.set(object, 'x[0].y.z', 5);
+ * console.log(object.x[0].y.z);
+ * // => 5
+ */
+ function set(object, path, value) {
+ if (object == null) {
+ return object;
+ }
+ var pathKey = path + '';
+ path = object[pathKey] != null || (0, _lodashInternalIsKey['default'])(path, object) ? [pathKey] : (0, _lodashInternalToPath['default'])(path);
+
+ var index = -1,
+ length = path.length,
+ lastIndex = length - 1,
+ nested = object;
+
+ while (nested != null && ++index < length) {
+ var key = path[index];
+ if ((0, _lodashLangIsObject['default'])(nested)) {
+ if (index == lastIndex) {
+ nested[key] = value;
+ } else if (nested[key] == null) {
+ nested[key] = (0, _lodashInternalIsIndex['default'])(path[index + 1]) ? [] : {};
+ }
+ }
+ nested = nested[key];
+ }
+ return object;
+ }
+
+ exports['default'] = set;
+});
+define('lodash/object/transform', ['exports', 'lodash/internal/arrayEach', 'lodash/internal/baseCallback', 'lodash/internal/baseCreate', 'lodash/internal/baseForOwn', 'lodash/lang/isArray', 'lodash/lang/isFunction', 'lodash/lang/isObject', 'lodash/lang/isTypedArray'], function (exports, _lodashInternalArrayEach, _lodashInternalBaseCallback, _lodashInternalBaseCreate, _lodashInternalBaseForOwn, _lodashLangIsArray, _lodashLangIsFunction, _lodashLangIsObject, _lodashLangIsTypedArray) {
+ 'use strict';
+
+ /**
+ * An alternative to `_.reduce`; this method transforms `object` to a new
+ * `accumulator` object which is the result of running each of its own enumerable
+ * properties through `iteratee`, with each invocation potentially mutating
+ * the `accumulator` object. The `iteratee` is bound to `thisArg` and invoked
+ * with four arguments: (accumulator, value, key, object). Iteratee functions
+ * may exit iteration early by explicitly returning `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Array|Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [accumulator] The custom accumulator value.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
+ * @returns {*} Returns the accumulated value.
+ * @example
+ *
+ * _.transform([2, 3, 4], function(result, n) {
+ * result.push(n *= n);
+ * return n % 2 == 0;
+ * });
+ * // => [4, 9]
+ *
+ * _.transform({ 'a': 1, 'b': 2 }, function(result, n, key) {
+ * result[key] = n * 3;
+ * });
+ * // => { 'a': 3, 'b': 6 }
+ */
+ function transform(object, iteratee, accumulator, thisArg) {
+ var isArr = (0, _lodashLangIsArray['default'])(object) || (0, _lodashLangIsTypedArray['default'])(object);
+ iteratee = (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 4);
+
+ if (accumulator == null) {
+ if (isArr || (0, _lodashLangIsObject['default'])(object)) {
+ var Ctor = object.constructor;
+ if (isArr) {
+ accumulator = (0, _lodashLangIsArray['default'])(object) ? new Ctor() : [];
+ } else {
+ accumulator = (0, _lodashInternalBaseCreate['default'])((0, _lodashLangIsFunction['default'])(Ctor) ? Ctor.prototype : undefined);
+ }
+ } else {
+ accumulator = {};
+ }
+ }
+ (isArr ? _lodashInternalArrayEach['default'] : _lodashInternalBaseForOwn['default'])(object, function (value, index, object) {
+ return iteratee(accumulator, value, index, object);
+ });
+ return accumulator;
+ }
+
+ exports['default'] = transform;
+});
+define('lodash/object/values', ['exports', 'lodash/internal/baseValues', 'lodash/object/keys'], function (exports, _lodashInternalBaseValues, _lodashObjectKeys) {
+ 'use strict';
+
+ /**
+ * Creates an array of the own enumerable property values of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property values.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.values(new Foo);
+ * // => [1, 2] (iteration order is not guaranteed)
+ *
+ * _.values('hi');
+ * // => ['h', 'i']
+ */
+ function values(object) {
+ return (0, _lodashInternalBaseValues['default'])(object, (0, _lodashObjectKeys['default'])(object));
+ }
+
+ exports['default'] = values;
+});
+define('lodash/object/valuesIn', ['exports', 'lodash/internal/baseValues', 'lodash/object/keysIn'], function (exports, _lodashInternalBaseValues, _lodashObjectKeysIn) {
+ 'use strict';
+
+ /**
+ * Creates an array of the own and inherited enumerable property values
+ * of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property values.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.valuesIn(new Foo);
+ * // => [1, 2, 3] (iteration order is not guaranteed)
+ */
+ function valuesIn(object) {
+ return (0, _lodashInternalBaseValues['default'])(object, (0, _lodashObjectKeysIn['default'])(object));
+ }
+
+ exports['default'] = valuesIn;
+});
+define('lodash/string', ['exports', 'lodash/string/camelCase', 'lodash/string/capitalize', 'lodash/string/deburr', 'lodash/string/endsWith', 'lodash/string/escape', 'lodash/string/escapeRegExp', 'lodash/string/kebabCase', 'lodash/string/pad', 'lodash/string/padLeft', 'lodash/string/padRight', 'lodash/string/parseInt', 'lodash/string/repeat', 'lodash/string/snakeCase', 'lodash/string/startCase', 'lodash/string/startsWith', 'lodash/string/template', 'lodash/string/templateSettings', 'lodash/string/trim', 'lodash/string/trimLeft', 'lodash/string/trimRight', 'lodash/string/trunc', 'lodash/string/unescape', 'lodash/string/words'], function (exports, _lodashStringCamelCase, _lodashStringCapitalize, _lodashStringDeburr, _lodashStringEndsWith, _lodashStringEscape, _lodashStringEscapeRegExp, _lodashStringKebabCase, _lodashStringPad, _lodashStringPadLeft, _lodashStringPadRight, _lodashStringParseInt, _lodashStringRepeat, _lodashStringSnakeCase, _lodashStringStartCase, _lodashStringStartsWith, _lodashStringTemplate, _lodashStringTemplateSettings, _lodashStringTrim, _lodashStringTrimLeft, _lodashStringTrimRight, _lodashStringTrunc, _lodashStringUnescape, _lodashStringWords) {
+ 'use strict';
+
+ exports['default'] = {
+ 'camelCase': _lodashStringCamelCase['default'],
+ 'capitalize': _lodashStringCapitalize['default'],
+ 'deburr': _lodashStringDeburr['default'],
+ 'endsWith': _lodashStringEndsWith['default'],
+ 'escape': _lodashStringEscape['default'],
+ 'escapeRegExp': _lodashStringEscapeRegExp['default'],
+ 'kebabCase': _lodashStringKebabCase['default'],
+ 'pad': _lodashStringPad['default'],
+ 'padLeft': _lodashStringPadLeft['default'],
+ 'padRight': _lodashStringPadRight['default'],
+ 'parseInt': _lodashStringParseInt['default'],
+ 'repeat': _lodashStringRepeat['default'],
+ 'snakeCase': _lodashStringSnakeCase['default'],
+ 'startCase': _lodashStringStartCase['default'],
+ 'startsWith': _lodashStringStartsWith['default'],
+ 'template': _lodashStringTemplate['default'],
+ 'templateSettings': _lodashStringTemplateSettings['default'],
+ 'trim': _lodashStringTrim['default'],
+ 'trimLeft': _lodashStringTrimLeft['default'],
+ 'trimRight': _lodashStringTrimRight['default'],
+ 'trunc': _lodashStringTrunc['default'],
+ 'unescape': _lodashStringUnescape['default'],
+ 'words': _lodashStringWords['default']
+ };
+});
+define('lodash/string/camelCase', ['exports', 'lodash/internal/createCompounder'], function (exports, _lodashInternalCreateCompounder) {
+ 'use strict';
+
+ /**
+ * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the camel cased string.
+ * @example
+ *
+ * _.camelCase('Foo Bar');
+ * // => 'fooBar'
+ *
+ * _.camelCase('--foo-bar');
+ * // => 'fooBar'
+ *
+ * _.camelCase('__foo_bar__');
+ * // => 'fooBar'
+ */
+ var camelCase = (0, _lodashInternalCreateCompounder['default'])(function (result, word, index) {
+ word = word.toLowerCase();
+ return result + (index ? word.charAt(0).toUpperCase() + word.slice(1) : word);
+ });
+
+ exports['default'] = camelCase;
+});
+define('lodash/string/capitalize', ['exports', 'lodash/internal/baseToString'], function (exports, _lodashInternalBaseToString) {
+ 'use strict';
+
+ /**
+ * Capitalizes the first character of `string`.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to capitalize.
+ * @returns {string} Returns the capitalized string.
+ * @example
+ *
+ * _.capitalize('fred');
+ * // => 'Fred'
+ */
+ function capitalize(string) {
+ string = (0, _lodashInternalBaseToString['default'])(string);
+ return string && string.charAt(0).toUpperCase() + string.slice(1);
+ }
+
+ exports['default'] = capitalize;
+});
+define('lodash/string/deburr', ['exports', 'lodash/internal/baseToString', 'lodash/internal/deburrLetter'], function (exports, _lodashInternalBaseToString, _lodashInternalDeburrLetter) {
+ 'use strict';
+
+ /** Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). */
+ var reComboMark = /[\u0300-\u036f\ufe20-\ufe23]/g;
+
+ /** Used to match latin-1 supplementary letters (excluding mathematical operators). */
+ var reLatin1 = /[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g;
+
+ /**
+ * Deburrs `string` by converting [latin-1 supplementary letters](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
+ * to basic latin letters and removing [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to deburr.
+ * @returns {string} Returns the deburred string.
+ * @example
+ *
+ * _.deburr('déjà vu');
+ * // => 'deja vu'
+ */
+ function deburr(string) {
+ string = (0, _lodashInternalBaseToString['default'])(string);
+ return string && string.replace(reLatin1, _lodashInternalDeburrLetter['default']).replace(reComboMark, '');
+ }
+
+ exports['default'] = deburr;
+});
+define('lodash/string/endsWith', ['exports', 'lodash/internal/baseToString'], function (exports, _lodashInternalBaseToString) {
+ 'use strict';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeMin = Math.min;
+
+ /**
+ * Checks if `string` ends with the given target string.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to search.
+ * @param {string} [target] The string to search for.
+ * @param {number} [position=string.length] The position to search from.
+ * @returns {boolean} Returns `true` if `string` ends with `target`, else `false`.
+ * @example
+ *
+ * _.endsWith('abc', 'c');
+ * // => true
+ *
+ * _.endsWith('abc', 'b');
+ * // => false
+ *
+ * _.endsWith('abc', 'b', 2);
+ * // => true
+ */
+ function endsWith(string, target, position) {
+ string = (0, _lodashInternalBaseToString['default'])(string);
+ target = target + '';
+
+ var length = string.length;
+ position = position === undefined ? length : nativeMin(position < 0 ? 0 : +position || 0, length);
+
+ position -= target.length;
+ return position >= 0 && string.indexOf(target, position) == position;
+ }
+
+ exports['default'] = endsWith;
+});
+define('lodash/string/escape', ['exports', 'lodash/internal/baseToString', 'lodash/internal/escapeHtmlChar'], function (exports, _lodashInternalBaseToString, _lodashInternalEscapeHtmlChar) {
+ 'use strict';
+
+ /** Used to match HTML entities and HTML characters. */
+ var reUnescapedHtml = /[&<>"'`]/g,
+ reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
+
+ /**
+ * Converts the characters "&", "<", ">", '"', "'", and "\`", in `string` to
+ * their corresponding HTML entities.
+ *
+ * **Note:** No other characters are escaped. To escape additional characters
+ * use a third-party library like [_he_](https://mths.be/he).
+ *
+ * Though the ">" character is escaped for symmetry, characters like
+ * ">" and "/" don't need escaping in HTML and have no special meaning
+ * unless they're part of a tag or unquoted attribute value.
+ * See [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
+ * (under "semi-related fun fact") for more details.
+ *
+ * Backticks are escaped because in Internet Explorer < 9, they can break out
+ * of attribute values or HTML comments. See [#59](https://html5sec.org/#59),
+ * [#102](https://html5sec.org/#102), [#108](https://html5sec.org/#108), and
+ * [#133](https://html5sec.org/#133) of the [HTML5 Security Cheatsheet](https://html5sec.org/)
+ * for more details.
+ *
+ * When working with HTML you should always [quote attribute values](http://wonko.com/post/html-escaping)
+ * to reduce XSS vectors.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to escape.
+ * @returns {string} Returns the escaped string.
+ * @example
+ *
+ * _.escape('fred, barney, & pebbles');
+ * // => 'fred, barney, & pebbles'
+ */
+ function escape(string) {
+ // Reset `lastIndex` because in IE < 9 `String#replace` does not.
+ string = (0, _lodashInternalBaseToString['default'])(string);
+ return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, _lodashInternalEscapeHtmlChar['default']) : string;
+ }
+
+ exports['default'] = escape;
+});
+define('lodash/string/escapeRegExp', ['exports', 'lodash/internal/baseToString', 'lodash/internal/escapeRegExpChar'], function (exports, _lodashInternalBaseToString, _lodashInternalEscapeRegExpChar) {
+ 'use strict';
+
+ /**
+ * Used to match `RegExp` [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns)
+ * and those outlined by [`EscapeRegExpPattern`](http://ecma-international.org/ecma-262/6.0/#sec-escaperegexppattern).
+ */
+ var reRegExpChars = /^[:!,]|[\\^$.*+?()[\]{}|\/]|(^[0-9a-fA-Fnrtuvx])|([\n\r\u2028\u2029])/g,
+ reHasRegExpChars = RegExp(reRegExpChars.source);
+
+ /**
+ * Escapes the `RegExp` special characters "\", "/", "^", "$", ".", "|", "?",
+ * "*", "+", "(", ")", "[", "]", "{" and "}" in `string`.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to escape.
+ * @returns {string} Returns the escaped string.
+ * @example
+ *
+ * _.escapeRegExp('[lodash](https://lodash.com/)');
+ * // => '\[lodash\]\(https:\/\/lodash\.com\/\)'
+ */
+ function escapeRegExp(string) {
+ string = (0, _lodashInternalBaseToString['default'])(string);
+ return string && reHasRegExpChars.test(string) ? string.replace(reRegExpChars, _lodashInternalEscapeRegExpChar['default']) : string || '(?:)';
+ }
+
+ exports['default'] = escapeRegExp;
+});
+define('lodash/string/kebabCase', ['exports', 'lodash/internal/createCompounder'], function (exports, _lodashInternalCreateCompounder) {
+ 'use strict';
+
+ /**
+ * Converts `string` to [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the kebab cased string.
+ * @example
+ *
+ * _.kebabCase('Foo Bar');
+ * // => 'foo-bar'
+ *
+ * _.kebabCase('fooBar');
+ * // => 'foo-bar'
+ *
+ * _.kebabCase('__foo_bar__');
+ * // => 'foo-bar'
+ */
+ var kebabCase = (0, _lodashInternalCreateCompounder['default'])(function (result, word, index) {
+ return result + (index ? '-' : '') + word.toLowerCase();
+ });
+
+ exports['default'] = kebabCase;
+});
+define('lodash/string/pad', ['exports', 'lodash/internal/baseToString', 'lodash/internal/createPadding', 'lodash/internal/root'], function (exports, _lodashInternalBaseToString, _lodashInternalCreatePadding, _lodashInternalRoot) {
+ 'use strict';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeCeil = Math.ceil,
+ nativeFloor = Math.floor,
+ nativeIsFinite = _lodashInternalRoot['default'].isFinite;
+
+ /**
+ * Pads `string` on the left and right sides if it's shorter than `length`.
+ * Padding characters are truncated if they can't be evenly divided by `length`.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to pad.
+ * @param {number} [length=0] The padding length.
+ * @param {string} [chars=' '] The string used as padding.
+ * @returns {string} Returns the padded string.
+ * @example
+ *
+ * _.pad('abc', 8);
+ * // => ' abc '
+ *
+ * _.pad('abc', 8, '_-');
+ * // => '_-abc_-_'
+ *
+ * _.pad('abc', 3);
+ * // => 'abc'
+ */
+ function pad(string, length, chars) {
+ string = (0, _lodashInternalBaseToString['default'])(string);
+ length = +length;
+
+ var strLength = string.length;
+ if (strLength >= length || !nativeIsFinite(length)) {
+ return string;
+ }
+ var mid = (length - strLength) / 2,
+ leftLength = nativeFloor(mid),
+ rightLength = nativeCeil(mid);
+
+ chars = (0, _lodashInternalCreatePadding['default'])('', rightLength, chars);
+ return chars.slice(0, leftLength) + string + chars;
+ }
+
+ exports['default'] = pad;
+});
+define('lodash/string/padLeft', ['exports', 'lodash/internal/createPadDir'], function (exports, _lodashInternalCreatePadDir) {
+ 'use strict';
+
+ /**
+ * Pads `string` on the left side if it's shorter than `length`. Padding
+ * characters are truncated if they exceed `length`.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to pad.
+ * @param {number} [length=0] The padding length.
+ * @param {string} [chars=' '] The string used as padding.
+ * @returns {string} Returns the padded string.
+ * @example
+ *
+ * _.padLeft('abc', 6);
+ * // => ' abc'
+ *
+ * _.padLeft('abc', 6, '_-');
+ * // => '_-_abc'
+ *
+ * _.padLeft('abc', 3);
+ * // => 'abc'
+ */
+ var padLeft = (0, _lodashInternalCreatePadDir['default'])();
+
+ exports['default'] = padLeft;
+});
+define('lodash/string/padRight', ['exports', 'lodash/internal/createPadDir'], function (exports, _lodashInternalCreatePadDir) {
+ 'use strict';
+
+ /**
+ * Pads `string` on the right side if it's shorter than `length`. Padding
+ * characters are truncated if they exceed `length`.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to pad.
+ * @param {number} [length=0] The padding length.
+ * @param {string} [chars=' '] The string used as padding.
+ * @returns {string} Returns the padded string.
+ * @example
+ *
+ * _.padRight('abc', 6);
+ * // => 'abc '
+ *
+ * _.padRight('abc', 6, '_-');
+ * // => 'abc_-_'
+ *
+ * _.padRight('abc', 3);
+ * // => 'abc'
+ */
+ var padRight = (0, _lodashInternalCreatePadDir['default'])(true);
+
+ exports['default'] = padRight;
+});
+define('lodash/string/parseInt', ['exports', 'lodash/internal/isIterateeCall', 'lodash/internal/root', 'lodash/string/trim'], function (exports, _lodashInternalIsIterateeCall, _lodashInternalRoot, _lodashStringTrim) {
+ 'use strict';
+
+ /** Used to detect hexadecimal string values. */
+ var reHasHexPrefix = /^0[xX]/;
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeParseInt = _lodashInternalRoot['default'].parseInt;
+
+ /**
+ * Converts `string` to an integer of the specified radix. If `radix` is
+ * `undefined` or `0`, a `radix` of `10` is used unless `value` is a hexadecimal,
+ * in which case a `radix` of `16` is used.
+ *
+ * **Note:** This method aligns with the [ES5 implementation](https://es5.github.io/#E)
+ * of `parseInt`.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} string The string to convert.
+ * @param {number} [radix] The radix to interpret `value` by.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
+ * @returns {number} Returns the converted integer.
+ * @example
+ *
+ * _.parseInt('08');
+ * // => 8
+ *
+ * _.map(['6', '08', '10'], _.parseInt);
+ * // => [6, 8, 10]
+ */
+ function parseInt(string, radix, guard) {
+ // Firefox < 21 and Opera < 15 follow ES3 for `parseInt`.
+ // Chrome fails to trim leading whitespace characters.
+ // See https://code.google.com/p/v8/issues/detail?id=3109 for more details.
+ if (guard ? (0, _lodashInternalIsIterateeCall['default'])(string, radix, guard) : radix == null) {
+ radix = 0;
+ } else if (radix) {
+ radix = +radix;
+ }
+ string = (0, _lodashStringTrim['default'])(string);
+ return nativeParseInt(string, radix || (reHasHexPrefix.test(string) ? 16 : 10));
+ }
+
+ exports['default'] = parseInt;
+});
+define('lodash/string/repeat', ['exports', 'lodash/internal/baseToString', 'lodash/internal/root'], function (exports, _lodashInternalBaseToString, _lodashInternalRoot) {
+ 'use strict';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeFloor = Math.floor,
+ nativeIsFinite = _lodashInternalRoot['default'].isFinite;
+
+ /**
+ * Repeats the given string `n` times.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to repeat.
+ * @param {number} [n=0] The number of times to repeat the string.
+ * @returns {string} Returns the repeated string.
+ * @example
+ *
+ * _.repeat('*', 3);
+ * // => '***'
+ *
+ * _.repeat('abc', 2);
+ * // => 'abcabc'
+ *
+ * _.repeat('abc', 0);
+ * // => ''
+ */
+ function repeat(string, n) {
+ var result = '';
+ string = (0, _lodashInternalBaseToString['default'])(string);
+ n = +n;
+ if (n < 1 || !string || !nativeIsFinite(n)) {
+ return result;
+ }
+ // Leverage the exponentiation by squaring algorithm for a faster repeat.
+ // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
+ do {
+ if (n % 2) {
+ result += string;
+ }
+ n = nativeFloor(n / 2);
+ string += string;
+ } while (n);
+
+ return result;
+ }
+
+ exports['default'] = repeat;
+});
+define('lodash/string/snakeCase', ['exports', 'lodash/internal/createCompounder'], function (exports, _lodashInternalCreateCompounder) {
+ 'use strict';
+
+ /**
+ * Converts `string` to [snake case](https://en.wikipedia.org/wiki/Snake_case).
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the snake cased string.
+ * @example
+ *
+ * _.snakeCase('Foo Bar');
+ * // => 'foo_bar'
+ *
+ * _.snakeCase('fooBar');
+ * // => 'foo_bar'
+ *
+ * _.snakeCase('--foo-bar');
+ * // => 'foo_bar'
+ */
+ var snakeCase = (0, _lodashInternalCreateCompounder['default'])(function (result, word, index) {
+ return result + (index ? '_' : '') + word.toLowerCase();
+ });
+
+ exports['default'] = snakeCase;
+});
+define('lodash/string/startCase', ['exports', 'lodash/internal/createCompounder'], function (exports, _lodashInternalCreateCompounder) {
+ 'use strict';
+
+ /**
+ * Converts `string` to [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the start cased string.
+ * @example
+ *
+ * _.startCase('--foo-bar');
+ * // => 'Foo Bar'
+ *
+ * _.startCase('fooBar');
+ * // => 'Foo Bar'
+ *
+ * _.startCase('__foo_bar__');
+ * // => 'Foo Bar'
+ */
+ var startCase = (0, _lodashInternalCreateCompounder['default'])(function (result, word, index) {
+ return result + (index ? ' ' : '') + (word.charAt(0).toUpperCase() + word.slice(1));
+ });
+
+ exports['default'] = startCase;
+});
+define('lodash/string/startsWith', ['exports', 'lodash/internal/baseToString'], function (exports, _lodashInternalBaseToString) {
+ 'use strict';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeMin = Math.min;
+
+ /**
+ * Checks if `string` starts with the given target string.
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to search.
+ * @param {string} [target] The string to search for.
+ * @param {number} [position=0] The position to search from.
+ * @returns {boolean} Returns `true` if `string` starts with `target`, else `false`.
+ * @example
+ *
+ * _.startsWith('abc', 'a');
+ * // => true
+ *
+ * _.startsWith('abc', 'b');
+ * // => false
+ *
+ * _.startsWith('abc', 'b', 1);
+ * // => true
+ */
+ function startsWith(string, target, position) {
+ string = (0, _lodashInternalBaseToString['default'])(string);
+ position = position == null ? 0 : nativeMin(position < 0 ? 0 : +position || 0, string.length);
+
+ return string.lastIndexOf(target, position) == position;
+ }
+
+ exports['default'] = startsWith;
+});
+define('lodash/string/template', ['exports', 'lodash/internal/assignOwnDefaults', 'lodash/internal/assignWith', 'lodash/utility/attempt', 'lodash/internal/baseAssign', 'lodash/internal/baseToString', 'lodash/internal/baseValues', 'lodash/internal/escapeStringChar', 'lodash/lang/isError', 'lodash/internal/isIterateeCall', 'lodash/object/keys', 'lodash/internal/reInterpolate', 'lodash/string/templateSettings'], function (exports, _lodashInternalAssignOwnDefaults, _lodashInternalAssignWith, _lodashUtilityAttempt, _lodashInternalBaseAssign, _lodashInternalBaseToString, _lodashInternalBaseValues, _lodashInternalEscapeStringChar, _lodashLangIsError, _lodashInternalIsIterateeCall, _lodashObjectKeys, _lodashInternalReInterpolate, _lodashStringTemplateSettings) {
+ 'use strict';
+
+ /** Used to match empty string literals in compiled template source. */
+ var reEmptyStringLeading = /\b__p \+= '';/g,
+ reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
+ reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
+
+ /** Used to match [ES template delimiters](http://ecma-international.org/ecma-262/6.0/#sec-template-literal-lexical-components). */
+ var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
+
+ /** Used to ensure capturing order of template delimiters. */
+ var reNoMatch = /($^)/;
+
+ /** Used to match unescaped characters in compiled string literals. */
+ var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
+
+ /**
+ * Creates a compiled template function that can interpolate data properties
+ * in "interpolate" delimiters, HTML-escape interpolated data properties in
+ * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
+ * properties may be accessed as free variables in the template. If a setting
+ * object is provided it takes precedence over `_.templateSettings` values.
+ *
+ * **Note:** In the development build `_.template` utilizes
+ * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
+ * for easier debugging.
+ *
+ * For more information on precompiling templates see
+ * [lodash's custom builds documentation](https://lodash.com/custom-builds).
+ *
+ * For more information on Chrome extension sandboxes see
+ * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
+ *
+ * @static
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The template string.
+ * @param {Object} [options] The options object.
+ * @param {RegExp} [options.escape] The HTML "escape" delimiter.
+ * @param {RegExp} [options.evaluate] The "evaluate" delimiter.
+ * @param {Object} [options.imports] An object to import into the template as free variables.
+ * @param {RegExp} [options.interpolate] The "interpolate" delimiter.
+ * @param {string} [options.sourceURL] The sourceURL of the template's compiled source.
+ * @param {string} [options.variable] The data object variable name.
+ * @param- {Object} [otherOptions] Enables the legacy `options` param signature.
+ * @returns {Function} Returns the compiled template function.
+ * @example
+ *
+ * // using the "interpolate" delimiter to create a compiled template
+ * var compiled = _.template('hello <%= user %>!');
+ * compiled({ 'user': 'fred' });
+ * // => 'hello fred!'
+ *
+ * // using the HTML "escape" delimiter to escape data property values
+ * var compiled = _.template('<%- value %> ');
+ * compiled({ 'value': '\n ```\n \n And associate it by name using a view's `templateName` property:\n \n ```javascript\n AView = Ember.View.extend({\n templateName: 'some-template'\n });\n ```\n \n If you have nested routes, your Handlebars template will look like this:\n \n ```html\n \n ```\n \n And `templateName` property:\n \n ```javascript\n AView = Ember.View.extend({\n templateName: 'posts/new'\n });\n ```\n \n Using a value for `templateName` that does not have a template\n with a matching `data-template-name` attribute will throw an error.\n \n For views classes that may have a template later defined (e.g. as the block\n portion of a `{{view}}` helper call in another template or in\n a subclass), you can provide a `defaultTemplate` property set to compiled\n template function. If a template is not later provided for the view instance\n the `defaultTemplate` value will be used:\n \n ```javascript\n AView = Ember.View.extend({\n defaultTemplate: Ember.HTMLBars.compile('I was the default'),\n template: null,\n templateName: null\n });\n ```\n \n Will result in instances with an HTML representation of:\n \n ```html\n I was the default
\n ```\n \n If a `template` or `templateName` is provided it will take precedence over\n `defaultTemplate`:\n \n ```javascript\n AView = Ember.View.extend({\n defaultTemplate: Ember.HTMLBars.compile('I was the default')\n });\n \n aView = AView.create({\n template: Ember.HTMLBars.compile('I was the template, not default')\n });\n ```\n \n Will result in the following HTML representation when rendered:\n \n ```html\n I was the template, not default
\n ```\n \n ## View Context\n \n The default context of the compiled template is the view's controller:\n \n ```javascript\n AView = Ember.View.extend({\n template: Ember.HTMLBars.compile('Hello {{excitedGreeting}}')\n });\n \n aController = Ember.Object.create({\n firstName: 'Barry',\n excitedGreeting: Ember.computed('content.firstName', function() {\n return this.get('content.firstName') + '!!!';\n })\n });\n \n aView = AView.create({\n controller: aController\n });\n ```\n \n Will result in an HTML representation of:\n \n ```html\n Hello Barry!!!
\n ```\n \n A context can also be explicitly supplied through the view's `context`\n property. If the view has neither `context` nor `controller` properties, the\n `parentView`'s context will be used.\n \n ## Layouts\n \n Views can have a secondary template that wraps their main template. Like\n primary templates, layouts can be any function that accepts an optional\n context parameter and returns a string of HTML that will be inserted inside\n view's tag. Views whose HTML element is self closing (e.g. ` `)\n cannot have a layout and this property will be ignored.\n \n Most typically in Ember a layout will be a compiled template.\n \n A view's layout can be set directly with the `layout` property or reference\n an existing template by name with the `layoutName` property.\n \n A template used as a layout must contain a single use of the\n `{{yield}}` helper. The HTML contents of a view's rendered `template` will be\n inserted at this location:\n \n ```javascript\n AViewWithLayout = Ember.View.extend({\n layout: Ember.HTMLBars.compile(\"{{yield}}
\"),\n template: Ember.HTMLBars.compile(\"I got wrapped\")\n });\n ```\n \n Will result in view instances with an HTML representation of:\n \n ```html\n \n ```\n \n See [Ember.Templates.helpers.yield](/api/classes/Ember.Templates.helpers.html#method_yield)\n for more information.\n \n ## Responding to Browser Events\n \n Views can respond to user-initiated events in one of three ways: method\n implementation, through an event manager, and through `{{action}}` helper use\n in their template or layout.\n \n ### Method Implementation\n \n Views can respond to user-initiated events by implementing a method that\n matches the event name. A `jQuery.Event` object will be passed as the\n argument to this method.\n \n ```javascript\n AView = Ember.View.extend({\n click: function(event) {\n // will be called when an instance's\n // rendered element is clicked\n }\n });\n ```\n \n ### Event Managers\n \n Views can define an object as their `eventManager` property. This object can\n then implement methods that match the desired event names. Matching events\n that occur on the view's rendered HTML or the rendered HTML of any of its DOM\n descendants will trigger this method. A `jQuery.Event` object will be passed\n as the first argument to the method and an `Ember.View` object as the\n second. The `Ember.View` will be the view whose rendered HTML was interacted\n with. This may be the view with the `eventManager` property or one of its\n descendant views.\n \n ```javascript\n AView = Ember.View.extend({\n eventManager: Ember.Object.create({\n doubleClick: function(event, view) {\n // will be called when an instance's\n // rendered element or any rendering\n // of this view's descendant\n // elements is clicked\n }\n })\n });\n ```\n \n An event defined for an event manager takes precedence over events of the\n same name handled through methods on the view.\n \n ```javascript\n AView = Ember.View.extend({\n mouseEnter: function(event) {\n // will never trigger.\n },\n eventManager: Ember.Object.create({\n mouseEnter: function(event, view) {\n // takes precedence over AView#mouseEnter\n }\n })\n });\n ```\n \n Similarly a view's event manager will take precedence for events of any views\n rendered as a descendant. A method name that matches an event name will not\n be called if the view instance was rendered inside the HTML representation of\n a view that has an `eventManager` property defined that handles events of the\n name. Events not handled by the event manager will still trigger method calls\n on the descendant.\n \n ```javascript\n var App = Ember.Application.create();\n App.OuterView = Ember.View.extend({\n template: Ember.HTMLBars.compile(\"outer {{#view 'inner'}}inner{{/view}} outer\"),\n eventManager: Ember.Object.create({\n mouseEnter: function(event, view) {\n // view might be instance of either\n // OuterView or InnerView depending on\n // where on the page the user interaction occurred\n }\n })\n });\n \n App.InnerView = Ember.View.extend({\n click: function(event) {\n // will be called if rendered inside\n // an OuterView because OuterView's\n // eventManager doesn't handle click events\n },\n mouseEnter: function(event) {\n // will never be called if rendered inside\n // an OuterView.\n }\n });\n ```\n \n ### `{{action}}` Helper\n \n See [Ember.Templates.helpers.action](/api/classes/Ember.Templates.helpers.html#method_action).\n \n ### Event Names\n \n All of the event handling approaches described above respond to the same set\n of events. The names of the built-in events are listed below. (The hash of\n built-in events exists in `Ember.EventDispatcher`.) Additional, custom events\n can be registered by using `Ember.Application.customEvents`.\n \n Touch events:\n \n * `touchStart`\n * `touchMove`\n * `touchEnd`\n * `touchCancel`\n \n Keyboard events\n \n * `keyDown`\n * `keyUp`\n * `keyPress`\n \n Mouse events\n \n * `mouseDown`\n * `mouseUp`\n * `contextMenu`\n * `click`\n * `doubleClick`\n * `mouseMove`\n * `focusIn`\n * `focusOut`\n * `mouseEnter`\n * `mouseLeave`\n \n Form events:\n \n * `submit`\n * `change`\n * `focusIn`\n * `focusOut`\n * `input`\n \n HTML5 drag and drop events:\n \n * `dragStart`\n * `drag`\n * `dragEnter`\n * `dragLeave`\n * `dragOver`\n * `dragEnd`\n * `drop`\n \n ## `{{view}}` Helper\n \n Other `Ember.View` instances can be included as part of a view's template by\n using the `{{view}}` helper. See [Ember.Templates.helpers.view](/api/classes/Ember.Templates.helpers.html#method_view)\n for additional information.\n \n @class View\n @namespace Ember\n @extends Ember.CoreView\n @deprecated See http://emberjs.com/deprecations/v1.x/#toc_ember-view\n @uses Ember.ViewSupport\n @uses Ember.ViewContextSupport\n @uses Ember.ViewChildViewsSupport\n @uses Ember.TemplateRenderingSupport\n @uses Ember.ClassNamesSupport\n @uses Ember.AttributeBindingsSupport\n @uses Ember.LegacyViewSupport\n @uses Ember.InstrumentationSupport\n @uses Ember.VisibilitySupport\n @uses Ember.AriaRoleSupport\n @public\n */\n // jscs:disable validateIndentation\n var View = _emberViewsViewsCore_view.default.extend(_emberViewsMixinsView_context_support.default, _emberViewsMixinsView_child_views_support.default, _emberViewsMixinsLegacy_child_views_support.default, _emberViewsMixinsView_state_support.default, _emberViewsMixinsTemplate_rendering_support.default, _emberViewsMixinsClass_names_support.default, _emberViewsMixinsLegacy_view_support.default, _emberViewsMixinsInstrumentation_support.default, _emberViewsMixinsVisibility_support.default, _emberViewsCompatAttrsProxy.default, _emberViewsMixinsAria_role_support.default, _emberViewsMixinsView_support.default, {\n init: function () {\n this._super.apply(this, arguments);\n\n if (!this._viewRegistry) {\n this._viewRegistry = View.views;\n }\n },\n\n /**\n Given a property name, returns a dasherized version of that\n property name if the property evaluates to a non-falsy value.\n For example, if the view has property `isUrgent` that evaluates to true,\n passing `isUrgent` to this method will return `\"is-urgent\"`.\n @method _classStringForProperty\n @param property\n @private\n */\n _classStringForProperty: function (parsedPath) {\n return View._classStringForValue(parsedPath.path, parsedPath.stream.value(), parsedPath.className, parsedPath.falsyClassName);\n }\n });\n\n _emberMetalDeprecate_property.deprecateProperty(View.prototype, 'currentState', '_currentState', {\n id: 'ember-view.current-state',\n until: '2.3.0',\n url: 'http://emberjs.com/deprecations/v2.x/#toc_ember-component-currentstate'\n });\n\n // jscs:enable validateIndentation\n\n /*\n Describe how the specified actions should behave in the various\n states that a view can exist in. Possible states:\n \n * preRender: when a view is first instantiated, and after its\n element was destroyed, it is in the preRender state\n * inBuffer: once a view has been rendered, but before it has\n been inserted into the DOM, it is in the inBuffer state\n * hasElement: the DOM representation of the view is created,\n and is ready to be inserted\n * inDOM: once a view has been inserted into the DOM it is in\n the inDOM state. A view spends the vast majority of its\n existence in this state.\n * destroyed: once a view has been destroyed (using the destroy\n method), it is in this state. No further actions can be invoked\n on a destroyed view.\n */\n\n // in the destroyed state, everything is illegal\n\n // before rendering has begun, all legal manipulations are noops.\n\n // inside the buffer, legal manipulations are done on the buffer\n\n // once the view has been inserted into the DOM, legal manipulations\n // are done on the DOM element.\n\n View.reopenClass({\n /**\n Global views hash\n @property views\n @static\n @type Object\n @private\n */\n views: {},\n\n // If someone overrides the child views computed property when\n // defining their class, we want to be able to process the user's\n // supplied childViews and then restore the original computed property\n // at view initialization time. This happens in Ember.ContainerView's init\n // method.\n childViewsProperty: _emberViewsMixinsView_child_views_support.childViewsProperty\n });\n\n function viewDeprecationMessage() {\n _emberMetalDebug.deprecate('Ember.View is deprecated. Consult the Deprecations Guide for a migration strategy.', !!_emberMetalCore.default.ENV._ENABLE_LEGACY_VIEW_SUPPORT, {\n url: 'http://emberjs.com/deprecations/v1.x/#toc_ember-view',\n id: 'ember-views.view-deprecated',\n until: '2.4.0'\n });\n }\n\n var DeprecatedView = View.extend({\n init: function () {\n viewDeprecationMessage();\n this._super.apply(this, arguments);\n }\n });\n\n DeprecatedView.reopen = function () {\n viewDeprecationMessage();\n View.reopen.apply(View, arguments);\n return this;\n };\n\n exports.default = View;\n exports.ViewContextSupport = _emberViewsMixinsView_context_support.default;\n exports.ViewChildViewsSupport = _emberViewsMixinsView_child_views_support.default;\n exports.ViewStateSupport = _emberViewsMixinsView_state_support.default;\n exports.TemplateRenderingSupport = _emberViewsMixinsTemplate_rendering_support.default;\n exports.ClassNamesSupport = _emberViewsMixinsClass_names_support.default;\n exports.DeprecatedView = DeprecatedView;\n});\n// for the side effect of extending Ember.run.queues\nenifed('htmlbars-runtime/expression-visitor', ['exports'], function (exports) {\n /**\n # Expression Nodes:\n \n These nodes are not directly responsible for any part of the DOM, but are\n eventually passed to a Statement Node.\n \n * get\n * subexpr\n * concat\n */\n\n 'use strict';\n\n exports.acceptParams = acceptParams;\n exports.acceptHash = acceptHash;\n\n function acceptParams(nodes, env, scope) {\n var array = [];\n\n for (var i = 0, l = nodes.length; i < l; i++) {\n array.push(acceptExpression(nodes[i], env, scope).value);\n }\n\n return array;\n }\n\n function acceptHash(pairs, env, scope) {\n var object = {};\n\n for (var i = 0, l = pairs.length; i < l; i += 2) {\n var key = pairs[i];\n var value = pairs[i + 1];\n object[key] = acceptExpression(value, env, scope).value;\n }\n\n return object;\n }\n\n function acceptExpression(node, env, scope) {\n var ret = { value: null };\n\n // Primitive literals are unambiguously non-array representations of\n // themselves.\n if (typeof node !== 'object' || node === null) {\n ret.value = node;\n } else {\n ret.value = evaluateNode(node, env, scope);\n }\n\n return ret;\n }\n\n function evaluateNode(node, env, scope) {\n switch (node[0]) {\n // can be used by manualElement\n case 'value':\n return node[1];\n case 'get':\n return evaluateGet(node, env, scope);\n case 'subexpr':\n return evaluateSubexpr(node, env, scope);\n case 'concat':\n return evaluateConcat(node, env, scope);\n }\n }\n\n function evaluateGet(node, env, scope) {\n var path = node[1];\n\n return env.hooks.get(env, scope, path);\n }\n\n function evaluateSubexpr(node, env, scope) {\n var path = node[1];\n var rawParams = node[2];\n var rawHash = node[3];\n\n var params = acceptParams(rawParams, env, scope);\n var hash = acceptHash(rawHash, env, scope);\n\n return env.hooks.subexpr(env, scope, path, params, hash);\n }\n\n function evaluateConcat(node, env, scope) {\n var rawParts = node[1];\n\n var parts = acceptParams(rawParts, env, scope);\n\n return env.hooks.concat(env, parts);\n }\n});\nenifed(\"htmlbars-runtime/hooks\", [\"exports\", \"htmlbars-runtime/render\", \"morph-range/morph-list\", \"htmlbars-util/object-utils\", \"htmlbars-util/morph-utils\", \"htmlbars-util/template-utils\"], function (exports, _htmlbarsRuntimeRender, _morphRangeMorphList, _htmlbarsUtilObjectUtils, _htmlbarsUtilMorphUtils, _htmlbarsUtilTemplateUtils) {\n \"use strict\";\n\n exports.wrap = wrap;\n exports.wrapForHelper = wrapForHelper;\n exports.createScope = createScope;\n exports.createFreshScope = createFreshScope;\n exports.bindShadowScope = bindShadowScope;\n exports.createChildScope = createChildScope;\n exports.bindSelf = bindSelf;\n exports.updateSelf = updateSelf;\n exports.bindLocal = bindLocal;\n exports.updateLocal = updateLocal;\n exports.bindBlock = bindBlock;\n exports.block = block;\n exports.continueBlock = continueBlock;\n exports.hostBlock = hostBlock;\n exports.handleRedirect = handleRedirect;\n exports.handleKeyword = handleKeyword;\n exports.linkRenderNode = linkRenderNode;\n exports.inline = inline;\n exports.keyword = keyword;\n exports.invokeHelper = invokeHelper;\n exports.classify = classify;\n exports.partial = partial;\n exports.range = range;\n exports.element = element;\n exports.attribute = attribute;\n exports.subexpr = subexpr;\n exports.get = get;\n exports.getRoot = getRoot;\n exports.getBlock = getBlock;\n exports.getChild = getChild;\n exports.getValue = getValue;\n exports.getCellOrValue = getCellOrValue;\n exports.component = component;\n exports.concat = concat;\n exports.hasHelper = hasHelper;\n exports.lookupHelper = lookupHelper;\n exports.bindScope = bindScope;\n exports.updateScope = updateScope;\n\n /**\n HTMLBars delegates the runtime behavior of a template to\n hooks provided by the host environment. These hooks explain\n the lexical environment of a Handlebars template, the internal\n representation of references, and the interaction between an\n HTMLBars template and the DOM it is managing.\n \n While HTMLBars host hooks have access to all of this internal\n machinery, templates and helpers have access to the abstraction\n provided by the host hooks.\n \n ## The Lexical Environment\n \n The default lexical environment of an HTMLBars template includes:\n \n * Any local variables, provided by *block arguments*\n * The current value of `self`\n \n ## Simple Nesting\n \n Let's look at a simple template with a nested block:\n \n ```hbs\n {{title}} \n \n {{#if author}}\n {{author}}
\n {{/if}}\n ```\n \n In this case, the lexical environment at the top-level of the\n template does not change inside of the `if` block. This is\n achieved via an implementation of `if` that looks like this:\n \n ```js\n registerHelper('if', function(params) {\n if (!!params[0]) {\n return this.yield();\n }\n });\n ```\n \n A call to `this.yield` invokes the child template using the\n current lexical environment.\n \n ## Block Arguments\n \n It is possible for nested blocks to introduce new local\n variables:\n \n ```hbs\n {{#count-calls as |i|}}\n {{title}} \n Called {{i}} times
\n {{/count}}\n ```\n \n In this example, the child block inherits its surrounding\n lexical environment, but augments it with a single new\n variable binding.\n \n The implementation of `count-calls` supplies the value of\n `i`, but does not otherwise alter the environment:\n \n ```js\n var count = 0;\n registerHelper('count-calls', function() {\n return this.yield([ ++count ]);\n });\n ```\n */\n\n function wrap(template) {\n if (template === null) {\n return null;\n }\n\n return {\n meta: template.meta,\n arity: template.arity,\n raw: template,\n render: function (self, env, options, blockArguments) {\n var scope = env.hooks.createFreshScope();\n\n var contextualElement = options && options.contextualElement;\n var renderOptions = new _htmlbarsRuntimeRender.RenderOptions(null, self, blockArguments, contextualElement);\n\n return _htmlbarsRuntimeRender.default(template, env, scope, renderOptions);\n }\n };\n }\n\n function wrapForHelper(template, env, scope, morph, renderState, visitor) {\n if (!template) {\n return {};\n }\n\n var yieldArgs = yieldTemplate(template, env, scope, morph, renderState, visitor);\n\n return {\n meta: template.meta,\n arity: template.arity,\n 'yield': yieldArgs, // quoted since it's a reserved word, see issue #420\n yieldItem: yieldItem(template, env, scope, morph, renderState, visitor),\n raw: template,\n\n render: function (self, blockArguments) {\n yieldArgs(blockArguments, self);\n }\n };\n }\n\n // Called by a user-land helper to render a template.\n function yieldTemplate(template, env, parentScope, morph, renderState, visitor) {\n return function (blockArguments, self) {\n // Render state is used to track the progress of the helper (since it\n // may call into us multiple times). As the user-land helper calls\n // into library code, we track what needs to be cleaned up after the\n // helper has returned.\n //\n // Here, we remember that a template has been yielded and so we do not\n // need to remove the previous template. (If no template is yielded\n // this render by the helper, we assume nothing should be shown and\n // remove any previous rendered templates.)\n renderState.morphToClear = null;\n\n // In this conditional is true, it means that on the previous rendering pass\n // the helper yielded multiple items via `yieldItem()`, but this time they\n // are yielding a single template. In that case, we mark the morph list for\n // cleanup so it is removed from the DOM.\n if (morph.morphList) {\n _htmlbarsUtilTemplateUtils.clearMorphList(morph.morphList, morph, env);\n renderState.morphListToClear = null;\n }\n\n var scope = parentScope;\n\n if (morph.lastYielded && isStableTemplate(template, morph.lastYielded)) {\n return morph.lastResult.revalidateWith(env, undefined, self, blockArguments, visitor);\n }\n\n // Check to make sure that we actually **need** a new scope, and can't\n // share the parent scope. Note that we need to move this check into\n // a host hook, because the host's notion of scope may require a new\n // scope in more cases than the ones we can determine statically.\n if (self !== undefined || parentScope === null || template.arity) {\n scope = env.hooks.createChildScope(parentScope);\n }\n\n morph.lastYielded = { self: self, template: template, shadowTemplate: null };\n\n // Render the template that was selected by the helper\n var renderOptions = new _htmlbarsRuntimeRender.RenderOptions(morph, self, blockArguments);\n _htmlbarsRuntimeRender.default(template, env, scope, renderOptions);\n };\n }\n\n function yieldItem(template, env, parentScope, morph, renderState, visitor) {\n // Initialize state that tracks multiple items being\n // yielded in.\n var currentMorph = null;\n\n // Candidate morphs for deletion.\n var candidates = {};\n\n // Reuse existing MorphList if this is not a first-time\n // render.\n var morphList = morph.morphList;\n if (morphList) {\n currentMorph = morphList.firstChildMorph;\n }\n\n // Advances the currentMorph pointer to the morph in the previously-rendered\n // list that matches the yielded key. While doing so, it marks any morphs\n // that it advances past as candidates for deletion. Assuming those morphs\n // are not yielded in later, they will be removed in the prune step during\n // cleanup.\n // Note that this helper function assumes that the morph being seeked to is\n // guaranteed to exist in the previous MorphList; if this is called and the\n // morph does not exist, it will result in an infinite loop\n function advanceToKey(key) {\n var seek = currentMorph;\n\n while (seek.key !== key) {\n candidates[seek.key] = seek;\n seek = seek.nextMorph;\n }\n\n currentMorph = seek.nextMorph;\n return seek;\n }\n\n return function (_key, blockArguments, self) {\n if (typeof _key !== 'string') {\n throw new Error(\"You must provide a string key when calling `yieldItem`; you provided \" + _key);\n }\n\n // At least one item has been yielded, so we do not wholesale\n // clear the last MorphList but instead apply a prune operation.\n renderState.morphListToClear = null;\n morph.lastYielded = null;\n\n var morphList, morphMap;\n\n if (!morph.morphList) {\n morph.morphList = new _morphRangeMorphList.default();\n morph.morphMap = {};\n morph.setMorphList(morph.morphList);\n }\n\n morphList = morph.morphList;\n morphMap = morph.morphMap;\n\n // A map of morphs that have been yielded in on this\n // rendering pass. Any morphs that do not make it into\n // this list will be pruned from the MorphList during the cleanup\n // process.\n var handledMorphs = renderState.handledMorphs;\n var key = undefined;\n\n if (_key in handledMorphs) {\n // In this branch we are dealing with a duplicate key. The strategy\n // is to take the original key and append a counter to it that is\n // incremented every time the key is reused. In order to greatly\n // reduce the chance of colliding with another valid key we also add\n // an extra string \"--z8mS2hvDW0A--\" to the new key.\n var collisions = renderState.collisions;\n if (collisions === undefined) {\n collisions = renderState.collisions = {};\n }\n var count = collisions[_key] | 0;\n collisions[_key] = ++count;\n\n key = _key + '--z8mS2hvDW0A--' + count;\n } else {\n key = _key;\n }\n\n if (currentMorph && currentMorph.key === key) {\n yieldTemplate(template, env, parentScope, currentMorph, renderState, visitor)(blockArguments, self);\n currentMorph = currentMorph.nextMorph;\n handledMorphs[key] = currentMorph;\n } else if (morphMap[key] !== undefined) {\n var foundMorph = morphMap[key];\n\n if (key in candidates) {\n // If we already saw this morph, move it forward to this position\n morphList.insertBeforeMorph(foundMorph, currentMorph);\n } else {\n // Otherwise, move the pointer forward to the existing morph for this key\n advanceToKey(key);\n }\n\n handledMorphs[foundMorph.key] = foundMorph;\n yieldTemplate(template, env, parentScope, foundMorph, renderState, visitor)(blockArguments, self);\n } else {\n var childMorph = _htmlbarsRuntimeRender.createChildMorph(env.dom, morph);\n childMorph.key = key;\n morphMap[key] = handledMorphs[key] = childMorph;\n morphList.insertBeforeMorph(childMorph, currentMorph);\n yieldTemplate(template, env, parentScope, childMorph, renderState, visitor)(blockArguments, self);\n }\n\n renderState.morphListToPrune = morphList;\n morph.childNodes = null;\n };\n }\n\n function isStableTemplate(template, lastYielded) {\n return !lastYielded.shadowTemplate && template === lastYielded.template;\n }\n function optionsFor(template, inverse, env, scope, morph, visitor) {\n // If there was a template yielded last time, set morphToClear so it will be cleared\n // if no template is yielded on this render.\n var morphToClear = morph.lastResult ? morph : null;\n var renderState = new _htmlbarsUtilTemplateUtils.RenderState(morphToClear, morph.morphList || null);\n\n return {\n templates: {\n template: wrapForHelper(template, env, scope, morph, renderState, visitor),\n inverse: wrapForHelper(inverse, env, scope, morph, renderState, visitor)\n },\n renderState: renderState\n };\n }\n\n function thisFor(options) {\n return {\n arity: options.template.arity,\n 'yield': options.template.yield, // quoted since it's a reserved word, see issue #420\n yieldItem: options.template.yieldItem,\n yieldIn: options.template.yieldIn\n };\n }\n\n /**\n Host Hook: createScope\n \n @param {Scope?} parentScope\n @return Scope\n \n Corresponds to entering a new HTMLBars block.\n \n This hook is invoked when a block is entered with\n a new `self` or additional local variables.\n \n When invoked for a top-level template, the\n `parentScope` is `null`, and this hook should return\n a fresh Scope.\n \n When invoked for a child template, the `parentScope`\n is the scope for the parent environment.\n \n Note that the `Scope` is an opaque value that is\n passed to other host hooks. For example, the `get`\n hook uses the scope to retrieve a value for a given\n scope and variable name.\n */\n\n function createScope(env, parentScope) {\n if (parentScope) {\n return env.hooks.createChildScope(parentScope);\n } else {\n return env.hooks.createFreshScope();\n }\n }\n\n function createFreshScope() {\n // because `in` checks have unpredictable performance, keep a\n // separate dictionary to track whether a local was bound.\n // See `bindLocal` for more information.\n return { self: null, blocks: {}, locals: {}, localPresent: {} };\n }\n\n /**\n Host Hook: bindShadowScope\n \n @param {Scope?} parentScope\n @return Scope\n \n Corresponds to rendering a new template into an existing\n render tree, but with a new top-level lexical scope. This\n template is called the \"shadow root\".\n \n If a shadow template invokes `{{yield}}`, it will render\n the block provided to the shadow root in the original\n lexical scope.\n \n ```hbs\n {{!-- post template --}}\n {{props.title}}
\n {{yield}}\n \n {{!-- blog template --}}\n {{#post title=\"Hello world\"}}\n by {{byline}}
\n This is my first post \n {{/post}}\n \n {{#post title=\"Goodbye world\"}}\n by {{byline}}
\n This is my last post \n {{/post}}\n ```\n \n ```js\n helpers.post = function(params, hash, options) {\n options.template.yieldIn(postTemplate, { props: hash });\n };\n \n blog.render({ byline: \"Yehuda Katz\" });\n ```\n \n Produces:\n \n ```html\n Hello world
\n by Yehuda Katz
\n This is my first post \n \n Goodbye world
\n by Yehuda Katz
\n This is my last post \n ```\n \n In short, `yieldIn` creates a new top-level scope for the\n provided template and renders it, making the original block\n available to `{{yield}}` in that template.\n */\n\n function bindShadowScope(env /*, parentScope, shadowScope */) {\n return env.hooks.createFreshScope();\n }\n\n function createChildScope(parent) {\n var scope = Object.create(parent);\n scope.locals = Object.create(parent.locals);\n scope.localPresent = Object.create(parent.localPresent);\n scope.blocks = Object.create(parent.blocks);\n return scope;\n }\n\n /**\n Host Hook: bindSelf\n \n @param {Scope} scope\n @param {any} self\n \n Corresponds to entering a template.\n \n This hook is invoked when the `self` value for a scope is ready to be bound.\n \n The host must ensure that child scopes reflect the change to the `self` in\n future calls to the `get` hook.\n */\n\n function bindSelf(env, scope, self) {\n scope.self = self;\n }\n\n function updateSelf(env, scope, self) {\n env.hooks.bindSelf(env, scope, self);\n }\n\n /**\n Host Hook: bindLocal\n \n @param {Environment} env\n @param {Scope} scope\n @param {String} name\n @param {any} value\n \n Corresponds to entering a template with block arguments.\n \n This hook is invoked when a local variable for a scope has been provided.\n \n The host must ensure that child scopes reflect the change in future calls\n to the `get` hook.\n */\n\n function bindLocal(env, scope, name, value) {\n scope.localPresent[name] = true;\n scope.locals[name] = value;\n }\n\n function updateLocal(env, scope, name, value) {\n env.hooks.bindLocal(env, scope, name, value);\n }\n\n /**\n Host Hook: bindBlock\n \n @param {Environment} env\n @param {Scope} scope\n @param {Function} block\n \n Corresponds to entering a shadow template that was invoked by a block helper with\n `yieldIn`.\n \n This hook is invoked with an opaque block that will be passed along\n to the shadow template, and inserted into the shadow template when\n `{{yield}}` is used. Optionally provide a non-default block name\n that can be targeted by `{{yield to=blockName}}`.\n */\n\n function bindBlock(env, scope, block) {\n var name = arguments.length <= 3 || arguments[3] === undefined ? 'default' : arguments[3];\n\n scope.blocks[name] = block;\n }\n\n /**\n Host Hook: block\n \n @param {RenderNode} renderNode\n @param {Environment} env\n @param {Scope} scope\n @param {String} path\n @param {Array} params\n @param {Object} hash\n @param {Block} block\n @param {Block} elseBlock\n \n Corresponds to:\n \n ```hbs\n {{#helper param1 param2 key1=val1 key2=val2}}\n {{!-- child template --}}\n {{/helper}}\n ```\n \n This host hook is a workhorse of the system. It is invoked\n whenever a block is encountered, and is responsible for\n resolving the helper to call, and then invoke it.\n \n The helper should be invoked with:\n \n - `{Array} params`: the parameters passed to the helper\n in the template.\n - `{Object} hash`: an object containing the keys and values passed\n in the hash position in the template.\n \n The values in `params` and `hash` will already be resolved\n through a previous call to the `get` host hook.\n \n The helper should be invoked with a `this` value that is\n an object with one field:\n \n `{Function} yield`: when invoked, this function executes the\n block with the current scope. It takes an optional array of\n block parameters. If block parameters are supplied, HTMLBars\n will invoke the `bindLocal` host hook to bind the supplied\n values to the block arguments provided by the template.\n \n In general, the default implementation of `block` should work\n for most host environments. It delegates to other host hooks\n where appropriate, and properly invokes the helper with the\n appropriate arguments.\n */\n\n function block(morph, env, scope, path, params, hash, template, inverse, visitor) {\n if (handleRedirect(morph, env, scope, path, params, hash, template, inverse, visitor)) {\n return;\n }\n\n continueBlock(morph, env, scope, path, params, hash, template, inverse, visitor);\n }\n\n function continueBlock(morph, env, scope, path, params, hash, template, inverse, visitor) {\n hostBlock(morph, env, scope, template, inverse, null, visitor, function (options) {\n var helper = env.hooks.lookupHelper(env, scope, path);\n return env.hooks.invokeHelper(morph, env, scope, visitor, params, hash, helper, options.templates, thisFor(options.templates));\n });\n }\n\n function hostBlock(morph, env, scope, template, inverse, shadowOptions, visitor, callback) {\n var options = optionsFor(template, inverse, env, scope, morph, visitor);\n _htmlbarsUtilTemplateUtils.renderAndCleanup(morph, env, options, shadowOptions, callback);\n }\n\n function handleRedirect(morph, env, scope, path, params, hash, template, inverse, visitor) {\n if (!path) {\n return false;\n }\n\n var redirect = env.hooks.classify(env, scope, path);\n if (redirect) {\n switch (redirect) {\n case 'component':\n env.hooks.component(morph, env, scope, path, params, hash, { default: template, inverse: inverse }, visitor);break;\n case 'inline':\n env.hooks.inline(morph, env, scope, path, params, hash, visitor);break;\n case 'block':\n env.hooks.block(morph, env, scope, path, params, hash, template, inverse, visitor);break;\n default:\n throw new Error(\"Internal HTMLBars redirection to \" + redirect + \" not supported\");\n }\n return true;\n }\n\n if (handleKeyword(path, morph, env, scope, params, hash, template, inverse, visitor)) {\n return true;\n }\n\n return false;\n }\n\n function handleKeyword(path, morph, env, scope, params, hash, template, inverse, visitor) {\n var keyword = env.hooks.keywords[path];\n if (!keyword) {\n return false;\n }\n\n if (typeof keyword === 'function') {\n return keyword(morph, env, scope, params, hash, template, inverse, visitor);\n }\n\n if (keyword.willRender) {\n keyword.willRender(morph, env);\n }\n\n var lastState, newState;\n if (keyword.setupState) {\n lastState = _htmlbarsUtilObjectUtils.shallowCopy(morph.getState());\n newState = morph.setState(keyword.setupState(lastState, env, scope, params, hash));\n }\n\n if (keyword.childEnv) {\n // Build the child environment...\n env = keyword.childEnv(morph.getState(), env);\n\n // ..then save off the child env builder on the render node. If the render\n // node tree is re-rendered and this node is not dirty, the child env\n // builder will still be invoked so that child dirty render nodes still get\n // the correct child env.\n morph.buildChildEnv = keyword.childEnv;\n }\n\n var firstTime = !morph.rendered;\n\n if (keyword.isEmpty) {\n var isEmpty = keyword.isEmpty(morph.getState(), env, scope, params, hash);\n\n if (isEmpty) {\n if (!firstTime) {\n _htmlbarsUtilTemplateUtils.clearMorph(morph, env, false);\n }\n return true;\n }\n }\n\n if (firstTime) {\n if (keyword.render) {\n keyword.render(morph, env, scope, params, hash, template, inverse, visitor);\n }\n morph.rendered = true;\n return true;\n }\n\n var isStable;\n if (keyword.isStable) {\n isStable = keyword.isStable(lastState, newState);\n } else {\n isStable = stableState(lastState, newState);\n }\n\n if (isStable) {\n if (keyword.rerender) {\n var newEnv = keyword.rerender(morph, env, scope, params, hash, template, inverse, visitor);\n env = newEnv || env;\n }\n _htmlbarsUtilMorphUtils.validateChildMorphs(env, morph, visitor);\n return true;\n } else {\n _htmlbarsUtilTemplateUtils.clearMorph(morph, env, false);\n }\n\n // If the node is unstable, re-render from scratch\n if (keyword.render) {\n keyword.render(morph, env, scope, params, hash, template, inverse, visitor);\n morph.rendered = true;\n return true;\n }\n }\n\n function stableState(oldState, newState) {\n if (_htmlbarsUtilObjectUtils.keyLength(oldState) !== _htmlbarsUtilObjectUtils.keyLength(newState)) {\n return false;\n }\n\n for (var prop in oldState) {\n if (oldState[prop] !== newState[prop]) {\n return false;\n }\n }\n\n return true;\n }\n\n function linkRenderNode() /* morph, env, scope, params, hash */{\n return;\n }\n\n /**\n Host Hook: inline\n \n @param {RenderNode} renderNode\n @param {Environment} env\n @param {Scope} scope\n @param {String} path\n @param {Array} params\n @param {Hash} hash\n \n Corresponds to:\n \n ```hbs\n {{helper param1 param2 key1=val1 key2=val2}}\n ```\n \n This host hook is similar to the `block` host hook, but it\n invokes helpers that do not supply an attached block.\n \n Like the `block` hook, the helper should be invoked with:\n \n - `{Array} params`: the parameters passed to the helper\n in the template.\n - `{Object} hash`: an object containing the keys and values passed\n in the hash position in the template.\n \n The values in `params` and `hash` will already be resolved\n through a previous call to the `get` host hook.\n \n In general, the default implementation of `inline` should work\n for most host environments. It delegates to other host hooks\n where appropriate, and properly invokes the helper with the\n appropriate arguments.\n \n The default implementation of `inline` also makes `partial`\n a keyword. Instead of invoking a helper named `partial`,\n it invokes the `partial` host hook.\n */\n\n function inline(morph, env, scope, path, params, hash, visitor) {\n if (handleRedirect(morph, env, scope, path, params, hash, null, null, visitor)) {\n return;\n }\n\n var value = undefined,\n hasValue = undefined;\n if (morph.linkedResult) {\n value = env.hooks.getValue(morph.linkedResult);\n hasValue = true;\n } else {\n var options = optionsFor(null, null, env, scope, morph);\n\n var helper = env.hooks.lookupHelper(env, scope, path);\n var result = env.hooks.invokeHelper(morph, env, scope, visitor, params, hash, helper, options.templates, thisFor(options.templates));\n\n if (result && result.link) {\n morph.linkedResult = result.value;\n _htmlbarsUtilMorphUtils.linkParams(env, scope, morph, '@content-helper', [morph.linkedResult], null);\n }\n\n if (result && 'value' in result) {\n value = env.hooks.getValue(result.value);\n hasValue = true;\n }\n }\n\n if (hasValue) {\n if (morph.lastValue !== value) {\n morph.setContent(value);\n }\n morph.lastValue = value;\n }\n }\n\n function keyword(path, morph, env, scope, params, hash, template, inverse, visitor) {\n handleKeyword(path, morph, env, scope, params, hash, template, inverse, visitor);\n }\n\n function invokeHelper(morph, env, scope, visitor, _params, _hash, helper, templates, context) {\n var params = normalizeArray(env, _params);\n var hash = normalizeObject(env, _hash);\n return { value: helper.call(context, params, hash, templates) };\n }\n\n function normalizeArray(env, array) {\n var out = new Array(array.length);\n\n for (var i = 0, l = array.length; i < l; i++) {\n out[i] = env.hooks.getCellOrValue(array[i]);\n }\n\n return out;\n }\n\n function normalizeObject(env, object) {\n var out = {};\n\n for (var prop in object) {\n out[prop] = env.hooks.getCellOrValue(object[prop]);\n }\n\n return out;\n }\n\n function classify() /* env, scope, path */{\n return null;\n }\n\n var keywords = {\n partial: function (morph, env, scope, params) {\n var value = env.hooks.partial(morph, env, scope, params[0]);\n morph.setContent(value);\n return true;\n },\n\n // quoted since it's a reserved word, see issue #420\n 'yield': function (morph, env, scope, params, hash, template, inverse, visitor) {\n // the current scope is provided purely for the creation of shadow\n // scopes; it should not be provided to user code.\n\n var to = env.hooks.getValue(hash.to) || 'default';\n var block = env.hooks.getBlock(scope, to);\n\n if (block) {\n block.invoke(env, params, hash.self, morph, scope, visitor);\n }\n return true;\n },\n\n hasBlock: function (morph, env, scope, params) {\n var name = env.hooks.getValue(params[0]) || 'default';\n return !!env.hooks.getBlock(scope, name);\n },\n\n hasBlockParams: function (morph, env, scope, params) {\n var name = env.hooks.getValue(params[0]) || 'default';\n var block = env.hooks.getBlock(scope, name);\n return !!(block && block.arity);\n }\n\n };\n\n exports.keywords = keywords;\n /**\n Host Hook: partial\n \n @param {RenderNode} renderNode\n @param {Environment} env\n @param {Scope} scope\n @param {String} path\n \n Corresponds to:\n \n ```hbs\n {{partial \"location\"}}\n ```\n \n This host hook is invoked by the default implementation of\n the `inline` hook. This makes `partial` a keyword in an\n HTMLBars environment using the default `inline` host hook.\n \n It is implemented as a host hook so that it can retrieve\n the named partial out of the `Environment`. Helpers, in\n contrast, only have access to the values passed in to them,\n and not to the ambient lexical environment.\n \n The host hook should invoke the referenced partial with\n the ambient `self`.\n */\n\n function partial(renderNode, env, scope, path) {\n var template = env.partials[path];\n return template.render(scope.self, env, {}).fragment;\n }\n\n /**\n Host hook: range\n \n @param {RenderNode} renderNode\n @param {Environment} env\n @param {Scope} scope\n @param {any} value\n \n Corresponds to:\n \n ```hbs\n {{content}}\n {{{unescaped}}}\n ```\n \n This hook is responsible for updating a render node\n that represents a range of content with a value.\n */\n\n function range(morph, env, scope, path, value, visitor) {\n if (handleRedirect(morph, env, scope, path, [], {}, null, null, visitor)) {\n return;\n }\n\n value = env.hooks.getValue(value);\n\n if (morph.lastValue !== value) {\n morph.setContent(value);\n }\n\n morph.lastValue = value;\n }\n\n /**\n Host hook: element\n \n @param {RenderNode} renderNode\n @param {Environment} env\n @param {Scope} scope\n @param {String} path\n @param {Array} params\n @param {Hash} hash\n \n Corresponds to:\n \n ```hbs\n
\n ```\n \n This hook is responsible for invoking a helper that\n modifies an element.\n \n Its purpose is largely legacy support for awkward\n idioms that became common when using the string-based\n Handlebars engine.\n \n Most of the uses of the `element` hook are expected\n to be superseded by component syntax and the\n `attribute` hook.\n */\n\n function element(morph, env, scope, path, params, hash, visitor) {\n if (handleRedirect(morph, env, scope, path, params, hash, null, null, visitor)) {\n return;\n }\n\n var helper = env.hooks.lookupHelper(env, scope, path);\n if (helper) {\n env.hooks.invokeHelper(null, env, scope, null, params, hash, helper, { element: morph.element });\n }\n }\n\n /**\n Host hook: attribute\n \n @param {RenderNode} renderNode\n @param {Environment} env\n @param {String} name\n @param {any} value\n \n Corresponds to:\n \n ```hbs\n
\n ```\n \n This hook is responsible for updating a render node\n that represents an element's attribute with a value.\n \n It receives the name of the attribute as well as an\n already-resolved value, and should update the render\n node with the value if appropriate.\n */\n\n function attribute(morph, env, scope, name, value) {\n value = env.hooks.getValue(value);\n\n if (morph.lastValue !== value) {\n morph.setContent(value);\n }\n\n morph.lastValue = value;\n }\n\n function subexpr(env, scope, helperName, params, hash) {\n var helper = env.hooks.lookupHelper(env, scope, helperName);\n var result = env.hooks.invokeHelper(null, env, scope, null, params, hash, helper, {});\n if (result && 'value' in result) {\n return env.hooks.getValue(result.value);\n }\n }\n\n /**\n Host Hook: get\n \n @param {Environment} env\n @param {Scope} scope\n @param {String} path\n \n Corresponds to:\n \n ```hbs\n {{foo.bar}}\n ^\n \n {{helper foo.bar key=value}}\n ^ ^\n ```\n \n This hook is the \"leaf\" hook of the system. It is used to\n resolve a path relative to the current scope.\n */\n\n function get(env, scope, path) {\n if (path === '') {\n return scope.self;\n }\n\n var keys = path.split('.');\n var value = env.hooks.getRoot(scope, keys[0])[0];\n\n for (var i = 1; i < keys.length; i++) {\n if (value) {\n value = env.hooks.getChild(value, keys[i]);\n } else {\n break;\n }\n }\n\n return value;\n }\n\n function getRoot(scope, key) {\n if (scope.localPresent[key]) {\n return [scope.locals[key]];\n } else if (scope.self) {\n return [scope.self[key]];\n } else {\n return [undefined];\n }\n }\n\n function getBlock(scope, key) {\n return scope.blocks[key];\n }\n\n function getChild(value, key) {\n return value[key];\n }\n\n function getValue(reference) {\n return reference;\n }\n\n function getCellOrValue(reference) {\n return reference;\n }\n\n function component(morph, env, scope, tagName, params, attrs, templates, visitor) {\n if (env.hooks.hasHelper(env, scope, tagName)) {\n return env.hooks.block(morph, env, scope, tagName, params, attrs, templates.default, templates.inverse, visitor);\n }\n\n componentFallback(morph, env, scope, tagName, attrs, templates.default);\n }\n\n function concat(env, params) {\n var value = \"\";\n for (var i = 0, l = params.length; i < l; i++) {\n value += env.hooks.getValue(params[i]);\n }\n return value;\n }\n\n function componentFallback(morph, env, scope, tagName, attrs, template) {\n var element = env.dom.createElement(tagName);\n for (var name in attrs) {\n element.setAttribute(name, env.hooks.getValue(attrs[name]));\n }\n var fragment = _htmlbarsRuntimeRender.default(template, env, scope, {}).fragment;\n element.appendChild(fragment);\n morph.setNode(element);\n }\n\n function hasHelper(env, scope, helperName) {\n return env.helpers[helperName] !== undefined;\n }\n\n function lookupHelper(env, scope, helperName) {\n return env.helpers[helperName];\n }\n\n function bindScope() /* env, scope */{\n // this function is used to handle host-specified extensions to scope\n // other than `self`, `locals` and `block`.\n }\n\n function updateScope(env, scope) {\n env.hooks.bindScope(env, scope);\n }\n\n exports.default = {\n // fundamental hooks that you will likely want to override\n bindLocal: bindLocal,\n bindSelf: bindSelf,\n bindScope: bindScope,\n classify: classify,\n component: component,\n concat: concat,\n createFreshScope: createFreshScope,\n getChild: getChild,\n getRoot: getRoot,\n getBlock: getBlock,\n getValue: getValue,\n getCellOrValue: getCellOrValue,\n keywords: keywords,\n linkRenderNode: linkRenderNode,\n partial: partial,\n subexpr: subexpr,\n\n // fundamental hooks with good default behavior\n bindBlock: bindBlock,\n bindShadowScope: bindShadowScope,\n updateLocal: updateLocal,\n updateSelf: updateSelf,\n updateScope: updateScope,\n createChildScope: createChildScope,\n hasHelper: hasHelper,\n lookupHelper: lookupHelper,\n invokeHelper: invokeHelper,\n cleanupRenderNode: null,\n destroyRenderNode: null,\n willCleanupTree: null,\n didCleanupTree: null,\n willRenderNode: null,\n didRenderNode: null,\n\n // derived hooks\n attribute: attribute,\n block: block,\n createScope: createScope,\n element: element,\n get: get,\n inline: inline,\n range: range,\n keyword: keyword\n };\n});\nenifed(\"htmlbars-runtime/morph\", [\"exports\", \"morph-range\"], function (exports, _morphRange) {\n \"use strict\";\n\n var guid = 1;\n\n function HTMLBarsMorph(domHelper, contextualElement) {\n this.super$constructor(domHelper, contextualElement);\n\n this._state = undefined;\n this.ownerNode = null;\n this.isDirty = false;\n this.isSubtreeDirty = false;\n this.lastYielded = null;\n this.lastResult = null;\n this.lastValue = null;\n this.buildChildEnv = null;\n this.morphList = null;\n this.morphMap = null;\n this.key = null;\n this.linkedParams = null;\n this.linkedResult = null;\n this.childNodes = null;\n this.rendered = false;\n this.guid = \"range\" + guid++;\n this.seen = false;\n }\n\n HTMLBarsMorph.empty = function (domHelper, contextualElement) {\n var morph = new HTMLBarsMorph(domHelper, contextualElement);\n morph.clear();\n return morph;\n };\n\n HTMLBarsMorph.create = function (domHelper, contextualElement, node) {\n var morph = new HTMLBarsMorph(domHelper, contextualElement);\n morph.setNode(node);\n return morph;\n };\n\n HTMLBarsMorph.attach = function (domHelper, contextualElement, firstNode, lastNode) {\n var morph = new HTMLBarsMorph(domHelper, contextualElement);\n morph.setRange(firstNode, lastNode);\n return morph;\n };\n\n var prototype = HTMLBarsMorph.prototype = Object.create(_morphRange.default.prototype);\n prototype.constructor = HTMLBarsMorph;\n prototype.super$constructor = _morphRange.default;\n\n prototype.getState = function () {\n if (!this._state) {\n this._state = {};\n }\n\n return this._state;\n };\n\n prototype.setState = function (newState) {\n /*jshint -W093 */\n\n return this._state = newState;\n };\n\n exports.default = HTMLBarsMorph;\n});\nenifed(\"htmlbars-runtime/node-visitor\", [\"exports\", \"htmlbars-util/morph-utils\", \"htmlbars-runtime/expression-visitor\"], function (exports, _htmlbarsUtilMorphUtils, _htmlbarsRuntimeExpressionVisitor) {\n \"use strict\";\n\n /**\n Node classification:\n \n # Primary Statement Nodes:\n \n These nodes are responsible for a render node that represents a morph-range.\n \n * block\n * inline\n * content\n * element\n * component\n \n # Leaf Statement Nodes:\n \n This node is responsible for a render node that represents a morph-attr.\n \n * attribute\n */\n\n function linkParamsAndHash(env, scope, morph, path, params, hash) {\n if (morph.linkedParams) {\n params = morph.linkedParams.params;\n hash = morph.linkedParams.hash;\n } else {\n params = params && _htmlbarsRuntimeExpressionVisitor.acceptParams(params, env, scope);\n hash = hash && _htmlbarsRuntimeExpressionVisitor.acceptHash(hash, env, scope);\n }\n\n _htmlbarsUtilMorphUtils.linkParams(env, scope, morph, path, params, hash);\n return [params, hash];\n }\n\n var AlwaysDirtyVisitor = {\n\n block: function (node, morph, env, scope, template, visitor) {\n var path = node[1];\n var params = node[2];\n var hash = node[3];\n var templateId = node[4];\n var inverseId = node[5];\n\n var paramsAndHash = linkParamsAndHash(env, scope, morph, path, params, hash);\n\n morph.isDirty = morph.isSubtreeDirty = false;\n env.hooks.block(morph, env, scope, path, paramsAndHash[0], paramsAndHash[1], templateId === null ? null : template.templates[templateId], inverseId === null ? null : template.templates[inverseId], visitor);\n },\n\n inline: function (node, morph, env, scope, visitor) {\n var path = node[1];\n var params = node[2];\n var hash = node[3];\n\n var paramsAndHash = linkParamsAndHash(env, scope, morph, path, params, hash);\n\n morph.isDirty = morph.isSubtreeDirty = false;\n env.hooks.inline(morph, env, scope, path, paramsAndHash[0], paramsAndHash[1], visitor);\n },\n\n content: function (node, morph, env, scope, visitor) {\n var path = node[1];\n\n morph.isDirty = morph.isSubtreeDirty = false;\n\n if (isHelper(env, scope, path)) {\n env.hooks.inline(morph, env, scope, path, [], {}, visitor);\n if (morph.linkedResult) {\n _htmlbarsUtilMorphUtils.linkParams(env, scope, morph, '@content-helper', [morph.linkedResult], null);\n }\n return;\n }\n\n var params = undefined;\n if (morph.linkedParams) {\n params = morph.linkedParams.params;\n } else {\n params = [env.hooks.get(env, scope, path)];\n }\n\n _htmlbarsUtilMorphUtils.linkParams(env, scope, morph, '@range', params, null);\n env.hooks.range(morph, env, scope, path, params[0], visitor);\n },\n\n element: function (node, morph, env, scope, visitor) {\n var path = node[1];\n var params = node[2];\n var hash = node[3];\n\n var paramsAndHash = linkParamsAndHash(env, scope, morph, path, params, hash);\n\n morph.isDirty = morph.isSubtreeDirty = false;\n env.hooks.element(morph, env, scope, path, paramsAndHash[0], paramsAndHash[1], visitor);\n },\n\n attribute: function (node, morph, env, scope) {\n var name = node[1];\n var value = node[2];\n\n var paramsAndHash = linkParamsAndHash(env, scope, morph, '@attribute', [value], null);\n\n morph.isDirty = morph.isSubtreeDirty = false;\n env.hooks.attribute(morph, env, scope, name, paramsAndHash[0][0]);\n },\n\n component: function (node, morph, env, scope, template, visitor) {\n var path = node[1];\n var attrs = node[2];\n var templateId = node[3];\n var inverseId = node[4];\n\n var paramsAndHash = linkParamsAndHash(env, scope, morph, path, [], attrs);\n var templates = {\n default: template.templates[templateId],\n inverse: template.templates[inverseId]\n };\n\n morph.isDirty = morph.isSubtreeDirty = false;\n env.hooks.component(morph, env, scope, path, paramsAndHash[0], paramsAndHash[1], templates, visitor);\n },\n\n attributes: function (node, morph, env, scope, parentMorph, visitor) {\n var template = node[1];\n\n env.hooks.attributes(morph, env, scope, template, parentMorph, visitor);\n }\n\n };\n\n exports.AlwaysDirtyVisitor = AlwaysDirtyVisitor;\n exports.default = {\n block: function (node, morph, env, scope, template, visitor) {\n dirtyCheck(env, morph, visitor, function (visitor) {\n AlwaysDirtyVisitor.block(node, morph, env, scope, template, visitor);\n });\n },\n\n inline: function (node, morph, env, scope, visitor) {\n dirtyCheck(env, morph, visitor, function (visitor) {\n AlwaysDirtyVisitor.inline(node, morph, env, scope, visitor);\n });\n },\n\n content: function (node, morph, env, scope, visitor) {\n dirtyCheck(env, morph, visitor, function (visitor) {\n AlwaysDirtyVisitor.content(node, morph, env, scope, visitor);\n });\n },\n\n element: function (node, morph, env, scope, template, visitor) {\n dirtyCheck(env, morph, visitor, function (visitor) {\n AlwaysDirtyVisitor.element(node, morph, env, scope, template, visitor);\n });\n },\n\n attribute: function (node, morph, env, scope, template) {\n dirtyCheck(env, morph, null, function () {\n AlwaysDirtyVisitor.attribute(node, morph, env, scope, template);\n });\n },\n\n component: function (node, morph, env, scope, template, visitor) {\n dirtyCheck(env, morph, visitor, function (visitor) {\n AlwaysDirtyVisitor.component(node, morph, env, scope, template, visitor);\n });\n },\n\n attributes: function (node, morph, env, scope, parentMorph, visitor) {\n AlwaysDirtyVisitor.attributes(node, morph, env, scope, parentMorph, visitor);\n }\n };\n\n function dirtyCheck(_env, morph, visitor, callback) {\n var isDirty = morph.isDirty;\n var isSubtreeDirty = morph.isSubtreeDirty;\n var env = _env;\n\n if (isSubtreeDirty) {\n visitor = AlwaysDirtyVisitor;\n }\n\n if (isDirty || isSubtreeDirty) {\n callback(visitor);\n } else {\n if (morph.buildChildEnv) {\n env = morph.buildChildEnv(morph.getState(), env);\n }\n _htmlbarsUtilMorphUtils.validateChildMorphs(env, morph, visitor);\n }\n }\n\n function isHelper(env, scope, path) {\n return env.hooks.keywords[path] !== undefined || env.hooks.hasHelper(env, scope, path);\n }\n});\nenifed(\"htmlbars-runtime/render\", [\"exports\", \"htmlbars-util/morph-utils\", \"htmlbars-runtime/node-visitor\", \"htmlbars-runtime/morph\", \"htmlbars-util/template-utils\", \"htmlbars-util/void-tag-names\"], function (exports, _htmlbarsUtilMorphUtils, _htmlbarsRuntimeNodeVisitor, _htmlbarsRuntimeMorph, _htmlbarsUtilTemplateUtils, _htmlbarsUtilVoidTagNames) {\n \"use strict\";\n\n exports.default = render;\n exports.RenderOptions = RenderOptions;\n exports.manualElement = manualElement;\n exports.attachAttributes = attachAttributes;\n exports.createChildMorph = createChildMorph;\n exports.getCachedFragment = getCachedFragment;\n\n var svgNamespace = \"http://www.w3.org/2000/svg\";\n\n function render(template, env, scope, options) {\n var dom = env.dom;\n var contextualElement;\n\n if (options) {\n if (options.renderNode) {\n contextualElement = options.renderNode.contextualElement;\n } else if (options.contextualElement) {\n contextualElement = options.contextualElement;\n }\n }\n\n dom.detectNamespace(contextualElement);\n\n var renderResult = RenderResult.build(env, scope, template, options, contextualElement);\n renderResult.render();\n\n return renderResult;\n }\n\n function RenderOptions(renderNode, self, blockArguments, contextualElement) {\n this.renderNode = renderNode || null;\n this.self = self;\n this.blockArguments = blockArguments || null;\n this.contextualElement = contextualElement || null;\n }\n\n function RenderResult(env, scope, options, rootNode, ownerNode, nodes, fragment, template, shouldSetContent) {\n this.root = rootNode;\n this.fragment = fragment;\n\n this.nodes = nodes;\n this.template = template;\n this.statements = template.statements.slice();\n this.env = env;\n this.scope = scope;\n this.shouldSetContent = shouldSetContent;\n\n if (options.self !== undefined) {\n this.bindSelf(options.self);\n }\n if (options.blockArguments !== undefined) {\n this.bindLocals(options.blockArguments);\n }\n\n this.initializeNodes(ownerNode);\n }\n\n RenderResult.build = function (env, scope, template, options, contextualElement) {\n var dom = env.dom;\n var fragment = getCachedFragment(template, env);\n var nodes = template.buildRenderNodes(dom, fragment, contextualElement);\n\n var rootNode, ownerNode, shouldSetContent;\n\n if (options && options.renderNode) {\n rootNode = options.renderNode;\n ownerNode = rootNode.ownerNode;\n shouldSetContent = true;\n } else {\n rootNode = dom.createMorph(null, fragment.firstChild, fragment.lastChild, contextualElement);\n ownerNode = rootNode;\n rootNode.ownerNode = ownerNode;\n shouldSetContent = false;\n }\n\n if (rootNode.childNodes) {\n _htmlbarsUtilMorphUtils.visitChildren(rootNode.childNodes, function (node) {\n _htmlbarsUtilTemplateUtils.clearMorph(node, env, true);\n });\n }\n\n rootNode.childNodes = nodes;\n return new RenderResult(env, scope, options, rootNode, ownerNode, nodes, fragment, template, shouldSetContent);\n };\n\n function manualElement(tagName, attributes, _isEmpty) {\n var statements = [];\n\n for (var key in attributes) {\n if (typeof attributes[key] === 'string') {\n continue;\n }\n statements.push([\"attribute\", key, attributes[key]]);\n }\n\n var isEmpty = _isEmpty || _htmlbarsUtilVoidTagNames.default[tagName];\n\n if (!isEmpty) {\n statements.push(['content', 'yield']);\n }\n\n var template = {\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n if (tagName === 'svg') {\n dom.setNamespace(svgNamespace);\n }\n var el1 = dom.createElement(tagName);\n\n for (var key in attributes) {\n if (typeof attributes[key] !== 'string') {\n continue;\n }\n dom.setAttribute(el1, key, attributes[key]);\n }\n\n if (!isEmpty) {\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n }\n\n dom.appendChild(el0, el1);\n\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment) {\n var element = dom.childAt(fragment, [0]);\n var morphs = [];\n\n for (var key in attributes) {\n if (typeof attributes[key] === 'string') {\n continue;\n }\n morphs.push(dom.createAttrMorph(element, key));\n }\n\n if (!isEmpty) {\n morphs.push(dom.createMorphAt(element, 0, 0));\n }\n\n return morphs;\n },\n statements: statements,\n locals: [],\n templates: []\n };\n\n return template;\n }\n\n function attachAttributes(attributes) {\n var statements = [];\n\n for (var key in attributes) {\n if (typeof attributes[key] === 'string') {\n continue;\n }\n statements.push([\"attribute\", key, attributes[key]]);\n }\n\n var template = {\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = this.element;\n if (el0.namespaceURI === \"http://www.w3.org/2000/svg\") {\n dom.setNamespace(svgNamespace);\n }\n for (var key in attributes) {\n if (typeof attributes[key] !== 'string') {\n continue;\n }\n dom.setAttribute(el0, key, attributes[key]);\n }\n\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom) {\n var element = this.element;\n var morphs = [];\n\n for (var key in attributes) {\n if (typeof attributes[key] === 'string') {\n continue;\n }\n morphs.push(dom.createAttrMorph(element, key));\n }\n\n return morphs;\n },\n statements: statements,\n locals: [],\n templates: [],\n element: null\n };\n\n return template;\n }\n\n RenderResult.prototype.initializeNodes = function (ownerNode) {\n var childNodes = this.root.childNodes;\n\n for (var i = 0, l = childNodes.length; i < l; i++) {\n childNodes[i].ownerNode = ownerNode;\n }\n };\n\n RenderResult.prototype.render = function () {\n this.root.lastResult = this;\n this.root.rendered = true;\n this.populateNodes(_htmlbarsRuntimeNodeVisitor.AlwaysDirtyVisitor);\n\n if (this.shouldSetContent && this.root.setContent) {\n this.root.setContent(this.fragment);\n }\n };\n\n RenderResult.prototype.dirty = function () {\n _htmlbarsUtilMorphUtils.visitChildren([this.root], function (node) {\n node.isDirty = true;\n });\n };\n\n RenderResult.prototype.revalidate = function (env, self, blockArguments, scope) {\n this.revalidateWith(env, scope, self, blockArguments, _htmlbarsRuntimeNodeVisitor.default);\n };\n\n RenderResult.prototype.rerender = function (env, self, blockArguments, scope) {\n this.revalidateWith(env, scope, self, blockArguments, _htmlbarsRuntimeNodeVisitor.AlwaysDirtyVisitor);\n };\n\n RenderResult.prototype.revalidateWith = function (env, scope, self, blockArguments, visitor) {\n if (env !== undefined) {\n this.env = env;\n }\n if (scope !== undefined) {\n this.scope = scope;\n }\n this.updateScope();\n\n if (self !== undefined) {\n this.updateSelf(self);\n }\n if (blockArguments !== undefined) {\n this.updateLocals(blockArguments);\n }\n\n this.populateNodes(visitor);\n };\n\n RenderResult.prototype.destroy = function () {\n var rootNode = this.root;\n _htmlbarsUtilTemplateUtils.clearMorph(rootNode, this.env, true);\n };\n\n RenderResult.prototype.populateNodes = function (visitor) {\n var env = this.env;\n var scope = this.scope;\n var template = this.template;\n var nodes = this.nodes;\n var statements = this.statements;\n var i, l;\n\n for (i = 0, l = statements.length; i < l; i++) {\n var statement = statements[i];\n var morph = nodes[i];\n\n if (env.hooks.willRenderNode) {\n env.hooks.willRenderNode(morph, env, scope);\n }\n\n switch (statement[0]) {\n case 'block':\n visitor.block(statement, morph, env, scope, template, visitor);break;\n case 'inline':\n visitor.inline(statement, morph, env, scope, visitor);break;\n case 'content':\n visitor.content(statement, morph, env, scope, visitor);break;\n case 'element':\n visitor.element(statement, morph, env, scope, template, visitor);break;\n case 'attribute':\n visitor.attribute(statement, morph, env, scope);break;\n case 'component':\n visitor.component(statement, morph, env, scope, template, visitor);break;\n }\n\n if (env.hooks.didRenderNode) {\n env.hooks.didRenderNode(morph, env, scope);\n }\n }\n };\n\n RenderResult.prototype.bindScope = function () {\n this.env.hooks.bindScope(this.env, this.scope);\n };\n\n RenderResult.prototype.updateScope = function () {\n this.env.hooks.updateScope(this.env, this.scope);\n };\n\n RenderResult.prototype.bindSelf = function (self) {\n this.env.hooks.bindSelf(this.env, this.scope, self);\n };\n\n RenderResult.prototype.updateSelf = function (self) {\n this.env.hooks.updateSelf(this.env, this.scope, self);\n };\n\n RenderResult.prototype.bindLocals = function (blockArguments) {\n var localNames = this.template.locals;\n\n for (var i = 0, l = localNames.length; i < l; i++) {\n this.env.hooks.bindLocal(this.env, this.scope, localNames[i], blockArguments[i]);\n }\n };\n\n RenderResult.prototype.updateLocals = function (blockArguments) {\n var localNames = this.template.locals;\n\n for (var i = 0, l = localNames.length; i < l; i++) {\n this.env.hooks.updateLocal(this.env, this.scope, localNames[i], blockArguments[i]);\n }\n };\n\n function initializeNode(node, owner) {\n node.ownerNode = owner;\n }\n\n function createChildMorph(dom, parentMorph, contextualElement) {\n var morph = _htmlbarsRuntimeMorph.default.empty(dom, contextualElement || parentMorph.contextualElement);\n initializeNode(morph, parentMorph.ownerNode);\n return morph;\n }\n\n function getCachedFragment(template, env) {\n var dom = env.dom,\n fragment;\n if (env.useFragmentCache && dom.canClone) {\n if (template.cachedFragment === null) {\n fragment = template.buildFragment(dom);\n if (template.hasRendered) {\n template.cachedFragment = fragment;\n } else {\n template.hasRendered = true;\n }\n }\n if (template.cachedFragment) {\n fragment = dom.cloneNode(template.cachedFragment, true);\n }\n } else if (!fragment) {\n fragment = template.buildFragment(dom);\n }\n\n return fragment;\n }\n});\nenifed('htmlbars-runtime', ['exports', 'htmlbars-runtime/hooks', 'htmlbars-runtime/render', 'htmlbars-util/morph-utils', 'htmlbars-util/template-utils'], function (exports, _htmlbarsRuntimeHooks, _htmlbarsRuntimeRender, _htmlbarsUtilMorphUtils, _htmlbarsUtilTemplateUtils) {\n 'use strict';\n\n var internal = {\n blockFor: _htmlbarsUtilTemplateUtils.blockFor,\n manualElement: _htmlbarsRuntimeRender.manualElement,\n hostBlock: _htmlbarsRuntimeHooks.hostBlock,\n continueBlock: _htmlbarsRuntimeHooks.continueBlock,\n hostYieldWithShadowTemplate: _htmlbarsRuntimeHooks.hostYieldWithShadowTemplate,\n visitChildren: _htmlbarsUtilMorphUtils.visitChildren,\n validateChildMorphs: _htmlbarsUtilMorphUtils.validateChildMorphs,\n clearMorph: _htmlbarsUtilTemplateUtils.clearMorph\n };\n\n exports.hooks = _htmlbarsRuntimeHooks.default;\n exports.render = _htmlbarsRuntimeRender.default;\n exports.internal = internal;\n});\nenifed('htmlbars-util/array-utils', ['exports'], function (exports) {\n 'use strict';\n\n exports.forEach = forEach;\n exports.map = map;\n\n function forEach(array, callback, binding) {\n var i, l;\n if (binding === undefined) {\n for (i = 0, l = array.length; i < l; i++) {\n callback(array[i], i, array);\n }\n } else {\n for (i = 0, l = array.length; i < l; i++) {\n callback.call(binding, array[i], i, array);\n }\n }\n }\n\n function map(array, callback) {\n var output = [];\n var i, l;\n\n for (i = 0, l = array.length; i < l; i++) {\n output.push(callback(array[i], i, array));\n }\n\n return output;\n }\n\n var getIdx;\n if (Array.prototype.indexOf) {\n getIdx = function (array, obj, from) {\n return array.indexOf(obj, from);\n };\n } else {\n getIdx = function (array, obj, from) {\n if (from === undefined || from === null) {\n from = 0;\n } else if (from < 0) {\n from = Math.max(0, array.length + from);\n }\n for (var i = from, l = array.length; i < l; i++) {\n if (array[i] === obj) {\n return i;\n }\n }\n return -1;\n };\n }\n\n var isArray = Array.isArray || function (array) {\n return Object.prototype.toString.call(array) === '[object Array]';\n };\n\n exports.isArray = isArray;\n var indexOfArray = getIdx;\n exports.indexOfArray = indexOfArray;\n});\nenifed('htmlbars-util/handlebars/safe-string', ['exports'], function (exports) {\n // Build out our basic SafeString type\n 'use strict';\n\n function SafeString(string) {\n this.string = string;\n }\n\n SafeString.prototype.toString = SafeString.prototype.toHTML = function () {\n return '' + this.string;\n };\n\n exports.default = SafeString;\n});\nenifed('htmlbars-util/handlebars/utils', ['exports'], function (exports) {\n 'use strict';\n\n exports.extend = extend;\n exports.indexOf = indexOf;\n exports.escapeExpression = escapeExpression;\n exports.isEmpty = isEmpty;\n exports.blockParams = blockParams;\n exports.appendContextPath = appendContextPath;\n var escape = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`'\n };\n\n var badChars = /[&<>\"'`]/g,\n possible = /[&<>\"'`]/;\n\n function escapeChar(chr) {\n return escape[chr];\n }\n\n function extend(obj /* , ...source */) {\n for (var i = 1; i < arguments.length; i++) {\n for (var key in arguments[i]) {\n if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n obj[key] = arguments[i][key];\n }\n }\n }\n\n return obj;\n }\n\n var toString = Object.prototype.toString;\n\n exports.toString = toString;\n // Sourced from lodash\n // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n /*eslint-disable func-style, no-var */\n var isFunction = function (value) {\n return typeof value === 'function';\n };\n // fallback for older versions of Chrome and Safari\n /* istanbul ignore next */\n if (isFunction(/x/)) {\n exports.isFunction = isFunction = function (value) {\n return typeof value === 'function' && toString.call(value) === '[object Function]';\n };\n }\n var isFunction;\n exports.isFunction = isFunction;\n /*eslint-enable func-style, no-var */\n\n /* istanbul ignore next */\n var isArray = Array.isArray || function (value) {\n return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;\n };\n\n exports.isArray = isArray;\n // Older IE versions do not directly support indexOf so we must implement our own, sadly.\n\n function indexOf(array, value) {\n for (var i = 0, len = array.length; i < len; i++) {\n if (array[i] === value) {\n return i;\n }\n }\n return -1;\n }\n\n function escapeExpression(string) {\n if (typeof string !== 'string') {\n // don't escape SafeStrings, since they're already safe\n if (string && string.toHTML) {\n return string.toHTML();\n } else if (string == null) {\n return '';\n } else if (!string) {\n return string + '';\n }\n\n // Force a string conversion as this will be done by the append regardless and\n // the regex test will do this transparently behind the scenes, causing issues if\n // an object's to string has escaped characters in it.\n string = '' + string;\n }\n\n if (!possible.test(string)) {\n return string;\n }\n return string.replace(badChars, escapeChar);\n }\n\n function isEmpty(value) {\n if (!value && value !== 0) {\n return true;\n } else if (isArray(value) && value.length === 0) {\n return true;\n } else {\n return false;\n }\n }\n\n function blockParams(params, ids) {\n params.path = ids;\n return params;\n }\n\n function appendContextPath(contextPath, id) {\n return (contextPath ? contextPath + '.' : '') + id;\n }\n});\nenifed(\"htmlbars-util/morph-utils\", [\"exports\"], function (exports) {\n /*globals console*/\n\n \"use strict\";\n\n exports.visitChildren = visitChildren;\n exports.validateChildMorphs = validateChildMorphs;\n exports.linkParams = linkParams;\n exports.dump = dump;\n\n function visitChildren(nodes, callback) {\n if (!nodes || nodes.length === 0) {\n return;\n }\n\n nodes = nodes.slice();\n\n while (nodes.length) {\n var node = nodes.pop();\n callback(node);\n\n if (node.childNodes) {\n nodes.push.apply(nodes, node.childNodes);\n } else if (node.firstChildMorph) {\n var current = node.firstChildMorph;\n\n while (current) {\n nodes.push(current);\n current = current.nextMorph;\n }\n } else if (node.morphList) {\n var current = node.morphList.firstChildMorph;\n\n while (current) {\n nodes.push(current);\n current = current.nextMorph;\n }\n }\n }\n }\n\n function validateChildMorphs(env, morph, visitor) {\n var morphList = morph.morphList;\n if (morph.morphList) {\n var current = morphList.firstChildMorph;\n\n while (current) {\n var next = current.nextMorph;\n validateChildMorphs(env, current, visitor);\n current = next;\n }\n } else if (morph.lastResult) {\n morph.lastResult.revalidateWith(env, undefined, undefined, undefined, visitor);\n } else if (morph.childNodes) {\n // This means that the childNodes were wired up manually\n for (var i = 0, l = morph.childNodes.length; i < l; i++) {\n validateChildMorphs(env, morph.childNodes[i], visitor);\n }\n }\n }\n\n function linkParams(env, scope, morph, path, params, hash) {\n if (morph.linkedParams) {\n return;\n }\n\n if (env.hooks.linkRenderNode(morph, env, scope, path, params, hash)) {\n morph.linkedParams = { params: params, hash: hash };\n }\n }\n\n function dump(node) {\n console.group(node, node.isDirty);\n\n if (node.childNodes) {\n map(node.childNodes, dump);\n } else if (node.firstChildMorph) {\n var current = node.firstChildMorph;\n\n while (current) {\n dump(current);\n current = current.nextMorph;\n }\n } else if (node.morphList) {\n dump(node.morphList);\n }\n\n console.groupEnd();\n }\n\n function map(nodes, cb) {\n for (var i = 0, l = nodes.length; i < l; i++) {\n cb(nodes[i]);\n }\n }\n});\nenifed('htmlbars-util/namespaces', ['exports'], function (exports) {\n // ref http://dev.w3.org/html5/spec-LC/namespaces.html\n 'use strict';\n\n exports.getAttrNamespace = getAttrNamespace;\n var defaultNamespaces = {\n html: 'http://www.w3.org/1999/xhtml',\n mathml: 'http://www.w3.org/1998/Math/MathML',\n svg: 'http://www.w3.org/2000/svg',\n xlink: 'http://www.w3.org/1999/xlink',\n xml: 'http://www.w3.org/XML/1998/namespace'\n };\n\n function getAttrNamespace(attrName, detectedNamespace) {\n if (detectedNamespace) {\n return detectedNamespace;\n }\n\n var namespace;\n\n var colonIndex = attrName.indexOf(':');\n if (colonIndex !== -1) {\n var prefix = attrName.slice(0, colonIndex);\n namespace = defaultNamespaces[prefix];\n }\n\n return namespace || null;\n }\n});\nenifed(\"htmlbars-util/object-utils\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.merge = merge;\n exports.shallowCopy = shallowCopy;\n exports.keySet = keySet;\n exports.keyLength = keyLength;\n\n function merge(options, defaults) {\n for (var prop in defaults) {\n if (options.hasOwnProperty(prop)) {\n continue;\n }\n options[prop] = defaults[prop];\n }\n return options;\n }\n\n function shallowCopy(obj) {\n return merge({}, obj);\n }\n\n function keySet(obj) {\n var set = {};\n\n for (var prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n set[prop] = true;\n }\n }\n\n return set;\n }\n\n function keyLength(obj) {\n var count = 0;\n\n for (var prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n count++;\n }\n }\n\n return count;\n }\n});\nenifed(\"htmlbars-util/quoting\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.hash = hash;\n exports.repeat = repeat;\n function escapeString(str) {\n str = str.replace(/\\\\/g, \"\\\\\\\\\");\n str = str.replace(/\"/g, '\\\\\"');\n str = str.replace(/\\n/g, \"\\\\n\");\n return str;\n }\n\n exports.escapeString = escapeString;\n\n function string(str) {\n return '\"' + escapeString(str) + '\"';\n }\n\n exports.string = string;\n\n function array(a) {\n return \"[\" + a + \"]\";\n }\n\n exports.array = array;\n\n function hash(pairs) {\n return \"{\" + pairs.join(\", \") + \"}\";\n }\n\n function repeat(chars, times) {\n var str = \"\";\n while (times--) {\n str += chars;\n }\n return str;\n }\n});\nenifed('htmlbars-util/safe-string', ['exports', 'htmlbars-util/handlebars/safe-string'], function (exports, _htmlbarsUtilHandlebarsSafeString) {\n 'use strict';\n\n exports.default = _htmlbarsUtilHandlebarsSafeString.default;\n});\nenifed(\"htmlbars-util/template-utils\", [\"exports\", \"htmlbars-util/morph-utils\", \"htmlbars-runtime/render\"], function (exports, _htmlbarsUtilMorphUtils, _htmlbarsRuntimeRender) {\n \"use strict\";\n\n exports.RenderState = RenderState;\n exports.blockFor = blockFor;\n exports.renderAndCleanup = renderAndCleanup;\n exports.clearMorph = clearMorph;\n exports.clearMorphList = clearMorphList;\n\n function RenderState(renderNode, morphList) {\n // The morph list that is no longer needed and can be\n // destroyed.\n this.morphListToClear = morphList;\n\n // The morph list that needs to be pruned of any items\n // that were not yielded on a subsequent render.\n this.morphListToPrune = null;\n\n // A map of morphs for each item yielded in during this\n // rendering pass. Any morphs in the DOM but not in this map\n // will be pruned during cleanup.\n this.handledMorphs = {};\n this.collisions = undefined;\n\n // The morph to clear once rendering is complete. By\n // default, we set this to the previous morph (to catch\n // the case where nothing is yielded; in that case, we\n // should just clear the morph). Otherwise this gets set\n // to null if anything is rendered.\n this.morphToClear = renderNode;\n\n this.shadowOptions = null;\n }\n\n function Block(render, template, blockOptions) {\n this.render = render;\n this.template = template;\n this.blockOptions = blockOptions;\n this.arity = template.arity;\n }\n\n Block.prototype.invoke = function (env, blockArguments, _self, renderNode, parentScope, visitor) {\n if (renderNode.lastResult) {\n renderNode.lastResult.revalidateWith(env, undefined, _self, blockArguments, visitor);\n } else {\n this._firstRender(env, blockArguments, _self, renderNode, parentScope);\n }\n };\n\n Block.prototype._firstRender = function (env, blockArguments, _self, renderNode, parentScope) {\n var options = { renderState: new RenderState(renderNode) };\n var render = this.render;\n var template = this.template;\n var scope = this.blockOptions.scope;\n\n var shadowScope = scope ? env.hooks.createChildScope(scope) : env.hooks.createFreshScope();\n\n env.hooks.bindShadowScope(env, parentScope, shadowScope, this.blockOptions.options);\n\n if (_self !== undefined) {\n env.hooks.bindSelf(env, shadowScope, _self);\n } else if (this.blockOptions.self !== undefined) {\n env.hooks.bindSelf(env, shadowScope, this.blockOptions.self);\n }\n\n bindBlocks(env, shadowScope, this.blockOptions.yieldTo);\n\n renderAndCleanup(renderNode, env, options, null, function () {\n options.renderState.morphToClear = null;\n var renderOptions = new _htmlbarsRuntimeRender.RenderOptions(renderNode, undefined, blockArguments);\n render(template, env, shadowScope, renderOptions);\n });\n };\n\n function blockFor(render, template, blockOptions) {\n return new Block(render, template, blockOptions);\n }\n\n function bindBlocks(env, shadowScope, blocks) {\n if (!blocks) {\n return;\n }\n if (blocks instanceof Block) {\n env.hooks.bindBlock(env, shadowScope, blocks);\n } else {\n for (var name in blocks) {\n if (blocks.hasOwnProperty(name)) {\n env.hooks.bindBlock(env, shadowScope, blocks[name], name);\n }\n }\n }\n }\n\n function renderAndCleanup(morph, env, options, shadowOptions, callback) {\n // The RenderState object is used to collect information about what the\n // helper or hook being invoked has yielded. Once it has finished either\n // yielding multiple items (via yieldItem) or a single template (via\n // yieldTemplate), we detect what was rendered and how it differs from\n // the previous render, cleaning up old state in DOM as appropriate.\n var renderState = options.renderState;\n renderState.collisions = undefined;\n renderState.shadowOptions = shadowOptions;\n\n // Invoke the callback, instructing it to save information about what it\n // renders into RenderState.\n var result = callback(options);\n\n // The hook can opt-out of cleanup if it handled cleanup itself.\n if (result && result.handled) {\n return;\n }\n\n var morphMap = morph.morphMap;\n\n // Walk the morph list, clearing any items that were yielded in a previous\n // render but were not yielded during this render.\n var morphList = renderState.morphListToPrune;\n if (morphList) {\n var handledMorphs = renderState.handledMorphs;\n var item = morphList.firstChildMorph;\n\n while (item) {\n var next = item.nextMorph;\n\n // If we don't see the key in handledMorphs, it wasn't\n // yielded in and we can safely remove it from DOM.\n if (!(item.key in handledMorphs)) {\n morphMap[item.key] = undefined;\n clearMorph(item, env, true);\n item.destroy();\n }\n\n item = next;\n }\n }\n\n morphList = renderState.morphListToClear;\n if (morphList) {\n clearMorphList(morphList, morph, env);\n }\n\n var toClear = renderState.morphToClear;\n if (toClear) {\n clearMorph(toClear, env);\n }\n }\n\n function clearMorph(morph, env, destroySelf) {\n var cleanup = env.hooks.cleanupRenderNode;\n var destroy = env.hooks.destroyRenderNode;\n var willCleanup = env.hooks.willCleanupTree;\n var didCleanup = env.hooks.didCleanupTree;\n\n function destroyNode(node) {\n if (cleanup) {\n cleanup(node);\n }\n if (destroy) {\n destroy(node);\n }\n }\n\n if (willCleanup) {\n willCleanup(env, morph, destroySelf);\n }\n if (cleanup) {\n cleanup(morph);\n }\n if (destroySelf && destroy) {\n destroy(morph);\n }\n\n _htmlbarsUtilMorphUtils.visitChildren(morph.childNodes, destroyNode);\n\n // TODO: Deal with logical children that are not in the DOM tree\n morph.clear();\n if (didCleanup) {\n didCleanup(env, morph, destroySelf);\n }\n\n morph.lastResult = null;\n morph.lastYielded = null;\n morph.childNodes = null;\n }\n\n function clearMorphList(morphList, morph, env) {\n var item = morphList.firstChildMorph;\n\n while (item) {\n var next = item.nextMorph;\n morph.morphMap[item.key] = undefined;\n clearMorph(item, env, true);\n item.destroy();\n\n item = next;\n }\n\n // Remove the MorphList from the morph.\n morphList.clear();\n morph.morphList = null;\n }\n});\nenifed(\"htmlbars-util/void-tag-names\", [\"exports\", \"htmlbars-util/array-utils\"], function (exports, _htmlbarsUtilArrayUtils) {\n \"use strict\";\n\n // The HTML elements in this list are speced by\n // http://www.w3.org/TR/html-markup/syntax.html#syntax-elements,\n // and will be forced to close regardless of if they have a\n // self-closing /> at the end.\n var voidTagNames = \"area base br col command embed hr img input keygen link meta param source track wbr\";\n var voidMap = {};\n\n _htmlbarsUtilArrayUtils.forEach(voidTagNames.split(\" \"), function (tagName) {\n voidMap[tagName] = true;\n });\n\n exports.default = voidMap;\n});\nenifed('htmlbars-util', ['exports', 'htmlbars-util/safe-string', 'htmlbars-util/handlebars/utils', 'htmlbars-util/namespaces', 'htmlbars-util/morph-utils'], function (exports, _htmlbarsUtilSafeString, _htmlbarsUtilHandlebarsUtils, _htmlbarsUtilNamespaces, _htmlbarsUtilMorphUtils) {\n 'use strict';\n\n exports.SafeString = _htmlbarsUtilSafeString.default;\n exports.escapeExpression = _htmlbarsUtilHandlebarsUtils.escapeExpression;\n exports.getAttrNamespace = _htmlbarsUtilNamespaces.getAttrNamespace;\n exports.validateChildMorphs = _htmlbarsUtilMorphUtils.validateChildMorphs;\n exports.linkParams = _htmlbarsUtilMorphUtils.linkParams;\n exports.dump = _htmlbarsUtilMorphUtils.dump;\n});\nenifed('morph-attr/sanitize-attribute-value', ['exports'], function (exports) {\n /* jshint scripturl:true */\n\n 'use strict';\n\n exports.sanitizeAttributeValue = sanitizeAttributeValue;\n var badProtocols = {\n 'javascript:': true,\n 'vbscript:': true\n };\n\n var badTags = {\n 'A': true,\n 'BODY': true,\n 'LINK': true,\n 'IMG': true,\n 'IFRAME': true,\n 'BASE': true,\n 'FORM': true\n };\n\n var badTagsForDataURI = {\n 'EMBED': true\n };\n\n var badAttributes = {\n 'href': true,\n 'src': true,\n 'background': true,\n 'action': true\n };\n\n exports.badAttributes = badAttributes;\n var badAttributesForDataURI = {\n 'src': true\n };\n\n function sanitizeAttributeValue(dom, element, attribute, value) {\n var tagName;\n\n if (!element) {\n tagName = null;\n } else {\n tagName = element.tagName.toUpperCase();\n }\n\n if (value && value.toHTML) {\n return value.toHTML();\n }\n\n if ((tagName === null || badTags[tagName]) && badAttributes[attribute]) {\n var protocol = dom.protocolForURL(value);\n if (badProtocols[protocol] === true) {\n return 'unsafe:' + value;\n }\n }\n\n if (badTagsForDataURI[tagName] && badAttributesForDataURI[attribute]) {\n return 'unsafe:' + value;\n }\n\n return value;\n }\n});\nenifed(\"morph-attr\", [\"exports\", \"morph-attr/sanitize-attribute-value\", \"dom-helper/prop\", \"dom-helper/build-html-dom\", \"htmlbars-util\"], function (exports, _morphAttrSanitizeAttributeValue, _domHelperProp, _domHelperBuildHtmlDom, _htmlbarsUtil) {\n \"use strict\";\n\n function getProperty() {\n return this.domHelper.getPropertyStrict(this.element, this.attrName);\n }\n\n function updateProperty(value) {\n if (this._renderedInitially === true || !_domHelperProp.isAttrRemovalValue(value)) {\n var element = this.element;\n var attrName = this.attrName;\n\n if (attrName === 'value' && element.tagName === 'INPUT' && element.value === value) {\n // Do nothing. Attempts to avoid accidently changing the input cursor location.\n // See https://github.com/tildeio/htmlbars/pull/447 for more details.\n } else {\n // do not render if initial value is undefined or null\n this.domHelper.setPropertyStrict(element, attrName, value);\n }\n }\n\n this._renderedInitially = true;\n }\n\n function getAttribute() {\n return this.domHelper.getAttribute(this.element, this.attrName);\n }\n\n function updateAttribute(value) {\n if (_domHelperProp.isAttrRemovalValue(value)) {\n this.domHelper.removeAttribute(this.element, this.attrName);\n } else {\n this.domHelper.setAttribute(this.element, this.attrName, value);\n }\n }\n\n function getAttributeNS() {\n return this.domHelper.getAttributeNS(this.element, this.namespace, this.attrName);\n }\n\n function updateAttributeNS(value) {\n if (_domHelperProp.isAttrRemovalValue(value)) {\n this.domHelper.removeAttribute(this.element, this.attrName);\n } else {\n this.domHelper.setAttributeNS(this.element, this.namespace, this.attrName, value);\n }\n }\n\n var UNSET = { unset: true };\n\n var guid = 1;\n\n AttrMorph.create = function (element, attrName, domHelper, namespace) {\n var ns = _htmlbarsUtil.getAttrNamespace(attrName, namespace);\n\n if (ns) {\n return new AttributeNSAttrMorph(element, attrName, domHelper, ns);\n } else {\n return createNonNamespacedAttrMorph(element, attrName, domHelper);\n }\n };\n\n function createNonNamespacedAttrMorph(element, attrName, domHelper) {\n var _normalizeProperty = _domHelperProp.normalizeProperty(element, attrName);\n\n var normalized = _normalizeProperty.normalized;\n var type = _normalizeProperty.type;\n\n if (element.namespaceURI === _domHelperBuildHtmlDom.svgNamespace || attrName === 'style' || type === 'attr') {\n return new AttributeAttrMorph(element, normalized, domHelper);\n } else {\n return new PropertyAttrMorph(element, normalized, domHelper);\n }\n }\n\n function AttrMorph(element, attrName, domHelper) {\n this.element = element;\n this.domHelper = domHelper;\n this.attrName = attrName;\n this._state = undefined;\n this.isDirty = false;\n this.isSubtreeDirty = false;\n this.escaped = true;\n this.lastValue = UNSET;\n this.lastResult = null;\n this.lastYielded = null;\n this.childNodes = null;\n this.linkedParams = null;\n this.linkedResult = null;\n this.guid = \"attr\" + guid++;\n this.seen = false;\n this.ownerNode = null;\n this.rendered = false;\n this._renderedInitially = false;\n this.namespace = undefined;\n this.didInit();\n }\n\n AttrMorph.prototype.getState = function () {\n if (!this._state) {\n this._state = {};\n }\n\n return this._state;\n };\n\n AttrMorph.prototype.setState = function (newState) {\n /*jshint -W093 */\n\n return this._state = newState;\n };\n\n AttrMorph.prototype.didInit = function () {};\n AttrMorph.prototype.willSetContent = function () {};\n\n AttrMorph.prototype.setContent = function (value) {\n this.willSetContent(value);\n\n if (this.lastValue === value) {\n return;\n }\n this.lastValue = value;\n\n if (this.escaped) {\n var sanitized = _morphAttrSanitizeAttributeValue.sanitizeAttributeValue(this.domHelper, this.element, this.attrName, value);\n this._update(sanitized, this.namespace);\n } else {\n this._update(value, this.namespace);\n }\n };\n\n AttrMorph.prototype.getContent = function () {\n var value = this.lastValue = this._get();\n return value;\n };\n\n // renderAndCleanup calls `clear` on all items in the morph map\n // just before calling `destroy` on the morph.\n //\n // As a future refactor this could be changed to set the property\n // back to its original/default value.\n AttrMorph.prototype.clear = function () {};\n\n AttrMorph.prototype.destroy = function () {\n this.element = null;\n this.domHelper = null;\n };\n\n AttrMorph.prototype._$superAttrMorph = AttrMorph;\n\n function PropertyAttrMorph(element, attrName, domHelper) {\n this._$superAttrMorph(element, attrName, domHelper);\n }\n\n PropertyAttrMorph.prototype = Object.create(AttrMorph.prototype);\n PropertyAttrMorph.prototype._update = updateProperty;\n PropertyAttrMorph.prototype._get = getProperty;\n\n function AttributeNSAttrMorph(element, attrName, domHelper, namespace) {\n this._$superAttrMorph(element, attrName, domHelper);\n this.namespace = namespace;\n }\n\n AttributeNSAttrMorph.prototype = Object.create(AttrMorph.prototype);\n AttributeNSAttrMorph.prototype._update = updateAttributeNS;\n AttributeNSAttrMorph.prototype._get = getAttributeNS;\n\n function AttributeAttrMorph(element, attrName, domHelper) {\n this._$superAttrMorph(element, attrName, domHelper);\n }\n\n AttributeAttrMorph.prototype = Object.create(AttrMorph.prototype);\n AttributeAttrMorph.prototype._update = updateAttribute;\n AttributeAttrMorph.prototype._get = getAttribute;\n\n exports.default = AttrMorph;\n exports.sanitizeAttributeValue = _morphAttrSanitizeAttributeValue.sanitizeAttributeValue;\n});\nenifed('morph-range/morph-list', ['exports', 'morph-range/utils'], function (exports, _morphRangeUtils) {\n 'use strict';\n\n function MorphList() {\n // morph graph\n this.firstChildMorph = null;\n this.lastChildMorph = null;\n\n this.mountedMorph = null;\n }\n\n var prototype = MorphList.prototype;\n\n prototype.clear = function MorphList$clear() {\n var current = this.firstChildMorph;\n\n while (current) {\n var next = current.nextMorph;\n current.previousMorph = null;\n current.nextMorph = null;\n current.parentMorphList = null;\n current = next;\n }\n\n this.firstChildMorph = this.lastChildMorph = null;\n };\n\n prototype.destroy = function MorphList$destroy() {};\n\n prototype.appendMorph = function MorphList$appendMorph(morph) {\n this.insertBeforeMorph(morph, null);\n };\n\n prototype.insertBeforeMorph = function MorphList$insertBeforeMorph(morph, referenceMorph) {\n if (morph.parentMorphList !== null) {\n morph.unlink();\n }\n if (referenceMorph && referenceMorph.parentMorphList !== this) {\n throw new Error('The morph before which the new morph is to be inserted is not a child of this morph.');\n }\n\n var mountedMorph = this.mountedMorph;\n\n if (mountedMorph) {\n\n var parentNode = mountedMorph.firstNode.parentNode;\n var referenceNode = referenceMorph ? referenceMorph.firstNode : mountedMorph.lastNode.nextSibling;\n\n _morphRangeUtils.insertBefore(parentNode, morph.firstNode, morph.lastNode, referenceNode);\n\n // was not in list mode replace current content\n if (!this.firstChildMorph) {\n _morphRangeUtils.clear(this.mountedMorph.firstNode.parentNode, this.mountedMorph.firstNode, this.mountedMorph.lastNode);\n }\n }\n\n morph.parentMorphList = this;\n\n var previousMorph = referenceMorph ? referenceMorph.previousMorph : this.lastChildMorph;\n if (previousMorph) {\n previousMorph.nextMorph = morph;\n morph.previousMorph = previousMorph;\n } else {\n this.firstChildMorph = morph;\n }\n\n if (referenceMorph) {\n referenceMorph.previousMorph = morph;\n morph.nextMorph = referenceMorph;\n } else {\n this.lastChildMorph = morph;\n }\n\n this.firstChildMorph._syncFirstNode();\n this.lastChildMorph._syncLastNode();\n };\n\n prototype.removeChildMorph = function MorphList$removeChildMorph(morph) {\n if (morph.parentMorphList !== this) {\n throw new Error(\"Cannot remove a morph from a parent it is not inside of\");\n }\n\n morph.destroy();\n };\n\n exports.default = MorphList;\n});\nenifed('morph-range/morph-list.umd', ['exports', 'morph-range/morph-list'], function (exports, _morphRangeMorphList) {\n 'use strict';\n\n (function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.MorphList = factory();\n }\n })(undefined, function () {\n return _morphRangeMorphList.default;\n });\n});\nenifed(\"morph-range/utils\", [\"exports\"], function (exports) {\n // inclusive of both nodes\n \"use strict\";\n\n exports.clear = clear;\n exports.insertBefore = insertBefore;\n\n function clear(parentNode, firstNode, lastNode) {\n if (!parentNode) {\n return;\n }\n\n var node = firstNode;\n var nextNode;\n do {\n nextNode = node.nextSibling;\n parentNode.removeChild(node);\n if (node === lastNode) {\n break;\n }\n node = nextNode;\n } while (node);\n }\n\n function insertBefore(parentNode, firstNode, lastNode, refNode) {\n var node = firstNode;\n var nextNode;\n do {\n nextNode = node.nextSibling;\n parentNode.insertBefore(node, refNode);\n if (node === lastNode) {\n break;\n }\n node = nextNode;\n } while (node);\n }\n});\nenifed('morph-range', ['exports', 'morph-range/utils'], function (exports, _morphRangeUtils) {\n 'use strict';\n\n // constructor just initializes the fields\n // use one of the static initializers to create a valid morph.\n function Morph(domHelper, contextualElement) {\n this.domHelper = domHelper;\n // context if content if current content is detached\n this.contextualElement = contextualElement;\n // inclusive range of morph\n // these should be nodeType 1, 3, or 8\n this.firstNode = null;\n this.lastNode = null;\n\n // flag to force text to setContent to be treated as html\n this.parseTextAsHTML = false;\n\n // morph list graph\n this.parentMorphList = null;\n this.previousMorph = null;\n this.nextMorph = null;\n }\n\n Morph.empty = function (domHelper, contextualElement) {\n var morph = new Morph(domHelper, contextualElement);\n morph.clear();\n return morph;\n };\n\n Morph.create = function (domHelper, contextualElement, node) {\n var morph = new Morph(domHelper, contextualElement);\n morph.setNode(node);\n return morph;\n };\n\n Morph.attach = function (domHelper, contextualElement, firstNode, lastNode) {\n var morph = new Morph(domHelper, contextualElement);\n morph.setRange(firstNode, lastNode);\n return morph;\n };\n\n Morph.prototype.setContent = function Morph$setContent(content) {\n if (content === null || content === undefined) {\n return this.clear();\n }\n\n var type = typeof content;\n switch (type) {\n case 'string':\n if (this.parseTextAsHTML) {\n return this.domHelper.setMorphHTML(this, content);\n }\n return this.setText(content);\n case 'object':\n if (typeof content.nodeType === 'number') {\n return this.setNode(content);\n }\n /* Handlebars.SafeString */\n if (typeof content.toHTML === 'function') {\n return this.setHTML(content.toHTML());\n }\n if (this.parseTextAsHTML) {\n return this.setHTML(content.toString());\n }\n /* falls through */\n case 'boolean':\n case 'number':\n return this.setText(content.toString());\n case 'function':\n raiseCannotBindToFunction(content);\n default:\n throw new TypeError('unsupported content');\n }\n };\n\n function raiseCannotBindToFunction(content) {\n var functionName = content.name;\n var message;\n\n if (functionName) {\n message = 'Unsupported Content: Cannot bind to function `' + functionName + '`';\n } else {\n message = 'Unsupported Content: Cannot bind to function';\n }\n\n throw new TypeError(message);\n }\n\n Morph.prototype.clear = function Morph$clear() {\n var node = this.setNode(this.domHelper.createComment(''));\n return node;\n };\n\n Morph.prototype.setText = function Morph$setText(text) {\n var firstNode = this.firstNode;\n var lastNode = this.lastNode;\n\n if (firstNode && lastNode === firstNode && firstNode.nodeType === 3) {\n firstNode.nodeValue = text;\n return firstNode;\n }\n\n return this.setNode(text ? this.domHelper.createTextNode(text) : this.domHelper.createComment(''));\n };\n\n Morph.prototype.setNode = function Morph$setNode(newNode) {\n var firstNode, lastNode;\n switch (newNode.nodeType) {\n case 3:\n firstNode = newNode;\n lastNode = newNode;\n break;\n case 11:\n firstNode = newNode.firstChild;\n lastNode = newNode.lastChild;\n if (firstNode === null) {\n firstNode = this.domHelper.createComment('');\n newNode.appendChild(firstNode);\n lastNode = firstNode;\n }\n break;\n default:\n firstNode = newNode;\n lastNode = newNode;\n break;\n }\n\n this.setRange(firstNode, lastNode);\n\n return newNode;\n };\n\n Morph.prototype.setRange = function (firstNode, lastNode) {\n var previousFirstNode = this.firstNode;\n if (previousFirstNode !== null) {\n\n var parentNode = previousFirstNode.parentNode;\n if (parentNode !== null) {\n _morphRangeUtils.insertBefore(parentNode, firstNode, lastNode, previousFirstNode);\n _morphRangeUtils.clear(parentNode, previousFirstNode, this.lastNode);\n }\n }\n\n this.firstNode = firstNode;\n this.lastNode = lastNode;\n\n if (this.parentMorphList) {\n this._syncFirstNode();\n this._syncLastNode();\n }\n };\n\n Morph.prototype.destroy = function Morph$destroy() {\n this.unlink();\n\n var firstNode = this.firstNode;\n var lastNode = this.lastNode;\n var parentNode = firstNode && firstNode.parentNode;\n\n this.firstNode = null;\n this.lastNode = null;\n\n _morphRangeUtils.clear(parentNode, firstNode, lastNode);\n };\n\n Morph.prototype.unlink = function Morph$unlink() {\n var parentMorphList = this.parentMorphList;\n var previousMorph = this.previousMorph;\n var nextMorph = this.nextMorph;\n\n if (previousMorph) {\n if (nextMorph) {\n previousMorph.nextMorph = nextMorph;\n nextMorph.previousMorph = previousMorph;\n } else {\n previousMorph.nextMorph = null;\n parentMorphList.lastChildMorph = previousMorph;\n }\n } else {\n if (nextMorph) {\n nextMorph.previousMorph = null;\n parentMorphList.firstChildMorph = nextMorph;\n } else if (parentMorphList) {\n parentMorphList.lastChildMorph = parentMorphList.firstChildMorph = null;\n }\n }\n\n this.parentMorphList = null;\n this.nextMorph = null;\n this.previousMorph = null;\n\n if (parentMorphList && parentMorphList.mountedMorph) {\n if (!parentMorphList.firstChildMorph) {\n // list is empty\n parentMorphList.mountedMorph.clear();\n return;\n } else {\n parentMorphList.firstChildMorph._syncFirstNode();\n parentMorphList.lastChildMorph._syncLastNode();\n }\n }\n };\n\n Morph.prototype.setHTML = function (text) {\n var fragment = this.domHelper.parseHTML(text, this.contextualElement);\n return this.setNode(fragment);\n };\n\n Morph.prototype.setMorphList = function Morph$appendMorphList(morphList) {\n morphList.mountedMorph = this;\n this.clear();\n\n var originalFirstNode = this.firstNode;\n\n if (morphList.firstChildMorph) {\n this.firstNode = morphList.firstChildMorph.firstNode;\n this.lastNode = morphList.lastChildMorph.lastNode;\n\n var current = morphList.firstChildMorph;\n\n while (current) {\n var next = current.nextMorph;\n current.insertBeforeNode(originalFirstNode, null);\n current = next;\n }\n originalFirstNode.parentNode.removeChild(originalFirstNode);\n }\n };\n\n Morph.prototype._syncFirstNode = function Morph$syncFirstNode() {\n var morph = this;\n var parentMorphList;\n while (parentMorphList = morph.parentMorphList) {\n if (parentMorphList.mountedMorph === null) {\n break;\n }\n if (morph !== parentMorphList.firstChildMorph) {\n break;\n }\n if (morph.firstNode === parentMorphList.mountedMorph.firstNode) {\n break;\n }\n\n parentMorphList.mountedMorph.firstNode = morph.firstNode;\n\n morph = parentMorphList.mountedMorph;\n }\n };\n\n Morph.prototype._syncLastNode = function Morph$syncLastNode() {\n var morph = this;\n var parentMorphList;\n while (parentMorphList = morph.parentMorphList) {\n if (parentMorphList.mountedMorph === null) {\n break;\n }\n if (morph !== parentMorphList.lastChildMorph) {\n break;\n }\n if (morph.lastNode === parentMorphList.mountedMorph.lastNode) {\n break;\n }\n\n parentMorphList.mountedMorph.lastNode = morph.lastNode;\n\n morph = parentMorphList.mountedMorph;\n }\n };\n\n Morph.prototype.insertBeforeNode = function Morph$insertBeforeNode(parentNode, refNode) {\n _morphRangeUtils.insertBefore(parentNode, this.firstNode, this.lastNode, refNode);\n };\n\n Morph.prototype.appendToNode = function Morph$appendToNode(parentNode) {\n _morphRangeUtils.insertBefore(parentNode, this.firstNode, this.lastNode, null);\n };\n\n exports.default = Morph;\n});\nenifed(\"route-recognizer/dsl\", [\"exports\"], function (exports) {\n \"use strict\";\n\n function Target(path, matcher, delegate) {\n this.path = path;\n this.matcher = matcher;\n this.delegate = delegate;\n }\n\n Target.prototype = {\n to: function (target, callback) {\n var delegate = this.delegate;\n\n if (delegate && delegate.willAddRoute) {\n target = delegate.willAddRoute(this.matcher.target, target);\n }\n\n this.matcher.add(this.path, target);\n\n if (callback) {\n if (callback.length === 0) {\n throw new Error(\"You must have an argument in the function passed to `to`\");\n }\n this.matcher.addChild(this.path, target, callback, this.delegate);\n }\n return this;\n }\n };\n\n function Matcher(target) {\n this.routes = {};\n this.children = {};\n this.target = target;\n }\n\n Matcher.prototype = {\n add: function (path, handler) {\n this.routes[path] = handler;\n },\n\n addChild: function (path, target, callback, delegate) {\n var matcher = new Matcher(target);\n this.children[path] = matcher;\n\n var match = generateMatch(path, matcher, delegate);\n\n if (delegate && delegate.contextEntered) {\n delegate.contextEntered(target, match);\n }\n\n callback(match);\n }\n };\n\n function generateMatch(startingPath, matcher, delegate) {\n return function (path, nestedCallback) {\n var fullPath = startingPath + path;\n\n if (nestedCallback) {\n nestedCallback(generateMatch(fullPath, matcher, delegate));\n } else {\n return new Target(startingPath + path, matcher, delegate);\n }\n };\n }\n\n function addRoute(routeArray, path, handler) {\n var len = 0;\n for (var i = 0, l = routeArray.length; i < l; i++) {\n len += routeArray[i].path.length;\n }\n\n path = path.substr(len);\n var route = { path: path, handler: handler };\n routeArray.push(route);\n }\n\n function eachRoute(baseRoute, matcher, callback, binding) {\n var routes = matcher.routes;\n\n for (var path in routes) {\n if (routes.hasOwnProperty(path)) {\n var routeArray = baseRoute.slice();\n addRoute(routeArray, path, routes[path]);\n\n if (matcher.children[path]) {\n eachRoute(routeArray, matcher.children[path], callback, binding);\n } else {\n callback.call(binding, routeArray);\n }\n }\n }\n }\n\n exports.default = function (callback, addRouteCallback) {\n var matcher = new Matcher();\n\n callback(generateMatch(\"\", matcher, this.delegate));\n\n eachRoute([], matcher, function (route) {\n if (addRouteCallback) {\n addRouteCallback(this, route);\n } else {\n this.add(route);\n }\n }, this);\n };\n});\nenifed('route-recognizer', ['exports', 'route-recognizer/dsl'], function (exports, _routeRecognizerDsl) {\n 'use strict';\n\n var specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\\\'];\n\n var escapeRegex = new RegExp('(\\\\' + specials.join('|\\\\') + ')', 'g');\n\n function isArray(test) {\n return Object.prototype.toString.call(test) === \"[object Array]\";\n }\n\n // A Segment represents a segment in the original route description.\n // Each Segment type provides an `eachChar` and `regex` method.\n //\n // The `eachChar` method invokes the callback with one or more character\n // specifications. A character specification consumes one or more input\n // characters.\n //\n // The `regex` method returns a regex fragment for the segment. If the\n // segment is a dynamic of star segment, the regex fragment also includes\n // a capture.\n //\n // A character specification contains:\n //\n // * `validChars`: a String with a list of all valid characters, or\n // * `invalidChars`: a String with a list of all invalid characters\n // * `repeat`: true if the character specification can repeat\n\n function StaticSegment(string) {\n this.string = string;\n }\n StaticSegment.prototype = {\n eachChar: function (callback) {\n var string = this.string,\n ch;\n\n for (var i = 0, l = string.length; i < l; i++) {\n ch = string.charAt(i);\n callback({ validChars: ch });\n }\n },\n\n regex: function () {\n return this.string.replace(escapeRegex, '\\\\$1');\n },\n\n generate: function () {\n return this.string;\n }\n };\n\n function DynamicSegment(name) {\n this.name = name;\n }\n DynamicSegment.prototype = {\n eachChar: function (callback) {\n callback({ invalidChars: \"/\", repeat: true });\n },\n\n regex: function () {\n return \"([^/]+)\";\n },\n\n generate: function (params) {\n return params[this.name];\n }\n };\n\n function StarSegment(name) {\n this.name = name;\n }\n StarSegment.prototype = {\n eachChar: function (callback) {\n callback({ invalidChars: \"\", repeat: true });\n },\n\n regex: function () {\n return \"(.+)\";\n },\n\n generate: function (params) {\n return params[this.name];\n }\n };\n\n function EpsilonSegment() {}\n EpsilonSegment.prototype = {\n eachChar: function () {},\n regex: function () {\n return \"\";\n },\n generate: function () {\n return \"\";\n }\n };\n\n function parse(route, names, types) {\n // normalize route as not starting with a \"/\". Recognition will\n // also normalize.\n if (route.charAt(0) === \"/\") {\n route = route.substr(1);\n }\n\n var segments = route.split(\"/\"),\n results = [];\n\n for (var i = 0, l = segments.length; i < l; i++) {\n var segment = segments[i],\n match;\n\n if (match = segment.match(/^:([^\\/]+)$/)) {\n results.push(new DynamicSegment(match[1]));\n names.push(match[1]);\n types.dynamics++;\n } else if (match = segment.match(/^\\*([^\\/]+)$/)) {\n results.push(new StarSegment(match[1]));\n names.push(match[1]);\n types.stars++;\n } else if (segment === \"\") {\n results.push(new EpsilonSegment());\n } else {\n results.push(new StaticSegment(segment));\n types.statics++;\n }\n }\n\n return results;\n }\n\n // A State has a character specification and (`charSpec`) and a list of possible\n // subsequent states (`nextStates`).\n //\n // If a State is an accepting state, it will also have several additional\n // properties:\n //\n // * `regex`: A regular expression that is used to extract parameters from paths\n // that reached this accepting state.\n // * `handlers`: Information on how to convert the list of captures into calls\n // to registered handlers with the specified parameters\n // * `types`: How many static, dynamic or star segments in this route. Used to\n // decide which route to use if multiple registered routes match a path.\n //\n // Currently, State is implemented naively by looping over `nextStates` and\n // comparing a character specification against a character. A more efficient\n // implementation would use a hash of keys pointing at one or more next states.\n\n function State(charSpec) {\n this.charSpec = charSpec;\n this.nextStates = [];\n }\n\n State.prototype = {\n get: function (charSpec) {\n var nextStates = this.nextStates;\n\n for (var i = 0, l = nextStates.length; i < l; i++) {\n var child = nextStates[i];\n\n var isEqual = child.charSpec.validChars === charSpec.validChars;\n isEqual = isEqual && child.charSpec.invalidChars === charSpec.invalidChars;\n\n if (isEqual) {\n return child;\n }\n }\n },\n\n put: function (charSpec) {\n var state;\n\n // If the character specification already exists in a child of the current\n // state, just return that state.\n if (state = this.get(charSpec)) {\n return state;\n }\n\n // Make a new state for the character spec\n state = new State(charSpec);\n\n // Insert the new state as a child of the current state\n this.nextStates.push(state);\n\n // If this character specification repeats, insert the new state as a child\n // of itself. Note that this will not trigger an infinite loop because each\n // transition during recognition consumes a character.\n if (charSpec.repeat) {\n state.nextStates.push(state);\n }\n\n // Return the new state\n return state;\n },\n\n // Find a list of child states matching the next character\n match: function (ch) {\n // DEBUG \"Processing `\" + ch + \"`:\"\n var nextStates = this.nextStates,\n child,\n charSpec,\n chars;\n\n // DEBUG \" \" + debugState(this)\n var returned = [];\n\n for (var i = 0, l = nextStates.length; i < l; i++) {\n child = nextStates[i];\n\n charSpec = child.charSpec;\n\n if (typeof (chars = charSpec.validChars) !== 'undefined') {\n if (chars.indexOf(ch) !== -1) {\n returned.push(child);\n }\n } else if (typeof (chars = charSpec.invalidChars) !== 'undefined') {\n if (chars.indexOf(ch) === -1) {\n returned.push(child);\n }\n }\n }\n\n return returned;\n }\n\n /** IF DEBUG\n , debug: function() {\n var charSpec = this.charSpec,\n debug = \"[\",\n chars = charSpec.validChars || charSpec.invalidChars;\n if (charSpec.invalidChars) { debug += \"^\"; }\n debug += chars;\n debug += \"]\";\n if (charSpec.repeat) { debug += \"+\"; }\n return debug;\n }\n END IF **/\n };\n\n /** IF DEBUG\n function debug(log) {\n console.log(log);\n }\n \n function debugState(state) {\n return state.nextStates.map(function(n) {\n if (n.nextStates.length === 0) { return \"( \" + n.debug() + \" [accepting] )\"; }\n return \"( \" + n.debug() + \" \" + n.nextStates.map(function(s) { return s.debug() }).join(\" or \") + \" )\";\n }).join(\", \")\n }\n END IF **/\n\n // This is a somewhat naive strategy, but should work in a lot of cases\n // A better strategy would properly resolve /posts/:id/new and /posts/edit/:id.\n //\n // This strategy generally prefers more static and less dynamic matching.\n // Specifically, it\n //\n // * prefers fewer stars to more, then\n // * prefers using stars for less of the match to more, then\n // * prefers fewer dynamic segments to more, then\n // * prefers more static segments to more\n function sortSolutions(states) {\n return states.sort(function (a, b) {\n if (a.types.stars !== b.types.stars) {\n return a.types.stars - b.types.stars;\n }\n\n if (a.types.stars) {\n if (a.types.statics !== b.types.statics) {\n return b.types.statics - a.types.statics;\n }\n if (a.types.dynamics !== b.types.dynamics) {\n return b.types.dynamics - a.types.dynamics;\n }\n }\n\n if (a.types.dynamics !== b.types.dynamics) {\n return a.types.dynamics - b.types.dynamics;\n }\n if (a.types.statics !== b.types.statics) {\n return b.types.statics - a.types.statics;\n }\n\n return 0;\n });\n }\n\n function recognizeChar(states, ch) {\n var nextStates = [];\n\n for (var i = 0, l = states.length; i < l; i++) {\n var state = states[i];\n\n nextStates = nextStates.concat(state.match(ch));\n }\n\n return nextStates;\n }\n\n var oCreate = Object.create || function (proto) {\n function F() {}\n F.prototype = proto;\n return new F();\n };\n\n function RecognizeResults(queryParams) {\n this.queryParams = queryParams || {};\n }\n RecognizeResults.prototype = oCreate({\n splice: Array.prototype.splice,\n slice: Array.prototype.slice,\n push: Array.prototype.push,\n length: 0,\n queryParams: null\n });\n\n function findHandler(state, path, queryParams) {\n var handlers = state.handlers,\n regex = state.regex;\n var captures = path.match(regex),\n currentCapture = 1;\n var result = new RecognizeResults(queryParams);\n\n for (var i = 0, l = handlers.length; i < l; i++) {\n var handler = handlers[i],\n names = handler.names,\n params = {};\n\n for (var j = 0, m = names.length; j < m; j++) {\n params[names[j]] = captures[currentCapture++];\n }\n\n result.push({ handler: handler.handler, params: params, isDynamic: !!names.length });\n }\n\n return result;\n }\n\n function addSegment(currentState, segment) {\n segment.eachChar(function (ch) {\n var state;\n\n currentState = currentState.put(ch);\n });\n\n return currentState;\n }\n\n function decodeQueryParamPart(part) {\n // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1\n part = part.replace(/\\+/gm, '%20');\n return decodeURIComponent(part);\n }\n\n // The main interface\n\n var RouteRecognizer = function () {\n this.rootState = new State();\n this.names = {};\n };\n\n RouteRecognizer.prototype = {\n add: function (routes, options) {\n var currentState = this.rootState,\n regex = \"^\",\n types = { statics: 0, dynamics: 0, stars: 0 },\n handlers = [],\n allSegments = [],\n name;\n\n var isEmpty = true;\n\n for (var i = 0, l = routes.length; i < l; i++) {\n var route = routes[i],\n names = [];\n\n var segments = parse(route.path, names, types);\n\n allSegments = allSegments.concat(segments);\n\n for (var j = 0, m = segments.length; j < m; j++) {\n var segment = segments[j];\n\n if (segment instanceof EpsilonSegment) {\n continue;\n }\n\n isEmpty = false;\n\n // Add a \"/\" for the new segment\n currentState = currentState.put({ validChars: \"/\" });\n regex += \"/\";\n\n // Add a representation of the segment to the NFA and regex\n currentState = addSegment(currentState, segment);\n regex += segment.regex();\n }\n\n var handler = { handler: route.handler, names: names };\n handlers.push(handler);\n }\n\n if (isEmpty) {\n currentState = currentState.put({ validChars: \"/\" });\n regex += \"/\";\n }\n\n currentState.handlers = handlers;\n currentState.regex = new RegExp(regex + \"$\");\n currentState.types = types;\n\n if (name = options && options.as) {\n this.names[name] = {\n segments: allSegments,\n handlers: handlers\n };\n }\n },\n\n handlersFor: function (name) {\n var route = this.names[name],\n result = [];\n if (!route) {\n throw new Error(\"There is no route named \" + name);\n }\n\n for (var i = 0, l = route.handlers.length; i < l; i++) {\n result.push(route.handlers[i]);\n }\n\n return result;\n },\n\n hasRoute: function (name) {\n return !!this.names[name];\n },\n\n generate: function (name, params) {\n var route = this.names[name],\n output = \"\";\n if (!route) {\n throw new Error(\"There is no route named \" + name);\n }\n\n var segments = route.segments;\n\n for (var i = 0, l = segments.length; i < l; i++) {\n var segment = segments[i];\n\n if (segment instanceof EpsilonSegment) {\n continue;\n }\n\n output += \"/\";\n output += segment.generate(params);\n }\n\n if (output.charAt(0) !== '/') {\n output = '/' + output;\n }\n\n if (params && params.queryParams) {\n output += this.generateQueryString(params.queryParams, route.handlers);\n }\n\n return output;\n },\n\n generateQueryString: function (params, handlers) {\n var pairs = [];\n var keys = [];\n for (var key in params) {\n if (params.hasOwnProperty(key)) {\n keys.push(key);\n }\n }\n keys.sort();\n for (var i = 0, len = keys.length; i < len; i++) {\n key = keys[i];\n var value = params[key];\n if (value == null) {\n continue;\n }\n var pair = encodeURIComponent(key);\n if (isArray(value)) {\n for (var j = 0, l = value.length; j < l; j++) {\n var arrayPair = key + '[]' + '=' + encodeURIComponent(value[j]);\n pairs.push(arrayPair);\n }\n } else {\n pair += \"=\" + encodeURIComponent(value);\n pairs.push(pair);\n }\n }\n\n if (pairs.length === 0) {\n return '';\n }\n\n return \"?\" + pairs.join(\"&\");\n },\n\n parseQueryString: function (queryString) {\n var pairs = queryString.split(\"&\"),\n queryParams = {};\n for (var i = 0; i < pairs.length; i++) {\n var pair = pairs[i].split('='),\n key = decodeQueryParamPart(pair[0]),\n keyLength = key.length,\n isArray = false,\n value;\n if (pair.length === 1) {\n value = 'true';\n } else {\n //Handle arrays\n if (keyLength > 2 && key.slice(keyLength - 2) === '[]') {\n isArray = true;\n key = key.slice(0, keyLength - 2);\n if (!queryParams[key]) {\n queryParams[key] = [];\n }\n }\n value = pair[1] ? decodeQueryParamPart(pair[1]) : '';\n }\n if (isArray) {\n queryParams[key].push(value);\n } else {\n queryParams[key] = value;\n }\n }\n return queryParams;\n },\n\n recognize: function (path) {\n var states = [this.rootState],\n pathLen,\n i,\n l,\n queryStart,\n queryParams = {},\n isSlashDropped = false;\n\n queryStart = path.indexOf('?');\n if (queryStart !== -1) {\n var queryString = path.substr(queryStart + 1, path.length);\n path = path.substr(0, queryStart);\n queryParams = this.parseQueryString(queryString);\n }\n\n path = decodeURI(path);\n\n // DEBUG GROUP path\n\n if (path.charAt(0) !== \"/\") {\n path = \"/\" + path;\n }\n\n pathLen = path.length;\n if (pathLen > 1 && path.charAt(pathLen - 1) === \"/\") {\n path = path.substr(0, pathLen - 1);\n isSlashDropped = true;\n }\n\n for (i = 0, l = path.length; i < l; i++) {\n states = recognizeChar(states, path.charAt(i));\n if (!states.length) {\n break;\n }\n }\n\n // END DEBUG GROUP\n\n var solutions = [];\n for (i = 0, l = states.length; i < l; i++) {\n if (states[i].handlers) {\n solutions.push(states[i]);\n }\n }\n\n states = sortSolutions(solutions);\n\n var state = solutions[0];\n\n if (state && state.handlers) {\n // if a trailing slash was dropped and a star segment is the last segment\n // specified, put the trailing slash back\n if (isSlashDropped && state.regex.source.slice(-5) === \"(.+)$\") {\n path = path + \"/\";\n }\n return findHandler(state, path, queryParams);\n }\n }\n };\n\n RouteRecognizer.prototype.map = _routeRecognizerDsl.default;\n\n RouteRecognizer.VERSION = '0.1.5';\n\n exports.default = RouteRecognizer;\n});\nenifed('router/handler-info/factory', ['exports', 'router/handler-info/resolved-handler-info', 'router/handler-info/unresolved-handler-info-by-object', 'router/handler-info/unresolved-handler-info-by-param'], function (exports, _routerHandlerInfoResolvedHandlerInfo, _routerHandlerInfoUnresolvedHandlerInfoByObject, _routerHandlerInfoUnresolvedHandlerInfoByParam) {\n 'use strict';\n\n handlerInfoFactory.klasses = {\n resolved: _routerHandlerInfoResolvedHandlerInfo.default,\n param: _routerHandlerInfoUnresolvedHandlerInfoByParam.default,\n object: _routerHandlerInfoUnresolvedHandlerInfoByObject.default\n };\n\n function handlerInfoFactory(name, props) {\n var Ctor = handlerInfoFactory.klasses[name],\n handlerInfo = new Ctor(props || {});\n handlerInfo.factory = handlerInfoFactory;\n return handlerInfo;\n }\n\n exports.default = handlerInfoFactory;\n});\nenifed('router/handler-info/resolved-handler-info', ['exports', 'router/handler-info', 'router/utils', 'rsvp/promise'], function (exports, _routerHandlerInfo, _routerUtils, _rsvpPromise) {\n 'use strict';\n\n var ResolvedHandlerInfo = _routerUtils.subclass(_routerHandlerInfo.default, {\n resolve: function (shouldContinue, payload) {\n // A ResolvedHandlerInfo just resolved with itself.\n if (payload && payload.resolvedModels) {\n payload.resolvedModels[this.name] = this.context;\n }\n return _rsvpPromise.default.resolve(this, this.promiseLabel(\"Resolve\"));\n },\n\n getUnresolved: function () {\n return this.factory('param', {\n name: this.name,\n handler: this.handler,\n params: this.params\n });\n },\n\n isResolved: true\n });\n\n exports.default = ResolvedHandlerInfo;\n});\nenifed('router/handler-info/unresolved-handler-info-by-object', ['exports', 'router/handler-info', 'router/utils', 'rsvp/promise'], function (exports, _routerHandlerInfo, _routerUtils, _rsvpPromise) {\n 'use strict';\n\n var UnresolvedHandlerInfoByObject = _routerUtils.subclass(_routerHandlerInfo.default, {\n getModel: function (payload) {\n this.log(payload, this.name + \": resolving provided model\");\n return _rsvpPromise.default.resolve(this.context);\n },\n\n initialize: function (props) {\n this.names = props.names || [];\n this.context = props.context;\n },\n\n /**\n @private\n Serializes a handler using its custom `serialize` method or\n by a default that looks up the expected property name from\n the dynamic segment.\n @param {Object} model the model to be serialized for this handler\n */\n serialize: function (_model) {\n var model = _model || this.context,\n names = this.names,\n handler = this.handler;\n\n var object = {};\n if (_routerUtils.isParam(model)) {\n object[names[0]] = model;\n return object;\n }\n\n // Use custom serialize if it exists.\n if (handler.serialize) {\n return handler.serialize(model, names);\n }\n\n if (names.length !== 1) {\n return;\n }\n\n var name = names[0];\n\n if (/_id$/.test(name)) {\n object[name] = model.id;\n } else {\n object[name] = model;\n }\n return object;\n }\n });\n\n exports.default = UnresolvedHandlerInfoByObject;\n});\nenifed('router/handler-info/unresolved-handler-info-by-param', ['exports', 'router/handler-info', 'router/utils'], function (exports, _routerHandlerInfo, _routerUtils) {\n 'use strict';\n\n // Generated by URL transitions and non-dynamic route segments in named Transitions.\n var UnresolvedHandlerInfoByParam = _routerUtils.subclass(_routerHandlerInfo.default, {\n initialize: function (props) {\n this.params = props.params || {};\n },\n\n getModel: function (payload) {\n var fullParams = this.params;\n if (payload && payload.queryParams) {\n fullParams = {};\n _routerUtils.merge(fullParams, this.params);\n fullParams.queryParams = payload.queryParams;\n }\n\n var handler = this.handler;\n var hookName = _routerUtils.resolveHook(handler, 'deserialize') || _routerUtils.resolveHook(handler, 'model');\n\n return this.runSharedModelHook(payload, hookName, [fullParams]);\n }\n });\n\n exports.default = UnresolvedHandlerInfoByParam;\n});\nenifed('router/handler-info', ['exports', 'router/utils', 'rsvp/promise'], function (exports, _routerUtils, _rsvpPromise) {\n 'use strict';\n\n function HandlerInfo(_props) {\n var props = _props || {};\n _routerUtils.merge(this, props);\n this.initialize(props);\n }\n\n HandlerInfo.prototype = {\n name: null,\n handler: null,\n params: null,\n context: null,\n\n // Injected by the handler info factory.\n factory: null,\n\n initialize: function () {},\n\n log: function (payload, message) {\n if (payload.log) {\n payload.log(this.name + ': ' + message);\n }\n },\n\n promiseLabel: function (label) {\n return _routerUtils.promiseLabel(\"'\" + this.name + \"' \" + label);\n },\n\n getUnresolved: function () {\n return this;\n },\n\n serialize: function () {\n return this.params || {};\n },\n\n resolve: function (shouldContinue, payload) {\n var checkForAbort = _routerUtils.bind(this, this.checkForAbort, shouldContinue),\n beforeModel = _routerUtils.bind(this, this.runBeforeModelHook, payload),\n model = _routerUtils.bind(this, this.getModel, payload),\n afterModel = _routerUtils.bind(this, this.runAfterModelHook, payload),\n becomeResolved = _routerUtils.bind(this, this.becomeResolved, payload);\n\n return _rsvpPromise.default.resolve(undefined, this.promiseLabel(\"Start handler\")).then(checkForAbort, null, this.promiseLabel(\"Check for abort\")).then(beforeModel, null, this.promiseLabel(\"Before model\")).then(checkForAbort, null, this.promiseLabel(\"Check if aborted during 'beforeModel' hook\")).then(model, null, this.promiseLabel(\"Model\")).then(checkForAbort, null, this.promiseLabel(\"Check if aborted in 'model' hook\")).then(afterModel, null, this.promiseLabel(\"After model\")).then(checkForAbort, null, this.promiseLabel(\"Check if aborted in 'afterModel' hook\")).then(becomeResolved, null, this.promiseLabel(\"Become resolved\"));\n },\n\n runBeforeModelHook: function (payload) {\n if (payload.trigger) {\n payload.trigger(true, 'willResolveModel', payload, this.handler);\n }\n return this.runSharedModelHook(payload, 'beforeModel', []);\n },\n\n runAfterModelHook: function (payload, resolvedModel) {\n // Stash the resolved model on the payload.\n // This makes it possible for users to swap out\n // the resolved model in afterModel.\n var name = this.name;\n this.stashResolvedModel(payload, resolvedModel);\n\n return this.runSharedModelHook(payload, 'afterModel', [resolvedModel]).then(function () {\n // Ignore the fulfilled value returned from afterModel.\n // Return the value stashed in resolvedModels, which\n // might have been swapped out in afterModel.\n return payload.resolvedModels[name];\n }, null, this.promiseLabel(\"Ignore fulfillment value and return model value\"));\n },\n\n runSharedModelHook: function (payload, hookName, args) {\n this.log(payload, \"calling \" + hookName + \" hook\");\n\n if (this.queryParams) {\n args.push(this.queryParams);\n }\n args.push(payload);\n\n var result = _routerUtils.applyHook(this.handler, hookName, args);\n\n if (result && result.isTransition) {\n result = null;\n }\n\n return _rsvpPromise.default.resolve(result, this.promiseLabel(\"Resolve value returned from one of the model hooks\"));\n },\n\n // overridden by subclasses\n getModel: null,\n\n checkForAbort: function (shouldContinue, promiseValue) {\n return _rsvpPromise.default.resolve(shouldContinue(), this.promiseLabel(\"Check for abort\")).then(function () {\n // We don't care about shouldContinue's resolve value;\n // pass along the original value passed to this fn.\n return promiseValue;\n }, null, this.promiseLabel(\"Ignore fulfillment value and continue\"));\n },\n\n stashResolvedModel: function (payload, resolvedModel) {\n payload.resolvedModels = payload.resolvedModels || {};\n payload.resolvedModels[this.name] = resolvedModel;\n },\n\n becomeResolved: function (payload, resolvedContext) {\n var params = this.serialize(resolvedContext);\n\n if (payload) {\n this.stashResolvedModel(payload, resolvedContext);\n payload.params = payload.params || {};\n payload.params[this.name] = params;\n }\n\n return this.factory('resolved', {\n context: resolvedContext,\n name: this.name,\n handler: this.handler,\n params: params\n });\n },\n\n shouldSupercede: function (other) {\n // Prefer this newer handlerInfo over `other` if:\n // 1) The other one doesn't exist\n // 2) The names don't match\n // 3) This handler has a context that doesn't match\n // the other one (or the other one doesn't have one).\n // 4) This handler has parameters that don't match the other.\n if (!other) {\n return true;\n }\n\n var contextsMatch = other.context === this.context;\n return other.name !== this.name || this.hasOwnProperty('context') && !contextsMatch || this.hasOwnProperty('params') && !paramsMatch(this.params, other.params);\n }\n };\n\n function paramsMatch(a, b) {\n if (!a ^ !b) {\n // Only one is null.\n return false;\n }\n\n if (!a) {\n // Both must be null.\n return true;\n }\n\n // Note: this assumes that both params have the same\n // number of keys, but since we're comparing the\n // same handlers, they should.\n for (var k in a) {\n if (a.hasOwnProperty(k) && a[k] !== b[k]) {\n return false;\n }\n }\n return true;\n }\n\n exports.default = HandlerInfo;\n});\nenifed('router/router', ['exports', 'route-recognizer', 'rsvp/promise', 'router/utils', 'router/transition-state', 'router/transition', 'router/transition-intent/named-transition-intent', 'router/transition-intent/url-transition-intent', 'router/handler-info'], function (exports, _routeRecognizer, _rsvpPromise, _routerUtils, _routerTransitionState, _routerTransition, _routerTransitionIntentNamedTransitionIntent, _routerTransitionIntentUrlTransitionIntent, _routerHandlerInfo) {\n 'use strict';\n\n var pop = Array.prototype.pop;\n\n function Router(_options) {\n var options = _options || {};\n this.getHandler = options.getHandler || this.getHandler;\n this.updateURL = options.updateURL || this.updateURL;\n this.replaceURL = options.replaceURL || this.replaceURL;\n this.didTransition = options.didTransition || this.didTransition;\n this.willTransition = options.willTransition || this.willTransition;\n this.delegate = options.delegate || this.delegate;\n this.triggerEvent = options.triggerEvent || this.triggerEvent;\n this.log = options.log || this.log;\n\n this.recognizer = new _routeRecognizer.default();\n this.reset();\n }\n\n function getTransitionByIntent(intent, isIntermediate) {\n var wasTransitioning = !!this.activeTransition;\n var oldState = wasTransitioning ? this.activeTransition.state : this.state;\n var newTransition;\n\n var newState = intent.applyToState(oldState, this.recognizer, this.getHandler, isIntermediate);\n var queryParamChangelist = _routerUtils.getChangelist(oldState.queryParams, newState.queryParams);\n\n if (handlerInfosEqual(newState.handlerInfos, oldState.handlerInfos)) {\n\n // This is a no-op transition. See if query params changed.\n if (queryParamChangelist) {\n newTransition = this.queryParamsTransition(queryParamChangelist, wasTransitioning, oldState, newState);\n if (newTransition) {\n return newTransition;\n }\n }\n\n // No-op. No need to create a new transition.\n return this.activeTransition || new _routerTransition.Transition(this);\n }\n\n if (isIntermediate) {\n setupContexts(this, newState);\n return;\n }\n\n // Create a new transition to the destination route.\n newTransition = new _routerTransition.Transition(this, intent, newState);\n\n // Abort and usurp any previously active transition.\n if (this.activeTransition) {\n this.activeTransition.abort();\n }\n this.activeTransition = newTransition;\n\n // Transition promises by default resolve with resolved state.\n // For our purposes, swap out the promise to resolve\n // after the transition has been finalized.\n newTransition.promise = newTransition.promise.then(function (result) {\n return finalizeTransition(newTransition, result.state);\n }, null, _routerUtils.promiseLabel(\"Settle transition promise when transition is finalized\"));\n\n if (!wasTransitioning) {\n notifyExistingHandlers(this, newState, newTransition);\n }\n\n fireQueryParamDidChange(this, newState, queryParamChangelist);\n\n return newTransition;\n }\n\n Router.prototype = {\n\n /**\n The main entry point into the router. The API is essentially\n the same as the `map` method in `route-recognizer`.\n This method extracts the String handler at the last `.to()`\n call and uses it as the name of the whole route.\n @param {Function} callback\n */\n map: function (callback) {\n this.recognizer.delegate = this.delegate;\n\n this.recognizer.map(callback, function (recognizer, routes) {\n for (var i = routes.length - 1, proceed = true; i >= 0 && proceed; --i) {\n var route = routes[i];\n recognizer.add(routes, { as: route.handler });\n proceed = route.path === '/' || route.path === '' || route.handler.slice(-6) === '.index';\n }\n });\n },\n\n hasRoute: function (route) {\n return this.recognizer.hasRoute(route);\n },\n\n getHandler: function () {},\n\n queryParamsTransition: function (changelist, wasTransitioning, oldState, newState) {\n var router = this;\n\n fireQueryParamDidChange(this, newState, changelist);\n\n if (!wasTransitioning && this.activeTransition) {\n // One of the handlers in queryParamsDidChange\n // caused a transition. Just return that transition.\n return this.activeTransition;\n } else {\n // Running queryParamsDidChange didn't change anything.\n // Just update query params and be on our way.\n\n // We have to return a noop transition that will\n // perform a URL update at the end. This gives\n // the user the ability to set the url update\n // method (default is replaceState).\n var newTransition = new _routerTransition.Transition(this);\n newTransition.queryParamsOnly = true;\n\n oldState.queryParams = finalizeQueryParamChange(this, newState.handlerInfos, newState.queryParams, newTransition);\n\n newTransition.promise = newTransition.promise.then(function (result) {\n updateURL(newTransition, oldState, true);\n if (router.didTransition) {\n router.didTransition(router.currentHandlerInfos);\n }\n return result;\n }, null, _routerUtils.promiseLabel(\"Transition complete\"));\n return newTransition;\n }\n },\n\n // NOTE: this doesn't really belong here, but here\n // it shall remain until our ES6 transpiler can\n // handle cyclical deps.\n transitionByIntent: function (intent, isIntermediate) {\n try {\n return getTransitionByIntent.apply(this, arguments);\n } catch (e) {\n return new _routerTransition.Transition(this, intent, null, e);\n }\n },\n\n /**\n Clears the current and target route handlers and triggers exit\n on each of them starting at the leaf and traversing up through\n its ancestors.\n */\n reset: function () {\n if (this.state) {\n _routerUtils.forEach(this.state.handlerInfos.slice().reverse(), function (handlerInfo) {\n var handler = handlerInfo.handler;\n _routerUtils.callHook(handler, 'exit');\n });\n }\n\n this.state = new _routerTransitionState.default();\n this.currentHandlerInfos = null;\n },\n\n activeTransition: null,\n\n /**\n var handler = handlerInfo.handler;\n The entry point for handling a change to the URL (usually\n via the back and forward button).\n Returns an Array of handlers and the parameters associated\n with those parameters.\n @param {String} url a URL to process\n @return {Array} an Array of `[handler, parameter]` tuples\n */\n handleURL: function (url) {\n // Perform a URL-based transition, but don't change\n // the URL afterward, since it already happened.\n var args = _routerUtils.slice.call(arguments);\n if (url.charAt(0) !== '/') {\n args[0] = '/' + url;\n }\n\n return doTransition(this, args).method(null);\n },\n\n /**\n Hook point for updating the URL.\n @param {String} url a URL to update to\n */\n updateURL: function () {\n throw new Error(\"updateURL is not implemented\");\n },\n\n /**\n Hook point for replacing the current URL, i.e. with replaceState\n By default this behaves the same as `updateURL`\n @param {String} url a URL to update to\n */\n replaceURL: function (url) {\n this.updateURL(url);\n },\n\n /**\n Transition into the specified named route.\n If necessary, trigger the exit callback on any handlers\n that are no longer represented by the target route.\n @param {String} name the name of the route\n */\n transitionTo: function (name) {\n return doTransition(this, arguments);\n },\n\n intermediateTransitionTo: function (name) {\n return doTransition(this, arguments, true);\n },\n\n refresh: function (pivotHandler) {\n var state = this.activeTransition ? this.activeTransition.state : this.state;\n var handlerInfos = state.handlerInfos;\n var params = {};\n for (var i = 0, len = handlerInfos.length; i < len; ++i) {\n var handlerInfo = handlerInfos[i];\n params[handlerInfo.name] = handlerInfo.params || {};\n }\n\n _routerUtils.log(this, \"Starting a refresh transition\");\n var intent = new _routerTransitionIntentNamedTransitionIntent.default({\n name: handlerInfos[handlerInfos.length - 1].name,\n pivotHandler: pivotHandler || handlerInfos[0].handler,\n contexts: [], // TODO collect contexts...?\n queryParams: this._changedQueryParams || state.queryParams || {}\n });\n\n return this.transitionByIntent(intent, false);\n },\n\n /**\n Identical to `transitionTo` except that the current URL will be replaced\n if possible.\n This method is intended primarily for use with `replaceState`.\n @param {String} name the name of the route\n */\n replaceWith: function (name) {\n return doTransition(this, arguments).method('replace');\n },\n\n /**\n Take a named route and context objects and generate a\n URL.\n @param {String} name the name of the route to generate\n a URL for\n @param {...Object} objects a list of objects to serialize\n @return {String} a URL\n */\n generate: function (handlerName) {\n\n var partitionedArgs = _routerUtils.extractQueryParams(_routerUtils.slice.call(arguments, 1)),\n suppliedParams = partitionedArgs[0],\n queryParams = partitionedArgs[1];\n\n // Construct a TransitionIntent with the provided params\n // and apply it to the present state of the router.\n var intent = new _routerTransitionIntentNamedTransitionIntent.default({ name: handlerName, contexts: suppliedParams });\n var state = intent.applyToState(this.state, this.recognizer, this.getHandler);\n var params = {};\n\n for (var i = 0, len = state.handlerInfos.length; i < len; ++i) {\n var handlerInfo = state.handlerInfos[i];\n var handlerParams = handlerInfo.serialize();\n _routerUtils.merge(params, handlerParams);\n }\n params.queryParams = queryParams;\n\n return this.recognizer.generate(handlerName, params);\n },\n\n applyIntent: function (handlerName, contexts) {\n var intent = new _routerTransitionIntentNamedTransitionIntent.default({\n name: handlerName,\n contexts: contexts\n });\n\n var state = this.activeTransition && this.activeTransition.state || this.state;\n return intent.applyToState(state, this.recognizer, this.getHandler);\n },\n\n isActiveIntent: function (handlerName, contexts, queryParams, _state) {\n var state = _state || this.state,\n targetHandlerInfos = state.handlerInfos,\n found = false,\n names,\n object,\n handlerInfo,\n handlerObj,\n i,\n len;\n\n if (!targetHandlerInfos.length) {\n return false;\n }\n\n var targetHandler = targetHandlerInfos[targetHandlerInfos.length - 1].name;\n var recogHandlers = this.recognizer.handlersFor(targetHandler);\n\n var index = 0;\n for (len = recogHandlers.length; index < len; ++index) {\n handlerInfo = targetHandlerInfos[index];\n if (handlerInfo.name === handlerName) {\n break;\n }\n }\n\n if (index === recogHandlers.length) {\n // The provided route name isn't even in the route hierarchy.\n return false;\n }\n\n var testState = new _routerTransitionState.default();\n testState.handlerInfos = targetHandlerInfos.slice(0, index + 1);\n recogHandlers = recogHandlers.slice(0, index + 1);\n\n var intent = new _routerTransitionIntentNamedTransitionIntent.default({\n name: targetHandler,\n contexts: contexts\n });\n\n var newState = intent.applyToHandlers(testState, recogHandlers, this.getHandler, targetHandler, true, true);\n\n var handlersEqual = handlerInfosEqual(newState.handlerInfos, testState.handlerInfos);\n if (!queryParams || !handlersEqual) {\n return handlersEqual;\n }\n\n // Get a hash of QPs that will still be active on new route\n var activeQPsOnNewHandler = {};\n _routerUtils.merge(activeQPsOnNewHandler, queryParams);\n\n var activeQueryParams = state.queryParams;\n for (var key in activeQueryParams) {\n if (activeQueryParams.hasOwnProperty(key) && activeQPsOnNewHandler.hasOwnProperty(key)) {\n activeQPsOnNewHandler[key] = activeQueryParams[key];\n }\n }\n\n return handlersEqual && !_routerUtils.getChangelist(activeQPsOnNewHandler, queryParams);\n },\n\n isActive: function (handlerName) {\n var partitionedArgs = _routerUtils.extractQueryParams(_routerUtils.slice.call(arguments, 1));\n return this.isActiveIntent(handlerName, partitionedArgs[0], partitionedArgs[1]);\n },\n\n trigger: function (name) {\n var args = _routerUtils.slice.call(arguments);\n _routerUtils.trigger(this, this.currentHandlerInfos, false, args);\n },\n\n /**\n Hook point for logging transition status updates.\n @param {String} message The message to log.\n */\n log: null\n };\n\n /**\n @private\n \n Fires queryParamsDidChange event\n */\n function fireQueryParamDidChange(router, newState, queryParamChangelist) {\n // If queryParams changed trigger event\n if (queryParamChangelist) {\n\n // This is a little hacky but we need some way of storing\n // changed query params given that no activeTransition\n // is guaranteed to have occurred.\n router._changedQueryParams = queryParamChangelist.all;\n _routerUtils.trigger(router, newState.handlerInfos, true, ['queryParamsDidChange', queryParamChangelist.changed, queryParamChangelist.all, queryParamChangelist.removed]);\n router._changedQueryParams = null;\n }\n }\n\n /**\n @private\n \n Takes an Array of `HandlerInfo`s, figures out which ones are\n exiting, entering, or changing contexts, and calls the\n proper handler hooks.\n \n For example, consider the following tree of handlers. Each handler is\n followed by the URL segment it handles.\n \n ```\n |~index (\"/\")\n | |~posts (\"/posts\")\n | | |-showPost (\"/:id\")\n | | |-newPost (\"/new\")\n | | |-editPost (\"/edit\")\n | |~about (\"/about/:id\")\n ```\n \n Consider the following transitions:\n \n 1. A URL transition to `/posts/1`.\n 1. Triggers the `*model` callbacks on the\n `index`, `posts`, and `showPost` handlers\n 2. Triggers the `enter` callback on the same\n 3. Triggers the `setup` callback on the same\n 2. A direct transition to `newPost`\n 1. Triggers the `exit` callback on `showPost`\n 2. Triggers the `enter` callback on `newPost`\n 3. Triggers the `setup` callback on `newPost`\n 3. A direct transition to `about` with a specified\n context object\n 1. Triggers the `exit` callback on `newPost`\n and `posts`\n 2. Triggers the `serialize` callback on `about`\n 3. Triggers the `enter` callback on `about`\n 4. Triggers the `setup` callback on `about`\n \n @param {Router} transition\n @param {TransitionState} newState\n */\n function setupContexts(router, newState, transition) {\n var partition = partitionHandlers(router.state, newState);\n var i, l, handler;\n\n for (i = 0, l = partition.exited.length; i < l; i++) {\n handler = partition.exited[i].handler;\n delete handler.context;\n\n _routerUtils.callHook(handler, 'reset', true, transition);\n _routerUtils.callHook(handler, 'exit', transition);\n }\n\n var oldState = router.oldState = router.state;\n router.state = newState;\n var currentHandlerInfos = router.currentHandlerInfos = partition.unchanged.slice();\n\n try {\n for (i = 0, l = partition.reset.length; i < l; i++) {\n handler = partition.reset[i].handler;\n _routerUtils.callHook(handler, 'reset', false, transition);\n }\n\n for (i = 0, l = partition.updatedContext.length; i < l; i++) {\n handlerEnteredOrUpdated(currentHandlerInfos, partition.updatedContext[i], false, transition);\n }\n\n for (i = 0, l = partition.entered.length; i < l; i++) {\n handlerEnteredOrUpdated(currentHandlerInfos, partition.entered[i], true, transition);\n }\n } catch (e) {\n router.state = oldState;\n router.currentHandlerInfos = oldState.handlerInfos;\n throw e;\n }\n\n router.state.queryParams = finalizeQueryParamChange(router, currentHandlerInfos, newState.queryParams, transition);\n }\n\n /**\n @private\n \n Helper method used by setupContexts. Handles errors or redirects\n that may happen in enter/setup.\n */\n function handlerEnteredOrUpdated(currentHandlerInfos, handlerInfo, enter, transition) {\n\n var handler = handlerInfo.handler,\n context = handlerInfo.context;\n\n if (enter) {\n _routerUtils.callHook(handler, 'enter', transition);\n }\n if (transition && transition.isAborted) {\n throw new _routerTransition.TransitionAborted();\n }\n\n handler.context = context;\n _routerUtils.callHook(handler, 'contextDidChange');\n\n _routerUtils.callHook(handler, 'setup', context, transition);\n if (transition && transition.isAborted) {\n throw new _routerTransition.TransitionAborted();\n }\n\n currentHandlerInfos.push(handlerInfo);\n\n return true;\n }\n\n /**\n @private\n \n This function is called when transitioning from one URL to\n another to determine which handlers are no longer active,\n which handlers are newly active, and which handlers remain\n active but have their context changed.\n \n Take a list of old handlers and new handlers and partition\n them into four buckets:\n \n * unchanged: the handler was active in both the old and\n new URL, and its context remains the same\n * updated context: the handler was active in both the\n old and new URL, but its context changed. The handler's\n `setup` method, if any, will be called with the new\n context.\n * exited: the handler was active in the old URL, but is\n no longer active.\n * entered: the handler was not active in the old URL, but\n is now active.\n \n The PartitionedHandlers structure has four fields:\n \n * `updatedContext`: a list of `HandlerInfo` objects that\n represent handlers that remain active but have a changed\n context\n * `entered`: a list of `HandlerInfo` objects that represent\n handlers that are newly active\n * `exited`: a list of `HandlerInfo` objects that are no\n longer active.\n * `unchanged`: a list of `HanderInfo` objects that remain active.\n \n @param {Array[HandlerInfo]} oldHandlers a list of the handler\n information for the previous URL (or `[]` if this is the\n first handled transition)\n @param {Array[HandlerInfo]} newHandlers a list of the handler\n information for the new URL\n \n @return {Partition}\n */\n function partitionHandlers(oldState, newState) {\n var oldHandlers = oldState.handlerInfos;\n var newHandlers = newState.handlerInfos;\n\n var handlers = {\n updatedContext: [],\n exited: [],\n entered: [],\n unchanged: []\n };\n\n var handlerChanged,\n contextChanged = false,\n i,\n l;\n\n for (i = 0, l = newHandlers.length; i < l; i++) {\n var oldHandler = oldHandlers[i],\n newHandler = newHandlers[i];\n\n if (!oldHandler || oldHandler.handler !== newHandler.handler) {\n handlerChanged = true;\n }\n\n if (handlerChanged) {\n handlers.entered.push(newHandler);\n if (oldHandler) {\n handlers.exited.unshift(oldHandler);\n }\n } else if (contextChanged || oldHandler.context !== newHandler.context) {\n contextChanged = true;\n handlers.updatedContext.push(newHandler);\n } else {\n handlers.unchanged.push(oldHandler);\n }\n }\n\n for (i = newHandlers.length, l = oldHandlers.length; i < l; i++) {\n handlers.exited.unshift(oldHandlers[i]);\n }\n\n handlers.reset = handlers.updatedContext.slice();\n handlers.reset.reverse();\n\n return handlers;\n }\n\n function updateURL(transition, state, inputUrl) {\n var urlMethod = transition.urlMethod;\n\n if (!urlMethod) {\n return;\n }\n\n var router = transition.router,\n handlerInfos = state.handlerInfos,\n handlerName = handlerInfos[handlerInfos.length - 1].name,\n params = {};\n\n for (var i = handlerInfos.length - 1; i >= 0; --i) {\n var handlerInfo = handlerInfos[i];\n _routerUtils.merge(params, handlerInfo.params);\n if (handlerInfo.handler.inaccessibleByURL) {\n urlMethod = null;\n }\n }\n\n if (urlMethod) {\n params.queryParams = transition._visibleQueryParams || state.queryParams;\n var url = router.recognizer.generate(handlerName, params);\n\n if (urlMethod === 'replace') {\n router.replaceURL(url);\n } else {\n router.updateURL(url);\n }\n }\n }\n\n /**\n @private\n \n Updates the URL (if necessary) and calls `setupContexts`\n to update the router's array of `currentHandlerInfos`.\n */\n function finalizeTransition(transition, newState) {\n\n try {\n _routerUtils.log(transition.router, transition.sequence, \"Resolved all models on destination route; finalizing transition.\");\n\n var router = transition.router,\n handlerInfos = newState.handlerInfos,\n seq = transition.sequence;\n\n // Run all the necessary enter/setup/exit hooks\n setupContexts(router, newState, transition);\n\n // Check if a redirect occurred in enter/setup\n if (transition.isAborted) {\n // TODO: cleaner way? distinguish b/w targetHandlerInfos?\n router.state.handlerInfos = router.currentHandlerInfos;\n return _rsvpPromise.default.reject(_routerTransition.logAbort(transition));\n }\n\n updateURL(transition, newState, transition.intent.url);\n\n transition.isActive = false;\n router.activeTransition = null;\n\n _routerUtils.trigger(router, router.currentHandlerInfos, true, ['didTransition']);\n\n if (router.didTransition) {\n router.didTransition(router.currentHandlerInfos);\n }\n\n _routerUtils.log(router, transition.sequence, \"TRANSITION COMPLETE.\");\n\n // Resolve with the final handler.\n return handlerInfos[handlerInfos.length - 1].handler;\n } catch (e) {\n if (!(e instanceof _routerTransition.TransitionAborted)) {\n //var erroneousHandler = handlerInfos.pop();\n var infos = transition.state.handlerInfos;\n transition.trigger(true, 'error', e, transition, infos[infos.length - 1].handler);\n transition.abort();\n }\n\n throw e;\n }\n }\n\n /**\n @private\n \n Begins and returns a Transition based on the provided\n arguments. Accepts arguments in the form of both URL\n transitions and named transitions.\n \n @param {Router} router\n @param {Array[Object]} args arguments passed to transitionTo,\n replaceWith, or handleURL\n */\n function doTransition(router, args, isIntermediate) {\n // Normalize blank transitions to root URL transitions.\n var name = args[0] || '/';\n\n var lastArg = args[args.length - 1];\n var queryParams = {};\n if (lastArg && lastArg.hasOwnProperty('queryParams')) {\n queryParams = pop.call(args).queryParams;\n }\n\n var intent;\n if (args.length === 0) {\n\n _routerUtils.log(router, \"Updating query params\");\n\n // A query param update is really just a transition\n // into the route you're already on.\n var handlerInfos = router.state.handlerInfos;\n intent = new _routerTransitionIntentNamedTransitionIntent.default({\n name: handlerInfos[handlerInfos.length - 1].name,\n contexts: [],\n queryParams: queryParams\n });\n } else if (name.charAt(0) === '/') {\n\n _routerUtils.log(router, \"Attempting URL transition to \" + name);\n intent = new _routerTransitionIntentUrlTransitionIntent.default({ url: name });\n } else {\n\n _routerUtils.log(router, \"Attempting transition to \" + name);\n intent = new _routerTransitionIntentNamedTransitionIntent.default({\n name: args[0],\n contexts: _routerUtils.slice.call(args, 1),\n queryParams: queryParams\n });\n }\n\n return router.transitionByIntent(intent, isIntermediate);\n }\n\n function handlerInfosEqual(handlerInfos, otherHandlerInfos) {\n if (handlerInfos.length !== otherHandlerInfos.length) {\n return false;\n }\n\n for (var i = 0, len = handlerInfos.length; i < len; ++i) {\n if (handlerInfos[i] !== otherHandlerInfos[i]) {\n return false;\n }\n }\n return true;\n }\n\n function finalizeQueryParamChange(router, resolvedHandlers, newQueryParams, transition) {\n // We fire a finalizeQueryParamChange event which\n // gives the new route hierarchy a chance to tell\n // us which query params it's consuming and what\n // their final values are. If a query param is\n // no longer consumed in the final route hierarchy,\n // its serialized segment will be removed\n // from the URL.\n\n for (var k in newQueryParams) {\n if (newQueryParams.hasOwnProperty(k) && newQueryParams[k] === null) {\n delete newQueryParams[k];\n }\n }\n\n var finalQueryParamsArray = [];\n _routerUtils.trigger(router, resolvedHandlers, true, ['finalizeQueryParamChange', newQueryParams, finalQueryParamsArray, transition]);\n\n if (transition) {\n transition._visibleQueryParams = {};\n }\n\n var finalQueryParams = {};\n for (var i = 0, len = finalQueryParamsArray.length; i < len; ++i) {\n var qp = finalQueryParamsArray[i];\n finalQueryParams[qp.key] = qp.value;\n if (transition && qp.visible !== false) {\n transition._visibleQueryParams[qp.key] = qp.value;\n }\n }\n return finalQueryParams;\n }\n\n function notifyExistingHandlers(router, newState, newTransition) {\n var oldHandlers = router.state.handlerInfos,\n changing = [],\n leavingIndex = null,\n leaving,\n leavingChecker,\n i,\n oldHandlerLen,\n oldHandler,\n newHandler;\n\n oldHandlerLen = oldHandlers.length;\n for (i = 0; i < oldHandlerLen; i++) {\n oldHandler = oldHandlers[i];\n newHandler = newState.handlerInfos[i];\n\n if (!newHandler || oldHandler.name !== newHandler.name) {\n leavingIndex = i;\n break;\n }\n\n if (!newHandler.isResolved) {\n changing.push(oldHandler);\n }\n }\n\n if (leavingIndex !== null) {\n leaving = oldHandlers.slice(leavingIndex, oldHandlerLen);\n leavingChecker = function (name) {\n for (var h = 0, len = leaving.length; h < len; h++) {\n if (leaving[h].name === name) {\n return true;\n }\n }\n return false;\n };\n }\n\n _routerUtils.trigger(router, oldHandlers, true, ['willTransition', newTransition]);\n\n if (router.willTransition) {\n router.willTransition(oldHandlers, newState.handlerInfos, newTransition);\n }\n }\n\n exports.default = Router;\n});\nenifed('router/transition-intent/named-transition-intent', ['exports', 'router/transition-intent', 'router/transition-state', 'router/handler-info/factory', 'router/utils'], function (exports, _routerTransitionIntent, _routerTransitionState, _routerHandlerInfoFactory, _routerUtils) {\n 'use strict';\n\n exports.default = _routerUtils.subclass(_routerTransitionIntent.default, {\n name: null,\n pivotHandler: null,\n contexts: null,\n queryParams: null,\n\n initialize: function (props) {\n this.name = props.name;\n this.pivotHandler = props.pivotHandler;\n this.contexts = props.contexts || [];\n this.queryParams = props.queryParams;\n },\n\n applyToState: function (oldState, recognizer, getHandler, isIntermediate) {\n\n var partitionedArgs = _routerUtils.extractQueryParams([this.name].concat(this.contexts)),\n pureArgs = partitionedArgs[0],\n queryParams = partitionedArgs[1],\n handlers = recognizer.handlersFor(pureArgs[0]);\n\n var targetRouteName = handlers[handlers.length - 1].handler;\n\n return this.applyToHandlers(oldState, handlers, getHandler, targetRouteName, isIntermediate);\n },\n\n applyToHandlers: function (oldState, handlers, getHandler, targetRouteName, isIntermediate, checkingIfActive) {\n\n var i, len;\n var newState = new _routerTransitionState.default();\n var objects = this.contexts.slice(0);\n\n var invalidateIndex = handlers.length;\n\n // Pivot handlers are provided for refresh transitions\n if (this.pivotHandler) {\n for (i = 0, len = handlers.length; i < len; ++i) {\n if (getHandler(handlers[i].handler) === this.pivotHandler) {\n invalidateIndex = i;\n break;\n }\n }\n }\n\n var pivotHandlerFound = !this.pivotHandler;\n\n for (i = handlers.length - 1; i >= 0; --i) {\n var result = handlers[i];\n var name = result.handler;\n var handler = getHandler(name);\n\n var oldHandlerInfo = oldState.handlerInfos[i];\n var newHandlerInfo = null;\n\n if (result.names.length > 0) {\n if (i >= invalidateIndex) {\n newHandlerInfo = this.createParamHandlerInfo(name, handler, result.names, objects, oldHandlerInfo);\n } else {\n newHandlerInfo = this.getHandlerInfoForDynamicSegment(name, handler, result.names, objects, oldHandlerInfo, targetRouteName, i);\n }\n } else {\n // This route has no dynamic segment.\n // Therefore treat as a param-based handlerInfo\n // with empty params. This will cause the `model`\n // hook to be called with empty params, which is desirable.\n newHandlerInfo = this.createParamHandlerInfo(name, handler, result.names, objects, oldHandlerInfo);\n }\n\n if (checkingIfActive) {\n // If we're performing an isActive check, we want to\n // serialize URL params with the provided context, but\n // ignore mismatches between old and new context.\n newHandlerInfo = newHandlerInfo.becomeResolved(null, newHandlerInfo.context);\n var oldContext = oldHandlerInfo && oldHandlerInfo.context;\n if (result.names.length > 0 && newHandlerInfo.context === oldContext) {\n // If contexts match in isActive test, assume params also match.\n // This allows for flexibility in not requiring that every last\n // handler provide a `serialize` method\n newHandlerInfo.params = oldHandlerInfo && oldHandlerInfo.params;\n }\n newHandlerInfo.context = oldContext;\n }\n\n var handlerToUse = oldHandlerInfo;\n if (i >= invalidateIndex || newHandlerInfo.shouldSupercede(oldHandlerInfo)) {\n invalidateIndex = Math.min(i, invalidateIndex);\n handlerToUse = newHandlerInfo;\n }\n\n if (isIntermediate && !checkingIfActive) {\n handlerToUse = handlerToUse.becomeResolved(null, handlerToUse.context);\n }\n\n newState.handlerInfos.unshift(handlerToUse);\n }\n\n if (objects.length > 0) {\n throw new Error(\"More context objects were passed than there are dynamic segments for the route: \" + targetRouteName);\n }\n\n if (!isIntermediate) {\n this.invalidateChildren(newState.handlerInfos, invalidateIndex);\n }\n\n _routerUtils.merge(newState.queryParams, this.queryParams || {});\n\n return newState;\n },\n\n invalidateChildren: function (handlerInfos, invalidateIndex) {\n for (var i = invalidateIndex, l = handlerInfos.length; i < l; ++i) {\n var handlerInfo = handlerInfos[i];\n handlerInfos[i] = handlerInfos[i].getUnresolved();\n }\n },\n\n getHandlerInfoForDynamicSegment: function (name, handler, names, objects, oldHandlerInfo, targetRouteName, i) {\n\n var numNames = names.length;\n var objectToUse;\n if (objects.length > 0) {\n\n // Use the objects provided for this transition.\n objectToUse = objects[objects.length - 1];\n if (_routerUtils.isParam(objectToUse)) {\n return this.createParamHandlerInfo(name, handler, names, objects, oldHandlerInfo);\n } else {\n objects.pop();\n }\n } else if (oldHandlerInfo && oldHandlerInfo.name === name) {\n // Reuse the matching oldHandlerInfo\n return oldHandlerInfo;\n } else {\n if (this.preTransitionState) {\n var preTransitionHandlerInfo = this.preTransitionState.handlerInfos[i];\n objectToUse = preTransitionHandlerInfo && preTransitionHandlerInfo.context;\n } else {\n // Ideally we should throw this error to provide maximal\n // information to the user that not enough context objects\n // were provided, but this proves too cumbersome in Ember\n // in cases where inner template helpers are evaluated\n // before parent helpers un-render, in which cases this\n // error somewhat prematurely fires.\n //throw new Error(\"Not enough context objects were provided to complete a transition to \" + targetRouteName + \". Specifically, the \" + name + \" route needs an object that can be serialized into its dynamic URL segments [\" + names.join(', ') + \"]\");\n return oldHandlerInfo;\n }\n }\n\n return _routerHandlerInfoFactory.default('object', {\n name: name,\n handler: handler,\n context: objectToUse,\n names: names\n });\n },\n\n createParamHandlerInfo: function (name, handler, names, objects, oldHandlerInfo) {\n var params = {};\n\n // Soak up all the provided string/numbers\n var numNames = names.length;\n while (numNames--) {\n\n // Only use old params if the names match with the new handler\n var oldParams = oldHandlerInfo && name === oldHandlerInfo.name && oldHandlerInfo.params || {};\n\n var peek = objects[objects.length - 1];\n var paramName = names[numNames];\n if (_routerUtils.isParam(peek)) {\n params[paramName] = \"\" + objects.pop();\n } else {\n // If we're here, this means only some of the params\n // were string/number params, so try and use a param\n // value from a previous handler.\n if (oldParams.hasOwnProperty(paramName)) {\n params[paramName] = oldParams[paramName];\n } else {\n throw new Error(\"You didn't provide enough string/numeric parameters to satisfy all of the dynamic segments for route \" + name);\n }\n }\n }\n\n return _routerHandlerInfoFactory.default('param', {\n name: name,\n handler: handler,\n params: params\n });\n }\n });\n});\nenifed('router/transition-intent/url-transition-intent', ['exports', 'router/transition-intent', 'router/transition-state', 'router/handler-info/factory', 'router/utils', 'router/unrecognized-url-error'], function (exports, _routerTransitionIntent, _routerTransitionState, _routerHandlerInfoFactory, _routerUtils, _routerUnrecognizedUrlError) {\n 'use strict';\n\n exports.default = _routerUtils.subclass(_routerTransitionIntent.default, {\n url: null,\n\n initialize: function (props) {\n this.url = props.url;\n },\n\n applyToState: function (oldState, recognizer, getHandler) {\n var newState = new _routerTransitionState.default();\n\n var results = recognizer.recognize(this.url),\n queryParams = {},\n i,\n len;\n\n if (!results) {\n throw new _routerUnrecognizedUrlError.default(this.url);\n }\n\n var statesDiffer = false;\n\n for (i = 0, len = results.length; i < len; ++i) {\n var result = results[i];\n var name = result.handler;\n var handler = getHandler(name);\n\n if (handler.inaccessibleByURL) {\n throw new _routerUnrecognizedUrlError.default(this.url);\n }\n\n var newHandlerInfo = _routerHandlerInfoFactory.default('param', {\n name: name,\n handler: handler,\n params: result.params\n });\n\n var oldHandlerInfo = oldState.handlerInfos[i];\n if (statesDiffer || newHandlerInfo.shouldSupercede(oldHandlerInfo)) {\n statesDiffer = true;\n newState.handlerInfos[i] = newHandlerInfo;\n } else {\n newState.handlerInfos[i] = oldHandlerInfo;\n }\n }\n\n _routerUtils.merge(newState.queryParams, results.queryParams);\n\n return newState;\n }\n });\n});\nenifed('router/transition-intent', ['exports', 'router/utils'], function (exports, _routerUtils) {\n 'use strict';\n\n function TransitionIntent(props) {\n this.initialize(props);\n\n // TODO: wat\n this.data = this.data || {};\n }\n\n TransitionIntent.prototype = {\n initialize: null,\n applyToState: null\n };\n\n exports.default = TransitionIntent;\n});\nenifed('router/transition-state', ['exports', 'router/handler-info', 'router/utils', 'rsvp/promise'], function (exports, _routerHandlerInfo, _routerUtils, _rsvpPromise) {\n 'use strict';\n\n function TransitionState(other) {\n this.handlerInfos = [];\n this.queryParams = {};\n this.params = {};\n }\n\n TransitionState.prototype = {\n handlerInfos: null,\n queryParams: null,\n params: null,\n\n promiseLabel: function (label) {\n var targetName = '';\n _routerUtils.forEach(this.handlerInfos, function (handlerInfo) {\n if (targetName !== '') {\n targetName += '.';\n }\n targetName += handlerInfo.name;\n });\n return _routerUtils.promiseLabel(\"'\" + targetName + \"': \" + label);\n },\n\n resolve: function (shouldContinue, payload) {\n var self = this;\n // First, calculate params for this state. This is useful\n // information to provide to the various route hooks.\n var params = this.params;\n _routerUtils.forEach(this.handlerInfos, function (handlerInfo) {\n params[handlerInfo.name] = handlerInfo.params || {};\n });\n\n payload = payload || {};\n payload.resolveIndex = 0;\n\n var currentState = this;\n var wasAborted = false;\n\n // The prelude RSVP.resolve() asyncs us into the promise land.\n return _rsvpPromise.default.resolve(null, this.promiseLabel(\"Start transition\")).then(resolveOneHandlerInfo, null, this.promiseLabel('Resolve handler'))['catch'](handleError, this.promiseLabel('Handle error'));\n\n function innerShouldContinue() {\n return _rsvpPromise.default.resolve(shouldContinue(), currentState.promiseLabel(\"Check if should continue\"))['catch'](function (reason) {\n // We distinguish between errors that occurred\n // during resolution (e.g. beforeModel/model/afterModel),\n // and aborts due to a rejecting promise from shouldContinue().\n wasAborted = true;\n return _rsvpPromise.default.reject(reason);\n }, currentState.promiseLabel(\"Handle abort\"));\n }\n\n function handleError(error) {\n // This is the only possible\n // reject value of TransitionState#resolve\n var handlerInfos = currentState.handlerInfos;\n var errorHandlerIndex = payload.resolveIndex >= handlerInfos.length ? handlerInfos.length - 1 : payload.resolveIndex;\n return _rsvpPromise.default.reject({\n error: error,\n handlerWithError: currentState.handlerInfos[errorHandlerIndex].handler,\n wasAborted: wasAborted,\n state: currentState\n });\n }\n\n function proceed(resolvedHandlerInfo) {\n var wasAlreadyResolved = currentState.handlerInfos[payload.resolveIndex].isResolved;\n\n // Swap the previously unresolved handlerInfo with\n // the resolved handlerInfo\n currentState.handlerInfos[payload.resolveIndex++] = resolvedHandlerInfo;\n\n if (!wasAlreadyResolved) {\n // Call the redirect hook. The reason we call it here\n // vs. afterModel is so that redirects into child\n // routes don't re-run the model hooks for this\n // already-resolved route.\n var handler = resolvedHandlerInfo.handler;\n _routerUtils.callHook(handler, 'redirect', resolvedHandlerInfo.context, payload);\n }\n\n // Proceed after ensuring that the redirect hook\n // didn't abort this transition by transitioning elsewhere.\n return innerShouldContinue().then(resolveOneHandlerInfo, null, currentState.promiseLabel('Resolve handler'));\n }\n\n function resolveOneHandlerInfo() {\n if (payload.resolveIndex === currentState.handlerInfos.length) {\n // This is is the only possible\n // fulfill value of TransitionState#resolve\n return {\n error: null,\n state: currentState\n };\n }\n\n var handlerInfo = currentState.handlerInfos[payload.resolveIndex];\n\n return handlerInfo.resolve(innerShouldContinue, payload).then(proceed, null, currentState.promiseLabel('Proceed'));\n }\n }\n };\n\n exports.default = TransitionState;\n});\nenifed('router/transition', ['exports', 'rsvp/promise', 'router/handler-info', 'router/utils'], function (exports, _rsvpPromise, _routerHandlerInfo, _routerUtils) {\n 'use strict';\n\n /**\n @private\n \n A Transition is a thennable (a promise-like object) that represents\n an attempt to transition to another route. It can be aborted, either\n explicitly via `abort` or by attempting another transition while a\n previous one is still underway. An aborted transition can also\n be `retry()`d later.\n */\n function Transition(router, intent, state, error) {\n var transition = this;\n this.state = state || router.state;\n this.intent = intent;\n this.router = router;\n this.data = this.intent && this.intent.data || {};\n this.resolvedModels = {};\n this.queryParams = {};\n\n if (error) {\n this.promise = _rsvpPromise.default.reject(error);\n this.error = error;\n return;\n }\n\n if (state) {\n this.params = state.params;\n this.queryParams = state.queryParams;\n this.handlerInfos = state.handlerInfos;\n\n var len = state.handlerInfos.length;\n if (len) {\n this.targetName = state.handlerInfos[len - 1].name;\n }\n\n for (var i = 0; i < len; ++i) {\n var handlerInfo = state.handlerInfos[i];\n\n // TODO: this all seems hacky\n if (!handlerInfo.isResolved) {\n break;\n }\n this.pivotHandler = handlerInfo.handler;\n }\n\n this.sequence = Transition.currentSequence++;\n this.promise = state.resolve(checkForAbort, this)['catch'](function (result) {\n if (result.wasAborted || transition.isAborted) {\n return _rsvpPromise.default.reject(logAbort(transition));\n } else {\n transition.trigger('error', result.error, transition, result.handlerWithError);\n transition.abort();\n return _rsvpPromise.default.reject(result.error);\n }\n }, _routerUtils.promiseLabel('Handle Abort'));\n } else {\n this.promise = _rsvpPromise.default.resolve(this.state);\n this.params = {};\n }\n\n function checkForAbort() {\n if (transition.isAborted) {\n return _rsvpPromise.default.reject(undefined, _routerUtils.promiseLabel(\"Transition aborted - reject\"));\n }\n }\n }\n\n Transition.currentSequence = 0;\n\n Transition.prototype = {\n targetName: null,\n urlMethod: 'update',\n intent: null,\n params: null,\n pivotHandler: null,\n resolveIndex: 0,\n handlerInfos: null,\n resolvedModels: null,\n isActive: true,\n state: null,\n queryParamsOnly: false,\n\n isTransition: true,\n\n isExiting: function (handler) {\n var handlerInfos = this.handlerInfos;\n for (var i = 0, len = handlerInfos.length; i < len; ++i) {\n var handlerInfo = handlerInfos[i];\n if (handlerInfo.name === handler || handlerInfo.handler === handler) {\n return false;\n }\n }\n return true;\n },\n\n /**\n @public\n The Transition's internal promise. Calling `.then` on this property\n is that same as calling `.then` on the Transition object itself, but\n this property is exposed for when you want to pass around a\n Transition's promise, but not the Transition object itself, since\n Transition object can be externally `abort`ed, while the promise\n cannot.\n */\n promise: null,\n\n /**\n @public\n Custom state can be stored on a Transition's `data` object.\n This can be useful for decorating a Transition within an earlier\n hook and shared with a later hook. Properties set on `data` will\n be copied to new transitions generated by calling `retry` on this\n transition.\n */\n data: null,\n\n /**\n @public\n A standard promise hook that resolves if the transition\n succeeds and rejects if it fails/redirects/aborts.\n Forwards to the internal `promise` property which you can\n use in situations where you want to pass around a thennable,\n but not the Transition itself.\n @param {Function} onFulfilled\n @param {Function} onRejected\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n then: function (onFulfilled, onRejected, label) {\n return this.promise.then(onFulfilled, onRejected, label);\n },\n\n /**\n @public\n Forwards to the internal `promise` property which you can\n use in situations where you want to pass around a thennable,\n but not the Transition itself.\n @method catch\n @param {Function} onRejection\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n catch: function (onRejection, label) {\n return this.promise.catch(onRejection, label);\n },\n\n /**\n @public\n Forwards to the internal `promise` property which you can\n use in situations where you want to pass around a thennable,\n but not the Transition itself.\n @method finally\n @param {Function} callback\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n finally: function (callback, label) {\n return this.promise.finally(callback, label);\n },\n\n /**\n @public\n Aborts the Transition. Note you can also implicitly abort a transition\n by initiating another transition while a previous one is underway.\n */\n abort: function () {\n if (this.isAborted) {\n return this;\n }\n _routerUtils.log(this.router, this.sequence, this.targetName + \": transition was aborted\");\n this.intent.preTransitionState = this.router.state;\n this.isAborted = true;\n this.isActive = false;\n this.router.activeTransition = null;\n return this;\n },\n\n /**\n @public\n Retries a previously-aborted transition (making sure to abort the\n transition if it's still active). Returns a new transition that\n represents the new attempt to transition.\n */\n retry: function () {\n // TODO: add tests for merged state retry()s\n this.abort();\n return this.router.transitionByIntent(this.intent, false);\n },\n\n /**\n @public\n Sets the URL-changing method to be employed at the end of a\n successful transition. By default, a new Transition will just\n use `updateURL`, but passing 'replace' to this method will\n cause the URL to update using 'replaceWith' instead. Omitting\n a parameter will disable the URL change, allowing for transitions\n that don't update the URL at completion (this is also used for\n handleURL, since the URL has already changed before the\n transition took place).\n @param {String} method the type of URL-changing method to use\n at the end of a transition. Accepted values are 'replace',\n falsy values, or any other non-falsy value (which is\n interpreted as an updateURL transition).\n @return {Transition} this transition\n */\n method: function (method) {\n this.urlMethod = method;\n return this;\n },\n\n /**\n @public\n Fires an event on the current list of resolved/resolving\n handlers within this transition. Useful for firing events\n on route hierarchies that haven't fully been entered yet.\n Note: This method is also aliased as `send`\n @param {Boolean} [ignoreFailure=false] a boolean specifying whether unhandled events throw an error\n @param {String} name the name of the event to fire\n */\n trigger: function (ignoreFailure) {\n var args = _routerUtils.slice.call(arguments);\n if (typeof ignoreFailure === 'boolean') {\n args.shift();\n } else {\n // Throw errors on unhandled trigger events by default\n ignoreFailure = false;\n }\n _routerUtils.trigger(this.router, this.state.handlerInfos.slice(0, this.resolveIndex + 1), ignoreFailure, args);\n },\n\n /**\n @public\n Transitions are aborted and their promises rejected\n when redirects occur; this method returns a promise\n that will follow any redirects that occur and fulfill\n with the value fulfilled by any redirecting transitions\n that occur.\n @return {Promise} a promise that fulfills with the same\n value that the final redirecting transition fulfills with\n */\n followRedirects: function () {\n var router = this.router;\n return this.promise['catch'](function (reason) {\n if (router.activeTransition) {\n return router.activeTransition.followRedirects();\n }\n return _rsvpPromise.default.reject(reason);\n });\n },\n\n toString: function () {\n return \"Transition (sequence \" + this.sequence + \")\";\n },\n\n /**\n @private\n */\n log: function (message) {\n _routerUtils.log(this.router, this.sequence, message);\n }\n };\n\n // Alias 'trigger' as 'send'\n Transition.prototype.send = Transition.prototype.trigger;\n\n /**\n @private\n \n Logs and returns a TransitionAborted error.\n */\n function logAbort(transition) {\n _routerUtils.log(transition.router, transition.sequence, \"detected abort.\");\n return new TransitionAborted();\n }\n\n function TransitionAborted(message) {\n this.message = message || \"TransitionAborted\";\n this.name = \"TransitionAborted\";\n }\n\n exports.Transition = Transition;\n exports.logAbort = logAbort;\n exports.TransitionAborted = TransitionAborted;\n});\nenifed(\"router/unrecognized-url-error\", [\"exports\", \"router/utils\"], function (exports, _routerUtils) {\n \"use strict\";\n\n /**\n Promise reject reasons passed to promise rejection\n handlers for failed transitions.\n */\n function UnrecognizedURLError(message) {\n this.message = message || \"UnrecognizedURLError\";\n this.name = \"UnrecognizedURLError\";\n Error.call(this);\n }\n\n UnrecognizedURLError.prototype = _routerUtils.oCreate(Error.prototype);\n\n exports.default = UnrecognizedURLError;\n});\nenifed('router/utils', ['exports'], function (exports) {\n 'use strict';\n\n exports.extractQueryParams = extractQueryParams;\n exports.log = log;\n exports.bind = bind;\n exports.forEach = forEach;\n exports.trigger = trigger;\n exports.getChangelist = getChangelist;\n exports.promiseLabel = promiseLabel;\n exports.subclass = subclass;\n var slice = Array.prototype.slice;\n\n var _isArray;\n if (!Array.isArray) {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === \"[object Array]\";\n };\n } else {\n _isArray = Array.isArray;\n }\n\n var isArray = _isArray;\n\n exports.isArray = isArray;\n function merge(hash, other) {\n for (var prop in other) {\n if (other.hasOwnProperty(prop)) {\n hash[prop] = other[prop];\n }\n }\n }\n\n var oCreate = Object.create || function (proto) {\n function F() {}\n F.prototype = proto;\n return new F();\n };\n\n exports.oCreate = oCreate;\n /**\n @private\n \n Extracts query params from the end of an array\n **/\n\n function extractQueryParams(array) {\n var len = array && array.length,\n head,\n queryParams;\n\n if (len && len > 0 && array[len - 1] && array[len - 1].hasOwnProperty('queryParams')) {\n queryParams = array[len - 1].queryParams;\n head = slice.call(array, 0, len - 1);\n return [head, queryParams];\n } else {\n return [array, null];\n }\n }\n\n /**\n @private\n \n Coerces query param properties and array elements into strings.\n **/\n function coerceQueryParamsToString(queryParams) {\n for (var key in queryParams) {\n if (typeof queryParams[key] === 'number') {\n queryParams[key] = '' + queryParams[key];\n } else if (isArray(queryParams[key])) {\n for (var i = 0, l = queryParams[key].length; i < l; i++) {\n queryParams[key][i] = '' + queryParams[key][i];\n }\n }\n }\n }\n /**\n @private\n */\n\n function log(router, sequence, msg) {\n if (!router.log) {\n return;\n }\n\n if (arguments.length === 3) {\n router.log(\"Transition #\" + sequence + \": \" + msg);\n } else {\n msg = sequence;\n router.log(msg);\n }\n }\n\n function bind(context, fn) {\n var boundArgs = arguments;\n return function (value) {\n var args = slice.call(boundArgs, 2);\n args.push(value);\n return fn.apply(context, args);\n };\n }\n\n function isParam(object) {\n return typeof object === \"string\" || object instanceof String || typeof object === \"number\" || object instanceof Number;\n }\n\n function forEach(array, callback) {\n for (var i = 0, l = array.length; i < l && false !== callback(array[i]); i++) {}\n }\n\n function trigger(router, handlerInfos, ignoreFailure, args) {\n if (router.triggerEvent) {\n router.triggerEvent(handlerInfos, ignoreFailure, args);\n return;\n }\n\n var name = args.shift();\n\n if (!handlerInfos) {\n if (ignoreFailure) {\n return;\n }\n throw new Error(\"Could not trigger event '\" + name + \"'. There are no active handlers\");\n }\n\n var eventWasHandled = false;\n\n for (var i = handlerInfos.length - 1; i >= 0; i--) {\n var handlerInfo = handlerInfos[i],\n handler = handlerInfo.handler;\n\n if (handler.events && handler.events[name]) {\n if (handler.events[name].apply(handler, args) === true) {\n eventWasHandled = true;\n } else {\n return;\n }\n }\n }\n\n if (!eventWasHandled && !ignoreFailure) {\n throw new Error(\"Nothing handled the event '\" + name + \"'.\");\n }\n }\n\n function getChangelist(oldObject, newObject) {\n var key;\n var results = {\n all: {},\n changed: {},\n removed: {}\n };\n\n merge(results.all, newObject);\n\n var didChange = false;\n coerceQueryParamsToString(oldObject);\n coerceQueryParamsToString(newObject);\n\n // Calculate removals\n for (key in oldObject) {\n if (oldObject.hasOwnProperty(key)) {\n if (!newObject.hasOwnProperty(key)) {\n didChange = true;\n results.removed[key] = oldObject[key];\n }\n }\n }\n\n // Calculate changes\n for (key in newObject) {\n if (newObject.hasOwnProperty(key)) {\n if (isArray(oldObject[key]) && isArray(newObject[key])) {\n if (oldObject[key].length !== newObject[key].length) {\n results.changed[key] = newObject[key];\n didChange = true;\n } else {\n for (var i = 0, l = oldObject[key].length; i < l; i++) {\n if (oldObject[key][i] !== newObject[key][i]) {\n results.changed[key] = newObject[key];\n didChange = true;\n }\n }\n }\n } else {\n if (oldObject[key] !== newObject[key]) {\n results.changed[key] = newObject[key];\n didChange = true;\n }\n }\n }\n }\n\n return didChange && results;\n }\n\n function promiseLabel(label) {\n return 'Router: ' + label;\n }\n\n function subclass(parentConstructor, proto) {\n function C(props) {\n parentConstructor.call(this, props || {});\n }\n C.prototype = oCreate(parentConstructor.prototype);\n merge(C.prototype, proto);\n return C;\n }\n\n function resolveHook(obj, hookName) {\n if (!obj) {\n return;\n }\n var underscored = \"_\" + hookName;\n return obj[underscored] && underscored || obj[hookName] && hookName;\n }\n\n function callHook(obj, _hookName, arg1, arg2) {\n var hookName = resolveHook(obj, _hookName);\n return hookName && obj[hookName].call(obj, arg1, arg2);\n }\n\n function applyHook(obj, _hookName, args) {\n var hookName = resolveHook(obj, _hookName);\n if (hookName) {\n if (args.length === 0) {\n return obj[hookName].call(obj);\n } else if (args.length === 1) {\n return obj[hookName].call(obj, args[0]);\n } else if (args.length === 2) {\n return obj[hookName].call(obj, args[0], args[1]);\n } else {\n return obj[hookName].apply(obj, args);\n }\n }\n }\n\n exports.merge = merge;\n exports.slice = slice;\n exports.isParam = isParam;\n exports.coerceQueryParamsToString = coerceQueryParamsToString;\n exports.callHook = callHook;\n exports.resolveHook = resolveHook;\n exports.applyHook = applyHook;\n});\nenifed('router', ['exports', 'router/router'], function (exports, _routerRouter) {\n 'use strict';\n\n exports.default = _routerRouter.default;\n});\nenifed('rsvp/-internal', ['exports', 'rsvp/utils', 'rsvp/instrument', 'rsvp/config'], function (exports, _rsvpUtils, _rsvpInstrument, _rsvpConfig) {\n 'use strict';\n\n function withOwnPromise() {\n return new TypeError('A promises callback cannot return that same promise.');\n }\n\n function noop() {}\n\n var PENDING = void 0;\n var FULFILLED = 1;\n var REJECTED = 2;\n\n var GET_THEN_ERROR = new ErrorObject();\n\n function getThen(promise) {\n try {\n return promise.then;\n } catch (error) {\n GET_THEN_ERROR.error = error;\n return GET_THEN_ERROR;\n }\n }\n\n function tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n try {\n then.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n }\n\n function handleForeignThenable(promise, thenable, then) {\n _rsvpConfig.config.async(function (promise) {\n var sealed = false;\n var error = tryThen(then, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n }\n\n function handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n thenable._onError = null;\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n if (thenable !== value) {\n resolve(promise, value);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n reject(promise, reason);\n });\n }\n }\n\n function handleMaybeThenable(promise, maybeThenable) {\n if (maybeThenable.constructor === promise.constructor) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n var then = getThen(maybeThenable);\n\n if (then === GET_THEN_ERROR) {\n reject(promise, GET_THEN_ERROR.error);\n } else if (then === undefined) {\n fulfill(promise, maybeThenable);\n } else if (_rsvpUtils.isFunction(then)) {\n handleForeignThenable(promise, maybeThenable, then);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n }\n\n function resolve(promise, value) {\n if (promise === value) {\n fulfill(promise, value);\n } else if (_rsvpUtils.objectOrFunction(value)) {\n handleMaybeThenable(promise, value);\n } else {\n fulfill(promise, value);\n }\n }\n\n function publishRejection(promise) {\n if (promise._onError) {\n promise._onError(promise._result);\n }\n\n publish(promise);\n }\n\n function fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length === 0) {\n if (_rsvpConfig.config.instrument) {\n _rsvpInstrument.default('fulfilled', promise);\n }\n } else {\n _rsvpConfig.config.async(publish, promise);\n }\n }\n\n function reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n _rsvpConfig.config.async(publishRejection, promise);\n }\n\n function subscribe(parent, child, onFulfillment, onRejection) {\n var subscribers = parent._subscribers;\n var length = subscribers.length;\n\n parent._onError = null;\n\n subscribers[length] = child;\n subscribers[length + FULFILLED] = onFulfillment;\n subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n _rsvpConfig.config.async(publish, parent);\n }\n }\n\n function publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (_rsvpConfig.config.instrument) {\n _rsvpInstrument.default(settled === FULFILLED ? 'fulfilled' : 'rejected', promise);\n }\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child,\n callback,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n }\n\n function ErrorObject() {\n this.error = null;\n }\n\n var TRY_CATCH_ERROR = new ErrorObject();\n\n function tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch (e) {\n TRY_CATCH_ERROR.error = e;\n return TRY_CATCH_ERROR;\n }\n }\n\n function invokeCallback(settled, promise, callback, detail) {\n var hasCallback = _rsvpUtils.isFunction(callback),\n value,\n error,\n succeeded,\n failed;\n\n if (hasCallback) {\n value = tryCatch(callback, detail);\n\n if (value === TRY_CATCH_ERROR) {\n failed = true;\n error = value.error;\n value = null;\n } else {\n succeeded = true;\n }\n\n if (promise === value) {\n reject(promise, withOwnPromise());\n return;\n }\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (failed) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n }\n\n function initializePromise(promise, resolver) {\n var resolved = false;\n try {\n resolver(function resolvePromise(value) {\n if (resolved) {\n return;\n }\n resolved = true;\n resolve(promise, value);\n }, function rejectPromise(reason) {\n if (resolved) {\n return;\n }\n resolved = true;\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n }\n\n exports.noop = noop;\n exports.resolve = resolve;\n exports.reject = reject;\n exports.fulfill = fulfill;\n exports.subscribe = subscribe;\n exports.publish = publish;\n exports.publishRejection = publishRejection;\n exports.initializePromise = initializePromise;\n exports.invokeCallback = invokeCallback;\n exports.FULFILLED = FULFILLED;\n exports.REJECTED = REJECTED;\n exports.PENDING = PENDING;\n});\nenifed('rsvp/all-settled', ['exports', 'rsvp/enumerator', 'rsvp/promise', 'rsvp/utils'], function (exports, _rsvpEnumerator, _rsvpPromise, _rsvpUtils) {\n 'use strict';\n\n exports.default = allSettled;\n\n function AllSettled(Constructor, entries, label) {\n this._superConstructor(Constructor, entries, false, /* don't abort on reject */label);\n }\n\n AllSettled.prototype = _rsvpUtils.o_create(_rsvpEnumerator.default.prototype);\n AllSettled.prototype._superConstructor = _rsvpEnumerator.default;\n AllSettled.prototype._makeResult = _rsvpEnumerator.makeSettledResult;\n AllSettled.prototype._validationError = function () {\n return new Error('allSettled must be called with an array');\n };\n\n /**\n `RSVP.allSettled` is similar to `RSVP.all`, but instead of implementing\n a fail-fast method, it waits until all the promises have returned and\n shows you all the results. This is useful if you want to handle multiple\n promises' failure states together as a set.\n \n Returns a promise that is fulfilled when all the given promises have been\n settled. The return promise is fulfilled with an array of the states of\n the promises passed into the `promises` array argument.\n \n Each state object will either indicate fulfillment or rejection, and\n provide the corresponding value or reason. The states will take one of\n the following formats:\n \n ```javascript\n { state: 'fulfilled', value: value }\n or\n { state: 'rejected', reason: reason }\n ```\n \n Example:\n \n ```javascript\n var promise1 = RSVP.Promise.resolve(1);\n var promise2 = RSVP.Promise.reject(new Error('2'));\n var promise3 = RSVP.Promise.reject(new Error('3'));\n var promises = [ promise1, promise2, promise3 ];\n \n RSVP.allSettled(promises).then(function(array){\n // array == [\n // { state: 'fulfilled', value: 1 },\n // { state: 'rejected', reason: Error },\n // { state: 'rejected', reason: Error }\n // ]\n // Note that for the second item, reason.message will be '2', and for the\n // third item, reason.message will be '3'.\n }, function(error) {\n // Not run. (This block would only be called if allSettled had failed,\n // for instance if passed an incorrect argument type.)\n });\n ```\n \n @method allSettled\n @static\n @for RSVP\n @param {Array} entries\n @param {String} label - optional string that describes the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled with an array of the settled\n states of the constituent promises.\n */\n\n function allSettled(entries, label) {\n return new AllSettled(_rsvpPromise.default, entries, label).promise;\n }\n});\nenifed(\"rsvp/all\", [\"exports\", \"rsvp/promise\"], function (exports, _rsvpPromise) {\n \"use strict\";\n\n exports.default = all;\n\n /**\n This is a convenient alias for `RSVP.Promise.all`.\n \n @method all\n @static\n @for RSVP\n @param {Array} array Array of promises.\n @param {String} label An optional label. This is useful\n for tooling.\n */\n\n function all(array, label) {\n return _rsvpPromise.default.all(array, label);\n }\n});\nenifed('rsvp/asap', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = asap;\n var len = 0;\n var toString = ({}).toString;\n var vertxNext;\n\n function asap(callback, arg) {\n queue[len] = callback;\n queue[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 1, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n scheduleFlush();\n }\n }\n\n var browserWindow = typeof window !== 'undefined' ? window : undefined;\n var browserGlobal = browserWindow || {};\n var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\n var isNode = typeof window === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]';\n\n // test for web worker but not in IE10\n var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n // node\n function useNextTick() {\n var nextTick = process.nextTick;\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // setImmediate should be used instead instead\n var version = process.versions.node.match(/^(?:(\\d+)\\.)?(?:(\\d+)\\.)?(\\*|\\d+)$/);\n if (Array.isArray(version) && version[1] === '0' && version[2] === '10') {\n nextTick = setImmediate;\n }\n return function () {\n nextTick(flush);\n };\n }\n\n // vertx\n function useVertxTimer() {\n return function () {\n vertxNext(flush);\n };\n }\n\n function useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n node.data = iterations = ++iterations % 2;\n };\n }\n\n // web worker\n function useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n channel.port2.postMessage(0);\n };\n }\n\n function useSetTimeout() {\n return function () {\n setTimeout(flush, 1);\n };\n }\n\n var queue = new Array(1000);\n function flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue[i];\n var arg = queue[i + 1];\n\n callback(arg);\n\n queue[i] = undefined;\n queue[i + 1] = undefined;\n }\n\n len = 0;\n }\n\n function attemptVertex() {\n try {\n var r = require;\n var vertx = r('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n }\n\n var scheduleFlush;\n // Decide what async method to use to triggering processing of queued callbacks:\n if (isNode) {\n scheduleFlush = useNextTick();\n } else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n } else if (isWorker) {\n scheduleFlush = useMessageChannel();\n } else if (browserWindow === undefined && typeof require === 'function') {\n scheduleFlush = attemptVertex();\n } else {\n scheduleFlush = useSetTimeout();\n }\n});\nenifed('rsvp/config', ['exports', 'rsvp/events'], function (exports, _rsvpEvents) {\n 'use strict';\n\n var config = {\n instrument: false\n };\n\n _rsvpEvents.default['mixin'](config);\n\n function configure(name, value) {\n if (name === 'onerror') {\n // handle for legacy users that expect the actual\n // error to be passed to their function added via\n // `RSVP.configure('onerror', someFunctionHere);`\n config['on']('error', value);\n return;\n }\n\n if (arguments.length === 2) {\n config[name] = value;\n } else {\n return config[name];\n }\n }\n\n exports.config = config;\n exports.configure = configure;\n});\nenifed('rsvp/defer', ['exports', 'rsvp/promise'], function (exports, _rsvpPromise) {\n 'use strict';\n\n exports.default = defer;\n\n /**\n `RSVP.defer` returns an object similar to jQuery's `$.Deferred`.\n `RSVP.defer` should be used when porting over code reliant on `$.Deferred`'s\n interface. New code should use the `RSVP.Promise` constructor instead.\n \n The object returned from `RSVP.defer` is a plain object with three properties:\n \n * promise - an `RSVP.Promise`.\n * reject - a function that causes the `promise` property on this object to\n become rejected\n * resolve - a function that causes the `promise` property on this object to\n become fulfilled.\n \n Example:\n \n ```javascript\n var deferred = RSVP.defer();\n \n deferred.resolve(\"Success!\");\n \n deferred.promise.then(function(value){\n // value here is \"Success!\"\n });\n ```\n \n @method defer\n @static\n @for RSVP\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Object}\n */\n\n function defer(label) {\n var deferred = {};\n\n deferred['promise'] = new _rsvpPromise.default(function (resolve, reject) {\n deferred['resolve'] = resolve;\n deferred['reject'] = reject;\n }, label);\n\n return deferred;\n }\n});\nenifed('rsvp/enumerator', ['exports', 'rsvp/utils', 'rsvp/-internal'], function (exports, _rsvpUtils, _rsvpInternal) {\n 'use strict';\n\n exports.makeSettledResult = makeSettledResult;\n\n function makeSettledResult(state, position, value) {\n if (state === _rsvpInternal.FULFILLED) {\n return {\n state: 'fulfilled',\n value: value\n };\n } else {\n return {\n state: 'rejected',\n reason: value\n };\n }\n }\n\n function Enumerator(Constructor, input, abortOnReject, label) {\n var enumerator = this;\n\n enumerator._instanceConstructor = Constructor;\n enumerator.promise = new Constructor(_rsvpInternal.noop, label);\n enumerator._abortOnReject = abortOnReject;\n\n if (enumerator._validateInput(input)) {\n enumerator._input = input;\n enumerator.length = input.length;\n enumerator._remaining = input.length;\n\n enumerator._init();\n\n if (enumerator.length === 0) {\n _rsvpInternal.fulfill(enumerator.promise, enumerator._result);\n } else {\n enumerator.length = enumerator.length || 0;\n enumerator._enumerate();\n if (enumerator._remaining === 0) {\n _rsvpInternal.fulfill(enumerator.promise, enumerator._result);\n }\n }\n } else {\n _rsvpInternal.reject(enumerator.promise, enumerator._validationError());\n }\n }\n\n exports.default = Enumerator;\n\n Enumerator.prototype._validateInput = function (input) {\n return _rsvpUtils.isArray(input);\n };\n\n Enumerator.prototype._validationError = function () {\n return new Error('Array Methods must be provided an Array');\n };\n\n Enumerator.prototype._init = function () {\n this._result = new Array(this.length);\n };\n\n Enumerator.prototype._enumerate = function () {\n var enumerator = this;\n var length = enumerator.length;\n var promise = enumerator.promise;\n var input = enumerator._input;\n\n for (var i = 0; promise._state === _rsvpInternal.PENDING && i < length; i++) {\n enumerator._eachEntry(input[i], i);\n }\n };\n\n Enumerator.prototype._eachEntry = function (entry, i) {\n var enumerator = this;\n var c = enumerator._instanceConstructor;\n if (_rsvpUtils.isMaybeThenable(entry)) {\n if (entry.constructor === c && entry._state !== _rsvpInternal.PENDING) {\n entry._onError = null;\n enumerator._settledAt(entry._state, i, entry._result);\n } else {\n enumerator._willSettleAt(c.resolve(entry), i);\n }\n } else {\n enumerator._remaining--;\n enumerator._result[i] = enumerator._makeResult(_rsvpInternal.FULFILLED, i, entry);\n }\n };\n\n Enumerator.prototype._settledAt = function (state, i, value) {\n var enumerator = this;\n var promise = enumerator.promise;\n\n if (promise._state === _rsvpInternal.PENDING) {\n enumerator._remaining--;\n\n if (enumerator._abortOnReject && state === _rsvpInternal.REJECTED) {\n _rsvpInternal.reject(promise, value);\n } else {\n enumerator._result[i] = enumerator._makeResult(state, i, value);\n }\n }\n\n if (enumerator._remaining === 0) {\n _rsvpInternal.fulfill(promise, enumerator._result);\n }\n };\n\n Enumerator.prototype._makeResult = function (state, i, value) {\n return value;\n };\n\n Enumerator.prototype._willSettleAt = function (promise, i) {\n var enumerator = this;\n\n _rsvpInternal.subscribe(promise, undefined, function (value) {\n enumerator._settledAt(_rsvpInternal.FULFILLED, i, value);\n }, function (reason) {\n enumerator._settledAt(_rsvpInternal.REJECTED, i, reason);\n });\n };\n});\nenifed('rsvp/events', ['exports'], function (exports) {\n 'use strict';\n\n function indexOf(callbacks, callback) {\n for (var i = 0, l = callbacks.length; i < l; i++) {\n if (callbacks[i] === callback) {\n return i;\n }\n }\n\n return -1;\n }\n\n function callbacksFor(object) {\n var callbacks = object._promiseCallbacks;\n\n if (!callbacks) {\n callbacks = object._promiseCallbacks = {};\n }\n\n return callbacks;\n }\n\n /**\n @class RSVP.EventTarget\n */\n exports.default = {\n\n /**\n `RSVP.EventTarget.mixin` extends an object with EventTarget methods. For\n Example:\n ```javascript\n var object = {};\n RSVP.EventTarget.mixin(object);\n object.on('finished', function(event) {\n // handle event\n });\n object.trigger('finished', { detail: value });\n ```\n `EventTarget.mixin` also works with prototypes:\n ```javascript\n var Person = function() {};\n RSVP.EventTarget.mixin(Person.prototype);\n var yehuda = new Person();\n var tom = new Person();\n yehuda.on('poke', function(event) {\n console.log('Yehuda says OW');\n });\n tom.on('poke', function(event) {\n console.log('Tom says OW');\n });\n yehuda.trigger('poke');\n tom.trigger('poke');\n ```\n @method mixin\n @for RSVP.EventTarget\n @private\n @param {Object} object object to extend with EventTarget methods\n */\n 'mixin': function (object) {\n object['on'] = this['on'];\n object['off'] = this['off'];\n object['trigger'] = this['trigger'];\n object._promiseCallbacks = undefined;\n return object;\n },\n\n /**\n Registers a callback to be executed when `eventName` is triggered\n ```javascript\n object.on('event', function(eventInfo){\n // handle the event\n });\n object.trigger('event');\n ```\n @method on\n @for RSVP.EventTarget\n @private\n @param {String} eventName name of the event to listen for\n @param {Function} callback function to be called when the event is triggered.\n */\n 'on': function (eventName, callback) {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback must be a function');\n }\n\n var allCallbacks = callbacksFor(this),\n callbacks;\n\n callbacks = allCallbacks[eventName];\n\n if (!callbacks) {\n callbacks = allCallbacks[eventName] = [];\n }\n\n if (indexOf(callbacks, callback) === -1) {\n callbacks.push(callback);\n }\n },\n\n /**\n You can use `off` to stop firing a particular callback for an event:\n ```javascript\n function doStuff() { // do stuff! }\n object.on('stuff', doStuff);\n object.trigger('stuff'); // doStuff will be called\n // Unregister ONLY the doStuff callback\n object.off('stuff', doStuff);\n object.trigger('stuff'); // doStuff will NOT be called\n ```\n If you don't pass a `callback` argument to `off`, ALL callbacks for the\n event will not be executed when the event fires. For example:\n ```javascript\n var callback1 = function(){};\n var callback2 = function(){};\n object.on('stuff', callback1);\n object.on('stuff', callback2);\n object.trigger('stuff'); // callback1 and callback2 will be executed.\n object.off('stuff');\n object.trigger('stuff'); // callback1 and callback2 will not be executed!\n ```\n @method off\n @for RSVP.EventTarget\n @private\n @param {String} eventName event to stop listening to\n @param {Function} callback optional argument. If given, only the function\n given will be removed from the event's callback queue. If no `callback`\n argument is given, all callbacks will be removed from the event's callback\n queue.\n */\n 'off': function (eventName, callback) {\n var allCallbacks = callbacksFor(this),\n callbacks,\n index;\n\n if (!callback) {\n allCallbacks[eventName] = [];\n return;\n }\n\n callbacks = allCallbacks[eventName];\n\n index = indexOf(callbacks, callback);\n\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n },\n\n /**\n Use `trigger` to fire custom events. For example:\n ```javascript\n object.on('foo', function(){\n console.log('foo event happened!');\n });\n object.trigger('foo');\n // 'foo event happened!' logged to the console\n ```\n You can also pass a value as a second argument to `trigger` that will be\n passed as an argument to all event listeners for the event:\n ```javascript\n object.on('foo', function(value){\n console.log(value.name);\n });\n object.trigger('foo', { name: 'bar' });\n // 'bar' logged to the console\n ```\n @method trigger\n @for RSVP.EventTarget\n @private\n @param {String} eventName name of the event to be triggered\n @param {*} options optional value to be passed to any event handlers for\n the given `eventName`\n */\n 'trigger': function (eventName, options) {\n var allCallbacks = callbacksFor(this),\n callbacks,\n callback;\n\n if (callbacks = allCallbacks[eventName]) {\n // Don't cache the callbacks.length since it may grow\n for (var i = 0; i < callbacks.length; i++) {\n callback = callbacks[i];\n\n callback(options);\n }\n }\n }\n };\n});\nenifed('rsvp/filter', ['exports', 'rsvp/promise', 'rsvp/utils'], function (exports, _rsvpPromise, _rsvpUtils) {\n 'use strict';\n\n exports.default = filter;\n\n /**\n `RSVP.filter` is similar to JavaScript's native `filter` method, except that it\n waits for all promises to become fulfilled before running the `filterFn` on\n each item in given to `promises`. `RSVP.filter` returns a promise that will\n become fulfilled with the result of running `filterFn` on the values the\n promises become fulfilled with.\n \n For example:\n \n ```javascript\n \n var promise1 = RSVP.resolve(1);\n var promise2 = RSVP.resolve(2);\n var promise3 = RSVP.resolve(3);\n \n var promises = [promise1, promise2, promise3];\n \n var filterFn = function(item){\n return item > 1;\n };\n \n RSVP.filter(promises, filterFn).then(function(result){\n // result is [ 2, 3 ]\n });\n ```\n \n If any of the `promises` given to `RSVP.filter` are rejected, the first promise\n that is rejected will be given as an argument to the returned promise's\n rejection handler. For example:\n \n ```javascript\n var promise1 = RSVP.resolve(1);\n var promise2 = RSVP.reject(new Error('2'));\n var promise3 = RSVP.reject(new Error('3'));\n var promises = [ promise1, promise2, promise3 ];\n \n var filterFn = function(item){\n return item > 1;\n };\n \n RSVP.filter(promises, filterFn).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(reason) {\n // reason.message === '2'\n });\n ```\n \n `RSVP.filter` will also wait for any promises returned from `filterFn`.\n For instance, you may want to fetch a list of users then return a subset\n of those users based on some asynchronous operation:\n \n ```javascript\n \n var alice = { name: 'alice' };\n var bob = { name: 'bob' };\n var users = [ alice, bob ];\n \n var promises = users.map(function(user){\n return RSVP.resolve(user);\n });\n \n var filterFn = function(user){\n // Here, Alice has permissions to create a blog post, but Bob does not.\n return getPrivilegesForUser(user).then(function(privs){\n return privs.can_create_blog_post === true;\n });\n };\n RSVP.filter(promises, filterFn).then(function(users){\n // true, because the server told us only Alice can create a blog post.\n users.length === 1;\n // false, because Alice is the only user present in `users`\n users[0] === bob;\n });\n ```\n \n @method filter\n @static\n @for RSVP\n @param {Array} promises\n @param {Function} filterFn - function to be called on each resolved value to\n filter the final results.\n @param {String} label optional string describing the promise. Useful for\n tooling.\n @return {Promise}\n */\n\n function filter(promises, filterFn, label) {\n return _rsvpPromise.default.all(promises, label).then(function (values) {\n if (!_rsvpUtils.isFunction(filterFn)) {\n throw new TypeError(\"You must pass a function as filter's second argument.\");\n }\n\n var length = values.length;\n var filtered = new Array(length);\n\n for (var i = 0; i < length; i++) {\n filtered[i] = filterFn(values[i]);\n }\n\n return _rsvpPromise.default.all(filtered, label).then(function (filtered) {\n var results = new Array(length);\n var newLength = 0;\n\n for (var i = 0; i < length; i++) {\n if (filtered[i]) {\n results[newLength] = values[i];\n newLength++;\n }\n }\n\n results.length = newLength;\n\n return results;\n });\n });\n }\n});\nenifed('rsvp/hash-settled', ['exports', 'rsvp/promise', 'rsvp/enumerator', 'rsvp/promise-hash', 'rsvp/utils'], function (exports, _rsvpPromise, _rsvpEnumerator, _rsvpPromiseHash, _rsvpUtils) {\n 'use strict';\n\n exports.default = hashSettled;\n\n function HashSettled(Constructor, object, label) {\n this._superConstructor(Constructor, object, false, label);\n }\n\n HashSettled.prototype = _rsvpUtils.o_create(_rsvpPromiseHash.default.prototype);\n HashSettled.prototype._superConstructor = _rsvpEnumerator.default;\n HashSettled.prototype._makeResult = _rsvpEnumerator.makeSettledResult;\n\n HashSettled.prototype._validationError = function () {\n return new Error('hashSettled must be called with an object');\n };\n\n /**\n `RSVP.hashSettled` is similar to `RSVP.allSettled`, but takes an object\n instead of an array for its `promises` argument.\n \n Unlike `RSVP.all` or `RSVP.hash`, which implement a fail-fast method,\n but like `RSVP.allSettled`, `hashSettled` waits until all the\n constituent promises have returned and then shows you all the results\n with their states and values/reasons. This is useful if you want to\n handle multiple promises' failure states together as a set.\n \n Returns a promise that is fulfilled when all the given promises have been\n settled, or rejected if the passed parameters are invalid.\n \n The returned promise is fulfilled with a hash that has the same key names as\n the `promises` object argument. If any of the values in the object are not\n promises, they will be copied over to the fulfilled object and marked with state\n 'fulfilled'.\n \n Example:\n \n ```javascript\n var promises = {\n myPromise: RSVP.Promise.resolve(1),\n yourPromise: RSVP.Promise.resolve(2),\n theirPromise: RSVP.Promise.resolve(3),\n notAPromise: 4\n };\n \n RSVP.hashSettled(promises).then(function(hash){\n // hash here is an object that looks like:\n // {\n // myPromise: { state: 'fulfilled', value: 1 },\n // yourPromise: { state: 'fulfilled', value: 2 },\n // theirPromise: { state: 'fulfilled', value: 3 },\n // notAPromise: { state: 'fulfilled', value: 4 }\n // }\n });\n ```\n \n If any of the `promises` given to `RSVP.hash` are rejected, the state will\n be set to 'rejected' and the reason for rejection provided.\n \n Example:\n \n ```javascript\n var promises = {\n myPromise: RSVP.Promise.resolve(1),\n rejectedPromise: RSVP.Promise.reject(new Error('rejection')),\n anotherRejectedPromise: RSVP.Promise.reject(new Error('more rejection')),\n };\n \n RSVP.hashSettled(promises).then(function(hash){\n // hash here is an object that looks like:\n // {\n // myPromise: { state: 'fulfilled', value: 1 },\n // rejectedPromise: { state: 'rejected', reason: Error },\n // anotherRejectedPromise: { state: 'rejected', reason: Error },\n // }\n // Note that for rejectedPromise, reason.message == 'rejection',\n // and for anotherRejectedPromise, reason.message == 'more rejection'.\n });\n ```\n \n An important note: `RSVP.hashSettled` is intended for plain JavaScript objects that\n are just a set of keys and values. `RSVP.hashSettled` will NOT preserve prototype\n chains.\n \n Example:\n \n ```javascript\n function MyConstructor(){\n this.example = RSVP.Promise.resolve('Example');\n }\n \n MyConstructor.prototype = {\n protoProperty: RSVP.Promise.resolve('Proto Property')\n };\n \n var myObject = new MyConstructor();\n \n RSVP.hashSettled(myObject).then(function(hash){\n // protoProperty will not be present, instead you will just have an\n // object that looks like:\n // {\n // example: { state: 'fulfilled', value: 'Example' }\n // }\n //\n // hash.hasOwnProperty('protoProperty'); // false\n // 'undefined' === typeof hash.protoProperty\n });\n ```\n \n @method hashSettled\n @for RSVP\n @param {Object} object\n @param {String} label optional string that describes the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when when all properties of `promises`\n have been settled.\n @static\n */\n\n function hashSettled(object, label) {\n return new HashSettled(_rsvpPromise.default, object, label).promise;\n }\n});\nenifed('rsvp/hash', ['exports', 'rsvp/promise', 'rsvp/promise-hash'], function (exports, _rsvpPromise, _rsvpPromiseHash) {\n 'use strict';\n\n exports.default = hash;\n\n /**\n `RSVP.hash` is similar to `RSVP.all`, but takes an object instead of an array\n for its `promises` argument.\n \n Returns a promise that is fulfilled when all the given promises have been\n fulfilled, or rejected if any of them become rejected. The returned promise\n is fulfilled with a hash that has the same key names as the `promises` object\n argument. If any of the values in the object are not promises, they will\n simply be copied over to the fulfilled object.\n \n Example:\n \n ```javascript\n var promises = {\n myPromise: RSVP.resolve(1),\n yourPromise: RSVP.resolve(2),\n theirPromise: RSVP.resolve(3),\n notAPromise: 4\n };\n \n RSVP.hash(promises).then(function(hash){\n // hash here is an object that looks like:\n // {\n // myPromise: 1,\n // yourPromise: 2,\n // theirPromise: 3,\n // notAPromise: 4\n // }\n });\n ````\n \n If any of the `promises` given to `RSVP.hash` are rejected, the first promise\n that is rejected will be given as the reason to the rejection handler.\n \n Example:\n \n ```javascript\n var promises = {\n myPromise: RSVP.resolve(1),\n rejectedPromise: RSVP.reject(new Error('rejectedPromise')),\n anotherRejectedPromise: RSVP.reject(new Error('anotherRejectedPromise')),\n };\n \n RSVP.hash(promises).then(function(hash){\n // Code here never runs because there are rejected promises!\n }, function(reason) {\n // reason.message === 'rejectedPromise'\n });\n ```\n \n An important note: `RSVP.hash` is intended for plain JavaScript objects that\n are just a set of keys and values. `RSVP.hash` will NOT preserve prototype\n chains.\n \n Example:\n \n ```javascript\n function MyConstructor(){\n this.example = RSVP.resolve('Example');\n }\n \n MyConstructor.prototype = {\n protoProperty: RSVP.resolve('Proto Property')\n };\n \n var myObject = new MyConstructor();\n \n RSVP.hash(myObject).then(function(hash){\n // protoProperty will not be present, instead you will just have an\n // object that looks like:\n // {\n // example: 'Example'\n // }\n //\n // hash.hasOwnProperty('protoProperty'); // false\n // 'undefined' === typeof hash.protoProperty\n });\n ```\n \n @method hash\n @static\n @for RSVP\n @param {Object} object\n @param {String} label optional string that describes the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all properties of `promises`\n have been fulfilled, or rejected if any of them become rejected.\n */\n\n function hash(object, label) {\n return new _rsvpPromiseHash.default(_rsvpPromise.default, object, label).promise;\n }\n});\nenifed('rsvp/instrument', ['exports', 'rsvp/config', 'rsvp/utils'], function (exports, _rsvpConfig, _rsvpUtils) {\n 'use strict';\n\n exports.default = instrument;\n\n var queue = [];\n\n function scheduleFlush() {\n setTimeout(function () {\n var entry;\n for (var i = 0; i < queue.length; i++) {\n entry = queue[i];\n\n var payload = entry.payload;\n\n payload.guid = payload.key + payload.id;\n payload.childGuid = payload.key + payload.childId;\n if (payload.error) {\n payload.stack = payload.error.stack;\n }\n\n _rsvpConfig.config['trigger'](entry.name, entry.payload);\n }\n queue.length = 0;\n }, 50);\n }\n\n function instrument(eventName, promise, child) {\n if (1 === queue.push({\n name: eventName,\n payload: {\n key: promise._guidKey,\n id: promise._id,\n eventName: eventName,\n detail: promise._result,\n childId: child && child._id,\n label: promise._label,\n timeStamp: _rsvpUtils.now(),\n error: _rsvpConfig.config[\"instrument-with-stack\"] ? new Error(promise._label) : null\n } })) {\n scheduleFlush();\n }\n }\n});\nenifed('rsvp/map', ['exports', 'rsvp/promise', 'rsvp/utils'], function (exports, _rsvpPromise, _rsvpUtils) {\n 'use strict';\n\n exports.default = map;\n\n /**\n `RSVP.map` is similar to JavaScript's native `map` method, except that it\n waits for all promises to become fulfilled before running the `mapFn` on\n each item in given to `promises`. `RSVP.map` returns a promise that will\n become fulfilled with the result of running `mapFn` on the values the promises\n become fulfilled with.\n \n For example:\n \n ```javascript\n \n var promise1 = RSVP.resolve(1);\n var promise2 = RSVP.resolve(2);\n var promise3 = RSVP.resolve(3);\n var promises = [ promise1, promise2, promise3 ];\n \n var mapFn = function(item){\n return item + 1;\n };\n \n RSVP.map(promises, mapFn).then(function(result){\n // result is [ 2, 3, 4 ]\n });\n ```\n \n If any of the `promises` given to `RSVP.map` are rejected, the first promise\n that is rejected will be given as an argument to the returned promise's\n rejection handler. For example:\n \n ```javascript\n var promise1 = RSVP.resolve(1);\n var promise2 = RSVP.reject(new Error('2'));\n var promise3 = RSVP.reject(new Error('3'));\n var promises = [ promise1, promise2, promise3 ];\n \n var mapFn = function(item){\n return item + 1;\n };\n \n RSVP.map(promises, mapFn).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(reason) {\n // reason.message === '2'\n });\n ```\n \n `RSVP.map` will also wait if a promise is returned from `mapFn`. For example,\n say you want to get all comments from a set of blog posts, but you need\n the blog posts first because they contain a url to those comments.\n \n ```javscript\n \n var mapFn = function(blogPost){\n // getComments does some ajax and returns an RSVP.Promise that is fulfilled\n // with some comments data\n return getComments(blogPost.comments_url);\n };\n \n // getBlogPosts does some ajax and returns an RSVP.Promise that is fulfilled\n // with some blog post data\n RSVP.map(getBlogPosts(), mapFn).then(function(comments){\n // comments is the result of asking the server for the comments\n // of all blog posts returned from getBlogPosts()\n });\n ```\n \n @method map\n @static\n @for RSVP\n @param {Array} promises\n @param {Function} mapFn function to be called on each fulfilled promise.\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled with the result of calling\n `mapFn` on each fulfilled promise or value when they become fulfilled.\n The promise will be rejected if any of the given `promises` become rejected.\n @static\n */\n\n function map(promises, mapFn, label) {\n return _rsvpPromise.default.all(promises, label).then(function (values) {\n if (!_rsvpUtils.isFunction(mapFn)) {\n throw new TypeError(\"You must pass a function as map's second argument.\");\n }\n\n var length = values.length;\n var results = new Array(length);\n\n for (var i = 0; i < length; i++) {\n results[i] = mapFn(values[i]);\n }\n\n return _rsvpPromise.default.all(results, label);\n });\n }\n});\nenifed('rsvp/node', ['exports', 'rsvp/promise', 'rsvp/-internal', 'rsvp/utils'], function (exports, _rsvpPromise, _rsvpInternal, _rsvpUtils) {\n 'use strict';\n\n exports.default = denodeify;\n\n function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }\n\n function Result() {\n this.value = undefined;\n }\n\n var ERROR = new Result();\n var GET_THEN_ERROR = new Result();\n\n function getThen(obj) {\n try {\n return obj.then;\n } catch (error) {\n ERROR.value = error;\n return ERROR;\n }\n }\n\n function tryApply(f, s, a) {\n try {\n f.apply(s, a);\n } catch (error) {\n ERROR.value = error;\n return ERROR;\n }\n }\n\n function makeObject(_, argumentNames) {\n var obj = {};\n var name;\n var i;\n var length = _.length;\n var args = new Array(length);\n\n for (var x = 0; x < length; x++) {\n args[x] = _[x];\n }\n\n for (i = 0; i < argumentNames.length; i++) {\n name = argumentNames[i];\n obj[name] = args[i + 1];\n }\n\n return obj;\n }\n\n function arrayResult(_) {\n var length = _.length;\n var args = new Array(length - 1);\n\n for (var i = 1; i < length; i++) {\n args[i - 1] = _[i];\n }\n\n return args;\n }\n\n function wrapThenable(then, promise) {\n return {\n then: function (onFulFillment, onRejection) {\n return then.call(promise, onFulFillment, onRejection);\n }\n };\n }\n\n /**\n `RSVP.denodeify` takes a 'node-style' function and returns a function that\n will return an `RSVP.Promise`. You can use `denodeify` in Node.js or the\n browser when you'd prefer to use promises over using callbacks. For example,\n `denodeify` transforms the following:\n \n ```javascript\n var fs = require('fs');\n \n fs.readFile('myfile.txt', function(err, data){\n if (err) return handleError(err);\n handleData(data);\n });\n ```\n \n into:\n \n ```javascript\n var fs = require('fs');\n var readFile = RSVP.denodeify(fs.readFile);\n \n readFile('myfile.txt').then(handleData, handleError);\n ```\n \n If the node function has multiple success parameters, then `denodeify`\n just returns the first one:\n \n ```javascript\n var request = RSVP.denodeify(require('request'));\n \n request('http://example.com').then(function(res) {\n // ...\n });\n ```\n \n However, if you need all success parameters, setting `denodeify`'s\n second parameter to `true` causes it to return all success parameters\n as an array:\n \n ```javascript\n var request = RSVP.denodeify(require('request'), true);\n \n request('http://example.com').then(function(result) {\n // result[0] -> res\n // result[1] -> body\n });\n ```\n \n Or if you pass it an array with names it returns the parameters as a hash:\n \n ```javascript\n var request = RSVP.denodeify(require('request'), ['res', 'body']);\n \n request('http://example.com').then(function(result) {\n // result.res\n // result.body\n });\n ```\n \n Sometimes you need to retain the `this`:\n \n ```javascript\n var app = require('express')();\n var render = RSVP.denodeify(app.render.bind(app));\n ```\n \n The denodified function inherits from the original function. It works in all\n environments, except IE 10 and below. Consequently all properties of the original\n function are available to you. However, any properties you change on the\n denodeified function won't be changed on the original function. Example:\n \n ```javascript\n var request = RSVP.denodeify(require('request')),\n cookieJar = request.jar(); // <- Inheritance is used here\n \n request('http://example.com', {jar: cookieJar}).then(function(res) {\n // cookieJar.cookies holds now the cookies returned by example.com\n });\n ```\n \n Using `denodeify` makes it easier to compose asynchronous operations instead\n of using callbacks. For example, instead of:\n \n ```javascript\n var fs = require('fs');\n \n fs.readFile('myfile.txt', function(err, data){\n if (err) { ... } // Handle error\n fs.writeFile('myfile2.txt', data, function(err){\n if (err) { ... } // Handle error\n console.log('done')\n });\n });\n ```\n \n you can chain the operations together using `then` from the returned promise:\n \n ```javascript\n var fs = require('fs');\n var readFile = RSVP.denodeify(fs.readFile);\n var writeFile = RSVP.denodeify(fs.writeFile);\n \n readFile('myfile.txt').then(function(data){\n return writeFile('myfile2.txt', data);\n }).then(function(){\n console.log('done')\n }).catch(function(error){\n // Handle error\n });\n ```\n \n @method denodeify\n @static\n @for RSVP\n @param {Function} nodeFunc a 'node-style' function that takes a callback as\n its last argument. The callback expects an error to be passed as its first\n argument (if an error occurred, otherwise null), and the value from the\n operation as its second argument ('function(err, value){ }').\n @param {Boolean|Array} [options] An optional paramter that if set\n to `true` causes the promise to fulfill with the callback's success arguments\n as an array. This is useful if the node function has multiple success\n paramters. If you set this paramter to an array with names, the promise will\n fulfill with a hash with these names as keys and the success parameters as\n values.\n @return {Function} a function that wraps `nodeFunc` to return an\n `RSVP.Promise`\n @static\n */\n\n function denodeify(nodeFunc, options) {\n var fn = function () {\n var self = this;\n var l = arguments.length;\n var args = new Array(l + 1);\n var arg;\n var promiseInput = false;\n\n for (var i = 0; i < l; ++i) {\n arg = arguments[i];\n\n if (!promiseInput) {\n // TODO: clean this up\n promiseInput = needsPromiseInput(arg);\n if (promiseInput === GET_THEN_ERROR) {\n var p = new _rsvpPromise.default(_rsvpInternal.noop);\n _rsvpInternal.reject(p, GET_THEN_ERROR.value);\n return p;\n } else if (promiseInput && promiseInput !== true) {\n arg = wrapThenable(promiseInput, arg);\n }\n }\n args[i] = arg;\n }\n\n var promise = new _rsvpPromise.default(_rsvpInternal.noop);\n\n args[l] = function (err, val) {\n if (err) _rsvpInternal.reject(promise, err);else if (options === undefined) _rsvpInternal.resolve(promise, val);else if (options === true) _rsvpInternal.resolve(promise, arrayResult(arguments));else if (_rsvpUtils.isArray(options)) _rsvpInternal.resolve(promise, makeObject(arguments, options));else _rsvpInternal.resolve(promise, val);\n };\n\n if (promiseInput) {\n return handlePromiseInput(promise, args, nodeFunc, self);\n } else {\n return handleValueInput(promise, args, nodeFunc, self);\n }\n };\n\n _defaults(fn, nodeFunc);\n\n return fn;\n }\n\n function handleValueInput(promise, args, nodeFunc, self) {\n var result = tryApply(nodeFunc, self, args);\n if (result === ERROR) {\n _rsvpInternal.reject(promise, result.value);\n }\n return promise;\n }\n\n function handlePromiseInput(promise, args, nodeFunc, self) {\n return _rsvpPromise.default.all(args).then(function (args) {\n var result = tryApply(nodeFunc, self, args);\n if (result === ERROR) {\n _rsvpInternal.reject(promise, result.value);\n }\n return promise;\n });\n }\n\n function needsPromiseInput(arg) {\n if (arg && typeof arg === 'object') {\n if (arg.constructor === _rsvpPromise.default) {\n return true;\n } else {\n return getThen(arg);\n }\n } else {\n return false;\n }\n }\n});\nenifed('rsvp/platform', ['exports'], function (exports) {\n 'use strict';\n\n var platform;\n\n /* global self */\n if (typeof self === 'object') {\n platform = self;\n\n /* global global */\n } else if (typeof global === 'object') {\n platform = global;\n } else {\n throw new Error('no global: `self` or `global` found');\n }\n\n exports.default = platform;\n});\nenifed('rsvp/promise/all', ['exports', 'rsvp/enumerator'], function (exports, _rsvpEnumerator) {\n 'use strict';\n\n exports.default = all;\n\n /**\n `RSVP.Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n \n Example:\n \n ```javascript\n var promise1 = RSVP.resolve(1);\n var promise2 = RSVP.resolve(2);\n var promise3 = RSVP.resolve(3);\n var promises = [ promise1, promise2, promise3 ];\n \n RSVP.Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n \n If any of the `promises` given to `RSVP.all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n \n Example:\n \n ```javascript\n var promise1 = RSVP.resolve(1);\n var promise2 = RSVP.reject(new Error(\"2\"));\n var promise3 = RSVP.reject(new Error(\"3\"));\n var promises = [ promise1, promise2, promise3 ];\n \n RSVP.Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n \n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n */\n\n function all(entries, label) {\n return new _rsvpEnumerator.default(this, entries, true, /* abort on reject */label).promise;\n }\n});\nenifed('rsvp/promise/race', ['exports', 'rsvp/utils', 'rsvp/-internal'], function (exports, _rsvpUtils, _rsvpInternal) {\n 'use strict';\n\n exports.default = race;\n\n /**\n `RSVP.Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n \n Example:\n \n ```javascript\n var promise1 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n \n var promise2 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n \n RSVP.Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n \n `RSVP.Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n \n ```javascript\n var promise1 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n \n var promise2 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n \n RSVP.Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n \n An example real-world use case is implementing timeouts:\n \n ```javascript\n RSVP.Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n \n @method race\n @static\n @param {Array} entries array of promises to observe\n @param {String} label optional string for describing the promise returned.\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n */\n\n function race(entries, label) {\n /*jshint validthis:true */\n var Constructor = this;\n\n var promise = new Constructor(_rsvpInternal.noop, label);\n\n if (!_rsvpUtils.isArray(entries)) {\n _rsvpInternal.reject(promise, new TypeError('You must pass an array to race.'));\n return promise;\n }\n\n var length = entries.length;\n\n function onFulfillment(value) {\n _rsvpInternal.resolve(promise, value);\n }\n\n function onRejection(reason) {\n _rsvpInternal.reject(promise, reason);\n }\n\n for (var i = 0; promise._state === _rsvpInternal.PENDING && i < length; i++) {\n _rsvpInternal.subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection);\n }\n\n return promise;\n }\n});\nenifed('rsvp/promise/reject', ['exports', 'rsvp/-internal'], function (exports, _rsvpInternal) {\n 'use strict';\n\n exports.default = reject;\n\n /**\n `RSVP.Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n \n ```javascript\n var promise = new RSVP.Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n \n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n \n Instead of writing the above, your code now simply becomes the following:\n \n ```javascript\n var promise = RSVP.Promise.reject(new Error('WHOOPS'));\n \n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n \n @method reject\n @static\n @param {*} reason value that the returned promise will be rejected with.\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n */\n\n function reject(reason, label) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(_rsvpInternal.noop, label);\n _rsvpInternal.reject(promise, reason);\n return promise;\n }\n});\nenifed('rsvp/promise/resolve', ['exports', 'rsvp/-internal'], function (exports, _rsvpInternal) {\n 'use strict';\n\n exports.default = resolve;\n\n /**\n `RSVP.Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n \n ```javascript\n var promise = new RSVP.Promise(function(resolve, reject){\n resolve(1);\n });\n \n promise.then(function(value){\n // value === 1\n });\n ```\n \n Instead of writing the above, your code now simply becomes the following:\n \n ```javascript\n var promise = RSVP.Promise.resolve(1);\n \n promise.then(function(value){\n // value === 1\n });\n ```\n \n @method resolve\n @static\n @param {*} object value that the returned promise will be resolved with\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n */\n\n function resolve(object, label) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(_rsvpInternal.noop, label);\n _rsvpInternal.resolve(promise, object);\n return promise;\n }\n});\nenifed('rsvp/promise-hash', ['exports', 'rsvp/enumerator', 'rsvp/-internal', 'rsvp/utils'], function (exports, _rsvpEnumerator, _rsvpInternal, _rsvpUtils) {\n 'use strict';\n\n function PromiseHash(Constructor, object, label) {\n this._superConstructor(Constructor, object, true, label);\n }\n\n exports.default = PromiseHash;\n\n PromiseHash.prototype = _rsvpUtils.o_create(_rsvpEnumerator.default.prototype);\n PromiseHash.prototype._superConstructor = _rsvpEnumerator.default;\n PromiseHash.prototype._init = function () {\n this._result = {};\n };\n\n PromiseHash.prototype._validateInput = function (input) {\n return input && typeof input === 'object';\n };\n\n PromiseHash.prototype._validationError = function () {\n return new Error('Promise.hash must be called with an object');\n };\n\n PromiseHash.prototype._enumerate = function () {\n var enumerator = this;\n var promise = enumerator.promise;\n var input = enumerator._input;\n var results = [];\n\n for (var key in input) {\n if (promise._state === _rsvpInternal.PENDING && Object.prototype.hasOwnProperty.call(input, key)) {\n results.push({\n position: key,\n entry: input[key]\n });\n }\n }\n\n var length = results.length;\n enumerator._remaining = length;\n var result;\n\n for (var i = 0; promise._state === _rsvpInternal.PENDING && i < length; i++) {\n result = results[i];\n enumerator._eachEntry(result.entry, result.position);\n }\n };\n});\nenifed('rsvp/promise', ['exports', 'rsvp/config', 'rsvp/instrument', 'rsvp/utils', 'rsvp/-internal', 'rsvp/promise/all', 'rsvp/promise/race', 'rsvp/promise/resolve', 'rsvp/promise/reject'], function (exports, _rsvpConfig, _rsvpInstrument, _rsvpUtils, _rsvpInternal, _rsvpPromiseAll, _rsvpPromiseRace, _rsvpPromiseResolve, _rsvpPromiseReject) {\n 'use strict';\n\n exports.default = Promise;\n\n var guidKey = 'rsvp_' + _rsvpUtils.now() + '-';\n var counter = 0;\n\n function needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n }\n\n function needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n }\n\n /**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise’s eventual value or the reason\n why the promise cannot be fulfilled.\n \n Terminology\n -----------\n \n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n \n A promise can be in one of three states: pending, fulfilled, or rejected.\n \n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n \n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n \n \n Basic Usage:\n ------------\n \n ```js\n var promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n \n // on failure\n reject(reason);\n });\n \n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n \n Advanced Usage:\n ---------------\n \n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n \n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n var xhr = new XMLHttpRequest();\n \n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n \n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n \n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n \n Unlike callbacks, promises are great composable primitives.\n \n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n \n return values;\n });\n ```\n \n @class RSVP.Promise\n @param {function} resolver\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @constructor\n */\n\n function Promise(resolver, label) {\n var promise = this;\n\n promise._id = counter++;\n promise._label = label;\n promise._state = undefined;\n promise._result = undefined;\n promise._subscribers = [];\n\n if (_rsvpConfig.config.instrument) {\n _rsvpInstrument.default('created', promise);\n }\n\n if (_rsvpInternal.noop !== resolver) {\n if (!_rsvpUtils.isFunction(resolver)) {\n needsResolver();\n }\n\n if (!(promise instanceof Promise)) {\n needsNew();\n }\n\n _rsvpInternal.initializePromise(promise, resolver);\n }\n }\n\n Promise.cast = _rsvpPromiseResolve.default; // deprecated\n Promise.all = _rsvpPromiseAll.default;\n Promise.race = _rsvpPromiseRace.default;\n Promise.resolve = _rsvpPromiseResolve.default;\n Promise.reject = _rsvpPromiseReject.default;\n\n Promise.prototype = {\n constructor: Promise,\n\n _guidKey: guidKey,\n\n _onError: function (reason) {\n var promise = this;\n _rsvpConfig.config.after(function () {\n if (promise._onError) {\n _rsvpConfig.config['trigger']('error', reason);\n }\n });\n },\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n \n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n \n Chaining\n --------\n \n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n \n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n \n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n \n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n \n Assimilation\n ------------\n \n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n \n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n \n If the assimliated promise rejects, then the downstream promise will also reject.\n \n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n \n Simple Example\n --------------\n \n Synchronous Example\n \n ```javascript\n var result;\n \n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n \n Errback Example\n \n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n \n Promise Example;\n \n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n \n Advanced Example\n --------------\n \n Synchronous Example\n \n ```javascript\n var author, books;\n \n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n \n Errback Example\n \n ```js\n \n function foundBooks(books) {\n \n }\n \n function failure(reason) {\n \n }\n \n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n \n Promise Example;\n \n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n \n @method then\n @param {Function} onFulfillment\n @param {Function} onRejection\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n then: function (onFulfillment, onRejection, label) {\n var parent = this;\n var state = parent._state;\n\n if (state === _rsvpInternal.FULFILLED && !onFulfillment || state === _rsvpInternal.REJECTED && !onRejection) {\n if (_rsvpConfig.config.instrument) {\n _rsvpInstrument.default('chained', parent, parent);\n }\n return parent;\n }\n\n parent._onError = null;\n\n var child = new parent.constructor(_rsvpInternal.noop, label);\n var result = parent._result;\n\n if (_rsvpConfig.config.instrument) {\n _rsvpInstrument.default('chained', parent, child);\n }\n\n if (state) {\n var callback = arguments[state - 1];\n _rsvpConfig.config.async(function () {\n _rsvpInternal.invokeCallback(state, child, callback, result);\n });\n } else {\n _rsvpInternal.subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n },\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n \n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n \n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n \n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n \n @method catch\n @param {Function} onRejection\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n 'catch': function (onRejection, label) {\n return this.then(undefined, onRejection, label);\n },\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n 'finally': function (callback, label) {\n var promise = this;\n var constructor = promise.constructor;\n\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n }, label);\n }\n };\n});\nenifed('rsvp/race', ['exports', 'rsvp/promise'], function (exports, _rsvpPromise) {\n 'use strict';\n\n exports.default = race;\n\n /**\n This is a convenient alias for `RSVP.Promise.race`.\n \n @method race\n @static\n @for RSVP\n @param {Array} array Array of promises.\n @param {String} label An optional label. This is useful\n for tooling.\n */\n\n function race(array, label) {\n return _rsvpPromise.default.race(array, label);\n }\n});\nenifed('rsvp/reject', ['exports', 'rsvp/promise'], function (exports, _rsvpPromise) {\n 'use strict';\n\n exports.default = reject;\n\n /**\n This is a convenient alias for `RSVP.Promise.reject`.\n \n @method reject\n @static\n @for RSVP\n @param {*} reason value that the returned promise will be rejected with.\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n */\n\n function reject(reason, label) {\n return _rsvpPromise.default.reject(reason, label);\n }\n});\nenifed('rsvp/resolve', ['exports', 'rsvp/promise'], function (exports, _rsvpPromise) {\n 'use strict';\n\n exports.default = resolve;\n\n /**\n This is a convenient alias for `RSVP.Promise.resolve`.\n \n @method resolve\n @static\n @for RSVP\n @param {*} value value that the returned promise will be resolved with\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n */\n\n function resolve(value, label) {\n return _rsvpPromise.default.resolve(value, label);\n }\n});\nenifed(\"rsvp/rethrow\", [\"exports\"], function (exports) {\n /**\n `RSVP.rethrow` will rethrow an error on the next turn of the JavaScript event\n loop in order to aid debugging.\n \n Promises A+ specifies that any exceptions that occur with a promise must be\n caught by the promises implementation and bubbled to the last handler. For\n this reason, it is recommended that you always specify a second rejection\n handler function to `then`. However, `RSVP.rethrow` will throw the exception\n outside of the promise, so it bubbles up to your console if in the browser,\n or domain/cause uncaught exception in Node. `rethrow` will also throw the\n error again so the error can be handled by the promise per the spec.\n \n ```javascript\n function throws(){\n throw new Error('Whoops!');\n }\n \n var promise = new RSVP.Promise(function(resolve, reject){\n throws();\n });\n \n promise.catch(RSVP.rethrow).then(function(){\n // Code here doesn't run because the promise became rejected due to an\n // error!\n }, function (err){\n // handle the error here\n });\n ```\n \n The 'Whoops' error will be thrown on the next turn of the event loop\n and you can watch for it in your console. You can also handle it using a\n rejection handler given to `.then` or `.catch` on the returned promise.\n \n @method rethrow\n @static\n @for RSVP\n @param {Error} reason reason the promise became rejected.\n @throws Error\n @static\n */\n \"use strict\";\n\n exports.default = rethrow;\n\n function rethrow(reason) {\n setTimeout(function () {\n throw reason;\n });\n throw reason;\n }\n});\nenifed('rsvp/utils', ['exports'], function (exports) {\n 'use strict';\n\n exports.objectOrFunction = objectOrFunction;\n exports.isFunction = isFunction;\n exports.isMaybeThenable = isMaybeThenable;\n\n function objectOrFunction(x) {\n return typeof x === 'function' || typeof x === 'object' && x !== null;\n }\n\n function isFunction(x) {\n return typeof x === 'function';\n }\n\n function isMaybeThenable(x) {\n return typeof x === 'object' && x !== null;\n }\n\n var _isArray;\n if (!Array.isArray) {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n } else {\n _isArray = Array.isArray;\n }\n\n var isArray = _isArray;\n\n exports.isArray = isArray;\n // Date.now is not available in browsers < IE9\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#Compatibility\n var now = Date.now || function () {\n return new Date().getTime();\n };\n\n exports.now = now;\n function F() {}\n\n var o_create = Object.create || function (o) {\n if (arguments.length > 1) {\n throw new Error('Second argument not supported');\n }\n if (typeof o !== 'object') {\n throw new TypeError('Argument must be an object');\n }\n F.prototype = o;\n return new F();\n };\n exports.o_create = o_create;\n});\nenifed('rsvp', ['exports', 'rsvp/promise', 'rsvp/events', 'rsvp/node', 'rsvp/all', 'rsvp/all-settled', 'rsvp/race', 'rsvp/hash', 'rsvp/hash-settled', 'rsvp/rethrow', 'rsvp/defer', 'rsvp/config', 'rsvp/map', 'rsvp/resolve', 'rsvp/reject', 'rsvp/filter', 'rsvp/asap'], function (exports, _rsvpPromise, _rsvpEvents, _rsvpNode, _rsvpAll, _rsvpAllSettled, _rsvpRace, _rsvpHash, _rsvpHashSettled, _rsvpRethrow, _rsvpDefer, _rsvpConfig, _rsvpMap, _rsvpResolve, _rsvpReject, _rsvpFilter, _rsvpAsap) {\n 'use strict';\n\n // defaults\n _rsvpConfig.config.async = _rsvpAsap.default;\n _rsvpConfig.config.after = function (cb) {\n setTimeout(cb, 0);\n };\n var cast = _rsvpResolve.default;\n function async(callback, arg) {\n _rsvpConfig.config.async(callback, arg);\n }\n\n function on() {\n _rsvpConfig.config['on'].apply(_rsvpConfig.config, arguments);\n }\n\n function off() {\n _rsvpConfig.config['off'].apply(_rsvpConfig.config, arguments);\n }\n\n // Set up instrumentation through `window.__PROMISE_INTRUMENTATION__`\n if (typeof window !== 'undefined' && typeof window['__PROMISE_INSTRUMENTATION__'] === 'object') {\n var callbacks = window['__PROMISE_INSTRUMENTATION__'];\n _rsvpConfig.configure('instrument', true);\n for (var eventName in callbacks) {\n if (callbacks.hasOwnProperty(eventName)) {\n on(eventName, callbacks[eventName]);\n }\n }\n }\n\n exports.cast = cast;\n exports.Promise = _rsvpPromise.default;\n exports.EventTarget = _rsvpEvents.default;\n exports.all = _rsvpAll.default;\n exports.allSettled = _rsvpAllSettled.default;\n exports.race = _rsvpRace.default;\n exports.hash = _rsvpHash.default;\n exports.hashSettled = _rsvpHashSettled.default;\n exports.rethrow = _rsvpRethrow.default;\n exports.defer = _rsvpDefer.default;\n exports.denodeify = _rsvpNode.default;\n exports.configure = _rsvpConfig.configure;\n exports.on = on;\n exports.off = off;\n exports.resolve = _rsvpResolve.default;\n exports.reject = _rsvpReject.default;\n exports.async = async;\n exports.map = _rsvpMap.default;\n exports.filter = _rsvpFilter.default;\n});\nenifed('rsvp.umd', ['exports', 'rsvp/platform', 'rsvp'], function (exports, _rsvpPlatform, _rsvp) {\n 'use strict';\n\n var RSVP = {\n 'race': _rsvp.race,\n 'Promise': _rsvp.Promise,\n 'allSettled': _rsvp.allSettled,\n 'hash': _rsvp.hash,\n 'hashSettled': _rsvp.hashSettled,\n 'denodeify': _rsvp.denodeify,\n 'on': _rsvp.on,\n 'off': _rsvp.off,\n 'map': _rsvp.map,\n 'filter': _rsvp.filter,\n 'resolve': _rsvp.resolve,\n 'reject': _rsvp.reject,\n 'all': _rsvp.all,\n 'rethrow': _rsvp.rethrow,\n 'defer': _rsvp.defer,\n 'EventTarget': _rsvp.EventTarget,\n 'configure': _rsvp.configure,\n 'async': _rsvp.async\n };\n\n /* global define:true module:true window: true */\n if (typeof define === 'function' && define['amd']) {\n define(function () {\n return RSVP;\n });\n } else if (typeof module !== 'undefined' && module['exports']) {\n module['exports'] = RSVP;\n } else if (typeof _rsvpPlatform.default !== 'undefined') {\n _rsvpPlatform.default['RSVP'] = RSVP;\n }\n});\nenifed(\"vertex\", [\"exports\"], function (exports) {\n /**\n * DAG Vertex\n *\n * @class Vertex\n * @constructor\n */\n\n \"use strict\";\n\n exports.default = Vertex;\n\n function Vertex(name) {\n this.name = name;\n this.incoming = {};\n this.incomingNames = [];\n this.hasOutgoing = false;\n this.value = null;\n }\n});\nenifed(\"visit\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.default = visit;\n\n function visit(vertex, fn, visited, path) {\n var name = vertex.name;\n var vertices = vertex.incoming;\n var names = vertex.incomingNames;\n var len = names.length;\n var i;\n\n if (!visited) {\n visited = {};\n }\n if (!path) {\n path = [];\n }\n if (visited.hasOwnProperty(name)) {\n return;\n }\n path.push(name);\n visited[name] = true;\n for (i = 0; i < len; i++) {\n visit(vertices[names[i]], fn, visited, path);\n }\n fn(vertex, path);\n path.pop();\n }\n});\nrequireModule(\"ember\");\n\n}());\n","(function() {\n/* globals define, Ember, jQuery */\n\n function processEmberShims() {\n var shims = {\n 'ember': {\n 'default': Ember\n },\n 'ember-application': {\n 'default': Ember.Application\n },\n 'ember-array': {\n 'default': Ember.Array\n },\n 'ember-array/mutable': {\n 'default': Ember.MutableArray\n },\n 'ember-array/utils': {\n 'A': Ember.A,\n 'isEmberArray': Ember.isArray,\n 'wrap': Ember.makeArray\n },\n 'ember-component': {\n 'default': Ember.Component\n },\n 'ember-components/checkbox': {\n 'default': Ember.Checkbox\n },\n 'ember-components/text-area': {\n 'default': Ember.TextArea\n },\n 'ember-components/text-field': {\n 'default': Ember.TextField\n },\n 'ember-controller': {\n 'default': Ember.Controller\n },\n 'ember-controller/inject': {\n 'default': Ember.inject.controller\n },\n 'ember-controller/proxy': {\n 'default': Ember.ArrayProxy\n },\n 'ember-controllers/sortable': {\n 'default': Ember.SortableMixin\n },\n 'ember-debug': {\n 'log': Ember.debug,\n 'inspect': Ember.inspect,\n 'run': Ember.runInDebug,\n 'warn': Ember.warn\n },\n 'ember-debug/container-debug-adapter': {\n 'default': Ember.ContainerDebugAdapter\n },\n 'ember-debug/data-adapter': {\n 'default': Ember.DataAdapter\n },\n 'ember-deprecations': {\n 'deprecate': Ember.deprecate,\n 'deprecateFunc': Ember.deprecateFunc\n },\n 'ember-enumerable': {\n 'default': Ember.Enumerable\n },\n 'ember-evented': {\n 'default': Ember.Evented\n },\n 'ember-evented/on': {\n 'default': Ember.on\n },\n 'ember-globals-resolver': {\n 'default': Ember.DefaultResolver\n },\n 'ember-helper': {\n 'default': Ember.Helper,\n 'helper': Ember.Helper && Ember.Helper.helper\n },\n 'ember-instrumentation': {\n 'instrument': Ember.Instrumentation.instrument,\n 'reset': Ember.Instrumentation.reset,\n 'subscribe': Ember.Instrumentation.subscribe,\n 'unsubscribe': Ember.Instrumentation.unsubscribe\n },\n 'ember-locations/hash': {\n 'default': Ember.HashLocation\n },\n 'ember-locations/history': {\n 'default': Ember.HistoryLocation\n },\n 'ember-locations/none': {\n 'default': Ember.NoneLocation\n },\n 'ember-map': {\n 'default': Ember.Map,\n 'withDefault': Ember.MapWithDefault\n },\n 'ember-metal/destroy': {\n 'default': Ember.destroy\n },\n 'ember-metal/events': {\n 'addListener': Ember.addListener,\n 'removeListener': Ember.removeListener,\n 'send': Ember.sendEvent\n },\n 'ember-metal/get': {\n 'default': Ember.get,\n 'getProperties': Ember.getProperties\n },\n 'ember-metal/mixin': {\n 'default': Ember.Mixin\n },\n 'ember-metal/observer': {\n 'default': Ember.observer,\n 'addObserver': Ember.addObserver,\n 'removeObserver': Ember.removeObserver\n },\n 'ember-metal/on-load': {\n 'default': Ember.onLoad,\n 'run': Ember.runLoadHooks\n },\n 'ember-metal/set': {\n 'default': Ember.set,\n 'setProperties': Ember.setProperties,\n 'trySet': Ember.trySet\n },\n 'ember-metal/utils': {\n 'aliasMethod': Ember.aliasMethod,\n 'assert': Ember.assert,\n 'cacheFor': Ember.cacheFor,\n 'copy': Ember.copy,\n 'guidFor': Ember.guidFor\n },\n 'ember-object': {\n 'default': Ember.Object\n },\n 'ember-platform': {\n 'assign': Ember.merge,\n 'create': Ember.create,\n 'defineProperty': Ember.platform.defineProperty,\n 'hasAccessors': Ember.platform.hasPropertyAccessors,\n 'keys': Ember.keys\n },\n 'ember-route': {\n 'default': Ember.Route\n },\n 'ember-router': {\n 'default': Ember.Router\n },\n 'ember-runloop': {\n 'default': Ember.run,\n 'begin': Ember.run.begin,\n 'bind': Ember.run.bind,\n 'cancel': Ember.run.cancel,\n 'debounce': Ember.run.debounce,\n 'end': Ember.run.end,\n 'join': Ember.run.join,\n 'later': Ember.run.later,\n 'next': Ember.run.next,\n 'once': Ember.run.once,\n 'schedule': Ember.run.schedule,\n 'scheduleOnce': Ember.run.scheduleOnce,\n 'throttle': Ember.run.throttle\n },\n 'ember-service': {\n 'default': Ember.Service\n },\n 'ember-service/inject': {\n 'default': Ember.inject.service\n },\n 'ember-set/ordered': {\n 'default': Ember.OrderedSet\n },\n 'ember-string': {\n 'camelize': Ember.String.camelize,\n 'capitalize': Ember.String.capitalize,\n 'classify': Ember.String.classify,\n 'dasherize': Ember.String.dasherize,\n 'decamelize': Ember.String.decamelize,\n 'fmt': Ember.String.fmt,\n 'htmlSafe': Ember.String.htmlSafe,\n 'loc': Ember.String.loc,\n 'underscore': Ember.String.underscore,\n 'w': Ember.String.w\n },\n 'ember-utils': {\n 'isBlank': Ember.isBlank,\n 'isEmpty': Ember.isEmpty,\n 'isNone': Ember.isNone,\n 'isPresent': Ember.isPresent,\n 'tryInvoke': Ember.tryInvoke,\n 'typeOf': Ember.typeOf\n }\n };\n\n // populate `ember/computed` named exports\n shims['ember-computed'] = {\n 'default': Ember.computed\n };\n var computedMacros = [\n \"empty\",\"notEmpty\", \"none\", \"not\", \"bool\", \"match\",\n \"equal\", \"gt\", \"gte\", \"lt\", \"lte\", \"alias\", \"oneWay\",\n \"reads\", \"readOnly\", \"deprecatingAlias\",\n \"and\", \"or\", \"collect\", \"sum\", \"min\", \"max\",\n \"map\", \"sort\", \"setDiff\", \"mapBy\", \"mapProperty\",\n \"filter\", \"filterBy\", \"filterProperty\", \"uniq\",\n \"union\", \"intersect\"\n ];\n for (var i = 0, l = computedMacros.length; i < l; i++) {\n var key = computedMacros[i];\n shims['ember-computed'][key] = Ember.computed[key];\n }\n\n for (var moduleName in shims) {\n generateModule(moduleName, shims[moduleName]);\n }\n }\n\n function processTestShims() {\n if (Ember.Test) {\n var testShims = {\n 'ember-test': {\n 'default': Ember.Test\n },\n 'ember-test/adapter': {\n 'default': Ember.Test.Adapter\n },\n 'ember-test/qunit-adapter': {\n 'default': Ember.Test.QUnitAdapter\n }\n };\n\n for (var moduleName in testShims) {\n generateModule(moduleName, testShims[moduleName]);\n }\n }\n }\n\n function generateModule(name, values) {\n define(name, [], function() {\n 'use strict';\n\n return values;\n });\n }\n\n processEmberShims();\n processTestShims();\n generateModule('jquery', { 'default': self.jQuery });\n generateModule('rsvp', { 'default': Ember.RSVP });\n})();\n","(function() {\n function objectAt(content, idx) {\n if (content.objectAt) {\n return content.objectAt(idx);\n }\n\n return content[idx];\n }\n\n function arrayIncludes(obj, startAt) {\n var len = Ember.get(this, 'length');\n var idx, currentObj;\n\n if (startAt === undefined) {\n startAt = 0;\n }\n\n if (startAt < 0) {\n startAt += len;\n }\n\n for (idx = startAt; idx < len; idx++) {\n currentObj = objectAt(this, idx);\n\n // SameValueZero comparison (NaN !== NaN)\n if (obj === currentObj || (obj !== obj && currentObj !== currentObj)) {\n return true;\n }\n }\n\n return false;\n }\n\n Ember.Array.reopen({\n // inlined from https://git.io/v6F5T\n includes: arrayIncludes\n });\n\n Ember.MutableArray.reopen({\n addObject: function(obj) {\n if (!this.includes(obj)) {\n this.pushObject(obj);\n }\n\n return this;\n }\n });\n\n Ember.Enumerable.reopen({\n includes: function(obj) {\n Ember.assert('Enumerable#includes cannot accept a second argument \"startAt\" as enumerable items are unordered.', arguments.length === 1);\n\n var len = Ember.get(this, 'length');\n var idx, next;\n var last = null;\n var found = false;\n\n for (idx = 0; idx < len && !found; idx++) {\n next = this.nextObject(idx, last);\n\n found = obj === next || (obj !== obj && next !== next);\n\n last = next;\n }\n\n next = last = null;\n\n return found;\n }\n });\n\n if ((Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Array) && !Array.prototype.includes) {\n Array.prototype.includes = arrayIncludes;\n }\n})();\n","/* globals define */\ndefine('ember/load-initializers', ['exports', 'ember-load-initializers', 'ember'], function(exports, loadInitializers, Ember) {\n Ember['default'].deprecate(\n 'Usage of `' + 'ember/load-initializers' + '` module is deprecated, please update to `ember-load-initializers`.',\n false,\n { id: 'ember-load-initializers.legacy-shims', until: '3.0.0' }\n );\n\n exports['default'] = loadInitializers['default'];\n});\n","/* globals define */\n\nfunction createDeprecatedModule(moduleId) {\n define(moduleId, ['exports', 'ember-resolver/resolver', 'ember'], function(exports, Resolver, Ember) {\n Ember['default'].deprecate(\n 'Usage of `' + moduleId + '` module is deprecated, please update to `ember-resolver`.',\n false,\n { id: 'ember-resolver.legacy-shims', until: '3.0.0' }\n );\n\n exports['default'] = Resolver['default'];\n });\n}\n\ncreateDeprecatedModule('ember/resolver');\ncreateDeprecatedModule('resolver');\n","// ==ClosureCompiler==\n// @compilation_level SIMPLE_OPTIMIZATIONS\n\n/**\n * @license Highstock JS v4.2.6 (2016-08-02)\n *\n * (c) 2009-2016 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n\n(function (root, factory) {\n if (typeof module === 'object' && module.exports) {\n module.exports = root.document ?\n factory(root) : \n factory;\n } else {\n root.Highcharts = factory(root);\n }\n}(typeof window !== 'undefined' ? window : this, function (win) { // eslint-disable-line no-undef\n// encapsulated variables\n var UNDEFINED,\n doc = win.document,\n math = Math,\n mathRound = math.round,\n mathFloor = math.floor,\n mathCeil = math.ceil,\n mathMax = math.max,\n mathMin = math.min,\n mathAbs = math.abs,\n mathCos = math.cos,\n mathSin = math.sin,\n mathPI = math.PI,\n deg2rad = mathPI * 2 / 360,\n\n\n // some variables\n userAgent = (win.navigator && win.navigator.userAgent) || '',\n isOpera = win.opera,\n isMS = /(msie|trident|edge)/i.test(userAgent) && !isOpera,\n docMode8 = doc && doc.documentMode === 8,\n isWebKit = !isMS && /AppleWebKit/.test(userAgent),\n isFirefox = /Firefox/.test(userAgent),\n isTouchDevice = /(Mobile|Android|Windows Phone)/.test(userAgent),\n SVG_NS = 'http://www.w3.org/2000/svg',\n hasSVG = doc && doc.createElementNS && !!doc.createElementNS(SVG_NS, 'svg').createSVGRect,\n hasBidiBug = isFirefox && parseInt(userAgent.split('Firefox/')[1], 10) < 4, // issue #38\n useCanVG = doc && !hasSVG && !isMS && !!doc.createElement('canvas').getContext,\n Renderer,\n hasTouch,\n symbolSizes = {},\n idCounter = 0,\n garbageBin,\n defaultOptions,\n dateFormat, // function\n pathAnim,\n timeUnits,\n noop = function () {},\n charts = [],\n chartCount = 0,\n PRODUCT = 'Highstock',\n VERSION = '4.2.6',\n\n // some constants for frequently used strings\n DIV = 'div',\n ABSOLUTE = 'absolute',\n RELATIVE = 'relative',\n HIDDEN = 'hidden',\n PREFIX = 'highcharts-',\n VISIBLE = 'visible',\n PX = 'px',\n NONE = 'none',\n M = 'M',\n L = 'L',\n numRegex = /^[0-9]+$/,\n NORMAL_STATE = '',\n HOVER_STATE = 'hover',\n SELECT_STATE = 'select',\n marginNames = ['plotTop', 'marginRight', 'marginBottom', 'plotLeft'],\n\n // Object for extending Axis\n AxisPlotLineOrBandExtension,\n\n // constants for attributes\n STROKE_WIDTH = 'stroke-width',\n\n // time methods, changed based on whether or not UTC is used\n Date, // Allow using a different Date class\n makeTime,\n timezoneOffset,\n getTimezoneOffset,\n getMinutes,\n getHours,\n getDay,\n getDate,\n getMonth,\n getFullYear,\n setMilliseconds,\n setSeconds,\n setMinutes,\n setHours,\n setDate,\n setMonth,\n setFullYear,\n\n\n // lookup over the types and the associated classes\n seriesTypes = {},\n Highcharts;\n\n /**\n * Provide error messages for debugging, with links to online explanation\n */\n function error(code, stop) {\n var msg = 'Highcharts error #' + code + ': www.highcharts.com/errors/' + code;\n if (stop) {\n throw new Error(msg);\n }\n // else ...\n if (win.console) {\n console.log(msg); // eslint-disable-line no-console\n }\n }\n\n // The Highcharts namespace\n Highcharts = win.Highcharts ? error(16, true) : { win: win };\n\n Highcharts.seriesTypes = seriesTypes;\n var timers = [],\n getStyle,\n\n // Previous adapter functions\n inArray,\n each,\n grep,\n offset,\n map,\n addEvent,\n removeEvent,\n fireEvent,\n animate,\n stop;\n\n /**\n * An animator object. One instance applies to one property (attribute or style prop) \n * on one element.\n * \n * @param {object} elem The element to animate. May be a DOM element or a Highcharts SVGElement wrapper.\n * @param {object} options Animation options, including duration, easing, step and complete.\n * @param {object} prop The property to animate.\n */\n function Fx(elem, options, prop) {\n this.options = options;\n this.elem = elem;\n this.prop = prop;\n }\n Fx.prototype = {\n \n /**\n * Animating a path definition on SVGElement\n * @returns {undefined} \n */\n dSetter: function () {\n var start = this.paths[0],\n end = this.paths[1],\n ret = [],\n now = this.now,\n i = start.length,\n startVal;\n\n if (now === 1) { // land on the final path without adjustment points appended in the ends\n ret = this.toD;\n\n } else if (i === end.length && now < 1) {\n while (i--) {\n startVal = parseFloat(start[i]);\n ret[i] =\n isNaN(startVal) ? // a letter instruction like M or L\n start[i] :\n now * (parseFloat(end[i] - startVal)) + startVal;\n\n }\n } else { // if animation is finished or length not matching, land on right value\n ret = end;\n }\n this.elem.attr('d', ret);\n },\n\n /**\n * Update the element with the current animation step\n * @returns {undefined}\n */\n update: function () {\n var elem = this.elem,\n prop = this.prop, // if destroyed, it is null\n now = this.now,\n step = this.options.step;\n\n // Animation setter defined from outside\n if (this[prop + 'Setter']) {\n this[prop + 'Setter']();\n\n // Other animations on SVGElement\n } else if (elem.attr) {\n if (elem.element) {\n elem.attr(prop, now);\n }\n\n // HTML styles, raw HTML content like container size\n } else {\n elem.style[prop] = now + this.unit;\n }\n \n if (step) {\n step.call(elem, now, this);\n }\n\n },\n\n /**\n * Run an animation\n */\n run: function (from, to, unit) {\n var self = this,\n timer = function (gotoEnd) {\n return timer.stopped ? false : self.step(gotoEnd);\n },\n i;\n\n this.startTime = +new Date();\n this.start = from;\n this.end = to;\n this.unit = unit;\n this.now = this.start;\n this.pos = 0;\n\n timer.elem = this.elem;\n\n if (timer() && timers.push(timer) === 1) {\n timer.timerId = setInterval(function () {\n \n for (i = 0; i < timers.length; i++) {\n if (!timers[i]()) {\n timers.splice(i--, 1);\n }\n }\n\n if (!timers.length) {\n clearInterval(timer.timerId);\n }\n }, 13);\n }\n },\n \n /**\n * Run a single step in the animation\n * @param {Boolean} gotoEnd Whether to go to then endpoint of the animation after abort\n * @returns {Boolean} True if animation continues\n */\n step: function (gotoEnd) {\n var t = +new Date(),\n ret,\n done,\n options = this.options,\n elem = this.elem,\n complete = options.complete,\n duration = options.duration,\n curAnim = options.curAnim,\n i;\n \n if (elem.attr && !elem.element) { // #2616, element including flag is destroyed\n ret = false;\n\n } else if (gotoEnd || t >= duration + this.startTime) {\n this.now = this.end;\n this.pos = 1;\n this.update();\n\n curAnim[this.prop] = true;\n\n done = true;\n for (i in curAnim) {\n if (curAnim[i] !== true) {\n done = false;\n }\n }\n\n if (done && complete) {\n complete.call(elem);\n }\n ret = false;\n\n } else {\n this.pos = options.easing((t - this.startTime) / duration);\n this.now = this.start + ((this.end - this.start) * this.pos);\n this.update();\n ret = true;\n }\n return ret;\n },\n\n /**\n * Prepare start and end values so that the path can be animated one to one\n */\n initPath: function (elem, fromD, toD) {\n fromD = fromD || '';\n var shift,\n startX = elem.startX,\n endX = elem.endX,\n bezier = fromD.indexOf('C') > -1,\n numParams = bezier ? 7 : 3,\n fullLength,\n slice,\n i,\n start = fromD.split(' '),\n end = toD.slice(), // copy\n isArea = elem.isArea,\n positionFactor = isArea ? 2 : 1,\n reverse;\n \n /**\n * In splines make move points have six parameters like bezier curves\n */\n function sixify(arr) {\n i = arr.length;\n while (i--) {\n if (arr[i] === M || arr[i] === L) {\n arr.splice(i + 1, 0, arr[i + 1], arr[i + 2], arr[i + 1], arr[i + 2]);\n }\n }\n }\n\n /**\n * Insert an array at the given position of another array\n */\n function insertSlice(arr, subArr, index) {\n [].splice.apply(\n arr,\n [index, 0].concat(subArr)\n );\n }\n\n /**\n * If shifting points, prepend a dummy point to the end path. \n */\n function prepend(arr, other) {\n while (arr.length < fullLength) {\n \n // Move to, line to or curve to?\n arr[0] = other[fullLength - arr.length];\n\n // Prepend a copy of the first point\n insertSlice(arr, arr.slice(0, numParams), 0);\n\n // For areas, the bottom path goes back again to the left, so we need\n // to append a copy of the last point.\n if (isArea) {\n insertSlice(arr, arr.slice(arr.length - numParams), arr.length);\n i--;\n }\n }\n arr[0] = 'M';\n }\n\n /**\n * Copy and append last point until the length matches the end length\n */\n function append(arr, other) {\n var i = (fullLength - arr.length) / numParams;\n while (i > 0 && i--) {\n\n // Pull out the slice that is going to be appended or inserted. In a line graph,\n // the positionFactor is 1, and the last point is sliced out. In an area graph,\n // the positionFactor is 2, causing the middle two points to be sliced out, since\n // an area path starts at left, follows the upper path then turns and follows the\n // bottom back. \n slice = arr.slice().splice(\n (arr.length / positionFactor) - numParams, \n numParams * positionFactor\n );\n\n // Move to, line to or curve to?\n slice[0] = other[fullLength - numParams - (i * numParams)];\n \n // Disable first control point\n if (bezier) {\n slice[numParams - 6] = slice[numParams - 2];\n slice[numParams - 5] = slice[numParams - 1];\n }\n \n // Now insert the slice, either in the middle (for areas) or at the end (for lines)\n insertSlice(arr, slice, arr.length / positionFactor);\n\n if (isArea) {\n i--;\n }\n }\n }\n\n if (bezier) {\n sixify(start);\n sixify(end);\n }\n\n // For sideways animation, find out how much we need to shift to get the start path Xs\n // to match the end path Xs.\n if (startX && endX) {\n for (i = 0; i < startX.length; i++) {\n if (startX[i] === endX[0]) { // Moving left, new points coming in on right\n shift = i;\n break;\n } else if (startX[0] === endX[endX.length - startX.length + i]) { // Moving right\n shift = i;\n reverse = true;\n break;\n }\n }\n if (shift === undefined) {\n start = [];\n }\n }\n\n if (start.length && Highcharts.isNumber(shift)) {\n\n // The common target length for the start and end array, where both \n // arrays are padded in opposite ends\n fullLength = end.length + shift * positionFactor * numParams;\n \n if (!reverse) {\n prepend(end, start);\n append(start, end);\n } else {\n prepend(start, end);\n append(end, start);\n }\n }\n\n return [start, end];\n }\n }; // End of Fx prototype\n\n\n /**\n * Extend an object with the members of another\n * @param {Object} a The object to be extended\n * @param {Object} b The object to add to the first one\n */\n var extend = Highcharts.extend = function (a, b) {\n var n;\n if (!a) {\n a = {};\n }\n for (n in b) {\n a[n] = b[n];\n }\n return a;\n };\n\n /**\n * Deep merge two or more objects and return a third object. If the first argument is\n * true, the contents of the second object is copied into the first object.\n * Previously this function redirected to jQuery.extend(true), but this had two limitations.\n * First, it deep merged arrays, which lead to workarounds in Highcharts. Second,\n * it copied properties from extended prototypes.\n */\n function merge() {\n var i,\n args = arguments,\n len,\n ret = {},\n doCopy = function (copy, original) {\n var value, key;\n\n // An object is replacing a primitive\n if (typeof copy !== 'object') {\n copy = {};\n }\n\n for (key in original) {\n if (original.hasOwnProperty(key)) {\n value = original[key];\n\n // Copy the contents of objects, but not arrays or DOM nodes\n if (value && typeof value === 'object' && Object.prototype.toString.call(value) !== '[object Array]' &&\n key !== 'renderTo' && typeof value.nodeType !== 'number') {\n copy[key] = doCopy(copy[key] || {}, value);\n\n // Primitives and arrays are copied over directly\n } else {\n copy[key] = original[key];\n }\n }\n }\n return copy;\n };\n\n // If first argument is true, copy into the existing object. Used in setOptions.\n if (args[0] === true) {\n ret = args[1];\n args = Array.prototype.slice.call(args, 2);\n }\n\n // For each argument, extend the return\n len = args.length;\n for (i = 0; i < len; i++) {\n ret = doCopy(ret, args[i]);\n }\n\n return ret;\n }\n\n /**\n * Shortcut for parseInt\n * @param {Object} s\n * @param {Number} mag Magnitude\n */\n function pInt(s, mag) {\n return parseInt(s, mag || 10);\n }\n\n /**\n * Check for string\n * @param {Object} s\n */\n function isString(s) {\n return typeof s === 'string';\n }\n\n /**\n * Check for array\n * @param {Object} obj\n */\n function isArray(obj) {\n return Object.prototype.toString.call(obj) === '[object Array]';\n }\n\n /**\n * Check for object\n * @param {Object} obj\n * @param {Boolean} strict Also checks that the object is not an array\n */\n var isObject = Highcharts.isObject = function (obj, strict) {\n //debugger;\n return obj && typeof obj === 'object' && (!strict || !isArray(obj));\n };\n\n /**\n * Check for number\n * @param {Object} n\n */\n var isNumber = Highcharts.isNumber = function isNumber(n) {\n return typeof n === 'number' && !isNaN(n);\n };\n\n /**\n * Remove last occurence of an item from an array\n * @param {Array} arr\n * @param {Mixed} item\n */\n function erase(arr, item) {\n var i = arr.length;\n while (i--) {\n if (arr[i] === item) {\n arr.splice(i, 1);\n break;\n }\n }\n //return arr;\n }\n\n /**\n * Returns true if the object is not null or undefined.\n * @param {Object} obj\n */\n function defined(obj) {\n return obj !== UNDEFINED && obj !== null;\n }\n\n /**\n * Set or get an attribute or an object of attributes. Can't use jQuery attr because\n * it attempts to set expando properties on the SVG element, which is not allowed.\n *\n * @param {Object} elem The DOM element to receive the attribute(s)\n * @param {String|Object} prop The property or an abject of key-value pairs\n * @param {String} value The value if a single property is set\n */\n function attr(elem, prop, value) {\n var key,\n ret;\n\n // if the prop is a string\n if (isString(prop)) {\n // set the value\n if (defined(value)) {\n elem.setAttribute(prop, value);\n\n // get the value\n } else if (elem && elem.getAttribute) { // elem not defined when printing pie demo...\n ret = elem.getAttribute(prop);\n }\n\n // else if prop is defined, it is a hash of key/value pairs\n } else if (defined(prop) && isObject(prop)) {\n for (key in prop) {\n elem.setAttribute(key, prop[key]);\n }\n }\n return ret;\n }\n /**\n * Check if an element is an array, and if not, make it into an array.\n */\n function splat(obj) {\n return isArray(obj) ? obj : [obj];\n }\n\n /**\n * Set a timeout if the delay is given, otherwise perform the function synchronously\n * @param {Function} fn The function to perform\n * @param {Number} delay Delay in milliseconds\n * @param {Ojbect} context The context\n * @returns {Nubmer} An identifier for the timeout\n */\n function syncTimeout(fn, delay, context) {\n if (delay) {\n return setTimeout(fn, delay, context);\n }\n fn.call(0, context);\n }\n\n\n /**\n * Return the first value that is defined.\n */\n var pick = Highcharts.pick = function () {\n var args = arguments,\n i,\n arg,\n length = args.length;\n for (i = 0; i < length; i++) {\n arg = args[i];\n if (arg !== UNDEFINED && arg !== null) {\n return arg;\n }\n }\n };\n\n /**\n * Set CSS on a given element\n * @param {Object} el\n * @param {Object} styles Style object with camel case property names\n */\n function css(el, styles) {\n if (isMS && !hasSVG) { // #2686\n if (styles && styles.opacity !== UNDEFINED) {\n styles.filter = 'alpha(opacity=' + (styles.opacity * 100) + ')';\n }\n }\n extend(el.style, styles);\n }\n\n /**\n * Utility function to create element with attributes and styles\n * @param {Object} tag\n * @param {Object} attribs\n * @param {Object} styles\n * @param {Object} parent\n * @param {Object} nopad\n */\n function createElement(tag, attribs, styles, parent, nopad) {\n var el = doc.createElement(tag);\n if (attribs) {\n extend(el, attribs);\n }\n if (nopad) {\n css(el, { padding: 0, border: 'none', margin: 0 });\n }\n if (styles) {\n css(el, styles);\n }\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n }\n\n /**\n * Extend a prototyped class by new members\n * @param {Object} parent\n * @param {Object} members\n */\n function extendClass(Parent, members) {\n var object = function () {\n };\n object.prototype = new Parent();\n extend(object.prototype, members);\n return object;\n }\n\n /**\n * Pad a string to a given length by adding 0 to the beginning\n * @param {Number} number\n * @param {Number} length\n */\n function pad(number, length, padder) {\n return new Array((length || 2) + 1 - String(number).length).join(padder || 0) + number;\n }\n\n /**\n * Return a length based on either the integer value, or a percentage of a base.\n */\n function relativeLength(value, base) {\n return (/%$/).test(value) ? base * parseFloat(value) / 100 : parseFloat(value);\n }\n\n /**\n * Wrap a method with extended functionality, preserving the original function\n * @param {Object} obj The context object that the method belongs to\n * @param {String} method The name of the method to extend\n * @param {Function} func A wrapper function callback. This function is called with the same arguments\n * as the original function, except that the original function is unshifted and passed as the first\n * argument.\n */\n var wrap = Highcharts.wrap = function (obj, method, func) {\n var proceed = obj[method];\n obj[method] = function () {\n var args = Array.prototype.slice.call(arguments);\n args.unshift(proceed);\n return func.apply(this, args);\n };\n };\n\n\n function getTZOffset(timestamp) {\n return ((getTimezoneOffset && getTimezoneOffset(timestamp)) || timezoneOffset || 0) * 60000;\n }\n\n /**\n * Based on http://www.php.net/manual/en/function.strftime.php\n * @param {String} format\n * @param {Number} timestamp\n * @param {Boolean} capitalize\n */\n dateFormat = function (format, timestamp, capitalize) {\n if (!defined(timestamp) || isNaN(timestamp)) {\n return defaultOptions.lang.invalidDate || '';\n }\n format = pick(format, '%Y-%m-%d %H:%M:%S');\n\n var date = new Date(timestamp - getTZOffset(timestamp)),\n key, // used in for constuct below\n // get the basic time values\n hours = date[getHours](),\n day = date[getDay](),\n dayOfMonth = date[getDate](),\n month = date[getMonth](),\n fullYear = date[getFullYear](),\n lang = defaultOptions.lang,\n langWeekdays = lang.weekdays,\n shortWeekdays = lang.shortWeekdays,\n\n // List all format keys. Custom formats can be added from the outside.\n replacements = extend({\n\n // Day\n 'a': shortWeekdays ? shortWeekdays[day] : langWeekdays[day].substr(0, 3), // Short weekday, like 'Mon'\n 'A': langWeekdays[day], // Long weekday, like 'Monday'\n 'd': pad(dayOfMonth), // Two digit day of the month, 01 to 31\n 'e': pad(dayOfMonth, 2, ' '), // Day of the month, 1 through 31\n 'w': day,\n\n // Week (none implemented)\n //'W': weekNumber(),\n\n // Month\n 'b': lang.shortMonths[month], // Short month, like 'Jan'\n 'B': lang.months[month], // Long month, like 'January'\n 'm': pad(month + 1), // Two digit month number, 01 through 12\n\n // Year\n 'y': fullYear.toString().substr(2, 2), // Two digits year, like 09 for 2009\n 'Y': fullYear, // Four digits year, like 2009\n\n // Time\n 'H': pad(hours), // Two digits hours in 24h format, 00 through 23\n 'k': hours, // Hours in 24h format, 0 through 23\n 'I': pad((hours % 12) || 12), // Two digits hours in 12h format, 00 through 11\n 'l': (hours % 12) || 12, // Hours in 12h format, 1 through 12\n 'M': pad(date[getMinutes]()), // Two digits minutes, 00 through 59\n 'p': hours < 12 ? 'AM' : 'PM', // Upper case AM or PM\n 'P': hours < 12 ? 'am' : 'pm', // Lower case AM or PM\n 'S': pad(date.getSeconds()), // Two digits seconds, 00 through 59\n 'L': pad(mathRound(timestamp % 1000), 3) // Milliseconds (naming from Ruby)\n }, Highcharts.dateFormats);\n\n\n // do the replaces\n for (key in replacements) {\n while (format.indexOf('%' + key) !== -1) { // regex would do it in one line, but this is faster\n format = format.replace('%' + key, typeof replacements[key] === 'function' ? replacements[key](timestamp) : replacements[key]);\n }\n }\n\n // Optionally capitalize the string and return\n return capitalize ? format.substr(0, 1).toUpperCase() + format.substr(1) : format;\n };\n\n /**\n * Format a single variable. Similar to sprintf, without the % prefix.\n */\n function formatSingle(format, val) {\n var floatRegex = /f$/,\n decRegex = /\\.([0-9])/,\n lang = defaultOptions.lang,\n decimals;\n\n if (floatRegex.test(format)) { // float\n decimals = format.match(decRegex);\n decimals = decimals ? decimals[1] : -1;\n if (val !== null) {\n val = Highcharts.numberFormat(\n val,\n decimals,\n lang.decimalPoint,\n format.indexOf(',') > -1 ? lang.thousandsSep : ''\n );\n }\n } else {\n val = dateFormat(format, val);\n }\n return val;\n }\n\n /**\n * Format a string according to a subset of the rules of Python's String.format method.\n */\n function format(str, ctx) {\n var splitter = '{',\n isInside = false,\n segment,\n valueAndFormat,\n path,\n i,\n len,\n ret = [],\n val,\n index;\n\n while ((index = str.indexOf(splitter)) !== -1) {\n\n segment = str.slice(0, index);\n if (isInside) { // we're on the closing bracket looking back\n\n valueAndFormat = segment.split(':');\n path = valueAndFormat.shift().split('.'); // get first and leave format\n len = path.length;\n val = ctx;\n\n // Assign deeper paths\n for (i = 0; i < len; i++) {\n val = val[path[i]];\n }\n\n // Format the replacement\n if (valueAndFormat.length) {\n val = formatSingle(valueAndFormat.join(':'), val);\n }\n\n // Push the result and advance the cursor\n ret.push(val);\n\n } else {\n ret.push(segment);\n\n }\n str = str.slice(index + 1); // the rest\n isInside = !isInside; // toggle\n splitter = isInside ? '}' : '{'; // now look for next matching bracket\n }\n ret.push(str);\n return ret.join('');\n }\n\n /**\n * Get the magnitude of a number\n */\n function getMagnitude(num) {\n return math.pow(10, mathFloor(math.log(num) / math.LN10));\n }\n\n /**\n * Take an interval and normalize it to multiples of 1, 2, 2.5 and 5\n * @param {Number} interval\n * @param {Array} multiples\n * @param {Number} magnitude\n * @param {Object} options\n */\n function normalizeTickInterval(interval, multiples, magnitude, allowDecimals, preventExceed) {\n var normalized,\n i,\n retInterval = interval;\n\n // round to a tenfold of 1, 2, 2.5 or 5\n magnitude = pick(magnitude, 1);\n normalized = interval / magnitude;\n\n // multiples for a linear scale\n if (!multiples) {\n multiples = [1, 2, 2.5, 5, 10];\n\n // the allowDecimals option\n if (allowDecimals === false) {\n if (magnitude === 1) {\n multiples = [1, 2, 5, 10];\n } else if (magnitude <= 0.1) {\n multiples = [1 / magnitude];\n }\n }\n }\n\n // normalize the interval to the nearest multiple\n for (i = 0; i < multiples.length; i++) {\n retInterval = multiples[i];\n if ((preventExceed && retInterval * magnitude >= interval) || // only allow tick amounts smaller than natural\n (!preventExceed && (normalized <= (multiples[i] + (multiples[i + 1] || multiples[i])) / 2))) {\n break;\n }\n }\n\n // multiply back to the correct magnitude\n retInterval *= magnitude;\n\n return retInterval;\n }\n\n\n /**\n * Utility method that sorts an object array and keeping the order of equal items.\n * ECMA script standard does not specify the behaviour when items are equal.\n */\n function stableSort(arr, sortFunction) {\n var length = arr.length,\n sortValue,\n i;\n\n // Add index to each item\n for (i = 0; i < length; i++) {\n arr[i].safeI = i; // stable sort index\n }\n\n arr.sort(function (a, b) {\n sortValue = sortFunction(a, b);\n return sortValue === 0 ? a.safeI - b.safeI : sortValue;\n });\n\n // Remove index from items\n for (i = 0; i < length; i++) {\n delete arr[i].safeI; // stable sort index\n }\n }\n\n /**\n * Non-recursive method to find the lowest member of an array. Math.min raises a maximum\n * call stack size exceeded error in Chrome when trying to apply more than 150.000 points. This\n * method is slightly slower, but safe.\n */\n function arrayMin(data) {\n var i = data.length,\n min = data[0];\n\n while (i--) {\n if (data[i] < min) {\n min = data[i];\n }\n }\n return min;\n }\n\n /**\n * Non-recursive method to find the lowest member of an array. Math.min raises a maximum\n * call stack size exceeded error in Chrome when trying to apply more than 150.000 points. This\n * method is slightly slower, but safe.\n */\n function arrayMax(data) {\n var i = data.length,\n max = data[0];\n\n while (i--) {\n if (data[i] > max) {\n max = data[i];\n }\n }\n return max;\n }\n\n /**\n * Utility method that destroys any SVGElement or VMLElement that are properties on the given object.\n * It loops all properties and invokes destroy if there is a destroy method. The property is\n * then delete'ed.\n * @param {Object} The object to destroy properties on\n * @param {Object} Exception, do not destroy this property, only delete it.\n */\n function destroyObjectProperties(obj, except) {\n var n;\n for (n in obj) {\n // If the object is non-null and destroy is defined\n if (obj[n] && obj[n] !== except && obj[n].destroy) {\n // Invoke the destroy\n obj[n].destroy();\n }\n\n // Delete the property from the object.\n delete obj[n];\n }\n }\n\n\n /**\n * Discard an element by moving it to the bin and delete\n * @param {Object} The HTML node to discard\n */\n function discardElement(element) {\n // create a garbage bin element, not part of the DOM\n if (!garbageBin) {\n garbageBin = createElement(DIV);\n }\n\n // move the node and empty bin\n if (element) {\n garbageBin.appendChild(element);\n }\n garbageBin.innerHTML = '';\n }\n\n /**\n * Fix JS round off float errors\n * @param {Number} num\n */\n function correctFloat(num, prec) {\n return parseFloat(\n num.toPrecision(prec || 14)\n );\n }\n\n /**\n * Set the global animation to either a given value, or fall back to the\n * given chart's animation option\n * @param {Object} animation\n * @param {Object} chart\n */\n function setAnimation(animation, chart) {\n chart.renderer.globalAnimation = pick(animation, chart.animation);\n }\n\n /**\n * Get the animation in object form, where a disabled animation is always\n * returned with duration: 0\n */\n function animObject(animation) {\n return isObject(animation) ? merge(animation) : { duration: animation ? 500 : 0 };\n }\n\n /**\n * The time unit lookup\n */\n timeUnits = {\n millisecond: 1,\n second: 1000,\n minute: 60000,\n hour: 3600000,\n day: 24 * 3600000,\n week: 7 * 24 * 3600000,\n month: 28 * 24 * 3600000,\n year: 364 * 24 * 3600000\n };\n\n\n /**\n * Format a number and return a string based on input settings\n * @param {Number} number The input number to format\n * @param {Number} decimals The amount of decimals\n * @param {String} decimalPoint The decimal point, defaults to the one given in the lang options\n * @param {String} thousandsSep The thousands separator, defaults to the one given in the lang options\n */\n Highcharts.numberFormat = function (number, decimals, decimalPoint, thousandsSep) {\n\n number = +number || 0;\n decimals = +decimals;\n\n var lang = defaultOptions.lang,\n origDec = (number.toString().split('.')[1] || '').length,\n decimalComponent,\n strinteger,\n thousands,\n absNumber = Math.abs(number),\n ret;\n\n if (decimals === -1) {\n decimals = Math.min(origDec, 20); // Preserve decimals. Not huge numbers (#3793).\n } else if (!isNumber(decimals)) {\n decimals = 2;\n }\n\n // A string containing the positive integer component of the number\n strinteger = String(pInt(absNumber.toFixed(decimals)));\n\n // Leftover after grouping into thousands. Can be 0, 1 or 3.\n thousands = strinteger.length > 3 ? strinteger.length % 3 : 0;\n\n // Language\n decimalPoint = pick(decimalPoint, lang.decimalPoint);\n thousandsSep = pick(thousandsSep, lang.thousandsSep);\n\n // Start building the return\n ret = number < 0 ? '-' : '';\n\n // Add the leftover after grouping into thousands. For example, in the number 42 000 000,\n // this line adds 42.\n ret += thousands ? strinteger.substr(0, thousands) + thousandsSep : '';\n\n // Add the remaining thousands groups, joined by the thousands separator\n ret += strinteger.substr(thousands).replace(/(\\d{3})(?=\\d)/g, '$1' + thousandsSep);\n\n // Add the decimal point and the decimal component\n if (decimals) {\n // Get the decimal component, and add power to avoid rounding errors with float numbers (#4573)\n decimalComponent = Math.abs(absNumber - strinteger + Math.pow(10, -Math.max(decimals, origDec) - 1));\n ret += decimalPoint + decimalComponent.toFixed(decimals).slice(2);\n }\n\n return ret;\n };\n\n /**\n * Easing definition\n * @param {Number} pos Current position, ranging from 0 to 1\n */\n Math.easeInOutSine = function (pos) {\n return -0.5 * (Math.cos(Math.PI * pos) - 1);\n };\n\n /**\n * Internal method to return CSS value for given element and property\n */\n getStyle = function (el, prop) {\n\n var style;\n\n // For width and height, return the actual inner pixel size (#4913)\n if (prop === 'width') {\n return Math.min(el.offsetWidth, el.scrollWidth) - getStyle(el, 'padding-left') - getStyle(el, 'padding-right');\n } else if (prop === 'height') {\n return Math.min(el.offsetHeight, el.scrollHeight) - getStyle(el, 'padding-top') - getStyle(el, 'padding-bottom');\n }\n\n // Otherwise, get the computed style\n style = win.getComputedStyle(el, undefined);\n return style && pInt(style.getPropertyValue(prop));\n };\n\n /**\n * Return the index of an item in an array, or -1 if not found\n */\n inArray = function (item, arr) {\n return arr.indexOf ? arr.indexOf(item) : [].indexOf.call(arr, item);\n };\n\n /**\n * Filter an array\n */\n grep = function (elements, callback) {\n return [].filter.call(elements, callback);\n };\n\n /**\n * Map an array\n */\n map = function (arr, fn) {\n var results = [],\n i = 0,\n len = arr.length;\n\n for (; i < len; i++) {\n results[i] = fn.call(arr[i], arr[i], i, arr);\n }\n\n return results;\n };\n\n /**\n * Get the element's offset position, corrected by overflow:auto.\n */\n offset = function (el) {\n var docElem = doc.documentElement,\n box = el.getBoundingClientRect();\n\n return {\n top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\n left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\n };\n };\n\n /**\n * Stop running animation.\n * A possible extension to this would be to stop a single property, when\n * we want to continue animating others. Then assign the prop to the timer\n * in the Fx.run method, and check for the prop here. This would be an improvement\n * in all cases where we stop the animation from .attr. Instead of stopping\n * everything, we can just stop the actual attributes we're setting.\n */\n stop = function (el) {\n\n var i = timers.length;\n\n // Remove timers related to this element (#4519)\n while (i--) {\n if (timers[i].elem === el) {\n timers[i].stopped = true; // #4667\n }\n }\n };\n\n /**\n * Utility for iterating over an array.\n * @param {Array} arr\n * @param {Function} fn\n */\n each = function (arr, fn) { // modern browsers\n return Array.prototype.forEach.call(arr, fn);\n };\n\n /**\n * Add an event listener\n */\n addEvent = function (el, type, fn) {\n \n var events = el.hcEvents = el.hcEvents || {};\n\n function wrappedFn(e) {\n e.target = e.srcElement || win; // #2820\n fn.call(el, e);\n }\n\n // Handle DOM events in modern browsers\n if (el.addEventListener) {\n el.addEventListener(type, fn, false);\n\n // Handle old IE implementation\n } else if (el.attachEvent) {\n\n if (!el.hcEventsIE) {\n el.hcEventsIE = {};\n }\n\n // Link wrapped fn with original fn, so we can get this in removeEvent\n el.hcEventsIE[fn.toString()] = wrappedFn;\n\n el.attachEvent('on' + type, wrappedFn);\n }\n\n if (!events[type]) {\n events[type] = [];\n }\n\n events[type].push(fn);\n };\n\n /**\n * Remove event added with addEvent\n */\n removeEvent = function (el, type, fn) {\n \n var events,\n hcEvents = el.hcEvents,\n index;\n\n function removeOneEvent(type, fn) {\n if (el.removeEventListener) {\n el.removeEventListener(type, fn, false);\n } else if (el.attachEvent) {\n fn = el.hcEventsIE[fn.toString()];\n el.detachEvent('on' + type, fn);\n }\n }\n\n function removeAllEvents() {\n var types,\n len,\n n;\n\n if (!el.nodeName) {\n return; // break on non-DOM events\n }\n\n if (type) {\n types = {};\n types[type] = true;\n } else {\n types = hcEvents;\n }\n\n for (n in types) {\n if (hcEvents[n]) {\n len = hcEvents[n].length;\n while (len--) {\n removeOneEvent(n, hcEvents[n][len]);\n }\n }\n }\n }\n\n if (hcEvents) {\n if (type) {\n events = hcEvents[type] || [];\n if (fn) {\n index = inArray(fn, events);\n if (index > -1) {\n events.splice(index, 1);\n hcEvents[type] = events;\n }\n removeOneEvent(type, fn);\n\n } else {\n removeAllEvents();\n hcEvents[type] = [];\n }\n } else {\n removeAllEvents();\n el.hcEvents = {};\n }\n }\n };\n\n /**\n * Fire an event on a custom object\n */\n fireEvent = function (el, type, eventArguments, defaultFunction) {\n var e,\n hcEvents = el.hcEvents,\n events,\n len,\n i,\n fn;\n\n eventArguments = eventArguments || {};\n\n if (doc.createEvent && (el.dispatchEvent || el.fireEvent)) {\n e = doc.createEvent('Events');\n e.initEvent(type, true, true);\n e.target = el;\n\n extend(e, eventArguments);\n\n if (el.dispatchEvent) {\n el.dispatchEvent(e);\n } else {\n el.fireEvent(type, e);\n }\n\n } else if (hcEvents) {\n \n events = hcEvents[type] || [];\n len = events.length;\n\n // Attach a simple preventDefault function to skip default handler if called. \n // The built-in defaultPrevented property is not overwritable (#5112)\n if (!eventArguments.preventDefault) {\n eventArguments.preventDefault = function () {\n eventArguments.defaultPrevented = true;\n };\n }\n\n eventArguments.target = el;\n\n // If the type is not set, we're running a custom event (#2297). If it is set,\n // we're running a browser event, and setting it will cause en error in\n // IE8 (#2465).\n if (!eventArguments.type) {\n eventArguments.type = type;\n }\n \n for (i = 0; i < len; i++) {\n fn = events[i];\n\n // If the event handler return false, prevent the default handler from executing\n if (fn && fn.call(el, eventArguments) === false) {\n eventArguments.preventDefault();\n }\n }\n }\n \n // Run the default if not prevented\n if (defaultFunction && !eventArguments.defaultPrevented) {\n defaultFunction(eventArguments);\n }\n };\n\n /**\n * The global animate method, which uses Fx to create individual animators.\n */\n animate = function (el, params, opt) {\n var start,\n unit = '',\n end,\n fx,\n args,\n prop;\n\n if (!isObject(opt)) { // Number or undefined/null\n args = arguments;\n opt = {\n duration: args[2],\n easing: args[3],\n complete: args[4]\n };\n }\n if (!isNumber(opt.duration)) {\n opt.duration = 400;\n }\n opt.easing = typeof opt.easing === 'function' ? opt.easing : (Math[opt.easing] || Math.easeInOutSine);\n opt.curAnim = merge(params);\n\n for (prop in params) {\n fx = new Fx(el, opt, prop);\n end = null;\n\n if (prop === 'd') {\n fx.paths = fx.initPath(\n el,\n el.d,\n params.d\n );\n fx.toD = params.d;\n start = 0;\n end = 1;\n } else if (el.attr) {\n start = el.attr(prop);\n } else {\n start = parseFloat(getStyle(el, prop)) || 0;\n if (prop !== 'opacity') {\n unit = 'px';\n }\n }\n\n if (!end) {\n end = params[prop];\n }\n if (end.match && end.match('px')) {\n end = end.replace(/px/g, ''); // #4351\n }\n fx.run(start, end, unit);\n }\n };\n\n /**\n * Register Highcharts as a plugin in jQuery\n */\n if (win.jQuery) {\n win.jQuery.fn.highcharts = function () {\n var args = [].slice.call(arguments);\n\n if (this[0]) { // this[0] is the renderTo div\n\n // Create the chart\n if (args[0]) {\n new Highcharts[ // eslint-disable-line no-new\n isString(args[0]) ? args.shift() : 'Chart' // Constructor defaults to Chart\n ](this[0], args[0], args[1]);\n return this;\n }\n\n // When called without parameters or with the return argument, return an existing chart\n return charts[attr(this[0], 'data-highcharts-chart')];\n }\n };\n }\n\n\n /**\n * Compatibility section to add support for legacy IE. This can be removed if old IE \n * support is not needed.\n */\n if (doc && !doc.defaultView) {\n getStyle = function (el, prop) {\n var val,\n alias = { width: 'clientWidth', height: 'clientHeight' }[prop];\n \n if (el.style[prop]) {\n return pInt(el.style[prop]);\n }\n if (prop === 'opacity') {\n prop = 'filter';\n }\n\n // Getting the rendered width and height\n if (alias) {\n el.style.zoom = 1;\n return Math.max(el[alias] - 2 * getStyle(el, 'padding'), 0);\n }\n \n val = el.currentStyle[prop.replace(/\\-(\\w)/g, function (a, b) {\n return b.toUpperCase();\n })];\n if (prop === 'filter') {\n val = val.replace(\n /alpha\\(opacity=([0-9]+)\\)/, \n function (a, b) { \n return b / 100; \n }\n );\n }\n \n return val === '' ? 1 : pInt(val);\n };\n }\n\n if (!Array.prototype.forEach) {\n each = function (arr, fn) { // legacy\n var i = 0, \n len = arr.length;\n for (; i < len; i++) {\n if (fn.call(arr[i], arr[i], i, arr) === false) {\n return i;\n }\n }\n };\n }\n\n if (!Array.prototype.indexOf) {\n inArray = function (item, arr) {\n var len, \n i = 0;\n\n if (arr) {\n len = arr.length;\n \n for (; i < len; i++) {\n if (arr[i] === item) {\n return i;\n }\n }\n }\n\n return -1;\n };\n }\n\n if (!Array.prototype.filter) {\n grep = function (elements, fn) {\n var ret = [],\n i = 0,\n length = elements.length;\n\n for (; i < length; i++) {\n if (fn(elements[i], i)) {\n ret.push(elements[i]);\n }\n }\n\n return ret;\n };\n }\n\n //--- End compatibility section ---\n\n // Expose utilities\n Highcharts.Fx = Fx;\n Highcharts.inArray = inArray;\n Highcharts.each = each;\n Highcharts.grep = grep;\n Highcharts.offset = offset;\n Highcharts.map = map;\n Highcharts.addEvent = addEvent;\n Highcharts.removeEvent = removeEvent;\n Highcharts.fireEvent = fireEvent;\n Highcharts.animate = animate;\n Highcharts.animObject = animObject;\n Highcharts.stop = stop;\n\n /* ****************************************************************************\n * Handle the options *\n *****************************************************************************/\n defaultOptions = {\n colors: ['#7cb5ec', '#434348', '#90ed7d', '#f7a35c',\n '#8085e9', '#f15c80', '#e4d354', '#2b908f', '#f45b5b', '#91e8e1'],\n symbols: ['circle', 'diamond', 'square', 'triangle', 'triangle-down'],\n lang: {\n loading: 'Loading...',\n months: ['January', 'February', 'March', 'April', 'May', 'June', 'July',\n 'August', 'September', 'October', 'November', 'December'],\n shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n // invalidDate: '',\n decimalPoint: '.',\n numericSymbols: ['k', 'M', 'G', 'T', 'P', 'E'], // SI prefixes used in axis labels\n resetZoom: 'Reset zoom',\n resetZoomTitle: 'Reset zoom level 1:1',\n thousandsSep: ' '\n },\n global: {\n useUTC: true,\n //timezoneOffset: 0,\n canvasToolsURL: 'http://code.highcharts.com/modules/canvas-tools.js',\n VMLRadialGradientURL: 'http://code.highcharts.com/stock/4.2.6/gfx/vml-radial-gradient.png'\n },\n chart: {\n //animation: true,\n //alignTicks: false,\n //reflow: true,\n //className: null,\n //events: { load, selection },\n //margin: [null],\n //marginTop: null,\n //marginRight: null,\n //marginBottom: null,\n //marginLeft: null,\n borderColor: '#4572A7',\n //borderWidth: 0,\n borderRadius: 0,\n defaultSeriesType: 'line',\n ignoreHiddenSeries: true,\n //inverted: false,\n //shadow: false,\n spacing: [10, 10, 15, 10],\n //spacingTop: 10,\n //spacingRight: 10,\n //spacingBottom: 15,\n //spacingLeft: 10,\n //style: {\n // fontFamily: '\"Lucida Grande\", \"Lucida Sans Unicode\", Verdana, Arial, Helvetica, sans-serif', // default font\n // fontSize: '12px'\n //},\n backgroundColor: '#FFFFFF',\n //plotBackgroundColor: null,\n plotBorderColor: '#C0C0C0',\n //plotBorderWidth: 0,\n //plotShadow: false,\n //zoomType: ''\n resetZoomButton: {\n theme: {\n zIndex: 20\n },\n position: {\n align: 'right',\n x: -10,\n //verticalAlign: 'top',\n y: 10\n }\n // relativeTo: 'plot'\n },\n width: null,\n height: null\n },\n title: {\n text: 'Chart title',\n align: 'center',\n // floating: false,\n margin: 15,\n // x: 0,\n // verticalAlign: 'top',\n // y: null,\n style: {\n color: '#333333',\n fontSize: '18px'\n },\n widthAdjust: -44\n\n },\n subtitle: {\n text: '',\n align: 'center',\n // floating: false\n // x: 0,\n // verticalAlign: 'top',\n // y: null,\n style: {\n color: '#555555'\n },\n widthAdjust: -44\n },\n\n plotOptions: {\n line: { // base series options\n allowPointSelect: false,\n showCheckbox: false,\n animation: {\n duration: 1000\n },\n //connectNulls: false,\n //cursor: 'default',\n //clip: true,\n //dashStyle: null,\n //enableMouseTracking: true,\n events: {},\n //legendIndex: 0,\n //linecap: 'round',\n lineWidth: 2,\n //shadow: false,\n // stacking: null,\n marker: {\n //enabled: true,\n //symbol: null,\n lineWidth: 0,\n radius: 4,\n lineColor: '#FFFFFF',\n //fillColor: null,\n states: { // states for a single point\n hover: {\n enabled: true,\n lineWidthPlus: 1,\n radiusPlus: 2\n },\n select: {\n fillColor: '#FFFFFF',\n lineColor: '#000000',\n lineWidth: 2\n }\n }\n },\n point: {\n events: {}\n },\n dataLabels: {\n align: 'center',\n // defer: true,\n // enabled: false,\n formatter: function () {\n return this.y === null ? '' : Highcharts.numberFormat(this.y, -1);\n },\n style: {\n color: 'contrast',\n fontSize: '11px',\n fontWeight: 'bold',\n textShadow: '0 0 6px contrast, 0 0 3px contrast'\n },\n verticalAlign: 'bottom', // above singular point\n x: 0,\n y: 0,\n // backgroundColor: undefined,\n // borderColor: undefined,\n // borderRadius: undefined,\n // borderWidth: undefined,\n padding: 5\n // shadow: false\n },\n cropThreshold: 300, // draw points outside the plot area when the number of points is less than this\n pointRange: 0,\n //pointStart: 0,\n //pointInterval: 1,\n //showInLegend: null, // auto: true for standalone series, false for linked series\n softThreshold: true,\n states: { // states for the entire series\n hover: {\n //enabled: false,\n lineWidthPlus: 1,\n marker: {\n // lineWidth: base + 1,\n // radius: base + 1\n },\n halo: {\n size: 10,\n opacity: 0.25\n }\n },\n select: {\n marker: {}\n }\n },\n stickyTracking: true,\n //tooltip: {\n //pointFormat: '\\u25CF {series.name}: {point.y} '\n //valueDecimals: null,\n //xDateFormat: '%A, %b %e, %Y',\n //valuePrefix: '',\n //ySuffix: ''\n //}\n turboThreshold: 1000\n // zIndex: null\n }\n },\n labels: {\n //items: [],\n style: {\n //font: defaultFont,\n position: ABSOLUTE,\n color: '#3E576F'\n }\n },\n legend: {\n enabled: true,\n align: 'center',\n //floating: false,\n layout: 'horizontal',\n labelFormatter: function () {\n return this.name;\n },\n //borderWidth: 0,\n borderColor: '#909090',\n borderRadius: 0,\n navigation: {\n // animation: true,\n activeColor: '#274b6d',\n // arrowSize: 12\n inactiveColor: '#CCC'\n // style: {} // text styles\n },\n // margin: 20,\n // reversed: false,\n shadow: false,\n // backgroundColor: null,\n /*style: {\n padding: '5px'\n },*/\n itemStyle: {\n color: '#333333',\n fontSize: '12px',\n fontWeight: 'bold'\n },\n itemHoverStyle: {\n //cursor: 'pointer', removed as of #601\n color: '#000'\n },\n itemHiddenStyle: {\n color: '#CCC'\n },\n itemCheckboxStyle: {\n position: ABSOLUTE,\n width: '13px', // for IE precision\n height: '13px'\n },\n // itemWidth: undefined,\n // symbolRadius: 0,\n // symbolWidth: 16,\n symbolPadding: 5,\n verticalAlign: 'bottom',\n // width: undefined,\n x: 0,\n y: 0,\n title: {\n //text: null,\n style: {\n fontWeight: 'bold'\n }\n }\n },\n\n loading: {\n // hideDuration: 100,\n labelStyle: {\n fontWeight: 'bold',\n position: RELATIVE,\n top: '45%'\n },\n // showDuration: 0,\n style: {\n position: ABSOLUTE,\n backgroundColor: 'white',\n opacity: 0.5,\n textAlign: 'center'\n }\n },\n\n tooltip: {\n enabled: true,\n animation: hasSVG,\n //crosshairs: null,\n backgroundColor: 'rgba(249, 249, 249, .85)',\n borderWidth: 1,\n borderRadius: 3,\n dateTimeLabelFormats: {\n millisecond: '%A, %b %e, %H:%M:%S.%L',\n second: '%A, %b %e, %H:%M:%S',\n minute: '%A, %b %e, %H:%M',\n hour: '%A, %b %e, %H:%M',\n day: '%A, %b %e, %Y',\n week: 'Week from %A, %b %e, %Y',\n month: '%B %Y',\n year: '%Y'\n },\n footerFormat: '',\n //formatter: defaultFormatter,\n headerFormat: '{point.key} ',\n pointFormat: '\\u25CF {series.name}: {point.y} ',\n shadow: true,\n //shape: 'callout',\n //shared: false,\n snap: isTouchDevice ? 25 : 10,\n style: {\n color: '#333333',\n cursor: 'default',\n fontSize: '12px',\n padding: '8px',\n pointerEvents: 'none', // #1686 http://caniuse.com/#feat=pointer-events\n whiteSpace: 'nowrap'\n }\n //xDateFormat: '%A, %b %e, %Y',\n //valueDecimals: null,\n //valuePrefix: '',\n //valueSuffix: ''\n },\n\n credits: {\n enabled: true,\n text: 'Highcharts.com',\n href: 'http://www.highcharts.com',\n position: {\n align: 'right',\n x: -10,\n verticalAlign: 'bottom',\n y: -5\n },\n style: {\n cursor: 'pointer',\n color: '#909090',\n fontSize: '9px'\n }\n }\n };\n\n\n\n /**\n * Set the time methods globally based on the useUTC option. Time method can be either\n * local time or UTC (default).\n */\n function setTimeMethods() {\n var globalOptions = defaultOptions.global,\n useUTC = globalOptions.useUTC,\n GET = useUTC ? 'getUTC' : 'get',\n SET = useUTC ? 'setUTC' : 'set';\n\n\n Date = globalOptions.Date || win.Date;\n timezoneOffset = useUTC && globalOptions.timezoneOffset;\n getTimezoneOffset = useUTC && globalOptions.getTimezoneOffset;\n makeTime = function (year, month, date, hours, minutes, seconds) {\n var d;\n if (useUTC) {\n d = Date.UTC.apply(0, arguments);\n d += getTZOffset(d);\n } else {\n d = new Date(\n year,\n month,\n pick(date, 1),\n pick(hours, 0),\n pick(minutes, 0),\n pick(seconds, 0)\n ).getTime();\n }\n return d;\n };\n getMinutes = GET + 'Minutes';\n getHours = GET + 'Hours';\n getDay = GET + 'Day';\n getDate = GET + 'Date';\n getMonth = GET + 'Month';\n getFullYear = GET + 'FullYear';\n setMilliseconds = SET + 'Milliseconds';\n setSeconds = SET + 'Seconds';\n setMinutes = SET + 'Minutes';\n setHours = SET + 'Hours';\n setDate = SET + 'Date';\n setMonth = SET + 'Month';\n setFullYear = SET + 'FullYear';\n\n }\n\n /**\n * Merge the default options with custom options and return the new options structure\n * @param {Object} options The new custom options\n */\n function setOptions(options) {\n\n // Copy in the default options\n defaultOptions = merge(true, defaultOptions, options);\n\n // Apply UTC\n setTimeMethods();\n\n return defaultOptions;\n }\n\n /**\n * Get the updated default options. Until 3.0.7, merely exposing defaultOptions for outside modules\n * wasn't enough because the setOptions method created a new object.\n */\n function getOptions() {\n return defaultOptions;\n }\n\n\n\n\n\n\n // Series defaults\n var defaultPlotOptions = defaultOptions.plotOptions,\n defaultSeriesOptions = defaultPlotOptions.line;\n\n // set the default time methods\n setTimeMethods();\n\n\n /**\n * Handle color operations. The object methods are chainable.\n * @param {String} input The input color in either rbga or hex format\n */\n function Color(input) {\n // Backwards compatibility, allow instanciation without new\n if (!(this instanceof Color)) {\n return new Color(input);\n }\n // Initialize\n this.init(input);\n }\n Color.prototype = {\n\n // Collection of parsers. This can be extended from the outside by pushing parsers\n // to Highcharts.Colors.prototype.parsers.\n parsers: [{\n // RGBA color\n regex: /rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]?(?:\\.[0-9]+)?)\\s*\\)/,\n parse: function (result) {\n return [pInt(result[1]), pInt(result[2]), pInt(result[3]), parseFloat(result[4], 10)];\n }\n }, {\n // HEX color\n regex: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,\n parse: function (result) {\n return [pInt(result[1], 16), pInt(result[2], 16), pInt(result[3], 16), 1];\n }\n }, {\n // RGB color\n regex: /rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/,\n parse: function (result) {\n return [pInt(result[1]), pInt(result[2]), pInt(result[3]), 1];\n }\n }],\n\n /**\n * Parse the input color to rgba array\n * @param {String} input\n */\n init: function (input) {\n var result,\n rgba,\n i,\n parser;\n\n this.input = input;\n\n // Gradients\n if (input && input.stops) {\n this.stops = map(input.stops, function (stop) {\n return new Color(stop[1]);\n });\n\n // Solid colors\n } else {\n i = this.parsers.length;\n while (i-- && !rgba) {\n parser = this.parsers[i];\n result = parser.regex.exec(input);\n if (result) {\n rgba = parser.parse(result);\n }\n }\n }\n this.rgba = rgba || [];\n },\n\n /**\n * Return the color a specified format\n * @param {String} format\n */\n get: function (format) {\n var input = this.input,\n rgba = this.rgba,\n ret;\n\n if (this.stops) {\n ret = merge(input);\n ret.stops = [].concat(ret.stops);\n each(this.stops, function (stop, i) {\n ret.stops[i] = [ret.stops[i][0], stop.get(format)];\n });\n\n // it's NaN if gradient colors on a column chart\n } else if (rgba && isNumber(rgba[0])) {\n if (format === 'rgb' || (!format && rgba[3] === 1)) {\n ret = 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')';\n } else if (format === 'a') {\n ret = rgba[3];\n } else {\n ret = 'rgba(' + rgba.join(',') + ')';\n }\n } else {\n ret = input;\n }\n return ret;\n },\n\n /**\n * Brighten the color\n * @param {Number} alpha\n */\n brighten: function (alpha) {\n var i, \n rgba = this.rgba;\n\n if (this.stops) {\n each(this.stops, function (stop) {\n stop.brighten(alpha);\n });\n\n } else if (isNumber(alpha) && alpha !== 0) {\n for (i = 0; i < 3; i++) {\n rgba[i] += pInt(alpha * 255);\n\n if (rgba[i] < 0) {\n rgba[i] = 0;\n }\n if (rgba[i] > 255) {\n rgba[i] = 255;\n }\n }\n }\n return this;\n },\n\n /**\n * Set the color's opacity to a given alpha value\n * @param {Number} alpha\n */\n setOpacity: function (alpha) {\n this.rgba[3] = alpha;\n return this;\n }\n };\n\n\n /**\n * A wrapper object for SVG elements\n */\n function SVGElement() {}\n\n SVGElement.prototype = {\n\n // Default base for animation\n opacity: 1,\n // For labels, these CSS properties are applied to the node directly\n textProps: ['direction', 'fontSize', 'fontWeight', 'fontFamily', 'fontStyle', 'color',\n 'lineHeight', 'width', 'textDecoration', 'textOverflow', 'textShadow'],\n\n /**\n * Initialize the SVG renderer\n * @param {Object} renderer\n * @param {String} nodeName\n */\n init: function (renderer, nodeName) {\n var wrapper = this;\n wrapper.element = nodeName === 'span' ?\n createElement(nodeName) :\n doc.createElementNS(SVG_NS, nodeName);\n wrapper.renderer = renderer;\n },\n\n /**\n * Animate a given attribute\n * @param {Object} params\n * @param {Number} options Options include duration, easing, step and complete\n * @param {Function} complete Function to perform at the end of animation\n */\n animate: function (params, options, complete) {\n var animOptions = pick(options, this.renderer.globalAnimation, true);\n stop(this); // stop regardless of animation actually running, or reverting to .attr (#607)\n if (animOptions) {\n if (complete) { // allows using a callback with the global animation without overwriting it\n animOptions.complete = complete;\n }\n animate(this, params, animOptions);\n } else {\n this.attr(params, null, complete);\n }\n return this;\n },\n\n /**\n * Build an SVG gradient out of a common JavaScript configuration object\n */\n colorGradient: function (color, prop, elem) {\n var renderer = this.renderer,\n colorObject,\n gradName,\n gradAttr,\n radAttr,\n gradients,\n gradientObject,\n stops,\n stopColor,\n stopOpacity,\n radialReference,\n n,\n id,\n key = [],\n value;\n\n // Apply linear or radial gradients\n if (color.linearGradient) {\n gradName = 'linearGradient';\n } else if (color.radialGradient) {\n gradName = 'radialGradient';\n }\n\n if (gradName) {\n gradAttr = color[gradName];\n gradients = renderer.gradients;\n stops = color.stops;\n radialReference = elem.radialReference;\n\n // Keep < 2.2 kompatibility\n if (isArray(gradAttr)) {\n color[gradName] = gradAttr = {\n x1: gradAttr[0],\n y1: gradAttr[1],\n x2: gradAttr[2],\n y2: gradAttr[3],\n gradientUnits: 'userSpaceOnUse'\n };\n }\n\n // Correct the radial gradient for the radial reference system\n if (gradName === 'radialGradient' && radialReference && !defined(gradAttr.gradientUnits)) {\n radAttr = gradAttr; // Save the radial attributes for updating\n gradAttr = merge(gradAttr,\n renderer.getRadialAttr(radialReference, radAttr),\n { gradientUnits: 'userSpaceOnUse' }\n );\n }\n\n // Build the unique key to detect whether we need to create a new element (#1282)\n for (n in gradAttr) {\n if (n !== 'id') {\n key.push(n, gradAttr[n]);\n }\n }\n for (n in stops) {\n key.push(stops[n]);\n }\n key = key.join(',');\n\n // Check if a gradient object with the same config object is created within this renderer\n if (gradients[key]) {\n id = gradients[key].attr('id');\n\n } else {\n\n // Set the id and create the element\n gradAttr.id = id = PREFIX + idCounter++;\n gradients[key] = gradientObject = renderer.createElement(gradName)\n .attr(gradAttr)\n .add(renderer.defs);\n\n gradientObject.radAttr = radAttr;\n\n // The gradient needs to keep a list of stops to be able to destroy them\n gradientObject.stops = [];\n each(stops, function (stop) {\n var stopObject;\n if (stop[1].indexOf('rgba') === 0) {\n colorObject = Color(stop[1]);\n stopColor = colorObject.get('rgb');\n stopOpacity = colorObject.get('a');\n } else {\n stopColor = stop[1];\n stopOpacity = 1;\n }\n stopObject = renderer.createElement('stop').attr({\n offset: stop[0],\n 'stop-color': stopColor,\n 'stop-opacity': stopOpacity\n }).add(gradientObject);\n\n // Add the stop element to the gradient\n gradientObject.stops.push(stopObject);\n });\n }\n\n // Set the reference to the gradient object\n value = 'url(' + renderer.url + '#' + id + ')';\n elem.setAttribute(prop, value);\n elem.gradient = key;\n\n // Allow the color to be concatenated into tooltips formatters etc. (#2995)\n color.toString = function () {\n return value;\n };\n }\n },\n\n /**\n * Apply a polyfill to the text-stroke CSS property, by copying the text element\n * and apply strokes to the copy.\n *\n * Contrast checks at http://jsfiddle.net/highcharts/43soe9m1/2/\n */\n applyTextShadow: function (textShadow) {\n var elem = this.element,\n tspans,\n hasContrast = textShadow.indexOf('contrast') !== -1,\n styles = {},\n forExport = this.renderer.forExport,\n // IE10 and IE11 report textShadow in elem.style even though it doesn't work. Check\n // this again with new IE release. In exports, the rendering is passed to PhantomJS.\n supports = forExport || (elem.style.textShadow !== UNDEFINED && !isMS);\n\n // When the text shadow is set to contrast, use dark stroke for light text and vice versa\n if (hasContrast) {\n styles.textShadow = textShadow = textShadow.replace(/contrast/g, this.renderer.getContrast(elem.style.fill));\n }\n\n // Safari with retina displays as well as PhantomJS bug (#3974). Firefox does not tolerate this,\n // it removes the text shadows.\n if (isWebKit || forExport) {\n styles.textRendering = 'geometricPrecision';\n }\n\n /* Selective side-by-side testing in supported browser (http://jsfiddle.net/highcharts/73L1ptrh/)\n if (elem.textContent.indexOf('2.') === 0) {\n elem.style['text-shadow'] = 'none';\n supports = false;\n }\n // */\n\n // No reason to polyfill, we've got native support\n if (supports) {\n this.css(styles); // Apply altered textShadow or textRendering workaround\n } else {\n\n this.fakeTS = true; // Fake text shadow\n\n // In order to get the right y position of the clones,\n // copy over the y setter\n this.ySetter = this.xSetter;\n\n tspans = [].slice.call(elem.getElementsByTagName('tspan'));\n each(textShadow.split(/\\s?,\\s?/g), function (textShadow) {\n var firstChild = elem.firstChild,\n color,\n strokeWidth;\n\n textShadow = textShadow.split(' ');\n color = textShadow[textShadow.length - 1];\n\n // Approximately tune the settings to the text-shadow behaviour\n strokeWidth = textShadow[textShadow.length - 2];\n\n if (strokeWidth) {\n each(tspans, function (tspan, y) {\n var clone;\n\n // Let the first line start at the correct X position\n if (y === 0) {\n tspan.setAttribute('x', elem.getAttribute('x'));\n y = elem.getAttribute('y');\n tspan.setAttribute('y', y || 0);\n if (y === null) {\n elem.setAttribute('y', 0);\n }\n }\n\n // Create the clone and apply shadow properties\n clone = tspan.cloneNode(1);\n attr(clone, {\n 'class': PREFIX + 'text-shadow',\n 'fill': color,\n 'stroke': color,\n 'stroke-opacity': 1 / mathMax(pInt(strokeWidth), 3),\n 'stroke-width': strokeWidth,\n 'stroke-linejoin': 'round'\n });\n elem.insertBefore(clone, firstChild);\n });\n }\n });\n }\n },\n\n /**\n * Set or get a given attribute\n * @param {Object|String} hash\n * @param {Mixed|Undefined} val\n */\n attr: function (hash, val, complete) {\n var key,\n value,\n element = this.element,\n hasSetSymbolSize,\n ret = this,\n skipAttr,\n setter;\n\n // single key-value pair\n if (typeof hash === 'string' && val !== UNDEFINED) {\n key = hash;\n hash = {};\n hash[key] = val;\n }\n\n // used as a getter: first argument is a string, second is undefined\n if (typeof hash === 'string') {\n ret = (this[hash + 'Getter'] || this._defaultGetter).call(this, hash, element);\n\n // setter\n } else {\n\n for (key in hash) {\n value = hash[key];\n skipAttr = false;\n\n\n\n if (this.symbolName && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(key)) {\n if (!hasSetSymbolSize) {\n this.symbolAttr(hash);\n hasSetSymbolSize = true;\n }\n skipAttr = true;\n }\n\n if (this.rotation && (key === 'x' || key === 'y')) {\n this.doTransform = true;\n }\n\n if (!skipAttr) {\n setter = this[key + 'Setter'] || this._defaultSetter;\n setter.call(this, value, key, element);\n\n // Let the shadow follow the main element\n if (this.shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(key)) {\n this.updateShadows(key, value, setter);\n }\n }\n }\n\n // Update transform. Do this outside the loop to prevent redundant updating for batch setting\n // of attributes.\n if (this.doTransform) {\n this.updateTransform();\n this.doTransform = false;\n }\n\n }\n\n // In accordance with animate, run a complete callback\n if (complete) {\n complete();\n }\n\n return ret;\n },\n\n /**\n * Update the shadow elements with new attributes\n * @param {String} key The attribute name\n * @param {String|Number} value The value of the attribute\n * @param {Function} setter The setter function, inherited from the parent wrapper\n * @returns {undefined}\n */\n updateShadows: function (key, value, setter) {\n var shadows = this.shadows,\n i = shadows.length;\n\n while (i--) {\n setter.call(\n shadows[i], \n key === 'height' ?\n Math.max(value - (shadows[i].cutHeight || 0), 0) :\n key === 'd' ? this.d : value, \n key, \n shadows[i]\n );\n }\n },\n\n /**\n * Add a class name to an element\n */\n addClass: function (className) {\n var element = this.element,\n currentClassName = attr(element, 'class') || '';\n\n if (currentClassName.indexOf(className) === -1) {\n attr(element, 'class', currentClassName + ' ' + className);\n }\n return this;\n },\n /* hasClass and removeClass are not (yet) needed\n hasClass: function (className) {\n return attr(this.element, 'class').indexOf(className) !== -1;\n },\n removeClass: function (className) {\n attr(this.element, 'class', attr(this.element, 'class').replace(className, ''));\n return this;\n },\n */\n\n /**\n * If one of the symbol size affecting parameters are changed,\n * check all the others only once for each call to an element's\n * .attr() method\n * @param {Object} hash\n */\n symbolAttr: function (hash) {\n var wrapper = this;\n\n each(['x', 'y', 'r', 'start', 'end', 'width', 'height', 'innerR', 'anchorX', 'anchorY'], function (key) {\n wrapper[key] = pick(hash[key], wrapper[key]);\n });\n\n wrapper.attr({\n d: wrapper.renderer.symbols[wrapper.symbolName](\n wrapper.x,\n wrapper.y,\n wrapper.width,\n wrapper.height,\n wrapper\n )\n });\n },\n\n /**\n * Apply a clipping path to this object\n * @param {String} id\n */\n clip: function (clipRect) {\n return this.attr('clip-path', clipRect ? 'url(' + this.renderer.url + '#' + clipRect.id + ')' : NONE);\n },\n\n /**\n * Calculate the coordinates needed for drawing a rectangle crisply and return the\n * calculated attributes\n * @param {Number} strokeWidth\n * @param {Number} x\n * @param {Number} y\n * @param {Number} width\n * @param {Number} height\n */\n crisp: function (rect) {\n\n var wrapper = this,\n key,\n attribs = {},\n normalizer,\n strokeWidth = wrapper.strokeWidth || 0;\n\n normalizer = mathRound(strokeWidth) % 2 / 2; // mathRound because strokeWidth can sometimes have roundoff errors\n\n // normalize for crisp edges\n rect.x = mathFloor(rect.x || wrapper.x || 0) + normalizer;\n rect.y = mathFloor(rect.y || wrapper.y || 0) + normalizer;\n rect.width = mathFloor((rect.width || wrapper.width || 0) - 2 * normalizer);\n rect.height = mathFloor((rect.height || wrapper.height || 0) - 2 * normalizer);\n rect.strokeWidth = strokeWidth;\n\n for (key in rect) {\n if (wrapper[key] !== rect[key]) { // only set attribute if changed\n wrapper[key] = attribs[key] = rect[key];\n }\n }\n\n return attribs;\n },\n\n /**\n * Set styles for the element\n * @param {Object} styles\n */\n css: function (styles) {\n var elemWrapper = this,\n oldStyles = elemWrapper.styles,\n newStyles = {},\n elem = elemWrapper.element,\n textWidth,\n n,\n serializedCss = '',\n hyphenate,\n hasNew = !oldStyles;\n\n // convert legacy\n if (styles && styles.color) {\n styles.fill = styles.color;\n }\n\n // Filter out existing styles to increase performance (#2640)\n if (oldStyles) {\n for (n in styles) {\n if (styles[n] !== oldStyles[n]) {\n newStyles[n] = styles[n];\n hasNew = true;\n }\n }\n }\n if (hasNew) {\n textWidth = elemWrapper.textWidth =\n (styles && styles.width && elem.nodeName.toLowerCase() === 'text' && pInt(styles.width)) ||\n elemWrapper.textWidth; // #3501\n\n // Merge the new styles with the old ones\n if (oldStyles) {\n styles = extend(\n oldStyles,\n newStyles\n );\n }\n\n // store object\n elemWrapper.styles = styles;\n\n if (textWidth && (useCanVG || (!hasSVG && elemWrapper.renderer.forExport))) {\n delete styles.width;\n }\n\n // serialize and set style attribute\n if (isMS && !hasSVG) {\n css(elemWrapper.element, styles);\n } else {\n hyphenate = function (a, b) {\n return '-' + b.toLowerCase();\n };\n for (n in styles) {\n serializedCss += n.replace(/([A-Z])/g, hyphenate) + ':' + styles[n] + ';';\n }\n attr(elem, 'style', serializedCss); // #1881\n }\n\n\n // re-build text\n if (textWidth && elemWrapper.added) {\n elemWrapper.renderer.buildText(elemWrapper);\n }\n }\n\n return elemWrapper;\n },\n\n /**\n * Add an event listener\n * @param {String} eventType\n * @param {Function} handler\n */\n on: function (eventType, handler) {\n var svgElement = this,\n element = svgElement.element;\n\n // touch\n if (hasTouch && eventType === 'click') {\n element.ontouchstart = function (e) {\n svgElement.touchEventFired = Date.now();\n e.preventDefault();\n handler.call(element, e);\n };\n element.onclick = function (e) {\n if (userAgent.indexOf('Android') === -1 || Date.now() - (svgElement.touchEventFired || 0) > 1100) { // #2269\n handler.call(element, e);\n }\n };\n } else {\n // simplest possible event model for internal use\n element['on' + eventType] = handler;\n }\n return this;\n },\n\n /**\n * Set the coordinates needed to draw a consistent radial gradient across\n * pie slices regardless of positioning inside the chart. The format is\n * [centerX, centerY, diameter] in pixels.\n */\n setRadialReference: function (coordinates) {\n var existingGradient = this.renderer.gradients[this.element.gradient];\n\n this.element.radialReference = coordinates;\n\n // On redrawing objects with an existing gradient, the gradient needs\n // to be repositioned (#3801)\n if (existingGradient && existingGradient.radAttr) {\n existingGradient.animate(\n this.renderer.getRadialAttr(\n coordinates,\n existingGradient.radAttr\n )\n );\n }\n\n return this;\n },\n\n /**\n * Move an object and its children by x and y values\n * @param {Number} x\n * @param {Number} y\n */\n translate: function (x, y) {\n return this.attr({\n translateX: x,\n translateY: y\n });\n },\n\n /**\n * Invert a group, rotate and flip\n */\n invert: function () {\n var wrapper = this;\n wrapper.inverted = true;\n wrapper.updateTransform();\n return wrapper;\n },\n\n /**\n * Private method to update the transform attribute based on internal\n * properties\n */\n updateTransform: function () {\n var wrapper = this,\n translateX = wrapper.translateX || 0,\n translateY = wrapper.translateY || 0,\n scaleX = wrapper.scaleX,\n scaleY = wrapper.scaleY,\n inverted = wrapper.inverted,\n rotation = wrapper.rotation,\n element = wrapper.element,\n transform;\n\n // flipping affects translate as adjustment for flipping around the group's axis\n if (inverted) {\n translateX += wrapper.attr('width');\n translateY += wrapper.attr('height');\n }\n\n // Apply translate. Nearly all transformed elements have translation, so instead\n // of checking for translate = 0, do it always (#1767, #1846).\n transform = ['translate(' + translateX + ',' + translateY + ')'];\n\n // apply rotation\n if (inverted) {\n transform.push('rotate(90) scale(-1,1)');\n } else if (rotation) { // text rotation\n transform.push('rotate(' + rotation + ' ' + (element.getAttribute('x') || 0) + ' ' + (element.getAttribute('y') || 0) + ')');\n\n // Delete bBox memo when the rotation changes\n //delete wrapper.bBox;\n }\n\n // apply scale\n if (defined(scaleX) || defined(scaleY)) {\n transform.push('scale(' + pick(scaleX, 1) + ' ' + pick(scaleY, 1) + ')');\n }\n\n if (transform.length) {\n element.setAttribute('transform', transform.join(' '));\n }\n },\n /**\n * Bring the element to the front\n */\n toFront: function () {\n var element = this.element;\n element.parentNode.appendChild(element);\n return this;\n },\n\n\n /**\n * Break down alignment options like align, verticalAlign, x and y\n * to x and y relative to the chart.\n *\n * @param {Object} alignOptions\n * @param {Boolean} alignByTranslate\n * @param {String[Object} box The box to align to, needs a width and height. When the\n * box is a string, it refers to an object in the Renderer. For example, when\n * box is 'spacingBox', it refers to Renderer.spacingBox which holds width, height\n * x and y properties.\n *\n */\n align: function (alignOptions, alignByTranslate, box) {\n var align,\n vAlign,\n x,\n y,\n attribs = {},\n alignTo,\n renderer = this.renderer,\n alignedObjects = renderer.alignedObjects;\n\n // First call on instanciate\n if (alignOptions) {\n this.alignOptions = alignOptions;\n this.alignByTranslate = alignByTranslate;\n if (!box || isString(box)) { // boxes other than renderer handle this internally\n this.alignTo = alignTo = box || 'renderer';\n erase(alignedObjects, this); // prevent duplicates, like legendGroup after resize\n alignedObjects.push(this);\n box = null; // reassign it below\n }\n\n // When called on resize, no arguments are supplied\n } else {\n alignOptions = this.alignOptions;\n alignByTranslate = this.alignByTranslate;\n alignTo = this.alignTo;\n }\n\n box = pick(box, renderer[alignTo], renderer);\n\n // Assign variables\n align = alignOptions.align;\n vAlign = alignOptions.verticalAlign;\n x = (box.x || 0) + (alignOptions.x || 0); // default: left align\n y = (box.y || 0) + (alignOptions.y || 0); // default: top align\n\n // Align\n if (align === 'right' || align === 'center') {\n x += (box.width - (alignOptions.width || 0)) /\n { right: 1, center: 2 }[align];\n }\n attribs[alignByTranslate ? 'translateX' : 'x'] = mathRound(x);\n\n\n // Vertical align\n if (vAlign === 'bottom' || vAlign === 'middle') {\n y += (box.height - (alignOptions.height || 0)) /\n ({ bottom: 1, middle: 2 }[vAlign] || 1);\n\n }\n attribs[alignByTranslate ? 'translateY' : 'y'] = mathRound(y);\n\n // Animate only if already placed\n this[this.placed ? 'animate' : 'attr'](attribs);\n this.placed = true;\n this.alignAttr = attribs;\n\n return this;\n },\n\n /**\n * Get the bounding box (width, height, x and y) for the element\n */\n getBBox: function (reload, rot) {\n var wrapper = this,\n bBox, // = wrapper.bBox,\n renderer = wrapper.renderer,\n width,\n height,\n rotation,\n rad,\n element = wrapper.element,\n styles = wrapper.styles,\n textStr = wrapper.textStr,\n textShadow,\n elemStyle = element.style,\n toggleTextShadowShim,\n cache = renderer.cache,\n cacheKeys = renderer.cacheKeys,\n cacheKey;\n\n rotation = pick(rot, wrapper.rotation);\n rad = rotation * deg2rad;\n\n if (textStr !== UNDEFINED) {\n\n // Properties that affect bounding box\n cacheKey = ['', rotation || 0, styles && styles.fontSize, element.style.width].join(',');\n\n // Since numbers are monospaced, and numerical labels appear a lot in a chart,\n // we assume that a label of n characters has the same bounding box as others\n // of the same length.\n if (textStr === '' || numRegex.test(textStr)) {\n cacheKey = 'num:' + textStr.toString().length + cacheKey;\n\n // Caching all strings reduces rendering time by 4-5%.\n } else {\n cacheKey = textStr + cacheKey;\n }\n }\n\n if (cacheKey && !reload) {\n bBox = cache[cacheKey];\n }\n\n // No cache found\n if (!bBox) {\n\n // SVG elements\n if (element.namespaceURI === SVG_NS || renderer.forExport) {\n try { // Fails in Firefox if the container has display: none.\n\n // When the text shadow shim is used, we need to hide the fake shadows\n // to get the correct bounding box (#3872)\n toggleTextShadowShim = this.fakeTS && function (display) {\n each(element.querySelectorAll('.' + PREFIX + 'text-shadow'), function (tspan) {\n tspan.style.display = display;\n });\n };\n\n // Workaround for #3842, Firefox reporting wrong bounding box for shadows\n if (isFirefox && elemStyle.textShadow) {\n textShadow = elemStyle.textShadow;\n elemStyle.textShadow = '';\n } else if (toggleTextShadowShim) {\n toggleTextShadowShim(NONE);\n }\n\n bBox = element.getBBox ?\n // SVG: use extend because IE9 is not allowed to change width and height in case\n // of rotation (below)\n extend({}, element.getBBox()) :\n // Canvas renderer and legacy IE in export mode\n {\n width: element.offsetWidth,\n height: element.offsetHeight\n };\n\n // #3842\n if (textShadow) {\n elemStyle.textShadow = textShadow;\n } else if (toggleTextShadowShim) {\n toggleTextShadowShim('');\n }\n } catch (e) {}\n\n // If the bBox is not set, the try-catch block above failed. The other condition\n // is for Opera that returns a width of -Infinity on hidden elements.\n if (!bBox || bBox.width < 0) {\n bBox = { width: 0, height: 0 };\n }\n\n\n // VML Renderer or useHTML within SVG\n } else {\n\n bBox = wrapper.htmlGetBBox();\n\n }\n\n // True SVG elements as well as HTML elements in modern browsers using the .useHTML option\n // need to compensated for rotation\n if (renderer.isSVG) {\n width = bBox.width;\n height = bBox.height;\n\n // Workaround for wrong bounding box in IE9 and IE10 (#1101, #1505, #1669, #2568)\n if (isMS && styles && styles.fontSize === '11px' && height.toPrecision(3) === '16.9') {\n bBox.height = height = 14;\n }\n\n // Adjust for rotated text\n if (rotation) {\n bBox.width = mathAbs(height * mathSin(rad)) + mathAbs(width * mathCos(rad));\n bBox.height = mathAbs(height * mathCos(rad)) + mathAbs(width * mathSin(rad));\n }\n }\n\n // Cache it\n if (cacheKey) {\n\n // Rotate (#4681)\n while (cacheKeys.length > 250) {\n delete cache[cacheKeys.shift()];\n }\n\n if (!cache[cacheKey]) {\n cacheKeys.push(cacheKey);\n }\n cache[cacheKey] = bBox;\n }\n }\n return bBox;\n },\n\n /**\n * Show the element\n */\n show: function (inherit) {\n return this.attr({ visibility: inherit ? 'inherit' : VISIBLE });\n },\n\n /**\n * Hide the element\n */\n hide: function () {\n return this.attr({ visibility: HIDDEN });\n },\n\n fadeOut: function (duration) {\n var elemWrapper = this;\n elemWrapper.animate({\n opacity: 0\n }, {\n duration: duration || 150,\n complete: function () {\n elemWrapper.attr({ y: -9999 }); // #3088, assuming we're only using this for tooltips\n }\n });\n },\n\n /**\n * Add the element\n * @param {Object|Undefined} parent Can be an element, an element wrapper or undefined\n * to append the element to the renderer.box.\n */\n add: function (parent) {\n\n var renderer = this.renderer,\n element = this.element,\n inserted;\n\n if (parent) {\n this.parentGroup = parent;\n }\n\n // mark as inverted\n this.parentInverted = parent && parent.inverted;\n\n // build formatted text\n if (this.textStr !== undefined) {\n renderer.buildText(this);\n }\n\n // Mark as added\n this.added = true;\n\n // If we're adding to renderer root, or other elements in the group\n // have a z index, we need to handle it\n if (!parent || parent.handleZ || this.zIndex) {\n inserted = this.zIndexSetter();\n }\n\n // If zIndex is not handled, append at the end\n if (!inserted) {\n (parent ? parent.element : renderer.box).appendChild(element);\n }\n\n // fire an event for internal hooks\n if (this.onAdd) {\n this.onAdd();\n }\n\n return this;\n },\n\n /**\n * Removes a child either by removeChild or move to garbageBin.\n * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not.\n */\n safeRemoveChild: function (element) {\n var parentNode = element.parentNode;\n if (parentNode) {\n parentNode.removeChild(element);\n }\n },\n\n /**\n * Destroy the element and element wrapper\n */\n destroy: function () {\n var wrapper = this,\n element = wrapper.element || {},\n shadows = wrapper.shadows,\n parentToClean = wrapper.renderer.isSVG && element.nodeName === 'SPAN' && wrapper.parentGroup,\n grandParent,\n key,\n i;\n\n // remove events\n element.onclick = element.onmouseout = element.onmouseover = element.onmousemove = element.point = null;\n stop(wrapper); // stop running animations\n\n if (wrapper.clipPath) {\n wrapper.clipPath = wrapper.clipPath.destroy();\n }\n\n // Destroy stops in case this is a gradient object\n if (wrapper.stops) {\n for (i = 0; i < wrapper.stops.length; i++) {\n wrapper.stops[i] = wrapper.stops[i].destroy();\n }\n wrapper.stops = null;\n }\n\n // remove element\n wrapper.safeRemoveChild(element);\n\n // destroy shadows\n if (shadows) {\n each(shadows, function (shadow) {\n wrapper.safeRemoveChild(shadow);\n });\n }\n\n // In case of useHTML, clean up empty containers emulating SVG groups (#1960, #2393, #2697).\n while (parentToClean && parentToClean.div && parentToClean.div.childNodes.length === 0) {\n grandParent = parentToClean.parentGroup;\n wrapper.safeRemoveChild(parentToClean.div);\n delete parentToClean.div;\n parentToClean = grandParent;\n }\n\n // remove from alignObjects\n if (wrapper.alignTo) {\n erase(wrapper.renderer.alignedObjects, wrapper);\n }\n\n for (key in wrapper) {\n delete wrapper[key];\n }\n\n return null;\n },\n\n /**\n * Add a shadow to the element. Must be done after the element is added to the DOM\n * @param {Boolean|Object} shadowOptions\n */\n shadow: function (shadowOptions, group, cutOff) {\n var shadows = [],\n i,\n shadow,\n element = this.element,\n strokeWidth,\n shadowWidth,\n shadowElementOpacity,\n\n // compensate for inverted plot area\n transform;\n\n\n if (shadowOptions) {\n shadowWidth = pick(shadowOptions.width, 3);\n shadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;\n transform = this.parentInverted ?\n '(-1,-1)' :\n '(' + pick(shadowOptions.offsetX, 1) + ', ' + pick(shadowOptions.offsetY, 1) + ')';\n for (i = 1; i <= shadowWidth; i++) {\n shadow = element.cloneNode(0);\n strokeWidth = (shadowWidth * 2) + 1 - (2 * i);\n attr(shadow, {\n 'isShadow': 'true',\n 'stroke': shadowOptions.color || 'black',\n 'stroke-opacity': shadowElementOpacity * i,\n 'stroke-width': strokeWidth,\n 'transform': 'translate' + transform,\n 'fill': NONE\n });\n if (cutOff) {\n attr(shadow, 'height', mathMax(attr(shadow, 'height') - strokeWidth, 0));\n shadow.cutHeight = strokeWidth;\n }\n\n if (group) {\n group.element.appendChild(shadow);\n } else {\n element.parentNode.insertBefore(shadow, element);\n }\n\n shadows.push(shadow);\n }\n\n this.shadows = shadows;\n }\n return this;\n\n },\n\n xGetter: function (key) {\n if (this.element.nodeName === 'circle') {\n key = { x: 'cx', y: 'cy' }[key] || key;\n }\n return this._defaultGetter(key);\n },\n\n /**\n * Get the current value of an attribute or pseudo attribute, used mainly\n * for animation.\n */\n _defaultGetter: function (key) {\n var ret = pick(this[key], this.element ? this.element.getAttribute(key) : null, 0);\n\n if (/^[\\-0-9\\.]+$/.test(ret)) { // is numerical\n ret = parseFloat(ret);\n }\n return ret;\n },\n\n\n dSetter: function (value, key, element) {\n if (value && value.join) { // join path\n value = value.join(' ');\n }\n if (/(NaN| {2}|^$)/.test(value)) {\n value = 'M 0 0';\n }\n element.setAttribute(key, value);\n\n this[key] = value;\n },\n dashstyleSetter: function (value) {\n var i,\n strokeWidth = this['stroke-width'];\n \n // If \"inherit\", like maps in IE, assume 1 (#4981). With HC5 and the new strokeWidth \n // function, we should be able to use that instead.\n if (strokeWidth === 'inherit') {\n strokeWidth = 1;\n }\n value = value && value.toLowerCase();\n if (value) {\n value = value\n .replace('shortdashdotdot', '3,1,1,1,1,1,')\n .replace('shortdashdot', '3,1,1,1')\n .replace('shortdot', '1,1,')\n .replace('shortdash', '3,1,')\n .replace('longdash', '8,3,')\n .replace(/dot/g, '1,3,')\n .replace('dash', '4,3,')\n .replace(/,$/, '')\n .split(','); // ending comma\n\n i = value.length;\n while (i--) {\n value[i] = pInt(value[i]) * strokeWidth;\n }\n value = value.join(',')\n .replace(/NaN/g, 'none'); // #3226\n this.element.setAttribute('stroke-dasharray', value);\n }\n },\n alignSetter: function (value) {\n this.element.setAttribute('text-anchor', { left: 'start', center: 'middle', right: 'end' }[value]);\n },\n opacitySetter: function (value, key, element) {\n this[key] = value;\n element.setAttribute(key, value);\n },\n titleSetter: function (value) {\n var titleNode = this.element.getElementsByTagName('title')[0];\n if (!titleNode) {\n titleNode = doc.createElementNS(SVG_NS, 'title');\n this.element.appendChild(titleNode);\n }\n\n // Remove text content if it exists\n if (titleNode.firstChild) {\n titleNode.removeChild(titleNode.firstChild);\n }\n\n titleNode.appendChild(\n doc.createTextNode(\n (String(pick(value), '')).replace(/<[^>]*>/g, '') // #3276, #3895\n )\n );\n },\n textSetter: function (value) {\n if (value !== this.textStr) {\n // Delete bBox memo when the text changes\n delete this.bBox;\n\n this.textStr = value;\n if (this.added) {\n this.renderer.buildText(this);\n }\n }\n },\n fillSetter: function (value, key, element) {\n if (typeof value === 'string') {\n element.setAttribute(key, value);\n } else if (value) {\n this.colorGradient(value, key, element);\n }\n },\n visibilitySetter: function (value, key, element) {\n // IE9-11 doesn't handle visibilty:inherit well, so we remove the attribute instead (#2881, #3909)\n if (value === 'inherit') {\n element.removeAttribute(key);\n } else {\n element.setAttribute(key, value);\n }\n },\n zIndexSetter: function (value, key) {\n var renderer = this.renderer,\n parentGroup = this.parentGroup,\n parentWrapper = parentGroup || renderer,\n parentNode = parentWrapper.element || renderer.box,\n childNodes,\n otherElement,\n otherZIndex,\n element = this.element,\n inserted,\n run = this.added,\n i;\n\n if (defined(value)) {\n element.zIndex = value; // So we can read it for other elements in the group\n value = +value;\n if (this[key] === value) { // Only update when needed (#3865)\n run = false;\n }\n this[key] = value;\n }\n\n // Insert according to this and other elements' zIndex. Before .add() is called,\n // nothing is done. Then on add, or by later calls to zIndexSetter, the node\n // is placed on the right place in the DOM.\n if (run) {\n value = this.zIndex;\n\n if (value && parentGroup) {\n parentGroup.handleZ = true;\n }\n\n childNodes = parentNode.childNodes;\n for (i = 0; i < childNodes.length && !inserted; i++) {\n otherElement = childNodes[i];\n otherZIndex = otherElement.zIndex;\n if (otherElement !== element && (\n // Insert before the first element with a higher zIndex\n pInt(otherZIndex) > value ||\n // If no zIndex given, insert before the first element with a zIndex\n (!defined(value) && defined(otherZIndex))\n\n )) {\n parentNode.insertBefore(element, otherElement);\n inserted = true;\n }\n }\n if (!inserted) {\n parentNode.appendChild(element);\n }\n }\n return inserted;\n },\n _defaultSetter: function (value, key, element) {\n element.setAttribute(key, value);\n }\n };\n\n // Some shared setters and getters\n SVGElement.prototype.yGetter = SVGElement.prototype.xGetter;\n SVGElement.prototype.translateXSetter = SVGElement.prototype.translateYSetter =\n SVGElement.prototype.rotationSetter = SVGElement.prototype.verticalAlignSetter =\n SVGElement.prototype.scaleXSetter = SVGElement.prototype.scaleYSetter = function (value, key) {\n this[key] = value;\n this.doTransform = true;\n };\n\n // WebKit and Batik have problems with a stroke-width of zero, so in this case we remove the\n // stroke attribute altogether. #1270, #1369, #3065, #3072.\n SVGElement.prototype['stroke-widthSetter'] = SVGElement.prototype.strokeSetter = function (value, key, element) {\n this[key] = value;\n // Only apply the stroke attribute if the stroke width is defined and larger than 0\n if (this.stroke && this['stroke-width']) {\n this.strokeWidth = this['stroke-width'];\n SVGElement.prototype.fillSetter.call(this, this.stroke, 'stroke', element); // use prototype as instance may be overridden\n element.setAttribute('stroke-width', this['stroke-width']);\n this.hasStroke = true;\n } else if (key === 'stroke-width' && value === 0 && this.hasStroke) {\n element.removeAttribute('stroke');\n this.hasStroke = false;\n }\n };\n\n\n /**\n * The default SVG renderer\n */\n var SVGRenderer = function () {\n this.init.apply(this, arguments);\n };\n SVGRenderer.prototype = {\n Element: SVGElement,\n\n /**\n * Initialize the SVGRenderer\n * @param {Object} container\n * @param {Number} width\n * @param {Number} height\n * @param {Boolean} forExport\n */\n init: function (container, width, height, style, forExport, allowHTML) {\n var renderer = this,\n boxWrapper,\n element,\n desc;\n\n boxWrapper = renderer.createElement('svg')\n .attr({\n version: '1.1'\n })\n .css(this.getStyle(style));\n element = boxWrapper.element;\n container.appendChild(element);\n\n // For browsers other than IE, add the namespace attribute (#1978)\n if (container.innerHTML.indexOf('xmlns') === -1) {\n attr(element, 'xmlns', SVG_NS);\n }\n\n // object properties\n renderer.isSVG = true;\n renderer.box = element;\n renderer.boxWrapper = boxWrapper;\n renderer.alignedObjects = [];\n\n // Page url used for internal references. #24, #672, #1070\n renderer.url = (isFirefox || isWebKit) && doc.getElementsByTagName('base').length ?\n win.location.href\n .replace(/#.*?$/, '') // remove the hash\n .replace(/([\\('\\)])/g, '\\\\$1') // escape parantheses and quotes\n .replace(/ /g, '%20') : // replace spaces (needed for Safari only)\n '';\n\n // Add description\n desc = this.createElement('desc').add();\n desc.element.appendChild(doc.createTextNode('Created with ' + PRODUCT + ' ' + VERSION));\n\n\n renderer.defs = this.createElement('defs').add();\n renderer.allowHTML = allowHTML;\n renderer.forExport = forExport;\n renderer.gradients = {}; // Object where gradient SvgElements are stored\n renderer.cache = {}; // Cache for numerical bounding boxes\n renderer.cacheKeys = [];\n renderer.imgCount = 0;\n\n renderer.setSize(width, height, false);\n\n\n\n // Issue 110 workaround:\n // In Firefox, if a div is positioned by percentage, its pixel position may land\n // between pixels. The container itself doesn't display this, but an SVG element\n // inside this container will be drawn at subpixel precision. In order to draw\n // sharp lines, this must be compensated for. This doesn't seem to work inside\n // iframes though (like in jsFiddle).\n var subPixelFix, rect;\n if (isFirefox && container.getBoundingClientRect) {\n renderer.subPixelFix = subPixelFix = function () {\n css(container, { left: 0, top: 0 });\n rect = container.getBoundingClientRect();\n css(container, {\n left: (mathCeil(rect.left) - rect.left) + PX,\n top: (mathCeil(rect.top) - rect.top) + PX\n });\n };\n\n // run the fix now\n subPixelFix();\n\n // run it on resize\n addEvent(win, 'resize', subPixelFix);\n }\n },\n\n getStyle: function (style) {\n this.style = extend({\n fontFamily: '\"Lucida Grande\", \"Lucida Sans Unicode\", Arial, Helvetica, sans-serif', // default font\n fontSize: '12px'\n }, style);\n return this.style;\n },\n\n /**\n * Detect whether the renderer is hidden. This happens when one of the parent elements\n * has display: none. #608.\n */\n isHidden: function () {\n return !this.boxWrapper.getBBox().width;\n },\n\n /**\n * Destroys the renderer and its allocated members.\n */\n destroy: function () {\n var renderer = this,\n rendererDefs = renderer.defs;\n renderer.box = null;\n renderer.boxWrapper = renderer.boxWrapper.destroy();\n\n // Call destroy on all gradient elements\n destroyObjectProperties(renderer.gradients || {});\n renderer.gradients = null;\n\n // Defs are null in VMLRenderer\n // Otherwise, destroy them here.\n if (rendererDefs) {\n renderer.defs = rendererDefs.destroy();\n }\n\n // Remove sub pixel fix handler\n // We need to check that there is a handler, otherwise all functions that are registered for event 'resize' are removed\n // See issue #982\n if (renderer.subPixelFix) {\n removeEvent(win, 'resize', renderer.subPixelFix);\n }\n\n renderer.alignedObjects = null;\n\n return null;\n },\n\n /**\n * Create a wrapper for an SVG element\n * @param {Object} nodeName\n */\n createElement: function (nodeName) {\n var wrapper = new this.Element();\n wrapper.init(this, nodeName);\n return wrapper;\n },\n\n /**\n * Dummy function for use in canvas renderer\n */\n draw: function () {},\n\n /**\n * Get converted radial gradient attributes\n */\n getRadialAttr: function (radialReference, gradAttr) {\n return {\n cx: (radialReference[0] - radialReference[2] / 2) + gradAttr.cx * radialReference[2],\n cy: (radialReference[1] - radialReference[2] / 2) + gradAttr.cy * radialReference[2],\n r: gradAttr.r * radialReference[2]\n };\n },\n\n /**\n * Parse a simple HTML string into SVG tspans\n *\n * @param {Object} textNode The parent text SVG node\n */\n buildText: function (wrapper) {\n var textNode = wrapper.element,\n renderer = this,\n forExport = renderer.forExport,\n textStr = pick(wrapper.textStr, '').toString(),\n hasMarkup = textStr.indexOf('<') !== -1,\n lines,\n childNodes = textNode.childNodes,\n styleRegex,\n hrefRegex,\n wasTooLong,\n parentX = attr(textNode, 'x'),\n textStyles = wrapper.styles,\n width = wrapper.textWidth,\n textLineHeight = textStyles && textStyles.lineHeight,\n textShadow = textStyles && textStyles.textShadow,\n ellipsis = textStyles && textStyles.textOverflow === 'ellipsis',\n i = childNodes.length,\n tempParent = width && !wrapper.added && this.box,\n getLineHeight = function (tspan) {\n return textLineHeight ?\n pInt(textLineHeight) :\n renderer.fontMetrics(\n /(px|em)$/.test(tspan && tspan.style.fontSize) ?\n tspan.style.fontSize :\n ((textStyles && textStyles.fontSize) || renderer.style.fontSize || 12),\n tspan\n ).h;\n },\n unescapeAngleBrackets = function (inputStr) {\n return inputStr.replace(/</g, '<').replace(/>/g, '>');\n };\n\n /// remove old text\n while (i--) {\n textNode.removeChild(childNodes[i]);\n }\n\n // Skip tspans, add text directly to text node. The forceTSpan is a hook\n // used in text outline hack.\n if (!hasMarkup && !textShadow && !ellipsis && !width && textStr.indexOf(' ') === -1) {\n textNode.appendChild(doc.createTextNode(unescapeAngleBrackets(textStr)));\n\n // Complex strings, add more logic\n } else {\n\n styleRegex = /<.*style=\"([^\"]+)\".*>/;\n hrefRegex = /<.*href=\"(http[^\"]+)\".*>/;\n\n if (tempParent) {\n tempParent.appendChild(textNode); // attach it to the DOM to read offset width\n }\n\n if (hasMarkup) {\n lines = textStr\n .replace(/<(b|strong)>/g, '')\n .replace(/<(i|em)>/g, '')\n .replace(//g, ' ')\n .split(//g);\n\n } else {\n lines = [textStr];\n }\n\n\n // Trim empty lines (#5261)\n lines = grep(lines, function (line) {\n return line !== '';\n });\n\n\n // build the lines\n each(lines, function buildTextLines(line, lineNo) {\n var spans,\n spanNo = 0;\n line = line\n .replace(/^\\s+|\\s+$/g, '') // Trim to prevent useless/costly process on the spaces (#5258)\n .replace(//g, ' |||');\n spans = line.split('|||');\n\n each(spans, function buildTextSpans(span) {\n if (span !== '' || spans.length === 1) {\n var attributes = {},\n tspan = doc.createElementNS(SVG_NS, 'tspan'),\n spanStyle; // #390\n if (styleRegex.test(span)) {\n spanStyle = span.match(styleRegex)[1].replace(/(;| |^)color([ :])/, '$1fill$2');\n attr(tspan, 'style', spanStyle);\n }\n if (hrefRegex.test(span) && !forExport) { // Not for export - #1529\n attr(tspan, 'onclick', 'location.href=\\\"' + span.match(hrefRegex)[1] + '\\\"');\n css(tspan, { cursor: 'pointer' });\n }\n\n span = unescapeAngleBrackets(span.replace(/<(.|\\n)*?>/g, '') || ' ');\n\n // Nested tags aren't supported, and cause crash in Safari (#1596)\n if (span !== ' ') {\n\n // add the text node\n tspan.appendChild(doc.createTextNode(span));\n\n if (!spanNo) { // first span in a line, align it to the left\n if (lineNo && parentX !== null) {\n attributes.x = parentX;\n }\n } else {\n attributes.dx = 0; // #16\n }\n\n // add attributes\n attr(tspan, attributes);\n\n // Append it\n textNode.appendChild(tspan);\n\n // first span on subsequent line, add the line height\n if (!spanNo && lineNo) {\n\n // allow getting the right offset height in exporting in IE\n if (!hasSVG && forExport) {\n css(tspan, { display: 'block' });\n }\n\n // Set the line height based on the font size of either\n // the text element or the tspan element\n attr(\n tspan,\n 'dy',\n getLineHeight(tspan)\n );\n }\n\n /*if (width) {\n renderer.breakText(wrapper, width);\n }*/\n\n // Check width and apply soft breaks or ellipsis\n if (width) {\n var words = span.replace(/([^\\^])-/g, '$1- ').split(' '), // #1273\n hasWhiteSpace = spans.length > 1 || lineNo || (words.length > 1 && textStyles.whiteSpace !== 'nowrap'),\n tooLong,\n actualWidth,\n rest = [],\n dy = getLineHeight(tspan),\n softLineNo = 1,\n rotation = wrapper.rotation,\n wordStr = span, // for ellipsis\n cursor = wordStr.length, // binary search cursor\n bBox;\n\n while ((hasWhiteSpace || ellipsis) && (words.length || rest.length)) {\n wrapper.rotation = 0; // discard rotation when computing box\n bBox = wrapper.getBBox(true);\n actualWidth = bBox.width;\n\n // Old IE cannot measure the actualWidth for SVG elements (#2314)\n if (!hasSVG && renderer.forExport) {\n actualWidth = renderer.measureSpanWidth(tspan.firstChild.data, wrapper.styles);\n }\n\n tooLong = actualWidth > width;\n\n // For ellipsis, do a binary search for the correct string length\n if (wasTooLong === undefined) {\n wasTooLong = tooLong; // First time\n }\n if (ellipsis && wasTooLong) {\n cursor /= 2;\n\n if (wordStr === '' || (!tooLong && cursor < 0.5)) {\n words = []; // All ok, break out\n } else {\n wordStr = span.substring(0, wordStr.length + (tooLong ? -1 : 1) * mathCeil(cursor));\n words = [wordStr + (width > 3 ? '\\u2026' : '')];\n tspan.removeChild(tspan.firstChild);\n }\n\n // Looping down, this is the first word sequence that is not too long,\n // so we can move on to build the next line.\n } else if (!tooLong || words.length === 1) {\n words = rest;\n rest = [];\n\n if (words.length) {\n softLineNo++;\n\n tspan = doc.createElementNS(SVG_NS, 'tspan');\n attr(tspan, {\n dy: dy,\n x: parentX\n });\n if (spanStyle) { // #390\n attr(tspan, 'style', spanStyle);\n }\n textNode.appendChild(tspan);\n }\n if (actualWidth > width) { // a single word is pressing it out\n width = actualWidth;\n }\n } else { // append to existing line tspan\n tspan.removeChild(tspan.firstChild);\n rest.unshift(words.pop());\n }\n if (words.length) {\n tspan.appendChild(doc.createTextNode(words.join(' ').replace(/- /g, '-')));\n }\n }\n wrapper.rotation = rotation;\n }\n\n spanNo++;\n }\n }\n });\n });\n\n if (wasTooLong) {\n wrapper.attr('title', wrapper.textStr);\n }\n if (tempParent) {\n tempParent.removeChild(textNode); // attach it to the DOM to read offset width\n }\n\n // Apply the text shadow\n if (textShadow && wrapper.applyTextShadow) {\n wrapper.applyTextShadow(textShadow);\n }\n }\n },\n\n\n\n /*\n breakText: function (wrapper, width) {\n var bBox = wrapper.getBBox(),\n node = wrapper.element,\n textLength = node.textContent.length,\n pos = mathRound(width * textLength / bBox.width), // try this position first, based on average character width\n increment = 0,\n finalPos;\n\n if (bBox.width > width) {\n while (finalPos === undefined) {\n textLength = node.getSubStringLength(0, pos);\n\n if (textLength <= width) {\n if (increment === -1) {\n finalPos = pos;\n } else {\n increment = 1;\n }\n } else {\n if (increment === 1) {\n finalPos = pos - 1;\n } else {\n increment = -1;\n }\n }\n pos += increment;\n }\n }\n console.log('width', width, 'stringWidth', node.getSubStringLength(0, finalPos))\n },\n */\n\n /**\n * Returns white for dark colors and black for bright colors\n */\n getContrast: function (color) {\n color = Color(color).rgba;\n return color[0] + color[1] + color[2] > 384 ? '#000000' : '#FFFFFF';\n },\n\n /**\n * Create a button with preset states\n * @param {String} text\n * @param {Number} x\n * @param {Number} y\n * @param {Function} callback\n * @param {Object} normalState\n * @param {Object} hoverState\n * @param {Object} pressedState\n */\n button: function (text, x, y, callback, normalState, hoverState, pressedState, disabledState, shape) {\n var label = this.label(text, x, y, shape, null, null, null, null, 'button'),\n curState = 0,\n stateOptions,\n stateStyle,\n normalStyle,\n hoverStyle,\n pressedStyle,\n disabledStyle,\n verticalGradient = { x1: 0, y1: 0, x2: 0, y2: 1 };\n\n // Normal state - prepare the attributes\n normalState = merge({\n 'stroke-width': 1,\n stroke: '#CCCCCC',\n fill: {\n linearGradient: verticalGradient,\n stops: [\n [0, '#FEFEFE'],\n [1, '#F6F6F6']\n ]\n },\n r: 2,\n padding: 5,\n style: {\n color: 'black'\n }\n }, normalState);\n normalStyle = normalState.style;\n delete normalState.style;\n\n // Hover state\n hoverState = merge(normalState, {\n stroke: '#68A',\n fill: {\n linearGradient: verticalGradient,\n stops: [\n [0, '#FFF'],\n [1, '#ACF']\n ]\n }\n }, hoverState);\n hoverStyle = hoverState.style;\n delete hoverState.style;\n\n // Pressed state\n pressedState = merge(normalState, {\n stroke: '#68A',\n fill: {\n linearGradient: verticalGradient,\n stops: [\n [0, '#9BD'],\n [1, '#CDF']\n ]\n }\n }, pressedState);\n pressedStyle = pressedState.style;\n delete pressedState.style;\n\n // Disabled state\n disabledState = merge(normalState, {\n style: {\n color: '#CCC'\n }\n }, disabledState);\n disabledStyle = disabledState.style;\n delete disabledState.style;\n\n // Add the events. IE9 and IE10 need mouseover and mouseout to funciton (#667).\n addEvent(label.element, isMS ? 'mouseover' : 'mouseenter', function () {\n if (curState !== 3) {\n label.attr(hoverState)\n .css(hoverStyle);\n }\n });\n addEvent(label.element, isMS ? 'mouseout' : 'mouseleave', function () {\n if (curState !== 3) {\n stateOptions = [normalState, hoverState, pressedState][curState];\n stateStyle = [normalStyle, hoverStyle, pressedStyle][curState];\n label.attr(stateOptions)\n .css(stateStyle);\n }\n });\n\n label.setState = function (state) {\n label.state = curState = state;\n if (!state) {\n label.attr(normalState)\n .css(normalStyle);\n } else if (state === 2) {\n label.attr(pressedState)\n .css(pressedStyle);\n } else if (state === 3) {\n label.attr(disabledState)\n .css(disabledStyle);\n }\n };\n\n return label\n .on('click', function (e) {\n if (curState !== 3) {\n callback.call(label, e);\n }\n })\n .attr(normalState)\n .css(extend({ cursor: 'default' }, normalStyle));\n },\n\n /**\n * Make a straight line crisper by not spilling out to neighbour pixels\n * @param {Array} points\n * @param {Number} width\n */\n crispLine: function (points, width) {\n // points format: [M, 0, 0, L, 100, 0]\n // normalize to a crisp line\n if (points[1] === points[4]) {\n // Substract due to #1129. Now bottom and left axis gridlines behave the same.\n points[1] = points[4] = mathRound(points[1]) - (width % 2 / 2);\n }\n if (points[2] === points[5]) {\n points[2] = points[5] = mathRound(points[2]) + (width % 2 / 2);\n }\n return points;\n },\n\n\n /**\n * Draw a path\n * @param {Array} path An SVG path in array form\n */\n path: function (path) {\n var attr = {\n fill: NONE\n };\n if (isArray(path)) {\n attr.d = path;\n } else if (isObject(path)) { // attributes\n extend(attr, path);\n }\n return this.createElement('path').attr(attr);\n },\n\n /**\n * Draw and return an SVG circle\n * @param {Number} x The x position\n * @param {Number} y The y position\n * @param {Number} r The radius\n */\n circle: function (x, y, r) {\n var attr = isObject(x) ? x : { x: x, y: y, r: r },\n wrapper = this.createElement('circle');\n\n // Setting x or y translates to cx and cy\n wrapper.xSetter = wrapper.ySetter = function (value, key, element) {\n element.setAttribute('c' + key, value);\n };\n\n return wrapper.attr(attr);\n },\n\n /**\n * Draw and return an arc\n * @param {Number} x X position\n * @param {Number} y Y position\n * @param {Number} r Radius\n * @param {Number} innerR Inner radius like used in donut charts\n * @param {Number} start Starting angle\n * @param {Number} end Ending angle\n */\n arc: function (x, y, r, innerR, start, end) {\n var arc;\n\n if (isObject(x)) {\n y = x.y;\n r = x.r;\n innerR = x.innerR;\n start = x.start;\n end = x.end;\n x = x.x;\n }\n\n // Arcs are defined as symbols for the ability to set\n // attributes in attr and animate\n arc = this.symbol('arc', x || 0, y || 0, r || 0, r || 0, {\n innerR: innerR || 0,\n start: start || 0,\n end: end || 0\n });\n arc.r = r; // #959\n return arc;\n },\n\n /**\n * Draw and return a rectangle\n * @param {Number} x Left position\n * @param {Number} y Top position\n * @param {Number} width\n * @param {Number} height\n * @param {Number} r Border corner radius\n * @param {Number} strokeWidth A stroke width can be supplied to allow crisp drawing\n */\n rect: function (x, y, width, height, r, strokeWidth) {\n\n r = isObject(x) ? x.r : r;\n\n var wrapper = this.createElement('rect'),\n attribs = isObject(x) ? x : x === UNDEFINED ? {} : {\n x: x,\n y: y,\n width: mathMax(width, 0),\n height: mathMax(height, 0)\n };\n\n if (strokeWidth !== UNDEFINED) {\n wrapper.strokeWidth = strokeWidth;\n attribs = wrapper.crisp(attribs);\n }\n\n if (r) {\n attribs.r = r;\n }\n\n wrapper.rSetter = function (value, key, element) {\n attr(element, {\n rx: value,\n ry: value\n });\n };\n\n return wrapper.attr(attribs);\n },\n\n /**\n * Resize the box and re-align all aligned elements\n * @param {Object} width\n * @param {Object} height\n * @param {Boolean} animate\n *\n */\n setSize: function (width, height, animate) {\n var renderer = this,\n alignedObjects = renderer.alignedObjects,\n i = alignedObjects.length;\n\n renderer.width = width;\n renderer.height = height;\n\n renderer.boxWrapper[pick(animate, true) ? 'animate' : 'attr']({\n width: width,\n height: height\n });\n\n while (i--) {\n alignedObjects[i].align();\n }\n },\n\n /**\n * Create a group\n * @param {String} name The group will be given a class name of 'highcharts-{name}'.\n * This can be used for styling and scripting.\n */\n g: function (name) {\n var elem = this.createElement('g');\n return defined(name) ? elem.attr({ 'class': PREFIX + name }) : elem;\n },\n\n /**\n * Display an image\n * @param {String} src\n * @param {Number} x\n * @param {Number} y\n * @param {Number} width\n * @param {Number} height\n */\n image: function (src, x, y, width, height) {\n var attribs = {\n preserveAspectRatio: NONE\n },\n elemWrapper;\n\n // optional properties\n if (arguments.length > 1) {\n extend(attribs, {\n x: x,\n y: y,\n width: width,\n height: height\n });\n }\n\n elemWrapper = this.createElement('image').attr(attribs);\n\n // set the href in the xlink namespace\n if (elemWrapper.element.setAttributeNS) {\n elemWrapper.element.setAttributeNS('http://www.w3.org/1999/xlink',\n 'href', src);\n } else {\n // could be exporting in IE\n // using href throws \"not supported\" in ie7 and under, requries regex shim to fix later\n elemWrapper.element.setAttribute('hc-svg-href', src);\n }\n return elemWrapper;\n },\n\n /**\n * Draw a symbol out of pre-defined shape paths from the namespace 'symbol' object.\n *\n * @param {Object} symbol\n * @param {Object} x\n * @param {Object} y\n * @param {Object} radius\n * @param {Object} options\n */\n symbol: function (symbol, x, y, width, height, options) {\n\n var ren = this,\n obj,\n\n // get the symbol definition function\n symbolFn = this.symbols[symbol],\n\n // check if there's a path defined for this symbol\n path = symbolFn && symbolFn(\n mathRound(x),\n mathRound(y),\n width,\n height,\n options\n ),\n\n imageRegex = /^url\\((.*?)\\)$/,\n imageSrc,\n imageSize,\n centerImage;\n\n if (path) {\n\n obj = this.path(path);\n // expando properties for use in animate and attr\n extend(obj, {\n symbolName: symbol,\n x: x,\n y: y,\n width: width,\n height: height\n });\n if (options) {\n extend(obj, options);\n }\n\n\n // image symbols\n } else if (imageRegex.test(symbol)) {\n\n // On image load, set the size and position\n centerImage = function (img, size) {\n if (img.element) { // it may be destroyed in the meantime (#1390)\n img.attr({\n width: size[0],\n height: size[1]\n });\n\n if (!img.alignByTranslate) { // #185\n img.translate(\n mathRound((width - size[0]) / 2), // #1378\n mathRound((height - size[1]) / 2)\n );\n }\n }\n };\n\n imageSrc = symbol.match(imageRegex)[1];\n imageSize = symbolSizes[imageSrc] || (options && options.width && options.height && [options.width, options.height]);\n\n // Ireate the image synchronously, add attribs async\n obj = this.image(imageSrc)\n .attr({\n x: x,\n y: y\n });\n obj.isImg = true;\n\n if (imageSize) {\n centerImage(obj, imageSize);\n } else {\n // Initialize image to be 0 size so export will still function if there's no cached sizes.\n obj.attr({ width: 0, height: 0 });\n\n // Create a dummy JavaScript image to get the width and height. Due to a bug in IE < 8,\n // the created element must be assigned to a variable in order to load (#292).\n createElement('img', {\n onload: function () {\n\n // Special case for SVGs on IE11, the width is not accessible until the image is\n // part of the DOM (#2854).\n if (this.width === 0) {\n css(this, {\n position: ABSOLUTE,\n top: '-999em'\n });\n doc.body.appendChild(this);\n }\n\n // Center the image\n centerImage(obj, symbolSizes[imageSrc] = [this.width, this.height]);\n\n // Clean up after #2854 workaround.\n if (this.parentNode) {\n this.parentNode.removeChild(this);\n }\n\n // Fire the load event when all external images are loaded\n ren.imgCount--;\n if (!ren.imgCount && charts[ren.chartIndex].onload) {\n charts[ren.chartIndex].onload();\n }\n },\n src: imageSrc\n });\n this.imgCount++;\n }\n }\n\n return obj;\n },\n\n /**\n * An extendable collection of functions for defining symbol paths.\n */\n symbols: {\n 'circle': function (x, y, w, h) {\n var cpw = 0.166 * w;\n return [\n M, x + w / 2, y,\n 'C', x + w + cpw, y, x + w + cpw, y + h, x + w / 2, y + h,\n 'C', x - cpw, y + h, x - cpw, y, x + w / 2, y,\n 'Z'\n ];\n },\n\n 'square': function (x, y, w, h) {\n return [\n M, x, y,\n L, x + w, y,\n x + w, y + h,\n x, y + h,\n 'Z'\n ];\n },\n\n 'triangle': function (x, y, w, h) {\n return [\n M, x + w / 2, y,\n L, x + w, y + h,\n x, y + h,\n 'Z'\n ];\n },\n\n 'triangle-down': function (x, y, w, h) {\n return [\n M, x, y,\n L, x + w, y,\n x + w / 2, y + h,\n 'Z'\n ];\n },\n 'diamond': function (x, y, w, h) {\n return [\n M, x + w / 2, y,\n L, x + w, y + h / 2,\n x + w / 2, y + h,\n x, y + h / 2,\n 'Z'\n ];\n },\n 'arc': function (x, y, w, h, options) {\n var start = options.start,\n radius = options.r || w || h,\n end = options.end - 0.001, // to prevent cos and sin of start and end from becoming equal on 360 arcs (related: #1561)\n innerRadius = options.innerR,\n open = options.open,\n cosStart = mathCos(start),\n sinStart = mathSin(start),\n cosEnd = mathCos(end),\n sinEnd = mathSin(end),\n longArc = options.end - start < mathPI ? 0 : 1;\n\n return [\n M,\n x + radius * cosStart,\n y + radius * sinStart,\n 'A', // arcTo\n radius, // x radius\n radius, // y radius\n 0, // slanting\n longArc, // long or short arc\n 1, // clockwise\n x + radius * cosEnd,\n y + radius * sinEnd,\n open ? M : L,\n x + innerRadius * cosEnd,\n y + innerRadius * sinEnd,\n 'A', // arcTo\n innerRadius, // x radius\n innerRadius, // y radius\n 0, // slanting\n longArc, // long or short arc\n 0, // clockwise\n x + innerRadius * cosStart,\n y + innerRadius * sinStart,\n\n open ? '' : 'Z' // close\n ];\n },\n\n /**\n * Callout shape used for default tooltips, also used for rounded rectangles in VML\n */\n callout: function (x, y, w, h, options) {\n var arrowLength = 6,\n halfDistance = 6,\n r = mathMin((options && options.r) || 0, w, h),\n safeDistance = r + halfDistance,\n anchorX = options && options.anchorX,\n anchorY = options && options.anchorY,\n path;\n\n path = [\n 'M', x + r, y,\n 'L', x + w - r, y, // top side\n 'C', x + w, y, x + w, y, x + w, y + r, // top-right corner\n 'L', x + w, y + h - r, // right side\n 'C', x + w, y + h, x + w, y + h, x + w - r, y + h, // bottom-right corner\n 'L', x + r, y + h, // bottom side\n 'C', x, y + h, x, y + h, x, y + h - r, // bottom-left corner\n 'L', x, y + r, // left side\n 'C', x, y, x, y, x + r, y // top-right corner\n ];\n\n if (anchorX && anchorX > w && anchorY > y + safeDistance && anchorY < y + h - safeDistance) { // replace right side\n path.splice(13, 3,\n 'L', x + w, anchorY - halfDistance,\n x + w + arrowLength, anchorY,\n x + w, anchorY + halfDistance,\n x + w, y + h - r\n );\n } else if (anchorX && anchorX < 0 && anchorY > y + safeDistance && anchorY < y + h - safeDistance) { // replace left side\n path.splice(33, 3,\n 'L', x, anchorY + halfDistance,\n x - arrowLength, anchorY,\n x, anchorY - halfDistance,\n x, y + r\n );\n } else if (anchorY && anchorY > h && anchorX > x + safeDistance && anchorX < x + w - safeDistance) { // replace bottom\n path.splice(23, 3,\n 'L', anchorX + halfDistance, y + h,\n anchorX, y + h + arrowLength,\n anchorX - halfDistance, y + h,\n x + r, y + h\n );\n } else if (anchorY && anchorY < 0 && anchorX > x + safeDistance && anchorX < x + w - safeDistance) { // replace top\n path.splice(3, 3,\n 'L', anchorX - halfDistance, y,\n anchorX, y - arrowLength,\n anchorX + halfDistance, y,\n w - r, y\n );\n }\n return path;\n }\n },\n\n /**\n * Define a clipping rectangle\n * @param {String} id\n * @param {Number} x\n * @param {Number} y\n * @param {Number} width\n * @param {Number} height\n */\n clipRect: function (x, y, width, height) {\n var wrapper,\n id = PREFIX + idCounter++,\n\n clipPath = this.createElement('clipPath').attr({\n id: id\n }).add(this.defs);\n\n wrapper = this.rect(x, y, width, height, 0).add(clipPath);\n wrapper.id = id;\n wrapper.clipPath = clipPath;\n wrapper.count = 0;\n\n return wrapper;\n },\n\n\n\n\n\n /**\n * Add text to the SVG object\n * @param {String} str\n * @param {Number} x Left position\n * @param {Number} y Top position\n * @param {Boolean} useHTML Use HTML to render the text\n */\n text: function (str, x, y, useHTML) {\n\n // declare variables\n var renderer = this,\n fakeSVG = useCanVG || (!hasSVG && renderer.forExport),\n wrapper,\n attr = {};\n\n if (useHTML && (renderer.allowHTML || !renderer.forExport)) {\n return renderer.html(str, x, y);\n }\n\n attr.x = Math.round(x || 0); // X is always needed for line-wrap logic\n if (y) {\n attr.y = Math.round(y);\n }\n if (str || str === 0) {\n attr.text = str;\n }\n\n wrapper = renderer.createElement('text')\n .attr(attr);\n\n // Prevent wrapping from creating false offsetWidths in export in legacy IE (#1079, #1063)\n if (fakeSVG) {\n wrapper.css({\n position: ABSOLUTE\n });\n }\n\n if (!useHTML) {\n wrapper.xSetter = function (value, key, element) {\n var tspans = element.getElementsByTagName('tspan'),\n tspan,\n parentVal = element.getAttribute(key),\n i;\n for (i = 0; i < tspans.length; i++) {\n tspan = tspans[i];\n // If the x values are equal, the tspan represents a linebreak\n if (tspan.getAttribute(key) === parentVal) {\n tspan.setAttribute(key, value);\n }\n }\n element.setAttribute(key, value);\n };\n }\n\n return wrapper;\n },\n\n /**\n * Utility to return the baseline offset and total line height from the font size\n */\n fontMetrics: function (fontSize, elem) {\n var lineHeight,\n baseline,\n style;\n\n fontSize = fontSize || this.style.fontSize;\n if (!fontSize && elem && win.getComputedStyle) {\n elem = elem.element || elem; // SVGElement\n style = win.getComputedStyle(elem, '');\n fontSize = style && style.fontSize; // #4309, the style doesn't exist inside a hidden iframe in Firefox\n }\n fontSize = /px/.test(fontSize) ? pInt(fontSize) : /em/.test(fontSize) ? parseFloat(fontSize) * 12 : 12;\n\n // Empirical values found by comparing font size and bounding box height.\n // Applies to the default font family. http://jsfiddle.net/highcharts/7xvn7/\n lineHeight = fontSize < 24 ? fontSize + 3 : mathRound(fontSize * 1.2);\n baseline = mathRound(lineHeight * 0.8);\n\n return {\n h: lineHeight,\n b: baseline,\n f: fontSize\n };\n },\n\n /**\n * Correct X and Y positioning of a label for rotation (#1764)\n */\n rotCorr: function (baseline, rotation, alterY) {\n var y = baseline;\n if (rotation && alterY) {\n y = mathMax(y * mathCos(rotation * deg2rad), 4);\n }\n return {\n x: (-baseline / 3) * mathSin(rotation * deg2rad),\n y: y\n };\n },\n\n /**\n * Add a label, a text item that can hold a colored or gradient background\n * as well as a border and shadow.\n * @param {string} str\n * @param {Number} x\n * @param {Number} y\n * @param {String} shape\n * @param {Number} anchorX In case the shape has a pointer, like a flag, this is the\n * coordinates it should be pinned to\n * @param {Number} anchorY\n * @param {Boolean} baseline Whether to position the label relative to the text baseline,\n * like renderer.text, or to the upper border of the rectangle.\n * @param {String} className Class name for the group\n */\n label: function (str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {\n\n var renderer = this,\n wrapper = renderer.g(className),\n text = renderer.text('', 0, 0, useHTML)\n .attr({\n zIndex: 1\n }),\n //.add(wrapper),\n box,\n bBox,\n alignFactor = 0,\n padding = 3,\n paddingLeft = 0,\n width,\n height,\n wrapperX,\n wrapperY,\n crispAdjust = 0,\n deferredAttr = {},\n baselineOffset,\n needsBox,\n updateBoxSize,\n updateTextPadding,\n boxAttr;\n\n /**\n * This function runs after the label is added to the DOM (when the bounding box is\n * available), and after the text of the label is updated to detect the new bounding\n * box and reflect it in the border box.\n */\n updateBoxSize = function () {\n var boxX,\n boxY,\n style = text.element.style;\n\n bBox = (width === undefined || height === undefined || wrapper.styles.textAlign) && defined(text.textStr) &&\n text.getBBox(); //#3295 && 3514 box failure when string equals 0\n wrapper.width = (width || bBox.width || 0) + 2 * padding + paddingLeft;\n wrapper.height = (height || bBox.height || 0) + 2 * padding;\n\n // update the label-scoped y offset\n baselineOffset = padding + renderer.fontMetrics(style && style.fontSize, text).b;\n\n\n if (needsBox) {\n\n if (!box) {\n // create the border box if it is not already present\n boxX = crispAdjust;\n boxY = (baseline ? -baselineOffset : 0) + crispAdjust;\n wrapper.box = box = renderer.symbols[shape] ? // Symbol definition exists (#5324)\n renderer.symbol(shape, boxX, boxY, wrapper.width, wrapper.height, deferredAttr) :\n renderer.rect(boxX, boxY, wrapper.width, wrapper.height, 0, deferredAttr[STROKE_WIDTH]);\n\n if (!box.isImg) { // #4324, fill \"none\" causes it to be ignored by mouse events in IE\n box.attr('fill', NONE);\n }\n box.add(wrapper);\n }\n\n // apply the box attributes\n if (!box.isImg) { // #1630\n box.attr(extend({\n width: mathRound(wrapper.width),\n height: mathRound(wrapper.height)\n }, deferredAttr));\n }\n deferredAttr = null;\n }\n };\n\n /**\n * This function runs after setting text or padding, but only if padding is changed\n */\n updateTextPadding = function () {\n var styles = wrapper.styles,\n textAlign = styles && styles.textAlign,\n x = paddingLeft + padding,\n y;\n\n // determin y based on the baseline\n y = baseline ? 0 : baselineOffset;\n\n // compensate for alignment\n if (defined(width) && bBox && (textAlign === 'center' || textAlign === 'right')) {\n x += { center: 0.5, right: 1 }[textAlign] * (width - bBox.width);\n }\n\n // update if anything changed\n if (x !== text.x || y !== text.y) {\n text.attr('x', x);\n if (y !== UNDEFINED) {\n text.attr('y', y);\n }\n }\n\n // record current values\n text.x = x;\n text.y = y;\n };\n\n /**\n * Set a box attribute, or defer it if the box is not yet created\n * @param {Object} key\n * @param {Object} value\n */\n boxAttr = function (key, value) {\n if (box) {\n box.attr(key, value);\n } else {\n deferredAttr[key] = value;\n }\n };\n\n /**\n * After the text element is added, get the desired size of the border box\n * and add it before the text in the DOM.\n */\n wrapper.onAdd = function () {\n text.add(wrapper);\n wrapper.attr({\n text: (str || str === 0) ? str : '', // alignment is available now // #3295: 0 not rendered if given as a value\n x: x,\n y: y\n });\n\n if (box && defined(anchorX)) {\n wrapper.attr({\n anchorX: anchorX,\n anchorY: anchorY\n });\n }\n };\n\n /*\n * Add specific attribute setters.\n */\n\n // only change local variables\n wrapper.widthSetter = function (value) {\n width = value;\n };\n wrapper.heightSetter = function (value) {\n height = value;\n };\n wrapper.paddingSetter = function (value) {\n if (defined(value) && value !== padding) {\n padding = wrapper.padding = value;\n updateTextPadding();\n }\n };\n wrapper.paddingLeftSetter = function (value) {\n if (defined(value) && value !== paddingLeft) {\n paddingLeft = value;\n updateTextPadding();\n }\n };\n\n\n // change local variable and prevent setting attribute on the group\n wrapper.alignSetter = function (value) {\n value = { left: 0, center: 0.5, right: 1 }[value];\n if (value !== alignFactor) {\n alignFactor = value;\n if (bBox) { // Bounding box exists, means we're dynamically changing\n wrapper.attr({ x: wrapperX }); // #5134\n }\n }\n };\n\n // apply these to the box and the text alike\n wrapper.textSetter = function (value) {\n if (value !== UNDEFINED) {\n text.textSetter(value);\n }\n updateBoxSize();\n updateTextPadding();\n };\n\n // apply these to the box but not to the text\n wrapper['stroke-widthSetter'] = function (value, key) {\n if (value) {\n needsBox = true;\n }\n crispAdjust = value % 2 / 2;\n boxAttr(key, value);\n };\n wrapper.strokeSetter = wrapper.fillSetter = wrapper.rSetter = function (value, key) {\n if (key === 'fill' && value) {\n needsBox = true;\n }\n boxAttr(key, value);\n };\n wrapper.anchorXSetter = function (value, key) {\n anchorX = value;\n boxAttr(key, mathRound(value) - crispAdjust - wrapperX);\n };\n wrapper.anchorYSetter = function (value, key) {\n anchorY = value;\n boxAttr(key, value - wrapperY);\n };\n\n // rename attributes\n wrapper.xSetter = function (value) {\n wrapper.x = value; // for animation getter\n if (alignFactor) {\n value -= alignFactor * ((width || bBox.width) + 2 * padding);\n }\n wrapperX = mathRound(value);\n wrapper.attr('translateX', wrapperX);\n };\n wrapper.ySetter = function (value) {\n wrapperY = wrapper.y = mathRound(value);\n wrapper.attr('translateY', wrapperY);\n };\n\n // Redirect certain methods to either the box or the text\n var baseCss = wrapper.css;\n return extend(wrapper, {\n /**\n * Pick up some properties and apply them to the text instead of the wrapper\n */\n css: function (styles) {\n if (styles) {\n var textStyles = {};\n styles = merge(styles); // create a copy to avoid altering the original object (#537)\n each(wrapper.textProps, function (prop) {\n if (styles[prop] !== UNDEFINED) {\n textStyles[prop] = styles[prop];\n delete styles[prop];\n }\n });\n text.css(textStyles);\n }\n return baseCss.call(wrapper, styles);\n },\n /**\n * Return the bounding box of the box, not the group\n */\n getBBox: function () {\n return {\n width: bBox.width + 2 * padding,\n height: bBox.height + 2 * padding,\n x: bBox.x - padding,\n y: bBox.y - padding\n };\n },\n /**\n * Apply the shadow to the box\n */\n shadow: function (b) {\n if (box) {\n box.shadow(b);\n }\n return wrapper;\n },\n /**\n * Destroy and release memory.\n */\n destroy: function () {\n\n // Added by button implementation\n removeEvent(wrapper.element, 'mouseenter');\n removeEvent(wrapper.element, 'mouseleave');\n\n if (text) {\n text = text.destroy();\n }\n if (box) {\n box = box.destroy();\n }\n // Call base implementation to destroy the rest\n SVGElement.prototype.destroy.call(wrapper);\n\n // Release local pointers (#1298)\n wrapper = renderer = updateBoxSize = updateTextPadding = boxAttr = null;\n }\n });\n }\n }; // end SVGRenderer\n\n\n // general renderer\n Renderer = SVGRenderer;\n // extend SvgElement for useHTML option\n extend(SVGElement.prototype, {\n /**\n * Apply CSS to HTML elements. This is used in text within SVG rendering and\n * by the VML renderer\n */\n htmlCss: function (styles) {\n var wrapper = this,\n element = wrapper.element,\n textWidth = styles && element.tagName === 'SPAN' && styles.width;\n\n if (textWidth) {\n delete styles.width;\n wrapper.textWidth = textWidth;\n wrapper.updateTransform();\n }\n if (styles && styles.textOverflow === 'ellipsis') {\n styles.whiteSpace = 'nowrap';\n styles.overflow = 'hidden';\n }\n wrapper.styles = extend(wrapper.styles, styles);\n css(wrapper.element, styles);\n\n return wrapper;\n },\n\n /**\n * VML and useHTML method for calculating the bounding box based on offsets\n * @param {Boolean} refresh Whether to force a fresh value from the DOM or to\n * use the cached value\n *\n * @return {Object} A hash containing values for x, y, width and height\n */\n\n htmlGetBBox: function () {\n var wrapper = this,\n element = wrapper.element;\n\n // faking getBBox in exported SVG in legacy IE\n // faking getBBox in exported SVG in legacy IE (is this a duplicate of the fix for #1079?)\n if (element.nodeName === 'text') {\n element.style.position = ABSOLUTE;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: element.offsetWidth,\n height: element.offsetHeight\n };\n },\n\n /**\n * VML override private method to update elements based on internal\n * properties based on SVG transform\n */\n htmlUpdateTransform: function () {\n // aligning non added elements is expensive\n if (!this.added) {\n this.alignOnAdd = true;\n return;\n }\n\n var wrapper = this,\n renderer = wrapper.renderer,\n elem = wrapper.element,\n translateX = wrapper.translateX || 0,\n translateY = wrapper.translateY || 0,\n x = wrapper.x || 0,\n y = wrapper.y || 0,\n align = wrapper.textAlign || 'left',\n alignCorrection = { left: 0, center: 0.5, right: 1 }[align],\n shadows = wrapper.shadows,\n styles = wrapper.styles;\n\n // apply translate\n css(elem, {\n marginLeft: translateX,\n marginTop: translateY\n });\n if (shadows) { // used in labels/tooltip\n each(shadows, function (shadow) {\n css(shadow, {\n marginLeft: translateX + 1,\n marginTop: translateY + 1\n });\n });\n }\n\n // apply inversion\n if (wrapper.inverted) { // wrapper is a group\n each(elem.childNodes, function (child) {\n renderer.invertChild(child, elem);\n });\n }\n\n if (elem.tagName === 'SPAN') {\n\n var rotation = wrapper.rotation,\n baseline,\n textWidth = pInt(wrapper.textWidth),\n whiteSpace = styles && styles.whiteSpace,\n currentTextTransform = [rotation, align, elem.innerHTML, wrapper.textWidth, wrapper.textAlign].join(',');\n\n if (currentTextTransform !== wrapper.cTT) { // do the calculations and DOM access only if properties changed\n\n\n baseline = renderer.fontMetrics(elem.style.fontSize).b;\n\n // Renderer specific handling of span rotation\n if (defined(rotation)) {\n wrapper.setSpanRotation(rotation, alignCorrection, baseline);\n }\n\n // Reset multiline/ellipsis in order to read width (#4928, #5417)\n css(elem, {\n width: '',\n whiteSpace: whiteSpace || 'nowrap'\n });\n\n // Update textWidth\n if (elem.offsetWidth > textWidth && /[ \\-]/.test(elem.textContent || elem.innerText)) { // #983, #1254\n css(elem, {\n width: textWidth + PX,\n display: 'block',\n whiteSpace: whiteSpace || 'normal' // #3331\n });\n }\n\n\n wrapper.getSpanCorrection(elem.offsetWidth, baseline, alignCorrection, rotation, align);\n }\n\n // apply position with correction\n css(elem, {\n left: (x + (wrapper.xCorr || 0)) + PX,\n top: (y + (wrapper.yCorr || 0)) + PX\n });\n\n // force reflow in webkit to apply the left and top on useHTML element (#1249)\n if (isWebKit) {\n baseline = elem.offsetHeight; // assigned to baseline for lint purpose\n }\n\n // record current text transform\n wrapper.cTT = currentTextTransform;\n }\n },\n\n /**\n * Set the rotation of an individual HTML span\n */\n setSpanRotation: function (rotation, alignCorrection, baseline) {\n var rotationStyle = {},\n cssTransformKey = isMS ? '-ms-transform' : isWebKit ? '-webkit-transform' : isFirefox ? 'MozTransform' : isOpera ? '-o-transform' : '';\n\n rotationStyle[cssTransformKey] = rotationStyle.transform = 'rotate(' + rotation + 'deg)';\n rotationStyle[cssTransformKey + (isFirefox ? 'Origin' : '-origin')] = rotationStyle.transformOrigin = (alignCorrection * 100) + '% ' + baseline + 'px';\n css(this.element, rotationStyle);\n },\n\n /**\n * Get the correction in X and Y positioning as the element is rotated.\n */\n getSpanCorrection: function (width, baseline, alignCorrection) {\n this.xCorr = -width * alignCorrection;\n this.yCorr = -baseline;\n }\n });\n\n // Extend SvgRenderer for useHTML option.\n extend(SVGRenderer.prototype, {\n /**\n * Create HTML text node. This is used by the VML renderer as well as the SVG\n * renderer through the useHTML option.\n *\n * @param {String} str\n * @param {Number} x\n * @param {Number} y\n */\n html: function (str, x, y) {\n var wrapper = this.createElement('span'),\n element = wrapper.element,\n renderer = wrapper.renderer,\n isSVG = renderer.isSVG,\n addSetters = function (element, style) {\n // These properties are set as attributes on the SVG group, and as\n // identical CSS properties on the div. (#3542)\n each(['opacity', 'visibility'], function (prop) {\n wrap(element, prop + 'Setter', function (proceed, value, key, elem) {\n proceed.call(this, value, key, elem);\n style[key] = value;\n });\n }); \n };\n\n // Text setter\n wrapper.textSetter = function (value) {\n if (value !== element.innerHTML) {\n delete this.bBox;\n }\n element.innerHTML = this.textStr = value;\n wrapper.htmlUpdateTransform();\n };\n\n // Add setters for the element itself (#4938)\n if (isSVG) { // #4938, only for HTML within SVG\n addSetters(wrapper, wrapper.element.style);\n }\n\n // Various setters which rely on update transform\n wrapper.xSetter = wrapper.ySetter = wrapper.alignSetter = wrapper.rotationSetter = function (value, key) {\n if (key === 'align') {\n key = 'textAlign'; // Do not overwrite the SVGElement.align method. Same as VML.\n }\n wrapper[key] = value;\n wrapper.htmlUpdateTransform();\n };\n\n // Set the default attributes\n wrapper\n .attr({\n text: str,\n x: mathRound(x),\n y: mathRound(y)\n })\n .css({\n position: ABSOLUTE,\n fontFamily: this.style.fontFamily,\n fontSize: this.style.fontSize\n });\n\n // Keep the whiteSpace style outside the wrapper.styles collection\n element.style.whiteSpace = 'nowrap';\n\n // Use the HTML specific .css method\n wrapper.css = wrapper.htmlCss;\n\n // This is specific for HTML within SVG\n if (isSVG) {\n wrapper.add = function (svgGroupWrapper) {\n\n var htmlGroup,\n container = renderer.box.parentNode,\n parentGroup,\n parents = [];\n\n this.parentGroup = svgGroupWrapper;\n\n // Create a mock group to hold the HTML elements\n if (svgGroupWrapper) {\n htmlGroup = svgGroupWrapper.div;\n if (!htmlGroup) {\n\n // Read the parent chain into an array and read from top down\n parentGroup = svgGroupWrapper;\n while (parentGroup) {\n\n parents.push(parentGroup);\n\n // Move up to the next parent group\n parentGroup = parentGroup.parentGroup;\n }\n\n // Ensure dynamically updating position when any parent is translated\n each(parents.reverse(), function (parentGroup) {\n var htmlGroupStyle,\n cls = attr(parentGroup.element, 'class');\n\n if (cls) {\n cls = { className: cls };\n } // else null\n\n // Create a HTML div and append it to the parent div to emulate\n // the SVG group structure\n htmlGroup = parentGroup.div = parentGroup.div || createElement(DIV, cls, {\n position: ABSOLUTE,\n left: (parentGroup.translateX || 0) + PX,\n top: (parentGroup.translateY || 0) + PX,\n opacity: parentGroup.opacity // #5075\n }, htmlGroup || container); // the top group is appended to container\n\n // Shortcut\n htmlGroupStyle = htmlGroup.style;\n\n // Set listeners to update the HTML div's position whenever the SVG group\n // position is changed\n extend(parentGroup, {\n translateXSetter: function (value, key) {\n htmlGroupStyle.left = value + PX;\n parentGroup[key] = value;\n parentGroup.doTransform = true;\n },\n translateYSetter: function (value, key) {\n htmlGroupStyle.top = value + PX;\n parentGroup[key] = value;\n parentGroup.doTransform = true;\n }\n });\n addSetters(parentGroup, htmlGroupStyle);\n });\n\n }\n } else {\n htmlGroup = container;\n }\n\n htmlGroup.appendChild(element);\n\n // Shared with VML:\n wrapper.added = true;\n if (wrapper.alignOnAdd) {\n wrapper.htmlUpdateTransform();\n }\n\n return wrapper;\n };\n }\n return wrapper;\n }\n });\n\n\n /* ****************************************************************************\n * *\n * START OF INTERNET EXPLORER <= 8 SPECIFIC CODE *\n * *\n * For applications and websites that don't need IE support, like platform *\n * targeted mobile apps and web apps, this code can be removed. *\n * *\n *****************************************************************************/\n\n /**\n * @constructor\n */\n var VMLRenderer, VMLElement;\n if (!hasSVG && !useCanVG) {\n\n /**\n * The VML element wrapper.\n */\n VMLElement = {\n\n /**\n * Initialize a new VML element wrapper. It builds the markup as a string\n * to minimize DOM traffic.\n * @param {Object} renderer\n * @param {Object} nodeName\n */\n init: function (renderer, nodeName) {\n var wrapper = this,\n markup = ['<', nodeName, ' filled=\"f\" stroked=\"f\"'],\n style = ['position: ', ABSOLUTE, ';'],\n isDiv = nodeName === DIV;\n\n // divs and shapes need size\n if (nodeName === 'shape' || isDiv) {\n style.push('left:0;top:0;width:1px;height:1px;');\n }\n style.push('visibility: ', isDiv ? HIDDEN : VISIBLE);\n\n markup.push(' style=\"', style.join(''), '\"/>');\n\n // create element with default attributes and style\n if (nodeName) {\n markup = isDiv || nodeName === 'span' || nodeName === 'img' ?\n markup.join('') :\n renderer.prepVML(markup);\n wrapper.element = createElement(markup);\n }\n\n wrapper.renderer = renderer;\n },\n\n /**\n * Add the node to the given parent\n * @param {Object} parent\n */\n add: function (parent) {\n var wrapper = this,\n renderer = wrapper.renderer,\n element = wrapper.element,\n box = renderer.box,\n inverted = parent && parent.inverted,\n\n // get the parent node\n parentNode = parent ?\n parent.element || parent :\n box;\n\n if (parent) {\n this.parentGroup = parent;\n }\n\n // if the parent group is inverted, apply inversion on all children\n if (inverted) { // only on groups\n renderer.invertChild(element, parentNode);\n }\n\n // append it\n parentNode.appendChild(element);\n\n // align text after adding to be able to read offset\n wrapper.added = true;\n if (wrapper.alignOnAdd && !wrapper.deferUpdateTransform) {\n wrapper.updateTransform();\n }\n\n // fire an event for internal hooks\n if (wrapper.onAdd) {\n wrapper.onAdd();\n }\n\n return wrapper;\n },\n\n /**\n * VML always uses htmlUpdateTransform\n */\n updateTransform: SVGElement.prototype.htmlUpdateTransform,\n\n /**\n * Set the rotation of a span with oldIE's filter\n */\n setSpanRotation: function () {\n // Adjust for alignment and rotation. Rotation of useHTML content is not yet implemented\n // but it can probably be implemented for Firefox 3.5+ on user request. FF3.5+\n // has support for CSS3 transform. The getBBox method also needs to be updated\n // to compensate for the rotation, like it currently does for SVG.\n // Test case: http://jsfiddle.net/highcharts/Ybt44/\n\n var rotation = this.rotation,\n costheta = mathCos(rotation * deg2rad),\n sintheta = mathSin(rotation * deg2rad);\n\n css(this.element, {\n filter: rotation ? ['progid:DXImageTransform.Microsoft.Matrix(M11=', costheta,\n ', M12=', -sintheta, ', M21=', sintheta, ', M22=', costheta,\n ', sizingMethod=\\'auto expand\\')'].join('') : NONE\n });\n },\n\n /**\n * Get the positioning correction for the span after rotating.\n */\n getSpanCorrection: function (width, baseline, alignCorrection, rotation, align) {\n\n var costheta = rotation ? mathCos(rotation * deg2rad) : 1,\n sintheta = rotation ? mathSin(rotation * deg2rad) : 0,\n height = pick(this.elemHeight, this.element.offsetHeight),\n quad,\n nonLeft = align && align !== 'left';\n\n // correct x and y\n this.xCorr = costheta < 0 && -width;\n this.yCorr = sintheta < 0 && -height;\n\n // correct for baseline and corners spilling out after rotation\n quad = costheta * sintheta < 0;\n this.xCorr += sintheta * baseline * (quad ? 1 - alignCorrection : alignCorrection);\n this.yCorr -= costheta * baseline * (rotation ? (quad ? alignCorrection : 1 - alignCorrection) : 1);\n // correct for the length/height of the text\n if (nonLeft) {\n this.xCorr -= width * alignCorrection * (costheta < 0 ? -1 : 1);\n if (rotation) {\n this.yCorr -= height * alignCorrection * (sintheta < 0 ? -1 : 1);\n }\n css(this.element, {\n textAlign: align\n });\n }\n },\n\n /**\n * Converts a subset of an SVG path definition to its VML counterpart. Takes an array\n * as the parameter and returns a string.\n */\n pathToVML: function (value) {\n // convert paths\n var i = value.length,\n path = [];\n\n while (i--) {\n\n // Multiply by 10 to allow subpixel precision.\n // Substracting half a pixel seems to make the coordinates\n // align with SVG, but this hasn't been tested thoroughly\n if (isNumber(value[i])) {\n path[i] = mathRound(value[i] * 10) - 5;\n } else if (value[i] === 'Z') { // close the path\n path[i] = 'x';\n } else {\n path[i] = value[i];\n\n // When the start X and end X coordinates of an arc are too close,\n // they are rounded to the same value above. In this case, substract or\n // add 1 from the end X and Y positions. #186, #760, #1371, #1410.\n if (value.isArc && (value[i] === 'wa' || value[i] === 'at')) {\n // Start and end X\n if (path[i + 5] === path[i + 7]) {\n path[i + 7] += value[i + 7] > value[i + 5] ? 1 : -1;\n }\n // Start and end Y\n if (path[i + 6] === path[i + 8]) {\n path[i + 8] += value[i + 8] > value[i + 6] ? 1 : -1;\n }\n }\n }\n }\n\n\n // Loop up again to handle path shortcuts (#2132)\n /*while (i++ < path.length) {\n if (path[i] === 'H') { // horizontal line to\n path[i] = 'L';\n path.splice(i + 2, 0, path[i - 1]);\n } else if (path[i] === 'V') { // vertical line to\n path[i] = 'L';\n path.splice(i + 1, 0, path[i - 2]);\n }\n }*/\n return path.join(' ') || 'x';\n },\n\n /**\n * Set the element's clipping to a predefined rectangle\n *\n * @param {String} id The id of the clip rectangle\n */\n clip: function (clipRect) {\n var wrapper = this,\n clipMembers,\n cssRet;\n\n if (clipRect) {\n clipMembers = clipRect.members;\n erase(clipMembers, wrapper); // Ensure unique list of elements (#1258)\n clipMembers.push(wrapper);\n wrapper.destroyClip = function () {\n erase(clipMembers, wrapper);\n };\n cssRet = clipRect.getCSS(wrapper);\n\n } else {\n if (wrapper.destroyClip) {\n wrapper.destroyClip();\n }\n cssRet = { clip: docMode8 ? 'inherit' : 'rect(auto)' }; // #1214\n }\n\n return wrapper.css(cssRet);\n\n },\n\n /**\n * Set styles for the element\n * @param {Object} styles\n */\n css: SVGElement.prototype.htmlCss,\n\n /**\n * Removes a child either by removeChild or move to garbageBin.\n * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not.\n */\n safeRemoveChild: function (element) {\n // discardElement will detach the node from its parent before attaching it\n // to the garbage bin. Therefore it is important that the node is attached and have parent.\n if (element.parentNode) {\n discardElement(element);\n }\n },\n\n /**\n * Extend element.destroy by removing it from the clip members array\n */\n destroy: function () {\n if (this.destroyClip) {\n this.destroyClip();\n }\n\n return SVGElement.prototype.destroy.apply(this);\n },\n\n /**\n * Add an event listener. VML override for normalizing event parameters.\n * @param {String} eventType\n * @param {Function} handler\n */\n on: function (eventType, handler) {\n // simplest possible event model for internal use\n this.element['on' + eventType] = function () {\n var evt = win.event;\n evt.target = evt.srcElement;\n handler(evt);\n };\n return this;\n },\n\n /**\n * In stacked columns, cut off the shadows so that they don't overlap\n */\n cutOffPath: function (path, length) {\n\n var len;\n\n path = path.split(/[ ,]/);\n len = path.length;\n\n if (len === 9 || len === 11) {\n path[len - 4] = path[len - 2] = pInt(path[len - 2]) - 10 * length;\n }\n return path.join(' ');\n },\n\n /**\n * Apply a drop shadow by copying elements and giving them different strokes\n * @param {Boolean|Object} shadowOptions\n */\n shadow: function (shadowOptions, group, cutOff) {\n var shadows = [],\n i,\n element = this.element,\n renderer = this.renderer,\n shadow,\n elemStyle = element.style,\n markup,\n path = element.path,\n strokeWidth,\n modifiedPath,\n shadowWidth,\n shadowElementOpacity;\n\n // some times empty paths are not strings\n if (path && typeof path.value !== 'string') {\n path = 'x';\n }\n modifiedPath = path;\n\n if (shadowOptions) {\n shadowWidth = pick(shadowOptions.width, 3);\n shadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;\n for (i = 1; i <= 3; i++) {\n\n strokeWidth = (shadowWidth * 2) + 1 - (2 * i);\n\n // Cut off shadows for stacked column items\n if (cutOff) {\n modifiedPath = this.cutOffPath(path.value, strokeWidth + 0.5);\n }\n\n markup = [' '];\n\n shadow = createElement(renderer.prepVML(markup),\n null, {\n left: pInt(elemStyle.left) + pick(shadowOptions.offsetX, 1),\n top: pInt(elemStyle.top) + pick(shadowOptions.offsetY, 1)\n }\n );\n if (cutOff) {\n shadow.cutOff = strokeWidth + 1;\n }\n\n // apply the opacity\n markup = [' '];\n createElement(renderer.prepVML(markup), null, null, shadow);\n\n\n // insert it\n if (group) {\n group.element.appendChild(shadow);\n } else {\n element.parentNode.insertBefore(shadow, element);\n }\n\n // record it\n shadows.push(shadow);\n\n }\n\n this.shadows = shadows;\n }\n return this;\n },\n updateShadows: noop, // Used in SVG only\n\n setAttr: function (key, value) {\n if (docMode8) { // IE8 setAttribute bug\n this.element[key] = value;\n } else {\n this.element.setAttribute(key, value);\n }\n },\n classSetter: function (value) {\n // IE8 Standards mode has problems retrieving the className unless set like this\n this.element.className = value;\n },\n dashstyleSetter: function (value, key, element) {\n var strokeElem = element.getElementsByTagName('stroke')[0] ||\n createElement(this.renderer.prepVML([' ']), null, null, element);\n strokeElem[key] = value || 'solid';\n this[key] = value; /* because changing stroke-width will change the dash length\n and cause an epileptic effect */\n },\n dSetter: function (value, key, element) {\n var i,\n shadows = this.shadows;\n value = value || [];\n this.d = value.join && value.join(' '); // used in getter for animation\n\n element.path = value = this.pathToVML(value);\n\n // update shadows\n if (shadows) {\n i = shadows.length;\n while (i--) {\n shadows[i].path = shadows[i].cutOff ? this.cutOffPath(value, shadows[i].cutOff) : value;\n }\n }\n this.setAttr(key, value);\n },\n fillSetter: function (value, key, element) {\n var nodeName = element.nodeName;\n if (nodeName === 'SPAN') { // text color\n element.style.color = value;\n } else if (nodeName !== 'IMG') { // #1336\n element.filled = value !== NONE;\n this.setAttr('fillcolor', this.renderer.color(value, element, key, this));\n }\n },\n 'fill-opacitySetter': function (value, key, element) {\n createElement(\n this.renderer.prepVML(['<', key.split('-')[0], ' opacity=\"', value, '\"/>']),\n null,\n null,\n element\n );\n },\n opacitySetter: noop, // Don't bother - animation is too slow and filters introduce artifacts\n rotationSetter: function (value, key, element) {\n var style = element.style;\n this[key] = style[key] = value; // style is for #1873\n\n // Correction for the 1x1 size of the shape container. Used in gauge needles.\n style.left = -mathRound(mathSin(value * deg2rad) + 1) + PX;\n style.top = mathRound(mathCos(value * deg2rad)) + PX;\n },\n strokeSetter: function (value, key, element) {\n this.setAttr('strokecolor', this.renderer.color(value, element, key, this));\n },\n 'stroke-widthSetter': function (value, key, element) {\n element.stroked = !!value; // VML \"stroked\" attribute\n this[key] = value; // used in getter, issue #113\n if (isNumber(value)) {\n value += PX;\n }\n this.setAttr('strokeweight', value);\n },\n titleSetter: function (value, key) {\n this.setAttr(key, value);\n },\n visibilitySetter: function (value, key, element) {\n\n // Handle inherited visibility\n if (value === 'inherit') {\n value = VISIBLE;\n }\n\n // Let the shadow follow the main element\n if (this.shadows) {\n each(this.shadows, function (shadow) {\n shadow.style[key] = value;\n });\n }\n\n // Instead of toggling the visibility CSS property, move the div out of the viewport.\n // This works around #61 and #586\n if (element.nodeName === 'DIV') {\n value = value === HIDDEN ? '-999em' : 0;\n\n // In order to redraw, IE7 needs the div to be visible when tucked away\n // outside the viewport. So the visibility is actually opposite of\n // the expected value. This applies to the tooltip only.\n if (!docMode8) {\n element.style[key] = value ? VISIBLE : HIDDEN;\n }\n key = 'top';\n }\n element.style[key] = value;\n },\n xSetter: function (value, key, element) {\n this[key] = value; // used in getter\n\n if (key === 'x') {\n key = 'left';\n } else if (key === 'y') {\n key = 'top';\n }/* else {\n value = mathMax(0, value); // don't set width or height below zero (#311)\n }*/\n\n // clipping rectangle special\n if (this.updateClipping) {\n this[key] = value; // the key is now 'left' or 'top' for 'x' and 'y'\n this.updateClipping();\n } else {\n // normal\n element.style[key] = value;\n }\n },\n zIndexSetter: function (value, key, element) {\n element.style[key] = value;\n }\n };\n VMLElement['stroke-opacitySetter'] = VMLElement['fill-opacitySetter'];\n\n Highcharts.VMLElement = VMLElement = extendClass(SVGElement, VMLElement);\n\n // Some shared setters\n VMLElement.prototype.ySetter =\n VMLElement.prototype.widthSetter =\n VMLElement.prototype.heightSetter =\n VMLElement.prototype.xSetter;\n\n\n /**\n * The VML renderer\n */\n var VMLRendererExtension = { // inherit SVGRenderer\n\n Element: VMLElement,\n isIE8: userAgent.indexOf('MSIE 8.0') > -1,\n\n\n /**\n * Initialize the VMLRenderer\n * @param {Object} container\n * @param {Number} width\n * @param {Number} height\n */\n init: function (container, width, height, style) {\n var renderer = this,\n boxWrapper,\n box,\n css;\n\n renderer.alignedObjects = [];\n\n boxWrapper = renderer.createElement(DIV)\n .css(extend(this.getStyle(style), { position: 'relative' }));\n box = boxWrapper.element;\n container.appendChild(boxWrapper.element);\n\n\n // generate the containing box\n renderer.isVML = true;\n renderer.box = box;\n renderer.boxWrapper = boxWrapper;\n renderer.gradients = {};\n renderer.cache = {}; // Cache for numerical bounding boxes\n renderer.cacheKeys = [];\n renderer.imgCount = 0;\n\n\n renderer.setSize(width, height, false);\n\n // The only way to make IE6 and IE7 print is to use a global namespace. However,\n // with IE8 the only way to make the dynamic shapes visible in screen and print mode\n // seems to be to add the xmlns attribute and the behaviour style inline.\n if (!doc.namespaces.hcv) {\n\n doc.namespaces.add('hcv', 'urn:schemas-microsoft-com:vml');\n\n // Setup default CSS (#2153, #2368, #2384)\n css = 'hcv\\\\:fill, hcv\\\\:path, hcv\\\\:shape, hcv\\\\:stroke' +\n '{ behavior:url(#default#VML); display: inline-block; } ';\n try {\n doc.createStyleSheet().cssText = css;\n } catch (e) {\n doc.styleSheets[0].cssText += css;\n }\n\n }\n },\n\n\n /**\n * Detect whether the renderer is hidden. This happens when one of the parent elements\n * has display: none\n */\n isHidden: function () {\n return !this.box.offsetWidth;\n },\n\n /**\n * Define a clipping rectangle. In VML it is accomplished by storing the values\n * for setting the CSS style to all associated members.\n *\n * @param {Number} x\n * @param {Number} y\n * @param {Number} width\n * @param {Number} height\n */\n clipRect: function (x, y, width, height) {\n\n // create a dummy element\n var clipRect = this.createElement(),\n isObj = isObject(x);\n\n // mimic a rectangle with its style object for automatic updating in attr\n return extend(clipRect, {\n members: [],\n count: 0,\n left: (isObj ? x.x : x) + 1,\n top: (isObj ? x.y : y) + 1,\n width: (isObj ? x.width : width) - 1,\n height: (isObj ? x.height : height) - 1,\n getCSS: function (wrapper) {\n var element = wrapper.element,\n nodeName = element.nodeName,\n isShape = nodeName === 'shape',\n inverted = wrapper.inverted,\n rect = this,\n top = rect.top - (isShape ? element.offsetTop : 0),\n left = rect.left,\n right = left + rect.width,\n bottom = top + rect.height,\n ret = {\n clip: 'rect(' +\n mathRound(inverted ? left : top) + 'px,' +\n mathRound(inverted ? bottom : right) + 'px,' +\n mathRound(inverted ? right : bottom) + 'px,' +\n mathRound(inverted ? top : left) + 'px)'\n };\n\n // issue 74 workaround\n if (!inverted && docMode8 && nodeName === 'DIV') {\n extend(ret, {\n width: right + PX,\n height: bottom + PX\n });\n }\n return ret;\n },\n\n // used in attr and animation to update the clipping of all members\n updateClipping: function () {\n each(clipRect.members, function (member) {\n if (member.element) { // Deleted series, like in stock/members/series-remove demo. Should be removed from members, but this will do.\n member.css(clipRect.getCSS(member));\n }\n });\n }\n });\n\n },\n\n\n /**\n * Take a color and return it if it's a string, make it a gradient if it's a\n * gradient configuration object, and apply opacity.\n *\n * @param {Object} color The color or config object\n */\n color: function (color, elem, prop, wrapper) {\n var renderer = this,\n colorObject,\n regexRgba = /^rgba/,\n markup,\n fillType,\n ret = NONE;\n\n // Check for linear or radial gradient\n if (color && color.linearGradient) {\n fillType = 'gradient';\n } else if (color && color.radialGradient) {\n fillType = 'pattern';\n }\n\n\n if (fillType) {\n\n var stopColor,\n stopOpacity,\n gradient = color.linearGradient || color.radialGradient,\n x1,\n y1,\n x2,\n y2,\n opacity1,\n opacity2,\n color1,\n color2,\n fillAttr = '',\n stops = color.stops,\n firstStop,\n lastStop,\n colors = [],\n addFillNode = function () {\n // Add the fill subnode. When colors attribute is used, the meanings of opacity and o:opacity2\n // are reversed.\n markup = [' '];\n createElement(renderer.prepVML(markup), null, null, elem);\n };\n\n // Extend from 0 to 1\n firstStop = stops[0];\n lastStop = stops[stops.length - 1];\n if (firstStop[0] > 0) {\n stops.unshift([\n 0,\n firstStop[1]\n ]);\n }\n if (lastStop[0] < 1) {\n stops.push([\n 1,\n lastStop[1]\n ]);\n }\n\n // Compute the stops\n each(stops, function (stop, i) {\n if (regexRgba.test(stop[1])) {\n colorObject = Color(stop[1]);\n stopColor = colorObject.get('rgb');\n stopOpacity = colorObject.get('a');\n } else {\n stopColor = stop[1];\n stopOpacity = 1;\n }\n\n // Build the color attribute\n colors.push((stop[0] * 100) + '% ' + stopColor);\n\n // Only start and end opacities are allowed, so we use the first and the last\n if (!i) {\n opacity1 = stopOpacity;\n color2 = stopColor;\n } else {\n opacity2 = stopOpacity;\n color1 = stopColor;\n }\n });\n\n // Apply the gradient to fills only.\n if (prop === 'fill') {\n\n // Handle linear gradient angle\n if (fillType === 'gradient') {\n x1 = gradient.x1 || gradient[0] || 0;\n y1 = gradient.y1 || gradient[1] || 0;\n x2 = gradient.x2 || gradient[2] || 0;\n y2 = gradient.y2 || gradient[3] || 0;\n fillAttr = 'angle=\"' + (90 - math.atan(\n (y2 - y1) / // y vector\n (x2 - x1) // x vector\n ) * 180 / mathPI) + '\"';\n\n addFillNode();\n\n // Radial (circular) gradient\n } else {\n\n var r = gradient.r,\n sizex = r * 2,\n sizey = r * 2,\n cx = gradient.cx,\n cy = gradient.cy,\n radialReference = elem.radialReference,\n bBox,\n applyRadialGradient = function () {\n if (radialReference) {\n bBox = wrapper.getBBox();\n cx += (radialReference[0] - bBox.x) / bBox.width - 0.5;\n cy += (radialReference[1] - bBox.y) / bBox.height - 0.5;\n sizex *= radialReference[2] / bBox.width;\n sizey *= radialReference[2] / bBox.height;\n }\n fillAttr = 'src=\"' + defaultOptions.global.VMLRadialGradientURL + '\" ' +\n 'size=\"' + sizex + ',' + sizey + '\" ' +\n 'origin=\"0.5,0.5\" ' +\n 'position=\"' + cx + ',' + cy + '\" ' +\n 'color2=\"' + color2 + '\" ';\n\n addFillNode();\n };\n\n // Apply radial gradient\n if (wrapper.added) {\n applyRadialGradient();\n } else {\n // We need to know the bounding box to get the size and position right\n wrapper.onAdd = applyRadialGradient;\n }\n\n // The fill element's color attribute is broken in IE8 standards mode, so we\n // need to set the parent shape's fillcolor attribute instead.\n ret = color1;\n }\n\n // Gradients are not supported for VML stroke, return the first color. #722.\n } else {\n ret = stopColor;\n }\n\n // If the color is an rgba color, split it and add a fill node\n // to hold the opacity component\n } else if (regexRgba.test(color) && elem.tagName !== 'IMG') {\n\n colorObject = Color(color);\n\n wrapper[prop + '-opacitySetter'](colorObject.get('a'), prop, elem);\n\n ret = colorObject.get('rgb');\n\n\n } else {\n var propNodes = elem.getElementsByTagName(prop); // 'stroke' or 'fill' node\n if (propNodes.length) {\n propNodes[0].opacity = 1;\n propNodes[0].type = 'solid';\n }\n ret = color;\n }\n\n return ret;\n },\n\n /**\n * Take a VML string and prepare it for either IE8 or IE6/IE7.\n * @param {Array} markup A string array of the VML markup to prepare\n */\n prepVML: function (markup) {\n var vmlStyle = 'display:inline-block;behavior:url(#default#VML);',\n isIE8 = this.isIE8;\n\n markup = markup.join('');\n\n if (isIE8) { // add xmlns and style inline\n markup = markup.replace('/>', ' xmlns=\"urn:schemas-microsoft-com:vml\" />');\n if (markup.indexOf('style=\"') === -1) {\n markup = markup.replace('/>', ' style=\"' + vmlStyle + '\" />');\n } else {\n markup = markup.replace('style=\"', 'style=\"' + vmlStyle);\n }\n\n } else { // add namespace\n markup = markup.replace('<', ' 1) {\n obj.attr({\n x: x,\n y: y,\n width: width,\n height: height\n });\n }\n return obj;\n },\n\n /**\n * For rectangles, VML uses a shape for rect to overcome bugs and rotation problems\n */\n createElement: function (nodeName) {\n return nodeName === 'rect' ? this.symbol(nodeName) : SVGRenderer.prototype.createElement.call(this, nodeName);\n },\n\n /**\n * In the VML renderer, each child of an inverted div (group) is inverted\n * @param {Object} element\n * @param {Object} parentNode\n */\n invertChild: function (element, parentNode) {\n var ren = this,\n parentStyle = parentNode.style,\n imgStyle = element.tagName === 'IMG' && element.style; // #1111\n\n css(element, {\n flip: 'x',\n left: pInt(parentStyle.width) - (imgStyle ? pInt(imgStyle.top) : 1),\n top: pInt(parentStyle.height) - (imgStyle ? pInt(imgStyle.left) : 1),\n rotation: -90\n });\n\n // Recursively invert child elements, needed for nested composite shapes like box plots and error bars. #1680, #1806.\n each(element.childNodes, function (child) {\n ren.invertChild(child, element);\n });\n },\n\n /**\n * Symbol definitions that override the parent SVG renderer's symbols\n *\n */\n symbols: {\n // VML specific arc function\n arc: function (x, y, w, h, options) {\n var start = options.start,\n end = options.end,\n radius = options.r || w || h,\n innerRadius = options.innerR,\n cosStart = mathCos(start),\n sinStart = mathSin(start),\n cosEnd = mathCos(end),\n sinEnd = mathSin(end),\n ret;\n\n if (end - start === 0) { // no angle, don't show it.\n return ['x'];\n }\n\n ret = [\n 'wa', // clockwise arc to\n x - radius, // left\n y - radius, // top\n x + radius, // right\n y + radius, // bottom\n x + radius * cosStart, // start x\n y + radius * sinStart, // start y\n x + radius * cosEnd, // end x\n y + radius * sinEnd // end y\n ];\n\n if (options.open && !innerRadius) {\n ret.push(\n 'e',\n M,\n x, // - innerRadius,\n y// - innerRadius\n );\n }\n\n ret.push(\n 'at', // anti clockwise arc to\n x - innerRadius, // left\n y - innerRadius, // top\n x + innerRadius, // right\n y + innerRadius, // bottom\n x + innerRadius * cosEnd, // start x\n y + innerRadius * sinEnd, // start y\n x + innerRadius * cosStart, // end x\n y + innerRadius * sinStart, // end y\n 'x', // finish path\n 'e' // close\n );\n\n ret.isArc = true;\n return ret;\n\n },\n // Add circle symbol path. This performs significantly faster than v:oval.\n circle: function (x, y, w, h, wrapper) {\n\n if (wrapper) {\n w = h = 2 * wrapper.r;\n }\n\n // Center correction, #1682\n if (wrapper && wrapper.isCircle) {\n x -= w / 2;\n y -= h / 2;\n }\n\n // Return the path\n return [\n 'wa', // clockwisearcto\n x, // left\n y, // top\n x + w, // right\n y + h, // bottom\n x + w, // start x\n y + h / 2, // start y\n x + w, // end x\n y + h / 2, // end y\n //'x', // finish path\n 'e' // close\n ];\n },\n /**\n * Add rectangle symbol path which eases rotation and omits arcsize problems\n * compared to the built-in VML roundrect shape. When borders are not rounded,\n * use the simpler square path, else use the callout path without the arrow.\n */\n rect: function (x, y, w, h, options) {\n return SVGRenderer.prototype.symbols[\n !defined(options) || !options.r ? 'square' : 'callout'\n ].call(0, x, y, w, h, options);\n }\n }\n };\n Highcharts.VMLRenderer = VMLRenderer = function () {\n this.init.apply(this, arguments);\n };\n VMLRenderer.prototype = merge(SVGRenderer.prototype, VMLRendererExtension);\n\n // general renderer\n Renderer = VMLRenderer;\n }\n\n // This method is used with exporting in old IE, when emulating SVG (see #2314)\n SVGRenderer.prototype.measureSpanWidth = function (text, styles) {\n var measuringSpan = doc.createElement('span'),\n offsetWidth,\n textNode = doc.createTextNode(text);\n\n measuringSpan.appendChild(textNode);\n css(measuringSpan, styles);\n this.box.appendChild(measuringSpan);\n offsetWidth = measuringSpan.offsetWidth;\n discardElement(measuringSpan); // #2463\n return offsetWidth;\n };\n\n\n /* ****************************************************************************\n * *\n * END OF INTERNET EXPLORER <= 8 SPECIFIC CODE *\n * *\n *****************************************************************************/\n /* ****************************************************************************\n * *\n * START OF ANDROID < 3 SPECIFIC CODE. THIS CAN BE REMOVED IF YOU'RE NOT *\n * TARGETING THAT SYSTEM. *\n * *\n *****************************************************************************/\n var CanVGRenderer,\n CanVGController;\n\n /**\n * Downloads a script and executes a callback when done.\n * @param {String} scriptLocation\n * @param {Function} callback\n */\n function getScript(scriptLocation, callback) {\n var head = doc.getElementsByTagName('head')[0],\n script = doc.createElement('script');\n\n script.type = 'text/javascript';\n script.src = scriptLocation;\n script.onload = callback;\n\n head.appendChild(script);\n }\n\n if (useCanVG) {\n /**\n * The CanVGRenderer is empty from start to keep the source footprint small.\n * When requested, the CanVGController downloads the rest of the source packaged\n * together with the canvg library.\n */\n Highcharts.CanVGRenderer = CanVGRenderer = function () {\n // Override the global SVG namespace to fake SVG/HTML that accepts CSS\n SVG_NS = 'http://www.w3.org/1999/xhtml';\n };\n\n /**\n * Start with an empty symbols object. This is needed when exporting is used (exporting.src.js will add a few symbols), but\n * the implementation from SvgRenderer will not be merged in until first render.\n */\n CanVGRenderer.prototype.symbols = {};\n\n /**\n * Handles on demand download of canvg rendering support.\n */\n CanVGController = (function () {\n // List of renderering calls\n var deferredRenderCalls = [];\n\n /**\n * When downloaded, we are ready to draw deferred charts.\n */\n function drawDeferred() {\n var callLength = deferredRenderCalls.length,\n callIndex;\n\n // Draw all pending render calls\n for (callIndex = 0; callIndex < callLength; callIndex++) {\n deferredRenderCalls[callIndex]();\n }\n // Clear the list\n deferredRenderCalls = [];\n }\n\n return {\n push: function (func, scriptLocation) {\n // Only get the script once\n if (deferredRenderCalls.length === 0) {\n getScript(scriptLocation, drawDeferred);\n }\n // Register render call\n deferredRenderCalls.push(func);\n }\n };\n }());\n\n Renderer = CanVGRenderer;\n } // end CanVGRenderer\n\n /* ****************************************************************************\n * *\n * END OF ANDROID < 3 SPECIFIC CODE *\n * *\n *****************************************************************************/\n\n /**\n * The Tick class\n */\n function Tick(axis, pos, type, noLabel) {\n this.axis = axis;\n this.pos = pos;\n this.type = type || '';\n this.isNew = true;\n\n if (!type && !noLabel) {\n this.addLabel();\n }\n }\n\n Tick.prototype = {\n /**\n * Write the tick label\n */\n addLabel: function () {\n var tick = this,\n axis = tick.axis,\n options = axis.options,\n chart = axis.chart,\n categories = axis.categories,\n names = axis.names,\n pos = tick.pos,\n labelOptions = options.labels,\n str,\n tickPositions = axis.tickPositions,\n isFirst = pos === tickPositions[0],\n isLast = pos === tickPositions[tickPositions.length - 1],\n value = categories ?\n pick(categories[pos], names[pos], pos) :\n pos,\n label = tick.label,\n tickPositionInfo = tickPositions.info,\n dateTimeLabelFormat;\n\n // Set the datetime label format. If a higher rank is set for this position, use that. If not,\n // use the general format.\n if (axis.isDatetimeAxis && tickPositionInfo) {\n dateTimeLabelFormat = options.dateTimeLabelFormats[tickPositionInfo.higherRanks[pos] || tickPositionInfo.unitName];\n }\n // set properties for access in render method\n tick.isFirst = isFirst;\n tick.isLast = isLast;\n\n // get the string\n str = axis.labelFormatter.call({\n axis: axis,\n chart: chart,\n isFirst: isFirst,\n isLast: isLast,\n dateTimeLabelFormat: dateTimeLabelFormat,\n value: axis.isLog ? correctFloat(axis.lin2log(value)) : value\n });\n\n // prepare CSS\n //css = width && { width: mathMax(1, mathRound(width - 2 * (labelOptions.padding || 10))) + PX };\n\n // first call\n if (!defined(label)) {\n\n tick.label = label =\n defined(str) && labelOptions.enabled ?\n chart.renderer.text(\n str,\n 0,\n 0,\n labelOptions.useHTML\n )\n //.attr(attr)\n // without position absolute, IE export sometimes is wrong\n .css(merge(labelOptions.style))\n .add(axis.labelGroup) :\n null;\n tick.labelLength = label && label.getBBox().width; // Un-rotated length\n tick.rotation = 0; // Base value to detect change for new calls to getBBox\n\n // update\n } else if (label) {\n label.attr({ text: str });\n }\n },\n\n /**\n * Get the offset height or width of the label\n */\n getLabelSize: function () {\n return this.label ?\n this.label.getBBox()[this.axis.horiz ? 'height' : 'width'] :\n 0;\n },\n\n /**\n * Handle the label overflow by adjusting the labels to the left and right edge, or\n * hide them if they collide into the neighbour label.\n */\n handleOverflow: function (xy) {\n var axis = this.axis,\n pxPos = xy.x,\n chartWidth = axis.chart.chartWidth,\n spacing = axis.chart.spacing,\n leftBound = pick(axis.labelLeft, mathMin(axis.pos, spacing[3])),\n rightBound = pick(axis.labelRight, mathMax(axis.pos + axis.len, chartWidth - spacing[1])),\n label = this.label,\n rotation = this.rotation,\n factor = { left: 0, center: 0.5, right: 1 }[axis.labelAlign],\n labelWidth = label.getBBox().width,\n slotWidth = axis.getSlotWidth(),\n modifiedSlotWidth = slotWidth,\n xCorrection = factor,\n goRight = 1,\n leftPos,\n rightPos,\n textWidth,\n css = {};\n\n // Check if the label overshoots the chart spacing box. If it does, move it.\n // If it now overshoots the slotWidth, add ellipsis.\n if (!rotation) {\n leftPos = pxPos - factor * labelWidth;\n rightPos = pxPos + (1 - factor) * labelWidth;\n\n if (leftPos < leftBound) {\n modifiedSlotWidth = xy.x + modifiedSlotWidth * (1 - factor) - leftBound;\n } else if (rightPos > rightBound) {\n modifiedSlotWidth = rightBound - xy.x + modifiedSlotWidth * factor;\n goRight = -1;\n }\n\n modifiedSlotWidth = mathMin(slotWidth, modifiedSlotWidth); // #4177\n if (modifiedSlotWidth < slotWidth && axis.labelAlign === 'center') {\n xy.x += goRight * (slotWidth - modifiedSlotWidth - xCorrection * (slotWidth - mathMin(labelWidth, modifiedSlotWidth)));\n }\n // If the label width exceeds the available space, set a text width to be\n // picked up below. Also, if a width has been set before, we need to set a new\n // one because the reported labelWidth will be limited by the box (#3938).\n if (labelWidth > modifiedSlotWidth || (axis.autoRotation && label.styles.width)) {\n textWidth = modifiedSlotWidth;\n }\n\n // Add ellipsis to prevent rotated labels to be clipped against the edge of the chart\n } else if (rotation < 0 && pxPos - factor * labelWidth < leftBound) {\n textWidth = mathRound(pxPos / mathCos(rotation * deg2rad) - leftBound);\n } else if (rotation > 0 && pxPos + factor * labelWidth > rightBound) {\n textWidth = mathRound((chartWidth - pxPos) / mathCos(rotation * deg2rad));\n }\n\n if (textWidth) {\n css.width = textWidth;\n if (!axis.options.labels.style.textOverflow) {\n css.textOverflow = 'ellipsis';\n }\n label.css(css);\n }\n },\n\n /**\n * Get the x and y position for ticks and labels\n */\n getPosition: function (horiz, pos, tickmarkOffset, old) {\n var axis = this.axis,\n chart = axis.chart,\n cHeight = (old && chart.oldChartHeight) || chart.chartHeight;\n\n return {\n x: horiz ?\n axis.translate(pos + tickmarkOffset, null, null, old) + axis.transB :\n axis.left + axis.offset + (axis.opposite ? ((old && chart.oldChartWidth) || chart.chartWidth) - axis.right - axis.left : 0),\n\n y: horiz ?\n cHeight - axis.bottom + axis.offset - (axis.opposite ? axis.height : 0) :\n cHeight - axis.translate(pos + tickmarkOffset, null, null, old) - axis.transB\n };\n\n },\n\n /**\n * Get the x, y position of the tick label\n */\n getLabelPosition: function (x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {\n var axis = this.axis,\n transA = axis.transA,\n reversed = axis.reversed,\n staggerLines = axis.staggerLines,\n rotCorr = axis.tickRotCorr || { x: 0, y: 0 },\n yOffset = labelOptions.y,\n line;\n\n if (!defined(yOffset)) {\n if (axis.side === 0) {\n yOffset = label.rotation ? -8 : -label.getBBox().height;\n } else if (axis.side === 2) {\n yOffset = rotCorr.y + 8;\n } else {\n // #3140, #3140\n yOffset = mathCos(label.rotation * deg2rad) * (rotCorr.y - label.getBBox(false, 0).height / 2);\n }\n }\n\n x = x + labelOptions.x + rotCorr.x - (tickmarkOffset && horiz ?\n tickmarkOffset * transA * (reversed ? -1 : 1) : 0);\n y = y + yOffset - (tickmarkOffset && !horiz ?\n tickmarkOffset * transA * (reversed ? 1 : -1) : 0);\n\n // Correct for staggered labels\n if (staggerLines) {\n line = (index / (step || 1) % staggerLines);\n if (axis.opposite) {\n line = staggerLines - line - 1;\n }\n y += line * (axis.labelOffset / staggerLines);\n }\n\n return {\n x: x,\n y: mathRound(y)\n };\n },\n\n /**\n * Extendible method to return the path of the marker\n */\n getMarkPath: function (x, y, tickLength, tickWidth, horiz, renderer) {\n return renderer.crispLine([\n M,\n x,\n y,\n L,\n x + (horiz ? 0 : -tickLength),\n y + (horiz ? tickLength : 0)\n ], tickWidth);\n },\n\n /**\n * Put everything in place\n *\n * @param index {Number}\n * @param old {Boolean} Use old coordinates to prepare an animation into new position\n */\n render: function (index, old, opacity) {\n var tick = this,\n axis = tick.axis,\n options = axis.options,\n chart = axis.chart,\n renderer = chart.renderer,\n horiz = axis.horiz,\n type = tick.type,\n label = tick.label,\n pos = tick.pos,\n labelOptions = options.labels,\n gridLine = tick.gridLine,\n gridPrefix = type ? type + 'Grid' : 'grid',\n tickPrefix = type ? type + 'Tick' : 'tick',\n gridLineWidth = options[gridPrefix + 'LineWidth'],\n gridLineColor = options[gridPrefix + 'LineColor'],\n dashStyle = options[gridPrefix + 'LineDashStyle'],\n tickSize = axis.tickSize(tickPrefix),\n tickColor = options[tickPrefix + 'Color'],\n gridLinePath,\n mark = tick.mark,\n markPath,\n step = /*axis.labelStep || */labelOptions.step,\n attribs,\n show = true,\n tickmarkOffset = axis.tickmarkOffset,\n xy = tick.getPosition(horiz, pos, tickmarkOffset, old),\n x = xy.x,\n y = xy.y,\n reverseCrisp = ((horiz && x === axis.pos + axis.len) || (!horiz && y === axis.pos)) ? -1 : 1; // #1480, #1687\n\n opacity = pick(opacity, 1);\n this.isActive = true;\n\n // create the grid line\n if (gridLineWidth) {\n gridLinePath = axis.getPlotLinePath(pos + tickmarkOffset, gridLineWidth * reverseCrisp, old, true);\n\n if (gridLine === UNDEFINED) {\n attribs = {\n stroke: gridLineColor,\n 'stroke-width': gridLineWidth\n };\n if (dashStyle) {\n attribs.dashstyle = dashStyle;\n }\n if (!type) {\n attribs.zIndex = 1;\n }\n if (old) {\n attribs.opacity = 0;\n }\n tick.gridLine = gridLine =\n gridLineWidth ?\n renderer.path(gridLinePath)\n .attr(attribs).add(axis.gridGroup) :\n null;\n }\n\n // If the parameter 'old' is set, the current call will be followed\n // by another call, therefore do not do any animations this time\n if (!old && gridLine && gridLinePath) {\n gridLine[tick.isNew ? 'attr' : 'animate']({\n d: gridLinePath,\n opacity: opacity\n });\n }\n }\n\n // create the tick mark\n if (tickSize) {\n if (axis.opposite) {\n tickSize[0] = -tickSize[0];\n }\n markPath = tick.getMarkPath(x, y, tickSize[0], tickSize[1] * reverseCrisp, horiz, renderer);\n if (mark) { // updating\n mark.animate({\n d: markPath,\n opacity: opacity\n });\n } else { // first time\n tick.mark = renderer.path(\n markPath\n ).attr({\n stroke: tickColor,\n 'stroke-width': tickSize[1],\n opacity: opacity\n }).add(axis.axisGroup);\n }\n }\n\n // the label is created on init - now move it into place\n if (label && isNumber(x)) {\n label.xy = xy = tick.getLabelPosition(x, y, label, horiz, labelOptions, tickmarkOffset, index, step);\n\n // Apply show first and show last. If the tick is both first and last, it is\n // a single centered tick, in which case we show the label anyway (#2100).\n if ((tick.isFirst && !tick.isLast && !pick(options.showFirstLabel, 1)) ||\n (tick.isLast && !tick.isFirst && !pick(options.showLastLabel, 1))) {\n show = false;\n\n // Handle label overflow and show or hide accordingly\n } else if (horiz && !axis.isRadial && !labelOptions.step && !labelOptions.rotation && !old && opacity !== 0) {\n tick.handleOverflow(xy);\n }\n\n // apply step\n if (step && index % step) {\n // show those indices dividable by step\n show = false;\n }\n\n // Set the new position, and show or hide\n if (show && isNumber(xy.y)) {\n xy.opacity = opacity;\n label[tick.isNew ? 'attr' : 'animate'](xy);\n } else {\n stop(label); // #5332\n label.attr('y', -9999); // #1338\n }\n tick.isNew = false;\n }\n },\n\n /**\n * Destructor for the tick prototype\n */\n destroy: function () {\n destroyObjectProperties(this, this.axis);\n }\n };\n\n /**\n * The object wrapper for plot lines and plot bands\n * @param {Object} options\n */\n Highcharts.PlotLineOrBand = function (axis, options) {\n this.axis = axis;\n\n if (options) {\n this.options = options;\n this.id = options.id;\n }\n };\n\n Highcharts.PlotLineOrBand.prototype = {\n\n /**\n * Render the plot line or plot band. If it is already existing,\n * move it.\n */\n render: function () {\n var plotLine = this,\n axis = plotLine.axis,\n horiz = axis.horiz,\n options = plotLine.options,\n optionsLabel = options.label,\n label = plotLine.label,\n width = options.width,\n to = options.to,\n from = options.from,\n isBand = defined(from) && defined(to),\n value = options.value,\n dashStyle = options.dashStyle,\n svgElem = plotLine.svgElem,\n path = [],\n addEvent,\n eventType,\n color = options.color,\n zIndex = pick(options.zIndex, 0),\n events = options.events,\n attribs = {},\n renderer = axis.chart.renderer,\n log2lin = axis.log2lin;\n\n // logarithmic conversion\n if (axis.isLog) {\n from = log2lin(from);\n to = log2lin(to);\n value = log2lin(value);\n }\n\n // plot line\n if (width) {\n path = axis.getPlotLinePath(value, width);\n attribs = {\n stroke: color,\n 'stroke-width': width\n };\n if (dashStyle) {\n attribs.dashstyle = dashStyle;\n }\n } else if (isBand) { // plot band\n\n path = axis.getPlotBandPath(from, to, options);\n if (color) {\n attribs.fill = color;\n }\n if (options.borderWidth) {\n attribs.stroke = options.borderColor;\n attribs['stroke-width'] = options.borderWidth;\n }\n } else {\n return;\n }\n // zIndex\n attribs.zIndex = zIndex;\n\n // common for lines and bands\n if (svgElem) {\n if (path) {\n svgElem.show();\n svgElem.animate({ d: path });\n } else {\n svgElem.hide();\n if (label) {\n plotLine.label = label = label.destroy();\n }\n }\n } else if (path && path.length) {\n plotLine.svgElem = svgElem = renderer.path(path)\n .attr(attribs).add();\n\n // events\n if (events) {\n addEvent = function (eventType) {\n svgElem.on(eventType, function (e) {\n events[eventType].apply(plotLine, [e]);\n });\n };\n for (eventType in events) {\n addEvent(eventType);\n }\n }\n }\n\n // the plot band/line label\n if (optionsLabel && defined(optionsLabel.text) && path && path.length && \n axis.width > 0 && axis.height > 0 && !path.flat) {\n // apply defaults\n optionsLabel = merge({\n align: horiz && isBand && 'center',\n x: horiz ? !isBand && 4 : 10,\n verticalAlign: !horiz && isBand && 'middle',\n y: horiz ? isBand ? 16 : 10 : isBand ? 6 : -4,\n rotation: horiz && !isBand && 90\n }, optionsLabel);\n\n this.renderLabel(optionsLabel, path, isBand, zIndex);\n\n } else if (label) { // move out of sight\n label.hide();\n }\n\n // chainable\n return plotLine;\n },\n\n /**\n * Render and align label for plot line or band.\n */\n renderLabel: function (optionsLabel, path, isBand, zIndex) {\n var plotLine = this,\n label = plotLine.label,\n renderer = plotLine.axis.chart.renderer,\n attribs,\n xs,\n ys,\n x,\n y;\n\n // add the SVG element\n if (!label) {\n attribs = {\n align: optionsLabel.textAlign || optionsLabel.align,\n rotation: optionsLabel.rotation\n };\n \n attribs.zIndex = zIndex;\n \n plotLine.label = label = renderer.text(\n optionsLabel.text,\n 0,\n 0,\n optionsLabel.useHTML\n )\n .attr(attribs)\n .css(optionsLabel.style)\n .add();\n }\n\n // get the bounding box and align the label\n // #3000 changed to better handle choice between plotband or plotline\n xs = [path[1], path[4], (isBand ? path[6] : path[1])];\n ys = [path[2], path[5], (isBand ? path[7] : path[2])];\n x = arrayMin(xs);\n y = arrayMin(ys);\n\n label.align(optionsLabel, false, {\n x: x,\n y: y,\n width: arrayMax(xs) - x,\n height: arrayMax(ys) - y\n });\n label.show();\n },\n\n /**\n * Remove the plot line or band\n */\n destroy: function () {\n // remove it from the lookup\n erase(this.axis.plotLinesAndBands, this);\n\n delete this.axis;\n destroyObjectProperties(this);\n }\n };\n\n /**\n * Object with members for extending the Axis prototype\n */\n\n AxisPlotLineOrBandExtension = {\n\n /**\n * Create the path for a plot band\n */\n getPlotBandPath: function (from, to) {\n var toPath = this.getPlotLinePath(to, null, null, true),\n path = this.getPlotLinePath(from, null, null, true);\n\n if (path && toPath) {\n\n // Flat paths don't need labels (#3836)\n path.flat = path.toString() === toPath.toString();\n\n path.push(\n toPath[4],\n toPath[5],\n toPath[1],\n toPath[2]\n );\n } else { // outside the axis area\n path = null;\n }\n\n return path;\n },\n\n addPlotBand: function (options) {\n return this.addPlotBandOrLine(options, 'plotBands');\n },\n\n addPlotLine: function (options) {\n return this.addPlotBandOrLine(options, 'plotLines');\n },\n\n /**\n * Add a plot band or plot line after render time\n *\n * @param options {Object} The plotBand or plotLine configuration object\n */\n addPlotBandOrLine: function (options, coll) {\n var obj = new Highcharts.PlotLineOrBand(this, options).render(),\n userOptions = this.userOptions;\n\n if (obj) { // #2189\n // Add it to the user options for exporting and Axis.update\n if (coll) {\n userOptions[coll] = userOptions[coll] || [];\n userOptions[coll].push(options);\n }\n this.plotLinesAndBands.push(obj);\n }\n\n return obj;\n },\n\n /**\n * Remove a plot band or plot line from the chart by id\n * @param {Object} id\n */\n removePlotBandOrLine: function (id) {\n var plotLinesAndBands = this.plotLinesAndBands,\n options = this.options,\n userOptions = this.userOptions,\n i = plotLinesAndBands.length;\n while (i--) {\n if (plotLinesAndBands[i].id === id) {\n plotLinesAndBands[i].destroy();\n }\n }\n each([options.plotLines || [], userOptions.plotLines || [], options.plotBands || [], userOptions.plotBands || []], function (arr) {\n i = arr.length;\n while (i--) {\n if (arr[i].id === id) {\n erase(arr, arr[i]);\n }\n }\n });\n }\n };\n\n /**\n * Create a new axis object\n * @param {Object} chart\n * @param {Object} options\n */\n var Axis = Highcharts.Axis = function () {\n this.init.apply(this, arguments);\n };\n\n Axis.prototype = {\n\n /**\n * Default options for the X axis - the Y axis has extended defaults\n */\n defaultOptions: {\n // allowDecimals: null,\n // alternateGridColor: null,\n // categories: [],\n dateTimeLabelFormats: {\n millisecond: '%H:%M:%S.%L',\n second: '%H:%M:%S',\n minute: '%H:%M',\n hour: '%H:%M',\n day: '%e. %b',\n week: '%e. %b',\n month: '%b \\'%y',\n year: '%Y'\n },\n endOnTick: false,\n gridLineColor: '#D8D8D8',\n // gridLineDashStyle: 'solid',\n // gridLineWidth: 0,\n // reversed: false,\n\n labels: {\n enabled: true,\n // rotation: 0,\n // align: 'center',\n // step: null,\n style: {\n color: '#606060',\n cursor: 'default',\n fontSize: '11px'\n },\n x: 0\n //y: undefined\n /*formatter: function () {\n return this.value;\n },*/\n },\n lineColor: '#C0D0E0',\n lineWidth: 1,\n //linkedTo: null,\n //max: undefined,\n //min: undefined,\n minPadding: 0.01,\n maxPadding: 0.01,\n //minRange: null,\n minorGridLineColor: '#E0E0E0',\n // minorGridLineDashStyle: null,\n minorGridLineWidth: 1,\n minorTickColor: '#A0A0A0',\n //minorTickInterval: null,\n minorTickLength: 2,\n minorTickPosition: 'outside', // inside or outside\n //minorTickWidth: 0,\n //opposite: false,\n //offset: 0,\n //plotBands: [{\n // events: {},\n // zIndex: 1,\n // labels: { align, x, verticalAlign, y, style, rotation, textAlign }\n //}],\n //plotLines: [{\n // events: {}\n // dashStyle: {}\n // zIndex:\n // labels: { align, x, verticalAlign, y, style, rotation, textAlign }\n //}],\n //reversed: false,\n // showFirstLabel: true,\n // showLastLabel: true,\n startOfWeek: 1,\n startOnTick: false,\n tickColor: '#C0D0E0',\n //tickInterval: null,\n tickLength: 10,\n tickmarkPlacement: 'between', // on or between\n tickPixelInterval: 100,\n tickPosition: 'outside',\n //tickWidth: 1,\n title: {\n //text: null,\n align: 'middle', // low, middle or high\n //margin: 0 for horizontal, 10 for vertical axes,\n //rotation: 0,\n //side: 'outside',\n style: {\n color: '#707070'\n }\n //x: 0,\n //y: 0\n },\n type: 'linear' // linear, logarithmic or datetime\n //visible: true\n },\n\n /**\n * This options set extends the defaultOptions for Y axes\n */\n defaultYAxisOptions: {\n endOnTick: true,\n gridLineWidth: 1,\n tickPixelInterval: 72,\n showLastLabel: true,\n labels: {\n x: -8\n },\n lineWidth: 0,\n maxPadding: 0.05,\n minPadding: 0.05,\n startOnTick: true,\n //tickWidth: 0,\n title: {\n rotation: 270,\n text: 'Values'\n },\n stackLabels: {\n enabled: false,\n //align: dynamic,\n //y: dynamic,\n //x: dynamic,\n //verticalAlign: dynamic,\n //textAlign: dynamic,\n //rotation: 0,\n formatter: function () {\n return Highcharts.numberFormat(this.total, -1);\n },\n style: merge(defaultPlotOptions.line.dataLabels.style, { color: '#000000' })\n }\n },\n\n /**\n * These options extend the defaultOptions for left axes\n */\n defaultLeftAxisOptions: {\n labels: {\n x: -15\n },\n title: {\n rotation: 270\n }\n },\n\n /**\n * These options extend the defaultOptions for right axes\n */\n defaultRightAxisOptions: {\n labels: {\n x: 15\n },\n title: {\n rotation: 90\n }\n },\n\n /**\n * These options extend the defaultOptions for bottom axes\n */\n defaultBottomAxisOptions: {\n labels: {\n autoRotation: [-45],\n x: 0\n // overflow: undefined,\n // staggerLines: null\n },\n title: {\n rotation: 0\n }\n },\n /**\n * These options extend the defaultOptions for top axes\n */\n defaultTopAxisOptions: {\n labels: {\n autoRotation: [-45],\n x: 0\n // overflow: undefined\n // staggerLines: null\n },\n title: {\n rotation: 0\n }\n },\n\n /**\n * Initialize the axis\n */\n init: function (chart, userOptions) {\n\n\n var isXAxis = userOptions.isX,\n axis = this;\n\n axis.chart = chart;\n\n // Flag, is the axis horizontal\n axis.horiz = chart.inverted ? !isXAxis : isXAxis;\n\n // Flag, isXAxis\n axis.isXAxis = isXAxis;\n axis.coll = isXAxis ? 'xAxis' : 'yAxis';\n\n axis.opposite = userOptions.opposite; // needed in setOptions\n axis.side = userOptions.side || (axis.horiz ?\n (axis.opposite ? 0 : 2) : // top : bottom\n (axis.opposite ? 1 : 3)); // right : left\n\n axis.setOptions(userOptions);\n\n\n var options = this.options,\n type = options.type,\n isDatetimeAxis = type === 'datetime';\n\n axis.labelFormatter = options.labels.formatter || axis.defaultLabelFormatter; // can be overwritten by dynamic format\n\n\n // Flag, stagger lines or not\n axis.userOptions = userOptions;\n\n //axis.axisTitleMargin = UNDEFINED,// = options.title.margin,\n axis.minPixelPadding = 0;\n\n axis.reversed = options.reversed;\n axis.visible = options.visible !== false;\n axis.zoomEnabled = options.zoomEnabled !== false;\n\n // Initial categories\n axis.categories = options.categories || type === 'category';\n axis.names = axis.names || []; // Preserve on update (#3830)\n\n // Elements\n //axis.axisGroup = UNDEFINED;\n //axis.gridGroup = UNDEFINED;\n //axis.axisTitle = UNDEFINED;\n //axis.axisLine = UNDEFINED;\n\n // Shorthand types\n axis.isLog = type === 'logarithmic';\n axis.isDatetimeAxis = isDatetimeAxis;\n\n // Flag, if axis is linked to another axis\n axis.isLinked = defined(options.linkedTo);\n // Linked axis.\n //axis.linkedParent = UNDEFINED;\n\n // Tick positions\n //axis.tickPositions = UNDEFINED; // array containing predefined positions\n // Tick intervals\n //axis.tickInterval = UNDEFINED;\n //axis.minorTickInterval = UNDEFINED;\n\n\n // Major ticks\n axis.ticks = {};\n axis.labelEdge = [];\n // Minor ticks\n axis.minorTicks = {};\n\n // List of plotLines/Bands\n axis.plotLinesAndBands = [];\n\n // Alternate bands\n axis.alternateBands = {};\n\n // Axis metrics\n //axis.left = UNDEFINED;\n //axis.top = UNDEFINED;\n //axis.width = UNDEFINED;\n //axis.height = UNDEFINED;\n //axis.bottom = UNDEFINED;\n //axis.right = UNDEFINED;\n //axis.transA = UNDEFINED;\n //axis.transB = UNDEFINED;\n //axis.oldTransA = UNDEFINED;\n axis.len = 0;\n //axis.oldMin = UNDEFINED;\n //axis.oldMax = UNDEFINED;\n //axis.oldUserMin = UNDEFINED;\n //axis.oldUserMax = UNDEFINED;\n //axis.oldAxisLength = UNDEFINED;\n axis.minRange = axis.userMinRange = options.minRange || options.maxZoom;\n axis.range = options.range;\n axis.offset = options.offset || 0;\n\n\n // Dictionary for stacks\n axis.stacks = {};\n axis.oldStacks = {};\n axis.stacksTouched = 0;\n\n // Min and max in the data\n //axis.dataMin = UNDEFINED,\n //axis.dataMax = UNDEFINED,\n\n // The axis range\n axis.max = null;\n axis.min = null;\n\n // User set min and max\n //axis.userMin = UNDEFINED,\n //axis.userMax = UNDEFINED,\n\n // Crosshair options\n axis.crosshair = pick(options.crosshair, splat(chart.options.tooltip.crosshairs)[isXAxis ? 0 : 1], false);\n // Run Axis\n\n var eventType,\n events = axis.options.events;\n\n // Register\n if (inArray(axis, chart.axes) === -1) { // don't add it again on Axis.update()\n if (isXAxis && !this.isColorAxis) { // #2713\n chart.axes.splice(chart.xAxis.length, 0, axis);\n } else {\n chart.axes.push(axis);\n }\n\n chart[axis.coll].push(axis);\n }\n\n axis.series = axis.series || []; // populated by Series\n\n // inverted charts have reversed xAxes as default\n if (chart.inverted && isXAxis && axis.reversed === UNDEFINED) {\n axis.reversed = true;\n }\n\n axis.removePlotBand = axis.removePlotBandOrLine;\n axis.removePlotLine = axis.removePlotBandOrLine;\n\n\n // register event listeners\n for (eventType in events) {\n addEvent(axis, eventType, events[eventType]);\n }\n\n // extend logarithmic axis\n if (axis.isLog) {\n axis.val2lin = axis.log2lin;\n axis.lin2val = axis.lin2log;\n }\n },\n\n /**\n * Merge and set options\n */\n setOptions: function (userOptions) {\n this.options = merge(\n this.defaultOptions,\n this.isXAxis ? {} : this.defaultYAxisOptions,\n [this.defaultTopAxisOptions, this.defaultRightAxisOptions,\n this.defaultBottomAxisOptions, this.defaultLeftAxisOptions][this.side],\n merge(\n defaultOptions[this.coll], // if set in setOptions (#1053)\n userOptions\n )\n );\n },\n\n /**\n * The default label formatter. The context is a special config object for the label.\n */\n defaultLabelFormatter: function () {\n var axis = this.axis,\n value = this.value,\n categories = axis.categories,\n dateTimeLabelFormat = this.dateTimeLabelFormat,\n numericSymbols = defaultOptions.lang.numericSymbols,\n i = numericSymbols && numericSymbols.length,\n multi,\n ret,\n formatOption = axis.options.labels.format,\n\n // make sure the same symbol is added for all labels on a linear axis\n numericSymbolDetector = axis.isLog ? value : axis.tickInterval;\n\n if (formatOption) {\n ret = format(formatOption, this);\n\n } else if (categories) {\n ret = value;\n\n } else if (dateTimeLabelFormat) { // datetime axis\n ret = dateFormat(dateTimeLabelFormat, value);\n\n } else if (i && numericSymbolDetector >= 1000) {\n // Decide whether we should add a numeric symbol like k (thousands) or M (millions).\n // If we are to enable this in tooltip or other places as well, we can move this\n // logic to the numberFormatter and enable it by a parameter.\n while (i-- && ret === UNDEFINED) {\n multi = Math.pow(1000, i + 1);\n if (numericSymbolDetector >= multi && (value * 10) % multi === 0 && numericSymbols[i] !== null && value !== 0) { // #5480\n ret = Highcharts.numberFormat(value / multi, -1) + numericSymbols[i];\n }\n }\n }\n\n if (ret === UNDEFINED) {\n if (mathAbs(value) >= 10000) { // add thousands separators\n ret = Highcharts.numberFormat(value, -1);\n\n } else { // small numbers\n ret = Highcharts.numberFormat(value, -1, UNDEFINED, ''); // #2466\n }\n }\n\n return ret;\n },\n\n /**\n * Get the minimum and maximum for the series of each axis\n */\n getSeriesExtremes: function () {\n var axis = this,\n chart = axis.chart;\n\n axis.hasVisibleSeries = false;\n\n // Reset properties in case we're redrawing (#3353)\n axis.dataMin = axis.dataMax = axis.threshold = null;\n axis.softThreshold = !axis.isXAxis;\n\n if (axis.buildStacks) {\n axis.buildStacks();\n }\n\n // loop through this axis' series\n each(axis.series, function (series) {\n\n if (series.visible || !chart.options.chart.ignoreHiddenSeries) {\n\n var seriesOptions = series.options,\n xData,\n threshold = seriesOptions.threshold,\n seriesDataMin,\n seriesDataMax;\n\n axis.hasVisibleSeries = true;\n\n // Validate threshold in logarithmic axes\n if (axis.isLog && threshold <= 0) {\n threshold = null;\n }\n\n // Get dataMin and dataMax for X axes\n if (axis.isXAxis) {\n xData = series.xData;\n if (xData.length) {\n // If xData contains values which is not numbers, then filter them out.\n // To prevent performance hit, we only do this after we have already\n // found seriesDataMin because in most cases all data is valid. #5234.\n seriesDataMin = arrayMin(xData);\n if (!isNumber(seriesDataMin) && !(seriesDataMin instanceof Date)) { // Date for #5010\n xData = grep(xData, function (x) {\n return isNumber(x);\n });\n seriesDataMin = arrayMin(xData); // Do it again with valid data\n }\n\n axis.dataMin = mathMin(pick(axis.dataMin, xData[0]), seriesDataMin);\n axis.dataMax = mathMax(pick(axis.dataMax, xData[0]), arrayMax(xData));\n \n }\n\n // Get dataMin and dataMax for Y axes, as well as handle stacking and processed data\n } else {\n\n // Get this particular series extremes\n series.getExtremes();\n seriesDataMax = series.dataMax;\n seriesDataMin = series.dataMin;\n\n // Get the dataMin and dataMax so far. If percentage is used, the min and max are\n // always 0 and 100. If seriesDataMin and seriesDataMax is null, then series\n // doesn't have active y data, we continue with nulls\n if (defined(seriesDataMin) && defined(seriesDataMax)) {\n axis.dataMin = mathMin(pick(axis.dataMin, seriesDataMin), seriesDataMin);\n axis.dataMax = mathMax(pick(axis.dataMax, seriesDataMax), seriesDataMax);\n }\n\n // Adjust to threshold\n if (defined(threshold)) {\n axis.threshold = threshold;\n }\n // If any series has a hard threshold, it takes precedence\n if (!seriesOptions.softThreshold || axis.isLog) {\n axis.softThreshold = false;\n }\n }\n }\n });\n },\n\n /**\n * Translate from axis value to pixel position on the chart, or back\n *\n */\n translate: function (val, backwards, cvsCoord, old, handleLog, pointPlacement) {\n var axis = this.linkedParent || this, // #1417\n sign = 1,\n cvsOffset = 0,\n localA = old ? axis.oldTransA : axis.transA,\n localMin = old ? axis.oldMin : axis.min,\n returnValue,\n minPixelPadding = axis.minPixelPadding,\n doPostTranslate = (axis.isOrdinal || axis.isBroken || (axis.isLog && handleLog)) && axis.lin2val;\n\n if (!localA) {\n localA = axis.transA;\n }\n\n // In vertical axes, the canvas coordinates start from 0 at the top like in\n // SVG.\n if (cvsCoord) {\n sign *= -1; // canvas coordinates inverts the value\n cvsOffset = axis.len;\n }\n\n // Handle reversed axis\n if (axis.reversed) {\n sign *= -1;\n cvsOffset -= sign * (axis.sector || axis.len);\n }\n\n // From pixels to value\n if (backwards) { // reverse translation\n\n val = val * sign + cvsOffset;\n val -= minPixelPadding;\n returnValue = val / localA + localMin; // from chart pixel to value\n if (doPostTranslate) { // log and ordinal axes\n returnValue = axis.lin2val(returnValue);\n }\n\n // From value to pixels\n } else {\n if (doPostTranslate) { // log and ordinal axes\n val = axis.val2lin(val);\n }\n if (pointPlacement === 'between') {\n pointPlacement = 0.5;\n }\n returnValue = sign * (val - localMin) * localA + cvsOffset + (sign * minPixelPadding) +\n (isNumber(pointPlacement) ? localA * pointPlacement * axis.pointRange : 0);\n }\n\n return returnValue;\n },\n\n /**\n * Utility method to translate an axis value to pixel position.\n * @param {Number} value A value in terms of axis units\n * @param {Boolean} paneCoordinates Whether to return the pixel coordinate relative to the chart\n * or just the axis/pane itself.\n */\n toPixels: function (value, paneCoordinates) {\n return this.translate(value, false, !this.horiz, null, true) + (paneCoordinates ? 0 : this.pos);\n },\n\n /*\n * Utility method to translate a pixel position in to an axis value\n * @param {Number} pixel The pixel value coordinate\n * @param {Boolean} paneCoordiantes Whether the input pixel is relative to the chart or just the\n * axis/pane itself.\n */\n toValue: function (pixel, paneCoordinates) {\n return this.translate(pixel - (paneCoordinates ? 0 : this.pos), true, !this.horiz, null, true);\n },\n\n /**\n * Create the path for a plot line that goes from the given value on\n * this axis, across the plot to the opposite side\n * @param {Number} value\n * @param {Number} lineWidth Used for calculation crisp line\n * @param {Number] old Use old coordinates (for resizing and rescaling)\n */\n getPlotLinePath: function (value, lineWidth, old, force, translatedValue) {\n var axis = this,\n chart = axis.chart,\n axisLeft = axis.left,\n axisTop = axis.top,\n x1,\n y1,\n x2,\n y2,\n cHeight = (old && chart.oldChartHeight) || chart.chartHeight,\n cWidth = (old && chart.oldChartWidth) || chart.chartWidth,\n skip,\n transB = axis.transB,\n /**\n * Check if x is between a and b. If not, either move to a/b or skip,\n * depending on the force parameter.\n */\n between = function (x, a, b) {\n if (x < a || x > b) {\n if (force) {\n x = mathMin(mathMax(a, x), b);\n } else {\n skip = true;\n }\n }\n return x;\n };\n\n translatedValue = pick(translatedValue, axis.translate(value, null, null, old));\n x1 = x2 = mathRound(translatedValue + transB);\n y1 = y2 = mathRound(cHeight - translatedValue - transB);\n if (!isNumber(translatedValue)) { // no min or max\n skip = true;\n\n } else if (axis.horiz) {\n y1 = axisTop;\n y2 = cHeight - axis.bottom;\n x1 = x2 = between(x1, axisLeft, axisLeft + axis.width);\n } else {\n x1 = axisLeft;\n x2 = cWidth - axis.right;\n y1 = y2 = between(y1, axisTop, axisTop + axis.height);\n }\n return skip && !force ?\n null :\n chart.renderer.crispLine([M, x1, y1, L, x2, y2], lineWidth || 1);\n },\n\n /**\n * Set the tick positions of a linear axis to round values like whole tens or every five.\n */\n getLinearTickPositions: function (tickInterval, min, max) {\n var pos,\n lastPos,\n roundedMin = correctFloat(mathFloor(min / tickInterval) * tickInterval),\n roundedMax = correctFloat(mathCeil(max / tickInterval) * tickInterval),\n tickPositions = [];\n\n // For single points, add a tick regardless of the relative position (#2662)\n if (min === max && isNumber(min)) {\n return [min];\n }\n\n // Populate the intermediate values\n pos = roundedMin;\n while (pos <= roundedMax) {\n\n // Place the tick on the rounded value\n tickPositions.push(pos);\n\n // Always add the raw tickInterval, not the corrected one.\n pos = correctFloat(pos + tickInterval);\n\n // If the interval is not big enough in the current min - max range to actually increase\n // the loop variable, we need to break out to prevent endless loop. Issue #619\n if (pos === lastPos) {\n break;\n }\n\n // Record the last value\n lastPos = pos;\n }\n return tickPositions;\n },\n\n /**\n * Return the minor tick positions. For logarithmic axes, reuse the same logic\n * as for major ticks.\n */\n getMinorTickPositions: function () {\n var axis = this,\n options = axis.options,\n tickPositions = axis.tickPositions,\n minorTickInterval = axis.minorTickInterval,\n minorTickPositions = [],\n pos,\n i,\n pointRangePadding = axis.pointRangePadding || 0,\n min = axis.min - pointRangePadding, // #1498\n max = axis.max + pointRangePadding, // #1498\n range = max - min,\n len;\n\n // If minor ticks get too dense, they are hard to read, and may cause long running script. So we don't draw them.\n if (range && range / minorTickInterval < axis.len / 3) { // #3875\n\n if (axis.isLog) {\n len = tickPositions.length;\n for (i = 1; i < len; i++) {\n minorTickPositions = minorTickPositions.concat(\n axis.getLogTickPositions(minorTickInterval, tickPositions[i - 1], tickPositions[i], true)\n );\n }\n } else if (axis.isDatetimeAxis && options.minorTickInterval === 'auto') { // #1314\n minorTickPositions = minorTickPositions.concat(\n axis.getTimeTicks(\n axis.normalizeTimeTickInterval(minorTickInterval),\n min,\n max,\n options.startOfWeek\n )\n );\n } else {\n for (pos = min + (tickPositions[0] - min) % minorTickInterval; pos <= max; pos += minorTickInterval) {\n minorTickPositions.push(pos);\n }\n }\n }\n\n if (minorTickPositions.length !== 0) { // don't change the extremes, when there is no minor ticks\n axis.trimTicks(minorTickPositions, options.startOnTick, options.endOnTick); // #3652 #3743 #1498\n }\n return minorTickPositions;\n },\n\n /**\n * Adjust the min and max for the minimum range. Keep in mind that the series data is\n * not yet processed, so we don't have information on data cropping and grouping, or\n * updated axis.pointRange or series.pointRange. The data can't be processed until\n * we have finally established min and max.\n */\n adjustForMinRange: function () {\n var axis = this,\n options = axis.options,\n min = axis.min,\n max = axis.max,\n zoomOffset,\n spaceAvailable = axis.dataMax - axis.dataMin >= axis.minRange,\n closestDataRange,\n i,\n distance,\n xData,\n loopLength,\n minArgs,\n maxArgs,\n minRange;\n\n // Set the automatic minimum range based on the closest point distance\n if (axis.isXAxis && axis.minRange === UNDEFINED && !axis.isLog) {\n\n if (defined(options.min) || defined(options.max)) {\n axis.minRange = null; // don't do this again\n\n } else {\n\n // Find the closest distance between raw data points, as opposed to\n // closestPointRange that applies to processed points (cropped and grouped)\n each(axis.series, function (series) {\n xData = series.xData;\n loopLength = series.xIncrement ? 1 : xData.length - 1;\n for (i = loopLength; i > 0; i--) {\n distance = xData[i] - xData[i - 1];\n if (closestDataRange === UNDEFINED || distance < closestDataRange) {\n closestDataRange = distance;\n }\n }\n });\n axis.minRange = mathMin(closestDataRange * 5, axis.dataMax - axis.dataMin);\n }\n }\n\n // if minRange is exceeded, adjust\n if (max - min < axis.minRange) {\n minRange = axis.minRange;\n zoomOffset = (minRange - max + min) / 2;\n\n // if min and max options have been set, don't go beyond it\n minArgs = [min - zoomOffset, pick(options.min, min - zoomOffset)];\n if (spaceAvailable) { // if space is available, stay within the data range\n minArgs[2] = axis.dataMin;\n }\n min = arrayMax(minArgs);\n\n maxArgs = [min + minRange, pick(options.max, min + minRange)];\n if (spaceAvailable) { // if space is availabe, stay within the data range\n maxArgs[2] = axis.dataMax;\n }\n\n max = arrayMin(maxArgs);\n\n // now if the max is adjusted, adjust the min back\n if (max - min < minRange) {\n minArgs[0] = max - minRange;\n minArgs[1] = pick(options.min, max - minRange);\n min = arrayMax(minArgs);\n }\n }\n\n // Record modified extremes\n axis.min = min;\n axis.max = max;\n },\n\n /**\n * Find the closestPointRange across all series\n */\n getClosest: function () {\n var ret;\n\n if (this.categories) {\n ret = 1;\n } else {\n each(this.series, function (series) {\n var seriesClosest = series.closestPointRange;\n if (!series.noSharedTooltip && defined(seriesClosest)) {\n ret = defined(ret) ?\n mathMin(ret, seriesClosest) :\n seriesClosest;\n }\n });\n }\n return ret;\n },\n\n /**\n * Update translation information\n */\n setAxisTranslation: function (saveOld) {\n var axis = this,\n range = axis.max - axis.min,\n pointRange = axis.axisPointRange || 0,\n closestPointRange,\n minPointOffset = 0,\n pointRangePadding = 0,\n linkedParent = axis.linkedParent,\n ordinalCorrection,\n hasCategories = !!axis.categories,\n transA = axis.transA,\n isXAxis = axis.isXAxis;\n\n // Adjust translation for padding. Y axis with categories need to go through the same (#1784).\n if (isXAxis || hasCategories || pointRange) {\n if (linkedParent) {\n minPointOffset = linkedParent.minPointOffset;\n pointRangePadding = linkedParent.pointRangePadding;\n\n } else {\n \n // Get the closest points\n closestPointRange = axis.getClosest();\n\n each(axis.series, function (series) {\n var seriesPointRange = hasCategories ? \n 1 : \n (isXAxis ? \n pick(series.options.pointRange, closestPointRange, 0) : \n (axis.axisPointRange || 0)), // #2806\n pointPlacement = series.options.pointPlacement;\n\n pointRange = mathMax(pointRange, seriesPointRange);\n\n if (!axis.single) {\n // minPointOffset is the value padding to the left of the axis in order to make\n // room for points with a pointRange, typically columns. When the pointPlacement option\n // is 'between' or 'on', this padding does not apply.\n minPointOffset = mathMax(\n minPointOffset,\n isString(pointPlacement) ? 0 : seriesPointRange / 2\n );\n\n // Determine the total padding needed to the length of the axis to make room for the\n // pointRange. If the series' pointPlacement is 'on', no padding is added.\n pointRangePadding = mathMax(\n pointRangePadding,\n pointPlacement === 'on' ? 0 : seriesPointRange\n );\n }\n });\n }\n\n // Record minPointOffset and pointRangePadding\n ordinalCorrection = axis.ordinalSlope && closestPointRange ? axis.ordinalSlope / closestPointRange : 1; // #988, #1853\n axis.minPointOffset = minPointOffset = minPointOffset * ordinalCorrection;\n axis.pointRangePadding = pointRangePadding = pointRangePadding * ordinalCorrection;\n\n // pointRange means the width reserved for each point, like in a column chart\n axis.pointRange = mathMin(pointRange, range);\n\n // closestPointRange means the closest distance between points. In columns\n // it is mostly equal to pointRange, but in lines pointRange is 0 while closestPointRange\n // is some other value\n if (isXAxis) {\n axis.closestPointRange = closestPointRange;\n }\n }\n\n // Secondary values\n if (saveOld) {\n axis.oldTransA = transA;\n }\n axis.translationSlope = axis.transA = transA = axis.len / ((range + pointRangePadding) || 1);\n axis.transB = axis.horiz ? axis.left : axis.bottom; // translation addend\n axis.minPixelPadding = transA * minPointOffset;\n },\n\n minFromRange: function () {\n return this.max - this.range;\n },\n\n /**\n * Set the tick positions to round values and optionally extend the extremes\n * to the nearest tick\n */\n setTickInterval: function (secondPass) {\n var axis = this,\n chart = axis.chart,\n options = axis.options,\n isLog = axis.isLog,\n log2lin = axis.log2lin,\n isDatetimeAxis = axis.isDatetimeAxis,\n isXAxis = axis.isXAxis,\n isLinked = axis.isLinked,\n maxPadding = options.maxPadding,\n minPadding = options.minPadding,\n length,\n linkedParentExtremes,\n tickIntervalOption = options.tickInterval,\n minTickInterval,\n tickPixelIntervalOption = options.tickPixelInterval,\n categories = axis.categories,\n threshold = axis.threshold,\n softThreshold = axis.softThreshold,\n thresholdMin,\n thresholdMax,\n hardMin,\n hardMax;\n\n if (!isDatetimeAxis && !categories && !isLinked) {\n this.getTickAmount();\n }\n\n // Min or max set either by zooming/setExtremes or initial options\n hardMin = pick(axis.userMin, options.min);\n hardMax = pick(axis.userMax, options.max);\n\n // Linked axis gets the extremes from the parent axis\n if (isLinked) {\n axis.linkedParent = chart[axis.coll][options.linkedTo];\n linkedParentExtremes = axis.linkedParent.getExtremes();\n axis.min = pick(linkedParentExtremes.min, linkedParentExtremes.dataMin);\n axis.max = pick(linkedParentExtremes.max, linkedParentExtremes.dataMax);\n if (options.type !== axis.linkedParent.options.type) {\n error(11, 1); // Can't link axes of different type\n }\n\n // Initial min and max from the extreme data values\n } else {\n\n // Adjust to hard threshold\n if (!softThreshold && defined(threshold)) {\n if (axis.dataMin >= threshold) {\n thresholdMin = threshold;\n minPadding = 0;\n } else if (axis.dataMax <= threshold) {\n thresholdMax = threshold;\n maxPadding = 0;\n }\n }\n\n axis.min = pick(hardMin, thresholdMin, axis.dataMin);\n axis.max = pick(hardMax, thresholdMax, axis.dataMax);\n\n }\n\n if (isLog) {\n if (!secondPass && mathMin(axis.min, pick(axis.dataMin, axis.min)) <= 0) { // #978\n error(10, 1); // Can't plot negative values on log axis\n }\n // The correctFloat cures #934, float errors on full tens. But it\n // was too aggressive for #4360 because of conversion back to lin,\n // therefore use precision 15.\n axis.min = correctFloat(log2lin(axis.min), 15);\n axis.max = correctFloat(log2lin(axis.max), 15);\n }\n\n // handle zoomed range\n if (axis.range && defined(axis.max)) {\n axis.userMin = axis.min = hardMin = mathMax(axis.min, axis.minFromRange()); // #618\n axis.userMax = hardMax = axis.max;\n\n axis.range = null; // don't use it when running setExtremes\n }\n\n // Hook for Highstock Scroller. Consider combining with beforePadding.\n fireEvent(axis, 'foundExtremes');\n\n // Hook for adjusting this.min and this.max. Used by bubble series.\n if (axis.beforePadding) {\n axis.beforePadding();\n }\n\n // adjust min and max for the minimum range\n axis.adjustForMinRange();\n\n // Pad the values to get clear of the chart's edges. To avoid tickInterval taking the padding\n // into account, we do this after computing tick interval (#1337).\n if (!categories && !axis.axisPointRange && !axis.usePercentage && !isLinked && defined(axis.min) && defined(axis.max)) {\n length = axis.max - axis.min;\n if (length) {\n if (!defined(hardMin) && minPadding) {\n axis.min -= length * minPadding;\n }\n if (!defined(hardMax) && maxPadding) {\n axis.max += length * maxPadding;\n }\n }\n }\n\n // Stay within floor and ceiling\n if (isNumber(options.floor)) {\n axis.min = mathMax(axis.min, options.floor);\n }\n if (isNumber(options.ceiling)) {\n axis.max = mathMin(axis.max, options.ceiling);\n }\n\n // When the threshold is soft, adjust the extreme value only if\n // the data extreme and the padded extreme land on either side of the threshold. For example,\n // a series of [0, 1, 2, 3] would make the yAxis add a tick for -1 because of the\n // default minPadding and startOnTick options. This is prevented by the softThreshold\n // option.\n if (softThreshold && defined(axis.dataMin)) {\n threshold = threshold || 0;\n if (!defined(hardMin) && axis.min < threshold && axis.dataMin >= threshold) {\n axis.min = threshold;\n } else if (!defined(hardMax) && axis.max > threshold && axis.dataMax <= threshold) {\n axis.max = threshold;\n }\n }\n\n\n // get tickInterval\n if (axis.min === axis.max || axis.min === undefined || axis.max === undefined) {\n axis.tickInterval = 1;\n } else if (isLinked && !tickIntervalOption &&\n tickPixelIntervalOption === axis.linkedParent.options.tickPixelInterval) {\n axis.tickInterval = tickIntervalOption = axis.linkedParent.tickInterval;\n } else {\n axis.tickInterval = pick(\n tickIntervalOption,\n this.tickAmount ? ((axis.max - axis.min) / mathMax(this.tickAmount - 1, 1)) : undefined,\n categories ? // for categoried axis, 1 is default, for linear axis use tickPix\n 1 :\n // don't let it be more than the data range\n (axis.max - axis.min) * tickPixelIntervalOption / mathMax(axis.len, tickPixelIntervalOption)\n );\n }\n\n // Now we're finished detecting min and max, crop and group series data. This\n // is in turn needed in order to find tick positions in ordinal axes.\n if (isXAxis && !secondPass) {\n each(axis.series, function (series) {\n series.processData(axis.min !== axis.oldMin || axis.max !== axis.oldMax);\n });\n }\n\n // set the translation factor used in translate function\n axis.setAxisTranslation(true);\n\n // hook for ordinal axes and radial axes\n if (axis.beforeSetTickPositions) {\n axis.beforeSetTickPositions();\n }\n\n // hook for extensions, used in Highstock ordinal axes\n if (axis.postProcessTickInterval) {\n axis.tickInterval = axis.postProcessTickInterval(axis.tickInterval);\n }\n\n // In column-like charts, don't cramp in more ticks than there are points (#1943, #4184)\n if (axis.pointRange && !tickIntervalOption) {\n axis.tickInterval = mathMax(axis.pointRange, axis.tickInterval);\n }\n\n // Before normalizing the tick interval, handle minimum tick interval. This applies only if tickInterval is not defined.\n minTickInterval = pick(options.minTickInterval, axis.isDatetimeAxis && axis.closestPointRange);\n if (!tickIntervalOption && axis.tickInterval < minTickInterval) {\n axis.tickInterval = minTickInterval;\n }\n\n // for linear axes, get magnitude and normalize the interval\n if (!isDatetimeAxis && !isLog && !tickIntervalOption) {\n axis.tickInterval = normalizeTickInterval(\n axis.tickInterval,\n null,\n getMagnitude(axis.tickInterval),\n // If the tick interval is between 0.5 and 5 and the axis max is in the order of\n // thousands, chances are we are dealing with years. Don't allow decimals. #3363.\n pick(options.allowDecimals, !(axis.tickInterval > 0.5 && axis.tickInterval < 5 && axis.max > 1000 && axis.max < 9999)),\n !!this.tickAmount\n );\n }\n\n // Prevent ticks from getting so close that we can't draw the labels\n if (!this.tickAmount && this.len) { // Color axis with disabled legend has no length\n axis.tickInterval = axis.unsquish();\n }\n\n this.setTickPositions();\n },\n\n /**\n * Now we have computed the normalized tickInterval, get the tick positions\n */\n setTickPositions: function () {\n\n var options = this.options,\n tickPositions,\n tickPositionsOption = options.tickPositions,\n tickPositioner = options.tickPositioner,\n startOnTick = options.startOnTick,\n endOnTick = options.endOnTick,\n single;\n\n // Set the tickmarkOffset\n this.tickmarkOffset = (this.categories && options.tickmarkPlacement === 'between' &&\n this.tickInterval === 1) ? 0.5 : 0; // #3202\n\n\n // get minorTickInterval\n this.minorTickInterval = options.minorTickInterval === 'auto' && this.tickInterval ?\n this.tickInterval / 5 : options.minorTickInterval;\n\n // Find the tick positions\n this.tickPositions = tickPositions = tickPositionsOption && tickPositionsOption.slice(); // Work on a copy (#1565)\n if (!tickPositions) {\n\n if (this.isDatetimeAxis) {\n tickPositions = this.getTimeTicks(\n this.normalizeTimeTickInterval(this.tickInterval, options.units),\n this.min,\n this.max,\n options.startOfWeek,\n this.ordinalPositions,\n this.closestPointRange,\n true\n );\n } else if (this.isLog) {\n tickPositions = this.getLogTickPositions(this.tickInterval, this.min, this.max);\n } else {\n tickPositions = this.getLinearTickPositions(this.tickInterval, this.min, this.max);\n }\n\n // Too dense ticks, keep only the first and last (#4477)\n if (tickPositions.length > this.len) {\n tickPositions = [tickPositions[0], tickPositions.pop()];\n }\n\n this.tickPositions = tickPositions;\n\n // Run the tick positioner callback, that allows modifying auto tick positions.\n if (tickPositioner) {\n tickPositioner = tickPositioner.apply(this, [this.min, this.max]);\n if (tickPositioner) {\n this.tickPositions = tickPositions = tickPositioner;\n }\n }\n\n }\n\n if (!this.isLinked) {\n\n // reset min/max or remove extremes based on start/end on tick\n this.trimTicks(tickPositions, startOnTick, endOnTick);\n\n // When there is only one point, or all points have the same value on this axis, then min\n // and max are equal and tickPositions.length is 0 or 1. In this case, add some padding\n // in order to center the point, but leave it with one tick. #1337.\n if (this.min === this.max && defined(this.min) && !this.tickAmount) {\n // Substract half a unit (#2619, #2846, #2515, #3390)\n single = true;\n this.min -= 0.5;\n this.max += 0.5;\n }\n this.single = single;\n\n if (!tickPositionsOption && !tickPositioner) {\n this.adjustTickAmount();\n }\n }\n },\n\n /**\n * Handle startOnTick and endOnTick by either adapting to padding min/max or rounded min/max\n */\n trimTicks: function (tickPositions, startOnTick, endOnTick) {\n var roundedMin = tickPositions[0],\n roundedMax = tickPositions[tickPositions.length - 1],\n minPointOffset = this.minPointOffset || 0;\n\n if (startOnTick) {\n this.min = roundedMin;\n } else {\n while (this.min - minPointOffset > tickPositions[0]) {\n tickPositions.shift();\n }\n }\n\n if (endOnTick) {\n this.max = roundedMax;\n } else {\n while (this.max + minPointOffset < tickPositions[tickPositions.length - 1]) {\n tickPositions.pop();\n }\n }\n\n // If no tick are left, set one tick in the middle (#3195)\n if (tickPositions.length === 0 && defined(roundedMin)) {\n tickPositions.push((roundedMax + roundedMin) / 2);\n }\n },\n\n /**\n * Check if there are multiple axes in the same pane\n * @returns {Boolean} There are other axes\n */\n alignToOthers: function () {\n var others = {}, // Whether there is another axis to pair with this one\n hasOther,\n options = this.options;\n\n if (this.chart.options.chart.alignTicks !== false && options.alignTicks !== false) {\n each(this.chart[this.coll], function (axis) {\n var otherOptions = axis.options,\n horiz = axis.horiz,\n key = [\n horiz ? otherOptions.left : otherOptions.top, \n otherOptions.width,\n otherOptions.height, \n otherOptions.pane\n ].join(',');\n\n\n if (axis.series.length) { // #4442\n if (others[key]) {\n hasOther = true; // #4201\n } else {\n others[key] = 1;\n }\n }\n });\n }\n return hasOther;\n },\n\n /**\n * Set the max ticks of either the x and y axis collection\n */\n getTickAmount: function () {\n var options = this.options,\n tickAmount = options.tickAmount,\n tickPixelInterval = options.tickPixelInterval;\n\n if (!defined(options.tickInterval) && this.len < tickPixelInterval && !this.isRadial &&\n !this.isLog && options.startOnTick && options.endOnTick) {\n tickAmount = 2;\n }\n\n if (!tickAmount && this.alignToOthers()) {\n // Add 1 because 4 tick intervals require 5 ticks (including first and last)\n tickAmount = mathCeil(this.len / tickPixelInterval) + 1;\n }\n\n // For tick amounts of 2 and 3, compute five ticks and remove the intermediate ones. This\n // prevents the axis from adding ticks that are too far away from the data extremes.\n if (tickAmount < 4) {\n this.finalTickAmt = tickAmount;\n tickAmount = 5;\n }\n\n this.tickAmount = tickAmount;\n },\n\n /**\n * When using multiple axes, adjust the number of ticks to match the highest\n * number of ticks in that group\n */\n adjustTickAmount: function () {\n var tickInterval = this.tickInterval,\n tickPositions = this.tickPositions,\n tickAmount = this.tickAmount,\n finalTickAmt = this.finalTickAmt,\n currentTickAmount = tickPositions && tickPositions.length,\n i,\n len;\n\n if (currentTickAmount < tickAmount) {\n while (tickPositions.length < tickAmount) {\n tickPositions.push(correctFloat(\n tickPositions[tickPositions.length - 1] + tickInterval\n ));\n }\n this.transA *= (currentTickAmount - 1) / (tickAmount - 1);\n this.max = tickPositions[tickPositions.length - 1];\n\n // We have too many ticks, run second pass to try to reduce ticks\n } else if (currentTickAmount > tickAmount) {\n this.tickInterval *= 2;\n this.setTickPositions();\n }\n\n // The finalTickAmt property is set in getTickAmount\n if (defined(finalTickAmt)) {\n i = len = tickPositions.length;\n while (i--) {\n if (\n (finalTickAmt === 3 && i % 2 === 1) || // Remove every other tick\n (finalTickAmt <= 2 && i > 0 && i < len - 1) // Remove all but first and last\n ) {\n tickPositions.splice(i, 1);\n }\n }\n this.finalTickAmt = UNDEFINED;\n }\n },\n\n /**\n * Set the scale based on data min and max, user set min and max or options\n *\n */\n setScale: function () {\n var axis = this,\n isDirtyData,\n isDirtyAxisLength;\n\n axis.oldMin = axis.min;\n axis.oldMax = axis.max;\n axis.oldAxisLength = axis.len;\n\n // set the new axisLength\n axis.setAxisSize();\n //axisLength = horiz ? axisWidth : axisHeight;\n isDirtyAxisLength = axis.len !== axis.oldAxisLength;\n\n // is there new data?\n each(axis.series, function (series) {\n if (series.isDirtyData || series.isDirty ||\n series.xAxis.isDirty) { // when x axis is dirty, we need new data extremes for y as well\n isDirtyData = true;\n }\n });\n\n // do we really need to go through all this?\n if (isDirtyAxisLength || isDirtyData || axis.isLinked || axis.forceRedraw ||\n axis.userMin !== axis.oldUserMin || axis.userMax !== axis.oldUserMax || axis.alignToOthers()) {\n\n if (axis.resetStacks) {\n axis.resetStacks();\n }\n\n axis.forceRedraw = false;\n\n // get data extremes if needed\n axis.getSeriesExtremes();\n\n // get fixed positions based on tickInterval\n axis.setTickInterval();\n\n // record old values to decide whether a rescale is necessary later on (#540)\n axis.oldUserMin = axis.userMin;\n axis.oldUserMax = axis.userMax;\n\n // Mark as dirty if it is not already set to dirty and extremes have changed. #595.\n if (!axis.isDirty) {\n axis.isDirty = isDirtyAxisLength || axis.min !== axis.oldMin || axis.max !== axis.oldMax;\n }\n } else if (axis.cleanStacks) {\n axis.cleanStacks();\n }\n },\n\n /**\n * Set the extremes and optionally redraw\n * @param {Number} newMin\n * @param {Number} newMax\n * @param {Boolean} redraw\n * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\n * configuration\n * @param {Object} eventArguments\n *\n */\n setExtremes: function (newMin, newMax, redraw, animation, eventArguments) {\n var axis = this,\n chart = axis.chart;\n\n redraw = pick(redraw, true); // defaults to true\n\n each(axis.series, function (serie) {\n delete serie.kdTree;\n });\n\n // Extend the arguments with min and max\n eventArguments = extend(eventArguments, {\n min: newMin,\n max: newMax\n });\n\n // Fire the event\n fireEvent(axis, 'setExtremes', eventArguments, function () { // the default event handler\n\n axis.userMin = newMin;\n axis.userMax = newMax;\n axis.eventArgs = eventArguments;\n\n if (redraw) {\n chart.redraw(animation);\n }\n });\n },\n\n /**\n * Overridable method for zooming chart. Pulled out in a separate method to allow overriding\n * in stock charts.\n */\n zoom: function (newMin, newMax) {\n var dataMin = this.dataMin,\n dataMax = this.dataMax,\n options = this.options,\n min = mathMin(dataMin, pick(options.min, dataMin)),\n max = mathMax(dataMax, pick(options.max, dataMax));\n\n // Prevent pinch zooming out of range. Check for defined is for #1946. #1734.\n if (!this.allowZoomOutside) {\n if (defined(dataMin) && newMin <= min) {\n newMin = min;\n }\n if (defined(dataMax) && newMax >= max) {\n newMax = max;\n }\n }\n\n // In full view, displaying the reset zoom button is not required\n this.displayBtn = newMin !== UNDEFINED || newMax !== UNDEFINED;\n\n // Do it\n this.setExtremes(\n newMin,\n newMax,\n false,\n UNDEFINED,\n { trigger: 'zoom' }\n );\n return true;\n },\n\n /**\n * Update the axis metrics\n */\n setAxisSize: function () {\n var chart = this.chart,\n options = this.options,\n offsetLeft = options.offsetLeft || 0,\n offsetRight = options.offsetRight || 0,\n horiz = this.horiz,\n width = pick(options.width, chart.plotWidth - offsetLeft + offsetRight),\n height = pick(options.height, chart.plotHeight),\n top = pick(options.top, chart.plotTop),\n left = pick(options.left, chart.plotLeft + offsetLeft),\n percentRegex = /%$/;\n\n // Check for percentage based input values. Rounding fixes problems with\n // column overflow and plot line filtering (#4898, #4899)\n if (percentRegex.test(height)) {\n height = Math.round(parseFloat(height) / 100 * chart.plotHeight);\n }\n if (percentRegex.test(top)) {\n top = Math.round(parseFloat(top) / 100 * chart.plotHeight + chart.plotTop);\n }\n\n // Expose basic values to use in Series object and navigator\n this.left = left;\n this.top = top;\n this.width = width;\n this.height = height;\n this.bottom = chart.chartHeight - height - top;\n this.right = chart.chartWidth - width - left;\n\n // Direction agnostic properties\n this.len = mathMax(horiz ? width : height, 0); // mathMax fixes #905\n this.pos = horiz ? left : top; // distance from SVG origin\n },\n\n /**\n * Get the actual axis extremes\n */\n getExtremes: function () {\n var axis = this,\n isLog = axis.isLog,\n lin2log = axis.lin2log;\n\n return {\n min: isLog ? correctFloat(lin2log(axis.min)) : axis.min,\n max: isLog ? correctFloat(lin2log(axis.max)) : axis.max,\n dataMin: axis.dataMin,\n dataMax: axis.dataMax,\n userMin: axis.userMin,\n userMax: axis.userMax\n };\n },\n\n /**\n * Get the zero plane either based on zero or on the min or max value.\n * Used in bar and area plots\n */\n getThreshold: function (threshold) {\n var axis = this,\n isLog = axis.isLog,\n lin2log = axis.lin2log,\n realMin = isLog ? lin2log(axis.min) : axis.min,\n realMax = isLog ? lin2log(axis.max) : axis.max;\n\n if (threshold === null) {\n threshold = realMin;\n } else if (realMin > threshold) {\n threshold = realMin;\n } else if (realMax < threshold) {\n threshold = realMax;\n }\n\n return axis.translate(threshold, 0, 1, 0, 1);\n },\n\n /**\n * Compute auto alignment for the axis label based on which side the axis is on\n * and the given rotation for the label\n */\n autoLabelAlign: function (rotation) {\n var ret,\n angle = (pick(rotation, 0) - (this.side * 90) + 720) % 360;\n\n if (angle > 15 && angle < 165) {\n ret = 'right';\n } else if (angle > 195 && angle < 345) {\n ret = 'left';\n } else {\n ret = 'center';\n }\n return ret;\n },\n\n /**\n * Get the tick length and width for the axis.\n * @param {String} prefix 'tick' or 'minorTick'\n * @returns {Array} An array of tickLength and tickWidth\n */\n tickSize: function (prefix) {\n var options = this.options,\n tickLength = options[prefix + 'Length'],\n tickWidth = pick(options[prefix + 'Width'], prefix === 'tick' && this.isXAxis ? 1 : 0); // X axis defaults to 1\n\n if (tickWidth && tickLength) {\n // Negate the length\n if (options[prefix + 'Position'] === 'inside') {\n tickLength = -tickLength;\n }\n return [tickLength, tickWidth];\n }\n \n },\n\n /**\n * Return the size of the labels\n */\n labelMetrics: function () {\n return this.chart.renderer.fontMetrics(\n this.options.labels.style.fontSize, \n this.ticks[0] && this.ticks[0].label\n );\n },\n\n /**\n * Prevent the ticks from getting so close we can't draw the labels. On a horizontal\n * axis, this is handled by rotating the labels, removing ticks and adding ellipsis.\n * On a vertical axis remove ticks and add ellipsis.\n */\n unsquish: function () {\n var labelOptions = this.options.labels,\n horiz = this.horiz,\n tickInterval = this.tickInterval,\n newTickInterval = tickInterval,\n slotSize = this.len / (((this.categories ? 1 : 0) + this.max - this.min) / tickInterval),\n rotation,\n rotationOption = labelOptions.rotation,\n labelMetrics = this.labelMetrics(),\n step,\n bestScore = Number.MAX_VALUE,\n autoRotation,\n // Return the multiple of tickInterval that is needed to avoid collision\n getStep = function (spaceNeeded) {\n var step = spaceNeeded / (slotSize || 1);\n step = step > 1 ? mathCeil(step) : 1;\n return step * tickInterval;\n };\n\n if (horiz) {\n autoRotation = !labelOptions.staggerLines && !labelOptions.step && ( // #3971\n defined(rotationOption) ?\n [rotationOption] :\n slotSize < pick(labelOptions.autoRotationLimit, 80) && labelOptions.autoRotation\n );\n\n if (autoRotation) {\n\n // Loop over the given autoRotation options, and determine which gives the best score. The\n // best score is that with the lowest number of steps and a rotation closest to horizontal.\n each(autoRotation, function (rot) {\n var score;\n\n if (rot === rotationOption || (rot && rot >= -90 && rot <= 90)) { // #3891\n\n step = getStep(mathAbs(labelMetrics.h / mathSin(deg2rad * rot)));\n\n score = step + mathAbs(rot / 360);\n\n if (score < bestScore) {\n bestScore = score;\n rotation = rot;\n newTickInterval = step;\n }\n }\n });\n }\n\n } else if (!labelOptions.step) { // #4411\n newTickInterval = getStep(labelMetrics.h);\n }\n\n this.autoRotation = autoRotation;\n this.labelRotation = pick(rotation, rotationOption);\n\n return newTickInterval;\n },\n\n /**\n * Get the general slot width for this axis. This may change between the pre-render (from Axis.getOffset) \n * and the final tick rendering and placement (#5086).\n */\n getSlotWidth: function () {\n var chart = this.chart,\n horiz = this.horiz,\n labelOptions = this.options.labels,\n slotCount = Math.max(this.tickPositions.length - (this.categories ? 0 : 1), 1),\n marginLeft = chart.margin[3];\n\n return (horiz && (labelOptions.step || 0) < 2 && !labelOptions.rotation && // #4415\n ((this.staggerLines || 1) * chart.plotWidth) / slotCount) ||\n (!horiz && ((marginLeft && (marginLeft - chart.spacing[3])) || chart.chartWidth * 0.33)); // #1580, #1931\n\n },\n\n /**\n * Render the axis labels and determine whether ellipsis or rotation need to be applied\n */\n renderUnsquish: function () {\n var chart = this.chart,\n renderer = chart.renderer,\n tickPositions = this.tickPositions,\n ticks = this.ticks,\n labelOptions = this.options.labels,\n horiz = this.horiz,\n slotWidth = this.getSlotWidth(),\n innerWidth = mathMax(1, mathRound(slotWidth - 2 * (labelOptions.padding || 5))),\n attr = {},\n labelMetrics = this.labelMetrics(),\n textOverflowOption = labelOptions.style.textOverflow,\n css,\n labelLength = 0,\n label,\n i,\n pos;\n\n // Set rotation option unless it is \"auto\", like in gauges\n if (!isString(labelOptions.rotation)) {\n attr.rotation = labelOptions.rotation || 0; // #4443\n }\n\n // Handle auto rotation on horizontal axis\n if (this.autoRotation) {\n\n // Get the longest label length\n each(tickPositions, function (tick) {\n tick = ticks[tick];\n if (tick && tick.labelLength > labelLength) {\n labelLength = tick.labelLength;\n }\n });\n\n // Apply rotation only if the label is too wide for the slot, and\n // the label is wider than its height.\n if (labelLength > innerWidth && labelLength > labelMetrics.h) {\n attr.rotation = this.labelRotation;\n } else {\n this.labelRotation = 0;\n }\n\n // Handle word-wrap or ellipsis on vertical axis\n } else if (slotWidth) {\n // For word-wrap or ellipsis\n css = { width: innerWidth + PX };\n\n if (!textOverflowOption) {\n css.textOverflow = 'clip';\n\n // On vertical axis, only allow word wrap if there is room for more lines.\n i = tickPositions.length;\n while (!horiz && i--) {\n pos = tickPositions[i];\n label = ticks[pos].label;\n if (label) {\n // Reset ellipsis in order to get the correct bounding box (#4070)\n if (label.styles.textOverflow === 'ellipsis') {\n label.css({ textOverflow: 'clip' });\n\n // Set the correct width in order to read the bounding box height (#4678, #5034)\n } else if (ticks[pos].labelLength > slotWidth) {\n label.css({ width: slotWidth + 'px' });\n }\n\n if (label.getBBox().height > this.len / tickPositions.length - (labelMetrics.h - labelMetrics.f)) {\n label.specCss = { textOverflow: 'ellipsis' };\n }\n }\n }\n }\n }\n\n\n // Add ellipsis if the label length is significantly longer than ideal\n if (attr.rotation) {\n css = {\n width: (labelLength > chart.chartHeight * 0.5 ? chart.chartHeight * 0.33 : chart.chartHeight) + PX\n };\n if (!textOverflowOption) {\n css.textOverflow = 'ellipsis';\n }\n }\n\n // Set the explicit or automatic label alignment\n this.labelAlign = labelOptions.align || this.autoLabelAlign(this.labelRotation);\n if (this.labelAlign) {\n attr.align = this.labelAlign;\n }\n\n // Apply general and specific CSS\n each(tickPositions, function (pos) {\n var tick = ticks[pos],\n label = tick && tick.label;\n if (label) {\n label.attr(attr); // This needs to go before the CSS in old IE (#4502)\n if (css) {\n label.css(merge(css, label.specCss));\n }\n delete label.specCss;\n tick.rotation = attr.rotation;\n }\n });\n\n // Note: Why is this not part of getLabelPosition?\n this.tickRotCorr = renderer.rotCorr(labelMetrics.b, this.labelRotation || 0, this.side !== 0);\n },\n\n /**\n * Return true if the axis has associated data\n */\n hasData: function () {\n return this.hasVisibleSeries || (defined(this.min) && defined(this.max) && !!this.tickPositions);\n },\n\n /**\n * Render the tick labels to a preliminary position to get their sizes\n */\n getOffset: function () {\n var axis = this,\n chart = axis.chart,\n renderer = chart.renderer,\n options = axis.options,\n tickPositions = axis.tickPositions,\n ticks = axis.ticks,\n horiz = axis.horiz,\n side = axis.side,\n invertedSide = chart.inverted ? [1, 0, 3, 2][side] : side,\n hasData,\n showAxis,\n titleOffset = 0,\n titleOffsetOption,\n titleMargin = 0,\n axisTitleOptions = options.title,\n labelOptions = options.labels,\n labelOffset = 0, // reset\n labelOffsetPadded,\n opposite = axis.opposite,\n axisOffset = chart.axisOffset,\n clipOffset = chart.clipOffset,\n clip,\n directionFactor = [-1, 1, 1, -1][side],\n n,\n textAlign,\n axisParent = axis.axisParent, // Used in color axis\n lineHeightCorrection,\n tickSize = this.tickSize('tick');\n\n // For reuse in Axis.render\n hasData = axis.hasData();\n axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);\n\n // Set/reset staggerLines\n axis.staggerLines = axis.horiz && labelOptions.staggerLines;\n\n // Create the axisGroup and gridGroup elements on first iteration\n if (!axis.axisGroup) {\n axis.gridGroup = renderer.g('grid')\n .attr({ zIndex: options.gridZIndex || 1 })\n .add(axisParent);\n axis.axisGroup = renderer.g('axis')\n .attr({ zIndex: options.zIndex || 2 })\n .add(axisParent);\n axis.labelGroup = renderer.g('axis-labels')\n .attr({ zIndex: labelOptions.zIndex || 7 })\n .addClass(PREFIX + axis.coll.toLowerCase() + '-labels')\n .add(axisParent);\n }\n\n if (hasData || axis.isLinked) {\n\n // Generate ticks\n each(tickPositions, function (pos) {\n if (!ticks[pos]) {\n ticks[pos] = new Tick(axis, pos);\n } else {\n ticks[pos].addLabel(); // update labels depending on tick interval\n }\n });\n\n axis.renderUnsquish();\n\n\n // Left side must be align: right and right side must have align: left for labels\n if (labelOptions.reserveSpace !== false && (side === 0 || side === 2 ||\n { 1: 'left', 3: 'right' }[side] === axis.labelAlign || axis.labelAlign === 'center')) {\n each(tickPositions, function (pos) {\n\n // get the highest offset\n labelOffset = mathMax(\n ticks[pos].getLabelSize(),\n labelOffset\n );\n });\n }\n\n if (axis.staggerLines) {\n labelOffset *= axis.staggerLines;\n axis.labelOffset = labelOffset * (axis.opposite ? -1 : 1);\n }\n\n\n } else { // doesn't have data\n for (n in ticks) {\n ticks[n].destroy();\n delete ticks[n];\n }\n }\n\n if (axisTitleOptions && axisTitleOptions.text && axisTitleOptions.enabled !== false) {\n if (!axis.axisTitle) {\n textAlign = axisTitleOptions.textAlign;\n if (!textAlign) {\n textAlign = (horiz ? { \n low: 'left',\n middle: 'center',\n high: 'right'\n } : { \n low: opposite ? 'right' : 'left',\n middle: 'center',\n high: opposite ? 'left' : 'right'\n })[axisTitleOptions.align];\n }\n axis.axisTitle = renderer.text(\n axisTitleOptions.text,\n 0,\n 0,\n axisTitleOptions.useHTML\n )\n .attr({\n zIndex: 7,\n rotation: axisTitleOptions.rotation || 0,\n align: textAlign\n })\n .addClass(PREFIX + this.coll.toLowerCase() + '-title')\n .css(axisTitleOptions.style)\n .add(axis.axisGroup);\n axis.axisTitle.isNew = true;\n }\n\n if (showAxis) {\n titleOffset = axis.axisTitle.getBBox()[horiz ? 'height' : 'width'];\n titleOffsetOption = axisTitleOptions.offset;\n titleMargin = defined(titleOffsetOption) ? 0 : pick(axisTitleOptions.margin, horiz ? 5 : 10);\n }\n\n // hide or show the title depending on whether showEmpty is set\n axis.axisTitle[showAxis ? 'show' : 'hide'](true);\n }\n\n // handle automatic or user set offset\n axis.offset = directionFactor * pick(options.offset, axisOffset[side]);\n\n axis.tickRotCorr = axis.tickRotCorr || { x: 0, y: 0 }; // polar\n if (side === 0) {\n lineHeightCorrection = -axis.labelMetrics().h;\n } else if (side === 2) {\n lineHeightCorrection = axis.tickRotCorr.y;\n } else {\n lineHeightCorrection = 0;\n }\n\n // Find the padded label offset\n labelOffsetPadded = Math.abs(labelOffset) + titleMargin;\n if (labelOffset) {\n labelOffsetPadded -= lineHeightCorrection;\n labelOffsetPadded += directionFactor * (horiz ? pick(labelOptions.y, axis.tickRotCorr.y + directionFactor * 8) : labelOptions.x);\n }\n axis.axisTitleMargin = pick(titleOffsetOption, labelOffsetPadded);\n\n axisOffset[side] = mathMax(\n axisOffset[side],\n axis.axisTitleMargin + titleOffset + directionFactor * axis.offset,\n labelOffsetPadded, // #3027\n hasData && tickPositions.length && tickSize ? tickSize[0] : 0 // #4866\n );\n\n // Decide the clipping needed to keep the graph inside the plot area and axis lines\n clip = options.offset ? 0 : mathFloor(options.lineWidth / 2) * 2; // #4308, #4371\n clipOffset[invertedSide] = mathMax(clipOffset[invertedSide], clip);\n },\n\n /**\n * Get the path for the axis line\n */\n getLinePath: function (lineWidth) {\n var chart = this.chart,\n opposite = this.opposite,\n offset = this.offset,\n horiz = this.horiz,\n lineLeft = this.left + (opposite ? this.width : 0) + offset,\n lineTop = chart.chartHeight - this.bottom - (opposite ? this.height : 0) + offset;\n\n if (opposite) {\n lineWidth *= -1; // crispify the other way - #1480, #1687\n }\n\n return chart.renderer\n .crispLine([\n M,\n horiz ?\n this.left :\n lineLeft,\n horiz ?\n lineTop :\n this.top,\n L,\n horiz ?\n chart.chartWidth - this.right :\n lineLeft,\n horiz ?\n lineTop :\n chart.chartHeight - this.bottom\n ], lineWidth);\n },\n\n /**\n * Position the title\n */\n getTitlePosition: function () {\n // compute anchor points for each of the title align options\n var horiz = this.horiz,\n axisLeft = this.left,\n axisTop = this.top,\n axisLength = this.len,\n axisTitleOptions = this.options.title,\n margin = horiz ? axisLeft : axisTop,\n opposite = this.opposite,\n offset = this.offset,\n xOption = axisTitleOptions.x || 0,\n yOption = axisTitleOptions.y || 0,\n fontSize = this.chart.renderer.fontMetrics(axisTitleOptions.style.fontSize).f,\n\n // the position in the length direction of the axis\n alongAxis = {\n low: margin + (horiz ? 0 : axisLength),\n middle: margin + axisLength / 2,\n high: margin + (horiz ? axisLength : 0)\n }[axisTitleOptions.align],\n\n // the position in the perpendicular direction of the axis\n offAxis = (horiz ? axisTop + this.height : axisLeft) +\n (horiz ? 1 : -1) * // horizontal axis reverses the margin\n (opposite ? -1 : 1) * // so does opposite axes\n this.axisTitleMargin +\n (this.side === 2 ? fontSize : 0);\n\n return {\n x: horiz ?\n alongAxis + xOption :\n offAxis + (opposite ? this.width : 0) + offset + xOption,\n y: horiz ?\n offAxis + yOption - (opposite ? this.height : 0) + offset :\n alongAxis + yOption\n };\n },\n\n /**\n * Render the axis\n */\n render: function () {\n var axis = this,\n chart = axis.chart,\n renderer = chart.renderer,\n options = axis.options,\n isLog = axis.isLog,\n lin2log = axis.lin2log,\n isLinked = axis.isLinked,\n tickPositions = axis.tickPositions,\n axisTitle = axis.axisTitle,\n ticks = axis.ticks,\n minorTicks = axis.minorTicks,\n alternateBands = axis.alternateBands,\n stackLabelOptions = options.stackLabels,\n alternateGridColor = options.alternateGridColor,\n tickmarkOffset = axis.tickmarkOffset,\n lineWidth = options.lineWidth,\n linePath,\n hasRendered = chart.hasRendered,\n slideInTicks = hasRendered && isNumber(axis.oldMin),\n showAxis = axis.showAxis,\n animation = animObject(renderer.globalAnimation),\n from,\n to;\n\n // Reset\n axis.labelEdge.length = 0;\n //axis.justifyToPlot = overflow === 'justify';\n axis.overlap = false;\n\n // Mark all elements inActive before we go over and mark the active ones\n each([ticks, minorTicks, alternateBands], function (coll) {\n var pos;\n for (pos in coll) {\n coll[pos].isActive = false;\n }\n });\n\n // If the series has data draw the ticks. Else only the line and title\n if (axis.hasData() || isLinked) {\n\n // minor ticks\n if (axis.minorTickInterval && !axis.categories) {\n each(axis.getMinorTickPositions(), function (pos) {\n if (!minorTicks[pos]) {\n minorTicks[pos] = new Tick(axis, pos, 'minor');\n }\n\n // render new ticks in old position\n if (slideInTicks && minorTicks[pos].isNew) {\n minorTicks[pos].render(null, true);\n }\n\n minorTicks[pos].render(null, false, 1);\n });\n }\n\n // Major ticks. Pull out the first item and render it last so that\n // we can get the position of the neighbour label. #808.\n if (tickPositions.length) { // #1300\n each(tickPositions, function (pos, i) {\n\n // linked axes need an extra check to find out if\n if (!isLinked || (pos >= axis.min && pos <= axis.max)) {\n\n if (!ticks[pos]) {\n ticks[pos] = new Tick(axis, pos);\n }\n\n // render new ticks in old position\n if (slideInTicks && ticks[pos].isNew) {\n ticks[pos].render(i, true, 0.1);\n }\n\n ticks[pos].render(i);\n }\n\n });\n // In a categorized axis, the tick marks are displayed between labels. So\n // we need to add a tick mark and grid line at the left edge of the X axis.\n if (tickmarkOffset && (axis.min === 0 || axis.single)) {\n if (!ticks[-1]) {\n ticks[-1] = new Tick(axis, -1, null, true);\n }\n ticks[-1].render(-1);\n }\n\n }\n\n // alternate grid color\n if (alternateGridColor) {\n each(tickPositions, function (pos, i) {\n to = tickPositions[i + 1] !== UNDEFINED ? tickPositions[i + 1] + tickmarkOffset : axis.max - tickmarkOffset; \n if (i % 2 === 0 && pos < axis.max && to <= axis.max + (chart.polar ? -tickmarkOffset : tickmarkOffset)) { // #2248, #4660\n if (!alternateBands[pos]) {\n alternateBands[pos] = new Highcharts.PlotLineOrBand(axis);\n }\n from = pos + tickmarkOffset; // #949\n alternateBands[pos].options = {\n from: isLog ? lin2log(from) : from,\n to: isLog ? lin2log(to) : to,\n color: alternateGridColor\n };\n alternateBands[pos].render();\n alternateBands[pos].isActive = true;\n }\n });\n }\n\n // custom plot lines and bands\n if (!axis._addedPlotLB) { // only first time\n each((options.plotLines || []).concat(options.plotBands || []), function (plotLineOptions) {\n axis.addPlotBandOrLine(plotLineOptions);\n });\n axis._addedPlotLB = true;\n }\n\n } // end if hasData\n\n // Remove inactive ticks\n each([ticks, minorTicks, alternateBands], function (coll) {\n var pos,\n i,\n forDestruction = [],\n delay = animation.duration,\n destroyInactiveItems = function () {\n i = forDestruction.length;\n while (i--) {\n // When resizing rapidly, the same items may be destroyed in different timeouts,\n // or the may be reactivated\n if (coll[forDestruction[i]] && !coll[forDestruction[i]].isActive) {\n coll[forDestruction[i]].destroy();\n delete coll[forDestruction[i]];\n }\n }\n\n };\n\n for (pos in coll) {\n\n if (!coll[pos].isActive) {\n // Render to zero opacity\n coll[pos].render(pos, false, 0);\n coll[pos].isActive = false;\n forDestruction.push(pos);\n }\n }\n\n // When the objects are finished fading out, destroy them\n syncTimeout(\n destroyInactiveItems, \n coll === alternateBands || !chart.hasRendered || !delay ? 0 : delay\n );\n });\n\n // Static items. As the axis group is cleared on subsequent calls\n // to render, these items are added outside the group.\n // axis line\n if (lineWidth) {\n linePath = axis.getLinePath(lineWidth);\n if (!axis.axisLine) {\n axis.axisLine = renderer.path(linePath)\n .attr({\n stroke: options.lineColor,\n 'stroke-width': lineWidth,\n zIndex: 7\n })\n .add(axis.axisGroup);\n } else {\n axis.axisLine.animate({ d: linePath });\n }\n\n // show or hide the line depending on options.showEmpty\n axis.axisLine[showAxis ? 'show' : 'hide'](true);\n }\n\n if (axisTitle && showAxis) {\n\n axisTitle[axisTitle.isNew ? 'attr' : 'animate'](\n axis.getTitlePosition()\n );\n axisTitle.isNew = false;\n }\n\n // Stacked totals:\n if (stackLabelOptions && stackLabelOptions.enabled) {\n axis.renderStackTotals();\n }\n // End stacked totals\n\n axis.isDirty = false;\n },\n\n /**\n * Redraw the axis to reflect changes in the data or axis extremes\n */\n redraw: function () {\n\n if (this.visible) {\n // render the axis\n this.render();\n\n // move plot lines and bands\n each(this.plotLinesAndBands, function (plotLine) {\n plotLine.render();\n });\n }\n\n // mark associated series as dirty and ready for redraw\n each(this.series, function (series) {\n series.isDirty = true;\n });\n\n },\n\n /**\n * Destroys an Axis instance.\n */\n destroy: function (keepEvents) {\n var axis = this,\n stacks = axis.stacks,\n stackKey,\n plotLinesAndBands = axis.plotLinesAndBands,\n i;\n\n // Remove the events\n if (!keepEvents) {\n removeEvent(axis);\n }\n\n // Destroy each stack total\n for (stackKey in stacks) {\n destroyObjectProperties(stacks[stackKey]);\n\n stacks[stackKey] = null;\n }\n\n // Destroy collections\n each([axis.ticks, axis.minorTicks, axis.alternateBands], function (coll) {\n destroyObjectProperties(coll);\n });\n i = plotLinesAndBands.length;\n while (i--) { // #1975\n plotLinesAndBands[i].destroy();\n }\n\n // Destroy properties\n each(['stackTotalGroup', 'axisLine', 'axisTitle', 'axisGroup', 'gridGroup', 'labelGroup', 'cross'], function (prop) {\n if (axis[prop]) {\n axis[prop] = axis[prop].destroy();\n }\n });\n\n\n this._addedPlotLB = this.chart._labelPanes = this.ordinalSlope = undefined; // #1611, #2887, #4314, #5316\n },\n\n /**\n * Draw the crosshair\n * \n * @param {Object} e The event arguments from the modified pointer event\n * @param {Object} point The Point object\n */\n drawCrosshair: function (e, point) {\n\n var path,\n options = this.crosshair,\n pos,\n attribs,\n categorized,\n strokeWidth;\n\n // Use last available event when updating non-snapped crosshairs without\n // mouse interaction (#5287)\n if (!e) {\n e = this.cross && this.cross.e;\n }\n\n if (\n // Disabled in options\n !this.crosshair ||\n // Snap\n ((defined(point) || !pick(options.snap, true)) === false)\n ) {\n this.hideCrosshair();\n } else {\n\n // Get the path\n if (!pick(options.snap, true)) {\n pos = (this.horiz ? e.chartX - this.pos : this.len - e.chartY + this.pos);\n } else if (defined(point)) {\n pos = this.isXAxis ? point.plotX : this.len - point.plotY; // #3834\n }\n\n if (this.isRadial) {\n path = this.getPlotLinePath(this.isXAxis ? point.x : pick(point.stackY, point.y)) || null; // #3189\n } else {\n path = this.getPlotLinePath(null, null, null, null, pos) || null; // #3189\n }\n\n if (path === null) {\n this.hideCrosshair();\n return;\n }\n\n categorized = this.categories && !this.isRadial;\n strokeWidth = pick(options.width, (categorized ? this.transA : 1));\n\n // Draw the cross\n if (this.cross) {\n this.cross\n .attr({\n d: path,\n visibility: 'visible',\n 'stroke-width': strokeWidth // #4737\n });\n } else {\n attribs = {\n 'pointer-events': 'none', // #5259\n 'stroke-width': strokeWidth,\n stroke: options.color || (categorized ? 'rgba(155,200,255,0.2)' : '#C0C0C0'),\n zIndex: pick(options.zIndex, 2)\n };\n if (options.dashStyle) {\n attribs.dashstyle = options.dashStyle;\n }\n this.cross = this.chart.renderer.path(path).attr(attribs).add();\n }\n this.cross.e = e;\n }\n\n },\n\n /**\n * Hide the crosshair.\n */\n hideCrosshair: function () {\n if (this.cross) {\n this.cross.hide();\n }\n }\n }; // end Axis\n\n extend(Axis.prototype, AxisPlotLineOrBandExtension);\n\n /**\n * Set the tick positions to a time unit that makes sense, for example\n * on the first of each month or on every Monday. Return an array\n * with the time positions. Used in datetime axes as well as for grouping\n * data on a datetime axis.\n *\n * @param {Object} normalizedInterval The interval in axis values (ms) and the count\n * @param {Number} min The minimum in axis values\n * @param {Number} max The maximum in axis values\n * @param {Number} startOfWeek\n */\n Axis.prototype.getTimeTicks = function (normalizedInterval, min, max, startOfWeek) {\n var tickPositions = [],\n i,\n higherRanks = {},\n useUTC = defaultOptions.global.useUTC,\n minYear, // used in months and years as a basis for Date.UTC()\n minDate = new Date(min - getTZOffset(min)),\n interval = normalizedInterval.unitRange,\n count = normalizedInterval.count;\n\n if (defined(min)) { // #1300\n minDate[setMilliseconds](interval >= timeUnits.second ? 0 : // #3935\n count * mathFloor(minDate.getMilliseconds() / count)); // #3652, #3654\n\n if (interval >= timeUnits.second) { // second\n minDate[setSeconds](interval >= timeUnits.minute ? 0 : // #3935\n count * mathFloor(minDate.getSeconds() / count));\n }\n\n if (interval >= timeUnits.minute) { // minute\n minDate[setMinutes](interval >= timeUnits.hour ? 0 :\n count * mathFloor(minDate[getMinutes]() / count));\n }\n\n if (interval >= timeUnits.hour) { // hour\n minDate[setHours](interval >= timeUnits.day ? 0 :\n count * mathFloor(minDate[getHours]() / count));\n }\n\n if (interval >= timeUnits.day) { // day\n minDate[setDate](interval >= timeUnits.month ? 1 :\n count * mathFloor(minDate[getDate]() / count));\n }\n\n if (interval >= timeUnits.month) { // month\n minDate[setMonth](interval >= timeUnits.year ? 0 :\n count * mathFloor(minDate[getMonth]() / count));\n minYear = minDate[getFullYear]();\n }\n\n if (interval >= timeUnits.year) { // year\n minYear -= minYear % count;\n minDate[setFullYear](minYear);\n }\n\n // week is a special case that runs outside the hierarchy\n if (interval === timeUnits.week) {\n // get start of current week, independent of count\n minDate[setDate](minDate[getDate]() - minDate[getDay]() +\n pick(startOfWeek, 1));\n }\n\n\n // get tick positions\n i = 1;\n if (timezoneOffset || getTimezoneOffset) {\n minDate = minDate.getTime();\n minDate = new Date(minDate + getTZOffset(minDate));\n }\n minYear = minDate[getFullYear]();\n var time = minDate.getTime(),\n minMonth = minDate[getMonth](),\n minDateDate = minDate[getDate](),\n variableDayLength = !useUTC || !!getTimezoneOffset, // #4951\n localTimezoneOffset = (timeUnits.day +\n (useUTC ? getTZOffset(minDate) : minDate.getTimezoneOffset() * 60 * 1000)\n ) % timeUnits.day; // #950, #3359\n\n // iterate and add tick positions at appropriate values\n while (time < max) {\n tickPositions.push(time);\n\n // if the interval is years, use Date.UTC to increase years\n if (interval === timeUnits.year) {\n time = makeTime(minYear + i * count, 0);\n\n // if the interval is months, use Date.UTC to increase months\n } else if (interval === timeUnits.month) {\n time = makeTime(minYear, minMonth + i * count);\n\n // if we're using global time, the interval is not fixed as it jumps\n // one hour at the DST crossover\n } else if (variableDayLength && (interval === timeUnits.day || interval === timeUnits.week)) {\n time = makeTime(minYear, minMonth, minDateDate +\n i * count * (interval === timeUnits.day ? 1 : 7));\n\n // else, the interval is fixed and we use simple addition\n } else {\n time += interval * count;\n }\n\n i++;\n }\n\n // push the last time\n tickPositions.push(time);\n\n\n // mark new days if the time is dividible by day (#1649, #1760)\n each(grep(tickPositions, function (time) {\n return interval <= timeUnits.hour && time % timeUnits.day === localTimezoneOffset;\n }), function (time) {\n higherRanks[time] = 'day';\n });\n }\n\n\n // record information on the chosen unit - for dynamic label formatter\n tickPositions.info = extend(normalizedInterval, {\n higherRanks: higherRanks,\n totalRange: interval * count\n });\n\n return tickPositions;\n };\n\n /**\n * Get a normalized tick interval for dates. Returns a configuration object with\n * unit range (interval), count and name. Used to prepare data for getTimeTicks.\n * Previously this logic was part of getTimeTicks, but as getTimeTicks now runs\n * of segments in stock charts, the normalizing logic was extracted in order to\n * prevent it for running over again for each segment having the same interval.\n * #662, #697.\n */\n Axis.prototype.normalizeTimeTickInterval = function (tickInterval, unitsOption) {\n var units = unitsOption || [[\n 'millisecond', // unit name\n [1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples\n ], [\n 'second',\n [1, 2, 5, 10, 15, 30]\n ], [\n 'minute',\n [1, 2, 5, 10, 15, 30]\n ], [\n 'hour',\n [1, 2, 3, 4, 6, 8, 12]\n ], [\n 'day',\n [1, 2]\n ], [\n 'week',\n [1, 2]\n ], [\n 'month',\n [1, 2, 3, 4, 6]\n ], [\n 'year',\n null\n ]],\n unit = units[units.length - 1], // default unit is years\n interval = timeUnits[unit[0]],\n multiples = unit[1],\n count,\n i;\n\n // loop through the units to find the one that best fits the tickInterval\n for (i = 0; i < units.length; i++) {\n unit = units[i];\n interval = timeUnits[unit[0]];\n multiples = unit[1];\n\n\n if (units[i + 1]) {\n // lessThan is in the middle between the highest multiple and the next unit.\n var lessThan = (interval * multiples[multiples.length - 1] +\n timeUnits[units[i + 1][0]]) / 2;\n\n // break and keep the current unit\n if (tickInterval <= lessThan) {\n break;\n }\n }\n }\n\n // prevent 2.5 years intervals, though 25, 250 etc. are allowed\n if (interval === timeUnits.year && tickInterval < 5 * interval) {\n multiples = [1, 2, 5];\n }\n\n // get the count\n count = normalizeTickInterval(\n tickInterval / interval,\n multiples,\n unit[0] === 'year' ? mathMax(getMagnitude(tickInterval / interval), 1) : 1 // #1913, #2360\n );\n\n return {\n unitRange: interval,\n count: count,\n unitName: unit[0]\n };\n };\n /**\n * Methods defined on the Axis prototype\n */\n\n /**\n * Set the tick positions of a logarithmic axis\n */\n Axis.prototype.getLogTickPositions = function (interval, min, max, minor) {\n var axis = this,\n options = axis.options,\n axisLength = axis.len,\n lin2log = axis.lin2log,\n log2lin = axis.log2lin,\n // Since we use this method for both major and minor ticks,\n // use a local variable and return the result\n positions = [];\n\n // Reset\n if (!minor) {\n axis._minorAutoInterval = null;\n }\n\n // First case: All ticks fall on whole logarithms: 1, 10, 100 etc.\n if (interval >= 0.5) {\n interval = mathRound(interval);\n positions = axis.getLinearTickPositions(interval, min, max);\n\n // Second case: We need intermediary ticks. For example\n // 1, 2, 4, 6, 8, 10, 20, 40 etc.\n } else if (interval >= 0.08) {\n var roundedMin = mathFloor(min),\n intermediate,\n i,\n j,\n len,\n pos,\n lastPos,\n break2;\n\n if (interval > 0.3) {\n intermediate = [1, 2, 4];\n } else if (interval > 0.15) { // 0.2 equals five minor ticks per 1, 10, 100 etc\n intermediate = [1, 2, 4, 6, 8];\n } else { // 0.1 equals ten minor ticks per 1, 10, 100 etc\n intermediate = [1, 2, 3, 4, 5, 6, 7, 8, 9];\n }\n\n for (i = roundedMin; i < max + 1 && !break2; i++) {\n len = intermediate.length;\n for (j = 0; j < len && !break2; j++) {\n pos = log2lin(lin2log(i) * intermediate[j]);\n if (pos > min && (!minor || lastPos <= max) && lastPos !== UNDEFINED) { // #1670, lastPos is #3113\n positions.push(lastPos);\n }\n\n if (lastPos > max) {\n break2 = true;\n }\n lastPos = pos;\n }\n }\n\n // Third case: We are so deep in between whole logarithmic values that\n // we might as well handle the tick positions like a linear axis. For\n // example 1.01, 1.02, 1.03, 1.04.\n } else {\n var realMin = lin2log(min),\n realMax = lin2log(max),\n tickIntervalOption = options[minor ? 'minorTickInterval' : 'tickInterval'],\n filteredTickIntervalOption = tickIntervalOption === 'auto' ? null : tickIntervalOption,\n tickPixelIntervalOption = options.tickPixelInterval / (minor ? 5 : 1),\n totalPixelLength = minor ? axisLength / axis.tickPositions.length : axisLength;\n\n interval = pick(\n filteredTickIntervalOption,\n axis._minorAutoInterval,\n (realMax - realMin) * tickPixelIntervalOption / (totalPixelLength || 1)\n );\n\n interval = normalizeTickInterval(\n interval,\n null,\n getMagnitude(interval)\n );\n\n positions = map(axis.getLinearTickPositions(\n interval,\n realMin,\n realMax\n ), log2lin);\n\n if (!minor) {\n axis._minorAutoInterval = interval / 5;\n }\n }\n\n // Set the axis-level tickInterval variable\n if (!minor) {\n axis.tickInterval = interval;\n }\n return positions;\n };\n\n Axis.prototype.log2lin = function (num) {\n return math.log(num) / math.LN10;\n };\n\n Axis.prototype.lin2log = function (num) {\n return math.pow(10, num);\n };\n /**\n * The tooltip object\n * @param {Object} chart The chart instance\n * @param {Object} options Tooltip options\n */\n var Tooltip = Highcharts.Tooltip = function () {\n this.init.apply(this, arguments);\n };\n\n Tooltip.prototype = {\n\n init: function (chart, options) {\n\n var borderWidth = options.borderWidth,\n style = options.style,\n padding = pInt(style.padding);\n\n // Save the chart and options\n this.chart = chart;\n this.options = options;\n\n // Keep track of the current series\n //this.currentSeries = UNDEFINED;\n\n // List of crosshairs\n this.crosshairs = [];\n\n // Current values of x and y when animating\n this.now = { x: 0, y: 0 };\n\n // The tooltip is initially hidden\n this.isHidden = true;\n\n\n // create the label\n this.label = chart.renderer.label('', 0, 0, options.shape || 'callout', null, null, options.useHTML, null, 'tooltip')\n .attr({\n padding: padding,\n fill: options.backgroundColor,\n 'stroke-width': borderWidth,\n r: options.borderRadius,\n zIndex: 8\n })\n .css(style)\n .css({ padding: 0 }) // Remove it from VML, the padding is applied as an attribute instead (#1117)\n .add()\n .attr({ y: -9e9 }); // #2301, #2657, #3532\n\n // When using canVG the shadow shows up as a gray circle\n // even if the tooltip is hidden.\n if (!useCanVG) {\n this.label.shadow(options.shadow);\n }\n\n // Public property for getting the shared state.\n this.shared = options.shared;\n },\n\n /**\n * Destroy the tooltip and its elements.\n */\n destroy: function () {\n // Destroy and clear local variables\n if (this.label) {\n this.label = this.label.destroy();\n }\n clearTimeout(this.hideTimer);\n clearTimeout(this.tooltipTimeout);\n },\n\n /**\n * Provide a soft movement for the tooltip\n *\n * @param {Number} x\n * @param {Number} y\n * @private\n */\n move: function (x, y, anchorX, anchorY) {\n var tooltip = this,\n now = tooltip.now,\n animate = tooltip.options.animation !== false && !tooltip.isHidden &&\n // When we get close to the target position, abort animation and land on the right place (#3056)\n (mathAbs(x - now.x) > 1 || mathAbs(y - now.y) > 1),\n skipAnchor = tooltip.followPointer || tooltip.len > 1;\n\n // Get intermediate values for animation\n extend(now, {\n x: animate ? (2 * now.x + x) / 3 : x,\n y: animate ? (now.y + y) / 2 : y,\n anchorX: skipAnchor ? UNDEFINED : animate ? (2 * now.anchorX + anchorX) / 3 : anchorX,\n anchorY: skipAnchor ? UNDEFINED : animate ? (now.anchorY + anchorY) / 2 : anchorY\n });\n\n // Move to the intermediate value\n tooltip.label.attr(now);\n\n\n // Run on next tick of the mouse tracker\n if (animate) {\n\n // Never allow two timeouts\n clearTimeout(this.tooltipTimeout);\n\n // Set the fixed interval ticking for the smooth tooltip\n this.tooltipTimeout = setTimeout(function () {\n // The interval function may still be running during destroy, so check that the chart is really there before calling.\n if (tooltip) {\n tooltip.move(x, y, anchorX, anchorY);\n }\n }, 32);\n\n }\n },\n\n /**\n * Hide the tooltip\n */\n hide: function (delay) {\n var tooltip = this;\n clearTimeout(this.hideTimer); // disallow duplicate timers (#1728, #1766)\n delay = pick(delay, this.options.hideDelay, 500);\n if (!this.isHidden) {\n this.hideTimer = syncTimeout(function () {\n tooltip.label[delay ? 'fadeOut' : 'hide']();\n tooltip.isHidden = true;\n }, delay);\n }\n },\n\n /**\n * Extendable method to get the anchor position of the tooltip\n * from a point or set of points\n */\n getAnchor: function (points, mouseEvent) {\n var ret,\n chart = this.chart,\n inverted = chart.inverted,\n plotTop = chart.plotTop,\n plotLeft = chart.plotLeft,\n plotX = 0,\n plotY = 0,\n yAxis,\n xAxis;\n\n points = splat(points);\n\n // Pie uses a special tooltipPos\n ret = points[0].tooltipPos;\n\n // When tooltip follows mouse, relate the position to the mouse\n if (this.followPointer && mouseEvent) {\n if (mouseEvent.chartX === UNDEFINED) {\n mouseEvent = chart.pointer.normalize(mouseEvent);\n }\n ret = [\n mouseEvent.chartX - chart.plotLeft,\n mouseEvent.chartY - plotTop\n ];\n }\n // When shared, use the average position\n if (!ret) {\n each(points, function (point) {\n yAxis = point.series.yAxis;\n xAxis = point.series.xAxis;\n plotX += point.plotX + (!inverted && xAxis ? xAxis.left - plotLeft : 0);\n plotY += (point.plotLow ? (point.plotLow + point.plotHigh) / 2 : point.plotY) +\n (!inverted && yAxis ? yAxis.top - plotTop : 0); // #1151\n });\n\n plotX /= points.length;\n plotY /= points.length;\n\n ret = [\n inverted ? chart.plotWidth - plotY : plotX,\n this.shared && !inverted && points.length > 1 && mouseEvent ?\n mouseEvent.chartY - plotTop : // place shared tooltip next to the mouse (#424)\n inverted ? chart.plotHeight - plotX : plotY\n ];\n }\n\n return map(ret, mathRound);\n },\n\n /**\n * Place the tooltip in a chart without spilling over\n * and not covering the point it self.\n */\n getPosition: function (boxWidth, boxHeight, point) {\n\n var chart = this.chart,\n distance = this.distance,\n ret = {},\n h = point.h || 0, // #4117\n swapped,\n first = ['y', chart.chartHeight, boxHeight, point.plotY + chart.plotTop, chart.plotTop, chart.plotTop + chart.plotHeight],\n second = ['x', chart.chartWidth, boxWidth, point.plotX + chart.plotLeft, chart.plotLeft, chart.plotLeft + chart.plotWidth],\n // The far side is right or bottom\n preferFarSide = !this.followPointer && pick(point.ttBelow, !chart.inverted === !!point.negative), // #4984\n /**\n * Handle the preferred dimension. When the preferred dimension is tooltip\n * on top or bottom of the point, it will look for space there.\n */\n firstDimension = function (dim, outerSize, innerSize, point, min, max) {\n var roomLeft = innerSize < point - distance,\n roomRight = point + distance + innerSize < outerSize,\n alignedLeft = point - distance - innerSize,\n alignedRight = point + distance;\n\n if (preferFarSide && roomRight) {\n ret[dim] = alignedRight;\n } else if (!preferFarSide && roomLeft) {\n ret[dim] = alignedLeft;\n } else if (roomLeft) {\n ret[dim] = mathMin(max - innerSize, alignedLeft - h < 0 ? alignedLeft : alignedLeft - h);\n } else if (roomRight) {\n ret[dim] = mathMax(min, alignedRight + h + innerSize > outerSize ? alignedRight : alignedRight + h);\n } else {\n return false;\n }\n },\n /**\n * Handle the secondary dimension. If the preferred dimension is tooltip\n * on top or bottom of the point, the second dimension is to align the tooltip\n * above the point, trying to align center but allowing left or right\n * align within the chart box.\n */\n secondDimension = function (dim, outerSize, innerSize, point) {\n var retVal;\n\n // Too close to the edge, return false and swap dimensions\n if (point < distance || point > outerSize - distance) {\n retVal = false;\n // Align left/top\n } else if (point < innerSize / 2) {\n ret[dim] = 1;\n // Align right/bottom\n } else if (point > outerSize - innerSize / 2) {\n ret[dim] = outerSize - innerSize - 2;\n // Align center\n } else {\n ret[dim] = point - innerSize / 2;\n }\n return retVal;\n },\n /**\n * Swap the dimensions\n */\n swap = function (count) {\n var temp = first;\n first = second;\n second = temp;\n swapped = count;\n },\n run = function () {\n if (firstDimension.apply(0, first) !== false) {\n if (secondDimension.apply(0, second) === false && !swapped) {\n swap(true);\n run();\n }\n } else if (!swapped) {\n swap(true);\n run();\n } else {\n ret.x = ret.y = 0;\n }\n };\n\n // Under these conditions, prefer the tooltip on the side of the point\n if (chart.inverted || this.len > 1) {\n swap();\n }\n run();\n\n return ret;\n\n },\n\n /**\n * In case no user defined formatter is given, this will be used. Note that the context\n * here is an object holding point, series, x, y etc.\n */\n defaultFormatter: function (tooltip) {\n var items = this.points || splat(this),\n s;\n\n // build the header\n s = [tooltip.tooltipFooterHeaderFormatter(items[0])]; //#3397: abstraction to enable formatting of footer and header\n\n // build the values\n s = s.concat(tooltip.bodyFormatter(items));\n\n // footer\n s.push(tooltip.tooltipFooterHeaderFormatter(items[0], true)); //#3397: abstraction to enable formatting of footer and header\n\n return s.join('');\n },\n\n /**\n * Refresh the tooltip's text and position.\n * @param {Object} point\n */\n refresh: function (point, mouseEvent) {\n var tooltip = this,\n chart = tooltip.chart,\n label = tooltip.label,\n options = tooltip.options,\n x,\n y,\n anchor,\n textConfig = {},\n text,\n pointConfig = [],\n formatter = options.formatter || tooltip.defaultFormatter,\n hoverPoints = chart.hoverPoints,\n borderColor,\n shared = tooltip.shared,\n currentSeries;\n\n clearTimeout(this.hideTimer);\n\n // get the reference point coordinates (pie charts use tooltipPos)\n tooltip.followPointer = splat(point)[0].series.tooltipOptions.followPointer;\n anchor = tooltip.getAnchor(point, mouseEvent);\n x = anchor[0];\n y = anchor[1];\n\n // shared tooltip, array is sent over\n if (shared && !(point.series && point.series.noSharedTooltip)) {\n\n // hide previous hoverPoints and set new\n\n chart.hoverPoints = point;\n if (hoverPoints) {\n each(hoverPoints, function (point) {\n point.setState();\n });\n }\n\n each(point, function (item) {\n item.setState(HOVER_STATE);\n\n pointConfig.push(item.getLabelConfig());\n });\n\n textConfig = {\n x: point[0].category,\n y: point[0].y\n };\n textConfig.points = pointConfig;\n this.len = pointConfig.length;\n point = point[0];\n\n // single point tooltip\n } else {\n textConfig = point.getLabelConfig();\n }\n text = formatter.call(textConfig, tooltip);\n\n // register the current series\n currentSeries = point.series;\n this.distance = pick(currentSeries.tooltipOptions.distance, 16);\n\n // update the inner HTML\n if (text === false) {\n this.hide();\n } else {\n\n // show it\n if (tooltip.isHidden) {\n stop(label);\n label.attr('opacity', 1).show();\n }\n\n // update text\n label.attr({\n text: text\n });\n\n // set the stroke color of the box\n borderColor = options.borderColor || point.color || currentSeries.color || '#606060';\n label.attr({\n stroke: borderColor\n });\n tooltip.updatePosition({\n plotX: x,\n plotY: y,\n negative: point.negative,\n ttBelow: point.ttBelow,\n h: anchor[2] || 0\n });\n\n this.isHidden = false;\n }\n fireEvent(chart, 'tooltipRefresh', {\n text: text,\n x: x + chart.plotLeft,\n y: y + chart.plotTop,\n borderColor: borderColor\n });\n },\n\n /**\n * Find the new position and perform the move\n */\n updatePosition: function (point) {\n var chart = this.chart,\n label = this.label,\n pos = (this.options.positioner || this.getPosition).call(\n this,\n label.width,\n label.height,\n point\n );\n\n // do the move\n this.move(\n mathRound(pos.x),\n mathRound(pos.y || 0), // can be undefined (#3977)\n point.plotX + chart.plotLeft,\n point.plotY + chart.plotTop\n );\n },\n\n /**\n * Get the best X date format based on the closest point range on the axis.\n */\n getXDateFormat: function (point, options, xAxis) {\n var xDateFormat,\n dateTimeLabelFormats = options.dateTimeLabelFormats,\n closestPointRange = xAxis && xAxis.closestPointRange,\n n,\n blank = '01-01 00:00:00.000',\n strpos = {\n millisecond: 15,\n second: 12,\n minute: 9,\n hour: 6,\n day: 3\n },\n date,\n lastN = 'millisecond'; // for sub-millisecond data, #4223\n\n if (closestPointRange) {\n date = dateFormat('%m-%d %H:%M:%S.%L', point.x);\n for (n in timeUnits) {\n\n // If the range is exactly one week and we're looking at a Sunday/Monday, go for the week format\n if (closestPointRange === timeUnits.week && +dateFormat('%w', point.x) === xAxis.options.startOfWeek &&\n date.substr(6) === blank.substr(6)) {\n n = 'week';\n break;\n }\n\n // The first format that is too great for the range\n if (timeUnits[n] > closestPointRange) {\n n = lastN;\n break;\n }\n\n // If the point is placed every day at 23:59, we need to show\n // the minutes as well. #2637.\n if (strpos[n] && date.substr(strpos[n]) !== blank.substr(strpos[n])) {\n break;\n }\n\n // Weeks are outside the hierarchy, only apply them on Mondays/Sundays like in the first condition\n if (n !== 'week') {\n lastN = n;\n }\n }\n\n if (n) {\n xDateFormat = dateTimeLabelFormats[n];\n }\n } else {\n xDateFormat = dateTimeLabelFormats.day;\n }\n\n return xDateFormat || dateTimeLabelFormats.year; // #2546, 2581\n },\n\n /**\n * Format the footer/header of the tooltip\n * #3397: abstraction to enable formatting of footer and header\n */\n tooltipFooterHeaderFormatter: function (labelConfig, isFooter) {\n var footOrHead = isFooter ? 'footer' : 'header',\n series = labelConfig.series,\n tooltipOptions = series.tooltipOptions,\n xDateFormat = tooltipOptions.xDateFormat,\n xAxis = series.xAxis,\n isDateTime = xAxis && xAxis.options.type === 'datetime' && isNumber(labelConfig.key),\n formatString = tooltipOptions[footOrHead + 'Format'];\n\n // Guess the best date format based on the closest point distance (#568, #3418)\n if (isDateTime && !xDateFormat) {\n xDateFormat = this.getXDateFormat(labelConfig, tooltipOptions, xAxis);\n }\n\n // Insert the footer date format if any\n if (isDateTime && xDateFormat) {\n formatString = formatString.replace('{point.key}', '{point.key:' + xDateFormat + '}');\n }\n\n return format(formatString, {\n point: labelConfig,\n series: series\n });\n },\n\n /**\n * Build the body (lines) of the tooltip by iterating over the items and returning one entry for each item,\n * abstracting this functionality allows to easily overwrite and extend it.\n */\n bodyFormatter: function (items) {\n return map(items, function (item) {\n var tooltipOptions = item.series.tooltipOptions;\n return (tooltipOptions.pointFormatter || item.point.tooltipFormatter).call(item.point, tooltipOptions.pointFormat);\n });\n }\n\n };\n\n var hoverChartIndex;\n\n // Global flag for touch support\n hasTouch = doc && doc.documentElement.ontouchstart !== UNDEFINED;\n\n /**\n * The mouse tracker object. All methods starting with \"on\" are primary DOM event handlers.\n * Subsequent methods should be named differently from what they are doing.\n * @param {Object} chart The Chart instance\n * @param {Object} options The root options object\n */\n var Pointer = Highcharts.Pointer = function (chart, options) {\n this.init(chart, options);\n };\n\n Pointer.prototype = {\n /**\n * Initialize Pointer\n */\n init: function (chart, options) {\n\n var chartOptions = options.chart,\n chartEvents = chartOptions.events,\n zoomType = useCanVG ? '' : chartOptions.zoomType,\n inverted = chart.inverted,\n zoomX,\n zoomY;\n\n // Store references\n this.options = options;\n this.chart = chart;\n\n // Zoom status\n this.zoomX = zoomX = /x/.test(zoomType);\n this.zoomY = zoomY = /y/.test(zoomType);\n this.zoomHor = (zoomX && !inverted) || (zoomY && inverted);\n this.zoomVert = (zoomY && !inverted) || (zoomX && inverted);\n this.hasZoom = zoomX || zoomY;\n\n // Do we need to handle click on a touch device?\n this.runChartClick = chartEvents && !!chartEvents.click;\n\n this.pinchDown = [];\n this.lastValidTouch = {};\n\n if (Highcharts.Tooltip && options.tooltip.enabled) {\n chart.tooltip = new Tooltip(chart, options.tooltip);\n this.followTouchMove = pick(options.tooltip.followTouchMove, true);\n }\n\n this.setDOMEvents();\n },\n\n /**\n * Add crossbrowser support for chartX and chartY\n * @param {Object} e The event object in standard browsers\n */\n normalize: function (e, chartPosition) {\n var chartX,\n chartY,\n ePos;\n\n // IE normalizing\n e = e || win.event;\n if (!e.target) {\n e.target = e.srcElement;\n }\n\n // iOS (#2757)\n ePos = e.touches ? (e.touches.length ? e.touches.item(0) : e.changedTouches[0]) : e;\n\n // Get mouse position\n if (!chartPosition) {\n this.chartPosition = chartPosition = offset(this.chart.container);\n }\n\n // chartX and chartY\n if (ePos.pageX === UNDEFINED) { // IE < 9. #886.\n chartX = mathMax(e.x, e.clientX - chartPosition.left); // #2005, #2129: the second case is\n // for IE10 quirks mode within framesets\n chartY = e.y;\n } else {\n chartX = ePos.pageX - chartPosition.left;\n chartY = ePos.pageY - chartPosition.top;\n }\n\n return extend(e, {\n chartX: mathRound(chartX),\n chartY: mathRound(chartY)\n });\n },\n\n /**\n * Get the click position in terms of axis values.\n *\n * @param {Object} e A pointer event\n */\n getCoordinates: function (e) {\n var coordinates = {\n xAxis: [],\n yAxis: []\n };\n\n each(this.chart.axes, function (axis) {\n coordinates[axis.isXAxis ? 'xAxis' : 'yAxis'].push({\n axis: axis,\n value: axis.toValue(e[axis.horiz ? 'chartX' : 'chartY'])\n });\n });\n return coordinates;\n },\n\n /**\n * With line type charts with a single tracker, get the point closest to the mouse.\n * Run Point.onMouseOver and display tooltip for the point or points.\n */\n runPointActions: function (e) {\n\n var pointer = this,\n chart = pointer.chart,\n series = chart.series,\n tooltip = chart.tooltip,\n shared = tooltip ? tooltip.shared : false,\n followPointer,\n hoverPoint = chart.hoverPoint,\n hoverSeries = chart.hoverSeries,\n i,\n distance = [Number.MAX_VALUE, Number.MAX_VALUE], // #4511\n anchor,\n noSharedTooltip,\n stickToHoverSeries,\n directTouch,\n kdpoints = [],\n kdpoint = [],\n kdpointT;\n\n // For hovering over the empty parts of the plot area (hoverSeries is undefined).\n // If there is one series with point tracking (combo chart), don't go to nearest neighbour.\n if (!shared && !hoverSeries) {\n for (i = 0; i < series.length; i++) {\n if (series[i].directTouch || !series[i].options.stickyTracking) {\n series = [];\n }\n }\n }\n\n // If it has a hoverPoint and that series requires direct touch (like columns, #3899), or we're on\n // a noSharedTooltip series among shared tooltip series (#4546), use the hoverPoint . Otherwise,\n // search the k-d tree.\n stickToHoverSeries = hoverSeries && (shared ? hoverSeries.noSharedTooltip : hoverSeries.directTouch);\n if (stickToHoverSeries && hoverPoint) {\n kdpoint = [hoverPoint];\n\n // Handle shared tooltip or cases where a series is not yet hovered\n } else {\n // Find nearest points on all series\n each(series, function (s) {\n // Skip hidden series\n noSharedTooltip = s.noSharedTooltip && shared;\n directTouch = !shared && s.directTouch;\n if (s.visible && !noSharedTooltip && !directTouch && pick(s.options.enableMouseTracking, true)) { // #3821\n kdpointT = s.searchPoint(e, !noSharedTooltip && s.kdDimensions === 1); // #3828\n if (kdpointT && kdpointT.series) { // Point.series becomes null when reset and before redraw (#5197)\n kdpoints.push(kdpointT);\n }\n }\n });\n // Find absolute nearest point\n each(kdpoints, function (p) {\n if (p) {\n // Store both closest points, using point.dist and point.distX comparisons (#4645):\n each(['dist', 'distX'], function (dist, k) {\n if (isNumber(p[dist])) {\n var\n // It is closer than the reference point\n isCloser = p[dist] < distance[k],\n // It is equally close, but above the reference point (#4679)\n isAbove = p[dist] === distance[k] && p.series.group.zIndex >= kdpoint[k].series.group.zIndex;\n\n if (isCloser || isAbove) {\n distance[k] = p[dist];\n kdpoint[k] = p;\n }\n }\n });\n }\n });\n }\n\n // Remove points with different x-positions, required for shared tooltip and crosshairs (#4645):\n if (shared) {\n i = kdpoints.length;\n while (i--) {\n if (kdpoints[i].clientX !== kdpoint[1].clientX || kdpoints[i].series.noSharedTooltip) {\n kdpoints.splice(i, 1);\n }\n }\n }\n\n // Refresh tooltip for kdpoint if new hover point or tooltip was hidden // #3926, #4200\n if (kdpoint[0] && (kdpoint[0] !== this.prevKDPoint || (tooltip && tooltip.isHidden))) {\n // Draw tooltip if necessary\n if (shared && !kdpoint[0].series.noSharedTooltip) {\n if (kdpoints.length && tooltip) {\n tooltip.refresh(kdpoints, e);\n }\n\n // Do mouseover on all points (#3919, #3985, #4410)\n each(kdpoints, function (point) {\n point.onMouseOver(e, point !== ((hoverSeries && hoverSeries.directTouch && hoverPoint) || kdpoint[0]));\n });\n this.prevKDPoint = kdpoint[1];\n } else {\n if (tooltip) {\n tooltip.refresh(kdpoint[0], e);\n }\n if (!hoverSeries || !hoverSeries.directTouch) { // #4448\n kdpoint[0].onMouseOver(e);\n }\n this.prevKDPoint = kdpoint[0];\n }\n\n // Update positions (regardless of kdpoint or hoverPoint)\n } else {\n followPointer = hoverSeries && hoverSeries.tooltipOptions.followPointer;\n if (tooltip && followPointer && !tooltip.isHidden) {\n anchor = tooltip.getAnchor([{}], e);\n tooltip.updatePosition({ plotX: anchor[0], plotY: anchor[1] });\n }\n }\n\n // Start the event listener to pick up the tooltip and crosshairs\n if (!pointer._onDocumentMouseMove) {\n pointer._onDocumentMouseMove = function (e) {\n if (charts[hoverChartIndex]) {\n charts[hoverChartIndex].pointer.onDocumentMouseMove(e);\n }\n };\n addEvent(doc, 'mousemove', pointer._onDocumentMouseMove);\n }\n\n // Crosshair. For each hover point, loop over axes and draw cross if that point\n // belongs to the axis (#4927).\n each(shared ? kdpoints : [pick(hoverPoint, kdpoint[1])], function (point) { // #5269\n each(chart.axes, function (axis) {\n // In case of snap = false, point is undefined, and we draw the crosshair anyway (#5066)\n if (!point || point.series[axis.coll] === axis) {\n axis.drawCrosshair(e, point);\n }\n });\n });\n },\n\n /**\n * Reset the tracking by hiding the tooltip, the hover series state and the hover point\n *\n * @param allowMove {Boolean} Instead of destroying the tooltip altogether, allow moving it if possible\n */\n reset: function (allowMove, delay) {\n var pointer = this,\n chart = pointer.chart,\n hoverSeries = chart.hoverSeries,\n hoverPoint = chart.hoverPoint,\n hoverPoints = chart.hoverPoints,\n tooltip = chart.tooltip,\n tooltipPoints = tooltip && tooltip.shared ? hoverPoints : hoverPoint;\n\n // Check if the points have moved outside the plot area (#1003, #4736, #5101)\n if (allowMove && tooltipPoints) {\n each(splat(tooltipPoints), function (point) {\n if (point.series.isCartesian && point.plotX === undefined) {\n allowMove = false;\n }\n });\n }\n \n // Just move the tooltip, #349\n if (allowMove) {\n if (tooltip && tooltipPoints) {\n tooltip.refresh(tooltipPoints);\n if (hoverPoint) { // #2500\n hoverPoint.setState(hoverPoint.state, true);\n each(chart.axes, function (axis) {\n if (axis.crosshair) {\n axis.drawCrosshair(null, hoverPoint);\n }\n });\n }\n }\n\n // Full reset\n } else {\n\n if (hoverPoint) {\n hoverPoint.onMouseOut();\n }\n\n if (hoverPoints) {\n each(hoverPoints, function (point) {\n point.setState();\n });\n }\n\n if (hoverSeries) {\n hoverSeries.onMouseOut();\n }\n\n if (tooltip) {\n tooltip.hide(delay);\n }\n\n if (pointer._onDocumentMouseMove) {\n removeEvent(doc, 'mousemove', pointer._onDocumentMouseMove);\n pointer._onDocumentMouseMove = null;\n }\n\n // Remove crosshairs\n each(chart.axes, function (axis) {\n axis.hideCrosshair();\n });\n\n pointer.hoverX = pointer.prevKDPoint = chart.hoverPoints = chart.hoverPoint = null;\n }\n },\n\n /**\n * Scale series groups to a certain scale and translation\n */\n scaleGroups: function (attribs, clip) {\n\n var chart = this.chart,\n seriesAttribs;\n\n // Scale each series\n each(chart.series, function (series) {\n seriesAttribs = attribs || series.getPlotBox(); // #1701\n if (series.xAxis && series.xAxis.zoomEnabled) {\n series.group.attr(seriesAttribs);\n if (series.markerGroup) {\n series.markerGroup.attr(seriesAttribs);\n series.markerGroup.clip(clip ? chart.clipRect : null);\n }\n if (series.dataLabelsGroup) {\n series.dataLabelsGroup.attr(seriesAttribs);\n }\n }\n });\n\n // Clip\n chart.clipRect.attr(clip || chart.clipBox);\n },\n\n /**\n * Start a drag operation\n */\n dragStart: function (e) {\n var chart = this.chart;\n\n // Record the start position\n chart.mouseIsDown = e.type;\n chart.cancelClick = false;\n chart.mouseDownX = this.mouseDownX = e.chartX;\n chart.mouseDownY = this.mouseDownY = e.chartY;\n },\n\n /**\n * Perform a drag operation in response to a mousemove event while the mouse is down\n */\n drag: function (e) {\n\n var chart = this.chart,\n chartOptions = chart.options.chart,\n chartX = e.chartX,\n chartY = e.chartY,\n zoomHor = this.zoomHor,\n zoomVert = this.zoomVert,\n plotLeft = chart.plotLeft,\n plotTop = chart.plotTop,\n plotWidth = chart.plotWidth,\n plotHeight = chart.plotHeight,\n clickedInside,\n size,\n selectionMarker = this.selectionMarker,\n mouseDownX = this.mouseDownX,\n mouseDownY = this.mouseDownY,\n panKey = chartOptions.panKey && e[chartOptions.panKey + 'Key'];\n\n // If the device supports both touch and mouse (like IE11), and we are touch-dragging\n // inside the plot area, don't handle the mouse event. #4339.\n if (selectionMarker && selectionMarker.touch) {\n return;\n }\n\n // If the mouse is outside the plot area, adjust to cooordinates\n // inside to prevent the selection marker from going outside\n if (chartX < plotLeft) {\n chartX = plotLeft;\n } else if (chartX > plotLeft + plotWidth) {\n chartX = plotLeft + plotWidth;\n }\n\n if (chartY < plotTop) {\n chartY = plotTop;\n } else if (chartY > plotTop + plotHeight) {\n chartY = plotTop + plotHeight;\n }\n\n // determine if the mouse has moved more than 10px\n this.hasDragged = Math.sqrt(\n Math.pow(mouseDownX - chartX, 2) +\n Math.pow(mouseDownY - chartY, 2)\n );\n\n if (this.hasDragged > 10) {\n clickedInside = chart.isInsidePlot(mouseDownX - plotLeft, mouseDownY - plotTop);\n\n // make a selection\n if (chart.hasCartesianSeries && (this.zoomX || this.zoomY) && clickedInside && !panKey) {\n if (!selectionMarker) {\n this.selectionMarker = selectionMarker = chart.renderer.rect(\n plotLeft,\n plotTop,\n zoomHor ? 1 : plotWidth,\n zoomVert ? 1 : plotHeight,\n 0\n )\n .attr({\n fill: chartOptions.selectionMarkerFill || 'rgba(69,114,167,0.25)',\n zIndex: 7\n })\n .add();\n }\n }\n\n // adjust the width of the selection marker\n if (selectionMarker && zoomHor) {\n size = chartX - mouseDownX;\n selectionMarker.attr({\n width: mathAbs(size),\n x: (size > 0 ? 0 : size) + mouseDownX\n });\n }\n // adjust the height of the selection marker\n if (selectionMarker && zoomVert) {\n size = chartY - mouseDownY;\n selectionMarker.attr({\n height: mathAbs(size),\n y: (size > 0 ? 0 : size) + mouseDownY\n });\n }\n\n // panning\n if (clickedInside && !selectionMarker && chartOptions.panning) {\n chart.pan(e, chartOptions.panning);\n }\n }\n },\n\n /**\n * On mouse up or touch end across the entire document, drop the selection.\n */\n drop: function (e) {\n var pointer = this,\n chart = this.chart,\n hasPinched = this.hasPinched;\n\n if (this.selectionMarker) {\n var selectionData = {\n originalEvent: e, // #4890\n xAxis: [],\n yAxis: []\n },\n selectionBox = this.selectionMarker,\n selectionLeft = selectionBox.attr ? selectionBox.attr('x') : selectionBox.x,\n selectionTop = selectionBox.attr ? selectionBox.attr('y') : selectionBox.y,\n selectionWidth = selectionBox.attr ? selectionBox.attr('width') : selectionBox.width,\n selectionHeight = selectionBox.attr ? selectionBox.attr('height') : selectionBox.height,\n runZoom;\n\n // a selection has been made\n if (this.hasDragged || hasPinched) {\n\n // record each axis' min and max\n each(chart.axes, function (axis) {\n if (axis.zoomEnabled && defined(axis.min) && (hasPinched || pointer[{ xAxis: 'zoomX', yAxis: 'zoomY' }[axis.coll]])) { // #859, #3569\n var horiz = axis.horiz,\n minPixelPadding = e.type === 'touchend' ? axis.minPixelPadding : 0, // #1207, #3075\n selectionMin = axis.toValue((horiz ? selectionLeft : selectionTop) + minPixelPadding),\n selectionMax = axis.toValue((horiz ? selectionLeft + selectionWidth : selectionTop + selectionHeight) - minPixelPadding);\n\n selectionData[axis.coll].push({\n axis: axis,\n min: mathMin(selectionMin, selectionMax), // for reversed axes\n max: mathMax(selectionMin, selectionMax)\n });\n runZoom = true;\n }\n });\n if (runZoom) {\n fireEvent(chart, 'selection', selectionData, function (args) {\n chart.zoom(extend(args, hasPinched ? { animation: false } : null));\n });\n }\n\n }\n this.selectionMarker = this.selectionMarker.destroy();\n\n // Reset scaling preview\n if (hasPinched) {\n this.scaleGroups();\n }\n }\n\n // Reset all\n if (chart) { // it may be destroyed on mouse up - #877\n css(chart.container, { cursor: chart._cursor });\n chart.cancelClick = this.hasDragged > 10; // #370\n chart.mouseIsDown = this.hasDragged = this.hasPinched = false;\n this.pinchDown = [];\n }\n },\n\n onContainerMouseDown: function (e) {\n\n e = this.normalize(e);\n\n // issue #295, dragging not always working in Firefox\n if (e.preventDefault) {\n e.preventDefault();\n }\n\n this.dragStart(e);\n },\n\n\n\n onDocumentMouseUp: function (e) {\n if (charts[hoverChartIndex]) {\n charts[hoverChartIndex].pointer.drop(e);\n }\n },\n\n /**\n * Special handler for mouse move that will hide the tooltip when the mouse leaves the plotarea.\n * Issue #149 workaround. The mouseleave event does not always fire.\n */\n onDocumentMouseMove: function (e) {\n var chart = this.chart,\n chartPosition = this.chartPosition;\n\n e = this.normalize(e, chartPosition);\n\n // If we're outside, hide the tooltip\n if (chartPosition && !this.inClass(e.target, 'highcharts-tracker') &&\n !chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {\n this.reset();\n }\n },\n\n /**\n * When mouse leaves the container, hide the tooltip.\n */\n onContainerMouseLeave: function (e) {\n var chart = charts[hoverChartIndex];\n if (chart && (e.relatedTarget || e.toElement)) { // #4886, MS Touch end fires mouseleave but with no related target\n chart.pointer.reset();\n chart.pointer.chartPosition = null; // also reset the chart position, used in #149 fix\n }\n },\n\n // The mousemove, touchmove and touchstart event handler\n onContainerMouseMove: function (e) {\n\n var chart = this.chart;\n\n if (!defined(hoverChartIndex) || !charts[hoverChartIndex] || !charts[hoverChartIndex].mouseIsDown) {\n hoverChartIndex = chart.index;\n }\n\n e = this.normalize(e);\n e.returnValue = false; // #2251, #3224\n\n if (chart.mouseIsDown === 'mousedown') {\n this.drag(e);\n }\n\n // Show the tooltip and run mouse over events (#977)\n if ((this.inClass(e.target, 'highcharts-tracker') ||\n chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) && !chart.openMenu) {\n this.runPointActions(e);\n }\n },\n\n /**\n * Utility to detect whether an element has, or has a parent with, a specific\n * class name. Used on detection of tracker objects and on deciding whether\n * hovering the tooltip should cause the active series to mouse out.\n */\n inClass: function (element, className) {\n var elemClassName;\n while (element) {\n elemClassName = attr(element, 'class');\n if (elemClassName) {\n if (elemClassName.indexOf(className) !== -1) {\n return true;\n }\n if (elemClassName.indexOf(PREFIX + 'container') !== -1) {\n return false;\n }\n }\n element = element.parentNode;\n }\n },\n\n onTrackerMouseOut: function (e) {\n var series = this.chart.hoverSeries,\n relatedTarget = e.relatedTarget || e.toElement;\n\n if (series && relatedTarget && !series.options.stickyTracking && // #4886\n !this.inClass(relatedTarget, PREFIX + 'tooltip') &&\n !this.inClass(relatedTarget, PREFIX + 'series-' + series.index)) { // #2499, #4465\n series.onMouseOut();\n }\n },\n\n onContainerClick: function (e) {\n var chart = this.chart,\n hoverPoint = chart.hoverPoint,\n plotLeft = chart.plotLeft,\n plotTop = chart.plotTop;\n\n e = this.normalize(e);\n\n if (!chart.cancelClick) {\n\n // On tracker click, fire the series and point events. #783, #1583\n if (hoverPoint && this.inClass(e.target, PREFIX + 'tracker')) {\n\n // the series click event\n fireEvent(hoverPoint.series, 'click', extend(e, {\n point: hoverPoint\n }));\n\n // the point click event\n if (chart.hoverPoint) { // it may be destroyed (#1844)\n hoverPoint.firePointEvent('click', e);\n }\n\n // When clicking outside a tracker, fire a chart event\n } else {\n extend(e, this.getCoordinates(e));\n\n // fire a click event in the chart\n if (chart.isInsidePlot(e.chartX - plotLeft, e.chartY - plotTop)) {\n fireEvent(chart, 'click', e);\n }\n }\n\n\n }\n },\n\n /**\n * Set the JS DOM events on the container and document. This method should contain\n * a one-to-one assignment between methods and their handlers. Any advanced logic should\n * be moved to the handler reflecting the event's name.\n */\n setDOMEvents: function () {\n\n var pointer = this,\n container = pointer.chart.container;\n\n container.onmousedown = function (e) {\n pointer.onContainerMouseDown(e);\n };\n container.onmousemove = function (e) {\n pointer.onContainerMouseMove(e);\n };\n container.onclick = function (e) {\n pointer.onContainerClick(e);\n };\n addEvent(container, 'mouseleave', pointer.onContainerMouseLeave);\n if (chartCount === 1) {\n addEvent(doc, 'mouseup', pointer.onDocumentMouseUp);\n }\n if (hasTouch) {\n container.ontouchstart = function (e) {\n pointer.onContainerTouchStart(e);\n };\n container.ontouchmove = function (e) {\n pointer.onContainerTouchMove(e);\n };\n if (chartCount === 1) {\n addEvent(doc, 'touchend', pointer.onDocumentTouchEnd);\n }\n }\n\n },\n\n /**\n * Destroys the Pointer object and disconnects DOM events.\n */\n destroy: function () {\n var prop;\n\n removeEvent(this.chart.container, 'mouseleave', this.onContainerMouseLeave);\n if (!chartCount) {\n removeEvent(doc, 'mouseup', this.onDocumentMouseUp);\n removeEvent(doc, 'touchend', this.onDocumentTouchEnd);\n }\n\n // memory and CPU leak\n clearInterval(this.tooltipTimeout);\n\n for (prop in this) {\n this[prop] = null;\n }\n }\n };\n\n\n /* Support for touch devices */\n extend(Highcharts.Pointer.prototype, {\n\n /**\n * Run translation operations\n */\n pinchTranslate: function (pinchDown, touches, transform, selectionMarker, clip, lastValidTouch) {\n if (this.zoomHor || this.pinchHor) {\n this.pinchTranslateDirection(true, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n }\n if (this.zoomVert || this.pinchVert) {\n this.pinchTranslateDirection(false, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n }\n },\n\n /**\n * Run translation operations for each direction (horizontal and vertical) independently\n */\n pinchTranslateDirection: function (horiz, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch, forcedScale) {\n var chart = this.chart,\n xy = horiz ? 'x' : 'y',\n XY = horiz ? 'X' : 'Y',\n sChartXY = 'chart' + XY,\n wh = horiz ? 'width' : 'height',\n plotLeftTop = chart['plot' + (horiz ? 'Left' : 'Top')],\n selectionWH,\n selectionXY,\n clipXY,\n scale = forcedScale || 1,\n inverted = chart.inverted,\n bounds = chart.bounds[horiz ? 'h' : 'v'],\n singleTouch = pinchDown.length === 1,\n touch0Start = pinchDown[0][sChartXY],\n touch0Now = touches[0][sChartXY],\n touch1Start = !singleTouch && pinchDown[1][sChartXY],\n touch1Now = !singleTouch && touches[1][sChartXY],\n outOfBounds,\n transformScale,\n scaleKey,\n setScale = function () {\n if (!singleTouch && mathAbs(touch0Start - touch1Start) > 20) { // Don't zoom if fingers are too close on this axis\n scale = forcedScale || mathAbs(touch0Now - touch1Now) / mathAbs(touch0Start - touch1Start);\n }\n\n clipXY = ((plotLeftTop - touch0Now) / scale) + touch0Start;\n selectionWH = chart['plot' + (horiz ? 'Width' : 'Height')] / scale;\n };\n\n // Set the scale, first pass\n setScale();\n\n selectionXY = clipXY; // the clip position (x or y) is altered if out of bounds, the selection position is not\n\n // Out of bounds\n if (selectionXY < bounds.min) {\n selectionXY = bounds.min;\n outOfBounds = true;\n } else if (selectionXY + selectionWH > bounds.max) {\n selectionXY = bounds.max - selectionWH;\n outOfBounds = true;\n }\n\n // Is the chart dragged off its bounds, determined by dataMin and dataMax?\n if (outOfBounds) {\n\n // Modify the touchNow position in order to create an elastic drag movement. This indicates\n // to the user that the chart is responsive but can't be dragged further.\n touch0Now -= 0.8 * (touch0Now - lastValidTouch[xy][0]);\n if (!singleTouch) {\n touch1Now -= 0.8 * (touch1Now - lastValidTouch[xy][1]);\n }\n\n // Set the scale, second pass to adapt to the modified touchNow positions\n setScale();\n\n } else {\n lastValidTouch[xy] = [touch0Now, touch1Now];\n }\n\n // Set geometry for clipping, selection and transformation\n if (!inverted) {\n clip[xy] = clipXY - plotLeftTop;\n clip[wh] = selectionWH;\n }\n scaleKey = inverted ? (horiz ? 'scaleY' : 'scaleX') : 'scale' + XY;\n transformScale = inverted ? 1 / scale : scale;\n\n selectionMarker[wh] = selectionWH;\n selectionMarker[xy] = selectionXY;\n transform[scaleKey] = scale;\n transform['translate' + XY] = (transformScale * plotLeftTop) + (touch0Now - (transformScale * touch0Start));\n },\n\n /**\n * Handle touch events with two touches\n */\n pinch: function (e) {\n\n var self = this,\n chart = self.chart,\n pinchDown = self.pinchDown,\n touches = e.touches,\n touchesLength = touches.length,\n lastValidTouch = self.lastValidTouch,\n hasZoom = self.hasZoom,\n selectionMarker = self.selectionMarker,\n transform = {},\n fireClickEvent = touchesLength === 1 && ((self.inClass(e.target, PREFIX + 'tracker') &&\n chart.runTrackerClick) || self.runChartClick),\n clip = {};\n\n // Don't initiate panning until the user has pinched. This prevents us from\n // blocking page scrolling as users scroll down a long page (#4210).\n if (touchesLength > 1) {\n self.initiated = true;\n }\n\n // On touch devices, only proceed to trigger click if a handler is defined\n if (hasZoom && self.initiated && !fireClickEvent) {\n e.preventDefault();\n }\n\n // Normalize each touch\n map(touches, function (e) {\n return self.normalize(e);\n });\n\n // Register the touch start position\n if (e.type === 'touchstart') {\n each(touches, function (e, i) {\n pinchDown[i] = { chartX: e.chartX, chartY: e.chartY };\n });\n lastValidTouch.x = [pinchDown[0].chartX, pinchDown[1] && pinchDown[1].chartX];\n lastValidTouch.y = [pinchDown[0].chartY, pinchDown[1] && pinchDown[1].chartY];\n\n // Identify the data bounds in pixels\n each(chart.axes, function (axis) {\n if (axis.zoomEnabled) {\n var bounds = chart.bounds[axis.horiz ? 'h' : 'v'],\n minPixelPadding = axis.minPixelPadding,\n min = axis.toPixels(pick(axis.options.min, axis.dataMin)),\n max = axis.toPixels(pick(axis.options.max, axis.dataMax)),\n absMin = mathMin(min, max),\n absMax = mathMax(min, max);\n\n // Store the bounds for use in the touchmove handler\n bounds.min = mathMin(axis.pos, absMin - minPixelPadding);\n bounds.max = mathMax(axis.pos + axis.len, absMax + minPixelPadding);\n }\n });\n self.res = true; // reset on next move\n\n // Event type is touchmove, handle panning and pinching\n } else if (pinchDown.length) { // can be 0 when releasing, if touchend fires first\n\n\n // Set the marker\n if (!selectionMarker) {\n self.selectionMarker = selectionMarker = extend({\n destroy: noop,\n touch: true\n }, chart.plotBox);\n }\n\n self.pinchTranslate(pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n\n self.hasPinched = hasZoom;\n\n // Scale and translate the groups to provide visual feedback during pinching\n self.scaleGroups(transform, clip);\n\n // Optionally move the tooltip on touchmove\n if (!hasZoom && self.followTouchMove && touchesLength === 1) {\n this.runPointActions(self.normalize(e));\n } else if (self.res) {\n self.res = false;\n this.reset(false, 0);\n }\n }\n },\n\n /**\n * General touch handler shared by touchstart and touchmove.\n */\n touch: function (e, start) {\n var chart = this.chart,\n hasMoved,\n pinchDown;\n\n hoverChartIndex = chart.index;\n\n if (e.touches.length === 1) {\n\n e = this.normalize(e);\n\n if (chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop) && !chart.openMenu) {\n\n // Run mouse events and display tooltip etc\n if (start) {\n this.runPointActions(e);\n }\n\n // Android fires touchmove events after the touchstart even if the\n // finger hasn't moved, or moved only a pixel or two. In iOS however,\n // the touchmove doesn't fire unless the finger moves more than ~4px.\n // So we emulate this behaviour in Android by checking how much it\n // moved, and cancelling on small distances. #3450.\n if (e.type === 'touchmove') {\n pinchDown = this.pinchDown;\n hasMoved = pinchDown[0] ? Math.sqrt( // #5266\n Math.pow(pinchDown[0].chartX - e.chartX, 2) +\n Math.pow(pinchDown[0].chartY - e.chartY, 2)\n ) >= 4 : false;\n }\n\n if (pick(hasMoved, true)) {\n this.pinch(e);\n }\n\n } else if (start) {\n // Hide the tooltip on touching outside the plot area (#1203)\n this.reset();\n }\n\n } else if (e.touches.length === 2) {\n this.pinch(e);\n }\n },\n\n onContainerTouchStart: function (e) {\n this.touch(e, true);\n },\n\n onContainerTouchMove: function (e) {\n this.touch(e);\n },\n\n onDocumentTouchEnd: function (e) {\n if (charts[hoverChartIndex]) {\n charts[hoverChartIndex].pointer.drop(e);\n }\n }\n\n });\n if (win.PointerEvent || win.MSPointerEvent) {\n\n // The touches object keeps track of the points being touched at all times\n var touches = {},\n hasPointerEvent = !!win.PointerEvent,\n getWebkitTouches = function () {\n var key,\n fake = [];\n fake.item = function (i) {\n return this[i];\n };\n for (key in touches) {\n if (touches.hasOwnProperty(key)) {\n fake.push({\n pageX: touches[key].pageX,\n pageY: touches[key].pageY,\n target: touches[key].target\n });\n }\n }\n return fake;\n },\n translateMSPointer = function (e, method, wktype, func) {\n var p;\n if ((e.pointerType === 'touch' || e.pointerType === e.MSPOINTER_TYPE_TOUCH) && charts[hoverChartIndex]) {\n func(e);\n p = charts[hoverChartIndex].pointer;\n p[method]({\n type: wktype,\n target: e.currentTarget,\n preventDefault: noop,\n touches: getWebkitTouches()\n });\n }\n };\n\n /**\n * Extend the Pointer prototype with methods for each event handler and more\n */\n extend(Pointer.prototype, {\n onContainerPointerDown: function (e) {\n translateMSPointer(e, 'onContainerTouchStart', 'touchstart', function (e) {\n touches[e.pointerId] = { pageX: e.pageX, pageY: e.pageY, target: e.currentTarget };\n });\n },\n onContainerPointerMove: function (e) {\n translateMSPointer(e, 'onContainerTouchMove', 'touchmove', function (e) {\n touches[e.pointerId] = { pageX: e.pageX, pageY: e.pageY };\n if (!touches[e.pointerId].target) {\n touches[e.pointerId].target = e.currentTarget;\n }\n });\n },\n onDocumentPointerUp: function (e) {\n translateMSPointer(e, 'onDocumentTouchEnd', 'touchend', function (e) {\n delete touches[e.pointerId];\n });\n },\n\n /**\n * Add or remove the MS Pointer specific events\n */\n batchMSEvents: function (fn) {\n fn(this.chart.container, hasPointerEvent ? 'pointerdown' : 'MSPointerDown', this.onContainerPointerDown);\n fn(this.chart.container, hasPointerEvent ? 'pointermove' : 'MSPointerMove', this.onContainerPointerMove);\n fn(doc, hasPointerEvent ? 'pointerup' : 'MSPointerUp', this.onDocumentPointerUp);\n }\n });\n\n // Disable default IE actions for pinch and such on chart element\n wrap(Pointer.prototype, 'init', function (proceed, chart, options) {\n proceed.call(this, chart, options);\n if (this.hasZoom) { // #4014\n css(chart.container, {\n '-ms-touch-action': NONE,\n 'touch-action': NONE\n });\n }\n });\n\n // Add IE specific touch events to chart\n wrap(Pointer.prototype, 'setDOMEvents', function (proceed) {\n proceed.apply(this);\n if (this.hasZoom || this.followTouchMove) {\n this.batchMSEvents(addEvent);\n }\n });\n // Destroy MS events also\n wrap(Pointer.prototype, 'destroy', function (proceed) {\n this.batchMSEvents(removeEvent);\n proceed.call(this);\n });\n }\n /**\n * The overview of the chart's series\n */\n var Legend = Highcharts.Legend = function (chart, options) {\n this.init(chart, options);\n };\n\n Legend.prototype = {\n\n /**\n * Initialize the legend\n */\n init: function (chart, options) {\n\n var legend = this,\n itemStyle = options.itemStyle,\n padding,\n itemMarginTop = options.itemMarginTop || 0;\n\n this.options = options;\n\n if (!options.enabled) {\n return;\n }\n\n legend.itemStyle = itemStyle;\n legend.itemHiddenStyle = merge(itemStyle, options.itemHiddenStyle);\n legend.itemMarginTop = itemMarginTop;\n legend.padding = padding = pick(options.padding, 8);\n legend.initialItemX = padding;\n legend.initialItemY = padding - 5; // 5 is the number of pixels above the text\n legend.maxItemWidth = 0;\n legend.chart = chart;\n legend.itemHeight = 0;\n legend.symbolWidth = pick(options.symbolWidth, 16);\n legend.pages = [];\n\n\n // Render it\n legend.render();\n\n // move checkboxes\n addEvent(legend.chart, 'endResize', function () {\n legend.positionCheckboxes();\n });\n\n },\n\n /**\n * Set the colors for the legend item\n * @param {Object} item A Series or Point instance\n * @param {Object} visible Dimmed or colored\n */\n colorizeItem: function (item, visible) {\n var legend = this,\n options = legend.options,\n legendItem = item.legendItem,\n legendLine = item.legendLine,\n legendSymbol = item.legendSymbol,\n hiddenColor = legend.itemHiddenStyle.color,\n textColor = visible ? options.itemStyle.color : hiddenColor,\n symbolColor = visible ? (item.legendColor || item.color || '#CCC') : hiddenColor,\n markerOptions = item.options && item.options.marker,\n symbolAttr = { fill: symbolColor },\n key,\n val;\n\n if (legendItem) {\n legendItem.css({ fill: textColor, color: textColor }); // color for #1553, oldIE\n }\n if (legendLine) {\n legendLine.attr({ stroke: symbolColor });\n }\n\n if (legendSymbol) {\n\n // Apply marker options\n if (markerOptions && legendSymbol.isMarker) { // #585\n symbolAttr.stroke = symbolColor;\n markerOptions = item.convertAttribs(markerOptions);\n for (key in markerOptions) {\n val = markerOptions[key];\n if (val !== UNDEFINED) {\n symbolAttr[key] = val;\n }\n }\n }\n\n legendSymbol.attr(symbolAttr);\n }\n },\n\n /**\n * Position the legend item\n * @param {Object} item A Series or Point instance\n */\n positionItem: function (item) {\n var legend = this,\n options = legend.options,\n symbolPadding = options.symbolPadding,\n ltr = !options.rtl,\n legendItemPos = item._legendItemPos,\n itemX = legendItemPos[0],\n itemY = legendItemPos[1],\n checkbox = item.checkbox,\n legendGroup = item.legendGroup;\n\n if (legendGroup && legendGroup.element) {\n legendGroup.translate(\n ltr ? itemX : legend.legendWidth - itemX - 2 * symbolPadding - 4,\n itemY\n );\n }\n\n if (checkbox) {\n checkbox.x = itemX;\n checkbox.y = itemY;\n }\n },\n\n /**\n * Destroy a single legend item\n * @param {Object} item The series or point\n */\n destroyItem: function (item) {\n var checkbox = item.checkbox;\n\n // destroy SVG elements\n each(['legendItem', 'legendLine', 'legendSymbol', 'legendGroup'], function (key) {\n if (item[key]) {\n item[key] = item[key].destroy();\n }\n });\n\n if (checkbox) {\n discardElement(item.checkbox);\n }\n },\n\n /**\n * Destroys the legend.\n */\n destroy: function () {\n var legend = this,\n legendGroup = legend.group,\n box = legend.box;\n\n if (box) {\n legend.box = box.destroy();\n }\n\n if (legendGroup) {\n legend.group = legendGroup.destroy();\n }\n },\n\n /**\n * Position the checkboxes after the width is determined\n */\n positionCheckboxes: function (scrollOffset) {\n var alignAttr = this.group.alignAttr,\n translateY,\n clipHeight = this.clipHeight || this.legendHeight,\n titleHeight = this.titleHeight;\n\n if (alignAttr) {\n translateY = alignAttr.translateY;\n each(this.allItems, function (item) {\n var checkbox = item.checkbox,\n top;\n\n if (checkbox) {\n top = translateY + titleHeight + checkbox.y + (scrollOffset || 0) + 3;\n css(checkbox, {\n left: (alignAttr.translateX + item.checkboxOffset + checkbox.x - 20) + PX,\n top: top + PX,\n display: top > translateY - 6 && top < translateY + clipHeight - 6 ? '' : NONE\n });\n }\n });\n }\n },\n\n /**\n * Render the legend title on top of the legend\n */\n renderTitle: function () {\n var options = this.options,\n padding = this.padding,\n titleOptions = options.title,\n titleHeight = 0,\n bBox;\n\n if (titleOptions.text) {\n if (!this.title) {\n this.title = this.chart.renderer.label(titleOptions.text, padding - 3, padding - 4, null, null, null, null, null, 'legend-title')\n .attr({ zIndex: 1 })\n .css(titleOptions.style)\n .add(this.group);\n }\n bBox = this.title.getBBox();\n titleHeight = bBox.height;\n this.offsetWidth = bBox.width; // #1717\n this.contentGroup.attr({ translateY: titleHeight });\n }\n this.titleHeight = titleHeight;\n },\n\n /**\n * Set the legend item text\n */\n setText: function (item) {\n var options = this.options;\n item.legendItem.attr({\n text: options.labelFormat ? format(options.labelFormat, item) : options.labelFormatter.call(item)\n });\n },\n\n /**\n * Render a single specific legend item\n * @param {Object} item A series or point\n */\n renderItem: function (item) {\n var legend = this,\n chart = legend.chart,\n renderer = chart.renderer,\n options = legend.options,\n horizontal = options.layout === 'horizontal',\n symbolWidth = legend.symbolWidth,\n symbolPadding = options.symbolPadding,\n itemStyle = legend.itemStyle,\n itemHiddenStyle = legend.itemHiddenStyle,\n padding = legend.padding,\n itemDistance = horizontal ? pick(options.itemDistance, 20) : 0,\n ltr = !options.rtl,\n itemHeight,\n widthOption = options.width,\n itemMarginBottom = options.itemMarginBottom || 0,\n itemMarginTop = legend.itemMarginTop,\n initialItemX = legend.initialItemX,\n bBox,\n itemWidth,\n li = item.legendItem,\n series = item.series && item.series.drawLegendSymbol ? item.series : item,\n seriesOptions = series.options,\n showCheckbox = legend.createCheckboxForItem && seriesOptions && seriesOptions.showCheckbox,\n useHTML = options.useHTML;\n\n if (!li) { // generate it once, later move it\n\n // Generate the group box\n // A group to hold the symbol and text. Text is to be appended in Legend class.\n item.legendGroup = renderer.g('legend-item')\n .attr({ zIndex: 1 })\n .add(legend.scrollGroup);\n\n // Generate the list item text and add it to the group\n item.legendItem = li = renderer.text(\n '',\n ltr ? symbolWidth + symbolPadding : -symbolPadding,\n legend.baseline || 0,\n useHTML\n )\n .css(merge(item.visible ? itemStyle : itemHiddenStyle)) // merge to prevent modifying original (#1021)\n .attr({\n align: ltr ? 'left' : 'right',\n zIndex: 2\n })\n .add(item.legendGroup);\n\n // Get the baseline for the first item - the font size is equal for all\n if (!legend.baseline) {\n legend.fontMetrics = renderer.fontMetrics(itemStyle.fontSize, li);\n legend.baseline = legend.fontMetrics.f + 3 + itemMarginTop;\n li.attr('y', legend.baseline);\n }\n\n // Draw the legend symbol inside the group box\n series.drawLegendSymbol(legend, item);\n\n if (legend.setItemEvents) {\n legend.setItemEvents(item, li, useHTML, itemStyle, itemHiddenStyle);\n }\n\n // add the HTML checkbox on top\n if (showCheckbox) {\n legend.createCheckboxForItem(item);\n }\n }\n\n // Colorize the items\n legend.colorizeItem(item, item.visible);\n\n // Always update the text\n legend.setText(item);\n\n // calculate the positions for the next line\n bBox = li.getBBox();\n\n itemWidth = item.checkboxOffset =\n options.itemWidth ||\n item.legendItemWidth ||\n symbolWidth + symbolPadding + bBox.width + itemDistance + (showCheckbox ? 20 : 0);\n legend.itemHeight = itemHeight = mathRound(item.legendItemHeight || bBox.height);\n\n // if the item exceeds the width, start a new line\n if (horizontal && legend.itemX - initialItemX + itemWidth >\n (widthOption || (chart.chartWidth - 2 * padding - initialItemX - options.x))) {\n legend.itemX = initialItemX;\n legend.itemY += itemMarginTop + legend.lastLineHeight + itemMarginBottom;\n legend.lastLineHeight = 0; // reset for next line (#915, #3976)\n }\n\n // If the item exceeds the height, start a new column\n /*if (!horizontal && legend.itemY + options.y + itemHeight > chart.chartHeight - spacingTop - spacingBottom) {\n legend.itemY = legend.initialItemY;\n legend.itemX += legend.maxItemWidth;\n legend.maxItemWidth = 0;\n }*/\n\n // Set the edge positions\n legend.maxItemWidth = mathMax(legend.maxItemWidth, itemWidth);\n legend.lastItemY = itemMarginTop + legend.itemY + itemMarginBottom;\n legend.lastLineHeight = mathMax(itemHeight, legend.lastLineHeight); // #915\n\n // cache the position of the newly generated or reordered items\n item._legendItemPos = [legend.itemX, legend.itemY];\n\n // advance\n if (horizontal) {\n legend.itemX += itemWidth;\n\n } else {\n legend.itemY += itemMarginTop + itemHeight + itemMarginBottom;\n legend.lastLineHeight = itemHeight;\n }\n\n // the width of the widest item\n legend.offsetWidth = widthOption || mathMax(\n (horizontal ? legend.itemX - initialItemX - itemDistance : itemWidth) + padding,\n legend.offsetWidth\n );\n },\n\n /**\n * Get all items, which is one item per series for normal series and one item per point\n * for pie series.\n */\n getAllItems: function () {\n var allItems = [];\n each(this.chart.series, function (series) {\n var seriesOptions = series.options;\n\n // Handle showInLegend. If the series is linked to another series, defaults to false.\n if (!pick(seriesOptions.showInLegend, !defined(seriesOptions.linkedTo) ? UNDEFINED : false, true)) {\n return;\n }\n\n // use points or series for the legend item depending on legendType\n allItems = allItems.concat(\n series.legendItems ||\n (seriesOptions.legendType === 'point' ?\n series.data :\n series)\n );\n });\n return allItems;\n },\n\n /**\n * Adjust the chart margins by reserving space for the legend on only one side\n * of the chart. If the position is set to a corner, top or bottom is reserved\n * for horizontal legends and left or right for vertical ones.\n */\n adjustMargins: function (margin, spacing) {\n var chart = this.chart,\n options = this.options,\n // Use the first letter of each alignment option in order to detect the side\n alignment = options.align.charAt(0) + options.verticalAlign.charAt(0) + options.layout.charAt(0); // #4189 - use charAt(x) notation instead of [x] for IE7\n\n if (!options.floating) {\n\n each([\n /(lth|ct|rth)/,\n /(rtv|rm|rbv)/,\n /(rbh|cb|lbh)/,\n /(lbv|lm|ltv)/\n ], function (alignments, side) {\n if (alignments.test(alignment) && !defined(margin[side])) {\n // Now we have detected on which side of the chart we should reserve space for the legend\n chart[marginNames[side]] = mathMax(\n chart[marginNames[side]],\n chart.legend[(side + 1) % 2 ? 'legendHeight' : 'legendWidth'] +\n [1, -1, -1, 1][side] * options[(side % 2) ? 'x' : 'y'] +\n pick(options.margin, 12) +\n spacing[side]\n );\n }\n });\n }\n },\n\n /**\n * Render the legend. This method can be called both before and after\n * chart.render. If called after, it will only rearrange items instead\n * of creating new ones.\n */\n render: function () {\n var legend = this,\n chart = legend.chart,\n renderer = chart.renderer,\n legendGroup = legend.group,\n allItems,\n display,\n legendWidth,\n legendHeight,\n box = legend.box,\n options = legend.options,\n padding = legend.padding,\n legendBorderWidth = options.borderWidth,\n legendBackgroundColor = options.backgroundColor;\n\n legend.itemX = legend.initialItemX;\n legend.itemY = legend.initialItemY;\n legend.offsetWidth = 0;\n legend.lastItemY = 0;\n\n if (!legendGroup) {\n legend.group = legendGroup = renderer.g('legend')\n .attr({ zIndex: 7 })\n .add();\n legend.contentGroup = renderer.g()\n .attr({ zIndex: 1 }) // above background\n .add(legendGroup);\n legend.scrollGroup = renderer.g()\n .add(legend.contentGroup);\n }\n\n legend.renderTitle();\n\n // add each series or point\n allItems = legend.getAllItems();\n\n // sort by legendIndex\n stableSort(allItems, function (a, b) {\n return ((a.options && a.options.legendIndex) || 0) - ((b.options && b.options.legendIndex) || 0);\n });\n\n // reversed legend\n if (options.reversed) {\n allItems.reverse();\n }\n\n legend.allItems = allItems;\n legend.display = display = !!allItems.length;\n\n // render the items\n legend.lastLineHeight = 0;\n each(allItems, function (item) {\n legend.renderItem(item);\n });\n\n // Get the box\n legendWidth = (options.width || legend.offsetWidth) + padding;\n legendHeight = legend.lastItemY + legend.lastLineHeight + legend.titleHeight;\n legendHeight = legend.handleOverflow(legendHeight);\n legendHeight += padding;\n\n // Draw the border and/or background\n if (legendBorderWidth || legendBackgroundColor) {\n\n if (!box) {\n legend.box = box = renderer.rect(\n 0,\n 0,\n legendWidth,\n legendHeight,\n options.borderRadius,\n legendBorderWidth || 0\n ).attr({\n stroke: options.borderColor,\n 'stroke-width': legendBorderWidth || 0,\n fill: legendBackgroundColor || NONE\n })\n .add(legendGroup)\n .shadow(options.shadow);\n box.isNew = true;\n\n } else if (legendWidth > 0 && legendHeight > 0) {\n box[box.isNew ? 'attr' : 'animate'](\n box.crisp({ width: legendWidth, height: legendHeight })\n );\n box.isNew = false;\n }\n\n // hide the border if no items\n box[display ? 'show' : 'hide']();\n }\n\n legend.legendWidth = legendWidth;\n legend.legendHeight = legendHeight;\n\n // Now that the legend width and height are established, put the items in the\n // final position\n each(allItems, function (item) {\n legend.positionItem(item);\n });\n\n // 1.x compatibility: positioning based on style\n /*var props = ['left', 'right', 'top', 'bottom'],\n prop,\n i = 4;\n while (i--) {\n prop = props[i];\n if (options.style[prop] && options.style[prop] !== 'auto') {\n options[i < 2 ? 'align' : 'verticalAlign'] = prop;\n options[i < 2 ? 'x' : 'y'] = pInt(options.style[prop]) * (i % 2 ? -1 : 1);\n }\n }*/\n\n if (display) {\n legendGroup.align(extend({\n width: legendWidth,\n height: legendHeight\n }, options), true, 'spacingBox');\n }\n\n if (!chart.isResizing) {\n this.positionCheckboxes();\n }\n },\n\n /**\n * Set up the overflow handling by adding navigation with up and down arrows below the\n * legend.\n */\n handleOverflow: function (legendHeight) {\n var legend = this,\n chart = this.chart,\n renderer = chart.renderer,\n options = this.options,\n optionsY = options.y,\n alignTop = options.verticalAlign === 'top',\n spaceHeight = chart.spacingBox.height + (alignTop ? -optionsY : optionsY) - this.padding,\n maxHeight = options.maxHeight,\n clipHeight,\n clipRect = this.clipRect,\n navOptions = options.navigation,\n animation = pick(navOptions.animation, true),\n arrowSize = navOptions.arrowSize || 12,\n nav = this.nav,\n pages = this.pages,\n padding = this.padding,\n lastY,\n allItems = this.allItems,\n clipToHeight = function (height) {\n clipRect.attr({\n height: height\n });\n\n // useHTML\n if (legend.contentGroup.div) {\n legend.contentGroup.div.style.clip = 'rect(' + padding + 'px,9999px,' + (padding + height) + 'px,0)';\n }\n };\n\n\n // Adjust the height\n if (options.layout === 'horizontal') {\n spaceHeight /= 2;\n }\n if (maxHeight) {\n spaceHeight = mathMin(spaceHeight, maxHeight);\n }\n\n // Reset the legend height and adjust the clipping rectangle\n pages.length = 0;\n if (legendHeight > spaceHeight && navOptions.enabled !== false) {\n\n this.clipHeight = clipHeight = mathMax(spaceHeight - 20 - this.titleHeight - padding, 0);\n this.currentPage = pick(this.currentPage, 1);\n this.fullHeight = legendHeight;\n\n // Fill pages with Y positions so that the top of each a legend item defines\n // the scroll top for each page (#2098)\n each(allItems, function (item, i) {\n var y = item._legendItemPos[1],\n h = mathRound(item.legendItem.getBBox().height),\n len = pages.length;\n\n if (!len || (y - pages[len - 1] > clipHeight && (lastY || y) !== pages[len - 1])) {\n pages.push(lastY || y);\n len++;\n }\n\n if (i === allItems.length - 1 && y + h - pages[len - 1] > clipHeight) {\n pages.push(y);\n }\n if (y !== lastY) {\n lastY = y;\n }\n });\n\n // Only apply clipping if needed. Clipping causes blurred legend in PDF export (#1787)\n if (!clipRect) {\n clipRect = legend.clipRect = renderer.clipRect(0, padding, 9999, 0);\n legend.contentGroup.clip(clipRect);\n }\n\n clipToHeight(clipHeight);\n\n // Add navigation elements\n if (!nav) {\n this.nav = nav = renderer.g().attr({ zIndex: 1 }).add(this.group);\n this.up = renderer.symbol('triangle', 0, 0, arrowSize, arrowSize)\n .on('click', function () {\n legend.scroll(-1, animation);\n })\n .add(nav);\n this.pager = renderer.text('', 15, 10)\n .css(navOptions.style)\n .add(nav);\n this.down = renderer.symbol('triangle-down', 0, 0, arrowSize, arrowSize)\n .on('click', function () {\n legend.scroll(1, animation);\n })\n .add(nav);\n }\n\n // Set initial position\n legend.scroll(0);\n\n legendHeight = spaceHeight;\n\n } else if (nav) {\n clipToHeight(chart.chartHeight);\n nav.hide();\n this.scrollGroup.attr({\n translateY: 1\n });\n this.clipHeight = 0; // #1379\n }\n\n return legendHeight;\n },\n\n /**\n * Scroll the legend by a number of pages\n * @param {Object} scrollBy\n * @param {Object} animation\n */\n scroll: function (scrollBy, animation) {\n var pages = this.pages,\n pageCount = pages.length,\n currentPage = this.currentPage + scrollBy,\n clipHeight = this.clipHeight,\n navOptions = this.options.navigation,\n activeColor = navOptions.activeColor,\n inactiveColor = navOptions.inactiveColor,\n pager = this.pager,\n padding = this.padding,\n scrollOffset;\n\n // When resizing while looking at the last page\n if (currentPage > pageCount) {\n currentPage = pageCount;\n }\n\n if (currentPage > 0) {\n\n if (animation !== UNDEFINED) {\n setAnimation(animation, this.chart);\n }\n\n this.nav.attr({\n translateX: padding,\n translateY: clipHeight + this.padding + 7 + this.titleHeight,\n visibility: VISIBLE\n });\n this.up.attr({\n fill: currentPage === 1 ? inactiveColor : activeColor\n })\n .css({\n cursor: currentPage === 1 ? 'default' : 'pointer'\n });\n pager.attr({\n text: currentPage + '/' + pageCount\n });\n this.down.attr({\n x: 18 + this.pager.getBBox().width, // adjust to text width\n fill: currentPage === pageCount ? inactiveColor : activeColor\n })\n .css({\n cursor: currentPage === pageCount ? 'default' : 'pointer'\n });\n\n scrollOffset = -pages[currentPage - 1] + this.initialItemY;\n\n this.scrollGroup.animate({\n translateY: scrollOffset\n });\n\n this.currentPage = currentPage;\n this.positionCheckboxes(scrollOffset);\n }\n\n }\n\n };\n\n /*\n * LegendSymbolMixin\n */\n\n var LegendSymbolMixin = Highcharts.LegendSymbolMixin = {\n\n /**\n * Get the series' symbol in the legend\n *\n * @param {Object} legend The legend object\n * @param {Object} item The series (this) or point\n */\n drawRectangle: function (legend, item) {\n var symbolHeight = legend.options.symbolHeight || legend.fontMetrics.f;\n\n item.legendSymbol = this.chart.renderer.rect(\n 0,\n legend.baseline - symbolHeight + 1, // #3988\n legend.symbolWidth,\n symbolHeight,\n legend.options.symbolRadius || 0\n ).attr({\n zIndex: 3\n }).add(item.legendGroup);\n\n },\n\n /**\n * Get the series' symbol in the legend. This method should be overridable to create custom\n * symbols through Highcharts.seriesTypes[type].prototype.drawLegendSymbols.\n *\n * @param {Object} legend The legend object\n */\n drawLineMarker: function (legend) {\n\n var options = this.options,\n markerOptions = options.marker,\n radius,\n legendSymbol,\n symbolWidth = legend.symbolWidth,\n renderer = this.chart.renderer,\n legendItemGroup = this.legendGroup,\n verticalCenter = legend.baseline - mathRound(legend.fontMetrics.b * 0.3),\n attr;\n\n // Draw the line\n if (options.lineWidth) {\n attr = {\n 'stroke-width': options.lineWidth\n };\n if (options.dashStyle) {\n attr.dashstyle = options.dashStyle;\n }\n this.legendLine = renderer.path([\n M,\n 0,\n verticalCenter,\n L,\n symbolWidth,\n verticalCenter\n ])\n .attr(attr)\n .add(legendItemGroup);\n }\n\n // Draw the marker\n if (markerOptions && markerOptions.enabled !== false) {\n radius = markerOptions.radius;\n this.legendSymbol = legendSymbol = renderer.symbol(\n this.symbol,\n (symbolWidth / 2) - radius,\n verticalCenter - radius,\n 2 * radius,\n 2 * radius,\n markerOptions\n )\n .add(legendItemGroup);\n legendSymbol.isMarker = true;\n }\n }\n };\n\n // Workaround for #2030, horizontal legend items not displaying in IE11 Preview,\n // and for #2580, a similar drawing flaw in Firefox 26.\n // Explore if there's a general cause for this. The problem may be related\n // to nested group elements, as the legend item texts are within 4 group elements.\n if (/Trident\\/7\\.0/.test(userAgent) || isFirefox) {\n wrap(Legend.prototype, 'positionItem', function (proceed, item) {\n var legend = this,\n runPositionItem = function () { // If chart destroyed in sync, this is undefined (#2030)\n if (item._legendItemPos) {\n proceed.call(legend, item);\n }\n };\n\n // Do it now, for export and to get checkbox placement\n runPositionItem();\n\n // Do it after to work around the core issue\n setTimeout(runPositionItem);\n });\n }\n /**\n * The Chart class\n * @param {String|Object} renderTo The DOM element to render to, or its id\n * @param {Object} options\n * @param {Function} callback Function to run when the chart has loaded\n */\n var Chart = Highcharts.Chart = function () {\n this.getArgs.apply(this, arguments);\n };\n\n Highcharts.chart = function (a, b, c) {\n return new Chart(a, b, c);\n };\n\n Chart.prototype = {\n\n /**\n * Hook for modules\n */\n callbacks: [],\n\n /**\n * Handle the arguments passed to the constructor\n * @returns {Array} Arguments without renderTo\n */\n getArgs: function () {\n var args = [].slice.call(arguments);\n \n // Remove the optional first argument, renderTo, and\n // set it on this.\n if (isString(args[0]) || args[0].nodeName) {\n this.renderTo = args.shift();\n }\n this.init(args[0], args[1]);\n },\n\n /**\n * Initialize the chart\n */\n init: function (userOptions, callback) {\n\n // Handle regular options\n var options,\n seriesOptions = userOptions.series; // skip merging data points to increase performance\n\n userOptions.series = null;\n options = merge(defaultOptions, userOptions); // do the merge\n options.series = userOptions.series = seriesOptions; // set back the series data\n this.userOptions = userOptions;\n\n var optionsChart = options.chart;\n\n // Create margin & spacing array\n this.margin = this.splashArray('margin', optionsChart);\n this.spacing = this.splashArray('spacing', optionsChart);\n\n var chartEvents = optionsChart.events;\n\n //this.runChartClick = chartEvents && !!chartEvents.click;\n this.bounds = { h: {}, v: {} }; // Pixel data bounds for touch zoom\n\n this.callback = callback;\n this.isResizing = 0;\n this.options = options;\n //chartTitleOptions = UNDEFINED;\n //chartSubtitleOptions = UNDEFINED;\n\n this.axes = [];\n this.series = [];\n this.hasCartesianSeries = optionsChart.showAxes;\n //this.axisOffset = UNDEFINED;\n //this.maxTicks = UNDEFINED; // handle the greatest amount of ticks on grouped axes\n //this.inverted = UNDEFINED;\n //this.loadingShown = UNDEFINED;\n //this.container = UNDEFINED;\n //this.chartWidth = UNDEFINED;\n //this.chartHeight = UNDEFINED;\n //this.marginRight = UNDEFINED;\n //this.marginBottom = UNDEFINED;\n //this.containerWidth = UNDEFINED;\n //this.containerHeight = UNDEFINED;\n //this.oldChartWidth = UNDEFINED;\n //this.oldChartHeight = UNDEFINED;\n\n //this.renderTo = UNDEFINED;\n //this.renderToClone = UNDEFINED;\n\n //this.spacingBox = UNDEFINED\n\n //this.legend = UNDEFINED;\n\n // Elements\n //this.chartBackground = UNDEFINED;\n //this.plotBackground = UNDEFINED;\n //this.plotBGImage = UNDEFINED;\n //this.plotBorder = UNDEFINED;\n //this.loadingDiv = UNDEFINED;\n //this.loadingSpan = UNDEFINED;\n\n var chart = this,\n eventType;\n\n // Add the chart to the global lookup\n chart.index = charts.length;\n charts.push(chart);\n chartCount++;\n\n // Set up auto resize\n if (optionsChart.reflow !== false) {\n addEvent(chart, 'load', function () {\n chart.initReflow();\n });\n }\n\n // Chart event handlers\n if (chartEvents) {\n for (eventType in chartEvents) {\n addEvent(chart, eventType, chartEvents[eventType]);\n }\n }\n\n chart.xAxis = [];\n chart.yAxis = [];\n\n // Expose methods and variables\n chart.animation = useCanVG ? false : pick(optionsChart.animation, true);\n chart.pointCount = chart.colorCounter = chart.symbolCounter = 0;\n\n chart.firstRender();\n },\n\n /**\n * Initialize an individual series, called internally before render time\n */\n initSeries: function (options) {\n var chart = this,\n optionsChart = chart.options.chart,\n type = options.type || optionsChart.type || optionsChart.defaultSeriesType,\n series,\n constr = seriesTypes[type];\n\n // No such series type\n if (!constr) {\n error(17, true);\n }\n\n series = new constr();\n series.init(this, options);\n return series;\n },\n\n /**\n * Check whether a given point is within the plot area\n *\n * @param {Number} plotX Pixel x relative to the plot area\n * @param {Number} plotY Pixel y relative to the plot area\n * @param {Boolean} inverted Whether the chart is inverted\n */\n isInsidePlot: function (plotX, plotY, inverted) {\n var x = inverted ? plotY : plotX,\n y = inverted ? plotX : plotY;\n\n return x >= 0 &&\n x <= this.plotWidth &&\n y >= 0 &&\n y <= this.plotHeight;\n },\n\n /**\n * Redraw legend, axes or series based on updated data\n *\n * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\n * configuration\n */\n redraw: function (animation) {\n var chart = this,\n axes = chart.axes,\n series = chart.series,\n pointer = chart.pointer,\n legend = chart.legend,\n redrawLegend = chart.isDirtyLegend,\n hasStackedSeries,\n hasDirtyStacks,\n hasCartesianSeries = chart.hasCartesianSeries,\n isDirtyBox = chart.isDirtyBox,\n seriesLength = series.length,\n i = seriesLength,\n serie,\n renderer = chart.renderer,\n isHiddenChart = renderer.isHidden(),\n afterRedraw = [];\n\n setAnimation(animation, chart);\n\n if (isHiddenChart) {\n chart.cloneRenderTo();\n }\n\n // Adjust title layout (reflow multiline text)\n chart.layOutTitles();\n\n // link stacked series\n while (i--) {\n serie = series[i];\n\n if (serie.options.stacking) {\n hasStackedSeries = true;\n\n if (serie.isDirty) {\n hasDirtyStacks = true;\n break;\n }\n }\n }\n if (hasDirtyStacks) { // mark others as dirty\n i = seriesLength;\n while (i--) {\n serie = series[i];\n if (serie.options.stacking) {\n serie.isDirty = true;\n }\n }\n }\n\n // Handle updated data in the series\n each(series, function (serie) {\n if (serie.isDirty) {\n if (serie.options.legendType === 'point') {\n if (serie.updateTotals) {\n serie.updateTotals();\n }\n redrawLegend = true;\n }\n }\n if (serie.isDirtyData) {\n fireEvent(serie, 'updatedData');\n }\n });\n\n // handle added or removed series\n if (redrawLegend && legend.options.enabled) { // series or pie points are added or removed\n // draw legend graphics\n legend.render();\n\n chart.isDirtyLegend = false;\n }\n\n // reset stacks\n if (hasStackedSeries) {\n chart.getStacks();\n }\n\n\n if (hasCartesianSeries) {\n if (!chart.isResizing) {\n\n // reset maxTicks\n chart.maxTicks = null;\n\n // set axes scales\n each(axes, function (axis) {\n axis.setScale();\n });\n }\n }\n\n chart.getMargins(); // #3098\n\n if (hasCartesianSeries) {\n // If one axis is dirty, all axes must be redrawn (#792, #2169)\n each(axes, function (axis) {\n if (axis.isDirty) {\n isDirtyBox = true;\n }\n });\n\n // redraw axes\n each(axes, function (axis) {\n\n // Fire 'afterSetExtremes' only if extremes are set\n var key = axis.min + ',' + axis.max;\n if (axis.extKey !== key) { // #821, #4452\n axis.extKey = key;\n afterRedraw.push(function () { // prevent a recursive call to chart.redraw() (#1119)\n fireEvent(axis, 'afterSetExtremes', extend(axis.eventArgs, axis.getExtremes())); // #747, #751\n delete axis.eventArgs;\n });\n }\n if (isDirtyBox || hasStackedSeries) {\n axis.redraw();\n }\n });\n }\n\n // the plot areas size has changed\n if (isDirtyBox) {\n chart.drawChartBox();\n }\n\n\n // redraw affected series\n each(series, function (serie) {\n if (serie.isDirty && serie.visible &&\n (!serie.isCartesian || serie.xAxis)) { // issue #153\n serie.redraw();\n }\n });\n\n // move tooltip or reset\n if (pointer) {\n pointer.reset(true);\n }\n\n // redraw if canvas\n renderer.draw();\n\n // fire the event\n fireEvent(chart, 'redraw');\n\n if (isHiddenChart) {\n chart.cloneRenderTo(true);\n }\n\n // Fire callbacks that are put on hold until after the redraw\n each(afterRedraw, function (callback) {\n callback.call();\n });\n },\n\n /**\n * Get an axis, series or point object by id.\n * @param id {String} The id as given in the configuration options\n */\n get: function (id) {\n var chart = this,\n axes = chart.axes,\n series = chart.series;\n\n var i,\n j,\n points;\n\n // search axes\n for (i = 0; i < axes.length; i++) {\n if (axes[i].options.id === id) {\n return axes[i];\n }\n }\n\n // search series\n for (i = 0; i < series.length; i++) {\n if (series[i].options.id === id) {\n return series[i];\n }\n }\n\n // search points\n for (i = 0; i < series.length; i++) {\n points = series[i].points || [];\n for (j = 0; j < points.length; j++) {\n if (points[j].id === id) {\n return points[j];\n }\n }\n }\n return null;\n },\n\n /**\n * Create the Axis instances based on the config options\n */\n getAxes: function () {\n var chart = this,\n options = this.options,\n xAxisOptions = options.xAxis = splat(options.xAxis || {}),\n yAxisOptions = options.yAxis = splat(options.yAxis || {}),\n optionsArray;\n\n // make sure the options are arrays and add some members\n each(xAxisOptions, function (axis, i) {\n axis.index = i;\n axis.isX = true;\n });\n\n each(yAxisOptions, function (axis, i) {\n axis.index = i;\n });\n\n // concatenate all axis options into one array\n optionsArray = xAxisOptions.concat(yAxisOptions);\n\n each(optionsArray, function (axisOptions) {\n new Axis(chart, axisOptions); // eslint-disable-line no-new\n });\n },\n\n\n /**\n * Get the currently selected points from all series\n */\n getSelectedPoints: function () {\n var points = [];\n each(this.series, function (serie) {\n points = points.concat(grep(serie.points || [], function (point) {\n return point.selected;\n }));\n });\n return points;\n },\n\n /**\n * Get the currently selected series\n */\n getSelectedSeries: function () {\n return grep(this.series, function (serie) {\n return serie.selected;\n });\n },\n\n /**\n * Show the title and subtitle of the chart\n *\n * @param titleOptions {Object} New title options\n * @param subtitleOptions {Object} New subtitle options\n *\n */\n setTitle: function (titleOptions, subtitleOptions, redraw) {\n var chart = this,\n options = chart.options,\n chartTitleOptions,\n chartSubtitleOptions;\n\n chartTitleOptions = options.title = merge(options.title, titleOptions);\n chartSubtitleOptions = options.subtitle = merge(options.subtitle, subtitleOptions);\n\n // add title and subtitle\n each([\n ['title', titleOptions, chartTitleOptions],\n ['subtitle', subtitleOptions, chartSubtitleOptions]\n ], function (arr) {\n var name = arr[0],\n title = chart[name],\n titleOptions = arr[1],\n chartTitleOptions = arr[2];\n\n if (title && titleOptions) {\n chart[name] = title = title.destroy(); // remove old\n }\n\n if (chartTitleOptions && chartTitleOptions.text && !title) {\n chart[name] = chart.renderer.text(\n chartTitleOptions.text,\n 0,\n 0,\n chartTitleOptions.useHTML\n )\n .attr({\n align: chartTitleOptions.align,\n 'class': PREFIX + name,\n zIndex: chartTitleOptions.zIndex || 4\n })\n .css(chartTitleOptions.style)\n .add();\n \n }\n });\n chart.layOutTitles(redraw);\n },\n\n /**\n * Lay out the chart titles and cache the full offset height for use in getMargins\n */\n layOutTitles: function (redraw) {\n var titleOffset = 0,\n title = this.title,\n subtitle = this.subtitle,\n options = this.options,\n titleOptions = options.title,\n subtitleOptions = options.subtitle,\n requiresDirtyBox,\n renderer = this.renderer,\n spacingBox = this.spacingBox;\n\n if (title) {\n title\n .css({ width: (titleOptions.width || spacingBox.width + titleOptions.widthAdjust) + PX })\n .align(extend({\n y: renderer.fontMetrics(titleOptions.style.fontSize, title).b - 3\n }, titleOptions), false, spacingBox);\n\n if (!titleOptions.floating && !titleOptions.verticalAlign) {\n titleOffset = title.getBBox().height;\n }\n }\n if (subtitle) {\n subtitle\n .css({ width: (subtitleOptions.width || spacingBox.width + subtitleOptions.widthAdjust) + PX })\n .align(extend({\n y: titleOffset + (titleOptions.margin - 13) + renderer.fontMetrics(subtitleOptions.style.fontSize, title).b\n }, subtitleOptions), false, spacingBox);\n\n if (!subtitleOptions.floating && !subtitleOptions.verticalAlign) {\n titleOffset = mathCeil(titleOffset + subtitle.getBBox().height);\n }\n }\n\n requiresDirtyBox = this.titleOffset !== titleOffset;\n this.titleOffset = titleOffset; // used in getMargins\n\n if (!this.isDirtyBox && requiresDirtyBox) {\n this.isDirtyBox = requiresDirtyBox;\n // Redraw if necessary (#2719, #2744)\n if (this.hasRendered && pick(redraw, true) && this.isDirtyBox) {\n this.redraw();\n }\n }\n },\n\n /**\n * Get chart width and height according to options and container size\n */\n getChartSize: function () {\n var chart = this,\n optionsChart = chart.options.chart,\n widthOption = optionsChart.width,\n heightOption = optionsChart.height,\n renderTo = chart.renderToClone || chart.renderTo;\n\n // Get inner width and height\n if (!defined(widthOption)) {\n chart.containerWidth = getStyle(renderTo, 'width');\n }\n if (!defined(heightOption)) {\n chart.containerHeight = getStyle(renderTo, 'height');\n }\n\n chart.chartWidth = mathMax(0, widthOption || chart.containerWidth || 600); // #1393, 1460\n chart.chartHeight = mathMax(0, pick(heightOption,\n // the offsetHeight of an empty container is 0 in standard browsers, but 19 in IE7:\n chart.containerHeight > 19 ? chart.containerHeight : 400));\n },\n\n /**\n * Create a clone of the chart's renderTo div and place it outside the viewport to allow\n * size computation on chart.render and chart.redraw\n */\n cloneRenderTo: function (revert) {\n var clone = this.renderToClone,\n container = this.container;\n\n // Destroy the clone and bring the container back to the real renderTo div\n if (revert) {\n if (clone) {\n this.renderTo.appendChild(container);\n discardElement(clone);\n delete this.renderToClone;\n }\n\n // Set up the clone\n } else {\n if (container && container.parentNode === this.renderTo) {\n this.renderTo.removeChild(container); // do not clone this\n }\n this.renderToClone = clone = this.renderTo.cloneNode(0);\n css(clone, {\n position: ABSOLUTE,\n top: '-9999px',\n display: 'block' // #833\n });\n if (clone.style.setProperty) { // #2631\n clone.style.setProperty('display', 'block', 'important');\n }\n doc.body.appendChild(clone);\n if (container) {\n clone.appendChild(container);\n }\n }\n },\n\n /**\n * Get the containing element, determine the size and create the inner container\n * div to hold the chart\n */\n getContainer: function () {\n var chart = this,\n container,\n options = chart.options,\n optionsChart = options.chart,\n chartWidth,\n chartHeight,\n renderTo = chart.renderTo,\n indexAttrName = 'data-highcharts-chart',\n oldChartIndex,\n Ren,\n containerId = 'highcharts-' + idCounter++;\n\n if (!renderTo) {\n chart.renderTo = renderTo = optionsChart.renderTo;\n }\n \n if (isString(renderTo)) {\n chart.renderTo = renderTo = doc.getElementById(renderTo);\n }\n\n // Display an error if the renderTo is wrong\n if (!renderTo) {\n error(13, true);\n }\n\n // If the container already holds a chart, destroy it. The check for hasRendered is there\n // because web pages that are saved to disk from the browser, will preserve the data-highcharts-chart\n // attribute and the SVG contents, but not an interactive chart. So in this case,\n // charts[oldChartIndex] will point to the wrong chart if any (#2609).\n oldChartIndex = pInt(attr(renderTo, indexAttrName));\n if (isNumber(oldChartIndex) && charts[oldChartIndex] && charts[oldChartIndex].hasRendered) {\n charts[oldChartIndex].destroy();\n }\n\n // Make a reference to the chart from the div\n attr(renderTo, indexAttrName, chart.index);\n\n // remove previous chart\n renderTo.innerHTML = '';\n\n // If the container doesn't have an offsetWidth, it has or is a child of a node\n // that has display:none. We need to temporarily move it out to a visible\n // state to determine the size, else the legend and tooltips won't render\n // properly. The allowClone option is used in sparklines as a micro optimization,\n // saving about 1-2 ms each chart.\n if (!optionsChart.skipClone && !renderTo.offsetWidth) {\n chart.cloneRenderTo();\n }\n\n // get the width and height\n chart.getChartSize();\n chartWidth = chart.chartWidth;\n chartHeight = chart.chartHeight;\n\n // create the inner container\n chart.container = container = createElement(DIV, {\n className: PREFIX + 'container' +\n (optionsChart.className ? ' ' + optionsChart.className : ''),\n id: containerId\n }, extend({\n position: RELATIVE,\n overflow: HIDDEN, // needed for context menu (avoid scrollbars) and\n // content overflow in IE\n width: chartWidth + PX,\n height: chartHeight + PX,\n textAlign: 'left',\n lineHeight: 'normal', // #427\n zIndex: 0, // #1072\n '-webkit-tap-highlight-color': 'rgba(0,0,0,0)'\n }, optionsChart.style),\n chart.renderToClone || renderTo\n );\n\n // cache the cursor (#1650)\n chart._cursor = container.style.cursor;\n\n // Initialize the renderer\n Ren = Highcharts[optionsChart.renderer] || Renderer;\n chart.renderer = new Ren(\n container,\n chartWidth,\n chartHeight,\n optionsChart.style,\n optionsChart.forExport,\n options.exporting && options.exporting.allowHTML\n );\n\n if (useCanVG) {\n // If we need canvg library, extend and configure the renderer\n // to get the tracker for translating mouse events\n chart.renderer.create(chart, container, chartWidth, chartHeight);\n }\n // Add a reference to the charts index\n chart.renderer.chartIndex = chart.index;\n },\n\n /**\n * Calculate margins by rendering axis labels in a preliminary position. Title,\n * subtitle and legend have already been rendered at this stage, but will be\n * moved into their final positions\n */\n getMargins: function (skipAxes) {\n var chart = this,\n spacing = chart.spacing,\n margin = chart.margin,\n titleOffset = chart.titleOffset;\n\n chart.resetMargins();\n\n // Adjust for title and subtitle\n if (titleOffset && !defined(margin[0])) {\n chart.plotTop = mathMax(chart.plotTop, titleOffset + chart.options.title.margin + spacing[0]);\n }\n\n // Adjust for legend\n if (chart.legend.display) {\n chart.legend.adjustMargins(margin, spacing);\n }\n\n // adjust for scroller\n if (chart.extraBottomMargin) {\n chart.marginBottom += chart.extraBottomMargin;\n }\n if (chart.extraTopMargin) {\n chart.plotTop += chart.extraTopMargin;\n }\n if (!skipAxes) {\n this.getAxisMargins();\n }\n },\n\n getAxisMargins: function () {\n\n var chart = this,\n axisOffset = chart.axisOffset = [0, 0, 0, 0], // top, right, bottom, left\n margin = chart.margin;\n\n // pre-render axes to get labels offset width\n if (chart.hasCartesianSeries) {\n each(chart.axes, function (axis) {\n if (axis.visible) {\n axis.getOffset();\n }\n });\n }\n\n // Add the axis offsets\n each(marginNames, function (m, side) {\n if (!defined(margin[side])) {\n chart[m] += axisOffset[side];\n }\n });\n\n chart.setChartSize();\n\n },\n\n /**\n * Resize the chart to its container if size is not explicitly set\n */\n reflow: function (e) {\n var chart = this,\n optionsChart = chart.options.chart,\n renderTo = chart.renderTo,\n hasUserWidth = defined(optionsChart.width),\n width = optionsChart.width || getStyle(renderTo, 'width'),\n height = optionsChart.height || getStyle(renderTo, 'height'),\n target = e ? e.target : win;\n\n // Width and height checks for display:none. Target is doc in IE8 and Opera,\n // win in Firefox, Chrome and IE9.\n if (!hasUserWidth && !chart.isPrinting && width && height && (target === win || target === doc)) { // #1093\n if (width !== chart.containerWidth || height !== chart.containerHeight) {\n clearTimeout(chart.reflowTimeout);\n // When called from window.resize, e is set, else it's called directly (#2224)\n chart.reflowTimeout = syncTimeout(function () {\n if (chart.container) { // It may have been destroyed in the meantime (#1257)\n chart.setSize(undefined, undefined, false);\n }\n }, e ? 100 : 0);\n }\n chart.containerWidth = width;\n chart.containerHeight = height;\n }\n },\n\n /**\n * Add the event handlers necessary for auto resizing\n */\n initReflow: function () {\n var chart = this,\n reflow = function (e) {\n chart.reflow(e);\n };\n\n\n addEvent(win, 'resize', reflow);\n addEvent(chart, 'destroy', function () {\n removeEvent(win, 'resize', reflow);\n });\n },\n\n /**\n * Resize the chart to a given width and height\n * @param {Number} width\n * @param {Number} height\n * @param {Object|Boolean} animation\n */\n setSize: function (width, height, animation) {\n var chart = this,\n renderer = chart.renderer,\n globalAnimation;\n\n // Handle the isResizing counter\n chart.isResizing += 1;\n \n // set the animation for the current process\n setAnimation(animation, chart);\n\n chart.oldChartHeight = chart.chartHeight;\n chart.oldChartWidth = chart.chartWidth;\n if (width !== undefined) {\n chart.options.chart.width = width;\n }\n if (height !== undefined) {\n chart.options.chart.height = height;\n }\n chart.getChartSize();\n\n // Resize the container with the global animation applied if enabled (#2503)\n globalAnimation = renderer.globalAnimation;\n (globalAnimation ? animate : css)(chart.container, {\n width: chart.chartWidth + PX,\n height: chart.chartHeight + PX\n }, globalAnimation);\n\n chart.setChartSize(true);\n renderer.setSize(chart.chartWidth, chart.chartHeight, animation);\n\n // handle axes\n chart.maxTicks = null;\n each(chart.axes, function (axis) {\n axis.isDirty = true;\n axis.setScale();\n });\n\n // make sure non-cartesian series are also handled\n each(chart.series, function (serie) {\n serie.isDirty = true;\n });\n\n chart.isDirtyLegend = true; // force legend redraw\n chart.isDirtyBox = true; // force redraw of plot and chart border\n\n chart.layOutTitles(); // #2857\n chart.getMargins();\n\n chart.redraw(animation);\n\n\n chart.oldChartHeight = null;\n fireEvent(chart, 'resize');\n\n // Fire endResize and set isResizing back. If animation is disabled, fire without delay\n syncTimeout(function () {\n if (chart) {\n fireEvent(chart, 'endResize', null, function () {\n chart.isResizing -= 1;\n });\n }\n }, animObject(globalAnimation).duration);\n },\n\n /**\n * Set the public chart properties. This is done before and after the pre-render\n * to determine margin sizes\n */\n setChartSize: function (skipAxes) {\n var chart = this,\n inverted = chart.inverted,\n renderer = chart.renderer,\n chartWidth = chart.chartWidth,\n chartHeight = chart.chartHeight,\n optionsChart = chart.options.chart,\n spacing = chart.spacing,\n clipOffset = chart.clipOffset,\n clipX,\n clipY,\n plotLeft,\n plotTop,\n plotWidth,\n plotHeight,\n plotBorderWidth;\n\n chart.plotLeft = plotLeft = mathRound(chart.plotLeft);\n chart.plotTop = plotTop = mathRound(chart.plotTop);\n chart.plotWidth = plotWidth = mathMax(0, mathRound(chartWidth - plotLeft - chart.marginRight));\n chart.plotHeight = plotHeight = mathMax(0, mathRound(chartHeight - plotTop - chart.marginBottom));\n\n chart.plotSizeX = inverted ? plotHeight : plotWidth;\n chart.plotSizeY = inverted ? plotWidth : plotHeight;\n\n chart.plotBorderWidth = optionsChart.plotBorderWidth || 0;\n\n // Set boxes used for alignment\n chart.spacingBox = renderer.spacingBox = {\n x: spacing[3],\n y: spacing[0],\n width: chartWidth - spacing[3] - spacing[1],\n height: chartHeight - spacing[0] - spacing[2]\n };\n chart.plotBox = renderer.plotBox = {\n x: plotLeft,\n y: plotTop,\n width: plotWidth,\n height: plotHeight\n };\n\n plotBorderWidth = 2 * mathFloor(chart.plotBorderWidth / 2);\n clipX = mathCeil(mathMax(plotBorderWidth, clipOffset[3]) / 2);\n clipY = mathCeil(mathMax(plotBorderWidth, clipOffset[0]) / 2);\n chart.clipBox = {\n x: clipX,\n y: clipY,\n width: mathFloor(chart.plotSizeX - mathMax(plotBorderWidth, clipOffset[1]) / 2 - clipX),\n height: mathMax(0, mathFloor(chart.plotSizeY - mathMax(plotBorderWidth, clipOffset[2]) / 2 - clipY))\n };\n\n if (!skipAxes) {\n each(chart.axes, function (axis) {\n axis.setAxisSize();\n axis.setAxisTranslation();\n });\n }\n },\n\n /**\n * Initial margins before auto size margins are applied\n */\n resetMargins: function () {\n var chart = this;\n\n each(marginNames, function (m, side) {\n chart[m] = pick(chart.margin[side], chart.spacing[side]);\n });\n chart.axisOffset = [0, 0, 0, 0]; // top, right, bottom, left\n chart.clipOffset = [0, 0, 0, 0];\n },\n\n /**\n * Draw the borders and backgrounds for chart and plot area\n */\n drawChartBox: function () {\n var chart = this,\n optionsChart = chart.options.chart,\n renderer = chart.renderer,\n chartWidth = chart.chartWidth,\n chartHeight = chart.chartHeight,\n chartBackground = chart.chartBackground,\n plotBackground = chart.plotBackground,\n plotBorder = chart.plotBorder,\n plotBGImage = chart.plotBGImage,\n chartBorderWidth = optionsChart.borderWidth || 0,\n chartBackgroundColor = optionsChart.backgroundColor,\n plotBackgroundColor = optionsChart.plotBackgroundColor,\n plotBackgroundImage = optionsChart.plotBackgroundImage,\n plotBorderWidth = optionsChart.plotBorderWidth || 0,\n mgn,\n bgAttr,\n plotLeft = chart.plotLeft,\n plotTop = chart.plotTop,\n plotWidth = chart.plotWidth,\n plotHeight = chart.plotHeight,\n plotBox = chart.plotBox,\n clipRect = chart.clipRect,\n clipBox = chart.clipBox;\n\n // Chart area\n mgn = chartBorderWidth + (optionsChart.shadow ? 8 : 0);\n\n if (chartBorderWidth || chartBackgroundColor) {\n if (!chartBackground) {\n\n bgAttr = {\n fill: chartBackgroundColor || NONE\n };\n if (chartBorderWidth) { // #980\n bgAttr.stroke = optionsChart.borderColor;\n bgAttr['stroke-width'] = chartBorderWidth;\n }\n chart.chartBackground = renderer.rect(mgn / 2, mgn / 2, chartWidth - mgn, chartHeight - mgn,\n optionsChart.borderRadius, chartBorderWidth)\n .attr(bgAttr)\n .addClass(PREFIX + 'background')\n .add()\n .shadow(optionsChart.shadow);\n\n } else { // resize\n chartBackground.animate(\n chartBackground.crisp({ width: chartWidth - mgn, height: chartHeight - mgn })\n );\n }\n }\n\n\n // Plot background\n if (plotBackgroundColor) {\n if (!plotBackground) {\n chart.plotBackground = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0)\n .attr({\n fill: plotBackgroundColor\n })\n .add()\n .shadow(optionsChart.plotShadow);\n } else {\n plotBackground.animate(plotBox);\n }\n }\n if (plotBackgroundImage) {\n if (!plotBGImage) {\n chart.plotBGImage = renderer.image(plotBackgroundImage, plotLeft, plotTop, plotWidth, plotHeight)\n .add();\n } else {\n plotBGImage.animate(plotBox);\n }\n }\n\n // Plot clip\n if (!clipRect) {\n chart.clipRect = renderer.clipRect(clipBox);\n } else {\n clipRect.animate({\n width: clipBox.width,\n height: clipBox.height\n });\n }\n\n // Plot area border\n if (plotBorderWidth) {\n if (!plotBorder) {\n chart.plotBorder = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0, -plotBorderWidth)\n .attr({\n stroke: optionsChart.plotBorderColor,\n 'stroke-width': plotBorderWidth,\n fill: NONE,\n zIndex: 1\n })\n .add();\n } else {\n plotBorder.strokeWidth = -plotBorderWidth;\n plotBorder.animate(\n plotBorder.crisp({ x: plotLeft, y: plotTop, width: plotWidth, height: plotHeight }) //#3282 plotBorder should be negative\n );\n }\n }\n\n // reset\n chart.isDirtyBox = false;\n },\n\n /**\n * Detect whether a certain chart property is needed based on inspecting its options\n * and series. This mainly applies to the chart.invert property, and in extensions to\n * the chart.angular and chart.polar properties.\n */\n propFromSeries: function () {\n var chart = this,\n optionsChart = chart.options.chart,\n klass,\n seriesOptions = chart.options.series,\n i,\n value;\n\n\n each(['inverted', 'angular', 'polar'], function (key) {\n\n // The default series type's class\n klass = seriesTypes[optionsChart.type || optionsChart.defaultSeriesType];\n\n // Get the value from available chart-wide properties\n value = (\n chart[key] || // 1. it is set before\n optionsChart[key] || // 2. it is set in the options\n (klass && klass.prototype[key]) // 3. it's default series class requires it\n );\n\n // 4. Check if any the chart's series require it\n i = seriesOptions && seriesOptions.length;\n while (!value && i--) {\n klass = seriesTypes[seriesOptions[i].type];\n if (klass && klass.prototype[key]) {\n value = true;\n }\n }\n\n // Set the chart property\n chart[key] = value;\n });\n\n },\n\n /**\n * Link two or more series together. This is done initially from Chart.render,\n * and after Chart.addSeries and Series.remove.\n */\n linkSeries: function () {\n var chart = this,\n chartSeries = chart.series;\n\n // Reset links\n each(chartSeries, function (series) {\n series.linkedSeries.length = 0;\n });\n\n // Apply new links\n each(chartSeries, function (series) {\n var linkedTo = series.options.linkedTo;\n if (isString(linkedTo)) {\n if (linkedTo === ':previous') {\n linkedTo = chart.series[series.index - 1];\n } else {\n linkedTo = chart.get(linkedTo);\n }\n if (linkedTo) {\n linkedTo.linkedSeries.push(series);\n series.linkedParent = linkedTo;\n series.visible = pick(series.options.visible, linkedTo.options.visible, series.visible); // #3879\n }\n }\n });\n },\n\n /**\n * Render series for the chart\n */\n renderSeries: function () {\n each(this.series, function (serie) {\n serie.translate();\n serie.render();\n });\n },\n\n /**\n * Render labels for the chart\n */\n renderLabels: function () {\n var chart = this,\n labels = chart.options.labels;\n if (labels.items) {\n each(labels.items, function (label) {\n var style = extend(labels.style, label.style),\n x = pInt(style.left) + chart.plotLeft,\n y = pInt(style.top) + chart.plotTop + 12;\n\n // delete to prevent rewriting in IE\n delete style.left;\n delete style.top;\n\n chart.renderer.text(\n label.html,\n x,\n y\n )\n .attr({ zIndex: 2 })\n .css(style)\n .add();\n\n });\n }\n },\n\n /**\n * Render all graphics for the chart\n */\n render: function () {\n var chart = this,\n axes = chart.axes,\n renderer = chart.renderer,\n options = chart.options,\n tempWidth,\n tempHeight,\n redoHorizontal,\n redoVertical;\n\n // Title\n chart.setTitle();\n\n\n // Legend\n chart.legend = new Legend(chart, options.legend);\n\n // Get stacks\n if (chart.getStacks) {\n chart.getStacks();\n }\n\n // Get chart margins\n chart.getMargins(true);\n chart.setChartSize();\n\n // Record preliminary dimensions for later comparison\n tempWidth = chart.plotWidth;\n tempHeight = chart.plotHeight = chart.plotHeight - 21; // 21 is the most common correction for X axis labels\n\n // Get margins by pre-rendering axes\n each(axes, function (axis) {\n axis.setScale();\n });\n chart.getAxisMargins();\n\n // If the plot area size has changed significantly, calculate tick positions again\n redoHorizontal = tempWidth / chart.plotWidth > 1.1;\n redoVertical = tempHeight / chart.plotHeight > 1.05; // Height is more sensitive\n\n if (redoHorizontal || redoVertical) {\n\n chart.maxTicks = null; // reset for second pass\n each(axes, function (axis) {\n if ((axis.horiz && redoHorizontal) || (!axis.horiz && redoVertical)) {\n axis.setTickInterval(true); // update to reflect the new margins\n }\n });\n chart.getMargins(); // second pass to check for new labels\n }\n\n // Draw the borders and backgrounds\n chart.drawChartBox();\n\n\n // Axes\n if (chart.hasCartesianSeries) {\n each(axes, function (axis) {\n if (axis.visible) {\n axis.render();\n }\n });\n }\n\n // The series\n if (!chart.seriesGroup) {\n chart.seriesGroup = renderer.g('series-group')\n .attr({ zIndex: 3 })\n .add();\n }\n chart.renderSeries();\n\n // Labels\n chart.renderLabels();\n\n // Credits\n chart.showCredits(options.credits);\n\n // Set flag\n chart.hasRendered = true;\n\n },\n\n /**\n * Show chart credits based on config options\n */\n showCredits: function (credits) {\n if (credits.enabled && !this.credits) {\n this.credits = this.renderer.text(\n credits.text,\n 0,\n 0\n )\n .on('click', function () {\n if (credits.href) {\n win.location.href = credits.href;\n }\n })\n .attr({\n align: credits.position.align,\n zIndex: 8\n })\n .css(credits.style)\n .add()\n .align(credits.position);\n }\n },\n\n /**\n * Clean up memory usage\n */\n destroy: function () {\n var chart = this,\n axes = chart.axes,\n series = chart.series,\n container = chart.container,\n i,\n parentNode = container && container.parentNode;\n\n // fire the chart.destoy event\n fireEvent(chart, 'destroy');\n\n // Delete the chart from charts lookup array\n charts[chart.index] = UNDEFINED;\n chartCount--;\n chart.renderTo.removeAttribute('data-highcharts-chart');\n\n // remove events\n removeEvent(chart);\n\n // ==== Destroy collections:\n // Destroy axes\n i = axes.length;\n while (i--) {\n axes[i] = axes[i].destroy();\n }\n\n // Destroy each series\n i = series.length;\n while (i--) {\n series[i] = series[i].destroy();\n }\n\n // ==== Destroy chart properties:\n each(['title', 'subtitle', 'chartBackground', 'plotBackground', 'plotBGImage',\n 'plotBorder', 'seriesGroup', 'clipRect', 'credits', 'pointer', 'scroller',\n 'rangeSelector', 'legend', 'resetZoomButton', 'tooltip', 'renderer'], function (name) {\n var prop = chart[name];\n\n if (prop && prop.destroy) {\n chart[name] = prop.destroy();\n }\n });\n\n // remove container and all SVG\n if (container) { // can break in IE when destroyed before finished loading\n container.innerHTML = '';\n removeEvent(container);\n if (parentNode) {\n discardElement(container);\n }\n\n }\n\n // clean it all up\n for (i in chart) {\n delete chart[i];\n }\n\n },\n\n\n /**\n * VML namespaces can't be added until after complete. Listening\n * for Perini's doScroll hack is not enough.\n */\n isReadyToRender: function () {\n var chart = this;\n\n // Note: win == win.top is required\n if ((!hasSVG && (win == win.top && doc.readyState !== 'complete')) || (useCanVG && !win.canvg)) { // eslint-disable-line eqeqeq\n if (useCanVG) {\n // Delay rendering until canvg library is downloaded and ready\n CanVGController.push(function () {\n chart.firstRender();\n }, chart.options.global.canvasToolsURL);\n } else {\n doc.attachEvent('onreadystatechange', function () {\n doc.detachEvent('onreadystatechange', chart.firstRender);\n if (doc.readyState === 'complete') {\n chart.firstRender();\n }\n });\n }\n return false;\n }\n return true;\n },\n\n /**\n * Prepare for first rendering after all data are loaded\n */\n firstRender: function () {\n var chart = this,\n options = chart.options;\n\n // Check whether the chart is ready to render\n if (!chart.isReadyToRender()) {\n return;\n }\n\n // Create the container\n chart.getContainer();\n\n // Run an early event after the container and renderer are established\n fireEvent(chart, 'init');\n\n\n chart.resetMargins();\n chart.setChartSize();\n\n // Set the common chart properties (mainly invert) from the given series\n chart.propFromSeries();\n\n // get axes\n chart.getAxes();\n\n // Initialize the series\n each(options.series || [], function (serieOptions) {\n chart.initSeries(serieOptions);\n });\n\n chart.linkSeries();\n\n // Run an event after axes and series are initialized, but before render. At this stage,\n // the series data is indexed and cached in the xData and yData arrays, so we can access\n // those before rendering. Used in Highstock.\n fireEvent(chart, 'beforeRender');\n\n // depends on inverted and on margins being set\n if (Highcharts.Pointer) {\n chart.pointer = new Pointer(chart, options);\n }\n\n chart.render();\n\n // add canvas\n chart.renderer.draw();\n \n // Fire the load event if there are no external images\n if (!chart.renderer.imgCount && chart.onload) {\n chart.onload();\n }\n\n // If the chart was rendered outside the top container, put it back in (#3679)\n chart.cloneRenderTo(true);\n\n },\n\n /** \n * On chart load\n */\n onload: function () {\n var chart = this;\n\n // Run callbacks\n each([this.callback].concat(this.callbacks), function (fn) {\n if (fn && chart.index !== undefined) { // Chart destroyed in its own callback (#3600)\n fn.apply(chart, [chart]);\n }\n });\n\n fireEvent(chart, 'load');\n\n // Don't run again\n this.onload = null;\n },\n\n /**\n * Creates arrays for spacing and margin from given options.\n */\n splashArray: function (target, options) {\n var oVar = options[target],\n tArray = isObject(oVar) ? oVar : [oVar, oVar, oVar, oVar];\n\n return [pick(options[target + 'Top'], tArray[0]),\n pick(options[target + 'Right'], tArray[1]),\n pick(options[target + 'Bottom'], tArray[2]),\n pick(options[target + 'Left'], tArray[3])];\n }\n }; // end Chart\n\n var CenteredSeriesMixin = Highcharts.CenteredSeriesMixin = {\n /**\n * Get the center of the pie based on the size and center options relative to the\n * plot area. Borrowed by the polar and gauge series types.\n */\n getCenter: function () {\n\n var options = this.options,\n chart = this.chart,\n slicingRoom = 2 * (options.slicedOffset || 0),\n handleSlicingRoom,\n plotWidth = chart.plotWidth - 2 * slicingRoom,\n plotHeight = chart.plotHeight - 2 * slicingRoom,\n centerOption = options.center,\n positions = [pick(centerOption[0], '50%'), pick(centerOption[1], '50%'), options.size || '100%', options.innerSize || 0],\n smallestSize = mathMin(plotWidth, plotHeight),\n i,\n value;\n\n for (i = 0; i < 4; ++i) {\n value = positions[i];\n handleSlicingRoom = i < 2 || (i === 2 && /%$/.test(value));\n\n // i == 0: centerX, relative to width\n // i == 1: centerY, relative to height\n // i == 2: size, relative to smallestSize\n // i == 3: innerSize, relative to size\n positions[i] = relativeLength(value, [plotWidth, plotHeight, smallestSize, positions[2]][i]) +\n (handleSlicingRoom ? slicingRoom : 0);\n\n }\n // innerSize cannot be larger than size (#3632)\n if (positions[3] > positions[2]) {\n positions[3] = positions[2];\n }\n return positions;\n }\n };\n\n /**\n * The Point object and prototype. Inheritable and used as base for PiePoint\n */\n var Point = function () {};\n Point.prototype = {\n\n /**\n * Initialize the point\n * @param {Object} series The series object containing this point\n * @param {Object} options The data in either number, array or object format\n */\n init: function (series, options, x) {\n\n var point = this,\n colors;\n point.series = series;\n point.color = series.color; // #3445\n point.applyOptions(options, x);\n point.pointAttr = {};\n\n if (series.options.colorByPoint) {\n colors = series.options.colors || series.chart.options.colors;\n point.color = point.color || colors[series.colorCounter++];\n // loop back to zero\n if (series.colorCounter === colors.length) {\n series.colorCounter = 0;\n }\n }\n\n series.chart.pointCount++;\n return point;\n },\n /**\n * Apply the options containing the x and y data and possible some extra properties.\n * This is called on point init or from point.update.\n *\n * @param {Object} options\n */\n applyOptions: function (options, x) {\n var point = this,\n series = point.series,\n pointValKey = series.options.pointValKey || series.pointValKey;\n\n options = Point.prototype.optionsToObject.call(this, options);\n\n // copy options directly to point\n extend(point, options);\n point.options = point.options ? extend(point.options, options) : options;\n\n // For higher dimension series types. For instance, for ranges, point.y is mapped to point.low.\n if (pointValKey) {\n point.y = point[pointValKey];\n }\n point.isNull = point.x === null || !isNumber(point.y, true); // #3571, check for NaN\n\n // If no x is set by now, get auto incremented value. All points must have an\n // x value, however the y value can be null to create a gap in the series\n if (point.x === undefined && series) {\n if (x === undefined) {\n point.x = series.autoIncrement(point);\n } else {\n point.x = x;\n }\n }\n\n // Write the last point's name to the names array\n if (series.xAxis && series.xAxis.names) {\n series.xAxis.names[point.x] = point.name;\n }\n\n return point;\n },\n\n /**\n * Transform number or array configs into objects\n */\n optionsToObject: function (options) {\n var ret = {},\n series = this.series,\n keys = series.options.keys,\n pointArrayMap = keys || series.pointArrayMap || ['y'],\n valueCount = pointArrayMap.length,\n firstItemType,\n i = 0,\n j = 0;\n\n if (isNumber(options) || options === null) {\n ret[pointArrayMap[0]] = options;\n\n } else if (isArray(options)) {\n // with leading x value\n if (!keys && options.length > valueCount) {\n firstItemType = typeof options[0];\n if (firstItemType === 'string') {\n ret.name = options[0];\n } else if (firstItemType === 'number') {\n ret.x = options[0];\n }\n i++;\n }\n while (j < valueCount) {\n if (!keys || options[i] !== undefined) { // Skip undefined positions for keys\n ret[pointArrayMap[j]] = options[i];\n }\n i++;\n j++;\n }\n } else if (typeof options === 'object') {\n ret = options;\n\n // This is the fastest way to detect if there are individual point dataLabels that need\n // to be considered in drawDataLabels. These can only occur in object configs.\n if (options.dataLabels) {\n series._hasPointLabels = true;\n }\n\n // Same approach as above for markers\n if (options.marker) {\n series._hasPointMarkers = true;\n }\n }\n return ret;\n },\n\n /**\n * Destroy a point to clear memory. Its reference still stays in series.data.\n */\n destroy: function () {\n var point = this,\n series = point.series,\n chart = series.chart,\n hoverPoints = chart.hoverPoints,\n prop;\n\n chart.pointCount--;\n\n if (hoverPoints) {\n point.setState();\n erase(hoverPoints, point);\n if (!hoverPoints.length) {\n chart.hoverPoints = null;\n }\n\n }\n if (point === chart.hoverPoint) {\n point.onMouseOut();\n }\n\n // remove all events\n if (point.graphic || point.dataLabel) { // removeEvent and destroyElements are performance expensive\n removeEvent(point);\n point.destroyElements();\n }\n\n if (point.legendItem) { // pies have legend items\n chart.legend.destroyItem(point);\n }\n\n for (prop in point) {\n point[prop] = null;\n }\n\n\n },\n\n /**\n * Destroy SVG elements associated with the point\n */\n destroyElements: function () {\n var point = this,\n props = ['graphic', 'dataLabel', 'dataLabelUpper', 'connector', 'shadowGroup'],\n prop,\n i = 6;\n while (i--) {\n prop = props[i];\n if (point[prop]) {\n point[prop] = point[prop].destroy();\n }\n }\n },\n\n /**\n * Return the configuration hash needed for the data label and tooltip formatters\n */\n getLabelConfig: function () {\n return {\n x: this.category,\n y: this.y,\n color: this.color,\n key: this.name || this.category,\n series: this.series,\n point: this,\n percentage: this.percentage,\n total: this.total || this.stackTotal\n };\n },\n\n /**\n * Extendable method for formatting each point's tooltip line\n *\n * @return {String} A string to be concatenated in to the common tooltip text\n */\n tooltipFormatter: function (pointFormat) {\n\n // Insert options for valueDecimals, valuePrefix, and valueSuffix\n var series = this.series,\n seriesTooltipOptions = series.tooltipOptions,\n valueDecimals = pick(seriesTooltipOptions.valueDecimals, ''),\n valuePrefix = seriesTooltipOptions.valuePrefix || '',\n valueSuffix = seriesTooltipOptions.valueSuffix || '';\n\n // Loop over the point array map and replace unformatted values with sprintf formatting markup\n each(series.pointArrayMap || ['y'], function (key) {\n key = '{point.' + key; // without the closing bracket\n if (valuePrefix || valueSuffix) {\n pointFormat = pointFormat.replace(key + '}', valuePrefix + key + '}' + valueSuffix);\n }\n pointFormat = pointFormat.replace(key + '}', key + ':,.' + valueDecimals + 'f}');\n });\n\n return format(pointFormat, {\n point: this,\n series: this.series\n });\n },\n\n /**\n * Fire an event on the Point object.\n * @param {String} eventType\n * @param {Object} eventArgs Additional event arguments\n * @param {Function} defaultFunction Default event handler\n */\n firePointEvent: function (eventType, eventArgs, defaultFunction) {\n var point = this,\n series = this.series,\n seriesOptions = series.options;\n\n // load event handlers on demand to save time on mouseover/out\n if (seriesOptions.point.events[eventType] || (point.options && point.options.events && point.options.events[eventType])) {\n this.importEvents();\n }\n\n // add default handler if in selection mode\n if (eventType === 'click' && seriesOptions.allowPointSelect) {\n defaultFunction = function (event) {\n // Control key is for Windows, meta (= Cmd key) for Mac, Shift for Opera\n if (point.select) { // Could be destroyed by prior event handlers (#2911)\n point.select(null, event.ctrlKey || event.metaKey || event.shiftKey);\n }\n };\n }\n\n fireEvent(this, eventType, eventArgs, defaultFunction);\n },\n visible: true\n };/**\n * @classDescription The base function which all other series types inherit from. The data in the series is stored\n * in various arrays.\n *\n * - First, series.options.data contains all the original config options for\n * each point whether added by options or methods like series.addPoint.\n * - Next, series.data contains those values converted to points, but in case the series data length\n * exceeds the cropThreshold, or if the data is grouped, series.data doesn't contain all the points. It\n * only contains the points that have been created on demand.\n * - Then there's series.points that contains all currently visible point objects. In case of cropping,\n * the cropped-away points are not part of this array. The series.points array starts at series.cropStart\n * compared to series.data and series.options.data. If however the series data is grouped, these can't\n * be correlated one to one.\n * - series.xData and series.processedXData contain clean x values, equivalent to series.data and series.points.\n * - series.yData and series.processedYData contain clean x values, equivalent to series.data and series.points.\n *\n * @param {Object} chart\n * @param {Object} options\n */\n var Series = Highcharts.Series = function () {};\n\n Series.prototype = {\n\n isCartesian: true,\n type: 'line',\n pointClass: Point,\n sorted: true, // requires the data to be sorted\n requireSorting: true,\n pointAttrToOptions: { // mapping between SVG attributes and the corresponding options\n stroke: 'lineColor',\n 'stroke-width': 'lineWidth',\n fill: 'fillColor',\n r: 'radius'\n },\n directTouch: false,\n axisTypes: ['xAxis', 'yAxis'],\n colorCounter: 0,\n parallelArrays: ['x', 'y'], // each point's x and y values are stored in this.xData and this.yData\n init: function (chart, options) {\n var series = this,\n eventType,\n events,\n chartSeries = chart.series,\n sortByIndex = function (a, b) {\n return pick(a.options.index, a._i) - pick(b.options.index, b._i);\n };\n\n series.chart = chart;\n series.options = options = series.setOptions(options); // merge with plotOptions\n series.linkedSeries = [];\n\n // bind the axes\n series.bindAxes();\n\n // set some variables\n extend(series, {\n name: options.name,\n state: NORMAL_STATE,\n pointAttr: {},\n visible: options.visible !== false, // true by default\n selected: options.selected === true // false by default\n });\n\n // special\n if (useCanVG) {\n options.animation = false;\n }\n\n // register event listeners\n events = options.events;\n for (eventType in events) {\n addEvent(series, eventType, events[eventType]);\n }\n if (\n (events && events.click) ||\n (options.point && options.point.events && options.point.events.click) ||\n options.allowPointSelect\n ) {\n chart.runTrackerClick = true;\n }\n\n series.getColor();\n series.getSymbol();\n\n // Set the data\n each(series.parallelArrays, function (key) {\n series[key + 'Data'] = [];\n });\n series.setData(options.data, false);\n\n // Mark cartesian\n if (series.isCartesian) {\n chart.hasCartesianSeries = true;\n }\n\n // Register it in the chart\n chartSeries.push(series);\n series._i = chartSeries.length - 1;\n\n // Sort series according to index option (#248, #1123, #2456)\n stableSort(chartSeries, sortByIndex);\n if (this.yAxis) {\n stableSort(this.yAxis.series, sortByIndex);\n }\n\n each(chartSeries, function (series, i) {\n series.index = i;\n series.name = series.name || 'Series ' + (i + 1);\n });\n\n },\n\n /**\n * Set the xAxis and yAxis properties of cartesian series, and register the series\n * in the axis.series array\n */\n bindAxes: function () {\n var series = this,\n seriesOptions = series.options,\n chart = series.chart,\n axisOptions;\n\n each(series.axisTypes || [], function (AXIS) { // repeat for xAxis and yAxis\n\n each(chart[AXIS], function (axis) { // loop through the chart's axis objects\n axisOptions = axis.options;\n\n // apply if the series xAxis or yAxis option mathches the number of the\n // axis, or if undefined, use the first axis\n if ((seriesOptions[AXIS] === axisOptions.index) ||\n (seriesOptions[AXIS] !== UNDEFINED && seriesOptions[AXIS] === axisOptions.id) ||\n (seriesOptions[AXIS] === UNDEFINED && axisOptions.index === 0)) {\n\n // register this series in the axis.series lookup\n axis.series.push(series);\n\n // set this series.xAxis or series.yAxis reference\n series[AXIS] = axis;\n\n // mark dirty for redraw\n axis.isDirty = true;\n }\n });\n\n // The series needs an X and an Y axis\n if (!series[AXIS] && series.optionalAxis !== AXIS) {\n error(18, true);\n }\n\n });\n },\n\n /**\n * For simple series types like line and column, the data values are held in arrays like\n * xData and yData for quick lookup to find extremes and more. For multidimensional series\n * like bubble and map, this can be extended with arrays like zData and valueData by\n * adding to the series.parallelArrays array.\n */\n updateParallelArrays: function (point, i) {\n var series = point.series,\n args = arguments,\n fn = isNumber(i) ?\n // Insert the value in the given position\n function (key) {\n var val = key === 'y' && series.toYData ? series.toYData(point) : point[key];\n series[key + 'Data'][i] = val;\n } :\n // Apply the method specified in i with the following arguments as arguments\n function (key) {\n Array.prototype[i].apply(series[key + 'Data'], Array.prototype.slice.call(args, 2));\n };\n\n each(series.parallelArrays, fn);\n },\n\n /**\n * Return an auto incremented x value based on the pointStart and pointInterval options.\n * This is only used if an x value is not given for the point that calls autoIncrement.\n */\n autoIncrement: function (point) {\n\n var options = this.options,\n xIncrement = this.xIncrement,\n date,\n pointInterval,\n pointIntervalUnit = options.pointIntervalUnit,\n xAxis = this.xAxis,\n explicitCategories,\n names,\n nameX;\n\n xIncrement = pick(xIncrement, options.pointStart, 0);\n\n this.pointInterval = pointInterval = pick(this.pointInterval, options.pointInterval, 1);\n\n // When a point name is given and no x, search for the name in the existing categories,\n // or if categories aren't provided, search names or create a new category (#2522).\n if (xAxis && xAxis.categories && point.name) {\n this.requireSorting = false;\n explicitCategories = isArray(xAxis.categories);\n names = explicitCategories ? xAxis.categories : xAxis.names;\n nameX = inArray(point.name, names); // #2522\n if (nameX === -1) { // The name is not found in currenct categories\n if (!explicitCategories) {\n xIncrement = names.length;\n }\n } else {\n xIncrement = nameX;\n }\n }\n\n // Added code for pointInterval strings\n if (pointIntervalUnit) {\n date = new Date(xIncrement);\n\n if (pointIntervalUnit === 'day') {\n date = +date[setDate](date[getDate]() + pointInterval);\n } else if (pointIntervalUnit === 'month') {\n date = +date[setMonth](date[getMonth]() + pointInterval);\n } else if (pointIntervalUnit === 'year') {\n date = +date[setFullYear](date[getFullYear]() + pointInterval);\n }\n pointInterval = date - xIncrement;\n }\n\n this.xIncrement = xIncrement + pointInterval;\n return xIncrement;\n },\n \n /**\n * Set the series options by merging from the options tree\n * @param {Object} itemOptions\n */\n setOptions: function (itemOptions) {\n var chart = this.chart,\n chartOptions = chart.options,\n plotOptions = chartOptions.plotOptions,\n userOptions = chart.userOptions || {},\n userPlotOptions = userOptions.plotOptions || {},\n typeOptions = plotOptions[this.type],\n options,\n zones;\n\n this.userOptions = itemOptions;\n\n // General series options take precedence over type options because otherwise, default\n // type options like column.animation would be overwritten by the general option.\n // But issues have been raised here (#3881), and the solution may be to distinguish\n // between default option and userOptions like in the tooltip below.\n options = merge(\n typeOptions,\n plotOptions.series,\n itemOptions\n );\n\n // The tooltip options are merged between global and series specific options\n this.tooltipOptions = merge(\n defaultOptions.tooltip,\n defaultOptions.plotOptions[this.type].tooltip,\n userOptions.tooltip,\n userPlotOptions.series && userPlotOptions.series.tooltip,\n userPlotOptions[this.type] && userPlotOptions[this.type].tooltip,\n itemOptions.tooltip\n );\n\n // Delete marker object if not allowed (#1125)\n if (typeOptions.marker === null) {\n delete options.marker;\n }\n\n // Handle color zones\n this.zoneAxis = options.zoneAxis;\n zones = this.zones = (options.zones || []).slice();\n if ((options.negativeColor || options.negativeFillColor) && !options.zones) {\n zones.push({\n value: options[this.zoneAxis + 'Threshold'] || options.threshold || 0,\n color: options.negativeColor,\n fillColor: options.negativeFillColor\n });\n }\n if (zones.length) { // Push one extra zone for the rest\n if (defined(zones[zones.length - 1].value)) {\n zones.push({\n color: this.color,\n fillColor: this.fillColor\n });\n }\n }\n return options;\n },\n\n getCyclic: function (prop, value, defaults) {\n var i,\n userOptions = this.userOptions,\n indexName = '_' + prop + 'Index',\n counterName = prop + 'Counter';\n\n if (!value) {\n if (defined(userOptions[indexName])) { // after Series.update()\n i = userOptions[indexName];\n } else {\n userOptions[indexName] = i = this.chart[counterName] % defaults.length;\n this.chart[counterName] += 1;\n }\n value = defaults[i];\n }\n this[prop] = value;\n },\n\n /**\n * Get the series' color\n */\n getColor: function () {\n if (this.options.colorByPoint) {\n this.options.color = null; // #4359, selected slice got series.color even when colorByPoint was set.\n } else {\n this.getCyclic('color', this.options.color || defaultPlotOptions[this.type].color, this.chart.options.colors);\n }\n },\n /**\n * Get the series' symbol\n */\n getSymbol: function () {\n var seriesMarkerOption = this.options.marker;\n\n this.getCyclic('symbol', seriesMarkerOption.symbol, this.chart.options.symbols);\n\n // don't substract radius in image symbols (#604)\n if (/^url/.test(this.symbol)) {\n seriesMarkerOption.radius = 0;\n }\n },\n\n drawLegendSymbol: LegendSymbolMixin.drawLineMarker,\n\n /**\n * Replace the series data with a new set of data\n * @param {Object} data\n * @param {Object} redraw\n */\n setData: function (data, redraw, animation, updatePoints) {\n var series = this,\n oldData = series.points,\n oldDataLength = (oldData && oldData.length) || 0,\n dataLength,\n options = series.options,\n chart = series.chart,\n firstPoint = null,\n xAxis = series.xAxis,\n i,\n turboThreshold = options.turboThreshold,\n pt,\n xData = this.xData,\n yData = this.yData,\n pointArrayMap = series.pointArrayMap,\n valueCount = pointArrayMap && pointArrayMap.length;\n\n data = data || [];\n dataLength = data.length;\n redraw = pick(redraw, true);\n\n // If the point count is the same as is was, just run Point.update which is\n // cheaper, allows animation, and keeps references to points.\n if (updatePoints !== false && dataLength && oldDataLength === dataLength && !series.cropped && !series.hasGroupedData && series.visible) {\n each(data, function (point, i) {\n // .update doesn't exist on a linked, hidden series (#3709)\n if (oldData[i].update && point !== options.data[i]) {\n oldData[i].update(point, false, null, false);\n }\n });\n\n } else {\n\n // Reset properties\n series.xIncrement = null;\n\n series.colorCounter = 0; // for series with colorByPoint (#1547)\n\n // Update parallel arrays\n each(this.parallelArrays, function (key) {\n series[key + 'Data'].length = 0;\n });\n\n // In turbo mode, only one- or twodimensional arrays of numbers are allowed. The\n // first value is tested, and we assume that all the rest are defined the same\n // way. Although the 'for' loops are similar, they are repeated inside each\n // if-else conditional for max performance.\n if (turboThreshold && dataLength > turboThreshold) {\n\n // find the first non-null point\n i = 0;\n while (firstPoint === null && i < dataLength) {\n firstPoint = data[i];\n i++;\n }\n\n\n if (isNumber(firstPoint)) { // assume all points are numbers\n var x = pick(options.pointStart, 0),\n pointInterval = pick(options.pointInterval, 1);\n\n for (i = 0; i < dataLength; i++) {\n xData[i] = x;\n yData[i] = data[i];\n x += pointInterval;\n }\n series.xIncrement = x;\n } else if (isArray(firstPoint)) { // assume all points are arrays\n if (valueCount) { // [x, low, high] or [x, o, h, l, c]\n for (i = 0; i < dataLength; i++) {\n pt = data[i];\n xData[i] = pt[0];\n yData[i] = pt.slice(1, valueCount + 1);\n }\n } else { // [x, y]\n for (i = 0; i < dataLength; i++) {\n pt = data[i];\n xData[i] = pt[0];\n yData[i] = pt[1];\n }\n }\n } else {\n error(12); // Highcharts expects configs to be numbers or arrays in turbo mode\n }\n } else {\n for (i = 0; i < dataLength; i++) {\n if (data[i] !== UNDEFINED) { // stray commas in oldIE\n pt = { series: series };\n series.pointClass.prototype.applyOptions.apply(pt, [data[i]]);\n series.updateParallelArrays(pt, i);\n }\n }\n }\n\n // Forgetting to cast strings to numbers is a common caveat when handling CSV or JSON\n if (isString(yData[0])) {\n error(14, true);\n }\n\n series.data = [];\n series.options.data = series.userOptions.data = data;\n\n // destroy old points\n i = oldDataLength;\n while (i--) {\n if (oldData[i] && oldData[i].destroy) {\n oldData[i].destroy();\n }\n }\n\n // reset minRange (#878)\n if (xAxis) {\n xAxis.minRange = xAxis.userMinRange;\n }\n\n // redraw\n series.isDirty = series.isDirtyData = chart.isDirtyBox = true;\n animation = false;\n }\n\n // Typically for pie series, points need to be processed and generated\n // prior to rendering the legend\n if (options.legendType === 'point') {\n this.processData();\n this.generatePoints();\n }\n\n if (redraw) {\n chart.redraw(animation);\n }\n },\n\n /**\n * Process the data by cropping away unused data points if the series is longer\n * than the crop threshold. This saves computing time for lage series.\n */\n processData: function (force) {\n var series = this,\n processedXData = series.xData, // copied during slice operation below\n processedYData = series.yData,\n dataLength = processedXData.length,\n croppedData,\n cropStart = 0,\n cropped,\n distance,\n closestPointRange,\n xAxis = series.xAxis,\n i, // loop variable\n options = series.options,\n cropThreshold = options.cropThreshold,\n getExtremesFromAll = series.getExtremesFromAll || options.getExtremesFromAll, // #4599\n isCartesian = series.isCartesian,\n xExtremes,\n val2lin = xAxis && xAxis.val2lin,\n isLog = xAxis && xAxis.isLog,\n min,\n max;\n\n // If the series data or axes haven't changed, don't go through this. Return false to pass\n // the message on to override methods like in data grouping.\n if (isCartesian && !series.isDirty && !xAxis.isDirty && !series.yAxis.isDirty && !force) {\n return false;\n }\n\n if (xAxis) {\n xExtremes = xAxis.getExtremes(); // corrected for log axis (#3053)\n min = xExtremes.min;\n max = xExtremes.max;\n }\n\n // optionally filter out points outside the plot area\n if (isCartesian && series.sorted && !getExtremesFromAll && (!cropThreshold || dataLength > cropThreshold || series.forceCrop)) {\n\n // it's outside current extremes\n if (processedXData[dataLength - 1] < min || processedXData[0] > max) {\n processedXData = [];\n processedYData = [];\n\n // only crop if it's actually spilling out\n } else if (processedXData[0] < min || processedXData[dataLength - 1] > max) {\n croppedData = this.cropData(series.xData, series.yData, min, max);\n processedXData = croppedData.xData;\n processedYData = croppedData.yData;\n cropStart = croppedData.start;\n cropped = true;\n }\n }\n\n\n // Find the closest distance between processed points\n i = processedXData.length || 1;\n while (--i) {\n distance = isLog ?\n val2lin(processedXData[i]) - val2lin(processedXData[i - 1]) :\n processedXData[i] - processedXData[i - 1];\n\n if (distance > 0 && (closestPointRange === UNDEFINED || distance < closestPointRange)) {\n closestPointRange = distance;\n\n // Unsorted data is not supported by the line tooltip, as well as data grouping and\n // navigation in Stock charts (#725) and width calculation of columns (#1900)\n } else if (distance < 0 && series.requireSorting) {\n error(15);\n }\n }\n\n // Record the properties\n series.cropped = cropped; // undefined or true\n series.cropStart = cropStart;\n series.processedXData = processedXData;\n series.processedYData = processedYData;\n\n series.closestPointRange = closestPointRange;\n\n },\n\n /**\n * Iterate over xData and crop values between min and max. Returns object containing crop start/end\n * cropped xData with corresponding part of yData, dataMin and dataMax within the cropped range\n */\n cropData: function (xData, yData, min, max) {\n var dataLength = xData.length,\n cropStart = 0,\n cropEnd = dataLength,\n cropShoulder = pick(this.cropShoulder, 1), // line-type series need one point outside\n i,\n j;\n\n // iterate up to find slice start\n for (i = 0; i < dataLength; i++) {\n if (xData[i] >= min) {\n cropStart = mathMax(0, i - cropShoulder);\n break;\n }\n }\n\n // proceed to find slice end\n for (j = i; j < dataLength; j++) {\n if (xData[j] > max) {\n cropEnd = j + cropShoulder;\n break;\n }\n }\n\n return {\n xData: xData.slice(cropStart, cropEnd),\n yData: yData.slice(cropStart, cropEnd),\n start: cropStart,\n end: cropEnd\n };\n },\n\n\n /**\n * Generate the data point after the data has been processed by cropping away\n * unused points and optionally grouped in Highcharts Stock.\n */\n generatePoints: function () {\n var series = this,\n options = series.options,\n dataOptions = options.data,\n data = series.data,\n dataLength,\n processedXData = series.processedXData,\n processedYData = series.processedYData,\n pointClass = series.pointClass,\n processedDataLength = processedXData.length,\n cropStart = series.cropStart || 0,\n cursor,\n hasGroupedData = series.hasGroupedData,\n point,\n points = [],\n i;\n\n if (!data && !hasGroupedData) {\n var arr = [];\n arr.length = dataOptions.length;\n data = series.data = arr;\n }\n\n for (i = 0; i < processedDataLength; i++) {\n cursor = cropStart + i;\n if (!hasGroupedData) {\n if (data[cursor]) {\n point = data[cursor];\n } else if (dataOptions[cursor] !== UNDEFINED) { // #970\n data[cursor] = point = (new pointClass()).init(series, dataOptions[cursor], processedXData[i]);\n }\n points[i] = point;\n } else {\n // splat the y data in case of ohlc data array\n points[i] = (new pointClass()).init(series, [processedXData[i]].concat(splat(processedYData[i])));\n points[i].dataGroup = series.groupMap[i];\n }\n points[i].index = cursor; // For faster access in Point.update\n }\n\n // Hide cropped-away points - this only runs when the number of points is above cropThreshold, or when\n // swithching view from non-grouped data to grouped data (#637)\n if (data && (processedDataLength !== (dataLength = data.length) || hasGroupedData)) {\n for (i = 0; i < dataLength; i++) {\n if (i === cropStart && !hasGroupedData) { // when has grouped data, clear all points\n i += processedDataLength;\n }\n if (data[i]) {\n data[i].destroyElements();\n data[i].plotX = UNDEFINED; // #1003\n }\n }\n }\n\n series.data = data;\n series.points = points;\n },\n\n /**\n * Calculate Y extremes for visible data\n */\n getExtremes: function (yData) {\n var xAxis = this.xAxis,\n yAxis = this.yAxis,\n xData = this.processedXData,\n yDataLength,\n activeYData = [],\n activeCounter = 0,\n xExtremes = xAxis.getExtremes(), // #2117, need to compensate for log X axis\n xMin = xExtremes.min,\n xMax = xExtremes.max,\n validValue,\n withinRange,\n x,\n y,\n i,\n j;\n\n yData = yData || this.stackedYData || this.processedYData || [];\n yDataLength = yData.length;\n\n for (i = 0; i < yDataLength; i++) {\n\n x = xData[i];\n y = yData[i];\n\n // For points within the visible range, including the first point outside the\n // visible range, consider y extremes\n validValue = y !== null && y !== UNDEFINED && (!yAxis.isLog || (y.length || y > 0));\n withinRange = this.getExtremesFromAll || this.options.getExtremesFromAll || this.cropped ||\n ((xData[i + 1] || x) >= xMin && (xData[i - 1] || x) <= xMax);\n\n if (validValue && withinRange) {\n\n j = y.length;\n if (j) { // array, like ohlc or range data\n while (j--) {\n if (y[j] !== null) {\n activeYData[activeCounter++] = y[j];\n }\n }\n } else {\n activeYData[activeCounter++] = y;\n }\n }\n }\n this.dataMin = arrayMin(activeYData);\n this.dataMax = arrayMax(activeYData);\n },\n\n /**\n * Translate data points from raw data values to chart specific positioning data\n * needed later in drawPoints, drawGraph and drawTracker.\n */\n translate: function () {\n if (!this.processedXData) { // hidden series\n this.processData();\n }\n this.generatePoints();\n var series = this,\n options = series.options,\n stacking = options.stacking,\n xAxis = series.xAxis,\n categories = xAxis.categories,\n yAxis = series.yAxis,\n points = series.points,\n dataLength = points.length,\n hasModifyValue = !!series.modifyValue,\n i,\n pointPlacement = options.pointPlacement,\n dynamicallyPlaced = pointPlacement === 'between' || isNumber(pointPlacement),\n threshold = options.threshold,\n stackThreshold = options.startFromThreshold ? threshold : 0,\n plotX,\n plotY,\n lastPlotX,\n stackIndicator,\n closestPointRangePx = Number.MAX_VALUE;\n\n // Translate each point\n for (i = 0; i < dataLength; i++) {\n var point = points[i],\n xValue = point.x,\n yValue = point.y,\n yBottom = point.low,\n stack = stacking && yAxis.stacks[(series.negStacks && yValue < (stackThreshold ? 0 : threshold) ? '-' : '') + series.stackKey],\n pointStack,\n stackValues;\n\n // Discard disallowed y values for log axes (#3434)\n if (yAxis.isLog && yValue !== null && yValue <= 0) {\n point.y = yValue = null;\n error(10);\n }\n\n // Get the plotX translation\n point.plotX = plotX = correctFloat( // #5236\n mathMin(mathMax(-1e5, xAxis.translate(xValue, 0, 0, 0, 1, pointPlacement, this.type === 'flags')), 1e5) // #3923\n );\n\n // Calculate the bottom y value for stacked series\n if (stacking && series.visible && !point.isNull && stack && stack[xValue]) {\n stackIndicator = series.getStackIndicator(stackIndicator, xValue, series.index);\n pointStack = stack[xValue];\n stackValues = pointStack.points[stackIndicator.key];\n yBottom = stackValues[0];\n yValue = stackValues[1];\n\n if (yBottom === stackThreshold && stackIndicator.key === stack[xValue].base) {\n yBottom = pick(threshold, yAxis.min);\n }\n if (yAxis.isLog && yBottom <= 0) { // #1200, #1232\n yBottom = null;\n }\n\n point.total = point.stackTotal = pointStack.total;\n point.percentage = pointStack.total && (point.y / pointStack.total * 100);\n point.stackY = yValue;\n\n // Place the stack label\n pointStack.setOffset(series.pointXOffset || 0, series.barW || 0);\n\n }\n\n // Set translated yBottom or remove it\n point.yBottom = defined(yBottom) ?\n yAxis.translate(yBottom, 0, 1, 0, 1) :\n null;\n\n // general hook, used for Highstock compare mode\n if (hasModifyValue) {\n yValue = series.modifyValue(yValue, point);\n }\n\n // Set the the plotY value, reset it for redraws\n point.plotY = plotY = (typeof yValue === 'number' && yValue !== Infinity) ?\n mathMin(mathMax(-1e5, yAxis.translate(yValue, 0, 1, 0, 1)), 1e5) : // #3201\n UNDEFINED;\n point.isInside = plotY !== UNDEFINED && plotY >= 0 && plotY <= yAxis.len && // #3519\n plotX >= 0 && plotX <= xAxis.len;\n\n\n // Set client related positions for mouse tracking\n point.clientX = dynamicallyPlaced ? correctFloat(xAxis.translate(xValue, 0, 0, 0, 1)) : plotX; // #1514\n\n point.negative = point.y < (threshold || 0);\n\n // some API data\n point.category = categories && categories[point.x] !== UNDEFINED ?\n categories[point.x] : point.x;\n\n // Determine auto enabling of markers (#3635, #5099)\n if (!point.isNull) {\n if (lastPlotX !== undefined) {\n closestPointRangePx = mathMin(closestPointRangePx, mathAbs(plotX - lastPlotX));\n }\n lastPlotX = plotX;\n }\n\n }\n series.closestPointRangePx = closestPointRangePx;\n },\n\n /**\n * Return the series points with null points filtered out\n */\n getValidPoints: function (points, insideOnly) {\n var chart = this.chart;\n return grep(points || this.points || [], function isValidPoint(point) { // #3916, #5029\n if (insideOnly && !chart.isInsidePlot(point.plotX, point.plotY, chart.inverted)) { // #5085\n return false;\n }\n return !point.isNull;\n });\n },\n\n /**\n * Set the clipping for the series. For animated series it is called twice, first to initiate\n * animating the clip then the second time without the animation to set the final clip.\n */\n setClip: function (animation) {\n var chart = this.chart,\n options = this.options,\n renderer = chart.renderer,\n inverted = chart.inverted,\n seriesClipBox = this.clipBox,\n clipBox = seriesClipBox || chart.clipBox,\n sharedClipKey = this.sharedClipKey || ['_sharedClip', animation && animation.duration, animation && animation.easing, clipBox.height, options.xAxis, options.yAxis].join(','), // #4526\n clipRect = chart[sharedClipKey],\n markerClipRect = chart[sharedClipKey + 'm'];\n\n // If a clipping rectangle with the same properties is currently present in the chart, use that.\n if (!clipRect) {\n\n // When animation is set, prepare the initial positions\n if (animation) {\n clipBox.width = 0;\n\n chart[sharedClipKey + 'm'] = markerClipRect = renderer.clipRect(\n -99, // include the width of the first marker\n inverted ? -chart.plotLeft : -chart.plotTop,\n 99,\n inverted ? chart.chartWidth : chart.chartHeight\n );\n }\n chart[sharedClipKey] = clipRect = renderer.clipRect(clipBox);\n // Create hashmap for series indexes\n clipRect.count = { length: 0 };\n\n }\n if (animation) {\n if (!clipRect.count[this.index]) {\n clipRect.count[this.index] = true;\n clipRect.count.length += 1;\n }\n }\n\n if (options.clip !== false) {\n this.group.clip(animation || seriesClipBox ? clipRect : chart.clipRect);\n this.markerGroup.clip(markerClipRect);\n this.sharedClipKey = sharedClipKey;\n }\n\n // Remove the shared clipping rectangle when all series are shown\n if (!animation) {\n if (clipRect.count[this.index]) {\n delete clipRect.count[this.index];\n clipRect.count.length -= 1;\n }\n\n if (clipRect.count.length === 0 && sharedClipKey && chart[sharedClipKey]) {\n if (!seriesClipBox) {\n chart[sharedClipKey] = chart[sharedClipKey].destroy();\n }\n if (chart[sharedClipKey + 'm']) {\n chart[sharedClipKey + 'm'] = chart[sharedClipKey + 'm'].destroy();\n }\n }\n }\n },\n\n /**\n * Animate in the series\n */\n animate: function (init) {\n var series = this,\n chart = series.chart,\n clipRect,\n animation = series.options.animation,\n sharedClipKey;\n\n // Animation option is set to true\n if (animation && !isObject(animation)) {\n animation = defaultPlotOptions[series.type].animation;\n }\n\n // Initialize the animation. Set up the clipping rectangle.\n if (init) {\n\n series.setClip(animation);\n\n // Run the animation\n } else {\n sharedClipKey = this.sharedClipKey;\n clipRect = chart[sharedClipKey];\n if (clipRect) {\n clipRect.animate({\n width: chart.plotSizeX\n }, animation);\n }\n if (chart[sharedClipKey + 'm']) {\n chart[sharedClipKey + 'm'].animate({\n width: chart.plotSizeX + 99\n }, animation);\n }\n\n // Delete this function to allow it only once\n series.animate = null;\n\n }\n },\n\n /**\n * This runs after animation to land on the final plot clipping\n */\n afterAnimate: function () {\n this.setClip();\n fireEvent(this, 'afterAnimate');\n },\n\n /**\n * Draw the markers\n */\n drawPoints: function () {\n var series = this,\n pointAttr,\n points = series.points,\n chart = series.chart,\n plotX,\n plotY,\n i,\n point,\n radius,\n symbol,\n isImage,\n graphic,\n options = series.options,\n seriesMarkerOptions = options.marker,\n seriesPointAttr = series.pointAttr[''],\n pointMarkerOptions,\n hasPointMarker,\n enabled,\n isInside,\n markerGroup = series.markerGroup,\n xAxis = series.xAxis,\n globallyEnabled = pick(\n seriesMarkerOptions.enabled,\n xAxis.isRadial,\n series.closestPointRangePx > 2 * seriesMarkerOptions.radius\n );\n\n if (seriesMarkerOptions.enabled !== false || series._hasPointMarkers) {\n\n i = points.length;\n while (i--) {\n point = points[i];\n plotX = mathFloor(point.plotX); // #1843\n plotY = point.plotY;\n graphic = point.graphic;\n pointMarkerOptions = point.marker || {};\n hasPointMarker = !!point.marker;\n enabled = (globallyEnabled && pointMarkerOptions.enabled === UNDEFINED) || pointMarkerOptions.enabled;\n isInside = point.isInside;\n\n // only draw the point if y is defined\n if (enabled && isNumber(plotY) && point.y !== null) {\n\n // shortcuts\n pointAttr = point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE] || seriesPointAttr;\n radius = pointAttr.r;\n symbol = pick(pointMarkerOptions.symbol, series.symbol);\n isImage = symbol.indexOf('url') === 0;\n\n if (graphic) { // update\n graphic[isInside ? 'show' : 'hide'](true) // Since the marker group isn't clipped, each individual marker must be toggled\n .attr(pointAttr) // #4759\n .animate(extend({\n x: plotX - radius,\n y: plotY - radius\n }, graphic.symbolName ? { // don't apply to image symbols #507\n width: 2 * radius,\n height: 2 * radius\n } : {}));\n } else if (isInside && (radius > 0 || isImage)) {\n point.graphic = graphic = chart.renderer.symbol(\n symbol,\n plotX - radius,\n plotY - radius,\n 2 * radius,\n 2 * radius,\n hasPointMarker ? pointMarkerOptions : seriesMarkerOptions\n )\n .attr(pointAttr)\n .add(markerGroup);\n }\n\n } else if (graphic) {\n point.graphic = graphic.destroy(); // #1269\n }\n }\n }\n\n },\n\n /**\n * Convert state properties from API naming conventions to SVG attributes\n *\n * @param {Object} options API options object\n * @param {Object} base1 SVG attribute object to inherit from\n * @param {Object} base2 Second level SVG attribute object to inherit from\n */\n convertAttribs: function (options, base1, base2, base3) {\n var conversion = this.pointAttrToOptions,\n attr,\n option,\n obj = {};\n\n options = options || {};\n base1 = base1 || {};\n base2 = base2 || {};\n base3 = base3 || {};\n\n for (attr in conversion) {\n option = conversion[attr];\n obj[attr] = pick(options[option], base1[attr], base2[attr], base3[attr]);\n }\n return obj;\n },\n\n /**\n * Get the state attributes. Each series type has its own set of attributes\n * that are allowed to change on a point's state change. Series wide attributes are stored for\n * all series, and additionally point specific attributes are stored for all\n * points with individual marker options. If such options are not defined for the point,\n * a reference to the series wide attributes is stored in point.pointAttr.\n */\n getAttribs: function () {\n var series = this,\n seriesOptions = series.options,\n normalOptions = defaultPlotOptions[series.type].marker ? seriesOptions.marker : seriesOptions,\n stateOptions = normalOptions.states,\n stateOptionsHover = stateOptions[HOVER_STATE],\n pointStateOptionsHover,\n seriesColor = series.color,\n seriesNegativeColor = series.options.negativeColor,\n normalDefaults = {\n stroke: seriesColor,\n fill: seriesColor\n },\n points = series.points || [], // #927\n i,\n j,\n threshold,\n point,\n seriesPointAttr = [],\n pointAttr,\n pointAttrToOptions = series.pointAttrToOptions,\n hasPointSpecificOptions = series.hasPointSpecificOptions,\n defaultLineColor = normalOptions.lineColor,\n defaultFillColor = normalOptions.fillColor,\n turboThreshold = seriesOptions.turboThreshold,\n zones = series.zones,\n zoneAxis = series.zoneAxis || 'y',\n zoneColor, \n attr,\n key;\n\n // series type specific modifications\n if (seriesOptions.marker) { // line, spline, area, areaspline, scatter\n\n // if no hover radius is given, default to normal radius + 2\n stateOptionsHover.radius = +stateOptionsHover.radius || +normalOptions.radius + +stateOptionsHover.radiusPlus;\n stateOptionsHover.lineWidth = stateOptionsHover.lineWidth || normalOptions.lineWidth + stateOptionsHover.lineWidthPlus;\n\n } else { // column, bar, pie\n\n // if no hover color is given, brighten the normal color\n stateOptionsHover.color = stateOptionsHover.color ||\n Color(stateOptionsHover.color || seriesColor)\n .brighten(stateOptionsHover.brightness).get();\n\n // if no hover negativeColor is given, brighten the normal negativeColor\n stateOptionsHover.negativeColor = stateOptionsHover.negativeColor ||\n Color(stateOptionsHover.negativeColor || seriesNegativeColor)\n .brighten(stateOptionsHover.brightness).get();\n }\n\n // general point attributes for the series normal state\n seriesPointAttr[NORMAL_STATE] = series.convertAttribs(normalOptions, normalDefaults);\n\n // HOVER_STATE and SELECT_STATE states inherit from normal state except the default radius\n each([HOVER_STATE, SELECT_STATE], function (state) {\n seriesPointAttr[state] =\n series.convertAttribs(stateOptions[state], seriesPointAttr[NORMAL_STATE]);\n });\n\n // set it\n series.pointAttr = seriesPointAttr;\n\n\n // Generate the point-specific attribute collections if specific point\n // options are given. If not, create a referance to the series wide point\n // attributes\n i = points.length;\n if (!turboThreshold || i < turboThreshold || hasPointSpecificOptions) {\n while (i--) {\n point = points[i];\n normalOptions = (point.options && point.options.marker) || point.options;\n if (normalOptions && normalOptions.enabled === false) {\n normalOptions.radius = 0;\n }\n\n zoneColor = null;\n if (zones.length) {\n j = 0;\n threshold = zones[j];\n while (point[zoneAxis] >= threshold.value) {\n threshold = zones[++j];\n }\n\n point.color = point.fillColor = zoneColor = pick(threshold.color, series.color); // #3636, #4267, #4430 - inherit color from series, when color is undefined\n\n }\n\n hasPointSpecificOptions = seriesOptions.colorByPoint || point.color; // #868\n\n // check if the point has specific visual options\n if (point.options) {\n for (key in pointAttrToOptions) {\n if (defined(normalOptions[pointAttrToOptions[key]])) {\n hasPointSpecificOptions = true;\n }\n }\n }\n\n // a specific marker config object is defined for the individual point:\n // create it's own attribute collection\n if (hasPointSpecificOptions) {\n normalOptions = normalOptions || {};\n pointAttr = [];\n stateOptions = normalOptions.states || {}; // reassign for individual point\n pointStateOptionsHover = stateOptions[HOVER_STATE] = stateOptions[HOVER_STATE] || {};\n\n // Handle colors for column and pies\n if (!seriesOptions.marker || (point.negative && !pointStateOptionsHover.fillColor && !stateOptionsHover.fillColor)) { // column, bar, point or negative threshold for series with markers (#3636)\n // If no hover color is given, brighten the normal color. #1619, #2579\n pointStateOptionsHover[series.pointAttrToOptions.fill] = pointStateOptionsHover.color || (!point.options.color && stateOptionsHover[(point.negative && seriesNegativeColor ? 'negativeColor' : 'color')]) ||\n Color(point.color)\n .brighten(pointStateOptionsHover.brightness || stateOptionsHover.brightness)\n .get();\n }\n\n // normal point state inherits series wide normal state\n attr = { color: point.color }; // #868\n if (!defaultFillColor) { // Individual point color or negative color markers (#2219)\n attr.fillColor = point.color;\n }\n if (!defaultLineColor) {\n attr.lineColor = point.color; // Bubbles take point color, line markers use white\n }\n // Color is explicitly set to null or undefined (#1288, #4068)\n if (normalOptions.hasOwnProperty('color') && !normalOptions.color) {\n delete normalOptions.color;\n }\n\n // When zone is set, but series.states.hover.color is not set, apply zone color on hover, #4670: \n if (zoneColor && !stateOptionsHover.fillColor) {\n pointStateOptionsHover.fillColor = zoneColor;\n }\n\n pointAttr[NORMAL_STATE] = series.convertAttribs(extend(attr, normalOptions), seriesPointAttr[NORMAL_STATE]);\n\n // inherit from point normal and series hover\n pointAttr[HOVER_STATE] = series.convertAttribs(\n stateOptions[HOVER_STATE],\n seriesPointAttr[HOVER_STATE],\n pointAttr[NORMAL_STATE]\n );\n\n // inherit from point normal and series hover\n pointAttr[SELECT_STATE] = series.convertAttribs(\n stateOptions[SELECT_STATE],\n seriesPointAttr[SELECT_STATE],\n pointAttr[NORMAL_STATE]\n );\n\n\n // no marker config object is created: copy a reference to the series-wide\n // attribute collection\n } else {\n pointAttr = seriesPointAttr;\n }\n\n point.pointAttr = pointAttr;\n }\n }\n },\n\n /**\n * Clear DOM objects and free up memory\n */\n destroy: function () {\n var series = this,\n chart = series.chart,\n issue134 = /AppleWebKit\\/533/.test(userAgent),\n destroy,\n i,\n data = series.data || [],\n point,\n prop,\n axis;\n\n // add event hook\n fireEvent(series, 'destroy');\n\n // remove all events\n removeEvent(series);\n\n // erase from axes\n each(series.axisTypes || [], function (AXIS) {\n axis = series[AXIS];\n if (axis) {\n erase(axis.series, series);\n axis.isDirty = axis.forceRedraw = true;\n }\n });\n\n // remove legend items\n if (series.legendItem) {\n series.chart.legend.destroyItem(series);\n }\n\n // destroy all points with their elements\n i = data.length;\n while (i--) {\n point = data[i];\n if (point && point.destroy) {\n point.destroy();\n }\n }\n series.points = null;\n\n // Clear the animation timeout if we are destroying the series during initial animation\n clearTimeout(series.animationTimeout);\n\n // Destroy all SVGElements associated to the series\n for (prop in series) {\n if (series[prop] instanceof SVGElement && !series[prop].survive) { // Survive provides a hook for not destroying\n\n // issue 134 workaround\n destroy = issue134 && prop === 'group' ?\n 'hide' :\n 'destroy';\n\n series[prop][destroy]();\n }\n }\n\n // remove from hoverSeries\n if (chart.hoverSeries === series) {\n chart.hoverSeries = null;\n }\n erase(chart.series, series);\n\n // clear all members\n for (prop in series) {\n delete series[prop];\n }\n },\n\n /**\n * Get the graph path\n */\n getGraphPath: function (points, nullsAsZeroes, connectCliffs) {\n var series = this,\n options = series.options,\n step = options.step,\n reversed,\n graphPath = [],\n xMap = [],\n gap;\n\n points = points || series.points;\n\n // Bottom of a stack is reversed\n reversed = points.reversed;\n if (reversed) {\n points.reverse();\n }\n // Reverse the steps (#5004)\n step = { right: 1, center: 2 }[step] || (step && 3);\n if (step && reversed) {\n step = 4 - step;\n }\n\n // Remove invalid points, especially in spline (#5015)\n if (options.connectNulls && !nullsAsZeroes && !connectCliffs) {\n points = this.getValidPoints(points);\n }\n\n // Build the line\n each(points, function (point, i) {\n\n var plotX = point.plotX,\n plotY = point.plotY,\n lastPoint = points[i - 1],\n pathToPoint; // the path to this point from the previous\n\n if ((point.leftCliff || (lastPoint && lastPoint.rightCliff)) && !connectCliffs) {\n gap = true; // ... and continue\n }\n\n // Line series, nullsAsZeroes is not handled\n if (point.isNull && !defined(nullsAsZeroes) && i > 0) {\n gap = !options.connectNulls;\n\n // Area series, nullsAsZeroes is set\n } else if (point.isNull && !nullsAsZeroes) {\n gap = true;\n\n } else {\n\n if (i === 0 || gap) {\n pathToPoint = [M, point.plotX, point.plotY];\n \n } else if (series.getPointSpline) { // generate the spline as defined in the SplineSeries object\n \n pathToPoint = series.getPointSpline(points, point, i);\n\n } else if (step) {\n\n if (step === 1) { // right\n pathToPoint = [\n L,\n lastPoint.plotX,\n plotY\n ];\n \n } else if (step === 2) { // center\n pathToPoint = [\n L,\n (lastPoint.plotX + plotX) / 2,\n lastPoint.plotY,\n L,\n (lastPoint.plotX + plotX) / 2,\n plotY\n ];\n \n } else {\n pathToPoint = [\n L,\n plotX,\n lastPoint.plotY\n ];\n }\n pathToPoint.push(L, plotX, plotY);\n\n } else {\n // normal line to next point\n pathToPoint = [\n L,\n plotX,\n plotY\n ];\n }\n\n // Prepare for animation. When step is enabled, there are two path nodes for each x value.\n xMap.push(point.x);\n if (step) {\n xMap.push(point.x);\n }\n\n graphPath.push.apply(graphPath, pathToPoint);\n gap = false;\n }\n });\n\n graphPath.xMap = xMap;\n series.graphPath = graphPath;\n\n return graphPath;\n\n },\n\n /**\n * Draw the actual graph\n */\n drawGraph: function () {\n var series = this,\n options = this.options,\n props = [['graph', options.lineColor || this.color, options.dashStyle]],\n lineWidth = options.lineWidth,\n roundCap = options.linecap !== 'square',\n graphPath = (this.gappedPath || this.getGraphPath).call(this),\n zones = this.zones;\n\n each(zones, function (threshold, i) {\n props.push(['zoneGraph' + i, threshold.color || series.color, threshold.dashStyle || options.dashStyle]);\n });\n\n // Draw the graph\n each(props, function (prop, i) {\n var graphKey = prop[0],\n graph = series[graphKey],\n attribs;\n\n if (graph) {\n graph.endX = graphPath.xMap;\n graph.animate({ d: graphPath });\n\n } else if (lineWidth && graphPath.length) { // #1487\n attribs = {\n stroke: prop[1],\n 'stroke-width': lineWidth,\n fill: 'none',\n zIndex: 1 // #1069\n };\n if (prop[2]) {\n attribs.dashstyle = prop[2];\n } else if (roundCap) {\n attribs['stroke-linecap'] = attribs['stroke-linejoin'] = 'round';\n }\n\n graph = series[graphKey] = series.chart.renderer.path(graphPath)\n .attr(attribs)\n .add(series.group)\n .shadow((i < 2) && options.shadow); // add shadow to normal series (0) or to first zone (1) #3932\n }\n\n // Helpers for animation\n if (graph) {\n graph.startX = graphPath.xMap;\n //graph.shiftUnit = options.step ? 2 : 1;\n graph.isArea = graphPath.isArea; // For arearange animation\n }\n });\n },\n\n /**\n * Clip the graphs into the positive and negative coloured graphs\n */\n applyZones: function () {\n var series = this,\n chart = this.chart,\n renderer = chart.renderer,\n zones = this.zones,\n translatedFrom,\n translatedTo,\n clips = this.clips || [],\n clipAttr,\n graph = this.graph,\n area = this.area,\n chartSizeMax = mathMax(chart.chartWidth, chart.chartHeight),\n axis = this[(this.zoneAxis || 'y') + 'Axis'],\n extremes,\n reversed = axis.reversed,\n inverted = chart.inverted,\n horiz = axis.horiz,\n pxRange,\n pxPosMin,\n pxPosMax,\n ignoreZones = false;\n\n if (zones.length && (graph || area) && axis.min !== UNDEFINED) {\n // The use of the Color Threshold assumes there are no gaps\n // so it is safe to hide the original graph and area\n if (graph) {\n graph.hide();\n }\n if (area) {\n area.hide();\n }\n\n // Create the clips\n extremes = axis.getExtremes();\n each(zones, function (threshold, i) {\n\n translatedFrom = reversed ?\n (horiz ? chart.plotWidth : 0) :\n (horiz ? 0 : axis.toPixels(extremes.min));\n translatedFrom = mathMin(mathMax(pick(translatedTo, translatedFrom), 0), chartSizeMax);\n translatedTo = mathMin(mathMax(mathRound(axis.toPixels(pick(threshold.value, extremes.max), true)), 0), chartSizeMax);\n\n if (ignoreZones) {\n translatedFrom = translatedTo = axis.toPixels(extremes.max);\n }\n\n pxRange = Math.abs(translatedFrom - translatedTo);\n pxPosMin = mathMin(translatedFrom, translatedTo);\n pxPosMax = mathMax(translatedFrom, translatedTo);\n if (axis.isXAxis) {\n clipAttr = {\n x: inverted ? pxPosMax : pxPosMin,\n y: 0,\n width: pxRange,\n height: chartSizeMax\n };\n if (!horiz) {\n clipAttr.x = chart.plotHeight - clipAttr.x;\n }\n } else {\n clipAttr = {\n x: 0,\n y: inverted ? pxPosMax : pxPosMin,\n width: chartSizeMax,\n height: pxRange\n };\n if (horiz) {\n clipAttr.y = chart.plotWidth - clipAttr.y;\n }\n }\n\n /// VML SUPPPORT\n if (chart.inverted && renderer.isVML) {\n if (axis.isXAxis) {\n clipAttr = {\n x: 0,\n y: reversed ? pxPosMin : pxPosMax,\n height: clipAttr.width,\n width: chart.chartWidth\n };\n } else {\n clipAttr = {\n x: clipAttr.y - chart.plotLeft - chart.spacingBox.x,\n y: 0,\n width: clipAttr.height,\n height: chart.chartHeight\n };\n }\n }\n /// END OF VML SUPPORT\n\n if (clips[i]) {\n clips[i].animate(clipAttr);\n } else {\n clips[i] = renderer.clipRect(clipAttr);\n\n if (graph) {\n series['zoneGraph' + i].clip(clips[i]);\n }\n\n if (area) {\n series['zoneArea' + i].clip(clips[i]);\n }\n }\n // if this zone extends out of the axis, ignore the others\n ignoreZones = threshold.value > extremes.max;\n });\n this.clips = clips;\n }\n },\n\n /**\n * Initialize and perform group inversion on series.group and series.markerGroup\n */\n invertGroups: function () {\n var series = this,\n chart = series.chart;\n\n // Pie, go away (#1736)\n if (!series.xAxis) {\n return;\n }\n\n // A fixed size is needed for inversion to work\n function setInvert() {\n var size = {\n width: series.yAxis.len,\n height: series.xAxis.len\n };\n\n each(['group', 'markerGroup'], function (groupName) {\n if (series[groupName]) {\n series[groupName].attr(size).invert();\n }\n });\n }\n\n addEvent(chart, 'resize', setInvert); // do it on resize\n addEvent(series, 'destroy', function () {\n removeEvent(chart, 'resize', setInvert);\n });\n\n // Do it now\n setInvert(); // do it now\n\n // On subsequent render and redraw, just do setInvert without setting up events again\n series.invertGroups = setInvert;\n },\n\n /**\n * General abstraction for creating plot groups like series.group, series.dataLabelsGroup and\n * series.markerGroup. On subsequent calls, the group will only be adjusted to the updated plot size.\n */\n plotGroup: function (prop, name, visibility, zIndex, parent) {\n var group = this[prop],\n isNew = !group;\n\n // Generate it on first call\n if (isNew) {\n this[prop] = group = this.chart.renderer.g(name)\n .attr({\n zIndex: zIndex || 0.1 // IE8 and pointer logic use this\n })\n .add(parent);\n\n group.addClass('highcharts-series-' + this.index);\n }\n\n // Place it on first and subsequent (redraw) calls\n group.attr({ visibility: visibility })[isNew ? 'attr' : 'animate'](this.getPlotBox());\n return group;\n },\n\n /**\n * Get the translation and scale for the plot area of this series\n */\n getPlotBox: function () {\n var chart = this.chart,\n xAxis = this.xAxis,\n yAxis = this.yAxis;\n\n // Swap axes for inverted (#2339)\n if (chart.inverted) {\n xAxis = yAxis;\n yAxis = this.xAxis;\n }\n return {\n translateX: xAxis ? xAxis.left : chart.plotLeft,\n translateY: yAxis ? yAxis.top : chart.plotTop,\n scaleX: 1, // #1623\n scaleY: 1\n };\n },\n\n /**\n * Render the graph and markers\n */\n render: function () {\n var series = this,\n chart = series.chart,\n group,\n options = series.options,\n // Animation doesn't work in IE8 quirks when the group div is hidden,\n // and looks bad in other oldIE\n animDuration = !!series.animate && chart.renderer.isSVG && animObject(options.animation).duration,\n visibility = series.visible ? 'inherit' : 'hidden', // #2597\n zIndex = options.zIndex,\n hasRendered = series.hasRendered,\n chartSeriesGroup = chart.seriesGroup;\n\n // the group\n group = series.plotGroup(\n 'group',\n 'series',\n visibility,\n zIndex,\n chartSeriesGroup\n );\n\n series.markerGroup = series.plotGroup(\n 'markerGroup',\n 'markers',\n visibility,\n zIndex,\n chartSeriesGroup\n );\n\n // initiate the animation\n if (animDuration) {\n series.animate(true);\n }\n\n // cache attributes for shapes\n series.getAttribs();\n\n // SVGRenderer needs to know this before drawing elements (#1089, #1795)\n group.inverted = series.isCartesian ? chart.inverted : false;\n\n // draw the graph if any\n if (series.drawGraph) {\n series.drawGraph();\n series.applyZones();\n }\n\n each(series.points, function (point) {\n if (point.redraw) {\n point.redraw();\n }\n });\n\n // draw the data labels (inn pies they go before the points)\n if (series.drawDataLabels) {\n series.drawDataLabels();\n }\n\n // draw the points\n if (series.visible) {\n series.drawPoints();\n }\n\n\n // draw the mouse tracking area\n if (series.drawTracker && series.options.enableMouseTracking !== false) {\n series.drawTracker();\n }\n\n // Handle inverted series and tracker groups\n if (chart.inverted) {\n series.invertGroups();\n }\n\n // Initial clipping, must be defined after inverting groups for VML. Applies to columns etc. (#3839).\n if (options.clip !== false && !series.sharedClipKey && !hasRendered) {\n group.clip(chart.clipRect);\n }\n\n // Run the animation\n if (animDuration) {\n series.animate();\n }\n\n // Call the afterAnimate function on animation complete (but don't overwrite the animation.complete option\n // which should be available to the user).\n if (!hasRendered) {\n series.animationTimeout = syncTimeout(function () {\n series.afterAnimate();\n }, animDuration);\n }\n\n series.isDirty = series.isDirtyData = false; // means data is in accordance with what you see\n // (See #322) series.isDirty = series.isDirtyData = false; // means data is in accordance with what you see\n series.hasRendered = true;\n },\n\n /**\n * Redraw the series after an update in the axes.\n */\n redraw: function () {\n var series = this,\n chart = series.chart,\n wasDirty = series.isDirty || series.isDirtyData, // cache it here as it is set to false in render, but used after\n group = series.group,\n xAxis = series.xAxis,\n yAxis = series.yAxis;\n\n // reposition on resize\n if (group) {\n if (chart.inverted) {\n group.attr({\n width: chart.plotWidth,\n height: chart.plotHeight\n });\n }\n\n group.animate({\n translateX: pick(xAxis && xAxis.left, chart.plotLeft),\n translateY: pick(yAxis && yAxis.top, chart.plotTop)\n });\n }\n\n series.translate();\n series.render();\n if (wasDirty) { // #3868, #3945\n delete this.kdTree;\n }\n },\n\n /**\n * KD Tree && PointSearching Implementation\n */\n\n kdDimensions: 1,\n kdAxisArray: ['clientX', 'plotY'],\n\n searchPoint: function (e, compareX) {\n var series = this,\n xAxis = series.xAxis,\n yAxis = series.yAxis,\n inverted = series.chart.inverted;\n\n return this.searchKDTree({\n clientX: inverted ? xAxis.len - e.chartY + xAxis.pos : e.chartX - xAxis.pos,\n plotY: inverted ? yAxis.len - e.chartX + yAxis.pos : e.chartY - yAxis.pos\n }, compareX);\n },\n\n buildKDTree: function () {\n var series = this,\n dimensions = series.kdDimensions;\n\n // Internal function\n function _kdtree(points, depth, dimensions) {\n var axis,\n median,\n length = points && points.length;\n\n if (length) {\n\n // alternate between the axis\n axis = series.kdAxisArray[depth % dimensions];\n\n // sort point array\n points.sort(function (a, b) {\n return a[axis] - b[axis];\n });\n\n median = Math.floor(length / 2);\n\n // build and return nod\n return {\n point: points[median],\n left: _kdtree(points.slice(0, median), depth + 1, dimensions),\n right: _kdtree(points.slice(median + 1), depth + 1, dimensions)\n };\n\n }\n }\n\n // Start the recursive build process with a clone of the points array and null points filtered out (#3873)\n function startRecursive() {\n series.kdTree = _kdtree(\n series.getValidPoints(\n null,\n !series.directTouch // For line-type series restrict to plot area, but column-type series not (#3916, #4511)\n ),\n dimensions,\n dimensions\n );\n }\n delete series.kdTree;\n\n // For testing tooltips, don't build async\n syncTimeout(startRecursive, series.options.kdNow ? 0 : 1);\n },\n\n searchKDTree: function (point, compareX) {\n var series = this,\n kdX = this.kdAxisArray[0],\n kdY = this.kdAxisArray[1],\n kdComparer = compareX ? 'distX' : 'dist';\n\n // Set the one and two dimensional distance on the point object\n function setDistance(p1, p2) {\n var x = (defined(p1[kdX]) && defined(p2[kdX])) ? Math.pow(p1[kdX] - p2[kdX], 2) : null,\n y = (defined(p1[kdY]) && defined(p2[kdY])) ? Math.pow(p1[kdY] - p2[kdY], 2) : null,\n r = (x || 0) + (y || 0);\n\n p2.dist = defined(r) ? Math.sqrt(r) : Number.MAX_VALUE;\n p2.distX = defined(x) ? Math.sqrt(x) : Number.MAX_VALUE;\n }\n function _search(search, tree, depth, dimensions) {\n var point = tree.point,\n axis = series.kdAxisArray[depth % dimensions],\n tdist,\n sideA,\n sideB,\n ret = point,\n nPoint1,\n nPoint2;\n\n setDistance(search, point);\n\n // Pick side based on distance to splitting point\n tdist = search[axis] - point[axis];\n sideA = tdist < 0 ? 'left' : 'right';\n sideB = tdist < 0 ? 'right' : 'left';\n\n // End of tree\n if (tree[sideA]) {\n nPoint1 = _search(search, tree[sideA], depth + 1, dimensions);\n\n ret = (nPoint1[kdComparer] < ret[kdComparer] ? nPoint1 : point);\n }\n if (tree[sideB]) {\n // compare distance to current best to splitting point to decide wether to check side B or not\n if (Math.sqrt(tdist * tdist) < ret[kdComparer]) {\n nPoint2 = _search(search, tree[sideB], depth + 1, dimensions);\n ret = (nPoint2[kdComparer] < ret[kdComparer] ? nPoint2 : ret);\n }\n }\n\n return ret;\n }\n\n if (!this.kdTree) {\n this.buildKDTree();\n }\n\n if (this.kdTree) {\n return _search(point,\n this.kdTree, this.kdDimensions, this.kdDimensions);\n }\n }\n\n }; // end Series prototype\n\n /**\n * The class for stack items\n */\n function StackItem(axis, options, isNegative, x, stackOption) {\n\n var inverted = axis.chart.inverted;\n\n this.axis = axis;\n\n // Tells if the stack is negative\n this.isNegative = isNegative;\n\n // Save the options to be able to style the label\n this.options = options;\n\n // Save the x value to be able to position the label later\n this.x = x;\n\n // Initialize total value\n this.total = null;\n\n // This will keep each points' extremes stored by series.index and point index\n this.points = {};\n\n // Save the stack option on the series configuration object, and whether to treat it as percent\n this.stack = stackOption;\n this.leftCliff = 0;\n this.rightCliff = 0;\n\n // The align options and text align varies on whether the stack is negative and\n // if the chart is inverted or not.\n // First test the user supplied value, then use the dynamic.\n this.alignOptions = {\n align: options.align || (inverted ? (isNegative ? 'left' : 'right') : 'center'),\n verticalAlign: options.verticalAlign || (inverted ? 'middle' : (isNegative ? 'bottom' : 'top')),\n y: pick(options.y, inverted ? 4 : (isNegative ? 14 : -6)),\n x: pick(options.x, inverted ? (isNegative ? -6 : 6) : 0)\n };\n\n this.textAlign = options.textAlign || (inverted ? (isNegative ? 'right' : 'left') : 'center');\n }\n\n StackItem.prototype = {\n destroy: function () {\n destroyObjectProperties(this, this.axis);\n },\n\n /**\n * Renders the stack total label and adds it to the stack label group.\n */\n render: function (group) {\n var options = this.options,\n formatOption = options.format,\n str = formatOption ?\n format(formatOption, this) :\n options.formatter.call(this); // format the text in the label\n\n // Change the text to reflect the new total and set visibility to hidden in case the serie is hidden\n if (this.label) {\n this.label.attr({ text: str, visibility: 'hidden' });\n // Create new label\n } else {\n this.label =\n this.axis.chart.renderer.text(str, null, null, options.useHTML) // dummy positions, actual position updated with setOffset method in columnseries\n .css(options.style) // apply style\n .attr({\n align: this.textAlign, // fix the text-anchor\n rotation: options.rotation, // rotation\n visibility: HIDDEN // hidden until setOffset is called\n })\n .add(group); // add to the labels-group\n }\n },\n\n /**\n * Sets the offset that the stack has from the x value and repositions the label.\n */\n setOffset: function (xOffset, xWidth) {\n var stackItem = this,\n axis = stackItem.axis,\n chart = axis.chart,\n inverted = chart.inverted,\n reversed = axis.reversed,\n neg = (this.isNegative && !reversed) || (!this.isNegative && reversed), // #4056\n y = axis.translate(axis.usePercentage ? 100 : this.total, 0, 0, 0, 1), // stack value translated mapped to chart coordinates\n yZero = axis.translate(0), // stack origin\n h = mathAbs(y - yZero), // stack height\n x = chart.xAxis[0].translate(this.x) + xOffset, // stack x position\n plotHeight = chart.plotHeight,\n stackBox = { // this is the box for the complete stack\n x: inverted ? (neg ? y : y - h) : x,\n y: inverted ? plotHeight - x - xWidth : (neg ? (plotHeight - y - h) : plotHeight - y),\n width: inverted ? h : xWidth,\n height: inverted ? xWidth : h\n },\n label = this.label,\n alignAttr;\n\n if (label) {\n label.align(this.alignOptions, null, stackBox); // align the label to the box\n\n // Set visibility (#678)\n alignAttr = label.alignAttr;\n label[this.options.crop === false || chart.isInsidePlot(alignAttr.x, alignAttr.y) ? 'show' : 'hide'](true);\n }\n }\n };\n\n /**\n * Generate stacks for each series and calculate stacks total values\n */\n Chart.prototype.getStacks = function () {\n var chart = this;\n\n // reset stacks for each yAxis\n each(chart.yAxis, function (axis) {\n if (axis.stacks && axis.hasVisibleSeries) {\n axis.oldStacks = axis.stacks;\n }\n });\n\n each(chart.series, function (series) {\n if (series.options.stacking && (series.visible === true || chart.options.chart.ignoreHiddenSeries === false)) {\n series.stackKey = series.type + pick(series.options.stack, '');\n }\n });\n };\n\n\n // Stacking methods defined on the Axis prototype\n\n /**\n * Build the stacks from top down\n */\n Axis.prototype.buildStacks = function () {\n var axisSeries = this.series,\n series,\n reversedStacks = pick(this.options.reversedStacks, true),\n len = axisSeries.length,\n i;\n if (!this.isXAxis) {\n this.usePercentage = false;\n i = len;\n while (i--) {\n axisSeries[reversedStacks ? i : len - i - 1].setStackedPoints();\n }\n\n i = len;\n while (i--) {\n series = axisSeries[reversedStacks ? i : len - i - 1];\n if (series.setStackCliffs) {\n series.setStackCliffs();\n }\n }\n // Loop up again to compute percent stack\n if (this.usePercentage) {\n for (i = 0; i < len; i++) {\n axisSeries[i].setPercentStacks();\n }\n }\n }\n };\n\n Axis.prototype.renderStackTotals = function () {\n var axis = this,\n chart = axis.chart,\n renderer = chart.renderer,\n stacks = axis.stacks,\n stackKey,\n oneStack,\n stackCategory,\n stackTotalGroup = axis.stackTotalGroup;\n\n // Create a separate group for the stack total labels\n if (!stackTotalGroup) {\n axis.stackTotalGroup = stackTotalGroup =\n renderer.g('stack-labels')\n .attr({\n visibility: VISIBLE,\n zIndex: 6\n })\n .add();\n }\n\n // plotLeft/Top will change when y axis gets wider so we need to translate the\n // stackTotalGroup at every render call. See bug #506 and #516\n stackTotalGroup.translate(chart.plotLeft, chart.plotTop);\n\n // Render each stack total\n for (stackKey in stacks) {\n oneStack = stacks[stackKey];\n for (stackCategory in oneStack) {\n oneStack[stackCategory].render(stackTotalGroup);\n }\n }\n };\n\n /**\n * Set all the stacks to initial states and destroy unused ones.\n */\n Axis.prototype.resetStacks = function () {\n var stacks = this.stacks,\n type,\n i;\n if (!this.isXAxis) {\n for (type in stacks) {\n for (i in stacks[type]) {\n\n // Clean up memory after point deletion (#1044, #4320)\n if (stacks[type][i].touched < this.stacksTouched) {\n stacks[type][i].destroy();\n delete stacks[type][i];\n\n // Reset stacks\n } else {\n stacks[type][i].total = null;\n stacks[type][i].cum = 0;\n }\n }\n }\n }\n };\n\n Axis.prototype.cleanStacks = function () {\n var stacks, type, i;\n\n if (!this.isXAxis) {\n if (this.oldStacks) {\n stacks = this.stacks = this.oldStacks;\n }\n\n // reset stacks\n for (type in stacks) {\n for (i in stacks[type]) {\n stacks[type][i].cum = stacks[type][i].total;\n }\n }\n }\n };\n\n\n // Stacking methods defnied for Series prototype\n\n /**\n * Adds series' points value to corresponding stack\n */\n Series.prototype.setStackedPoints = function () {\n if (!this.options.stacking || (this.visible !== true && this.chart.options.chart.ignoreHiddenSeries !== false)) {\n return;\n }\n\n var series = this,\n xData = series.processedXData,\n yData = series.processedYData,\n stackedYData = [],\n yDataLength = yData.length,\n seriesOptions = series.options,\n threshold = seriesOptions.threshold,\n stackThreshold = seriesOptions.startFromThreshold ? threshold : 0,\n stackOption = seriesOptions.stack,\n stacking = seriesOptions.stacking,\n stackKey = series.stackKey,\n negKey = '-' + stackKey,\n negStacks = series.negStacks,\n yAxis = series.yAxis,\n stacks = yAxis.stacks,\n oldStacks = yAxis.oldStacks,\n stackIndicator,\n isNegative,\n stack,\n other,\n key,\n pointKey,\n i,\n x,\n y;\n\n\n yAxis.stacksTouched += 1;\n\n // loop over the non-null y values and read them into a local array\n for (i = 0; i < yDataLength; i++) {\n x = xData[i];\n y = yData[i];\n stackIndicator = series.getStackIndicator(stackIndicator, x, series.index);\n pointKey = stackIndicator.key;\n // Read stacked values into a stack based on the x value,\n // the sign of y and the stack key. Stacking is also handled for null values (#739)\n isNegative = negStacks && y < (stackThreshold ? 0 : threshold);\n key = isNegative ? negKey : stackKey;\n\n // Create empty object for this stack if it doesn't exist yet\n if (!stacks[key]) {\n stacks[key] = {};\n }\n\n // Initialize StackItem for this x\n if (!stacks[key][x]) {\n if (oldStacks[key] && oldStacks[key][x]) {\n stacks[key][x] = oldStacks[key][x];\n stacks[key][x].total = null;\n } else {\n stacks[key][x] = new StackItem(yAxis, yAxis.options.stackLabels, isNegative, x, stackOption);\n }\n }\n\n // If the StackItem doesn't exist, create it first\n stack = stacks[key][x];\n if (y !== null) {\n stack.points[pointKey] = stack.points[series.index] = [pick(stack.cum, stackThreshold)];\n\n // Record the base of the stack\n if (!defined(stack.cum)) {\n stack.base = pointKey;\n }\n stack.touched = yAxis.stacksTouched;\n \n\n // In area charts, if there are multiple points on the same X value, let the \n // area fill the full span of those points\n if (stackIndicator.index > 0 && series.singleStacks === false) {\n stack.points[pointKey][0] = stack.points[series.index + ',' + x + ',0'][0];\n }\n }\n\n // Add value to the stack total\n if (stacking === 'percent') {\n\n // Percent stacked column, totals are the same for the positive and negative stacks\n other = isNegative ? stackKey : negKey;\n if (negStacks && stacks[other] && stacks[other][x]) {\n other = stacks[other][x];\n stack.total = other.total = mathMax(other.total, stack.total) + mathAbs(y) || 0;\n\n // Percent stacked areas\n } else {\n stack.total = correctFloat(stack.total + (mathAbs(y) || 0));\n }\n } else {\n stack.total = correctFloat(stack.total + (y || 0));\n }\n\n stack.cum = pick(stack.cum, stackThreshold) + (y || 0);\n\n if (y !== null) {\n stack.points[pointKey].push(stack.cum);\n stackedYData[i] = stack.cum;\n }\n\n }\n\n if (stacking === 'percent') {\n yAxis.usePercentage = true;\n }\n\n this.stackedYData = stackedYData; // To be used in getExtremes\n\n // Reset old stacks\n yAxis.oldStacks = {};\n };\n\n /**\n * Iterate over all stacks and compute the absolute values to percent\n */\n Series.prototype.setPercentStacks = function () {\n var series = this,\n stackKey = series.stackKey,\n stacks = series.yAxis.stacks,\n processedXData = series.processedXData,\n stackIndicator;\n\n each([stackKey, '-' + stackKey], function (key) {\n var i = processedXData.length,\n x,\n stack,\n pointExtremes,\n totalFactor;\n\n while (i--) {\n x = processedXData[i];\n stackIndicator = series.getStackIndicator(stackIndicator, x, series.index);\n stack = stacks[key] && stacks[key][x];\n pointExtremes = stack && stack.points[stackIndicator.key];\n if (pointExtremes) {\n totalFactor = stack.total ? 100 / stack.total : 0;\n pointExtremes[0] = correctFloat(pointExtremes[0] * totalFactor); // Y bottom value\n pointExtremes[1] = correctFloat(pointExtremes[1] * totalFactor); // Y value\n series.stackedYData[i] = pointExtremes[1];\n }\n }\n });\n };\n\n /**\n * Get stack indicator, according to it's x-value, to determine points with the same x-value\n */\n Series.prototype.getStackIndicator = function (stackIndicator, x, index) {\n if (!defined(stackIndicator) || stackIndicator.x !== x) {\n stackIndicator = {\n x: x,\n index: 0\n };\n } else {\n stackIndicator.index++;\n }\n\n stackIndicator.key = [index, x, stackIndicator.index].join(',');\n\n return stackIndicator;\n };\n\n // Extend the Chart prototype for dynamic methods\n extend(Chart.prototype, {\n\n /**\n * Add a series dynamically after time\n *\n * @param {Object} options The config options\n * @param {Boolean} redraw Whether to redraw the chart after adding. Defaults to true.\n * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\n * configuration\n *\n * @return {Object} series The newly created series object\n */\n addSeries: function (options, redraw, animation) {\n var series,\n chart = this;\n\n if (options) {\n redraw = pick(redraw, true); // defaults to true\n\n fireEvent(chart, 'addSeries', { options: options }, function () {\n series = chart.initSeries(options);\n\n chart.isDirtyLegend = true; // the series array is out of sync with the display\n chart.linkSeries();\n if (redraw) {\n chart.redraw(animation);\n }\n });\n }\n\n return series;\n },\n\n /**\n * Add an axis to the chart\n * @param {Object} options The axis option\n * @param {Boolean} isX Whether it is an X axis or a value axis\n */\n addAxis: function (options, isX, redraw, animation) {\n var key = isX ? 'xAxis' : 'yAxis',\n chartOptions = this.options,\n userOptions = merge(options, {\n index: this[key].length,\n isX: isX\n });\n\n new Axis(this, userOptions); // eslint-disable-line no-new\n\n // Push the new axis options to the chart options\n chartOptions[key] = splat(chartOptions[key] || {});\n chartOptions[key].push(userOptions);\n\n if (pick(redraw, true)) {\n this.redraw(animation);\n }\n },\n\n /**\n * Dim the chart and show a loading text or symbol\n * @param {String} str An optional text to show in the loading label instead of the default one\n */\n showLoading: function (str) {\n var chart = this,\n options = chart.options,\n loadingDiv = chart.loadingDiv,\n loadingOptions = options.loading,\n setLoadingSize = function () {\n if (loadingDiv) {\n css(loadingDiv, {\n left: chart.plotLeft + PX,\n top: chart.plotTop + PX,\n width: chart.plotWidth + PX,\n height: chart.plotHeight + PX\n });\n }\n };\n\n // create the layer at the first call\n if (!loadingDiv) {\n chart.loadingDiv = loadingDiv = createElement(DIV, {\n className: PREFIX + 'loading'\n }, extend(loadingOptions.style, {\n zIndex: 10,\n display: NONE\n }), chart.container);\n\n chart.loadingSpan = createElement(\n 'span',\n null,\n loadingOptions.labelStyle,\n loadingDiv\n );\n addEvent(chart, 'redraw', setLoadingSize); // #1080\n }\n\n // update text\n chart.loadingSpan.innerHTML = str || options.lang.loading;\n\n // show it\n if (!chart.loadingShown) {\n css(loadingDiv, {\n opacity: 0,\n display: ''\n });\n animate(loadingDiv, {\n opacity: loadingOptions.style.opacity\n }, {\n duration: loadingOptions.showDuration || 0\n });\n chart.loadingShown = true;\n }\n setLoadingSize();\n },\n\n /**\n * Hide the loading layer\n */\n hideLoading: function () {\n var options = this.options,\n loadingDiv = this.loadingDiv;\n\n if (loadingDiv) {\n animate(loadingDiv, {\n opacity: 0\n }, {\n duration: options.loading.hideDuration || 100,\n complete: function () {\n css(loadingDiv, { display: NONE });\n }\n });\n }\n this.loadingShown = false;\n }\n });\n\n // extend the Point prototype for dynamic methods\n extend(Point.prototype, {\n /**\n * Update the point with new options (typically x/y data) and optionally redraw the series.\n *\n * @param {Object} options Point options as defined in the series.data array\n * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call\n * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\n * configuration\n *\n */\n update: function (options, redraw, animation, runEvent) {\n var point = this,\n series = point.series,\n graphic = point.graphic,\n i,\n chart = series.chart,\n seriesOptions = series.options,\n names = series.xAxis && series.xAxis.names;\n\n redraw = pick(redraw, true);\n\n function update() {\n\n point.applyOptions(options);\n\n // Update visuals\n if (point.y === null && graphic) { // #4146\n point.graphic = graphic.destroy();\n }\n if (isObject(options, true)) {\n // Defer the actual redraw until getAttribs has been called (#3260)\n point.redraw = function () {\n if (graphic && graphic.element) {\n if (options && options.marker && options.marker.symbol) {\n point.graphic = graphic.destroy();\n }\n }\n if (options && options.dataLabels && point.dataLabel) { // #2468\n point.dataLabel = point.dataLabel.destroy();\n }\n point.redraw = null;\n };\n }\n\n // record changes in the parallel arrays\n i = point.index;\n series.updateParallelArrays(point, i);\n if (names && point.name) {\n names[point.x] = point.name;\n }\n\n // Record the options to options.data. If there is an object from before,\n // use point options, otherwise use raw options. (#4701)\n seriesOptions.data[i] = isObject(seriesOptions.data[i], true) ? point.options : options;\n\n // redraw\n series.isDirty = series.isDirtyData = true;\n if (!series.fixedBox && series.hasCartesianSeries) { // #1906, #2320\n chart.isDirtyBox = true;\n }\n\n if (seriesOptions.legendType === 'point') { // #1831, #1885\n chart.isDirtyLegend = true;\n }\n if (redraw) {\n chart.redraw(animation);\n }\n }\n\n // Fire the event with a default handler of doing the update\n if (runEvent === false) { // When called from setData\n update();\n } else {\n point.firePointEvent('update', { options: options }, update);\n }\n },\n\n /**\n * Remove a point and optionally redraw the series and if necessary the axes\n * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call\n * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\n * configuration\n */\n remove: function (redraw, animation) {\n this.series.removePoint(inArray(this, this.series.data), redraw, animation);\n }\n });\n\n // Extend the series prototype for dynamic methods\n extend(Series.prototype, {\n /**\n * Add a point dynamically after chart load time\n * @param {Object} options Point options as given in series.data\n * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call\n * @param {Boolean} shift If shift is true, a point is shifted off the start\n * of the series as one is appended to the end.\n * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\n * configuration\n */\n addPoint: function (options, redraw, shift, animation) {\n var series = this,\n seriesOptions = series.options,\n data = series.data,\n chart = series.chart,\n names = series.xAxis && series.xAxis.names,\n dataOptions = seriesOptions.data,\n point,\n isInTheMiddle,\n xData = series.xData,\n i,\n x;\n\n setAnimation(animation, chart);\n\n // Optional redraw, defaults to true\n redraw = pick(redraw, true);\n\n // Get options and push the point to xData, yData and series.options. In series.generatePoints\n // the Point instance will be created on demand and pushed to the series.data array.\n point = { series: series };\n series.pointClass.prototype.applyOptions.apply(point, [options]);\n x = point.x;\n\n // Get the insertion point\n i = xData.length;\n if (series.requireSorting && x < xData[i - 1]) {\n isInTheMiddle = true;\n while (i && xData[i - 1] > x) {\n i--;\n }\n }\n\n series.updateParallelArrays(point, 'splice', i, 0, 0); // insert undefined item\n series.updateParallelArrays(point, i); // update it\n\n if (names && point.name) {\n names[x] = point.name;\n }\n dataOptions.splice(i, 0, options);\n\n if (isInTheMiddle) {\n series.data.splice(i, 0, null);\n series.processData();\n }\n\n // Generate points to be added to the legend (#1329)\n if (seriesOptions.legendType === 'point') {\n series.generatePoints();\n }\n\n // Shift the first point off the parallel arrays\n if (shift) {\n if (data[0] && data[0].remove) {\n data[0].remove(false);\n } else {\n data.shift();\n series.updateParallelArrays(point, 'shift');\n\n dataOptions.shift();\n }\n }\n\n // redraw\n series.isDirty = true;\n series.isDirtyData = true;\n if (redraw) {\n series.getAttribs(); // #1937\n chart.redraw();\n }\n },\n\n /**\n * Remove a point (rendered or not), by index\n */\n removePoint: function (i, redraw, animation) {\n\n var series = this,\n data = series.data,\n point = data[i],\n points = series.points,\n chart = series.chart,\n remove = function () {\n\n if (points && points.length === data.length) { // #4935\n points.splice(i, 1);\n }\n data.splice(i, 1);\n series.options.data.splice(i, 1);\n series.updateParallelArrays(point || { series: series }, 'splice', i, 1);\n\n if (point) {\n point.destroy();\n }\n\n // redraw\n series.isDirty = true;\n series.isDirtyData = true;\n if (redraw) {\n chart.redraw();\n }\n };\n\n setAnimation(animation, chart);\n redraw = pick(redraw, true);\n\n // Fire the event with a default handler of removing the point\n if (point) {\n point.firePointEvent('remove', null, remove);\n } else {\n remove();\n }\n },\n\n /**\n * Remove a series and optionally redraw the chart\n *\n * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call\n * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\n * configuration\n */\n remove: function (redraw, animation) {\n var series = this,\n chart = series.chart;\n\n // Fire the event with a default handler of removing the point\n fireEvent(series, 'remove', null, function () {\n\n // Destroy elements\n series.destroy();\n\n // Redraw\n chart.isDirtyLegend = chart.isDirtyBox = true;\n chart.linkSeries();\n\n if (pick(redraw, true)) {\n chart.redraw(animation);\n }\n });\n },\n\n /**\n * Update the series with a new set of options\n */\n update: function (newOptions, redraw) {\n var series = this,\n chart = this.chart,\n // must use user options when changing type because this.options is merged\n // in with type specific plotOptions\n oldOptions = this.userOptions,\n oldType = this.type,\n proto = seriesTypes[oldType].prototype,\n preserve = ['group', 'markerGroup', 'dataLabelsGroup'],\n n;\n\n // If we're changing type or zIndex, create new groups (#3380, #3404)\n if ((newOptions.type && newOptions.type !== oldType) || newOptions.zIndex !== undefined) {\n preserve.length = 0;\n }\n\n // Make sure groups are not destroyed (#3094)\n each(preserve, function (prop) {\n preserve[prop] = series[prop];\n delete series[prop];\n });\n\n // Do the merge, with some forced options\n newOptions = merge(oldOptions, {\n animation: false,\n index: this.index,\n pointStart: this.xData[0] // when updating after addPoint\n }, { data: this.options.data }, newOptions);\n\n // Destroy the series and delete all properties. Reinsert all methods\n // and properties from the new type prototype (#2270, #3719)\n this.remove(false);\n for (n in proto) {\n this[n] = UNDEFINED;\n }\n extend(this, seriesTypes[newOptions.type || oldType].prototype);\n\n // Re-register groups (#3094)\n each(preserve, function (prop) {\n series[prop] = preserve[prop];\n });\n\n this.init(chart, newOptions);\n chart.linkSeries(); // Links are lost in this.remove (#3028)\n if (pick(redraw, true)) {\n chart.redraw(false);\n }\n }\n });\n\n // Extend the Axis.prototype for dynamic methods\n extend(Axis.prototype, {\n\n /**\n * Update the axis with a new options structure\n */\n update: function (newOptions, redraw) {\n var chart = this.chart;\n\n newOptions = chart.options[this.coll][this.options.index] = merge(this.userOptions, newOptions);\n\n this.destroy(true);\n\n this.init(chart, extend(newOptions, { events: UNDEFINED }));\n\n chart.isDirtyBox = true;\n if (pick(redraw, true)) {\n chart.redraw();\n }\n },\n\n /**\n * Remove the axis from the chart\n */\n remove: function (redraw) {\n var chart = this.chart,\n key = this.coll, // xAxis or yAxis\n axisSeries = this.series,\n i = axisSeries.length;\n\n // Remove associated series (#2687)\n while (i--) {\n if (axisSeries[i]) {\n axisSeries[i].remove(false);\n }\n }\n\n // Remove the axis\n erase(chart.axes, this);\n erase(chart[key], this);\n chart.options[key].splice(this.options.index, 1);\n each(chart[key], function (axis, i) { // Re-index, #1706\n axis.options.index = i;\n });\n this.destroy();\n chart.isDirtyBox = true;\n\n if (pick(redraw, true)) {\n chart.redraw();\n }\n },\n\n /**\n * Update the axis title by options\n */\n setTitle: function (newTitleOptions, redraw) {\n this.update({ title: newTitleOptions }, redraw);\n },\n\n /**\n * Set new axis categories and optionally redraw\n * @param {Array} categories\n * @param {Boolean} redraw\n */\n setCategories: function (categories, redraw) {\n this.update({ categories: categories }, redraw);\n }\n\n });\n\n\n /**\n * LineSeries object\n */\n var LineSeries = extendClass(Series);\n seriesTypes.line = LineSeries;\n\n /**\n * Set the default options for area\n */\n defaultPlotOptions.area = merge(defaultSeriesOptions, {\n softThreshold: false,\n threshold: 0\n // trackByArea: false,\n // lineColor: null, // overrides color, but lets fillColor be unaltered\n // fillOpacity: 0.75,\n // fillColor: null\n });\n\n /**\n * AreaSeries object\n */\n var AreaSeries = extendClass(Series, {\n type: 'area',\n singleStacks: false,\n /** \n * Return an array of stacked points, where null and missing points are replaced by \n * dummy points in order for gaps to be drawn correctly in stacks.\n */\n getStackPoints: function () {\n var series = this,\n segment = [],\n keys = [],\n xAxis = this.xAxis,\n yAxis = this.yAxis,\n stack = yAxis.stacks[this.stackKey],\n pointMap = {},\n points = this.points,\n seriesIndex = series.index,\n yAxisSeries = yAxis.series,\n seriesLength = yAxisSeries.length,\n visibleSeries,\n upOrDown = pick(yAxis.options.reversedStacks, true) ? 1 : -1,\n i,\n x;\n\n if (this.options.stacking) {\n // Create a map where we can quickly look up the points by their X value.\n for (i = 0; i < points.length; i++) {\n pointMap[points[i].x] = points[i];\n }\n\n // Sort the keys (#1651)\n for (x in stack) {\n if (stack[x].total !== null) { // nulled after switching between grouping and not (#1651, #2336)\n keys.push(x);\n }\n }\n keys.sort(function (a, b) {\n return a - b;\n });\n\n visibleSeries = map(yAxisSeries, function () {\n return this.visible;\n });\n\n each(keys, function (x, idx) {\n var y = 0,\n stackPoint,\n stackedValues;\n\n if (pointMap[x] && !pointMap[x].isNull) {\n segment.push(pointMap[x]);\n\n // Find left and right cliff. -1 goes left, 1 goes right.\n each([-1, 1], function (direction) {\n var nullName = direction === 1 ? 'rightNull' : 'leftNull',\n cliffName = direction === 1 ? 'rightCliff' : 'leftCliff',\n cliff = 0,\n otherStack = stack[keys[idx + direction]];\n\n // If there is a stack next to this one, to the left or to the right...\n if (otherStack) {\n i = seriesIndex;\n while (i >= 0 && i < seriesLength) { // Can go either up or down, depending on reversedStacks\n stackPoint = otherStack.points[i];\n if (!stackPoint) {\n // If the next point in this series is missing, mark the point\n // with point.leftNull or point.rightNull = true.\n if (i === seriesIndex) {\n pointMap[x][nullName] = true;\n\n // If there are missing points in the next stack in any of the \n // series below this one, we need to substract the missing values\n // and add a hiatus to the left or right.\n } else if (visibleSeries[i]) {\n stackedValues = stack[x].points[i];\n if (stackedValues) {\n cliff -= stackedValues[1] - stackedValues[0];\n }\n }\n }\n // When reversedStacks is true, loop up, else loop down\n i += upOrDown; \n } \n }\n pointMap[x][cliffName] = cliff;\n });\n\n\n // There is no point for this X value in this series, so we \n // insert a dummy point in order for the areas to be drawn\n // correctly.\n } else {\n\n // Loop down the stack to find the series below this one that has\n // a value (#1991)\n i = seriesIndex;\n while (i >= 0 && i < seriesLength) {\n stackPoint = stack[x].points[i];\n if (stackPoint) {\n y = stackPoint[1];\n break;\n }\n // When reversedStacks is true, loop up, else loop down\n i += upOrDown;\n }\n\n y = yAxis.toPixels(y, true);\n segment.push({ \n isNull: true,\n plotX: xAxis.toPixels(x, true),\n plotY: y,\n yBottom: y\n });\n }\n });\n\n } \n\n return segment;\n },\n\n getGraphPath: function (points) {\n var getGraphPath = Series.prototype.getGraphPath,\n graphPath,\n options = this.options,\n stacking = options.stacking,\n yAxis = this.yAxis,\n topPath,\n //topPoints = [],\n bottomPath,\n bottomPoints = [],\n graphPoints = [],\n seriesIndex = this.index,\n i,\n areaPath,\n plotX,\n stacks = yAxis.stacks[this.stackKey],\n threshold = options.threshold,\n translatedThreshold = yAxis.getThreshold(options.threshold),\n isNull,\n yBottom,\n connectNulls = options.connectNulls || stacking === 'percent',\n /**\n * To display null points in underlying stacked series, this series graph must be \n * broken, and the area also fall down to fill the gap left by the null point. #2069\n */\n addDummyPoints = function (i, otherI, side) {\n var point = points[i],\n stackedValues = stacking && stacks[point.x].points[seriesIndex],\n nullVal = point[side + 'Null'] || 0,\n cliffVal = point[side + 'Cliff'] || 0,\n top,\n bottom,\n isNull = true;\n\n if (cliffVal || nullVal) {\n\n top = (nullVal ? stackedValues[0] : stackedValues[1]) + cliffVal;\n bottom = stackedValues[0] + cliffVal;\n isNull = !!nullVal;\n \n } else if (!stacking && points[otherI] && points[otherI].isNull) {\n top = bottom = threshold;\n }\n\n // Add to the top and bottom line of the area\n if (top !== undefined) {\n graphPoints.push({\n plotX: plotX,\n plotY: top === null ? translatedThreshold : yAxis.getThreshold(top),\n isNull: isNull\n });\n bottomPoints.push({\n plotX: plotX,\n plotY: bottom === null ? translatedThreshold : yAxis.getThreshold(bottom)\n });\n }\n };\n\n // Find what points to use\n points = points || this.points;\n\n \n // Fill in missing points\n if (stacking) {\n points = this.getStackPoints();\n }\n\n for (i = 0; i < points.length; i++) {\n isNull = points[i].isNull;\n plotX = pick(points[i].rectPlotX, points[i].plotX);\n yBottom = pick(points[i].yBottom, translatedThreshold);\n\n if (!isNull || connectNulls) {\n\n if (!connectNulls) {\n addDummyPoints(i, i - 1, 'left');\n }\n\n if (!(isNull && !stacking && connectNulls)) { // Skip null point when stacking is false and connectNulls true\n graphPoints.push(points[i]);\n bottomPoints.push({\n x: i,\n plotX: plotX,\n plotY: yBottom\n });\n }\n\n if (!connectNulls) {\n addDummyPoints(i, i + 1, 'right');\n }\n }\n }\n\n topPath = getGraphPath.call(this, graphPoints, true, true);\n \n bottomPoints.reversed = true;\n bottomPath = getGraphPath.call(this, bottomPoints, true, true);\n if (bottomPath.length) {\n bottomPath[0] = L;\n }\n\n areaPath = topPath.concat(bottomPath);\n graphPath = getGraphPath.call(this, graphPoints, false, connectNulls); // TODO: don't set leftCliff and rightCliff when connectNulls?\n\n areaPath.xMap = topPath.xMap;\n this.areaPath = areaPath;\n return graphPath;\n },\n\n /**\n * Draw the graph and the underlying area. This method calls the Series base\n * function and adds the area. The areaPath is calculated in the getSegmentPath\n * method called from Series.prototype.drawGraph.\n */\n drawGraph: function () {\n\n // Define or reset areaPath\n this.areaPath = [];\n\n // Call the base method\n Series.prototype.drawGraph.apply(this);\n\n // Define local variables\n var series = this,\n areaPath = this.areaPath,\n options = this.options,\n zones = this.zones,\n props = [['area', this.color, options.fillColor]]; // area name, main color, fill color\n\n each(zones, function (threshold, i) {\n props.push(['zoneArea' + i, threshold.color || series.color, threshold.fillColor || options.fillColor]);\n });\n each(props, function (prop) {\n var areaKey = prop[0],\n area = series[areaKey],\n attr;\n\n // Create or update the area\n if (area) { // update\n area.endX = areaPath.xMap;\n area.animate({ d: areaPath });\n\n } else { // create\n attr = {\n fill: prop[2] || prop[1],\n zIndex: 0 // #1069\n };\n if (!prop[2]) {\n attr['fill-opacity'] = pick(options.fillOpacity, 0.75);\n }\n area = series[areaKey] = series.chart.renderer.path(areaPath)\n .attr(attr)\n .add(series.group);\n area.isArea = true;\n }\n area.startX = areaPath.xMap;\n area.shiftUnit = options.step ? 2 : 1;\n });\n },\n\n drawLegendSymbol: LegendSymbolMixin.drawRectangle\n });\n\n seriesTypes.area = AreaSeries;\n /**\n * Set the default options for spline\n */\n defaultPlotOptions.spline = merge(defaultSeriesOptions);\n\n /**\n * SplineSeries object\n */\n var SplineSeries = extendClass(Series, {\n type: 'spline',\n\n /**\n * Get the spline segment from a given point's previous neighbour to the given point\n */\n getPointSpline: function (points, point, i) {\n var smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc\n denom = smoothing + 1,\n plotX = point.plotX,\n plotY = point.plotY,\n lastPoint = points[i - 1],\n nextPoint = points[i + 1],\n leftContX,\n leftContY,\n rightContX,\n rightContY,\n ret;\n\n // Find control points\n if (lastPoint && !lastPoint.isNull && nextPoint && !nextPoint.isNull) {\n var lastX = lastPoint.plotX,\n lastY = lastPoint.plotY,\n nextX = nextPoint.plotX,\n nextY = nextPoint.plotY,\n correction = 0;\n\n leftContX = (smoothing * plotX + lastX) / denom;\n leftContY = (smoothing * plotY + lastY) / denom;\n rightContX = (smoothing * plotX + nextX) / denom;\n rightContY = (smoothing * plotY + nextY) / denom;\n\n // Have the two control points make a straight line through main point\n if (rightContX !== leftContX) { // #5016, division by zero\n correction = ((rightContY - leftContY) * (rightContX - plotX)) /\n (rightContX - leftContX) + plotY - rightContY;\n }\n\n leftContY += correction;\n rightContY += correction;\n\n // to prevent false extremes, check that control points are between\n // neighbouring points' y values\n if (leftContY > lastY && leftContY > plotY) {\n leftContY = mathMax(lastY, plotY);\n rightContY = 2 * plotY - leftContY; // mirror of left control point\n } else if (leftContY < lastY && leftContY < plotY) {\n leftContY = mathMin(lastY, plotY);\n rightContY = 2 * plotY - leftContY;\n }\n if (rightContY > nextY && rightContY > plotY) {\n rightContY = mathMax(nextY, plotY);\n leftContY = 2 * plotY - rightContY;\n } else if (rightContY < nextY && rightContY < plotY) {\n rightContY = mathMin(nextY, plotY);\n leftContY = 2 * plotY - rightContY;\n }\n\n // record for drawing in next point\n point.rightContX = rightContX;\n point.rightContY = rightContY;\n\n \n }\n\n // Visualize control points for debugging\n /*\n if (leftContX) {\n this.chart.renderer.circle(leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop, 2)\n .attr({\n stroke: 'red',\n 'stroke-width': 1,\n fill: 'none'\n })\n .add();\n this.chart.renderer.path(['M', leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop,\n 'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])\n .attr({\n stroke: 'red',\n 'stroke-width': 1\n })\n .add();\n this.chart.renderer.circle(rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop, 2)\n .attr({\n stroke: 'green',\n 'stroke-width': 1,\n fill: 'none'\n })\n .add();\n this.chart.renderer.path(['M', rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop,\n 'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])\n .attr({\n stroke: 'green',\n 'stroke-width': 1\n })\n .add();\n }\n // */\n ret = [\n 'C',\n pick(lastPoint.rightContX, lastPoint.plotX),\n pick(lastPoint.rightContY, lastPoint.plotY),\n pick(leftContX, plotX),\n pick(leftContY, plotY),\n plotX,\n plotY\n ];\n lastPoint.rightContX = lastPoint.rightContY = null; // reset for updating series later\n return ret;\n }\n });\n seriesTypes.spline = SplineSeries;\n\n /**\n * Set the default options for areaspline\n */\n defaultPlotOptions.areaspline = merge(defaultPlotOptions.area);\n\n /**\n * AreaSplineSeries object\n */\n var areaProto = AreaSeries.prototype,\n AreaSplineSeries = extendClass(SplineSeries, {\n type: 'areaspline',\n getStackPoints: areaProto.getStackPoints,\n getGraphPath: areaProto.getGraphPath,\n setStackCliffs: areaProto.setStackCliffs,\n drawGraph: areaProto.drawGraph,\n drawLegendSymbol: LegendSymbolMixin.drawRectangle\n });\n\n seriesTypes.areaspline = AreaSplineSeries;\n\n /**\n * Set the default options for column\n */\n defaultPlotOptions.column = merge(defaultSeriesOptions, {\n borderColor: '#FFFFFF',\n //borderWidth: 1,\n borderRadius: 0,\n //colorByPoint: undefined,\n groupPadding: 0.2,\n //grouping: true,\n marker: null, // point options are specified in the base options\n pointPadding: 0.1,\n //pointWidth: null,\n minPointLength: 0,\n cropThreshold: 50, // when there are more points, they will not animate out of the chart on xAxis.setExtremes\n pointRange: null, // null means auto, meaning 1 in a categorized axis and least distance between points if not categories\n states: {\n hover: {\n brightness: 0.1,\n shadow: false,\n halo: false\n },\n select: {\n color: '#C0C0C0',\n borderColor: '#000000',\n shadow: false\n }\n },\n dataLabels: {\n align: null, // auto\n verticalAlign: null, // auto\n y: null\n },\n softThreshold: false,\n startFromThreshold: true, // false doesn't work well: http://jsfiddle.net/highcharts/hz8fopan/14/\n stickyTracking: false,\n tooltip: {\n distance: 6\n },\n threshold: 0\n });\n\n /**\n * ColumnSeries object\n */\n var ColumnSeries = extendClass(Series, {\n type: 'column',\n pointAttrToOptions: { // mapping between SVG attributes and the corresponding options\n stroke: 'borderColor',\n fill: 'color',\n r: 'borderRadius'\n },\n cropShoulder: 0,\n directTouch: true, // When tooltip is not shared, this series (and derivatives) requires direct touch/hover. KD-tree does not apply.\n trackerGroups: ['group', 'dataLabelsGroup'],\n negStacks: true, // use separate negative stacks, unlike area stacks where a negative\n // point is substracted from previous (#1910)\n\n /**\n * Initialize the series\n */\n init: function () {\n Series.prototype.init.apply(this, arguments);\n\n var series = this,\n chart = series.chart;\n\n // if the series is added dynamically, force redraw of other\n // series affected by a new column\n if (chart.hasRendered) {\n each(chart.series, function (otherSeries) {\n if (otherSeries.type === series.type) {\n otherSeries.isDirty = true;\n }\n });\n }\n },\n\n /**\n * Return the width and x offset of the columns adjusted for grouping, groupPadding, pointPadding,\n * pointWidth etc.\n */\n getColumnMetrics: function () {\n\n var series = this,\n options = series.options,\n xAxis = series.xAxis,\n yAxis = series.yAxis,\n reversedXAxis = xAxis.reversed,\n stackKey,\n stackGroups = {},\n columnCount = 0;\n\n // Get the total number of column type series.\n // This is called on every series. Consider moving this logic to a\n // chart.orderStacks() function and call it on init, addSeries and removeSeries\n if (options.grouping === false) {\n columnCount = 1;\n } else {\n each(series.chart.series, function (otherSeries) {\n var otherOptions = otherSeries.options,\n otherYAxis = otherSeries.yAxis,\n columnIndex;\n if (otherSeries.type === series.type && otherSeries.visible &&\n yAxis.len === otherYAxis.len && yAxis.pos === otherYAxis.pos) { // #642, #2086\n if (otherOptions.stacking) {\n stackKey = otherSeries.stackKey;\n if (stackGroups[stackKey] === UNDEFINED) {\n stackGroups[stackKey] = columnCount++;\n }\n columnIndex = stackGroups[stackKey];\n } else if (otherOptions.grouping !== false) { // #1162\n columnIndex = columnCount++;\n }\n otherSeries.columnIndex = columnIndex;\n }\n });\n }\n\n var categoryWidth = mathMin(\n mathAbs(xAxis.transA) * (xAxis.ordinalSlope || options.pointRange || xAxis.closestPointRange || xAxis.tickInterval || 1), // #2610\n xAxis.len // #1535\n ),\n groupPadding = categoryWidth * options.groupPadding,\n groupWidth = categoryWidth - 2 * groupPadding,\n pointOffsetWidth = groupWidth / columnCount,\n pointWidth = mathMin(\n options.maxPointWidth || xAxis.len,\n pick(options.pointWidth, pointOffsetWidth * (1 - 2 * options.pointPadding))\n ),\n pointPadding = (pointOffsetWidth - pointWidth) / 2,\n colIndex = (series.columnIndex || 0) + (reversedXAxis ? 1 : 0), // #1251, #3737\n pointXOffset = pointPadding + (groupPadding + colIndex *\n pointOffsetWidth - (categoryWidth / 2)) *\n (reversedXAxis ? -1 : 1);\n\n // Save it for reading in linked series (Error bars particularly)\n series.columnMetrics = {\n width: pointWidth,\n offset: pointXOffset\n };\n return series.columnMetrics;\n\n },\n\n /**\n * Make the columns crisp. The edges are rounded to the nearest full pixel.\n */\n crispCol: function (x, y, w, h) {\n var chart = this.chart,\n borderWidth = this.borderWidth,\n xCrisp = -(borderWidth % 2 ? 0.5 : 0),\n yCrisp = borderWidth % 2 ? 0.5 : 1,\n right,\n bottom,\n fromTop;\n\n if (chart.inverted && chart.renderer.isVML) {\n yCrisp += 1;\n }\n\n // Horizontal. We need to first compute the exact right edge, then round it\n // and compute the width from there.\n right = Math.round(x + w) + xCrisp;\n x = Math.round(x) + xCrisp;\n w = right - x;\n\n // Vertical\n bottom = Math.round(y + h) + yCrisp;\n fromTop = mathAbs(y) <= 0.5 && bottom > 0.5; // #4504, #4656\n y = Math.round(y) + yCrisp;\n h = bottom - y;\n\n // Top edges are exceptions\n if (fromTop && h) { // #5146\n y -= 1;\n h += 1;\n }\n\n return {\n x: x,\n y: y,\n width: w,\n height: h\n };\n },\n\n /**\n * Translate each point to the plot area coordinate system and find shape positions\n */\n translate: function () {\n var series = this,\n chart = series.chart,\n options = series.options,\n borderWidth = series.borderWidth = pick(\n options.borderWidth,\n series.closestPointRange * series.xAxis.transA < 2 ? 0 : 1 // #3635\n ),\n yAxis = series.yAxis,\n threshold = options.threshold,\n translatedThreshold = series.translatedThreshold = yAxis.getThreshold(threshold),\n minPointLength = pick(options.minPointLength, 5),\n metrics = series.getColumnMetrics(),\n pointWidth = metrics.width,\n seriesBarW = series.barW = mathMax(pointWidth, 1 + 2 * borderWidth), // postprocessed for border width\n pointXOffset = series.pointXOffset = metrics.offset;\n\n if (chart.inverted) {\n translatedThreshold -= 0.5; // #3355\n }\n\n // When the pointPadding is 0, we want the columns to be packed tightly, so we allow individual\n // columns to have individual sizes. When pointPadding is greater, we strive for equal-width\n // columns (#2694).\n if (options.pointPadding) {\n seriesBarW = mathCeil(seriesBarW);\n }\n\n Series.prototype.translate.apply(series);\n\n // Record the new values\n each(series.points, function (point) {\n var yBottom = mathMin(pick(point.yBottom, translatedThreshold), 9e4), // #3575\n safeDistance = 999 + mathAbs(yBottom),\n plotY = mathMin(mathMax(-safeDistance, point.plotY), yAxis.len + safeDistance), // Don't draw too far outside plot area (#1303, #2241, #4264)\n barX = point.plotX + pointXOffset,\n barW = seriesBarW,\n barY = mathMin(plotY, yBottom),\n up,\n barH = mathMax(plotY, yBottom) - barY;\n\n // Handle options.minPointLength\n if (mathAbs(barH) < minPointLength) {\n if (minPointLength) {\n barH = minPointLength;\n up = (!yAxis.reversed && !point.negative) || (yAxis.reversed && point.negative);\n barY = mathAbs(barY - translatedThreshold) > minPointLength ? // stacked\n yBottom - minPointLength : // keep position\n translatedThreshold - (up ? minPointLength : 0); // #1485, #4051\n }\n }\n\n // Cache for access in polar\n point.barX = barX;\n point.pointWidth = pointWidth;\n\n // Fix the tooltip on center of grouped columns (#1216, #424, #3648)\n point.tooltipPos = chart.inverted ?\n [yAxis.len + yAxis.pos - chart.plotLeft - plotY, series.xAxis.len - barX - barW / 2, barH] :\n [barX + barW / 2, plotY + yAxis.pos - chart.plotTop, barH];\n\n // Register shape type and arguments to be used in drawPoints\n point.shapeType = 'rect';\n point.shapeArgs = series.crispCol(barX, barY, barW, barH);\n });\n\n },\n\n getSymbol: noop,\n\n /**\n * Use a solid rectangle like the area series types\n */\n drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n\n\n /**\n * Columns have no graph\n */\n drawGraph: noop,\n\n /**\n * Draw the columns. For bars, the series.group is rotated, so the same coordinates\n * apply for columns and bars. This method is inherited by scatter series.\n *\n */\n drawPoints: function () {\n var series = this,\n chart = this.chart,\n options = series.options,\n renderer = chart.renderer,\n animationLimit = options.animationLimit || 250,\n shapeArgs,\n pointAttr;\n\n // draw the columns\n each(series.points, function (point) {\n var plotY = point.plotY,\n graphic = point.graphic,\n borderAttr;\n\n if (isNumber(plotY) && point.y !== null) {\n shapeArgs = point.shapeArgs;\n\n borderAttr = defined(series.borderWidth) ? {\n 'stroke-width': series.borderWidth\n } : {};\n\n pointAttr = point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE] || series.pointAttr[NORMAL_STATE];\n\n if (graphic) { // update\n stop(graphic);\n graphic.attr(borderAttr).attr(pointAttr)[chart.pointCount < animationLimit ? 'animate' : 'attr'](merge(shapeArgs)); // #4267\n\n } else {\n point.graphic = graphic = renderer[point.shapeType](shapeArgs)\n .attr(borderAttr)\n .attr(pointAttr)\n .add(point.group || series.group)\n .shadow(options.shadow, null, options.stacking && !options.borderRadius);\n }\n\n } else if (graphic) {\n point.graphic = graphic.destroy(); // #1269\n }\n });\n },\n\n /**\n * Animate the column heights one by one from zero\n * @param {Boolean} init Whether to initialize the animation or run it\n */\n animate: function (init) {\n var series = this,\n yAxis = this.yAxis,\n options = series.options,\n inverted = this.chart.inverted,\n attr = {},\n translatedThreshold;\n\n if (hasSVG) { // VML is too slow anyway\n if (init) {\n attr.scaleY = 0.001;\n translatedThreshold = mathMin(yAxis.pos + yAxis.len, mathMax(yAxis.pos, yAxis.toPixels(options.threshold)));\n if (inverted) {\n attr.translateX = translatedThreshold - yAxis.len;\n } else {\n attr.translateY = translatedThreshold;\n }\n series.group.attr(attr);\n\n } else { // run the animation\n\n attr[inverted ? 'translateX' : 'translateY'] = yAxis.pos;\n series.group.animate(attr, extend(animObject(series.options.animation), {\n // Do the scale synchronously to ensure smooth updating (#5030)\n step: function (val, fx) {\n series.group.attr({\n scaleY: mathMax(0.001, fx.pos) // #5250\n });\n }\n }));\n\n // delete this function to allow it only once\n series.animate = null;\n }\n }\n },\n\n /**\n * Remove this series from the chart\n */\n remove: function () {\n var series = this,\n chart = series.chart;\n\n // column and bar series affects other series of the same type\n // as they are either stacked or grouped\n if (chart.hasRendered) {\n each(chart.series, function (otherSeries) {\n if (otherSeries.type === series.type) {\n otherSeries.isDirty = true;\n }\n });\n }\n\n Series.prototype.remove.apply(series, arguments);\n }\n });\n seriesTypes.column = ColumnSeries;\n /**\n * Set the default options for bar\n */\n defaultPlotOptions.bar = merge(defaultPlotOptions.column);\n /**\n * The Bar series class\n */\n var BarSeries = extendClass(ColumnSeries, {\n type: 'bar',\n inverted: true\n });\n seriesTypes.bar = BarSeries;\n\n /**\n * Set the default options for scatter\n */\n defaultPlotOptions.scatter = merge(defaultSeriesOptions, {\n lineWidth: 0,\n marker: {\n enabled: true // Overrides auto-enabling in line series (#3647)\n },\n tooltip: {\n headerFormat: '\\u25CF {series.name} ',\n pointFormat: 'x: {point.x} y: {point.y} '\n }\n });\n\n /**\n * The scatter series class\n */\n var ScatterSeries = extendClass(Series, {\n type: 'scatter',\n sorted: false,\n requireSorting: false,\n noSharedTooltip: true,\n trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup'],\n takeOrdinalPosition: false, // #2342\n kdDimensions: 2,\n drawGraph: function () {\n if (this.options.lineWidth) {\n Series.prototype.drawGraph.call(this);\n }\n }\n });\n\n seriesTypes.scatter = ScatterSeries;\n\n /**\n * Set the default options for pie\n */\n defaultPlotOptions.pie = merge(defaultSeriesOptions, {\n borderColor: '#FFFFFF',\n borderWidth: 1,\n center: [null, null],\n clip: false,\n colorByPoint: true, // always true for pies\n dataLabels: {\n // align: null,\n // connectorWidth: 1,\n // connectorColor: point.color,\n // connectorPadding: 5,\n distance: 30,\n enabled: true,\n formatter: function () { // #2945\n return this.y === null ? undefined : this.point.name;\n },\n // softConnector: true,\n x: 0\n // y: 0\n },\n ignoreHiddenPoint: true,\n //innerSize: 0,\n legendType: 'point',\n marker: null, // point options are specified in the base options\n size: null,\n showInLegend: false,\n slicedOffset: 10,\n states: {\n hover: {\n brightness: 0.1,\n shadow: false\n }\n },\n stickyTracking: false,\n tooltip: {\n followPointer: true\n }\n });\n\n /**\n * Extended point object for pies\n */\n var PiePoint = extendClass(Point, {\n /**\n * Initiate the pie slice\n */\n init: function () {\n\n Point.prototype.init.apply(this, arguments);\n\n var point = this,\n toggleSlice;\n\n point.name = pick(point.name, 'Slice');\n\n // add event listener for select\n toggleSlice = function (e) {\n point.slice(e.type === 'select');\n };\n addEvent(point, 'select', toggleSlice);\n addEvent(point, 'unselect', toggleSlice);\n\n return point;\n },\n\n /**\n * Toggle the visibility of the pie slice\n * @param {Boolean} vis Whether to show the slice or not. If undefined, the\n * visibility is toggled\n */\n setVisible: function (vis, redraw) {\n var point = this,\n series = point.series,\n chart = series.chart,\n ignoreHiddenPoint = series.options.ignoreHiddenPoint;\n\n redraw = pick(redraw, ignoreHiddenPoint);\n\n if (vis !== point.visible) {\n\n // If called without an argument, toggle visibility\n point.visible = point.options.visible = vis = vis === UNDEFINED ? !point.visible : vis;\n series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data\n\n // Show and hide associated elements. This is performed regardless of redraw or not,\n // because chart.redraw only handles full series.\n each(['graphic', 'dataLabel', 'connector', 'shadowGroup'], function (key) {\n if (point[key]) {\n point[key][vis ? 'show' : 'hide'](true);\n }\n });\n\n if (point.legendItem) {\n chart.legend.colorizeItem(point, vis);\n }\n\n // #4170, hide halo after hiding point\n if (!vis && point.state === 'hover') {\n point.setState('');\n }\n\n // Handle ignore hidden slices\n if (ignoreHiddenPoint) {\n series.isDirty = true;\n }\n\n if (redraw) {\n chart.redraw();\n }\n }\n },\n\n /**\n * Set or toggle whether the slice is cut out from the pie\n * @param {Boolean} sliced When undefined, the slice state is toggled\n * @param {Boolean} redraw Whether to redraw the chart. True by default.\n */\n slice: function (sliced, redraw, animation) {\n var point = this,\n series = point.series,\n chart = series.chart,\n translation;\n\n setAnimation(animation, chart);\n\n // redraw is true by default\n redraw = pick(redraw, true);\n\n // if called without an argument, toggle\n point.sliced = point.options.sliced = sliced = defined(sliced) ? sliced : !point.sliced;\n series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data\n\n translation = sliced ? point.slicedTranslation : {\n translateX: 0,\n translateY: 0\n };\n\n point.graphic.animate(translation);\n\n if (point.shadowGroup) {\n point.shadowGroup.animate(translation);\n }\n\n },\n\n haloPath: function (size) {\n var shapeArgs = this.shapeArgs,\n chart = this.series.chart;\n\n return this.sliced || !this.visible ? [] : this.series.chart.renderer.symbols.arc(chart.plotLeft + shapeArgs.x, chart.plotTop + shapeArgs.y, shapeArgs.r + size, shapeArgs.r + size, {\n innerR: this.shapeArgs.r,\n start: shapeArgs.start,\n end: shapeArgs.end\n });\n }\n });\n\n /**\n * The Pie series class\n */\n var PieSeries = {\n type: 'pie',\n isCartesian: false,\n pointClass: PiePoint,\n requireSorting: false,\n directTouch: true,\n noSharedTooltip: true,\n trackerGroups: ['group', 'dataLabelsGroup'],\n axisTypes: [],\n pointAttrToOptions: { // mapping between SVG attributes and the corresponding options\n stroke: 'borderColor',\n 'stroke-width': 'borderWidth',\n fill: 'color'\n },\n\n /**\n * Animate the pies in\n */\n animate: function (init) {\n var series = this,\n points = series.points,\n startAngleRad = series.startAngleRad;\n\n if (!init) {\n each(points, function (point) {\n var graphic = point.graphic,\n args = point.shapeArgs;\n\n if (graphic) {\n // start values\n graphic.attr({\n r: point.startR || (series.center[3] / 2), // animate from inner radius (#779)\n start: startAngleRad,\n end: startAngleRad\n });\n\n // animate\n graphic.animate({\n r: args.r,\n start: args.start,\n end: args.end\n }, series.options.animation);\n }\n });\n\n // delete this function to allow it only once\n series.animate = null;\n }\n },\n\n /**\n * Recompute total chart sum and update percentages of points.\n */\n updateTotals: function () {\n var i,\n total = 0,\n points = this.points,\n len = points.length,\n point,\n ignoreHiddenPoint = this.options.ignoreHiddenPoint;\n\n // Get the total sum\n for (i = 0; i < len; i++) {\n point = points[i];\n // Disallow negative values (#1530, #3623, #5322)\n if (point.y < 0) {\n point.y = null;\n }\n total += (ignoreHiddenPoint && !point.visible) ? 0 : point.y;\n }\n this.total = total;\n\n // Set each point's properties\n for (i = 0; i < len; i++) {\n point = points[i];\n point.percentage = (total > 0 && (point.visible || !ignoreHiddenPoint)) ? point.y / total * 100 : 0;\n point.total = total;\n }\n },\n\n /**\n * Extend the generatePoints method by adding total and percentage properties to each point\n */\n generatePoints: function () {\n Series.prototype.generatePoints.call(this);\n this.updateTotals();\n },\n\n /**\n * Do translation for pie slices\n */\n translate: function (positions) {\n this.generatePoints();\n\n var series = this,\n cumulative = 0,\n precision = 1000, // issue #172\n options = series.options,\n slicedOffset = options.slicedOffset,\n connectorOffset = slicedOffset + options.borderWidth,\n start,\n end,\n angle,\n startAngle = options.startAngle || 0,\n startAngleRad = series.startAngleRad = mathPI / 180 * (startAngle - 90),\n endAngleRad = series.endAngleRad = mathPI / 180 * ((pick(options.endAngle, startAngle + 360)) - 90),\n circ = endAngleRad - startAngleRad, //2 * mathPI,\n points = series.points,\n radiusX, // the x component of the radius vector for a given point\n radiusY,\n labelDistance = options.dataLabels.distance,\n ignoreHiddenPoint = options.ignoreHiddenPoint,\n i,\n len = points.length,\n point;\n\n // Get positions - either an integer or a percentage string must be given.\n // If positions are passed as a parameter, we're in a recursive loop for adjusting\n // space for data labels.\n if (!positions) {\n series.center = positions = series.getCenter();\n }\n\n // utility for getting the x value from a given y, used for anticollision logic in data labels\n series.getX = function (y, left) {\n\n angle = math.asin(mathMin((y - positions[1]) / (positions[2] / 2 + labelDistance), 1));\n\n return positions[0] +\n (left ? -1 : 1) *\n (mathCos(angle) * (positions[2] / 2 + labelDistance));\n };\n\n // Calculate the geometry for each point\n for (i = 0; i < len; i++) {\n\n point = points[i];\n\n // set start and end angle\n start = startAngleRad + (cumulative * circ);\n if (!ignoreHiddenPoint || point.visible) {\n cumulative += point.percentage / 100;\n }\n end = startAngleRad + (cumulative * circ);\n\n // set the shape\n point.shapeType = 'arc';\n point.shapeArgs = {\n x: positions[0],\n y: positions[1],\n r: positions[2] / 2,\n innerR: positions[3] / 2,\n start: mathRound(start * precision) / precision,\n end: mathRound(end * precision) / precision\n };\n\n // The angle must stay within -90 and 270 (#2645)\n angle = (end + start) / 2;\n if (angle > 1.5 * mathPI) {\n angle -= 2 * mathPI;\n } else if (angle < -mathPI / 2) {\n angle += 2 * mathPI;\n }\n\n // Center for the sliced out slice\n point.slicedTranslation = {\n translateX: mathRound(mathCos(angle) * slicedOffset),\n translateY: mathRound(mathSin(angle) * slicedOffset)\n };\n\n // set the anchor point for tooltips\n radiusX = mathCos(angle) * positions[2] / 2;\n radiusY = mathSin(angle) * positions[2] / 2;\n point.tooltipPos = [\n positions[0] + radiusX * 0.7,\n positions[1] + radiusY * 0.7\n ];\n\n point.half = angle < -mathPI / 2 || angle > mathPI / 2 ? 1 : 0;\n point.angle = angle;\n\n // set the anchor point for data labels\n connectorOffset = mathMin(connectorOffset, labelDistance / 2); // #1678\n point.labelPos = [\n positions[0] + radiusX + mathCos(angle) * labelDistance, // first break of connector\n positions[1] + radiusY + mathSin(angle) * labelDistance, // a/a\n positions[0] + radiusX + mathCos(angle) * connectorOffset, // second break, right outside pie\n positions[1] + radiusY + mathSin(angle) * connectorOffset, // a/a\n positions[0] + radiusX, // landing point for connector\n positions[1] + radiusY, // a/a\n labelDistance < 0 ? // alignment\n 'center' :\n point.half ? 'right' : 'left', // alignment\n angle // center angle\n ];\n\n }\n },\n\n drawGraph: null,\n\n /**\n * Draw the data points\n */\n drawPoints: function () {\n var series = this,\n chart = series.chart,\n renderer = chart.renderer,\n groupTranslation,\n //center,\n graphic,\n //group,\n shadow = series.options.shadow,\n shadowGroup,\n pointAttr,\n shapeArgs,\n attr;\n\n if (shadow && !series.shadowGroup) {\n series.shadowGroup = renderer.g('shadow')\n .add(series.group);\n }\n\n // draw the slices\n each(series.points, function (point) {\n if (point.y !== null) {\n graphic = point.graphic;\n shapeArgs = point.shapeArgs;\n shadowGroup = point.shadowGroup;\n pointAttr = point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE];\n if (!pointAttr.stroke) {\n pointAttr.stroke = pointAttr.fill;\n }\n\n // put the shadow behind all points\n if (shadow && !shadowGroup) {\n shadowGroup = point.shadowGroup = renderer.g('shadow')\n .add(series.shadowGroup);\n }\n\n // if the point is sliced, use special translation, else use plot area traslation\n groupTranslation = point.sliced ? point.slicedTranslation : {\n translateX: 0,\n translateY: 0\n };\n\n //group.translate(groupTranslation[0], groupTranslation[1]);\n if (shadowGroup) {\n shadowGroup.attr(groupTranslation);\n }\n\n // draw the slice\n if (graphic) {\n graphic\n .setRadialReference(series.center)\n .attr(pointAttr)\n .animate(extend(shapeArgs, groupTranslation));\n } else {\n attr = { 'stroke-linejoin': 'round' };\n if (!point.visible) {\n attr.visibility = 'hidden';\n }\n\n point.graphic = graphic = renderer[point.shapeType](shapeArgs)\n .setRadialReference(series.center)\n .attr(pointAttr)\n .attr(attr)\n .attr(groupTranslation)\n .add(series.group)\n .shadow(shadow, shadowGroup);\n }\n }\n });\n\n },\n\n\n searchPoint: noop,\n\n /**\n * Utility for sorting data labels\n */\n sortByAngle: function (points, sign) {\n points.sort(function (a, b) {\n return a.angle !== undefined && (b.angle - a.angle) * sign;\n });\n },\n\n /**\n * Use a simple symbol from LegendSymbolMixin\n */\n drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n\n /**\n * Use the getCenter method from drawLegendSymbol\n */\n getCenter: CenteredSeriesMixin.getCenter,\n\n /**\n * Pies don't have point marker symbols\n */\n getSymbol: noop\n\n };\n PieSeries = extendClass(Series, PieSeries);\n seriesTypes.pie = PieSeries;\n\n /**\n * Draw the data labels\n */\n Series.prototype.drawDataLabels = function () {\n\n var series = this,\n seriesOptions = series.options,\n cursor = seriesOptions.cursor,\n options = seriesOptions.dataLabels,\n points = series.points,\n pointOptions,\n generalOptions,\n hasRendered = series.hasRendered || 0,\n str,\n dataLabelsGroup,\n defer = pick(options.defer, true),\n renderer = series.chart.renderer;\n\n if (options.enabled || series._hasPointLabels) {\n\n // Process default alignment of data labels for columns\n if (series.dlProcessOptions) {\n series.dlProcessOptions(options);\n }\n\n // Create a separate group for the data labels to avoid rotation\n dataLabelsGroup = series.plotGroup(\n 'dataLabelsGroup',\n 'data-labels',\n defer && !hasRendered ? 'hidden' : 'visible', // #5133\n options.zIndex || 6\n );\n\n if (defer) {\n dataLabelsGroup.attr({ opacity: +hasRendered }); // #3300\n if (!hasRendered) {\n addEvent(series, 'afterAnimate', function () {\n if (series.visible) { // #2597, #3023, #3024\n dataLabelsGroup.show(true);\n }\n dataLabelsGroup[seriesOptions.animation ? 'animate' : 'attr']({ opacity: 1 }, { duration: 200 });\n });\n }\n }\n\n // Make the labels for each point\n generalOptions = options;\n each(points, function (point) {\n\n var enabled,\n dataLabel = point.dataLabel,\n labelConfig,\n attr,\n name,\n rotation,\n connector = point.connector,\n isNew = true,\n style,\n moreStyle = {};\n\n // Determine if each data label is enabled\n pointOptions = point.dlOptions || (point.options && point.options.dataLabels); // dlOptions is used in treemaps\n enabled = pick(pointOptions && pointOptions.enabled, generalOptions.enabled) && point.y !== null; // #2282, #4641\n\n\n // If the point is outside the plot area, destroy it. #678, #820\n if (dataLabel && !enabled) {\n point.dataLabel = dataLabel.destroy();\n\n // Individual labels are disabled if the are explicitly disabled\n // in the point options, or if they fall outside the plot area.\n } else if (enabled) {\n\n // Create individual options structure that can be extended without\n // affecting others\n options = merge(generalOptions, pointOptions);\n style = options.style;\n\n rotation = options.rotation;\n\n // Get the string\n labelConfig = point.getLabelConfig();\n str = options.format ?\n format(options.format, labelConfig) :\n options.formatter.call(labelConfig, options);\n\n // Determine the color\n style.color = pick(options.color, style.color, series.color, 'black');\n\n\n // update existing label\n if (dataLabel) {\n\n if (defined(str)) {\n dataLabel\n .attr({\n text: str\n });\n isNew = false;\n\n } else { // #1437 - the label is shown conditionally\n point.dataLabel = dataLabel = dataLabel.destroy();\n if (connector) {\n point.connector = connector.destroy();\n }\n }\n\n // create new label\n } else if (defined(str)) {\n attr = {\n //align: align,\n fill: options.backgroundColor,\n stroke: options.borderColor,\n 'stroke-width': options.borderWidth,\n r: options.borderRadius || 0,\n rotation: rotation,\n padding: options.padding,\n zIndex: 1\n };\n\n // Get automated contrast color\n if (style.color === 'contrast') {\n moreStyle.color = options.inside || options.distance < 0 || !!seriesOptions.stacking ?\n renderer.getContrast(point.color || series.color) :\n '#000000';\n }\n if (cursor) {\n moreStyle.cursor = cursor;\n }\n\n\n // Remove unused attributes (#947)\n for (name in attr) {\n if (attr[name] === UNDEFINED) {\n delete attr[name];\n }\n }\n\n dataLabel = point.dataLabel = renderer[rotation ? 'text' : 'label']( // labels don't support rotation\n str,\n 0,\n -9999,\n options.shape,\n null,\n null,\n options.useHTML\n )\n .attr(attr)\n .css(extend(style, moreStyle))\n .add(dataLabelsGroup)\n .shadow(options.shadow);\n\n }\n\n if (dataLabel) {\n // Now the data label is created and placed at 0,0, so we need to align it\n series.alignDataLabel(point, dataLabel, options, null, isNew);\n }\n }\n });\n }\n };\n\n /**\n * Align each individual data label\n */\n Series.prototype.alignDataLabel = function (point, dataLabel, options, alignTo, isNew) {\n var chart = this.chart,\n inverted = chart.inverted,\n plotX = pick(point.plotX, -9999),\n plotY = pick(point.plotY, -9999),\n bBox = dataLabel.getBBox(),\n baseline = chart.renderer.fontMetrics(options.style.fontSize).b,\n rotation = options.rotation,\n normRotation,\n negRotation,\n align = options.align,\n rotCorr, // rotation correction\n // Math.round for rounding errors (#2683), alignTo to allow column labels (#2700)\n visible = this.visible && (point.series.forceDL || chart.isInsidePlot(plotX, mathRound(plotY), inverted) ||\n (alignTo && chart.isInsidePlot(plotX, inverted ? alignTo.x + 1 : alignTo.y + alignTo.height - 1, inverted))),\n alignAttr, // the final position;\n justify = pick(options.overflow, 'justify') === 'justify';\n\n if (visible) {\n\n // The alignment box is a singular point\n alignTo = extend({\n x: inverted ? chart.plotWidth - plotY : plotX,\n y: mathRound(inverted ? chart.plotHeight - plotX : plotY),\n width: 0,\n height: 0\n }, alignTo);\n\n // Add the text size for alignment calculation\n extend(options, {\n width: bBox.width,\n height: bBox.height\n });\n\n // Allow a hook for changing alignment in the last moment, then do the alignment\n if (rotation) {\n justify = false; // Not supported for rotated text\n rotCorr = chart.renderer.rotCorr(baseline, rotation); // #3723\n alignAttr = {\n x: alignTo.x + options.x + alignTo.width / 2 + rotCorr.x,\n y: alignTo.y + options.y + { top: 0, middle: 0.5, bottom: 1 }[options.verticalAlign] * alignTo.height\n };\n dataLabel[isNew ? 'attr' : 'animate'](alignAttr)\n .attr({ // #3003\n align: align\n });\n\n // Compensate for the rotated label sticking out on the sides\n normRotation = (rotation + 720) % 360;\n negRotation = normRotation > 180 && normRotation < 360;\n\n if (align === 'left') {\n alignAttr.y -= negRotation ? bBox.height : 0;\n } else if (align === 'center') {\n alignAttr.x -= bBox.width / 2;\n alignAttr.y -= bBox.height / 2;\n } else if (align === 'right') {\n alignAttr.x -= bBox.width;\n alignAttr.y -= negRotation ? 0 : bBox.height;\n }\n \n\n } else {\n dataLabel.align(options, null, alignTo);\n alignAttr = dataLabel.alignAttr;\n }\n\n // Handle justify or crop\n if (justify) {\n this.justifyDataLabel(dataLabel, options, alignAttr, bBox, alignTo, isNew);\n \n // Now check that the data label is within the plot area\n } else if (pick(options.crop, true)) {\n visible = chart.isInsidePlot(alignAttr.x, alignAttr.y) && chart.isInsidePlot(alignAttr.x + bBox.width, alignAttr.y + bBox.height);\n }\n\n // When we're using a shape, make it possible with a connector or an arrow pointing to thie point\n if (options.shape && !rotation) {\n dataLabel.attr({\n anchorX: point.plotX,\n anchorY: point.plotY\n });\n }\n }\n\n // Show or hide based on the final aligned position\n if (!visible) {\n stop(dataLabel);\n dataLabel.attr({ y: -9999 });\n dataLabel.placed = false; // don't animate back in\n }\n\n };\n\n /**\n * If data labels fall partly outside the plot area, align them back in, in a way that\n * doesn't hide the point.\n */\n Series.prototype.justifyDataLabel = function (dataLabel, options, alignAttr, bBox, alignTo, isNew) {\n var chart = this.chart,\n align = options.align,\n verticalAlign = options.verticalAlign,\n off,\n justified,\n padding = dataLabel.box ? 0 : (dataLabel.padding || 0);\n\n // Off left\n off = alignAttr.x + padding;\n if (off < 0) {\n if (align === 'right') {\n options.align = 'left';\n } else {\n options.x = -off;\n }\n justified = true;\n }\n\n // Off right\n off = alignAttr.x + bBox.width - padding;\n if (off > chart.plotWidth) {\n if (align === 'left') {\n options.align = 'right';\n } else {\n options.x = chart.plotWidth - off;\n }\n justified = true;\n }\n\n // Off top\n off = alignAttr.y + padding;\n if (off < 0) {\n if (verticalAlign === 'bottom') {\n options.verticalAlign = 'top';\n } else {\n options.y = -off;\n }\n justified = true;\n }\n\n // Off bottom\n off = alignAttr.y + bBox.height - padding;\n if (off > chart.plotHeight) {\n if (verticalAlign === 'top') {\n options.verticalAlign = 'bottom';\n } else {\n options.y = chart.plotHeight - off;\n }\n justified = true;\n }\n\n if (justified) {\n dataLabel.placed = !isNew;\n dataLabel.align(options, null, alignTo);\n }\n };\n\n /**\n * Override the base drawDataLabels method by pie specific functionality\n */\n if (seriesTypes.pie) {\n seriesTypes.pie.prototype.drawDataLabels = function () {\n var series = this,\n data = series.data,\n point,\n chart = series.chart,\n options = series.options.dataLabels,\n connectorPadding = pick(options.connectorPadding, 10),\n connectorWidth = pick(options.connectorWidth, 1),\n plotWidth = chart.plotWidth,\n plotHeight = chart.plotHeight,\n connector,\n connectorPath,\n softConnector = pick(options.softConnector, true),\n distanceOption = options.distance,\n seriesCenter = series.center,\n radius = seriesCenter[2] / 2,\n centerY = seriesCenter[1],\n outside = distanceOption > 0,\n dataLabel,\n dataLabelWidth,\n labelPos,\n labelHeight,\n halves = [// divide the points into right and left halves for anti collision\n [], // right\n [] // left\n ],\n x,\n y,\n visibility,\n rankArr,\n i,\n j,\n overflow = [0, 0, 0, 0], // top, right, bottom, left\n sort = function (a, b) {\n return b.y - a.y;\n };\n\n // get out if not enabled\n if (!series.visible || (!options.enabled && !series._hasPointLabels)) {\n return;\n }\n\n // run parent method\n Series.prototype.drawDataLabels.apply(series);\n\n each(data, function (point) {\n if (point.dataLabel && point.visible) { // #407, #2510\n\n // Arrange points for detection collision\n halves[point.half].push(point);\n\n // Reset positions (#4905)\n point.dataLabel._pos = null;\n }\n });\n\n /* Loop over the points in each half, starting from the top and bottom\n * of the pie to detect overlapping labels.\n */\n i = 2;\n while (i--) {\n\n var slots = [],\n slotsLength,\n usedSlots = [],\n points = halves[i],\n pos,\n bottom,\n length = points.length,\n slotIndex;\n\n if (!length) {\n continue;\n }\n\n // Sort by angle\n series.sortByAngle(points, i - 0.5);\n\n // Assume equal label heights on either hemisphere (#2630)\n j = labelHeight = 0;\n while (!labelHeight && points[j]) { // #1569\n labelHeight = points[j] && points[j].dataLabel && (points[j].dataLabel.getBBox().height || 21); // 21 is for #968\n j++;\n }\n\n // Only do anti-collision when we are outside the pie and have connectors (#856)\n if (distanceOption > 0) {\n\n // Build the slots\n bottom = mathMin(centerY + radius + distanceOption, chart.plotHeight);\n for (pos = mathMax(0, centerY - radius - distanceOption); pos <= bottom; pos += labelHeight) {\n slots.push(pos);\n }\n slotsLength = slots.length;\n\n\n /* Visualize the slots\n if (!series.slotElements) {\n series.slotElements = [];\n }\n if (i === 1) {\n series.slotElements.forEach(function (elem) {\n elem.destroy();\n });\n series.slotElements.length = 0;\n }\n\n slots.forEach(function (pos, no) {\n var slotX = series.getX(pos, i) + chart.plotLeft - (i ? 100 : 0),\n slotY = pos + chart.plotTop;\n\n if (isNumber(slotX)) {\n series.slotElements.push(chart.renderer.rect(slotX, slotY - 7, 100, labelHeight, 1)\n .attr({\n 'stroke-width': 1,\n stroke: 'silver',\n fill: 'rgba(0,0,255,0.1)'\n })\n .add());\n series.slotElements.push(chart.renderer.text('Slot '+ no, slotX, slotY + 4)\n .attr({\n fill: 'silver'\n }).add());\n }\n });\n // */\n\n // if there are more values than available slots, remove lowest values\n if (length > slotsLength) {\n // create an array for sorting and ranking the points within each quarter\n rankArr = [].concat(points);\n rankArr.sort(sort);\n j = length;\n while (j--) {\n rankArr[j].rank = j;\n }\n j = length;\n while (j--) {\n if (points[j].rank >= slotsLength) {\n points.splice(j, 1);\n }\n }\n length = points.length;\n }\n\n // The label goes to the nearest open slot, but not closer to the edge than\n // the label's index.\n for (j = 0; j < length; j++) {\n\n point = points[j];\n labelPos = point.labelPos;\n\n var closest = 9999,\n distance,\n slotI;\n\n // find the closest slot index\n for (slotI = 0; slotI < slotsLength; slotI++) {\n distance = mathAbs(slots[slotI] - labelPos[1]);\n if (distance < closest) {\n closest = distance;\n slotIndex = slotI;\n }\n }\n\n // if that slot index is closer to the edges of the slots, move it\n // to the closest appropriate slot\n if (slotIndex < j && slots[j] !== null) { // cluster at the top\n slotIndex = j;\n } else if (slotsLength < length - j + slotIndex && slots[j] !== null) { // cluster at the bottom\n slotIndex = slotsLength - length + j;\n while (slots[slotIndex] === null) { // make sure it is not taken\n slotIndex++;\n }\n } else {\n // Slot is taken, find next free slot below. In the next run, the next slice will find the\n // slot above these, because it is the closest one\n while (slots[slotIndex] === null) { // make sure it is not taken\n slotIndex++;\n }\n }\n\n usedSlots.push({ i: slotIndex, y: slots[slotIndex] });\n slots[slotIndex] = null; // mark as taken\n }\n // sort them in order to fill in from the top\n usedSlots.sort(sort);\n }\n\n // now the used slots are sorted, fill them up sequentially\n for (j = 0; j < length; j++) {\n\n var slot, naturalY;\n\n point = points[j];\n labelPos = point.labelPos;\n dataLabel = point.dataLabel;\n visibility = point.visible === false ? HIDDEN : 'inherit';\n naturalY = labelPos[1];\n\n if (distanceOption > 0) {\n slot = usedSlots.pop();\n slotIndex = slot.i;\n\n // if the slot next to currrent slot is free, the y value is allowed\n // to fall back to the natural position\n y = slot.y;\n if ((naturalY > y && slots[slotIndex + 1] !== null) ||\n (naturalY < y && slots[slotIndex - 1] !== null)) {\n y = mathMin(mathMax(0, naturalY), chart.plotHeight);\n }\n\n } else {\n y = naturalY;\n }\n\n // get the x - use the natural x position for first and last slot, to prevent the top\n // and botton slice connectors from touching each other on either side\n x = options.justify ?\n seriesCenter[0] + (i ? -1 : 1) * (radius + distanceOption) :\n series.getX(y === centerY - radius - distanceOption || y === centerY + radius + distanceOption ? naturalY : y, i);\n\n\n // Record the placement and visibility\n dataLabel._attr = {\n visibility: visibility,\n align: labelPos[6]\n };\n dataLabel._pos = {\n x: x + options.x +\n ({ left: connectorPadding, right: -connectorPadding }[labelPos[6]] || 0),\n y: y + options.y - 10 // 10 is for the baseline (label vs text)\n };\n dataLabel.connX = x;\n dataLabel.connY = y;\n\n\n // Detect overflowing data labels\n if (this.options.size === null) {\n dataLabelWidth = dataLabel.width;\n // Overflow left\n if (x - dataLabelWidth < connectorPadding) {\n overflow[3] = mathMax(mathRound(dataLabelWidth - x + connectorPadding), overflow[3]);\n\n // Overflow right\n } else if (x + dataLabelWidth > plotWidth - connectorPadding) {\n overflow[1] = mathMax(mathRound(x + dataLabelWidth - plotWidth + connectorPadding), overflow[1]);\n }\n\n // Overflow top\n if (y - labelHeight / 2 < 0) {\n overflow[0] = mathMax(mathRound(-y + labelHeight / 2), overflow[0]);\n\n // Overflow left\n } else if (y + labelHeight / 2 > plotHeight) {\n overflow[2] = mathMax(mathRound(y + labelHeight / 2 - plotHeight), overflow[2]);\n }\n }\n } // for each point\n } // for each half\n\n // Do not apply the final placement and draw the connectors until we have verified\n // that labels are not spilling over.\n if (arrayMax(overflow) === 0 || this.verifyDataLabelOverflow(overflow)) {\n\n // Place the labels in the final position\n this.placeDataLabels();\n\n // Draw the connectors\n if (outside && connectorWidth) {\n each(this.points, function (point) {\n connector = point.connector;\n labelPos = point.labelPos;\n dataLabel = point.dataLabel;\n\n if (dataLabel && dataLabel._pos && point.visible) {\n visibility = dataLabel._attr.visibility;\n x = dataLabel.connX;\n y = dataLabel.connY;\n connectorPath = softConnector ? [\n M,\n x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label\n 'C',\n x, y, // first break, next to the label\n 2 * labelPos[2] - labelPos[4], 2 * labelPos[3] - labelPos[5],\n labelPos[2], labelPos[3], // second break\n L,\n labelPos[4], labelPos[5] // base\n ] : [\n M,\n x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label\n L,\n labelPos[2], labelPos[3], // second break\n L,\n labelPos[4], labelPos[5] // base\n ];\n\n if (connector) {\n connector.animate({ d: connectorPath });\n connector.attr('visibility', visibility);\n\n } else {\n point.connector = connector = series.chart.renderer.path(connectorPath).attr({\n 'stroke-width': connectorWidth,\n stroke: options.connectorColor || point.color || '#606060',\n visibility: visibility\n //zIndex: 0 // #2722 (reversed)\n })\n .add(series.dataLabelsGroup);\n }\n } else if (connector) {\n point.connector = connector.destroy();\n }\n });\n }\n }\n };\n /**\n * Perform the final placement of the data labels after we have verified that they\n * fall within the plot area.\n */\n seriesTypes.pie.prototype.placeDataLabels = function () {\n each(this.points, function (point) {\n var dataLabel = point.dataLabel,\n _pos;\n\n if (dataLabel && point.visible) {\n _pos = dataLabel._pos;\n if (_pos) {\n dataLabel.attr(dataLabel._attr);\n dataLabel[dataLabel.moved ? 'animate' : 'attr'](_pos);\n dataLabel.moved = true;\n } else if (dataLabel) {\n dataLabel.attr({ y: -9999 });\n }\n }\n });\n };\n\n seriesTypes.pie.prototype.alignDataLabel = noop;\n\n /**\n * Verify whether the data labels are allowed to draw, or we should run more translation and data\n * label positioning to keep them inside the plot area. Returns true when data labels are ready\n * to draw.\n */\n seriesTypes.pie.prototype.verifyDataLabelOverflow = function (overflow) {\n\n var center = this.center,\n options = this.options,\n centerOption = options.center,\n minSize = options.minSize || 80,\n newSize = minSize,\n ret;\n\n // Handle horizontal size and center\n if (centerOption[0] !== null) { // Fixed center\n newSize = mathMax(center[2] - mathMax(overflow[1], overflow[3]), minSize);\n\n } else { // Auto center\n newSize = mathMax(\n center[2] - overflow[1] - overflow[3], // horizontal overflow\n minSize\n );\n center[0] += (overflow[3] - overflow[1]) / 2; // horizontal center\n }\n\n // Handle vertical size and center\n if (centerOption[1] !== null) { // Fixed center\n newSize = mathMax(mathMin(newSize, center[2] - mathMax(overflow[0], overflow[2])), minSize);\n\n } else { // Auto center\n newSize = mathMax(\n mathMin(\n newSize,\n center[2] - overflow[0] - overflow[2] // vertical overflow\n ),\n minSize\n );\n center[1] += (overflow[0] - overflow[2]) / 2; // vertical center\n }\n\n // If the size must be decreased, we need to run translate and drawDataLabels again\n if (newSize < center[2]) {\n center[2] = newSize;\n center[3] = Math.min(relativeLength(options.innerSize || 0, newSize), newSize); // #3632\n this.translate(center);\n \n if (this.drawDataLabels) {\n this.drawDataLabels();\n }\n // Else, return true to indicate that the pie and its labels is within the plot area\n } else {\n ret = true;\n }\n return ret;\n };\n }\n\n if (seriesTypes.column) {\n\n /**\n * Override the basic data label alignment by adjusting for the position of the column\n */\n seriesTypes.column.prototype.alignDataLabel = function (point, dataLabel, options, alignTo, isNew) {\n var inverted = this.chart.inverted,\n series = point.series,\n dlBox = point.dlBox || point.shapeArgs, // data label box for alignment\n below = pick(point.below, point.plotY > pick(this.translatedThreshold, series.yAxis.len)), // point.below is used in range series\n inside = pick(options.inside, !!this.options.stacking), // draw it inside the box?\n overshoot;\n\n // Align to the column itself, or the top of it\n if (dlBox) { // Area range uses this method but not alignTo\n alignTo = merge(dlBox);\n\n if (alignTo.y < 0) {\n alignTo.height += alignTo.y;\n alignTo.y = 0;\n }\n overshoot = alignTo.y + alignTo.height - series.yAxis.len;\n if (overshoot > 0) {\n alignTo.height -= overshoot;\n }\n\n if (inverted) {\n alignTo = {\n x: series.yAxis.len - alignTo.y - alignTo.height,\n y: series.xAxis.len - alignTo.x - alignTo.width,\n width: alignTo.height,\n height: alignTo.width\n };\n }\n\n // Compute the alignment box\n if (!inside) {\n if (inverted) {\n alignTo.x += below ? 0 : alignTo.width;\n alignTo.width = 0;\n } else {\n alignTo.y += below ? alignTo.height : 0;\n alignTo.height = 0;\n }\n }\n }\n\n\n // When alignment is undefined (typically columns and bars), display the individual\n // point below or above the point depending on the threshold\n options.align = pick(\n options.align,\n !inverted || inside ? 'center' : below ? 'right' : 'left'\n );\n options.verticalAlign = pick(\n options.verticalAlign,\n inverted || inside ? 'middle' : below ? 'top' : 'bottom'\n );\n\n // Call the parent method\n Series.prototype.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);\n };\n }\n\n\n\n /**\n * Highcharts module to hide overlapping data labels. This module is included in Highcharts.\n */\n (function (H) {\n var Chart = H.Chart,\n each = H.each,\n pick = H.pick,\n addEvent = H.addEvent;\n\n // Collect potensial overlapping data labels. Stack labels probably don't need to be \n // considered because they are usually accompanied by data labels that lie inside the columns.\n Chart.prototype.callbacks.push(function (chart) {\n function collectAndHide() {\n var labels = [];\n\n each(chart.series, function (series) {\n var dlOptions = series.options.dataLabels,\n collections = series.dataLabelCollections || ['dataLabel']; // Range series have two collections\n if ((dlOptions.enabled || series._hasPointLabels) && !dlOptions.allowOverlap && series.visible) { // #3866\n each(collections, function (coll) {\n each(series.points, function (point) {\n if (point[coll]) {\n point[coll].labelrank = pick(point.labelrank, point.shapeArgs && point.shapeArgs.height); // #4118\n labels.push(point[coll]);\n }\n });\n });\n }\n });\n chart.hideOverlappingLabels(labels);\n }\n\n // Do it now ...\n collectAndHide();\n\n // ... and after each chart redraw\n addEvent(chart, 'redraw', collectAndHide);\n\n });\n\n /**\n * Hide overlapping labels. Labels are moved and faded in and out on zoom to provide a smooth \n * visual imression.\n */ \n Chart.prototype.hideOverlappingLabels = function (labels) {\n\n var len = labels.length,\n label,\n i,\n j,\n label1,\n label2,\n isIntersecting,\n pos1,\n pos2,\n parent1,\n parent2,\n padding,\n intersectRect = function (x1, y1, w1, h1, x2, y2, w2, h2) {\n return !(\n x2 > x1 + w1 ||\n x2 + w2 < x1 ||\n y2 > y1 + h1 ||\n y2 + h2 < y1\n );\n };\n \n // Mark with initial opacity\n for (i = 0; i < len; i++) {\n label = labels[i];\n if (label) {\n label.oldOpacity = label.opacity;\n label.newOpacity = 1;\n }\n }\n\n // Prevent a situation in a gradually rising slope, that each label\n // will hide the previous one because the previous one always has\n // lower rank.\n labels.sort(function (a, b) {\n return (b.labelrank || 0) - (a.labelrank || 0);\n });\n\n // Detect overlapping labels\n for (i = 0; i < len; i++) {\n label1 = labels[i];\n\n for (j = i + 1; j < len; ++j) {\n label2 = labels[j];\n if (label1 && label2 && label1.placed && label2.placed && label1.newOpacity !== 0 && label2.newOpacity !== 0) {\n pos1 = label1.alignAttr;\n pos2 = label2.alignAttr;\n parent1 = label1.parentGroup; // Different panes have different positions\n parent2 = label2.parentGroup;\n padding = 2 * (label1.box ? 0 : label1.padding); // Substract the padding if no background or border (#4333)\n isIntersecting = intersectRect(\n pos1.x + parent1.translateX,\n pos1.y + parent1.translateY,\n label1.width - padding,\n label1.height - padding,\n pos2.x + parent2.translateX,\n pos2.y + parent2.translateY,\n label2.width - padding,\n label2.height - padding\n );\n\n if (isIntersecting) {\n (label1.labelrank < label2.labelrank ? label1 : label2).newOpacity = 0;\n }\n }\n }\n }\n\n // Hide or show\n each(labels, function (label) {\n var complete,\n newOpacity;\n\n if (label) {\n newOpacity = label.newOpacity;\n\n if (label.oldOpacity !== newOpacity && label.placed) {\n\n // Make sure the label is completely hidden to avoid catching clicks (#4362)\n if (newOpacity) {\n label.show(true);\n } else {\n complete = function () {\n label.hide();\n };\n }\n\n // Animate or set the opacity \n label.alignAttr.opacity = newOpacity;\n label[label.isOld ? 'animate' : 'attr'](label.alignAttr, null, complete);\n \n }\n label.isOld = true;\n }\n });\n };\n }(Highcharts));\n /**\n * TrackerMixin for points and graphs\n */\n\n var TrackerMixin = Highcharts.TrackerMixin = {\n\n drawTrackerPoint: function () {\n var series = this,\n chart = series.chart,\n pointer = chart.pointer,\n cursor = series.options.cursor,\n css = cursor && { cursor: cursor },\n onMouseOver = function (e) {\n var target = e.target,\n point;\n\n while (target && !point) {\n point = target.point;\n target = target.parentNode;\n }\n\n if (point !== UNDEFINED && point !== chart.hoverPoint) { // undefined on graph in scatterchart\n point.onMouseOver(e);\n }\n };\n\n // Add reference to the point\n each(series.points, function (point) {\n if (point.graphic) {\n point.graphic.element.point = point;\n }\n if (point.dataLabel) {\n point.dataLabel.element.point = point;\n }\n });\n\n // Add the event listeners, we need to do this only once\n if (!series._hasTracking) {\n each(series.trackerGroups, function (key) {\n if (series[key]) { // we don't always have dataLabelsGroup\n series[key]\n .addClass(PREFIX + 'tracker')\n .on('mouseover', onMouseOver)\n .on('mouseout', function (e) {\n pointer.onTrackerMouseOut(e);\n })\n .css(css);\n if (hasTouch) {\n series[key].on('touchstart', onMouseOver);\n }\n }\n });\n series._hasTracking = true;\n }\n },\n\n /**\n * Draw the tracker object that sits above all data labels and markers to\n * track mouse events on the graph or points. For the line type charts\n * the tracker uses the same graphPath, but with a greater stroke width\n * for better control.\n */\n drawTrackerGraph: function () {\n var series = this,\n options = series.options,\n trackByArea = options.trackByArea,\n trackerPath = [].concat(trackByArea ? series.areaPath : series.graphPath),\n trackerPathLength = trackerPath.length,\n chart = series.chart,\n pointer = chart.pointer,\n renderer = chart.renderer,\n snap = chart.options.tooltip.snap,\n tracker = series.tracker,\n cursor = options.cursor,\n css = cursor && { cursor: cursor },\n i,\n onMouseOver = function () {\n if (chart.hoverSeries !== series) {\n series.onMouseOver();\n }\n },\n /*\n * Empirical lowest possible opacities for TRACKER_FILL for an element to stay invisible but clickable\n * IE6: 0.002\n * IE7: 0.002\n * IE8: 0.002\n * IE9: 0.00000000001 (unlimited)\n * IE10: 0.0001 (exporting only)\n * FF: 0.00000000001 (unlimited)\n * Chrome: 0.000001\n * Safari: 0.000001\n * Opera: 0.00000000001 (unlimited)\n */\n TRACKER_FILL = 'rgba(192,192,192,' + (hasSVG ? 0.0001 : 0.002) + ')';\n\n // Extend end points. A better way would be to use round linecaps,\n // but those are not clickable in VML.\n if (trackerPathLength && !trackByArea) {\n i = trackerPathLength + 1;\n while (i--) {\n if (trackerPath[i] === M) { // extend left side\n trackerPath.splice(i + 1, 0, trackerPath[i + 1] - snap, trackerPath[i + 2], L);\n }\n if ((i && trackerPath[i] === M) || i === trackerPathLength) { // extend right side\n trackerPath.splice(i, 0, L, trackerPath[i - 2] + snap, trackerPath[i - 1]);\n }\n }\n }\n\n // handle single points\n /*for (i = 0; i < singlePoints.length; i++) {\n singlePoint = singlePoints[i];\n trackerPath.push(M, singlePoint.plotX - snap, singlePoint.plotY,\n L, singlePoint.plotX + snap, singlePoint.plotY);\n }*/\n\n // draw the tracker\n if (tracker) {\n tracker.attr({ d: trackerPath });\n } else { // create\n\n series.tracker = renderer.path(trackerPath)\n .attr({\n 'stroke-linejoin': 'round', // #1225\n visibility: series.visible ? VISIBLE : HIDDEN,\n stroke: TRACKER_FILL,\n fill: trackByArea ? TRACKER_FILL : NONE,\n 'stroke-width': options.lineWidth + (trackByArea ? 0 : 2 * snap),\n zIndex: 2\n })\n .add(series.group);\n\n // The tracker is added to the series group, which is clipped, but is covered\n // by the marker group. So the marker group also needs to capture events.\n each([series.tracker, series.markerGroup], function (tracker) {\n tracker.addClass(PREFIX + 'tracker')\n .on('mouseover', onMouseOver)\n .on('mouseout', function (e) {\n pointer.onTrackerMouseOut(e);\n })\n .css(css);\n\n if (hasTouch) {\n tracker.on('touchstart', onMouseOver);\n }\n });\n }\n }\n };\n /* End TrackerMixin */\n\n\n /**\n * Add tracking event listener to the series group, so the point graphics\n * themselves act as trackers\n */\n\n if (seriesTypes.column) {\n ColumnSeries.prototype.drawTracker = TrackerMixin.drawTrackerPoint;\n }\n\n if (seriesTypes.pie) {\n seriesTypes.pie.prototype.drawTracker = TrackerMixin.drawTrackerPoint;\n }\n\n if (seriesTypes.scatter) {\n ScatterSeries.prototype.drawTracker = TrackerMixin.drawTrackerPoint;\n }\n\n /*\n * Extend Legend for item events\n */\n extend(Legend.prototype, {\n\n setItemEvents: function (item, legendItem, useHTML, itemStyle, itemHiddenStyle) {\n var legend = this;\n // Set the events on the item group, or in case of useHTML, the item itself (#1249)\n (useHTML ? legendItem : item.legendGroup).on('mouseover', function () {\n item.setState(HOVER_STATE);\n legendItem.css(legend.options.itemHoverStyle);\n })\n .on('mouseout', function () {\n legendItem.css(item.visible ? itemStyle : itemHiddenStyle);\n item.setState();\n })\n .on('click', function (event) {\n var strLegendItemClick = 'legendItemClick',\n fnLegendItemClick = function () {\n if (item.setVisible) {\n item.setVisible();\n }\n };\n\n // Pass over the click/touch event. #4.\n event = {\n browserEvent: event\n };\n\n // click the name or symbol\n if (item.firePointEvent) { // point\n item.firePointEvent(strLegendItemClick, event, fnLegendItemClick);\n } else {\n fireEvent(item, strLegendItemClick, event, fnLegendItemClick);\n }\n });\n },\n\n createCheckboxForItem: function (item) {\n var legend = this;\n\n item.checkbox = createElement('input', {\n type: 'checkbox',\n checked: item.selected,\n defaultChecked: item.selected // required by IE7\n }, legend.options.itemCheckboxStyle, legend.chart.container);\n\n addEvent(item.checkbox, 'click', function (event) {\n var target = event.target;\n fireEvent(\n item.series || item, \n 'checkboxClick', \n { // #3712\n checked: target.checked,\n item: item\n },\n function () {\n item.select();\n }\n );\n });\n }\n });\n\n /*\n * Add pointer cursor to legend itemstyle in defaultOptions\n */\n defaultOptions.legend.itemStyle.cursor = 'pointer';\n\n\n /*\n * Extend the Chart object with interaction\n */\n\n extend(Chart.prototype, {\n /**\n * Display the zoom button\n */\n showResetZoom: function () {\n var chart = this,\n lang = defaultOptions.lang,\n btnOptions = chart.options.chart.resetZoomButton,\n theme = btnOptions.theme,\n states = theme.states,\n alignTo = btnOptions.relativeTo === 'chart' ? null : 'plotBox';\n\n function zoomOut() {\n chart.zoomOut();\n }\n\n this.resetZoomButton = chart.renderer.button(lang.resetZoom, null, null, zoomOut, theme, states && states.hover)\n .attr({\n align: btnOptions.position.align,\n title: lang.resetZoomTitle\n })\n .add()\n .align(btnOptions.position, false, alignTo);\n\n },\n\n /**\n * Zoom out to 1:1\n */\n zoomOut: function () {\n var chart = this;\n fireEvent(chart, 'selection', { resetSelection: true }, function () {\n chart.zoom();\n });\n },\n\n /**\n * Zoom into a given portion of the chart given by axis coordinates\n * @param {Object} event\n */\n zoom: function (event) {\n var chart = this,\n hasZoomed,\n pointer = chart.pointer,\n displayButton = false,\n resetZoomButton;\n\n // If zoom is called with no arguments, reset the axes\n if (!event || event.resetSelection) {\n each(chart.axes, function (axis) {\n hasZoomed = axis.zoom();\n });\n } else { // else, zoom in on all axes\n each(event.xAxis.concat(event.yAxis), function (axisData) {\n var axis = axisData.axis,\n isXAxis = axis.isXAxis;\n\n // don't zoom more than minRange\n if (pointer[isXAxis ? 'zoomX' : 'zoomY'] || pointer[isXAxis ? 'pinchX' : 'pinchY']) {\n hasZoomed = axis.zoom(axisData.min, axisData.max);\n if (axis.displayBtn) {\n displayButton = true;\n }\n }\n });\n }\n\n // Show or hide the Reset zoom button\n resetZoomButton = chart.resetZoomButton;\n if (displayButton && !resetZoomButton) {\n chart.showResetZoom();\n } else if (!displayButton && isObject(resetZoomButton)) {\n chart.resetZoomButton = resetZoomButton.destroy();\n }\n\n\n // Redraw\n if (hasZoomed) {\n chart.redraw(\n pick(chart.options.chart.animation, event && event.animation, chart.pointCount < 100) // animation\n );\n }\n },\n\n /**\n * Pan the chart by dragging the mouse across the pane. This function is called\n * on mouse move, and the distance to pan is computed from chartX compared to\n * the first chartX position in the dragging operation.\n */\n pan: function (e, panning) {\n\n var chart = this,\n hoverPoints = chart.hoverPoints,\n doRedraw;\n\n // remove active points for shared tooltip\n if (hoverPoints) {\n each(hoverPoints, function (point) {\n point.setState();\n });\n }\n\n each(panning === 'xy' ? [1, 0] : [1], function (isX) { // xy is used in maps\n var axis = chart[isX ? 'xAxis' : 'yAxis'][0],\n horiz = axis.horiz,\n mousePos = e[horiz ? 'chartX' : 'chartY'],\n mouseDown = horiz ? 'mouseDownX' : 'mouseDownY',\n startPos = chart[mouseDown],\n halfPointRange = (axis.pointRange || 0) / 2,\n extremes = axis.getExtremes(),\n newMin = axis.toValue(startPos - mousePos, true) + halfPointRange,\n newMax = axis.toValue(startPos + axis.len - mousePos, true) - halfPointRange,\n goingLeft = startPos > mousePos; // #3613\n \n if (axis.series.length &&\n (goingLeft || newMin > mathMin(extremes.dataMin, extremes.min)) && \n (!goingLeft || newMax < mathMax(extremes.dataMax, extremes.max))) {\n axis.setExtremes(newMin, newMax, false, false, { trigger: 'pan' });\n doRedraw = true;\n }\n\n chart[mouseDown] = mousePos; // set new reference for next run\n });\n\n if (doRedraw) {\n chart.redraw(false);\n }\n css(chart.container, { cursor: 'move' });\n }\n });\n\n /*\n * Extend the Point object with interaction\n */\n extend(Point.prototype, {\n /**\n * Toggle the selection status of a point\n * @param {Boolean} selected Whether to select or unselect the point.\n * @param {Boolean} accumulate Whether to add to the previous selection. By default,\n * this happens if the control key (Cmd on Mac) was pressed during clicking.\n */\n select: function (selected, accumulate) {\n var point = this,\n series = point.series,\n chart = series.chart;\n\n selected = pick(selected, !point.selected);\n\n // fire the event with the default handler\n point.firePointEvent(selected ? 'select' : 'unselect', { accumulate: accumulate }, function () {\n point.selected = point.options.selected = selected;\n series.options.data[inArray(point, series.data)] = point.options;\n\n point.setState(selected && SELECT_STATE);\n\n // unselect all other points unless Ctrl or Cmd + click\n if (!accumulate) {\n each(chart.getSelectedPoints(), function (loopPoint) {\n if (loopPoint.selected && loopPoint !== point) {\n loopPoint.selected = loopPoint.options.selected = false;\n series.options.data[inArray(loopPoint, series.data)] = loopPoint.options;\n loopPoint.setState(NORMAL_STATE);\n loopPoint.firePointEvent('unselect');\n }\n });\n }\n });\n },\n\n /**\n * Runs on mouse over the point\n *\n * @param {Object} e The event arguments\n * @param {Boolean} byProximity Falsy for kd points that are closest to the mouse, or to\n * actually hovered points. True for other points in shared tooltip.\n */\n onMouseOver: function (e, byProximity) {\n var point = this,\n series = point.series,\n chart = series.chart,\n tooltip = chart.tooltip,\n hoverPoint = chart.hoverPoint;\n\n if (chart.hoverSeries !== series) {\n series.onMouseOver();\n }\n\n // set normal state to previous series\n if (hoverPoint && hoverPoint !== point) {\n hoverPoint.onMouseOut();\n }\n\n if (point.series) { // It may have been destroyed, #4130\n\n // trigger the event\n point.firePointEvent('mouseOver');\n\n // update the tooltip\n if (tooltip && (!tooltip.shared || series.noSharedTooltip)) {\n tooltip.refresh(point, e);\n }\n\n // hover this\n point.setState(HOVER_STATE);\n if (!byProximity) {\n chart.hoverPoint = point;\n }\n }\n },\n\n /**\n * Runs on mouse out from the point\n */\n onMouseOut: function () {\n var chart = this.series.chart,\n hoverPoints = chart.hoverPoints;\n\n this.firePointEvent('mouseOut');\n\n if (!hoverPoints || inArray(this, hoverPoints) === -1) { // #887, #2240\n this.setState();\n chart.hoverPoint = null;\n }\n },\n\n /**\n * Import events from the series' and point's options. Only do it on\n * demand, to save processing time on hovering.\n */\n importEvents: function () {\n if (!this.hasImportedEvents) {\n var point = this,\n options = merge(point.series.options.point, point.options),\n events = options.events,\n eventType;\n\n point.events = events;\n\n for (eventType in events) {\n addEvent(point, eventType, events[eventType]);\n }\n this.hasImportedEvents = true;\n\n }\n },\n\n /**\n * Set the point's state\n * @param {String} state\n */\n setState: function (state, move) {\n var point = this,\n plotX = mathFloor(point.plotX), // #4586\n plotY = point.plotY,\n series = point.series,\n stateOptions = series.options.states,\n markerOptions = defaultPlotOptions[series.type].marker && series.options.marker,\n normalDisabled = markerOptions && !markerOptions.enabled,\n markerStateOptions = markerOptions && markerOptions.states[state],\n stateDisabled = markerStateOptions && markerStateOptions.enabled === false,\n stateMarkerGraphic = series.stateMarkerGraphic,\n pointMarker = point.marker || {},\n chart = series.chart,\n radius,\n halo = series.halo,\n haloOptions,\n newSymbol,\n pointAttr;\n\n state = state || NORMAL_STATE; // empty string\n pointAttr = point.pointAttr[state] || series.pointAttr[state];\n\n if (\n // already has this state\n (state === point.state && !move) ||\n // selected points don't respond to hover\n (point.selected && state !== SELECT_STATE) ||\n // series' state options is disabled\n (stateOptions[state] && stateOptions[state].enabled === false) ||\n // general point marker's state options is disabled\n (state && (stateDisabled || (normalDisabled && markerStateOptions.enabled === false))) ||\n // individual point marker's state options is disabled\n (state && pointMarker.states && pointMarker.states[state] && pointMarker.states[state].enabled === false) // #1610\n\n ) {\n return;\n }\n\n // apply hover styles to the existing point\n if (point.graphic) {\n radius = markerOptions && point.graphic.symbolName && pointAttr.r;\n point.graphic.attr(merge(\n pointAttr,\n radius ? { // new symbol attributes (#507, #612)\n x: plotX - radius,\n y: plotY - radius,\n width: 2 * radius,\n height: 2 * radius\n } : {}\n ));\n\n // Zooming in from a range with no markers to a range with markers\n if (stateMarkerGraphic) {\n stateMarkerGraphic.hide();\n }\n } else {\n // if a graphic is not applied to each point in the normal state, create a shared\n // graphic for the hover state\n if (state && markerStateOptions) {\n radius = markerStateOptions.radius;\n newSymbol = pointMarker.symbol || series.symbol;\n\n // If the point has another symbol than the previous one, throw away the\n // state marker graphic and force a new one (#1459)\n if (stateMarkerGraphic && stateMarkerGraphic.currentSymbol !== newSymbol) {\n stateMarkerGraphic = stateMarkerGraphic.destroy();\n }\n\n // Add a new state marker graphic\n if (!stateMarkerGraphic) {\n if (newSymbol) {\n series.stateMarkerGraphic = stateMarkerGraphic = chart.renderer.symbol(\n newSymbol,\n plotX - radius,\n plotY - radius,\n 2 * radius,\n 2 * radius\n )\n .attr(pointAttr)\n .add(series.markerGroup);\n stateMarkerGraphic.currentSymbol = newSymbol;\n }\n\n // Move the existing graphic\n } else {\n stateMarkerGraphic[move ? 'animate' : 'attr']({ // #1054\n x: plotX - radius,\n y: plotY - radius\n });\n }\n }\n\n if (stateMarkerGraphic) {\n stateMarkerGraphic[state && chart.isInsidePlot(plotX, plotY, chart.inverted) ? 'show' : 'hide'](); // #2450\n stateMarkerGraphic.element.point = point; // #4310\n }\n }\n\n // Show me your halo\n haloOptions = stateOptions[state] && stateOptions[state].halo;\n if (haloOptions && haloOptions.size) {\n if (!halo) {\n series.halo = halo = chart.renderer.path()\n .add(chart.seriesGroup);\n }\n halo.attr(extend({\n 'fill': point.color || series.color,\n 'fill-opacity': haloOptions.opacity,\n 'zIndex': -1 // #4929, IE8 added halo above everything\n },\n haloOptions.attributes))[move ? 'animate' : 'attr']({\n d: point.haloPath(haloOptions.size)\n });\n } else if (halo) {\n halo.attr({ d: [] });\n }\n\n point.state = state;\n },\n\n /**\n * Get the circular path definition for the halo\n * @param {Number} size The radius of the circular halo\n * @returns {Array} The path definition\n */\n haloPath: function (size) {\n var series = this.series,\n chart = series.chart,\n plotBox = series.getPlotBox(),\n inverted = chart.inverted,\n plotX = Math.floor(this.plotX);\n\n return chart.renderer.symbols.circle(\n plotBox.translateX + (inverted ? series.yAxis.len - this.plotY : plotX) - size, \n plotBox.translateY + (inverted ? series.xAxis.len - plotX : this.plotY) - size, \n size * 2, \n size * 2\n );\n }\n });\n\n /*\n * Extend the Series object with interaction\n */\n\n extend(Series.prototype, {\n /**\n * Series mouse over handler\n */\n onMouseOver: function () {\n var series = this,\n chart = series.chart,\n hoverSeries = chart.hoverSeries;\n\n // set normal state to previous series\n if (hoverSeries && hoverSeries !== series) {\n hoverSeries.onMouseOut();\n }\n\n // trigger the event, but to save processing time,\n // only if defined\n if (series.options.events.mouseOver) {\n fireEvent(series, 'mouseOver');\n }\n\n // hover this\n series.setState(HOVER_STATE);\n chart.hoverSeries = series;\n },\n\n /**\n * Series mouse out handler\n */\n onMouseOut: function () {\n // trigger the event only if listeners exist\n var series = this,\n options = series.options,\n chart = series.chart,\n tooltip = chart.tooltip,\n hoverPoint = chart.hoverPoint;\n\n chart.hoverSeries = null; // #182, set to null before the mouseOut event fires\n\n // trigger mouse out on the point, which must be in this series\n if (hoverPoint) {\n hoverPoint.onMouseOut();\n }\n\n // fire the mouse out event\n if (series && options.events.mouseOut) {\n fireEvent(series, 'mouseOut');\n }\n\n\n // hide the tooltip\n if (tooltip && !options.stickyTracking && (!tooltip.shared || series.noSharedTooltip)) {\n tooltip.hide();\n }\n\n // set normal state\n series.setState();\n },\n\n /**\n * Set the state of the graph\n */\n setState: function (state) {\n var series = this,\n options = series.options,\n graph = series.graph,\n stateOptions = options.states,\n lineWidth = options.lineWidth,\n attribs,\n i = 0;\n\n state = state || NORMAL_STATE;\n\n if (series.state !== state) {\n series.state = state;\n\n if (stateOptions[state] && stateOptions[state].enabled === false) {\n return;\n }\n\n if (state) {\n lineWidth = stateOptions[state].lineWidth || lineWidth + (stateOptions[state].lineWidthPlus || 0); // #4035\n }\n\n if (graph && !graph.dashstyle) { // hover is turned off for dashed lines in VML\n attribs = {\n 'stroke-width': lineWidth\n };\n // use attr because animate will cause any other animation on the graph to stop\n graph.attr(attribs);\n while (series['zoneGraph' + i]) {\n series['zoneGraph' + i].attr(attribs);\n i = i + 1;\n }\n }\n }\n },\n\n /**\n * Set the visibility of the graph\n *\n * @param vis {Boolean} True to show the series, false to hide. If UNDEFINED,\n * the visibility is toggled.\n */\n setVisible: function (vis, redraw) {\n var series = this,\n chart = series.chart,\n legendItem = series.legendItem,\n showOrHide,\n ignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries,\n oldVisibility = series.visible;\n\n // if called without an argument, toggle visibility\n series.visible = vis = series.userOptions.visible = vis === UNDEFINED ? !oldVisibility : vis;\n showOrHide = vis ? 'show' : 'hide';\n\n // show or hide elements\n each(['group', 'dataLabelsGroup', 'markerGroup', 'tracker'], function (key) {\n if (series[key]) {\n series[key][showOrHide]();\n }\n });\n\n\n // hide tooltip (#1361)\n if (chart.hoverSeries === series || (chart.hoverPoint && chart.hoverPoint.series) === series) {\n series.onMouseOut();\n }\n\n\n if (legendItem) {\n chart.legend.colorizeItem(series, vis);\n }\n\n\n // rescale or adapt to resized chart\n series.isDirty = true;\n // in a stack, all other series are affected\n if (series.options.stacking) {\n each(chart.series, function (otherSeries) {\n if (otherSeries.options.stacking && otherSeries.visible) {\n otherSeries.isDirty = true;\n }\n });\n }\n\n // show or hide linked series\n each(series.linkedSeries, function (otherSeries) {\n otherSeries.setVisible(vis, false);\n });\n\n if (ignoreHiddenSeries) {\n chart.isDirtyBox = true;\n }\n if (redraw !== false) {\n chart.redraw();\n }\n\n fireEvent(series, showOrHide);\n },\n\n /**\n * Show the graph\n */\n show: function () {\n this.setVisible(true);\n },\n\n /**\n * Hide the graph\n */\n hide: function () {\n this.setVisible(false);\n },\n\n\n /**\n * Set the selected state of the graph\n *\n * @param selected {Boolean} True to select the series, false to unselect. If\n * UNDEFINED, the selection state is toggled.\n */\n select: function (selected) {\n var series = this;\n // if called without an argument, toggle\n series.selected = selected = (selected === UNDEFINED) ? !series.selected : selected;\n\n if (series.checkbox) {\n series.checkbox.checked = selected;\n }\n\n fireEvent(series, selected ? 'select' : 'unselect');\n },\n\n drawTracker: TrackerMixin.drawTrackerGraph\n });\n /* ****************************************************************************\n * Start ordinal axis logic *\n *****************************************************************************/\n\n\n wrap(Series.prototype, 'init', function (proceed) {\n var series = this,\n xAxis;\n\n // call the original function\n proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n\n xAxis = series.xAxis;\n\n // Destroy the extended ordinal index on updated data\n if (xAxis && xAxis.options.ordinal) {\n addEvent(series, 'updatedData', function () {\n delete xAxis.ordinalIndex;\n });\n }\n });\n\n /**\n * In an ordinal axis, there might be areas with dense consentrations of points, then large\n * gaps between some. Creating equally distributed ticks over this entire range\n * may lead to a huge number of ticks that will later be removed. So instead, break the\n * positions up in segments, find the tick positions for each segment then concatenize them.\n * This method is used from both data grouping logic and X axis tick position logic.\n */\n wrap(Axis.prototype, 'getTimeTicks', function (proceed, normalizedInterval, min, max, startOfWeek, positions, closestDistance, findHigherRanks) {\n\n var start = 0,\n end,\n segmentPositions,\n higherRanks = {},\n hasCrossedHigherRank,\n info,\n posLength,\n outsideMax,\n groupPositions = [],\n lastGroupPosition = -Number.MAX_VALUE,\n tickPixelIntervalOption = this.options.tickPixelInterval;\n\n // The positions are not always defined, for example for ordinal positions when data\n // has regular interval (#1557, #2090)\n if ((!this.options.ordinal && !this.options.breaks) || !positions || positions.length < 3 || min === UNDEFINED) {\n return proceed.call(this, normalizedInterval, min, max, startOfWeek);\n }\n\n // Analyze the positions array to split it into segments on gaps larger than 5 times\n // the closest distance. The closest distance is already found at this point, so\n // we reuse that instead of computing it again.\n posLength = positions.length;\n\n for (end = 0; end < posLength; end++) {\n\n outsideMax = end && positions[end - 1] > max;\n\n if (positions[end] < min) { // Set the last position before min\n start = end;\n }\n\n if (end === posLength - 1 || positions[end + 1] - positions[end] > closestDistance * 5 || outsideMax) {\n\n // For each segment, calculate the tick positions from the getTimeTicks utility\n // function. The interval will be the same regardless of how long the segment is.\n if (positions[end] > lastGroupPosition) { // #1475\n\n segmentPositions = proceed.call(this, normalizedInterval, positions[start], positions[end], startOfWeek);\n\n // Prevent duplicate groups, for example for multiple segments within one larger time frame (#1475)\n while (segmentPositions.length && segmentPositions[0] <= lastGroupPosition) {\n segmentPositions.shift();\n }\n if (segmentPositions.length) {\n lastGroupPosition = segmentPositions[segmentPositions.length - 1];\n }\n\n groupPositions = groupPositions.concat(segmentPositions);\n }\n // Set start of next segment\n start = end + 1;\n }\n\n if (outsideMax) {\n break;\n }\n }\n\n // Get the grouping info from the last of the segments. The info is the same for\n // all segments.\n info = segmentPositions.info;\n\n // Optionally identify ticks with higher rank, for example when the ticks\n // have crossed midnight.\n if (findHigherRanks && info.unitRange <= timeUnits.hour) {\n end = groupPositions.length - 1;\n\n // Compare points two by two\n for (start = 1; start < end; start++) {\n if (dateFormat('%d', groupPositions[start]) !== dateFormat('%d', groupPositions[start - 1])) {\n higherRanks[groupPositions[start]] = 'day';\n hasCrossedHigherRank = true;\n }\n }\n\n // If the complete array has crossed midnight, we want to mark the first\n // positions also as higher rank\n if (hasCrossedHigherRank) {\n higherRanks[groupPositions[0]] = 'day';\n }\n info.higherRanks = higherRanks;\n }\n\n // Save the info\n groupPositions.info = info;\n\n\n\n // Don't show ticks within a gap in the ordinal axis, where the space between\n // two points is greater than a portion of the tick pixel interval\n if (findHigherRanks && defined(tickPixelIntervalOption)) { // check for squashed ticks\n\n var length = groupPositions.length,\n i = length,\n itemToRemove,\n translated,\n translatedArr = [],\n lastTranslated,\n medianDistance,\n distance,\n distances = [];\n\n // Find median pixel distance in order to keep a reasonably even distance between\n // ticks (#748)\n while (i--) {\n translated = this.translate(groupPositions[i]);\n if (lastTranslated) {\n distances[i] = lastTranslated - translated;\n }\n translatedArr[i] = lastTranslated = translated;\n }\n distances.sort();\n medianDistance = distances[mathFloor(distances.length / 2)];\n if (medianDistance < tickPixelIntervalOption * 0.6) {\n medianDistance = null;\n }\n\n // Now loop over again and remove ticks where needed\n i = groupPositions[length - 1] > max ? length - 1 : length; // #817\n lastTranslated = undefined;\n while (i--) {\n translated = translatedArr[i];\n distance = lastTranslated - translated;\n\n // Remove ticks that are closer than 0.6 times the pixel interval from the one to the right,\n // but not if it is close to the median distance (#748).\n if (lastTranslated && distance < tickPixelIntervalOption * 0.8 &&\n (medianDistance === null || distance < medianDistance * 0.8)) {\n\n // Is this a higher ranked position with a normal position to the right?\n if (higherRanks[groupPositions[i]] && !higherRanks[groupPositions[i + 1]]) {\n\n // Yes: remove the lower ranked neighbour to the right\n itemToRemove = i + 1;\n lastTranslated = translated; // #709\n\n } else {\n\n // No: remove this one\n itemToRemove = i;\n }\n\n groupPositions.splice(itemToRemove, 1);\n\n } else {\n lastTranslated = translated;\n }\n }\n }\n return groupPositions;\n });\n\n // Extend the Axis prototype\n extend(Axis.prototype, {\n\n /**\n * Calculate the ordinal positions before tick positions are calculated.\n */\n beforeSetTickPositions: function () {\n var axis = this,\n len,\n ordinalPositions = [],\n useOrdinal = false,\n dist,\n extremes = axis.getExtremes(),\n min = extremes.min,\n max = extremes.max,\n minIndex,\n maxIndex,\n slope,\n hasBreaks = axis.isXAxis && !!axis.options.breaks,\n isOrdinal = axis.options.ordinal,\n i;\n\n // apply the ordinal logic\n if (isOrdinal || hasBreaks) { // #4167 YAxis is never ordinal ?\n\n each(axis.series, function (series, i) {\n\n if (series.visible !== false && (series.takeOrdinalPosition !== false || hasBreaks)) {\n\n // concatenate the processed X data into the existing positions, or the empty array\n ordinalPositions = ordinalPositions.concat(series.processedXData);\n len = ordinalPositions.length;\n\n // remove duplicates (#1588)\n ordinalPositions.sort(function (a, b) {\n return a - b; // without a custom function it is sorted as strings\n });\n\n if (len) {\n i = len - 1;\n while (i--) {\n if (ordinalPositions[i] === ordinalPositions[i + 1]) {\n ordinalPositions.splice(i, 1);\n }\n }\n }\n }\n\n });\n\n // cache the length\n len = ordinalPositions.length;\n\n // Check if we really need the overhead of mapping axis data against the ordinal positions.\n // If the series consist of evenly spaced data any way, we don't need any ordinal logic.\n if (len > 2) { // two points have equal distance by default\n dist = ordinalPositions[1] - ordinalPositions[0];\n i = len - 1;\n while (i-- && !useOrdinal) {\n if (ordinalPositions[i + 1] - ordinalPositions[i] !== dist) {\n useOrdinal = true;\n }\n }\n\n // When zooming in on a week, prevent axis padding for weekends even though the data within\n // the week is evenly spaced.\n if (!axis.options.keepOrdinalPadding && (ordinalPositions[0] - min > dist || max - ordinalPositions[ordinalPositions.length - 1] > dist)) {\n useOrdinal = true;\n }\n }\n\n // Record the slope and offset to compute the linear values from the array index.\n // Since the ordinal positions may exceed the current range, get the start and\n // end positions within it (#719, #665b)\n if (useOrdinal) {\n\n // Register\n axis.ordinalPositions = ordinalPositions;\n\n // This relies on the ordinalPositions being set. Use mathMax and mathMin to prevent\n // padding on either sides of the data.\n minIndex = axis.val2lin(mathMax(min, ordinalPositions[0]), true);\n maxIndex = mathMax(axis.val2lin(mathMin(max, ordinalPositions[ordinalPositions.length - 1]), true), 1); // #3339\n\n // Set the slope and offset of the values compared to the indices in the ordinal positions\n axis.ordinalSlope = slope = (max - min) / (maxIndex - minIndex);\n axis.ordinalOffset = min - (minIndex * slope);\n\n } else {\n axis.ordinalPositions = axis.ordinalSlope = axis.ordinalOffset = UNDEFINED;\n }\n }\n axis.isOrdinal = isOrdinal && useOrdinal; // #3818, #4196, #4926\n axis.groupIntervalFactor = null; // reset for next run\n },\n /**\n * Translate from a linear axis value to the corresponding ordinal axis position. If there\n * are no gaps in the ordinal axis this will be the same. The translated value is the value\n * that the point would have if the axis were linear, using the same min and max.\n *\n * @param Number val The axis value\n * @param Boolean toIndex Whether to return the index in the ordinalPositions or the new value\n */\n val2lin: function (val, toIndex) {\n var axis = this,\n ordinalPositions = axis.ordinalPositions,\n ret;\n\n if (!ordinalPositions) {\n ret = val;\n\n } else {\n\n var ordinalLength = ordinalPositions.length,\n i,\n distance,\n ordinalIndex;\n\n // first look for an exact match in the ordinalpositions array\n i = ordinalLength;\n while (i--) {\n if (ordinalPositions[i] === val) {\n ordinalIndex = i;\n break;\n }\n }\n\n // if that failed, find the intermediate position between the two nearest values\n i = ordinalLength - 1;\n while (i--) {\n if (val > ordinalPositions[i] || i === 0) { // interpolate\n distance = (val - ordinalPositions[i]) / (ordinalPositions[i + 1] - ordinalPositions[i]); // something between 0 and 1\n ordinalIndex = i + distance;\n break;\n }\n }\n ret = toIndex ?\n ordinalIndex :\n axis.ordinalSlope * (ordinalIndex || 0) + axis.ordinalOffset;\n }\n return ret;\n },\n /**\n * Translate from linear (internal) to axis value\n *\n * @param Number val The linear abstracted value\n * @param Boolean fromIndex Translate from an index in the ordinal positions rather than a value\n */\n lin2val: function (val, fromIndex) {\n var axis = this,\n ordinalPositions = axis.ordinalPositions,\n ret;\n\n if (!ordinalPositions) { // the visible range contains only equally spaced values\n ret = val;\n\n } else {\n\n var ordinalSlope = axis.ordinalSlope,\n ordinalOffset = axis.ordinalOffset,\n i = ordinalPositions.length - 1,\n linearEquivalentLeft,\n linearEquivalentRight,\n distance;\n\n\n // Handle the case where we translate from the index directly, used only\n // when panning an ordinal axis\n if (fromIndex) {\n\n if (val < 0) { // out of range, in effect panning to the left\n val = ordinalPositions[0];\n } else if (val > i) { // out of range, panning to the right\n val = ordinalPositions[i];\n } else { // split it up\n i = mathFloor(val);\n distance = val - i; // the decimal\n }\n\n // Loop down along the ordinal positions. When the linear equivalent of i matches\n // an ordinal position, interpolate between the left and right values.\n } else {\n while (i--) {\n linearEquivalentLeft = (ordinalSlope * i) + ordinalOffset;\n if (val >= linearEquivalentLeft) {\n linearEquivalentRight = (ordinalSlope * (i + 1)) + ordinalOffset;\n distance = (val - linearEquivalentLeft) / (linearEquivalentRight - linearEquivalentLeft); // something between 0 and 1\n break;\n }\n }\n }\n\n // If the index is within the range of the ordinal positions, return the associated\n // or interpolated value. If not, just return the value\n ret = distance !== UNDEFINED && ordinalPositions[i] !== UNDEFINED ?\n ordinalPositions[i] + (distance ? distance * (ordinalPositions[i + 1] - ordinalPositions[i]) : 0) :\n val;\n }\n return ret;\n },\n /**\n * Get the ordinal positions for the entire data set. This is necessary in chart panning\n * because we need to find out what points or data groups are available outside the\n * visible range. When a panning operation starts, if an index for the given grouping\n * does not exists, it is created and cached. This index is deleted on updated data, so\n * it will be regenerated the next time a panning operation starts.\n */\n getExtendedPositions: function () {\n var axis = this,\n chart = axis.chart,\n grouping = axis.series[0].currentDataGrouping,\n ordinalIndex = axis.ordinalIndex,\n key = grouping ? grouping.count + grouping.unitName : 'raw',\n extremes = axis.getExtremes(),\n fakeAxis,\n fakeSeries;\n\n // If this is the first time, or the ordinal index is deleted by updatedData,\n // create it.\n if (!ordinalIndex) {\n ordinalIndex = axis.ordinalIndex = {};\n }\n\n\n if (!ordinalIndex[key]) {\n\n // Create a fake axis object where the extended ordinal positions are emulated\n fakeAxis = {\n series: [],\n getExtremes: function () {\n return {\n min: extremes.dataMin,\n max: extremes.dataMax\n };\n },\n options: {\n ordinal: true\n },\n val2lin: Axis.prototype.val2lin // #2590\n };\n\n // Add the fake series to hold the full data, then apply processData to it\n each(axis.series, function (series) {\n fakeSeries = {\n xAxis: fakeAxis,\n xData: series.xData,\n chart: chart,\n destroyGroupedData: noop\n };\n fakeSeries.options = {\n dataGrouping: grouping ? {\n enabled: true,\n forced: true,\n approximation: 'open', // doesn't matter which, use the fastest\n units: [[grouping.unitName, [grouping.count]]]\n } : {\n enabled: false\n }\n };\n series.processData.apply(fakeSeries);\n\n fakeAxis.series.push(fakeSeries);\n });\n\n // Run beforeSetTickPositions to compute the ordinalPositions\n axis.beforeSetTickPositions.apply(fakeAxis);\n\n // Cache it\n ordinalIndex[key] = fakeAxis.ordinalPositions;\n }\n return ordinalIndex[key];\n },\n\n /**\n * Find the factor to estimate how wide the plot area would have been if ordinal\n * gaps were included. This value is used to compute an imagined plot width in order\n * to establish the data grouping interval.\n *\n * A real world case is the intraday-candlestick\n * example. Without this logic, it would show the correct data grouping when viewing\n * a range within each day, but once moving the range to include the gap between two\n * days, the interval would include the cut-away night hours and the data grouping\n * would be wrong. So the below method tries to compensate by identifying the most\n * common point interval, in this case days.\n *\n * An opposite case is presented in issue #718. We have a long array of daily data,\n * then one point is appended one hour after the last point. We expect the data grouping\n * not to change.\n *\n * In the future, if we find cases where this estimation doesn't work optimally, we\n * might need to add a second pass to the data grouping logic, where we do another run\n * with a greater interval if the number of data groups is more than a certain fraction\n * of the desired group count.\n */\n getGroupIntervalFactor: function (xMin, xMax, series) {\n var i,\n processedXData = series.processedXData,\n len = processedXData.length,\n distances = [],\n median,\n groupIntervalFactor = this.groupIntervalFactor;\n\n // Only do this computation for the first series, let the other inherit it (#2416)\n if (!groupIntervalFactor) {\n\n // Register all the distances in an array\n for (i = 0; i < len - 1; i++) {\n distances[i] = processedXData[i + 1] - processedXData[i];\n }\n\n // Sort them and find the median\n distances.sort(function (a, b) {\n return a - b;\n });\n median = distances[mathFloor(len / 2)];\n\n // Compensate for series that don't extend through the entire axis extent. #1675.\n xMin = mathMax(xMin, processedXData[0]);\n xMax = mathMin(xMax, processedXData[len - 1]);\n\n this.groupIntervalFactor = groupIntervalFactor = (len * median) / (xMax - xMin);\n }\n\n // Return the factor needed for data grouping\n return groupIntervalFactor;\n },\n\n /**\n * Make the tick intervals closer because the ordinal gaps make the ticks spread out or cluster\n */\n postProcessTickInterval: function (tickInterval) {\n // Problem: http://jsfiddle.net/highcharts/FQm4E/1/\n // This is a case where this algorithm doesn't work optimally. In this case, the\n // tick labels are spread out per week, but all the gaps reside within weeks. So\n // we have a situation where the labels are courser than the ordinal gaps, and\n // thus the tick interval should not be altered\n var ordinalSlope = this.ordinalSlope,\n ret;\n\n\n if (ordinalSlope) {\n if (!this.options.breaks) {\n ret = tickInterval / (ordinalSlope / this.closestPointRange);\n } else {\n ret = this.closestPointRange;\n }\n } else {\n ret = tickInterval;\n }\n return ret;\n }\n });\n\n // Extending the Chart.pan method for ordinal axes\n wrap(Chart.prototype, 'pan', function (proceed, e) {\n var chart = this,\n xAxis = chart.xAxis[0],\n chartX = e.chartX,\n runBase = false;\n\n if (xAxis.options.ordinal && xAxis.series.length) {\n\n var mouseDownX = chart.mouseDownX,\n extremes = xAxis.getExtremes(),\n dataMax = extremes.dataMax,\n min = extremes.min,\n max = extremes.max,\n trimmedRange,\n hoverPoints = chart.hoverPoints,\n closestPointRange = xAxis.closestPointRange,\n pointPixelWidth = xAxis.translationSlope * (xAxis.ordinalSlope || closestPointRange),\n movedUnits = (mouseDownX - chartX) / pointPixelWidth, // how many ordinal units did we move?\n extendedAxis = { ordinalPositions: xAxis.getExtendedPositions() }, // get index of all the chart's points\n ordinalPositions,\n searchAxisLeft,\n lin2val = xAxis.lin2val,\n val2lin = xAxis.val2lin,\n searchAxisRight;\n\n if (!extendedAxis.ordinalPositions) { // we have an ordinal axis, but the data is equally spaced\n runBase = true;\n\n } else if (mathAbs(movedUnits) > 1) {\n\n // Remove active points for shared tooltip\n if (hoverPoints) {\n each(hoverPoints, function (point) {\n point.setState();\n });\n }\n\n if (movedUnits < 0) {\n searchAxisLeft = extendedAxis;\n searchAxisRight = xAxis.ordinalPositions ? xAxis : extendedAxis;\n } else {\n searchAxisLeft = xAxis.ordinalPositions ? xAxis : extendedAxis;\n searchAxisRight = extendedAxis;\n }\n\n // In grouped data series, the last ordinal position represents the grouped data, which is\n // to the left of the real data max. If we don't compensate for this, we will be allowed\n // to pan grouped data series passed the right of the plot area.\n ordinalPositions = searchAxisRight.ordinalPositions;\n if (dataMax > ordinalPositions[ordinalPositions.length - 1]) {\n ordinalPositions.push(dataMax);\n }\n\n // Get the new min and max values by getting the ordinal index for the current extreme,\n // then add the moved units and translate back to values. This happens on the\n // extended ordinal positions if the new position is out of range, else it happens\n // on the current x axis which is smaller and faster.\n chart.fixedRange = max - min;\n trimmedRange = xAxis.toFixedRange(null, null,\n lin2val.apply(searchAxisLeft, [\n val2lin.apply(searchAxisLeft, [min, true]) + movedUnits, // the new index\n true // translate from index\n ]),\n lin2val.apply(searchAxisRight, [\n val2lin.apply(searchAxisRight, [max, true]) + movedUnits, // the new index\n true // translate from index\n ])\n );\n\n // Apply it if it is within the available data range\n if (trimmedRange.min >= mathMin(extremes.dataMin, min) && trimmedRange.max <= mathMax(dataMax, max)) {\n xAxis.setExtremes(trimmedRange.min, trimmedRange.max, true, false, { trigger: 'pan' });\n }\n\n chart.mouseDownX = chartX; // set new reference for next run\n css(chart.container, { cursor: 'move' });\n }\n\n } else {\n runBase = true;\n }\n\n // revert to the linear chart.pan version\n if (runBase) {\n // call the original function\n proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n }\n });\n\n\n\n /**\n * Extend getGraphPath by identifying gaps in the ordinal data so that we can draw a gap in the\n * line or area\n */\n Series.prototype.gappedPath = function () {\n var gapSize = this.options.gapSize,\n points = this.points.slice(),\n i = points.length - 1;\n\n if (gapSize && i > 0) { // #5008\n\n // extension for ordinal breaks\n while (i--) {\n if (points[i + 1].x - points[i].x > this.closestPointRange * gapSize) {\n points.splice( // insert after this one\n i + 1,\n 0,\n { isNull: true }\n );\n }\n }\n }\n\n // Call base method\n //return proceed.call(this, points, a, b);\n return this.getGraphPath(points);\n };\n\n /* ****************************************************************************\n * End ordinal axis logic *\n *****************************************************************************/\n /**\n * Highstock JS v4.2.6 (2016-08-02)\n * Highcharts Broken Axis module\n * \n * License: www.highcharts.com/license\n */\n\n (function (factory) {\n \n factory(Highcharts);\n \n }(function (H) {\n\n 'use strict';\n\n var pick = H.pick,\n wrap = H.wrap,\n each = H.each,\n extend = H.extend,\n fireEvent = H.fireEvent,\n Axis = H.Axis,\n Series = H.Series;\n\n function stripArguments() {\n return Array.prototype.slice.call(arguments, 1);\n }\n\n extend(Axis.prototype, {\n isInBreak: function (brk, val) {\n var ret,\n repeat = brk.repeat || Infinity,\n from = brk.from,\n length = brk.to - brk.from,\n test = (val >= from ? (val - from) % repeat : repeat - ((from - val) % repeat));\n\n if (!brk.inclusive) {\n ret = test < length && test !== 0;\n } else {\n ret = test <= length;\n }\n return ret;\n },\n\n isInAnyBreak: function (val, testKeep) {\n\n var breaks = this.options.breaks,\n i = breaks && breaks.length,\n inbrk,\n keep,\n ret;\n\n \n if (i) { \n\n while (i--) {\n if (this.isInBreak(breaks[i], val)) {\n inbrk = true;\n if (!keep) {\n keep = pick(breaks[i].showPoints, this.isXAxis ? false : true);\n }\n }\n }\n\n if (inbrk && testKeep) {\n ret = inbrk && !keep;\n } else {\n ret = inbrk;\n }\n }\n return ret;\n }\n });\n\n wrap(Axis.prototype, 'setTickPositions', function (proceed) {\n proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n \n if (this.options.breaks) {\n var axis = this,\n tickPositions = this.tickPositions,\n info = this.tickPositions.info,\n newPositions = [],\n i;\n\n for (i = 0; i < tickPositions.length; i++) {\n if (!axis.isInAnyBreak(tickPositions[i])) {\n newPositions.push(tickPositions[i]);\n }\n }\n\n this.tickPositions = newPositions;\n this.tickPositions.info = info;\n }\n });\n \n wrap(Axis.prototype, 'init', function (proceed, chart, userOptions) {\n // Force Axis to be not-ordinal when breaks are defined\n if (userOptions.breaks && userOptions.breaks.length) {\n userOptions.ordinal = false;\n }\n\n proceed.call(this, chart, userOptions);\n\n if (this.options.breaks) {\n\n var axis = this;\n \n axis.isBroken = true;\n\n this.val2lin = function (val) {\n var nval = val,\n brk,\n i;\n\n for (i = 0; i < axis.breakArray.length; i++) {\n brk = axis.breakArray[i];\n if (brk.to <= val) {\n nval -= brk.len;\n } else if (brk.from >= val) {\n break;\n } else if (axis.isInBreak(brk, val)) {\n nval -= (val - brk.from);\n break;\n }\n }\n\n return nval;\n };\n \n this.lin2val = function (val) {\n var nval = val,\n brk,\n i;\n\n for (i = 0; i < axis.breakArray.length; i++) {\n brk = axis.breakArray[i];\n if (brk.from >= nval) {\n break;\n } else if (brk.to < nval) {\n nval += brk.len;\n } else if (axis.isInBreak(brk, nval)) {\n nval += brk.len;\n }\n }\n return nval;\n };\n\n this.setExtremes = function (newMin, newMax, redraw, animation, eventArguments) {\n // If trying to set extremes inside a break, extend it to before and after the break ( #3857 )\n while (this.isInAnyBreak(newMin)) {\n newMin -= this.closestPointRange;\n } \n while (this.isInAnyBreak(newMax)) {\n newMax -= this.closestPointRange;\n }\n Axis.prototype.setExtremes.call(this, newMin, newMax, redraw, animation, eventArguments);\n };\n\n this.setAxisTranslation = function (saveOld) {\n Axis.prototype.setAxisTranslation.call(this, saveOld);\n\n var breaks = axis.options.breaks,\n breakArrayT = [], // Temporary one\n breakArray = [],\n length = 0, \n inBrk,\n repeat,\n brk,\n min = axis.userMin || axis.min,\n max = axis.userMax || axis.max,\n start,\n i,\n j;\n\n // Min & max check (#4247)\n for (i in breaks) {\n brk = breaks[i];\n repeat = brk.repeat || Infinity;\n if (axis.isInBreak(brk, min)) {\n min += (brk.to % repeat) - (min % repeat);\n }\n if (axis.isInBreak(brk, max)) {\n max -= (max % repeat) - (brk.from % repeat);\n }\n }\n\n // Construct an array holding all breaks in the axis\n for (i in breaks) {\n brk = breaks[i];\n start = brk.from;\n repeat = brk.repeat || Infinity;\n\n while (start - repeat > min) {\n start -= repeat;\n }\n while (start < min) {\n start += repeat;\n }\n\n for (j = start; j < max; j += repeat) {\n breakArrayT.push({\n value: j,\n move: 'in'\n });\n breakArrayT.push({\n value: j + (brk.to - brk.from),\n move: 'out',\n size: brk.breakSize\n });\n }\n }\n\n breakArrayT.sort(function (a, b) {\n var ret;\n if (a.value === b.value) {\n ret = (a.move === 'in' ? 0 : 1) - (b.move === 'in' ? 0 : 1);\n } else {\n ret = a.value - b.value;\n }\n return ret;\n });\n \n // Simplify the breaks\n inBrk = 0;\n start = min;\n\n for (i in breakArrayT) {\n brk = breakArrayT[i];\n inBrk += (brk.move === 'in' ? 1 : -1);\n\n if (inBrk === 1 && brk.move === 'in') {\n start = brk.value;\n }\n if (inBrk === 0) {\n breakArray.push({\n from: start,\n to: brk.value,\n len: brk.value - start - (brk.size || 0)\n });\n length += brk.value - start - (brk.size || 0);\n }\n }\n\n axis.breakArray = breakArray;\n\n fireEvent(axis, 'afterBreaks');\n \n axis.transA *= ((max - axis.min) / (max - min - length));\n\n axis.min = min;\n axis.max = max;\n };\n }\n });\n\n wrap(Series.prototype, 'generatePoints', function (proceed) {\n\n proceed.apply(this, stripArguments(arguments));\n\n var series = this,\n xAxis = series.xAxis,\n yAxis = series.yAxis,\n points = series.points,\n point,\n i = points.length,\n connectNulls = series.options.connectNulls,\n nullGap;\n\n\n if (xAxis && yAxis && (xAxis.options.breaks || yAxis.options.breaks)) {\n while (i--) {\n point = points[i];\n\n nullGap = point.y === null && connectNulls === false; // respect nulls inside the break (#4275)\n if (!nullGap && (xAxis.isInAnyBreak(point.x, true) || yAxis.isInAnyBreak(point.y, true))) {\n points.splice(i, 1);\n if (this.data[i]) {\n this.data[i].destroyElements(); // removes the graphics for this point if they exist\n }\n }\n }\n }\n\n });\n\n function drawPointsWrapped(proceed) {\n proceed.apply(this);\n this.drawBreaks(this.xAxis, ['x']);\n this.drawBreaks(this.yAxis, pick(this.pointArrayMap, ['y']));\n }\n\n H.Series.prototype.drawBreaks = function (axis, keys) {\n var series = this,\n points = series.points,\n breaks,\n threshold,\n eventName,\n y;\n\n each(keys, function (key) {\n breaks = axis.breakArray || [];\n threshold = axis.isXAxis ? axis.min : pick(series.options.threshold, axis.min);\n each(points, function (point) {\n y = pick(point['stack' + key.toUpperCase()], point[key]);\n each(breaks, function (brk) {\n eventName = false;\n\n if ((threshold < brk.from && y > brk.to) || (threshold > brk.from && y < brk.from)) { \n eventName = 'pointBreak';\n } else if ((threshold < brk.from && y > brk.from && y < brk.to) || (threshold > brk.from && y > brk.to && y < brk.from)) { // point falls inside the break\n eventName = 'pointInBreak';\n } \n if (eventName) {\n fireEvent(axis, eventName, { point: point, brk: brk });\n }\n });\n });\n });\n };\n\n wrap(H.seriesTypes.column.prototype, 'drawPoints', drawPointsWrapped);\n wrap(H.Series.prototype, 'drawPoints', drawPointsWrapped);\n\n }));\n /* ****************************************************************************\n * Start data grouping module *\n ******************************************************************************/\n var DATA_GROUPING = 'dataGrouping',\n seriesProto = Series.prototype,\n baseProcessData = seriesProto.processData,\n baseGeneratePoints = seriesProto.generatePoints,\n baseDestroy = seriesProto.destroy,\n\n commonOptions = {\n approximation: 'average', // average, open, high, low, close, sum\n //enabled: null, // (true for stock charts, false for basic),\n //forced: undefined,\n groupPixelWidth: 2,\n // the first one is the point or start value, the second is the start value if we're dealing with range,\n // the third one is the end value if dealing with a range\n dateTimeLabelFormats: {\n millisecond: ['%A, %b %e, %H:%M:%S.%L', '%A, %b %e, %H:%M:%S.%L', '-%H:%M:%S.%L'],\n second: ['%A, %b %e, %H:%M:%S', '%A, %b %e, %H:%M:%S', '-%H:%M:%S'],\n minute: ['%A, %b %e, %H:%M', '%A, %b %e, %H:%M', '-%H:%M'],\n hour: ['%A, %b %e, %H:%M', '%A, %b %e, %H:%M', '-%H:%M'],\n day: ['%A, %b %e, %Y', '%A, %b %e', '-%A, %b %e, %Y'],\n week: ['Week from %A, %b %e, %Y', '%A, %b %e', '-%A, %b %e, %Y'],\n month: ['%B %Y', '%B', '-%B %Y'],\n year: ['%Y', '%Y', '-%Y']\n }\n // smoothed = false, // enable this for navigator series only\n },\n\n specificOptions = { // extends common options\n line: {},\n spline: {},\n area: {},\n areaspline: {},\n column: {\n approximation: 'sum',\n groupPixelWidth: 10\n },\n arearange: {\n approximation: 'range'\n },\n areasplinerange: {\n approximation: 'range'\n },\n columnrange: {\n approximation: 'range',\n groupPixelWidth: 10\n },\n candlestick: {\n approximation: 'ohlc',\n groupPixelWidth: 10\n },\n ohlc: {\n approximation: 'ohlc',\n groupPixelWidth: 5\n }\n },\n\n // units are defined in a separate array to allow complete overriding in case of a user option\n defaultDataGroupingUnits = [\n [\n 'millisecond', // unit name\n [1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples\n ], [\n 'second',\n [1, 2, 5, 10, 15, 30]\n ], [\n 'minute',\n [1, 2, 5, 10, 15, 30]\n ], [\n 'hour',\n [1, 2, 3, 4, 6, 8, 12]\n ], [\n 'day',\n [1]\n ], [\n 'week',\n [1]\n ], [\n 'month',\n [1, 3, 6]\n ], [\n 'year',\n null\n ]\n ],\n\n\n /**\n * Define the available approximation types. The data grouping approximations takes an array\n * or numbers as the first parameter. In case of ohlc, four arrays are sent in as four parameters.\n * Each array consists only of numbers. In case null values belong to the group, the property\n * .hasNulls will be set to true on the array.\n */\n approximations = {\n sum: function (arr) {\n var len = arr.length,\n ret;\n\n // 1. it consists of nulls exclusively\n if (!len && arr.hasNulls) {\n ret = null;\n // 2. it has a length and real values\n } else if (len) {\n ret = 0;\n while (len--) {\n ret += arr[len];\n }\n }\n // 3. it has zero length, so just return undefined\n // => doNothing()\n\n return ret;\n },\n average: function (arr) {\n var len = arr.length,\n ret = approximations.sum(arr);\n\n // If we have a number, return it divided by the length. If not, return\n // null or undefined based on what the sum method finds.\n if (isNumber(ret) && len) {\n ret = ret / len;\n }\n\n return ret;\n },\n open: function (arr) {\n return arr.length ? arr[0] : (arr.hasNulls ? null : UNDEFINED);\n },\n high: function (arr) {\n return arr.length ? arrayMax(arr) : (arr.hasNulls ? null : UNDEFINED);\n },\n low: function (arr) {\n return arr.length ? arrayMin(arr) : (arr.hasNulls ? null : UNDEFINED);\n },\n close: function (arr) {\n return arr.length ? arr[arr.length - 1] : (arr.hasNulls ? null : UNDEFINED);\n },\n // ohlc and range are special cases where a multidimensional array is input and an array is output\n ohlc: function (open, high, low, close) {\n open = approximations.open(open);\n high = approximations.high(high);\n low = approximations.low(low);\n close = approximations.close(close);\n\n if (isNumber(open) || isNumber(high) || isNumber(low) || isNumber(close)) {\n return [open, high, low, close];\n }\n // else, return is undefined\n },\n range: function (low, high) {\n low = approximations.low(low);\n high = approximations.high(high);\n\n if (isNumber(low) || isNumber(high)) {\n return [low, high];\n }\n // else, return is undefined\n }\n };\n\n\n /**\n * Takes parallel arrays of x and y data and groups the data into intervals defined by groupPositions, a collection\n * of starting x values for each group.\n */\n seriesProto.groupData = function (xData, yData, groupPositions, approximation) {\n var series = this,\n data = series.data,\n dataOptions = series.options.data,\n groupedXData = [],\n groupedYData = [],\n groupMap = [],\n dataLength = xData.length,\n pointX,\n pointY,\n groupedY,\n handleYData = !!yData, // when grouping the fake extended axis for panning, we don't need to consider y\n values = [[], [], [], []],\n approximationFn = typeof approximation === 'function' ? approximation : approximations[approximation],\n pointArrayMap = series.pointArrayMap,\n pointArrayMapLength = pointArrayMap && pointArrayMap.length,\n i,\n pos = 0,\n start = 0;\n\n // Start with the first point within the X axis range (#2696)\n for (i = 0; i <= dataLength; i++) {\n if (xData[i] >= groupPositions[0]) {\n break;\n }\n }\n\n for (i; i <= dataLength; i++) {\n\n // when a new group is entered, summarize and initiate the previous group\n while ((groupPositions[pos + 1] !== undefined && xData[i] >= groupPositions[pos + 1]) ||\n i === dataLength) { // get the last group\n\n // get group x and y\n pointX = groupPositions[pos];\n groupedY = approximationFn.apply(0, values);\n\n // push the grouped data\n if (groupedY !== UNDEFINED) {\n groupedXData.push(pointX);\n groupedYData.push(groupedY);\n groupMap.push({ start: start, length: values[0].length });\n }\n\n // reset the aggregate arrays\n start = i;\n values[0] = [];\n values[1] = [];\n values[2] = [];\n values[3] = [];\n\n // Advance on the group positions\n pos += 1;\n\n // don't loop beyond the last group\n if (i === dataLength) {\n break;\n }\n }\n\n // break out\n if (i === dataLength) {\n break;\n }\n\n // for each raw data point, push it to an array that contains all values for this specific group\n if (pointArrayMap) {\n\n var index = series.cropStart + i,\n point = (data && data[index]) || series.pointClass.prototype.applyOptions.apply({ series: series }, [dataOptions[index]]),\n j,\n val;\n\n for (j = 0; j < pointArrayMapLength; j++) {\n val = point[pointArrayMap[j]];\n if (isNumber(val)) {\n values[j].push(val);\n } else if (val === null) {\n values[j].hasNulls = true;\n }\n }\n\n } else {\n pointY = handleYData ? yData[i] : null;\n\n if (isNumber(pointY)) {\n values[0].push(pointY);\n } else if (pointY === null) {\n values[0].hasNulls = true;\n }\n }\n }\n\n return [groupedXData, groupedYData, groupMap];\n };\n\n /**\n * Extend the basic processData method, that crops the data to the current zoom\n * range, with data grouping logic.\n */\n seriesProto.processData = function () {\n var series = this,\n chart = series.chart,\n options = series.options,\n dataGroupingOptions = options[DATA_GROUPING],\n groupingEnabled = series.allowDG !== false && dataGroupingOptions && pick(dataGroupingOptions.enabled, chart.options._stock),\n hasGroupedData,\n skip;\n\n // run base method\n series.forceCrop = groupingEnabled; // #334\n series.groupPixelWidth = null; // #2110\n series.hasProcessed = true; // #2692\n\n // skip if processData returns false or if grouping is disabled (in that order)\n skip = baseProcessData.apply(series, arguments) === false || !groupingEnabled;\n if (!skip) {\n series.destroyGroupedData();\n\n var i,\n processedXData = series.processedXData,\n processedYData = series.processedYData,\n plotSizeX = chart.plotSizeX,\n xAxis = series.xAxis,\n ordinal = xAxis.options.ordinal,\n groupPixelWidth = series.groupPixelWidth = xAxis.getGroupPixelWidth && xAxis.getGroupPixelWidth();\n\n // Execute grouping if the amount of points is greater than the limit defined in groupPixelWidth\n if (groupPixelWidth) {\n hasGroupedData = true;\n\n series.points = null; // force recreation of point instances in series.translate\n\n var extremes = xAxis.getExtremes(),\n xMin = extremes.min,\n xMax = extremes.max,\n groupIntervalFactor = (ordinal && xAxis.getGroupIntervalFactor(xMin, xMax, series)) || 1,\n interval = (groupPixelWidth * (xMax - xMin) / plotSizeX) * groupIntervalFactor,\n groupPositions = xAxis.getTimeTicks(\n xAxis.normalizeTimeTickInterval(interval, dataGroupingOptions.units || defaultDataGroupingUnits),\n Math.min(xMin, processedXData[0]), // Processed data may extend beyond axis (#4907)\n Math.max(xMax, processedXData[processedXData.length - 1]),\n xAxis.options.startOfWeek,\n processedXData,\n series.closestPointRange\n ),\n groupedData = seriesProto.groupData.apply(series, [processedXData, processedYData, groupPositions, dataGroupingOptions.approximation]),\n groupedXData = groupedData[0],\n groupedYData = groupedData[1];\n\n // prevent the smoothed data to spill out left and right, and make\n // sure data is not shifted to the left\n if (dataGroupingOptions.smoothed) {\n i = groupedXData.length - 1;\n groupedXData[i] = Math.min(groupedXData[i], xMax);\n while (i-- && i > 0) {\n groupedXData[i] += interval / 2;\n }\n groupedXData[0] = Math.max(groupedXData[0], xMin);\n }\n\n // record what data grouping values were used\n series.currentDataGrouping = groupPositions.info;\n series.closestPointRange = groupPositions.info.totalRange;\n series.groupMap = groupedData[2];\n\n // Make sure the X axis extends to show the first group (#2533)\n if (defined(groupedXData[0]) && groupedXData[0] < xAxis.dataMin) {\n if (xAxis.min === xAxis.dataMin) {\n xAxis.min = groupedXData[0];\n }\n xAxis.dataMin = groupedXData[0];\n }\n\n // set series props\n series.processedXData = groupedXData;\n series.processedYData = groupedYData;\n } else {\n series.currentDataGrouping = series.groupMap = null;\n }\n series.hasGroupedData = hasGroupedData;\n }\n };\n\n /**\n * Destroy the grouped data points. #622, #740\n */\n seriesProto.destroyGroupedData = function () {\n\n var groupedData = this.groupedData;\n\n // clear previous groups\n each(groupedData || [], function (point, i) {\n if (point) {\n groupedData[i] = point.destroy ? point.destroy() : null;\n }\n });\n this.groupedData = null;\n };\n\n /**\n * Override the generatePoints method by adding a reference to grouped data\n */\n seriesProto.generatePoints = function () {\n\n baseGeneratePoints.apply(this);\n\n // record grouped data in order to let it be destroyed the next time processData runs\n this.destroyGroupedData(); // #622\n this.groupedData = this.hasGroupedData ? this.points : null;\n };\n\n /**\n * Extend the original method, make the tooltip's header reflect the grouped range\n */\n wrap(Tooltip.prototype, 'tooltipFooterHeaderFormatter', function (proceed, labelConfig, isFooter) {\n var tooltip = this,\n series = labelConfig.series,\n options = series.options,\n tooltipOptions = series.tooltipOptions,\n dataGroupingOptions = options.dataGrouping,\n xDateFormat = tooltipOptions.xDateFormat,\n xDateFormatEnd,\n xAxis = series.xAxis,\n currentDataGrouping,\n dateTimeLabelFormats,\n labelFormats,\n formattedKey;\n\n // apply only to grouped series\n if (xAxis && xAxis.options.type === 'datetime' && dataGroupingOptions && isNumber(labelConfig.key)) {\n\n // set variables\n currentDataGrouping = series.currentDataGrouping;\n dateTimeLabelFormats = dataGroupingOptions.dateTimeLabelFormats;\n\n // if we have grouped data, use the grouping information to get the right format\n if (currentDataGrouping) {\n labelFormats = dateTimeLabelFormats[currentDataGrouping.unitName];\n if (currentDataGrouping.count === 1) {\n xDateFormat = labelFormats[0];\n } else {\n xDateFormat = labelFormats[1];\n xDateFormatEnd = labelFormats[2];\n }\n // if not grouped, and we don't have set the xDateFormat option, get the best fit,\n // so if the least distance between points is one minute, show it, but if the\n // least distance is one day, skip hours and minutes etc.\n } else if (!xDateFormat && dateTimeLabelFormats) {\n xDateFormat = tooltip.getXDateFormat(labelConfig, tooltipOptions, xAxis);\n }\n\n // now format the key\n formattedKey = dateFormat(xDateFormat, labelConfig.key);\n if (xDateFormatEnd) {\n formattedKey += dateFormat(xDateFormatEnd, labelConfig.key + currentDataGrouping.totalRange - 1);\n }\n\n // return the replaced format\n return format(tooltipOptions[(isFooter ? 'footer' : 'header') + 'Format'], {\n point: extend(labelConfig.point, { key: formattedKey }),\n series: series\n });\n \n }\n\n // else, fall back to the regular formatter\n return proceed.call(tooltip, labelConfig, isFooter);\n });\n\n /**\n * Extend the series destroyer\n */\n seriesProto.destroy = function () {\n var series = this,\n groupedData = series.groupedData || [],\n i = groupedData.length;\n\n while (i--) {\n if (groupedData[i]) {\n groupedData[i].destroy();\n }\n }\n baseDestroy.apply(series);\n };\n\n\n // Handle default options for data grouping. This must be set at runtime because some series types are\n // defined after this.\n wrap(seriesProto, 'setOptions', function (proceed, itemOptions) {\n\n var options = proceed.call(this, itemOptions),\n type = this.type,\n plotOptions = this.chart.options.plotOptions,\n defaultOptions = defaultPlotOptions[type].dataGrouping;\n\n if (specificOptions[type]) { // #1284\n if (!defaultOptions) {\n defaultOptions = merge(commonOptions, specificOptions[type]);\n }\n\n options.dataGrouping = merge(\n defaultOptions,\n plotOptions.series && plotOptions.series.dataGrouping, // #1228\n plotOptions[type].dataGrouping, // Set by the StockChart constructor\n itemOptions.dataGrouping\n );\n }\n\n if (this.chart.options._stock) {\n this.requireSorting = true;\n }\n\n return options;\n });\n\n\n /**\n * When resetting the scale reset the hasProccessed flag to avoid taking previous data grouping\n * of neighbour series into accound when determining group pixel width (#2692).\n */\n wrap(Axis.prototype, 'setScale', function (proceed) {\n proceed.call(this);\n each(this.series, function (series) {\n series.hasProcessed = false;\n });\n });\n\n /**\n * Get the data grouping pixel width based on the greatest defined individual width\n * of the axis' series, and if whether one of the axes need grouping.\n */\n Axis.prototype.getGroupPixelWidth = function () {\n\n var series = this.series,\n len = series.length,\n i,\n groupPixelWidth = 0,\n doGrouping = false,\n dataLength,\n dgOptions;\n\n // If multiple series are compared on the same x axis, give them the same\n // group pixel width (#334)\n i = len;\n while (i--) {\n dgOptions = series[i].options.dataGrouping;\n if (dgOptions) {\n groupPixelWidth = mathMax(groupPixelWidth, dgOptions.groupPixelWidth);\n\n }\n }\n\n // If one of the series needs grouping, apply it to all (#1634)\n i = len;\n while (i--) {\n dgOptions = series[i].options.dataGrouping;\n\n if (dgOptions && series[i].hasProcessed) { // #2692\n\n dataLength = (series[i].processedXData || series[i].data).length;\n\n // Execute grouping if the amount of points is greater than the limit defined in groupPixelWidth\n if (series[i].groupPixelWidth || dataLength > (this.chart.plotSizeX / groupPixelWidth) || (dataLength && dgOptions.forced)) {\n doGrouping = true;\n }\n }\n }\n\n return doGrouping ? groupPixelWidth : 0;\n };\n\n /**\n * Force data grouping on all the axis' series.\n */\n Axis.prototype.setDataGrouping = function (dataGrouping, redraw) {\n var i;\n\n redraw = pick(redraw, true);\n\n if (!dataGrouping) {\n dataGrouping = {\n forced: false,\n units: null\n };\n }\n\n // Axis is instantiated, update all series\n if (this instanceof Axis) {\n i = this.series.length;\n while (i--) {\n this.series[i].update({\n dataGrouping: dataGrouping\n }, false);\n }\n\n // Axis not yet instanciated, alter series options\n } else {\n each(this.chart.options.series, function (seriesOptions) {\n seriesOptions.dataGrouping = dataGrouping;\n }, false);\n }\n\n if (redraw) {\n this.chart.redraw();\n }\n };\n\n\n\n /* ****************************************************************************\n * End data grouping module *\n ******************************************************************************/\n /* ****************************************************************************\n * Start OHLC series code *\n *****************************************************************************/\n\n // 1 - Set default options\n defaultPlotOptions.ohlc = merge(defaultPlotOptions.column, {\n lineWidth: 1,\n tooltip: {\n pointFormat: '\\u25CF {series.name} ' +\n 'Open: {point.open} ' +\n 'High: {point.high} ' +\n 'Low: {point.low} ' +\n 'Close: {point.close} '\n },\n states: {\n hover: {\n lineWidth: 3\n }\n },\n threshold: null\n //upColor: undefined\n });\n\n // 2 - Create the OHLCSeries object\n var OHLCSeries = extendClass(seriesTypes.column, {\n type: 'ohlc',\n pointArrayMap: ['open', 'high', 'low', 'close'], // array point configs are mapped to this\n toYData: function (point) { // return a plain array for speedy calculation\n return [point.open, point.high, point.low, point.close];\n },\n pointValKey: 'high',\n\n pointAttrToOptions: { // mapping between SVG attributes and the corresponding options\n stroke: 'color',\n 'stroke-width': 'lineWidth'\n },\n upColorProp: 'stroke',\n\n /**\n * Postprocess mapping between options and SVG attributes\n */\n getAttribs: function () {\n seriesTypes.column.prototype.getAttribs.apply(this, arguments);\n var series = this,\n options = series.options,\n stateOptions = options.states,\n upColor = options.upColor || series.color,\n seriesDownPointAttr = merge(series.pointAttr),\n upColorProp = series.upColorProp;\n\n seriesDownPointAttr[''][upColorProp] = upColor;\n seriesDownPointAttr.hover[upColorProp] = stateOptions.hover.upColor || upColor;\n seriesDownPointAttr.select[upColorProp] = stateOptions.select.upColor || upColor;\n\n each(series.points, function (point) {\n if (point.open < point.close && !point.options.color) {\n point.pointAttr = seriesDownPointAttr;\n }\n });\n },\n\n /**\n * Translate data points from raw values x and y to plotX and plotY\n */\n translate: function () {\n var series = this,\n yAxis = series.yAxis;\n\n seriesTypes.column.prototype.translate.apply(series);\n\n // do the translation\n each(series.points, function (point) {\n // the graphics\n if (point.open !== null) {\n point.plotOpen = yAxis.translate(point.open, 0, 1, 0, 1);\n }\n if (point.close !== null) {\n point.plotClose = yAxis.translate(point.close, 0, 1, 0, 1);\n }\n\n });\n },\n\n /**\n * Draw the data points\n */\n drawPoints: function () {\n var series = this,\n points = series.points,\n chart = series.chart,\n pointAttr,\n plotOpen,\n plotClose,\n crispCorr,\n halfWidth,\n path,\n graphic,\n crispX;\n\n\n each(points, function (point) {\n if (point.plotY !== UNDEFINED) {\n\n graphic = point.graphic;\n pointAttr = point.pointAttr[point.selected ? 'selected' : ''] || series.pointAttr[NORMAL_STATE];\n\n // crisp vector coordinates\n crispCorr = (pointAttr['stroke-width'] % 2) / 2;\n crispX = mathRound(point.plotX) - crispCorr; // #2596\n halfWidth = mathRound(point.shapeArgs.width / 2);\n\n // the vertical stem\n path = [\n 'M',\n crispX, mathRound(point.yBottom),\n 'L',\n crispX, mathRound(point.plotY)\n ];\n\n // open\n if (point.open !== null) {\n plotOpen = mathRound(point.plotOpen) + crispCorr;\n path.push(\n 'M',\n crispX,\n plotOpen,\n 'L',\n crispX - halfWidth,\n plotOpen\n );\n }\n\n // close\n if (point.close !== null) {\n plotClose = mathRound(point.plotClose) + crispCorr;\n path.push(\n 'M',\n crispX,\n plotClose,\n 'L',\n crispX + halfWidth,\n plotClose\n );\n }\n\n // create and/or update the graphic\n if (graphic) {\n graphic\n .attr(pointAttr) // #3897\n .animate({ d: path });\n } else {\n point.graphic = chart.renderer.path(path)\n .attr(pointAttr)\n .add(series.group);\n }\n\n }\n\n\n });\n\n },\n\n /**\n * Disable animation\n */\n animate: null\n\n\n });\n seriesTypes.ohlc = OHLCSeries;\n /* ****************************************************************************\n * End OHLC series code *\n *****************************************************************************/\n /* ****************************************************************************\n * Start Candlestick series code *\n *****************************************************************************/\n\n // 1 - set default options\n defaultPlotOptions.candlestick = merge(defaultPlotOptions.column, {\n lineColor: 'black',\n lineWidth: 1,\n states: {\n hover: {\n lineWidth: 2\n }\n },\n tooltip: defaultPlotOptions.ohlc.tooltip,\n threshold: null,\n upColor: 'white'\n // upLineColor: null\n });\n\n // 2 - Create the CandlestickSeries object\n var CandlestickSeries = extendClass(OHLCSeries, {\n type: 'candlestick',\n\n /**\n * One-to-one mapping from options to SVG attributes\n */\n pointAttrToOptions: { // mapping between SVG attributes and the corresponding options\n fill: 'color',\n stroke: 'lineColor',\n 'stroke-width': 'lineWidth'\n },\n upColorProp: 'fill',\n\n /**\n * Postprocess mapping between options and SVG attributes\n */\n getAttribs: function () {\n seriesTypes.ohlc.prototype.getAttribs.apply(this, arguments);\n var series = this,\n options = series.options,\n stateOptions = options.states,\n upLineColor = options.upLineColor || options.lineColor,\n hoverStroke = stateOptions.hover.upLineColor || upLineColor,\n selectStroke = stateOptions.select.upLineColor || upLineColor;\n\n // Add custom line color for points going up (close > open).\n // Fill is handled by OHLCSeries' getAttribs.\n each(series.points, function (point) {\n if (point.open < point.close) {\n\n // If an individual line color is set, we need to merge the\n // point attributes, because they are shared between all up\n // points by inheritance from OHCLSeries.\n if (point.lineColor) {\n point.pointAttr = merge(point.pointAttr);\n upLineColor = point.lineColor;\n }\n\n point.pointAttr[''].stroke = upLineColor;\n point.pointAttr.hover.stroke = hoverStroke;\n point.pointAttr.select.stroke = selectStroke;\n }\n });\n },\n\n /**\n * Draw the data points\n */\n drawPoints: function () {\n var series = this, //state = series.state,\n points = series.points,\n chart = series.chart,\n pointAttr,\n seriesPointAttr = series.pointAttr[''],\n plotOpen,\n plotClose,\n topBox,\n bottomBox,\n hasTopWhisker,\n hasBottomWhisker,\n crispCorr,\n crispX,\n graphic,\n path,\n halfWidth;\n\n\n each(points, function (point) {\n\n graphic = point.graphic;\n if (point.plotY !== UNDEFINED) {\n\n pointAttr = point.pointAttr[point.selected ? 'selected' : ''] || seriesPointAttr;\n\n // crisp vector coordinates\n crispCorr = (pointAttr['stroke-width'] % 2) / 2;\n crispX = mathRound(point.plotX) - crispCorr; // #2596\n plotOpen = point.plotOpen;\n plotClose = point.plotClose;\n topBox = math.min(plotOpen, plotClose);\n bottomBox = math.max(plotOpen, plotClose);\n halfWidth = mathRound(point.shapeArgs.width / 2);\n hasTopWhisker = mathRound(topBox) !== mathRound(point.plotY);\n hasBottomWhisker = bottomBox !== point.yBottom;\n topBox = mathRound(topBox) + crispCorr;\n bottomBox = mathRound(bottomBox) + crispCorr;\n\n // Create the path. Due to a bug in Chrome 49, the path is first instanciated\n // with no values, then the values pushed. For unknown reasons, instanciated\n // the path array with all the values would lead to a crash when updating\n // frequently (#5193).\n path = [];\n path.push(\n 'M',\n crispX - halfWidth, bottomBox,\n 'L',\n crispX - halfWidth, topBox,\n 'L',\n crispX + halfWidth, topBox,\n 'L',\n crispX + halfWidth, bottomBox,\n 'Z', // Use a close statement to ensure a nice rectangle #2602\n 'M',\n crispX, topBox,\n 'L',\n crispX, hasTopWhisker ? mathRound(point.plotY) : topBox, // #460, #2094\n 'M',\n crispX, bottomBox,\n 'L',\n crispX, hasBottomWhisker ? mathRound(point.yBottom) : bottomBox // #460, #2094\n );\n\n if (graphic) {\n graphic\n .attr(pointAttr) // #3897\n .animate({ d: path });\n } else {\n point.graphic = chart.renderer.path(path)\n .attr(pointAttr)\n .add(series.group)\n .shadow(series.options.shadow);\n }\n\n }\n });\n\n }\n\n\n });\n\n seriesTypes.candlestick = CandlestickSeries;\n\n /* ****************************************************************************\n * End Candlestick series code *\n *****************************************************************************/\n /* ****************************************************************************\n * Start Flags series code *\n *****************************************************************************/\n\n var symbols = SVGRenderer.prototype.symbols;\n\n // 1 - set default options\n defaultPlotOptions.flags = merge(defaultPlotOptions.column, {\n fillColor: 'white',\n lineWidth: 1,\n pointRange: 0, // #673\n //radius: 2,\n shape: 'flag',\n stackDistance: 12,\n states: {\n hover: {\n lineColor: 'black',\n fillColor: '#FCFFC5'\n }\n },\n style: {\n fontSize: '11px',\n fontWeight: 'bold',\n textAlign: 'center'\n },\n tooltip: {\n pointFormat: '{point.text} '\n },\n threshold: null,\n y: -30\n });\n\n // 2 - Create the CandlestickSeries object\n seriesTypes.flags = extendClass(seriesTypes.column, {\n type: 'flags',\n sorted: false,\n noSharedTooltip: true,\n allowDG: false,\n takeOrdinalPosition: false, // #1074\n trackerGroups: ['markerGroup'],\n forceCrop: true,\n /**\n * Inherit the initialization from base Series\n */\n init: Series.prototype.init,\n\n /**\n * One-to-one mapping from options to SVG attributes\n */\n pointAttrToOptions: { // mapping between SVG attributes and the corresponding options\n fill: 'fillColor',\n stroke: 'color',\n 'stroke-width': 'lineWidth',\n r: 'radius'\n },\n\n /**\n * Extend the translate method by placing the point on the related series\n */\n translate: function () {\n\n seriesTypes.column.prototype.translate.apply(this);\n\n var series = this,\n options = series.options,\n chart = series.chart,\n points = series.points,\n cursor = points.length - 1,\n point,\n lastPoint,\n optionsOnSeries = options.onSeries,\n onSeries = optionsOnSeries && chart.get(optionsOnSeries),\n onKey = options.onKey || 'y',\n step = onSeries && onSeries.options.step,\n onData = onSeries && onSeries.points,\n i = onData && onData.length,\n xAxis = series.xAxis,\n xAxisExt = xAxis.getExtremes(),\n leftPoint,\n lastX,\n rightPoint,\n currentDataGrouping;\n\n // relate to a master series\n if (onSeries && onSeries.visible && i) {\n currentDataGrouping = onSeries.currentDataGrouping;\n lastX = onData[i - 1].x + (currentDataGrouping ? currentDataGrouping.totalRange : 0); // #2374\n\n // sort the data points\n points.sort(function (a, b) {\n return (a.x - b.x);\n });\n\n onKey = 'plot' + onKey[0].toUpperCase() + onKey.substr(1);\n while (i-- && points[cursor]) {\n point = points[cursor];\n leftPoint = onData[i];\n if (leftPoint.x <= point.x && leftPoint[onKey] !== undefined) {\n if (point.x <= lastX) { // #803\n\n point.plotY = leftPoint[onKey];\n\n // interpolate between points, #666\n if (leftPoint.x < point.x && !step) {\n rightPoint = onData[i + 1];\n if (rightPoint && rightPoint[onKey] !== UNDEFINED) {\n point.plotY +=\n ((point.x - leftPoint.x) / (rightPoint.x - leftPoint.x)) * // the distance ratio, between 0 and 1\n (rightPoint[onKey] - leftPoint[onKey]); // the y distance\n }\n }\n }\n cursor--;\n i++; // check again for points in the same x position\n if (cursor < 0) {\n break;\n }\n }\n }\n }\n\n // Add plotY position and handle stacking\n each(points, function (point, i) {\n\n var stackIndex;\n\n // Undefined plotY means the point is either on axis, outside series range or hidden series.\n // If the series is outside the range of the x axis it should fall through with\n // an undefined plotY, but then we must remove the shapeArgs (#847).\n if (point.plotY === UNDEFINED) {\n if (point.x >= xAxisExt.min && point.x <= xAxisExt.max) { // we're inside xAxis range\n point.plotY = chart.chartHeight - xAxis.bottom - (xAxis.opposite ? xAxis.height : 0) + xAxis.offset - chart.plotTop;\n } else {\n point.shapeArgs = {}; // 847\n }\n }\n // if multiple flags appear at the same x, order them into a stack\n lastPoint = points[i - 1];\n if (lastPoint && lastPoint.plotX === point.plotX) {\n if (lastPoint.stackIndex === UNDEFINED) {\n lastPoint.stackIndex = 0;\n }\n stackIndex = lastPoint.stackIndex + 1;\n }\n point.stackIndex = stackIndex; // #3639\n });\n\n\n },\n\n /**\n * Draw the markers\n */\n drawPoints: function () {\n var series = this,\n pointAttr,\n seriesPointAttr = series.pointAttr[''],\n points = series.points,\n chart = series.chart,\n renderer = chart.renderer,\n plotX,\n plotY,\n options = series.options,\n optionsY = options.y,\n shape,\n i,\n point,\n graphic,\n stackIndex,\n anchorX,\n anchorY,\n outsideRight,\n yAxis = series.yAxis,\n text;\n\n i = points.length;\n while (i--) {\n point = points[i];\n outsideRight = point.plotX > series.xAxis.len;\n plotX = point.plotX;\n if (plotX > 0) { // #3119\n plotX -= pick(point.lineWidth, options.lineWidth) % 2; // #4285\n }\n stackIndex = point.stackIndex;\n shape = point.options.shape || options.shape;\n plotY = point.plotY;\n if (plotY !== UNDEFINED) {\n plotY = point.plotY + optionsY - (stackIndex !== UNDEFINED && stackIndex * options.stackDistance);\n }\n anchorX = stackIndex ? UNDEFINED : point.plotX; // skip connectors for higher level stacked points\n anchorY = stackIndex ? UNDEFINED : point.plotY;\n\n graphic = point.graphic;\n\n \n // only draw the point if y is defined and the flag is within the visible area\n if (plotY !== UNDEFINED && plotX >= 0 && !outsideRight) {\n // shortcuts\n pointAttr = point.pointAttr[point.selected ? 'select' : ''] || seriesPointAttr;\n text = pick(point.options.title, options.title, 'A');\n if (graphic) { // update\n graphic.attr({\n text: text // first apply text, so text will be centered later\n }).attr({\n x: plotX,\n y: plotY,\n r: pointAttr.r,\n anchorX: anchorX,\n anchorY: anchorY\n });\n } else {\n graphic = point.graphic = renderer.label(\n text, \n plotX,\n plotY,\n shape,\n anchorX,\n anchorY,\n options.useHTML\n )\n .css(merge(options.style, point.style))\n .attr(pointAttr)\n .attr({\n align: shape === 'flag' ? 'left' : 'center',\n width: options.width,\n height: options.height\n })\n .add(series.markerGroup)\n .shadow(options.shadow);\n\n }\n\n // Set the tooltip anchor position\n point.tooltipPos = chart.inverted ? [yAxis.len + yAxis.pos - chart.plotLeft - plotY, series.xAxis.len - plotX] : [plotX, plotY];\n\n } else if (graphic) {\n point.graphic = graphic.destroy();\n }\n\n }\n\n },\n\n /**\n * Extend the column trackers with listeners to expand and contract stacks\n */\n drawTracker: function () {\n var series = this,\n points = series.points;\n\n TrackerMixin.drawTrackerPoint.apply(this);\n\n // Bring each stacked flag up on mouse over, this allows readability of vertically\n // stacked elements as well as tight points on the x axis. #1924.\n each(points, function (point) {\n var graphic = point.graphic;\n if (graphic) {\n addEvent(graphic.element, 'mouseover', function () {\n\n // Raise this point\n if (point.stackIndex > 0 && !point.raised) {\n point._y = graphic.y;\n graphic.attr({\n y: point._y - 8\n });\n point.raised = true;\n }\n\n // Revert other raised points\n each(points, function (otherPoint) {\n if (otherPoint !== point && otherPoint.raised && otherPoint.graphic) {\n otherPoint.graphic.attr({\n y: otherPoint._y\n });\n otherPoint.raised = false;\n }\n });\n });\n }\n });\n },\n\n /**\n * Disable animation\n */\n animate: noop,\n buildKDTree: noop,\n setClip: noop\n\n });\n\n // create the flag icon with anchor\n symbols.flag = function (x, y, w, h, options) {\n var anchorX = (options && options.anchorX) || x,\n anchorY = (options && options.anchorY) || y;\n\n return [\n 'M', anchorX, anchorY,\n 'L', x, y + h,\n x, y,\n x + w, y,\n x + w, y + h,\n x, y + h,\n 'Z'\n ];\n };\n\n // create the circlepin and squarepin icons with anchor\n each(['circle', 'square'], function (shape) {\n symbols[shape + 'pin'] = function (x, y, w, h, options) {\n\n var anchorX = options && options.anchorX,\n anchorY = options && options.anchorY,\n path,\n labelTopOrBottomY;\n\n // For single-letter flags, make sure circular flags are not taller than their width\n if (shape === 'circle' && h > w) {\n x -= mathRound((h - w) / 2);\n w = h;\n }\n\n path = symbols[shape](x, y, w, h);\n\n if (anchorX && anchorY) {\n // if the label is below the anchor, draw the connecting line from the top edge of the label\n // otherwise start drawing from the bottom edge\n labelTopOrBottomY = (y > anchorY) ? y : y + h;\n path.push('M', anchorX, labelTopOrBottomY, 'L', anchorX, anchorY);\n }\n\n return path;\n };\n });\n\n // The symbol callbacks are generated on the SVGRenderer object in all browsers. Even\n // VML browsers need this in order to generate shapes in export. Now share\n // them with the VMLRenderer.\n if (Renderer === Highcharts.VMLRenderer) {\n each(['flag', 'circlepin', 'squarepin'], function (shape) {\n VMLRenderer.prototype.symbols[shape] = symbols[shape];\n });\n }\n\n /* ****************************************************************************\n * End Flags series code *\n *****************************************************************************/\n\n var defaultScrollbarOptions = {\n //enabled: true\n height: isTouchDevice ? 20 : 14,\n barBackgroundColor: '#bfc8d1',\n barBorderRadius: 0,\n barBorderWidth: 1,\n barBorderColor: '#bfc8d1',\n buttonArrowColor: '#666',\n buttonBackgroundColor: '#ebe7e8',\n buttonBorderColor: '#bbb',\n buttonBorderRadius: 0,\n buttonBorderWidth: 1,\n //showFull: true,\n margin: 10,\n minWidth: 6,\n rifleColor: '#666',\n zIndex: 3,\n step: 0.2,\n //size: null,\n trackBackgroundColor: '#eeeeee',\n trackBorderColor: '#eeeeee',\n trackBorderWidth: 1,\n // trackBorderRadius: 0\n liveRedraw: hasSVG && !isTouchDevice\n };\n\n defaultOptions.scrollbar = merge(true, defaultScrollbarOptions, defaultOptions.scrollbar);\n\n /**\n * The Scrollbar class \n * @param {Object} renderer\n * @param {Object} options\n * @param {Object} chart\n */\n function Scrollbar(renderer, options, chart) {\n this.scrollbarButtons = [];\n\n this.renderer = renderer;\n\n this.userOptions = options;\n this.options = merge(defaultScrollbarOptions, options);\n\n this.chart = chart;\n\n this.size = pick(this.options.size, this.options.height); // backward compatibility\n\n // Init\n this.render();\n this.initEvents();\n this.addEvents();\n }\n\n Scrollbar.prototype = {\n /**\n * Render scrollbar with all required items.\n */\n render: function () {\n var scroller = this,\n renderer = scroller.renderer,\n options = scroller.options,\n strokeWidth = options.trackBorderWidth,\n scrollbarStrokeWidth = options.barBorderWidth,\n size = scroller.size,\n group;\n\n // Draw the scrollbar group:\n scroller.group = group = renderer.g(PREFIX + 'scrollbar').attr({\n zIndex: options.zIndex,\n translateY: -99999\n }).add();\n\n // Draw the scrollbar track:\n scroller.track = renderer.rect().attr({\n height: size,\n width: size,\n y: -strokeWidth % 2 / 2,\n x: -strokeWidth % 2 / 2,\n 'stroke-width': strokeWidth,\n fill: options.trackBackgroundColor,\n stroke: options.trackBorderColor,\n r: options.trackBorderRadius || 0\n }).add(group);\n\n // Draw the scrollbar itself:\n scroller.scrollbarGroup = renderer.g().add(group);\n\n scroller.scrollbar = renderer.rect().attr({\n height: size,\n width: size,\n y: -scrollbarStrokeWidth % 2 / 2,\n x: -scrollbarStrokeWidth % 2 / 2,\n 'stroke-width': scrollbarStrokeWidth,\n fill: options.barBackgroundColor,\n stroke: options.barBorderColor,\n r: options.barBorderRadius || 0\n }).add(scroller.scrollbarGroup);\n\n // Draw the scrollbat rifles:\n scroller.scrollbarRifles = renderer.path(scroller.swapXY([\n M,\n -3, size / 4,\n L,\n -3, 2 * size / 3,\n M,\n 0, size / 4,\n L,\n 0, 2 * size / 3,\n M,\n 3, size / 4,\n L,\n 3, 2 * size / 3\n ], options.vertical)).attr({\n stroke: options.rifleColor,\n 'stroke-width': 1\n }).add(scroller.scrollbarGroup);\n\n // Draw the buttons:\n scroller.drawScrollbarButton(0);\n scroller.drawScrollbarButton(1);\n },\n\n /**\n * Position the scrollbar, method called from a parent with defined dimensions\n * @param {Number} x - x-position on the chart\n * @param {Number} y - y-position on the chart\n * @param {Number} width - width of the scrollbar\n * @param {Number} height - height of the scorllbar\n */\n position: function (x, y, width, height) {\n var scroller = this,\n options = scroller.options,\n vertical = options.vertical,\n xOffset = height,\n yOffset = 0,\n method = scroller.rendered ? 'animate' : 'attr';\n\n scroller.x = x;\n scroller.y = y + options.trackBorderWidth;\n scroller.width = width; // width with buttons\n scroller.height = height;\n scroller.xOffset = xOffset;\n scroller.yOffset = yOffset;\n\n // If Scrollbar is a vertical type, swap options:\n if (vertical) {\n scroller.width = scroller.yOffset = width = yOffset = scroller.size;\n scroller.xOffset = xOffset = 0;\n scroller.barWidth = height - width * 2; // width without buttons\n scroller.x = x = x + scroller.options.margin;\n } else {\n scroller.height = scroller.xOffset = height = xOffset = scroller.size;\n scroller.barWidth = width - height * 2; // width without buttons\n scroller.y = scroller.y + scroller.options.margin;\n }\n\n // Set general position for a group:\n scroller.group[method]({\n translateX: x,\n translateY: scroller.y\n });\n\n // Resize background/track:\n scroller.track[method]({\n width: width,\n height: height\n });\n\n // Move right/bottom button ot it's place:\n scroller.scrollbarButtons[1].attr({\n translateX: vertical ? 0 : width - xOffset,\n translateY: vertical ? height - yOffset : 0\n });\n },\n\n /**\n * Draw the scrollbar buttons with arrows\n * @param {Number} index 0 is left, 1 is right\n */\n drawScrollbarButton: function (index) {\n var scroller = this,\n renderer = scroller.renderer,\n scrollbarButtons = scroller.scrollbarButtons,\n options = scroller.options,\n size = scroller.size,\n group;\n\n group = renderer.g().add(scroller.group);\n scrollbarButtons.push(group);\n\n // Button rect:\n renderer.rect(\n -0.5, \n -0.5, \n size + 1, // +1 to compensate for crispifying in rect method\n size + 1,\n options.buttonBorderRadius,\n options.buttonBorderWidth\n ).attr({\n stroke: options.buttonBorderColor,\n 'stroke-width': options.buttonBorderWidth,\n fill: options.buttonBackgroundColor\n }).add(group);\n\n // Button arrow:\n renderer.path(scroller.swapXY([\n 'M',\n size / 2 + (index ? -1 : 1), \n size / 2 - 3,\n 'L',\n size / 2 + (index ? -1 : 1), \n size / 2 + 3,\n 'L',\n size / 2 + (index ? 2 : -2), \n size / 2\n ], options.vertical)).attr({\n fill: options.buttonArrowColor\n }).add(group);\n },\n\n /**\n * When we have vertical scrollbar, rifles are rotated, the same for arrow in buttons:\n * @param {Array} path - path to be rotated\n * @param {Boolean} vertical - if vertical scrollbar, swap x-y values\n */\n swapXY: function (path, vertical) {\n var i,\n len = path.length,\n temp;\n\n if (vertical) {\n for (i = 0; i < len; i += 3) {\n temp = path[i + 1];\n path[i + 1] = path[i + 2];\n path[i + 2] = temp;\n }\n }\n\n return path;\n },\n\n /**\n * Set scrollbar size, with a given scale.\n * @param {Number} from - scale (0-1) where bar should start\n * @param {Number} to - scale (0-1) where bar should end\n */\n setRange: function (from, to) {\n var scroller = this,\n options = scroller.options,\n vertical = options.vertical,\n fromPX,\n toPX,\n newPos,\n newSize,\n newRiflesPos,\n method = this.rendered && !this.hasDragged ? 'animate' : 'attr';\n\n if (!defined(scroller.barWidth)) {\n return;\n }\n\n fromPX = scroller.barWidth * Math.max(from, 0);\n toPX = scroller.barWidth * Math.min(to, 1);\n newSize = Math.max(correctFloat(toPX - fromPX), options.minWidth);\n newPos = Math.floor(fromPX + scroller.xOffset + scroller.yOffset);\n newRiflesPos = newSize / 2 - 0.5; // -0.5 -> rifle line width / 2\n\n // Store current position:\n scroller.from = from;\n scroller.to = to;\n\n if (!vertical) {\n scroller.scrollbarGroup[method]({\n translateX: newPos\n });\n scroller.scrollbar[method]({\n width: newSize\n });\n scroller.scrollbarRifles[method]({\n translateX: newRiflesPos\n });\n scroller.scrollbarLeft = newPos;\n scroller.scrollbarTop = 0;\n } else {\n scroller.scrollbarGroup[method]({\n translateY: newPos\n });\n scroller.scrollbar[method]({\n height: newSize\n });\n scroller.scrollbarRifles[method]({\n translateY: newRiflesPos\n });\n scroller.scrollbarTop = newPos;\n scroller.scrollbarLeft = 0;\n }\n\n if (newSize <= 12) {\n scroller.scrollbarRifles.hide();\n } else {\n scroller.scrollbarRifles.show(true);\n }\n\n // Show or hide the scrollbar based on the showFull setting\n if (options.showFull === false) {\n if (from <= 0 && to >= 1) {\n scroller.group.hide();\n } else {\n scroller.group.show();\n }\n }\n\n scroller.rendered = true;\n },\n\n /**\n * Init events methods, so we have an access to the Scrollbar itself\n */\n initEvents: function () {\n var scroller = this;\n /**\n * Event handler for the mouse move event.\n */\n scroller.mouseMoveHandler = function (e) {\n var normalizedEvent = scroller.chart.pointer.normalize(e),\n options = scroller.options,\n direction = options.vertical ? 'chartY' : 'chartX',\n initPositions = scroller.initPositions,\n scrollPosition,\n chartPosition,\n change;\n\n // In iOS, a mousemove event with e.pageX === 0 is fired when holding the finger\n // down in the center of the scrollbar. This should be ignored.\n if (scroller.grabbedCenter && (!e.touches || e.touches[0][direction] !== 0)) { // #4696, scrollbar failed on Android\n\n chartPosition = {\n chartX: (normalizedEvent.chartX - scroller.x - scroller.xOffset) / scroller.barWidth,\n chartY: (normalizedEvent.chartY - scroller.y - scroller.yOffset) / scroller.barWidth\n }[direction];\n scrollPosition = scroller[direction];\n\n change = chartPosition - scrollPosition;\n\n scroller.hasDragged = true;\n scroller.updatePosition(initPositions[0] + change, initPositions[1] + change);\n\n if (scroller.hasDragged) {\n fireEvent(scroller, 'changed', {\n from: scroller.from,\n to: scroller.to,\n trigger: 'scrollbar',\n DOMType: e.type,\n DOMEvent: e\n });\n }\n }\n };\n\n /**\n * Event handler for the mouse up event.\n */\n scroller.mouseUpHandler = function (e) {\n if (scroller.hasDragged) {\n fireEvent(scroller, 'changed', {\n from: scroller.from,\n to: scroller.to,\n trigger: 'scrollbar',\n DOMType: e.type,\n DOMEvent: e\n });\n }\n scroller.grabbedCenter = scroller.hasDragged = scroller.chartX = scroller.chartY = null;\n };\n\n scroller.mouseDownHandler = function (e) {\n var normalizedEvent = scroller.chart.pointer.normalize(e);\n\n scroller.chartX = (normalizedEvent.chartX - scroller.x - scroller.xOffset) / scroller.barWidth;\n scroller.chartY = (normalizedEvent.chartY - scroller.y - scroller.yOffset) / scroller.barWidth;\n scroller.initPositions = [scroller.from, scroller.to];\n\n scroller.grabbedCenter = true;\n };\n\n scroller.buttonToMinClick = function (e) {\n var range = correctFloat(scroller.to - scroller.from) * scroller.options.step;\n scroller.updatePosition(correctFloat(scroller.from - range), correctFloat(scroller.to - range));\n fireEvent(scroller, 'changed', {\n from: scroller.from,\n to: scroller.to,\n trigger: 'scrollbar',\n DOMEvent: e\n });\n };\n\n scroller.buttonToMaxClick = function (e) {\n var range = (scroller.to - scroller.from) * scroller.options.step;\n scroller.updatePosition(scroller.from + range, scroller.to + range);\n fireEvent(scroller, 'changed', {\n from: scroller.from,\n to: scroller.to,\n trigger: 'scrollbar',\n DOMEvent: e\n });\n };\n\n scroller.trackClick = function (e) {\n var normalizedEvent = scroller.chart.pointer.normalize(e),\n range = scroller.to - scroller.from,\n top = scroller.y + scroller.scrollbarTop,\n left = scroller.x + scroller.scrollbarLeft;\n\n if ((scroller.options.vertical && normalizedEvent.chartY > top) || \n (!scroller.options.vertical && normalizedEvent.chartX > left)) {\n // On the top or on the left side of the track:\n scroller.updatePosition(scroller.from + range, scroller.to + range);\n } else {\n // On the bottom or the right side of the track:\n scroller.updatePosition(scroller.from - range, scroller.to - range);\n }\n\n fireEvent(scroller, 'changed', {\n from: scroller.from,\n to: scroller.to,\n trigger: 'scrollbar',\n DOMEvent: e\n });\n };\n },\n\n /**\n * Update position option in the Scrollbar, with normalized 0-1 scale\n */\n updatePosition: function (from, to) {\n if (to > 1) {\n from = correctFloat(1 - correctFloat(to - from));\n to = 1;\n }\n\n if (from < 0) {\n to = correctFloat(to - from);\n from = 0;\n }\n\n this.from = from;\n this.to = to;\n },\n\n /**\n * Set up the mouse and touch events for the Scrollbar\n */\n addEvents: function () {\n var buttonsOrder = this.options.inverted ? [1, 0] : [0, 1],\n buttons = this.scrollbarButtons,\n bar = this.scrollbarGroup.element,\n track = this.track.element,\n mouseDownHandler = this.mouseDownHandler,\n mouseMoveHandler = this.mouseMoveHandler,\n mouseUpHandler = this.mouseUpHandler,\n _events;\n\n // Mouse events\n _events = [\n [buttons[buttonsOrder[0]].element, 'click', this.buttonToMinClick],\n [buttons[buttonsOrder[1]].element, 'click', this.buttonToMaxClick],\n [track, 'click', this.trackClick],\n [bar, 'mousedown', mouseDownHandler],\n [doc, 'mousemove', mouseMoveHandler],\n [doc, 'mouseup', mouseUpHandler]\n ];\n\n // Touch events\n if (hasTouch) {\n _events.push(\n [bar, 'touchstart', mouseDownHandler],\n [doc, 'touchmove', mouseMoveHandler],\n [doc, 'touchend', mouseUpHandler]\n );\n }\n\n // Add them all\n each(_events, function (args) {\n addEvent.apply(null, args);\n });\n this._events = _events;\n },\n\n /**\n * Removes the event handlers attached previously with addEvents.\n */\n removeEvents: function () {\n each(this._events, function (args) {\n removeEvent.apply(null, args);\n });\n this._events = UNDEFINED;\n },\n\n /**\n * Destroys allocated elements.\n */\n destroy: function () {\n var scroller = this;\n\n // Disconnect events added in addEvents\n scroller.removeEvents();\n\n // Destroy properties\n each([scroller.track, scroller.scrollbarRifles, scroller.scrollbar, scroller.scrollbarGroup, scroller.group], function (prop) {\n if (prop && prop.destroy) {\n prop = prop.destroy();\n }\n });\n\n // Destroy elements in collection\n destroyObjectProperties(scroller.scrollbarButtons);\n }\n };\n\n /**\n * Wrap axis initialization and create scrollbar if enabled:\n */\n wrap(Axis.prototype, 'init', function (proceed) {\n var axis = this;\n proceed.apply(axis, [].slice.call(arguments, 1));\n\n if (axis.options.scrollbar && axis.options.scrollbar.enabled) {\n // Predefined options:\n axis.options.scrollbar.vertical = !axis.horiz;\n axis.options.startOnTick = axis.options.endOnTick = false;\n\n axis.scrollbar = new Scrollbar(axis.chart.renderer, axis.options.scrollbar, axis.chart);\n\n addEvent(axis.scrollbar, 'changed', function (e) {\n var unitedMin = Math.min(pick(axis.options.min, axis.min), axis.min, axis.dataMin),\n unitedMax = Math.max(pick(axis.options.max, axis.max), axis.max, axis.dataMax),\n range = unitedMax - unitedMin,\n to,\n from;\n\n if ((axis.horiz && !axis.reversed) || (!axis.horiz && axis.reversed)) {\n to = unitedMin + range * this.to;\n from = unitedMin + range * this.from;\n } else {\n // y-values in browser are reversed, but this also applies for reversed horizontal axis:\n to = unitedMin + range * (1 - this.from);\n from = unitedMin + range * (1 - this.to);\n }\n\n axis.setExtremes(from, to, true, false, e);\n });\n }\n });\n\n /**\n * Wrap rendering axis, and update scrollbar if one is created:\n */\n wrap(Axis.prototype, 'render', function (proceed) {\n var axis = this, \n scrollMin = Math.min(pick(axis.options.min, axis.min), axis.min, axis.dataMin),\n scrollMax = Math.max(pick(axis.options.max, axis.max), axis.max, axis.dataMax),\n scrollbar = axis.scrollbar,\n from,\n to;\n\n proceed.apply(axis, [].slice.call(arguments, 1));\n\n if (scrollbar) {\n if (axis.horiz) {\n scrollbar.position(\n axis.left, \n axis.top + axis.height + axis.offset + 2 + (axis.opposite ? 0 : axis.axisTitleMargin),\n axis.width,\n axis.height\n );\n } else {\n scrollbar.position(\n axis.left + axis.width + 2 + axis.offset + (axis.opposite ? axis.axisTitleMargin : 0), \n axis.top, \n axis.width, \n axis.height\n );\n }\n\n if (isNaN(scrollMin) || isNaN(scrollMax) || !defined(axis.min) || !defined(axis.max)) {\n scrollbar.setRange(0, 0); // default action: when there is not extremes on the axis, but scrollbar exists, make it full size\n } else {\n from = (axis.min - scrollMin) / (scrollMax - scrollMin);\n to = (axis.max - scrollMin) / (scrollMax - scrollMin);\n\n if ((axis.horiz && !axis.reversed) || (!axis.horiz && axis.reversed)) {\n scrollbar.setRange(from, to);\n } else {\n scrollbar.setRange(1 - to, 1 - from); // inverse vertical axis\n }\n }\n }\n });\n\n /**\n * Make space for a scrollbar\n */\n wrap(Axis.prototype, 'getOffset', function (proceed) {\n var axis = this,\n index = axis.horiz ? 2 : 1,\n scrollbar = axis.scrollbar;\n\n proceed.apply(axis, [].slice.call(arguments, 1));\n\n if (scrollbar) {\n axis.chart.axisOffset[index] += scrollbar.size + scrollbar.options.margin;\n }\n });\n\n /**\n * Destroy scrollbar when connected to the specific axis\n */\n wrap(Axis.prototype, 'destroy', function (proceed) {\n if (this.scrollbar) {\n this.scrollbar = this.scrollbar.destroy();\n }\n\n proceed.apply(this, [].slice.call(arguments, 1));\n });\n\n Highcharts.Scrollbar = Scrollbar;\n /* ****************************************************************************\n * Start Navigator code *\n *****************************************************************************/\n var units = [].concat(defaultDataGroupingUnits), // copy\n defaultSeriesType,\n\n // Finding the min or max of a set of variables where we don't know if they are defined,\n // is a pattern that is repeated several places in Highcharts. Consider making this\n // a global utility method.\n numExt = function (extreme) {\n var numbers = grep(arguments, isNumber);\n if (numbers.length) {\n return Math[extreme].apply(0, numbers);\n }\n };\n\n // add more resolution to units\n units[4] = ['day', [1, 2, 3, 4]]; // allow more days\n units[5] = ['week', [1, 2, 3]]; // allow more weeks\n\n defaultSeriesType = seriesTypes.areaspline === UNDEFINED ? 'line' : 'areaspline';\n\n extend(defaultOptions, {\n navigator: {\n //enabled: true,\n handles: {\n backgroundColor: '#ebe7e8',\n borderColor: '#b2b1b6'\n },\n height: 40,\n margin: 25,\n maskFill: 'rgba(128,179,236,0.3)',\n maskInside: true,\n outlineColor: '#b2b1b6',\n outlineWidth: 1,\n series: {\n type: defaultSeriesType,\n color: '#4572A7',\n compare: null,\n fillOpacity: 0.05,\n dataGrouping: {\n approximation: 'average',\n enabled: true,\n groupPixelWidth: 2,\n smoothed: true,\n units: units\n },\n dataLabels: {\n enabled: false,\n zIndex: 2 // #1839\n },\n id: PREFIX + 'navigator-series',\n lineColor: null, // Allow color setting while disallowing default candlestick setting (#4602)\n lineWidth: 1,\n marker: {\n enabled: false\n },\n pointRange: 0,\n shadow: false,\n threshold: null\n },\n //top: undefined,\n xAxis: {\n tickWidth: 0,\n lineWidth: 0,\n gridLineColor: '#EEE',\n gridLineWidth: 1,\n tickPixelInterval: 200,\n labels: {\n align: 'left',\n style: {\n color: '#888'\n },\n x: 3,\n y: -4\n },\n crosshair: false\n },\n yAxis: {\n gridLineWidth: 0,\n startOnTick: false,\n endOnTick: false,\n minPadding: 0.1,\n maxPadding: 0.1,\n labels: {\n enabled: false\n },\n crosshair: false,\n title: {\n text: null\n },\n tickWidth: 0\n }\n }\n });\n\n /**\n * The Navigator class\n * @param {Object} chart\n */\n function Navigator(chart) {\n var chartOptions = chart.options,\n navigatorOptions = chartOptions.navigator,\n navigatorEnabled = navigatorOptions.enabled,\n scrollbarOptions = chartOptions.scrollbar,\n scrollbarEnabled = scrollbarOptions.enabled,\n height = navigatorEnabled ? navigatorOptions.height : 0,\n scrollbarHeight = scrollbarEnabled ? scrollbarOptions.height : 0;\n\n this.handles = [];\n this.elementsToDestroy = []; // Array containing the elements to destroy when Navigator is destroyed\n\n this.chart = chart;\n this.setBaseSeries();\n\n this.height = height;\n this.scrollbarHeight = scrollbarHeight;\n this.scrollbarEnabled = scrollbarEnabled;\n this.navigatorEnabled = navigatorEnabled;\n this.navigatorOptions = navigatorOptions;\n this.outlineHeight = height + scrollbarHeight;\n\n // Run scroller\n this.init();\n }\n\n Navigator.prototype = {\n /**\n * Draw one of the handles on the side of the zoomed range in the navigator\n * @param {Number} x The x center for the handle\n * @param {Number} index 0 for left and 1 for right\n */\n drawHandle: function (x, index) {\n var scroller = this,\n chart = scroller.chart,\n renderer = chart.renderer,\n elementsToDestroy = scroller.elementsToDestroy,\n handles = scroller.handles,\n handlesOptions = scroller.navigatorOptions.handles,\n attr = {\n fill: handlesOptions.backgroundColor,\n stroke: handlesOptions.borderColor,\n 'stroke-width': 1\n },\n tempElem;\n\n // create the elements\n if (!scroller.rendered) {\n // the group\n handles[index] = renderer.g('navigator-handle-' + ['left', 'right'][index])\n .css({ cursor: 'ew-resize' })\n .attr({ zIndex: 10 - index }) // zIndex = 3 for right handle, 4 for left / 10 - #2908\n .add();\n\n // the rectangle\n tempElem = renderer.rect(-4.5, 0, 9, 16, 0, 1)\n .attr(attr)\n .add(handles[index]);\n elementsToDestroy.push(tempElem);\n\n // the rifles\n tempElem = renderer\n .path([\n 'M',\n -1.5, 4,\n 'L',\n -1.5, 12,\n 'M',\n 0.5, 4,\n 'L',\n 0.5, 12\n ]).attr(attr)\n .add(handles[index]);\n elementsToDestroy.push(tempElem);\n }\n\n // Place it\n handles[index][scroller.rendered && !scroller.hasDragged ? 'animate' : 'attr']({\n translateX: scroller.scrollerLeft + scroller.scrollbarHeight + parseInt(x, 10),\n translateY: scroller.top + scroller.height / 2 - 8\n });\n },\n\n /**\n * Render the navigator\n * @param {Number} min X axis value minimum\n * @param {Number} max X axis value maximum\n * @param {Number} pxMin Pixel value minimum\n * @param {Number} pxMax Pixel value maximum\n */\n render: function (min, max, pxMin, pxMax) {\n var scroller = this,\n chart = scroller.chart,\n renderer = chart.renderer,\n navigatorLeft,\n navigatorWidth,\n scrollerLeft,\n scrollerWidth,\n navigatorGroup = scroller.navigatorGroup,\n scrollbarHeight = scroller.scrollbarHeight,\n xAxis = scroller.xAxis,\n navigatorOptions = scroller.navigatorOptions,\n height = scroller.height,\n top = scroller.top,\n navigatorEnabled = scroller.navigatorEnabled,\n outlineWidth = navigatorOptions.outlineWidth,\n halfOutline = outlineWidth / 2,\n zoomedMin,\n zoomedMax,\n outlineHeight = scroller.outlineHeight,\n outlineTop = top + halfOutline,\n rendered = scroller.rendered,\n verb;\n\n // Don't render the navigator until we have data (#486, #4202, #5172). Don't redraw while moving the handles (#4703).\n if (!isNumber(min) || !isNumber(max) || (scroller.hasDragged && !defined(pxMin))) {\n return;\n }\n\n scroller.navigatorLeft = navigatorLeft = pick(\n xAxis.left,\n chart.plotLeft + scrollbarHeight // in case of scrollbar only, without navigator\n );\n scroller.navigatorWidth = navigatorWidth = pick(xAxis.len, chart.plotWidth - 2 * scrollbarHeight);\n scroller.scrollerLeft = scrollerLeft = navigatorLeft - scrollbarHeight;\n scroller.scrollerWidth = scrollerWidth = scrollerWidth = navigatorWidth + 2 * scrollbarHeight;\n\n // Get the pixel position of the handles\n pxMin = pick(pxMin, xAxis.translate(min));\n pxMax = pick(pxMax, xAxis.translate(max));\n if (!isNumber(pxMin) || mathAbs(pxMin) === Infinity) { // Verify (#1851, #2238)\n pxMin = 0;\n pxMax = scrollerWidth;\n }\n\n // Are we below the minRange? (#2618)\n if (xAxis.translate(pxMax, true) - xAxis.translate(pxMin, true) < chart.xAxis[0].minRange) {\n return;\n }\n\n\n // handles are allowed to cross, but never exceed the plot area\n scroller.zoomedMax = mathMin(mathMax(pxMin, pxMax, 0), navigatorWidth);\n scroller.zoomedMin = mathMin(mathMax(scroller.fixedWidth ? scroller.zoomedMax - scroller.fixedWidth : mathMin(pxMin, pxMax), 0), navigatorWidth);\n scroller.range = scroller.zoomedMax - scroller.zoomedMin;\n zoomedMax = mathRound(scroller.zoomedMax);\n zoomedMin = mathRound(scroller.zoomedMin);\n\n if (!rendered) {\n\n if (navigatorEnabled) {\n\n // draw the navigator group\n scroller.navigatorGroup = navigatorGroup = renderer.g('navigator')\n .attr({\n zIndex: 3\n })\n .add();\n\n scroller.leftShade = renderer.rect()\n .attr({\n fill: navigatorOptions.maskFill\n }).add(navigatorGroup);\n\n if (navigatorOptions.maskInside) {\n scroller.leftShade.css({ cursor: 'ew-resize' });\n } else {\n scroller.rightShade = renderer.rect()\n .attr({\n fill: navigatorOptions.maskFill\n }).add(navigatorGroup);\n }\n\n\n scroller.outline = renderer.path()\n .attr({\n 'stroke-width': outlineWidth,\n stroke: navigatorOptions.outlineColor\n })\n .add(navigatorGroup);\n }\n }\n\n // place elements\n verb = rendered && !scroller.hasDragged ? 'animate' : 'attr';\n if (navigatorEnabled) {\n scroller.leftShade[verb](navigatorOptions.maskInside ? {\n x: navigatorLeft + zoomedMin,\n y: top,\n width: zoomedMax - zoomedMin,\n height: height\n } : {\n x: navigatorLeft,\n y: top,\n width: zoomedMin,\n height: height\n });\n if (scroller.rightShade) {\n scroller.rightShade[verb]({\n x: navigatorLeft + zoomedMax,\n y: top,\n width: navigatorWidth - zoomedMax,\n height: height\n });\n }\n\n scroller.outline[verb]({ d: [\n M,\n scrollerLeft, outlineTop, // left\n L,\n navigatorLeft + zoomedMin - halfOutline, outlineTop, // upper left of zoomed range\n navigatorLeft + zoomedMin - halfOutline, outlineTop + outlineHeight, // lower left of z.r.\n L,\n navigatorLeft + zoomedMax - halfOutline, outlineTop + outlineHeight, // lower right of z.r.\n L,\n navigatorLeft + zoomedMax - halfOutline, outlineTop, // upper right of z.r.\n scrollerLeft + scrollerWidth, outlineTop // right\n ].concat(navigatorOptions.maskInside ? [\n M,\n navigatorLeft + zoomedMin + halfOutline, outlineTop, // upper left of zoomed range\n L,\n navigatorLeft + zoomedMax - halfOutline, outlineTop // upper right of z.r.\n ] : []) });\n // draw handles\n scroller.drawHandle(zoomedMin + halfOutline, 0);\n scroller.drawHandle(zoomedMax + halfOutline, 1);\n }\n\n if (scroller.scrollbar) {\n\n scroller.scrollbar.hasDragged = scroller.hasDragged;\n \n // Keep scale 0-1\n scroller.scrollbar.position(\n scroller.scrollerLeft,\n scroller.top + (navigatorEnabled ? scroller.height : -scroller.scrollbarHeight),\n scroller.scrollerWidth,\n scroller.scrollbarHeight\n );\n scroller.scrollbar.setRange(\n zoomedMin / navigatorWidth,\n zoomedMax / navigatorWidth\n );\n }\n scroller.rendered = true;\n },\n\n /**\n * Set up the mouse and touch events for the navigator\n */\n addEvents: function () {\n var chart = this.chart,\n container = chart.container,\n mouseDownHandler = this.mouseDownHandler,\n mouseMoveHandler = this.mouseMoveHandler,\n mouseUpHandler = this.mouseUpHandler,\n _events;\n\n // Mouse events\n _events = [\n [container, 'mousedown', mouseDownHandler],\n [container, 'mousemove', mouseMoveHandler],\n [doc, 'mouseup', mouseUpHandler]\n ];\n\n // Touch events\n if (hasTouch) {\n _events.push(\n [container, 'touchstart', mouseDownHandler],\n [container, 'touchmove', mouseMoveHandler],\n [doc, 'touchend', mouseUpHandler]\n );\n }\n\n // Add them all\n each(_events, function (args) {\n addEvent.apply(null, args);\n });\n this._events = _events;\n\n // Data events\n if (this.series) {\n addEvent(this.series.xAxis, 'foundExtremes', function () {\n chart.scroller.modifyNavigatorAxisExtremes();\n });\n }\n\n addEvent(chart, 'redraw', function () {\n // Move the scrollbar after redraw, like after data updata even if axes don't redraw\n var scroller = this.scroller,\n xAxis = scroller && scroller.baseSeries && scroller.baseSeries.xAxis;\n \n if (xAxis) {\n scroller.render(xAxis.min, xAxis.max);\n }\n });\n },\n\n /**\n * Removes the event handlers attached previously with addEvents.\n */\n removeEvents: function () {\n\n each(this._events, function (args) {\n removeEvent.apply(null, args);\n });\n this._events = UNDEFINED;\n this.removeBaseSeriesEvents();\n },\n\n removeBaseSeriesEvents: function () {\n if (this.navigatorEnabled && this.baseSeries && this.baseSeries.xAxis && this.navigatorOptions.adaptToUpdatedData !== false) {\n removeEvent(this.baseSeries, 'updatedData', this.updatedDataHandler);\n removeEvent(this.baseSeries.xAxis, 'foundExtremes', this.modifyBaseAxisExtremes);\n }\n },\n\n /**\n * Initiate the Navigator object\n */\n init: function () {\n var scroller = this,\n chart = scroller.chart,\n xAxis,\n yAxis,\n scrollbarHeight = scroller.scrollbarHeight,\n navigatorOptions = scroller.navigatorOptions,\n height = scroller.height,\n top = scroller.top,\n dragOffset,\n baseSeries = scroller.baseSeries;\n\n /**\n * Event handler for the mouse down event.\n */\n scroller.mouseDownHandler = function (e) {\n e = chart.pointer.normalize(e);\n\n var zoomedMin = scroller.zoomedMin,\n zoomedMax = scroller.zoomedMax,\n top = scroller.top,\n scrollerLeft = scroller.scrollerLeft,\n scrollerWidth = scroller.scrollerWidth,\n navigatorLeft = scroller.navigatorLeft,\n navigatorWidth = scroller.navigatorWidth,\n scrollbarPad = scroller.scrollbarPad || 0,\n range = scroller.range,\n chartX = e.chartX,\n chartY = e.chartY,\n baseXAxis = chart.xAxis[0],\n fixedMax,\n ext,\n handleSensitivity = isTouchDevice ? 10 : 7,\n left;\n\n if (chartY > top && chartY < top + height) { // we're vertically inside the navigator\n\n // grab the left handle\n if (math.abs(chartX - zoomedMin - navigatorLeft) < handleSensitivity) {\n scroller.grabbedLeft = true;\n scroller.otherHandlePos = zoomedMax;\n scroller.fixedExtreme = baseXAxis.max;\n chart.fixedRange = null;\n\n // grab the right handle\n } else if (math.abs(chartX - zoomedMax - navigatorLeft) < handleSensitivity) {\n scroller.grabbedRight = true;\n scroller.otherHandlePos = zoomedMin;\n scroller.fixedExtreme = baseXAxis.min;\n chart.fixedRange = null;\n\n // grab the zoomed range\n } else if (chartX > navigatorLeft + zoomedMin - scrollbarPad && chartX < navigatorLeft + zoomedMax + scrollbarPad) {\n scroller.grabbedCenter = chartX;\n scroller.fixedWidth = range;\n\n dragOffset = chartX - zoomedMin;\n\n // shift the range by clicking on shaded areas\n } else if (chartX > scrollerLeft && chartX < scrollerLeft + scrollerWidth) { \n left = chartX - navigatorLeft - range / 2;\n if (left < 0) {\n left = 0;\n } else if (left + range >= navigatorWidth) {\n left = navigatorWidth - range;\n fixedMax = scroller.getUnionExtremes().dataMax; // #2293, #3543\n }\n if (left !== zoomedMin) { // it has actually moved\n scroller.fixedWidth = range; // #1370\n\n ext = xAxis.toFixedRange(left, left + range, null, fixedMax);\n baseXAxis.setExtremes(\n ext.min,\n ext.max,\n true,\n null, // auto animation\n { trigger: 'navigator' }\n );\n }\n }\n\n }\n };\n\n /**\n * Event handler for the mouse move event.\n */\n scroller.mouseMoveHandler = function (e) {\n var scrollbarHeight = scroller.scrollbarHeight,\n navigatorLeft = scroller.navigatorLeft,\n navigatorWidth = scroller.navigatorWidth,\n scrollerLeft = scroller.scrollerLeft,\n scrollerWidth = scroller.scrollerWidth,\n range = scroller.range,\n chartX;\n\n // In iOS, a mousemove event with e.pageX === 0 is fired when holding the finger\n // down in the center of the scrollbar. This should be ignored.\n if (!e.touches || e.touches[0].pageX !== 0) { // #4696, scrollbar failed on Android\n\n e = chart.pointer.normalize(e);\n chartX = e.chartX;\n\n // validation for handle dragging\n if (chartX < navigatorLeft) {\n chartX = navigatorLeft;\n } else if (chartX > scrollerLeft + scrollerWidth - scrollbarHeight) {\n chartX = scrollerLeft + scrollerWidth - scrollbarHeight;\n }\n\n // drag left handle\n if (scroller.grabbedLeft) {\n scroller.hasDragged = true;\n scroller.render(0, 0, chartX - navigatorLeft, scroller.otherHandlePos);\n\n // drag right handle\n } else if (scroller.grabbedRight) {\n scroller.hasDragged = true;\n scroller.render(0, 0, scroller.otherHandlePos, chartX - navigatorLeft);\n\n // drag scrollbar or open area in navigator\n } else if (scroller.grabbedCenter) {\n\n scroller.hasDragged = true;\n if (chartX < dragOffset) { // outside left\n chartX = dragOffset;\n } else if (chartX > navigatorWidth + dragOffset - range) { // outside right\n chartX = navigatorWidth + dragOffset - range;\n }\n\n scroller.render(0, 0, chartX - dragOffset, chartX - dragOffset + range);\n }\n if (scroller.hasDragged && scroller.scrollbar && scroller.scrollbar.options.liveRedraw) {\n e.DOMType = e.type; // DOMType is for IE8 because it can't read type async\n setTimeout(function () {\n scroller.mouseUpHandler(e);\n }, 0);\n }\n }\n };\n\n /**\n * Event handler for the mouse up event.\n */\n scroller.mouseUpHandler = function (e) {\n var ext,\n fixedMin,\n fixedMax,\n DOMEvent = e.DOMEvent || e;\n\n if (scroller.hasDragged || e.trigger === 'scrollbar') {\n // When dragging one handle, make sure the other one doesn't change\n if (scroller.zoomedMin === scroller.otherHandlePos) {\n fixedMin = scroller.fixedExtreme;\n } else if (scroller.zoomedMax === scroller.otherHandlePos) {\n fixedMax = scroller.fixedExtreme;\n }\n\n // Snap to right edge (#4076)\n if (scroller.zoomedMax === scroller.navigatorWidth) {\n fixedMax = scroller.getUnionExtremes().dataMax;\n }\n\n ext = xAxis.toFixedRange(scroller.zoomedMin, scroller.zoomedMax, fixedMin, fixedMax);\n if (defined(ext.min)) {\n chart.xAxis[0].setExtremes(\n ext.min,\n ext.max,\n true,\n scroller.hasDragged ? false : null, // Run animation when clicking buttons, scrollbar track etc, but not when dragging handles or scrollbar\n {\n trigger: 'navigator',\n triggerOp: 'navigator-drag',\n DOMEvent: DOMEvent // #1838\n }\n );\n }\n }\n\n if (e.DOMType !== 'mousemove') {\n scroller.grabbedLeft = scroller.grabbedRight = scroller.grabbedCenter = scroller.fixedWidth =\n scroller.fixedExtreme = scroller.otherHandlePos = scroller.hasDragged = dragOffset = null;\n }\n\n };\n\n\n\n var xAxisIndex = chart.xAxis.length,\n yAxisIndex = chart.yAxis.length;\n\n // make room below the chart\n chart.extraBottomMargin = scroller.outlineHeight + navigatorOptions.margin;\n \n\n if (scroller.navigatorEnabled) {\n // an x axis is required for scrollbar also\n scroller.xAxis = xAxis = new Axis(chart, merge({\n // inherit base xAxis' break and ordinal options\n breaks: baseSeries && baseSeries.xAxis.options.breaks,\n ordinal: baseSeries && baseSeries.xAxis.options.ordinal\n }, navigatorOptions.xAxis, {\n id: 'navigator-x-axis',\n isX: true,\n type: 'datetime',\n index: xAxisIndex,\n height: height,\n offset: 0,\n offsetLeft: scrollbarHeight,\n offsetRight: -scrollbarHeight,\n keepOrdinalPadding: true, // #2436\n startOnTick: false,\n endOnTick: false,\n minPadding: 0,\n maxPadding: 0,\n zoomEnabled: false\n }));\n\n scroller.yAxis = yAxis = new Axis(chart, merge(navigatorOptions.yAxis, {\n id: 'navigator-y-axis',\n alignTicks: false,\n height: height,\n offset: 0,\n index: yAxisIndex,\n zoomEnabled: false\n }));\n\n // If we have a base series, initialize the navigator series\n if (baseSeries || navigatorOptions.series.data) {\n scroller.addBaseSeries();\n\n // If not, set up an event to listen for added series\n } else if (chart.series.length === 0) {\n\n wrap(chart, 'redraw', function (proceed, animation) {\n // We've got one, now add it as base and reset chart.redraw\n if (chart.series.length > 0 && !scroller.series) {\n scroller.setBaseSeries();\n chart.redraw = proceed; // reset\n }\n proceed.call(chart, animation);\n });\n }\n\n // in case of scrollbar only, fake an x axis to get translation\n } else {\n scroller.xAxis = xAxis = {\n translate: function (value, reverse) {\n var axis = chart.xAxis[0],\n ext = axis.getExtremes(),\n scrollTrackWidth = chart.plotWidth - 2 * scrollbarHeight,\n min = numExt('min', axis.options.min, ext.dataMin),\n valueRange = numExt('max', axis.options.max, ext.dataMax) - min;\n\n return reverse ?\n // from pixel to value\n (value * valueRange / scrollTrackWidth) + min :\n // from value to pixel\n scrollTrackWidth * (value - min) / valueRange;\n },\n toFixedRange: Axis.prototype.toFixedRange\n };\n }\n\n\n // Initialize the scrollbar\n if (chart.options.scrollbar.enabled) {\n scroller.scrollbar = new Scrollbar(\n chart.renderer,\n merge(chart.options.scrollbar, { margin: scroller.navigatorEnabled ? 0 : 10 }),\n chart\n );\n addEvent(scroller.scrollbar, 'changed', function (e) {\n var range = scroller.navigatorWidth,\n to = range * this.to,\n from = range * this.from;\n\n scroller.hasDragged = scroller.scrollbar.hasDragged;\n scroller.render(0, 0, from, to);\n\n if (chart.options.scrollbar.liveRedraw || e.DOMType !== 'mousemove') {\n setTimeout(function () {\n scroller.mouseUpHandler(e);\n });\n }\n });\n }\n\n // Add data events\n scroller.addBaseSeriesEvents();\n\n\n /**\n * For stock charts, extend the Chart.getMargins method so that we can set the final top position\n * of the navigator once the height of the chart, including the legend, is determined. #367.\n */\n wrap(chart, 'getMargins', function (proceed) {\n\n var legend = this.legend,\n legendOptions = legend.options;\n\n proceed.apply(this, [].slice.call(arguments, 1));\n\n // Compute the top position\n scroller.top = top = scroller.navigatorOptions.top ||\n this.chartHeight - scroller.height - scroller.scrollbarHeight - this.spacing[2] -\n (legendOptions.verticalAlign === 'bottom' && legendOptions.enabled && !legendOptions.floating ?\n legend.legendHeight + pick(legendOptions.margin, 10) : 0);\n\n if (xAxis && yAxis) { // false if navigator is disabled (#904)\n\n xAxis.options.top = yAxis.options.top = top;\n\n xAxis.setAxisSize();\n yAxis.setAxisSize();\n }\n });\n\n scroller.addEvents();\n },\n\n /**\n * Get the union data extremes of the chart - the outer data extremes of the base\n * X axis and the navigator axis.\n */\n getUnionExtremes: function (returnFalseOnNoBaseSeries) {\n var baseAxis = this.chart.xAxis[0],\n navAxis = this.xAxis,\n navAxisOptions = navAxis.options,\n baseAxisOptions = baseAxis.options,\n ret;\n\n if (!returnFalseOnNoBaseSeries || baseAxis.dataMin !== null) {\n ret = {\n dataMin: pick( // #4053\n navAxisOptions && navAxisOptions.min,\n numExt(\n 'min',\n baseAxisOptions.min,\n baseAxis.dataMin,\n navAxis.dataMin,\n navAxis.min\n )\n ),\n dataMax: pick(\n navAxisOptions && navAxisOptions.max,\n numExt(\n 'max',\n baseAxisOptions.max,\n baseAxis.dataMax,\n navAxis.dataMax,\n navAxis.max\n )\n )\n };\n }\n return ret;\n },\n\n /**\n * Set the base series. With a bit of modification we should be able to make\n * this an API method to be called from the outside\n */\n setBaseSeries: function (baseSeriesOption) {\n var chart = this.chart;\n\n baseSeriesOption = baseSeriesOption || chart.options.navigator.baseSeries;\n\n // If we're resetting, remove the existing series\n if (this.series) {\n this.removeBaseSeriesEvents();\n this.series.remove();\n }\n\n // Set the new base series\n this.baseSeries = chart.series[baseSeriesOption] ||\n (typeof baseSeriesOption === 'string' && chart.get(baseSeriesOption)) ||\n chart.series[0];\n\n // When run after render, this.xAxis already exists\n if (this.xAxis) {\n this.addBaseSeries();\n }\n },\n\n addBaseSeries: function () {\n var baseSeries = this.baseSeries,\n baseOptions = baseSeries ? baseSeries.options : {},\n baseData = baseOptions.data,\n mergedNavSeriesOptions,\n navigatorSeriesOptions = this.navigatorOptions.series,\n navigatorData;\n\n // remove it to prevent merging one by one\n navigatorData = navigatorSeriesOptions.data;\n this.hasNavigatorData = !!navigatorData;\n\n // Merge the series options\n mergedNavSeriesOptions = merge(baseOptions, navigatorSeriesOptions, {\n enableMouseTracking: false,\n group: 'nav', // for columns\n padXAxis: false,\n xAxis: 'navigator-x-axis',\n yAxis: 'navigator-y-axis',\n name: 'Navigator',\n showInLegend: false,\n stacking: false, // We only allow one series anyway (#4823)\n isInternal: true,\n visible: true\n });\n\n // Set the data. Do a slice to avoid mutating the navigator options from base series (#4923).\n mergedNavSeriesOptions.data = navigatorData || baseData.slice(0);\n\n // Add the series\n this.series = this.chart.initSeries(mergedNavSeriesOptions);\n\n this.addBaseSeriesEvents();\n\n },\n addBaseSeriesEvents: function () {\n var baseSeries = this.baseSeries;\n\n // Respond to updated data in the base series.\n // Abort if lazy-loading data from the server.\n if (baseSeries && baseSeries.xAxis && this.navigatorOptions.adaptToUpdatedData !== false) {\n addEvent(baseSeries, 'updatedData', this.updatedDataHandler);\n addEvent(baseSeries.xAxis, 'foundExtremes', this.modifyBaseAxisExtremes);\n \n // Survive Series.update()\n baseSeries.userOptions.events = extend(baseSeries.userOptions.event, { updatedData: this.updatedDataHandler });\n }\n },\n /**\n * Set the scroller x axis extremes to reflect the total. The navigator extremes\n * should always be the extremes of the union of all series in the chart as\n * well as the navigator series.\n */\n modifyNavigatorAxisExtremes: function () {\n var xAxis = this.xAxis,\n unionExtremes;\n\n if (xAxis.getExtremes) {\n unionExtremes = this.getUnionExtremes(true);\n if (unionExtremes && (unionExtremes.dataMin !== xAxis.min || unionExtremes.dataMax !== xAxis.max)) {\n xAxis.min = unionExtremes.dataMin;\n xAxis.max = unionExtremes.dataMax;\n }\n }\n },\n\n /**\n * Hook to modify the base axis extremes with information from the Navigator\n */\n modifyBaseAxisExtremes: function () {\n if (!this.chart.scroller.baseSeries || !this.chart.scroller.baseSeries.xAxis) {\n return;\n }\n \n var baseXAxis = this,\n scroller = baseXAxis.chart.scroller,\n baseExtremes = baseXAxis.getExtremes(),\n baseMin = baseExtremes.min,\n baseMax = baseExtremes.max,\n baseDataMin = baseExtremes.dataMin,\n baseDataMax = baseExtremes.dataMax,\n range = baseMax - baseMin,\n stickToMin = scroller.stickToMin,\n stickToMax = scroller.stickToMax,\n newMax,\n newMin,\n navigatorSeries = scroller.series,\n hasSetExtremes = !!baseXAxis.setExtremes,\n\n // When the extremes have been set by range selector button, don't stick to min or max.\n // The range selector buttons will handle the extremes. (#5489)\n unmutable = baseXAxis.eventArgs && baseXAxis.eventArgs.trigger === 'rangeSelectorButton';\n\n if (!unmutable) {\n \n // If the zoomed range is already at the min, move it to the right as new data\n // comes in\n if (stickToMin) {\n newMin = baseDataMin;\n newMax = newMin + range;\n }\n\n // If the zoomed range is already at the max, move it to the right as new data\n // comes in\n if (stickToMax) {\n newMax = baseDataMax;\n if (!stickToMin) { // if stickToMin is true, the new min value is set above\n newMin = mathMax(newMax - range, navigatorSeries && navigatorSeries.xData ? navigatorSeries.xData[0] : -Number.MAX_VALUE);\n }\n }\n\n // Update the extremes\n if (hasSetExtremes && (stickToMin || stickToMax)) {\n if (isNumber(newMin)) {\n baseXAxis.min = baseXAxis.userMin = newMin;\n baseXAxis.max = baseXAxis.userMax = newMax;\n }\n }\n }\n\n // Reset\n scroller.stickToMin = scroller.stickToMax = null;\n },\n\n /**\n * Handler for updated data on the base series. When data is modified, the navigator series\n * must reflect it. This is called from the Chart.redraw function before axis and series \n * extremes are computed.\n */\n updatedDataHandler: function () {\n var scroller = this.chart.scroller,\n baseSeries = scroller.baseSeries,\n navigatorSeries = scroller.series;\n\n // Detect whether the zoomed area should stick to the minimum or maximum. If the current\n // axis minimum falls outside the new updated dataset, we must adjust.\n scroller.stickToMin = isNumber(baseSeries.xAxis.min) && (baseSeries.xAxis.min <= baseSeries.xData[0]);\n // If the scrollbar is scrolled all the way to the right, keep right as new data \n // comes in.\n scroller.stickToMax = Math.round(scroller.zoomedMax) >= Math.round(scroller.navigatorWidth);\n\n // Set the navigator series data to the new data of the base series\n if (navigatorSeries && !scroller.hasNavigatorData) {\n navigatorSeries.options.pointStart = baseSeries.xData[0];\n navigatorSeries.setData(baseSeries.options.data, false, null, false); // #5414\n }\n },\n\n /**\n * Destroys allocated elements.\n */\n destroy: function () {\n var scroller = this;\n\n // Disconnect events added in addEvents\n scroller.removeEvents();\n\n // Destroy properties\n each([scroller.scrollbar, scroller.xAxis, scroller.yAxis, scroller.leftShade, scroller.rightShade, scroller.outline], function (prop) {\n if (prop && prop.destroy) {\n prop.destroy();\n }\n });\n scroller.xAxis = scroller.yAxis = scroller.leftShade = scroller.rightShade = scroller.outline = null;\n\n // Destroy elements in collection\n each([scroller.handles, scroller.elementsToDestroy], function (coll) {\n destroyObjectProperties(coll);\n });\n }\n };\n\n Highcharts.Navigator = Navigator;\n\n /**\n * For Stock charts, override selection zooming with some special features because\n * X axis zooming is already allowed by the Navigator and Range selector.\n */\n wrap(Axis.prototype, 'zoom', function (proceed, newMin, newMax) {\n var chart = this.chart,\n chartOptions = chart.options,\n zoomType = chartOptions.chart.zoomType,\n previousZoom,\n navigator = chartOptions.navigator,\n rangeSelector = chartOptions.rangeSelector,\n ret;\n\n if (this.isXAxis && ((navigator && navigator.enabled) ||\n (rangeSelector && rangeSelector.enabled))) {\n\n // For x only zooming, fool the chart.zoom method not to create the zoom button\n // because the property already exists\n if (zoomType === 'x') {\n chart.resetZoomButton = 'blocked';\n\n // For y only zooming, ignore the X axis completely\n } else if (zoomType === 'y') {\n ret = false;\n\n // For xy zooming, record the state of the zoom before zoom selection, then when\n // the reset button is pressed, revert to this state\n } else if (zoomType === 'xy') {\n previousZoom = this.previousZoom;\n if (defined(newMin)) {\n this.previousZoom = [this.min, this.max];\n } else if (previousZoom) {\n newMin = previousZoom[0];\n newMax = previousZoom[1];\n delete this.previousZoom;\n }\n }\n\n }\n return ret !== UNDEFINED ? ret : proceed.call(this, newMin, newMax);\n });\n\n // Initialize scroller for stock charts\n wrap(Chart.prototype, 'init', function (proceed, options, callback) {\n\n addEvent(this, 'beforeRender', function () {\n var options = this.options;\n if (options.navigator.enabled || options.scrollbar.enabled) {\n this.scroller = new Navigator(this);\n }\n });\n\n proceed.call(this, options, callback);\n\n });\n\n // Pick up badly formatted point options to addPoint\n wrap(Series.prototype, 'addPoint', function (proceed, options, redraw, shift, animation) {\n var turboThreshold = this.options.turboThreshold;\n if (turboThreshold && this.xData.length > turboThreshold && isObject(options, true) && this.chart.scroller) {\n error(20, true);\n }\n proceed.call(this, options, redraw, shift, animation);\n });\n\n /* ****************************************************************************\n * End Navigator code *\n *****************************************************************************/\n /* ****************************************************************************\n * Start Range Selector code *\n *****************************************************************************/\n extend(defaultOptions, {\n rangeSelector: {\n // allButtonsEnabled: false,\n // enabled: true,\n // buttons: {Object}\n // buttonSpacing: 0,\n buttonTheme: {\n width: 28,\n height: 18,\n fill: '#f7f7f7',\n padding: 2,\n r: 0,\n 'stroke-width': 0,\n style: {\n color: '#444',\n cursor: 'pointer',\n fontWeight: 'normal'\n },\n zIndex: 7, // #484, #852\n states: {\n hover: {\n fill: '#e7e7e7'\n },\n select: {\n fill: '#e7f0f9',\n style: {\n color: 'black',\n fontWeight: 'bold'\n }\n }\n }\n },\n height: 35, // reserved space for buttons and input\n inputPosition: {\n align: 'right'\n },\n // inputDateFormat: '%b %e, %Y',\n // inputEditDateFormat: '%Y-%m-%d',\n // inputEnabled: true,\n // inputStyle: {},\n labelStyle: {\n color: '#666'\n }\n // selected: undefined\n }\n });\n defaultOptions.lang = merge(defaultOptions.lang, {\n rangeSelectorZoom: 'Zoom',\n rangeSelectorFrom: 'From',\n rangeSelectorTo: 'To'\n });\n\n /**\n * The object constructor for the range selector\n * @param {Object} chart\n */\n function RangeSelector(chart) {\n\n // Run RangeSelector\n this.init(chart);\n }\n\n RangeSelector.prototype = {\n /**\n * The method to run when one of the buttons in the range selectors is clicked\n * @param {Number} i The index of the button\n * @param {Object} rangeOptions\n * @param {Boolean} redraw\n */\n clickButton: function (i, redraw) {\n var rangeSelector = this,\n selected = rangeSelector.selected,\n chart = rangeSelector.chart,\n buttons = rangeSelector.buttons,\n rangeOptions = rangeSelector.buttonOptions[i],\n baseAxis = chart.xAxis[0],\n unionExtremes = (chart.scroller && chart.scroller.getUnionExtremes()) || baseAxis || {},\n dataMin = unionExtremes.dataMin,\n dataMax = unionExtremes.dataMax,\n newMin,\n newMax = baseAxis && mathRound(mathMin(baseAxis.max, pick(dataMax, baseAxis.max))), // #1568\n now,\n type = rangeOptions.type,\n baseXAxisOptions,\n range = rangeOptions._range,\n rangeMin,\n year,\n minSetting,\n rangeSetting,\n ctx,\n dataGrouping = rangeOptions.dataGrouping;\n\n if (dataMin === null || dataMax === null || // chart has no data, base series is removed\n i === rangeSelector.selected) { // same button is clicked twice\n return;\n }\n\n // Set the fixed range before range is altered\n chart.fixedRange = range;\n\n // Apply dataGrouping associated to button\n if (dataGrouping) {\n this.forcedDataGrouping = true;\n Axis.prototype.setDataGrouping.call(baseAxis || { chart: this.chart }, dataGrouping, false);\n }\n\n // Apply range\n if (type === 'month' || type === 'year') {\n if (!baseAxis) {\n // This is set to the user options and picked up later when the axis is instantiated\n // so that we know the min and max.\n range = rangeOptions;\n } else {\n ctx = {\n range: rangeOptions,\n max: newMax,\n dataMin: dataMin,\n dataMax: dataMax\n };\n newMin = baseAxis.minFromRange.call(ctx);\n if (isNumber(ctx.newMax)) {\n newMax = ctx.newMax;\n }\n }\n\n // Fixed times like minutes, hours, days\n } else if (range) {\n newMin = mathMax(newMax - range, dataMin);\n newMax = mathMin(newMin + range, dataMax);\n\n } else if (type === 'ytd') {\n\n // On user clicks on the buttons, or a delayed action running from the beforeRender\n // event (below), the baseAxis is defined.\n if (baseAxis) {\n\n // When \"ytd\" is the pre-selected button for the initial view, its calculation\n // is delayed and rerun in the beforeRender event (below). When the series\n // are initialized, but before the chart is rendered, we have access to the xData\n // array (#942).\n if (dataMax === UNDEFINED) {\n dataMin = Number.MAX_VALUE;\n dataMax = Number.MIN_VALUE;\n each(chart.series, function (series) {\n var xData = series.xData; // reassign it to the last item\n dataMin = mathMin(xData[0], dataMin);\n dataMax = mathMax(xData[xData.length - 1], dataMax);\n });\n redraw = false;\n }\n now = new Date(dataMax);\n year = now.getFullYear();\n newMin = rangeMin = mathMax(dataMin || 0, Date.UTC(year, 0, 1));\n now = now.getTime();\n newMax = mathMin(dataMax || now, now);\n\n // \"ytd\" is pre-selected. We don't yet have access to processed point and extremes data\n // (things like pointStart and pointInterval are missing), so we delay the process (#942)\n } else {\n addEvent(chart, 'beforeRender', function () {\n rangeSelector.clickButton(i);\n });\n return;\n }\n } else if (type === 'all' && baseAxis) {\n newMin = dataMin;\n newMax = dataMax;\n }\n\n // Deselect previous button\n if (buttons[selected]) {\n buttons[selected].setState(0);\n }\n // Select this button\n if (buttons[i]) {\n buttons[i].setState(2);\n rangeSelector.lastSelected = i;\n }\n\n // Update the chart\n if (!baseAxis) {\n // Axis not yet instanciated. Temporarily set min and range\n // options and remove them on chart load (#4317).\n baseXAxisOptions = splat(chart.options.xAxis)[0];\n rangeSetting = baseXAxisOptions.range;\n baseXAxisOptions.range = range;\n minSetting = baseXAxisOptions.min;\n baseXAxisOptions.min = rangeMin;\n rangeSelector.setSelected(i);\n addEvent(chart, 'load', function resetMinAndRange() {\n baseXAxisOptions.range = rangeSetting;\n baseXAxisOptions.min = minSetting;\n });\n } else {\n // Existing axis object. Set extremes after render time.\n baseAxis.setExtremes(\n newMin,\n newMax,\n pick(redraw, 1),\n null, // auto animation\n {\n trigger: 'rangeSelectorButton',\n rangeSelectorButton: rangeOptions\n }\n );\n rangeSelector.setSelected(i);\n }\n },\n\n /**\n * Set the selected option. This method only sets the internal flag, it doesn't\n * update the buttons or the actual zoomed range.\n */\n setSelected: function (selected) {\n this.selected = this.options.selected = selected;\n },\n\n /**\n * The default buttons for pre-selecting time frames\n */\n defaultButtons: [{\n type: 'month',\n count: 1,\n text: '1m'\n }, {\n type: 'month',\n count: 3,\n text: '3m'\n }, {\n type: 'month',\n count: 6,\n text: '6m'\n }, {\n type: 'ytd',\n text: 'YTD'\n }, {\n type: 'year',\n count: 1,\n text: '1y'\n }, {\n type: 'all',\n text: 'All'\n }],\n\n /**\n * Initialize the range selector\n */\n init: function (chart) {\n\n var rangeSelector = this,\n options = chart.options.rangeSelector,\n buttonOptions = options.buttons || [].concat(rangeSelector.defaultButtons),\n selectedOption = options.selected,\n blurInputs = rangeSelector.blurInputs = function () {\n var minInput = rangeSelector.minInput,\n maxInput = rangeSelector.maxInput;\n if (minInput && minInput.blur) { //#3274 in some case blur is not defined\n fireEvent(minInput, 'blur'); //#3274\n }\n if (maxInput && maxInput.blur) { //#3274 in some case blur is not defined\n fireEvent(maxInput, 'blur'); //#3274\n }\n };\n\n rangeSelector.chart = chart;\n rangeSelector.options = options;\n rangeSelector.buttons = [];\n\n chart.extraTopMargin = options.height;\n rangeSelector.buttonOptions = buttonOptions;\n\n addEvent(chart.container, 'mousedown', blurInputs);\n addEvent(chart, 'resize', blurInputs);\n\n // Extend the buttonOptions with actual range\n each(buttonOptions, rangeSelector.computeButtonRange);\n\n // zoomed range based on a pre-selected button index\n if (selectedOption !== UNDEFINED && buttonOptions[selectedOption]) {\n this.clickButton(selectedOption, false);\n }\n\n\n addEvent(chart, 'load', function () {\n // If a data grouping is applied to the current button, release it when extremes change\n addEvent(chart.xAxis[0], 'setExtremes', function (e) {\n if (this.max - this.min !== chart.fixedRange && e.trigger !== 'rangeSelectorButton' &&\n e.trigger !== 'updatedData' && rangeSelector.forcedDataGrouping) {\n this.setDataGrouping(false, false);\n }\n });\n // Normalize the pressed button whenever a new range is selected\n addEvent(chart.xAxis[0], 'afterSetExtremes', function () {\n rangeSelector.updateButtonStates(true);\n });\n });\n },\n\n /**\n * Dynamically update the range selector buttons after a new range has been set\n */\n updateButtonStates: function (updating) {\n var rangeSelector = this,\n chart = this.chart,\n baseAxis = chart.xAxis[0],\n unionExtremes = (chart.scroller && chart.scroller.getUnionExtremes()) || baseAxis,\n dataMin = unionExtremes.dataMin,\n dataMax = unionExtremes.dataMax,\n selected = rangeSelector.selected,\n allButtonsEnabled = rangeSelector.options.allButtonsEnabled,\n buttons = rangeSelector.buttons;\n\n if (updating && chart.fixedRange !== mathRound(baseAxis.max - baseAxis.min)) {\n if (buttons[selected]) {\n buttons[selected].setState(0);\n }\n rangeSelector.setSelected(null);\n }\n\n each(rangeSelector.buttonOptions, function (rangeOptions, i) {\n var actualRange = mathRound(baseAxis.max - baseAxis.min),\n range = rangeOptions._range,\n type = rangeOptions.type,\n count = rangeOptions.count || 1,\n // Disable buttons where the range exceeds what is allowed in the current view\n isTooGreatRange = range > dataMax - dataMin,\n // Disable buttons where the range is smaller than the minimum range\n isTooSmallRange = range < baseAxis.minRange,\n // Disable the All button if we're already showing all\n isAllButAlreadyShowingAll = rangeOptions.type === 'all' && baseAxis.max - baseAxis.min >= dataMax - dataMin &&\n buttons[i].state !== 2,\n // Disable the YTD button if the complete range is within the same year\n isYTDButNotAvailable = rangeOptions.type === 'ytd' && dateFormat('%Y', dataMin) === dateFormat('%Y', dataMax),\n // Set a button on export\n isSelectedForExport = chart.renderer.forExport && i === selected,\n\n isSameRange = range === actualRange,\n\n hasNoData = !baseAxis.hasVisibleSeries;\n\n // Months and years have a variable range so we check the extremes\n if ((type === 'month' || type === 'year') && (actualRange >= { month: 28, year: 365 }[type] * 24 * 36e5 * count) &&\n (actualRange <= { month: 31, year: 366 }[type] * 24 * 36e5 * count)) {\n isSameRange = true;\n }\n // The new zoom area happens to match the range for a button - mark it selected.\n // This happens when scrolling across an ordinal gap. It can be seen in the intraday\n // demos when selecting 1h and scroll across the night gap.\n if (isSelectedForExport || (isSameRange && i !== selected) && i === rangeSelector.lastSelected) {\n rangeSelector.setSelected(i);\n buttons[i].setState(2);\n\n } else if (!allButtonsEnabled && (isTooGreatRange || isTooSmallRange || isAllButAlreadyShowingAll || isYTDButNotAvailable || hasNoData)) {\n buttons[i].setState(3);\n\n } else if (buttons[i].state === 3) {\n buttons[i].setState(0);\n }\n });\n },\n\n /**\n * Compute and cache the range for an individual button\n */\n computeButtonRange: function (rangeOptions) {\n var type = rangeOptions.type,\n count = rangeOptions.count || 1,\n\n // these time intervals have a fixed number of milliseconds, as opposed\n // to month, ytd and year\n fixedTimes = {\n millisecond: 1,\n second: 1000,\n minute: 60 * 1000,\n hour: 3600 * 1000,\n day: 24 * 3600 * 1000,\n week: 7 * 24 * 3600 * 1000\n };\n\n // Store the range on the button object\n if (fixedTimes[type]) {\n rangeOptions._range = fixedTimes[type] * count;\n } else if (type === 'month' || type === 'year') {\n rangeOptions._range = { month: 30, year: 365 }[type] * 24 * 36e5 * count;\n }\n },\n\n /**\n * Set the internal and displayed value of a HTML input for the dates\n * @param {String} name\n * @param {Number} time\n */\n setInputValue: function (name, time) {\n var options = this.chart.options.rangeSelector;\n\n if (defined(time)) {\n this[name + 'Input'].HCTime = time;\n }\n\n this[name + 'Input'].value = dateFormat(\n options.inputEditDateFormat || '%Y-%m-%d',\n this[name + 'Input'].HCTime\n );\n this[name + 'DateBox'].attr({\n text: dateFormat(options.inputDateFormat || '%b %e, %Y', this[name + 'Input'].HCTime)\n });\n },\n\n showInput: function (name) {\n var inputGroup = this.inputGroup,\n dateBox = this[name + 'DateBox'];\n\n css(this[name + 'Input'], {\n left: (inputGroup.translateX + dateBox.x) + PX,\n top: inputGroup.translateY + PX,\n width: (dateBox.width - 2) + PX,\n height: (dateBox.height - 2) + PX,\n border: '2px solid silver'\n });\n },\n\n hideInput: function (name) {\n css(this[name + 'Input'], {\n border: 0,\n width: '1px',\n height: '1px'\n });\n this.setInputValue(name);\n },\n\n /**\n * Draw either the 'from' or the 'to' HTML input box of the range selector\n * @param {Object} name\n */\n drawInput: function (name) {\n var rangeSelector = this,\n chart = rangeSelector.chart,\n chartStyle = chart.renderer.style,\n renderer = chart.renderer,\n options = chart.options.rangeSelector,\n lang = defaultOptions.lang,\n div = rangeSelector.div,\n isMin = name === 'min',\n input,\n label,\n dateBox,\n inputGroup = this.inputGroup;\n\n function updateExtremes() {\n var inputValue = input.value,\n value = (options.inputDateParser || Date.parse)(inputValue),\n xAxis = chart.xAxis[0],\n dataMin = xAxis.dataMin,\n dataMax = xAxis.dataMax;\n if (value !== input.previousValue) {\n input.previousValue = value;\n // If the value isn't parsed directly to a value by the browser's Date.parse method,\n // like YYYY-MM-DD in IE, try parsing it a different way\n if (!isNumber(value)) {\n value = inputValue.split('-');\n value = Date.UTC(pInt(value[0]), pInt(value[1]) - 1, pInt(value[2]));\n }\n\n if (isNumber(value)) {\n\n // Correct for timezone offset (#433)\n if (!defaultOptions.global.useUTC) {\n value = value + new Date().getTimezoneOffset() * 60 * 1000;\n }\n\n // Validate the extremes. If it goes beyound the data min or max, use the\n // actual data extreme (#2438).\n if (isMin) {\n if (value > rangeSelector.maxInput.HCTime) {\n value = UNDEFINED;\n } else if (value < dataMin) {\n value = dataMin;\n }\n } else {\n if (value < rangeSelector.minInput.HCTime) {\n value = UNDEFINED;\n } else if (value > dataMax) {\n value = dataMax;\n }\n }\n\n // Set the extremes\n if (value !== UNDEFINED) {\n chart.xAxis[0].setExtremes(\n isMin ? value : xAxis.min,\n isMin ? xAxis.max : value,\n UNDEFINED,\n UNDEFINED,\n { trigger: 'rangeSelectorInput' }\n );\n }\n }\n }\n }\n\n // Create the text label\n this[name + 'Label'] = label = renderer.label(lang[isMin ? 'rangeSelectorFrom' : 'rangeSelectorTo'], this.inputGroup.offset)\n .attr({\n padding: 2\n })\n .css(merge(chartStyle, options.labelStyle))\n .add(inputGroup);\n inputGroup.offset += label.width + 5;\n\n // Create an SVG label that shows updated date ranges and and records click events that\n // bring in the HTML input.\n this[name + 'DateBox'] = dateBox = renderer.label('', inputGroup.offset)\n .attr({\n padding: 2,\n width: options.inputBoxWidth || 90,\n height: options.inputBoxHeight || 17,\n stroke: options.inputBoxBorderColor || 'silver',\n 'stroke-width': 1\n })\n .css(merge({\n textAlign: 'center',\n color: '#444'\n }, chartStyle, options.inputStyle))\n .on('click', function () {\n rangeSelector.showInput(name); // If it is already focused, the onfocus event doesn't fire (#3713)\n rangeSelector[name + 'Input'].focus();\n })\n .add(inputGroup);\n inputGroup.offset += dateBox.width + (isMin ? 10 : 0);\n\n\n // Create the HTML input element. This is rendered as 1x1 pixel then set to the right size\n // when focused.\n this[name + 'Input'] = input = createElement('input', {\n name: name,\n className: PREFIX + 'range-selector',\n type: 'text'\n }, extend({\n position: ABSOLUTE,\n border: 0,\n width: '1px', // Chrome needs a pixel to see it\n height: '1px',\n padding: 0,\n textAlign: 'center',\n fontSize: chartStyle.fontSize,\n fontFamily: chartStyle.fontFamily,\n left: '-9em', // #4798\n top: chart.plotTop + PX // prevent jump on focus in Firefox\n }, options.inputStyle), div);\n\n // Blow up the input box\n input.onfocus = function () {\n rangeSelector.showInput(name);\n };\n // Hide away the input box\n input.onblur = function () {\n rangeSelector.hideInput(name);\n };\n\n // handle changes in the input boxes\n input.onchange = updateExtremes;\n\n input.onkeypress = function (event) {\n // IE does not fire onchange on enter\n if (event.keyCode === 13) {\n updateExtremes();\n }\n };\n },\n\n /**\n * Get the position of the range selector buttons and inputs. This can be overridden from outside for custom positioning.\n */\n getPosition: function () {\n var chart = this.chart,\n options = chart.options.rangeSelector,\n buttonTop = pick((options.buttonPosition || {}).y, chart.plotTop - chart.axisOffset[0] - options.height);\n\n return {\n buttonTop: buttonTop,\n inputTop: buttonTop - 10\n };\n },\n\n /**\n * Render the range selector including the buttons and the inputs. The first time render\n * is called, the elements are created and positioned. On subsequent calls, they are\n * moved and updated.\n * @param {Number} min X axis minimum\n * @param {Number} max X axis maximum\n */\n render: function (min, max) {\n\n var rangeSelector = this,\n chart = rangeSelector.chart,\n renderer = chart.renderer,\n container = chart.container,\n chartOptions = chart.options,\n navButtonOptions = chartOptions.exporting && chartOptions.exporting.enabled !== false &&\n chartOptions.navigation && chartOptions.navigation.buttonOptions,\n options = chartOptions.rangeSelector,\n buttons = rangeSelector.buttons,\n lang = defaultOptions.lang,\n div = rangeSelector.div,\n inputGroup = rangeSelector.inputGroup,\n buttonTheme = options.buttonTheme,\n buttonPosition = options.buttonPosition || {},\n inputEnabled = options.inputEnabled,\n states = buttonTheme && buttonTheme.states,\n plotLeft = chart.plotLeft,\n buttonLeft,\n pos = this.getPosition(),\n buttonGroup = rangeSelector.group,\n buttonBBox,\n rendered = rangeSelector.rendered;\n\n\n // create the elements\n if (!rendered) {\n\n rangeSelector.group = buttonGroup = renderer.g('range-selector-buttons').add();\n\n rangeSelector.zoomText = renderer.text(lang.rangeSelectorZoom, pick(buttonPosition.x, plotLeft), 15)\n .css(options.labelStyle)\n .add(buttonGroup);\n\n // button starting position\n buttonLeft = pick(buttonPosition.x, plotLeft) + rangeSelector.zoomText.getBBox().width + 5;\n\n each(rangeSelector.buttonOptions, function (rangeOptions, i) {\n buttons[i] = renderer.button(\n rangeOptions.text,\n buttonLeft,\n 0,\n function () {\n rangeSelector.clickButton(i);\n rangeSelector.isActive = true;\n },\n buttonTheme,\n states && states.hover,\n states && states.select,\n states && states.disabled\n )\n .css({\n textAlign: 'center'\n })\n .add(buttonGroup);\n\n // increase button position for the next button\n buttonLeft += buttons[i].width + pick(options.buttonSpacing, 5);\n\n if (rangeSelector.selected === i) {\n buttons[i].setState(2);\n }\n });\n\n rangeSelector.updateButtonStates();\n\n // first create a wrapper outside the container in order to make\n // the inputs work and make export correct\n if (inputEnabled !== false) {\n rangeSelector.div = div = createElement('div', null, {\n position: 'relative',\n height: 0,\n zIndex: 1 // above container\n });\n\n container.parentNode.insertBefore(div, container);\n\n // Create the group to keep the inputs\n rangeSelector.inputGroup = inputGroup = renderer.g('input-group')\n .add();\n inputGroup.offset = 0;\n\n rangeSelector.drawInput('min');\n rangeSelector.drawInput('max');\n }\n }\n\n // Set or update the group position\n buttonGroup[rendered ? 'animate' : 'attr']({\n translateY: pos.buttonTop\n });\n\n if (inputEnabled !== false) {\n\n // Update the alignment to the updated spacing box\n inputGroup.align(extend({\n y: pos.inputTop,\n width: inputGroup.offset,\n // Detect collision with the exporting buttons\n x: navButtonOptions && (pos.inputTop < (navButtonOptions.y || 0) + navButtonOptions.height - chart.spacing[0]) ?\n -40 : 0\n }, options.inputPosition), true, chart.spacingBox);\n\n // Hide if overlapping - inputEnabled is null or undefined\n if (!defined(inputEnabled)) {\n buttonBBox = buttonGroup.getBBox();\n inputGroup[inputGroup.translateX < buttonBBox.x + buttonBBox.width + 10 ? 'hide' : 'show']();\n }\n\n // Set or reset the input values\n rangeSelector.setInputValue('min', min);\n rangeSelector.setInputValue('max', max);\n }\n\n rangeSelector.rendered = true;\n },\n\n /**\n * Destroys allocated elements.\n */\n destroy: function () {\n var minInput = this.minInput,\n maxInput = this.maxInput,\n chart = this.chart,\n blurInputs = this.blurInputs,\n key;\n\n removeEvent(chart.container, 'mousedown', blurInputs);\n removeEvent(chart, 'resize', blurInputs);\n\n // Destroy elements in collections\n destroyObjectProperties(this.buttons);\n\n // Clear input element events\n if (minInput) {\n minInput.onfocus = minInput.onblur = minInput.onchange = null;\n }\n if (maxInput) {\n maxInput.onfocus = maxInput.onblur = maxInput.onchange = null;\n }\n\n // Destroy HTML and SVG elements\n for (key in this) {\n if (this[key] && key !== 'chart') {\n if (this[key].destroy) { // SVGElement\n this[key].destroy();\n } else if (this[key].nodeType) { // HTML element\n discardElement(this[key]);\n }\n }\n this[key] = null;\n }\n }\n };\n\n /**\n * Add logic to normalize the zoomed range in order to preserve the pressed state of range selector buttons\n */\n Axis.prototype.toFixedRange = function (pxMin, pxMax, fixedMin, fixedMax) {\n var fixedRange = this.chart && this.chart.fixedRange,\n newMin = pick(fixedMin, this.translate(pxMin, true)),\n newMax = pick(fixedMax, this.translate(pxMax, true)),\n changeRatio = fixedRange && (newMax - newMin) / fixedRange;\n\n // If the difference between the fixed range and the actual requested range is\n // too great, the user is dragging across an ordinal gap, and we need to release\n // the range selector button.\n if (changeRatio > 0.7 && changeRatio < 1.3) {\n if (fixedMax) {\n newMin = newMax - fixedRange;\n } else {\n newMax = newMin + fixedRange;\n }\n }\n if (!isNumber(newMin)) { // #1195\n newMin = newMax = undefined;\n }\n\n return {\n min: newMin,\n max: newMax\n };\n };\n\n Axis.prototype.minFromRange = function () {\n var rangeOptions = this.range,\n type = rangeOptions.type,\n timeName = { month: 'Month', year: 'FullYear' }[type],\n min,\n max = this.max,\n dataMin,\n range,\n // Get the true range from a start date\n getTrueRange = function (base, count) {\n var date = new Date(base);\n date['set' + timeName](date['get' + timeName]() + count);\n return date.getTime() - base;\n };\n\n if (isNumber(rangeOptions)) {\n min = this.max - rangeOptions;\n range = rangeOptions;\n } else {\n min = max + getTrueRange(max, -rangeOptions.count);\n }\n\n dataMin = pick(this.dataMin, Number.MIN_VALUE);\n if (!isNumber(min)) {\n min = dataMin;\n }\n if (min <= dataMin) {\n min = dataMin;\n if (range === undefined) { // #4501\n range = getTrueRange(min, rangeOptions.count);\n }\n this.newMax = mathMin(min + range, this.dataMax);\n }\n if (!isNumber(max)) {\n min = undefined;\n }\n return min;\n\n };\n\n // Initialize scroller for stock charts\n wrap(Chart.prototype, 'init', function (proceed, options, callback) {\n\n addEvent(this, 'init', function () {\n if (this.options.rangeSelector.enabled) {\n this.rangeSelector = new RangeSelector(this);\n }\n });\n\n proceed.call(this, options, callback);\n\n });\n\n\n Highcharts.RangeSelector = RangeSelector;\n\n /* ****************************************************************************\n * End Range Selector code *\n *****************************************************************************/\n\n\n\n Chart.prototype.callbacks.push(function (chart) {\n var extremes,\n scroller = chart.scroller,\n rangeSelector = chart.rangeSelector;\n\n function renderRangeSelector() {\n extremes = chart.xAxis[0].getExtremes();\n if (isNumber(extremes.min)) {\n rangeSelector.render(extremes.min, extremes.max);\n }\n }\n\n function afterSetExtremesHandlerRangeSelector(e) {\n rangeSelector.render(e.min, e.max);\n }\n\n function destroyEvents() {\n if (rangeSelector) {\n removeEvent(chart, 'resize', renderRangeSelector);\n removeEvent(chart.xAxis[0], 'afterSetExtremes', afterSetExtremesHandlerRangeSelector);\n }\n }\n\n // initiate the scroller\n if (scroller) {\n extremes = chart.xAxis[0].getExtremes();\n scroller.render(extremes.min, extremes.max);\n }\n if (rangeSelector) {\n // redraw the scroller on setExtremes\n addEvent(chart.xAxis[0], 'afterSetExtremes', afterSetExtremesHandlerRangeSelector);\n\n // redraw the scroller chart resize\n addEvent(chart, 'resize', renderRangeSelector);\n\n // do it now\n renderRangeSelector();\n }\n\n // Remove resize/afterSetExtremes at chart destroy\n addEvent(chart, 'destroy', destroyEvents);\n });\n /**\n * A wrapper for Chart with all the default values for a Stock chart\n */\n Highcharts.StockChart = Highcharts.stockChart = function (a, b, c) {\n var hasRenderToArg = isString(a) || a.nodeName,\n options = arguments[hasRenderToArg ? 1 : 0],\n seriesOptions = options.series, // to increase performance, don't merge the data\n opposite,\n\n // Always disable startOnTick:true on the main axis when the navigator is enabled (#1090)\n navigatorEnabled = pick(options.navigator && options.navigator.enabled, true),\n disableStartOnTick = navigatorEnabled ? {\n startOnTick: false,\n endOnTick: false\n } : null,\n\n lineOptions = {\n\n marker: {\n enabled: false,\n radius: 2\n }\n // gapSize: 0\n },\n columnOptions = {\n shadow: false,\n borderWidth: 0\n };\n\n // apply X axis options to both single and multi y axes\n options.xAxis = map(splat(options.xAxis || {}), function (xAxisOptions) {\n return merge(\n { // defaults\n minPadding: 0,\n maxPadding: 0,\n ordinal: true,\n title: {\n text: null\n },\n labels: {\n overflow: 'justify'\n },\n showLastLabel: true\n }, xAxisOptions, // user options\n { // forced options\n type: 'datetime',\n categories: null\n },\n disableStartOnTick\n );\n });\n\n // apply Y axis options to both single and multi y axes\n options.yAxis = map(splat(options.yAxis || {}), function (yAxisOptions) {\n opposite = pick(yAxisOptions.opposite, true);\n return merge({ // defaults\n labels: {\n y: -2\n },\n opposite: opposite,\n showLastLabel: false,\n title: {\n text: null\n }\n }, yAxisOptions // user options\n );\n });\n\n options.series = null;\n\n options = merge(\n {\n chart: {\n panning: true,\n pinchType: 'x'\n },\n navigator: {\n enabled: true\n },\n scrollbar: {\n enabled: true\n },\n rangeSelector: {\n enabled: true\n },\n title: {\n text: null,\n style: {\n fontSize: '16px'\n }\n },\n tooltip: {\n shared: true,\n crosshairs: true\n },\n legend: {\n enabled: false\n },\n\n plotOptions: {\n line: lineOptions,\n spline: lineOptions,\n area: lineOptions,\n areaspline: lineOptions,\n arearange: lineOptions,\n areasplinerange: lineOptions,\n column: columnOptions,\n columnrange: columnOptions,\n candlestick: columnOptions,\n ohlc: columnOptions\n }\n\n },\n options, // user's options\n\n { // forced options\n _stock: true, // internal flag\n chart: {\n inverted: false\n }\n }\n );\n\n options.series = seriesOptions;\n\n return hasRenderToArg ? \n new Chart(a, options, c) :\n new Chart(options, b);\n };\n\n // Implement the pinchType option\n wrap(Pointer.prototype, 'init', function (proceed, chart, options) {\n\n var pinchType = options.chart.pinchType || '';\n\n proceed.call(this, chart, options);\n\n // Pinch status\n this.pinchX = this.pinchHor = pinchType.indexOf('x') !== -1;\n this.pinchY = this.pinchVert = pinchType.indexOf('y') !== -1;\n this.hasZoom = this.hasZoom || this.pinchHor || this.pinchVert;\n });\n\n // Override the automatic label alignment so that the first Y axis' labels\n // are drawn on top of the grid line, and subsequent axes are drawn outside\n wrap(Axis.prototype, 'autoLabelAlign', function (proceed) {\n var chart = this.chart,\n options = this.options,\n panes = chart._labelPanes = chart._labelPanes || {},\n key,\n labelOptions = this.options.labels;\n if (this.chart.options._stock && this.coll === 'yAxis') {\n key = options.top + ',' + options.height;\n if (!panes[key] && labelOptions.enabled) { // do it only for the first Y axis of each pane\n if (labelOptions.x === 15) { // default\n labelOptions.x = 0;\n }\n if (labelOptions.align === undefined) {\n labelOptions.align = 'right';\n }\n panes[key] = 1;\n return 'right';\n }\n }\n return proceed.call(this, [].slice.call(arguments, 1));\n });\n\n // Override getPlotLinePath to allow for multipane charts\n wrap(Axis.prototype, 'getPlotLinePath', function (proceed, value, lineWidth, old, force, translatedValue) {\n var axis = this,\n series = (this.isLinked && !this.series ? this.linkedParent.series : this.series),\n chart = axis.chart,\n renderer = chart.renderer,\n axisLeft = axis.left,\n axisTop = axis.top,\n x1,\n y1,\n x2,\n y2,\n result = [],\n axes = [], //#3416 need a default array\n axes2,\n uniqueAxes,\n transVal;\n\n // Ignore in case of color Axis. #3360, #3524\n if (axis.coll === 'colorAxis') {\n return proceed.apply(this, [].slice.call(arguments, 1));\n }\n\n // Get the related axes based on series\n axes = (axis.isXAxis ?\n (defined(axis.options.yAxis) ?\n [chart.yAxis[axis.options.yAxis]] :\n map(series, function (s) {\n return s.yAxis;\n })\n ) :\n (defined(axis.options.xAxis) ?\n [chart.xAxis[axis.options.xAxis]] :\n map(series, function (s) {\n return s.xAxis;\n })\n )\n );\n\n // Get the related axes based options.*Axis setting #2810\n axes2 = (axis.isXAxis ? chart.yAxis : chart.xAxis);\n each(axes2, function (A) {\n if (defined(A.options.id) ? A.options.id.indexOf('navigator') === -1 : true) {\n var a = (A.isXAxis ? 'yAxis' : 'xAxis'),\n rax = (defined(A.options[a]) ? chart[a][A.options[a]] : chart[a][0]);\n\n if (axis === rax) {\n axes.push(A);\n }\n }\n });\n\n\n // Remove duplicates in the axes array. If there are no axes in the axes array,\n // we are adding an axis without data, so we need to populate this with grid\n // lines (#2796).\n uniqueAxes = axes.length ? [] : [axis.isXAxis ? chart.yAxis[0] : chart.xAxis[0]]; //#3742\n each(axes, function (axis2) {\n if (inArray(axis2, uniqueAxes) === -1) {\n uniqueAxes.push(axis2);\n }\n });\n\n transVal = pick(translatedValue, axis.translate(value, null, null, old));\n if (isNumber(transVal)) {\n if (axis.horiz) {\n each(uniqueAxes, function (axis2) {\n var skip;\n\n y1 = axis2.pos;\n y2 = y1 + axis2.len;\n x1 = x2 = mathRound(transVal + axis.transB);\n\n if (x1 < axisLeft || x1 > axisLeft + axis.width) { // outside plot area\n if (force) {\n x1 = x2 = mathMin(mathMax(axisLeft, x1), axisLeft + axis.width);\n } else {\n skip = true;\n }\n }\n if (!skip) {\n result.push('M', x1, y1, 'L', x2, y2);\n }\n });\n } else {\n each(uniqueAxes, function (axis2) {\n var skip;\n\n x1 = axis2.pos;\n x2 = x1 + axis2.len;\n y1 = y2 = mathRound(axisTop + axis.height - transVal);\n\n if (y1 < axisTop || y1 > axisTop + axis.height) { // outside plot area\n if (force) {\n y1 = y2 = mathMin(mathMax(axisTop, y1), axis.top + axis.height);\n } else {\n skip = true;\n }\n }\n if (!skip) {\n result.push('M', x1, y1, 'L', x2, y2);\n }\n });\n }\n }\n return result.length > 0 ?\n renderer.crispPolyLine(result, lineWidth || 1) :\n null; //#3557 getPlotLinePath in regular Highcharts also returns null\n });\n\n // Override getPlotBandPath to allow for multipane charts\n Axis.prototype.getPlotBandPath = function (from, to) {\n var toPath = this.getPlotLinePath(to, null, null, true),\n path = this.getPlotLinePath(from, null, null, true),\n result = [],\n i;\n\n if (path && toPath && path.toString() !== toPath.toString()) {\n // Go over each subpath\n for (i = 0; i < path.length; i += 6) {\n result.push('M', path[i + 1], path[i + 2], 'L', path[i + 4], path[i + 5], toPath[i + 4], toPath[i + 5], toPath[i + 1], toPath[i + 2]);\n }\n } else { // outside the axis area\n result = null;\n }\n\n return result;\n };\n\n // Function to crisp a line with multiple segments\n SVGRenderer.prototype.crispPolyLine = function (points, width) {\n // points format: [M, 0, 0, L, 100, 0]\n // normalize to a crisp line\n var i;\n for (i = 0; i < points.length; i = i + 6) {\n if (points[i + 1] === points[i + 4]) {\n // Substract due to #1129. Now bottom and left axis gridlines behave the same.\n points[i + 1] = points[i + 4] = mathRound(points[i + 1]) - (width % 2 / 2);\n }\n if (points[i + 2] === points[i + 5]) {\n points[i + 2] = points[i + 5] = mathRound(points[i + 2]) + (width % 2 / 2);\n }\n }\n return points;\n };\n if (Renderer === Highcharts.VMLRenderer) {\n VMLRenderer.prototype.crispPolyLine = SVGRenderer.prototype.crispPolyLine;\n }\n\n\n // Wrapper to hide the label\n wrap(Axis.prototype, 'hideCrosshair', function (proceed, i) {\n proceed.call(this, i);\n\n if (this.crossLabel) {\n this.crossLabel = this.crossLabel.hide();\n }\n });\n\n // Wrapper to draw the label\n wrap(Axis.prototype, 'drawCrosshair', function (proceed, e, point) {\n // Draw the crosshair\n proceed.call(this, e, point);\n\n // Check if the label has to be drawn\n if (!defined(this.crosshair.label) || !this.crosshair.label.enabled || !this.cross) {\n return;\n }\n\n var chart = this.chart,\n options = this.options.crosshair.label, // the label's options\n horiz = this.horiz, // axis orientation\n opposite = this.opposite, // axis position\n left = this.left, // left position\n top = this.top, // top position\n crossLabel = this.crossLabel, // reference to the svgElement\n posx,\n posy,\n crossBox,\n formatOption = options.format,\n formatFormat = '',\n limit,\n align,\n tickInside = this.options.tickPosition === 'inside',\n snap = this.crosshair.snap !== false,\n value;\n\n // Use last available event (#5287)\n if (!e) {\n e = this.cross && this.cross.e;\n }\n\n align = (horiz ? 'center' : opposite ? (this.labelAlign === 'right' ? 'right' : 'left') : (this.labelAlign === 'left' ? 'left' : 'center'));\n\n // If the label does not exist yet, create it.\n if (!crossLabel) {\n crossLabel = this.crossLabel = chart.renderer.label(null, null, null, options.shape || 'callout')\n .attr({\n align: options.align || align,\n zIndex: 12,\n fill: options.backgroundColor || (this.series[0] && this.series[0].color) || 'gray',\n padding: pick(options.padding, 8),\n stroke: options.borderColor || '',\n 'stroke-width': options.borderWidth || 0,\n r: pick(options.borderRadius, 3)\n })\n .css(extend({\n color: 'white',\n fontWeight: 'normal',\n fontSize: '11px',\n textAlign: 'center'\n }, options.style))\n .add();\n }\n\n if (horiz) {\n posx = snap ? point.plotX + left : e.chartX;\n posy = top + (opposite ? 0 : this.height);\n } else {\n posx = opposite ? this.width + left : 0;\n posy = snap ? point.plotY + top : e.chartY;\n }\n\n if (!formatOption && !options.formatter) {\n if (this.isDatetimeAxis) {\n formatFormat = '%b %d, %Y';\n }\n formatOption = '{value' + (formatFormat ? ':' + formatFormat : '') + '}';\n }\n\n // Show the label\n value = snap ? point[this.isXAxis ? 'x' : 'y'] : this.toValue(horiz ? e.chartX : e.chartY);\n crossLabel.attr({\n text: formatOption ? format(formatOption, { value: value }) : options.formatter.call(this, value),\n anchorX: horiz ? posx : (this.opposite ? 0 : chart.chartWidth),\n anchorY: horiz ? (this.opposite ? chart.chartHeight : 0) : posy,\n x: posx,\n y: posy,\n visibility: VISIBLE\n });\n crossBox = crossLabel.getBBox();\n\n // now it is placed we can correct its position\n if (horiz) {\n if ((tickInside && !opposite) || (!tickInside && opposite)) {\n posy = crossLabel.y - crossBox.height;\n }\n } else {\n posy = crossLabel.y - (crossBox.height / 2);\n }\n\n // check the edges\n if (horiz) {\n limit = {\n left: left - crossBox.x,\n right: left + this.width - crossBox.x\n };\n } else {\n limit = {\n left: this.labelAlign === 'left' ? left : 0,\n right: this.labelAlign === 'right' ? left + this.width : chart.chartWidth\n };\n }\n\n // left edge\n if (crossLabel.translateX < limit.left) {\n posx += limit.left - crossLabel.translateX;\n }\n // right edge\n if (crossLabel.translateX + crossBox.width >= limit.right) {\n posx -= crossLabel.translateX + crossBox.width - limit.right;\n }\n\n // show the crosslabel\n crossLabel.attr({ x: posx, y: posy, visibility: 'visible' });\n });\n\n /* ****************************************************************************\n * Start value compare logic *\n *****************************************************************************/\n\n var seriesInit = seriesProto.init,\n seriesProcessData = seriesProto.processData,\n pointTooltipFormatter = Point.prototype.tooltipFormatter;\n\n /**\n * Extend series.init by adding a method to modify the y value used for plotting\n * on the y axis. This method is called both from the axis when finding dataMin\n * and dataMax, and from the series.translate method.\n */\n seriesProto.init = function () {\n\n // Call base method\n seriesInit.apply(this, arguments);\n\n // Set comparison mode\n this.setCompare(this.options.compare);\n };\n\n /**\n * The setCompare method can be called also from the outside after render time\n */\n seriesProto.setCompare = function (compare) {\n\n // Set or unset the modifyValue method\n this.modifyValue = (compare === 'value' || compare === 'percent') ? function (value, point) {\n var compareValue = this.compareValue;\n\n if (value !== UNDEFINED) { // #2601\n\n // get the modified value\n value = compare === 'value' ?\n value - compareValue : // compare value\n value = 100 * (value / compareValue) - 100; // compare percent\n\n // record for tooltip etc.\n if (point) {\n point.change = value;\n }\n\n }\n\n return value;\n } : null;\n\n // Survive to export, #5485\n this.userOptions.compare = compare;\n\n // Mark dirty\n if (this.chart.hasRendered) {\n this.isDirty = true;\n }\n\n };\n\n /**\n * Extend series.processData by finding the first y value in the plot area,\n * used for comparing the following values\n */\n seriesProto.processData = function () {\n var series = this,\n i,\n keyIndex = -1,\n processedXData,\n processedYData,\n length,\n compareValue;\n\n // call base method\n seriesProcessData.apply(this, arguments);\n\n if (series.xAxis && series.processedYData) { // not pies\n\n // local variables\n processedXData = series.processedXData;\n processedYData = series.processedYData;\n length = processedYData.length;\n\n // For series with more than one value (range, OHLC etc), compare against\n // the pointValKey (#4922)\n if (series.pointArrayMap) {\n keyIndex = inArray(series.pointValKey || 'y', series.pointArrayMap);\n }\n\n // find the first value for comparison\n for (i = 0; i < length - 1; i++) {\n compareValue = keyIndex > -1 ? \n processedYData[i][keyIndex] :\n processedYData[i];\n if (isNumber(compareValue) && processedXData[i + 1] >= series.xAxis.min && compareValue !== 0) {\n series.compareValue = compareValue;\n break;\n }\n }\n }\n };\n\n /**\n * Modify series extremes\n */\n wrap(seriesProto, 'getExtremes', function (proceed) {\n var extremes;\n\n proceed.apply(this, [].slice.call(arguments, 1));\n\n if (this.modifyValue) {\n extremes = [this.modifyValue(this.dataMin), this.modifyValue(this.dataMax)];\n this.dataMin = arrayMin(extremes);\n this.dataMax = arrayMax(extremes);\n }\n });\n\n /**\n * Add a utility method, setCompare, to the Y axis\n */\n Axis.prototype.setCompare = function (compare, redraw) {\n if (!this.isXAxis) {\n each(this.series, function (series) {\n series.setCompare(compare);\n });\n if (pick(redraw, true)) {\n this.chart.redraw();\n }\n }\n };\n\n /**\n * Extend the tooltip formatter by adding support for the point.change variable\n * as well as the changeDecimals option\n */\n Point.prototype.tooltipFormatter = function (pointFormat) {\n var point = this;\n\n pointFormat = pointFormat.replace(\n '{point.change}',\n (point.change > 0 ? '+' : '') + Highcharts.numberFormat(point.change, pick(point.series.tooltipOptions.changeDecimals, 2))\n );\n\n return pointTooltipFormatter.apply(this, [pointFormat]);\n };\n\n /* ****************************************************************************\n * End value compare logic *\n *****************************************************************************/\n\n\n /**\n * Extend the Series prototype to create a separate series clip box. This is related\n * to using multiple panes, and a future pane logic should incorporate this feature (#2754).\n */\n wrap(Series.prototype, 'render', function (proceed) {\n // Only do this on stock charts (#2939), and only if the series type handles clipping\n // in the animate method (#2975).\n if (this.chart.options._stock && this.xAxis) {\n\n // First render, initial clip box\n if (!this.clipBox && this.animate) {\n this.clipBox = merge(this.chart.clipBox);\n this.clipBox.width = this.xAxis.len;\n this.clipBox.height = this.yAxis.len;\n\n // On redrawing, resizing etc, update the clip rectangle\n } else if (this.chart[this.sharedClipKey]) {\n stop(this.chart[this.sharedClipKey]); // #2998\n this.chart[this.sharedClipKey].attr({\n width: this.xAxis.len,\n height: this.yAxis.len\n });\n }\n }\n proceed.call(this);\n });\n\n // global variables\n extend(Highcharts, {\n\n // Constructors\n Color: Color,\n Point: Point,\n Tick: Tick,\n Renderer: Renderer,\n SVGElement: SVGElement,\n SVGRenderer: SVGRenderer,\n\n // Various\n arrayMin: arrayMin,\n arrayMax: arrayMax,\n charts: charts,\n correctFloat: correctFloat,\n dateFormat: dateFormat,\n error: error,\n format: format,\n pathAnim: pathAnim,\n getOptions: getOptions,\n hasBidiBug: hasBidiBug,\n isTouchDevice: isTouchDevice,\n setOptions: setOptions,\n addEvent: addEvent,\n removeEvent: removeEvent,\n createElement: createElement,\n discardElement: discardElement,\n css: css,\n each: each,\n map: map,\n merge: merge,\n splat: splat,\n stableSort: stableSort,\n extendClass: extendClass,\n pInt: pInt,\n svg: hasSVG,\n canvas: useCanVG,\n vml: !hasSVG && !useCanVG,\n product: PRODUCT,\n version: VERSION\n });\n \n return Highcharts;\n}));\n","/*!\n * tooltip 0.1.0 - 18th Dec 2013\n * https://github.com/darsain/tooltip\n *\n * Licensed under the MIT license.\n * http://opensource.org/licenses/MIT\n */\n;(function(){\n\n/**\n * Require the given path.\n *\n * @param {String} path\n * @return {Object} exports\n * @api public\n */\n\nfunction require(path, parent, orig) {\n var resolved = require.resolve(path);\n\n // lookup failed\n if (null == resolved) {\n orig = orig || path;\n parent = parent || 'root';\n var err = new Error('Failed to require \"' + orig + '\" from \"' + parent + '\"');\n err.path = orig;\n err.parent = parent;\n err.require = true;\n throw err;\n }\n\n var module = require.modules[resolved];\n\n // perform real require()\n // by invoking the module's\n // registered function\n if (!module._resolving && !module.exports) {\n var mod = {};\n mod.exports = {};\n mod.client = mod.component = true;\n module._resolving = true;\n module.call(this, mod.exports, require.relative(resolved), mod);\n delete module._resolving;\n module.exports = mod.exports;\n }\n\n return module.exports;\n}\n\n/**\n * Registered modules.\n */\n\nrequire.modules = {};\n\n/**\n * Registered aliases.\n */\n\nrequire.aliases = {};\n\n/**\n * Resolve `path`.\n *\n * Lookup:\n *\n * - PATH/index.js\n * - PATH.js\n * - PATH\n *\n * @param {String} path\n * @return {String} path or null\n * @api private\n */\n\nrequire.resolve = function(path) {\n if (path.charAt(0) === '/') path = path.slice(1);\n\n var paths = [\n path,\n path + '.js',\n path + '.json',\n path + '/index.js',\n path + '/index.json'\n ];\n\n for (var i = 0; i < paths.length; i++) {\n var path = paths[i];\n if (require.modules.hasOwnProperty(path)) return path;\n if (require.aliases.hasOwnProperty(path)) return require.aliases[path];\n }\n};\n\n/**\n * Normalize `path` relative to the current path.\n *\n * @param {String} curr\n * @param {String} path\n * @return {String}\n * @api private\n */\n\nrequire.normalize = function(curr, path) {\n var segs = [];\n\n if ('.' != path.charAt(0)) return path;\n\n curr = curr.split('/');\n path = path.split('/');\n\n for (var i = 0; i < path.length; ++i) {\n if ('..' == path[i]) {\n curr.pop();\n } else if ('.' != path[i] && '' != path[i]) {\n segs.push(path[i]);\n }\n }\n\n return curr.concat(segs).join('/');\n};\n\n/**\n * Register module at `path` with callback `definition`.\n *\n * @param {String} path\n * @param {Function} definition\n * @api private\n */\n\nrequire.register = function(path, definition) {\n require.modules[path] = definition;\n};\n\n/**\n * Alias a module definition.\n *\n * @param {String} from\n * @param {String} to\n * @api private\n */\n\nrequire.alias = function(from, to) {\n if (!require.modules.hasOwnProperty(from)) {\n throw new Error('Failed to alias \"' + from + '\", it does not exist');\n }\n require.aliases[to] = from;\n};\n\n/**\n * Return a require function relative to the `parent` path.\n *\n * @param {String} parent\n * @return {Function}\n * @api private\n */\n\nrequire.relative = function(parent) {\n var p = require.normalize(parent, '..');\n\n /**\n * lastIndexOf helper.\n */\n\n function lastIndexOf(arr, obj) {\n var i = arr.length;\n while (i--) {\n if (arr[i] === obj) return i;\n }\n return -1;\n }\n\n /**\n * The relative require() itself.\n */\n\n function localRequire(path) {\n var resolved = localRequire.resolve(path);\n return require(resolved, parent, path);\n }\n\n /**\n * Resolve relative to the parent.\n */\n\n localRequire.resolve = function(path) {\n var c = path.charAt(0);\n if ('/' == c) return path.slice(1);\n if ('.' == c) return require.normalize(p, path);\n\n // resolve deps by returning\n // the dep in the nearest \"deps\"\n // directory\n var segs = parent.split('/');\n var i = lastIndexOf(segs, 'deps') + 1;\n if (!i) i = 0;\n path = segs.slice(0, i + 1).join('/') + '/deps/' + path;\n return path;\n };\n\n /**\n * Check if module is defined at `path`.\n */\n\n localRequire.exists = function(path) {\n return require.modules.hasOwnProperty(localRequire.resolve(path));\n };\n\n return localRequire;\n};\nrequire.register(\"darsain-event/index.js\", Function(\"exports, require, module\",\n\"'use strict';\\n\\\n\\n\\\n/**\\n\\\n * Bind `el` event `type` to `fn`.\\n\\\n *\\n\\\n * @param {Element} el\\n\\\n * @param {String} type\\n\\\n * @param {Function} fn\\n\\\n * @param {Boolean} capture\\n\\\n *\\n\\\n * @return {Function}\\n\\\n */\\n\\\nexports.bind = window.addEventListener ? function (el, type, fn, capture) {\\n\\\n\\tel.addEventListener(type, fn, capture || false);\\n\\\n\\treturn fn;\\n\\\n} : function (el, type, fn) {\\n\\\n\\tvar fnid = type + fn;\\n\\\n\\tel[fnid] = el[fnid] || function () {\\n\\\n\\t\\tvar event = window.event;\\n\\\n\\t\\tevent.target = event.srcElement;\\n\\\n\\t\\tevent.preventDefault = function () {\\n\\\n\\t\\t\\tevent.returnValue = false;\\n\\\n\\t\\t};\\n\\\n\\t\\tevent.stopPropagation = function () {\\n\\\n\\t\\t\\tevent.cancelBubble = true;\\n\\\n\\t\\t};\\n\\\n\\t\\tfn.call(el, event);\\n\\\n\\t};\\n\\\n\\tel.attachEvent('on' + type, el[fnid]);\\n\\\n\\treturn fn;\\n\\\n};\\n\\\n\\n\\\n/**\\n\\\n * Unbind `el` event `type`'s callback `fn`.\\n\\\n *\\n\\\n * @param {Element} el\\n\\\n * @param {String} type\\n\\\n * @param {Function} fn\\n\\\n * @param {Boolean} capture\\n\\\n *\\n\\\n * @return {Function}\\n\\\n */\\n\\\nexports.unbind = window.removeEventListener ? function (el, type, fn, capture) {\\n\\\n\\tel.removeEventListener(type, fn, capture || false);\\n\\\n\\treturn fn;\\n\\\n} : function (el, type, fn) {\\n\\\n\\tvar fnid = type + fn;\\n\\\n\\tel.detachEvent('on' + type, el[fnid]);\\n\\\n\\ttry {\\n\\\n\\t\\tdelete el[fnid];\\n\\\n\\t} catch (err) {\\n\\\n\\t\\t// can't delete window object properties\\n\\\n\\t\\tel[fnid] = undefined;\\n\\\n\\t}\\n\\\n\\treturn fn;\\n\\\n};//# sourceURL=darsain-event/index.js\"\n));\nrequire.register(\"darsain-position/index.js\", Function(\"exports, require, module\",\n\"'use strict';\\n\\\n\\n\\\n/**\\n\\\n * Transport.\\n\\\n */\\n\\\nmodule.exports = position;\\n\\\n\\n\\\n/**\\n\\\n * Globals.\\n\\\n */\\n\\\nvar win = window;\\n\\\nvar doc = win.document;\\n\\\nvar docEl = doc.documentElement;\\n\\\n\\n\\\n/**\\n\\\n * Poor man's shallow object extend.\\n\\\n *\\n\\\n * @param {Object} a\\n\\\n * @param {Object} b\\n\\\n *\\n\\\n * @return {Object}\\n\\\n */\\n\\\nfunction extend(a, b) {\\n\\\n\\tfor (var key in b) {\\n\\\n\\t\\ta[key] = b[key];\\n\\\n\\t}\\n\\\n\\treturn a;\\n\\\n}\\n\\\n\\n\\\n/**\\n\\\n * Checks whether object is window.\\n\\\n *\\n\\\n * @param {Object} obj\\n\\\n *\\n\\\n * @return {Boolean}\\n\\\n */\\n\\\nfunction isWin(obj) {\\n\\\n\\treturn obj && obj.setInterval != null;\\n\\\n}\\n\\\n\\n\\\n/**\\n\\\n * Returns element's object with `left`, `top`, `bottom`, `right`, `width`, and `height`\\n\\\n * properties indicating the position and dimensions of element on a page.\\n\\\n *\\n\\\n * @param {Element} element\\n\\\n *\\n\\\n * @return {Object}\\n\\\n */\\n\\\nfunction position(element) {\\n\\\n\\tvar winTop = win.pageYOffset || docEl.scrollTop;\\n\\\n\\tvar winLeft = win.pageXOffset || docEl.scrollLeft;\\n\\\n\\tvar box = { left: 0, right: 0, top: 0, bottom: 0, width: 0, height: 0 };\\n\\\n\\n\\\n\\tif (isWin(element)) {\\n\\\n\\t\\tbox.width = win.innerWidth || docEl.clientWidth;\\n\\\n\\t\\tbox.height = win.innerHeight || docEl.clientHeight;\\n\\\n\\t} else if (docEl.contains(element) && element.getBoundingClientRect != null) {\\n\\\n\\t\\textend(box, element.getBoundingClientRect());\\n\\\n\\t\\t// width & height don't exist in = winPos.bottom) {\\n\\\n\\t\\t\\tplace[0] = 'top';\\n\\\n\\t\\t}\\n\\\n\\t\\tswitch (place[1]) {\\n\\\n\\t\\t\\tcase 'left':\\n\\\n\\t\\t\\t\\tif (target.right - this.width <= winPos.left) {\\n\\\n\\t\\t\\t\\t\\tplace[1] = 'right';\\n\\\n\\t\\t\\t\\t}\\n\\\n\\t\\t\\t\\tbreak;\\n\\\n\\t\\t\\tcase 'right':\\n\\\n\\t\\t\\t\\tif (target.left + this.width >= winPos.right) {\\n\\\n\\t\\t\\t\\t\\tplace[1] = 'left';\\n\\\n\\t\\t\\t\\t}\\n\\\n\\t\\t\\t\\tbreak;\\n\\\n\\t\\t\\tdefault:\\n\\\n\\t\\t\\t\\tif (target.left + target.width / 2 + this.width / 2 >= winPos.right) {\\n\\\n\\t\\t\\t\\t\\tplace[1] = 'left';\\n\\\n\\t\\t\\t\\t} else if (target.right - target.width / 2 - this.width / 2 <= winPos.left) {\\n\\\n\\t\\t\\t\\t\\tplace[1] = 'right';\\n\\\n\\t\\t\\t\\t}\\n\\\n\\t\\t}\\n\\\n\\t} else {\\n\\\n\\t\\tif (target.left - this.width - spacing <= winPos.left) {\\n\\\n\\t\\t\\tplace[0] = 'right';\\n\\\n\\t\\t} else if (target.right + this.width + spacing >= winPos.right) {\\n\\\n\\t\\t\\tplace[0] = 'left';\\n\\\n\\t\\t}\\n\\\n\\t\\tswitch (place[1]) {\\n\\\n\\t\\t\\tcase 'top':\\n\\\n\\t\\t\\t\\tif (target.bottom - this.height <= winPos.top) {\\n\\\n\\t\\t\\t\\t\\tplace[1] = 'bottom';\\n\\\n\\t\\t\\t\\t}\\n\\\n\\t\\t\\t\\tbreak;\\n\\\n\\t\\t\\tcase 'bottom':\\n\\\n\\t\\t\\t\\tif (target.top + this.height >= winPos.bottom) {\\n\\\n\\t\\t\\t\\t\\tplace[1] = 'top';\\n\\\n\\t\\t\\t\\t}\\n\\\n\\t\\t\\t\\tbreak;\\n\\\n\\t\\t\\tdefault:\\n\\\n\\t\\t\\t\\tif (target.top + target.height / 2 + this.height / 2 >= winPos.bottom) {\\n\\\n\\t\\t\\t\\t\\tplace[1] = 'top';\\n\\\n\\t\\t\\t\\t} else if (target.bottom - target.height / 2 - this.height / 2 <= winPos.top) {\\n\\\n\\t\\t\\t\\t\\tplace[1] = 'bottom';\\n\\\n\\t\\t\\t\\t}\\n\\\n\\t\\t}\\n\\\n\\t}\\n\\\n\\n\\\n\\treturn place.join('-');\\n\\\n};\\n\\\n\\n\\\n/**\\n\\\n * Position the element to an element or a specific coordinates.\\n\\\n *\\n\\\n * @param {Integer|Element} x\\n\\\n * @param {Integer} y\\n\\\n *\\n\\\n * @return {Tooltip}\\n\\\n */\\n\\\nTooltip.prototype.position = function (x, y) {\\n\\\n\\tif (this.attachedTo) {\\n\\\n\\t\\tx = this.attachedTo;\\n\\\n\\t}\\n\\\n\\tif (x == null && this._p) {\\n\\\n\\t\\tx = this._p[0];\\n\\\n\\t\\ty = this._p[1];\\n\\\n\\t} else {\\n\\\n\\t\\tthis._p = arguments;\\n\\\n\\t}\\n\\\n\\tvar target = typeof x === 'number' ? {\\n\\\n\\t\\tleft: 0|x,\\n\\\n\\t\\tright: 0|x,\\n\\\n\\t\\ttop: 0|y,\\n\\\n\\t\\tbottom: 0|y,\\n\\\n\\t\\twidth: 0,\\n\\\n\\t\\theight: 0\\n\\\n\\t} : position(x);\\n\\\n\\tvar spacing = this.spacing;\\n\\\n\\tvar newPlace = this._pickPlace(target);\\n\\\n\\n\\\n\\t// Add/Change place class when necessary\\n\\\n\\tif (newPlace !== this.curPlace) {\\n\\\n\\t\\tif (this.curPlace) {\\n\\\n\\t\\t\\tthis.classes.remove(this.curPlace);\\n\\\n\\t\\t}\\n\\\n\\t\\tthis.classes.add(newPlace);\\n\\\n\\t\\tthis.curPlace = newPlace;\\n\\\n\\t}\\n\\\n\\n\\\n\\t// Position the tip\\n\\\n\\tvar top, left;\\n\\\n\\tswitch (this.curPlace) {\\n\\\n\\t\\tcase 'top':\\n\\\n\\t\\t\\ttop = target.top - this.height - spacing;\\n\\\n\\t\\t\\tleft = target.left + target.width / 2 - this.width / 2;\\n\\\n\\t\\t\\tbreak;\\n\\\n\\t\\tcase 'top-left':\\n\\\n\\t\\t\\ttop = target.top - this.height - spacing;\\n\\\n\\t\\t\\tleft = target.right - this.width;\\n\\\n\\t\\t\\tbreak;\\n\\\n\\t\\tcase 'top-right':\\n\\\n\\t\\t\\ttop = target.top - this.height - spacing;\\n\\\n\\t\\t\\tleft = target.left;\\n\\\n\\t\\t\\tbreak;\\n\\\n\\n\\\n\\t\\tcase 'bottom':\\n\\\n\\t\\t\\ttop = target.bottom + spacing;\\n\\\n\\t\\t\\tleft = target.left + target.width / 2 - this.width / 2;\\n\\\n\\t\\t\\tbreak;\\n\\\n\\t\\tcase 'bottom-left':\\n\\\n\\t\\t\\ttop = target.bottom + spacing;\\n\\\n\\t\\t\\tleft = target.right - this.width;\\n\\\n\\t\\t\\tbreak;\\n\\\n\\t\\tcase 'bottom-right':\\n\\\n\\t\\t\\ttop = target.bottom + spacing;\\n\\\n\\t\\t\\tleft = target.left;\\n\\\n\\t\\t\\tbreak;\\n\\\n\\n\\\n\\t\\tcase 'left':\\n\\\n\\t\\t\\ttop = target.top + target.height / 2 - this.height / 2;\\n\\\n\\t\\t\\tleft = target.left - this.width - spacing;\\n\\\n\\t\\t\\tbreak;\\n\\\n\\t\\tcase 'left-top':\\n\\\n\\t\\t\\ttop = target.bottom - this.height;\\n\\\n\\t\\t\\tleft = target.left - this.width - spacing;\\n\\\n\\t\\t\\tbreak;\\n\\\n\\t\\tcase 'left-bottom':\\n\\\n\\t\\t\\ttop = target.top;\\n\\\n\\t\\t\\tleft = target.left - this.width - spacing;\\n\\\n\\t\\t\\tbreak;\\n\\\n\\n\\\n\\t\\tcase 'right':\\n\\\n\\t\\t\\ttop = target.top + target.height / 2 - this.height / 2;\\n\\\n\\t\\t\\tleft = target.right + spacing;\\n\\\n\\t\\t\\tbreak;\\n\\\n\\t\\tcase 'right-top':\\n\\\n\\t\\t\\ttop = target.bottom - this.height;\\n\\\n\\t\\t\\tleft = target.right + spacing;\\n\\\n\\t\\t\\tbreak;\\n\\\n\\t\\tcase 'right-bottom':\\n\\\n\\t\\t\\ttop = target.top;\\n\\\n\\t\\t\\tleft = target.right + spacing;\\n\\\n\\t\\t\\tbreak;\\n\\\n\\t}\\n\\\n\\n\\\n\\t// Set tip position & class\\n\\\n\\tthis.element.style.top = Math.round(top) + 'px';\\n\\\n\\tthis.element.style.left = Math.round(left) + 'px';\\n\\\n\\n\\\n\\treturn this;\\n\\\n};\\n\\\n\\n\\\n/**\\n\\\n * Show the tooltip.\\n\\\n *\\n\\\n * @param {Integer|Element} x\\n\\\n * @param {Integer} y\\n\\\n *\\n\\\n * @return {Tooltip}\\n\\\n */\\n\\\nTooltip.prototype.show = function (x, y) {\\n\\\n\\tx = this.attachedTo ? this.attachedTo : x;\\n\\\n\\n\\\n\\t// Clear potential ongoing animation\\n\\\n\\tclearTimeout(this.aIndex);\\n\\\n\\n\\\n\\t// Position the element when requested\\n\\\n\\tif (x != null) {\\n\\\n\\t\\tthis.position(x, y);\\n\\\n\\t}\\n\\\n\\n\\\n\\t// Stop here if tip is already visible\\n\\\n\\tif (this.hidden) {\\n\\\n\\t\\tthis.hidden = 0;\\n\\\n\\t\\tbody.appendChild(this.element);\\n\\\n\\t}\\n\\\n\\n\\\n\\t// Make tooltip aware of window resize\\n\\\n\\tif (this.attachedTo) {\\n\\\n\\t\\tthis._aware();\\n\\\n\\t}\\n\\\n\\n\\\n\\t// Trigger layout and kick in the transition\\n\\\n\\tif (this.options.inClass) {\\n\\\n\\t\\tif (this.options.effectClass) {\\n\\\n\\t\\t\\tvoid this.element.clientHeight;\\n\\\n\\t\\t}\\n\\\n\\t\\tthis.classes.add(this.options.inClass);\\n\\\n\\t}\\n\\\n\\n\\\n\\treturn this;\\n\\\n};\\n\\\n\\n\\\n/**\\n\\\n * Hide the tooltip.\\n\\\n *\\n\\\n * @return {Tooltip}\\n\\\n */\\n\\\nTooltip.prototype.hide = function () {\\n\\\n\\tif (this.hidden) {\\n\\\n\\t\\treturn;\\n\\\n\\t}\\n\\\n\\n\\\n\\tvar self = this;\\n\\\n\\tvar duration = 0;\\n\\\n\\n\\\n\\t// Remove .in class and calculate transition duration if any\\n\\\n\\tif (this.options.inClass) {\\n\\\n\\t\\tthis.classes.remove(this.options.inClass);\\n\\\n\\t\\tif (this.options.effectClass) {\\n\\\n\\t\\t\\tduration = transitionDuration(this.element);\\n\\\n\\t\\t}\\n\\\n\\t}\\n\\\n\\n\\\n\\t// Remove tip from window resize awareness\\n\\\n\\tif (this.attachedTo) {\\n\\\n\\t\\tthis._unaware();\\n\\\n\\t}\\n\\\n\\n\\\n\\t// Remove the tip from the DOM when transition is done\\n\\\n\\tclearTimeout(this.aIndex);\\n\\\n\\tthis.aIndex = setTimeout(function () {\\n\\\n\\t\\tself.aIndex = 0;\\n\\\n\\t\\tbody.removeChild(self.element);\\n\\\n\\t\\tself.hidden = 1;\\n\\\n\\t}, duration);\\n\\\n\\n\\\n\\treturn this;\\n\\\n};\\n\\\n\\n\\\nTooltip.prototype.toggle = function (x, y) {\\n\\\n\\treturn this[this.hidden ? 'show' : 'hide'](x, y);\\n\\\n};\\n\\\n\\n\\\nTooltip.prototype.destroy = function () {\\n\\\n\\tclearTimeout(this.aIndex);\\n\\\n\\tthis._unaware();\\n\\\n\\tif (!this.hidden) {\\n\\\n\\t\\tbody.removeChild(this.element);\\n\\\n\\t}\\n\\\n\\tthis.element = this.options = null;\\n\\\n};\\n\\\n\\n\\\n/**\\n\\\n * Make the tip window resize aware.\\n\\\n *\\n\\\n * @return {Void}\\n\\\n */\\n\\\nTooltip.prototype._aware = function () {\\n\\\n\\tvar index = indexOf(Tooltip.winAware, this);\\n\\\n\\tif (!~index) {\\n\\\n\\t\\tTooltip.winAware.push(this);\\n\\\n\\t}\\n\\\n};\\n\\\n\\n\\\n/**\\n\\\n * Remove the window resize awareness.\\n\\\n *\\n\\\n * @return {Void}\\n\\\n */\\n\\\nTooltip.prototype._unaware = function () {\\n\\\n\\tvar index = indexOf(Tooltip.winAware, this);\\n\\\n\\tif (~index) {\\n\\\n\\t\\tTooltip.winAware.splice(index, 1);\\n\\\n\\t}\\n\\\n};\\n\\\n\\n\\\n/**\\n\\\n * Handles repositioning of tooltips on window resize.\\n\\\n *\\n\\\n * @return {Void}\\n\\\n */\\n\\\nTooltip.reposition = (function () {\\n\\\n\\tvar rAF = window.requestAnimationFrame || window.webkitRequestAnimationFrame || function (fn) {\\n\\\n\\t\\treturn setTimeout(fn, 17);\\n\\\n\\t};\\n\\\n\\tvar rIndex;\\n\\\n\\n\\\n\\tfunction requestReposition() {\\n\\\n\\t\\tif (rIndex || !Tooltip.winAware.length) {\\n\\\n\\t\\t\\treturn;\\n\\\n\\t\\t}\\n\\\n\\t\\trIndex = rAF(reposition, 17);\\n\\\n\\t}\\n\\\n\\n\\\n\\tfunction reposition() {\\n\\\n\\t\\trIndex = 0;\\n\\\n\\t\\tvar tip;\\n\\\n\\t\\tfor (var i = 0, l = Tooltip.winAware.length; i < l; i++) {\\n\\\n\\t\\t\\ttip = Tooltip.winAware[i];\\n\\\n\\t\\t\\ttip.position();\\n\\\n\\t\\t}\\n\\\n\\t}\\n\\\n\\n\\\n\\treturn requestReposition;\\n\\\n}());\\n\\\nTooltip.winAware = [];\\n\\\n\\n\\\n// Bind winAware repositioning to window resize event\\n\\\nevt.bind(window, 'resize', Tooltip.reposition);\\n\\\nevt.bind(window, 'scroll', Tooltip.reposition);\\n\\\n\\n\\\n/**\\n\\\n * Array with dynamic class types.\\n\\\n *\\n\\\n * @type {Array}\\n\\\n */\\n\\\nTooltip.classTypes = ['type', 'effect'];\\n\\\n\\n\\\n/**\\n\\\n * Default options for Tooltip constructor.\\n\\\n *\\n\\\n * @type {Object}\\n\\\n */\\n\\\nTooltip.defaults = {\\n\\\n\\tbaseClass: 'tooltip', // Base tooltip class name.\\n\\\n\\ttypeClass: null, // Type tooltip class name.\\n\\\n\\teffectClass: null, // Effect tooltip class name.\\n\\\n\\tinClass: 'in', // Class used to transition stuff in.\\n\\\n\\tplace: 'top', // Default place.\\n\\\n\\tspacing: null, // Gap between target and tooltip.\\n\\\n\\tauto: 0 // Whether to automatically adjust place to fit into window.\\n\\\n};//# sourceURL=tooltip/index.js\"\n));\n\n\n\n\n\n\n\n\nrequire.alias(\"darsain-event/index.js\", \"tooltip/deps/event/index.js\");\nrequire.alias(\"darsain-event/index.js\", \"event/index.js\");\n\nrequire.alias(\"darsain-position/index.js\", \"tooltip/deps/position/index.js\");\nrequire.alias(\"darsain-position/index.js\", \"position/index.js\");\n\nrequire.alias(\"component-classes/index.js\", \"tooltip/deps/classes/index.js\");\nrequire.alias(\"component-classes/index.js\", \"classes/index.js\");\nrequire.alias(\"component-indexof/index.js\", \"component-classes/deps/indexof/index.js\");\n\nrequire.alias(\"component-indexof/index.js\", \"tooltip/deps/indexof/index.js\");\nrequire.alias(\"component-indexof/index.js\", \"indexof/index.js\");\nif (typeof exports == \"object\") {\n module.exports = require(\"tooltip\");\n} else if (typeof define == \"function\" && define.amd) {\n define(function(){ return require(\"tooltip\"); });\n} else {\n this[\"Tooltip\"] = require(\"tooltip\");\n}})();\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n// This is CodeMirror (http://codemirror.net), a code editor\n// implemented in JavaScript on top of the browser's DOM.\n//\n// You can find some technical background for some of the code below\n// at http://marijnhaverbeke.nl/blog/#cm-internals .\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n module.exports = mod();\n else if (typeof define == \"function\" && define.amd) // AMD\n return define([], mod);\n else // Plain browser env\n (this || window).CodeMirror = mod();\n})(function() {\n \"use strict\";\n\n // BROWSER SNIFFING\n\n // Kludges for bugs and behavior differences that can't be feature\n // detected are enabled based on userAgent etc sniffing.\n var userAgent = navigator.userAgent;\n var platform = navigator.platform;\n\n var gecko = /gecko\\/\\d/i.test(userAgent);\n var ie_upto10 = /MSIE \\d/.test(userAgent);\n var ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(userAgent);\n var ie = ie_upto10 || ie_11up;\n var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : ie_11up[1]);\n var webkit = /WebKit\\//.test(userAgent);\n var qtwebkit = webkit && /Qt\\/\\d+\\.\\d+/.test(userAgent);\n var chrome = /Chrome\\//.test(userAgent);\n var presto = /Opera\\//.test(userAgent);\n var safari = /Apple Computer/.test(navigator.vendor);\n var mac_geMountainLion = /Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(userAgent);\n var phantom = /PhantomJS/.test(userAgent);\n\n var ios = /AppleWebKit/.test(userAgent) && /Mobile\\/\\w+/.test(userAgent);\n // This is woefully incomplete. Suggestions for alternative methods welcome.\n var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);\n var mac = ios || /Mac/.test(platform);\n var windows = /win/i.test(platform);\n\n var presto_version = presto && userAgent.match(/Version\\/(\\d*\\.\\d*)/);\n if (presto_version) presto_version = Number(presto_version[1]);\n if (presto_version && presto_version >= 15) { presto = false; webkit = true; }\n // Some browsers use the wrong event properties to signal cmd/ctrl on OS X\n var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));\n var captureRightClick = gecko || (ie && ie_version >= 9);\n\n // Optimize some code when these features are not used.\n var sawReadOnlySpans = false, sawCollapsedSpans = false;\n\n // EDITOR CONSTRUCTOR\n\n // A CodeMirror instance represents an editor. This is the object\n // that user code is usually dealing with.\n\n function CodeMirror(place, options) {\n if (!(this instanceof CodeMirror)) return new CodeMirror(place, options);\n\n this.options = options = options ? copyObj(options) : {};\n // Determine effective options based on given values and defaults.\n copyObj(defaults, options, false);\n setGuttersForLineNumbers(options);\n\n var doc = options.value;\n if (typeof doc == \"string\") doc = new Doc(doc, options.mode, null, options.lineSeparator);\n this.doc = doc;\n\n var input = new CodeMirror.inputStyles[options.inputStyle](this);\n var display = this.display = new Display(place, doc, input);\n display.wrapper.CodeMirror = this;\n updateGutters(this);\n themeChanged(this);\n if (options.lineWrapping)\n this.display.wrapper.className += \" CodeMirror-wrap\";\n if (options.autofocus && !mobile) display.input.focus();\n initScrollbars(this);\n\n this.state = {\n keyMaps: [], // stores maps added by addKeyMap\n overlays: [], // highlighting overlays, as added by addOverlay\n modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info\n overwrite: false,\n delayingBlurEvent: false,\n focused: false,\n suppressEdits: false, // used to disable editing during key handlers when in readOnly mode\n pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in input.poll\n selectingText: false,\n draggingText: false,\n highlight: new Delayed(), // stores highlight worker timeout\n keySeq: null, // Unfinished key sequence\n specialChars: null\n };\n\n var cm = this;\n\n // Override magic textarea content restore that IE sometimes does\n // on our hidden textarea on reload\n if (ie && ie_version < 11) setTimeout(function() { cm.display.input.reset(true); }, 20);\n\n registerEventHandlers(this);\n ensureGlobalHandlers();\n\n startOperation(this);\n this.curOp.forceUpdate = true;\n attachDoc(this, doc);\n\n if ((options.autofocus && !mobile) || cm.hasFocus())\n setTimeout(bind(onFocus, this), 20);\n else\n onBlur(this);\n\n for (var opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt))\n optionHandlers[opt](this, options[opt], Init);\n maybeUpdateLineNumberWidth(this);\n if (options.finishInit) options.finishInit(this);\n for (var i = 0; i < initHooks.length; ++i) initHooks[i](this);\n endOperation(this);\n // Suppress optimizelegibility in Webkit, since it breaks text\n // measuring on line wrapping boundaries.\n if (webkit && options.lineWrapping &&\n getComputedStyle(display.lineDiv).textRendering == \"optimizelegibility\")\n display.lineDiv.style.textRendering = \"auto\";\n }\n\n // DISPLAY CONSTRUCTOR\n\n // The display handles the DOM integration, both for input reading\n // and content drawing. It holds references to DOM nodes and\n // display-related state.\n\n function Display(place, doc, input) {\n var d = this;\n this.input = input;\n\n // Covers bottom-right square when both scrollbars are present.\n d.scrollbarFiller = elt(\"div\", null, \"CodeMirror-scrollbar-filler\");\n d.scrollbarFiller.setAttribute(\"cm-not-content\", \"true\");\n // Covers bottom of gutter when coverGutterNextToScrollbar is on\n // and h scrollbar is present.\n d.gutterFiller = elt(\"div\", null, \"CodeMirror-gutter-filler\");\n d.gutterFiller.setAttribute(\"cm-not-content\", \"true\");\n // Will contain the actual code, positioned to cover the viewport.\n d.lineDiv = elt(\"div\", null, \"CodeMirror-code\");\n // Elements are added to these to represent selection and cursors.\n d.selectionDiv = elt(\"div\", null, null, \"position: relative; z-index: 1\");\n d.cursorDiv = elt(\"div\", null, \"CodeMirror-cursors\");\n // A visibility: hidden element used to find the size of things.\n d.measure = elt(\"div\", null, \"CodeMirror-measure\");\n // When lines outside of the viewport are measured, they are drawn in this.\n d.lineMeasure = elt(\"div\", null, \"CodeMirror-measure\");\n // Wraps everything that needs to exist inside the vertically-padded coordinate system\n d.lineSpace = elt(\"div\", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],\n null, \"position: relative; outline: none\");\n // Moved around its parent to cover visible view.\n d.mover = elt(\"div\", [elt(\"div\", [d.lineSpace], \"CodeMirror-lines\")], null, \"position: relative\");\n // Set to the height of the document, allowing scrolling.\n d.sizer = elt(\"div\", [d.mover], \"CodeMirror-sizer\");\n d.sizerWidth = null;\n // Behavior of elts with overflow: auto and padding is\n // inconsistent across browsers. This is used to ensure the\n // scrollable area is big enough.\n d.heightForcer = elt(\"div\", null, null, \"position: absolute; height: \" + scrollerGap + \"px; width: 1px;\");\n // Will contain the gutters, if any.\n d.gutters = elt(\"div\", null, \"CodeMirror-gutters\");\n d.lineGutter = null;\n // Actual scrollable element.\n d.scroller = elt(\"div\", [d.sizer, d.heightForcer, d.gutters], \"CodeMirror-scroll\");\n d.scroller.setAttribute(\"tabIndex\", \"-1\");\n // The element in which the editor lives.\n d.wrapper = elt(\"div\", [d.scrollbarFiller, d.gutterFiller, d.scroller], \"CodeMirror\");\n\n // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)\n if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }\n if (!webkit && !(gecko && mobile)) d.scroller.draggable = true;\n\n if (place) {\n if (place.appendChild) place.appendChild(d.wrapper);\n else place(d.wrapper);\n }\n\n // Current rendered range (may be bigger than the view window).\n d.viewFrom = d.viewTo = doc.first;\n d.reportedViewFrom = d.reportedViewTo = doc.first;\n // Information about the rendered lines.\n d.view = [];\n d.renderedView = null;\n // Holds info about a single rendered line when it was rendered\n // for measurement, while not in view.\n d.externalMeasured = null;\n // Empty space (in pixels) above the view\n d.viewOffset = 0;\n d.lastWrapHeight = d.lastWrapWidth = 0;\n d.updateLineNumbers = null;\n\n d.nativeBarWidth = d.barHeight = d.barWidth = 0;\n d.scrollbarsClipped = false;\n\n // Used to only resize the line number gutter when necessary (when\n // the amount of lines crosses a boundary that makes its width change)\n d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;\n // Set to true when a non-horizontal-scrolling line widget is\n // added. As an optimization, line widget aligning is skipped when\n // this is false.\n d.alignWidgets = false;\n\n d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n\n // Tracks the maximum line length so that the horizontal scrollbar\n // can be kept static when scrolling.\n d.maxLine = null;\n d.maxLineLength = 0;\n d.maxLineChanged = false;\n\n // Used for measuring wheel scrolling granularity\n d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;\n\n // True when shift is held down.\n d.shift = false;\n\n // Used to track whether anything happened since the context menu\n // was opened.\n d.selForContextMenu = null;\n\n d.activeTouch = null;\n\n input.init(d);\n }\n\n // STATE UPDATES\n\n // Used to get the editor into a consistent state again when options change.\n\n function loadMode(cm) {\n cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption);\n resetModeState(cm);\n }\n\n function resetModeState(cm) {\n cm.doc.iter(function(line) {\n if (line.stateAfter) line.stateAfter = null;\n if (line.styles) line.styles = null;\n });\n cm.doc.frontier = cm.doc.first;\n startWorker(cm, 100);\n cm.state.modeGen++;\n if (cm.curOp) regChange(cm);\n }\n\n function wrappingChanged(cm) {\n if (cm.options.lineWrapping) {\n addClass(cm.display.wrapper, \"CodeMirror-wrap\");\n cm.display.sizer.style.minWidth = \"\";\n cm.display.sizerWidth = null;\n } else {\n rmClass(cm.display.wrapper, \"CodeMirror-wrap\");\n findMaxLine(cm);\n }\n estimateLineHeights(cm);\n regChange(cm);\n clearCaches(cm);\n setTimeout(function(){updateScrollbars(cm);}, 100);\n }\n\n // Returns a function that estimates the height of a line, to use as\n // first approximation until the line becomes visible (and is thus\n // properly measurable).\n function estimateHeight(cm) {\n var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;\n var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);\n return function(line) {\n if (lineIsHidden(cm.doc, line)) return 0;\n\n var widgetsHeight = 0;\n if (line.widgets) for (var i = 0; i < line.widgets.length; i++) {\n if (line.widgets[i].height) widgetsHeight += line.widgets[i].height;\n }\n\n if (wrapping)\n return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th;\n else\n return widgetsHeight + th;\n };\n }\n\n function estimateLineHeights(cm) {\n var doc = cm.doc, est = estimateHeight(cm);\n doc.iter(function(line) {\n var estHeight = est(line);\n if (estHeight != line.height) updateLineHeight(line, estHeight);\n });\n }\n\n function themeChanged(cm) {\n cm.display.wrapper.className = cm.display.wrapper.className.replace(/\\s*cm-s-\\S+/g, \"\") +\n cm.options.theme.replace(/(^|\\s)\\s*/g, \" cm-s-\");\n clearCaches(cm);\n }\n\n function guttersChanged(cm) {\n updateGutters(cm);\n regChange(cm);\n setTimeout(function(){alignHorizontally(cm);}, 20);\n }\n\n // Rebuild the gutter elements, ensure the margin to the left of the\n // code matches their width.\n function updateGutters(cm) {\n var gutters = cm.display.gutters, specs = cm.options.gutters;\n removeChildren(gutters);\n for (var i = 0; i < specs.length; ++i) {\n var gutterClass = specs[i];\n var gElt = gutters.appendChild(elt(\"div\", null, \"CodeMirror-gutter \" + gutterClass));\n if (gutterClass == \"CodeMirror-linenumbers\") {\n cm.display.lineGutter = gElt;\n gElt.style.width = (cm.display.lineNumWidth || 1) + \"px\";\n }\n }\n gutters.style.display = i ? \"\" : \"none\";\n updateGutterSpace(cm);\n }\n\n function updateGutterSpace(cm) {\n var width = cm.display.gutters.offsetWidth;\n cm.display.sizer.style.marginLeft = width + \"px\";\n }\n\n // Compute the character length of a line, taking into account\n // collapsed ranges (see markText) that might hide parts, and join\n // other lines onto it.\n function lineLength(line) {\n if (line.height == 0) return 0;\n var len = line.text.length, merged, cur = line;\n while (merged = collapsedSpanAtStart(cur)) {\n var found = merged.find(0, true);\n cur = found.from.line;\n len += found.from.ch - found.to.ch;\n }\n cur = line;\n while (merged = collapsedSpanAtEnd(cur)) {\n var found = merged.find(0, true);\n len -= cur.text.length - found.from.ch;\n cur = found.to.line;\n len += cur.text.length - found.to.ch;\n }\n return len;\n }\n\n // Find the longest line in the document.\n function findMaxLine(cm) {\n var d = cm.display, doc = cm.doc;\n d.maxLine = getLine(doc, doc.first);\n d.maxLineLength = lineLength(d.maxLine);\n d.maxLineChanged = true;\n doc.iter(function(line) {\n var len = lineLength(line);\n if (len > d.maxLineLength) {\n d.maxLineLength = len;\n d.maxLine = line;\n }\n });\n }\n\n // Make sure the gutters options contains the element\n // \"CodeMirror-linenumbers\" when the lineNumbers option is true.\n function setGuttersForLineNumbers(options) {\n var found = indexOf(options.gutters, \"CodeMirror-linenumbers\");\n if (found == -1 && options.lineNumbers) {\n options.gutters = options.gutters.concat([\"CodeMirror-linenumbers\"]);\n } else if (found > -1 && !options.lineNumbers) {\n options.gutters = options.gutters.slice(0);\n options.gutters.splice(found, 1);\n }\n }\n\n // SCROLLBARS\n\n // Prepare DOM reads needed to update the scrollbars. Done in one\n // shot to minimize update/measure roundtrips.\n function measureForScrollbars(cm) {\n var d = cm.display, gutterW = d.gutters.offsetWidth;\n var docH = Math.round(cm.doc.height + paddingVert(cm.display));\n return {\n clientHeight: d.scroller.clientHeight,\n viewHeight: d.wrapper.clientHeight,\n scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,\n viewWidth: d.wrapper.clientWidth,\n barLeft: cm.options.fixedGutter ? gutterW : 0,\n docHeight: docH,\n scrollHeight: docH + scrollGap(cm) + d.barHeight,\n nativeBarWidth: d.nativeBarWidth,\n gutterWidth: gutterW\n };\n }\n\n function NativeScrollbars(place, scroll, cm) {\n this.cm = cm;\n var vert = this.vert = elt(\"div\", [elt(\"div\", null, null, \"min-width: 1px\")], \"CodeMirror-vscrollbar\");\n var horiz = this.horiz = elt(\"div\", [elt(\"div\", null, null, \"height: 100%; min-height: 1px\")], \"CodeMirror-hscrollbar\");\n place(vert); place(horiz);\n\n on(vert, \"scroll\", function() {\n if (vert.clientHeight) scroll(vert.scrollTop, \"vertical\");\n });\n on(horiz, \"scroll\", function() {\n if (horiz.clientWidth) scroll(horiz.scrollLeft, \"horizontal\");\n });\n\n this.checkedZeroWidth = false;\n // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).\n if (ie && ie_version < 8) this.horiz.style.minHeight = this.vert.style.minWidth = \"18px\";\n }\n\n NativeScrollbars.prototype = copyObj({\n update: function(measure) {\n var needsH = measure.scrollWidth > measure.clientWidth + 1;\n var needsV = measure.scrollHeight > measure.clientHeight + 1;\n var sWidth = measure.nativeBarWidth;\n\n if (needsV) {\n this.vert.style.display = \"block\";\n this.vert.style.bottom = needsH ? sWidth + \"px\" : \"0\";\n var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);\n // A bug in IE8 can cause this value to be negative, so guard it.\n this.vert.firstChild.style.height =\n Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + \"px\";\n } else {\n this.vert.style.display = \"\";\n this.vert.firstChild.style.height = \"0\";\n }\n\n if (needsH) {\n this.horiz.style.display = \"block\";\n this.horiz.style.right = needsV ? sWidth + \"px\" : \"0\";\n this.horiz.style.left = measure.barLeft + \"px\";\n var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);\n this.horiz.firstChild.style.width =\n (measure.scrollWidth - measure.clientWidth + totalWidth) + \"px\";\n } else {\n this.horiz.style.display = \"\";\n this.horiz.firstChild.style.width = \"0\";\n }\n\n if (!this.checkedZeroWidth && measure.clientHeight > 0) {\n if (sWidth == 0) this.zeroWidthHack();\n this.checkedZeroWidth = true;\n }\n\n return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0};\n },\n setScrollLeft: function(pos) {\n if (this.horiz.scrollLeft != pos) this.horiz.scrollLeft = pos;\n if (this.disableHoriz) this.enableZeroWidthBar(this.horiz, this.disableHoriz);\n },\n setScrollTop: function(pos) {\n if (this.vert.scrollTop != pos) this.vert.scrollTop = pos;\n if (this.disableVert) this.enableZeroWidthBar(this.vert, this.disableVert);\n },\n zeroWidthHack: function() {\n var w = mac && !mac_geMountainLion ? \"12px\" : \"18px\";\n this.horiz.style.height = this.vert.style.width = w;\n this.horiz.style.pointerEvents = this.vert.style.pointerEvents = \"none\";\n this.disableHoriz = new Delayed;\n this.disableVert = new Delayed;\n },\n enableZeroWidthBar: function(bar, delay) {\n bar.style.pointerEvents = \"auto\";\n function maybeDisable() {\n // To find out whether the scrollbar is still visible, we\n // check whether the element under the pixel in the bottom\n // left corner of the scrollbar box is the scrollbar box\n // itself (when the bar is still visible) or its filler child\n // (when the bar is hidden). If it is still visible, we keep\n // it enabled, if it's hidden, we disable pointer events.\n var box = bar.getBoundingClientRect();\n var elt = document.elementFromPoint(box.left + 1, box.bottom - 1);\n if (elt != bar) bar.style.pointerEvents = \"none\";\n else delay.set(1000, maybeDisable);\n }\n delay.set(1000, maybeDisable);\n },\n clear: function() {\n var parent = this.horiz.parentNode;\n parent.removeChild(this.horiz);\n parent.removeChild(this.vert);\n }\n }, NativeScrollbars.prototype);\n\n function NullScrollbars() {}\n\n NullScrollbars.prototype = copyObj({\n update: function() { return {bottom: 0, right: 0}; },\n setScrollLeft: function() {},\n setScrollTop: function() {},\n clear: function() {}\n }, NullScrollbars.prototype);\n\n CodeMirror.scrollbarModel = {\"native\": NativeScrollbars, \"null\": NullScrollbars};\n\n function initScrollbars(cm) {\n if (cm.display.scrollbars) {\n cm.display.scrollbars.clear();\n if (cm.display.scrollbars.addClass)\n rmClass(cm.display.wrapper, cm.display.scrollbars.addClass);\n }\n\n cm.display.scrollbars = new CodeMirror.scrollbarModel[cm.options.scrollbarStyle](function(node) {\n cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);\n // Prevent clicks in the scrollbars from killing focus\n on(node, \"mousedown\", function() {\n if (cm.state.focused) setTimeout(function() { cm.display.input.focus(); }, 0);\n });\n node.setAttribute(\"cm-not-content\", \"true\");\n }, function(pos, axis) {\n if (axis == \"horizontal\") setScrollLeft(cm, pos);\n else setScrollTop(cm, pos);\n }, cm);\n if (cm.display.scrollbars.addClass)\n addClass(cm.display.wrapper, cm.display.scrollbars.addClass);\n }\n\n function updateScrollbars(cm, measure) {\n if (!measure) measure = measureForScrollbars(cm);\n var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;\n updateScrollbarsInner(cm, measure);\n for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {\n if (startWidth != cm.display.barWidth && cm.options.lineWrapping)\n updateHeightsInViewport(cm);\n updateScrollbarsInner(cm, measureForScrollbars(cm));\n startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;\n }\n }\n\n // Re-synchronize the fake scrollbars with the actual size of the\n // content.\n function updateScrollbarsInner(cm, measure) {\n var d = cm.display;\n var sizes = d.scrollbars.update(measure);\n\n d.sizer.style.paddingRight = (d.barWidth = sizes.right) + \"px\";\n d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + \"px\";\n d.heightForcer.style.borderBottom = sizes.bottom + \"px solid transparent\"\n\n if (sizes.right && sizes.bottom) {\n d.scrollbarFiller.style.display = \"block\";\n d.scrollbarFiller.style.height = sizes.bottom + \"px\";\n d.scrollbarFiller.style.width = sizes.right + \"px\";\n } else d.scrollbarFiller.style.display = \"\";\n if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {\n d.gutterFiller.style.display = \"block\";\n d.gutterFiller.style.height = sizes.bottom + \"px\";\n d.gutterFiller.style.width = measure.gutterWidth + \"px\";\n } else d.gutterFiller.style.display = \"\";\n }\n\n // Compute the lines that are visible in a given viewport (defaults\n // the the current scroll position). viewport may contain top,\n // height, and ensure (see op.scrollToPos) properties.\n function visibleLines(display, doc, viewport) {\n var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;\n top = Math.floor(top - paddingTop(display));\n var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;\n\n var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);\n // Ensure is a {from: {line, ch}, to: {line, ch}} object, and\n // forces those lines into the viewport (if possible).\n if (viewport && viewport.ensure) {\n var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;\n if (ensureFrom < from) {\n from = ensureFrom;\n to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);\n } else if (Math.min(ensureTo, doc.lastLine()) >= to) {\n from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);\n to = ensureTo;\n }\n }\n return {from: from, to: Math.max(to, from + 1)};\n }\n\n // LINE NUMBERS\n\n // Re-align line numbers and gutter marks to compensate for\n // horizontal scrolling.\n function alignHorizontally(cm) {\n var display = cm.display, view = display.view;\n if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return;\n var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;\n var gutterW = display.gutters.offsetWidth, left = comp + \"px\";\n for (var i = 0; i < view.length; i++) if (!view[i].hidden) {\n if (cm.options.fixedGutter && view[i].gutter)\n view[i].gutter.style.left = left;\n var align = view[i].alignable;\n if (align) for (var j = 0; j < align.length; j++)\n align[j].style.left = left;\n }\n if (cm.options.fixedGutter)\n display.gutters.style.left = (comp + gutterW) + \"px\";\n }\n\n // Used to ensure that the line number gutter is still the right\n // size for the current document size. Returns true when an update\n // is needed.\n function maybeUpdateLineNumberWidth(cm) {\n if (!cm.options.lineNumbers) return false;\n var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;\n if (last.length != display.lineNumChars) {\n var test = display.measure.appendChild(elt(\"div\", [elt(\"div\", last)],\n \"CodeMirror-linenumber CodeMirror-gutter-elt\"));\n var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;\n display.lineGutter.style.width = \"\";\n display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1;\n display.lineNumWidth = display.lineNumInnerWidth + padding;\n display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;\n display.lineGutter.style.width = display.lineNumWidth + \"px\";\n updateGutterSpace(cm);\n return true;\n }\n return false;\n }\n\n function lineNumberFor(options, i) {\n return String(options.lineNumberFormatter(i + options.firstLineNumber));\n }\n\n // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,\n // but using getBoundingClientRect to get a sub-pixel-accurate\n // result.\n function compensateForHScroll(display) {\n return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left;\n }\n\n // DISPLAY DRAWING\n\n function DisplayUpdate(cm, viewport, force) {\n var display = cm.display;\n\n this.viewport = viewport;\n // Store some values that we'll need later (but don't want to force a relayout for)\n this.visible = visibleLines(display, cm.doc, viewport);\n this.editorIsHidden = !display.wrapper.offsetWidth;\n this.wrapperHeight = display.wrapper.clientHeight;\n this.wrapperWidth = display.wrapper.clientWidth;\n this.oldDisplayWidth = displayWidth(cm);\n this.force = force;\n this.dims = getDimensions(cm);\n this.events = [];\n }\n\n DisplayUpdate.prototype.signal = function(emitter, type) {\n if (hasHandler(emitter, type))\n this.events.push(arguments);\n };\n DisplayUpdate.prototype.finish = function() {\n for (var i = 0; i < this.events.length; i++)\n signal.apply(null, this.events[i]);\n };\n\n function maybeClipScrollbars(cm) {\n var display = cm.display;\n if (!display.scrollbarsClipped && display.scroller.offsetWidth) {\n display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;\n display.heightForcer.style.height = scrollGap(cm) + \"px\";\n display.sizer.style.marginBottom = -display.nativeBarWidth + \"px\";\n display.sizer.style.borderRightWidth = scrollGap(cm) + \"px\";\n display.scrollbarsClipped = true;\n }\n }\n\n // Does the actual updating of the line display. Bails out\n // (returning false) when there is nothing to be done and forced is\n // false.\n function updateDisplayIfNeeded(cm, update) {\n var display = cm.display, doc = cm.doc;\n\n if (update.editorIsHidden) {\n resetView(cm);\n return false;\n }\n\n // Bail out if the visible area is already rendered and nothing changed.\n if (!update.force &&\n update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&\n (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&\n display.renderedView == display.view && countDirtyView(cm) == 0)\n return false;\n\n if (maybeUpdateLineNumberWidth(cm)) {\n resetView(cm);\n update.dims = getDimensions(cm);\n }\n\n // Compute a suitable new viewport (from & to)\n var end = doc.first + doc.size;\n var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);\n var to = Math.min(end, update.visible.to + cm.options.viewportMargin);\n if (display.viewFrom < from && from - display.viewFrom < 20) from = Math.max(doc.first, display.viewFrom);\n if (display.viewTo > to && display.viewTo - to < 20) to = Math.min(end, display.viewTo);\n if (sawCollapsedSpans) {\n from = visualLineNo(cm.doc, from);\n to = visualLineEndNo(cm.doc, to);\n }\n\n var different = from != display.viewFrom || to != display.viewTo ||\n display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;\n adjustView(cm, from, to);\n\n display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));\n // Position the mover div to align with the current scroll position\n cm.display.mover.style.top = display.viewOffset + \"px\";\n\n var toUpdate = countDirtyView(cm);\n if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&\n (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))\n return false;\n\n // For big changes, we hide the enclosing element during the\n // update, since that speeds up the operations on most browsers.\n var focused = activeElt();\n if (toUpdate > 4) display.lineDiv.style.display = \"none\";\n patchDisplay(cm, display.updateLineNumbers, update.dims);\n if (toUpdate > 4) display.lineDiv.style.display = \"\";\n display.renderedView = display.view;\n // There might have been a widget with a focused element that got\n // hidden or updated, if so re-focus it.\n if (focused && activeElt() != focused && focused.offsetHeight) focused.focus();\n\n // Prevent selection and cursors from interfering with the scroll\n // width and height.\n removeChildren(display.cursorDiv);\n removeChildren(display.selectionDiv);\n display.gutters.style.height = display.sizer.style.minHeight = 0;\n\n if (different) {\n display.lastWrapHeight = update.wrapperHeight;\n display.lastWrapWidth = update.wrapperWidth;\n startWorker(cm, 400);\n }\n\n display.updateLineNumbers = null;\n\n return true;\n }\n\n function postUpdateDisplay(cm, update) {\n var viewport = update.viewport;\n\n for (var first = true;; first = false) {\n if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {\n // Clip forced viewport to actual scrollable area.\n if (viewport && viewport.top != null)\n viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)};\n // Updated line heights might result in the drawn area not\n // actually covering the viewport. Keep looping until it does.\n update.visible = visibleLines(cm.display, cm.doc, viewport);\n if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)\n break;\n }\n if (!updateDisplayIfNeeded(cm, update)) break;\n updateHeightsInViewport(cm);\n var barMeasure = measureForScrollbars(cm);\n updateSelection(cm);\n updateScrollbars(cm, barMeasure);\n setDocumentHeight(cm, barMeasure);\n }\n\n update.signal(cm, \"update\", cm);\n if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {\n update.signal(cm, \"viewportChange\", cm, cm.display.viewFrom, cm.display.viewTo);\n cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;\n }\n }\n\n function updateDisplaySimple(cm, viewport) {\n var update = new DisplayUpdate(cm, viewport);\n if (updateDisplayIfNeeded(cm, update)) {\n updateHeightsInViewport(cm);\n postUpdateDisplay(cm, update);\n var barMeasure = measureForScrollbars(cm);\n updateSelection(cm);\n updateScrollbars(cm, barMeasure);\n setDocumentHeight(cm, barMeasure);\n update.finish();\n }\n }\n\n function setDocumentHeight(cm, measure) {\n cm.display.sizer.style.minHeight = measure.docHeight + \"px\";\n cm.display.heightForcer.style.top = measure.docHeight + \"px\";\n cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + \"px\";\n }\n\n // Read the actual heights of the rendered lines, and update their\n // stored heights to match.\n function updateHeightsInViewport(cm) {\n var display = cm.display;\n var prevBottom = display.lineDiv.offsetTop;\n for (var i = 0; i < display.view.length; i++) {\n var cur = display.view[i], height;\n if (cur.hidden) continue;\n if (ie && ie_version < 8) {\n var bot = cur.node.offsetTop + cur.node.offsetHeight;\n height = bot - prevBottom;\n prevBottom = bot;\n } else {\n var box = cur.node.getBoundingClientRect();\n height = box.bottom - box.top;\n }\n var diff = cur.line.height - height;\n if (height < 2) height = textHeight(display);\n if (diff > .001 || diff < -.001) {\n updateLineHeight(cur.line, height);\n updateWidgetHeight(cur.line);\n if (cur.rest) for (var j = 0; j < cur.rest.length; j++)\n updateWidgetHeight(cur.rest[j]);\n }\n }\n }\n\n // Read and store the height of line widgets associated with the\n // given line.\n function updateWidgetHeight(line) {\n if (line.widgets) for (var i = 0; i < line.widgets.length; ++i)\n line.widgets[i].height = line.widgets[i].node.parentNode.offsetHeight;\n }\n\n // Do a bulk-read of the DOM positions and sizes needed to draw the\n // view, so that we don't interleave reading and writing to the DOM.\n function getDimensions(cm) {\n var d = cm.display, left = {}, width = {};\n var gutterLeft = d.gutters.clientLeft;\n for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {\n left[cm.options.gutters[i]] = n.offsetLeft + n.clientLeft + gutterLeft;\n width[cm.options.gutters[i]] = n.clientWidth;\n }\n return {fixedPos: compensateForHScroll(d),\n gutterTotalWidth: d.gutters.offsetWidth,\n gutterLeft: left,\n gutterWidth: width,\n wrapperWidth: d.wrapper.clientWidth};\n }\n\n // Sync the actual display DOM structure with display.view, removing\n // nodes for lines that are no longer in view, and creating the ones\n // that are not there yet, and updating the ones that are out of\n // date.\n function patchDisplay(cm, updateNumbersFrom, dims) {\n var display = cm.display, lineNumbers = cm.options.lineNumbers;\n var container = display.lineDiv, cur = container.firstChild;\n\n function rm(node) {\n var next = node.nextSibling;\n // Works around a throw-scroll bug in OS X Webkit\n if (webkit && mac && cm.display.currentWheelTarget == node)\n node.style.display = \"none\";\n else\n node.parentNode.removeChild(node);\n return next;\n }\n\n var view = display.view, lineN = display.viewFrom;\n // Loop over the elements in the view, syncing cur (the DOM nodes\n // in display.lineDiv) with the view as we go.\n for (var i = 0; i < view.length; i++) {\n var lineView = view[i];\n if (lineView.hidden) {\n } else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet\n var node = buildLineElement(cm, lineView, lineN, dims);\n container.insertBefore(node, cur);\n } else { // Already drawn\n while (cur != lineView.node) cur = rm(cur);\n var updateNumber = lineNumbers && updateNumbersFrom != null &&\n updateNumbersFrom <= lineN && lineView.lineNumber;\n if (lineView.changes) {\n if (indexOf(lineView.changes, \"gutter\") > -1) updateNumber = false;\n updateLineForChanges(cm, lineView, lineN, dims);\n }\n if (updateNumber) {\n removeChildren(lineView.lineNumber);\n lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));\n }\n cur = lineView.node.nextSibling;\n }\n lineN += lineView.size;\n }\n while (cur) cur = rm(cur);\n }\n\n // When an aspect of a line changes, a string is added to\n // lineView.changes. This updates the relevant part of the line's\n // DOM structure.\n function updateLineForChanges(cm, lineView, lineN, dims) {\n for (var j = 0; j < lineView.changes.length; j++) {\n var type = lineView.changes[j];\n if (type == \"text\") updateLineText(cm, lineView);\n else if (type == \"gutter\") updateLineGutter(cm, lineView, lineN, dims);\n else if (type == \"class\") updateLineClasses(lineView);\n else if (type == \"widget\") updateLineWidgets(cm, lineView, dims);\n }\n lineView.changes = null;\n }\n\n // Lines with gutter elements, widgets or a background class need to\n // be wrapped, and have the extra elements added to the wrapper div\n function ensureLineWrapped(lineView) {\n if (lineView.node == lineView.text) {\n lineView.node = elt(\"div\", null, null, \"position: relative\");\n if (lineView.text.parentNode)\n lineView.text.parentNode.replaceChild(lineView.node, lineView.text);\n lineView.node.appendChild(lineView.text);\n if (ie && ie_version < 8) lineView.node.style.zIndex = 2;\n }\n return lineView.node;\n }\n\n function updateLineBackground(lineView) {\n var cls = lineView.bgClass ? lineView.bgClass + \" \" + (lineView.line.bgClass || \"\") : lineView.line.bgClass;\n if (cls) cls += \" CodeMirror-linebackground\";\n if (lineView.background) {\n if (cls) lineView.background.className = cls;\n else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }\n } else if (cls) {\n var wrap = ensureLineWrapped(lineView);\n lineView.background = wrap.insertBefore(elt(\"div\", null, cls), wrap.firstChild);\n }\n }\n\n // Wrapper around buildLineContent which will reuse the structure\n // in display.externalMeasured when possible.\n function getLineContent(cm, lineView) {\n var ext = cm.display.externalMeasured;\n if (ext && ext.line == lineView.line) {\n cm.display.externalMeasured = null;\n lineView.measure = ext.measure;\n return ext.built;\n }\n return buildLineContent(cm, lineView);\n }\n\n // Redraw the line's text. Interacts with the background and text\n // classes because the mode may output tokens that influence these\n // classes.\n function updateLineText(cm, lineView) {\n var cls = lineView.text.className;\n var built = getLineContent(cm, lineView);\n if (lineView.text == lineView.node) lineView.node = built.pre;\n lineView.text.parentNode.replaceChild(built.pre, lineView.text);\n lineView.text = built.pre;\n if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {\n lineView.bgClass = built.bgClass;\n lineView.textClass = built.textClass;\n updateLineClasses(lineView);\n } else if (cls) {\n lineView.text.className = cls;\n }\n }\n\n function updateLineClasses(lineView) {\n updateLineBackground(lineView);\n if (lineView.line.wrapClass)\n ensureLineWrapped(lineView).className = lineView.line.wrapClass;\n else if (lineView.node != lineView.text)\n lineView.node.className = \"\";\n var textClass = lineView.textClass ? lineView.textClass + \" \" + (lineView.line.textClass || \"\") : lineView.line.textClass;\n lineView.text.className = textClass || \"\";\n }\n\n function updateLineGutter(cm, lineView, lineN, dims) {\n if (lineView.gutter) {\n lineView.node.removeChild(lineView.gutter);\n lineView.gutter = null;\n }\n if (lineView.gutterBackground) {\n lineView.node.removeChild(lineView.gutterBackground);\n lineView.gutterBackground = null;\n }\n if (lineView.line.gutterClass) {\n var wrap = ensureLineWrapped(lineView);\n lineView.gutterBackground = elt(\"div\", null, \"CodeMirror-gutter-background \" + lineView.line.gutterClass,\n \"left: \" + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) +\n \"px; width: \" + dims.gutterTotalWidth + \"px\");\n wrap.insertBefore(lineView.gutterBackground, lineView.text);\n }\n var markers = lineView.line.gutterMarkers;\n if (cm.options.lineNumbers || markers) {\n var wrap = ensureLineWrapped(lineView);\n var gutterWrap = lineView.gutter = elt(\"div\", null, \"CodeMirror-gutter-wrapper\", \"left: \" +\n (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px\");\n cm.display.input.setUneditable(gutterWrap);\n wrap.insertBefore(gutterWrap, lineView.text);\n if (lineView.line.gutterClass)\n gutterWrap.className += \" \" + lineView.line.gutterClass;\n if (cm.options.lineNumbers && (!markers || !markers[\"CodeMirror-linenumbers\"]))\n lineView.lineNumber = gutterWrap.appendChild(\n elt(\"div\", lineNumberFor(cm.options, lineN),\n \"CodeMirror-linenumber CodeMirror-gutter-elt\",\n \"left: \" + dims.gutterLeft[\"CodeMirror-linenumbers\"] + \"px; width: \"\n + cm.display.lineNumInnerWidth + \"px\"));\n if (markers) for (var k = 0; k < cm.options.gutters.length; ++k) {\n var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];\n if (found)\n gutterWrap.appendChild(elt(\"div\", [found], \"CodeMirror-gutter-elt\", \"left: \" +\n dims.gutterLeft[id] + \"px; width: \" + dims.gutterWidth[id] + \"px\"));\n }\n }\n }\n\n function updateLineWidgets(cm, lineView, dims) {\n if (lineView.alignable) lineView.alignable = null;\n for (var node = lineView.node.firstChild, next; node; node = next) {\n var next = node.nextSibling;\n if (node.className == \"CodeMirror-linewidget\")\n lineView.node.removeChild(node);\n }\n insertLineWidgets(cm, lineView, dims);\n }\n\n // Build a line's DOM representation from scratch\n function buildLineElement(cm, lineView, lineN, dims) {\n var built = getLineContent(cm, lineView);\n lineView.text = lineView.node = built.pre;\n if (built.bgClass) lineView.bgClass = built.bgClass;\n if (built.textClass) lineView.textClass = built.textClass;\n\n updateLineClasses(lineView);\n updateLineGutter(cm, lineView, lineN, dims);\n insertLineWidgets(cm, lineView, dims);\n return lineView.node;\n }\n\n // A lineView may contain multiple logical lines (when merged by\n // collapsed spans). The widgets for all of them need to be drawn.\n function insertLineWidgets(cm, lineView, dims) {\n insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);\n if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)\n insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false);\n }\n\n function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {\n if (!line.widgets) return;\n var wrap = ensureLineWrapped(lineView);\n for (var i = 0, ws = line.widgets; i < ws.length; ++i) {\n var widget = ws[i], node = elt(\"div\", [widget.node], \"CodeMirror-linewidget\");\n if (!widget.handleMouseEvents) node.setAttribute(\"cm-ignore-events\", \"true\");\n positionLineWidget(widget, node, lineView, dims);\n cm.display.input.setUneditable(node);\n if (allowAbove && widget.above)\n wrap.insertBefore(node, lineView.gutter || lineView.text);\n else\n wrap.appendChild(node);\n signalLater(widget, \"redraw\");\n }\n }\n\n function positionLineWidget(widget, node, lineView, dims) {\n if (widget.noHScroll) {\n (lineView.alignable || (lineView.alignable = [])).push(node);\n var width = dims.wrapperWidth;\n node.style.left = dims.fixedPos + \"px\";\n if (!widget.coverGutter) {\n width -= dims.gutterTotalWidth;\n node.style.paddingLeft = dims.gutterTotalWidth + \"px\";\n }\n node.style.width = width + \"px\";\n }\n if (widget.coverGutter) {\n node.style.zIndex = 5;\n node.style.position = \"relative\";\n if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + \"px\";\n }\n }\n\n // POSITION OBJECT\n\n // A Pos instance represents a position within the text.\n var Pos = CodeMirror.Pos = function(line, ch) {\n if (!(this instanceof Pos)) return new Pos(line, ch);\n this.line = line; this.ch = ch;\n };\n\n // Compare two positions, return 0 if they are the same, a negative\n // number when a is less, and a positive number otherwise.\n var cmp = CodeMirror.cmpPos = function(a, b) { return a.line - b.line || a.ch - b.ch; };\n\n function copyPos(x) {return Pos(x.line, x.ch);}\n function maxPos(a, b) { return cmp(a, b) < 0 ? b : a; }\n function minPos(a, b) { return cmp(a, b) < 0 ? a : b; }\n\n // INPUT HANDLING\n\n function ensureFocus(cm) {\n if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); }\n }\n\n // This will be set to an array of strings when copying, so that,\n // when pasting, we know what kind of selections the copied text\n // was made out of.\n var lastCopied = null;\n\n function applyTextInput(cm, inserted, deleted, sel, origin) {\n var doc = cm.doc;\n cm.display.shift = false;\n if (!sel) sel = doc.sel;\n\n var paste = cm.state.pasteIncoming || origin == \"paste\";\n var textLines = doc.splitLines(inserted), multiPaste = null;\n // When pasing N lines into N selections, insert one line per selection\n if (paste && sel.ranges.length > 1) {\n if (lastCopied && lastCopied.join(\"\\n\") == inserted) {\n if (sel.ranges.length % lastCopied.length == 0) {\n multiPaste = [];\n for (var i = 0; i < lastCopied.length; i++)\n multiPaste.push(doc.splitLines(lastCopied[i]));\n }\n } else if (textLines.length == sel.ranges.length) {\n multiPaste = map(textLines, function(l) { return [l]; });\n }\n }\n\n // Normal behavior is to insert the new text into every selection\n for (var i = sel.ranges.length - 1; i >= 0; i--) {\n var range = sel.ranges[i];\n var from = range.from(), to = range.to();\n if (range.empty()) {\n if (deleted && deleted > 0) // Handle deletion\n from = Pos(from.line, from.ch - deleted);\n else if (cm.state.overwrite && !paste) // Handle overwrite\n to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length));\n }\n var updateInput = cm.curOp.updateInput;\n var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i % multiPaste.length] : textLines,\n origin: origin || (paste ? \"paste\" : cm.state.cutIncoming ? \"cut\" : \"+input\")};\n makeChange(cm.doc, changeEvent);\n signalLater(cm, \"inputRead\", cm, changeEvent);\n }\n if (inserted && !paste)\n triggerElectric(cm, inserted);\n\n ensureCursorVisible(cm);\n cm.curOp.updateInput = updateInput;\n cm.curOp.typing = true;\n cm.state.pasteIncoming = cm.state.cutIncoming = false;\n }\n\n function handlePaste(e, cm) {\n var pasted = e.clipboardData && e.clipboardData.getData(\"text/plain\");\n if (pasted) {\n e.preventDefault();\n if (!cm.isReadOnly() && !cm.options.disableInput)\n runInOp(cm, function() { applyTextInput(cm, pasted, 0, null, \"paste\"); });\n return true;\n }\n }\n\n function triggerElectric(cm, inserted) {\n // When an 'electric' character is inserted, immediately trigger a reindent\n if (!cm.options.electricChars || !cm.options.smartIndent) return;\n var sel = cm.doc.sel;\n\n for (var i = sel.ranges.length - 1; i >= 0; i--) {\n var range = sel.ranges[i];\n if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) continue;\n var mode = cm.getModeAt(range.head);\n var indented = false;\n if (mode.electricChars) {\n for (var j = 0; j < mode.electricChars.length; j++)\n if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {\n indented = indentLine(cm, range.head.line, \"smart\");\n break;\n }\n } else if (mode.electricInput) {\n if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch)))\n indented = indentLine(cm, range.head.line, \"smart\");\n }\n if (indented) signalLater(cm, \"electricInput\", cm, range.head.line);\n }\n }\n\n function copyableRanges(cm) {\n var text = [], ranges = [];\n for (var i = 0; i < cm.doc.sel.ranges.length; i++) {\n var line = cm.doc.sel.ranges[i].head.line;\n var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};\n ranges.push(lineRange);\n text.push(cm.getRange(lineRange.anchor, lineRange.head));\n }\n return {text: text, ranges: ranges};\n }\n\n function disableBrowserMagic(field) {\n field.setAttribute(\"autocorrect\", \"off\");\n field.setAttribute(\"autocapitalize\", \"off\");\n field.setAttribute(\"spellcheck\", \"false\");\n }\n\n // TEXTAREA INPUT STYLE\n\n function TextareaInput(cm) {\n this.cm = cm;\n // See input.poll and input.reset\n this.prevInput = \"\";\n\n // Flag that indicates whether we expect input to appear real soon\n // now (after some event like 'keypress' or 'input') and are\n // polling intensively.\n this.pollingFast = false;\n // Self-resetting timeout for the poller\n this.polling = new Delayed();\n // Tracks when input.reset has punted to just putting a short\n // string into the textarea instead of the full selection.\n this.inaccurateSelection = false;\n // Used to work around IE issue with selection being forgotten when focus moves away from textarea\n this.hasSelection = false;\n this.composing = null;\n };\n\n function hiddenTextarea() {\n var te = elt(\"textarea\", null, null, \"position: absolute; padding: 0; width: 1px; height: 1em; outline: none\");\n var div = elt(\"div\", [te], null, \"overflow: hidden; position: relative; width: 3px; height: 0px;\");\n // The textarea is kept positioned near the cursor to prevent the\n // fact that it'll be scrolled into view on input from scrolling\n // our fake cursor out of view. On webkit, when wrap=off, paste is\n // very slow. So make the area wide instead.\n if (webkit) te.style.width = \"1000px\";\n else te.setAttribute(\"wrap\", \"off\");\n // If border: 0; -- iOS fails to open keyboard (issue #1287)\n if (ios) te.style.border = \"1px solid black\";\n disableBrowserMagic(te);\n return div;\n }\n\n TextareaInput.prototype = copyObj({\n init: function(display) {\n var input = this, cm = this.cm;\n\n // Wraps and hides input textarea\n var div = this.wrapper = hiddenTextarea();\n // The semihidden textarea that is focused when the editor is\n // focused, and receives input.\n var te = this.textarea = div.firstChild;\n display.wrapper.insertBefore(div, display.wrapper.firstChild);\n\n // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)\n if (ios) te.style.width = \"0px\";\n\n on(te, \"input\", function() {\n if (ie && ie_version >= 9 && input.hasSelection) input.hasSelection = null;\n input.poll();\n });\n\n on(te, \"paste\", function(e) {\n if (signalDOMEvent(cm, e) || handlePaste(e, cm)) return\n\n cm.state.pasteIncoming = true;\n input.fastPoll();\n });\n\n function prepareCopyCut(e) {\n if (signalDOMEvent(cm, e)) return\n if (cm.somethingSelected()) {\n lastCopied = cm.getSelections();\n if (input.inaccurateSelection) {\n input.prevInput = \"\";\n input.inaccurateSelection = false;\n te.value = lastCopied.join(\"\\n\");\n selectInput(te);\n }\n } else if (!cm.options.lineWiseCopyCut) {\n return;\n } else {\n var ranges = copyableRanges(cm);\n lastCopied = ranges.text;\n if (e.type == \"cut\") {\n cm.setSelections(ranges.ranges, null, sel_dontScroll);\n } else {\n input.prevInput = \"\";\n te.value = ranges.text.join(\"\\n\");\n selectInput(te);\n }\n }\n if (e.type == \"cut\") cm.state.cutIncoming = true;\n }\n on(te, \"cut\", prepareCopyCut);\n on(te, \"copy\", prepareCopyCut);\n\n on(display.scroller, \"paste\", function(e) {\n if (eventInWidget(display, e) || signalDOMEvent(cm, e)) return;\n cm.state.pasteIncoming = true;\n input.focus();\n });\n\n // Prevent normal selection in the editor (we handle our own)\n on(display.lineSpace, \"selectstart\", function(e) {\n if (!eventInWidget(display, e)) e_preventDefault(e);\n });\n\n on(te, \"compositionstart\", function() {\n var start = cm.getCursor(\"from\");\n if (input.composing) input.composing.range.clear()\n input.composing = {\n start: start,\n range: cm.markText(start, cm.getCursor(\"to\"), {className: \"CodeMirror-composing\"})\n };\n });\n on(te, \"compositionend\", function() {\n if (input.composing) {\n input.poll();\n input.composing.range.clear();\n input.composing = null;\n }\n });\n },\n\n prepareSelection: function() {\n // Redraw the selection and/or cursor\n var cm = this.cm, display = cm.display, doc = cm.doc;\n var result = prepareSelection(cm);\n\n // Move the hidden textarea near the cursor to prevent scrolling artifacts\n if (cm.options.moveInputWithCursor) {\n var headPos = cursorCoords(cm, doc.sel.primary().head, \"div\");\n var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();\n result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,\n headPos.top + lineOff.top - wrapOff.top));\n result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,\n headPos.left + lineOff.left - wrapOff.left));\n }\n\n return result;\n },\n\n showSelection: function(drawn) {\n var cm = this.cm, display = cm.display;\n removeChildrenAndAdd(display.cursorDiv, drawn.cursors);\n removeChildrenAndAdd(display.selectionDiv, drawn.selection);\n if (drawn.teTop != null) {\n this.wrapper.style.top = drawn.teTop + \"px\";\n this.wrapper.style.left = drawn.teLeft + \"px\";\n }\n },\n\n // Reset the input to correspond to the selection (or to be empty,\n // when not typing and nothing is selected)\n reset: function(typing) {\n if (this.contextMenuPending) return;\n var minimal, selected, cm = this.cm, doc = cm.doc;\n if (cm.somethingSelected()) {\n this.prevInput = \"\";\n var range = doc.sel.primary();\n minimal = hasCopyEvent &&\n (range.to().line - range.from().line > 100 || (selected = cm.getSelection()).length > 1000);\n var content = minimal ? \"-\" : selected || cm.getSelection();\n this.textarea.value = content;\n if (cm.state.focused) selectInput(this.textarea);\n if (ie && ie_version >= 9) this.hasSelection = content;\n } else if (!typing) {\n this.prevInput = this.textarea.value = \"\";\n if (ie && ie_version >= 9) this.hasSelection = null;\n }\n this.inaccurateSelection = minimal;\n },\n\n getField: function() { return this.textarea; },\n\n supportsTouch: function() { return false; },\n\n focus: function() {\n if (this.cm.options.readOnly != \"nocursor\" && (!mobile || activeElt() != this.textarea)) {\n try { this.textarea.focus(); }\n catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM\n }\n },\n\n blur: function() { this.textarea.blur(); },\n\n resetPosition: function() {\n this.wrapper.style.top = this.wrapper.style.left = 0;\n },\n\n receivedFocus: function() { this.slowPoll(); },\n\n // Poll for input changes, using the normal rate of polling. This\n // runs as long as the editor is focused.\n slowPoll: function() {\n var input = this;\n if (input.pollingFast) return;\n input.polling.set(this.cm.options.pollInterval, function() {\n input.poll();\n if (input.cm.state.focused) input.slowPoll();\n });\n },\n\n // When an event has just come in that is likely to add or change\n // something in the input textarea, we poll faster, to ensure that\n // the change appears on the screen quickly.\n fastPoll: function() {\n var missed = false, input = this;\n input.pollingFast = true;\n function p() {\n var changed = input.poll();\n if (!changed && !missed) {missed = true; input.polling.set(60, p);}\n else {input.pollingFast = false; input.slowPoll();}\n }\n input.polling.set(20, p);\n },\n\n // Read input from the textarea, and update the document to match.\n // When something is selected, it is present in the textarea, and\n // selected (unless it is huge, in which case a placeholder is\n // used). When nothing is selected, the cursor sits after previously\n // seen text (can be empty), which is stored in prevInput (we must\n // not reset the textarea when typing, because that breaks IME).\n poll: function() {\n var cm = this.cm, input = this.textarea, prevInput = this.prevInput;\n // Since this is called a *lot*, try to bail out as cheaply as\n // possible when it is clear that nothing happened. hasSelection\n // will be the case when there is a lot of text in the textarea,\n // in which case reading its value would be expensive.\n if (this.contextMenuPending || !cm.state.focused ||\n (hasSelection(input) && !prevInput && !this.composing) ||\n cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)\n return false;\n\n var text = input.value;\n // If nothing changed, bail.\n if (text == prevInput && !cm.somethingSelected()) return false;\n // Work around nonsensical selection resetting in IE9/10, and\n // inexplicable appearance of private area unicode characters on\n // some key combos in Mac (#2689).\n if (ie && ie_version >= 9 && this.hasSelection === text ||\n mac && /[\\uf700-\\uf7ff]/.test(text)) {\n cm.display.input.reset();\n return false;\n }\n\n if (cm.doc.sel == cm.display.selForContextMenu) {\n var first = text.charCodeAt(0);\n if (first == 0x200b && !prevInput) prevInput = \"\\u200b\";\n if (first == 0x21da) { this.reset(); return this.cm.execCommand(\"undo\"); }\n }\n // Find the part of the input that is actually new\n var same = 0, l = Math.min(prevInput.length, text.length);\n while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same;\n\n var self = this;\n runInOp(cm, function() {\n applyTextInput(cm, text.slice(same), prevInput.length - same,\n null, self.composing ? \"*compose\" : null);\n\n // Don't leave long text in the textarea, since it makes further polling slow\n if (text.length > 1000 || text.indexOf(\"\\n\") > -1) input.value = self.prevInput = \"\";\n else self.prevInput = text;\n\n if (self.composing) {\n self.composing.range.clear();\n self.composing.range = cm.markText(self.composing.start, cm.getCursor(\"to\"),\n {className: \"CodeMirror-composing\"});\n }\n });\n return true;\n },\n\n ensurePolled: function() {\n if (this.pollingFast && this.poll()) this.pollingFast = false;\n },\n\n onKeyPress: function() {\n if (ie && ie_version >= 9) this.hasSelection = null;\n this.fastPoll();\n },\n\n onContextMenu: function(e) {\n var input = this, cm = input.cm, display = cm.display, te = input.textarea;\n var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;\n if (!pos || presto) return; // Opera is difficult.\n\n // Reset the current text selection only if the click is done outside of the selection\n // and 'resetSelectionOnContextMenu' option is true.\n var reset = cm.options.resetSelectionOnContextMenu;\n if (reset && cm.doc.sel.contains(pos) == -1)\n operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll);\n\n var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText;\n input.wrapper.style.cssText = \"position: absolute\"\n var wrapperBox = input.wrapper.getBoundingClientRect()\n te.style.cssText = \"position: absolute; width: 30px; height: 30px; top: \" + (e.clientY - wrapperBox.top - 5) +\n \"px; left: \" + (e.clientX - wrapperBox.left - 5) + \"px; z-index: 1000; background: \" +\n (ie ? \"rgba(255, 255, 255, .05)\" : \"transparent\") +\n \"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\";\n if (webkit) var oldScrollY = window.scrollY; // Work around Chrome issue (#2712)\n display.input.focus();\n if (webkit) window.scrollTo(null, oldScrollY);\n display.input.reset();\n // Adds \"Select all\" to context menu in FF\n if (!cm.somethingSelected()) te.value = input.prevInput = \" \";\n input.contextMenuPending = true;\n display.selForContextMenu = cm.doc.sel;\n clearTimeout(display.detectingSelectAll);\n\n // Select-all will be greyed out if there's nothing to select, so\n // this adds a zero-width space so that we can later check whether\n // it got selected.\n function prepareSelectAllHack() {\n if (te.selectionStart != null) {\n var selected = cm.somethingSelected();\n var extval = \"\\u200b\" + (selected ? te.value : \"\");\n te.value = \"\\u21da\"; // Used to catch context-menu undo\n te.value = extval;\n input.prevInput = selected ? \"\" : \"\\u200b\";\n te.selectionStart = 1; te.selectionEnd = extval.length;\n // Re-set this, in case some other handler touched the\n // selection in the meantime.\n display.selForContextMenu = cm.doc.sel;\n }\n }\n function rehide() {\n input.contextMenuPending = false;\n input.wrapper.style.cssText = oldWrapperCSS\n te.style.cssText = oldCSS;\n if (ie && ie_version < 9) display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos);\n\n // Try to detect the user choosing select-all\n if (te.selectionStart != null) {\n if (!ie || (ie && ie_version < 9)) prepareSelectAllHack();\n var i = 0, poll = function() {\n if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&\n te.selectionEnd > 0 && input.prevInput == \"\\u200b\")\n operation(cm, commands.selectAll)(cm);\n else if (i++ < 10) display.detectingSelectAll = setTimeout(poll, 500);\n else display.input.reset();\n };\n display.detectingSelectAll = setTimeout(poll, 200);\n }\n }\n\n if (ie && ie_version >= 9) prepareSelectAllHack();\n if (captureRightClick) {\n e_stop(e);\n var mouseup = function() {\n off(window, \"mouseup\", mouseup);\n setTimeout(rehide, 20);\n };\n on(window, \"mouseup\", mouseup);\n } else {\n setTimeout(rehide, 50);\n }\n },\n\n readOnlyChanged: function(val) {\n if (!val) this.reset();\n },\n\n setUneditable: nothing,\n\n needsContentAttribute: false\n }, TextareaInput.prototype);\n\n // CONTENTEDITABLE INPUT STYLE\n\n function ContentEditableInput(cm) {\n this.cm = cm;\n this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;\n this.polling = new Delayed();\n this.gracePeriod = false;\n }\n\n ContentEditableInput.prototype = copyObj({\n init: function(display) {\n var input = this, cm = input.cm;\n var div = input.div = display.lineDiv;\n disableBrowserMagic(div);\n\n on(div, \"paste\", function(e) {\n if (!signalDOMEvent(cm, e)) handlePaste(e, cm);\n })\n\n on(div, \"compositionstart\", function(e) {\n var data = e.data;\n input.composing = {sel: cm.doc.sel, data: data, startData: data};\n if (!data) return;\n var prim = cm.doc.sel.primary();\n var line = cm.getLine(prim.head.line);\n var found = line.indexOf(data, Math.max(0, prim.head.ch - data.length));\n if (found > -1 && found <= prim.head.ch)\n input.composing.sel = simpleSelection(Pos(prim.head.line, found),\n Pos(prim.head.line, found + data.length));\n });\n on(div, \"compositionupdate\", function(e) {\n input.composing.data = e.data;\n });\n on(div, \"compositionend\", function(e) {\n var ours = input.composing;\n if (!ours) return;\n if (e.data != ours.startData && !/\\u200b/.test(e.data))\n ours.data = e.data;\n // Need a small delay to prevent other code (input event,\n // selection polling) from doing damage when fired right after\n // compositionend.\n setTimeout(function() {\n if (!ours.handled)\n input.applyComposition(ours);\n if (input.composing == ours)\n input.composing = null;\n }, 50);\n });\n\n on(div, \"touchstart\", function() {\n input.forceCompositionEnd();\n });\n\n on(div, \"input\", function() {\n if (input.composing) return;\n if (cm.isReadOnly() || !input.pollContent())\n runInOp(input.cm, function() {regChange(cm);});\n });\n\n function onCopyCut(e) {\n if (signalDOMEvent(cm, e)) return\n if (cm.somethingSelected()) {\n lastCopied = cm.getSelections();\n if (e.type == \"cut\") cm.replaceSelection(\"\", null, \"cut\");\n } else if (!cm.options.lineWiseCopyCut) {\n return;\n } else {\n var ranges = copyableRanges(cm);\n lastCopied = ranges.text;\n if (e.type == \"cut\") {\n cm.operation(function() {\n cm.setSelections(ranges.ranges, 0, sel_dontScroll);\n cm.replaceSelection(\"\", null, \"cut\");\n });\n }\n }\n // iOS exposes the clipboard API, but seems to discard content inserted into it\n if (e.clipboardData && !ios) {\n e.preventDefault();\n e.clipboardData.clearData();\n e.clipboardData.setData(\"text/plain\", lastCopied.join(\"\\n\"));\n } else {\n // Old-fashioned briefly-focus-a-textarea hack\n var kludge = hiddenTextarea(), te = kludge.firstChild;\n cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);\n te.value = lastCopied.join(\"\\n\");\n var hadFocus = document.activeElement;\n selectInput(te);\n setTimeout(function() {\n cm.display.lineSpace.removeChild(kludge);\n hadFocus.focus();\n }, 50);\n }\n }\n on(div, \"copy\", onCopyCut);\n on(div, \"cut\", onCopyCut);\n },\n\n prepareSelection: function() {\n var result = prepareSelection(this.cm, false);\n result.focus = this.cm.state.focused;\n return result;\n },\n\n showSelection: function(info) {\n if (!info || !this.cm.display.view.length) return;\n if (info.focus) this.showPrimarySelection();\n this.showMultipleSelections(info);\n },\n\n showPrimarySelection: function() {\n var sel = window.getSelection(), prim = this.cm.doc.sel.primary();\n var curAnchor = domToPos(this.cm, sel.anchorNode, sel.anchorOffset);\n var curFocus = domToPos(this.cm, sel.focusNode, sel.focusOffset);\n if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&\n cmp(minPos(curAnchor, curFocus), prim.from()) == 0 &&\n cmp(maxPos(curAnchor, curFocus), prim.to()) == 0)\n return;\n\n var start = posToDOM(this.cm, prim.from());\n var end = posToDOM(this.cm, prim.to());\n if (!start && !end) return;\n\n var view = this.cm.display.view;\n var old = sel.rangeCount && sel.getRangeAt(0);\n if (!start) {\n start = {node: view[0].measure.map[2], offset: 0};\n } else if (!end) { // FIXME dangerously hacky\n var measure = view[view.length - 1].measure;\n var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map;\n end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]};\n }\n\n try { var rng = range(start.node, start.offset, end.offset, end.node); }\n catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible\n if (rng) {\n if (!gecko && this.cm.state.focused) {\n sel.collapse(start.node, start.offset);\n if (!rng.collapsed) sel.addRange(rng);\n } else {\n sel.removeAllRanges();\n sel.addRange(rng);\n }\n if (old && sel.anchorNode == null) sel.addRange(old);\n else if (gecko) this.startGracePeriod();\n }\n this.rememberSelection();\n },\n\n startGracePeriod: function() {\n var input = this;\n clearTimeout(this.gracePeriod);\n this.gracePeriod = setTimeout(function() {\n input.gracePeriod = false;\n if (input.selectionChanged())\n input.cm.operation(function() { input.cm.curOp.selectionChanged = true; });\n }, 20);\n },\n\n showMultipleSelections: function(info) {\n removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);\n removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);\n },\n\n rememberSelection: function() {\n var sel = window.getSelection();\n this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;\n this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;\n },\n\n selectionInEditor: function() {\n var sel = window.getSelection();\n if (!sel.rangeCount) return false;\n var node = sel.getRangeAt(0).commonAncestorContainer;\n return contains(this.div, node);\n },\n\n focus: function() {\n if (this.cm.options.readOnly != \"nocursor\") this.div.focus();\n },\n blur: function() { this.div.blur(); },\n getField: function() { return this.div; },\n\n supportsTouch: function() { return true; },\n\n receivedFocus: function() {\n var input = this;\n if (this.selectionInEditor())\n this.pollSelection();\n else\n runInOp(this.cm, function() { input.cm.curOp.selectionChanged = true; });\n\n function poll() {\n if (input.cm.state.focused) {\n input.pollSelection();\n input.polling.set(input.cm.options.pollInterval, poll);\n }\n }\n this.polling.set(this.cm.options.pollInterval, poll);\n },\n\n selectionChanged: function() {\n var sel = window.getSelection();\n return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||\n sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset;\n },\n\n pollSelection: function() {\n if (!this.composing && !this.gracePeriod && this.selectionChanged()) {\n var sel = window.getSelection(), cm = this.cm;\n this.rememberSelection();\n var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n var head = domToPos(cm, sel.focusNode, sel.focusOffset);\n if (anchor && head) runInOp(cm, function() {\n setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll);\n if (anchor.bad || head.bad) cm.curOp.selectionChanged = true;\n });\n }\n },\n\n pollContent: function() {\n var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();\n var from = sel.from(), to = sel.to();\n if (from.line < display.viewFrom || to.line > display.viewTo - 1) return false;\n\n var fromIndex;\n if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {\n var fromLine = lineNo(display.view[0].line);\n var fromNode = display.view[0].node;\n } else {\n var fromLine = lineNo(display.view[fromIndex].line);\n var fromNode = display.view[fromIndex - 1].node.nextSibling;\n }\n var toIndex = findViewIndex(cm, to.line);\n if (toIndex == display.view.length - 1) {\n var toLine = display.viewTo - 1;\n var toNode = display.lineDiv.lastChild;\n } else {\n var toLine = lineNo(display.view[toIndex + 1].line) - 1;\n var toNode = display.view[toIndex + 1].node.previousSibling;\n }\n\n var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine));\n var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length));\n while (newText.length > 1 && oldText.length > 1) {\n if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; }\n else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; }\n else break;\n }\n\n var cutFront = 0, cutEnd = 0;\n var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length);\n while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))\n ++cutFront;\n var newBot = lst(newText), oldBot = lst(oldText);\n var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),\n oldBot.length - (oldText.length == 1 ? cutFront : 0));\n while (cutEnd < maxCutEnd &&\n newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))\n ++cutEnd;\n\n newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd);\n newText[0] = newText[0].slice(cutFront);\n\n var chFrom = Pos(fromLine, cutFront);\n var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0);\n if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {\n replaceRange(cm.doc, newText, chFrom, chTo, \"+input\");\n return true;\n }\n },\n\n ensurePolled: function() {\n this.forceCompositionEnd();\n },\n reset: function() {\n this.forceCompositionEnd();\n },\n forceCompositionEnd: function() {\n if (!this.composing || this.composing.handled) return;\n this.applyComposition(this.composing);\n this.composing.handled = true;\n this.div.blur();\n this.div.focus();\n },\n applyComposition: function(composing) {\n if (this.cm.isReadOnly())\n operation(this.cm, regChange)(this.cm)\n else if (composing.data && composing.data != composing.startData)\n operation(this.cm, applyTextInput)(this.cm, composing.data, 0, composing.sel);\n },\n\n setUneditable: function(node) {\n node.contentEditable = \"false\"\n },\n\n onKeyPress: function(e) {\n e.preventDefault();\n if (!this.cm.isReadOnly())\n operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0);\n },\n\n readOnlyChanged: function(val) {\n this.div.contentEditable = String(val != \"nocursor\")\n },\n\n onContextMenu: nothing,\n resetPosition: nothing,\n\n needsContentAttribute: true\n }, ContentEditableInput.prototype);\n\n function posToDOM(cm, pos) {\n var view = findViewForLine(cm, pos.line);\n if (!view || view.hidden) return null;\n var line = getLine(cm.doc, pos.line);\n var info = mapFromLineView(view, line, pos.line);\n\n var order = getOrder(line), side = \"left\";\n if (order) {\n var partPos = getBidiPartAt(order, pos.ch);\n side = partPos % 2 ? \"right\" : \"left\";\n }\n var result = nodeAndOffsetInLineMap(info.map, pos.ch, side);\n result.offset = result.collapse == \"right\" ? result.end : result.start;\n return result;\n }\n\n function badPos(pos, bad) { if (bad) pos.bad = true; return pos; }\n\n function domToPos(cm, node, offset) {\n var lineNode;\n if (node == cm.display.lineDiv) {\n lineNode = cm.display.lineDiv.childNodes[offset];\n if (!lineNode) return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true);\n node = null; offset = 0;\n } else {\n for (lineNode = node;; lineNode = lineNode.parentNode) {\n if (!lineNode || lineNode == cm.display.lineDiv) return null;\n if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) break;\n }\n }\n for (var i = 0; i < cm.display.view.length; i++) {\n var lineView = cm.display.view[i];\n if (lineView.node == lineNode)\n return locateNodeInLineView(lineView, node, offset);\n }\n }\n\n function locateNodeInLineView(lineView, node, offset) {\n var wrapper = lineView.text.firstChild, bad = false;\n if (!node || !contains(wrapper, node)) return badPos(Pos(lineNo(lineView.line), 0), true);\n if (node == wrapper) {\n bad = true;\n node = wrapper.childNodes[offset];\n offset = 0;\n if (!node) {\n var line = lineView.rest ? lst(lineView.rest) : lineView.line;\n return badPos(Pos(lineNo(line), line.text.length), bad);\n }\n }\n\n var textNode = node.nodeType == 3 ? node : null, topNode = node;\n if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {\n textNode = node.firstChild;\n if (offset) offset = textNode.nodeValue.length;\n }\n while (topNode.parentNode != wrapper) topNode = topNode.parentNode;\n var measure = lineView.measure, maps = measure.maps;\n\n function find(textNode, topNode, offset) {\n for (var i = -1; i < (maps ? maps.length : 0); i++) {\n var map = i < 0 ? measure.map : maps[i];\n for (var j = 0; j < map.length; j += 3) {\n var curNode = map[j + 2];\n if (curNode == textNode || curNode == topNode) {\n var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]);\n var ch = map[j] + offset;\n if (offset < 0 || curNode != textNode) ch = map[j + (offset ? 1 : 0)];\n return Pos(line, ch);\n }\n }\n }\n }\n var found = find(textNode, topNode, offset);\n if (found) return badPos(found, bad);\n\n // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems\n for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {\n found = find(after, after.firstChild, 0);\n if (found)\n return badPos(Pos(found.line, found.ch - dist), bad);\n else\n dist += after.textContent.length;\n }\n for (var before = topNode.previousSibling, dist = offset; before; before = before.previousSibling) {\n found = find(before, before.firstChild, -1);\n if (found)\n return badPos(Pos(found.line, found.ch + dist), bad);\n else\n dist += after.textContent.length;\n }\n }\n\n function domTextBetween(cm, from, to, fromLine, toLine) {\n var text = \"\", closing = false, lineSep = cm.doc.lineSeparator();\n function recognizeMarker(id) { return function(marker) { return marker.id == id; }; }\n function walk(node) {\n if (node.nodeType == 1) {\n var cmText = node.getAttribute(\"cm-text\");\n if (cmText != null) {\n if (cmText == \"\") cmText = node.textContent.replace(/\\u200b/g, \"\");\n text += cmText;\n return;\n }\n var markerID = node.getAttribute(\"cm-marker\"), range;\n if (markerID) {\n var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID));\n if (found.length && (range = found[0].find()))\n text += getBetween(cm.doc, range.from, range.to).join(lineSep);\n return;\n }\n if (node.getAttribute(\"contenteditable\") == \"false\") return;\n for (var i = 0; i < node.childNodes.length; i++)\n walk(node.childNodes[i]);\n if (/^(pre|div|p)$/i.test(node.nodeName))\n closing = true;\n } else if (node.nodeType == 3) {\n var val = node.nodeValue;\n if (!val) return;\n if (closing) {\n text += lineSep;\n closing = false;\n }\n text += val;\n }\n }\n for (;;) {\n walk(from);\n if (from == to) break;\n from = from.nextSibling;\n }\n return text;\n }\n\n CodeMirror.inputStyles = {\"textarea\": TextareaInput, \"contenteditable\": ContentEditableInput};\n\n // SELECTION / CURSOR\n\n // Selection objects are immutable. A new one is created every time\n // the selection changes. A selection is one or more non-overlapping\n // (and non-touching) ranges, sorted, and an integer that indicates\n // which one is the primary selection (the one that's scrolled into\n // view, that getCursor returns, etc).\n function Selection(ranges, primIndex) {\n this.ranges = ranges;\n this.primIndex = primIndex;\n }\n\n Selection.prototype = {\n primary: function() { return this.ranges[this.primIndex]; },\n equals: function(other) {\n if (other == this) return true;\n if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) return false;\n for (var i = 0; i < this.ranges.length; i++) {\n var here = this.ranges[i], there = other.ranges[i];\n if (cmp(here.anchor, there.anchor) != 0 || cmp(here.head, there.head) != 0) return false;\n }\n return true;\n },\n deepCopy: function() {\n for (var out = [], i = 0; i < this.ranges.length; i++)\n out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head));\n return new Selection(out, this.primIndex);\n },\n somethingSelected: function() {\n for (var i = 0; i < this.ranges.length; i++)\n if (!this.ranges[i].empty()) return true;\n return false;\n },\n contains: function(pos, end) {\n if (!end) end = pos;\n for (var i = 0; i < this.ranges.length; i++) {\n var range = this.ranges[i];\n if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)\n return i;\n }\n return -1;\n }\n };\n\n function Range(anchor, head) {\n this.anchor = anchor; this.head = head;\n }\n\n Range.prototype = {\n from: function() { return minPos(this.anchor, this.head); },\n to: function() { return maxPos(this.anchor, this.head); },\n empty: function() {\n return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch;\n }\n };\n\n // Take an unsorted, potentially overlapping set of ranges, and\n // build a selection out of it. 'Consumes' ranges array (modifying\n // it).\n function normalizeSelection(ranges, primIndex) {\n var prim = ranges[primIndex];\n ranges.sort(function(a, b) { return cmp(a.from(), b.from()); });\n primIndex = indexOf(ranges, prim);\n for (var i = 1; i < ranges.length; i++) {\n var cur = ranges[i], prev = ranges[i - 1];\n if (cmp(prev.to(), cur.from()) >= 0) {\n var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());\n var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;\n if (i <= primIndex) --primIndex;\n ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));\n }\n }\n return new Selection(ranges, primIndex);\n }\n\n function simpleSelection(anchor, head) {\n return new Selection([new Range(anchor, head || anchor)], 0);\n }\n\n // Most of the external API clips given positions to make sure they\n // actually exist within the document.\n function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));}\n function clipPos(doc, pos) {\n if (pos.line < doc.first) return Pos(doc.first, 0);\n var last = doc.first + doc.size - 1;\n if (pos.line > last) return Pos(last, getLine(doc, last).text.length);\n return clipToLen(pos, getLine(doc, pos.line).text.length);\n }\n function clipToLen(pos, linelen) {\n var ch = pos.ch;\n if (ch == null || ch > linelen) return Pos(pos.line, linelen);\n else if (ch < 0) return Pos(pos.line, 0);\n else return pos;\n }\n function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;}\n function clipPosArray(doc, array) {\n for (var out = [], i = 0; i < array.length; i++) out[i] = clipPos(doc, array[i]);\n return out;\n }\n\n // SELECTION UPDATES\n\n // The 'scroll' parameter given to many of these indicated whether\n // the new cursor position should be scrolled into view after\n // modifying the selection.\n\n // If shift is held or the extend flag is set, extends a range to\n // include a given position (and optionally a second position).\n // Otherwise, simply returns the range between the given positions.\n // Used for cursor motion and such.\n function extendRange(doc, range, head, other) {\n if (doc.cm && doc.cm.display.shift || doc.extend) {\n var anchor = range.anchor;\n if (other) {\n var posBefore = cmp(head, anchor) < 0;\n if (posBefore != (cmp(other, anchor) < 0)) {\n anchor = head;\n head = other;\n } else if (posBefore != (cmp(head, other) < 0)) {\n head = other;\n }\n }\n return new Range(anchor, head);\n } else {\n return new Range(other || head, head);\n }\n }\n\n // Extend the primary selection range, discard the rest.\n function extendSelection(doc, head, other, options) {\n setSelection(doc, new Selection([extendRange(doc, doc.sel.primary(), head, other)], 0), options);\n }\n\n // Extend all selections (pos is an array of selections with length\n // equal the number of selections)\n function extendSelections(doc, heads, options) {\n for (var out = [], i = 0; i < doc.sel.ranges.length; i++)\n out[i] = extendRange(doc, doc.sel.ranges[i], heads[i], null);\n var newSel = normalizeSelection(out, doc.sel.primIndex);\n setSelection(doc, newSel, options);\n }\n\n // Updates a single range in the selection.\n function replaceOneSelection(doc, i, range, options) {\n var ranges = doc.sel.ranges.slice(0);\n ranges[i] = range;\n setSelection(doc, normalizeSelection(ranges, doc.sel.primIndex), options);\n }\n\n // Reset the selection to a single range.\n function setSimpleSelection(doc, anchor, head, options) {\n setSelection(doc, simpleSelection(anchor, head), options);\n }\n\n // Give beforeSelectionChange handlers a change to influence a\n // selection update.\n function filterSelectionChange(doc, sel, options) {\n var obj = {\n ranges: sel.ranges,\n update: function(ranges) {\n this.ranges = [];\n for (var i = 0; i < ranges.length; i++)\n this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),\n clipPos(doc, ranges[i].head));\n },\n origin: options && options.origin\n };\n signal(doc, \"beforeSelectionChange\", doc, obj);\n if (doc.cm) signal(doc.cm, \"beforeSelectionChange\", doc.cm, obj);\n if (obj.ranges != sel.ranges) return normalizeSelection(obj.ranges, obj.ranges.length - 1);\n else return sel;\n }\n\n function setSelectionReplaceHistory(doc, sel, options) {\n var done = doc.history.done, last = lst(done);\n if (last && last.ranges) {\n done[done.length - 1] = sel;\n setSelectionNoUndo(doc, sel, options);\n } else {\n setSelection(doc, sel, options);\n }\n }\n\n // Set a new selection.\n function setSelection(doc, sel, options) {\n setSelectionNoUndo(doc, sel, options);\n addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);\n }\n\n function setSelectionNoUndo(doc, sel, options) {\n if (hasHandler(doc, \"beforeSelectionChange\") || doc.cm && hasHandler(doc.cm, \"beforeSelectionChange\"))\n sel = filterSelectionChange(doc, sel, options);\n\n var bias = options && options.bias ||\n (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);\n setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));\n\n if (!(options && options.scroll === false) && doc.cm)\n ensureCursorVisible(doc.cm);\n }\n\n function setSelectionInner(doc, sel) {\n if (sel.equals(doc.sel)) return;\n\n doc.sel = sel;\n\n if (doc.cm) {\n doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true;\n signalCursorActivity(doc.cm);\n }\n signalLater(doc, \"cursorActivity\", doc);\n }\n\n // Verify that the selection does not partially select any atomic\n // marked ranges.\n function reCheckSelection(doc) {\n setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false), sel_dontScroll);\n }\n\n // Return a selection that does not partially select any atomic\n // ranges.\n function skipAtomicInSelection(doc, sel, bias, mayClear) {\n var out;\n for (var i = 0; i < sel.ranges.length; i++) {\n var range = sel.ranges[i];\n var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i];\n var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear);\n var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear);\n if (out || newAnchor != range.anchor || newHead != range.head) {\n if (!out) out = sel.ranges.slice(0, i);\n out[i] = new Range(newAnchor, newHead);\n }\n }\n return out ? normalizeSelection(out, sel.primIndex) : sel;\n }\n\n function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {\n var line = getLine(doc, pos.line);\n if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) {\n var sp = line.markedSpans[i], m = sp.marker;\n if ((sp.from == null || (m.inclusiveLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&\n (sp.to == null || (m.inclusiveRight ? sp.to >= pos.ch : sp.to > pos.ch))) {\n if (mayClear) {\n signal(m, \"beforeCursorEnter\");\n if (m.explicitlyCleared) {\n if (!line.markedSpans) break;\n else {--i; continue;}\n }\n }\n if (!m.atomic) continue;\n\n if (oldPos) {\n var near = m.find(dir < 0 ? 1 : -1), diff;\n if (dir < 0 ? m.inclusiveRight : m.inclusiveLeft)\n near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null);\n if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))\n return skipAtomicInner(doc, near, pos, dir, mayClear);\n }\n\n var far = m.find(dir < 0 ? -1 : 1);\n if (dir < 0 ? m.inclusiveLeft : m.inclusiveRight)\n far = movePos(doc, far, dir, far.line == pos.line ? line : null);\n return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null;\n }\n }\n return pos;\n }\n\n // Ensure a given position is not inside an atomic range.\n function skipAtomic(doc, pos, oldPos, bias, mayClear) {\n var dir = bias || 1;\n var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||\n (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||\n skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||\n (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true));\n if (!found) {\n doc.cantEdit = true;\n return Pos(doc.first, 0);\n }\n return found;\n }\n\n function movePos(doc, pos, dir, line) {\n if (dir < 0 && pos.ch == 0) {\n if (pos.line > doc.first) return clipPos(doc, Pos(pos.line - 1));\n else return null;\n } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {\n if (pos.line < doc.first + doc.size - 1) return Pos(pos.line + 1, 0);\n else return null;\n } else {\n return new Pos(pos.line, pos.ch + dir);\n }\n }\n\n // SELECTION DRAWING\n\n function updateSelection(cm) {\n cm.display.input.showSelection(cm.display.input.prepareSelection());\n }\n\n function prepareSelection(cm, primary) {\n var doc = cm.doc, result = {};\n var curFragment = result.cursors = document.createDocumentFragment();\n var selFragment = result.selection = document.createDocumentFragment();\n\n for (var i = 0; i < doc.sel.ranges.length; i++) {\n if (primary === false && i == doc.sel.primIndex) continue;\n var range = doc.sel.ranges[i];\n if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) continue;\n var collapsed = range.empty();\n if (collapsed || cm.options.showCursorWhenSelecting)\n drawSelectionCursor(cm, range.head, curFragment);\n if (!collapsed)\n drawSelectionRange(cm, range, selFragment);\n }\n return result;\n }\n\n // Draws a cursor for the given range\n function drawSelectionCursor(cm, head, output) {\n var pos = cursorCoords(cm, head, \"div\", null, null, !cm.options.singleCursorHeightPerLine);\n\n var cursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor\"));\n cursor.style.left = pos.left + \"px\";\n cursor.style.top = pos.top + \"px\";\n cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + \"px\";\n\n if (pos.other) {\n // Secondary cursor, shown when on a 'jump' in bi-directional text\n var otherCursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor CodeMirror-secondarycursor\"));\n otherCursor.style.display = \"\";\n otherCursor.style.left = pos.other.left + \"px\";\n otherCursor.style.top = pos.other.top + \"px\";\n otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + \"px\";\n }\n }\n\n // Draws the given range as a highlighted selection\n function drawSelectionRange(cm, range, output) {\n var display = cm.display, doc = cm.doc;\n var fragment = document.createDocumentFragment();\n var padding = paddingH(cm.display), leftSide = padding.left;\n var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;\n\n function add(left, top, width, bottom) {\n if (top < 0) top = 0;\n top = Math.round(top);\n bottom = Math.round(bottom);\n fragment.appendChild(elt(\"div\", null, \"CodeMirror-selected\", \"position: absolute; left: \" + left +\n \"px; top: \" + top + \"px; width: \" + (width == null ? rightSide - left : width) +\n \"px; height: \" + (bottom - top) + \"px\"));\n }\n\n function drawForLine(line, fromArg, toArg) {\n var lineObj = getLine(doc, line);\n var lineLen = lineObj.text.length;\n var start, end;\n function coords(ch, bias) {\n return charCoords(cm, Pos(line, ch), \"div\", lineObj, bias);\n }\n\n iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) {\n var leftPos = coords(from, \"left\"), rightPos, left, right;\n if (from == to) {\n rightPos = leftPos;\n left = right = leftPos.left;\n } else {\n rightPos = coords(to - 1, \"right\");\n if (dir == \"rtl\") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }\n left = leftPos.left;\n right = rightPos.right;\n }\n if (fromArg == null && from == 0) left = leftSide;\n if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part\n add(left, leftPos.top, null, leftPos.bottom);\n left = leftSide;\n if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);\n }\n if (toArg == null && to == lineLen) right = rightSide;\n if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)\n start = leftPos;\n if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)\n end = rightPos;\n if (left < leftSide + 1) left = leftSide;\n add(left, rightPos.top, right - left, rightPos.bottom);\n });\n return {start: start, end: end};\n }\n\n var sFrom = range.from(), sTo = range.to();\n if (sFrom.line == sTo.line) {\n drawForLine(sFrom.line, sFrom.ch, sTo.ch);\n } else {\n var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);\n var singleVLine = visualLine(fromLine) == visualLine(toLine);\n var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;\n var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;\n if (singleVLine) {\n if (leftEnd.top < rightStart.top - 2) {\n add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);\n add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);\n } else {\n add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);\n }\n }\n if (leftEnd.bottom < rightStart.top)\n add(leftSide, leftEnd.bottom, null, rightStart.top);\n }\n\n output.appendChild(fragment);\n }\n\n // Cursor-blinking\n function restartBlink(cm) {\n if (!cm.state.focused) return;\n var display = cm.display;\n clearInterval(display.blinker);\n var on = true;\n display.cursorDiv.style.visibility = \"\";\n if (cm.options.cursorBlinkRate > 0)\n display.blinker = setInterval(function() {\n display.cursorDiv.style.visibility = (on = !on) ? \"\" : \"hidden\";\n }, cm.options.cursorBlinkRate);\n else if (cm.options.cursorBlinkRate < 0)\n display.cursorDiv.style.visibility = \"hidden\";\n }\n\n // HIGHLIGHT WORKER\n\n function startWorker(cm, time) {\n if (cm.doc.mode.startState && cm.doc.frontier < cm.display.viewTo)\n cm.state.highlight.set(time, bind(highlightWorker, cm));\n }\n\n function highlightWorker(cm) {\n var doc = cm.doc;\n if (doc.frontier < doc.first) doc.frontier = doc.first;\n if (doc.frontier >= cm.display.viewTo) return;\n var end = +new Date + cm.options.workTime;\n var state = copyState(doc.mode, getStateBefore(cm, doc.frontier));\n var changedLines = [];\n\n doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function(line) {\n if (doc.frontier >= cm.display.viewFrom) { // Visible\n var oldStyles = line.styles, tooLong = line.text.length > cm.options.maxHighlightLength;\n var highlighted = highlightLine(cm, line, tooLong ? copyState(doc.mode, state) : state, true);\n line.styles = highlighted.styles;\n var oldCls = line.styleClasses, newCls = highlighted.classes;\n if (newCls) line.styleClasses = newCls;\n else if (oldCls) line.styleClasses = null;\n var ischange = !oldStyles || oldStyles.length != line.styles.length ||\n oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);\n for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i];\n if (ischange) changedLines.push(doc.frontier);\n line.stateAfter = tooLong ? state : copyState(doc.mode, state);\n } else {\n if (line.text.length <= cm.options.maxHighlightLength)\n processLine(cm, line.text, state);\n line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null;\n }\n ++doc.frontier;\n if (+new Date > end) {\n startWorker(cm, cm.options.workDelay);\n return true;\n }\n });\n if (changedLines.length) runInOp(cm, function() {\n for (var i = 0; i < changedLines.length; i++)\n regLineChange(cm, changedLines[i], \"text\");\n });\n }\n\n // Finds the line to start with when starting a parse. Tries to\n // find a line with a stateAfter, so that it can start with a\n // valid state. If that fails, it returns the line with the\n // smallest indentation, which tends to need the least context to\n // parse correctly.\n function findStartLine(cm, n, precise) {\n var minindent, minline, doc = cm.doc;\n var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);\n for (var search = n; search > lim; --search) {\n if (search <= doc.first) return doc.first;\n var line = getLine(doc, search - 1);\n if (line.stateAfter && (!precise || search <= doc.frontier)) return search;\n var indented = countColumn(line.text, null, cm.options.tabSize);\n if (minline == null || minindent > indented) {\n minline = search - 1;\n minindent = indented;\n }\n }\n return minline;\n }\n\n function getStateBefore(cm, n, precise) {\n var doc = cm.doc, display = cm.display;\n if (!doc.mode.startState) return true;\n var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter;\n if (!state) state = startState(doc.mode);\n else state = copyState(doc.mode, state);\n doc.iter(pos, n, function(line) {\n processLine(cm, line.text, state);\n var save = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo;\n line.stateAfter = save ? copyState(doc.mode, state) : null;\n ++pos;\n });\n if (precise) doc.frontier = pos;\n return state;\n }\n\n // POSITION MEASUREMENT\n\n function paddingTop(display) {return display.lineSpace.offsetTop;}\n function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;}\n function paddingH(display) {\n if (display.cachedPaddingH) return display.cachedPaddingH;\n var e = removeChildrenAndAdd(display.measure, elt(\"pre\", \"x\"));\n var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;\n var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};\n if (!isNaN(data.left) && !isNaN(data.right)) display.cachedPaddingH = data;\n return data;\n }\n\n function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth; }\n function displayWidth(cm) {\n return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth;\n }\n function displayHeight(cm) {\n return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight;\n }\n\n // Ensure the lineView.wrapping.heights array is populated. This is\n // an array of bottom offsets for the lines that make up a drawn\n // line. When lineWrapping is on, there might be more than one\n // height.\n function ensureLineHeights(cm, lineView, rect) {\n var wrapping = cm.options.lineWrapping;\n var curWidth = wrapping && displayWidth(cm);\n if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {\n var heights = lineView.measure.heights = [];\n if (wrapping) {\n lineView.measure.width = curWidth;\n var rects = lineView.text.firstChild.getClientRects();\n for (var i = 0; i < rects.length - 1; i++) {\n var cur = rects[i], next = rects[i + 1];\n if (Math.abs(cur.bottom - next.bottom) > 2)\n heights.push((cur.bottom + next.top) / 2 - rect.top);\n }\n }\n heights.push(rect.bottom - rect.top);\n }\n }\n\n // Find a line map (mapping character offsets to text nodes) and a\n // measurement cache for the given line number. (A line view might\n // contain multiple lines when collapsed ranges are present.)\n function mapFromLineView(lineView, line, lineN) {\n if (lineView.line == line)\n return {map: lineView.measure.map, cache: lineView.measure.cache};\n for (var i = 0; i < lineView.rest.length; i++)\n if (lineView.rest[i] == line)\n return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]};\n for (var i = 0; i < lineView.rest.length; i++)\n if (lineNo(lineView.rest[i]) > lineN)\n return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i], before: true};\n }\n\n // Render a line into the hidden node display.externalMeasured. Used\n // when measurement is needed for a line that's not in the viewport.\n function updateExternalMeasurement(cm, line) {\n line = visualLine(line);\n var lineN = lineNo(line);\n var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);\n view.lineN = lineN;\n var built = view.built = buildLineContent(cm, view);\n view.text = built.pre;\n removeChildrenAndAdd(cm.display.lineMeasure, built.pre);\n return view;\n }\n\n // Get a {top, bottom, left, right} box (in line-local coordinates)\n // for a given character.\n function measureChar(cm, line, ch, bias) {\n return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias);\n }\n\n // Find a line view that corresponds to the given line number.\n function findViewForLine(cm, lineN) {\n if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)\n return cm.display.view[findViewIndex(cm, lineN)];\n var ext = cm.display.externalMeasured;\n if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)\n return ext;\n }\n\n // Measurement can be split in two steps, the set-up work that\n // applies to the whole line, and the measurement of the actual\n // character. Functions like coordsChar, that need to do a lot of\n // measurements in a row, can thus ensure that the set-up work is\n // only done once.\n function prepareMeasureForLine(cm, line) {\n var lineN = lineNo(line);\n var view = findViewForLine(cm, lineN);\n if (view && !view.text) {\n view = null;\n } else if (view && view.changes) {\n updateLineForChanges(cm, view, lineN, getDimensions(cm));\n cm.curOp.forceUpdate = true;\n }\n if (!view)\n view = updateExternalMeasurement(cm, line);\n\n var info = mapFromLineView(view, line, lineN);\n return {\n line: line, view: view, rect: null,\n map: info.map, cache: info.cache, before: info.before,\n hasHeights: false\n };\n }\n\n // Given a prepared measurement object, measures the position of an\n // actual character (or fetches it from the cache).\n function measureCharPrepared(cm, prepared, ch, bias, varHeight) {\n if (prepared.before) ch = -1;\n var key = ch + (bias || \"\"), found;\n if (prepared.cache.hasOwnProperty(key)) {\n found = prepared.cache[key];\n } else {\n if (!prepared.rect)\n prepared.rect = prepared.view.text.getBoundingClientRect();\n if (!prepared.hasHeights) {\n ensureLineHeights(cm, prepared.view, prepared.rect);\n prepared.hasHeights = true;\n }\n found = measureCharInner(cm, prepared, ch, bias);\n if (!found.bogus) prepared.cache[key] = found;\n }\n return {left: found.left, right: found.right,\n top: varHeight ? found.rtop : found.top,\n bottom: varHeight ? found.rbottom : found.bottom};\n }\n\n var nullRect = {left: 0, right: 0, top: 0, bottom: 0};\n\n function nodeAndOffsetInLineMap(map, ch, bias) {\n var node, start, end, collapse;\n // First, search the line map for the text node corresponding to,\n // or closest to, the target character.\n for (var i = 0; i < map.length; i += 3) {\n var mStart = map[i], mEnd = map[i + 1];\n if (ch < mStart) {\n start = 0; end = 1;\n collapse = \"left\";\n } else if (ch < mEnd) {\n start = ch - mStart;\n end = start + 1;\n } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {\n end = mEnd - mStart;\n start = end - 1;\n if (ch >= mEnd) collapse = \"right\";\n }\n if (start != null) {\n node = map[i + 2];\n if (mStart == mEnd && bias == (node.insertLeft ? \"left\" : \"right\"))\n collapse = bias;\n if (bias == \"left\" && start == 0)\n while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {\n node = map[(i -= 3) + 2];\n collapse = \"left\";\n }\n if (bias == \"right\" && start == mEnd - mStart)\n while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {\n node = map[(i += 3) + 2];\n collapse = \"right\";\n }\n break;\n }\n }\n return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd};\n }\n\n function measureCharInner(cm, prepared, ch, bias) {\n var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);\n var node = place.node, start = place.start, end = place.end, collapse = place.collapse;\n\n var rect;\n if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.\n for (var i = 0; i < 4; i++) { // Retry a maximum of 4 times when nonsense rectangles are returned\n while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) --start;\n while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) ++end;\n if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) {\n rect = node.parentNode.getBoundingClientRect();\n } else if (ie && cm.options.lineWrapping) {\n var rects = range(node, start, end).getClientRects();\n if (rects.length)\n rect = rects[bias == \"right\" ? rects.length - 1 : 0];\n else\n rect = nullRect;\n } else {\n rect = range(node, start, end).getBoundingClientRect() || nullRect;\n }\n if (rect.left || rect.right || start == 0) break;\n end = start;\n start = start - 1;\n collapse = \"right\";\n }\n if (ie && ie_version < 11) rect = maybeUpdateRectForZooming(cm.display.measure, rect);\n } else { // If it is a widget, simply get the box for the whole widget.\n if (start > 0) collapse = bias = \"right\";\n var rects;\n if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)\n rect = rects[bias == \"right\" ? rects.length - 1 : 0];\n else\n rect = node.getBoundingClientRect();\n }\n if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {\n var rSpan = node.parentNode.getClientRects()[0];\n if (rSpan)\n rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom};\n else\n rect = nullRect;\n }\n\n var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;\n var mid = (rtop + rbot) / 2;\n var heights = prepared.view.measure.heights;\n for (var i = 0; i < heights.length - 1; i++)\n if (mid < heights[i]) break;\n var top = i ? heights[i - 1] : 0, bot = heights[i];\n var result = {left: (collapse == \"right\" ? rect.right : rect.left) - prepared.rect.left,\n right: (collapse == \"left\" ? rect.left : rect.right) - prepared.rect.left,\n top: top, bottom: bot};\n if (!rect.left && !rect.right) result.bogus = true;\n if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }\n\n return result;\n }\n\n // Work around problem with bounding client rects on ranges being\n // returned incorrectly when zoomed on IE10 and below.\n function maybeUpdateRectForZooming(measure, rect) {\n if (!window.screen || screen.logicalXDPI == null ||\n screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))\n return rect;\n var scaleX = screen.logicalXDPI / screen.deviceXDPI;\n var scaleY = screen.logicalYDPI / screen.deviceYDPI;\n return {left: rect.left * scaleX, right: rect.right * scaleX,\n top: rect.top * scaleY, bottom: rect.bottom * scaleY};\n }\n\n function clearLineMeasurementCacheFor(lineView) {\n if (lineView.measure) {\n lineView.measure.cache = {};\n lineView.measure.heights = null;\n if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)\n lineView.measure.caches[i] = {};\n }\n }\n\n function clearLineMeasurementCache(cm) {\n cm.display.externalMeasure = null;\n removeChildren(cm.display.lineMeasure);\n for (var i = 0; i < cm.display.view.length; i++)\n clearLineMeasurementCacheFor(cm.display.view[i]);\n }\n\n function clearCaches(cm) {\n clearLineMeasurementCache(cm);\n cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;\n if (!cm.options.lineWrapping) cm.display.maxLineChanged = true;\n cm.display.lineNumChars = null;\n }\n\n function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; }\n function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; }\n\n // Converts a {top, bottom, left, right} box from line-local\n // coordinates into another coordinate system. Context may be one of\n // \"line\", \"div\" (display.lineDiv), \"local\"/null (editor), \"window\",\n // or \"page\".\n function intoCoordSystem(cm, lineObj, rect, context) {\n if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) {\n var size = widgetHeight(lineObj.widgets[i]);\n rect.top += size; rect.bottom += size;\n }\n if (context == \"line\") return rect;\n if (!context) context = \"local\";\n var yOff = heightAtLine(lineObj);\n if (context == \"local\") yOff += paddingTop(cm.display);\n else yOff -= cm.display.viewOffset;\n if (context == \"page\" || context == \"window\") {\n var lOff = cm.display.lineSpace.getBoundingClientRect();\n yOff += lOff.top + (context == \"window\" ? 0 : pageScrollY());\n var xOff = lOff.left + (context == \"window\" ? 0 : pageScrollX());\n rect.left += xOff; rect.right += xOff;\n }\n rect.top += yOff; rect.bottom += yOff;\n return rect;\n }\n\n // Coverts a box from \"div\" coords to another coordinate system.\n // Context may be \"window\", \"page\", \"div\", or \"local\"/null.\n function fromCoordSystem(cm, coords, context) {\n if (context == \"div\") return coords;\n var left = coords.left, top = coords.top;\n // First move into \"page\" coordinate system\n if (context == \"page\") {\n left -= pageScrollX();\n top -= pageScrollY();\n } else if (context == \"local\" || !context) {\n var localBox = cm.display.sizer.getBoundingClientRect();\n left += localBox.left;\n top += localBox.top;\n }\n\n var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();\n return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top};\n }\n\n function charCoords(cm, pos, context, lineObj, bias) {\n if (!lineObj) lineObj = getLine(cm.doc, pos.line);\n return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context);\n }\n\n // Returns a box for a given cursor position, which may have an\n // 'other' property containing the position of the secondary cursor\n // on a bidi boundary.\n function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {\n lineObj = lineObj || getLine(cm.doc, pos.line);\n if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj);\n function get(ch, right) {\n var m = measureCharPrepared(cm, preparedMeasure, ch, right ? \"right\" : \"left\", varHeight);\n if (right) m.left = m.right; else m.right = m.left;\n return intoCoordSystem(cm, lineObj, m, context);\n }\n function getBidi(ch, partPos) {\n var part = order[partPos], right = part.level % 2;\n if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) {\n part = order[--partPos];\n ch = bidiRight(part) - (part.level % 2 ? 0 : 1);\n right = true;\n } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) {\n part = order[++partPos];\n ch = bidiLeft(part) - part.level % 2;\n right = false;\n }\n if (right && ch == part.to && ch > part.from) return get(ch - 1);\n return get(ch, right);\n }\n var order = getOrder(lineObj), ch = pos.ch;\n if (!order) return get(ch);\n var partPos = getBidiPartAt(order, ch);\n var val = getBidi(ch, partPos);\n if (bidiOther != null) val.other = getBidi(ch, bidiOther);\n return val;\n }\n\n // Used to cheaply estimate the coordinates for a position. Used for\n // intermediate scroll updates.\n function estimateCoords(cm, pos) {\n var left = 0, pos = clipPos(cm.doc, pos);\n if (!cm.options.lineWrapping) left = charWidth(cm.display) * pos.ch;\n var lineObj = getLine(cm.doc, pos.line);\n var top = heightAtLine(lineObj) + paddingTop(cm.display);\n return {left: left, right: left, top: top, bottom: top + lineObj.height};\n }\n\n // Positions returned by coordsChar contain some extra information.\n // xRel is the relative x position of the input coordinates compared\n // to the found position (so xRel > 0 means the coordinates are to\n // the right of the character position, for example). When outside\n // is true, that means the coordinates lie outside the line's\n // vertical range.\n function PosWithInfo(line, ch, outside, xRel) {\n var pos = Pos(line, ch);\n pos.xRel = xRel;\n if (outside) pos.outside = true;\n return pos;\n }\n\n // Compute the character position closest to the given coordinates.\n // Input must be lineSpace-local (\"div\" coordinate system).\n function coordsChar(cm, x, y) {\n var doc = cm.doc;\n y += cm.display.viewOffset;\n if (y < 0) return PosWithInfo(doc.first, 0, true, -1);\n var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;\n if (lineN > last)\n return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1);\n if (x < 0) x = 0;\n\n var lineObj = getLine(doc, lineN);\n for (;;) {\n var found = coordsCharInner(cm, lineObj, lineN, x, y);\n var merged = collapsedSpanAtEnd(lineObj);\n var mergedPos = merged && merged.find(0, true);\n if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))\n lineN = lineNo(lineObj = mergedPos.to.line);\n else\n return found;\n }\n }\n\n function coordsCharInner(cm, lineObj, lineNo, x, y) {\n var innerOff = y - heightAtLine(lineObj);\n var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth;\n var preparedMeasure = prepareMeasureForLine(cm, lineObj);\n\n function getX(ch) {\n var sp = cursorCoords(cm, Pos(lineNo, ch), \"line\", lineObj, preparedMeasure);\n wrongLine = true;\n if (innerOff > sp.bottom) return sp.left - adjust;\n else if (innerOff < sp.top) return sp.left + adjust;\n else wrongLine = false;\n return sp.left;\n }\n\n var bidi = getOrder(lineObj), dist = lineObj.text.length;\n var from = lineLeft(lineObj), to = lineRight(lineObj);\n var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine;\n\n if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1);\n // Do a binary search between these bounds.\n for (;;) {\n if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {\n var ch = x < fromX || x - fromX <= toX - x ? from : to;\n var xDiff = x - (ch == from ? fromX : toX);\n while (isExtendingChar(lineObj.text.charAt(ch))) ++ch;\n var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside,\n xDiff < -1 ? -1 : xDiff > 1 ? 1 : 0);\n return pos;\n }\n var step = Math.ceil(dist / 2), middle = from + step;\n if (bidi) {\n middle = from;\n for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1);\n }\n var middleX = getX(middle);\n if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;}\n else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;}\n }\n }\n\n var measureText;\n // Compute the default text height.\n function textHeight(display) {\n if (display.cachedTextHeight != null) return display.cachedTextHeight;\n if (measureText == null) {\n measureText = elt(\"pre\");\n // Measure a bunch of lines, for browsers that compute\n // fractional heights.\n for (var i = 0; i < 49; ++i) {\n measureText.appendChild(document.createTextNode(\"x\"));\n measureText.appendChild(elt(\"br\"));\n }\n measureText.appendChild(document.createTextNode(\"x\"));\n }\n removeChildrenAndAdd(display.measure, measureText);\n var height = measureText.offsetHeight / 50;\n if (height > 3) display.cachedTextHeight = height;\n removeChildren(display.measure);\n return height || 1;\n }\n\n // Compute the default character width.\n function charWidth(display) {\n if (display.cachedCharWidth != null) return display.cachedCharWidth;\n var anchor = elt(\"span\", \"xxxxxxxxxx\");\n var pre = elt(\"pre\", [anchor]);\n removeChildrenAndAdd(display.measure, pre);\n var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;\n if (width > 2) display.cachedCharWidth = width;\n return width || 10;\n }\n\n // OPERATIONS\n\n // Operations are used to wrap a series of changes to the editor\n // state in such a way that each change won't have to update the\n // cursor and display (which would be awkward, slow, and\n // error-prone). Instead, display updates are batched and then all\n // combined and executed at once.\n\n var operationGroup = null;\n\n var nextOpId = 0;\n // Start a new operation.\n function startOperation(cm) {\n cm.curOp = {\n cm: cm,\n viewChanged: false, // Flag that indicates that lines might need to be redrawn\n startHeight: cm.doc.height, // Used to detect need to update scrollbar\n forceUpdate: false, // Used to force a redraw\n updateInput: null, // Whether to reset the input textarea\n typing: false, // Whether this reset should be careful to leave existing text (for compositing)\n changeObjs: null, // Accumulated changes, for firing change events\n cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on\n cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already\n selectionChanged: false, // Whether the selection needs to be redrawn\n updateMaxLine: false, // Set when the widest line needs to be determined anew\n scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet\n scrollToPos: null, // Used to scroll to a specific position\n focus: false,\n id: ++nextOpId // Unique ID\n };\n if (operationGroup) {\n operationGroup.ops.push(cm.curOp);\n } else {\n cm.curOp.ownsGroup = operationGroup = {\n ops: [cm.curOp],\n delayedCallbacks: []\n };\n }\n }\n\n function fireCallbacksForOps(group) {\n // Calls delayed callbacks and cursorActivity handlers until no\n // new ones appear\n var callbacks = group.delayedCallbacks, i = 0;\n do {\n for (; i < callbacks.length; i++)\n callbacks[i].call(null);\n for (var j = 0; j < group.ops.length; j++) {\n var op = group.ops[j];\n if (op.cursorActivityHandlers)\n while (op.cursorActivityCalled < op.cursorActivityHandlers.length)\n op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm);\n }\n } while (i < callbacks.length);\n }\n\n // Finish an operation, updating the display and signalling delayed events\n function endOperation(cm) {\n var op = cm.curOp, group = op.ownsGroup;\n if (!group) return;\n\n try { fireCallbacksForOps(group); }\n finally {\n operationGroup = null;\n for (var i = 0; i < group.ops.length; i++)\n group.ops[i].cm.curOp = null;\n endOperations(group);\n }\n }\n\n // The DOM updates done when an operation finishes are batched so\n // that the minimum number of relayouts are required.\n function endOperations(group) {\n var ops = group.ops;\n for (var i = 0; i < ops.length; i++) // Read DOM\n endOperation_R1(ops[i]);\n for (var i = 0; i < ops.length; i++) // Write DOM (maybe)\n endOperation_W1(ops[i]);\n for (var i = 0; i < ops.length; i++) // Read DOM\n endOperation_R2(ops[i]);\n for (var i = 0; i < ops.length; i++) // Write DOM (maybe)\n endOperation_W2(ops[i]);\n for (var i = 0; i < ops.length; i++) // Read DOM\n endOperation_finish(ops[i]);\n }\n\n function endOperation_R1(op) {\n var cm = op.cm, display = cm.display;\n maybeClipScrollbars(cm);\n if (op.updateMaxLine) findMaxLine(cm);\n\n op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||\n op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||\n op.scrollToPos.to.line >= display.viewTo) ||\n display.maxLineChanged && cm.options.lineWrapping;\n op.update = op.mustUpdate &&\n new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);\n }\n\n function endOperation_W1(op) {\n op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);\n }\n\n function endOperation_R2(op) {\n var cm = op.cm, display = cm.display;\n if (op.updatedDisplay) updateHeightsInViewport(cm);\n\n op.barMeasure = measureForScrollbars(cm);\n\n // If the max line changed since it was last measured, measure it,\n // and ensure the document's width matches it.\n // updateDisplay_W2 will use these properties to do the actual resizing\n if (display.maxLineChanged && !cm.options.lineWrapping) {\n op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;\n cm.display.sizerWidth = op.adjustWidthTo;\n op.barMeasure.scrollWidth =\n Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);\n op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));\n }\n\n if (op.updatedDisplay || op.selectionChanged)\n op.preparedSelection = display.input.prepareSelection();\n }\n\n function endOperation_W2(op) {\n var cm = op.cm;\n\n if (op.adjustWidthTo != null) {\n cm.display.sizer.style.minWidth = op.adjustWidthTo + \"px\";\n if (op.maxScrollLeft < cm.doc.scrollLeft)\n setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true);\n cm.display.maxLineChanged = false;\n }\n\n if (op.preparedSelection)\n cm.display.input.showSelection(op.preparedSelection);\n if (op.updatedDisplay || op.startHeight != cm.doc.height)\n updateScrollbars(cm, op.barMeasure);\n if (op.updatedDisplay)\n setDocumentHeight(cm, op.barMeasure);\n\n if (op.selectionChanged) restartBlink(cm);\n\n if (cm.state.focused && op.updateInput)\n cm.display.input.reset(op.typing);\n if (op.focus && op.focus == activeElt() && (!document.hasFocus || document.hasFocus()))\n ensureFocus(op.cm);\n }\n\n function endOperation_finish(op) {\n var cm = op.cm, display = cm.display, doc = cm.doc;\n\n if (op.updatedDisplay) postUpdateDisplay(cm, op.update);\n\n // Abort mouse wheel delta measurement, when scrolling explicitly\n if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))\n display.wheelStartX = display.wheelStartY = null;\n\n // Propagate the scroll position to the actual DOM scroller\n if (op.scrollTop != null && (display.scroller.scrollTop != op.scrollTop || op.forceScroll)) {\n doc.scrollTop = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, op.scrollTop));\n display.scrollbars.setScrollTop(doc.scrollTop);\n display.scroller.scrollTop = doc.scrollTop;\n }\n if (op.scrollLeft != null && (display.scroller.scrollLeft != op.scrollLeft || op.forceScroll)) {\n doc.scrollLeft = Math.max(0, Math.min(display.scroller.scrollWidth - display.scroller.clientWidth, op.scrollLeft));\n display.scrollbars.setScrollLeft(doc.scrollLeft);\n display.scroller.scrollLeft = doc.scrollLeft;\n alignHorizontally(cm);\n }\n // If we need to scroll a specific position into view, do so.\n if (op.scrollToPos) {\n var coords = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),\n clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);\n if (op.scrollToPos.isCursor && cm.state.focused) maybeScrollWindow(cm, coords);\n }\n\n // Fire events for markers that are hidden/unidden by editing or\n // undoing\n var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;\n if (hidden) for (var i = 0; i < hidden.length; ++i)\n if (!hidden[i].lines.length) signal(hidden[i], \"hide\");\n if (unhidden) for (var i = 0; i < unhidden.length; ++i)\n if (unhidden[i].lines.length) signal(unhidden[i], \"unhide\");\n\n if (display.wrapper.offsetHeight)\n doc.scrollTop = cm.display.scroller.scrollTop;\n\n // Fire change events, and delayed event handlers\n if (op.changeObjs)\n signal(cm, \"changes\", cm, op.changeObjs);\n if (op.update)\n op.update.finish();\n }\n\n // Run the given function in an operation\n function runInOp(cm, f) {\n if (cm.curOp) return f();\n startOperation(cm);\n try { return f(); }\n finally { endOperation(cm); }\n }\n // Wraps a function in an operation. Returns the wrapped function.\n function operation(cm, f) {\n return function() {\n if (cm.curOp) return f.apply(cm, arguments);\n startOperation(cm);\n try { return f.apply(cm, arguments); }\n finally { endOperation(cm); }\n };\n }\n // Used to add methods to editor and doc instances, wrapping them in\n // operations.\n function methodOp(f) {\n return function() {\n if (this.curOp) return f.apply(this, arguments);\n startOperation(this);\n try { return f.apply(this, arguments); }\n finally { endOperation(this); }\n };\n }\n function docMethodOp(f) {\n return function() {\n var cm = this.cm;\n if (!cm || cm.curOp) return f.apply(this, arguments);\n startOperation(cm);\n try { return f.apply(this, arguments); }\n finally { endOperation(cm); }\n };\n }\n\n // VIEW TRACKING\n\n // These objects are used to represent the visible (currently drawn)\n // part of the document. A LineView may correspond to multiple\n // logical lines, if those are connected by collapsed ranges.\n function LineView(doc, line, lineN) {\n // The starting line\n this.line = line;\n // Continuing lines, if any\n this.rest = visualLineContinued(line);\n // Number of logical lines in this visual line\n this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;\n this.node = this.text = null;\n this.hidden = lineIsHidden(doc, line);\n }\n\n // Create a range of LineView objects for the given lines.\n function buildViewArray(cm, from, to) {\n var array = [], nextPos;\n for (var pos = from; pos < to; pos = nextPos) {\n var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);\n nextPos = pos + view.size;\n array.push(view);\n }\n return array;\n }\n\n // Updates the display.view data structure for a given change to the\n // document. From and to are in pre-change coordinates. Lendiff is\n // the amount of lines added or subtracted by the change. This is\n // used for changes that span multiple lines, or change the way\n // lines are divided into visual lines. regLineChange (below)\n // registers single-line changes.\n function regChange(cm, from, to, lendiff) {\n if (from == null) from = cm.doc.first;\n if (to == null) to = cm.doc.first + cm.doc.size;\n if (!lendiff) lendiff = 0;\n\n var display = cm.display;\n if (lendiff && to < display.viewTo &&\n (display.updateLineNumbers == null || display.updateLineNumbers > from))\n display.updateLineNumbers = from;\n\n cm.curOp.viewChanged = true;\n\n if (from >= display.viewTo) { // Change after\n if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)\n resetView(cm);\n } else if (to <= display.viewFrom) { // Change before\n if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {\n resetView(cm);\n } else {\n display.viewFrom += lendiff;\n display.viewTo += lendiff;\n }\n } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap\n resetView(cm);\n } else if (from <= display.viewFrom) { // Top overlap\n var cut = viewCuttingPoint(cm, to, to + lendiff, 1);\n if (cut) {\n display.view = display.view.slice(cut.index);\n display.viewFrom = cut.lineN;\n display.viewTo += lendiff;\n } else {\n resetView(cm);\n }\n } else if (to >= display.viewTo) { // Bottom overlap\n var cut = viewCuttingPoint(cm, from, from, -1);\n if (cut) {\n display.view = display.view.slice(0, cut.index);\n display.viewTo = cut.lineN;\n } else {\n resetView(cm);\n }\n } else { // Gap in the middle\n var cutTop = viewCuttingPoint(cm, from, from, -1);\n var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);\n if (cutTop && cutBot) {\n display.view = display.view.slice(0, cutTop.index)\n .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))\n .concat(display.view.slice(cutBot.index));\n display.viewTo += lendiff;\n } else {\n resetView(cm);\n }\n }\n\n var ext = display.externalMeasured;\n if (ext) {\n if (to < ext.lineN)\n ext.lineN += lendiff;\n else if (from < ext.lineN + ext.size)\n display.externalMeasured = null;\n }\n }\n\n // Register a change to a single line. Type must be one of \"text\",\n // \"gutter\", \"class\", \"widget\"\n function regLineChange(cm, line, type) {\n cm.curOp.viewChanged = true;\n var display = cm.display, ext = cm.display.externalMeasured;\n if (ext && line >= ext.lineN && line < ext.lineN + ext.size)\n display.externalMeasured = null;\n\n if (line < display.viewFrom || line >= display.viewTo) return;\n var lineView = display.view[findViewIndex(cm, line)];\n if (lineView.node == null) return;\n var arr = lineView.changes || (lineView.changes = []);\n if (indexOf(arr, type) == -1) arr.push(type);\n }\n\n // Clear the view.\n function resetView(cm) {\n cm.display.viewFrom = cm.display.viewTo = cm.doc.first;\n cm.display.view = [];\n cm.display.viewOffset = 0;\n }\n\n // Find the view element corresponding to a given line. Return null\n // when the line isn't visible.\n function findViewIndex(cm, n) {\n if (n >= cm.display.viewTo) return null;\n n -= cm.display.viewFrom;\n if (n < 0) return null;\n var view = cm.display.view;\n for (var i = 0; i < view.length; i++) {\n n -= view[i].size;\n if (n < 0) return i;\n }\n }\n\n function viewCuttingPoint(cm, oldN, newN, dir) {\n var index = findViewIndex(cm, oldN), diff, view = cm.display.view;\n if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)\n return {index: index, lineN: newN};\n for (var i = 0, n = cm.display.viewFrom; i < index; i++)\n n += view[i].size;\n if (n != oldN) {\n if (dir > 0) {\n if (index == view.length - 1) return null;\n diff = (n + view[index].size) - oldN;\n index++;\n } else {\n diff = n - oldN;\n }\n oldN += diff; newN += diff;\n }\n while (visualLineNo(cm.doc, newN) != newN) {\n if (index == (dir < 0 ? 0 : view.length - 1)) return null;\n newN += dir * view[index - (dir < 0 ? 1 : 0)].size;\n index += dir;\n }\n return {index: index, lineN: newN};\n }\n\n // Force the view to cover a given range, adding empty view element\n // or clipping off existing ones as needed.\n function adjustView(cm, from, to) {\n var display = cm.display, view = display.view;\n if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {\n display.view = buildViewArray(cm, from, to);\n display.viewFrom = from;\n } else {\n if (display.viewFrom > from)\n display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view);\n else if (display.viewFrom < from)\n display.view = display.view.slice(findViewIndex(cm, from));\n display.viewFrom = from;\n if (display.viewTo < to)\n display.view = display.view.concat(buildViewArray(cm, display.viewTo, to));\n else if (display.viewTo > to)\n display.view = display.view.slice(0, findViewIndex(cm, to));\n }\n display.viewTo = to;\n }\n\n // Count the number of lines in the view whose DOM representation is\n // out of date (or nonexistent).\n function countDirtyView(cm) {\n var view = cm.display.view, dirty = 0;\n for (var i = 0; i < view.length; i++) {\n var lineView = view[i];\n if (!lineView.hidden && (!lineView.node || lineView.changes)) ++dirty;\n }\n return dirty;\n }\n\n // EVENT HANDLERS\n\n // Attach the necessary event handlers when initializing the editor\n function registerEventHandlers(cm) {\n var d = cm.display;\n on(d.scroller, \"mousedown\", operation(cm, onMouseDown));\n // Older IE's will not fire a second mousedown for a double click\n if (ie && ie_version < 11)\n on(d.scroller, \"dblclick\", operation(cm, function(e) {\n if (signalDOMEvent(cm, e)) return;\n var pos = posFromMouse(cm, e);\n if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return;\n e_preventDefault(e);\n var word = cm.findWordAt(pos);\n extendSelection(cm.doc, word.anchor, word.head);\n }));\n else\n on(d.scroller, \"dblclick\", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); });\n // Some browsers fire contextmenu *after* opening the menu, at\n // which point we can't mess with it anymore. Context menu is\n // handled in onMouseDown for these browsers.\n if (!captureRightClick) on(d.scroller, \"contextmenu\", function(e) {onContextMenu(cm, e);});\n\n // Used to suppress mouse event handling when a touch happens\n var touchFinished, prevTouch = {end: 0};\n function finishTouch() {\n if (d.activeTouch) {\n touchFinished = setTimeout(function() {d.activeTouch = null;}, 1000);\n prevTouch = d.activeTouch;\n prevTouch.end = +new Date;\n }\n };\n function isMouseLikeTouchEvent(e) {\n if (e.touches.length != 1) return false;\n var touch = e.touches[0];\n return touch.radiusX <= 1 && touch.radiusY <= 1;\n }\n function farAway(touch, other) {\n if (other.left == null) return true;\n var dx = other.left - touch.left, dy = other.top - touch.top;\n return dx * dx + dy * dy > 20 * 20;\n }\n on(d.scroller, \"touchstart\", function(e) {\n if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e)) {\n clearTimeout(touchFinished);\n var now = +new Date;\n d.activeTouch = {start: now, moved: false,\n prev: now - prevTouch.end <= 300 ? prevTouch : null};\n if (e.touches.length == 1) {\n d.activeTouch.left = e.touches[0].pageX;\n d.activeTouch.top = e.touches[0].pageY;\n }\n }\n });\n on(d.scroller, \"touchmove\", function() {\n if (d.activeTouch) d.activeTouch.moved = true;\n });\n on(d.scroller, \"touchend\", function(e) {\n var touch = d.activeTouch;\n if (touch && !eventInWidget(d, e) && touch.left != null &&\n !touch.moved && new Date - touch.start < 300) {\n var pos = cm.coordsChar(d.activeTouch, \"page\"), range;\n if (!touch.prev || farAway(touch, touch.prev)) // Single tap\n range = new Range(pos, pos);\n else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap\n range = cm.findWordAt(pos);\n else // Triple tap\n range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0)));\n cm.setSelection(range.anchor, range.head);\n cm.focus();\n e_preventDefault(e);\n }\n finishTouch();\n });\n on(d.scroller, \"touchcancel\", finishTouch);\n\n // Sync scrolling between fake scrollbars and real scrollable\n // area, ensure viewport is updated when scrolling.\n on(d.scroller, \"scroll\", function() {\n if (d.scroller.clientHeight) {\n setScrollTop(cm, d.scroller.scrollTop);\n setScrollLeft(cm, d.scroller.scrollLeft, true);\n signal(cm, \"scroll\", cm);\n }\n });\n\n // Listen to wheel events in order to try and update the viewport on time.\n on(d.scroller, \"mousewheel\", function(e){onScrollWheel(cm, e);});\n on(d.scroller, \"DOMMouseScroll\", function(e){onScrollWheel(cm, e);});\n\n // Prevent wrapper from ever scrolling\n on(d.wrapper, \"scroll\", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });\n\n d.dragFunctions = {\n enter: function(e) {if (!signalDOMEvent(cm, e)) e_stop(e);},\n over: function(e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},\n start: function(e){onDragStart(cm, e);},\n drop: operation(cm, onDrop),\n leave: function(e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }}\n };\n\n var inp = d.input.getField();\n on(inp, \"keyup\", function(e) { onKeyUp.call(cm, e); });\n on(inp, \"keydown\", operation(cm, onKeyDown));\n on(inp, \"keypress\", operation(cm, onKeyPress));\n on(inp, \"focus\", bind(onFocus, cm));\n on(inp, \"blur\", bind(onBlur, cm));\n }\n\n function dragDropChanged(cm, value, old) {\n var wasOn = old && old != CodeMirror.Init;\n if (!value != !wasOn) {\n var funcs = cm.display.dragFunctions;\n var toggle = value ? on : off;\n toggle(cm.display.scroller, \"dragstart\", funcs.start);\n toggle(cm.display.scroller, \"dragenter\", funcs.enter);\n toggle(cm.display.scroller, \"dragover\", funcs.over);\n toggle(cm.display.scroller, \"dragleave\", funcs.leave);\n toggle(cm.display.scroller, \"drop\", funcs.drop);\n }\n }\n\n // Called when the window resizes\n function onResize(cm) {\n var d = cm.display;\n if (d.lastWrapHeight == d.wrapper.clientHeight && d.lastWrapWidth == d.wrapper.clientWidth)\n return;\n // Might be a text scaling operation, clear size caches.\n d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n d.scrollbarsClipped = false;\n cm.setSize();\n }\n\n // MOUSE EVENTS\n\n // Return true when the given mouse event happened in a widget\n function eventInWidget(display, e) {\n for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {\n if (!n || (n.nodeType == 1 && n.getAttribute(\"cm-ignore-events\") == \"true\") ||\n (n.parentNode == display.sizer && n != display.mover))\n return true;\n }\n }\n\n // Given a mouse event, find the corresponding position. If liberal\n // is false, it checks whether a gutter or scrollbar was clicked,\n // and returns null if it was. forRect is used by rectangular\n // selections, and tries to estimate a character position even for\n // coordinates beyond the right of the text.\n function posFromMouse(cm, e, liberal, forRect) {\n var display = cm.display;\n if (!liberal && e_target(e).getAttribute(\"cm-not-content\") == \"true\") return null;\n\n var x, y, space = display.lineSpace.getBoundingClientRect();\n // Fails unpredictably on IE[67] when mouse is dragged around quickly.\n try { x = e.clientX - space.left; y = e.clientY - space.top; }\n catch (e) { return null; }\n var coords = coordsChar(cm, x, y), line;\n if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {\n var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;\n coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));\n }\n return coords;\n }\n\n // A mouse down can be a single click, double click, triple click,\n // start of selection drag, start of text drag, new cursor\n // (ctrl-click), rectangle drag (alt-drag), or xwin\n // middle-click-paste. Or it might be a click on something we should\n // not interfere with, such as a scrollbar or widget.\n function onMouseDown(e) {\n var cm = this, display = cm.display;\n if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) return;\n display.shift = e.shiftKey;\n\n if (eventInWidget(display, e)) {\n if (!webkit) {\n // Briefly turn off draggability, to allow widgets to do\n // normal dragging things.\n display.scroller.draggable = false;\n setTimeout(function(){display.scroller.draggable = true;}, 100);\n }\n return;\n }\n if (clickInGutter(cm, e)) return;\n var start = posFromMouse(cm, e);\n window.focus();\n\n switch (e_button(e)) {\n case 1:\n // #3261: make sure, that we're not starting a second selection\n if (cm.state.selectingText)\n cm.state.selectingText(e);\n else if (start)\n leftButtonDown(cm, e, start);\n else if (e_target(e) == display.scroller)\n e_preventDefault(e);\n break;\n case 2:\n if (webkit) cm.state.lastMiddleDown = +new Date;\n if (start) extendSelection(cm.doc, start);\n setTimeout(function() {display.input.focus();}, 20);\n e_preventDefault(e);\n break;\n case 3:\n if (captureRightClick) onContextMenu(cm, e);\n else delayBlurEvent(cm);\n break;\n }\n }\n\n var lastClick, lastDoubleClick;\n function leftButtonDown(cm, e, start) {\n if (ie) setTimeout(bind(ensureFocus, cm), 0);\n else cm.curOp.focus = activeElt();\n\n var now = +new Date, type;\n if (lastDoubleClick && lastDoubleClick.time > now - 400 && cmp(lastDoubleClick.pos, start) == 0) {\n type = \"triple\";\n } else if (lastClick && lastClick.time > now - 400 && cmp(lastClick.pos, start) == 0) {\n type = \"double\";\n lastDoubleClick = {time: now, pos: start};\n } else {\n type = \"single\";\n lastClick = {time: now, pos: start};\n }\n\n var sel = cm.doc.sel, modifier = mac ? e.metaKey : e.ctrlKey, contained;\n if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&\n type == \"single\" && (contained = sel.contains(start)) > -1 &&\n (cmp((contained = sel.ranges[contained]).from(), start) < 0 || start.xRel > 0) &&\n (cmp(contained.to(), start) > 0 || start.xRel < 0))\n leftButtonStartDrag(cm, e, start, modifier);\n else\n leftButtonSelect(cm, e, start, type, modifier);\n }\n\n // Start a text drag. When it ends, see if any dragging actually\n // happen, and treat as a click if it didn't.\n function leftButtonStartDrag(cm, e, start, modifier) {\n var display = cm.display, startTime = +new Date;\n var dragEnd = operation(cm, function(e2) {\n if (webkit) display.scroller.draggable = false;\n cm.state.draggingText = false;\n off(document, \"mouseup\", dragEnd);\n off(display.scroller, \"drop\", dragEnd);\n if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {\n e_preventDefault(e2);\n if (!modifier && +new Date - 200 < startTime)\n extendSelection(cm.doc, start);\n // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)\n if (webkit || ie && ie_version == 9)\n setTimeout(function() {document.body.focus(); display.input.focus();}, 20);\n else\n display.input.focus();\n }\n });\n // Let the drag handler handle this.\n if (webkit) display.scroller.draggable = true;\n cm.state.draggingText = dragEnd;\n // IE's approach to draggable\n if (display.scroller.dragDrop) display.scroller.dragDrop();\n on(document, \"mouseup\", dragEnd);\n on(display.scroller, \"drop\", dragEnd);\n }\n\n // Normal selection, as opposed to text dragging.\n function leftButtonSelect(cm, e, start, type, addNew) {\n var display = cm.display, doc = cm.doc;\n e_preventDefault(e);\n\n var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;\n if (addNew && !e.shiftKey) {\n ourIndex = doc.sel.contains(start);\n if (ourIndex > -1)\n ourRange = ranges[ourIndex];\n else\n ourRange = new Range(start, start);\n } else {\n ourRange = doc.sel.primary();\n ourIndex = doc.sel.primIndex;\n }\n\n if (e.altKey) {\n type = \"rect\";\n if (!addNew) ourRange = new Range(start, start);\n start = posFromMouse(cm, e, true, true);\n ourIndex = -1;\n } else if (type == \"double\") {\n var word = cm.findWordAt(start);\n if (cm.display.shift || doc.extend)\n ourRange = extendRange(doc, ourRange, word.anchor, word.head);\n else\n ourRange = word;\n } else if (type == \"triple\") {\n var line = new Range(Pos(start.line, 0), clipPos(doc, Pos(start.line + 1, 0)));\n if (cm.display.shift || doc.extend)\n ourRange = extendRange(doc, ourRange, line.anchor, line.head);\n else\n ourRange = line;\n } else {\n ourRange = extendRange(doc, ourRange, start);\n }\n\n if (!addNew) {\n ourIndex = 0;\n setSelection(doc, new Selection([ourRange], 0), sel_mouse);\n startSel = doc.sel;\n } else if (ourIndex == -1) {\n ourIndex = ranges.length;\n setSelection(doc, normalizeSelection(ranges.concat([ourRange]), ourIndex),\n {scroll: false, origin: \"*mouse\"});\n } else if (ranges.length > 1 && ranges[ourIndex].empty() && type == \"single\" && !e.shiftKey) {\n setSelection(doc, normalizeSelection(ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),\n {scroll: false, origin: \"*mouse\"});\n startSel = doc.sel;\n } else {\n replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);\n }\n\n var lastPos = start;\n function extendTo(pos) {\n if (cmp(lastPos, pos) == 0) return;\n lastPos = pos;\n\n if (type == \"rect\") {\n var ranges = [], tabSize = cm.options.tabSize;\n var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);\n var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);\n var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);\n for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));\n line <= end; line++) {\n var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);\n if (left == right)\n ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos)));\n else if (text.length > leftPos)\n ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize))));\n }\n if (!ranges.length) ranges.push(new Range(start, start));\n setSelection(doc, normalizeSelection(startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),\n {origin: \"*mouse\", scroll: false});\n cm.scrollIntoView(pos);\n } else {\n var oldRange = ourRange;\n var anchor = oldRange.anchor, head = pos;\n if (type != \"single\") {\n if (type == \"double\")\n var range = cm.findWordAt(pos);\n else\n var range = new Range(Pos(pos.line, 0), clipPos(doc, Pos(pos.line + 1, 0)));\n if (cmp(range.anchor, anchor) > 0) {\n head = range.head;\n anchor = minPos(oldRange.from(), range.anchor);\n } else {\n head = range.anchor;\n anchor = maxPos(oldRange.to(), range.head);\n }\n }\n var ranges = startSel.ranges.slice(0);\n ranges[ourIndex] = new Range(clipPos(doc, anchor), head);\n setSelection(doc, normalizeSelection(ranges, ourIndex), sel_mouse);\n }\n }\n\n var editorSize = display.wrapper.getBoundingClientRect();\n // Used to ensure timeout re-tries don't fire when another extend\n // happened in the meantime (clearTimeout isn't reliable -- at\n // least on Chrome, the timeouts still happen even when cleared,\n // if the clear happens after their scheduled firing time).\n var counter = 0;\n\n function extend(e) {\n var curCount = ++counter;\n var cur = posFromMouse(cm, e, true, type == \"rect\");\n if (!cur) return;\n if (cmp(cur, lastPos) != 0) {\n cm.curOp.focus = activeElt();\n extendTo(cur);\n var visible = visibleLines(display, doc);\n if (cur.line >= visible.to || cur.line < visible.from)\n setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150);\n } else {\n var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;\n if (outside) setTimeout(operation(cm, function() {\n if (counter != curCount) return;\n display.scroller.scrollTop += outside;\n extend(e);\n }), 50);\n }\n }\n\n function done(e) {\n cm.state.selectingText = false;\n counter = Infinity;\n e_preventDefault(e);\n display.input.focus();\n off(document, \"mousemove\", move);\n off(document, \"mouseup\", up);\n doc.history.lastSelOrigin = null;\n }\n\n var move = operation(cm, function(e) {\n if (!e_button(e)) done(e);\n else extend(e);\n });\n var up = operation(cm, done);\n cm.state.selectingText = up;\n on(document, \"mousemove\", move);\n on(document, \"mouseup\", up);\n }\n\n // Determines whether an event happened in the gutter, and fires the\n // handlers for the corresponding event.\n function gutterEvent(cm, e, type, prevent) {\n try { var mX = e.clientX, mY = e.clientY; }\n catch(e) { return false; }\n if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) return false;\n if (prevent) e_preventDefault(e);\n\n var display = cm.display;\n var lineBox = display.lineDiv.getBoundingClientRect();\n\n if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e);\n mY -= lineBox.top - display.viewOffset;\n\n for (var i = 0; i < cm.options.gutters.length; ++i) {\n var g = display.gutters.childNodes[i];\n if (g && g.getBoundingClientRect().right >= mX) {\n var line = lineAtHeight(cm.doc, mY);\n var gutter = cm.options.gutters[i];\n signal(cm, type, cm, line, gutter, e);\n return e_defaultPrevented(e);\n }\n }\n }\n\n function clickInGutter(cm, e) {\n return gutterEvent(cm, e, \"gutterClick\", true);\n }\n\n // Kludge to work around strange IE behavior where it'll sometimes\n // re-fire a series of drag-related events right after the drop (#1551)\n var lastDrop = 0;\n\n function onDrop(e) {\n var cm = this;\n clearDragCursor(cm);\n if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))\n return;\n e_preventDefault(e);\n if (ie) lastDrop = +new Date;\n var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;\n if (!pos || cm.isReadOnly()) return;\n // Might be a file drop, in which case we simply extract the text\n // and insert it.\n if (files && files.length && window.FileReader && window.File) {\n var n = files.length, text = Array(n), read = 0;\n var loadFile = function(file, i) {\n if (cm.options.allowDropFileTypes &&\n indexOf(cm.options.allowDropFileTypes, file.type) == -1)\n return;\n\n var reader = new FileReader;\n reader.onload = operation(cm, function() {\n var content = reader.result;\n if (/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(content)) content = \"\";\n text[i] = content;\n if (++read == n) {\n pos = clipPos(cm.doc, pos);\n var change = {from: pos, to: pos,\n text: cm.doc.splitLines(text.join(cm.doc.lineSeparator())),\n origin: \"paste\"};\n makeChange(cm.doc, change);\n setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change)));\n }\n });\n reader.readAsText(file);\n };\n for (var i = 0; i < n; ++i) loadFile(files[i], i);\n } else { // Normal drop\n // Don't do a replace if the drop happened inside of the selected text.\n if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {\n cm.state.draggingText(e);\n // Ensure the editor is re-focused\n setTimeout(function() {cm.display.input.focus();}, 20);\n return;\n }\n try {\n var text = e.dataTransfer.getData(\"Text\");\n if (text) {\n if (cm.state.draggingText && !(mac ? e.altKey : e.ctrlKey))\n var selected = cm.listSelections();\n setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));\n if (selected) for (var i = 0; i < selected.length; ++i)\n replaceRange(cm.doc, \"\", selected[i].anchor, selected[i].head, \"drag\");\n cm.replaceSelection(text, \"around\", \"paste\");\n cm.display.input.focus();\n }\n }\n catch(e){}\n }\n }\n\n function onDragStart(cm, e) {\n if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }\n if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;\n\n e.dataTransfer.setData(\"Text\", cm.getSelection());\n\n // Use dummy image instead of default browsers image.\n // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.\n if (e.dataTransfer.setDragImage && !safari) {\n var img = elt(\"img\", null, null, \"position: fixed; left: 0; top: 0;\");\n img.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n if (presto) {\n img.width = img.height = 1;\n cm.display.wrapper.appendChild(img);\n // Force a relayout, or Opera won't use our image for some obscure reason\n img._top = img.offsetTop;\n }\n e.dataTransfer.setDragImage(img, 0, 0);\n if (presto) img.parentNode.removeChild(img);\n }\n }\n\n function onDragOver(cm, e) {\n var pos = posFromMouse(cm, e);\n if (!pos) return;\n var frag = document.createDocumentFragment();\n drawSelectionCursor(cm, pos, frag);\n if (!cm.display.dragCursor) {\n cm.display.dragCursor = elt(\"div\", null, \"CodeMirror-cursors CodeMirror-dragcursors\");\n cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv);\n }\n removeChildrenAndAdd(cm.display.dragCursor, frag);\n }\n\n function clearDragCursor(cm) {\n if (cm.display.dragCursor) {\n cm.display.lineSpace.removeChild(cm.display.dragCursor);\n cm.display.dragCursor = null;\n }\n }\n\n // SCROLL EVENTS\n\n // Sync the scrollable area and scrollbars, ensure the viewport\n // covers the visible area.\n function setScrollTop(cm, val) {\n if (Math.abs(cm.doc.scrollTop - val) < 2) return;\n cm.doc.scrollTop = val;\n if (!gecko) updateDisplaySimple(cm, {top: val});\n if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val;\n cm.display.scrollbars.setScrollTop(val);\n if (gecko) updateDisplaySimple(cm);\n startWorker(cm, 100);\n }\n // Sync scroller and scrollbar, ensure the gutter elements are\n // aligned.\n function setScrollLeft(cm, val, isScroller) {\n if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return;\n val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);\n cm.doc.scrollLeft = val;\n alignHorizontally(cm);\n if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val;\n cm.display.scrollbars.setScrollLeft(val);\n }\n\n // Since the delta values reported on mouse wheel events are\n // unstandardized between browsers and even browser versions, and\n // generally horribly unpredictable, this code starts by measuring\n // the scroll effect that the first few mouse wheel events have,\n // and, from that, detects the way it can convert deltas to pixel\n // offsets afterwards.\n //\n // The reason we want to know the amount a wheel event will scroll\n // is that it gives us a chance to update the display before the\n // actual scrolling happens, reducing flickering.\n\n var wheelSamples = 0, wheelPixelsPerUnit = null;\n // Fill in a browser-detected starting value on browsers where we\n // know one. These don't have to be accurate -- the result of them\n // being wrong would just be a slight flicker on the first wheel\n // scroll (if it is large enough).\n if (ie) wheelPixelsPerUnit = -.53;\n else if (gecko) wheelPixelsPerUnit = 15;\n else if (chrome) wheelPixelsPerUnit = -.7;\n else if (safari) wheelPixelsPerUnit = -1/3;\n\n var wheelEventDelta = function(e) {\n var dx = e.wheelDeltaX, dy = e.wheelDeltaY;\n if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail;\n if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail;\n else if (dy == null) dy = e.wheelDelta;\n return {x: dx, y: dy};\n };\n CodeMirror.wheelEventPixels = function(e) {\n var delta = wheelEventDelta(e);\n delta.x *= wheelPixelsPerUnit;\n delta.y *= wheelPixelsPerUnit;\n return delta;\n };\n\n function onScrollWheel(cm, e) {\n var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;\n\n var display = cm.display, scroll = display.scroller;\n // Quit if there's nothing to scroll here\n var canScrollX = scroll.scrollWidth > scroll.clientWidth;\n var canScrollY = scroll.scrollHeight > scroll.clientHeight;\n if (!(dx && canScrollX || dy && canScrollY)) return;\n\n // Webkit browsers on OS X abort momentum scrolls when the target\n // of the scroll event is removed from the scrollable element.\n // This hack (see related code in patchDisplay) makes sure the\n // element is kept around.\n if (dy && mac && webkit) {\n outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {\n for (var i = 0; i < view.length; i++) {\n if (view[i].node == cur) {\n cm.display.currentWheelTarget = cur;\n break outer;\n }\n }\n }\n }\n\n // On some browsers, horizontal scrolling will cause redraws to\n // happen before the gutter has been realigned, causing it to\n // wriggle around in a most unseemly way. When we have an\n // estimated pixels/delta value, we just handle horizontal\n // scrolling entirely here. It'll be slightly off from native, but\n // better than glitching out.\n if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {\n if (dy && canScrollY)\n setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight)));\n setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth)));\n // Only prevent default scrolling if vertical scrolling is\n // actually possible. Otherwise, it causes vertical scroll\n // jitter on OSX trackpads when deltaX is small and deltaY\n // is large (issue #3579)\n if (!dy || (dy && canScrollY))\n e_preventDefault(e);\n display.wheelStartX = null; // Abort measurement, if in progress\n return;\n }\n\n // 'Project' the visible viewport to cover the area that is being\n // scrolled into view (if we know enough to estimate it).\n if (dy && wheelPixelsPerUnit != null) {\n var pixels = dy * wheelPixelsPerUnit;\n var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;\n if (pixels < 0) top = Math.max(0, top + pixels - 50);\n else bot = Math.min(cm.doc.height, bot + pixels + 50);\n updateDisplaySimple(cm, {top: top, bottom: bot});\n }\n\n if (wheelSamples < 20) {\n if (display.wheelStartX == null) {\n display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;\n display.wheelDX = dx; display.wheelDY = dy;\n setTimeout(function() {\n if (display.wheelStartX == null) return;\n var movedX = scroll.scrollLeft - display.wheelStartX;\n var movedY = scroll.scrollTop - display.wheelStartY;\n var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||\n (movedX && display.wheelDX && movedX / display.wheelDX);\n display.wheelStartX = display.wheelStartY = null;\n if (!sample) return;\n wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);\n ++wheelSamples;\n }, 200);\n } else {\n display.wheelDX += dx; display.wheelDY += dy;\n }\n }\n }\n\n // KEY EVENTS\n\n // Run a handler that was bound to a key.\n function doHandleBinding(cm, bound, dropShift) {\n if (typeof bound == \"string\") {\n bound = commands[bound];\n if (!bound) return false;\n }\n // Ensure previous input has been read, so that the handler sees a\n // consistent view of the document\n cm.display.input.ensurePolled();\n var prevShift = cm.display.shift, done = false;\n try {\n if (cm.isReadOnly()) cm.state.suppressEdits = true;\n if (dropShift) cm.display.shift = false;\n done = bound(cm) != Pass;\n } finally {\n cm.display.shift = prevShift;\n cm.state.suppressEdits = false;\n }\n return done;\n }\n\n function lookupKeyForEditor(cm, name, handle) {\n for (var i = 0; i < cm.state.keyMaps.length; i++) {\n var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);\n if (result) return result;\n }\n return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))\n || lookupKey(name, cm.options.keyMap, handle, cm);\n }\n\n var stopSeq = new Delayed;\n function dispatchKey(cm, name, e, handle) {\n var seq = cm.state.keySeq;\n if (seq) {\n if (isModifierKey(name)) return \"handled\";\n stopSeq.set(50, function() {\n if (cm.state.keySeq == seq) {\n cm.state.keySeq = null;\n cm.display.input.reset();\n }\n });\n name = seq + \" \" + name;\n }\n var result = lookupKeyForEditor(cm, name, handle);\n\n if (result == \"multi\")\n cm.state.keySeq = name;\n if (result == \"handled\")\n signalLater(cm, \"keyHandled\", cm, name, e);\n\n if (result == \"handled\" || result == \"multi\") {\n e_preventDefault(e);\n restartBlink(cm);\n }\n\n if (seq && !result && /\\'$/.test(name)) {\n e_preventDefault(e);\n return true;\n }\n return !!result;\n }\n\n // Handle a key from the keydown event.\n function handleKeyBinding(cm, e) {\n var name = keyName(e, true);\n if (!name) return false;\n\n if (e.shiftKey && !cm.state.keySeq) {\n // First try to resolve full name (including 'Shift-'). Failing\n // that, see if there is a cursor-motion command (starting with\n // 'go') bound to the keyname without 'Shift-'.\n return dispatchKey(cm, \"Shift-\" + name, e, function(b) {return doHandleBinding(cm, b, true);})\n || dispatchKey(cm, name, e, function(b) {\n if (typeof b == \"string\" ? /^go[A-Z]/.test(b) : b.motion)\n return doHandleBinding(cm, b);\n });\n } else {\n return dispatchKey(cm, name, e, function(b) { return doHandleBinding(cm, b); });\n }\n }\n\n // Handle a key from the keypress event\n function handleCharBinding(cm, e, ch) {\n return dispatchKey(cm, \"'\" + ch + \"'\", e,\n function(b) { return doHandleBinding(cm, b, true); });\n }\n\n var lastStoppedKey = null;\n function onKeyDown(e) {\n var cm = this;\n cm.curOp.focus = activeElt();\n if (signalDOMEvent(cm, e)) return;\n // IE does strange things with escape.\n if (ie && ie_version < 11 && e.keyCode == 27) e.returnValue = false;\n var code = e.keyCode;\n cm.display.shift = code == 16 || e.shiftKey;\n var handled = handleKeyBinding(cm, e);\n if (presto) {\n lastStoppedKey = handled ? code : null;\n // Opera has no cut event... we try to at least catch the key combo\n if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))\n cm.replaceSelection(\"\", null, \"cut\");\n }\n\n // Turn mouse into crosshair when Alt is held on Mac.\n if (code == 18 && !/\\bCodeMirror-crosshair\\b/.test(cm.display.lineDiv.className))\n showCrossHair(cm);\n }\n\n function showCrossHair(cm) {\n var lineDiv = cm.display.lineDiv;\n addClass(lineDiv, \"CodeMirror-crosshair\");\n\n function up(e) {\n if (e.keyCode == 18 || !e.altKey) {\n rmClass(lineDiv, \"CodeMirror-crosshair\");\n off(document, \"keyup\", up);\n off(document, \"mouseover\", up);\n }\n }\n on(document, \"keyup\", up);\n on(document, \"mouseover\", up);\n }\n\n function onKeyUp(e) {\n if (e.keyCode == 16) this.doc.sel.shift = false;\n signalDOMEvent(this, e);\n }\n\n function onKeyPress(e) {\n var cm = this;\n if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) return;\n var keyCode = e.keyCode, charCode = e.charCode;\n if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}\n if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) return;\n var ch = String.fromCharCode(charCode == null ? keyCode : charCode);\n if (handleCharBinding(cm, e, ch)) return;\n cm.display.input.onKeyPress(e);\n }\n\n // FOCUS/BLUR EVENTS\n\n function delayBlurEvent(cm) {\n cm.state.delayingBlurEvent = true;\n setTimeout(function() {\n if (cm.state.delayingBlurEvent) {\n cm.state.delayingBlurEvent = false;\n onBlur(cm);\n }\n }, 100);\n }\n\n function onFocus(cm) {\n if (cm.state.delayingBlurEvent) cm.state.delayingBlurEvent = false;\n\n if (cm.options.readOnly == \"nocursor\") return;\n if (!cm.state.focused) {\n signal(cm, \"focus\", cm);\n cm.state.focused = true;\n addClass(cm.display.wrapper, \"CodeMirror-focused\");\n // This test prevents this from firing when a context\n // menu is closed (since the input reset would kill the\n // select-all detection hack)\n if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {\n cm.display.input.reset();\n if (webkit) setTimeout(function() { cm.display.input.reset(true); }, 20); // Issue #1730\n }\n cm.display.input.receivedFocus();\n }\n restartBlink(cm);\n }\n function onBlur(cm) {\n if (cm.state.delayingBlurEvent) return;\n\n if (cm.state.focused) {\n signal(cm, \"blur\", cm);\n cm.state.focused = false;\n rmClass(cm.display.wrapper, \"CodeMirror-focused\");\n }\n clearInterval(cm.display.blinker);\n setTimeout(function() {if (!cm.state.focused) cm.display.shift = false;}, 150);\n }\n\n // CONTEXT MENU HANDLING\n\n // To make the context menu work, we need to briefly unhide the\n // textarea (making it as unobtrusive as possible) to let the\n // right-click take effect on it.\n function onContextMenu(cm, e) {\n if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) return;\n if (signalDOMEvent(cm, e, \"contextmenu\")) return;\n cm.display.input.onContextMenu(e);\n }\n\n function contextMenuInGutter(cm, e) {\n if (!hasHandler(cm, \"gutterContextMenu\")) return false;\n return gutterEvent(cm, e, \"gutterContextMenu\", false);\n }\n\n // UPDATING\n\n // Compute the position of the end of a change (its 'to' property\n // refers to the pre-change end).\n var changeEnd = CodeMirror.changeEnd = function(change) {\n if (!change.text) return change.to;\n return Pos(change.from.line + change.text.length - 1,\n lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0));\n };\n\n // Adjust a position to refer to the post-change position of the\n // same text, or the end of the change if the change covers it.\n function adjustForChange(pos, change) {\n if (cmp(pos, change.from) < 0) return pos;\n if (cmp(pos, change.to) <= 0) return changeEnd(change);\n\n var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;\n if (pos.line == change.to.line) ch += changeEnd(change).ch - change.to.ch;\n return Pos(line, ch);\n }\n\n function computeSelAfterChange(doc, change) {\n var out = [];\n for (var i = 0; i < doc.sel.ranges.length; i++) {\n var range = doc.sel.ranges[i];\n out.push(new Range(adjustForChange(range.anchor, change),\n adjustForChange(range.head, change)));\n }\n return normalizeSelection(out, doc.sel.primIndex);\n }\n\n function offsetPos(pos, old, nw) {\n if (pos.line == old.line)\n return Pos(nw.line, pos.ch - old.ch + nw.ch);\n else\n return Pos(nw.line + (pos.line - old.line), pos.ch);\n }\n\n // Used by replaceSelections to allow moving the selection to the\n // start or around the replaced test. Hint may be \"start\" or \"around\".\n function computeReplacedSel(doc, changes, hint) {\n var out = [];\n var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;\n for (var i = 0; i < changes.length; i++) {\n var change = changes[i];\n var from = offsetPos(change.from, oldPrev, newPrev);\n var to = offsetPos(changeEnd(change), oldPrev, newPrev);\n oldPrev = change.to;\n newPrev = to;\n if (hint == \"around\") {\n var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;\n out[i] = new Range(inv ? to : from, inv ? from : to);\n } else {\n out[i] = new Range(from, from);\n }\n }\n return new Selection(out, doc.sel.primIndex);\n }\n\n // Allow \"beforeChange\" event handlers to influence a change\n function filterChange(doc, change, update) {\n var obj = {\n canceled: false,\n from: change.from,\n to: change.to,\n text: change.text,\n origin: change.origin,\n cancel: function() { this.canceled = true; }\n };\n if (update) obj.update = function(from, to, text, origin) {\n if (from) this.from = clipPos(doc, from);\n if (to) this.to = clipPos(doc, to);\n if (text) this.text = text;\n if (origin !== undefined) this.origin = origin;\n };\n signal(doc, \"beforeChange\", doc, obj);\n if (doc.cm) signal(doc.cm, \"beforeChange\", doc.cm, obj);\n\n if (obj.canceled) return null;\n return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin};\n }\n\n // Apply a change to a document, and add it to the document's\n // history, and propagating it to all linked documents.\n function makeChange(doc, change, ignoreReadOnly) {\n if (doc.cm) {\n if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly);\n if (doc.cm.state.suppressEdits) return;\n }\n\n if (hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\")) {\n change = filterChange(doc, change, true);\n if (!change) return;\n }\n\n // Possibly split or suppress the update based on the presence\n // of read-only spans in its range.\n var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);\n if (split) {\n for (var i = split.length - 1; i >= 0; --i)\n makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [\"\"] : change.text});\n } else {\n makeChangeInner(doc, change);\n }\n }\n\n function makeChangeInner(doc, change) {\n if (change.text.length == 1 && change.text[0] == \"\" && cmp(change.from, change.to) == 0) return;\n var selAfter = computeSelAfterChange(doc, change);\n addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);\n\n makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));\n var rebased = [];\n\n linkedDocs(doc, function(doc, sharedHist) {\n if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n rebaseHist(doc.history, change);\n rebased.push(doc.history);\n }\n makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));\n });\n }\n\n // Revert a change stored in a document's history.\n function makeChangeFromHistory(doc, type, allowSelectionOnly) {\n if (doc.cm && doc.cm.state.suppressEdits) return;\n\n var hist = doc.history, event, selAfter = doc.sel;\n var source = type == \"undo\" ? hist.done : hist.undone, dest = type == \"undo\" ? hist.undone : hist.done;\n\n // Verify that there is a useable event (so that ctrl-z won't\n // needlessly clear selection events)\n for (var i = 0; i < source.length; i++) {\n event = source[i];\n if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)\n break;\n }\n if (i == source.length) return;\n hist.lastOrigin = hist.lastSelOrigin = null;\n\n for (;;) {\n event = source.pop();\n if (event.ranges) {\n pushSelectionToHistory(event, dest);\n if (allowSelectionOnly && !event.equals(doc.sel)) {\n setSelection(doc, event, {clearRedo: false});\n return;\n }\n selAfter = event;\n }\n else break;\n }\n\n // Build up a reverse change object to add to the opposite history\n // stack (redo when undoing, and vice versa).\n var antiChanges = [];\n pushSelectionToHistory(selAfter, dest);\n dest.push({changes: antiChanges, generation: hist.generation});\n hist.generation = event.generation || ++hist.maxGeneration;\n\n var filter = hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\");\n\n for (var i = event.changes.length - 1; i >= 0; --i) {\n var change = event.changes[i];\n change.origin = type;\n if (filter && !filterChange(doc, change, false)) {\n source.length = 0;\n return;\n }\n\n antiChanges.push(historyChangeFromChange(doc, change));\n\n var after = i ? computeSelAfterChange(doc, change) : lst(source);\n makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));\n if (!i && doc.cm) doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)});\n var rebased = [];\n\n // Propagate to the linked documents\n linkedDocs(doc, function(doc, sharedHist) {\n if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n rebaseHist(doc.history, change);\n rebased.push(doc.history);\n }\n makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));\n });\n }\n }\n\n // Sub-views need their line numbers shifted when text is added\n // above or below them in the parent document.\n function shiftDoc(doc, distance) {\n if (distance == 0) return;\n doc.first += distance;\n doc.sel = new Selection(map(doc.sel.ranges, function(range) {\n return new Range(Pos(range.anchor.line + distance, range.anchor.ch),\n Pos(range.head.line + distance, range.head.ch));\n }), doc.sel.primIndex);\n if (doc.cm) {\n regChange(doc.cm, doc.first, doc.first - distance, distance);\n for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)\n regLineChange(doc.cm, l, \"gutter\");\n }\n }\n\n // More lower-level change function, handling only a single document\n // (not linked ones).\n function makeChangeSingleDoc(doc, change, selAfter, spans) {\n if (doc.cm && !doc.cm.curOp)\n return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans);\n\n if (change.to.line < doc.first) {\n shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));\n return;\n }\n if (change.from.line > doc.lastLine()) return;\n\n // Clip the change to the size of this doc\n if (change.from.line < doc.first) {\n var shift = change.text.length - 1 - (doc.first - change.from.line);\n shiftDoc(doc, shift);\n change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),\n text: [lst(change.text)], origin: change.origin};\n }\n var last = doc.lastLine();\n if (change.to.line > last) {\n change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),\n text: [change.text[0]], origin: change.origin};\n }\n\n change.removed = getBetween(doc, change.from, change.to);\n\n if (!selAfter) selAfter = computeSelAfterChange(doc, change);\n if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans);\n else updateDoc(doc, change, spans);\n setSelectionNoUndo(doc, selAfter, sel_dontScroll);\n }\n\n // Handle the interaction of a change to a document with the editor\n // that this document is part of.\n function makeChangeSingleDocInEditor(cm, change, spans) {\n var doc = cm.doc, display = cm.display, from = change.from, to = change.to;\n\n var recomputeMaxLength = false, checkWidthStart = from.line;\n if (!cm.options.lineWrapping) {\n checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));\n doc.iter(checkWidthStart, to.line + 1, function(line) {\n if (line == display.maxLine) {\n recomputeMaxLength = true;\n return true;\n }\n });\n }\n\n if (doc.sel.contains(change.from, change.to) > -1)\n signalCursorActivity(cm);\n\n updateDoc(doc, change, spans, estimateHeight(cm));\n\n if (!cm.options.lineWrapping) {\n doc.iter(checkWidthStart, from.line + change.text.length, function(line) {\n var len = lineLength(line);\n if (len > display.maxLineLength) {\n display.maxLine = line;\n display.maxLineLength = len;\n display.maxLineChanged = true;\n recomputeMaxLength = false;\n }\n });\n if (recomputeMaxLength) cm.curOp.updateMaxLine = true;\n }\n\n // Adjust frontier, schedule worker\n doc.frontier = Math.min(doc.frontier, from.line);\n startWorker(cm, 400);\n\n var lendiff = change.text.length - (to.line - from.line) - 1;\n // Remember that these lines changed, for updating the display\n if (change.full)\n regChange(cm);\n else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))\n regLineChange(cm, from.line, \"text\");\n else\n regChange(cm, from.line, to.line + 1, lendiff);\n\n var changesHandler = hasHandler(cm, \"changes\"), changeHandler = hasHandler(cm, \"change\");\n if (changeHandler || changesHandler) {\n var obj = {\n from: from, to: to,\n text: change.text,\n removed: change.removed,\n origin: change.origin\n };\n if (changeHandler) signalLater(cm, \"change\", cm, obj);\n if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj);\n }\n cm.display.selForContextMenu = null;\n }\n\n function replaceRange(doc, code, from, to, origin) {\n if (!to) to = from;\n if (cmp(to, from) < 0) { var tmp = to; to = from; from = tmp; }\n if (typeof code == \"string\") code = doc.splitLines(code);\n makeChange(doc, {from: from, to: to, text: code, origin: origin});\n }\n\n // SCROLLING THINGS INTO VIEW\n\n // If an editor sits on the top or bottom of the window, partially\n // scrolled out of view, this ensures that the cursor is visible.\n function maybeScrollWindow(cm, coords) {\n if (signalDOMEvent(cm, \"scrollCursorIntoView\")) return;\n\n var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;\n if (coords.top + box.top < 0) doScroll = true;\n else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false;\n if (doScroll != null && !phantom) {\n var scrollNode = elt(\"div\", \"\\u200b\", null, \"position: absolute; top: \" +\n (coords.top - display.viewOffset - paddingTop(cm.display)) + \"px; height: \" +\n (coords.bottom - coords.top + scrollGap(cm) + display.barHeight) + \"px; left: \" +\n coords.left + \"px; width: 2px;\");\n cm.display.lineSpace.appendChild(scrollNode);\n scrollNode.scrollIntoView(doScroll);\n cm.display.lineSpace.removeChild(scrollNode);\n }\n }\n\n // Scroll a given position into view (immediately), verifying that\n // it actually became visible (as line heights are accurately\n // measured, the position of something may 'drift' during drawing).\n function scrollPosIntoView(cm, pos, end, margin) {\n if (margin == null) margin = 0;\n for (var limit = 0; limit < 5; limit++) {\n var changed = false, coords = cursorCoords(cm, pos);\n var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);\n var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left),\n Math.min(coords.top, endCoords.top) - margin,\n Math.max(coords.left, endCoords.left),\n Math.max(coords.bottom, endCoords.bottom) + margin);\n var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;\n if (scrollPos.scrollTop != null) {\n setScrollTop(cm, scrollPos.scrollTop);\n if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true;\n }\n if (scrollPos.scrollLeft != null) {\n setScrollLeft(cm, scrollPos.scrollLeft);\n if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true;\n }\n if (!changed) break;\n }\n return coords;\n }\n\n // Scroll a given set of coordinates into view (immediately).\n function scrollIntoView(cm, x1, y1, x2, y2) {\n var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2);\n if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop);\n if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft);\n }\n\n // Calculate a new scroll position needed to scroll the given\n // rectangle into view. Returns an object with scrollTop and\n // scrollLeft properties. When these are undefined, the\n // vertical/horizontal position does not need to be adjusted.\n function calculateScrollPos(cm, x1, y1, x2, y2) {\n var display = cm.display, snapMargin = textHeight(cm.display);\n if (y1 < 0) y1 = 0;\n var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;\n var screen = displayHeight(cm), result = {};\n if (y2 - y1 > screen) y2 = y1 + screen;\n var docBottom = cm.doc.height + paddingVert(display);\n var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin;\n if (y1 < screentop) {\n result.scrollTop = atTop ? 0 : y1;\n } else if (y2 > screentop + screen) {\n var newTop = Math.min(y1, (atBottom ? docBottom : y2) - screen);\n if (newTop != screentop) result.scrollTop = newTop;\n }\n\n var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;\n var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0);\n var tooWide = x2 - x1 > screenw;\n if (tooWide) x2 = x1 + screenw;\n if (x1 < 10)\n result.scrollLeft = 0;\n else if (x1 < screenleft)\n result.scrollLeft = Math.max(0, x1 - (tooWide ? 0 : 10));\n else if (x2 > screenw + screenleft - 3)\n result.scrollLeft = x2 + (tooWide ? 0 : 10) - screenw;\n return result;\n }\n\n // Store a relative adjustment to the scroll position in the current\n // operation (to be applied when the operation finishes).\n function addToScrollPos(cm, left, top) {\n if (left != null || top != null) resolveScrollToPos(cm);\n if (left != null)\n cm.curOp.scrollLeft = (cm.curOp.scrollLeft == null ? cm.doc.scrollLeft : cm.curOp.scrollLeft) + left;\n if (top != null)\n cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;\n }\n\n // Make sure that at the end of the operation the current cursor is\n // shown.\n function ensureCursorVisible(cm) {\n resolveScrollToPos(cm);\n var cur = cm.getCursor(), from = cur, to = cur;\n if (!cm.options.lineWrapping) {\n from = cur.ch ? Pos(cur.line, cur.ch - 1) : cur;\n to = Pos(cur.line, cur.ch + 1);\n }\n cm.curOp.scrollToPos = {from: from, to: to, margin: cm.options.cursorScrollMargin, isCursor: true};\n }\n\n // When an operation has its scrollToPos property set, and another\n // scroll action is applied before the end of the operation, this\n // 'simulates' scrolling that position into view in a cheap way, so\n // that the effect of intermediate scroll commands is not ignored.\n function resolveScrollToPos(cm) {\n var range = cm.curOp.scrollToPos;\n if (range) {\n cm.curOp.scrollToPos = null;\n var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);\n var sPos = calculateScrollPos(cm, Math.min(from.left, to.left),\n Math.min(from.top, to.top) - range.margin,\n Math.max(from.right, to.right),\n Math.max(from.bottom, to.bottom) + range.margin);\n cm.scrollTo(sPos.scrollLeft, sPos.scrollTop);\n }\n }\n\n // API UTILITIES\n\n // Indent the given line. The how parameter can be \"smart\",\n // \"add\"/null, \"subtract\", or \"prev\". When aggressive is false\n // (typically set to true for forced single-line indents), empty\n // lines are not indented, and places where the mode returns Pass\n // are left alone.\n function indentLine(cm, n, how, aggressive) {\n var doc = cm.doc, state;\n if (how == null) how = \"add\";\n if (how == \"smart\") {\n // Fall back to \"prev\" when the mode doesn't have an indentation\n // method.\n if (!doc.mode.indent) how = \"prev\";\n else state = getStateBefore(cm, n);\n }\n\n var tabSize = cm.options.tabSize;\n var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);\n if (line.stateAfter) line.stateAfter = null;\n var curSpaceString = line.text.match(/^\\s*/)[0], indentation;\n if (!aggressive && !/\\S/.test(line.text)) {\n indentation = 0;\n how = \"not\";\n } else if (how == \"smart\") {\n indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);\n if (indentation == Pass || indentation > 150) {\n if (!aggressive) return;\n how = \"prev\";\n }\n }\n if (how == \"prev\") {\n if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize);\n else indentation = 0;\n } else if (how == \"add\") {\n indentation = curSpace + cm.options.indentUnit;\n } else if (how == \"subtract\") {\n indentation = curSpace - cm.options.indentUnit;\n } else if (typeof how == \"number\") {\n indentation = curSpace + how;\n }\n indentation = Math.max(0, indentation);\n\n var indentString = \"\", pos = 0;\n if (cm.options.indentWithTabs)\n for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += \"\\t\";}\n if (pos < indentation) indentString += spaceStr(indentation - pos);\n\n if (indentString != curSpaceString) {\n replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), \"+input\");\n line.stateAfter = null;\n return true;\n } else {\n // Ensure that, if the cursor was in the whitespace at the start\n // of the line, it is moved to the end of that space.\n for (var i = 0; i < doc.sel.ranges.length; i++) {\n var range = doc.sel.ranges[i];\n if (range.head.line == n && range.head.ch < curSpaceString.length) {\n var pos = Pos(n, curSpaceString.length);\n replaceOneSelection(doc, i, new Range(pos, pos));\n break;\n }\n }\n }\n }\n\n // Utility for applying a change to a line by handle or number,\n // returning the number and optionally registering the line as\n // changed.\n function changeLine(doc, handle, changeType, op) {\n var no = handle, line = handle;\n if (typeof handle == \"number\") line = getLine(doc, clipLine(doc, handle));\n else no = lineNo(handle);\n if (no == null) return null;\n if (op(line, no) && doc.cm) regLineChange(doc.cm, no, changeType);\n return line;\n }\n\n // Helper for deleting text near the selection(s), used to implement\n // backspace, delete, and similar functionality.\n function deleteNearSelection(cm, compute) {\n var ranges = cm.doc.sel.ranges, kill = [];\n // Build up a set of ranges to kill first, merging overlapping\n // ranges.\n for (var i = 0; i < ranges.length; i++) {\n var toKill = compute(ranges[i]);\n while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {\n var replaced = kill.pop();\n if (cmp(replaced.from, toKill.from) < 0) {\n toKill.from = replaced.from;\n break;\n }\n }\n kill.push(toKill);\n }\n // Next, remove those actual ranges.\n runInOp(cm, function() {\n for (var i = kill.length - 1; i >= 0; i--)\n replaceRange(cm.doc, \"\", kill[i].from, kill[i].to, \"+delete\");\n ensureCursorVisible(cm);\n });\n }\n\n // Used for horizontal relative motion. Dir is -1 or 1 (left or\n // right), unit can be \"char\", \"column\" (like char, but doesn't\n // cross line boundaries), \"word\" (across next word), or \"group\" (to\n // the start of next group of word or non-word-non-whitespace\n // chars). The visually param controls whether, in right-to-left\n // text, direction 1 means to move towards the next index in the\n // string, or towards the character to the right of the current\n // position. The resulting position will have a hitSide=true\n // property if it reached the end of the document.\n function findPosH(doc, pos, dir, unit, visually) {\n var line = pos.line, ch = pos.ch, origDir = dir;\n var lineObj = getLine(doc, line);\n function findNextLine() {\n var l = line + dir;\n if (l < doc.first || l >= doc.first + doc.size) return false\n line = l;\n return lineObj = getLine(doc, l);\n }\n function moveOnce(boundToLine) {\n var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true);\n if (next == null) {\n if (!boundToLine && findNextLine()) {\n if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj);\n else ch = dir < 0 ? lineObj.text.length : 0;\n } else return false\n } else ch = next;\n return true;\n }\n\n if (unit == \"char\") {\n moveOnce()\n } else if (unit == \"column\") {\n moveOnce(true)\n } else if (unit == \"word\" || unit == \"group\") {\n var sawType = null, group = unit == \"group\";\n var helper = doc.cm && doc.cm.getHelper(pos, \"wordChars\");\n for (var first = true;; first = false) {\n if (dir < 0 && !moveOnce(!first)) break;\n var cur = lineObj.text.charAt(ch) || \"\\n\";\n var type = isWordChar(cur, helper) ? \"w\"\n : group && cur == \"\\n\" ? \"n\"\n : !group || /\\s/.test(cur) ? null\n : \"p\";\n if (group && !first && !type) type = \"s\";\n if (sawType && sawType != type) {\n if (dir < 0) {dir = 1; moveOnce();}\n break;\n }\n\n if (type) sawType = type;\n if (dir > 0 && !moveOnce(!first)) break;\n }\n }\n var result = skipAtomic(doc, Pos(line, ch), pos, origDir, true);\n if (!cmp(pos, result)) result.hitSide = true;\n return result;\n }\n\n // For relative vertical movement. Dir may be -1 or 1. Unit can be\n // \"page\" or \"line\". The resulting position will have a hitSide=true\n // property if it reached the end of the document.\n function findPosV(cm, pos, dir, unit) {\n var doc = cm.doc, x = pos.left, y;\n if (unit == \"page\") {\n var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);\n y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display));\n } else if (unit == \"line\") {\n y = dir > 0 ? pos.bottom + 3 : pos.top - 3;\n }\n for (;;) {\n var target = coordsChar(cm, x, y);\n if (!target.outside) break;\n if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; }\n y += dir * 5;\n }\n return target;\n }\n\n // EDITOR METHODS\n\n // The publicly visible API. Note that methodOp(f) means\n // 'wrap f in an operation, performed on its `this` parameter'.\n\n // This is not the complete set of editor methods. Most of the\n // methods defined on the Doc type are also injected into\n // CodeMirror.prototype, for backwards compatibility and\n // convenience.\n\n CodeMirror.prototype = {\n constructor: CodeMirror,\n focus: function(){window.focus(); this.display.input.focus();},\n\n setOption: function(option, value) {\n var options = this.options, old = options[option];\n if (options[option] == value && option != \"mode\") return;\n options[option] = value;\n if (optionHandlers.hasOwnProperty(option))\n operation(this, optionHandlers[option])(this, value, old);\n },\n\n getOption: function(option) {return this.options[option];},\n getDoc: function() {return this.doc;},\n\n addKeyMap: function(map, bottom) {\n this.state.keyMaps[bottom ? \"push\" : \"unshift\"](getKeyMap(map));\n },\n removeKeyMap: function(map) {\n var maps = this.state.keyMaps;\n for (var i = 0; i < maps.length; ++i)\n if (maps[i] == map || maps[i].name == map) {\n maps.splice(i, 1);\n return true;\n }\n },\n\n addOverlay: methodOp(function(spec, options) {\n var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);\n if (mode.startState) throw new Error(\"Overlays may not be stateful.\");\n this.state.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque});\n this.state.modeGen++;\n regChange(this);\n }),\n removeOverlay: methodOp(function(spec) {\n var overlays = this.state.overlays;\n for (var i = 0; i < overlays.length; ++i) {\n var cur = overlays[i].modeSpec;\n if (cur == spec || typeof spec == \"string\" && cur.name == spec) {\n overlays.splice(i, 1);\n this.state.modeGen++;\n regChange(this);\n return;\n }\n }\n }),\n\n indentLine: methodOp(function(n, dir, aggressive) {\n if (typeof dir != \"string\" && typeof dir != \"number\") {\n if (dir == null) dir = this.options.smartIndent ? \"smart\" : \"prev\";\n else dir = dir ? \"add\" : \"subtract\";\n }\n if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive);\n }),\n indentSelection: methodOp(function(how) {\n var ranges = this.doc.sel.ranges, end = -1;\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n if (!range.empty()) {\n var from = range.from(), to = range.to();\n var start = Math.max(end, from.line);\n end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;\n for (var j = start; j < end; ++j)\n indentLine(this, j, how);\n var newRanges = this.doc.sel.ranges;\n if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)\n replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll);\n } else if (range.head.line > end) {\n indentLine(this, range.head.line, how, true);\n end = range.head.line;\n if (i == this.doc.sel.primIndex) ensureCursorVisible(this);\n }\n }\n }),\n\n // Fetch the parser token for a given character. Useful for hacks\n // that want to inspect the mode state (say, for completion).\n getTokenAt: function(pos, precise) {\n return takeToken(this, pos, precise);\n },\n\n getLineTokens: function(line, precise) {\n return takeToken(this, Pos(line), precise, true);\n },\n\n getTokenTypeAt: function(pos) {\n pos = clipPos(this.doc, pos);\n var styles = getLineStyles(this, getLine(this.doc, pos.line));\n var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;\n var type;\n if (ch == 0) type = styles[2];\n else for (;;) {\n var mid = (before + after) >> 1;\n if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;\n else if (styles[mid * 2 + 1] < ch) before = mid + 1;\n else { type = styles[mid * 2 + 2]; break; }\n }\n var cut = type ? type.indexOf(\"cm-overlay \") : -1;\n return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1);\n },\n\n getModeAt: function(pos) {\n var mode = this.doc.mode;\n if (!mode.innerMode) return mode;\n return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode;\n },\n\n getHelper: function(pos, type) {\n return this.getHelpers(pos, type)[0];\n },\n\n getHelpers: function(pos, type) {\n var found = [];\n if (!helpers.hasOwnProperty(type)) return found;\n var help = helpers[type], mode = this.getModeAt(pos);\n if (typeof mode[type] == \"string\") {\n if (help[mode[type]]) found.push(help[mode[type]]);\n } else if (mode[type]) {\n for (var i = 0; i < mode[type].length; i++) {\n var val = help[mode[type][i]];\n if (val) found.push(val);\n }\n } else if (mode.helperType && help[mode.helperType]) {\n found.push(help[mode.helperType]);\n } else if (help[mode.name]) {\n found.push(help[mode.name]);\n }\n for (var i = 0; i < help._global.length; i++) {\n var cur = help._global[i];\n if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)\n found.push(cur.val);\n }\n return found;\n },\n\n getStateAfter: function(line, precise) {\n var doc = this.doc;\n line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);\n return getStateBefore(this, line + 1, precise);\n },\n\n cursorCoords: function(start, mode) {\n var pos, range = this.doc.sel.primary();\n if (start == null) pos = range.head;\n else if (typeof start == \"object\") pos = clipPos(this.doc, start);\n else pos = start ? range.from() : range.to();\n return cursorCoords(this, pos, mode || \"page\");\n },\n\n charCoords: function(pos, mode) {\n return charCoords(this, clipPos(this.doc, pos), mode || \"page\");\n },\n\n coordsChar: function(coords, mode) {\n coords = fromCoordSystem(this, coords, mode || \"page\");\n return coordsChar(this, coords.left, coords.top);\n },\n\n lineAtHeight: function(height, mode) {\n height = fromCoordSystem(this, {top: height, left: 0}, mode || \"page\").top;\n return lineAtHeight(this.doc, height + this.display.viewOffset);\n },\n heightAtLine: function(line, mode) {\n var end = false, lineObj;\n if (typeof line == \"number\") {\n var last = this.doc.first + this.doc.size - 1;\n if (line < this.doc.first) line = this.doc.first;\n else if (line > last) { line = last; end = true; }\n lineObj = getLine(this.doc, line);\n } else {\n lineObj = line;\n }\n return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || \"page\").top +\n (end ? this.doc.height - heightAtLine(lineObj) : 0);\n },\n\n defaultTextHeight: function() { return textHeight(this.display); },\n defaultCharWidth: function() { return charWidth(this.display); },\n\n setGutterMarker: methodOp(function(line, gutterID, value) {\n return changeLine(this.doc, line, \"gutter\", function(line) {\n var markers = line.gutterMarkers || (line.gutterMarkers = {});\n markers[gutterID] = value;\n if (!value && isEmpty(markers)) line.gutterMarkers = null;\n return true;\n });\n }),\n\n clearGutter: methodOp(function(gutterID) {\n var cm = this, doc = cm.doc, i = doc.first;\n doc.iter(function(line) {\n if (line.gutterMarkers && line.gutterMarkers[gutterID]) {\n line.gutterMarkers[gutterID] = null;\n regLineChange(cm, i, \"gutter\");\n if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null;\n }\n ++i;\n });\n }),\n\n lineInfo: function(line) {\n if (typeof line == \"number\") {\n if (!isLine(this.doc, line)) return null;\n var n = line;\n line = getLine(this.doc, line);\n if (!line) return null;\n } else {\n var n = lineNo(line);\n if (n == null) return null;\n }\n return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,\n textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,\n widgets: line.widgets};\n },\n\n getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo};},\n\n addWidget: function(pos, node, scroll, vert, horiz) {\n var display = this.display;\n pos = cursorCoords(this, clipPos(this.doc, pos));\n var top = pos.bottom, left = pos.left;\n node.style.position = \"absolute\";\n node.setAttribute(\"cm-ignore-events\", \"true\");\n this.display.input.setUneditable(node);\n display.sizer.appendChild(node);\n if (vert == \"over\") {\n top = pos.top;\n } else if (vert == \"above\" || vert == \"near\") {\n var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),\n hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);\n // Default to positioning above (if specified and possible); otherwise default to positioning below\n if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)\n top = pos.top - node.offsetHeight;\n else if (pos.bottom + node.offsetHeight <= vspace)\n top = pos.bottom;\n if (left + node.offsetWidth > hspace)\n left = hspace - node.offsetWidth;\n }\n node.style.top = top + \"px\";\n node.style.left = node.style.right = \"\";\n if (horiz == \"right\") {\n left = display.sizer.clientWidth - node.offsetWidth;\n node.style.right = \"0px\";\n } else {\n if (horiz == \"left\") left = 0;\n else if (horiz == \"middle\") left = (display.sizer.clientWidth - node.offsetWidth) / 2;\n node.style.left = left + \"px\";\n }\n if (scroll)\n scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight);\n },\n\n triggerOnKeyDown: methodOp(onKeyDown),\n triggerOnKeyPress: methodOp(onKeyPress),\n triggerOnKeyUp: onKeyUp,\n\n execCommand: function(cmd) {\n if (commands.hasOwnProperty(cmd))\n return commands[cmd].call(null, this);\n },\n\n triggerElectric: methodOp(function(text) { triggerElectric(this, text); }),\n\n findPosH: function(from, amount, unit, visually) {\n var dir = 1;\n if (amount < 0) { dir = -1; amount = -amount; }\n for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {\n cur = findPosH(this.doc, cur, dir, unit, visually);\n if (cur.hitSide) break;\n }\n return cur;\n },\n\n moveH: methodOp(function(dir, unit) {\n var cm = this;\n cm.extendSelectionsBy(function(range) {\n if (cm.display.shift || cm.doc.extend || range.empty())\n return findPosH(cm.doc, range.head, dir, unit, cm.options.rtlMoveVisually);\n else\n return dir < 0 ? range.from() : range.to();\n }, sel_move);\n }),\n\n deleteH: methodOp(function(dir, unit) {\n var sel = this.doc.sel, doc = this.doc;\n if (sel.somethingSelected())\n doc.replaceSelection(\"\", null, \"+delete\");\n else\n deleteNearSelection(this, function(range) {\n var other = findPosH(doc, range.head, dir, unit, false);\n return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other};\n });\n }),\n\n findPosV: function(from, amount, unit, goalColumn) {\n var dir = 1, x = goalColumn;\n if (amount < 0) { dir = -1; amount = -amount; }\n for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {\n var coords = cursorCoords(this, cur, \"div\");\n if (x == null) x = coords.left;\n else coords.left = x;\n cur = findPosV(this, coords, dir, unit);\n if (cur.hitSide) break;\n }\n return cur;\n },\n\n moveV: methodOp(function(dir, unit) {\n var cm = this, doc = this.doc, goals = [];\n var collapse = !cm.display.shift && !doc.extend && doc.sel.somethingSelected();\n doc.extendSelectionsBy(function(range) {\n if (collapse)\n return dir < 0 ? range.from() : range.to();\n var headPos = cursorCoords(cm, range.head, \"div\");\n if (range.goalColumn != null) headPos.left = range.goalColumn;\n goals.push(headPos.left);\n var pos = findPosV(cm, headPos, dir, unit);\n if (unit == \"page\" && range == doc.sel.primary())\n addToScrollPos(cm, null, charCoords(cm, pos, \"div\").top - headPos.top);\n return pos;\n }, sel_move);\n if (goals.length) for (var i = 0; i < doc.sel.ranges.length; i++)\n doc.sel.ranges[i].goalColumn = goals[i];\n }),\n\n // Find the word at the given position (as returned by coordsChar).\n findWordAt: function(pos) {\n var doc = this.doc, line = getLine(doc, pos.line).text;\n var start = pos.ch, end = pos.ch;\n if (line) {\n var helper = this.getHelper(pos, \"wordChars\");\n if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end;\n var startChar = line.charAt(start);\n var check = isWordChar(startChar, helper)\n ? function(ch) { return isWordChar(ch, helper); }\n : /\\s/.test(startChar) ? function(ch) {return /\\s/.test(ch);}\n : function(ch) {return !/\\s/.test(ch) && !isWordChar(ch);};\n while (start > 0 && check(line.charAt(start - 1))) --start;\n while (end < line.length && check(line.charAt(end))) ++end;\n }\n return new Range(Pos(pos.line, start), Pos(pos.line, end));\n },\n\n toggleOverwrite: function(value) {\n if (value != null && value == this.state.overwrite) return;\n if (this.state.overwrite = !this.state.overwrite)\n addClass(this.display.cursorDiv, \"CodeMirror-overwrite\");\n else\n rmClass(this.display.cursorDiv, \"CodeMirror-overwrite\");\n\n signal(this, \"overwriteToggle\", this, this.state.overwrite);\n },\n hasFocus: function() { return this.display.input.getField() == activeElt(); },\n isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit); },\n\n scrollTo: methodOp(function(x, y) {\n if (x != null || y != null) resolveScrollToPos(this);\n if (x != null) this.curOp.scrollLeft = x;\n if (y != null) this.curOp.scrollTop = y;\n }),\n getScrollInfo: function() {\n var scroller = this.display.scroller;\n return {left: scroller.scrollLeft, top: scroller.scrollTop,\n height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,\n width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,\n clientHeight: displayHeight(this), clientWidth: displayWidth(this)};\n },\n\n scrollIntoView: methodOp(function(range, margin) {\n if (range == null) {\n range = {from: this.doc.sel.primary().head, to: null};\n if (margin == null) margin = this.options.cursorScrollMargin;\n } else if (typeof range == \"number\") {\n range = {from: Pos(range, 0), to: null};\n } else if (range.from == null) {\n range = {from: range, to: null};\n }\n if (!range.to) range.to = range.from;\n range.margin = margin || 0;\n\n if (range.from.line != null) {\n resolveScrollToPos(this);\n this.curOp.scrollToPos = range;\n } else {\n var sPos = calculateScrollPos(this, Math.min(range.from.left, range.to.left),\n Math.min(range.from.top, range.to.top) - range.margin,\n Math.max(range.from.right, range.to.right),\n Math.max(range.from.bottom, range.to.bottom) + range.margin);\n this.scrollTo(sPos.scrollLeft, sPos.scrollTop);\n }\n }),\n\n setSize: methodOp(function(width, height) {\n var cm = this;\n function interpret(val) {\n return typeof val == \"number\" || /^\\d+$/.test(String(val)) ? val + \"px\" : val;\n }\n if (width != null) cm.display.wrapper.style.width = interpret(width);\n if (height != null) cm.display.wrapper.style.height = interpret(height);\n if (cm.options.lineWrapping) clearLineMeasurementCache(this);\n var lineNo = cm.display.viewFrom;\n cm.doc.iter(lineNo, cm.display.viewTo, function(line) {\n if (line.widgets) for (var i = 0; i < line.widgets.length; i++)\n if (line.widgets[i].noHScroll) { regLineChange(cm, lineNo, \"widget\"); break; }\n ++lineNo;\n });\n cm.curOp.forceUpdate = true;\n signal(cm, \"refresh\", this);\n }),\n\n operation: function(f){return runInOp(this, f);},\n\n refresh: methodOp(function() {\n var oldHeight = this.display.cachedTextHeight;\n regChange(this);\n this.curOp.forceUpdate = true;\n clearCaches(this);\n this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop);\n updateGutterSpace(this);\n if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5)\n estimateLineHeights(this);\n signal(this, \"refresh\", this);\n }),\n\n swapDoc: methodOp(function(doc) {\n var old = this.doc;\n old.cm = null;\n attachDoc(this, doc);\n clearCaches(this);\n this.display.input.reset();\n this.scrollTo(doc.scrollLeft, doc.scrollTop);\n this.curOp.forceScroll = true;\n signalLater(this, \"swapDoc\", this, old);\n return old;\n }),\n\n getInputField: function(){return this.display.input.getField();},\n getWrapperElement: function(){return this.display.wrapper;},\n getScrollerElement: function(){return this.display.scroller;},\n getGutterElement: function(){return this.display.gutters;}\n };\n eventMixin(CodeMirror);\n\n // OPTION DEFAULTS\n\n // The default configuration options.\n var defaults = CodeMirror.defaults = {};\n // Functions to run when options are changed.\n var optionHandlers = CodeMirror.optionHandlers = {};\n\n function option(name, deflt, handle, notOnInit) {\n CodeMirror.defaults[name] = deflt;\n if (handle) optionHandlers[name] =\n notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle;\n }\n\n // Passed to option handlers when there is no old value.\n var Init = CodeMirror.Init = {toString: function(){return \"CodeMirror.Init\";}};\n\n // These two are, on init, called from the constructor because they\n // have to be initialized before the editor can start at all.\n option(\"value\", \"\", function(cm, val) {\n cm.setValue(val);\n }, true);\n option(\"mode\", null, function(cm, val) {\n cm.doc.modeOption = val;\n loadMode(cm);\n }, true);\n\n option(\"indentUnit\", 2, loadMode, true);\n option(\"indentWithTabs\", false);\n option(\"smartIndent\", true);\n option(\"tabSize\", 4, function(cm) {\n resetModeState(cm);\n clearCaches(cm);\n regChange(cm);\n }, true);\n option(\"lineSeparator\", null, function(cm, val) {\n cm.doc.lineSep = val;\n if (!val) return;\n var newBreaks = [], lineNo = cm.doc.first;\n cm.doc.iter(function(line) {\n for (var pos = 0;;) {\n var found = line.text.indexOf(val, pos);\n if (found == -1) break;\n pos = found + val.length;\n newBreaks.push(Pos(lineNo, found));\n }\n lineNo++;\n });\n for (var i = newBreaks.length - 1; i >= 0; i--)\n replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length))\n });\n option(\"specialChars\", /[\\t\\u0000-\\u0019\\u00ad\\u200b-\\u200f\\u2028\\u2029\\ufeff]/g, function(cm, val, old) {\n cm.state.specialChars = new RegExp(val.source + (val.test(\"\\t\") ? \"\" : \"|\\t\"), \"g\");\n if (old != CodeMirror.Init) cm.refresh();\n });\n option(\"specialCharPlaceholder\", defaultSpecialCharPlaceholder, function(cm) {cm.refresh();}, true);\n option(\"electricChars\", true);\n option(\"inputStyle\", mobile ? \"contenteditable\" : \"textarea\", function() {\n throw new Error(\"inputStyle can not (yet) be changed in a running editor\"); // FIXME\n }, true);\n option(\"rtlMoveVisually\", !windows);\n option(\"wholeLineUpdateBefore\", true);\n\n option(\"theme\", \"default\", function(cm) {\n themeChanged(cm);\n guttersChanged(cm);\n }, true);\n option(\"keyMap\", \"default\", function(cm, val, old) {\n var next = getKeyMap(val);\n var prev = old != CodeMirror.Init && getKeyMap(old);\n if (prev && prev.detach) prev.detach(cm, next);\n if (next.attach) next.attach(cm, prev || null);\n });\n option(\"extraKeys\", null);\n\n option(\"lineWrapping\", false, wrappingChanged, true);\n option(\"gutters\", [], function(cm) {\n setGuttersForLineNumbers(cm.options);\n guttersChanged(cm);\n }, true);\n option(\"fixedGutter\", true, function(cm, val) {\n cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + \"px\" : \"0\";\n cm.refresh();\n }, true);\n option(\"coverGutterNextToScrollbar\", false, function(cm) {updateScrollbars(cm);}, true);\n option(\"scrollbarStyle\", \"native\", function(cm) {\n initScrollbars(cm);\n updateScrollbars(cm);\n cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);\n cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);\n }, true);\n option(\"lineNumbers\", false, function(cm) {\n setGuttersForLineNumbers(cm.options);\n guttersChanged(cm);\n }, true);\n option(\"firstLineNumber\", 1, guttersChanged, true);\n option(\"lineNumberFormatter\", function(integer) {return integer;}, guttersChanged, true);\n option(\"showCursorWhenSelecting\", false, updateSelection, true);\n\n option(\"resetSelectionOnContextMenu\", true);\n option(\"lineWiseCopyCut\", true);\n\n option(\"readOnly\", false, function(cm, val) {\n if (val == \"nocursor\") {\n onBlur(cm);\n cm.display.input.blur();\n cm.display.disabled = true;\n } else {\n cm.display.disabled = false;\n }\n cm.display.input.readOnlyChanged(val)\n });\n option(\"disableInput\", false, function(cm, val) {if (!val) cm.display.input.reset();}, true);\n option(\"dragDrop\", true, dragDropChanged);\n option(\"allowDropFileTypes\", null);\n\n option(\"cursorBlinkRate\", 530);\n option(\"cursorScrollMargin\", 0);\n option(\"cursorHeight\", 1, updateSelection, true);\n option(\"singleCursorHeightPerLine\", true, updateSelection, true);\n option(\"workTime\", 100);\n option(\"workDelay\", 100);\n option(\"flattenSpans\", true, resetModeState, true);\n option(\"addModeClass\", false, resetModeState, true);\n option(\"pollInterval\", 100);\n option(\"undoDepth\", 200, function(cm, val){cm.doc.history.undoDepth = val;});\n option(\"historyEventDelay\", 1250);\n option(\"viewportMargin\", 10, function(cm){cm.refresh();}, true);\n option(\"maxHighlightLength\", 10000, resetModeState, true);\n option(\"moveInputWithCursor\", true, function(cm, val) {\n if (!val) cm.display.input.resetPosition();\n });\n\n option(\"tabindex\", null, function(cm, val) {\n cm.display.input.getField().tabIndex = val || \"\";\n });\n option(\"autofocus\", null);\n\n // MODE DEFINITION AND QUERYING\n\n // Known modes, by name and by MIME\n var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {};\n\n // Extra arguments are stored as the mode's dependencies, which is\n // used by (legacy) mechanisms like loadmode.js to automatically\n // load a mode. (Preferred mechanism is the require/define calls.)\n CodeMirror.defineMode = function(name, mode) {\n if (!CodeMirror.defaults.mode && name != \"null\") CodeMirror.defaults.mode = name;\n if (arguments.length > 2)\n mode.dependencies = Array.prototype.slice.call(arguments, 2);\n modes[name] = mode;\n };\n\n CodeMirror.defineMIME = function(mime, spec) {\n mimeModes[mime] = spec;\n };\n\n // Given a MIME type, a {name, ...options} config object, or a name\n // string, return a mode config object.\n CodeMirror.resolveMode = function(spec) {\n if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n spec = mimeModes[spec];\n } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n var found = mimeModes[spec.name];\n if (typeof found == \"string\") found = {name: found};\n spec = createObj(found, spec);\n spec.name = found.name;\n } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n return CodeMirror.resolveMode(\"application/xml\");\n }\n if (typeof spec == \"string\") return {name: spec};\n else return spec || {name: \"null\"};\n };\n\n // Given a mode spec (anything that resolveMode accepts), find and\n // initialize an actual mode object.\n CodeMirror.getMode = function(options, spec) {\n var spec = CodeMirror.resolveMode(spec);\n var mfactory = modes[spec.name];\n if (!mfactory) return CodeMirror.getMode(options, \"text/plain\");\n var modeObj = mfactory(options, spec);\n if (modeExtensions.hasOwnProperty(spec.name)) {\n var exts = modeExtensions[spec.name];\n for (var prop in exts) {\n if (!exts.hasOwnProperty(prop)) continue;\n if (modeObj.hasOwnProperty(prop)) modeObj[\"_\" + prop] = modeObj[prop];\n modeObj[prop] = exts[prop];\n }\n }\n modeObj.name = spec.name;\n if (spec.helperType) modeObj.helperType = spec.helperType;\n if (spec.modeProps) for (var prop in spec.modeProps)\n modeObj[prop] = spec.modeProps[prop];\n\n return modeObj;\n };\n\n // Minimal default mode.\n CodeMirror.defineMode(\"null\", function() {\n return {token: function(stream) {stream.skipToEnd();}};\n });\n CodeMirror.defineMIME(\"text/plain\", \"null\");\n\n // This can be used to attach properties to mode objects from\n // outside the actual mode definition.\n var modeExtensions = CodeMirror.modeExtensions = {};\n CodeMirror.extendMode = function(mode, properties) {\n var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});\n copyObj(properties, exts);\n };\n\n // EXTENSIONS\n\n CodeMirror.defineExtension = function(name, func) {\n CodeMirror.prototype[name] = func;\n };\n CodeMirror.defineDocExtension = function(name, func) {\n Doc.prototype[name] = func;\n };\n CodeMirror.defineOption = option;\n\n var initHooks = [];\n CodeMirror.defineInitHook = function(f) {initHooks.push(f);};\n\n var helpers = CodeMirror.helpers = {};\n CodeMirror.registerHelper = function(type, name, value) {\n if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {_global: []};\n helpers[type][name] = value;\n };\n CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {\n CodeMirror.registerHelper(type, name, value);\n helpers[type]._global.push({pred: predicate, val: value});\n };\n\n // MODE STATE HANDLING\n\n // Utility functions for working with state. Exported because nested\n // modes need to do this for their inner modes.\n\n var copyState = CodeMirror.copyState = function(mode, state) {\n if (state === true) return state;\n if (mode.copyState) return mode.copyState(state);\n var nstate = {};\n for (var n in state) {\n var val = state[n];\n if (val instanceof Array) val = val.concat([]);\n nstate[n] = val;\n }\n return nstate;\n };\n\n var startState = CodeMirror.startState = function(mode, a1, a2) {\n return mode.startState ? mode.startState(a1, a2) : true;\n };\n\n // Given a mode and a state (for that mode), find the inner mode and\n // state at the position that the state refers to.\n CodeMirror.innerMode = function(mode, state) {\n while (mode.innerMode) {\n var info = mode.innerMode(state);\n if (!info || info.mode == mode) break;\n state = info.state;\n mode = info.mode;\n }\n return info || {mode: mode, state: state};\n };\n\n // STANDARD COMMANDS\n\n // Commands are parameter-less actions that can be performed on an\n // editor, mostly used for keybindings.\n var commands = CodeMirror.commands = {\n selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);},\n singleSelection: function(cm) {\n cm.setSelection(cm.getCursor(\"anchor\"), cm.getCursor(\"head\"), sel_dontScroll);\n },\n killLine: function(cm) {\n deleteNearSelection(cm, function(range) {\n if (range.empty()) {\n var len = getLine(cm.doc, range.head.line).text.length;\n if (range.head.ch == len && range.head.line < cm.lastLine())\n return {from: range.head, to: Pos(range.head.line + 1, 0)};\n else\n return {from: range.head, to: Pos(range.head.line, len)};\n } else {\n return {from: range.from(), to: range.to()};\n }\n });\n },\n deleteLine: function(cm) {\n deleteNearSelection(cm, function(range) {\n return {from: Pos(range.from().line, 0),\n to: clipPos(cm.doc, Pos(range.to().line + 1, 0))};\n });\n },\n delLineLeft: function(cm) {\n deleteNearSelection(cm, function(range) {\n return {from: Pos(range.from().line, 0), to: range.from()};\n });\n },\n delWrappedLineLeft: function(cm) {\n deleteNearSelection(cm, function(range) {\n var top = cm.charCoords(range.head, \"div\").top + 5;\n var leftPos = cm.coordsChar({left: 0, top: top}, \"div\");\n return {from: leftPos, to: range.from()};\n });\n },\n delWrappedLineRight: function(cm) {\n deleteNearSelection(cm, function(range) {\n var top = cm.charCoords(range.head, \"div\").top + 5;\n var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\");\n return {from: range.from(), to: rightPos };\n });\n },\n undo: function(cm) {cm.undo();},\n redo: function(cm) {cm.redo();},\n undoSelection: function(cm) {cm.undoSelection();},\n redoSelection: function(cm) {cm.redoSelection();},\n goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));},\n goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));},\n goLineStart: function(cm) {\n cm.extendSelectionsBy(function(range) { return lineStart(cm, range.head.line); },\n {origin: \"+move\", bias: 1});\n },\n goLineStartSmart: function(cm) {\n cm.extendSelectionsBy(function(range) {\n return lineStartSmart(cm, range.head);\n }, {origin: \"+move\", bias: 1});\n },\n goLineEnd: function(cm) {\n cm.extendSelectionsBy(function(range) { return lineEnd(cm, range.head.line); },\n {origin: \"+move\", bias: -1});\n },\n goLineRight: function(cm) {\n cm.extendSelectionsBy(function(range) {\n var top = cm.charCoords(range.head, \"div\").top + 5;\n return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\");\n }, sel_move);\n },\n goLineLeft: function(cm) {\n cm.extendSelectionsBy(function(range) {\n var top = cm.charCoords(range.head, \"div\").top + 5;\n return cm.coordsChar({left: 0, top: top}, \"div\");\n }, sel_move);\n },\n goLineLeftSmart: function(cm) {\n cm.extendSelectionsBy(function(range) {\n var top = cm.charCoords(range.head, \"div\").top + 5;\n var pos = cm.coordsChar({left: 0, top: top}, \"div\");\n if (pos.ch < cm.getLine(pos.line).search(/\\S/)) return lineStartSmart(cm, range.head);\n return pos;\n }, sel_move);\n },\n goLineUp: function(cm) {cm.moveV(-1, \"line\");},\n goLineDown: function(cm) {cm.moveV(1, \"line\");},\n goPageUp: function(cm) {cm.moveV(-1, \"page\");},\n goPageDown: function(cm) {cm.moveV(1, \"page\");},\n goCharLeft: function(cm) {cm.moveH(-1, \"char\");},\n goCharRight: function(cm) {cm.moveH(1, \"char\");},\n goColumnLeft: function(cm) {cm.moveH(-1, \"column\");},\n goColumnRight: function(cm) {cm.moveH(1, \"column\");},\n goWordLeft: function(cm) {cm.moveH(-1, \"word\");},\n goGroupRight: function(cm) {cm.moveH(1, \"group\");},\n goGroupLeft: function(cm) {cm.moveH(-1, \"group\");},\n goWordRight: function(cm) {cm.moveH(1, \"word\");},\n delCharBefore: function(cm) {cm.deleteH(-1, \"char\");},\n delCharAfter: function(cm) {cm.deleteH(1, \"char\");},\n delWordBefore: function(cm) {cm.deleteH(-1, \"word\");},\n delWordAfter: function(cm) {cm.deleteH(1, \"word\");},\n delGroupBefore: function(cm) {cm.deleteH(-1, \"group\");},\n delGroupAfter: function(cm) {cm.deleteH(1, \"group\");},\n indentAuto: function(cm) {cm.indentSelection(\"smart\");},\n indentMore: function(cm) {cm.indentSelection(\"add\");},\n indentLess: function(cm) {cm.indentSelection(\"subtract\");},\n insertTab: function(cm) {cm.replaceSelection(\"\\t\");},\n insertSoftTab: function(cm) {\n var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;\n for (var i = 0; i < ranges.length; i++) {\n var pos = ranges[i].from();\n var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);\n spaces.push(new Array(tabSize - col % tabSize + 1).join(\" \"));\n }\n cm.replaceSelections(spaces);\n },\n defaultTab: function(cm) {\n if (cm.somethingSelected()) cm.indentSelection(\"add\");\n else cm.execCommand(\"insertTab\");\n },\n transposeChars: function(cm) {\n runInOp(cm, function() {\n var ranges = cm.listSelections(), newSel = [];\n for (var i = 0; i < ranges.length; i++) {\n var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;\n if (line) {\n if (cur.ch == line.length) cur = new Pos(cur.line, cur.ch - 1);\n if (cur.ch > 0) {\n cur = new Pos(cur.line, cur.ch + 1);\n cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),\n Pos(cur.line, cur.ch - 2), cur, \"+transpose\");\n } else if (cur.line > cm.doc.first) {\n var prev = getLine(cm.doc, cur.line - 1).text;\n if (prev)\n cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +\n prev.charAt(prev.length - 1),\n Pos(cur.line - 1, prev.length - 1), Pos(cur.line, 1), \"+transpose\");\n }\n }\n newSel.push(new Range(cur, cur));\n }\n cm.setSelections(newSel);\n });\n },\n newlineAndIndent: function(cm) {\n runInOp(cm, function() {\n var len = cm.listSelections().length;\n for (var i = 0; i < len; i++) {\n var range = cm.listSelections()[i];\n cm.replaceRange(cm.doc.lineSeparator(), range.anchor, range.head, \"+input\");\n cm.indentLine(range.from().line + 1, null, true);\n }\n ensureCursorVisible(cm);\n });\n },\n toggleOverwrite: function(cm) {cm.toggleOverwrite();}\n };\n\n\n // STANDARD KEYMAPS\n\n var keyMap = CodeMirror.keyMap = {};\n\n keyMap.basic = {\n \"Left\": \"goCharLeft\", \"Right\": \"goCharRight\", \"Up\": \"goLineUp\", \"Down\": \"goLineDown\",\n \"End\": \"goLineEnd\", \"Home\": \"goLineStartSmart\", \"PageUp\": \"goPageUp\", \"PageDown\": \"goPageDown\",\n \"Delete\": \"delCharAfter\", \"Backspace\": \"delCharBefore\", \"Shift-Backspace\": \"delCharBefore\",\n \"Tab\": \"defaultTab\", \"Shift-Tab\": \"indentAuto\",\n \"Enter\": \"newlineAndIndent\", \"Insert\": \"toggleOverwrite\",\n \"Esc\": \"singleSelection\"\n };\n // Note that the save and find-related commands aren't defined by\n // default. User code or addons can define them. Unknown commands\n // are simply ignored.\n keyMap.pcDefault = {\n \"Ctrl-A\": \"selectAll\", \"Ctrl-D\": \"deleteLine\", \"Ctrl-Z\": \"undo\", \"Shift-Ctrl-Z\": \"redo\", \"Ctrl-Y\": \"redo\",\n \"Ctrl-Home\": \"goDocStart\", \"Ctrl-End\": \"goDocEnd\", \"Ctrl-Up\": \"goLineUp\", \"Ctrl-Down\": \"goLineDown\",\n \"Ctrl-Left\": \"goGroupLeft\", \"Ctrl-Right\": \"goGroupRight\", \"Alt-Left\": \"goLineStart\", \"Alt-Right\": \"goLineEnd\",\n \"Ctrl-Backspace\": \"delGroupBefore\", \"Ctrl-Delete\": \"delGroupAfter\", \"Ctrl-S\": \"save\", \"Ctrl-F\": \"find\",\n \"Ctrl-G\": \"findNext\", \"Shift-Ctrl-G\": \"findPrev\", \"Shift-Ctrl-F\": \"replace\", \"Shift-Ctrl-R\": \"replaceAll\",\n \"Ctrl-[\": \"indentLess\", \"Ctrl-]\": \"indentMore\",\n \"Ctrl-U\": \"undoSelection\", \"Shift-Ctrl-U\": \"redoSelection\", \"Alt-U\": \"redoSelection\",\n fallthrough: \"basic\"\n };\n // Very basic readline/emacs-style bindings, which are standard on Mac.\n keyMap.emacsy = {\n \"Ctrl-F\": \"goCharRight\", \"Ctrl-B\": \"goCharLeft\", \"Ctrl-P\": \"goLineUp\", \"Ctrl-N\": \"goLineDown\",\n \"Alt-F\": \"goWordRight\", \"Alt-B\": \"goWordLeft\", \"Ctrl-A\": \"goLineStart\", \"Ctrl-E\": \"goLineEnd\",\n \"Ctrl-V\": \"goPageDown\", \"Shift-Ctrl-V\": \"goPageUp\", \"Ctrl-D\": \"delCharAfter\", \"Ctrl-H\": \"delCharBefore\",\n \"Alt-D\": \"delWordAfter\", \"Alt-Backspace\": \"delWordBefore\", \"Ctrl-K\": \"killLine\", \"Ctrl-T\": \"transposeChars\"\n };\n keyMap.macDefault = {\n \"Cmd-A\": \"selectAll\", \"Cmd-D\": \"deleteLine\", \"Cmd-Z\": \"undo\", \"Shift-Cmd-Z\": \"redo\", \"Cmd-Y\": \"redo\",\n \"Cmd-Home\": \"goDocStart\", \"Cmd-Up\": \"goDocStart\", \"Cmd-End\": \"goDocEnd\", \"Cmd-Down\": \"goDocEnd\", \"Alt-Left\": \"goGroupLeft\",\n \"Alt-Right\": \"goGroupRight\", \"Cmd-Left\": \"goLineLeft\", \"Cmd-Right\": \"goLineRight\", \"Alt-Backspace\": \"delGroupBefore\",\n \"Ctrl-Alt-Backspace\": \"delGroupAfter\", \"Alt-Delete\": \"delGroupAfter\", \"Cmd-S\": \"save\", \"Cmd-F\": \"find\",\n \"Cmd-G\": \"findNext\", \"Shift-Cmd-G\": \"findPrev\", \"Cmd-Alt-F\": \"replace\", \"Shift-Cmd-Alt-F\": \"replaceAll\",\n \"Cmd-[\": \"indentLess\", \"Cmd-]\": \"indentMore\", \"Cmd-Backspace\": \"delWrappedLineLeft\", \"Cmd-Delete\": \"delWrappedLineRight\",\n \"Cmd-U\": \"undoSelection\", \"Shift-Cmd-U\": \"redoSelection\", \"Ctrl-Up\": \"goDocStart\", \"Ctrl-Down\": \"goDocEnd\",\n fallthrough: [\"basic\", \"emacsy\"]\n };\n keyMap[\"default\"] = mac ? keyMap.macDefault : keyMap.pcDefault;\n\n // KEYMAP DISPATCH\n\n function normalizeKeyName(name) {\n var parts = name.split(/-(?!$)/), name = parts[parts.length - 1];\n var alt, ctrl, shift, cmd;\n for (var i = 0; i < parts.length - 1; i++) {\n var mod = parts[i];\n if (/^(cmd|meta|m)$/i.test(mod)) cmd = true;\n else if (/^a(lt)?$/i.test(mod)) alt = true;\n else if (/^(c|ctrl|control)$/i.test(mod)) ctrl = true;\n else if (/^s(hift)$/i.test(mod)) shift = true;\n else throw new Error(\"Unrecognized modifier name: \" + mod);\n }\n if (alt) name = \"Alt-\" + name;\n if (ctrl) name = \"Ctrl-\" + name;\n if (cmd) name = \"Cmd-\" + name;\n if (shift) name = \"Shift-\" + name;\n return name;\n }\n\n // This is a kludge to keep keymaps mostly working as raw objects\n // (backwards compatibility) while at the same time support features\n // like normalization and multi-stroke key bindings. It compiles a\n // new normalized keymap, and then updates the old object to reflect\n // this.\n CodeMirror.normalizeKeyMap = function(keymap) {\n var copy = {};\n for (var keyname in keymap) if (keymap.hasOwnProperty(keyname)) {\n var value = keymap[keyname];\n if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) continue;\n if (value == \"...\") { delete keymap[keyname]; continue; }\n\n var keys = map(keyname.split(\" \"), normalizeKeyName);\n for (var i = 0; i < keys.length; i++) {\n var val, name;\n if (i == keys.length - 1) {\n name = keys.join(\" \");\n val = value;\n } else {\n name = keys.slice(0, i + 1).join(\" \");\n val = \"...\";\n }\n var prev = copy[name];\n if (!prev) copy[name] = val;\n else if (prev != val) throw new Error(\"Inconsistent bindings for \" + name);\n }\n delete keymap[keyname];\n }\n for (var prop in copy) keymap[prop] = copy[prop];\n return keymap;\n };\n\n var lookupKey = CodeMirror.lookupKey = function(key, map, handle, context) {\n map = getKeyMap(map);\n var found = map.call ? map.call(key, context) : map[key];\n if (found === false) return \"nothing\";\n if (found === \"...\") return \"multi\";\n if (found != null && handle(found)) return \"handled\";\n\n if (map.fallthrough) {\n if (Object.prototype.toString.call(map.fallthrough) != \"[object Array]\")\n return lookupKey(key, map.fallthrough, handle, context);\n for (var i = 0; i < map.fallthrough.length; i++) {\n var result = lookupKey(key, map.fallthrough[i], handle, context);\n if (result) return result;\n }\n }\n };\n\n // Modifier key presses don't count as 'real' key presses for the\n // purpose of keymap fallthrough.\n var isModifierKey = CodeMirror.isModifierKey = function(value) {\n var name = typeof value == \"string\" ? value : keyNames[value.keyCode];\n return name == \"Ctrl\" || name == \"Alt\" || name == \"Shift\" || name == \"Mod\";\n };\n\n // Look up the name of a key as indicated by an event object.\n var keyName = CodeMirror.keyName = function(event, noShift) {\n if (presto && event.keyCode == 34 && event[\"char\"]) return false;\n var base = keyNames[event.keyCode], name = base;\n if (name == null || event.altGraphKey) return false;\n if (event.altKey && base != \"Alt\") name = \"Alt-\" + name;\n if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != \"Ctrl\") name = \"Ctrl-\" + name;\n if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != \"Cmd\") name = \"Cmd-\" + name;\n if (!noShift && event.shiftKey && base != \"Shift\") name = \"Shift-\" + name;\n return name;\n };\n\n function getKeyMap(val) {\n return typeof val == \"string\" ? keyMap[val] : val;\n }\n\n // FROMTEXTAREA\n\n CodeMirror.fromTextArea = function(textarea, options) {\n options = options ? copyObj(options) : {};\n options.value = textarea.value;\n if (!options.tabindex && textarea.tabIndex)\n options.tabindex = textarea.tabIndex;\n if (!options.placeholder && textarea.placeholder)\n options.placeholder = textarea.placeholder;\n // Set autofocus to true if this textarea is focused, or if it has\n // autofocus and no other element is focused.\n if (options.autofocus == null) {\n var hasFocus = activeElt();\n options.autofocus = hasFocus == textarea ||\n textarea.getAttribute(\"autofocus\") != null && hasFocus == document.body;\n }\n\n function save() {textarea.value = cm.getValue();}\n if (textarea.form) {\n on(textarea.form, \"submit\", save);\n // Deplorable hack to make the submit method do the right thing.\n if (!options.leaveSubmitMethodAlone) {\n var form = textarea.form, realSubmit = form.submit;\n try {\n var wrappedSubmit = form.submit = function() {\n save();\n form.submit = realSubmit;\n form.submit();\n form.submit = wrappedSubmit;\n };\n } catch(e) {}\n }\n }\n\n options.finishInit = function(cm) {\n cm.save = save;\n cm.getTextArea = function() { return textarea; };\n cm.toTextArea = function() {\n cm.toTextArea = isNaN; // Prevent this from being ran twice\n save();\n textarea.parentNode.removeChild(cm.getWrapperElement());\n textarea.style.display = \"\";\n if (textarea.form) {\n off(textarea.form, \"submit\", save);\n if (typeof textarea.form.submit == \"function\")\n textarea.form.submit = realSubmit;\n }\n };\n };\n\n textarea.style.display = \"none\";\n var cm = CodeMirror(function(node) {\n textarea.parentNode.insertBefore(node, textarea.nextSibling);\n }, options);\n return cm;\n };\n\n // STRING STREAM\n\n // Fed to the mode parsers, provides helper functions to make\n // parsers more succinct.\n\n var StringStream = CodeMirror.StringStream = function(string, tabSize) {\n this.pos = this.start = 0;\n this.string = string;\n this.tabSize = tabSize || 8;\n this.lastColumnPos = this.lastColumnValue = 0;\n this.lineStart = 0;\n };\n\n StringStream.prototype = {\n eol: function() {return this.pos >= this.string.length;},\n sol: function() {return this.pos == this.lineStart;},\n peek: function() {return this.string.charAt(this.pos) || undefined;},\n next: function() {\n if (this.pos < this.string.length)\n return this.string.charAt(this.pos++);\n },\n eat: function(match) {\n var ch = this.string.charAt(this.pos);\n if (typeof match == \"string\") var ok = ch == match;\n else var ok = ch && (match.test ? match.test(ch) : match(ch));\n if (ok) {++this.pos; return ch;}\n },\n eatWhile: function(match) {\n var start = this.pos;\n while (this.eat(match)){}\n return this.pos > start;\n },\n eatSpace: function() {\n var start = this.pos;\n while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;\n return this.pos > start;\n },\n skipToEnd: function() {this.pos = this.string.length;},\n skipTo: function(ch) {\n var found = this.string.indexOf(ch, this.pos);\n if (found > -1) {this.pos = found; return true;}\n },\n backUp: function(n) {this.pos -= n;},\n column: function() {\n if (this.lastColumnPos < this.start) {\n this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);\n this.lastColumnPos = this.start;\n }\n return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);\n },\n indentation: function() {\n return countColumn(this.string, null, this.tabSize) -\n (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);\n },\n match: function(pattern, consume, caseInsensitive) {\n if (typeof pattern == \"string\") {\n var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};\n var substr = this.string.substr(this.pos, pattern.length);\n if (cased(substr) == cased(pattern)) {\n if (consume !== false) this.pos += pattern.length;\n return true;\n }\n } else {\n var match = this.string.slice(this.pos).match(pattern);\n if (match && match.index > 0) return null;\n if (match && consume !== false) this.pos += match[0].length;\n return match;\n }\n },\n current: function(){return this.string.slice(this.start, this.pos);},\n hideFirstChars: function(n, inner) {\n this.lineStart += n;\n try { return inner(); }\n finally { this.lineStart -= n; }\n }\n };\n\n // TEXTMARKERS\n\n // Created with markText and setBookmark methods. A TextMarker is a\n // handle that can be used to clear or find a marked position in the\n // document. Line objects hold arrays (markedSpans) containing\n // {from, to, marker} object pointing to such marker objects, and\n // indicating that such a marker is present on that line. Multiple\n // lines may point to the same marker when it spans across lines.\n // The spans will have null for their from/to properties when the\n // marker continues beyond the start/end of the line. Markers have\n // links back to the lines they currently touch.\n\n var nextMarkerId = 0;\n\n var TextMarker = CodeMirror.TextMarker = function(doc, type) {\n this.lines = [];\n this.type = type;\n this.doc = doc;\n this.id = ++nextMarkerId;\n };\n eventMixin(TextMarker);\n\n // Clear the marker.\n TextMarker.prototype.clear = function() {\n if (this.explicitlyCleared) return;\n var cm = this.doc.cm, withOp = cm && !cm.curOp;\n if (withOp) startOperation(cm);\n if (hasHandler(this, \"clear\")) {\n var found = this.find();\n if (found) signalLater(this, \"clear\", found.from, found.to);\n }\n var min = null, max = null;\n for (var i = 0; i < this.lines.length; ++i) {\n var line = this.lines[i];\n var span = getMarkedSpanFor(line.markedSpans, this);\n if (cm && !this.collapsed) regLineChange(cm, lineNo(line), \"text\");\n else if (cm) {\n if (span.to != null) max = lineNo(line);\n if (span.from != null) min = lineNo(line);\n }\n line.markedSpans = removeMarkedSpan(line.markedSpans, span);\n if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)\n updateLineHeight(line, textHeight(cm.display));\n }\n if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) {\n var visual = visualLine(this.lines[i]), len = lineLength(visual);\n if (len > cm.display.maxLineLength) {\n cm.display.maxLine = visual;\n cm.display.maxLineLength = len;\n cm.display.maxLineChanged = true;\n }\n }\n\n if (min != null && cm && this.collapsed) regChange(cm, min, max + 1);\n this.lines.length = 0;\n this.explicitlyCleared = true;\n if (this.atomic && this.doc.cantEdit) {\n this.doc.cantEdit = false;\n if (cm) reCheckSelection(cm.doc);\n }\n if (cm) signalLater(cm, \"markerCleared\", cm, this);\n if (withOp) endOperation(cm);\n if (this.parent) this.parent.clear();\n };\n\n // Find the position of the marker in the document. Returns a {from,\n // to} object by default. Side can be passed to get a specific side\n // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the\n // Pos objects returned contain a line object, rather than a line\n // number (used to prevent looking up the same line twice).\n TextMarker.prototype.find = function(side, lineObj) {\n if (side == null && this.type == \"bookmark\") side = 1;\n var from, to;\n for (var i = 0; i < this.lines.length; ++i) {\n var line = this.lines[i];\n var span = getMarkedSpanFor(line.markedSpans, this);\n if (span.from != null) {\n from = Pos(lineObj ? line : lineNo(line), span.from);\n if (side == -1) return from;\n }\n if (span.to != null) {\n to = Pos(lineObj ? line : lineNo(line), span.to);\n if (side == 1) return to;\n }\n }\n return from && {from: from, to: to};\n };\n\n // Signals that the marker's widget changed, and surrounding layout\n // should be recomputed.\n TextMarker.prototype.changed = function() {\n var pos = this.find(-1, true), widget = this, cm = this.doc.cm;\n if (!pos || !cm) return;\n runInOp(cm, function() {\n var line = pos.line, lineN = lineNo(pos.line);\n var view = findViewForLine(cm, lineN);\n if (view) {\n clearLineMeasurementCacheFor(view);\n cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;\n }\n cm.curOp.updateMaxLine = true;\n if (!lineIsHidden(widget.doc, line) && widget.height != null) {\n var oldHeight = widget.height;\n widget.height = null;\n var dHeight = widgetHeight(widget) - oldHeight;\n if (dHeight)\n updateLineHeight(line, line.height + dHeight);\n }\n });\n };\n\n TextMarker.prototype.attachLine = function(line) {\n if (!this.lines.length && this.doc.cm) {\n var op = this.doc.cm.curOp;\n if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)\n (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this);\n }\n this.lines.push(line);\n };\n TextMarker.prototype.detachLine = function(line) {\n this.lines.splice(indexOf(this.lines, line), 1);\n if (!this.lines.length && this.doc.cm) {\n var op = this.doc.cm.curOp;\n (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);\n }\n };\n\n // Collapsed markers have unique ids, in order to be able to order\n // them, which is needed for uniquely determining an outer marker\n // when they overlap (they may nest, but not partially overlap).\n var nextMarkerId = 0;\n\n // Create a marker, wire it up to the right lines, and\n function markText(doc, from, to, options, type) {\n // Shared markers (across linked documents) are handled separately\n // (markTextShared will call out to this again, once per\n // document).\n if (options && options.shared) return markTextShared(doc, from, to, options, type);\n // Ensure we are in an operation.\n if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type);\n\n var marker = new TextMarker(doc, type), diff = cmp(from, to);\n if (options) copyObj(options, marker, false);\n // Don't connect empty markers unless clearWhenEmpty is false\n if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)\n return marker;\n if (marker.replacedWith) {\n // Showing up as a widget implies collapsed (widget replaces text)\n marker.collapsed = true;\n marker.widgetNode = elt(\"span\", [marker.replacedWith], \"CodeMirror-widget\");\n if (!options.handleMouseEvents) marker.widgetNode.setAttribute(\"cm-ignore-events\", \"true\");\n if (options.insertLeft) marker.widgetNode.insertLeft = true;\n }\n if (marker.collapsed) {\n if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||\n from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))\n throw new Error(\"Inserting collapsed marker partially overlapping an existing one\");\n sawCollapsedSpans = true;\n }\n\n if (marker.addToHistory)\n addChangeToHistory(doc, {from: from, to: to, origin: \"markText\"}, doc.sel, NaN);\n\n var curLine = from.line, cm = doc.cm, updateMaxLine;\n doc.iter(curLine, to.line + 1, function(line) {\n if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)\n updateMaxLine = true;\n if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0);\n addMarkedSpan(line, new MarkedSpan(marker,\n curLine == from.line ? from.ch : null,\n curLine == to.line ? to.ch : null));\n ++curLine;\n });\n // lineIsHidden depends on the presence of the spans, so needs a second pass\n if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) {\n if (lineIsHidden(doc, line)) updateLineHeight(line, 0);\n });\n\n if (marker.clearOnEnter) on(marker, \"beforeCursorEnter\", function() { marker.clear(); });\n\n if (marker.readOnly) {\n sawReadOnlySpans = true;\n if (doc.history.done.length || doc.history.undone.length)\n doc.clearHistory();\n }\n if (marker.collapsed) {\n marker.id = ++nextMarkerId;\n marker.atomic = true;\n }\n if (cm) {\n // Sync editor state\n if (updateMaxLine) cm.curOp.updateMaxLine = true;\n if (marker.collapsed)\n regChange(cm, from.line, to.line + 1);\n else if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.css)\n for (var i = from.line; i <= to.line; i++) regLineChange(cm, i, \"text\");\n if (marker.atomic) reCheckSelection(cm.doc);\n signalLater(cm, \"markerAdded\", cm, marker);\n }\n return marker;\n }\n\n // SHARED TEXTMARKERS\n\n // A shared marker spans multiple linked documents. It is\n // implemented as a meta-marker-object controlling multiple normal\n // markers.\n var SharedTextMarker = CodeMirror.SharedTextMarker = function(markers, primary) {\n this.markers = markers;\n this.primary = primary;\n for (var i = 0; i < markers.length; ++i)\n markers[i].parent = this;\n };\n eventMixin(SharedTextMarker);\n\n SharedTextMarker.prototype.clear = function() {\n if (this.explicitlyCleared) return;\n this.explicitlyCleared = true;\n for (var i = 0; i < this.markers.length; ++i)\n this.markers[i].clear();\n signalLater(this, \"clear\");\n };\n SharedTextMarker.prototype.find = function(side, lineObj) {\n return this.primary.find(side, lineObj);\n };\n\n function markTextShared(doc, from, to, options, type) {\n options = copyObj(options);\n options.shared = false;\n var markers = [markText(doc, from, to, options, type)], primary = markers[0];\n var widget = options.widgetNode;\n linkedDocs(doc, function(doc) {\n if (widget) options.widgetNode = widget.cloneNode(true);\n markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));\n for (var i = 0; i < doc.linked.length; ++i)\n if (doc.linked[i].isParent) return;\n primary = lst(markers);\n });\n return new SharedTextMarker(markers, primary);\n }\n\n function findSharedMarkers(doc) {\n return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())),\n function(m) { return m.parent; });\n }\n\n function copySharedMarkers(doc, markers) {\n for (var i = 0; i < markers.length; i++) {\n var marker = markers[i], pos = marker.find();\n var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);\n if (cmp(mFrom, mTo)) {\n var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);\n marker.markers.push(subMark);\n subMark.parent = marker;\n }\n }\n }\n\n function detachSharedMarkers(markers) {\n for (var i = 0; i < markers.length; i++) {\n var marker = markers[i], linked = [marker.primary.doc];;\n linkedDocs(marker.primary.doc, function(d) { linked.push(d); });\n for (var j = 0; j < marker.markers.length; j++) {\n var subMarker = marker.markers[j];\n if (indexOf(linked, subMarker.doc) == -1) {\n subMarker.parent = null;\n marker.markers.splice(j--, 1);\n }\n }\n }\n }\n\n // TEXTMARKER SPANS\n\n function MarkedSpan(marker, from, to) {\n this.marker = marker;\n this.from = from; this.to = to;\n }\n\n // Search an array of spans for a span matching the given marker.\n function getMarkedSpanFor(spans, marker) {\n if (spans) for (var i = 0; i < spans.length; ++i) {\n var span = spans[i];\n if (span.marker == marker) return span;\n }\n }\n // Remove a span from an array, returning undefined if no spans are\n // left (we don't store arrays for lines without spans).\n function removeMarkedSpan(spans, span) {\n for (var r, i = 0; i < spans.length; ++i)\n if (spans[i] != span) (r || (r = [])).push(spans[i]);\n return r;\n }\n // Add a span to a line.\n function addMarkedSpan(line, span) {\n line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];\n span.marker.attachLine(line);\n }\n\n // Used for the algorithm that adjusts markers for a change in the\n // document. These functions cut an array of spans at a given\n // character position, returning an array of remaining chunks (or\n // undefined if nothing remains).\n function markedSpansBefore(old, startCh, isInsert) {\n if (old) for (var i = 0, nw; i < old.length; ++i) {\n var span = old[i], marker = span.marker;\n var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);\n if (startsBefore || span.from == startCh && marker.type == \"bookmark\" && (!isInsert || !span.marker.insertLeft)) {\n var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);\n (nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));\n }\n }\n return nw;\n }\n function markedSpansAfter(old, endCh, isInsert) {\n if (old) for (var i = 0, nw; i < old.length; ++i) {\n var span = old[i], marker = span.marker;\n var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);\n if (endsAfter || span.from == endCh && marker.type == \"bookmark\" && (!isInsert || span.marker.insertLeft)) {\n var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);\n (nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,\n span.to == null ? null : span.to - endCh));\n }\n }\n return nw;\n }\n\n // Given a change object, compute the new set of marker spans that\n // cover the line in which the change took place. Removes spans\n // entirely within the change, reconnects spans belonging to the\n // same marker that appear on both sides of the change, and cuts off\n // spans partially within the change. Returns an array of span\n // arrays with one element for each line in (after) the change.\n function stretchSpansOverChange(doc, change) {\n if (change.full) return null;\n var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;\n var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;\n if (!oldFirst && !oldLast) return null;\n\n var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;\n // Get the spans that 'stick out' on both sides\n var first = markedSpansBefore(oldFirst, startCh, isInsert);\n var last = markedSpansAfter(oldLast, endCh, isInsert);\n\n // Next, merge those two ends\n var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);\n if (first) {\n // Fix up .to properties of first\n for (var i = 0; i < first.length; ++i) {\n var span = first[i];\n if (span.to == null) {\n var found = getMarkedSpanFor(last, span.marker);\n if (!found) span.to = startCh;\n else if (sameLine) span.to = found.to == null ? null : found.to + offset;\n }\n }\n }\n if (last) {\n // Fix up .from in last (or move them into first in case of sameLine)\n for (var i = 0; i < last.length; ++i) {\n var span = last[i];\n if (span.to != null) span.to += offset;\n if (span.from == null) {\n var found = getMarkedSpanFor(first, span.marker);\n if (!found) {\n span.from = offset;\n if (sameLine) (first || (first = [])).push(span);\n }\n } else {\n span.from += offset;\n if (sameLine) (first || (first = [])).push(span);\n }\n }\n }\n // Make sure we didn't create any zero-length spans\n if (first) first = clearEmptySpans(first);\n if (last && last != first) last = clearEmptySpans(last);\n\n var newMarkers = [first];\n if (!sameLine) {\n // Fill gap with whole-line-spans\n var gap = change.text.length - 2, gapMarkers;\n if (gap > 0 && first)\n for (var i = 0; i < first.length; ++i)\n if (first[i].to == null)\n (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i].marker, null, null));\n for (var i = 0; i < gap; ++i)\n newMarkers.push(gapMarkers);\n newMarkers.push(last);\n }\n return newMarkers;\n }\n\n // Remove spans that are empty and don't have a clearWhenEmpty\n // option of false.\n function clearEmptySpans(spans) {\n for (var i = 0; i < spans.length; ++i) {\n var span = spans[i];\n if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)\n spans.splice(i--, 1);\n }\n if (!spans.length) return null;\n return spans;\n }\n\n // Used for un/re-doing changes from the history. Combines the\n // result of computing the existing spans with the set of spans that\n // existed in the history (so that deleting around a span and then\n // undoing brings back the span).\n function mergeOldSpans(doc, change) {\n var old = getOldSpans(doc, change);\n var stretched = stretchSpansOverChange(doc, change);\n if (!old) return stretched;\n if (!stretched) return old;\n\n for (var i = 0; i < old.length; ++i) {\n var oldCur = old[i], stretchCur = stretched[i];\n if (oldCur && stretchCur) {\n spans: for (var j = 0; j < stretchCur.length; ++j) {\n var span = stretchCur[j];\n for (var k = 0; k < oldCur.length; ++k)\n if (oldCur[k].marker == span.marker) continue spans;\n oldCur.push(span);\n }\n } else if (stretchCur) {\n old[i] = stretchCur;\n }\n }\n return old;\n }\n\n // Used to 'clip' out readOnly ranges when making a change.\n function removeReadOnlyRanges(doc, from, to) {\n var markers = null;\n doc.iter(from.line, to.line + 1, function(line) {\n if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) {\n var mark = line.markedSpans[i].marker;\n if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))\n (markers || (markers = [])).push(mark);\n }\n });\n if (!markers) return null;\n var parts = [{from: from, to: to}];\n for (var i = 0; i < markers.length; ++i) {\n var mk = markers[i], m = mk.find(0);\n for (var j = 0; j < parts.length; ++j) {\n var p = parts[j];\n if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) continue;\n var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);\n if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)\n newParts.push({from: p.from, to: m.from});\n if (dto > 0 || !mk.inclusiveRight && !dto)\n newParts.push({from: m.to, to: p.to});\n parts.splice.apply(parts, newParts);\n j += newParts.length - 1;\n }\n }\n return parts;\n }\n\n // Connect or disconnect spans from a line.\n function detachMarkedSpans(line) {\n var spans = line.markedSpans;\n if (!spans) return;\n for (var i = 0; i < spans.length; ++i)\n spans[i].marker.detachLine(line);\n line.markedSpans = null;\n }\n function attachMarkedSpans(line, spans) {\n if (!spans) return;\n for (var i = 0; i < spans.length; ++i)\n spans[i].marker.attachLine(line);\n line.markedSpans = spans;\n }\n\n // Helpers used when computing which overlapping collapsed span\n // counts as the larger one.\n function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0; }\n function extraRight(marker) { return marker.inclusiveRight ? 1 : 0; }\n\n // Returns a number indicating which of two overlapping collapsed\n // spans is larger (and thus includes the other). Falls back to\n // comparing ids when the spans cover exactly the same range.\n function compareCollapsedMarkers(a, b) {\n var lenDiff = a.lines.length - b.lines.length;\n if (lenDiff != 0) return lenDiff;\n var aPos = a.find(), bPos = b.find();\n var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);\n if (fromCmp) return -fromCmp;\n var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);\n if (toCmp) return toCmp;\n return b.id - a.id;\n }\n\n // Find out whether a line ends or starts in a collapsed span. If\n // so, return the marker for that span.\n function collapsedSpanAtSide(line, start) {\n var sps = sawCollapsedSpans && line.markedSpans, found;\n if (sps) for (var sp, i = 0; i < sps.length; ++i) {\n sp = sps[i];\n if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&\n (!found || compareCollapsedMarkers(found, sp.marker) < 0))\n found = sp.marker;\n }\n return found;\n }\n function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true); }\n function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false); }\n\n // Test whether there exists a collapsed span that partially\n // overlaps (covers the start or end, but not both) of a new span.\n // Such overlap is not allowed.\n function conflictingCollapsedRange(doc, lineNo, from, to, marker) {\n var line = getLine(doc, lineNo);\n var sps = sawCollapsedSpans && line.markedSpans;\n if (sps) for (var i = 0; i < sps.length; ++i) {\n var sp = sps[i];\n if (!sp.marker.collapsed) continue;\n var found = sp.marker.find(0);\n var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);\n var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);\n if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue;\n if (fromCmp <= 0 && (cmp(found.to, from) > 0 || (sp.marker.inclusiveRight && marker.inclusiveLeft)) ||\n fromCmp >= 0 && (cmp(found.from, to) < 0 || (sp.marker.inclusiveLeft && marker.inclusiveRight)))\n return true;\n }\n }\n\n // A visual line is a line as drawn on the screen. Folding, for\n // example, can cause multiple logical lines to appear on the same\n // visual line. This finds the start of the visual line that the\n // given line is part of (usually that is the line itself).\n function visualLine(line) {\n var merged;\n while (merged = collapsedSpanAtStart(line))\n line = merged.find(-1, true).line;\n return line;\n }\n\n // Returns an array of logical lines that continue the visual line\n // started by the argument, or undefined if there are no such lines.\n function visualLineContinued(line) {\n var merged, lines;\n while (merged = collapsedSpanAtEnd(line)) {\n line = merged.find(1, true).line;\n (lines || (lines = [])).push(line);\n }\n return lines;\n }\n\n // Get the line number of the start of the visual line that the\n // given line number is part of.\n function visualLineNo(doc, lineN) {\n var line = getLine(doc, lineN), vis = visualLine(line);\n if (line == vis) return lineN;\n return lineNo(vis);\n }\n // Get the line number of the start of the next visual line after\n // the given line.\n function visualLineEndNo(doc, lineN) {\n if (lineN > doc.lastLine()) return lineN;\n var line = getLine(doc, lineN), merged;\n if (!lineIsHidden(doc, line)) return lineN;\n while (merged = collapsedSpanAtEnd(line))\n line = merged.find(1, true).line;\n return lineNo(line) + 1;\n }\n\n // Compute whether a line is hidden. Lines count as hidden when they\n // are part of a visual line that starts with another line, or when\n // they are entirely covered by collapsed, non-widget span.\n function lineIsHidden(doc, line) {\n var sps = sawCollapsedSpans && line.markedSpans;\n if (sps) for (var sp, i = 0; i < sps.length; ++i) {\n sp = sps[i];\n if (!sp.marker.collapsed) continue;\n if (sp.from == null) return true;\n if (sp.marker.widgetNode) continue;\n if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))\n return true;\n }\n }\n function lineIsHiddenInner(doc, line, span) {\n if (span.to == null) {\n var end = span.marker.find(1, true);\n return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker));\n }\n if (span.marker.inclusiveRight && span.to == line.text.length)\n return true;\n for (var sp, i = 0; i < line.markedSpans.length; ++i) {\n sp = line.markedSpans[i];\n if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&\n (sp.to == null || sp.to != span.from) &&\n (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&\n lineIsHiddenInner(doc, line, sp)) return true;\n }\n }\n\n // LINE WIDGETS\n\n // Line widgets are block elements displayed above or below a line.\n\n var LineWidget = CodeMirror.LineWidget = function(doc, node, options) {\n if (options) for (var opt in options) if (options.hasOwnProperty(opt))\n this[opt] = options[opt];\n this.doc = doc;\n this.node = node;\n };\n eventMixin(LineWidget);\n\n function adjustScrollWhenAboveVisible(cm, line, diff) {\n if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))\n addToScrollPos(cm, null, diff);\n }\n\n LineWidget.prototype.clear = function() {\n var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);\n if (no == null || !ws) return;\n for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1);\n if (!ws.length) line.widgets = null;\n var height = widgetHeight(this);\n updateLineHeight(line, Math.max(0, line.height - height));\n if (cm) runInOp(cm, function() {\n adjustScrollWhenAboveVisible(cm, line, -height);\n regLineChange(cm, no, \"widget\");\n });\n };\n LineWidget.prototype.changed = function() {\n var oldH = this.height, cm = this.doc.cm, line = this.line;\n this.height = null;\n var diff = widgetHeight(this) - oldH;\n if (!diff) return;\n updateLineHeight(line, line.height + diff);\n if (cm) runInOp(cm, function() {\n cm.curOp.forceUpdate = true;\n adjustScrollWhenAboveVisible(cm, line, diff);\n });\n };\n\n function widgetHeight(widget) {\n if (widget.height != null) return widget.height;\n var cm = widget.doc.cm;\n if (!cm) return 0;\n if (!contains(document.body, widget.node)) {\n var parentStyle = \"position: relative;\";\n if (widget.coverGutter)\n parentStyle += \"margin-left: -\" + cm.display.gutters.offsetWidth + \"px;\";\n if (widget.noHScroll)\n parentStyle += \"width: \" + cm.display.wrapper.clientWidth + \"px;\";\n removeChildrenAndAdd(cm.display.measure, elt(\"div\", [widget.node], null, parentStyle));\n }\n return widget.height = widget.node.parentNode.offsetHeight;\n }\n\n function addLineWidget(doc, handle, node, options) {\n var widget = new LineWidget(doc, node, options);\n var cm = doc.cm;\n if (cm && widget.noHScroll) cm.display.alignWidgets = true;\n changeLine(doc, handle, \"widget\", function(line) {\n var widgets = line.widgets || (line.widgets = []);\n if (widget.insertAt == null) widgets.push(widget);\n else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget);\n widget.line = line;\n if (cm && !lineIsHidden(doc, line)) {\n var aboveVisible = heightAtLine(line) < doc.scrollTop;\n updateLineHeight(line, line.height + widgetHeight(widget));\n if (aboveVisible) addToScrollPos(cm, null, widget.height);\n cm.curOp.forceUpdate = true;\n }\n return true;\n });\n return widget;\n }\n\n // LINE DATA STRUCTURE\n\n // Line objects. These hold state related to a line, including\n // highlighting info (the styles array).\n var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) {\n this.text = text;\n attachMarkedSpans(this, markedSpans);\n this.height = estimateHeight ? estimateHeight(this) : 1;\n };\n eventMixin(Line);\n Line.prototype.lineNo = function() { return lineNo(this); };\n\n // Change the content (text, markers) of a line. Automatically\n // invalidates cached information and tries to re-estimate the\n // line's height.\n function updateLine(line, text, markedSpans, estimateHeight) {\n line.text = text;\n if (line.stateAfter) line.stateAfter = null;\n if (line.styles) line.styles = null;\n if (line.order != null) line.order = null;\n detachMarkedSpans(line);\n attachMarkedSpans(line, markedSpans);\n var estHeight = estimateHeight ? estimateHeight(line) : 1;\n if (estHeight != line.height) updateLineHeight(line, estHeight);\n }\n\n // Detach a line from the document tree and its markers.\n function cleanUpLine(line) {\n line.parent = null;\n detachMarkedSpans(line);\n }\n\n function extractLineClasses(type, output) {\n if (type) for (;;) {\n var lineClass = type.match(/(?:^|\\s+)line-(background-)?(\\S+)/);\n if (!lineClass) break;\n type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);\n var prop = lineClass[1] ? \"bgClass\" : \"textClass\";\n if (output[prop] == null)\n output[prop] = lineClass[2];\n else if (!(new RegExp(\"(?:^|\\s)\" + lineClass[2] + \"(?:$|\\s)\")).test(output[prop]))\n output[prop] += \" \" + lineClass[2];\n }\n return type;\n }\n\n function callBlankLine(mode, state) {\n if (mode.blankLine) return mode.blankLine(state);\n if (!mode.innerMode) return;\n var inner = CodeMirror.innerMode(mode, state);\n if (inner.mode.blankLine) return inner.mode.blankLine(inner.state);\n }\n\n function readToken(mode, stream, state, inner) {\n for (var i = 0; i < 10; i++) {\n if (inner) inner[0] = CodeMirror.innerMode(mode, state).mode;\n var style = mode.token(stream, state);\n if (stream.pos > stream.start) return style;\n }\n throw new Error(\"Mode \" + mode.name + \" failed to advance stream.\");\n }\n\n // Utility for getTokenAt and getLineTokens\n function takeToken(cm, pos, precise, asArray) {\n function getObj(copy) {\n return {start: stream.start, end: stream.pos,\n string: stream.current(),\n type: style || null,\n state: copy ? copyState(doc.mode, state) : state};\n }\n\n var doc = cm.doc, mode = doc.mode, style;\n pos = clipPos(doc, pos);\n var line = getLine(doc, pos.line), state = getStateBefore(cm, pos.line, precise);\n var stream = new StringStream(line.text, cm.options.tabSize), tokens;\n if (asArray) tokens = [];\n while ((asArray || stream.pos < pos.ch) && !stream.eol()) {\n stream.start = stream.pos;\n style = readToken(mode, stream, state);\n if (asArray) tokens.push(getObj(true));\n }\n return asArray ? tokens : getObj();\n }\n\n // Run the given mode's parser over a line, calling f for each token.\n function runMode(cm, text, mode, state, f, lineClasses, forceToEnd) {\n var flattenSpans = mode.flattenSpans;\n if (flattenSpans == null) flattenSpans = cm.options.flattenSpans;\n var curStart = 0, curStyle = null;\n var stream = new StringStream(text, cm.options.tabSize), style;\n var inner = cm.options.addModeClass && [null];\n if (text == \"\") extractLineClasses(callBlankLine(mode, state), lineClasses);\n while (!stream.eol()) {\n if (stream.pos > cm.options.maxHighlightLength) {\n flattenSpans = false;\n if (forceToEnd) processLine(cm, text, state, stream.pos);\n stream.pos = text.length;\n style = null;\n } else {\n style = extractLineClasses(readToken(mode, stream, state, inner), lineClasses);\n }\n if (inner) {\n var mName = inner[0].name;\n if (mName) style = \"m-\" + (style ? mName + \" \" + style : mName);\n }\n if (!flattenSpans || curStyle != style) {\n while (curStart < stream.start) {\n curStart = Math.min(stream.start, curStart + 50000);\n f(curStart, curStyle);\n }\n curStyle = style;\n }\n stream.start = stream.pos;\n }\n while (curStart < stream.pos) {\n // Webkit seems to refuse to render text nodes longer than 57444 characters\n var pos = Math.min(stream.pos, curStart + 50000);\n f(pos, curStyle);\n curStart = pos;\n }\n }\n\n // Compute a style array (an array starting with a mode generation\n // -- for invalidation -- followed by pairs of end positions and\n // style strings), which is used to highlight the tokens on the\n // line.\n function highlightLine(cm, line, state, forceToEnd) {\n // A styles array always starts with a number identifying the\n // mode/overlays that it is based on (for easy invalidation).\n var st = [cm.state.modeGen], lineClasses = {};\n // Compute the base array of styles\n runMode(cm, line.text, cm.doc.mode, state, function(end, style) {\n st.push(end, style);\n }, lineClasses, forceToEnd);\n\n // Run overlays, adjust style array.\n for (var o = 0; o < cm.state.overlays.length; ++o) {\n var overlay = cm.state.overlays[o], i = 1, at = 0;\n runMode(cm, line.text, overlay.mode, true, function(end, style) {\n var start = i;\n // Ensure there's a token end at the current position, and that i points at it\n while (at < end) {\n var i_end = st[i];\n if (i_end > end)\n st.splice(i, 1, end, st[i+1], i_end);\n i += 2;\n at = Math.min(end, i_end);\n }\n if (!style) return;\n if (overlay.opaque) {\n st.splice(start, i - start, end, \"cm-overlay \" + style);\n i = start + 2;\n } else {\n for (; start < i; start += 2) {\n var cur = st[start+1];\n st[start+1] = (cur ? cur + \" \" : \"\") + \"cm-overlay \" + style;\n }\n }\n }, lineClasses);\n }\n\n return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null};\n }\n\n function getLineStyles(cm, line, updateFrontier) {\n if (!line.styles || line.styles[0] != cm.state.modeGen) {\n var state = getStateBefore(cm, lineNo(line));\n var result = highlightLine(cm, line, line.text.length > cm.options.maxHighlightLength ? copyState(cm.doc.mode, state) : state);\n line.stateAfter = state;\n line.styles = result.styles;\n if (result.classes) line.styleClasses = result.classes;\n else if (line.styleClasses) line.styleClasses = null;\n if (updateFrontier === cm.doc.frontier) cm.doc.frontier++;\n }\n return line.styles;\n }\n\n // Lightweight form of highlight -- proceed over this line and\n // update state, but don't save a style array. Used for lines that\n // aren't currently visible.\n function processLine(cm, text, state, startAt) {\n var mode = cm.doc.mode;\n var stream = new StringStream(text, cm.options.tabSize);\n stream.start = stream.pos = startAt || 0;\n if (text == \"\") callBlankLine(mode, state);\n while (!stream.eol()) {\n readToken(mode, stream, state);\n stream.start = stream.pos;\n }\n }\n\n // Convert a style as returned by a mode (either null, or a string\n // containing one or more styles) to a CSS style. This is cached,\n // and also looks for line-wide styles.\n var styleToClassCache = {}, styleToClassCacheWithMode = {};\n function interpretTokenStyle(style, options) {\n if (!style || /^\\s*$/.test(style)) return null;\n var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;\n return cache[style] ||\n (cache[style] = style.replace(/\\S+/g, \"cm-$&\"));\n }\n\n // Render the DOM representation of the text of a line. Also builds\n // up a 'line map', which points at the DOM nodes that represent\n // specific stretches of text, and is used by the measuring code.\n // The returned object contains the DOM node, this map, and\n // information about line-wide styles that were set by the mode.\n function buildLineContent(cm, lineView) {\n // The padding-right forces the element to have a 'border', which\n // is needed on Webkit to be able to get line-level bounding\n // rectangles for it (in measureChar).\n var content = elt(\"span\", null, null, webkit ? \"padding-right: .1px\" : null);\n var builder = {pre: elt(\"pre\", [content], \"CodeMirror-line\"), content: content,\n col: 0, pos: 0, cm: cm,\n splitSpaces: (ie || webkit) && cm.getOption(\"lineWrapping\")};\n lineView.measure = {};\n\n // Iterate over the logical lines that make up this visual line.\n for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {\n var line = i ? lineView.rest[i - 1] : lineView.line, order;\n builder.pos = 0;\n builder.addToken = buildToken;\n // Optionally wire in some hacks into the token-rendering\n // algorithm, to deal with browser quirks.\n if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line)))\n builder.addToken = buildTokenBadBidi(builder.addToken, order);\n builder.map = [];\n var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);\n insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));\n if (line.styleClasses) {\n if (line.styleClasses.bgClass)\n builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || \"\");\n if (line.styleClasses.textClass)\n builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || \"\");\n }\n\n // Ensure at least a single node is present, for measuring.\n if (builder.map.length == 0)\n builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure)));\n\n // Store the map and a cache object for the current logical line\n if (i == 0) {\n lineView.measure.map = builder.map;\n lineView.measure.cache = {};\n } else {\n (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map);\n (lineView.measure.caches || (lineView.measure.caches = [])).push({});\n }\n }\n\n // See issue #2901\n if (webkit && /\\bcm-tab\\b/.test(builder.content.lastChild.className))\n builder.content.className = \"cm-tab-wrap-hack\";\n\n signal(cm, \"renderLine\", cm, lineView.line, builder.pre);\n if (builder.pre.className)\n builder.textClass = joinClasses(builder.pre.className, builder.textClass || \"\");\n\n return builder;\n }\n\n function defaultSpecialCharPlaceholder(ch) {\n var token = elt(\"span\", \"\\u2022\", \"cm-invalidchar\");\n token.title = \"\\\\u\" + ch.charCodeAt(0).toString(16);\n token.setAttribute(\"aria-label\", token.title);\n return token;\n }\n\n // Build up the DOM representation for a single token, and add it to\n // the line map. Takes care to render special characters separately.\n function buildToken(builder, text, style, startStyle, endStyle, title, css) {\n if (!text) return;\n var displayText = builder.splitSpaces ? text.replace(/ {3,}/g, splitSpaces) : text;\n var special = builder.cm.state.specialChars, mustWrap = false;\n if (!special.test(text)) {\n builder.col += text.length;\n var content = document.createTextNode(displayText);\n builder.map.push(builder.pos, builder.pos + text.length, content);\n if (ie && ie_version < 9) mustWrap = true;\n builder.pos += text.length;\n } else {\n var content = document.createDocumentFragment(), pos = 0;\n while (true) {\n special.lastIndex = pos;\n var m = special.exec(text);\n var skipped = m ? m.index - pos : text.length - pos;\n if (skipped) {\n var txt = document.createTextNode(displayText.slice(pos, pos + skipped));\n if (ie && ie_version < 9) content.appendChild(elt(\"span\", [txt]));\n else content.appendChild(txt);\n builder.map.push(builder.pos, builder.pos + skipped, txt);\n builder.col += skipped;\n builder.pos += skipped;\n }\n if (!m) break;\n pos += skipped + 1;\n if (m[0] == \"\\t\") {\n var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;\n var txt = content.appendChild(elt(\"span\", spaceStr(tabWidth), \"cm-tab\"));\n txt.setAttribute(\"role\", \"presentation\");\n txt.setAttribute(\"cm-text\", \"\\t\");\n builder.col += tabWidth;\n } else if (m[0] == \"\\r\" || m[0] == \"\\n\") {\n var txt = content.appendChild(elt(\"span\", m[0] == \"\\r\" ? \"\\u240d\" : \"\\u2424\", \"cm-invalidchar\"));\n txt.setAttribute(\"cm-text\", m[0]);\n builder.col += 1;\n } else {\n var txt = builder.cm.options.specialCharPlaceholder(m[0]);\n txt.setAttribute(\"cm-text\", m[0]);\n if (ie && ie_version < 9) content.appendChild(elt(\"span\", [txt]));\n else content.appendChild(txt);\n builder.col += 1;\n }\n builder.map.push(builder.pos, builder.pos + 1, txt);\n builder.pos++;\n }\n }\n if (style || startStyle || endStyle || mustWrap || css) {\n var fullStyle = style || \"\";\n if (startStyle) fullStyle += startStyle;\n if (endStyle) fullStyle += endStyle;\n var token = elt(\"span\", [content], fullStyle, css);\n if (title) token.title = title;\n return builder.content.appendChild(token);\n }\n builder.content.appendChild(content);\n }\n\n function splitSpaces(old) {\n var out = \" \";\n for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? \" \" : \"\\u00a0\";\n out += \" \";\n return out;\n }\n\n // Work around nonsense dimensions being reported for stretches of\n // right-to-left text.\n function buildTokenBadBidi(inner, order) {\n return function(builder, text, style, startStyle, endStyle, title, css) {\n style = style ? style + \" cm-force-border\" : \"cm-force-border\";\n var start = builder.pos, end = start + text.length;\n for (;;) {\n // Find the part that overlaps with the start of this text\n for (var i = 0; i < order.length; i++) {\n var part = order[i];\n if (part.to > start && part.from <= start) break;\n }\n if (part.to >= end) return inner(builder, text, style, startStyle, endStyle, title, css);\n inner(builder, text.slice(0, part.to - start), style, startStyle, null, title, css);\n startStyle = null;\n text = text.slice(part.to - start);\n start = part.to;\n }\n };\n }\n\n function buildCollapsedSpan(builder, size, marker, ignoreWidget) {\n var widget = !ignoreWidget && marker.widgetNode;\n if (widget) builder.map.push(builder.pos, builder.pos + size, widget);\n if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {\n if (!widget)\n widget = builder.content.appendChild(document.createElement(\"span\"));\n widget.setAttribute(\"cm-marker\", marker.id);\n }\n if (widget) {\n builder.cm.display.input.setUneditable(widget);\n builder.content.appendChild(widget);\n }\n builder.pos += size;\n }\n\n // Outputs a number of spans to make up a line, taking highlighting\n // and marked text into account.\n function insertLineContent(line, builder, styles) {\n var spans = line.markedSpans, allText = line.text, at = 0;\n if (!spans) {\n for (var i = 1; i < styles.length; i+=2)\n builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder.cm.options));\n return;\n }\n\n var len = allText.length, pos = 0, i = 1, text = \"\", style, css;\n var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed;\n for (;;) {\n if (nextChange == pos) { // Update current marker set\n spanStyle = spanEndStyle = spanStartStyle = title = css = \"\";\n collapsed = null; nextChange = Infinity;\n var foundBookmarks = [], endStyles\n for (var j = 0; j < spans.length; ++j) {\n var sp = spans[j], m = sp.marker;\n if (m.type == \"bookmark\" && sp.from == pos && m.widgetNode) {\n foundBookmarks.push(m);\n } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {\n if (sp.to != null && sp.to != pos && nextChange > sp.to) {\n nextChange = sp.to;\n spanEndStyle = \"\";\n }\n if (m.className) spanStyle += \" \" + m.className;\n if (m.css) css = (css ? css + \";\" : \"\") + m.css;\n if (m.startStyle && sp.from == pos) spanStartStyle += \" \" + m.startStyle;\n if (m.endStyle && sp.to == nextChange) (endStyles || (endStyles = [])).push(m.endStyle, sp.to)\n if (m.title && !title) title = m.title;\n if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))\n collapsed = sp;\n } else if (sp.from > pos && nextChange > sp.from) {\n nextChange = sp.from;\n }\n }\n if (endStyles) for (var j = 0; j < endStyles.length; j += 2)\n if (endStyles[j + 1] == nextChange) spanEndStyle += \" \" + endStyles[j]\n\n if (!collapsed || collapsed.from == pos) for (var j = 0; j < foundBookmarks.length; ++j)\n buildCollapsedSpan(builder, 0, foundBookmarks[j]);\n if (collapsed && (collapsed.from || 0) == pos) {\n buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,\n collapsed.marker, collapsed.from == null);\n if (collapsed.to == null) return;\n if (collapsed.to == pos) collapsed = false;\n }\n }\n if (pos >= len) break;\n\n var upto = Math.min(len, nextChange);\n while (true) {\n if (text) {\n var end = pos + text.length;\n if (!collapsed) {\n var tokenText = end > upto ? text.slice(0, upto - pos) : text;\n builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,\n spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : \"\", title, css);\n }\n if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}\n pos = end;\n spanStartStyle = \"\";\n }\n text = allText.slice(at, at = styles[i++]);\n style = interpretTokenStyle(styles[i++], builder.cm.options);\n }\n }\n }\n\n // DOCUMENT DATA STRUCTURE\n\n // By default, updates that start and end at the beginning of a line\n // are treated specially, in order to make the association of line\n // widgets and marker elements with the text behave more intuitive.\n function isWholeLineUpdate(doc, change) {\n return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == \"\" &&\n (!doc.cm || doc.cm.options.wholeLineUpdateBefore);\n }\n\n // Perform a change on the document data structure.\n function updateDoc(doc, change, markedSpans, estimateHeight) {\n function spansFor(n) {return markedSpans ? markedSpans[n] : null;}\n function update(line, text, spans) {\n updateLine(line, text, spans, estimateHeight);\n signalLater(line, \"change\", line, change);\n }\n function linesFor(start, end) {\n for (var i = start, result = []; i < end; ++i)\n result.push(new Line(text[i], spansFor(i), estimateHeight));\n return result;\n }\n\n var from = change.from, to = change.to, text = change.text;\n var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);\n var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;\n\n // Adjust the line structure\n if (change.full) {\n doc.insert(0, linesFor(0, text.length));\n doc.remove(text.length, doc.size - text.length);\n } else if (isWholeLineUpdate(doc, change)) {\n // This is a whole-line replace. Treated specially to make\n // sure line objects move the way they are supposed to.\n var added = linesFor(0, text.length - 1);\n update(lastLine, lastLine.text, lastSpans);\n if (nlines) doc.remove(from.line, nlines);\n if (added.length) doc.insert(from.line, added);\n } else if (firstLine == lastLine) {\n if (text.length == 1) {\n update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);\n } else {\n var added = linesFor(1, text.length - 1);\n added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));\n update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n doc.insert(from.line + 1, added);\n }\n } else if (text.length == 1) {\n update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));\n doc.remove(from.line + 1, nlines);\n } else {\n update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);\n var added = linesFor(1, text.length - 1);\n if (nlines > 1) doc.remove(from.line + 1, nlines - 1);\n doc.insert(from.line + 1, added);\n }\n\n signalLater(doc, \"change\", doc, change);\n }\n\n // The document is represented as a BTree consisting of leaves, with\n // chunk of lines in them, and branches, with up to ten leaves or\n // other branch nodes below them. The top node is always a branch\n // node, and is the document object itself (meaning it has\n // additional methods and properties).\n //\n // All nodes have parent links. The tree is used both to go from\n // line numbers to line objects, and to go from objects to numbers.\n // It also indexes by height, and is used to convert between height\n // and line object, and to find the total height of the document.\n //\n // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html\n\n function LeafChunk(lines) {\n this.lines = lines;\n this.parent = null;\n for (var i = 0, height = 0; i < lines.length; ++i) {\n lines[i].parent = this;\n height += lines[i].height;\n }\n this.height = height;\n }\n\n LeafChunk.prototype = {\n chunkSize: function() { return this.lines.length; },\n // Remove the n lines at offset 'at'.\n removeInner: function(at, n) {\n for (var i = at, e = at + n; i < e; ++i) {\n var line = this.lines[i];\n this.height -= line.height;\n cleanUpLine(line);\n signalLater(line, \"delete\");\n }\n this.lines.splice(at, n);\n },\n // Helper used to collapse a small branch into a single leaf.\n collapse: function(lines) {\n lines.push.apply(lines, this.lines);\n },\n // Insert the given array of lines at offset 'at', count them as\n // having the given height.\n insertInner: function(at, lines, height) {\n this.height += height;\n this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));\n for (var i = 0; i < lines.length; ++i) lines[i].parent = this;\n },\n // Used to iterate over a part of the tree.\n iterN: function(at, n, op) {\n for (var e = at + n; at < e; ++at)\n if (op(this.lines[at])) return true;\n }\n };\n\n function BranchChunk(children) {\n this.children = children;\n var size = 0, height = 0;\n for (var i = 0; i < children.length; ++i) {\n var ch = children[i];\n size += ch.chunkSize(); height += ch.height;\n ch.parent = this;\n }\n this.size = size;\n this.height = height;\n this.parent = null;\n }\n\n BranchChunk.prototype = {\n chunkSize: function() { return this.size; },\n removeInner: function(at, n) {\n this.size -= n;\n for (var i = 0; i < this.children.length; ++i) {\n var child = this.children[i], sz = child.chunkSize();\n if (at < sz) {\n var rm = Math.min(n, sz - at), oldHeight = child.height;\n child.removeInner(at, rm);\n this.height -= oldHeight - child.height;\n if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }\n if ((n -= rm) == 0) break;\n at = 0;\n } else at -= sz;\n }\n // If the result is smaller than 25 lines, ensure that it is a\n // single leaf node.\n if (this.size - n < 25 &&\n (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {\n var lines = [];\n this.collapse(lines);\n this.children = [new LeafChunk(lines)];\n this.children[0].parent = this;\n }\n },\n collapse: function(lines) {\n for (var i = 0; i < this.children.length; ++i) this.children[i].collapse(lines);\n },\n insertInner: function(at, lines, height) {\n this.size += lines.length;\n this.height += height;\n for (var i = 0; i < this.children.length; ++i) {\n var child = this.children[i], sz = child.chunkSize();\n if (at <= sz) {\n child.insertInner(at, lines, height);\n if (child.lines && child.lines.length > 50) {\n while (child.lines.length > 50) {\n var spilled = child.lines.splice(child.lines.length - 25, 25);\n var newleaf = new LeafChunk(spilled);\n child.height -= newleaf.height;\n this.children.splice(i + 1, 0, newleaf);\n newleaf.parent = this;\n }\n this.maybeSpill();\n }\n break;\n }\n at -= sz;\n }\n },\n // When a node has grown, check whether it should be split.\n maybeSpill: function() {\n if (this.children.length <= 10) return;\n var me = this;\n do {\n var spilled = me.children.splice(me.children.length - 5, 5);\n var sibling = new BranchChunk(spilled);\n if (!me.parent) { // Become the parent node\n var copy = new BranchChunk(me.children);\n copy.parent = me;\n me.children = [copy, sibling];\n me = copy;\n } else {\n me.size -= sibling.size;\n me.height -= sibling.height;\n var myIndex = indexOf(me.parent.children, me);\n me.parent.children.splice(myIndex + 1, 0, sibling);\n }\n sibling.parent = me.parent;\n } while (me.children.length > 10);\n me.parent.maybeSpill();\n },\n iterN: function(at, n, op) {\n for (var i = 0; i < this.children.length; ++i) {\n var child = this.children[i], sz = child.chunkSize();\n if (at < sz) {\n var used = Math.min(n, sz - at);\n if (child.iterN(at, used, op)) return true;\n if ((n -= used) == 0) break;\n at = 0;\n } else at -= sz;\n }\n }\n };\n\n var nextDocId = 0;\n var Doc = CodeMirror.Doc = function(text, mode, firstLine, lineSep) {\n if (!(this instanceof Doc)) return new Doc(text, mode, firstLine, lineSep);\n if (firstLine == null) firstLine = 0;\n\n BranchChunk.call(this, [new LeafChunk([new Line(\"\", null)])]);\n this.first = firstLine;\n this.scrollTop = this.scrollLeft = 0;\n this.cantEdit = false;\n this.cleanGeneration = 1;\n this.frontier = firstLine;\n var start = Pos(firstLine, 0);\n this.sel = simpleSelection(start);\n this.history = new History(null);\n this.id = ++nextDocId;\n this.modeOption = mode;\n this.lineSep = lineSep;\n this.extend = false;\n\n if (typeof text == \"string\") text = this.splitLines(text);\n updateDoc(this, {from: start, to: start, text: text});\n setSelection(this, simpleSelection(start), sel_dontScroll);\n };\n\n Doc.prototype = createObj(BranchChunk.prototype, {\n constructor: Doc,\n // Iterate over the document. Supports two forms -- with only one\n // argument, it calls that for each line in the document. With\n // three, it iterates over the range given by the first two (with\n // the second being non-inclusive).\n iter: function(from, to, op) {\n if (op) this.iterN(from - this.first, to - from, op);\n else this.iterN(this.first, this.first + this.size, from);\n },\n\n // Non-public interface for adding and removing lines.\n insert: function(at, lines) {\n var height = 0;\n for (var i = 0; i < lines.length; ++i) height += lines[i].height;\n this.insertInner(at - this.first, lines, height);\n },\n remove: function(at, n) { this.removeInner(at - this.first, n); },\n\n // From here, the methods are part of the public interface. Most\n // are also available from CodeMirror (editor) instances.\n\n getValue: function(lineSep) {\n var lines = getLines(this, this.first, this.first + this.size);\n if (lineSep === false) return lines;\n return lines.join(lineSep || this.lineSeparator());\n },\n setValue: docMethodOp(function(code) {\n var top = Pos(this.first, 0), last = this.first + this.size - 1;\n makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),\n text: this.splitLines(code), origin: \"setValue\", full: true}, true);\n setSelection(this, simpleSelection(top));\n }),\n replaceRange: function(code, from, to, origin) {\n from = clipPos(this, from);\n to = to ? clipPos(this, to) : from;\n replaceRange(this, code, from, to, origin);\n },\n getRange: function(from, to, lineSep) {\n var lines = getBetween(this, clipPos(this, from), clipPos(this, to));\n if (lineSep === false) return lines;\n return lines.join(lineSep || this.lineSeparator());\n },\n\n getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;},\n\n getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);},\n getLineNumber: function(line) {return lineNo(line);},\n\n getLineHandleVisualStart: function(line) {\n if (typeof line == \"number\") line = getLine(this, line);\n return visualLine(line);\n },\n\n lineCount: function() {return this.size;},\n firstLine: function() {return this.first;},\n lastLine: function() {return this.first + this.size - 1;},\n\n clipPos: function(pos) {return clipPos(this, pos);},\n\n getCursor: function(start) {\n var range = this.sel.primary(), pos;\n if (start == null || start == \"head\") pos = range.head;\n else if (start == \"anchor\") pos = range.anchor;\n else if (start == \"end\" || start == \"to\" || start === false) pos = range.to();\n else pos = range.from();\n return pos;\n },\n listSelections: function() { return this.sel.ranges; },\n somethingSelected: function() {return this.sel.somethingSelected();},\n\n setCursor: docMethodOp(function(line, ch, options) {\n setSimpleSelection(this, clipPos(this, typeof line == \"number\" ? Pos(line, ch || 0) : line), null, options);\n }),\n setSelection: docMethodOp(function(anchor, head, options) {\n setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);\n }),\n extendSelection: docMethodOp(function(head, other, options) {\n extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);\n }),\n extendSelections: docMethodOp(function(heads, options) {\n extendSelections(this, clipPosArray(this, heads), options);\n }),\n extendSelectionsBy: docMethodOp(function(f, options) {\n var heads = map(this.sel.ranges, f);\n extendSelections(this, clipPosArray(this, heads), options);\n }),\n setSelections: docMethodOp(function(ranges, primary, options) {\n if (!ranges.length) return;\n for (var i = 0, out = []; i < ranges.length; i++)\n out[i] = new Range(clipPos(this, ranges[i].anchor),\n clipPos(this, ranges[i].head));\n if (primary == null) primary = Math.min(ranges.length - 1, this.sel.primIndex);\n setSelection(this, normalizeSelection(out, primary), options);\n }),\n addSelection: docMethodOp(function(anchor, head, options) {\n var ranges = this.sel.ranges.slice(0);\n ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));\n setSelection(this, normalizeSelection(ranges, ranges.length - 1), options);\n }),\n\n getSelection: function(lineSep) {\n var ranges = this.sel.ranges, lines;\n for (var i = 0; i < ranges.length; i++) {\n var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n lines = lines ? lines.concat(sel) : sel;\n }\n if (lineSep === false) return lines;\n else return lines.join(lineSep || this.lineSeparator());\n },\n getSelections: function(lineSep) {\n var parts = [], ranges = this.sel.ranges;\n for (var i = 0; i < ranges.length; i++) {\n var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n if (lineSep !== false) sel = sel.join(lineSep || this.lineSeparator());\n parts[i] = sel;\n }\n return parts;\n },\n replaceSelection: function(code, collapse, origin) {\n var dup = [];\n for (var i = 0; i < this.sel.ranges.length; i++)\n dup[i] = code;\n this.replaceSelections(dup, collapse, origin || \"+input\");\n },\n replaceSelections: docMethodOp(function(code, collapse, origin) {\n var changes = [], sel = this.sel;\n for (var i = 0; i < sel.ranges.length; i++) {\n var range = sel.ranges[i];\n changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin};\n }\n var newSel = collapse && collapse != \"end\" && computeReplacedSel(this, changes, collapse);\n for (var i = changes.length - 1; i >= 0; i--)\n makeChange(this, changes[i]);\n if (newSel) setSelectionReplaceHistory(this, newSel);\n else if (this.cm) ensureCursorVisible(this.cm);\n }),\n undo: docMethodOp(function() {makeChangeFromHistory(this, \"undo\");}),\n redo: docMethodOp(function() {makeChangeFromHistory(this, \"redo\");}),\n undoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"undo\", true);}),\n redoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"redo\", true);}),\n\n setExtending: function(val) {this.extend = val;},\n getExtending: function() {return this.extend;},\n\n historySize: function() {\n var hist = this.history, done = 0, undone = 0;\n for (var i = 0; i < hist.done.length; i++) if (!hist.done[i].ranges) ++done;\n for (var i = 0; i < hist.undone.length; i++) if (!hist.undone[i].ranges) ++undone;\n return {undo: done, redo: undone};\n },\n clearHistory: function() {this.history = new History(this.history.maxGeneration);},\n\n markClean: function() {\n this.cleanGeneration = this.changeGeneration(true);\n },\n changeGeneration: function(forceSplit) {\n if (forceSplit)\n this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null;\n return this.history.generation;\n },\n isClean: function (gen) {\n return this.history.generation == (gen || this.cleanGeneration);\n },\n\n getHistory: function() {\n return {done: copyHistoryArray(this.history.done),\n undone: copyHistoryArray(this.history.undone)};\n },\n setHistory: function(histData) {\n var hist = this.history = new History(this.history.maxGeneration);\n hist.done = copyHistoryArray(histData.done.slice(0), null, true);\n hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);\n },\n\n addLineClass: docMethodOp(function(handle, where, cls) {\n return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function(line) {\n var prop = where == \"text\" ? \"textClass\"\n : where == \"background\" ? \"bgClass\"\n : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n if (!line[prop]) line[prop] = cls;\n else if (classTest(cls).test(line[prop])) return false;\n else line[prop] += \" \" + cls;\n return true;\n });\n }),\n removeLineClass: docMethodOp(function(handle, where, cls) {\n return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function(line) {\n var prop = where == \"text\" ? \"textClass\"\n : where == \"background\" ? \"bgClass\"\n : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n var cur = line[prop];\n if (!cur) return false;\n else if (cls == null) line[prop] = null;\n else {\n var found = cur.match(classTest(cls));\n if (!found) return false;\n var end = found.index + found[0].length;\n line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? \"\" : \" \") + cur.slice(end) || null;\n }\n return true;\n });\n }),\n\n addLineWidget: docMethodOp(function(handle, node, options) {\n return addLineWidget(this, handle, node, options);\n }),\n removeLineWidget: function(widget) { widget.clear(); },\n\n markText: function(from, to, options) {\n return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || \"range\");\n },\n setBookmark: function(pos, options) {\n var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),\n insertLeft: options && options.insertLeft,\n clearWhenEmpty: false, shared: options && options.shared,\n handleMouseEvents: options && options.handleMouseEvents};\n pos = clipPos(this, pos);\n return markText(this, pos, pos, realOpts, \"bookmark\");\n },\n findMarksAt: function(pos) {\n pos = clipPos(this, pos);\n var markers = [], spans = getLine(this, pos.line).markedSpans;\n if (spans) for (var i = 0; i < spans.length; ++i) {\n var span = spans[i];\n if ((span.from == null || span.from <= pos.ch) &&\n (span.to == null || span.to >= pos.ch))\n markers.push(span.marker.parent || span.marker);\n }\n return markers;\n },\n findMarks: function(from, to, filter) {\n from = clipPos(this, from); to = clipPos(this, to);\n var found = [], lineNo = from.line;\n this.iter(from.line, to.line + 1, function(line) {\n var spans = line.markedSpans;\n if (spans) for (var i = 0; i < spans.length; i++) {\n var span = spans[i];\n if (!(span.to != null && lineNo == from.line && from.ch > span.to ||\n span.from == null && lineNo != from.line ||\n span.from != null && lineNo == to.line && span.from > to.ch) &&\n (!filter || filter(span.marker)))\n found.push(span.marker.parent || span.marker);\n }\n ++lineNo;\n });\n return found;\n },\n getAllMarks: function() {\n var markers = [];\n this.iter(function(line) {\n var sps = line.markedSpans;\n if (sps) for (var i = 0; i < sps.length; ++i)\n if (sps[i].from != null) markers.push(sps[i].marker);\n });\n return markers;\n },\n\n posFromIndex: function(off) {\n var ch, lineNo = this.first;\n this.iter(function(line) {\n var sz = line.text.length + 1;\n if (sz > off) { ch = off; return true; }\n off -= sz;\n ++lineNo;\n });\n return clipPos(this, Pos(lineNo, ch));\n },\n indexFromPos: function (coords) {\n coords = clipPos(this, coords);\n var index = coords.ch;\n if (coords.line < this.first || coords.ch < 0) return 0;\n this.iter(this.first, coords.line, function (line) {\n index += line.text.length + 1;\n });\n return index;\n },\n\n copy: function(copyHistory) {\n var doc = new Doc(getLines(this, this.first, this.first + this.size),\n this.modeOption, this.first, this.lineSep);\n doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;\n doc.sel = this.sel;\n doc.extend = false;\n if (copyHistory) {\n doc.history.undoDepth = this.history.undoDepth;\n doc.setHistory(this.getHistory());\n }\n return doc;\n },\n\n linkedDoc: function(options) {\n if (!options) options = {};\n var from = this.first, to = this.first + this.size;\n if (options.from != null && options.from > from) from = options.from;\n if (options.to != null && options.to < to) to = options.to;\n var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep);\n if (options.sharedHist) copy.history = this.history;\n (this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});\n copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];\n copySharedMarkers(copy, findSharedMarkers(this));\n return copy;\n },\n unlinkDoc: function(other) {\n if (other instanceof CodeMirror) other = other.doc;\n if (this.linked) for (var i = 0; i < this.linked.length; ++i) {\n var link = this.linked[i];\n if (link.doc != other) continue;\n this.linked.splice(i, 1);\n other.unlinkDoc(this);\n detachSharedMarkers(findSharedMarkers(this));\n break;\n }\n // If the histories were shared, split them again\n if (other.history == this.history) {\n var splitIds = [other.id];\n linkedDocs(other, function(doc) {splitIds.push(doc.id);}, true);\n other.history = new History(null);\n other.history.done = copyHistoryArray(this.history.done, splitIds);\n other.history.undone = copyHistoryArray(this.history.undone, splitIds);\n }\n },\n iterLinkedDocs: function(f) {linkedDocs(this, f);},\n\n getMode: function() {return this.mode;},\n getEditor: function() {return this.cm;},\n\n splitLines: function(str) {\n if (this.lineSep) return str.split(this.lineSep);\n return splitLinesAuto(str);\n },\n lineSeparator: function() { return this.lineSep || \"\\n\"; }\n });\n\n // Public alias.\n Doc.prototype.eachLine = Doc.prototype.iter;\n\n // Set up methods on CodeMirror's prototype to redirect to the editor's document.\n var dontDelegate = \"iter insert remove copy getEditor constructor\".split(\" \");\n for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)\n CodeMirror.prototype[prop] = (function(method) {\n return function() {return method.apply(this.doc, arguments);};\n })(Doc.prototype[prop]);\n\n eventMixin(Doc);\n\n // Call f for all linked documents.\n function linkedDocs(doc, f, sharedHistOnly) {\n function propagate(doc, skip, sharedHist) {\n if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) {\n var rel = doc.linked[i];\n if (rel.doc == skip) continue;\n var shared = sharedHist && rel.sharedHist;\n if (sharedHistOnly && !shared) continue;\n f(rel.doc, shared);\n propagate(rel.doc, doc, shared);\n }\n }\n propagate(doc, null, true);\n }\n\n // Attach a document to an editor.\n function attachDoc(cm, doc) {\n if (doc.cm) throw new Error(\"This document is already in use.\");\n cm.doc = doc;\n doc.cm = cm;\n estimateLineHeights(cm);\n loadMode(cm);\n if (!cm.options.lineWrapping) findMaxLine(cm);\n cm.options.mode = doc.modeOption;\n regChange(cm);\n }\n\n // LINE UTILITIES\n\n // Find the line object corresponding to the given line number.\n function getLine(doc, n) {\n n -= doc.first;\n if (n < 0 || n >= doc.size) throw new Error(\"There is no line \" + (n + doc.first) + \" in the document.\");\n for (var chunk = doc; !chunk.lines;) {\n for (var i = 0;; ++i) {\n var child = chunk.children[i], sz = child.chunkSize();\n if (n < sz) { chunk = child; break; }\n n -= sz;\n }\n }\n return chunk.lines[n];\n }\n\n // Get the part of a document between two positions, as an array of\n // strings.\n function getBetween(doc, start, end) {\n var out = [], n = start.line;\n doc.iter(start.line, end.line + 1, function(line) {\n var text = line.text;\n if (n == end.line) text = text.slice(0, end.ch);\n if (n == start.line) text = text.slice(start.ch);\n out.push(text);\n ++n;\n });\n return out;\n }\n // Get the lines between from and to, as array of strings.\n function getLines(doc, from, to) {\n var out = [];\n doc.iter(from, to, function(line) { out.push(line.text); });\n return out;\n }\n\n // Update the height of a line, propagating the height change\n // upwards to parent nodes.\n function updateLineHeight(line, height) {\n var diff = height - line.height;\n if (diff) for (var n = line; n; n = n.parent) n.height += diff;\n }\n\n // Given a line object, find its line number by walking up through\n // its parent links.\n function lineNo(line) {\n if (line.parent == null) return null;\n var cur = line.parent, no = indexOf(cur.lines, line);\n for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {\n for (var i = 0;; ++i) {\n if (chunk.children[i] == cur) break;\n no += chunk.children[i].chunkSize();\n }\n }\n return no + cur.first;\n }\n\n // Find the line at the given vertical position, using the height\n // information in the document tree.\n function lineAtHeight(chunk, h) {\n var n = chunk.first;\n outer: do {\n for (var i = 0; i < chunk.children.length; ++i) {\n var child = chunk.children[i], ch = child.height;\n if (h < ch) { chunk = child; continue outer; }\n h -= ch;\n n += child.chunkSize();\n }\n return n;\n } while (!chunk.lines);\n for (var i = 0; i < chunk.lines.length; ++i) {\n var line = chunk.lines[i], lh = line.height;\n if (h < lh) break;\n h -= lh;\n }\n return n + i;\n }\n\n\n // Find the height above the given line.\n function heightAtLine(lineObj) {\n lineObj = visualLine(lineObj);\n\n var h = 0, chunk = lineObj.parent;\n for (var i = 0; i < chunk.lines.length; ++i) {\n var line = chunk.lines[i];\n if (line == lineObj) break;\n else h += line.height;\n }\n for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {\n for (var i = 0; i < p.children.length; ++i) {\n var cur = p.children[i];\n if (cur == chunk) break;\n else h += cur.height;\n }\n }\n return h;\n }\n\n // Get the bidi ordering for the given line (and cache it). Returns\n // false for lines that are fully left-to-right, and an array of\n // BidiSpan objects otherwise.\n function getOrder(line) {\n var order = line.order;\n if (order == null) order = line.order = bidiOrdering(line.text);\n return order;\n }\n\n // HISTORY\n\n function History(startGen) {\n // Arrays of change events and selections. Doing something adds an\n // event to done and clears undo. Undoing moves events from done\n // to undone, redoing moves them in the other direction.\n this.done = []; this.undone = [];\n this.undoDepth = Infinity;\n // Used to track when changes can be merged into a single undo\n // event\n this.lastModTime = this.lastSelTime = 0;\n this.lastOp = this.lastSelOp = null;\n this.lastOrigin = this.lastSelOrigin = null;\n // Used by the isClean() method\n this.generation = this.maxGeneration = startGen || 1;\n }\n\n // Create a history change event from an updateDoc-style change\n // object.\n function historyChangeFromChange(doc, change) {\n var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};\n attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);\n linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true);\n return histChange;\n }\n\n // Pop all selection events off the end of a history array. Stop at\n // a change event.\n function clearSelectionEvents(array) {\n while (array.length) {\n var last = lst(array);\n if (last.ranges) array.pop();\n else break;\n }\n }\n\n // Find the top change event in the history. Pop off selection\n // events that are in the way.\n function lastChangeEvent(hist, force) {\n if (force) {\n clearSelectionEvents(hist.done);\n return lst(hist.done);\n } else if (hist.done.length && !lst(hist.done).ranges) {\n return lst(hist.done);\n } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {\n hist.done.pop();\n return lst(hist.done);\n }\n }\n\n // Register a change in the history. Merges changes that are within\n // a single operation, ore are close together with an origin that\n // allows merging (starting with \"+\") into a single event.\n function addChangeToHistory(doc, change, selAfter, opId) {\n var hist = doc.history;\n hist.undone.length = 0;\n var time = +new Date, cur;\n\n if ((hist.lastOp == opId ||\n hist.lastOrigin == change.origin && change.origin &&\n ((change.origin.charAt(0) == \"+\" && doc.cm && hist.lastModTime > time - doc.cm.options.historyEventDelay) ||\n change.origin.charAt(0) == \"*\")) &&\n (cur = lastChangeEvent(hist, hist.lastOp == opId))) {\n // Merge this change into the last event\n var last = lst(cur.changes);\n if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {\n // Optimized case for simple insertion -- don't want to add\n // new changesets for every character typed\n last.to = changeEnd(change);\n } else {\n // Add new sub-event\n cur.changes.push(historyChangeFromChange(doc, change));\n }\n } else {\n // Can not be merged, start a new event.\n var before = lst(hist.done);\n if (!before || !before.ranges)\n pushSelectionToHistory(doc.sel, hist.done);\n cur = {changes: [historyChangeFromChange(doc, change)],\n generation: hist.generation};\n hist.done.push(cur);\n while (hist.done.length > hist.undoDepth) {\n hist.done.shift();\n if (!hist.done[0].ranges) hist.done.shift();\n }\n }\n hist.done.push(selAfter);\n hist.generation = ++hist.maxGeneration;\n hist.lastModTime = hist.lastSelTime = time;\n hist.lastOp = hist.lastSelOp = opId;\n hist.lastOrigin = hist.lastSelOrigin = change.origin;\n\n if (!last) signal(doc, \"historyAdded\");\n }\n\n function selectionEventCanBeMerged(doc, origin, prev, sel) {\n var ch = origin.charAt(0);\n return ch == \"*\" ||\n ch == \"+\" &&\n prev.ranges.length == sel.ranges.length &&\n prev.somethingSelected() == sel.somethingSelected() &&\n new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500);\n }\n\n // Called whenever the selection changes, sets the new selection as\n // the pending selection in the history, and pushes the old pending\n // selection into the 'done' array when it was significantly\n // different (in number of selected ranges, emptiness, or time).\n function addSelectionToHistory(doc, sel, opId, options) {\n var hist = doc.history, origin = options && options.origin;\n\n // A new event is started when the previous origin does not match\n // the current, or the origins don't allow matching. Origins\n // starting with * are always merged, those starting with + are\n // merged when similar and close together in time.\n if (opId == hist.lastSelOp ||\n (origin && hist.lastSelOrigin == origin &&\n (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||\n selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))\n hist.done[hist.done.length - 1] = sel;\n else\n pushSelectionToHistory(sel, hist.done);\n\n hist.lastSelTime = +new Date;\n hist.lastSelOrigin = origin;\n hist.lastSelOp = opId;\n if (options && options.clearRedo !== false)\n clearSelectionEvents(hist.undone);\n }\n\n function pushSelectionToHistory(sel, dest) {\n var top = lst(dest);\n if (!(top && top.ranges && top.equals(sel)))\n dest.push(sel);\n }\n\n // Used to store marked span information in the history.\n function attachLocalSpans(doc, change, from, to) {\n var existing = change[\"spans_\" + doc.id], n = 0;\n doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function(line) {\n if (line.markedSpans)\n (existing || (existing = change[\"spans_\" + doc.id] = {}))[n] = line.markedSpans;\n ++n;\n });\n }\n\n // When un/re-doing restores text containing marked spans, those\n // that have been explicitly cleared should not be restored.\n function removeClearedSpans(spans) {\n if (!spans) return null;\n for (var i = 0, out; i < spans.length; ++i) {\n if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); }\n else if (out) out.push(spans[i]);\n }\n return !out ? spans : out.length ? out : null;\n }\n\n // Retrieve and filter the old marked spans stored in a change event.\n function getOldSpans(doc, change) {\n var found = change[\"spans_\" + doc.id];\n if (!found) return null;\n for (var i = 0, nw = []; i < change.text.length; ++i)\n nw.push(removeClearedSpans(found[i]));\n return nw;\n }\n\n // Used both to provide a JSON-safe object in .getHistory, and, when\n // detaching a document, to split the history in two\n function copyHistoryArray(events, newGroup, instantiateSel) {\n for (var i = 0, copy = []; i < events.length; ++i) {\n var event = events[i];\n if (event.ranges) {\n copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);\n continue;\n }\n var changes = event.changes, newChanges = [];\n copy.push({changes: newChanges});\n for (var j = 0; j < changes.length; ++j) {\n var change = changes[j], m;\n newChanges.push({from: change.from, to: change.to, text: change.text});\n if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\\d+)$/)) {\n if (indexOf(newGroup, Number(m[1])) > -1) {\n lst(newChanges)[prop] = change[prop];\n delete change[prop];\n }\n }\n }\n }\n return copy;\n }\n\n // Rebasing/resetting history to deal with externally-sourced changes\n\n function rebaseHistSelSingle(pos, from, to, diff) {\n if (to < pos.line) {\n pos.line += diff;\n } else if (from < pos.line) {\n pos.line = from;\n pos.ch = 0;\n }\n }\n\n // Tries to rebase an array of history events given a change in the\n // document. If the change touches the same lines as the event, the\n // event, and everything 'behind' it, is discarded. If the change is\n // before the event, the event's positions are updated. Uses a\n // copy-on-write scheme for the positions, to avoid having to\n // reallocate them all on every rebase, but also avoid problems with\n // shared position objects being unsafely updated.\n function rebaseHistArray(array, from, to, diff) {\n for (var i = 0; i < array.length; ++i) {\n var sub = array[i], ok = true;\n if (sub.ranges) {\n if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }\n for (var j = 0; j < sub.ranges.length; j++) {\n rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);\n rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);\n }\n continue;\n }\n for (var j = 0; j < sub.changes.length; ++j) {\n var cur = sub.changes[j];\n if (to < cur.from.line) {\n cur.from = Pos(cur.from.line + diff, cur.from.ch);\n cur.to = Pos(cur.to.line + diff, cur.to.ch);\n } else if (from <= cur.to.line) {\n ok = false;\n break;\n }\n }\n if (!ok) {\n array.splice(0, i + 1);\n i = 0;\n }\n }\n }\n\n function rebaseHist(hist, change) {\n var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;\n rebaseHistArray(hist.done, from, to, diff);\n rebaseHistArray(hist.undone, from, to, diff);\n }\n\n // EVENT UTILITIES\n\n // Due to the fact that we still support jurassic IE versions, some\n // compatibility wrappers are needed.\n\n var e_preventDefault = CodeMirror.e_preventDefault = function(e) {\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n };\n var e_stopPropagation = CodeMirror.e_stopPropagation = function(e) {\n if (e.stopPropagation) e.stopPropagation();\n else e.cancelBubble = true;\n };\n function e_defaultPrevented(e) {\n return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false;\n }\n var e_stop = CodeMirror.e_stop = function(e) {e_preventDefault(e); e_stopPropagation(e);};\n\n function e_target(e) {return e.target || e.srcElement;}\n function e_button(e) {\n var b = e.which;\n if (b == null) {\n if (e.button & 1) b = 1;\n else if (e.button & 2) b = 3;\n else if (e.button & 4) b = 2;\n }\n if (mac && e.ctrlKey && b == 1) b = 3;\n return b;\n }\n\n // EVENT HANDLING\n\n // Lightweight event framework. on/off also work on DOM nodes,\n // registering native DOM handlers.\n\n var on = CodeMirror.on = function(emitter, type, f) {\n if (emitter.addEventListener)\n emitter.addEventListener(type, f, false);\n else if (emitter.attachEvent)\n emitter.attachEvent(\"on\" + type, f);\n else {\n var map = emitter._handlers || (emitter._handlers = {});\n var arr = map[type] || (map[type] = []);\n arr.push(f);\n }\n };\n\n var noHandlers = []\n function getHandlers(emitter, type, copy) {\n var arr = emitter._handlers && emitter._handlers[type]\n if (copy) return arr && arr.length > 0 ? arr.slice() : noHandlers\n else return arr || noHandlers\n }\n\n var off = CodeMirror.off = function(emitter, type, f) {\n if (emitter.removeEventListener)\n emitter.removeEventListener(type, f, false);\n else if (emitter.detachEvent)\n emitter.detachEvent(\"on\" + type, f);\n else {\n var handlers = getHandlers(emitter, type, false)\n for (var i = 0; i < handlers.length; ++i)\n if (handlers[i] == f) { handlers.splice(i, 1); break; }\n }\n };\n\n var signal = CodeMirror.signal = function(emitter, type /*, values...*/) {\n var handlers = getHandlers(emitter, type, true)\n if (!handlers.length) return;\n var args = Array.prototype.slice.call(arguments, 2);\n for (var i = 0; i < handlers.length; ++i) handlers[i].apply(null, args);\n };\n\n var orphanDelayedCallbacks = null;\n\n // Often, we want to signal events at a point where we are in the\n // middle of some work, but don't want the handler to start calling\n // other methods on the editor, which might be in an inconsistent\n // state or simply not expect any other events to happen.\n // signalLater looks whether there are any handlers, and schedules\n // them to be executed when the last operation ends, or, if no\n // operation is active, when a timeout fires.\n function signalLater(emitter, type /*, values...*/) {\n var arr = getHandlers(emitter, type, false)\n if (!arr.length) return;\n var args = Array.prototype.slice.call(arguments, 2), list;\n if (operationGroup) {\n list = operationGroup.delayedCallbacks;\n } else if (orphanDelayedCallbacks) {\n list = orphanDelayedCallbacks;\n } else {\n list = orphanDelayedCallbacks = [];\n setTimeout(fireOrphanDelayed, 0);\n }\n function bnd(f) {return function(){f.apply(null, args);};};\n for (var i = 0; i < arr.length; ++i)\n list.push(bnd(arr[i]));\n }\n\n function fireOrphanDelayed() {\n var delayed = orphanDelayedCallbacks;\n orphanDelayedCallbacks = null;\n for (var i = 0; i < delayed.length; ++i) delayed[i]();\n }\n\n // The DOM events that CodeMirror handles can be overridden by\n // registering a (non-DOM) handler on the editor for the event name,\n // and preventDefault-ing the event in that handler.\n function signalDOMEvent(cm, e, override) {\n if (typeof e == \"string\")\n e = {type: e, preventDefault: function() { this.defaultPrevented = true; }};\n signal(cm, override || e.type, cm, e);\n return e_defaultPrevented(e) || e.codemirrorIgnore;\n }\n\n function signalCursorActivity(cm) {\n var arr = cm._handlers && cm._handlers.cursorActivity;\n if (!arr) return;\n var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);\n for (var i = 0; i < arr.length; ++i) if (indexOf(set, arr[i]) == -1)\n set.push(arr[i]);\n }\n\n function hasHandler(emitter, type) {\n return getHandlers(emitter, type).length > 0\n }\n\n // Add on and off methods to a constructor's prototype, to make\n // registering events on such objects more convenient.\n function eventMixin(ctor) {\n ctor.prototype.on = function(type, f) {on(this, type, f);};\n ctor.prototype.off = function(type, f) {off(this, type, f);};\n }\n\n // MISC UTILITIES\n\n // Number of pixels added to scroller and sizer to hide scrollbar\n var scrollerGap = 30;\n\n // Returned or thrown by various protocols to signal 'I'm not\n // handling this'.\n var Pass = CodeMirror.Pass = {toString: function(){return \"CodeMirror.Pass\";}};\n\n // Reused option objects for setSelection & friends\n var sel_dontScroll = {scroll: false}, sel_mouse = {origin: \"*mouse\"}, sel_move = {origin: \"+move\"};\n\n function Delayed() {this.id = null;}\n Delayed.prototype.set = function(ms, f) {\n clearTimeout(this.id);\n this.id = setTimeout(f, ms);\n };\n\n // Counts the column offset in a string, taking tabs into account.\n // Used mostly to find indentation.\n var countColumn = CodeMirror.countColumn = function(string, end, tabSize, startIndex, startValue) {\n if (end == null) {\n end = string.search(/[^\\s\\u00a0]/);\n if (end == -1) end = string.length;\n }\n for (var i = startIndex || 0, n = startValue || 0;;) {\n var nextTab = string.indexOf(\"\\t\", i);\n if (nextTab < 0 || nextTab >= end)\n return n + (end - i);\n n += nextTab - i;\n n += tabSize - (n % tabSize);\n i = nextTab + 1;\n }\n };\n\n // The inverse of countColumn -- find the offset that corresponds to\n // a particular column.\n var findColumn = CodeMirror.findColumn = function(string, goal, tabSize) {\n for (var pos = 0, col = 0;;) {\n var nextTab = string.indexOf(\"\\t\", pos);\n if (nextTab == -1) nextTab = string.length;\n var skipped = nextTab - pos;\n if (nextTab == string.length || col + skipped >= goal)\n return pos + Math.min(skipped, goal - col);\n col += nextTab - pos;\n col += tabSize - (col % tabSize);\n pos = nextTab + 1;\n if (col >= goal) return pos;\n }\n }\n\n var spaceStrs = [\"\"];\n function spaceStr(n) {\n while (spaceStrs.length <= n)\n spaceStrs.push(lst(spaceStrs) + \" \");\n return spaceStrs[n];\n }\n\n function lst(arr) { return arr[arr.length-1]; }\n\n var selectInput = function(node) { node.select(); };\n if (ios) // Mobile Safari apparently has a bug where select() is broken.\n selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; };\n else if (ie) // Suppress mysterious IE10 errors\n selectInput = function(node) { try { node.select(); } catch(_e) {} };\n\n function indexOf(array, elt) {\n for (var i = 0; i < array.length; ++i)\n if (array[i] == elt) return i;\n return -1;\n }\n function map(array, f) {\n var out = [];\n for (var i = 0; i < array.length; i++) out[i] = f(array[i], i);\n return out;\n }\n\n function nothing() {}\n\n function createObj(base, props) {\n var inst;\n if (Object.create) {\n inst = Object.create(base);\n } else {\n nothing.prototype = base;\n inst = new nothing();\n }\n if (props) copyObj(props, inst);\n return inst;\n };\n\n function copyObj(obj, target, overwrite) {\n if (!target) target = {};\n for (var prop in obj)\n if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))\n target[prop] = obj[prop];\n return target;\n }\n\n function bind(f) {\n var args = Array.prototype.slice.call(arguments, 1);\n return function(){return f.apply(null, args);};\n }\n\n var nonASCIISingleCaseWordChar = /[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/;\n var isWordCharBasic = CodeMirror.isWordChar = function(ch) {\n return /\\w/.test(ch) || ch > \"\\x80\" &&\n (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch));\n };\n function isWordChar(ch, helper) {\n if (!helper) return isWordCharBasic(ch);\n if (helper.source.indexOf(\"\\\\w\") > -1 && isWordCharBasic(ch)) return true;\n return helper.test(ch);\n }\n\n function isEmpty(obj) {\n for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false;\n return true;\n }\n\n // Extending unicode characters. A series of a non-extending char +\n // any number of extending chars is treated as a single unit as far\n // as editing and measuring is concerned. This is not fully correct,\n // since some scripts/fonts/browsers also treat other configurations\n // of code points as a group.\n var extendingChars = /[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/;\n function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); }\n\n // DOM UTILITIES\n\n function elt(tag, content, className, style) {\n var e = document.createElement(tag);\n if (className) e.className = className;\n if (style) e.style.cssText = style;\n if (typeof content == \"string\") e.appendChild(document.createTextNode(content));\n else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]);\n return e;\n }\n\n var range;\n if (document.createRange) range = function(node, start, end, endNode) {\n var r = document.createRange();\n r.setEnd(endNode || node, end);\n r.setStart(node, start);\n return r;\n };\n else range = function(node, start, end) {\n var r = document.body.createTextRange();\n try { r.moveToElementText(node.parentNode); }\n catch(e) { return r; }\n r.collapse(true);\n r.moveEnd(\"character\", end);\n r.moveStart(\"character\", start);\n return r;\n };\n\n function removeChildren(e) {\n for (var count = e.childNodes.length; count > 0; --count)\n e.removeChild(e.firstChild);\n return e;\n }\n\n function removeChildrenAndAdd(parent, e) {\n return removeChildren(parent).appendChild(e);\n }\n\n var contains = CodeMirror.contains = function(parent, child) {\n if (child.nodeType == 3) // Android browser always returns false when child is a textnode\n child = child.parentNode;\n if (parent.contains)\n return parent.contains(child);\n do {\n if (child.nodeType == 11) child = child.host;\n if (child == parent) return true;\n } while (child = child.parentNode);\n };\n\n function activeElt() {\n var activeElement = document.activeElement;\n while (activeElement && activeElement.root && activeElement.root.activeElement)\n activeElement = activeElement.root.activeElement;\n return activeElement;\n }\n // Older versions of IE throws unspecified error when touching\n // document.activeElement in some cases (during loading, in iframe)\n if (ie && ie_version < 11) activeElt = function() {\n try { return document.activeElement; }\n catch(e) { return document.body; }\n };\n\n function classTest(cls) { return new RegExp(\"(^|\\\\s)\" + cls + \"(?:$|\\\\s)\\\\s*\"); }\n var rmClass = CodeMirror.rmClass = function(node, cls) {\n var current = node.className;\n var match = classTest(cls).exec(current);\n if (match) {\n var after = current.slice(match.index + match[0].length);\n node.className = current.slice(0, match.index) + (after ? match[1] + after : \"\");\n }\n };\n var addClass = CodeMirror.addClass = function(node, cls) {\n var current = node.className;\n if (!classTest(cls).test(current)) node.className += (current ? \" \" : \"\") + cls;\n };\n function joinClasses(a, b) {\n var as = a.split(\" \");\n for (var i = 0; i < as.length; i++)\n if (as[i] && !classTest(as[i]).test(b)) b += \" \" + as[i];\n return b;\n }\n\n // WINDOW-WIDE EVENTS\n\n // These must be handled carefully, because naively registering a\n // handler for each editor will cause the editors to never be\n // garbage collected.\n\n function forEachCodeMirror(f) {\n if (!document.body.getElementsByClassName) return;\n var byClass = document.body.getElementsByClassName(\"CodeMirror\");\n for (var i = 0; i < byClass.length; i++) {\n var cm = byClass[i].CodeMirror;\n if (cm) f(cm);\n }\n }\n\n var globalsRegistered = false;\n function ensureGlobalHandlers() {\n if (globalsRegistered) return;\n registerGlobalHandlers();\n globalsRegistered = true;\n }\n function registerGlobalHandlers() {\n // When the window resizes, we need to refresh active editors.\n var resizeTimer;\n on(window, \"resize\", function() {\n if (resizeTimer == null) resizeTimer = setTimeout(function() {\n resizeTimer = null;\n forEachCodeMirror(onResize);\n }, 100);\n });\n // When the window loses focus, we want to show the editor as blurred\n on(window, \"blur\", function() {\n forEachCodeMirror(onBlur);\n });\n }\n\n // FEATURE DETECTION\n\n // Detect drag-and-drop\n var dragAndDrop = function() {\n // There is *some* kind of drag-and-drop support in IE6-8, but I\n // couldn't get it to work yet.\n if (ie && ie_version < 9) return false;\n var div = elt('div');\n return \"draggable\" in div || \"dragDrop\" in div;\n }();\n\n var zwspSupported;\n function zeroWidthElement(measure) {\n if (zwspSupported == null) {\n var test = elt(\"span\", \"\\u200b\");\n removeChildrenAndAdd(measure, elt(\"span\", [test, document.createTextNode(\"x\")]));\n if (measure.firstChild.offsetHeight != 0)\n zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8);\n }\n var node = zwspSupported ? elt(\"span\", \"\\u200b\") :\n elt(\"span\", \"\\u00a0\", null, \"display: inline-block; width: 1px; margin-right: -1px\");\n node.setAttribute(\"cm-text\", \"\");\n return node;\n }\n\n // Feature-detect IE's crummy client rect reporting for bidi text\n var badBidiRects;\n function hasBadBidiRects(measure) {\n if (badBidiRects != null) return badBidiRects;\n var txt = removeChildrenAndAdd(measure, document.createTextNode(\"A\\u062eA\"));\n var r0 = range(txt, 0, 1).getBoundingClientRect();\n if (!r0 || r0.left == r0.right) return false; // Safari returns null in some cases (#2780)\n var r1 = range(txt, 1, 2).getBoundingClientRect();\n return badBidiRects = (r1.right - r0.right < 3);\n }\n\n // See if \"\".split is the broken IE version, if so, provide an\n // alternative way to split lines.\n var splitLinesAuto = CodeMirror.splitLines = \"\\n\\nb\".split(/\\n/).length != 3 ? function(string) {\n var pos = 0, result = [], l = string.length;\n while (pos <= l) {\n var nl = string.indexOf(\"\\n\", pos);\n if (nl == -1) nl = string.length;\n var line = string.slice(pos, string.charAt(nl - 1) == \"\\r\" ? nl - 1 : nl);\n var rt = line.indexOf(\"\\r\");\n if (rt != -1) {\n result.push(line.slice(0, rt));\n pos += rt + 1;\n } else {\n result.push(line);\n pos = nl + 1;\n }\n }\n return result;\n } : function(string){return string.split(/\\r\\n?|\\n/);};\n\n var hasSelection = window.getSelection ? function(te) {\n try { return te.selectionStart != te.selectionEnd; }\n catch(e) { return false; }\n } : function(te) {\n try {var range = te.ownerDocument.selection.createRange();}\n catch(e) {}\n if (!range || range.parentElement() != te) return false;\n return range.compareEndPoints(\"StartToEnd\", range) != 0;\n };\n\n var hasCopyEvent = (function() {\n var e = elt(\"div\");\n if (\"oncopy\" in e) return true;\n e.setAttribute(\"oncopy\", \"return;\");\n return typeof e.oncopy == \"function\";\n })();\n\n var badZoomedRects = null;\n function hasBadZoomedRects(measure) {\n if (badZoomedRects != null) return badZoomedRects;\n var node = removeChildrenAndAdd(measure, elt(\"span\", \"x\"));\n var normal = node.getBoundingClientRect();\n var fromRange = range(node, 0, 1).getBoundingClientRect();\n return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1;\n }\n\n // KEY NAMES\n\n var keyNames = CodeMirror.keyNames = {\n 3: \"Enter\", 8: \"Backspace\", 9: \"Tab\", 13: \"Enter\", 16: \"Shift\", 17: \"Ctrl\", 18: \"Alt\",\n 19: \"Pause\", 20: \"CapsLock\", 27: \"Esc\", 32: \"Space\", 33: \"PageUp\", 34: \"PageDown\", 35: \"End\",\n 36: \"Home\", 37: \"Left\", 38: \"Up\", 39: \"Right\", 40: \"Down\", 44: \"PrintScrn\", 45: \"Insert\",\n 46: \"Delete\", 59: \";\", 61: \"=\", 91: \"Mod\", 92: \"Mod\", 93: \"Mod\",\n 106: \"*\", 107: \"=\", 109: \"-\", 110: \".\", 111: \"/\", 127: \"Delete\",\n 173: \"-\", 186: \";\", 187: \"=\", 188: \",\", 189: \"-\", 190: \".\", 191: \"/\", 192: \"`\", 219: \"[\", 220: \"\\\\\",\n 221: \"]\", 222: \"'\", 63232: \"Up\", 63233: \"Down\", 63234: \"Left\", 63235: \"Right\", 63272: \"Delete\",\n 63273: \"Home\", 63275: \"End\", 63276: \"PageUp\", 63277: \"PageDown\", 63302: \"Insert\"\n };\n (function() {\n // Number keys\n for (var i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = String(i);\n // Alphabetic keys\n for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);\n // Function keys\n for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = \"F\" + i;\n })();\n\n // BIDI HELPERS\n\n function iterateBidiSections(order, from, to, f) {\n if (!order) return f(from, to, \"ltr\");\n var found = false;\n for (var i = 0; i < order.length; ++i) {\n var part = order[i];\n if (part.from < to && part.to > from || from == to && part.to == from) {\n f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? \"rtl\" : \"ltr\");\n found = true;\n }\n }\n if (!found) f(from, to, \"ltr\");\n }\n\n function bidiLeft(part) { return part.level % 2 ? part.to : part.from; }\n function bidiRight(part) { return part.level % 2 ? part.from : part.to; }\n\n function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; }\n function lineRight(line) {\n var order = getOrder(line);\n if (!order) return line.text.length;\n return bidiRight(lst(order));\n }\n\n function lineStart(cm, lineN) {\n var line = getLine(cm.doc, lineN);\n var visual = visualLine(line);\n if (visual != line) lineN = lineNo(visual);\n var order = getOrder(visual);\n var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual);\n return Pos(lineN, ch);\n }\n function lineEnd(cm, lineN) {\n var merged, line = getLine(cm.doc, lineN);\n while (merged = collapsedSpanAtEnd(line)) {\n line = merged.find(1, true).line;\n lineN = null;\n }\n var order = getOrder(line);\n var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line);\n return Pos(lineN == null ? lineNo(line) : lineN, ch);\n }\n function lineStartSmart(cm, pos) {\n var start = lineStart(cm, pos.line);\n var line = getLine(cm.doc, start.line);\n var order = getOrder(line);\n if (!order || order[0].level == 0) {\n var firstNonWS = Math.max(0, line.text.search(/\\S/));\n var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;\n return Pos(start.line, inWS ? 0 : firstNonWS);\n }\n return start;\n }\n\n function compareBidiLevel(order, a, b) {\n var linedir = order[0].level;\n if (a == linedir) return true;\n if (b == linedir) return false;\n return a < b;\n }\n var bidiOther;\n function getBidiPartAt(order, pos) {\n bidiOther = null;\n for (var i = 0, found; i < order.length; ++i) {\n var cur = order[i];\n if (cur.from < pos && cur.to > pos) return i;\n if ((cur.from == pos || cur.to == pos)) {\n if (found == null) {\n found = i;\n } else if (compareBidiLevel(order, cur.level, order[found].level)) {\n if (cur.from != cur.to) bidiOther = found;\n return i;\n } else {\n if (cur.from != cur.to) bidiOther = i;\n return found;\n }\n }\n }\n return found;\n }\n\n function moveInLine(line, pos, dir, byUnit) {\n if (!byUnit) return pos + dir;\n do pos += dir;\n while (pos > 0 && isExtendingChar(line.text.charAt(pos)));\n return pos;\n }\n\n // This is needed in order to move 'visually' through bi-directional\n // text -- i.e., pressing left should make the cursor go left, even\n // when in RTL text. The tricky part is the 'jumps', where RTL and\n // LTR text touch each other. This often requires the cursor offset\n // to move more than one unit, in order to visually move one unit.\n function moveVisually(line, start, dir, byUnit) {\n var bidi = getOrder(line);\n if (!bidi) return moveLogically(line, start, dir, byUnit);\n var pos = getBidiPartAt(bidi, start), part = bidi[pos];\n var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit);\n\n for (;;) {\n if (target > part.from && target < part.to) return target;\n if (target == part.from || target == part.to) {\n if (getBidiPartAt(bidi, target) == pos) return target;\n part = bidi[pos += dir];\n return (dir > 0) == part.level % 2 ? part.to : part.from;\n } else {\n part = bidi[pos += dir];\n if (!part) return null;\n if ((dir > 0) == part.level % 2)\n target = moveInLine(line, part.to, -1, byUnit);\n else\n target = moveInLine(line, part.from, 1, byUnit);\n }\n }\n }\n\n function moveLogically(line, start, dir, byUnit) {\n var target = start + dir;\n if (byUnit) while (target > 0 && isExtendingChar(line.text.charAt(target))) target += dir;\n return target < 0 || target > line.text.length ? null : target;\n }\n\n // Bidirectional ordering algorithm\n // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm\n // that this (partially) implements.\n\n // One-char codes used for character types:\n // L (L): Left-to-Right\n // R (R): Right-to-Left\n // r (AL): Right-to-Left Arabic\n // 1 (EN): European Number\n // + (ES): European Number Separator\n // % (ET): European Number Terminator\n // n (AN): Arabic Number\n // , (CS): Common Number Separator\n // m (NSM): Non-Spacing Mark\n // b (BN): Boundary Neutral\n // s (B): Paragraph Separator\n // t (S): Segment Separator\n // w (WS): Whitespace\n // N (ON): Other Neutrals\n\n // Returns null if characters are ordered as they appear\n // (left-to-right), or an array of sections ({from, to, level}\n // objects) in the order in which they occur visually.\n var bidiOrdering = (function() {\n // Character types for codepoints 0 to 0xff\n var lowTypes = \"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\";\n // Character types for codepoints 0x600 to 0x6ff\n var arabicTypes = \"rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm\";\n function charType(code) {\n if (code <= 0xf7) return lowTypes.charAt(code);\n else if (0x590 <= code && code <= 0x5f4) return \"R\";\n else if (0x600 <= code && code <= 0x6ed) return arabicTypes.charAt(code - 0x600);\n else if (0x6ee <= code && code <= 0x8ac) return \"r\";\n else if (0x2000 <= code && code <= 0x200b) return \"w\";\n else if (code == 0x200c) return \"b\";\n else return \"L\";\n }\n\n var bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;\n // Browsers seem to always treat the boundaries of block elements as being L.\n var outerType = \"L\";\n\n function BidiSpan(level, from, to) {\n this.level = level;\n this.from = from; this.to = to;\n }\n\n return function(str) {\n if (!bidiRE.test(str)) return false;\n var len = str.length, types = [];\n for (var i = 0, type; i < len; ++i)\n types.push(type = charType(str.charCodeAt(i)));\n\n // W1. Examine each non-spacing mark (NSM) in the level run, and\n // change the type of the NSM to the type of the previous\n // character. If the NSM is at the start of the level run, it will\n // get the type of sor.\n for (var i = 0, prev = outerType; i < len; ++i) {\n var type = types[i];\n if (type == \"m\") types[i] = prev;\n else prev = type;\n }\n\n // W2. Search backwards from each instance of a European number\n // until the first strong type (R, L, AL, or sor) is found. If an\n // AL is found, change the type of the European number to Arabic\n // number.\n // W3. Change all ALs to R.\n for (var i = 0, cur = outerType; i < len; ++i) {\n var type = types[i];\n if (type == \"1\" && cur == \"r\") types[i] = \"n\";\n else if (isStrong.test(type)) { cur = type; if (type == \"r\") types[i] = \"R\"; }\n }\n\n // W4. A single European separator between two European numbers\n // changes to a European number. A single common separator between\n // two numbers of the same type changes to that type.\n for (var i = 1, prev = types[0]; i < len - 1; ++i) {\n var type = types[i];\n if (type == \"+\" && prev == \"1\" && types[i+1] == \"1\") types[i] = \"1\";\n else if (type == \",\" && prev == types[i+1] &&\n (prev == \"1\" || prev == \"n\")) types[i] = prev;\n prev = type;\n }\n\n // W5. A sequence of European terminators adjacent to European\n // numbers changes to all European numbers.\n // W6. Otherwise, separators and terminators change to Other\n // Neutral.\n for (var i = 0; i < len; ++i) {\n var type = types[i];\n if (type == \",\") types[i] = \"N\";\n else if (type == \"%\") {\n for (var end = i + 1; end < len && types[end] == \"%\"; ++end) {}\n var replace = (i && types[i-1] == \"!\") || (end < len && types[end] == \"1\") ? \"1\" : \"N\";\n for (var j = i; j < end; ++j) types[j] = replace;\n i = end - 1;\n }\n }\n\n // W7. Search backwards from each instance of a European number\n // until the first strong type (R, L, or sor) is found. If an L is\n // found, then change the type of the European number to L.\n for (var i = 0, cur = outerType; i < len; ++i) {\n var type = types[i];\n if (cur == \"L\" && type == \"1\") types[i] = \"L\";\n else if (isStrong.test(type)) cur = type;\n }\n\n // N1. A sequence of neutrals takes the direction of the\n // surrounding strong text if the text on both sides has the same\n // direction. European and Arabic numbers act as if they were R in\n // terms of their influence on neutrals. Start-of-level-run (sor)\n // and end-of-level-run (eor) are used at level run boundaries.\n // N2. Any remaining neutrals take the embedding direction.\n for (var i = 0; i < len; ++i) {\n if (isNeutral.test(types[i])) {\n for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {}\n var before = (i ? types[i-1] : outerType) == \"L\";\n var after = (end < len ? types[end] : outerType) == \"L\";\n var replace = before || after ? \"L\" : \"R\";\n for (var j = i; j < end; ++j) types[j] = replace;\n i = end - 1;\n }\n }\n\n // Here we depart from the documented algorithm, in order to avoid\n // building up an actual levels array. Since there are only three\n // levels (0, 1, 2) in an implementation that doesn't take\n // explicit embedding into account, we can build up the order on\n // the fly, without following the level-based algorithm.\n var order = [], m;\n for (var i = 0; i < len;) {\n if (countsAsLeft.test(types[i])) {\n var start = i;\n for (++i; i < len && countsAsLeft.test(types[i]); ++i) {}\n order.push(new BidiSpan(0, start, i));\n } else {\n var pos = i, at = order.length;\n for (++i; i < len && types[i] != \"L\"; ++i) {}\n for (var j = pos; j < i;) {\n if (countsAsNum.test(types[j])) {\n if (pos < j) order.splice(at, 0, new BidiSpan(1, pos, j));\n var nstart = j;\n for (++j; j < i && countsAsNum.test(types[j]); ++j) {}\n order.splice(at, 0, new BidiSpan(2, nstart, j));\n pos = j;\n } else ++j;\n }\n if (pos < i) order.splice(at, 0, new BidiSpan(1, pos, i));\n }\n }\n if (order[0].level == 1 && (m = str.match(/^\\s+/))) {\n order[0].from = m[0].length;\n order.unshift(new BidiSpan(0, 0, m[0].length));\n }\n if (lst(order).level == 1 && (m = str.match(/\\s+$/))) {\n lst(order).to -= m[0].length;\n order.push(new BidiSpan(0, len - m[0].length, len));\n }\n if (order[0].level == 2)\n order.unshift(new BidiSpan(1, order[0].to, order[0].to));\n if (order[0].level != lst(order).level)\n order.push(new BidiSpan(order[0].level, len, len));\n\n return order;\n };\n })();\n\n // THE END\n\n CodeMirror.version = \"5.13.4\";\n\n return CodeMirror;\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../../lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n \"use strict\";\n\n CodeMirror.defineSimpleMode = function(name, states) {\n CodeMirror.defineMode(name, function(config) {\n return CodeMirror.simpleMode(config, states);\n });\n };\n\n CodeMirror.simpleMode = function(config, states) {\n ensureState(states, \"start\");\n var states_ = {}, meta = states.meta || {}, hasIndentation = false;\n for (var state in states) if (state != meta && states.hasOwnProperty(state)) {\n var list = states_[state] = [], orig = states[state];\n for (var i = 0; i < orig.length; i++) {\n var data = orig[i];\n list.push(new Rule(data, states));\n if (data.indent || data.dedent) hasIndentation = true;\n }\n }\n var mode = {\n startState: function() {\n return {state: \"start\", pending: null,\n local: null, localState: null,\n indent: hasIndentation ? [] : null};\n },\n copyState: function(state) {\n var s = {state: state.state, pending: state.pending,\n local: state.local, localState: null,\n indent: state.indent && state.indent.slice(0)};\n if (state.localState)\n s.localState = CodeMirror.copyState(state.local.mode, state.localState);\n if (state.stack)\n s.stack = state.stack.slice(0);\n for (var pers = state.persistentStates; pers; pers = pers.next)\n s.persistentStates = {mode: pers.mode,\n spec: pers.spec,\n state: pers.state == state.localState ? s.localState : CodeMirror.copyState(pers.mode, pers.state),\n next: s.persistentStates};\n return s;\n },\n token: tokenFunction(states_, config),\n innerMode: function(state) { return state.local && {mode: state.local.mode, state: state.localState}; },\n indent: indentFunction(states_, meta)\n };\n if (meta) for (var prop in meta) if (meta.hasOwnProperty(prop))\n mode[prop] = meta[prop];\n return mode;\n };\n\n function ensureState(states, name) {\n if (!states.hasOwnProperty(name))\n throw new Error(\"Undefined state \" + name + \" in simple mode\");\n }\n\n function toRegex(val, caret) {\n if (!val) return /(?:)/;\n var flags = \"\";\n if (val instanceof RegExp) {\n if (val.ignoreCase) flags = \"i\";\n val = val.source;\n } else {\n val = String(val);\n }\n return new RegExp((caret === false ? \"\" : \"^\") + \"(?:\" + val + \")\", flags);\n }\n\n function asToken(val) {\n if (!val) return null;\n if (typeof val == \"string\") return val.replace(/\\./g, \" \");\n var result = [];\n for (var i = 0; i < val.length; i++)\n result.push(val[i] && val[i].replace(/\\./g, \" \"));\n return result;\n }\n\n function Rule(data, states) {\n if (data.next || data.push) ensureState(states, data.next || data.push);\n this.regex = toRegex(data.regex);\n this.token = asToken(data.token);\n this.data = data;\n }\n\n function tokenFunction(states, config) {\n return function(stream, state) {\n if (state.pending) {\n var pend = state.pending.shift();\n if (state.pending.length == 0) state.pending = null;\n stream.pos += pend.text.length;\n return pend.token;\n }\n\n if (state.local) {\n if (state.local.end && stream.match(state.local.end)) {\n var tok = state.local.endToken || null;\n state.local = state.localState = null;\n return tok;\n } else {\n var tok = state.local.mode.token(stream, state.localState), m;\n if (state.local.endScan && (m = state.local.endScan.exec(stream.current())))\n stream.pos = stream.start + m.index;\n return tok;\n }\n }\n\n var curState = states[state.state];\n for (var i = 0; i < curState.length; i++) {\n var rule = curState[i];\n var matches = (!rule.data.sol || stream.sol()) && stream.match(rule.regex);\n if (matches) {\n if (rule.data.next) {\n state.state = rule.data.next;\n } else if (rule.data.push) {\n (state.stack || (state.stack = [])).push(state.state);\n state.state = rule.data.push;\n } else if (rule.data.pop && state.stack && state.stack.length) {\n state.state = state.stack.pop();\n }\n\n if (rule.data.mode)\n enterLocalMode(config, state, rule.data.mode, rule.token);\n if (rule.data.indent)\n state.indent.push(stream.indentation() + config.indentUnit);\n if (rule.data.dedent)\n state.indent.pop();\n if (matches.length > 2) {\n state.pending = [];\n for (var j = 2; j < matches.length; j++)\n if (matches[j])\n state.pending.push({text: matches[j], token: rule.token[j - 1]});\n stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0));\n return rule.token[0];\n } else if (rule.token && rule.token.join) {\n return rule.token[0];\n } else {\n return rule.token;\n }\n }\n }\n stream.next();\n return null;\n };\n }\n\n function cmp(a, b) {\n if (a === b) return true;\n if (!a || typeof a != \"object\" || !b || typeof b != \"object\") return false;\n var props = 0;\n for (var prop in a) if (a.hasOwnProperty(prop)) {\n if (!b.hasOwnProperty(prop) || !cmp(a[prop], b[prop])) return false;\n props++;\n }\n for (var prop in b) if (b.hasOwnProperty(prop)) props--;\n return props == 0;\n }\n\n function enterLocalMode(config, state, spec, token) {\n var pers;\n if (spec.persistent) for (var p = state.persistentStates; p && !pers; p = p.next)\n if (spec.spec ? cmp(spec.spec, p.spec) : spec.mode == p.mode) pers = p;\n var mode = pers ? pers.mode : spec.mode || CodeMirror.getMode(config, spec.spec);\n var lState = pers ? pers.state : CodeMirror.startState(mode);\n if (spec.persistent && !pers)\n state.persistentStates = {mode: mode, spec: spec.spec, state: lState, next: state.persistentStates};\n\n state.localState = lState;\n state.local = {mode: mode,\n end: spec.end && toRegex(spec.end),\n endScan: spec.end && spec.forceEnd !== false && toRegex(spec.end, false),\n endToken: token && token.join ? token[token.length - 1] : token};\n }\n\n function indexOf(val, arr) {\n for (var i = 0; i < arr.length; i++) if (arr[i] === val) return true;\n }\n\n function indentFunction(states, meta) {\n return function(state, textAfter, line) {\n if (state.local && state.local.mode.indent)\n return state.local.mode.indent(state.localState, textAfter, line);\n if (state.indent == null || state.local || meta.dontIndentStates && indexOf(state.state, meta.dontIndentStates) > -1)\n return CodeMirror.Pass;\n\n var pos = state.indent.length - 1, rules = states[state.state];\n scan: for (;;) {\n for (var i = 0; i < rules.length; i++) {\n var rule = rules[i];\n if (rule.data.dedent && rule.data.dedentIfLineStart !== false) {\n var m = rule.regex.exec(textAfter);\n if (m && m[0]) {\n pos--;\n if (rule.next || rule.push) rules = states[rule.next || rule.push];\n textAfter = textAfter.slice(m[0].length);\n continue scan;\n }\n }\n }\n break;\n }\n return pos < 0 ? 0 : state.indent[pos];\n };\n }\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../../lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.multiplexingMode = function(outer /*, others */) {\n // Others should be {open, close, mode [, delimStyle] [, innerStyle]} objects\n var others = Array.prototype.slice.call(arguments, 1);\n\n function indexOf(string, pattern, from, returnEnd) {\n if (typeof pattern == \"string\") {\n var found = string.indexOf(pattern, from);\n return returnEnd && found > -1 ? found + pattern.length : found;\n }\n var m = pattern.exec(from ? string.slice(from) : string);\n return m ? m.index + from + (returnEnd ? m[0].length : 0) : -1;\n }\n\n return {\n startState: function() {\n return {\n outer: CodeMirror.startState(outer),\n innerActive: null,\n inner: null\n };\n },\n\n copyState: function(state) {\n return {\n outer: CodeMirror.copyState(outer, state.outer),\n innerActive: state.innerActive,\n inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner)\n };\n },\n\n token: function(stream, state) {\n if (!state.innerActive) {\n var cutOff = Infinity, oldContent = stream.string;\n for (var i = 0; i < others.length; ++i) {\n var other = others[i];\n var found = indexOf(oldContent, other.open, stream.pos);\n if (found == stream.pos) {\n if (!other.parseDelimiters) stream.match(other.open);\n state.innerActive = other;\n state.inner = CodeMirror.startState(other.mode, outer.indent ? outer.indent(state.outer, \"\") : 0);\n return other.delimStyle && (other.delimStyle + \" \" + other.delimStyle + \"-open\");\n } else if (found != -1 && found < cutOff) {\n cutOff = found;\n }\n }\n if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff);\n var outerToken = outer.token(stream, state.outer);\n if (cutOff != Infinity) stream.string = oldContent;\n return outerToken;\n } else {\n var curInner = state.innerActive, oldContent = stream.string;\n if (!curInner.close && stream.sol()) {\n state.innerActive = state.inner = null;\n return this.token(stream, state);\n }\n var found = curInner.close ? indexOf(oldContent, curInner.close, stream.pos, curInner.parseDelimiters) : -1;\n if (found == stream.pos && !curInner.parseDelimiters) {\n stream.match(curInner.close);\n state.innerActive = state.inner = null;\n return curInner.delimStyle && (curInner.delimStyle + \" \" + curInner.delimStyle + \"-close\");\n }\n if (found > -1) stream.string = oldContent.slice(0, found);\n var innerToken = curInner.mode.token(stream, state.inner);\n if (found > -1) stream.string = oldContent;\n\n if (found == stream.pos && curInner.parseDelimiters)\n state.innerActive = state.inner = null;\n\n if (curInner.innerStyle) {\n if (innerToken) innerToken = innerToken + \" \" + curInner.innerStyle;\n else innerToken = curInner.innerStyle;\n }\n\n return innerToken;\n }\n },\n\n indent: function(state, textAfter) {\n var mode = state.innerActive ? state.innerActive.mode : outer;\n if (!mode.indent) return CodeMirror.Pass;\n return mode.indent(state.innerActive ? state.inner : state.outer, textAfter);\n },\n\n blankLine: function(state) {\n var mode = state.innerActive ? state.innerActive.mode : outer;\n if (mode.blankLine) {\n mode.blankLine(state.innerActive ? state.inner : state.outer);\n }\n if (!state.innerActive) {\n for (var i = 0; i < others.length; ++i) {\n var other = others[i];\n if (other.open === \"\\n\") {\n state.innerActive = other;\n state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, \"\") : 0);\n }\n }\n } else if (state.innerActive.close === \"\\n\") {\n state.innerActive = state.inner = null;\n }\n },\n\n electricChars: outer.electricChars,\n\n innerMode: function(state) {\n return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer};\n }\n };\n};\n\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"bower_components/codemirror/lib/codemirror\"), \n require(\"bower_components/codemirror/addon/mode/simple\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"bower_components/codemirror/lib/codemirror\", \n \"bower_components/codemirror/addon/mode/simple\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n \"use strict\";\n\n CodeMirror.defineMode(\"htmlhandlebars\", function(config) {\n return CodeMirror.multiplexingMode(\n CodeMirror.getMode(config, \"text/html\"),\n {open: \"{{\", close: \"}}\",\n mode: CodeMirror.getMode(config, \"handlebars\"),\n parseDelimiters: true});\n });\n\n CodeMirror.defineMIME(\"text/x-handlebars-template\", \"htmlhandlebars\");\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n// TODO actually recognize syntax of TypeScript constructs\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../../lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction expressionAllowed(stream, state, backUp) {\n return /^(?:operator|sof|keyword c|case|new|[\\[{}\\(,;:]|=>)$/.test(state.lastType) ||\n (state.lastType == \"quasi\" && /\\{\\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))))\n}\n\nCodeMirror.defineMode(\"javascript\", function(config, parserConfig) {\n var indentUnit = config.indentUnit;\n var statementIndent = parserConfig.statementIndent;\n var jsonldMode = parserConfig.jsonld;\n var jsonMode = parserConfig.json || jsonldMode;\n var isTS = parserConfig.typescript;\n var wordRE = parserConfig.wordCharacters || /[\\w$\\xa1-\\uffff]/;\n\n // Tokenizer\n\n var keywords = function(){\n function kw(type) {return {type: type, style: \"keyword\"};}\n var A = kw(\"keyword a\"), B = kw(\"keyword b\"), C = kw(\"keyword c\");\n var operator = kw(\"operator\"), atom = {type: \"atom\", style: \"atom\"};\n\n var jsKeywords = {\n \"if\": kw(\"if\"), \"while\": A, \"with\": A, \"else\": B, \"do\": B, \"try\": B, \"finally\": B,\n \"return\": C, \"break\": C, \"continue\": C, \"new\": kw(\"new\"), \"delete\": C, \"throw\": C, \"debugger\": C,\n \"var\": kw(\"var\"), \"const\": kw(\"var\"), \"let\": kw(\"var\"),\n \"function\": kw(\"function\"), \"catch\": kw(\"catch\"),\n \"for\": kw(\"for\"), \"switch\": kw(\"switch\"), \"case\": kw(\"case\"), \"default\": kw(\"default\"),\n \"in\": operator, \"typeof\": operator, \"instanceof\": operator,\n \"true\": atom, \"false\": atom, \"null\": atom, \"undefined\": atom, \"NaN\": atom, \"Infinity\": atom,\n \"this\": kw(\"this\"), \"class\": kw(\"class\"), \"super\": kw(\"atom\"),\n \"yield\": C, \"export\": kw(\"export\"), \"import\": kw(\"import\"), \"extends\": C\n };\n\n // Extend the 'normal' keywords with the TypeScript language extensions\n if (isTS) {\n var type = {type: \"variable\", style: \"variable-3\"};\n var tsKeywords = {\n // object-like things\n \"interface\": kw(\"class\"),\n \"implements\": C,\n \"namespace\": C,\n \"module\": kw(\"module\"),\n \"enum\": kw(\"module\"),\n\n // scope modifiers\n \"public\": kw(\"modifier\"),\n \"private\": kw(\"modifier\"),\n \"protected\": kw(\"modifier\"),\n \"abstract\": kw(\"modifier\"),\n\n // operators\n \"as\": operator,\n\n // types\n \"string\": type, \"number\": type, \"boolean\": type, \"any\": type\n };\n\n for (var attr in tsKeywords) {\n jsKeywords[attr] = tsKeywords[attr];\n }\n }\n\n return jsKeywords;\n }();\n\n var isOperatorChar = /[+\\-*&%=<>!?|~^]/;\n var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)\"/;\n\n function readRegexp(stream) {\n var escaped = false, next, inSet = false;\n while ((next = stream.next()) != null) {\n if (!escaped) {\n if (next == \"/\" && !inSet) return;\n if (next == \"[\") inSet = true;\n else if (inSet && next == \"]\") inSet = false;\n }\n escaped = !escaped && next == \"\\\\\";\n }\n }\n\n // Used as scratch variables to communicate multiple values without\n // consing up tons of objects.\n var type, content;\n function ret(tp, style, cont) {\n type = tp; content = cont;\n return style;\n }\n function tokenBase(stream, state) {\n var ch = stream.next();\n if (ch == '\"' || ch == \"'\") {\n state.tokenize = tokenString(ch);\n return state.tokenize(stream, state);\n } else if (ch == \".\" && stream.match(/^\\d+(?:[eE][+\\-]?\\d+)?/)) {\n return ret(\"number\", \"number\");\n } else if (ch == \".\" && stream.match(\"..\")) {\n return ret(\"spread\", \"meta\");\n } else if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n return ret(ch);\n } else if (ch == \"=\" && stream.eat(\">\")) {\n return ret(\"=>\", \"operator\");\n } else if (ch == \"0\" && stream.eat(/x/i)) {\n stream.eatWhile(/[\\da-f]/i);\n return ret(\"number\", \"number\");\n } else if (ch == \"0\" && stream.eat(/o/i)) {\n stream.eatWhile(/[0-7]/i);\n return ret(\"number\", \"number\");\n } else if (ch == \"0\" && stream.eat(/b/i)) {\n stream.eatWhile(/[01]/i);\n return ret(\"number\", \"number\");\n } else if (/\\d/.test(ch)) {\n stream.match(/^\\d*(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/);\n return ret(\"number\", \"number\");\n } else if (ch == \"/\") {\n if (stream.eat(\"*\")) {\n state.tokenize = tokenComment;\n return tokenComment(stream, state);\n } else if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return ret(\"comment\", \"comment\");\n } else if (expressionAllowed(stream, state, 1)) {\n readRegexp(stream);\n stream.match(/^\\b(([gimyu])(?![gimyu]*\\2))+\\b/);\n return ret(\"regexp\", \"string-2\");\n } else {\n stream.eatWhile(isOperatorChar);\n return ret(\"operator\", \"operator\", stream.current());\n }\n } else if (ch == \"`\") {\n state.tokenize = tokenQuasi;\n return tokenQuasi(stream, state);\n } else if (ch == \"#\") {\n stream.skipToEnd();\n return ret(\"error\", \"error\");\n } else if (isOperatorChar.test(ch)) {\n stream.eatWhile(isOperatorChar);\n return ret(\"operator\", \"operator\", stream.current());\n } else if (wordRE.test(ch)) {\n stream.eatWhile(wordRE);\n var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];\n return (known && state.lastType != \".\") ? ret(known.type, known.style, word) :\n ret(\"variable\", \"variable\", word);\n }\n }\n\n function tokenString(quote) {\n return function(stream, state) {\n var escaped = false, next;\n if (jsonldMode && stream.peek() == \"@\" && stream.match(isJsonldKeyword)){\n state.tokenize = tokenBase;\n return ret(\"jsonld-keyword\", \"meta\");\n }\n while ((next = stream.next()) != null) {\n if (next == quote && !escaped) break;\n escaped = !escaped && next == \"\\\\\";\n }\n if (!escaped) state.tokenize = tokenBase;\n return ret(\"string\", \"string\");\n };\n }\n\n function tokenComment(stream, state) {\n var maybeEnd = false, ch;\n while (ch = stream.next()) {\n if (ch == \"/\" && maybeEnd) {\n state.tokenize = tokenBase;\n break;\n }\n maybeEnd = (ch == \"*\");\n }\n return ret(\"comment\", \"comment\");\n }\n\n function tokenQuasi(stream, state) {\n var escaped = false, next;\n while ((next = stream.next()) != null) {\n if (!escaped && (next == \"`\" || next == \"$\" && stream.eat(\"{\"))) {\n state.tokenize = tokenBase;\n break;\n }\n escaped = !escaped && next == \"\\\\\";\n }\n return ret(\"quasi\", \"string-2\", stream.current());\n }\n\n var brackets = \"([{}])\";\n // This is a crude lookahead trick to try and notice that we're\n // parsing the argument patterns for a fat-arrow function before we\n // actually hit the arrow token. It only works if the arrow is on\n // the same line as the arguments and there's no strange noise\n // (comments) in between. Fallback is to only notice when we hit the\n // arrow, and not declare the arguments as locals for the arrow\n // body.\n function findFatArrow(stream, state) {\n if (state.fatArrowAt) state.fatArrowAt = null;\n var arrow = stream.string.indexOf(\"=>\", stream.start);\n if (arrow < 0) return;\n\n var depth = 0, sawSomething = false;\n for (var pos = arrow - 1; pos >= 0; --pos) {\n var ch = stream.string.charAt(pos);\n var bracket = brackets.indexOf(ch);\n if (bracket >= 0 && bracket < 3) {\n if (!depth) { ++pos; break; }\n if (--depth == 0) break;\n } else if (bracket >= 3 && bracket < 6) {\n ++depth;\n } else if (wordRE.test(ch)) {\n sawSomething = true;\n } else if (/[\"'\\/]/.test(ch)) {\n return;\n } else if (sawSomething && !depth) {\n ++pos;\n break;\n }\n }\n if (sawSomething && !depth) state.fatArrowAt = pos;\n }\n\n // Parser\n\n var atomicTypes = {\"atom\": true, \"number\": true, \"variable\": true, \"string\": true, \"regexp\": true, \"this\": true, \"jsonld-keyword\": true};\n\n function JSLexical(indented, column, type, align, prev, info) {\n this.indented = indented;\n this.column = column;\n this.type = type;\n this.prev = prev;\n this.info = info;\n if (align != null) this.align = align;\n }\n\n function inScope(state, varname) {\n for (var v = state.localVars; v; v = v.next)\n if (v.name == varname) return true;\n for (var cx = state.context; cx; cx = cx.prev) {\n for (var v = cx.vars; v; v = v.next)\n if (v.name == varname) return true;\n }\n }\n\n function parseJS(state, style, type, content, stream) {\n var cc = state.cc;\n // Communicate our context to the combinators.\n // (Less wasteful than consing up a hundred closures on every call.)\n cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style;\n\n if (!state.lexical.hasOwnProperty(\"align\"))\n state.lexical.align = true;\n\n while(true) {\n var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;\n if (combinator(type, content)) {\n while(cc.length && cc[cc.length - 1].lex)\n cc.pop()();\n if (cx.marked) return cx.marked;\n if (type == \"variable\" && inScope(state, content)) return \"variable-2\";\n return style;\n }\n }\n }\n\n // Combinator utils\n\n var cx = {state: null, column: null, marked: null, cc: null};\n function pass() {\n for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);\n }\n function cont() {\n pass.apply(null, arguments);\n return true;\n }\n function register(varname) {\n function inList(list) {\n for (var v = list; v; v = v.next)\n if (v.name == varname) return true;\n return false;\n }\n var state = cx.state;\n cx.marked = \"def\";\n if (state.context) {\n if (inList(state.localVars)) return;\n state.localVars = {name: varname, next: state.localVars};\n } else {\n if (inList(state.globalVars)) return;\n if (parserConfig.globalVars)\n state.globalVars = {name: varname, next: state.globalVars};\n }\n }\n\n // Combinators\n\n var defaultVars = {name: \"this\", next: {name: \"arguments\"}};\n function pushcontext() {\n cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};\n cx.state.localVars = defaultVars;\n }\n function popcontext() {\n cx.state.localVars = cx.state.context.vars;\n cx.state.context = cx.state.context.prev;\n }\n function pushlex(type, info) {\n var result = function() {\n var state = cx.state, indent = state.indented;\n if (state.lexical.type == \"stat\") indent = state.lexical.indented;\n else for (var outer = state.lexical; outer && outer.type == \")\" && outer.align; outer = outer.prev)\n indent = outer.indented;\n state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);\n };\n result.lex = true;\n return result;\n }\n function poplex() {\n var state = cx.state;\n if (state.lexical.prev) {\n if (state.lexical.type == \")\")\n state.indented = state.lexical.indented;\n state.lexical = state.lexical.prev;\n }\n }\n poplex.lex = true;\n\n function expect(wanted) {\n function exp(type) {\n if (type == wanted) return cont();\n else if (wanted == \";\") return pass();\n else return cont(exp);\n };\n return exp;\n }\n\n function statement(type, value) {\n if (type == \"var\") return cont(pushlex(\"vardef\", value.length), vardef, expect(\";\"), poplex);\n if (type == \"keyword a\") return cont(pushlex(\"form\"), expression, statement, poplex);\n if (type == \"keyword b\") return cont(pushlex(\"form\"), statement, poplex);\n if (type == \"{\") return cont(pushlex(\"}\"), block, poplex);\n if (type == \";\") return cont();\n if (type == \"if\") {\n if (cx.state.lexical.info == \"else\" && cx.state.cc[cx.state.cc.length - 1] == poplex)\n cx.state.cc.pop()();\n return cont(pushlex(\"form\"), expression, statement, poplex, maybeelse);\n }\n if (type == \"function\") return cont(functiondef);\n if (type == \"for\") return cont(pushlex(\"form\"), forspec, statement, poplex);\n if (type == \"variable\") return cont(pushlex(\"stat\"), maybelabel);\n if (type == \"switch\") return cont(pushlex(\"form\"), expression, pushlex(\"}\", \"switch\"), expect(\"{\"),\n block, poplex, poplex);\n if (type == \"case\") return cont(expression, expect(\":\"));\n if (type == \"default\") return cont(expect(\":\"));\n if (type == \"catch\") return cont(pushlex(\"form\"), pushcontext, expect(\"(\"), funarg, expect(\")\"),\n statement, poplex, popcontext);\n if (type == \"class\") return cont(pushlex(\"form\"), className, poplex);\n if (type == \"export\") return cont(pushlex(\"stat\"), afterExport, poplex);\n if (type == \"import\") return cont(pushlex(\"stat\"), afterImport, poplex);\n if (type == \"module\") return cont(pushlex(\"form\"), pattern, pushlex(\"}\"), expect(\"{\"), block, poplex, poplex)\n return pass(pushlex(\"stat\"), expression, expect(\";\"), poplex);\n }\n function expression(type) {\n return expressionInner(type, false);\n }\n function expressionNoComma(type) {\n return expressionInner(type, true);\n }\n function expressionInner(type, noComma) {\n if (cx.state.fatArrowAt == cx.stream.start) {\n var body = noComma ? arrowBodyNoComma : arrowBody;\n if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(pattern, \")\"), poplex, expect(\"=>\"), body, popcontext);\n else if (type == \"variable\") return pass(pushcontext, pattern, expect(\"=>\"), body, popcontext);\n }\n\n var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;\n if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);\n if (type == \"function\") return cont(functiondef, maybeop);\n if (type == \"keyword c\") return cont(noComma ? maybeexpressionNoComma : maybeexpression);\n if (type == \"(\") return cont(pushlex(\")\"), maybeexpression, comprehension, expect(\")\"), poplex, maybeop);\n if (type == \"operator\" || type == \"spread\") return cont(noComma ? expressionNoComma : expression);\n if (type == \"[\") return cont(pushlex(\"]\"), arrayLiteral, poplex, maybeop);\n if (type == \"{\") return contCommasep(objprop, \"}\", null, maybeop);\n if (type == \"quasi\") return pass(quasi, maybeop);\n if (type == \"new\") return cont(maybeTarget(noComma));\n return cont();\n }\n function maybeexpression(type) {\n if (type.match(/[;\\}\\)\\],]/)) return pass();\n return pass(expression);\n }\n function maybeexpressionNoComma(type) {\n if (type.match(/[;\\}\\)\\],]/)) return pass();\n return pass(expressionNoComma);\n }\n\n function maybeoperatorComma(type, value) {\n if (type == \",\") return cont(expression);\n return maybeoperatorNoComma(type, value, false);\n }\n function maybeoperatorNoComma(type, value, noComma) {\n var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;\n var expr = noComma == false ? expression : expressionNoComma;\n if (type == \"=>\") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);\n if (type == \"operator\") {\n if (/\\+\\+|--/.test(value)) return cont(me);\n if (value == \"?\") return cont(expression, expect(\":\"), expr);\n return cont(expr);\n }\n if (type == \"quasi\") { return pass(quasi, me); }\n if (type == \";\") return;\n if (type == \"(\") return contCommasep(expressionNoComma, \")\", \"call\", me);\n if (type == \".\") return cont(property, me);\n if (type == \"[\") return cont(pushlex(\"]\"), maybeexpression, expect(\"]\"), poplex, me);\n }\n function quasi(type, value) {\n if (type != \"quasi\") return pass();\n if (value.slice(value.length - 2) != \"${\") return cont(quasi);\n return cont(expression, continueQuasi);\n }\n function continueQuasi(type) {\n if (type == \"}\") {\n cx.marked = \"string-2\";\n cx.state.tokenize = tokenQuasi;\n return cont(quasi);\n }\n }\n function arrowBody(type) {\n findFatArrow(cx.stream, cx.state);\n return pass(type == \"{\" ? statement : expression);\n }\n function arrowBodyNoComma(type) {\n findFatArrow(cx.stream, cx.state);\n return pass(type == \"{\" ? statement : expressionNoComma);\n }\n function maybeTarget(noComma) {\n return function(type) {\n if (type == \".\") return cont(noComma ? targetNoComma : target);\n else return pass(noComma ? expressionNoComma : expression);\n };\n }\n function target(_, value) {\n if (value == \"target\") { cx.marked = \"keyword\"; return cont(maybeoperatorComma); }\n }\n function targetNoComma(_, value) {\n if (value == \"target\") { cx.marked = \"keyword\"; return cont(maybeoperatorNoComma); }\n }\n function maybelabel(type) {\n if (type == \":\") return cont(poplex, statement);\n return pass(maybeoperatorComma, expect(\";\"), poplex);\n }\n function property(type) {\n if (type == \"variable\") {cx.marked = \"property\"; return cont();}\n }\n function objprop(type, value) {\n if (type == \"variable\" || cx.style == \"keyword\") {\n cx.marked = \"property\";\n if (value == \"get\" || value == \"set\") return cont(getterSetter);\n return cont(afterprop);\n } else if (type == \"number\" || type == \"string\") {\n cx.marked = jsonldMode ? \"property\" : (cx.style + \" property\");\n return cont(afterprop);\n } else if (type == \"jsonld-keyword\") {\n return cont(afterprop);\n } else if (type == \"modifier\") {\n return cont(objprop)\n } else if (type == \"[\") {\n return cont(expression, expect(\"]\"), afterprop);\n } else if (type == \"spread\") {\n return cont(expression);\n }\n }\n function getterSetter(type) {\n if (type != \"variable\") return pass(afterprop);\n cx.marked = \"property\";\n return cont(functiondef);\n }\n function afterprop(type) {\n if (type == \":\") return cont(expressionNoComma);\n if (type == \"(\") return pass(functiondef);\n }\n function commasep(what, end) {\n function proceed(type) {\n if (type == \",\") {\n var lex = cx.state.lexical;\n if (lex.info == \"call\") lex.pos = (lex.pos || 0) + 1;\n return cont(what, proceed);\n }\n if (type == end) return cont();\n return cont(expect(end));\n }\n return function(type) {\n if (type == end) return cont();\n return pass(what, proceed);\n };\n }\n function contCommasep(what, end, info) {\n for (var i = 3; i < arguments.length; i++)\n cx.cc.push(arguments[i]);\n return cont(pushlex(end, info), commasep(what, end), poplex);\n }\n function block(type) {\n if (type == \"}\") return cont();\n return pass(statement, block);\n }\n function maybetype(type) {\n if (isTS && type == \":\") return cont(typedef);\n }\n function maybedefault(_, value) {\n if (value == \"=\") return cont(expressionNoComma);\n }\n function typedef(type) {\n if (type == \"variable\") {cx.marked = \"variable-3\"; return cont();}\n }\n function vardef() {\n return pass(pattern, maybetype, maybeAssign, vardefCont);\n }\n function pattern(type, value) {\n if (type == \"modifier\") return cont(pattern)\n if (type == \"variable\") { register(value); return cont(); }\n if (type == \"spread\") return cont(pattern);\n if (type == \"[\") return contCommasep(pattern, \"]\");\n if (type == \"{\") return contCommasep(proppattern, \"}\");\n }\n function proppattern(type, value) {\n if (type == \"variable\" && !cx.stream.match(/^\\s*:/, false)) {\n register(value);\n return cont(maybeAssign);\n }\n if (type == \"variable\") cx.marked = \"property\";\n if (type == \"spread\") return cont(pattern);\n if (type == \"}\") return pass();\n return cont(expect(\":\"), pattern, maybeAssign);\n }\n function maybeAssign(_type, value) {\n if (value == \"=\") return cont(expressionNoComma);\n }\n function vardefCont(type) {\n if (type == \",\") return cont(vardef);\n }\n function maybeelse(type, value) {\n if (type == \"keyword b\" && value == \"else\") return cont(pushlex(\"form\", \"else\"), statement, poplex);\n }\n function forspec(type) {\n if (type == \"(\") return cont(pushlex(\")\"), forspec1, expect(\")\"), poplex);\n }\n function forspec1(type) {\n if (type == \"var\") return cont(vardef, expect(\";\"), forspec2);\n if (type == \";\") return cont(forspec2);\n if (type == \"variable\") return cont(formaybeinof);\n return pass(expression, expect(\";\"), forspec2);\n }\n function formaybeinof(_type, value) {\n if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression); }\n return cont(maybeoperatorComma, forspec2);\n }\n function forspec2(type, value) {\n if (type == \";\") return cont(forspec3);\n if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression); }\n return pass(expression, expect(\";\"), forspec3);\n }\n function forspec3(type) {\n if (type != \")\") cont(expression);\n }\n function functiondef(type, value) {\n if (value == \"*\") {cx.marked = \"keyword\"; return cont(functiondef);}\n if (type == \"variable\") {register(value); return cont(functiondef);}\n if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, statement, popcontext);\n }\n function funarg(type) {\n if (type == \"spread\") return cont(funarg);\n return pass(pattern, maybetype, maybedefault);\n }\n function className(type, value) {\n if (type == \"variable\") {register(value); return cont(classNameAfter);}\n }\n function classNameAfter(type, value) {\n if (value == \"extends\") return cont(expression, classNameAfter);\n if (type == \"{\") return cont(pushlex(\"}\"), classBody, poplex);\n }\n function classBody(type, value) {\n if (type == \"variable\" || cx.style == \"keyword\") {\n if (value == \"static\") {\n cx.marked = \"keyword\";\n return cont(classBody);\n }\n cx.marked = \"property\";\n if (value == \"get\" || value == \"set\") return cont(classGetterSetter, functiondef, classBody);\n return cont(functiondef, classBody);\n }\n if (value == \"*\") {\n cx.marked = \"keyword\";\n return cont(classBody);\n }\n if (type == \";\") return cont(classBody);\n if (type == \"}\") return cont();\n }\n function classGetterSetter(type) {\n if (type != \"variable\") return pass();\n cx.marked = \"property\";\n return cont();\n }\n function afterExport(_type, value) {\n if (value == \"*\") { cx.marked = \"keyword\"; return cont(maybeFrom, expect(\";\")); }\n if (value == \"default\") { cx.marked = \"keyword\"; return cont(expression, expect(\";\")); }\n return pass(statement);\n }\n function afterImport(type) {\n if (type == \"string\") return cont();\n return pass(importSpec, maybeFrom);\n }\n function importSpec(type, value) {\n if (type == \"{\") return contCommasep(importSpec, \"}\");\n if (type == \"variable\") register(value);\n if (value == \"*\") cx.marked = \"keyword\";\n return cont(maybeAs);\n }\n function maybeAs(_type, value) {\n if (value == \"as\") { cx.marked = \"keyword\"; return cont(importSpec); }\n }\n function maybeFrom(_type, value) {\n if (value == \"from\") { cx.marked = \"keyword\"; return cont(expression); }\n }\n function arrayLiteral(type) {\n if (type == \"]\") return cont();\n return pass(expressionNoComma, maybeArrayComprehension);\n }\n function maybeArrayComprehension(type) {\n if (type == \"for\") return pass(comprehension, expect(\"]\"));\n if (type == \",\") return cont(commasep(maybeexpressionNoComma, \"]\"));\n return pass(commasep(expressionNoComma, \"]\"));\n }\n function comprehension(type) {\n if (type == \"for\") return cont(forspec, comprehension);\n if (type == \"if\") return cont(expression, comprehension);\n }\n\n function isContinuedStatement(state, textAfter) {\n return state.lastType == \"operator\" || state.lastType == \",\" ||\n isOperatorChar.test(textAfter.charAt(0)) ||\n /[,.]/.test(textAfter.charAt(0));\n }\n\n // Interface\n\n return {\n startState: function(basecolumn) {\n var state = {\n tokenize: tokenBase,\n lastType: \"sof\",\n cc: [],\n lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, \"block\", false),\n localVars: parserConfig.localVars,\n context: parserConfig.localVars && {vars: parserConfig.localVars},\n indented: basecolumn || 0\n };\n if (parserConfig.globalVars && typeof parserConfig.globalVars == \"object\")\n state.globalVars = parserConfig.globalVars;\n return state;\n },\n\n token: function(stream, state) {\n if (stream.sol()) {\n if (!state.lexical.hasOwnProperty(\"align\"))\n state.lexical.align = false;\n state.indented = stream.indentation();\n findFatArrow(stream, state);\n }\n if (state.tokenize != tokenComment && stream.eatSpace()) return null;\n var style = state.tokenize(stream, state);\n if (type == \"comment\") return style;\n state.lastType = type == \"operator\" && (content == \"++\" || content == \"--\") ? \"incdec\" : type;\n return parseJS(state, style, type, content, stream);\n },\n\n indent: function(state, textAfter) {\n if (state.tokenize == tokenComment) return CodeMirror.Pass;\n if (state.tokenize != tokenBase) return 0;\n var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;\n // Kludge to prevent 'maybelse' from blocking lexical scope pops\n if (!/^\\s*else\\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {\n var c = state.cc[i];\n if (c == poplex) lexical = lexical.prev;\n else if (c != maybeelse) break;\n }\n if (lexical.type == \"stat\" && firstChar == \"}\") lexical = lexical.prev;\n if (statementIndent && lexical.type == \")\" && lexical.prev.type == \"stat\")\n lexical = lexical.prev;\n var type = lexical.type, closing = firstChar == type;\n\n if (type == \"vardef\") return lexical.indented + (state.lastType == \"operator\" || state.lastType == \",\" ? lexical.info + 1 : 0);\n else if (type == \"form\" && firstChar == \"{\") return lexical.indented;\n else if (type == \"form\") return lexical.indented + indentUnit;\n else if (type == \"stat\")\n return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);\n else if (lexical.info == \"switch\" && !closing && parserConfig.doubleIndentSwitch != false)\n return lexical.indented + (/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 2 * indentUnit);\n else if (lexical.align) return lexical.column + (closing ? 0 : 1);\n else return lexical.indented + (closing ? 0 : indentUnit);\n },\n\n electricInput: /^\\s*(?:case .*?:|default:|\\{|\\})$/,\n blockCommentStart: jsonMode ? null : \"/*\",\n blockCommentEnd: jsonMode ? null : \"*/\",\n lineComment: jsonMode ? null : \"//\",\n fold: \"brace\",\n closeBrackets: \"()[]{}''\\\"\\\"``\",\n\n helperType: jsonMode ? \"json\" : \"javascript\",\n jsonldMode: jsonldMode,\n jsonMode: jsonMode,\n\n expressionAllowed: expressionAllowed,\n skipExpression: function(state) {\n var top = state.cc[state.cc.length - 1]\n if (top == expression || top == expressionNoComma) state.cc.pop()\n }\n };\n});\n\nCodeMirror.registerHelper(\"wordChars\", \"javascript\", /[\\w$]/);\n\nCodeMirror.defineMIME(\"text/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"text/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/x-javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/json\", {name: \"javascript\", json: true});\nCodeMirror.defineMIME(\"application/x-json\", {name: \"javascript\", json: true});\nCodeMirror.defineMIME(\"application/ld+json\", {name: \"javascript\", jsonld: true});\nCodeMirror.defineMIME(\"text/typescript\", { name: \"javascript\", typescript: true });\nCodeMirror.defineMIME(\"application/typescript\", { name: \"javascript\", typescript: true });\n\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../../lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"sql\", function(config, parserConfig) {\n \"use strict\";\n\n var client = parserConfig.client || {},\n atoms = parserConfig.atoms || {\"false\": true, \"true\": true, \"null\": true},\n builtin = parserConfig.builtin || {},\n keywords = parserConfig.keywords || {},\n operatorChars = parserConfig.operatorChars || /^[*+\\-%<>!=&|~^]/,\n support = parserConfig.support || {},\n hooks = parserConfig.hooks || {},\n dateSQL = parserConfig.dateSQL || {\"date\" : true, \"time\" : true, \"timestamp\" : true};\n\n function tokenBase(stream, state) {\n var ch = stream.next();\n\n // call hooks from the mime type\n if (hooks[ch]) {\n var result = hooks[ch](stream, state);\n if (result !== false) return result;\n }\n\n if (support.hexNumber == true &&\n ((ch == \"0\" && stream.match(/^[xX][0-9a-fA-F]+/))\n || (ch == \"x\" || ch == \"X\") && stream.match(/^'[0-9a-fA-F]+'/))) {\n // hex\n // ref: http://dev.mysql.com/doc/refman/5.5/en/hexadecimal-literals.html\n return \"number\";\n } else if (support.binaryNumber == true &&\n (((ch == \"b\" || ch == \"B\") && stream.match(/^'[01]+'/))\n || (ch == \"0\" && stream.match(/^b[01]+/)))) {\n // bitstring\n // ref: http://dev.mysql.com/doc/refman/5.5/en/bit-field-literals.html\n return \"number\";\n } else if (ch.charCodeAt(0) > 47 && ch.charCodeAt(0) < 58) {\n // numbers\n // ref: http://dev.mysql.com/doc/refman/5.5/en/number-literals.html\n stream.match(/^[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?/);\n support.decimallessFloat == true && stream.eat('.');\n return \"number\";\n } else if (ch == \"?\" && (stream.eatSpace() || stream.eol() || stream.eat(\";\"))) {\n // placeholders\n return \"variable-3\";\n } else if (ch == \"'\" || (ch == '\"' && support.doubleQuote)) {\n // strings\n // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html\n state.tokenize = tokenLiteral(ch);\n return state.tokenize(stream, state);\n } else if ((((support.nCharCast == true && (ch == \"n\" || ch == \"N\"))\n || (support.charsetCast == true && ch == \"_\" && stream.match(/[a-z][a-z0-9]*/i)))\n && (stream.peek() == \"'\" || stream.peek() == '\"'))) {\n // charset casting: _utf8'str', N'str', n'str'\n // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html\n return \"keyword\";\n } else if (/^[\\(\\),\\;\\[\\]]/.test(ch)) {\n // no highlightning\n return null;\n } else if (support.commentSlashSlash && ch == \"/\" && stream.eat(\"/\")) {\n // 1-line comment\n stream.skipToEnd();\n return \"comment\";\n } else if ((support.commentHash && ch == \"#\")\n || (ch == \"-\" && stream.eat(\"-\") && (!support.commentSpaceRequired || stream.eat(\" \")))) {\n // 1-line comments\n // ref: https://kb.askmonty.org/en/comment-syntax/\n stream.skipToEnd();\n return \"comment\";\n } else if (ch == \"/\" && stream.eat(\"*\")) {\n // multi-line comments\n // ref: https://kb.askmonty.org/en/comment-syntax/\n state.tokenize = tokenComment;\n return state.tokenize(stream, state);\n } else if (ch == \".\") {\n // .1 for 0.1\n if (support.zerolessFloat == true && stream.match(/^(?:\\d+(?:e[+-]?\\d+)?)/i)) {\n return \"number\";\n }\n // .table_name (ODBC)\n // // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html\n if (support.ODBCdotTable == true && stream.match(/^[a-zA-Z_]+/)) {\n return \"variable-2\";\n }\n } else if (operatorChars.test(ch)) {\n // operators\n stream.eatWhile(operatorChars);\n return null;\n } else if (ch == '{' &&\n (stream.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/) || stream.match(/^( )*(d|D|t|T|ts|TS)( )*\"[^\"]*\"( )*}/))) {\n // dates (weird ODBC syntax)\n // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html\n return \"number\";\n } else {\n stream.eatWhile(/^[_\\w\\d]/);\n var word = stream.current().toLowerCase();\n // dates (standard SQL syntax)\n // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html\n if (dateSQL.hasOwnProperty(word) && (stream.match(/^( )+'[^']*'/) || stream.match(/^( )+\"[^\"]*\"/)))\n return \"number\";\n if (atoms.hasOwnProperty(word)) return \"atom\";\n if (builtin.hasOwnProperty(word)) return \"builtin\";\n if (keywords.hasOwnProperty(word)) return \"keyword\";\n if (client.hasOwnProperty(word)) return \"string-2\";\n return null;\n }\n }\n\n // 'string', with char specified in quote escaped by '\\'\n function tokenLiteral(quote) {\n return function(stream, state) {\n var escaped = false, ch;\n while ((ch = stream.next()) != null) {\n if (ch == quote && !escaped) {\n state.tokenize = tokenBase;\n break;\n }\n escaped = !escaped && ch == \"\\\\\";\n }\n return \"string\";\n };\n }\n function tokenComment(stream, state) {\n while (true) {\n if (stream.skipTo(\"*\")) {\n stream.next();\n if (stream.eat(\"/\")) {\n state.tokenize = tokenBase;\n break;\n }\n } else {\n stream.skipToEnd();\n break;\n }\n }\n return \"comment\";\n }\n\n function pushContext(stream, state, type) {\n state.context = {\n prev: state.context,\n indent: stream.indentation(),\n col: stream.column(),\n type: type\n };\n }\n\n function popContext(state) {\n state.indent = state.context.indent;\n state.context = state.context.prev;\n }\n\n return {\n startState: function() {\n return {tokenize: tokenBase, context: null};\n },\n\n token: function(stream, state) {\n if (stream.sol()) {\n if (state.context && state.context.align == null)\n state.context.align = false;\n }\n if (stream.eatSpace()) return null;\n\n var style = state.tokenize(stream, state);\n if (style == \"comment\") return style;\n\n if (state.context && state.context.align == null)\n state.context.align = true;\n\n var tok = stream.current();\n if (tok == \"(\")\n pushContext(stream, state, \")\");\n else if (tok == \"[\")\n pushContext(stream, state, \"]\");\n else if (state.context && state.context.type == tok)\n popContext(state);\n return style;\n },\n\n indent: function(state, textAfter) {\n var cx = state.context;\n if (!cx) return CodeMirror.Pass;\n var closing = textAfter.charAt(0) == cx.type;\n if (cx.align) return cx.col + (closing ? 0 : 1);\n else return cx.indent + (closing ? 0 : config.indentUnit);\n },\n\n blockCommentStart: \"/*\",\n blockCommentEnd: \"*/\",\n lineComment: support.commentSlashSlash ? \"//\" : support.commentHash ? \"#\" : null\n };\n});\n\n(function() {\n \"use strict\";\n\n // `identifier`\n function hookIdentifier(stream) {\n // MySQL/MariaDB identifiers\n // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html\n var ch;\n while ((ch = stream.next()) != null) {\n if (ch == \"`\" && !stream.eat(\"`\")) return \"variable-2\";\n }\n stream.backUp(stream.current().length - 1);\n return stream.eatWhile(/\\w/) ? \"variable-2\" : null;\n }\n\n // variable token\n function hookVar(stream) {\n // variables\n // @@prefix.varName @varName\n // varName can be quoted with ` or ' or \"\n // ref: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html\n if (stream.eat(\"@\")) {\n stream.match(/^session\\./);\n stream.match(/^local\\./);\n stream.match(/^global\\./);\n }\n\n if (stream.eat(\"'\")) {\n stream.match(/^.*'/);\n return \"variable-2\";\n } else if (stream.eat('\"')) {\n stream.match(/^.*\"/);\n return \"variable-2\";\n } else if (stream.eat(\"`\")) {\n stream.match(/^.*`/);\n return \"variable-2\";\n } else if (stream.match(/^[0-9a-zA-Z$\\.\\_]+/)) {\n return \"variable-2\";\n }\n return null;\n };\n\n // short client keyword token\n function hookClient(stream) {\n // \\N means NULL\n // ref: http://dev.mysql.com/doc/refman/5.5/en/null-values.html\n if (stream.eat(\"N\")) {\n return \"atom\";\n }\n // \\g, etc\n // ref: http://dev.mysql.com/doc/refman/5.5/en/mysql-commands.html\n return stream.match(/^[a-zA-Z.#!?]/) ? \"variable-2\" : null;\n }\n\n // these keywords are used by all SQL dialects (however, a mode can still overwrite it)\n var sqlKeywords = \"alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit \";\n\n // turn a space-separated list into an array\n function set(str) {\n var obj = {}, words = str.split(\" \");\n for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n return obj;\n }\n\n // A generic SQL Mode. It's not a standard, it just try to support what is generally supported\n CodeMirror.defineMIME(\"text/x-sql\", {\n name: \"sql\",\n keywords: set(sqlKeywords + \"begin\"),\n builtin: set(\"bool boolean bit blob enum long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision real date datetime year unsigned signed decimal numeric\"),\n atoms: set(\"false true null unknown\"),\n operatorChars: /^[*+\\-%<>!=]/,\n dateSQL: set(\"date time timestamp\"),\n support: set(\"ODBCdotTable doubleQuote binaryNumber hexNumber\")\n });\n\n CodeMirror.defineMIME(\"text/x-mssql\", {\n name: \"sql\",\n client: set(\"charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee\"),\n keywords: set(sqlKeywords + \"begin trigger proc view index for add constraint key primary foreign collate clustered nonclustered declare\"),\n builtin: set(\"bigint numeric bit smallint decimal smallmoney int tinyint money float real char varchar text nchar nvarchar ntext binary varbinary image cursor timestamp hierarchyid uniqueidentifier sql_variant xml table \"),\n atoms: set(\"false true null unknown\"),\n operatorChars: /^[*+\\-%<>!=]/,\n dateSQL: set(\"date datetimeoffset datetime2 smalldatetime datetime time\"),\n hooks: {\n \"@\": hookVar\n }\n });\n\n CodeMirror.defineMIME(\"text/x-mysql\", {\n name: \"sql\",\n client: set(\"charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee\"),\n keywords: set(sqlKeywords + \"accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group group_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat\"),\n builtin: set(\"bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric\"),\n atoms: set(\"false true null unknown\"),\n operatorChars: /^[*+\\-%<>!=&|^]/,\n dateSQL: set(\"date time timestamp\"),\n support: set(\"ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired\"),\n hooks: {\n \"@\": hookVar,\n \"`\": hookIdentifier,\n \"\\\\\": hookClient\n }\n });\n\n CodeMirror.defineMIME(\"text/x-mariadb\", {\n name: \"sql\",\n client: set(\"charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee\"),\n keywords: set(sqlKeywords + \"accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group groupby_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat\"),\n builtin: set(\"bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric\"),\n atoms: set(\"false true null unknown\"),\n operatorChars: /^[*+\\-%<>!=&|^]/,\n dateSQL: set(\"date time timestamp\"),\n support: set(\"ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired\"),\n hooks: {\n \"@\": hookVar,\n \"`\": hookIdentifier,\n \"\\\\\": hookClient\n }\n });\n\n // the query language used by Apache Cassandra is called CQL, but this mime type\n // is called Cassandra to avoid confusion with Contextual Query Language\n CodeMirror.defineMIME(\"text/x-cassandra\", {\n name: \"sql\",\n client: { },\n keywords: set(\"add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime\"),\n builtin: set(\"ascii bigint blob boolean counter decimal double float frozen inet int list map static text timestamp timeuuid tuple uuid varchar varint\"),\n atoms: set(\"false true infinity NaN\"),\n operatorChars: /^[<>=]/,\n dateSQL: { },\n support: set(\"commentSlashSlash decimallessFloat\"),\n hooks: { }\n });\n\n // this is based on Peter Raganitsch's 'plsql' mode\n CodeMirror.defineMIME(\"text/x-plsql\", {\n name: \"sql\",\n client: set(\"appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap\"),\n keywords: set(\"abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work\"),\n builtin: set(\"abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least lenght lenghtb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml\"),\n operatorChars: /^[*+\\-%<>!=~]/,\n dateSQL: set(\"date time timestamp\"),\n support: set(\"doubleQuote nCharCast zerolessFloat binaryNumber hexNumber\")\n });\n\n // Created to support specific hive keywords\n CodeMirror.defineMIME(\"text/x-hive\", {\n name: \"sql\",\n keywords: set(\"select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external false fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger true unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with\"),\n builtin: set(\"bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype\"),\n atoms: set(\"false true null unknown\"),\n operatorChars: /^[*+\\-%<>!=]/,\n dateSQL: set(\"date timestamp\"),\n support: set(\"ODBCdotTable doubleQuote binaryNumber hexNumber\")\n });\n\n CodeMirror.defineMIME(\"text/x-pgsql\", {\n name: \"sql\",\n client: set(\"source\"),\n // http://www.postgresql.org/docs/9.5/static/sql-keywords-appendix.html\n keywords: set(sqlKeywords + \"a abort abs absent absolute access according action ada add admin after aggregate all allocate also always analyse analyze any are array array_agg array_max_cardinality asensitive assertion assignment asymmetric at atomic attribute attributes authorization avg backward base64 before begin begin_frame begin_partition bernoulli binary bit_length blob blocked bom both breadth c cache call called cardinality cascade cascaded case cast catalog catalog_name ceil ceiling chain characteristics characters character_length character_set_catalog character_set_name character_set_schema char_length check checkpoint class class_origin clob close cluster coalesce cobol collate collation collation_catalog collation_name collation_schema collect column columns column_name command_function command_function_code comment comments commit committed concurrently condition condition_number configuration conflict connect connection connection_name constraint constraints constraint_catalog constraint_name constraint_schema constructor contains content continue control conversion convert copy corr corresponding cost covar_pop covar_samp cross csv cube cume_dist current current_catalog current_date current_default_transform_group current_path current_role current_row current_schema current_time current_timestamp current_transform_group_for_type current_user cursor cursor_name cycle data database datalink datetime_interval_code datetime_interval_precision day db deallocate dec declare default defaults deferrable deferred defined definer degree delimiter delimiters dense_rank depth deref derived describe descriptor deterministic diagnostics dictionary disable discard disconnect dispatch dlnewcopy dlpreviouscopy dlurlcomplete dlurlcompleteonly dlurlcompletewrite dlurlpath dlurlpathonly dlurlpathwrite dlurlscheme dlurlserver dlvalue do document domain dynamic dynamic_function dynamic_function_code each element else empty enable encoding encrypted end end-exec end_frame end_partition enforced enum equals escape event every except exception exclude excluding exclusive exec execute exists exp explain expression extension external extract false family fetch file filter final first first_value flag float floor following for force foreign fortran forward found frame_row free freeze fs full function functions fusion g general generated get global go goto grant granted greatest grouping groups handler header hex hierarchy hold hour id identity if ignore ilike immediate immediately immutable implementation implicit import including increment indent index indexes indicator inherit inherits initially inline inner inout input insensitive instance instantiable instead integrity intersect intersection invoker isnull isolation k key key_member key_type label lag language large last last_value lateral lead leading leakproof least left length level library like_regex link listen ln load local localtime localtimestamp location locator lock locked logged lower m map mapping match matched materialized max maxvalue max_cardinality member merge message_length message_octet_length message_text method min minute minvalue mod mode modifies module month more move multiset mumps name names namespace national natural nchar nclob nesting new next nfc nfd nfkc nfkd nil no none normalize normalized nothing notify notnull nowait nth_value ntile null nullable nullif nulls number object occurrences_regex octets octet_length of off offset oids old only open operator option options ordering ordinality others out outer output over overlaps overlay overriding owned owner p pad parameter parameter_mode parameter_name parameter_ordinal_position parameter_specific_catalog parameter_specific_name parameter_specific_schema parser partial partition pascal passing passthrough password percent percentile_cont percentile_disc percent_rank period permission placing plans pli policy portion position position_regex power precedes preceding prepare prepared preserve primary prior privileges procedural procedure program public quote range rank read reads reassign recheck recovery recursive ref references referencing refresh regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy regr_syy reindex relative release rename repeatable replace replica requiring reset respect restart restore restrict result return returned_cardinality returned_length returned_octet_length returned_sqlstate returning returns revoke right role rollback rollup routine routine_catalog routine_name routine_schema row rows row_count row_number rule savepoint scale schema schema_name scope scope_catalog scope_name scope_schema scroll search second section security selective self sensitive sequence sequences serializable server server_name session session_user setof sets share show similar simple size skip snapshot some source space specific specifictype specific_name sql sqlcode sqlerror sqlexception sqlstate sqlwarning sqrt stable standalone start state statement static statistics stddev_pop stddev_samp stdin stdout storage strict strip structure style subclass_origin submultiset substring substring_regex succeeds sum symmetric sysid system system_time system_user t tables tablesample tablespace table_name temp template temporary then ties timezone_hour timezone_minute to token top_level_count trailing transaction transactions_committed transactions_rolled_back transaction_active transform transforms translate translate_regex translation treat trigger trigger_catalog trigger_name trigger_schema trim trim_array true truncate trusted type types uescape unbounded uncommitted under unencrypted unique unknown unlink unlisten unlogged unnamed unnest until untyped upper uri usage user user_defined_type_catalog user_defined_type_code user_defined_type_name user_defined_type_schema using vacuum valid validate validator value value_of varbinary variadic var_pop var_samp verbose version versioning view views volatile when whenever whitespace width_bucket window within work wrapper write xmlagg xmlattributes xmlbinary xmlcast xmlcomment xmlconcat xmldeclaration xmldocument xmlelement xmlexists xmlforest xmliterate xmlnamespaces xmlparse xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltext xmlvalidate year yes loop repeat\"),\n // http://www.postgresql.org/docs/9.5/static/datatype.html\n builtin: set(\"bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float8 inet integer int int4 interval json jsonb line lseg macaddr money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml\"),\n atoms: set(\"false true null unknown\"),\n operatorChars: /^[*+\\-%<>!=&|^]/,\n dateSQL: set(\"date time timestamp\"),\n support: set(\"ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast commentHash commentSpaceRequired\")\n });\n\n}());\n\n});\n\n/*\n How Properties of Mime Types are used by SQL Mode\n =================================================\n\n keywords:\n A list of keywords you want to be highlighted.\n builtin:\n A list of builtin types you want to be highlighted (if you want types to be of class \"builtin\" instead of \"keyword\").\n operatorChars:\n All characters that must be handled as operators.\n client:\n Commands parsed and executed by the client (not the server).\n support:\n A list of supported syntaxes which are not common, but are supported by more than 1 DBMS.\n * ODBCdotTable: .tableName\n * zerolessFloat: .1\n * doubleQuote\n * nCharCast: N'string'\n * charsetCast: _utf8'string'\n * commentHash: use # char for comments\n * commentSlashSlash: use // for comments\n * commentSpaceRequired: require a space after -- for comments\n atoms:\n Keywords that must be highlighted as atoms,. Some DBMS's support more atoms than others:\n UNKNOWN, INFINITY, UNDERFLOW, NaN...\n dateSQL:\n Used for date/time SQL standard syntax, because not all DBMS's support same temporal types.\n*/\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n/*jshint unused:true, eqnull:true, curly:true, bitwise:true */\n/*jshint undef:true, latedef:true, trailing:true */\n/*global CodeMirror:true */\n\n// erlang mode.\n// tokenizer -> token types -> CodeMirror styles\n// tokenizer maintains a parse stack\n// indenter uses the parse stack\n\n// TODO indenter:\n// bit syntax\n// old guard/bif/conversion clashes (e.g. \"float/1\")\n// type/spec/opaque\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../../lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMIME(\"text/x-erlang\", \"erlang\");\n\nCodeMirror.defineMode(\"erlang\", function(cmCfg) {\n \"use strict\";\n\n/////////////////////////////////////////////////////////////////////////////\n// constants\n\n var typeWords = [\n \"-type\", \"-spec\", \"-export_type\", \"-opaque\"];\n\n var keywordWords = [\n \"after\",\"begin\",\"catch\",\"case\",\"cond\",\"end\",\"fun\",\"if\",\n \"let\",\"of\",\"query\",\"receive\",\"try\",\"when\"];\n\n var separatorRE = /[\\->,;]/;\n var separatorWords = [\n \"->\",\";\",\",\"];\n\n var operatorAtomWords = [\n \"and\",\"andalso\",\"band\",\"bnot\",\"bor\",\"bsl\",\"bsr\",\"bxor\",\n \"div\",\"not\",\"or\",\"orelse\",\"rem\",\"xor\"];\n\n var operatorSymbolRE = /[\\+\\-\\*\\/<>=\\|:!]/;\n var operatorSymbolWords = [\n \"=\",\"+\",\"-\",\"*\",\"/\",\">\",\">=\",\"<\",\"=<\",\"=:=\",\"==\",\"=/=\",\"/=\",\"||\",\"<-\",\"!\"];\n\n var openParenRE = /[<\\(\\[\\{]/;\n var openParenWords = [\n \"<<\",\"(\",\"[\",\"{\"];\n\n var closeParenRE = /[>\\)\\]\\}]/;\n var closeParenWords = [\n \"}\",\"]\",\")\",\">>\"];\n\n var guardWords = [\n \"is_atom\",\"is_binary\",\"is_bitstring\",\"is_boolean\",\"is_float\",\n \"is_function\",\"is_integer\",\"is_list\",\"is_number\",\"is_pid\",\n \"is_port\",\"is_record\",\"is_reference\",\"is_tuple\",\n \"atom\",\"binary\",\"bitstring\",\"boolean\",\"function\",\"integer\",\"list\",\n \"number\",\"pid\",\"port\",\"record\",\"reference\",\"tuple\"];\n\n var bifWords = [\n \"abs\",\"adler32\",\"adler32_combine\",\"alive\",\"apply\",\"atom_to_binary\",\n \"atom_to_list\",\"binary_to_atom\",\"binary_to_existing_atom\",\n \"binary_to_list\",\"binary_to_term\",\"bit_size\",\"bitstring_to_list\",\n \"byte_size\",\"check_process_code\",\"contact_binary\",\"crc32\",\n \"crc32_combine\",\"date\",\"decode_packet\",\"delete_module\",\n \"disconnect_node\",\"element\",\"erase\",\"exit\",\"float\",\"float_to_list\",\n \"garbage_collect\",\"get\",\"get_keys\",\"group_leader\",\"halt\",\"hd\",\n \"integer_to_list\",\"internal_bif\",\"iolist_size\",\"iolist_to_binary\",\n \"is_alive\",\"is_atom\",\"is_binary\",\"is_bitstring\",\"is_boolean\",\n \"is_float\",\"is_function\",\"is_integer\",\"is_list\",\"is_number\",\"is_pid\",\n \"is_port\",\"is_process_alive\",\"is_record\",\"is_reference\",\"is_tuple\",\n \"length\",\"link\",\"list_to_atom\",\"list_to_binary\",\"list_to_bitstring\",\n \"list_to_existing_atom\",\"list_to_float\",\"list_to_integer\",\n \"list_to_pid\",\"list_to_tuple\",\"load_module\",\"make_ref\",\"module_loaded\",\n \"monitor_node\",\"node\",\"node_link\",\"node_unlink\",\"nodes\",\"notalive\",\n \"now\",\"open_port\",\"pid_to_list\",\"port_close\",\"port_command\",\n \"port_connect\",\"port_control\",\"pre_loaded\",\"process_flag\",\n \"process_info\",\"processes\",\"purge_module\",\"put\",\"register\",\n \"registered\",\"round\",\"self\",\"setelement\",\"size\",\"spawn\",\"spawn_link\",\n \"spawn_monitor\",\"spawn_opt\",\"split_binary\",\"statistics\",\n \"term_to_binary\",\"time\",\"throw\",\"tl\",\"trunc\",\"tuple_size\",\n \"tuple_to_list\",\"unlink\",\"unregister\",\"whereis\"];\n\n// upper case: [A-Z] [Ø-Þ] [À-Ö]\n// lower case: [a-z] [ß-ö] [ø-ÿ]\n var anumRE = /[\\w@Ø-ÞÀ-Öß-öø-ÿ]/;\n var escapesRE =\n /[0-7]{1,3}|[bdefnrstv\\\\\"']|\\^[a-zA-Z]|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+}/;\n\n/////////////////////////////////////////////////////////////////////////////\n// tokenizer\n\n function tokenizer(stream,state) {\n // in multi-line string\n if (state.in_string) {\n state.in_string = (!doubleQuote(stream));\n return rval(state,stream,\"string\");\n }\n\n // in multi-line atom\n if (state.in_atom) {\n state.in_atom = (!singleQuote(stream));\n return rval(state,stream,\"atom\");\n }\n\n // whitespace\n if (stream.eatSpace()) {\n return rval(state,stream,\"whitespace\");\n }\n\n // attributes and type specs\n if (!peekToken(state) &&\n stream.match(/-\\s*[a-zß-öø-ÿ][\\wØ-ÞÀ-Öß-öø-ÿ]*/)) {\n if (is_member(stream.current(),typeWords)) {\n return rval(state,stream,\"type\");\n }else{\n return rval(state,stream,\"attribute\");\n }\n }\n\n var ch = stream.next();\n\n // comment\n if (ch == '%') {\n stream.skipToEnd();\n return rval(state,stream,\"comment\");\n }\n\n // colon\n if (ch == \":\") {\n return rval(state,stream,\"colon\");\n }\n\n // macro\n if (ch == '?') {\n stream.eatSpace();\n stream.eatWhile(anumRE);\n return rval(state,stream,\"macro\");\n }\n\n // record\n if (ch == \"#\") {\n stream.eatSpace();\n stream.eatWhile(anumRE);\n return rval(state,stream,\"record\");\n }\n\n // dollar escape\n if (ch == \"$\") {\n if (stream.next() == \"\\\\\" && !stream.match(escapesRE)) {\n return rval(state,stream,\"error\");\n }\n return rval(state,stream,\"number\");\n }\n\n // dot\n if (ch == \".\") {\n return rval(state,stream,\"dot\");\n }\n\n // quoted atom\n if (ch == '\\'') {\n if (!(state.in_atom = (!singleQuote(stream)))) {\n if (stream.match(/\\s*\\/\\s*[0-9]/,false)) {\n stream.match(/\\s*\\/\\s*[0-9]/,true);\n return rval(state,stream,\"fun\"); // 'f'/0 style fun\n }\n if (stream.match(/\\s*\\(/,false) || stream.match(/\\s*:/,false)) {\n return rval(state,stream,\"function\");\n }\n }\n return rval(state,stream,\"atom\");\n }\n\n // string\n if (ch == '\"') {\n state.in_string = (!doubleQuote(stream));\n return rval(state,stream,\"string\");\n }\n\n // variable\n if (/[A-Z_Ø-ÞÀ-Ö]/.test(ch)) {\n stream.eatWhile(anumRE);\n return rval(state,stream,\"variable\");\n }\n\n // atom/keyword/BIF/function\n if (/[a-z_ß-öø-ÿ]/.test(ch)) {\n stream.eatWhile(anumRE);\n\n if (stream.match(/\\s*\\/\\s*[0-9]/,false)) {\n stream.match(/\\s*\\/\\s*[0-9]/,true);\n return rval(state,stream,\"fun\"); // f/0 style fun\n }\n\n var w = stream.current();\n\n if (is_member(w,keywordWords)) {\n return rval(state,stream,\"keyword\");\n }else if (is_member(w,operatorAtomWords)) {\n return rval(state,stream,\"operator\");\n }else if (stream.match(/\\s*\\(/,false)) {\n // 'put' and 'erlang:put' are bifs, 'foo:put' is not\n if (is_member(w,bifWords) &&\n ((peekToken(state).token != \":\") ||\n (peekToken(state,2).token == \"erlang\"))) {\n return rval(state,stream,\"builtin\");\n }else if (is_member(w,guardWords)) {\n return rval(state,stream,\"guard\");\n }else{\n return rval(state,stream,\"function\");\n }\n }else if (lookahead(stream) == \":\") {\n if (w == \"erlang\") {\n return rval(state,stream,\"builtin\");\n } else {\n return rval(state,stream,\"function\");\n }\n }else if (is_member(w,[\"true\",\"false\"])) {\n return rval(state,stream,\"boolean\");\n }else{\n return rval(state,stream,\"atom\");\n }\n }\n\n // number\n var digitRE = /[0-9]/;\n var radixRE = /[0-9a-zA-Z]/; // 36#zZ style int\n if (digitRE.test(ch)) {\n stream.eatWhile(digitRE);\n if (stream.eat('#')) { // 36#aZ style integer\n if (!stream.eatWhile(radixRE)) {\n stream.backUp(1); //\"36#\" - syntax error\n }\n } else if (stream.eat('.')) { // float\n if (!stream.eatWhile(digitRE)) {\n stream.backUp(1); // \"3.\" - probably end of function\n } else {\n if (stream.eat(/[eE]/)) { // float with exponent\n if (stream.eat(/[-+]/)) {\n if (!stream.eatWhile(digitRE)) {\n stream.backUp(2); // \"2e-\" - syntax error\n }\n } else {\n if (!stream.eatWhile(digitRE)) {\n stream.backUp(1); // \"2e\" - syntax error\n }\n }\n }\n }\n }\n return rval(state,stream,\"number\"); // normal integer\n }\n\n // open parens\n if (nongreedy(stream,openParenRE,openParenWords)) {\n return rval(state,stream,\"open_paren\");\n }\n\n // close parens\n if (nongreedy(stream,closeParenRE,closeParenWords)) {\n return rval(state,stream,\"close_paren\");\n }\n\n // separators\n if (greedy(stream,separatorRE,separatorWords)) {\n return rval(state,stream,\"separator\");\n }\n\n // operators\n if (greedy(stream,operatorSymbolRE,operatorSymbolWords)) {\n return rval(state,stream,\"operator\");\n }\n\n return rval(state,stream,null);\n }\n\n/////////////////////////////////////////////////////////////////////////////\n// utilities\n function nongreedy(stream,re,words) {\n if (stream.current().length == 1 && re.test(stream.current())) {\n stream.backUp(1);\n while (re.test(stream.peek())) {\n stream.next();\n if (is_member(stream.current(),words)) {\n return true;\n }\n }\n stream.backUp(stream.current().length-1);\n }\n return false;\n }\n\n function greedy(stream,re,words) {\n if (stream.current().length == 1 && re.test(stream.current())) {\n while (re.test(stream.peek())) {\n stream.next();\n }\n while (0 < stream.current().length) {\n if (is_member(stream.current(),words)) {\n return true;\n }else{\n stream.backUp(1);\n }\n }\n stream.next();\n }\n return false;\n }\n\n function doubleQuote(stream) {\n return quote(stream, '\"', '\\\\');\n }\n\n function singleQuote(stream) {\n return quote(stream,'\\'','\\\\');\n }\n\n function quote(stream,quoteChar,escapeChar) {\n while (!stream.eol()) {\n var ch = stream.next();\n if (ch == quoteChar) {\n return true;\n }else if (ch == escapeChar) {\n stream.next();\n }\n }\n return false;\n }\n\n function lookahead(stream) {\n var m = stream.match(/([\\n\\s]+|%[^\\n]*\\n)*(.)/,false);\n return m ? m.pop() : \"\";\n }\n\n function is_member(element,list) {\n return (-1 < list.indexOf(element));\n }\n\n function rval(state,stream,type) {\n\n // parse stack\n pushToken(state,realToken(type,stream));\n\n // map erlang token type to CodeMirror style class\n // erlang -> CodeMirror tag\n switch (type) {\n case \"atom\": return \"atom\";\n case \"attribute\": return \"attribute\";\n case \"boolean\": return \"atom\";\n case \"builtin\": return \"builtin\";\n case \"close_paren\": return null;\n case \"colon\": return null;\n case \"comment\": return \"comment\";\n case \"dot\": return null;\n case \"error\": return \"error\";\n case \"fun\": return \"meta\";\n case \"function\": return \"tag\";\n case \"guard\": return \"property\";\n case \"keyword\": return \"keyword\";\n case \"macro\": return \"variable-2\";\n case \"number\": return \"number\";\n case \"open_paren\": return null;\n case \"operator\": return \"operator\";\n case \"record\": return \"bracket\";\n case \"separator\": return null;\n case \"string\": return \"string\";\n case \"type\": return \"def\";\n case \"variable\": return \"variable\";\n default: return null;\n }\n }\n\n function aToken(tok,col,ind,typ) {\n return {token: tok,\n column: col,\n indent: ind,\n type: typ};\n }\n\n function realToken(type,stream) {\n return aToken(stream.current(),\n stream.column(),\n stream.indentation(),\n type);\n }\n\n function fakeToken(type) {\n return aToken(type,0,0,type);\n }\n\n function peekToken(state,depth) {\n var len = state.tokenStack.length;\n var dep = (depth ? depth : 1);\n\n if (len < dep) {\n return false;\n }else{\n return state.tokenStack[len-dep];\n }\n }\n\n function pushToken(state,token) {\n\n if (!(token.type == \"comment\" || token.type == \"whitespace\")) {\n state.tokenStack = maybe_drop_pre(state.tokenStack,token);\n state.tokenStack = maybe_drop_post(state.tokenStack);\n }\n }\n\n function maybe_drop_pre(s,token) {\n var last = s.length-1;\n\n if (0 < last && s[last].type === \"record\" && token.type === \"dot\") {\n s.pop();\n }else if (0 < last && s[last].type === \"group\") {\n s.pop();\n s.push(token);\n }else{\n s.push(token);\n }\n return s;\n }\n\n function maybe_drop_post(s) {\n var last = s.length-1;\n\n if (s[last].type === \"dot\") {\n return [];\n }\n if (s[last].type === \"fun\" && s[last-1].token === \"fun\") {\n return s.slice(0,last-1);\n }\n switch (s[s.length-1].token) {\n case \"}\": return d(s,{g:[\"{\"]});\n case \"]\": return d(s,{i:[\"[\"]});\n case \")\": return d(s,{i:[\"(\"]});\n case \">>\": return d(s,{i:[\"<<\"]});\n case \"end\": return d(s,{i:[\"begin\",\"case\",\"fun\",\"if\",\"receive\",\"try\"]});\n case \",\": return d(s,{e:[\"begin\",\"try\",\"when\",\"->\",\n \",\",\"(\",\"[\",\"{\",\"<<\"]});\n case \"->\": return d(s,{r:[\"when\"],\n m:[\"try\",\"if\",\"case\",\"receive\"]});\n case \";\": return d(s,{E:[\"case\",\"fun\",\"if\",\"receive\",\"try\",\"when\"]});\n case \"catch\":return d(s,{e:[\"try\"]});\n case \"of\": return d(s,{e:[\"case\"]});\n case \"after\":return d(s,{e:[\"receive\",\"try\"]});\n default: return s;\n }\n }\n\n function d(stack,tt) {\n // stack is a stack of Token objects.\n // tt is an object; {type:tokens}\n // type is a char, tokens is a list of token strings.\n // The function returns (possibly truncated) stack.\n // It will descend the stack, looking for a Token such that Token.token\n // is a member of tokens. If it does not find that, it will normally (but\n // see \"E\" below) return stack. If it does find a match, it will remove\n // all the Tokens between the top and the matched Token.\n // If type is \"m\", that is all it does.\n // If type is \"i\", it will also remove the matched Token and the top Token.\n // If type is \"g\", like \"i\", but add a fake \"group\" token at the top.\n // If type is \"r\", it will remove the matched Token, but not the top Token.\n // If type is \"e\", it will keep the matched Token but not the top Token.\n // If type is \"E\", it behaves as for type \"e\", except if there is no match,\n // in which case it will return an empty stack.\n\n for (var type in tt) {\n var len = stack.length-1;\n var tokens = tt[type];\n for (var i = len-1; -1 < i ; i--) {\n if (is_member(stack[i].token,tokens)) {\n var ss = stack.slice(0,i);\n switch (type) {\n case \"m\": return ss.concat(stack[i]).concat(stack[len]);\n case \"r\": return ss.concat(stack[len]);\n case \"i\": return ss;\n case \"g\": return ss.concat(fakeToken(\"group\"));\n case \"E\": return ss.concat(stack[i]);\n case \"e\": return ss.concat(stack[i]);\n }\n }\n }\n }\n return (type == \"E\" ? [] : stack);\n }\n\n/////////////////////////////////////////////////////////////////////////////\n// indenter\n\n function indenter(state,textAfter) {\n var t;\n var unit = cmCfg.indentUnit;\n var wordAfter = wordafter(textAfter);\n var currT = peekToken(state,1);\n var prevT = peekToken(state,2);\n\n if (state.in_string || state.in_atom) {\n return CodeMirror.Pass;\n }else if (!prevT) {\n return 0;\n }else if (currT.token == \"when\") {\n return currT.column+unit;\n }else if (wordAfter === \"when\" && prevT.type === \"function\") {\n return prevT.indent+unit;\n }else if (wordAfter === \"(\" && currT.token === \"fun\") {\n return currT.column+3;\n }else if (wordAfter === \"catch\" && (t = getToken(state,[\"try\"]))) {\n return t.column;\n }else if (is_member(wordAfter,[\"end\",\"after\",\"of\"])) {\n t = getToken(state,[\"begin\",\"case\",\"fun\",\"if\",\"receive\",\"try\"]);\n return t ? t.column : CodeMirror.Pass;\n }else if (is_member(wordAfter,closeParenWords)) {\n t = getToken(state,openParenWords);\n return t ? t.column : CodeMirror.Pass;\n }else if (is_member(currT.token,[\",\",\"|\",\"||\"]) ||\n is_member(wordAfter,[\",\",\"|\",\"||\"])) {\n t = postcommaToken(state);\n return t ? t.column+t.token.length : unit;\n }else if (currT.token == \"->\") {\n if (is_member(prevT.token, [\"receive\",\"case\",\"if\",\"try\"])) {\n return prevT.column+unit+unit;\n }else{\n return prevT.column+unit;\n }\n }else if (is_member(currT.token,openParenWords)) {\n return currT.column+currT.token.length;\n }else{\n t = defaultToken(state);\n return truthy(t) ? t.column+unit : 0;\n }\n }\n\n function wordafter(str) {\n var m = str.match(/,|[a-z]+|\\}|\\]|\\)|>>|\\|+|\\(/);\n\n return truthy(m) && (m.index === 0) ? m[0] : \"\";\n }\n\n function postcommaToken(state) {\n var objs = state.tokenStack.slice(0,-1);\n var i = getTokenIndex(objs,\"type\",[\"open_paren\"]);\n\n return truthy(objs[i]) ? objs[i] : false;\n }\n\n function defaultToken(state) {\n var objs = state.tokenStack;\n var stop = getTokenIndex(objs,\"type\",[\"open_paren\",\"separator\",\"keyword\"]);\n var oper = getTokenIndex(objs,\"type\",[\"operator\"]);\n\n if (truthy(stop) && truthy(oper) && stop < oper) {\n return objs[stop+1];\n } else if (truthy(stop)) {\n return objs[stop];\n } else {\n return false;\n }\n }\n\n function getToken(state,tokens) {\n var objs = state.tokenStack;\n var i = getTokenIndex(objs,\"token\",tokens);\n\n return truthy(objs[i]) ? objs[i] : false;\n }\n\n function getTokenIndex(objs,propname,propvals) {\n\n for (var i = objs.length-1; -1 < i ; i--) {\n if (is_member(objs[i][propname],propvals)) {\n return i;\n }\n }\n return false;\n }\n\n function truthy(x) {\n return (x !== false) && (x != null);\n }\n\n/////////////////////////////////////////////////////////////////////////////\n// this object defines the mode\n\n return {\n startState:\n function() {\n return {tokenStack: [],\n in_string: false,\n in_atom: false};\n },\n\n token:\n function(stream, state) {\n return tokenizer(stream, state);\n },\n\n indent:\n function(state, textAfter) {\n return indenter(state,textAfter);\n },\n\n lineComment: \"%\"\n };\n});\n\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../../lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nvar htmlConfig = {\n autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true,\n 'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true,\n 'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true,\n 'track': true, 'wbr': true, 'menuitem': true},\n implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true,\n 'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true,\n 'th': true, 'tr': true},\n contextGrabbers: {\n 'dd': {'dd': true, 'dt': true},\n 'dt': {'dd': true, 'dt': true},\n 'li': {'li': true},\n 'option': {'option': true, 'optgroup': true},\n 'optgroup': {'optgroup': true},\n 'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true,\n 'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true,\n 'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true,\n 'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true,\n 'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true},\n 'rp': {'rp': true, 'rt': true},\n 'rt': {'rp': true, 'rt': true},\n 'tbody': {'tbody': true, 'tfoot': true},\n 'td': {'td': true, 'th': true},\n 'tfoot': {'tbody': true},\n 'th': {'td': true, 'th': true},\n 'thead': {'tbody': true, 'tfoot': true},\n 'tr': {'tr': true}\n },\n doNotIndent: {\"pre\": true},\n allowUnquoted: true,\n allowMissing: true,\n caseFold: true\n}\n\nvar xmlConfig = {\n autoSelfClosers: {},\n implicitlyClosed: {},\n contextGrabbers: {},\n doNotIndent: {},\n allowUnquoted: false,\n allowMissing: false,\n caseFold: false\n}\n\nCodeMirror.defineMode(\"xml\", function(editorConf, config_) {\n var indentUnit = editorConf.indentUnit\n var config = {}\n var defaults = config_.htmlMode ? htmlConfig : xmlConfig\n for (var prop in defaults) config[prop] = defaults[prop]\n for (var prop in config_) config[prop] = config_[prop]\n\n // Return variables for tokenizers\n var type, setStyle;\n\n function inText(stream, state) {\n function chain(parser) {\n state.tokenize = parser;\n return parser(stream, state);\n }\n\n var ch = stream.next();\n if (ch == \"<\") {\n if (stream.eat(\"!\")) {\n if (stream.eat(\"[\")) {\n if (stream.match(\"CDATA[\")) return chain(inBlock(\"atom\", \"]]>\"));\n else return null;\n } else if (stream.match(\"--\")) {\n return chain(inBlock(\"comment\", \"-->\"));\n } else if (stream.match(\"DOCTYPE\", true, true)) {\n stream.eatWhile(/[\\w\\._\\-]/);\n return chain(doctype(1));\n } else {\n return null;\n }\n } else if (stream.eat(\"?\")) {\n stream.eatWhile(/[\\w\\._\\-]/);\n state.tokenize = inBlock(\"meta\", \"?>\");\n return \"meta\";\n } else {\n type = stream.eat(\"/\") ? \"closeTag\" : \"openTag\";\n state.tokenize = inTag;\n return \"tag bracket\";\n }\n } else if (ch == \"&\") {\n var ok;\n if (stream.eat(\"#\")) {\n if (stream.eat(\"x\")) {\n ok = stream.eatWhile(/[a-fA-F\\d]/) && stream.eat(\";\");\n } else {\n ok = stream.eatWhile(/[\\d]/) && stream.eat(\";\");\n }\n } else {\n ok = stream.eatWhile(/[\\w\\.\\-:]/) && stream.eat(\";\");\n }\n return ok ? \"atom\" : \"error\";\n } else {\n stream.eatWhile(/[^&<]/);\n return null;\n }\n }\n inText.isInText = true;\n\n function inTag(stream, state) {\n var ch = stream.next();\n if (ch == \">\" || (ch == \"/\" && stream.eat(\">\"))) {\n state.tokenize = inText;\n type = ch == \">\" ? \"endTag\" : \"selfcloseTag\";\n return \"tag bracket\";\n } else if (ch == \"=\") {\n type = \"equals\";\n return null;\n } else if (ch == \"<\") {\n state.tokenize = inText;\n state.state = baseState;\n state.tagName = state.tagStart = null;\n var next = state.tokenize(stream, state);\n return next ? next + \" tag error\" : \"tag error\";\n } else if (/[\\'\\\"]/.test(ch)) {\n state.tokenize = inAttribute(ch);\n state.stringStartCol = stream.column();\n return state.tokenize(stream, state);\n } else {\n stream.match(/^[^\\s\\u00a0=<>\\\"\\']*[^\\s\\u00a0=<>\\\"\\'\\/]/);\n return \"word\";\n }\n }\n\n function inAttribute(quote) {\n var closure = function(stream, state) {\n while (!stream.eol()) {\n if (stream.next() == quote) {\n state.tokenize = inTag;\n break;\n }\n }\n return \"string\";\n };\n closure.isInAttribute = true;\n return closure;\n }\n\n function inBlock(style, terminator) {\n return function(stream, state) {\n while (!stream.eol()) {\n if (stream.match(terminator)) {\n state.tokenize = inText;\n break;\n }\n stream.next();\n }\n return style;\n };\n }\n function doctype(depth) {\n return function(stream, state) {\n var ch;\n while ((ch = stream.next()) != null) {\n if (ch == \"<\") {\n state.tokenize = doctype(depth + 1);\n return state.tokenize(stream, state);\n } else if (ch == \">\") {\n if (depth == 1) {\n state.tokenize = inText;\n break;\n } else {\n state.tokenize = doctype(depth - 1);\n return state.tokenize(stream, state);\n }\n }\n }\n return \"meta\";\n };\n }\n\n function Context(state, tagName, startOfLine) {\n this.prev = state.context;\n this.tagName = tagName;\n this.indent = state.indented;\n this.startOfLine = startOfLine;\n if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))\n this.noIndent = true;\n }\n function popContext(state) {\n if (state.context) state.context = state.context.prev;\n }\n function maybePopContext(state, nextTagName) {\n var parentTagName;\n while (true) {\n if (!state.context) {\n return;\n }\n parentTagName = state.context.tagName;\n if (!config.contextGrabbers.hasOwnProperty(parentTagName) ||\n !config.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) {\n return;\n }\n popContext(state);\n }\n }\n\n function baseState(type, stream, state) {\n if (type == \"openTag\") {\n state.tagStart = stream.column();\n return tagNameState;\n } else if (type == \"closeTag\") {\n return closeTagNameState;\n } else {\n return baseState;\n }\n }\n function tagNameState(type, stream, state) {\n if (type == \"word\") {\n state.tagName = stream.current();\n setStyle = \"tag\";\n return attrState;\n } else {\n setStyle = \"error\";\n return tagNameState;\n }\n }\n function closeTagNameState(type, stream, state) {\n if (type == \"word\") {\n var tagName = stream.current();\n if (state.context && state.context.tagName != tagName &&\n config.implicitlyClosed.hasOwnProperty(state.context.tagName))\n popContext(state);\n if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) {\n setStyle = \"tag\";\n return closeState;\n } else {\n setStyle = \"tag error\";\n return closeStateErr;\n }\n } else {\n setStyle = \"error\";\n return closeStateErr;\n }\n }\n\n function closeState(type, _stream, state) {\n if (type != \"endTag\") {\n setStyle = \"error\";\n return closeState;\n }\n popContext(state);\n return baseState;\n }\n function closeStateErr(type, stream, state) {\n setStyle = \"error\";\n return closeState(type, stream, state);\n }\n\n function attrState(type, _stream, state) {\n if (type == \"word\") {\n setStyle = \"attribute\";\n return attrEqState;\n } else if (type == \"endTag\" || type == \"selfcloseTag\") {\n var tagName = state.tagName, tagStart = state.tagStart;\n state.tagName = state.tagStart = null;\n if (type == \"selfcloseTag\" ||\n config.autoSelfClosers.hasOwnProperty(tagName)) {\n maybePopContext(state, tagName);\n } else {\n maybePopContext(state, tagName);\n state.context = new Context(state, tagName, tagStart == state.indented);\n }\n return baseState;\n }\n setStyle = \"error\";\n return attrState;\n }\n function attrEqState(type, stream, state) {\n if (type == \"equals\") return attrValueState;\n if (!config.allowMissing) setStyle = \"error\";\n return attrState(type, stream, state);\n }\n function attrValueState(type, stream, state) {\n if (type == \"string\") return attrContinuedState;\n if (type == \"word\" && config.allowUnquoted) {setStyle = \"string\"; return attrState;}\n setStyle = \"error\";\n return attrState(type, stream, state);\n }\n function attrContinuedState(type, stream, state) {\n if (type == \"string\") return attrContinuedState;\n return attrState(type, stream, state);\n }\n\n return {\n startState: function(baseIndent) {\n var state = {tokenize: inText,\n state: baseState,\n indented: baseIndent || 0,\n tagName: null, tagStart: null,\n context: null}\n if (baseIndent != null) state.baseIndent = baseIndent\n return state\n },\n\n token: function(stream, state) {\n if (!state.tagName && stream.sol())\n state.indented = stream.indentation();\n\n if (stream.eatSpace()) return null;\n type = null;\n var style = state.tokenize(stream, state);\n if ((style || type) && style != \"comment\") {\n setStyle = null;\n state.state = state.state(type || style, stream, state);\n if (setStyle)\n style = setStyle == \"error\" ? style + \" error\" : setStyle;\n }\n return style;\n },\n\n indent: function(state, textAfter, fullLine) {\n var context = state.context;\n // Indent multi-line strings (e.g. css).\n if (state.tokenize.isInAttribute) {\n if (state.tagStart == state.indented)\n return state.stringStartCol + 1;\n else\n return state.indented + indentUnit;\n }\n if (context && context.noIndent) return CodeMirror.Pass;\n if (state.tokenize != inTag && state.tokenize != inText)\n return fullLine ? fullLine.match(/^(\\s*)/)[0].length : 0;\n // Indent the starts of attribute names.\n if (state.tagName) {\n if (config.multilineTagIndentPastTag !== false)\n return state.tagStart + state.tagName.length + 2;\n else\n return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1);\n }\n if (config.alignCDATA && /$/,\n blockCommentStart: \"\",\n\n configuration: config.htmlMode ? \"html\" : \"xml\",\n helperType: config.htmlMode ? \"html\" : \"xml\",\n\n skipAttribute: function(state) {\n if (state.state == attrValueState)\n state.state = attrState\n }\n };\n});\n\nCodeMirror.defineMIME(\"text/xml\", \"xml\");\nCodeMirror.defineMIME(\"application/xml\", \"xml\");\nif (!CodeMirror.mimeModes.hasOwnProperty(\"text/html\"))\n CodeMirror.defineMIME(\"text/html\", {name: \"xml\", htmlMode: true});\n\n});\n","define('codemirror', [], function() {\n 'use strict';\n\n return {\n 'default': CodeMirror\n };\n});\n","define('ember-ajax/errors', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports.AjaxError = AjaxError;\n exports.InvalidError = InvalidError;\n exports.UnauthorizedError = UnauthorizedError;\n exports.ForbiddenError = ForbiddenError;\n\n var EmberError = _ember['default'].Error;\n\n /**\n @class AjaxError\n @namespace DS\n */\n\n function AjaxError(errors) {\n var message = arguments.length <= 1 || arguments[1] === undefined ? 'Ajax operation failed' : arguments[1];\n\n EmberError.call(this, message);\n\n this.errors = errors || [{\n title: 'Ajax Error',\n detail: message\n }];\n }\n\n AjaxError.prototype = Object.create(EmberError.prototype);\n\n function InvalidError(errors) {\n AjaxError.call(this, errors, 'Request was rejected because it was invalid');\n }\n\n InvalidError.prototype = Object.create(AjaxError.prototype);\n\n function UnauthorizedError(errors) {\n AjaxError.call(this, errors, 'Ajax authorization failed');\n }\n\n UnauthorizedError.prototype = Object.create(AjaxError.prototype);\n\n function ForbiddenError(errors) {\n AjaxError.call(this, errors, 'Request was rejected because user is not permitted to perform this operation.');\n }\n\n ForbiddenError.prototype = Object.create(AjaxError.prototype);\n});","define('ember-ajax/index', ['exports', 'ember-ajax/request'], function (exports, _emberAjaxRequest) {\n 'use strict';\n\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberAjaxRequest['default'];\n }\n });\n});","define('ember-ajax/make-promise', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports['default'] = makePromise;\n\n var run = _ember['default'].run;\n var RSVP = _ember['default'].RSVP;\n\n function makePromise(settings) {\n var type = settings.type || 'GET';\n return new RSVP.Promise(function (resolve, reject) {\n settings.success = makeSuccess(resolve);\n settings.error = makeError(reject);\n _ember['default'].$.ajax(settings);\n }, 'ember-ajax: ' + type + ' to ' + settings.url);\n }\n\n function makeSuccess(resolve) {\n return function success(response, textStatus, jqXHR) {\n run(null, resolve, {\n response: response,\n textStatus: textStatus,\n jqXHR: jqXHR\n });\n };\n }\n\n function makeError(reject) {\n return function error(jqXHR, textStatus, errorThrown) {\n run(null, reject, {\n jqXHR: jqXHR,\n textStatus: textStatus,\n errorThrown: errorThrown\n });\n };\n }\n});","define('ember-ajax/raw', ['exports', 'ember-ajax/make-promise', 'ember-ajax/utils/parse-args', 'ember'], function (exports, _emberAjaxMakePromise, _emberAjaxUtilsParseArgs, _ember) {\n 'use strict';\n\n var _slicedToArray = (function () {\n function sliceIterator(arr, i) {\n var _arr = [];var _n = true;var _d = false;var _e = undefined;try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;_e = err;\n } finally {\n try {\n if (!_n && _i['return']) _i['return']();\n } finally {\n if (_d) throw _e;\n }\n }return _arr;\n }return function (arr, i) {\n if (Array.isArray(arr)) {\n return arr;\n } else if (Symbol.iterator in Object(arr)) {\n return sliceIterator(arr, i);\n } else {\n throw new TypeError('Invalid attempt to destructure non-iterable instance');\n }\n };\n })();\n\n exports['default'] = raw;\n\n var deprecate = _ember['default'].deprecate;\n\n /*\n * Same as `request` except it resolves an object with `{response, textStatus,\n * jqXHR}`, useful if you need access to the jqXHR object for headers, etc.\n */\n function raw() {\n deprecate('ember-ajax/raw is deprecated and will be removed in ember-ajax@2.0.0', false, { id: 'ember-ajax.raw' });\n\n var _parseArgs$apply = _emberAjaxUtilsParseArgs['default'].apply(null, arguments);\n\n var _parseArgs$apply2 = _slicedToArray(_parseArgs$apply, 3);\n\n var url = _parseArgs$apply2[0];\n var type = _parseArgs$apply2[1];\n var settings = _parseArgs$apply2[2];\n\n if (!settings) {\n settings = {};\n }\n settings.url = url;\n settings.type = type;\n return (0, _emberAjaxMakePromise['default'])(settings);\n }\n});","define('ember-ajax/request', ['exports', 'ember-ajax/raw', 'ember'], function (exports, _emberAjaxRaw, _ember) {\n 'use strict';\n\n exports['default'] = request;\n\n var deprecate = _ember['default'].deprecate;\n\n /*\n * jQuery.ajax wrapper, supports the same signature except providing\n * `success` and `error` handlers will throw an error (use promises instead)\n * and it resolves only the response (no access to jqXHR or textStatus).\n */\n function request() {\n deprecate('ember-ajax/request is deprecated and will be removed in ember-ajax@2.0.0', false, { id: 'ember-ajax.raw' });\n return _emberAjaxRaw['default'].apply(undefined, arguments).then(function (result) {\n return result.response;\n }, null, 'ember-ajax: unwrap raw ajax response');\n }\n});","define('ember-ajax/services/ajax', ['exports', 'ember', 'ember-ajax/errors', 'ember-ajax/utils/parse-response-headers'], function (exports, _ember, _emberAjaxErrors, _emberAjaxUtilsParseResponseHeaders) {\n 'use strict';\n\n var deprecate = _ember['default'].deprecate;\n var get = _ember['default'].get;\n var isBlank = _ember['default'].isBlank;\n\n /**\n ### Headers customization\n \n Some APIs require HTTP headers, e.g. to provide an API key. Arbitrary\n headers can be set as key/value pairs on the `RESTAdapter`'s `headers`\n object and Ember Data will send them along with each ajax request.\n \n ```app/services/ajax\n import AjaxService from 'ember-ajax/services/ajax';\n \n export default AjaxService.extend({\n headers: {\n \"API_KEY\": \"secret key\",\n \"ANOTHER_HEADER\": \"Some header value\"\n }\n });\n ```\n \n `headers` can also be used as a computed property to support dynamic\n headers.\n \n ```app/services/ajax.js\n import Ember from 'ember';\n import AjaxService from 'ember-ajax/services/ajax';\n \n export default AjaxService.extend({\n session: Ember.inject.service(),\n headers: Ember.computed(\"session.authToken\", function() {\n return {\n \"API_KEY\": this.get(\"session.authToken\"),\n \"ANOTHER_HEADER\": \"Some header value\"\n };\n })\n });\n ```\n \n In some cases, your dynamic headers may require data from some\n object outside of Ember's observer system (for example\n `document.cookie`). You can use the\n [volatile](/api/classes/Ember.ComputedProperty.html#method_volatile)\n function to set the property into a non-cached mode causing the headers to\n be recomputed with every request.\n \n ```app/services/ajax.js\n import Ember from 'ember';\n import AjaxService from 'ember-ajax/services/ajax';\n \n export default AjaxService.extend({\n session: Ember.inject.service(),\n headers: Ember.computed(\"session.authToken\", function() {\n return {\n \"API_KEY\": Ember.get(document.cookie.match(/apiKey\\=([^;]*)/), \"1\"),\n \"ANOTHER_HEADER\": \"Some header value\"\n };\n }).volatile()\n });\n ```\n \n **/\n exports['default'] = _ember['default'].Service.extend({\n\n request: function request(url, options) {\n var _this = this;\n\n var opts;\n\n if (arguments.length > 2 || typeof options === 'string') {\n deprecate('ember-ajax/ajax#request calling request with `type` is deprecated and will be removed in ember-ajax@1.0.0. If you want to specify a type pass an object like {type: \\'DELETE\\'}', false, { id: 'ember-ajax.service.request' });\n\n if (arguments.length > 2) {\n opts = arguments[2];\n opts.type = options;\n } else {\n opts = { type: options };\n }\n } else {\n opts = options;\n }\n\n var hash = this.options(url, opts);\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n\n hash.success = function (payload, textStatus, jqXHR) {\n var response = _this.handleResponse(jqXHR.status, (0, _emberAjaxUtilsParseResponseHeaders['default'])(jqXHR.getAllResponseHeaders()), payload);\n\n if (response instanceof _emberAjaxErrors.AjaxError) {\n reject(response);\n } else {\n resolve(response);\n }\n };\n\n hash.error = function (jqXHR, textStatus, errorThrown) {\n var error = undefined;\n\n if (!(error instanceof Error)) {\n if (errorThrown instanceof Error) {\n error = errorThrown;\n } else {\n error = _this.handleResponse(jqXHR.status, (0, _emberAjaxUtilsParseResponseHeaders['default'])(jqXHR.getAllResponseHeaders()), _this.parseErrorResponse(jqXHR.responseText) || errorThrown);\n }\n }\n reject(error);\n };\n\n _ember['default'].$.ajax(hash);\n }, 'ember-ajax: ' + hash.type + ' to ' + url);\n },\n\n // calls `request()` but forces `options.type` to `POST`\n post: function post(url, options) {\n return this.request(url, this._addTypeToOptionsFor(options, 'POST'));\n },\n\n // calls `request()` but forces `options.type` to `PUT`\n put: function put(url, options) {\n return this.request(url, this._addTypeToOptionsFor(options, 'PUT'));\n },\n\n // calls `request()` but forces `options.type` to `PATCH`\n patch: function patch(url, options) {\n return this.request(url, this._addTypeToOptionsFor(options, 'PATCH'));\n },\n\n // calls `request()` but forces `options.type` to `DELETE`\n del: function del(url, options) {\n return this.request(url, this._addTypeToOptionsFor(options, 'DELETE'));\n },\n\n // forcibly manipulates the options hash to include the HTTP method on the type key\n _addTypeToOptionsFor: function _addTypeToOptionsFor(options, method) {\n options = options || {};\n options.type = method;\n return options;\n },\n\n /**\n @method options\n @private\n @param {String} url\n @param {Object} options\n @return {Object}\n */\n options: function options(url, _options) {\n var hash = _options || {};\n hash.url = this._buildURL(url);\n hash.type = hash.type || 'GET';\n hash.dataType = hash.dataType || 'json';\n hash.context = this;\n\n var headers = get(this, 'headers');\n if (headers !== undefined) {\n hash.beforeSend = function (xhr) {\n Object.keys(headers).forEach(function (key) {\n return xhr.setRequestHeader(key, headers[key]);\n });\n };\n }\n\n return hash;\n },\n\n _buildURL: function _buildURL(url) {\n var host = get(this, 'host');\n if (isBlank(host)) {\n return url;\n }\n var startsWith = String.prototype.startsWith || function (searchString, position) {\n position = position || 0;\n return this.indexOf(searchString, position) === position;\n };\n if (startsWith.call(url, '/')) {\n return '' + host + url;\n } else {\n return host + '/' + url;\n }\n },\n\n /**\n Takes an ajax response, and returns the json payload or an error.\n By default this hook just returns the json payload passed to it.\n You might want to override it in two cases:\n 1. Your API might return useful results in the response headers.\n Response headers are passed in as the second argument.\n 2. Your API might return errors as successful responses with status code\n 200 and an Errors text or object.\n @method handleResponse\n @param {Number} status\n @param {Object} headers\n @param {Object} payload\n @return {Object | DS.AdapterError} response\n */\n handleResponse: function handleResponse(status, headers, payload) {\n if (this.isSuccess(status, headers, payload)) {\n return payload;\n } else if (this.isUnauthorized(status, headers, payload)) {\n return new _emberAjaxErrors.UnauthorizedError(payload.errors);\n } else if (this.isForbidden(status, headers, payload)) {\n return new _emberAjaxErrors.ForbiddenError(payload.errors);\n } else if (this.isInvalid(status, headers, payload)) {\n return new _emberAjaxErrors.InvalidError(payload.errors);\n }\n\n var errors = this.normalizeErrorResponse(status, headers, payload);\n\n return new _emberAjaxErrors.AjaxError(errors);\n },\n\n /**\n Default `handleResponse` implementation uses this hook to decide if the\n response is a an authorized error.\n @method isUnauthorized\n @param {Number} status\n @param {Object} headers\n @param {Object} payload\n @return {Boolean}\n */\n isUnauthorized: function isUnauthorized(status /*, headers, payload */) {\n return status === 401;\n },\n\n /**\n Default `handleResponse` implementation uses this hook to decide if the\n response is a forbidden error.\n @method isForbidden\n @param {Number} status\n @param {Object} headers\n @param {Object} payload\n @return {Boolean}\n */\n isForbidden: function isForbidden(status /*, headers, payload */) {\n return status === 403;\n },\n\n /**\n Default `handleResponse` implementation uses this hook to decide if the\n response is a an invalid error.\n @method isInvalid\n @param {Number} status\n @param {Object} headers\n @param {Object} payload\n @return {Boolean}\n */\n isInvalid: function isInvalid(status /*, headers, payload */) {\n return status === 422;\n },\n\n /**\n Default `handleResponse` implementation uses this hook to decide if the\n response is a success.\n @method isSuccess\n @param {Number} status\n @param {Object} headers\n @param {Object} payload\n @return {Boolean}\n */\n isSuccess: function isSuccess(status /*, headers, payload */) {\n return status >= 200 && status < 300 || status === 304;\n },\n\n /**\n @method parseErrorResponse\n @private\n @param {String} responseText\n @return {Object}\n */\n parseErrorResponse: function parseErrorResponse(responseText) {\n var json = responseText;\n\n try {\n json = _ember['default'].$.parseJSON(responseText);\n } catch (e) {}\n\n return json;\n },\n\n /**\n @method normalizeErrorResponse\n @private\n @param {Number} status\n @param {Object} headers\n @param {Object} payload\n @return {Object} errors payload\n */\n normalizeErrorResponse: function normalizeErrorResponse(status, headers, payload) {\n if (payload && typeof payload === 'object' && payload.errors) {\n return payload.errors;\n } else {\n return [{\n status: '' + status,\n title: \"The backend responded with an error\",\n detail: '' + payload\n }];\n }\n }\n });\n});","define(\"ember-ajax/utils/parse-args\", [\"exports\"], function (exports) {\n \"use strict\";\n\n var _slicedToArray = (function () {\n function sliceIterator(arr, i) {\n var _arr = [];var _n = true;var _d = false;var _e = undefined;try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;_e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"]) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }return _arr;\n }return function (arr, i) {\n if (Array.isArray(arr)) {\n return arr;\n } else if (Symbol.iterator in Object(arr)) {\n return sliceIterator(arr, i);\n } else {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n }\n };\n })();\n\n exports[\"default\"] = parseArgs;\n\n function parseArgs() {\n var args = [].slice.apply(arguments);\n if (args.length === 1) {\n if (typeof args[0] === \"string\") {\n var _args = _slicedToArray(args, 1);\n\n var url = _args[0];\n\n return [url];\n } else {\n var _args2 = _slicedToArray(args, 1);\n\n var options = _args2[0];\n var url = options.url;\n\n delete options.url;\n var type = options.type || options.method;\n delete options.type;\n delete options.method;\n return [url, type, options];\n }\n }\n if (args.length === 2) {\n var _args3 = _slicedToArray(args, 1);\n\n var url = _args3[0];\n\n if (typeof args[1] === 'object') {\n var options = args[1];\n var type = options.type || options.method;\n delete options.type;\n delete options.method;\n return [url, type, options];\n } else {\n var type = args[1];\n return [url, type];\n }\n }\n return args;\n }\n});","define('ember-ajax/utils/parse-response-headers', ['exports'], function (exports) {\n 'use strict';\n\n exports['default'] = parseResponseHeaders;\n\n function parseResponseHeaders(headerStr) {\n var headers = Object.create(null);\n if (!headerStr) {\n return headers;\n }\n\n var headerPairs = headerStr.split('\\r\\n');\n for (var i = 0; i < headerPairs.length; i++) {\n var headerPair = headerPairs[i];\n // Can't use split() here because it does the wrong thing\n // if the header value has the string \": \" in it.\n var index = headerPair.indexOf(': ');\n if (index > 0) {\n var key = headerPair.substring(0, index);\n var val = headerPair.substring(index + 2);\n headers[key] = val;\n }\n }\n\n return headers;\n }\n});","define('ember-basic-dropdown/components/basic-dropdown', ['exports', 'ember', 'ember-basic-dropdown/templates/components/basic-dropdown', 'ember-getowner-polyfill'], function (exports, _ember, _emberBasicDropdownTemplatesComponentsBasicDropdown, _emberGetownerPolyfill) {\n 'use strict';\n\n var Component = _ember['default'].Component;\n var run = _ember['default'].run;\n var computed = _ember['default'].computed;\n\n var MutObserver = window.MutationObserver || window.WebKitMutationObserver;\n\n exports['default'] = Component.extend({\n layout: _emberBasicDropdownTemplatesComponentsBasicDropdown['default'],\n disabled: false,\n renderInPlace: false,\n dropdownPosition: 'auto', // auto | above | below\n classNames: ['ember-basic-dropdown'],\n attributeBindings: ['dir'],\n classNameBindings: ['publicAPI.isOpen:ember-basic-dropdown--opened', 'disabled:ember-basic-dropdown--disabled', 'renderInPlace:ember-basic-dropdown--in-place', '_dropdownPositionClass'],\n _wormholeDestination: _ember['default'].testing ? 'ember-testing' : 'ember-basic-dropdown-wormhole',\n\n // Lifecycle hooks\n init: function init() {\n this._super.apply(this, arguments);\n var rootSelector = _ember['default'].testing ? '#ember-testing' : (0, _emberGetownerPolyfill['default'])(this).lookup('application:main').rootElement;\n this.appRoot = document.querySelector(rootSelector);\n this.handleRootMouseDown = this.handleRootMouseDown.bind(this);\n this.handleRepositioningEvent = this.handleRepositioningEvent.bind(this);\n this.repositionDropdown = this.repositionDropdown.bind(this);\n },\n\n didInitAttrs: function didInitAttrs() {\n this._super.apply(this, arguments);\n var registerActionsInParent = this.get('registerActionsInParent');\n if (registerActionsInParent) {\n registerActionsInParent(this.get('publicAPI'));\n }\n },\n\n willDestroy: function willDestroy() {\n this._super.apply(this, arguments);\n this.removeGlobalEvents();\n },\n\n // CPs\n tabIndex: computed('disabled', function () {\n return !this.get('disabled') ? this.get('tabindex') || '0' : \"-1\";\n }),\n\n publicAPI: computed(function () {\n return {\n isOpen: false,\n actions: {\n open: this.open.bind(this),\n close: this.close.bind(this),\n toggle: this.toggle.bind(this)\n }\n };\n }),\n\n opened: computed('publicAPI.isOpen', {\n get: function get() {\n return this.get('publicAPI.isOpen');\n },\n set: function set(_, newOpened) {\n var oldOpened = this.get('publicAPI.isOpen');\n if (!oldOpened && newOpened) {\n this.open();\n } else if (oldOpened && !newOpened) {\n this.close();\n }\n return this.get('publicAPI.isOpen');\n }\n }),\n\n // Actions\n actions: {\n toggle: function toggle(e) {\n this.toggle(e);\n },\n\n keydown: function keydown(e) {\n this.handleKeydown(e);\n },\n\n focusTrigger: function focusTrigger(e) {\n var onFocus = this.get('onFocus');\n if (onFocus) {\n onFocus(this.get('publicAPI'), e);\n }\n }\n },\n\n // Methods\n toggle: function toggle(e) {\n if (this.get('publicAPI.isOpen')) {\n this.close(e);\n } else {\n this.open(e);\n }\n },\n\n open: function open(e) {\n if (this.get('disabled') || this.get('publicAPI.isOpen')) {\n return;\n }\n if (e) {\n e.preventDefault();\n }\n this.set('publicAPI.isOpen', true);\n this.addGlobalEventsTimer = run.scheduleOnce('afterRender', this, this.addGlobalEvents);\n this.repositionDropdownTimer = run.scheduleOnce('afterRender', this, this.repositionDropdown);\n var onOpen = this.get('onOpen');\n if (onOpen) {\n onOpen(this.get('publicAPI'), e);\n }\n },\n\n close: function close(e, skipFocus) {\n if (!this.get('publicAPI.isOpen')) {\n return;\n }\n this.set('publicAPI.isOpen', false);\n this.set('_dropdownPositionClass', null);\n run.cancel(this.addGlobalEventsTimer);\n run.cancel(this.repositionDropdownTimer);\n this.addGlobalEventsTimer = this.repositionDropdownTimer = null;\n this.removeGlobalEvents();\n var onClose = this.get('onClose');\n if (onClose) {\n onClose(this.get('publicAPI'), e);\n }\n if (skipFocus) {\n return;\n }\n var trigger = this.element.querySelector('.ember-basic-dropdown-trigger');\n if (trigger.tabIndex > -1) {\n trigger.focus();\n }\n },\n\n handleKeydown: function handleKeydown(e) {\n if (this.get('disabled')) {\n return;\n }\n var onKeydown = this.get('onKeydown');\n if (onKeydown) {\n onKeydown(this.get('publicAPI'), e);\n }\n if (e.defaultPrevented) {\n return;\n }\n if (e.keyCode === 13) {\n // Enter\n this.toggle(e);\n } else if (e.keyCode === 27) {\n this.close(e);\n }\n },\n\n repositionDropdown: function repositionDropdown() {\n run(this, this._runloopAwareRepositionDropdown);\n },\n\n handleRootMouseDown: function handleRootMouseDown(e) {\n if (!this.element.contains(e.target) && !this.appRoot.querySelector('.ember-basic-dropdown-content').contains(e.target)) {\n this.close(e, true);\n }\n },\n\n handleRepositioningEvent: function handleRepositioningEvent() /* e */{\n run.throttle(this, 'repositionDropdown', 60, true);\n },\n\n addGlobalEvents: function addGlobalEvents() {\n var _this = this;\n\n this.appRoot.addEventListener('mousedown', this.handleRootMouseDown, true);\n window.addEventListener('scroll', this.handleRepositioningEvent);\n window.addEventListener('resize', this.handleRepositioningEvent);\n window.addEventListener('orientationchange', this.handleRepositioningEvent);\n if (MutObserver) {\n this.mutationObserver = new MutObserver(function (mutations) {\n if (mutations[0].addedNodes.length || mutations[0].removedNodes.length) {\n _this.repositionDropdown();\n }\n });\n run.schedule('afterRender', this, function () {\n var dropdown = this.appRoot.querySelector('.ember-basic-dropdown-content');\n if (!dropdown) {\n return;\n }\n this.mutationObserver.observe(dropdown, { childList: true, subtree: true });\n });\n } else {\n run.schedule('afterRender', this, function () {\n var dropdown = this.appRoot.querySelector('.ember-basic-dropdown-content');\n dropdown.addEventListener('DOMNodeInserted', this.repositionDropdown, false);\n dropdown.addEventListener('DOMNodeRemoved', this.repositionDropdown, false);\n });\n }\n },\n\n removeGlobalEvents: function removeGlobalEvents() {\n this.appRoot.removeEventListener('mousedown', this.handleRootMouseDown, true);\n window.removeEventListener('scroll', this.handleRepositioningEvent);\n window.removeEventListener('resize', this.handleRepositioningEvent);\n window.removeEventListener('orientationchange', this.handleRepositioningEvent);\n if (MutObserver) {\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = null;\n }\n } else {\n var dropdown = this.appRoot.querySelector('.ember-basic-dropdown-content');\n dropdown.removeEventListener('DOMNodeInserted', this.repositionDropdown);\n dropdown.removeEventListener('DOMNodeRemoved', this.repositionDropdown);\n }\n },\n\n _runloopAwareRepositionDropdown: function _runloopAwareRepositionDropdown() {\n if (this.get('renderInPlace') || !this.get('publicAPI.isOpen')) {\n return;\n }\n var dropdownPositionStrategy = this.get('dropdownPosition');\n var dropdown = this.appRoot.querySelector('.ember-basic-dropdown-content');\n var trigger = this.element.querySelector('.ember-basic-dropdown-trigger');\n\n var _trigger$getBoundingClientRect = trigger.getBoundingClientRect();\n\n var left = _trigger$getBoundingClientRect.left;\n var topWithoutScroll = _trigger$getBoundingClientRect.top;\n var width = _trigger$getBoundingClientRect.width;\n var height = _trigger$getBoundingClientRect.height;\n\n var viewportTop = _ember['default'].$(window).scrollTop();\n var top = topWithoutScroll + viewportTop;\n if (this.get('matchTriggerWidth')) {\n dropdown.style.width = width + 'px';\n }\n if (dropdownPositionStrategy === 'above') {\n top = top - dropdown.getBoundingClientRect().height;\n this.set('_dropdownPositionClass', 'ember-basic-dropdown--above');\n } else if (dropdownPositionStrategy === 'below') {\n top = top + height;\n this.set('_dropdownPositionClass', 'ember-basic-dropdown--below');\n } else {\n // auto\n var viewportBottom = window.scrollY + window.innerHeight;\n var dropdownHeight = dropdown.getBoundingClientRect().height;\n var enoughRoomBelow = top + height + dropdownHeight < viewportBottom;\n var enoughRoomAbove = topWithoutScroll > dropdownHeight;\n var positionClass = this.get('_dropdownPositionClass');\n if (positionClass === 'ember-basic-dropdown--below' && !enoughRoomBelow && enoughRoomAbove) {\n this.set('_dropdownPositionClass', 'ember-basic-dropdown--above');\n } else if (positionClass === 'ember-basic-dropdown--above' && !enoughRoomAbove && enoughRoomBelow) {\n this.set('_dropdownPositionClass', 'ember-basic-dropdown--below');\n } else if (!positionClass) {\n this.set('_dropdownPositionClass', enoughRoomBelow ? 'ember-basic-dropdown--below' : 'ember-basic-dropdown--above');\n }\n positionClass = this.get('_dropdownPositionClass'); // It might have changed\n top = top + (positionClass === 'ember-basic-dropdown--below' ? height : -dropdownHeight);\n }\n dropdown.style.top = top + 'px';\n dropdown.style.left = left + 'px';\n }\n });\n});","define(\"ember-basic-dropdown/templates/components/basic-dropdown\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 5,\n \"column\": 2\n },\n \"end\": {\n \"line\": 9,\n \"column\": 2\n }\n },\n \"moduleName\": \"modules/ember-basic-dropdown/templates/components/basic-dropdown.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(3);\n morphs[0] = dom.createAttrMorph(element0, 'class');\n morphs[1] = dom.createAttrMorph(element0, 'dir');\n morphs[2] = dom.createMorphAt(element0, 1, 1);\n return morphs;\n },\n statements: [[\"attribute\", \"class\", [\"concat\", [\"ember-basic-dropdown-content \", [\"get\", \"dropdownClass\", [\"loc\", [null, [6, 47], [6, 60]]]], \" \", [\"get\", \"_dropdownPositionClass\", [\"loc\", [null, [6, 65], [6, 87]]]]]]], [\"attribute\", \"dir\", [\"get\", \"dir\", [\"loc\", [null, [6, 97], [6, 100]]]]], [\"inline\", \"yield\", [[\"get\", \"publicAPI\", [\"loc\", [null, [7, 14], [7, 23]]]]], [], [\"loc\", [null, [7, 6], [7, 25]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 4,\n \"column\": 0\n },\n \"end\": {\n \"line\": 10,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-basic-dropdown/templates/components/basic-dropdown.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"ember-wormhole\", [], [\"to\", [\"subexpr\", \"@mut\", [[\"get\", \"_wormholeDestination\", [\"loc\", [null, [5, 23], [5, 43]]]]], [], []], \"renderInPlace\", [\"subexpr\", \"@mut\", [[\"get\", \"renderInPlace\", [\"loc\", [null, [5, 58], [5, 71]]]]], [], []]], 0, null, [\"loc\", [null, [5, 2], [9, 21]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"multiple-nodes\", \"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 10,\n \"column\": 7\n }\n },\n \"moduleName\": \"modules/ember-basic-dropdown/templates/components/basic-dropdown.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createElement(\"div\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element1 = dom.childAt(fragment, [0]);\n var morphs = new Array(7);\n morphs[0] = dom.createAttrMorph(element1, 'class');\n morphs[1] = dom.createAttrMorph(element1, 'tabindex');\n morphs[2] = dom.createAttrMorph(element1, 'onkeydown');\n morphs[3] = dom.createAttrMorph(element1, 'onmousedown');\n morphs[4] = dom.createAttrMorph(element1, 'onfocus');\n morphs[5] = dom.createMorphAt(element1, 1, 1);\n morphs[6] = dom.createMorphAt(fragment, 2, 2, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"attribute\", \"class\", [\"concat\", [\"ember-basic-dropdown-trigger \", [\"get\", \"triggerClass\", [\"loc\", [null, [1, 43], [1, 55]]]]]]], [\"attribute\", \"tabindex\", [\"get\", \"tabIndex\", [\"loc\", [null, [1, 70], [1, 78]]]]], [\"attribute\", \"onkeydown\", [\"subexpr\", \"action\", [\"keydown\"], [], [\"loc\", [null, [1, 91], [1, 111]]]]], [\"attribute\", \"onmousedown\", [\"subexpr\", \"action\", [\"toggle\"], [], [\"loc\", [null, [1, 124], [1, 143]]]]], [\"attribute\", \"onfocus\", [\"subexpr\", \"action\", [\"focusTrigger\"], [], [\"loc\", [null, [1, 152], [1, 177]]]]], [\"inline\", \"yield\", [], [\"to\", \"inverse\"], [\"loc\", [null, [2, 2], [2, 24]]]], [\"block\", \"if\", [[\"get\", \"opened\", [\"loc\", [null, [4, 6], [4, 12]]]]], [], 0, null, [\"loc\", [null, [4, 0], [10, 7]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define('ember-cli-app-version/components/app-version', ['exports', 'ember', 'ember-cli-app-version/templates/app-version'], function (exports, _ember, _emberCliAppVersionTemplatesAppVersion) {\n 'use strict';\n\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'span',\n layout: _emberCliAppVersionTemplatesAppVersion['default']\n });\n});","define('ember-cli-app-version/initializer-factory', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports['default'] = initializerFactory;\n\n var classify = _ember['default'].String.classify;\n\n function initializerFactory(name, version) {\n var registered = false;\n\n return function () {\n if (!registered && name && version) {\n var appName = classify(name);\n _ember['default'].libraries.register(appName, version);\n registered = true;\n }\n };\n }\n});","define(\"ember-cli-app-version/templates/app-version\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 2,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-cli-app-version/templates/app-version.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"content\", \"version\", [\"loc\", [null, [1, 0], [1, 11]]]]],\n locals: [],\n templates: []\n };\n })());\n});","define('ember-content-editable/components/content-editable', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports['default'] = _ember['default'].Component.extend({\n classNames: ['ember-content-editable'],\n classNameBindings: ['extraClass'],\n attributeBindings: ['contenteditable', 'placeholder', 'spellcheck', 'tabindex', 'readonly', 'disabled'],\n contenteditable: _ember['default'].computed('editable', 'disabled', function () {\n if (this.get('editable') !== null) {\n if (this.get('editable')) {\n _ember['default'].deprecate(\"You set editable=true on content-editable, \" + \"but this has been deprecated in favour of disabled=false\");\n } else {\n _ember['default'].deprecate(\"You set editable=false on content-editable, \" + \"but this has been deprecated in favour of disabled=true\");\n }\n return this.get('editable');\n } else {\n return !this.get('disabled');\n }\n }),\n editable: null,\n disabled: null,\n spellcheck: null,\n isText: null,\n type: null,\n readonly: null,\n allowNewlines: true,\n\n inputType: _ember['default'].computed('type', 'isText', function () {\n if (this.get('isText') !== null) {\n if (this.get('isText')) {\n _ember['default'].deprecate(\"You set isText=true on content-editable, \" + \"but this has been deprecated in favour of type='text'\");\n return \"text\";\n } else {\n _ember['default'].deprecate(\"You set isText=false on content-editable, \" + \"but this has been deprecated in favour of type='html'\");\n return \"html\";\n }\n } else {\n return this.get('type') || \"html\";\n }\n }),\n\n setup: _ember['default'].on('didInsertElement', function () {\n var _this2 = this;\n\n this.setValue();\n _ember['default'].run.once(function () {\n return _this2._processInput();\n });\n\n this.$().on('paste', function (event) {\n _this2.handlePaste(event, _this2);\n });\n }),\n\n tidy: _ember['default'].on('willDestroyElement', function () {\n this.$().off('paste');\n }),\n\n _observeValue: true,\n valueChanged: _ember['default'].observer('value', function () {\n if (this.get('_observeValue')) {\n this.setValue();\n }\n }),\n\n setValue: function setValue() {\n if (this.element) {\n this.$().text(this.get('value'));\n }\n },\n\n stringInterpolator: function stringInterpolator(s) {\n return s;\n },\n\n _getInputValue: function _getInputValue() {\n if (this.get('inputType') === \"html\") {\n // Deocde html entities\n var val = this.$().html();\n val = this.$('
').html(val).text();\n return val;\n } else {\n return this.element.innerText || this.element.textContent;\n }\n },\n\n _processInput: function _processInput() {\n var val = this._getInputValue();\n val = this.stringInterpolator(val);\n val = this.htmlSafe(val);\n\n this.set('_observeValue', false);\n this.set('value', val);\n this.set('_observeValue', true);\n },\n\n htmlSafe: function htmlSafe(val) {\n if (this.get('inputType') === \"html\") {\n return _ember['default'].String.htmlSafe(val).toString();\n } else {\n return val;\n }\n },\n\n isUnderMaxLength: function isUnderMaxLength(val) {\n return _ember['default'].isEmpty(this.get('maxlength')) || val.length < this.get('maxlength');\n },\n\n updateValue: _ember['default'].on('keyUp', function (event) {\n this._processInput();\n this.handleKeyUp(event);\n }),\n\n handleKeyUp: function handleKeyUp(event) {\n if (this.get('readonly')) {\n event.preventDefault();\n return false;\n }\n\n this.sendAction('key-up', this.get('value'), event);\n },\n\n /* Events */\n handlePaste: function handlePaste(event, _this) {\n var content = event.originalEvent.clipboardData.getData('text');\n var currentVal = _this._getInputValue();\n\n if (!_ember['default'].isEmpty(_this.get('maxlength'))) {\n event.preventDefault();\n\n if (window.getSelection().rangeCount > 0) {\n var start = window.getSelection().getRangeAt(0).startOffset;\n var end = window.getSelection().getRangeAt(0).endOffset;\n\n var freeSpace = _this.get('maxlength') - currentVal.length + (end - start);\n content = content.substring(0, freeSpace);\n\n var newVal = currentVal.substring(0, start) + content + currentVal.substring(end, _this.get('maxlength'));\n _this.set('value', newVal);\n\n var range = document.createRange();\n range.setStart(_this.element.childNodes[0], start + freeSpace);\n var sel = window.getSelection();\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n\n var value = this.get('value');\n this.set('_observeValue', false);\n\n if (!this.get('allowNewlines')) {\n value = value.toString().replace(/\\n/g, ' ');\n }\n\n if (this.get('type') === 'number') {\n value = value.toString().replace(/[^0-9]/g, '');\n }\n\n this.set('value', value);\n this.set('_observeValue', true);\n },\n\n keyDown: function keyDown(event) {\n if (this.get('readonly')) {\n event.preventDefault();\n return false;\n }\n\n if (event.keyCode === 27) {\n // Escape\n this.sendAction('escape-press', this, event);\n } else if (event.keyCode === 13) {\n // Enter\n this.sendAction('enter', this, event);\n if (this.get('allowNewlines')) {\n this.sendAction('insert-newline', this, event);\n } else {\n event.preventDefault();\n return false;\n }\n }\n\n this.sendAction('key-down', this.get('value'), event);\n },\n\n keyPress: function keyPress(event) {\n if (this.get('readonly')) {\n event.preventDefault();\n return false;\n }\n\n var val = this._getInputValue();\n if (!this.isUnderMaxLength(val)) {\n // Check if text is selected (typing will replace)\n if (window.getSelection().rangeCount > 0) {\n var start = window.getSelection().getRangeAt(0).startOffset;\n var end = window.getSelection().getRangeAt(0).endOffset;\n if (start === end) {\n event.preventDefault();\n }\n } else {\n event.preventDefault();\n }\n }\n\n if (this.get('type') === 'number') {\n var key = event.which || event.keyCode;\n if (key < 48 || key >= 58) {\n event.preventDefault();\n return false;\n }\n }\n\n this.sendAction('key-press', this, event);\n },\n\n focusIn: function focusIn(event) {\n this.sendAction('focus-in', this, event);\n },\n\n focusOut: function focusOut(event) {\n this.sendAction('focus-out', this, event);\n },\n\n mouseEnter: function mouseEnter(event) {\n this.sendAction('mouse-enter', this, event);\n },\n\n mouseLeave: function mouseLeave(event) {\n this.sendAction('mouse-leave', this, event);\n }\n });\n});","define(\"ember-data/-private/adapters\", [\"exports\", \"ember-data/adapters/json-api\", \"ember-data/adapters/rest\"], function (exports, _emberDataAdaptersJsonApi, _emberDataAdaptersRest) {\n /**\n @module ember-data\n */\n\n \"use strict\";\n\n exports.JSONAPIAdapter = _emberDataAdaptersJsonApi[\"default\"];\n exports.RESTAdapter = _emberDataAdaptersRest[\"default\"];\n});","define('ember-data/-private/adapters/build-url-mixin', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n var get = _ember['default'].get;\n\n /**\n \n WARNING: This interface is likely to change in order to accomodate https://github.com/emberjs/rfcs/pull/4\n \n ## Using BuildURLMixin\n \n To use url building, include the mixin when extending an adapter, and call `buildURL` where needed.\n The default behaviour is designed for RESTAdapter.\n \n ### Example\n \n ```javascript\n export default DS.Adapter.extend(BuildURLMixin, {\n findRecord: function(store, type, id, snapshot) {\n var url = this.buildURL(type.modelName, id, snapshot, 'findRecord');\n return this.ajax(url, 'GET');\n }\n });\n ```\n \n ### Attributes\n \n The `host` and `namespace` attributes will be used if defined, and are optional.\n \n @class BuildURLMixin\n @namespace DS\n */\n exports['default'] = _ember['default'].Mixin.create({\n /**\n Builds a URL for a given type and optional ID.\n By default, it pluralizes the type's name (for example, 'post'\n becomes 'posts' and 'person' becomes 'people'). To override the\n pluralization see [pathForType](#method_pathForType).\n If an ID is specified, it adds the ID to the path generated\n for the type, separated by a `/`.\n When called by RESTAdapter.findMany() the `id` and `snapshot` parameters\n will be arrays of ids and snapshots.\n @method buildURL\n @param {String} modelName\n @param {(String|Array|Object)} id single id or array of ids or query\n @param {(DS.Snapshot|Array)} snapshot single snapshot or array of snapshots\n @param {String} requestType\n @param {Object} query object of query parameters to send for query requests.\n @return {String} url\n */\n buildURL: function buildURL(modelName, id, snapshot, requestType, query) {\n switch (requestType) {\n case 'findRecord':\n return this.urlForFindRecord(id, modelName, snapshot);\n case 'findAll':\n return this.urlForFindAll(modelName, snapshot);\n case 'query':\n return this.urlForQuery(query, modelName);\n case 'queryRecord':\n return this.urlForQueryRecord(query, modelName);\n case 'findMany':\n return this.urlForFindMany(id, modelName, snapshot);\n case 'findHasMany':\n return this.urlForFindHasMany(id, modelName, snapshot);\n case 'findBelongsTo':\n return this.urlForFindBelongsTo(id, modelName, snapshot);\n case 'createRecord':\n return this.urlForCreateRecord(modelName, snapshot);\n case 'updateRecord':\n return this.urlForUpdateRecord(id, modelName, snapshot);\n case 'deleteRecord':\n return this.urlForDeleteRecord(id, modelName, snapshot);\n default:\n return this._buildURL(modelName, id);\n }\n },\n\n /**\n @method _buildURL\n @private\n @param {String} modelName\n @param {String} id\n @return {String} url\n */\n _buildURL: function _buildURL(modelName, id) {\n var url = [];\n var host = get(this, 'host');\n var prefix = this.urlPrefix();\n var path;\n\n if (modelName) {\n path = this.pathForType(modelName);\n if (path) {\n url.push(path);\n }\n }\n\n if (id) {\n url.push(encodeURIComponent(id));\n }\n if (prefix) {\n url.unshift(prefix);\n }\n\n url = url.join('/');\n if (!host && url && url.charAt(0) !== '/') {\n url = '/' + url;\n }\n\n return url;\n },\n\n /**\n * @method urlForFindRecord\n * @param {String} id\n * @param {String} modelName\n * @param {DS.Snapshot} snapshot\n * @return {String} url\n */\n urlForFindRecord: function urlForFindRecord(id, modelName, snapshot) {\n return this._buildURL(modelName, id);\n },\n\n /**\n * @method urlForFindAll\n * @param {String} modelName\n * @param {DS.SnapshotRecordArray} snapshot\n * @return {String} url\n */\n urlForFindAll: function urlForFindAll(modelName, snapshot) {\n return this._buildURL(modelName);\n },\n\n /**\n * @method urlForQuery\n * @param {Object} query\n * @param {String} modelName\n * @return {String} url\n */\n urlForQuery: function urlForQuery(query, modelName) {\n return this._buildURL(modelName);\n },\n\n /**\n * @method urlForQueryRecord\n * @param {Object} query\n * @param {String} modelName\n * @return {String} url\n */\n urlForQueryRecord: function urlForQueryRecord(query, modelName) {\n return this._buildURL(modelName);\n },\n\n /**\n * @method urlForFindMany\n * @param {Array} ids\n * @param {String} modelName\n * @param {Array} snapshots\n * @return {String} url\n */\n urlForFindMany: function urlForFindMany(ids, modelName, snapshots) {\n return this._buildURL(modelName);\n },\n\n /**\n * @method urlForFindHasMany\n * @param {String} id\n * @param {String} modelName\n * @param {DS.Snapshot} snapshot\n * @return {String} url\n */\n urlForFindHasMany: function urlForFindHasMany(id, modelName, snapshot) {\n return this._buildURL(modelName, id);\n },\n\n /**\n * @method urlForFindBelongsTo\n * @param {String} id\n * @param {String} modelName\n * @param {DS.Snapshot} snapshot\n * @return {String} url\n */\n urlForFindBelongsTo: function urlForFindBelongsTo(id, modelName, snapshot) {\n return this._buildURL(modelName, id);\n },\n\n /**\n * @method urlForCreateRecord\n * @param {String} modelName\n * @param {DS.Snapshot} snapshot\n * @return {String} url\n */\n urlForCreateRecord: function urlForCreateRecord(modelName, snapshot) {\n return this._buildURL(modelName);\n },\n\n /**\n * @method urlForUpdateRecord\n * @param {String} id\n * @param {String} modelName\n * @param {DS.Snapshot} snapshot\n * @return {String} url\n */\n urlForUpdateRecord: function urlForUpdateRecord(id, modelName, snapshot) {\n return this._buildURL(modelName, id);\n },\n\n /**\n * @method urlForDeleteRecord\n * @param {String} id\n * @param {String} modelName\n * @param {DS.Snapshot} snapshot\n * @return {String} url\n */\n urlForDeleteRecord: function urlForDeleteRecord(id, modelName, snapshot) {\n return this._buildURL(modelName, id);\n },\n\n /**\n @method urlPrefix\n @private\n @param {String} path\n @param {String} parentURL\n @return {String} urlPrefix\n */\n urlPrefix: function urlPrefix(path, parentURL) {\n var host = get(this, 'host');\n var namespace = get(this, 'namespace');\n\n if (!host || host === '/') {\n host = '';\n }\n\n if (path) {\n // Protocol relative url\n if (/^\\/\\//.test(path) || /http(s)?:\\/\\//.test(path)) {\n // Do nothing, the full host is already included.\n return path;\n\n // Absolute path\n } else if (path.charAt(0) === '/') {\n return '' + host + path;\n // Relative path\n } else {\n return parentURL + '/' + path;\n }\n }\n\n // No path provided\n var url = [];\n if (host) {\n url.push(host);\n }\n if (namespace) {\n url.push(namespace);\n }\n return url.join('/');\n },\n\n /**\n Determines the pathname for a given type.\n By default, it pluralizes the type's name (for example,\n 'post' becomes 'posts' and 'person' becomes 'people').\n ### Pathname customization\n For example if you have an object LineItem with an\n endpoint of \"/line_items/\".\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.RESTAdapter.extend({\n pathForType: function(modelName) {\n var decamelized = Ember.String.decamelize(modelName);\n return Ember.String.pluralize(decamelized);\n }\n });\n ```\n @method pathForType\n @param {String} modelName\n @return {String} path\n **/\n pathForType: function pathForType(modelName) {\n var camelized = _ember['default'].String.camelize(modelName);\n return _ember['default'].String.pluralize(camelized);\n }\n });\n});","define('ember-data/-private/core', ['exports', 'ember', 'ember-data/version'], function (exports, _ember, _emberDataVersion) {\n 'use strict';\n\n /**\n @module ember-data\n */\n\n /**\n All Ember Data classes, methods and functions are defined inside of this namespace.\n \n @class DS\n @static\n */\n\n /**\n @property VERSION\n @type String\n @static\n */\n var DS = _ember['default'].Namespace.create({\n VERSION: _emberDataVersion['default'],\n name: \"DS\"\n });\n\n if (_ember['default'].libraries) {\n _ember['default'].libraries.registerCoreLibrary('Ember Data', DS.VERSION);\n }\n\n exports['default'] = DS;\n});","define('ember-data/-private/debug', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports.assert = assert;\n exports.debug = debug;\n exports.deprecate = deprecate;\n exports.info = info;\n exports.runInDebug = runInDebug;\n exports.warn = warn;\n exports.debugSeal = debugSeal;\n exports.assertPolymorphicType = assertPolymorphicType;\n\n function assert() {\n return _ember['default'].assert.apply(_ember['default'], arguments);\n }\n\n function debug() {\n return _ember['default'].debug.apply(_ember['default'], arguments);\n }\n\n function deprecate() {\n return _ember['default'].deprecate.apply(_ember['default'], arguments);\n }\n\n function info() {\n return _ember['default'].info.apply(_ember['default'], arguments);\n }\n\n function runInDebug() {\n return _ember['default'].runInDebug.apply(_ember['default'], arguments);\n }\n\n function warn() {\n return _ember['default'].warn.apply(_ember['default'], arguments);\n }\n\n function debugSeal() {\n return _ember['default'].debugSeal.apply(_ember['default'], arguments);\n }\n\n function checkPolymorphic(typeClass, addedRecord) {\n if (typeClass.__isMixin) {\n //TODO Need to do this in order to support mixins, should convert to public api\n //once it exists in Ember\n return typeClass.__mixin.detect(addedRecord.type.PrototypeMixin);\n }\n if (_ember['default'].MODEL_FACTORY_INJECTIONS) {\n typeClass = typeClass.superclass;\n }\n return typeClass.detect(addedRecord.type);\n }\n\n /*\n Assert that `addedRecord` has a valid type so it can be added to the\n relationship of the `record`.\n \n The assert basically checks if the `addedRecord` can be added to the\n relationship (specified via `relationshipMeta`) of the `record`.\n \n This utility should only be used internally, as both record parameters must\n be an InternalModel and the `relationshipMeta` needs to be the meta\n information about the relationship, retrieved via\n `record.relationshipFor(key)`.\n \n @method assertPolymorphicType\n @param {InternalModel} record\n @param {RelationshipMeta} relationshipMeta retrieved via\n `record.relationshipFor(key)`\n @param {InternalModel} addedRecord record which\n should be added/set for the relationship\n */\n\n function assertPolymorphicType(record, relationshipMeta, addedRecord) {\n var addedType = addedRecord.type.modelName;\n var recordType = record.type.modelName;\n var key = relationshipMeta.key;\n var typeClass = record.store.modelFor(relationshipMeta.type);\n\n var assertionMessage = 'You cannot add a record of type \\'' + addedType + '\\' to the \\'' + recordType + '.' + key + '\\' relationship (only \\'' + typeClass.modelName + '\\' allowed)';\n\n assert(assertionMessage, checkPolymorphic(typeClass, addedRecord));\n }\n});","define('ember-data/-private/ext/date', ['exports', 'ember', 'ember-data/-private/debug'], function (exports, _ember, _emberDataPrivateDebug) {\n /**\n @module ember-data\n */\n\n 'use strict';\n\n /**\n Date.parse with progressive enhancement for ISO 8601 \n \n © 2011 Colin Snover \n \n Released under MIT license.\n \n @class Date\n @namespace Ember\n @static\n @deprecated\n */\n _ember['default'].Date = _ember['default'].Date || {};\n\n var origParse = Date.parse;\n var numericKeys = [1, 4, 5, 6, 7, 10, 11];\n\n var parseDate = function parseDate(date) {\n var timestamp, struct;\n var minutesOffset = 0;\n\n // ES5 §15.9.4.2 states that the string should attempt to be parsed as a Date Time String Format string\n // before falling back to any implementation-specific date parsing, so that’s what we do, even if native\n // implementations could be faster\n // 1 YYYY 2 MM 3 DD 4 HH 5 mm 6 ss 7 msec 8 Z 9 ± 10 tzHH 11 tzmm\n if (struct = /^(\\d{4}|[+\\-]\\d{6})(?:-(\\d{2})(?:-(\\d{2}))?)?(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{3}))?)?(?:(Z)|([+\\-])(\\d{2})(?:(\\d{2}))?)?)?$/.exec(date)) {\n // avoid NaN timestamps caused by “undefined” values being passed to Date.UTC\n for (var i = 0, k; k = numericKeys[i]; ++i) {\n struct[k] = +struct[k] || 0;\n }\n\n // allow undefined days and months\n struct[2] = (+struct[2] || 1) - 1;\n struct[3] = +struct[3] || 1;\n\n if (struct[8] !== 'Z' && struct[9] !== undefined) {\n minutesOffset = struct[10] * 60 + struct[11];\n\n if (struct[9] === '+') {\n minutesOffset = 0 - minutesOffset;\n }\n }\n\n timestamp = Date.UTC(struct[1], struct[2], struct[3], struct[4], struct[5] + minutesOffset, struct[6], struct[7]);\n } else {\n timestamp = origParse ? origParse(date) : NaN;\n }\n\n return timestamp;\n };\n\n exports.parseDate = parseDate;\n\n _ember['default'].Date.parse = function (date) {\n // throw deprecation\n (0, _emberDataPrivateDebug.deprecate)('Ember.Date.parse is deprecated because Safari 5-, IE8-, and\\n Firefox 3.6- are no longer supported (see\\n https://github.com/csnover/js-iso8601 for the history of this issue).\\n Please use Date.parse instead', false, {\n id: 'ds.ember.date.parse-deprecate',\n until: '3.0.0'\n });\n\n return parseDate(date);\n };\n\n if (_ember['default'].EXTEND_PROTOTYPES === true || _ember['default'].EXTEND_PROTOTYPES.Date) {\n (0, _emberDataPrivateDebug.deprecate)('Overriding Date.parse with Ember.Date.parse is deprecated. Please set ENV.EmberENV.EXTEND_PROTOTYPES.Date to false in config/environment.js\\n\\n\\n// config/environment.js\\nENV = {\\n EmberENV: {\\n EXTEND_PROTOTYPES: {\\n Date: false,\\n }\\n }\\n}\\n', false, {\n id: 'ds.date.parse-deprecate',\n until: '3.0.0'\n });\n Date.parse = parseDate;\n }\n});","define('ember-data/-private/features', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports['default'] = isEnabled;\n\n function isEnabled() {\n var _Ember$FEATURES;\n\n return (_Ember$FEATURES = _ember['default'].FEATURES).isEnabled.apply(_Ember$FEATURES, arguments);\n }\n});","define('ember-data/-private/global', ['exports'], function (exports) {\n /* globals global, window, self */\n\n // originally from https://github.com/emberjs/ember.js/blob/c0bd26639f50efd6a03ee5b87035fd200e313b8e/packages/ember-environment/lib/global.js\n\n // from lodash to catch fake globals\n 'use strict';\n\n function checkGlobal(value) {\n return value && value.Object === Object ? value : undefined;\n }\n\n // element ids can ruin global miss checks\n function checkElementIdShadowing(value) {\n return value && value.nodeType === undefined ? value : undefined;\n }\n\n // export real global\n exports['default'] = checkGlobal(checkElementIdShadowing(typeof global === 'object' && global)) || checkGlobal(typeof self === 'object' && self) || checkGlobal(typeof window === 'object' && window) || new Function('return this')();\n // eval outside of strict mode\n});","define(\"ember-data/-private/initializers/data-adapter\", [\"exports\", \"ember-data/-private/system/debug/debug-adapter\"], function (exports, _emberDataPrivateSystemDebugDebugAdapter) {\n \"use strict\";\n\n exports[\"default\"] = initializeDebugAdapter;\n\n /*\n Configures a registry with injections on Ember applications\n for the Ember-Data store. Accepts an optional namespace argument.\n \n @method initializeDebugAdapter\n @param {Ember.Registry} registry\n */\n function initializeDebugAdapter(registry) {\n registry.register('data-adapter:main', _emberDataPrivateSystemDebugDebugAdapter[\"default\"]);\n }\n});","define('ember-data/-private/initializers/store-injections', ['exports'], function (exports) {\n 'use strict';\n\n exports['default'] = initializeStoreInjections;\n\n /*\n Configures a registry with injections on Ember applications\n for the Ember-Data store. Accepts an optional namespace argument.\n \n @method initializeStoreInjections\n @param {Ember.Registry} registry\n */\n function initializeStoreInjections(registry) {\n // registry.injection for Ember < 2.1.0\n // application.inject for Ember 2.1.0+\n var inject = registry.inject || registry.injection;\n inject.call(registry, 'controller', 'store', 'service:store');\n inject.call(registry, 'route', 'store', 'service:store');\n inject.call(registry, 'data-adapter', 'store', 'service:store');\n }\n});","define(\"ember-data/-private/initializers/store\", [\"exports\", \"ember-data/-private/system/store\", \"ember-data/-private/serializers\", \"ember-data/-private/adapters\"], function (exports, _emberDataPrivateSystemStore, _emberDataPrivateSerializers, _emberDataPrivateAdapters) {\n \"use strict\";\n\n exports[\"default\"] = initializeStore;\n\n function has(applicationOrRegistry, fullName) {\n if (applicationOrRegistry.has) {\n // < 2.1.0\n return applicationOrRegistry.has(fullName);\n } else {\n // 2.1.0+\n return applicationOrRegistry.hasRegistration(fullName);\n }\n }\n\n /*\n Configures a registry for use with an Ember-Data\n store. Accepts an optional namespace argument.\n \n @method initializeStore\n @param {Ember.Registry} registry\n */\n function initializeStore(registry) {\n // registry.optionsForType for Ember < 2.1.0\n // application.registerOptionsForType for Ember 2.1.0+\n var registerOptionsForType = registry.registerOptionsForType || registry.optionsForType;\n registerOptionsForType.call(registry, 'serializer', { singleton: false });\n registerOptionsForType.call(registry, 'adapter', { singleton: false });\n\n registry.register('serializer:-default', _emberDataPrivateSerializers.JSONSerializer);\n registry.register('serializer:-rest', _emberDataPrivateSerializers.RESTSerializer);\n registry.register('adapter:-rest', _emberDataPrivateAdapters.RESTAdapter);\n\n registry.register('adapter:-json-api', _emberDataPrivateAdapters.JSONAPIAdapter);\n registry.register('serializer:-json-api', _emberDataPrivateSerializers.JSONAPISerializer);\n\n if (!has(registry, 'service:store')) {\n registry.register('service:store', _emberDataPrivateSystemStore[\"default\"]);\n }\n }\n});","define('ember-data/-private/initializers/transforms', ['exports', 'ember-data/-private/transforms'], function (exports, _emberDataPrivateTransforms) {\n 'use strict';\n\n exports['default'] = initializeTransforms;\n\n /*\n Configures a registry for use with Ember-Data\n transforms.\n \n @method initializeTransforms\n @param {Ember.Registry} registry\n */\n function initializeTransforms(registry) {\n registry.register('transform:boolean', _emberDataPrivateTransforms.BooleanTransform);\n registry.register('transform:date', _emberDataPrivateTransforms.DateTransform);\n registry.register('transform:number', _emberDataPrivateTransforms.NumberTransform);\n registry.register('transform:string', _emberDataPrivateTransforms.StringTransform);\n }\n});","define('ember-data/-private/instance-initializers/initialize-store-service', ['exports'], function (exports) {\n 'use strict';\n\n exports['default'] = initializeStoreService;\n\n /*\n Configures a registry for use with an Ember-Data\n store.\n \n @method initializeStoreService\n @param {Ember.ApplicationInstance} applicationOrRegistry\n */\n function initializeStoreService(application) {\n var container = application.lookup ? application : application.container;\n // Eagerly generate the store so defaultStore is populated.\n container.lookup('service:store');\n }\n});","define(\"ember-data/-private/serializers\", [\"exports\", \"ember-data/serializers/json-api\", \"ember-data/serializers/json\", \"ember-data/serializers/rest\"], function (exports, _emberDataSerializersJsonApi, _emberDataSerializersJson, _emberDataSerializersRest) {\n /**\n @module ember-data\n */\n\n \"use strict\";\n\n exports.JSONAPISerializer = _emberDataSerializersJsonApi[\"default\"];\n exports.JSONSerializer = _emberDataSerializersJson[\"default\"];\n exports.RESTSerializer = _emberDataSerializersRest[\"default\"];\n});","define(\"ember-data/-private/system/clone-null\", [\"exports\", \"ember-data/-private/system/empty-object\"], function (exports, _emberDataPrivateSystemEmptyObject) {\n \"use strict\";\n\n exports[\"default\"] = cloneNull;\n\n function cloneNull(source) {\n var clone = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n for (var key in source) {\n clone[key] = source[key];\n }\n return clone;\n }\n});","define('ember-data/-private/system/coerce-id', ['exports'], function (exports) {\n 'use strict';\n\n exports['default'] = coerceId;\n\n // Used by the store to normalize IDs entering the store. Despite the fact\n // that developers may provide IDs as numbers (e.g., `store.findRecord('person', 1)`),\n // it is important that internally we use strings, since IDs may be serialized\n // and lose type information. For example, Ember's router may put a record's\n // ID into the URL, and if we later try to deserialize that URL and find the\n // corresponding record, we will not know if it is a string or a number.\n\n function coerceId(id) {\n return id === null || id === undefined || id === '' ? null : id + '';\n }\n});","define('ember-data/-private/system/container-proxy', ['exports', 'ember-data/-private/debug'], function (exports, _emberDataPrivateDebug) {\n 'use strict';\n\n exports['default'] = ContainerProxy;\n\n /*\n This is used internally to enable deprecation of container paths and provide\n a decent message to the user indicating how to fix the issue.\n \n @class ContainerProxy\n @namespace DS\n @private\n */\n function ContainerProxy(container) {\n this.container = container;\n }\n\n ContainerProxy.prototype.aliasedFactory = function (path, preLookup) {\n var _this = this;\n\n return {\n create: function create() {\n if (preLookup) {\n preLookup();\n }\n\n return _this.container.lookup(path);\n }\n };\n };\n\n ContainerProxy.prototype.registerAlias = function (source, dest, preLookup) {\n var factory = this.aliasedFactory(dest, preLookup);\n\n return this.container.register(source, factory);\n };\n\n ContainerProxy.prototype.registerDeprecation = function (deprecated, valid) {\n var preLookupCallback = function preLookupCallback() {\n (0, _emberDataPrivateDebug.deprecate)('You tried to look up \\'' + deprecated + '\\', but this has been deprecated in favor of \\'' + valid + '\\'.', false, {\n id: 'ds.store.deprecated-lookup',\n until: '2.0.0'\n });\n };\n\n return this.registerAlias(deprecated, valid, preLookupCallback);\n };\n\n ContainerProxy.prototype.registerDeprecations = function (proxyPairs) {\n var i, proxyPair, deprecated, valid;\n\n for (i = proxyPairs.length; i > 0; i--) {\n proxyPair = proxyPairs[i - 1];\n deprecated = proxyPair['deprecated'];\n valid = proxyPair['valid'];\n\n this.registerDeprecation(deprecated, valid);\n }\n };\n});","define(\"ember-data/-private/system/debug\", [\"exports\", \"ember-data/-private/system/debug/debug-adapter\"], function (exports, _emberDataPrivateSystemDebugDebugAdapter) {\n /**\n @module ember-data\n */\n\n \"use strict\";\n\n exports[\"default\"] = _emberDataPrivateSystemDebugDebugAdapter[\"default\"];\n});","define('ember-data/-private/system/debug/debug-adapter', ['exports', 'ember', 'ember-data/model'], function (exports, _ember, _emberDataModel) {\n /**\n @module ember-data\n */\n 'use strict';\n\n var get = _ember['default'].get;\n var capitalize = _ember['default'].String.capitalize;\n var underscore = _ember['default'].String.underscore;\n var assert = _ember['default'].assert;\n\n /*\n Extend `Ember.DataAdapter` with ED specific code.\n \n @class DebugAdapter\n @namespace DS\n @extends Ember.DataAdapter\n @private\n */\n exports['default'] = _ember['default'].DataAdapter.extend({\n getFilters: function getFilters() {\n return [{ name: 'isNew', desc: 'New' }, { name: 'isModified', desc: 'Modified' }, { name: 'isClean', desc: 'Clean' }];\n },\n\n detect: function detect(typeClass) {\n return typeClass !== _emberDataModel['default'] && _emberDataModel['default'].detect(typeClass);\n },\n\n columnsForType: function columnsForType(typeClass) {\n var columns = [{\n name: 'id',\n desc: 'Id'\n }];\n var count = 0;\n var self = this;\n get(typeClass, 'attributes').forEach(function (meta, name) {\n if (count++ > self.attributeLimit) {\n return false;\n }\n var desc = capitalize(underscore(name).replace('_', ' '));\n columns.push({ name: name, desc: desc });\n });\n return columns;\n },\n\n getRecords: function getRecords(modelClass, modelName) {\n if (arguments.length < 2) {\n // Legacy Ember.js < 1.13 support\n var containerKey = modelClass._debugContainerKey;\n if (containerKey) {\n var match = containerKey.match(/model:(.*)/);\n if (match) {\n modelName = match[1];\n }\n }\n }\n assert(\"Cannot find model name. Please upgrade to Ember.js >= 1.13 for Ember Inspector support\", !!modelName);\n return this.get('store').peekAll(modelName);\n },\n\n getRecordColumnValues: function getRecordColumnValues(record) {\n var _this = this;\n\n var count = 0;\n var columnValues = { id: get(record, 'id') };\n\n record.eachAttribute(function (key) {\n if (count++ > _this.attributeLimit) {\n return false;\n }\n var value = get(record, key);\n columnValues[key] = value;\n });\n return columnValues;\n },\n\n getRecordKeywords: function getRecordKeywords(record) {\n var keywords = [];\n var keys = _ember['default'].A(['id']);\n record.eachAttribute(function (key) {\n return keys.push(key);\n });\n keys.forEach(function (key) {\n return keywords.push(get(record, key));\n });\n return keywords;\n },\n\n getRecordFilterValues: function getRecordFilterValues(record) {\n return {\n isNew: record.get('isNew'),\n isModified: record.get('hasDirtyAttributes') && !record.get('isNew'),\n isClean: !record.get('hasDirtyAttributes')\n };\n },\n\n getRecordColor: function getRecordColor(record) {\n var color = 'black';\n if (record.get('isNew')) {\n color = 'green';\n } else if (record.get('hasDirtyAttributes')) {\n color = 'blue';\n }\n return color;\n },\n\n observeRecord: function observeRecord(record, recordUpdated) {\n var releaseMethods = _ember['default'].A();\n var keysToObserve = _ember['default'].A(['id', 'isNew', 'hasDirtyAttributes']);\n\n record.eachAttribute(function (key) {\n return keysToObserve.push(key);\n });\n var adapter = this;\n\n keysToObserve.forEach(function (key) {\n var handler = function handler() {\n recordUpdated(adapter.wrapRecord(record));\n };\n _ember['default'].addObserver(record, key, handler);\n releaseMethods.push(function () {\n _ember['default'].removeObserver(record, key, handler);\n });\n });\n\n var release = function release() {\n releaseMethods.forEach(function (fn) {\n return fn();\n });\n };\n\n return release;\n }\n });\n});","define('ember-data/-private/system/debug/debug-info', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports['default'] = _ember['default'].Mixin.create({\n\n /**\n Provides info about the model for debugging purposes\n by grouping the properties into more semantic groups.\n Meant to be used by debugging tools such as the Chrome Ember Extension.\n - Groups all attributes in \"Attributes\" group.\n - Groups all belongsTo relationships in \"Belongs To\" group.\n - Groups all hasMany relationships in \"Has Many\" group.\n - Groups all flags in \"Flags\" group.\n - Flags relationship CPs as expensive properties.\n @method _debugInfo\n @for DS.Model\n @private\n */\n _debugInfo: function _debugInfo() {\n var attributes = ['id'];\n var relationships = { belongsTo: [], hasMany: [] };\n var expensiveProperties = [];\n\n this.eachAttribute(function (name, meta) {\n return attributes.push(name);\n });\n\n this.eachRelationship(function (name, relationship) {\n relationships[relationship.kind].push(name);\n expensiveProperties.push(name);\n });\n\n var groups = [{\n name: 'Attributes',\n properties: attributes,\n expand: true\n }, {\n name: 'Belongs To',\n properties: relationships.belongsTo,\n expand: true\n }, {\n name: 'Has Many',\n properties: relationships.hasMany,\n expand: true\n }, {\n name: 'Flags',\n properties: ['isLoaded', 'hasDirtyAttributes', 'isSaving', 'isDeleted', 'isError', 'isNew', 'isValid']\n }];\n\n return {\n propertyInfo: {\n // include all other mixins / properties (not just the grouped ones)\n includeOtherProperties: true,\n groups: groups,\n // don't pre-calculate unless cached\n expensiveProperties: expensiveProperties\n }\n };\n }\n });\n});","define(\"ember-data/-private/system/empty-object\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports[\"default\"] = EmptyObject;\n\n // This exists because `Object.create(null)` is absurdly slow compared\n // to `new EmptyObject()`. In either case, you want a null prototype\n // when you're treating the object instances as arbitrary dictionaries\n // and don't want your keys colliding with build-in methods on the\n // default object prototype.\n var proto = Object.create(null, {\n // without this, we will always still end up with (new\n // EmptyObject()).constructor === Object\n constructor: {\n value: undefined,\n enumerable: false,\n writable: true\n }\n });\n function EmptyObject() {}\n\n EmptyObject.prototype = proto;\n});","define('ember-data/-private/system/is-array-like', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports['default'] = isArrayLike;\n\n /*\n We're using this to detect arrays and \"array-like\" objects.\n \n This is a copy of the `isArray` method found in `ember-runtime/utils` as we're\n currently unable to import non-exposed modules.\n \n This method was previously exposed as `Ember.isArray` but since\n https://github.com/emberjs/ember.js/pull/11463 `Ember.isArray` is an alias of\n `Array.isArray` hence removing the \"array-like\" part.\n */\n function isArrayLike(obj) {\n if (!obj || obj.setInterval) {\n return false;\n }\n if (Array.isArray(obj)) {\n return true;\n }\n if (_ember['default'].Array.detect(obj)) {\n return true;\n }\n\n var type = _ember['default'].typeOf(obj);\n if ('array' === type) {\n return true;\n }\n if (obj.length !== undefined && 'object' === type) {\n return true;\n }\n return false;\n }\n});","define(\"ember-data/-private/system/many-array\", [\"exports\", \"ember\", \"ember-data/-private/debug\", \"ember-data/-private/system/promise-proxies\", \"ember-data/-private/system/store/common\"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateSystemPromiseProxies, _emberDataPrivateSystemStoreCommon) {\n /**\n @module ember-data\n */\n \"use strict\";\n\n var get = _ember[\"default\"].get;\n var set = _ember[\"default\"].set;\n\n /**\n A `ManyArray` is a `MutableArray` that represents the contents of a has-many\n relationship.\n \n The `ManyArray` is instantiated lazily the first time the relationship is\n requested.\n \n ### Inverses\n \n Often, the relationships in Ember Data applications will have\n an inverse. For example, imagine the following models are\n defined:\n \n ```app/models/post.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n comments: DS.hasMany('comment')\n });\n ```\n \n ```app/models/comment.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n post: DS.belongsTo('post')\n });\n ```\n \n If you created a new instance of `App.Post` and added\n a `App.Comment` record to its `comments` has-many\n relationship, you would expect the comment's `post`\n property to be set to the post that contained\n the has-many.\n \n We call the record to which a relationship belongs the\n relationship's _owner_.\n \n @class ManyArray\n @namespace DS\n @extends Ember.Object\n @uses Ember.MutableArray, Ember.Evented\n */\n exports[\"default\"] = _ember[\"default\"].Object.extend(_ember[\"default\"].MutableArray, _ember[\"default\"].Evented, {\n init: function init() {\n this._super.apply(this, arguments);\n this.currentState = _ember[\"default\"].A([]);\n },\n\n record: null,\n\n canonicalState: null,\n currentState: null,\n\n length: 0,\n\n objectAt: function objectAt(index) {\n //Ember observers such as 'firstObject', 'lastObject' might do out of bounds accesses\n if (!this.currentState[index]) {\n return undefined;\n }\n return this.currentState[index].getRecord();\n },\n\n flushCanonical: function flushCanonical() {\n //TODO make this smarter, currently its plenty stupid\n var toSet = this.canonicalState.filter(function (internalModel) {\n return !internalModel.isDeleted();\n });\n\n //a hack for not removing new records\n //TODO remove once we have proper diffing\n var newRecords = this.currentState.filter(\n // only add new records which are not yet in the canonical state of this\n // relationship (a new record can be in the canonical state if it has\n function (internalModel) {\n return internalModel.isNew() && toSet.indexOf(internalModel) === -1;\n });\n toSet = toSet.concat(newRecords);\n var oldLength = this.length;\n this.arrayContentWillChange(0, this.length, toSet.length);\n // It’s possible the parent side of the relationship may have been unloaded by this point\n if ((0, _emberDataPrivateSystemStoreCommon._objectIsAlive)(this)) {\n this.set('length', toSet.length);\n }\n this.currentState = toSet;\n this.arrayContentDidChange(0, oldLength, this.length);\n //TODO Figure out to notify only on additions and maybe only if unloaded\n this.relationship.notifyHasManyChanged();\n this.record.updateRecordArrays();\n },\n /**\n `true` if the relationship is polymorphic, `false` otherwise.\n @property {Boolean} isPolymorphic\n @private\n */\n isPolymorphic: false,\n\n /**\n The loading state of this array\n @property {Boolean} isLoaded\n */\n isLoaded: false,\n\n /**\n The relationship which manages this array.\n @property {ManyRelationship} relationship\n @private\n */\n relationship: null,\n\n /**\n Metadata associated with the request for async hasMany relationships.\n Example\n Given that the server returns the following JSON payload when fetching a\n hasMany relationship:\n ```js\n {\n \"comments\": [{\n \"id\": 1,\n \"comment\": \"This is the first comment\",\n }, {\n // ...\n }],\n \"meta\": {\n \"page\": 1,\n \"total\": 5\n }\n }\n ```\n You can then access the metadata via the `meta` property:\n ```js\n post.get('comments').then(function(comments) {\n var meta = comments.get('meta');\n // meta.page => 1\n // meta.total => 5\n });\n ```\n @property {Object} meta\n @public\n */\n meta: null,\n\n internalReplace: function internalReplace(idx, amt, objects) {\n if (!objects) {\n objects = [];\n }\n this.arrayContentWillChange(idx, amt, objects.length);\n this.currentState.splice.apply(this.currentState, [idx, amt].concat(objects));\n this.set('length', this.currentState.length);\n this.arrayContentDidChange(idx, amt, objects.length);\n if (objects) {\n //TODO(Igor) probably needed only for unloaded records\n this.relationship.notifyHasManyChanged();\n }\n this.record.updateRecordArrays();\n },\n\n //TODO(Igor) optimize\n internalRemoveRecords: function internalRemoveRecords(records) {\n var index;\n for (var i = 0; i < records.length; i++) {\n index = this.currentState.indexOf(records[i]);\n this.internalReplace(index, 1);\n }\n },\n\n //TODO(Igor) optimize\n internalAddRecords: function internalAddRecords(records, idx) {\n if (idx === undefined) {\n idx = this.currentState.length;\n }\n this.internalReplace(idx, 0, records);\n },\n\n replace: function replace(idx, amt, objects) {\n var records;\n if (amt > 0) {\n records = this.currentState.slice(idx, idx + amt);\n this.get('relationship').removeRecords(records);\n }\n if (objects) {\n this.get('relationship').addRecords(objects.map(function (obj) {\n return obj._internalModel;\n }), idx);\n }\n },\n /**\n Used for async `hasMany` arrays\n to keep track of when they will resolve.\n @property {Ember.RSVP.Promise} promise\n @private\n */\n promise: null,\n\n /**\n @method loadingRecordsCount\n @param {Number} count\n @private\n */\n loadingRecordsCount: function loadingRecordsCount(count) {\n this.loadingRecordsCount = count;\n },\n\n /**\n @method loadedRecord\n @private\n */\n loadedRecord: function loadedRecord() {\n this.loadingRecordsCount--;\n if (this.loadingRecordsCount === 0) {\n set(this, 'isLoaded', true);\n this.trigger('didLoad');\n }\n },\n\n /**\n @method reload\n @public\n */\n reload: function reload() {\n return this.relationship.reload();\n },\n\n /**\n Saves all of the records in the `ManyArray`.\n Example\n ```javascript\n store.findRecord('inbox', 1).then(function(inbox) {\n inbox.get('messages').then(function(messages) {\n messages.forEach(function(message) {\n message.set('isRead', true);\n });\n messages.save()\n });\n });\n ```\n @method save\n @return {DS.PromiseArray} promise\n */\n save: function save() {\n var manyArray = this;\n var promiseLabel = \"DS: ManyArray#save \" + get(this, 'type');\n var promise = _ember[\"default\"].RSVP.all(this.invoke(\"save\"), promiseLabel).then(function (array) {\n return manyArray;\n }, null, \"DS: ManyArray#save return ManyArray\");\n\n return _emberDataPrivateSystemPromiseProxies.PromiseArray.create({ promise: promise });\n },\n\n /**\n Create a child record within the owner\n @method createRecord\n @private\n @param {Object} hash\n @return {DS.Model} record\n */\n createRecord: function createRecord(hash) {\n var store = get(this, 'store');\n var type = get(this, 'type');\n var record;\n\n (0, _emberDataPrivateDebug.assert)(\"You cannot add '\" + type.modelName + \"' records to this polymorphic relationship.\", !get(this, 'isPolymorphic'));\n record = store.createRecord(type.modelName, hash);\n this.pushObject(record);\n\n return record;\n }\n });\n});\n// been 'acknowleged' to be in the relationship via a store.push)","define(\"ember-data/-private/system/model\", [\"exports\", \"ember-data/-private/system/model/model\", \"ember-data/attr\", \"ember-data/-private/system/model/states\", \"ember-data/-private/system/model/errors\"], function (exports, _emberDataPrivateSystemModelModel, _emberDataAttr, _emberDataPrivateSystemModelStates, _emberDataPrivateSystemModelErrors) {\n /**\n @module ember-data\n */\n\n \"use strict\";\n\n exports.RootState = _emberDataPrivateSystemModelStates[\"default\"];\n exports.attr = _emberDataAttr[\"default\"];\n exports.Errors = _emberDataPrivateSystemModelErrors[\"default\"];\n exports[\"default\"] = _emberDataPrivateSystemModelModel[\"default\"];\n});","define(\"ember-data/-private/system/model/attr\", [\"exports\", \"ember\", \"ember-data/-private/debug\"], function (exports, _ember, _emberDataPrivateDebug) {\n \"use strict\";\n\n var get = _ember[\"default\"].get;\n var Map = _ember[\"default\"].Map;\n\n /**\n @module ember-data\n */\n\n /**\n @class Model\n @namespace DS\n */\n\n var AttrClassMethodsMixin = _ember[\"default\"].Mixin.create({\n /**\n A map whose keys are the attributes of the model (properties\n described by DS.attr) and whose values are the meta object for the\n property.\n Example\n ```app/models/person.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n firstName: attr('string'),\n lastName: attr('string'),\n birthday: attr('date')\n });\n ```\n ```javascript\n import Ember from 'ember';\n import Person from 'app/models/person';\n var attributes = Ember.get(Person, 'attributes')\n attributes.forEach(function(meta, name) {\n console.log(name, meta);\n });\n // prints:\n // firstName {type: \"string\", isAttribute: true, options: Object, parentType: function, name: \"firstName\"}\n // lastName {type: \"string\", isAttribute: true, options: Object, parentType: function, name: \"lastName\"}\n // birthday {type: \"date\", isAttribute: true, options: Object, parentType: function, name: \"birthday\"}\n ```\n @property attributes\n @static\n @type {Ember.Map}\n @readOnly\n */\n attributes: _ember[\"default\"].computed(function () {\n var _this = this;\n\n var map = Map.create();\n\n this.eachComputedProperty(function (name, meta) {\n if (meta.isAttribute) {\n (0, _emberDataPrivateDebug.assert)(\"You may not set `id` as an attribute on your model. Please remove any lines that look like: `id: DS.attr('')` from \" + _this.toString(), name !== 'id');\n\n meta.name = name;\n map.set(name, meta);\n }\n });\n\n return map;\n }).readOnly(),\n\n /**\n A map whose keys are the attributes of the model (properties\n described by DS.attr) and whose values are type of transformation\n applied to each attribute. This map does not include any\n attributes that do not have an transformation type.\n Example\n ```app/models/person.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n firstName: attr(),\n lastName: attr('string'),\n birthday: attr('date')\n });\n ```\n ```javascript\n import Ember from 'ember';\n import Person from 'app/models/person';\n var transformedAttributes = Ember.get(Person, 'transformedAttributes')\n transformedAttributes.forEach(function(field, type) {\n console.log(field, type);\n });\n // prints:\n // lastName string\n // birthday date\n ```\n @property transformedAttributes\n @static\n @type {Ember.Map}\n @readOnly\n */\n transformedAttributes: _ember[\"default\"].computed(function () {\n var map = Map.create();\n\n this.eachAttribute(function (key, meta) {\n if (meta.type) {\n map.set(key, meta.type);\n }\n });\n\n return map;\n }).readOnly(),\n\n /**\n Iterates through the attributes of the model, calling the passed function on each\n attribute.\n The callback method you provide should have the following signature (all\n parameters are optional):\n ```javascript\n function(name, meta);\n ```\n - `name` the name of the current property in the iteration\n - `meta` the meta object for the attribute property in the iteration\n Note that in addition to a callback, you can also pass an optional target\n object that will be set as `this` on the context.\n Example\n ```javascript\n import DS from 'ember-data';\n var Person = DS.Model.extend({\n firstName: attr('string'),\n lastName: attr('string'),\n birthday: attr('date')\n });\n Person.eachAttribute(function(name, meta) {\n console.log(name, meta);\n });\n // prints:\n // firstName {type: \"string\", isAttribute: true, options: Object, parentType: function, name: \"firstName\"}\n // lastName {type: \"string\", isAttribute: true, options: Object, parentType: function, name: \"lastName\"}\n // birthday {type: \"date\", isAttribute: true, options: Object, parentType: function, name: \"birthday\"}\n ```\n @method eachAttribute\n @param {Function} callback The callback to execute\n @param {Object} [binding] the value to which the callback's `this` should be bound\n @static\n */\n eachAttribute: function eachAttribute(callback, binding) {\n get(this, 'attributes').forEach(function (meta, name) {\n callback.call(binding, name, meta);\n });\n },\n\n /**\n Iterates through the transformedAttributes of the model, calling\n the passed function on each attribute. Note the callback will not be\n called for any attributes that do not have an transformation type.\n The callback method you provide should have the following signature (all\n parameters are optional):\n ```javascript\n function(name, type);\n ```\n - `name` the name of the current property in the iteration\n - `type` a string containing the name of the type of transformed\n applied to the attribute\n Note that in addition to a callback, you can also pass an optional target\n object that will be set as `this` on the context.\n Example\n ```javascript\n import DS from 'ember-data';\n var Person = DS.Model.extend({\n firstName: attr(),\n lastName: attr('string'),\n birthday: attr('date')\n });\n Person.eachTransformedAttribute(function(name, type) {\n console.log(name, type);\n });\n // prints:\n // lastName string\n // birthday date\n ```\n @method eachTransformedAttribute\n @param {Function} callback The callback to execute\n @param {Object} [binding] the value to which the callback's `this` should be bound\n @static\n */\n eachTransformedAttribute: function eachTransformedAttribute(callback, binding) {\n get(this, 'transformedAttributes').forEach(function (type, name) {\n callback.call(binding, name, type);\n });\n }\n });\n\n exports.AttrClassMethodsMixin = AttrClassMethodsMixin;\n\n var AttrInstanceMethodsMixin = _ember[\"default\"].Mixin.create({\n eachAttribute: function eachAttribute(callback, binding) {\n this.constructor.eachAttribute(callback, binding);\n }\n });\n exports.AttrInstanceMethodsMixin = AttrInstanceMethodsMixin;\n});","define('ember-data/-private/system/model/errors', ['exports', 'ember', 'ember-data/-private/debug'], function (exports, _ember, _emberDataPrivateDebug) {\n 'use strict';\n\n var get = _ember['default'].get;\n var set = _ember['default'].set;\n var isEmpty = _ember['default'].isEmpty;\n var makeArray = _ember['default'].makeArray;\n\n var MapWithDefault = _ember['default'].MapWithDefault;\n\n /**\n @module ember-data\n */\n\n /**\n Holds validation errors for a given record, organized by attribute names.\n \n Every `DS.Model` has an `errors` property that is an instance of\n `DS.Errors`. This can be used to display validation error\n messages returned from the server when a `record.save()` rejects.\n \n For Example, if you had a `User` model that looked like this:\n \n ```app/models/user.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n username: attr('string'),\n email: attr('string')\n });\n ```\n And you attempted to save a record that did not validate on the backend:\n \n ```javascript\n var user = store.createRecord('user', {\n username: 'tomster',\n email: 'invalidEmail'\n });\n user.save();\n ```\n \n Your backend would be expected to return an error response that described\n the problem, so that error messages can be generated on the app.\n \n API responses will be translated into instances of `DS.Errors` differently,\n depending on the specific combination of adapter and serializer used. You\n may want to check the documentation or the source code of the libraries\n that you are using, to know how they expect errors to be communicated.\n \n Errors can be displayed to the user by accessing their property name\n to get an array of all the error objects for that property. Each\n error object is a JavaScript object with two keys:\n \n - `message` A string containing the error message from the backend\n - `attribute` The name of the property associated with this error message\n \n ```handlebars\n Username: {{input value=username}} \n {{#each model.errors.username as |error|}}\n \n {{error.message}}\n
\n {{/each}}\n \n Email: {{input value=email}} \n {{#each model.errors.email as |error|}}\n \n {{error.message}}\n
\n {{/each}}\n ```\n \n You can also access the special `messages` property on the error\n object to get an array of all the error strings.\n \n ```handlebars\n {{#each model.errors.messages as |message|}}\n \n {{message}}\n
\n {{/each}}\n ```\n \n @class Errors\n @namespace DS\n @extends Ember.Object\n @uses Ember.Enumerable\n @uses Ember.Evented\n */\n exports['default'] = _ember['default'].ArrayProxy.extend(_ember['default'].Evented, {\n /**\n Register with target handler\n @method registerHandlers\n @param {Object} target\n @param {Function} becameInvalid\n @param {Function} becameValid\n @deprecated\n */\n registerHandlers: function registerHandlers(target, becameInvalid, becameValid) {\n (0, _emberDataPrivateDebug.deprecate)('Record errors will no longer be evented.', false, {\n id: 'ds.errors.registerHandlers',\n until: '3.0.0'\n });\n\n this._registerHandlers(target, becameInvalid, becameValid);\n },\n\n /**\n Register with target handler\n @method _registerHandlers\n @private\n */\n _registerHandlers: function _registerHandlers(target, becameInvalid, becameValid) {\n this.on('becameInvalid', target, becameInvalid);\n this.on('becameValid', target, becameValid);\n },\n\n /**\n @property errorsByAttributeName\n @type {Ember.MapWithDefault}\n @private\n */\n errorsByAttributeName: _ember['default'].computed(function () {\n return MapWithDefault.create({\n defaultValue: function defaultValue() {\n return _ember['default'].A();\n }\n });\n }),\n\n /**\n Returns errors for a given attribute\n ```javascript\n var user = store.createRecord('user', {\n username: 'tomster',\n email: 'invalidEmail'\n });\n user.save().catch(function(){\n user.get('errors').errorsFor('email'); // returns:\n // [{attribute: \"email\", message: \"Doesn't look like a valid email.\"}]\n });\n ```\n @method errorsFor\n @param {String} attribute\n @return {Array}\n */\n errorsFor: function errorsFor(attribute) {\n return get(this, 'errorsByAttributeName').get(attribute);\n },\n\n /**\n An array containing all of the error messages for this\n record. This is useful for displaying all errors to the user.\n ```handlebars\n {{#each model.errors.messages as |message|}}\n \n {{message}}\n
\n {{/each}}\n ```\n @property messages\n @type {Array}\n */\n messages: _ember['default'].computed.mapBy('content', 'message'),\n\n /**\n @property content\n @type {Array}\n @private\n */\n content: _ember['default'].computed(function () {\n return _ember['default'].A();\n }),\n\n /**\n @method unknownProperty\n @private\n */\n unknownProperty: function unknownProperty(attribute) {\n var errors = this.errorsFor(attribute);\n if (isEmpty(errors)) {\n return null;\n }\n return errors;\n },\n\n /**\n Total number of errors.\n @property length\n @type {Number}\n @readOnly\n */\n\n /**\n @property isEmpty\n @type {Boolean}\n @readOnly\n */\n isEmpty: _ember['default'].computed.not('length').readOnly(),\n\n /**\n Adds error messages to a given attribute and sends\n `becameInvalid` event to the record.\n Example:\n ```javascript\n if (!user.get('username') {\n user.get('errors').add('username', 'This field is required');\n }\n ```\n @method add\n @param {String} attribute\n @param {(Array|String)} messages\n @deprecated\n */\n add: function add(attribute, messages) {\n (0, _emberDataPrivateDebug.warn)('Interacting with a record errors object will no longer change the record state.', false, {\n id: 'ds.errors.add'\n });\n\n var wasEmpty = get(this, 'isEmpty');\n\n this._add(attribute, messages);\n\n if (wasEmpty && !get(this, 'isEmpty')) {\n this.trigger('becameInvalid');\n }\n },\n\n /**\n Adds error messages to a given attribute without sending event.\n @method _add\n @private\n */\n _add: function _add(attribute, messages) {\n messages = this._findOrCreateMessages(attribute, messages);\n this.addObjects(messages);\n get(this, 'errorsByAttributeName').get(attribute).addObjects(messages);\n\n this.notifyPropertyChange(attribute);\n },\n\n /**\n @method _findOrCreateMessages\n @private\n */\n _findOrCreateMessages: function _findOrCreateMessages(attribute, messages) {\n var errors = this.errorsFor(attribute);\n var messagesArray = makeArray(messages);\n var _messages = new Array(messagesArray.length);\n\n for (var i = 0; i < messagesArray.length; i++) {\n var message = messagesArray[i];\n var err = errors.findBy('message', message);\n if (err) {\n _messages[i] = err;\n } else {\n _messages[i] = {\n attribute: attribute,\n message: message\n };\n }\n }\n\n return _messages;\n },\n\n /**\n Removes all error messages from the given attribute and sends\n `becameValid` event to the record if there no more errors left.\n Example:\n ```app/models/user.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n email: DS.attr('string'),\n twoFactorAuth: DS.attr('boolean'),\n phone: DS.attr('string')\n });\n ```\n ```app/routes/user/edit.js\n import Ember from 'ember';\n export default Ember.Route.extend({\n actions: {\n save: function(user) {\n if (!user.get('twoFactorAuth')) {\n user.get('errors').remove('phone');\n }\n user.save();\n }\n }\n });\n ```\n @method remove\n @param {String} attribute\n @deprecated\n */\n remove: function remove(attribute) {\n (0, _emberDataPrivateDebug.warn)('Interacting with a record errors object will no longer change the record state.', false, {\n id: 'ds.errors.remove'\n });\n\n if (get(this, 'isEmpty')) {\n return;\n }\n\n this._remove(attribute);\n\n if (get(this, 'isEmpty')) {\n this.trigger('becameValid');\n }\n },\n\n /**\n Removes all error messages from the given attribute without sending event.\n @method _remove\n @private\n */\n _remove: function _remove(attribute) {\n if (get(this, 'isEmpty')) {\n return;\n }\n\n var content = this.rejectBy('attribute', attribute);\n set(this, 'content', content);\n get(this, 'errorsByAttributeName')['delete'](attribute);\n\n this.notifyPropertyChange(attribute);\n },\n\n /**\n Removes all error messages and sends `becameValid` event\n to the record.\n Example:\n ```app/routes/user/edit.js\n import Ember from 'ember';\n export default Ember.Route.extend({\n actions: {\n retrySave: function(user) {\n user.get('errors').clear();\n user.save();\n }\n }\n });\n ```\n @method clear\n @deprecated\n */\n clear: function clear() {\n (0, _emberDataPrivateDebug.warn)('Interacting with a record errors object will no longer change the record state.', false, {\n id: 'ds.errors.clear'\n });\n\n if (get(this, 'isEmpty')) {\n return;\n }\n\n this._clear();\n this.trigger('becameValid');\n },\n\n /**\n Removes all error messages.\n to the record.\n @method _clear\n @private\n */\n _clear: function _clear() {\n if (get(this, 'isEmpty')) {\n return;\n }\n\n var errorsByAttributeName = get(this, 'errorsByAttributeName');\n var attributes = _ember['default'].A();\n\n errorsByAttributeName.forEach(function (_, attribute) {\n attributes.push(attribute);\n });\n\n errorsByAttributeName.clear();\n attributes.forEach(function (attribute) {\n this.notifyPropertyChange(attribute);\n }, this);\n\n _ember['default'].ArrayProxy.prototype.clear.call(this);\n },\n\n /**\n Checks if there is error messages for the given attribute.\n ```app/routes/user/edit.js\n import Ember from 'ember';\n export default Ember.Route.extend({\n actions: {\n save: function(user) {\n if (user.get('errors').has('email')) {\n return alert('Please update your email before attempting to save.');\n }\n user.save();\n }\n }\n });\n ```\n @method has\n @param {String} attribute\n @return {Boolean} true if there some errors on given attribute\n */\n has: function has(attribute) {\n return !isEmpty(this.errorsFor(attribute));\n }\n });\n});","define(\"ember-data/-private/system/model/internal-model\", [\"exports\", \"ember\", \"ember-data/-private/debug\", \"ember-data/-private/system/model/states\", \"ember-data/-private/system/relationships/state/create\", \"ember-data/-private/system/snapshot\", \"ember-data/-private/system/empty-object\", \"ember-data/-private/features\", \"ember-data/-private/utils\", \"ember-data/-private/system/references\"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateSystemModelStates, _emberDataPrivateSystemRelationshipsStateCreate, _emberDataPrivateSystemSnapshot, _emberDataPrivateSystemEmptyObject, _emberDataPrivateFeatures, _emberDataPrivateUtils, _emberDataPrivateSystemReferences) {\n \"use strict\";\n\n var _slicedToArray = (function () {\n function sliceIterator(arr, i) {\n var _arr = [];var _n = true;var _d = false;var _e = undefined;try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;_e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"]) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }return _arr;\n }return function (arr, i) {\n if (Array.isArray(arr)) {\n return arr;\n } else if (Symbol.iterator in Object(arr)) {\n return sliceIterator(arr, i);\n } else {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n }\n };\n })();\n\n exports[\"default\"] = InternalModel;\n\n var Promise = _ember[\"default\"].RSVP.Promise;\n var get = _ember[\"default\"].get;\n var set = _ember[\"default\"].set;\n var copy = _ember[\"default\"].copy;\n var assign = _ember[\"default\"].assign || _ember[\"default\"].merge;\n\n var _extractPivotNameCache = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n var _splitOnDotCache = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n\n function splitOnDot(name) {\n return _splitOnDotCache[name] || (_splitOnDotCache[name] = name.split('.'));\n }\n\n function extractPivotName(name) {\n return _extractPivotNameCache[name] || (_extractPivotNameCache[name] = splitOnDot(name)[0]);\n }\n\n function retrieveFromCurrentState(key) {\n return function () {\n return get(this.currentState, key);\n };\n }\n\n var guid = 0;\n /*\n `InternalModel` is the Model class that we use internally inside Ember Data to represent models.\n Internal ED methods should only deal with `InternalModel` objects. It is a fast, plain Javascript class.\n \n We expose `DS.Model` to application code, by materializing a `DS.Model` from `InternalModel` lazily, as\n a performance optimization.\n \n `InternalModel` should never be exposed to application code. At the boundaries of the system, in places\n like `find`, `push`, etc. we convert between Models and InternalModels.\n \n We need to make sure that the properties from `InternalModel` are correctly exposed/proxied on `Model`\n if they are needed.\n \n @private\n @class InternalModel\n */\n function InternalModel(type, id, store, _, data) {\n this.type = type;\n this.id = id;\n this.store = store;\n this._data = data || new _emberDataPrivateSystemEmptyObject[\"default\"]();\n this.modelName = type.modelName;\n this.dataHasInitialized = false;\n //Look into making this lazy\n this._deferredTriggers = [];\n this._attributes = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n this._inFlightAttributes = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n this._relationships = new _emberDataPrivateSystemRelationshipsStateCreate[\"default\"](this);\n this._recordArrays = undefined;\n this.currentState = _emberDataPrivateSystemModelStates[\"default\"].empty;\n this.recordReference = new _emberDataPrivateSystemReferences.RecordReference(store, this);\n this.references = {};\n this.isReloading = false;\n this.isError = false;\n this.error = null;\n this.__ember_meta__ = null;\n this[_ember[\"default\"].GUID_KEY] = guid++ + 'internal-model';\n /*\n implicit relationships are relationship which have not been declared but the inverse side exists on\n another record somewhere\n For example if there was\n ```app/models/comment.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n name: DS.attr()\n })\n ```\n but there is also\n ```app/models/post.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n name: DS.attr(),\n comments: DS.hasMany('comment')\n })\n ```\n would have a implicit post relationship in order to be do things like remove ourselves from the post\n when we are deleted\n */\n this._implicitRelationships = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n }\n\n InternalModel.prototype = {\n isEmpty: retrieveFromCurrentState('isEmpty'),\n isLoading: retrieveFromCurrentState('isLoading'),\n isLoaded: retrieveFromCurrentState('isLoaded'),\n hasDirtyAttributes: retrieveFromCurrentState('hasDirtyAttributes'),\n isSaving: retrieveFromCurrentState('isSaving'),\n isDeleted: retrieveFromCurrentState('isDeleted'),\n isNew: retrieveFromCurrentState('isNew'),\n isValid: retrieveFromCurrentState('isValid'),\n dirtyType: retrieveFromCurrentState('dirtyType'),\n\n constructor: InternalModel,\n materializeRecord: function materializeRecord() {\n (0, _emberDataPrivateDebug.assert)(\"Materialized \" + this.modelName + \" record with id:\" + this.id + \"more than once\", this.record === null || this.record === undefined);\n\n // lookupFactory should really return an object that creates\n // instances with the injections applied\n var createOptions = {\n store: this.store,\n _internalModel: this,\n id: this.id,\n currentState: get(this, 'currentState'),\n isError: this.isError,\n adapterError: this.error\n };\n\n if (_ember[\"default\"].setOwner) {\n // ensure that `Ember.getOwner(this)` works inside a model instance\n _ember[\"default\"].setOwner(createOptions, (0, _emberDataPrivateUtils.getOwner)(this.store));\n } else {\n createOptions.container = this.store.container;\n }\n\n this.record = this.type._create(createOptions);\n\n this._triggerDeferredTriggers();\n },\n\n recordObjectWillDestroy: function recordObjectWillDestroy() {\n this.record = null;\n },\n\n deleteRecord: function deleteRecord() {\n this.send('deleteRecord');\n },\n\n save: function save(options) {\n var promiseLabel = \"DS: Model#save \" + this;\n var resolver = _ember[\"default\"].RSVP.defer(promiseLabel);\n\n this.store.scheduleSave(this, resolver, options);\n return resolver.promise;\n },\n\n startedReloading: function startedReloading() {\n this.isReloading = true;\n if (this.record) {\n set(this.record, 'isReloading', true);\n }\n },\n\n finishedReloading: function finishedReloading() {\n this.isReloading = false;\n if (this.record) {\n set(this.record, 'isReloading', false);\n }\n },\n\n reload: function reload() {\n this.startedReloading();\n var record = this;\n var promiseLabel = \"DS: Model#reload of \" + this;\n return new Promise(function (resolve) {\n record.send('reloadRecord', resolve);\n }, promiseLabel).then(function () {\n record.didCleanError();\n return record;\n }, function (error) {\n record.didError(error);\n throw error;\n }, \"DS: Model#reload complete, update flags\")[\"finally\"](function () {\n record.finishedReloading();\n record.updateRecordArrays();\n });\n },\n\n getRecord: function getRecord() {\n if (!this.record) {\n this.materializeRecord();\n }\n return this.record;\n },\n\n unloadRecord: function unloadRecord() {\n this.send('unloadRecord');\n },\n\n eachRelationship: function eachRelationship(callback, binding) {\n return this.type.eachRelationship(callback, binding);\n },\n\n eachAttribute: function eachAttribute(callback, binding) {\n return this.type.eachAttribute(callback, binding);\n },\n\n inverseFor: function inverseFor(key) {\n return this.type.inverseFor(key);\n },\n\n setupData: function setupData(data) {\n var changedKeys = this._changedKeys(data.attributes);\n assign(this._data, data.attributes);\n this.pushedData();\n if (this.record) {\n this.record._notifyProperties(changedKeys);\n }\n this.didInitalizeData();\n },\n\n becameReady: function becameReady() {\n _ember[\"default\"].run.schedule('actions', this.store.recordArrayManager, this.store.recordArrayManager.recordWasLoaded, this);\n },\n\n didInitalizeData: function didInitalizeData() {\n if (!this.dataHasInitialized) {\n this.becameReady();\n this.dataHasInitialized = true;\n }\n },\n\n destroy: function destroy() {\n if (this.record) {\n return this.record.destroy();\n }\n },\n\n /*\n @method createSnapshot\n @private\n */\n createSnapshot: function createSnapshot(options) {\n return new _emberDataPrivateSystemSnapshot[\"default\"](this, options);\n },\n\n /*\n @method loadingData\n @private\n @param {Promise} promise\n */\n loadingData: function loadingData(promise) {\n this.send('loadingData', promise);\n },\n\n /*\n @method loadedData\n @private\n */\n loadedData: function loadedData() {\n this.send('loadedData');\n this.didInitalizeData();\n },\n\n /*\n @method notFound\n @private\n */\n notFound: function notFound() {\n this.send('notFound');\n },\n\n /*\n @method pushedData\n @private\n */\n pushedData: function pushedData() {\n this.send('pushedData');\n },\n\n flushChangedAttributes: function flushChangedAttributes() {\n this._inFlightAttributes = this._attributes;\n this._attributes = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n },\n\n hasChangedAttributes: function hasChangedAttributes() {\n return Object.keys(this._attributes).length > 0;\n },\n\n /*\n Checks if the attributes which are considered as changed are still\n different to the state which is acknowledged by the server.\n This method is needed when data for the internal model is pushed and the\n pushed data might acknowledge dirty attributes as confirmed.\n @method updateChangedAttributes\n @private\n */\n updateChangedAttributes: function updateChangedAttributes() {\n var changedAttributes = this.changedAttributes();\n var changedAttributeNames = Object.keys(changedAttributes);\n\n for (var i = 0, _length = changedAttributeNames.length; i < _length; i++) {\n var attribute = changedAttributeNames[i];\n\n var _changedAttributes$attribute = _slicedToArray(changedAttributes[attribute], 2);\n\n var oldData = _changedAttributes$attribute[0];\n var newData = _changedAttributes$attribute[1];\n\n if (oldData === newData) {\n delete this._attributes[attribute];\n }\n }\n },\n\n /*\n Returns an object, whose keys are changed properties, and value is an\n [oldProp, newProp] array.\n @method changedAttributes\n @private\n */\n changedAttributes: function changedAttributes() {\n var oldData = this._data;\n var currentData = this._attributes;\n var inFlightData = this._inFlightAttributes;\n var newData = assign(copy(inFlightData), currentData);\n var diffData = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n\n var newDataKeys = Object.keys(newData);\n\n for (var i = 0, _length2 = newDataKeys.length; i < _length2; i++) {\n var key = newDataKeys[i];\n diffData[key] = [oldData[key], newData[key]];\n }\n\n return diffData;\n },\n\n /*\n @method adapterWillCommit\n @private\n */\n adapterWillCommit: function adapterWillCommit() {\n this.send('willCommit');\n },\n\n /*\n @method adapterDidDirty\n @private\n */\n adapterDidDirty: function adapterDidDirty() {\n this.send('becomeDirty');\n this.updateRecordArraysLater();\n },\n\n /*\n @method send\n @private\n @param {String} name\n @param {Object} context\n */\n send: function send(name, context) {\n var currentState = get(this, 'currentState');\n\n if (!currentState[name]) {\n this._unhandledEvent(currentState, name, context);\n }\n\n return currentState[name](this, context);\n },\n\n notifyHasManyAdded: function notifyHasManyAdded(key, record, idx) {\n if (this.record) {\n this.record.notifyHasManyAdded(key, record, idx);\n }\n },\n\n notifyHasManyRemoved: function notifyHasManyRemoved(key, record, idx) {\n if (this.record) {\n this.record.notifyHasManyRemoved(key, record, idx);\n }\n },\n\n notifyBelongsToChanged: function notifyBelongsToChanged(key, record) {\n if (this.record) {\n this.record.notifyBelongsToChanged(key, record);\n }\n },\n\n notifyPropertyChange: function notifyPropertyChange(key) {\n if (this.record) {\n this.record.notifyPropertyChange(key);\n }\n },\n\n rollbackAttributes: function rollbackAttributes() {\n var dirtyKeys = Object.keys(this._attributes);\n\n this._attributes = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n\n if (get(this, 'isError')) {\n this._inFlightAttributes = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n this.didCleanError();\n }\n\n //Eventually rollback will always work for relationships\n //For now we support it only out of deleted state, because we\n //have an explicit way of knowing when the server acked the relationship change\n if (this.isDeleted()) {\n //TODO: Should probably move this to the state machine somehow\n this.becameReady();\n }\n\n if (this.isNew()) {\n this.clearRelationships();\n }\n\n if (this.isValid()) {\n this._inFlightAttributes = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n }\n\n this.send('rolledBack');\n\n this.record._notifyProperties(dirtyKeys);\n },\n\n /*\n @method transitionTo\n @private\n @param {String} name\n */\n transitionTo: function transitionTo(name) {\n // POSSIBLE TODO: Remove this code and replace with\n // always having direct reference to state objects\n\n var pivotName = extractPivotName(name);\n var currentState = get(this, 'currentState');\n var state = currentState;\n\n do {\n if (state.exit) {\n state.exit(this);\n }\n state = state.parentState;\n } while (!state.hasOwnProperty(pivotName));\n\n var path = splitOnDot(name);\n var setups = [];\n var enters = [];\n var i, l;\n\n for (i = 0, l = path.length; i < l; i++) {\n state = state[path[i]];\n\n if (state.enter) {\n enters.push(state);\n }\n if (state.setup) {\n setups.push(state);\n }\n }\n\n for (i = 0, l = enters.length; i < l; i++) {\n enters[i].enter(this);\n }\n\n set(this, 'currentState', state);\n //TODO Consider whether this is the best approach for keeping these two in sync\n if (this.record) {\n set(this.record, 'currentState', state);\n }\n\n for (i = 0, l = setups.length; i < l; i++) {\n setups[i].setup(this);\n }\n\n this.updateRecordArraysLater();\n },\n\n _unhandledEvent: function _unhandledEvent(state, name, context) {\n var errorMessage = \"Attempted to handle event `\" + name + \"` \";\n errorMessage += \"on \" + String(this) + \" while in state \";\n errorMessage += state.stateName + \". \";\n\n if (context !== undefined) {\n errorMessage += \"Called with \" + _ember[\"default\"].inspect(context) + \".\";\n }\n\n throw new _ember[\"default\"].Error(errorMessage);\n },\n\n triggerLater: function triggerLater() {\n var length = arguments.length;\n var args = new Array(length);\n\n for (var i = 0; i < length; i++) {\n args[i] = arguments[i];\n }\n\n if (this._deferredTriggers.push(args) !== 1) {\n return;\n }\n _ember[\"default\"].run.scheduleOnce('actions', this, '_triggerDeferredTriggers');\n },\n\n _triggerDeferredTriggers: function _triggerDeferredTriggers() {\n //TODO: Before 1.0 we want to remove all the events that happen on the pre materialized record,\n //but for now, we queue up all the events triggered before the record was materialized, and flush\n //them once we have the record\n if (!this.record) {\n return;\n }\n for (var i = 0, l = this._deferredTriggers.length; i < l; i++) {\n this.record.trigger.apply(this.record, this._deferredTriggers[i]);\n }\n\n this._deferredTriggers.length = 0;\n },\n /*\n @method clearRelationships\n @private\n */\n clearRelationships: function clearRelationships() {\n var _this = this;\n\n this.eachRelationship(function (name, relationship) {\n if (_this._relationships.has(name)) {\n var rel = _this._relationships.get(name);\n rel.clear();\n rel.destroy();\n }\n });\n Object.keys(this._implicitRelationships).forEach(function (key) {\n _this._implicitRelationships[key].clear();\n _this._implicitRelationships[key].destroy();\n });\n },\n\n /*\n When a find request is triggered on the store, the user can optionally pass in\n attributes and relationships to be preloaded. These are meant to behave as if they\n came back from the server, except the user obtained them out of band and is informing\n the store of their existence. The most common use case is for supporting client side\n nested URLs, such as `/posts/1/comments/2` so the user can do\n `store.findRecord('comment', 2, { preload: { post: 1 } })` without having to fetch the post.\n Preloaded data can be attributes and relationships passed in either as IDs or as actual\n models.\n @method _preloadData\n @private\n @param {Object} preload\n */\n _preloadData: function _preloadData(preload) {\n var _this2 = this;\n\n //TODO(Igor) consider the polymorphic case\n Object.keys(preload).forEach(function (key) {\n var preloadValue = get(preload, key);\n var relationshipMeta = _this2.type.metaForProperty(key);\n if (relationshipMeta.isRelationship) {\n _this2._preloadRelationship(key, preloadValue);\n } else {\n _this2._data[key] = preloadValue;\n }\n });\n },\n\n _preloadRelationship: function _preloadRelationship(key, preloadValue) {\n var relationshipMeta = this.type.metaForProperty(key);\n var type = relationshipMeta.type;\n if (relationshipMeta.kind === 'hasMany') {\n this._preloadHasMany(key, preloadValue, type);\n } else {\n this._preloadBelongsTo(key, preloadValue, type);\n }\n },\n\n _preloadHasMany: function _preloadHasMany(key, preloadValue, type) {\n (0, _emberDataPrivateDebug.assert)(\"You need to pass in an array to set a hasMany property on a record\", Array.isArray(preloadValue));\n var recordsToSet = new Array(preloadValue.length);\n\n for (var i = 0; i < preloadValue.length; i++) {\n var recordToPush = preloadValue[i];\n recordsToSet[i] = this._convertStringOrNumberIntoInternalModel(recordToPush, type);\n }\n\n //We use the pathway of setting the hasMany as if it came from the adapter\n //because the user told us that they know this relationships exists already\n this._relationships.get(key).updateRecordsFromAdapter(recordsToSet);\n },\n\n _preloadBelongsTo: function _preloadBelongsTo(key, preloadValue, type) {\n var recordToSet = this._convertStringOrNumberIntoInternalModel(preloadValue, type);\n\n //We use the pathway of setting the hasMany as if it came from the adapter\n //because the user told us that they know this relationships exists already\n this._relationships.get(key).setRecord(recordToSet);\n },\n\n _convertStringOrNumberIntoInternalModel: function _convertStringOrNumberIntoInternalModel(value, type) {\n if (typeof value === 'string' || typeof value === 'number') {\n return this.store._internalModelForId(type, value);\n }\n if (value._internalModel) {\n return value._internalModel;\n }\n return value;\n },\n\n /*\n @method updateRecordArrays\n @private\n */\n updateRecordArrays: function updateRecordArrays() {\n this._updatingRecordArraysLater = false;\n this.store.dataWasUpdated(this.type, this);\n },\n\n setId: function setId(id) {\n (0, _emberDataPrivateDebug.assert)('A record\\'s id cannot be changed once it is in the loaded state', this.id === null || this.id === id || this.isNew());\n this.id = id;\n if (this.record.get('id') !== id) {\n this.record.set('id', id);\n }\n },\n\n didError: function didError(error) {\n this.error = error;\n this.isError = true;\n\n if (this.record) {\n this.record.setProperties({\n isError: true,\n adapterError: error\n });\n }\n },\n\n didCleanError: function didCleanError() {\n this.error = null;\n this.isError = false;\n\n if (this.record) {\n this.record.setProperties({\n isError: false,\n adapterError: null\n });\n }\n },\n /*\n If the adapter did not return a hash in response to a commit,\n merge the changed attributes and relationships into the existing\n saved data.\n @method adapterDidCommit\n */\n adapterDidCommit: function adapterDidCommit(data) {\n if (data) {\n data = data.attributes;\n }\n\n this.didCleanError();\n var changedKeys = this._changedKeys(data);\n\n assign(this._data, this._inFlightAttributes);\n if (data) {\n assign(this._data, data);\n }\n\n this._inFlightAttributes = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n\n this.send('didCommit');\n this.updateRecordArraysLater();\n\n if (!data) {\n return;\n }\n\n this.record._notifyProperties(changedKeys);\n },\n\n /*\n @method updateRecordArraysLater\n @private\n */\n updateRecordArraysLater: function updateRecordArraysLater() {\n // quick hack (something like this could be pushed into run.once\n if (this._updatingRecordArraysLater) {\n return;\n }\n this._updatingRecordArraysLater = true;\n _ember[\"default\"].run.schedule('actions', this, this.updateRecordArrays);\n },\n\n addErrorMessageToAttribute: function addErrorMessageToAttribute(attribute, message) {\n var record = this.getRecord();\n get(record, 'errors')._add(attribute, message);\n },\n\n removeErrorMessageFromAttribute: function removeErrorMessageFromAttribute(attribute) {\n var record = this.getRecord();\n get(record, 'errors')._remove(attribute);\n },\n\n clearErrorMessages: function clearErrorMessages() {\n var record = this.getRecord();\n get(record, 'errors')._clear();\n },\n\n hasErrors: function hasErrors() {\n var record = this.getRecord();\n var errors = get(record, 'errors');\n\n return !_ember[\"default\"].isEmpty(errors);\n },\n\n // FOR USE DURING COMMIT PROCESS\n\n /*\n @method adapterDidInvalidate\n @private\n */\n adapterDidInvalidate: function adapterDidInvalidate(errors) {\n var attribute;\n\n for (attribute in errors) {\n if (errors.hasOwnProperty(attribute)) {\n this.addErrorMessageToAttribute(attribute, errors[attribute]);\n }\n }\n\n this.send('becameInvalid');\n\n this._saveWasRejected();\n },\n\n /*\n @method adapterDidError\n @private\n */\n adapterDidError: function adapterDidError(error) {\n this.send('becameError');\n this.didError(error);\n this._saveWasRejected();\n },\n\n _saveWasRejected: function _saveWasRejected() {\n var keys = Object.keys(this._inFlightAttributes);\n for (var i = 0; i < keys.length; i++) {\n if (this._attributes[keys[i]] === undefined) {\n this._attributes[keys[i]] = this._inFlightAttributes[keys[i]];\n }\n }\n this._inFlightAttributes = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n },\n\n /*\n Ember Data has 3 buckets for storing the value of an attribute on an internalModel.\n `_data` holds all of the attributes that have been acknowledged by\n a backend via the adapter. When rollbackAttributes is called on a model all\n attributes will revert to the record's state in `_data`.\n `_attributes` holds any change the user has made to an attribute\n that has not been acknowledged by the adapter. Any values in\n `_attributes` are have priority over values in `_data`.\n `_inFlightAttributes`. When a record is being synced with the\n backend the values in `_attributes` are copied to\n `_inFlightAttributes`. This way if the backend acknowledges the\n save but does not return the new state Ember Data can copy the\n values from `_inFlightAttributes` to `_data`. Without having to\n worry about changes made to `_attributes` while the save was\n happenign.\n Changed keys builds a list of all of the values that may have been\n changed by the backend after a successful save.\n It does this by iterating over each key, value pair in the payload\n returned from the server after a save. If the `key` is found in\n `_attributes` then the user has a local changed to the attribute\n that has not been synced with the server and the key is not\n included in the list of changed keys.\n \n If the value, for a key differs from the value in what Ember Data\n believes to be the truth about the backend state (A merger of the\n `_data` and `_inFlightAttributes` objects where\n `_inFlightAttributes` has priority) then that means the backend\n has updated the value and the key is added to the list of changed\n keys.\n @method _changedKeys\n @private\n */\n _changedKeys: function _changedKeys(updates) {\n var changedKeys = [];\n\n if (updates) {\n var original, i, value, key;\n var keys = Object.keys(updates);\n var length = keys.length;\n\n original = assign(new _emberDataPrivateSystemEmptyObject[\"default\"](), this._data);\n original = assign(original, this._inFlightAttributes);\n\n for (i = 0; i < length; i++) {\n key = keys[i];\n value = updates[key];\n\n // A value in _attributes means the user has a local change to\n // this attributes. We never override this value when merging\n // updates from the backend so we should not sent a change\n // notification if the server value differs from the original.\n if (this._attributes[key] !== undefined) {\n continue;\n }\n\n if (!_ember[\"default\"].isEqual(original[key], value)) {\n changedKeys.push(key);\n }\n }\n }\n\n return changedKeys;\n },\n\n toString: function toString() {\n if (this.record) {\n return this.record.toString();\n } else {\n return \"<\" + this.modelName + \":\" + this.id + \">\";\n }\n },\n\n referenceFor: function referenceFor(type, name) {\n var reference = this.references[name];\n\n if (!reference) {\n var relationship = this._relationships.get(name);\n\n if (type === \"belongsTo\") {\n reference = new _emberDataPrivateSystemReferences.BelongsToReference(this.store, this, relationship);\n } else if (type === \"hasMany\") {\n reference = new _emberDataPrivateSystemReferences.HasManyReference(this.store, this, relationship);\n }\n\n this.references[name] = reference;\n }\n\n return reference;\n }\n };\n\n if (false) {\n /*\n Returns the latest truth for an attribute - the canonical value, or the\n in-flight value.\n @method lastAcknowledgedValue\n @private\n */\n InternalModel.prototype.lastAcknowledgedValue = function lastAcknowledgedValue(key) {\n if (key in this._inFlightAttributes) {\n return this._inFlightAttributes[key];\n } else {\n return this._data[key];\n }\n };\n }\n});","define(\"ember-data/-private/system/model/model\", [\"exports\", \"ember\", \"ember-data/-private/debug\", \"ember-data/-private/system/promise-proxies\", \"ember-data/-private/system/model/errors\", \"ember-data/-private/system/debug/debug-info\", \"ember-data/-private/system/relationships/belongs-to\", \"ember-data/-private/system/relationships/has-many\", \"ember-data/-private/system/relationships/ext\", \"ember-data/-private/system/model/attr\", \"ember-data/-private/features\"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateSystemPromiseProxies, _emberDataPrivateSystemModelErrors, _emberDataPrivateSystemDebugDebugInfo, _emberDataPrivateSystemRelationshipsBelongsTo, _emberDataPrivateSystemRelationshipsHasMany, _emberDataPrivateSystemRelationshipsExt, _emberDataPrivateSystemModelAttr, _emberDataPrivateFeatures) {\n \"use strict\";\n\n /**\n @module ember-data\n */\n\n var get = _ember[\"default\"].get;\n\n function intersection(array1, array2) {\n var result = [];\n array1.forEach(function (element) {\n if (array2.indexOf(element) >= 0) {\n result.push(element);\n }\n });\n\n return result;\n }\n\n var RESERVED_MODEL_PROPS = ['currentState', 'data', 'store'];\n\n var retrieveFromCurrentState = _ember[\"default\"].computed('currentState', function (key) {\n return get(this._internalModel.currentState, key);\n }).readOnly();\n\n /**\n \n The model class that all Ember Data records descend from.\n This is the public API of Ember Data models. If you are using Ember Data\n in your application, this is the class you should use.\n If you are working on Ember Data internals, you most likely want to be dealing\n with `InternalModel`\n \n @class Model\n @namespace DS\n @extends Ember.Object\n @uses Ember.Evented\n */\n var Model = _ember[\"default\"].Object.extend(_ember[\"default\"].Evented, {\n _internalModel: null,\n store: null,\n\n /**\n If this property is `true` the record is in the `empty`\n state. Empty is the first state all records enter after they have\n been created. Most records created by the store will quickly\n transition to the `loading` state if data needs to be fetched from\n the server or the `created` state if the record is created on the\n client. A record can also enter the empty state if the adapter is\n unable to locate the record.\n @property isEmpty\n @type {Boolean}\n @readOnly\n */\n isEmpty: retrieveFromCurrentState,\n /**\n If this property is `true` the record is in the `loading` state. A\n record enters this state when the store asks the adapter for its\n data. It remains in this state until the adapter provides the\n requested data.\n @property isLoading\n @type {Boolean}\n @readOnly\n */\n isLoading: retrieveFromCurrentState,\n /**\n If this property is `true` the record is in the `loaded` state. A\n record enters this state when its data is populated. Most of a\n record's lifecycle is spent inside substates of the `loaded`\n state.\n Example\n ```javascript\n var record = store.createRecord('model');\n record.get('isLoaded'); // true\n store.findRecord('model', 1).then(function(model) {\n model.get('isLoaded'); // true\n });\n ```\n @property isLoaded\n @type {Boolean}\n @readOnly\n */\n isLoaded: retrieveFromCurrentState,\n /**\n If this property is `true` the record is in the `dirty` state. The\n record has local changes that have not yet been saved by the\n adapter. This includes records that have been created (but not yet\n saved) or deleted.\n Example\n ```javascript\n var record = store.createRecord('model');\n record.get('hasDirtyAttributes'); // true\n store.findRecord('model', 1).then(function(model) {\n model.get('hasDirtyAttributes'); // false\n model.set('foo', 'some value');\n model.get('hasDirtyAttributes'); // true\n });\n ```\n @since 1.13.0\n @property hasDirtyAttributes\n @type {Boolean}\n @readOnly\n */\n hasDirtyAttributes: _ember[\"default\"].computed('currentState.isDirty', function () {\n return this.get('currentState.isDirty');\n }),\n /**\n If this property is `true` the record is in the `saving` state. A\n record enters the saving state when `save` is called, but the\n adapter has not yet acknowledged that the changes have been\n persisted to the backend.\n Example\n ```javascript\n var record = store.createRecord('model');\n record.get('isSaving'); // false\n var promise = record.save();\n record.get('isSaving'); // true\n promise.then(function() {\n record.get('isSaving'); // false\n });\n ```\n @property isSaving\n @type {Boolean}\n @readOnly\n */\n isSaving: retrieveFromCurrentState,\n /**\n If this property is `true` the record is in the `deleted` state\n and has been marked for deletion. When `isDeleted` is true and\n `hasDirtyAttributes` is true, the record is deleted locally but the deletion\n was not yet persisted. When `isSaving` is true, the change is\n in-flight. When both `hasDirtyAttributes` and `isSaving` are false, the\n change has persisted.\n Example\n ```javascript\n var record = store.createRecord('model');\n record.get('isDeleted'); // false\n record.deleteRecord();\n // Locally deleted\n record.get('isDeleted'); // true\n record.get('hasDirtyAttributes'); // true\n record.get('isSaving'); // false\n // Persisting the deletion\n var promise = record.save();\n record.get('isDeleted'); // true\n record.get('isSaving'); // true\n // Deletion Persisted\n promise.then(function() {\n record.get('isDeleted'); // true\n record.get('isSaving'); // false\n record.get('hasDirtyAttributes'); // false\n });\n ```\n @property isDeleted\n @type {Boolean}\n @readOnly\n */\n isDeleted: retrieveFromCurrentState,\n /**\n If this property is `true` the record is in the `new` state. A\n record will be in the `new` state when it has been created on the\n client and the adapter has not yet report that it was successfully\n saved.\n Example\n ```javascript\n var record = store.createRecord('model');\n record.get('isNew'); // true\n record.save().then(function(model) {\n model.get('isNew'); // false\n });\n ```\n @property isNew\n @type {Boolean}\n @readOnly\n */\n isNew: retrieveFromCurrentState,\n /**\n If this property is `true` the record is in the `valid` state.\n A record will be in the `valid` state when the adapter did not report any\n server-side validation failures.\n @property isValid\n @type {Boolean}\n @readOnly\n */\n isValid: retrieveFromCurrentState,\n /**\n If the record is in the dirty state this property will report what\n kind of change has caused it to move into the dirty\n state. Possible values are:\n - `created` The record has been created by the client and not yet saved to the adapter.\n - `updated` The record has been updated by the client and not yet saved to the adapter.\n - `deleted` The record has been deleted by the client and not yet saved to the adapter.\n Example\n ```javascript\n var record = store.createRecord('model');\n record.get('dirtyType'); // 'created'\n ```\n @property dirtyType\n @type {String}\n @readOnly\n */\n dirtyType: retrieveFromCurrentState,\n\n /**\n If `true` the adapter reported that it was unable to save local\n changes to the backend for any reason other than a server-side\n validation error.\n Example\n ```javascript\n record.get('isError'); // false\n record.set('foo', 'valid value');\n record.save().then(null, function() {\n record.get('isError'); // true\n });\n ```\n @property isError\n @type {Boolean}\n @readOnly\n */\n isError: false,\n\n /**\n If `true` the store is attempting to reload the record form the adapter.\n Example\n ```javascript\n record.get('isReloading'); // false\n record.reload();\n record.get('isReloading'); // true\n ```\n @property isReloading\n @type {Boolean}\n @readOnly\n */\n isReloading: false,\n\n /**\n All ember models have an id property. This is an identifier\n managed by an external source. These are always coerced to be\n strings before being used internally. Note when declaring the\n attributes for a model it is an error to declare an id\n attribute.\n ```javascript\n var record = store.createRecord('model');\n record.get('id'); // null\n store.findRecord('model', 1).then(function(model) {\n model.get('id'); // '1'\n });\n ```\n @property id\n @type {String}\n */\n id: null,\n\n /**\n @property currentState\n @private\n @type {Object}\n */\n\n /**\n When the record is in the `invalid` state this object will contain\n any errors returned by the adapter. When present the errors hash\n contains keys corresponding to the invalid property names\n and values which are arrays of Javascript objects with two keys:\n - `message` A string containing the error message from the backend\n - `attribute` The name of the property associated with this error message\n ```javascript\n record.get('errors.length'); // 0\n record.set('foo', 'invalid value');\n record.save().catch(function() {\n record.get('errors').get('foo');\n // [{message: 'foo should be a number.', attribute: 'foo'}]\n });\n ```\n The `errors` property us useful for displaying error messages to\n the user.\n ```handlebars\n Username: {{input value=username}} \n {{#each model.errors.username as |error|}}\n \n {{error.message}}\n
\n {{/each}}\n Email: {{input value=email}} \n {{#each model.errors.email as |error|}}\n \n {{error.message}}\n
\n {{/each}}\n ```\n You can also access the special `messages` property on the error\n object to get an array of all the error strings.\n ```handlebars\n {{#each model.errors.messages as |message|}}\n \n {{message}}\n
\n {{/each}}\n ```\n @property errors\n @type {DS.Errors}\n */\n errors: _ember[\"default\"].computed(function () {\n var errors = _emberDataPrivateSystemModelErrors[\"default\"].create();\n\n errors._registerHandlers(this._internalModel, function () {\n this.send('becameInvalid');\n }, function () {\n this.send('becameValid');\n });\n return errors;\n }).readOnly(),\n\n /**\n This property holds the `DS.AdapterError` object with which\n last adapter operation was rejected.\n @property adapterError\n @type {DS.AdapterError}\n */\n adapterError: null,\n\n /**\n Create a JSON representation of the record, using the serialization\n strategy of the store's adapter.\n `serialize` takes an optional hash as a parameter, currently\n supported options are:\n - `includeId`: `true` if the record's ID should be included in the\n JSON representation.\n @method serialize\n @param {Object} options\n @return {Object} an object whose values are primitive JSON values only\n */\n serialize: function serialize(options) {\n return this.store.serialize(this, options);\n },\n\n /**\n Use [DS.JSONSerializer](DS.JSONSerializer.html) to\n get the JSON representation of a record.\n `toJSON` takes an optional hash as a parameter, currently\n supported options are:\n - `includeId`: `true` if the record's ID should be included in the\n JSON representation.\n @method toJSON\n @param {Object} options\n @return {Object} A JSON representation of the object.\n */\n toJSON: function toJSON(options) {\n // container is for lazy transform lookups\n var serializer = this.store.serializerFor('-default');\n var snapshot = this._internalModel.createSnapshot();\n\n return serializer.serialize(snapshot, options);\n },\n\n /**\n Fired when the record is ready to be interacted with,\n that is either loaded from the server or created locally.\n @event ready\n */\n ready: _ember[\"default\"].K,\n\n /**\n Fired when the record is loaded from the server.\n @event didLoad\n */\n didLoad: _ember[\"default\"].K,\n\n /**\n Fired when the record is updated.\n @event didUpdate\n */\n didUpdate: _ember[\"default\"].K,\n\n /**\n Fired when a new record is commited to the server.\n @event didCreate\n */\n didCreate: _ember[\"default\"].K,\n\n /**\n Fired when the record is deleted.\n @event didDelete\n */\n didDelete: _ember[\"default\"].K,\n\n /**\n Fired when the record becomes invalid.\n @event becameInvalid\n */\n becameInvalid: _ember[\"default\"].K,\n\n /**\n Fired when the record enters the error state.\n @event becameError\n */\n becameError: _ember[\"default\"].K,\n\n /**\n Fired when the record is rolled back.\n @event rolledBack\n */\n rolledBack: _ember[\"default\"].K,\n\n //TODO Do we want to deprecate these?\n /**\n @method send\n @private\n @param {String} name\n @param {Object} context\n */\n send: function send(name, context) {\n return this._internalModel.send(name, context);\n },\n\n /**\n @method transitionTo\n @private\n @param {String} name\n */\n transitionTo: function transitionTo(name) {\n return this._internalModel.transitionTo(name);\n },\n\n /**\n Marks the record as deleted but does not save it. You must call\n `save` afterwards if you want to persist it. You might use this\n method if you want to allow the user to still `rollbackAttributes()`\n after a delete it was made.\n Example\n ```app/routes/model/delete.js\n import Ember from 'ember';\n export default Ember.Route.extend({\n actions: {\n softDelete: function() {\n this.controller.get('model').deleteRecord();\n },\n confirm: function() {\n this.controller.get('model').save();\n },\n undo: function() {\n this.controller.get('model').rollbackAttributes();\n }\n }\n });\n ```\n @method deleteRecord\n */\n deleteRecord: function deleteRecord() {\n this._internalModel.deleteRecord();\n },\n\n /**\n Same as `deleteRecord`, but saves the record immediately.\n Example\n ```app/routes/model/delete.js\n import Ember from 'ember';\n export default Ember.Route.extend({\n actions: {\n delete: function() {\n var controller = this.controller;\n controller.get('model').destroyRecord().then(function() {\n controller.transitionToRoute('model.index');\n });\n }\n }\n });\n ```\n If you pass an object on the `adapterOptions` property of the options\n argument it will be passed to you adapter via the snapshot\n ```js\n record.destroyRecord({ adapterOptions: { subscribe: false } });\n ```\n ```app/adapters/post.js\n import MyCustomAdapter from './custom-adapter';\n export default MyCustomAdapter.extend({\n deleteRecord: function(store, type, snapshot) {\n if (snapshot.adapterOptions.subscribe) {\n // ...\n }\n // ...\n }\n });\n ```\n @method destroyRecord\n @param {Object} options\n @return {Promise} a promise that will be resolved when the adapter returns\n successfully or rejected if the adapter returns with an error.\n */\n destroyRecord: function destroyRecord(options) {\n this.deleteRecord();\n return this.save(options);\n },\n\n /**\n @method unloadRecord\n @private\n */\n unloadRecord: function unloadRecord() {\n if (this.isDestroyed) {\n return;\n }\n this._internalModel.unloadRecord();\n },\n\n /**\n @method _notifyProperties\n @private\n */\n _notifyProperties: function _notifyProperties(keys) {\n _ember[\"default\"].beginPropertyChanges();\n var key;\n for (var i = 0, length = keys.length; i < length; i++) {\n key = keys[i];\n this.notifyPropertyChange(key);\n }\n _ember[\"default\"].endPropertyChanges();\n },\n\n /**\n Returns an object, whose keys are changed properties, and value is\n an [oldProp, newProp] array.\n The array represents the diff of the canonical state with the local state\n of the model. Note: if the model is created locally, the canonical state is\n empty since the adapter hasn't acknowledged the attributes yet:\n Example\n ```app/models/mascot.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n name: attr('string'),\n isAdmin: attr('boolean', {\n defaultValue: false\n })\n });\n ```\n ```javascript\n var mascot = store.createRecord('mascot');\n mascot.changedAttributes(); // {}\n mascot.set('name', 'Tomster');\n mascot.changedAttributes(); // { name: [undefined, 'Tomster'] }\n mascot.set('isAdmin', true);\n mascot.changedAttributes(); // { isAdmin: [undefined, true], name: [undefined, 'Tomster'] }\n mascot.save().then(function() {\n mascot.changedAttributes(); // {}\n mascot.set('isAdmin', false);\n mascot.changedAttributes(); // { isAdmin: [true, false] }\n });\n ```\n @method changedAttributes\n @return {Object} an object, whose keys are changed properties,\n and value is an [oldProp, newProp] array.\n */\n changedAttributes: function changedAttributes() {\n return this._internalModel.changedAttributes();\n },\n\n //TODO discuss with tomhuda about events/hooks\n //Bring back as hooks?\n /**\n @method adapterWillCommit\n @private\n adapterWillCommit: function() {\n this.send('willCommit');\n },\n /**\n @method adapterDidDirty\n @private\n adapterDidDirty: function() {\n this.send('becomeDirty');\n this.updateRecordArraysLater();\n },\n */\n\n /**\n If the model `hasDirtyAttributes` this function will discard any unsaved\n changes. If the model `isNew` it will be removed from the store.\n Example\n ```javascript\n record.get('name'); // 'Untitled Document'\n record.set('name', 'Doc 1');\n record.get('name'); // 'Doc 1'\n record.rollbackAttributes();\n record.get('name'); // 'Untitled Document'\n ```\n @since 1.13.0\n @method rollbackAttributes\n */\n rollbackAttributes: function rollbackAttributes() {\n this._internalModel.rollbackAttributes();\n },\n\n /*\n @method _createSnapshot\n @private\n */\n _createSnapshot: function _createSnapshot() {\n return this._internalModel.createSnapshot();\n },\n\n toStringExtension: function toStringExtension() {\n return get(this, 'id');\n },\n\n /**\n Save the record and persist any changes to the record to an\n external source via the adapter.\n Example\n ```javascript\n record.set('name', 'Tomster');\n record.save().then(function() {\n // Success callback\n }, function() {\n // Error callback\n });\n ```\n If you pass an object on the `adapterOptions` property of the options\n argument it will be passed to you adapter via the snapshot\n ```js\n record.save({ adapterOptions: { subscribe: false } });\n ```\n ```app/adapters/post.js\n import MyCustomAdapter from './custom-adapter';\n export default MyCustomAdapter.extend({\n updateRecord: function(store, type, snapshot) {\n if (snapshot.adapterOptions.subscribe) {\n // ...\n }\n // ...\n }\n });\n ```\n @method save\n @param {Object} options\n @return {Promise} a promise that will be resolved when the adapter returns\n successfully or rejected if the adapter returns with an error.\n */\n save: function save(options) {\n var _this = this;\n\n return _emberDataPrivateSystemPromiseProxies.PromiseObject.create({\n promise: this._internalModel.save(options).then(function () {\n return _this;\n })\n });\n },\n\n /**\n Reload the record from the adapter.\n This will only work if the record has already finished loading.\n Example\n ```app/routes/model/view.js\n import Ember from 'ember';\n export default Ember.Route.extend({\n actions: {\n reload: function() {\n this.controller.get('model').reload().then(function(model) {\n // do something with the reloaded model\n });\n }\n }\n });\n ```\n @method reload\n @return {Promise} a promise that will be resolved with the record when the\n adapter returns successfully or rejected if the adapter returns\n with an error.\n */\n reload: function reload() {\n var _this2 = this;\n\n return _emberDataPrivateSystemPromiseProxies.PromiseObject.create({\n promise: this._internalModel.reload().then(function () {\n return _this2;\n })\n });\n },\n\n /**\n Override the default event firing from Ember.Evented to\n also call methods with the given name.\n @method trigger\n @private\n @param {String} name\n */\n trigger: function trigger(name) {\n var length = arguments.length;\n var args = new Array(length - 1);\n\n for (var i = 1; i < length; i++) {\n args[i - 1] = arguments[i];\n }\n\n _ember[\"default\"].tryInvoke(this, name, args);\n this._super.apply(this, arguments);\n },\n\n willDestroy: function willDestroy() {\n //TODO Move!\n this._super.apply(this, arguments);\n this._internalModel.clearRelationships();\n this._internalModel.recordObjectWillDestroy();\n //TODO should we set internalModel to null here?\n },\n\n // This is a temporary solution until we refactor DS.Model to not\n // rely on the data property.\n willMergeMixin: function willMergeMixin(props) {\n var constructor = this.constructor;\n (0, _emberDataPrivateDebug.assert)('`' + intersection(Object.keys(props), RESERVED_MODEL_PROPS)[0] + '` is a reserved property name on DS.Model objects. Please choose a different property name for ' + constructor.toString(), !intersection(Object.keys(props), RESERVED_MODEL_PROPS)[0]);\n (0, _emberDataPrivateDebug.assert)(\"You may not set `id` as an attribute on your model. Please remove any lines that look like: `id: DS.attr('')` from \" + constructor.toString(), Object.keys(props).indexOf('id') === -1);\n },\n\n attr: function attr() {\n (0, _emberDataPrivateDebug.assert)(\"The `attr` method is not available on DS.Model, a DS.Snapshot was probably expected. Are you passing a DS.Model instead of a DS.Snapshot to your serializer?\", false);\n },\n\n /**\n Get the reference for the specified belongsTo relationship.\n Example\n ```javascript\n // models/blog.js\n export default DS.Model.extend({\n user: DS.belongsTo({ async: true })\n });\n var blog = store.push({\n type: 'blog',\n id: 1,\n relationships: {\n user: { type: 'user', id: 1 }\n }\n });\n var userRef = blog.belongsTo('user');\n // check if the user relationship is loaded\n var isLoaded = userRef.value() !== null;\n // get the record of the reference (null if not yet available)\n var user = userRef.value();\n // get the identifier of the reference\n if (userRef.remoteType() === \"id\") {\n var id = userRef.id();\n } else if (userRef.remoteType() === \"link\") {\n var link = userRef.link();\n }\n // load user (via store.findRecord or store.findBelongsTo)\n userRef.load().then(...)\n // or trigger a reload\n userRef.reload().then(...)\n // provide data for reference\n userRef.push({\n type: 'user',\n id: 1,\n attributes: {\n username: \"@user\"\n }\n }).then(function(user) {\n userRef.value() === user;\n });\n ```\n @method belongsTo\n @param {String} name of the relationship\n @since 2.5.0\n @return {BelongsToReference} reference for this relationship\n */\n belongsTo: function belongsTo(name) {\n return this._internalModel.referenceFor('belongsTo', name);\n },\n\n /**\n Get the reference for the specified hasMany relationship.\n Example\n ```javascript\n // models/blog.js\n export default DS.Model.extend({\n comments: DS.hasMany({ async: true })\n });\n var blog = store.push({\n type: 'blog',\n id: 1,\n relationships: {\n comments: {\n data: [\n { type: 'comment', id: 1 },\n { type: 'comment', id: 2 }\n ]\n }\n }\n });\n var commentsRef = blog.hasMany('comments');\n // check if the comments are loaded already\n var isLoaded = commentsRef.value() !== null;\n // get the records of the reference (null if not yet available)\n var comments = commentsRef.value();\n // get the identifier of the reference\n if (commentsRef.remoteType() === \"ids\") {\n var ids = commentsRef.ids();\n } else if (commentsRef.remoteType() === \"link\") {\n var link = commentsRef.link();\n }\n // load comments (via store.findMany or store.findHasMany)\n commentsRef.load().then(...)\n // or trigger a reload\n commentsRef.reload().then(...)\n // provide data for reference\n commentsRef.push([{ type: 'comment', id: 1 }, { type: 'comment', id: 2 }]).then(function(comments) {\n commentsRef.value() === comments;\n });\n ```\n @method hasMany\n @param {String} name of the relationship\n @since 2.5.0\n @return {HasManyReference} reference for this relationship\n */\n hasMany: function hasMany(name) {\n return this._internalModel.referenceFor('hasMany', name);\n },\n\n setId: _ember[\"default\"].observer('id', function () {\n this._internalModel.setId(this.get('id'));\n })\n });\n\n /**\n @property data\n @private\n @type {Object}\n */\n Object.defineProperty(Model.prototype, 'data', {\n get: function get() {\n return this._internalModel._data;\n }\n });\n\n Model.reopenClass({\n /**\n Alias DS.Model's `create` method to `_create`. This allows us to create DS.Model\n instances from within the store, but if end users accidentally call `create()`\n (instead of `createRecord()`), we can raise an error.\n @method _create\n @private\n @static\n */\n _create: Model.create,\n\n /**\n Override the class' `create()` method to raise an error. This\n prevents end users from inadvertently calling `create()` instead\n of `createRecord()`. The store is still able to create instances\n by calling the `_create()` method. To create an instance of a\n `DS.Model` use [store.createRecord](DS.Store.html#method_createRecord).\n @method create\n @private\n @static\n */\n create: function create() {\n throw new _ember[\"default\"].Error(\"You should not call `create` on a model. Instead, call `store.createRecord` with the attributes you would like to set.\");\n },\n\n /**\n Represents the model's class name as a string. This can be used to look up the model through\n DS.Store's modelFor method.\n `modelName` is generated for you by Ember Data. It will be a lowercased, dasherized string.\n For example:\n ```javascript\n store.modelFor('post').modelName; // 'post'\n store.modelFor('blog-post').modelName; // 'blog-post'\n ```\n The most common place you'll want to access `modelName` is in your serializer's `payloadKeyFromModelName` method. For example, to change payload\n keys to underscore (instead of dasherized), you might use the following code:\n ```javascript\n export default var PostSerializer = DS.RESTSerializer.extend({\n payloadKeyFromModelName: function(modelName) {\n return Ember.String.underscore(modelName);\n }\n });\n ```\n @property modelName\n @type String\n @readonly\n */\n modelName: null\n });\n\n // if `Ember.setOwner` is defined, accessing `this.container` is\n // deprecated (but functional). In \"standard\" Ember usage, this\n // deprecation is actually created via an `.extend` of the factory\n // inside the container itself, but that only happens on models\n // with MODEL_FACTORY_INJECTIONS enabled :(\n if (_ember[\"default\"].setOwner) {\n Object.defineProperty(Model.prototype, 'container', {\n configurable: true,\n enumerable: false,\n get: function get() {\n (0, _emberDataPrivateDebug.deprecate)('Using the injected `container` is deprecated. Please use the `getOwner` helper instead to access the owner of this object.', false, { id: 'ember-application.injected-container', until: '3.0.0' });\n\n return this.store.container;\n }\n });\n }\n\n if (false) {\n Model.reopen({\n /**\n Discards any unsaved changes to the given attribute.\n Example\n ```javascript\n record.get('name'); // 'Untitled Document'\n record.set('name', 'Doc 1');\n record.get('name'); // 'Doc 1'\n record.resetAttribute('name');\n record.get('name'); // 'Untitled Document'\n ```\n @method resetAttribute\n */\n resetAttribute: function resetAttribute(attributeName) {\n if (attributeName in this._internalModel._attributes) {\n this.set(attributeName, this._internalModel.lastAcknowledgedValue(attributeName));\n }\n }\n });\n }\n\n Model.reopenClass(_emberDataPrivateSystemRelationshipsExt.RelationshipsClassMethodsMixin);\n Model.reopenClass(_emberDataPrivateSystemModelAttr.AttrClassMethodsMixin);\n\n exports[\"default\"] = Model.extend(_emberDataPrivateSystemDebugDebugInfo[\"default\"], _emberDataPrivateSystemRelationshipsBelongsTo.BelongsToMixin, _emberDataPrivateSystemRelationshipsExt.DidDefinePropertyMixin, _emberDataPrivateSystemRelationshipsExt.RelationshipsInstanceMethodsMixin, _emberDataPrivateSystemRelationshipsHasMany.HasManyMixin, _emberDataPrivateSystemModelAttr.AttrInstanceMethodsMixin);\n});","define('ember-data/-private/system/model/states', ['exports', 'ember', 'ember-data/-private/debug'], function (exports, _ember, _emberDataPrivateDebug) {\n /**\n @module ember-data\n */\n 'use strict';\n\n var get = _ember['default'].get;\n /*\n This file encapsulates the various states that a record can transition\n through during its lifecycle.\n */\n /**\n ### State\n \n Each record has a `currentState` property that explicitly tracks what\n state a record is in at any given time. For instance, if a record is\n newly created and has not yet been sent to the adapter to be saved,\n it would be in the `root.loaded.created.uncommitted` state. If a\n record has had local modifications made to it that are in the\n process of being saved, the record would be in the\n `root.loaded.updated.inFlight` state. (This state paths will be\n explained in more detail below.)\n \n Events are sent by the record or its store to the record's\n `currentState` property. How the state reacts to these events is\n dependent on which state it is in. In some states, certain events\n will be invalid and will cause an exception to be raised.\n \n States are hierarchical and every state is a substate of the\n `RootState`. For example, a record can be in the\n `root.deleted.uncommitted` state, then transition into the\n `root.deleted.inFlight` state. If a child state does not implement\n an event handler, the state manager will attempt to invoke the event\n on all parent states until the root state is reached. The state\n hierarchy of a record is described in terms of a path string. You\n can determine a record's current state by getting the state's\n `stateName` property:\n \n ```javascript\n record.get('currentState.stateName');\n //=> \"root.created.uncommitted\"\n ```\n \n The hierarchy of valid states that ship with ember data looks like\n this:\n \n ```text\n * root\n * deleted\n * saved\n * uncommitted\n * inFlight\n * empty\n * loaded\n * created\n * uncommitted\n * inFlight\n * saved\n * updated\n * uncommitted\n * inFlight\n * loading\n ```\n \n The `DS.Model` states are themselves stateless. What that means is\n that, the hierarchical states that each of *those* points to is a\n shared data structure. For performance reasons, instead of each\n record getting its own copy of the hierarchy of states, each record\n points to this global, immutable shared instance. How does a state\n know which record it should be acting on? We pass the record\n instance into the state's event handlers as the first argument.\n \n The record passed as the first parameter is where you should stash\n state about the record if needed; you should never store data on the state\n object itself.\n \n ### Events and Flags\n \n A state may implement zero or more events and flags.\n \n #### Events\n \n Events are named functions that are invoked when sent to a record. The\n record will first look for a method with the given name on the\n current state. If no method is found, it will search the current\n state's parent, and then its grandparent, and so on until reaching\n the top of the hierarchy. If the root is reached without an event\n handler being found, an exception will be raised. This can be very\n helpful when debugging new features.\n \n Here's an example implementation of a state with a `myEvent` event handler:\n \n ```javascript\n aState: DS.State.create({\n myEvent: function(manager, param) {\n console.log(\"Received myEvent with\", param);\n }\n })\n ```\n \n To trigger this event:\n \n ```javascript\n record.send('myEvent', 'foo');\n //=> \"Received myEvent with foo\"\n ```\n \n Note that an optional parameter can be sent to a record's `send()` method,\n which will be passed as the second parameter to the event handler.\n \n Events should transition to a different state if appropriate. This can be\n done by calling the record's `transitionTo()` method with a path to the\n desired state. The state manager will attempt to resolve the state path\n relative to the current state. If no state is found at that path, it will\n attempt to resolve it relative to the current state's parent, and then its\n parent, and so on until the root is reached. For example, imagine a hierarchy\n like this:\n \n * created\n * uncommitted <-- currentState\n * inFlight\n * updated\n * inFlight\n \n If we are currently in the `uncommitted` state, calling\n `transitionTo('inFlight')` would transition to the `created.inFlight` state,\n while calling `transitionTo('updated.inFlight')` would transition to\n the `updated.inFlight` state.\n \n Remember that *only events* should ever cause a state transition. You should\n never call `transitionTo()` from outside a state's event handler. If you are\n tempted to do so, create a new event and send that to the state manager.\n \n #### Flags\n \n Flags are Boolean values that can be used to introspect a record's current\n state in a more user-friendly way than examining its state path. For example,\n instead of doing this:\n \n ```javascript\n var statePath = record.get('stateManager.currentPath');\n if (statePath === 'created.inFlight') {\n doSomething();\n }\n ```\n \n You can say:\n \n ```javascript\n if (record.get('isNew') && record.get('isSaving')) {\n doSomething();\n }\n ```\n \n If your state does not set a value for a given flag, the value will\n be inherited from its parent (or the first place in the state hierarchy\n where it is defined).\n \n The current set of flags are defined below. If you want to add a new flag,\n in addition to the area below, you will also need to declare it in the\n `DS.Model` class.\n \n \n * [isEmpty](DS.Model.html#property_isEmpty)\n * [isLoading](DS.Model.html#property_isLoading)\n * [isLoaded](DS.Model.html#property_isLoaded)\n * [isDirty](DS.Model.html#property_isDirty)\n * [isSaving](DS.Model.html#property_isSaving)\n * [isDeleted](DS.Model.html#property_isDeleted)\n * [isNew](DS.Model.html#property_isNew)\n * [isValid](DS.Model.html#property_isValid)\n \n @namespace DS\n @class RootState\n */\n\n function _didSetProperty(internalModel, context) {\n if (context.value === context.originalValue) {\n delete internalModel._attributes[context.name];\n internalModel.send('propertyWasReset', context.name);\n } else if (context.value !== context.oldValue) {\n internalModel.send('becomeDirty');\n }\n\n internalModel.updateRecordArraysLater();\n }\n\n // Implementation notes:\n //\n // Each state has a boolean value for all of the following flags:\n //\n // * isLoaded: The record has a populated `data` property. When a\n // record is loaded via `store.find`, `isLoaded` is false\n // until the adapter sets it. When a record is created locally,\n // its `isLoaded` property is always true.\n // * isDirty: The record has local changes that have not yet been\n // saved by the adapter. This includes records that have been\n // created (but not yet saved) or deleted.\n // * isSaving: The record has been committed, but\n // the adapter has not yet acknowledged that the changes have\n // been persisted to the backend.\n // * isDeleted: The record was marked for deletion. When `isDeleted`\n // is true and `isDirty` is true, the record is deleted locally\n // but the deletion was not yet persisted. When `isSaving` is\n // true, the change is in-flight. When both `isDirty` and\n // `isSaving` are false, the change has persisted.\n // * isNew: The record was created on the client and the adapter\n // did not yet report that it was successfully saved.\n // * isValid: The adapter did not report any server-side validation\n // failures.\n\n // The dirty state is a abstract state whose functionality is\n // shared between the `created` and `updated` states.\n //\n // The deleted state shares the `isDirty` flag with the\n // subclasses of `DirtyState`, but with a very different\n // implementation.\n //\n // Dirty states have three child states:\n //\n // `uncommitted`: the store has not yet handed off the record\n // to be saved.\n // `inFlight`: the store has handed off the record to be saved,\n // but the adapter has not yet acknowledged success.\n // `invalid`: the record has invalid information and cannot be\n // sent to the adapter yet.\n var DirtyState = {\n initialState: 'uncommitted',\n\n // FLAGS\n isDirty: true,\n\n // SUBSTATES\n\n // When a record first becomes dirty, it is `uncommitted`.\n // This means that there are local pending changes, but they\n // have not yet begun to be saved, and are not invalid.\n uncommitted: {\n // EVENTS\n didSetProperty: _didSetProperty,\n\n //TODO(Igor) reloading now triggers a\n //loadingData event, though it seems fine?\n loadingData: _ember['default'].K,\n\n propertyWasReset: function propertyWasReset(internalModel, name) {\n if (!internalModel.hasChangedAttributes()) {\n internalModel.send('rolledBack');\n }\n },\n\n pushedData: function pushedData(internalModel) {\n internalModel.updateChangedAttributes();\n\n if (!internalModel.hasChangedAttributes()) {\n internalModel.transitionTo('loaded.saved');\n }\n },\n\n becomeDirty: _ember['default'].K,\n\n willCommit: function willCommit(internalModel) {\n internalModel.transitionTo('inFlight');\n },\n\n reloadRecord: function reloadRecord(internalModel, resolve) {\n resolve(internalModel.store.reloadRecord(internalModel));\n },\n\n rolledBack: function rolledBack(internalModel) {\n internalModel.transitionTo('loaded.saved');\n },\n\n becameInvalid: function becameInvalid(internalModel) {\n internalModel.transitionTo('invalid');\n },\n\n rollback: function rollback(internalModel) {\n internalModel.rollbackAttributes();\n internalModel.triggerLater('ready');\n }\n },\n\n // Once a record has been handed off to the adapter to be\n // saved, it is in the 'in flight' state. Changes to the\n // record cannot be made during this window.\n inFlight: {\n // FLAGS\n isSaving: true,\n\n // EVENTS\n didSetProperty: _didSetProperty,\n becomeDirty: _ember['default'].K,\n pushedData: _ember['default'].K,\n\n unloadRecord: assertAgainstUnloadRecord,\n\n // TODO: More robust semantics around save-while-in-flight\n willCommit: _ember['default'].K,\n\n didCommit: function didCommit(internalModel) {\n var dirtyType = get(this, 'dirtyType');\n\n internalModel.transitionTo('saved');\n internalModel.send('invokeLifecycleCallbacks', dirtyType);\n },\n\n becameInvalid: function becameInvalid(internalModel) {\n internalModel.transitionTo('invalid');\n internalModel.send('invokeLifecycleCallbacks');\n },\n\n becameError: function becameError(internalModel) {\n internalModel.transitionTo('uncommitted');\n internalModel.triggerLater('becameError', internalModel);\n }\n },\n\n // A record is in the `invalid` if the adapter has indicated\n // the the record failed server-side invalidations.\n invalid: {\n // FLAGS\n isValid: false,\n\n // EVENTS\n deleteRecord: function deleteRecord(internalModel) {\n internalModel.transitionTo('deleted.uncommitted');\n },\n\n didSetProperty: function didSetProperty(internalModel, context) {\n internalModel.removeErrorMessageFromAttribute(context.name);\n\n _didSetProperty(internalModel, context);\n\n if (!internalModel.hasErrors()) {\n this.becameValid(internalModel);\n }\n },\n\n becameInvalid: _ember['default'].K,\n becomeDirty: _ember['default'].K,\n pushedData: _ember['default'].K,\n\n willCommit: function willCommit(internalModel) {\n internalModel.clearErrorMessages();\n internalModel.transitionTo('inFlight');\n },\n\n rolledBack: function rolledBack(internalModel) {\n internalModel.clearErrorMessages();\n internalModel.transitionTo('loaded.saved');\n internalModel.triggerLater('ready');\n },\n\n becameValid: function becameValid(internalModel) {\n internalModel.transitionTo('uncommitted');\n },\n\n invokeLifecycleCallbacks: function invokeLifecycleCallbacks(internalModel) {\n internalModel.triggerLater('becameInvalid', internalModel);\n }\n }\n };\n\n // The created and updated states are created outside the state\n // chart so we can reopen their substates and add mixins as\n // necessary.\n\n function deepClone(object) {\n var clone = {};\n var value;\n\n for (var prop in object) {\n value = object[prop];\n if (value && typeof value === 'object') {\n clone[prop] = deepClone(value);\n } else {\n clone[prop] = value;\n }\n }\n\n return clone;\n }\n\n function mixin(original, hash) {\n for (var prop in hash) {\n original[prop] = hash[prop];\n }\n\n return original;\n }\n\n function dirtyState(options) {\n var newState = deepClone(DirtyState);\n return mixin(newState, options);\n }\n\n var createdState = dirtyState({\n dirtyType: 'created',\n // FLAGS\n isNew: true\n });\n\n createdState.invalid.rolledBack = function (internalModel) {\n internalModel.transitionTo('deleted.saved');\n };\n createdState.uncommitted.rolledBack = function (internalModel) {\n internalModel.transitionTo('deleted.saved');\n };\n\n var updatedState = dirtyState({\n dirtyType: 'updated'\n });\n\n function createdStateDeleteRecord(internalModel) {\n internalModel.transitionTo('deleted.saved');\n internalModel.send('invokeLifecycleCallbacks');\n }\n\n createdState.uncommitted.deleteRecord = createdStateDeleteRecord;\n\n createdState.invalid.deleteRecord = createdStateDeleteRecord;\n\n createdState.uncommitted.rollback = function (internalModel) {\n DirtyState.uncommitted.rollback.apply(this, arguments);\n internalModel.transitionTo('deleted.saved');\n };\n\n createdState.uncommitted.pushedData = function (internalModel) {\n internalModel.transitionTo('loaded.updated.uncommitted');\n internalModel.triggerLater('didLoad');\n };\n\n createdState.uncommitted.propertyWasReset = _ember['default'].K;\n\n function assertAgainstUnloadRecord(internalModel) {\n (0, _emberDataPrivateDebug.assert)(\"You can only unload a record which is not inFlight. `\" + internalModel + \"`\", false);\n }\n\n updatedState.inFlight.unloadRecord = assertAgainstUnloadRecord;\n\n updatedState.uncommitted.deleteRecord = function (internalModel) {\n internalModel.transitionTo('deleted.uncommitted');\n };\n\n var RootState = {\n // FLAGS\n isEmpty: false,\n isLoading: false,\n isLoaded: false,\n isDirty: false,\n isSaving: false,\n isDeleted: false,\n isNew: false,\n isValid: true,\n\n // DEFAULT EVENTS\n\n // Trying to roll back if you're not in the dirty state\n // doesn't change your state. For example, if you're in the\n // in-flight state, rolling back the record doesn't move\n // you out of the in-flight state.\n rolledBack: _ember['default'].K,\n unloadRecord: function unloadRecord(internalModel) {\n // clear relationships before moving to deleted state\n // otherwise it fails\n internalModel.clearRelationships();\n internalModel.transitionTo('deleted.saved');\n },\n\n propertyWasReset: _ember['default'].K,\n\n // SUBSTATES\n\n // A record begins its lifecycle in the `empty` state.\n // If its data will come from the adapter, it will\n // transition into the `loading` state. Otherwise, if\n // the record is being created on the client, it will\n // transition into the `created` state.\n empty: {\n isEmpty: true,\n\n // EVENTS\n loadingData: function loadingData(internalModel, promise) {\n internalModel._loadingPromise = promise;\n internalModel.transitionTo('loading');\n },\n\n loadedData: function loadedData(internalModel) {\n internalModel.transitionTo('loaded.created.uncommitted');\n internalModel.triggerLater('ready');\n },\n\n pushedData: function pushedData(internalModel) {\n internalModel.transitionTo('loaded.saved');\n internalModel.triggerLater('didLoad');\n internalModel.triggerLater('ready');\n }\n },\n\n // A record enters this state when the store asks\n // the adapter for its data. It remains in this state\n // until the adapter provides the requested data.\n //\n // Usually, this process is asynchronous, using an\n // XHR to retrieve the data.\n loading: {\n // FLAGS\n isLoading: true,\n\n exit: function exit(internalModel) {\n internalModel._loadingPromise = null;\n },\n\n // EVENTS\n pushedData: function pushedData(internalModel) {\n internalModel.transitionTo('loaded.saved');\n internalModel.triggerLater('didLoad');\n internalModel.triggerLater('ready');\n //TODO this seems out of place here\n internalModel.didCleanError();\n },\n\n becameError: function becameError(internalModel) {\n internalModel.triggerLater('becameError', internalModel);\n },\n\n notFound: function notFound(internalModel) {\n internalModel.transitionTo('empty');\n }\n },\n\n // A record enters this state when its data is populated.\n // Most of a record's lifecycle is spent inside substates\n // of the `loaded` state.\n loaded: {\n initialState: 'saved',\n\n // FLAGS\n isLoaded: true,\n\n //TODO(Igor) Reloading now triggers a loadingData event,\n //but it should be ok?\n loadingData: _ember['default'].K,\n\n // SUBSTATES\n\n // If there are no local changes to a record, it remains\n // in the `saved` state.\n saved: {\n setup: function setup(internalModel) {\n if (internalModel.hasChangedAttributes()) {\n internalModel.adapterDidDirty();\n }\n },\n\n // EVENTS\n didSetProperty: _didSetProperty,\n\n pushedData: _ember['default'].K,\n\n becomeDirty: function becomeDirty(internalModel) {\n internalModel.transitionTo('updated.uncommitted');\n },\n\n willCommit: function willCommit(internalModel) {\n internalModel.transitionTo('updated.inFlight');\n },\n\n reloadRecord: function reloadRecord(internalModel, resolve) {\n resolve(internalModel.store.reloadRecord(internalModel));\n },\n\n deleteRecord: function deleteRecord(internalModel) {\n internalModel.transitionTo('deleted.uncommitted');\n },\n\n unloadRecord: function unloadRecord(internalModel) {\n // clear relationships before moving to deleted state\n // otherwise it fails\n internalModel.clearRelationships();\n internalModel.transitionTo('deleted.saved');\n },\n\n didCommit: function didCommit(internalModel) {\n internalModel.send('invokeLifecycleCallbacks', get(internalModel, 'lastDirtyType'));\n },\n\n // loaded.saved.notFound would be triggered by a failed\n // `reload()` on an unchanged record\n notFound: _ember['default'].K\n\n },\n\n // A record is in this state after it has been locally\n // created but before the adapter has indicated that\n // it has been saved.\n created: createdState,\n\n // A record is in this state if it has already been\n // saved to the server, but there are new local changes\n // that have not yet been saved.\n updated: updatedState\n },\n\n // A record is in this state if it was deleted from the store.\n deleted: {\n initialState: 'uncommitted',\n dirtyType: 'deleted',\n\n // FLAGS\n isDeleted: true,\n isLoaded: true,\n isDirty: true,\n\n // TRANSITIONS\n setup: function setup(internalModel) {\n internalModel.updateRecordArrays();\n },\n\n // SUBSTATES\n\n // When a record is deleted, it enters the `start`\n // state. It will exit this state when the record\n // starts to commit.\n uncommitted: {\n\n // EVENTS\n\n willCommit: function willCommit(internalModel) {\n internalModel.transitionTo('inFlight');\n },\n\n rollback: function rollback(internalModel) {\n internalModel.rollbackAttributes();\n internalModel.triggerLater('ready');\n },\n\n pushedData: _ember['default'].K,\n becomeDirty: _ember['default'].K,\n deleteRecord: _ember['default'].K,\n\n rolledBack: function rolledBack(internalModel) {\n internalModel.transitionTo('loaded.saved');\n internalModel.triggerLater('ready');\n }\n },\n\n // After a record starts committing, but\n // before the adapter indicates that the deletion\n // has saved to the server, a record is in the\n // `inFlight` substate of `deleted`.\n inFlight: {\n // FLAGS\n isSaving: true,\n\n // EVENTS\n\n unloadRecord: assertAgainstUnloadRecord,\n\n // TODO: More robust semantics around save-while-in-flight\n willCommit: _ember['default'].K,\n didCommit: function didCommit(internalModel) {\n internalModel.transitionTo('saved');\n\n internalModel.send('invokeLifecycleCallbacks');\n },\n\n becameError: function becameError(internalModel) {\n internalModel.transitionTo('uncommitted');\n internalModel.triggerLater('becameError', internalModel);\n },\n\n becameInvalid: function becameInvalid(internalModel) {\n internalModel.transitionTo('invalid');\n internalModel.triggerLater('becameInvalid', internalModel);\n }\n },\n\n // Once the adapter indicates that the deletion has\n // been saved, the record enters the `saved` substate\n // of `deleted`.\n saved: {\n // FLAGS\n isDirty: false,\n\n setup: function setup(internalModel) {\n internalModel.clearRelationships();\n var store = internalModel.store;\n store._dematerializeRecord(internalModel);\n },\n\n invokeLifecycleCallbacks: function invokeLifecycleCallbacks(internalModel) {\n internalModel.triggerLater('didDelete', internalModel);\n internalModel.triggerLater('didCommit', internalModel);\n },\n\n willCommit: _ember['default'].K,\n\n didCommit: _ember['default'].K\n },\n\n invalid: {\n isValid: false,\n\n didSetProperty: function didSetProperty(internalModel, context) {\n internalModel.removeErrorMessageFromAttribute(context.name);\n\n _didSetProperty(internalModel, context);\n\n if (!internalModel.hasErrors()) {\n this.becameValid(internalModel);\n }\n },\n\n becameInvalid: _ember['default'].K,\n becomeDirty: _ember['default'].K,\n deleteRecord: _ember['default'].K,\n willCommit: _ember['default'].K,\n\n rolledBack: function rolledBack(internalModel) {\n internalModel.clearErrorMessages();\n internalModel.transitionTo('loaded.saved');\n internalModel.triggerLater('ready');\n },\n\n becameValid: function becameValid(internalModel) {\n internalModel.transitionTo('uncommitted');\n }\n\n }\n },\n\n invokeLifecycleCallbacks: function invokeLifecycleCallbacks(internalModel, dirtyType) {\n if (dirtyType === 'created') {\n internalModel.triggerLater('didCreate', internalModel);\n } else {\n internalModel.triggerLater('didUpdate', internalModel);\n }\n\n internalModel.triggerLater('didCommit', internalModel);\n }\n };\n\n function wireState(object, parent, name) {\n // TODO: Use Object.create and copy instead\n object = mixin(parent ? Object.create(parent) : {}, object);\n object.parentState = parent;\n object.stateName = name;\n\n for (var prop in object) {\n if (!object.hasOwnProperty(prop) || prop === 'parentState' || prop === 'stateName') {\n continue;\n }\n if (typeof object[prop] === 'object') {\n object[prop] = wireState(object[prop], object, name + \".\" + prop);\n }\n }\n\n return object;\n }\n\n RootState = wireState(RootState, null, \"root\");\n\n exports['default'] = RootState;\n});","define('ember-data/-private/system/normalize-link', ['exports'], function (exports) {\n 'use strict';\n\n exports['default'] = _normalizeLink;\n\n /*\n This method normalizes a link to an \"links object\". If the passed link is\n already an object it's returned without any modifications.\n \n See http://jsonapi.org/format/#document-links for more information.\n \n @method _normalizeLink\n @private\n @param {String} link\n @return {Object|null}\n @for DS\n */\n function _normalizeLink(link) {\n switch (typeof link) {\n case 'object':\n return link;\n case 'string':\n return { href: link };\n }\n return null;\n }\n});","define('ember-data/-private/system/normalize-model-name', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports['default'] = normalizeModelName;\n\n /**\n All modelNames are dasherized internally. Changing this function may\n require changes to other normalization hooks (such as typeForRoot).\n @method normalizeModelName\n @public\n @param {String} modelName\n @return {String} if the adapter can generate one, an ID\n @for DS\n */\n function normalizeModelName(modelName) {\n return _ember['default'].String.dasherize(modelName);\n }\n});","define('ember-data/-private/system/ordered-set', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports['default'] = OrderedSet;\n\n var EmberOrderedSet = _ember['default'].OrderedSet;\n var guidFor = _ember['default'].guidFor;\n function OrderedSet() {\n this._super$constructor();\n }\n\n OrderedSet.create = function () {\n var Constructor = this;\n return new Constructor();\n };\n\n OrderedSet.prototype = Object.create(EmberOrderedSet.prototype);\n OrderedSet.prototype.constructor = OrderedSet;\n OrderedSet.prototype._super$constructor = EmberOrderedSet;\n\n OrderedSet.prototype.addWithIndex = function (obj, idx) {\n var guid = guidFor(obj);\n var presenceSet = this.presenceSet;\n var list = this.list;\n\n if (presenceSet[guid] === true) {\n return;\n }\n\n presenceSet[guid] = true;\n\n if (idx === undefined || idx === null) {\n list.push(obj);\n } else {\n list.splice(idx, 0, obj);\n }\n\n this.size += 1;\n\n return this;\n };\n});","define('ember-data/-private/system/promise-proxies', ['exports', 'ember', 'ember-data/-private/debug'], function (exports, _ember, _emberDataPrivateDebug) {\n 'use strict';\n\n var Promise = _ember['default'].RSVP.Promise;\n var get = _ember['default'].get;\n\n /**\n A `PromiseArray` is an object that acts like both an `Ember.Array`\n and a promise. When the promise is resolved the resulting value\n will be set to the `PromiseArray`'s `content` property. This makes\n it easy to create data bindings with the `PromiseArray` that will be\n updated when the promise resolves.\n \n For more information see the [Ember.PromiseProxyMixin\n documentation](/api/classes/Ember.PromiseProxyMixin.html).\n \n Example\n \n ```javascript\n var promiseArray = DS.PromiseArray.create({\n promise: $.getJSON('/some/remote/data.json')\n });\n \n promiseArray.get('length'); // 0\n \n promiseArray.then(function() {\n promiseArray.get('length'); // 100\n });\n ```\n \n @class PromiseArray\n @namespace DS\n @extends Ember.ArrayProxy\n @uses Ember.PromiseProxyMixin\n */\n var PromiseArray = _ember['default'].ArrayProxy.extend(_ember['default'].PromiseProxyMixin);\n\n /**\n A `PromiseObject` is an object that acts like both an `Ember.Object`\n and a promise. When the promise is resolved, then the resulting value\n will be set to the `PromiseObject`'s `content` property. This makes\n it easy to create data bindings with the `PromiseObject` that will\n be updated when the promise resolves.\n \n For more information see the [Ember.PromiseProxyMixin\n documentation](/api/classes/Ember.PromiseProxyMixin.html).\n \n Example\n \n ```javascript\n var promiseObject = DS.PromiseObject.create({\n promise: $.getJSON('/some/remote/data.json')\n });\n \n promiseObject.get('name'); // null\n \n promiseObject.then(function() {\n promiseObject.get('name'); // 'Tomster'\n });\n ```\n \n @class PromiseObject\n @namespace DS\n @extends Ember.ObjectProxy\n @uses Ember.PromiseProxyMixin\n */\n var PromiseObject = _ember['default'].ObjectProxy.extend(_ember['default'].PromiseProxyMixin);\n\n var promiseObject = function promiseObject(promise, label) {\n return PromiseObject.create({\n promise: Promise.resolve(promise, label)\n });\n };\n\n var promiseArray = function promiseArray(promise, label) {\n return PromiseArray.create({\n promise: Promise.resolve(promise, label)\n });\n };\n\n /**\n A PromiseManyArray is a PromiseArray that also proxies certain method calls\n to the underlying manyArray.\n Right now we proxy:\n \n * `reload()`\n * `createRecord()`\n * `on()`\n * `one()`\n * `trigger()`\n * `off()`\n * `has()`\n \n @class PromiseManyArray\n @namespace DS\n @extends Ember.ArrayProxy\n */\n\n function proxyToContent(method) {\n return function () {\n var content = get(this, 'content');\n return content[method].apply(content, arguments);\n };\n }\n\n var PromiseManyArray = PromiseArray.extend({\n reload: function reload() {\n //I don't think this should ever happen right now, but worth guarding if we refactor the async relationships\n (0, _emberDataPrivateDebug.assert)('You are trying to reload an async manyArray before it has been created', get(this, 'content'));\n return PromiseManyArray.create({\n promise: get(this, 'content').reload()\n });\n },\n\n createRecord: proxyToContent('createRecord'),\n\n on: proxyToContent('on'),\n\n one: proxyToContent('one'),\n\n trigger: proxyToContent('trigger'),\n\n off: proxyToContent('off'),\n\n has: proxyToContent('has')\n });\n\n var promiseManyArray = function promiseManyArray(promise, label) {\n return PromiseManyArray.create({\n promise: Promise.resolve(promise, label)\n });\n };\n\n exports.PromiseArray = PromiseArray;\n exports.PromiseObject = PromiseObject;\n exports.PromiseManyArray = PromiseManyArray;\n exports.promiseArray = promiseArray;\n exports.promiseObject = promiseObject;\n exports.promiseManyArray = promiseManyArray;\n});","define(\"ember-data/-private/system/record-array-manager\", [\"exports\", \"ember\", \"ember-data/-private/system/record-arrays\", \"ember-data/-private/system/ordered-set\"], function (exports, _ember, _emberDataPrivateSystemRecordArrays, _emberDataPrivateSystemOrderedSet) {\n /**\n @module ember-data\n */\n\n \"use strict\";\n\n var MapWithDefault = _ember[\"default\"].MapWithDefault;var get = _ember[\"default\"].get;\n\n /**\n @class RecordArrayManager\n @namespace DS\n @private\n @extends Ember.Object\n */\n exports[\"default\"] = _ember[\"default\"].Object.extend({\n init: function init() {\n var _this = this;\n\n this.filteredRecordArrays = MapWithDefault.create({\n defaultValue: function defaultValue() {\n return [];\n }\n });\n\n this.liveRecordArrays = MapWithDefault.create({\n defaultValue: function defaultValue(typeClass) {\n return _this.createRecordArray(typeClass);\n }\n });\n\n this.changedRecords = [];\n this._adapterPopulatedRecordArrays = [];\n },\n\n recordDidChange: function recordDidChange(record) {\n if (this.changedRecords.push(record) !== 1) {\n return;\n }\n\n _ember[\"default\"].run.schedule('actions', this, this.updateRecordArrays);\n },\n\n recordArraysForRecord: function recordArraysForRecord(record) {\n record._recordArrays = record._recordArrays || _emberDataPrivateSystemOrderedSet[\"default\"].create();\n return record._recordArrays;\n },\n\n /**\n This method is invoked whenever data is loaded into the store by the\n adapter or updated by the adapter, or when a record has changed.\n It updates all record arrays that a record belongs to.\n To avoid thrashing, it only runs at most once per run loop.\n @method updateRecordArrays\n */\n updateRecordArrays: function updateRecordArrays() {\n var _this2 = this;\n\n this.changedRecords.forEach(function (internalModel) {\n if (get(internalModel, 'record.isDestroyed') || get(internalModel, 'record.isDestroying') || get(internalModel, 'currentState.stateName') === 'root.deleted.saved') {\n _this2._recordWasDeleted(internalModel);\n } else {\n _this2._recordWasChanged(internalModel);\n }\n });\n\n this.changedRecords.length = 0;\n },\n\n _recordWasDeleted: function _recordWasDeleted(record) {\n var recordArrays = record._recordArrays;\n\n if (!recordArrays) {\n return;\n }\n\n recordArrays.forEach(function (array) {\n return array.removeInternalModel(record);\n });\n\n record._recordArrays = null;\n },\n\n _recordWasChanged: function _recordWasChanged(record) {\n var _this3 = this;\n\n var typeClass = record.type;\n var recordArrays = this.filteredRecordArrays.get(typeClass);\n var filter;\n recordArrays.forEach(function (array) {\n filter = get(array, 'filterFunction');\n _this3.updateFilterRecordArray(array, filter, typeClass, record);\n });\n },\n\n //Need to update live arrays on loading\n recordWasLoaded: function recordWasLoaded(record) {\n var _this4 = this;\n\n var typeClass = record.type;\n var recordArrays = this.filteredRecordArrays.get(typeClass);\n var filter;\n\n recordArrays.forEach(function (array) {\n filter = get(array, 'filterFunction');\n _this4.updateFilterRecordArray(array, filter, typeClass, record);\n });\n\n if (this.liveRecordArrays.has(typeClass)) {\n var liveRecordArray = this.liveRecordArrays.get(typeClass);\n this._addRecordToRecordArray(liveRecordArray, record);\n }\n },\n /**\n Update an individual filter.\n @method updateFilterRecordArray\n @param {DS.FilteredRecordArray} array\n @param {Function} filter\n @param {DS.Model} typeClass\n @param {InternalModel} record\n */\n updateFilterRecordArray: function updateFilterRecordArray(array, filter, typeClass, record) {\n var shouldBeInArray = filter(record.getRecord());\n var recordArrays = this.recordArraysForRecord(record);\n if (shouldBeInArray) {\n this._addRecordToRecordArray(array, record);\n } else {\n recordArrays[\"delete\"](array);\n array.removeInternalModel(record);\n }\n },\n\n _addRecordToRecordArray: function _addRecordToRecordArray(array, record) {\n var recordArrays = this.recordArraysForRecord(record);\n if (!recordArrays.has(array)) {\n array.addInternalModel(record);\n recordArrays.add(array);\n }\n },\n\n populateLiveRecordArray: function populateLiveRecordArray(array, modelName) {\n var typeMap = this.store.typeMapFor(modelName);\n var records = typeMap.records;\n var record;\n\n for (var i = 0; i < records.length; i++) {\n record = records[i];\n\n if (!record.isDeleted() && !record.isEmpty()) {\n this._addRecordToRecordArray(array, record);\n }\n }\n },\n\n /**\n This method is invoked if the `filterFunction` property is\n changed on a `DS.FilteredRecordArray`.\n It essentially re-runs the filter from scratch. This same\n method is invoked when the filter is created in th first place.\n @method updateFilter\n @param {Array} array\n @param {String} modelName\n @param {Function} filter\n */\n updateFilter: function updateFilter(array, modelName, filter) {\n var typeMap = this.store.typeMapFor(modelName);\n var records = typeMap.records;\n var record;\n\n for (var i = 0; i < records.length; i++) {\n record = records[i];\n\n if (!record.isDeleted() && !record.isEmpty()) {\n this.updateFilterRecordArray(array, filter, modelName, record);\n }\n }\n },\n\n /**\n Get the `DS.RecordArray` for a type, which contains all loaded records of\n given type.\n @method liveRecordArrayFor\n @param {Class} typeClass\n @return {DS.RecordArray}\n */\n liveRecordArrayFor: function liveRecordArrayFor(typeClass) {\n return this.liveRecordArrays.get(typeClass);\n },\n\n /**\n Create a `DS.RecordArray` for a type.\n @method createRecordArray\n @param {Class} typeClass\n @return {DS.RecordArray}\n */\n createRecordArray: function createRecordArray(typeClass) {\n var array = _emberDataPrivateSystemRecordArrays.RecordArray.create({\n type: typeClass,\n content: _ember[\"default\"].A(),\n store: this.store,\n isLoaded: true,\n manager: this\n });\n\n return array;\n },\n\n /**\n Create a `DS.FilteredRecordArray` for a type and register it for updates.\n @method createFilteredRecordArray\n @param {DS.Model} typeClass\n @param {Function} filter\n @param {Object} query (optional\n @return {DS.FilteredRecordArray}\n */\n createFilteredRecordArray: function createFilteredRecordArray(typeClass, filter, query) {\n var array = _emberDataPrivateSystemRecordArrays.FilteredRecordArray.create({\n query: query,\n type: typeClass,\n content: _ember[\"default\"].A(),\n store: this.store,\n manager: this,\n filterFunction: filter\n });\n\n this.registerFilteredRecordArray(array, typeClass, filter);\n\n return array;\n },\n\n /**\n Create a `DS.AdapterPopulatedRecordArray` for a type with given query.\n @method createAdapterPopulatedRecordArray\n @param {DS.Model} typeClass\n @param {Object} query\n @return {DS.AdapterPopulatedRecordArray}\n */\n createAdapterPopulatedRecordArray: function createAdapterPopulatedRecordArray(typeClass, query) {\n var array = _emberDataPrivateSystemRecordArrays.AdapterPopulatedRecordArray.create({\n type: typeClass,\n query: query,\n content: _ember[\"default\"].A(),\n store: this.store,\n manager: this\n });\n\n this._adapterPopulatedRecordArrays.push(array);\n\n return array;\n },\n\n /**\n Register a RecordArray for a given type to be backed by\n a filter function. This will cause the array to update\n automatically when records of that type change attribute\n values or states.\n @method registerFilteredRecordArray\n @param {DS.RecordArray} array\n @param {DS.Model} typeClass\n @param {Function} filter\n */\n registerFilteredRecordArray: function registerFilteredRecordArray(array, typeClass, filter) {\n var recordArrays = this.filteredRecordArrays.get(typeClass);\n recordArrays.push(array);\n\n this.updateFilter(array, typeClass, filter);\n },\n\n /**\n Unregister a RecordArray.\n So manager will not update this array.\n @method unregisterRecordArray\n @param {DS.RecordArray} array\n */\n unregisterRecordArray: function unregisterRecordArray(array) {\n var typeClass = array.type;\n\n // unregister filtered record array\n var recordArrays = this.filteredRecordArrays.get(typeClass);\n var removedFromFiltered = remove(recordArrays, array);\n\n // remove from adapter populated record array\n var removedFromAdapterPopulated = remove(this._adapterPopulatedRecordArrays, array);\n\n if (!removedFromFiltered && !removedFromAdapterPopulated) {\n\n // unregister live record array\n if (this.liveRecordArrays.has(typeClass)) {\n var liveRecordArrayForType = this.liveRecordArrayFor(typeClass);\n if (array === liveRecordArrayForType) {\n this.liveRecordArrays[\"delete\"](typeClass);\n }\n }\n }\n },\n\n willDestroy: function willDestroy() {\n this._super.apply(this, arguments);\n\n this.filteredRecordArrays.forEach(function (value) {\n return flatten(value).forEach(destroy);\n });\n this.liveRecordArrays.forEach(destroy);\n this._adapterPopulatedRecordArrays.forEach(destroy);\n }\n });\n\n function destroy(entry) {\n entry.destroy();\n }\n\n function flatten(list) {\n var length = list.length;\n var result = _ember[\"default\"].A();\n\n for (var i = 0; i < length; i++) {\n result = result.concat(list[i]);\n }\n\n return result;\n }\n\n function remove(array, item) {\n var index = array.indexOf(item);\n\n if (index !== -1) {\n array.splice(index, 1);\n return true;\n }\n\n return false;\n }\n});","define(\"ember-data/-private/system/record-arrays\", [\"exports\", \"ember-data/-private/system/record-arrays/record-array\", \"ember-data/-private/system/record-arrays/filtered-record-array\", \"ember-data/-private/system/record-arrays/adapter-populated-record-array\"], function (exports, _emberDataPrivateSystemRecordArraysRecordArray, _emberDataPrivateSystemRecordArraysFilteredRecordArray, _emberDataPrivateSystemRecordArraysAdapterPopulatedRecordArray) {\n /**\n @module ember-data\n */\n\n \"use strict\";\n\n exports.RecordArray = _emberDataPrivateSystemRecordArraysRecordArray[\"default\"];\n exports.FilteredRecordArray = _emberDataPrivateSystemRecordArraysFilteredRecordArray[\"default\"];\n exports.AdapterPopulatedRecordArray = _emberDataPrivateSystemRecordArraysAdapterPopulatedRecordArray[\"default\"];\n});","define(\"ember-data/-private/system/record-arrays/adapter-populated-record-array\", [\"exports\", \"ember\", \"ember-data/-private/system/record-arrays/record-array\", \"ember-data/-private/system/clone-null\", \"ember-data/-private/features\"], function (exports, _ember, _emberDataPrivateSystemRecordArraysRecordArray, _emberDataPrivateSystemCloneNull, _emberDataPrivateFeatures) {\n \"use strict\";\n\n /**\n @module ember-data\n */\n\n var get = _ember[\"default\"].get;\n\n /**\n Represents an ordered list of records whose order and membership is\n determined by the adapter. For example, a query sent to the adapter\n may trigger a search on the server, whose results would be loaded\n into an instance of the `AdapterPopulatedRecordArray`.\n \n @class AdapterPopulatedRecordArray\n @namespace DS\n @extends DS.RecordArray\n */\n exports[\"default\"] = _emberDataPrivateSystemRecordArraysRecordArray[\"default\"].extend({\n query: null,\n\n replace: function replace() {\n var type = get(this, 'type').toString();\n throw new Error(\"The result of a server query (on \" + type + \") is immutable.\");\n },\n\n _update: function _update() {\n var store = get(this, 'store');\n var modelName = get(this, 'type.modelName');\n var query = get(this, 'query');\n\n return store._query(modelName, query, this);\n },\n\n /**\n @method loadRecords\n @param {Array} records\n @param {Object} payload normalized payload\n @private\n */\n loadRecords: function loadRecords(records, payload) {\n var _this = this;\n\n //TODO Optimize\n var internalModels = _ember[\"default\"].A(records).mapBy('_internalModel');\n this.setProperties({\n content: _ember[\"default\"].A(internalModels),\n isLoaded: true,\n isUpdating: false,\n meta: (0, _emberDataPrivateSystemCloneNull[\"default\"])(payload.meta)\n });\n\n if (true) {\n this.set('links', (0, _emberDataPrivateSystemCloneNull[\"default\"])(payload.links));\n }\n\n internalModels.forEach(function (record) {\n _this.manager.recordArraysForRecord(record).add(_this);\n });\n\n // TODO: should triggering didLoad event be the last action of the runLoop?\n _ember[\"default\"].run.once(this, 'trigger', 'didLoad');\n }\n });\n});","define('ember-data/-private/system/record-arrays/filtered-record-array', ['exports', 'ember', 'ember-data/-private/system/record-arrays/record-array'], function (exports, _ember, _emberDataPrivateSystemRecordArraysRecordArray) {\n 'use strict';\n\n /**\n @module ember-data\n */\n\n var get = _ember['default'].get;\n\n /**\n Represents a list of records whose membership is determined by the\n store. As records are created, loaded, or modified, the store\n evaluates them to determine if they should be part of the record\n array.\n \n @class FilteredRecordArray\n @namespace DS\n @extends DS.RecordArray\n */\n exports['default'] = _emberDataPrivateSystemRecordArraysRecordArray['default'].extend({\n /**\n The filterFunction is a function used to test records from the store to\n determine if they should be part of the record array.\n Example\n ```javascript\n var allPeople = store.peekAll('person');\n allPeople.mapBy('name'); // [\"Tom Dale\", \"Yehuda Katz\", \"Trek Glowacki\"]\n var people = store.filter('person', function(person) {\n if (person.get('name').match(/Katz$/)) { return true; }\n });\n people.mapBy('name'); // [\"Yehuda Katz\"]\n var notKatzFilter = function(person) {\n return !person.get('name').match(/Katz$/);\n };\n people.set('filterFunction', notKatzFilter);\n people.mapBy('name'); // [\"Tom Dale\", \"Trek Glowacki\"]\n ```\n @method filterFunction\n @param {DS.Model} record\n @return {Boolean} `true` if the record should be in the array\n */\n filterFunction: null,\n isLoaded: true,\n\n replace: function replace() {\n var type = get(this, 'type').toString();\n throw new Error(\"The result of a client-side filter (on \" + type + \") is immutable.\");\n },\n\n /**\n @method updateFilter\n @private\n */\n _updateFilter: function _updateFilter() {\n var manager = get(this, 'manager');\n manager.updateFilter(this, get(this, 'type'), get(this, 'filterFunction'));\n },\n\n updateFilter: _ember['default'].observer('filterFunction', function () {\n _ember['default'].run.once(this, this._updateFilter);\n })\n });\n});","define(\"ember-data/-private/system/record-arrays/record-array\", [\"exports\", \"ember\", \"ember-data/-private/system/promise-proxies\", \"ember-data/-private/system/snapshot-record-array\"], function (exports, _ember, _emberDataPrivateSystemPromiseProxies, _emberDataPrivateSystemSnapshotRecordArray) {\n /**\n @module ember-data\n */\n\n \"use strict\";\n\n var get = _ember[\"default\"].get;\n var set = _ember[\"default\"].set;\n\n /**\n A record array is an array that contains records of a certain type. The record\n array materializes records as needed when they are retrieved for the first\n time. You should not create record arrays yourself. Instead, an instance of\n `DS.RecordArray` or its subclasses will be returned by your application's store\n in response to queries.\n \n @class RecordArray\n @namespace DS\n @extends Ember.ArrayProxy\n @uses Ember.Evented\n */\n\n exports[\"default\"] = _ember[\"default\"].ArrayProxy.extend(_ember[\"default\"].Evented, {\n /**\n The model type contained by this record array.\n @property type\n @type DS.Model\n */\n type: null,\n\n /**\n The array of client ids backing the record array. When a\n record is requested from the record array, the record\n for the client id at the same index is materialized, if\n necessary, by the store.\n @property content\n @private\n @type Ember.Array\n */\n content: null,\n\n /**\n The flag to signal a `RecordArray` is finished loading data.\n Example\n ```javascript\n var people = store.peekAll('person');\n people.get('isLoaded'); // true\n ```\n @property isLoaded\n @type Boolean\n */\n isLoaded: false,\n /**\n The flag to signal a `RecordArray` is currently loading data.\n Example\n ```javascript\n var people = store.peekAll('person');\n people.get('isUpdating'); // false\n people.update();\n people.get('isUpdating'); // true\n ```\n @property isUpdating\n @type Boolean\n */\n isUpdating: false,\n\n /**\n The store that created this record array.\n @property store\n @private\n @type DS.Store\n */\n store: null,\n\n /**\n Retrieves an object from the content by index.\n @method objectAtContent\n @private\n @param {Number} index\n @return {DS.Model} record\n */\n objectAtContent: function objectAtContent(index) {\n var content = get(this, 'content');\n var internalModel = content.objectAt(index);\n return internalModel && internalModel.getRecord();\n },\n\n /**\n Used to get the latest version of all of the records in this array\n from the adapter.\n Example\n ```javascript\n var people = store.peekAll('person');\n people.get('isUpdating'); // false\n people.update().then(function() {\n people.get('isUpdating'); // false\n });\n people.get('isUpdating'); // true\n ```\n @method update\n */\n update: function update() {\n if (get(this, 'isUpdating')) {\n return;\n }\n\n this.set('isUpdating', true);\n return this._update();\n },\n\n /*\n Update this RecordArray and return a promise which resolves once the update\n is finished.\n */\n _update: function _update() {\n var store = get(this, 'store');\n var modelName = get(this, 'type.modelName');\n\n return store.findAll(modelName, { reload: true });\n },\n\n /**\n Adds an internal model to the `RecordArray` without duplicates\n @method addInternalModel\n @private\n @param {InternalModel} internalModel\n @param {number} an optional index to insert at\n */\n addInternalModel: function addInternalModel(internalModel, idx) {\n var content = get(this, 'content');\n if (idx === undefined) {\n content.addObject(internalModel);\n } else if (!content.includes(internalModel)) {\n content.insertAt(idx, internalModel);\n }\n },\n\n /**\n Removes an internalModel to the `RecordArray`.\n @method removeInternalModel\n @private\n @param {InternalModel} internalModel\n */\n removeInternalModel: function removeInternalModel(internalModel) {\n get(this, 'content').removeObject(internalModel);\n },\n\n /**\n Saves all of the records in the `RecordArray`.\n Example\n ```javascript\n var messages = store.peekAll('message');\n messages.forEach(function(message) {\n message.set('hasBeenSeen', true);\n });\n messages.save();\n ```\n @method save\n @return {DS.PromiseArray} promise\n */\n save: function save() {\n var recordArray = this;\n var promiseLabel = \"DS: RecordArray#save \" + get(this, 'type');\n var promise = _ember[\"default\"].RSVP.all(this.invoke(\"save\"), promiseLabel).then(function (array) {\n return recordArray;\n }, null, \"DS: RecordArray#save return RecordArray\");\n\n return _emberDataPrivateSystemPromiseProxies.PromiseArray.create({ promise: promise });\n },\n\n _dissociateFromOwnRecords: function _dissociateFromOwnRecords() {\n var _this = this;\n\n this.get('content').forEach(function (record) {\n var recordArrays = record._recordArrays;\n\n if (recordArrays) {\n recordArrays[\"delete\"](_this);\n }\n });\n },\n\n /**\n @method _unregisterFromManager\n @private\n */\n _unregisterFromManager: function _unregisterFromManager() {\n var manager = get(this, 'manager');\n manager.unregisterRecordArray(this);\n },\n\n willDestroy: function willDestroy() {\n this._unregisterFromManager();\n this._dissociateFromOwnRecords();\n set(this, 'content', undefined);\n this._super.apply(this, arguments);\n },\n\n createSnapshot: function createSnapshot(options) {\n var meta = this.get('meta');\n return new _emberDataPrivateSystemSnapshotRecordArray[\"default\"](this, meta, options);\n }\n });\n});","define('ember-data/-private/system/references', ['exports', 'ember-data/-private/system/references/record', 'ember-data/-private/system/references/belongs-to', 'ember-data/-private/system/references/has-many'], function (exports, _emberDataPrivateSystemReferencesRecord, _emberDataPrivateSystemReferencesBelongsTo, _emberDataPrivateSystemReferencesHasMany) {\n 'use strict';\n\n exports.RecordReference = _emberDataPrivateSystemReferencesRecord['default'];\n exports.BelongsToReference = _emberDataPrivateSystemReferencesBelongsTo['default'];\n exports.HasManyReference = _emberDataPrivateSystemReferencesHasMany['default'];\n});","define('ember-data/-private/system/references/belongs-to', ['exports', 'ember-data/model', 'ember', 'ember-data/-private/system/references/reference', 'ember-data/-private/features', 'ember-data/-private/debug'], function (exports, _emberDataModel, _ember, _emberDataPrivateSystemReferencesReference, _emberDataPrivateFeatures, _emberDataPrivateDebug) {\n 'use strict';\n\n var BelongsToReference = function BelongsToReference(store, parentInternalModel, belongsToRelationship) {\n this._super$constructor(store, parentInternalModel);\n this.belongsToRelationship = belongsToRelationship;\n this.type = belongsToRelationship.relationshipMeta.type;\n this.parent = parentInternalModel.recordReference;\n\n // TODO inverse\n };\n\n BelongsToReference.prototype = Object.create(_emberDataPrivateSystemReferencesReference['default'].prototype);\n BelongsToReference.prototype.constructor = BelongsToReference;\n BelongsToReference.prototype._super$constructor = _emberDataPrivateSystemReferencesReference['default'];\n\n BelongsToReference.prototype.remoteType = function () {\n if (this.belongsToRelationship.link) {\n return \"link\";\n }\n\n return \"id\";\n };\n\n BelongsToReference.prototype.id = function () {\n var inverseRecord = this.belongsToRelationship.inverseRecord;\n return inverseRecord && inverseRecord.id;\n };\n\n BelongsToReference.prototype.link = function () {\n return this.belongsToRelationship.link;\n };\n\n BelongsToReference.prototype.meta = function () {\n return this.belongsToRelationship.meta;\n };\n\n BelongsToReference.prototype.push = function (objectOrPromise) {\n var _this = this;\n\n return _ember['default'].RSVP.resolve(objectOrPromise).then(function (data) {\n var record;\n\n if (data instanceof _emberDataModel['default']) {\n if (false) {\n (0, _emberDataPrivateDebug.deprecate)(\"BelongsToReference#push(DS.Model) is deprecated. Update relationship via `model.set('relationshipName', value)` instead.\", false, {\n id: 'ds.references.belongs-to.push-record',\n until: '3.0'\n });\n }\n record = data;\n } else {\n record = _this.store.push(data);\n }\n\n (0, _emberDataPrivateDebug.assertPolymorphicType)(_this.internalModel, _this.belongsToRelationship.relationshipMeta, record._internalModel);\n\n _this.belongsToRelationship.setCanonicalRecord(record._internalModel);\n\n return record;\n });\n };\n\n BelongsToReference.prototype.value = function () {\n var inverseRecord = this.belongsToRelationship.inverseRecord;\n\n if (inverseRecord && inverseRecord.record) {\n return inverseRecord.record;\n }\n\n return null;\n };\n\n BelongsToReference.prototype.load = function () {\n var _this2 = this;\n\n if (this.remoteType() === \"id\") {\n return this.belongsToRelationship.getRecord();\n }\n\n if (this.remoteType() === \"link\") {\n return this.belongsToRelationship.findLink().then(function (internalModel) {\n return _this2.value();\n });\n }\n };\n\n BelongsToReference.prototype.reload = function () {\n var _this3 = this;\n\n return this.belongsToRelationship.reload().then(function (internalModel) {\n return _this3.value();\n });\n };\n\n exports['default'] = BelongsToReference;\n});","define('ember-data/-private/system/references/has-many', ['exports', 'ember', 'ember-data/-private/system/references/reference', 'ember-data/-private/debug', 'ember-data/-private/features'], function (exports, _ember, _emberDataPrivateSystemReferencesReference, _emberDataPrivateDebug, _emberDataPrivateFeatures) {\n 'use strict';\n\n var get = _ember['default'].get;\n\n var HasManyReference = function HasManyReference(store, parentInternalModel, hasManyRelationship) {\n this._super$constructor(store, parentInternalModel);\n this.hasManyRelationship = hasManyRelationship;\n this.type = hasManyRelationship.relationshipMeta.type;\n this.parent = parentInternalModel.recordReference;\n\n // TODO inverse\n };\n\n HasManyReference.prototype = Object.create(_emberDataPrivateSystemReferencesReference['default'].prototype);\n HasManyReference.prototype.constructor = HasManyReference;\n HasManyReference.prototype._super$constructor = _emberDataPrivateSystemReferencesReference['default'];\n\n HasManyReference.prototype.remoteType = function () {\n if (this.hasManyRelationship.link) {\n return \"link\";\n }\n\n return \"ids\";\n };\n\n HasManyReference.prototype.link = function () {\n return this.hasManyRelationship.link;\n };\n\n HasManyReference.prototype.ids = function () {\n var members = this.hasManyRelationship.members;\n var ids = members.toArray().map(function (internalModel) {\n return internalModel.id;\n });\n\n return ids;\n };\n\n HasManyReference.prototype.meta = function () {\n return this.hasManyRelationship.manyArray.meta;\n };\n\n HasManyReference.prototype.push = function (objectOrPromise) {\n var _this = this;\n\n return _ember['default'].RSVP.resolve(objectOrPromise).then(function (payload) {\n var array = payload;\n\n if (false) {\n (0, _emberDataPrivateDebug.deprecate)(\"HasManyReference#push(array) is deprecated. Push a JSON-API document instead.\", !Array.isArray(payload), {\n id: 'ds.references.has-many.push-array',\n until: '3.0'\n });\n }\n\n var useLegacyArrayPush = true;\n if (typeof payload === \"object\" && payload.data) {\n array = payload.data;\n useLegacyArrayPush = array.length && array[0].data;\n\n if (false) {\n (0, _emberDataPrivateDebug.deprecate)(\"HasManyReference#push() expects a valid JSON-API document.\", !useLegacyArrayPush, {\n id: 'ds.references.has-many.push-invalid-json-api',\n until: '3.0'\n });\n }\n }\n\n if (!false) {\n useLegacyArrayPush = true;\n }\n\n var internalModels = undefined;\n if (useLegacyArrayPush) {\n internalModels = array.map(function (obj) {\n var record = _this.store.push(obj);\n\n (0, _emberDataPrivateDebug.runInDebug)(function () {\n var relationshipMeta = _this.hasManyRelationship.relationshipMeta;\n (0, _emberDataPrivateDebug.assertPolymorphicType)(_this.internalModel, relationshipMeta, record._internalModel);\n });\n\n return record._internalModel;\n });\n } else {\n var records = _this.store.push(payload);\n internalModels = _ember['default'].A(records).mapBy('_internalModel');\n\n (0, _emberDataPrivateDebug.runInDebug)(function () {\n internalModels.forEach(function (internalModel) {\n var relationshipMeta = _this.hasManyRelationship.relationshipMeta;\n (0, _emberDataPrivateDebug.assertPolymorphicType)(_this.internalModel, relationshipMeta, internalModel);\n });\n });\n }\n\n _this.hasManyRelationship.computeChanges(internalModels);\n\n return _this.hasManyRelationship.manyArray;\n });\n };\n\n HasManyReference.prototype._isLoaded = function () {\n var hasData = get(this.hasManyRelationship, 'hasData');\n if (!hasData) {\n return false;\n }\n\n var members = this.hasManyRelationship.members.toArray();\n var isEveryLoaded = members.every(function (internalModel) {\n return internalModel.isLoaded() === true;\n });\n\n return isEveryLoaded;\n };\n\n HasManyReference.prototype.value = function () {\n if (this._isLoaded()) {\n return this.hasManyRelationship.manyArray;\n }\n\n return null;\n };\n\n HasManyReference.prototype.load = function () {\n if (!this._isLoaded()) {\n return this.hasManyRelationship.getRecords();\n }\n\n var manyArray = this.hasManyRelationship.manyArray;\n return _ember['default'].RSVP.resolve(manyArray);\n };\n\n HasManyReference.prototype.reload = function () {\n return this.hasManyRelationship.reload();\n };\n\n exports['default'] = HasManyReference;\n});","define('ember-data/-private/system/references/record', ['exports', 'ember', 'ember-data/-private/system/references/reference'], function (exports, _ember, _emberDataPrivateSystemReferencesReference) {\n 'use strict';\n\n var RecordReference = function RecordReference(store, internalModel) {\n this._super$constructor(store, internalModel);\n this.type = internalModel.modelName;\n this._id = internalModel.id;\n };\n\n RecordReference.prototype = Object.create(_emberDataPrivateSystemReferencesReference['default'].prototype);\n RecordReference.prototype.constructor = RecordReference;\n RecordReference.prototype._super$constructor = _emberDataPrivateSystemReferencesReference['default'];\n\n RecordReference.prototype.id = function () {\n return this._id;\n };\n\n RecordReference.prototype.remoteType = function () {\n return 'identity';\n };\n\n RecordReference.prototype.push = function (objectOrPromise) {\n var _this = this;\n\n return _ember['default'].RSVP.resolve(objectOrPromise).then(function (data) {\n var record = _this.store.push(data);\n return record;\n });\n };\n\n RecordReference.prototype.value = function () {\n return this.internalModel.record;\n };\n\n RecordReference.prototype.load = function () {\n return this.store.findRecord(this.type, this._id);\n };\n\n RecordReference.prototype.reload = function () {\n var record = this.value();\n if (record) {\n return record.reload();\n }\n\n return this.load();\n };\n\n exports['default'] = RecordReference;\n});","define(\"ember-data/-private/system/references/reference\", [\"exports\"], function (exports) {\n \"use strict\";\n\n var Reference = function Reference(store, internalModel) {\n this.store = store;\n this.internalModel = internalModel;\n };\n\n Reference.prototype = {\n constructor: Reference\n };\n\n exports[\"default\"] = Reference;\n});","define('ember-data/-private/system/relationship-meta', ['exports', 'ember-inflector', 'ember-data/-private/system/normalize-model-name'], function (exports, _emberInflector, _emberDataPrivateSystemNormalizeModelName) {\n 'use strict';\n\n exports.typeForRelationshipMeta = typeForRelationshipMeta;\n exports.relationshipFromMeta = relationshipFromMeta;\n\n function typeForRelationshipMeta(meta) {\n var modelName;\n\n modelName = meta.type || meta.key;\n if (meta.kind === 'hasMany') {\n modelName = (0, _emberInflector.singularize)((0, _emberDataPrivateSystemNormalizeModelName['default'])(modelName));\n }\n return modelName;\n }\n\n function relationshipFromMeta(meta) {\n return {\n key: meta.key,\n kind: meta.kind,\n type: typeForRelationshipMeta(meta),\n options: meta.options,\n parentType: meta.parentType,\n isRelationship: true\n };\n }\n});","define(\"ember-data/-private/system/relationships/belongs-to\", [\"exports\", \"ember\", \"ember-data/-private/debug\", \"ember-data/-private/system/normalize-model-name\"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateSystemNormalizeModelName) {\n \"use strict\";\n\n exports[\"default\"] = belongsTo;\n\n /**\n `DS.belongsTo` is used to define One-To-One and One-To-Many\n relationships on a [DS.Model](/api/data/classes/DS.Model.html).\n \n \n `DS.belongsTo` takes an optional hash as a second parameter, currently\n supported options are:\n \n - `async`: A boolean value used to explicitly declare this to be an async relationship.\n - `inverse`: A string used to identify the inverse property on a\n related model in a One-To-Many relationship. See [Explicit Inverses](#toc_explicit-inverses)\n \n #### One-To-One\n To declare a one-to-one relationship between two models, use\n `DS.belongsTo`:\n \n ```app/models/user.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n profile: DS.belongsTo('profile')\n });\n ```\n \n ```app/models/profile.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n user: DS.belongsTo('user')\n });\n ```\n \n #### One-To-Many\n To declare a one-to-many relationship between two models, use\n `DS.belongsTo` in combination with `DS.hasMany`, like this:\n \n ```app/models/post.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n comments: DS.hasMany('comment')\n });\n ```\n \n ```app/models/comment.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n post: DS.belongsTo('post')\n });\n ```\n \n You can avoid passing a string as the first parameter. In that case Ember Data\n will infer the type from the key name.\n \n ```app/models/comment.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n post: DS.belongsTo()\n });\n ```\n \n will lookup for a Post type.\n \n @namespace\n @method belongsTo\n @for DS\n @param {String} modelName (optional) type of the relationship\n @param {Object} options (optional) a hash of options\n @return {Ember.computed} relationship\n */\n function belongsTo(modelName, options) {\n var opts, userEnteredModelName;\n if (typeof modelName === 'object') {\n opts = modelName;\n userEnteredModelName = undefined;\n } else {\n opts = options;\n userEnteredModelName = modelName;\n }\n\n if (typeof userEnteredModelName === 'string') {\n userEnteredModelName = (0, _emberDataPrivateSystemNormalizeModelName[\"default\"])(userEnteredModelName);\n }\n\n (0, _emberDataPrivateDebug.assert)(\"The first argument to DS.belongsTo must be a string representing a model type key, not an instance of \" + _ember[\"default\"].inspect(userEnteredModelName) + \". E.g., to define a relation to the Person model, use DS.belongsTo('person')\", typeof userEnteredModelName === 'string' || typeof userEnteredModelName === 'undefined');\n\n opts = opts || {};\n\n var meta = {\n type: userEnteredModelName,\n isRelationship: true,\n options: opts,\n kind: 'belongsTo',\n key: null\n };\n\n return _ember[\"default\"].computed({\n get: function get(key) {\n if (opts.hasOwnProperty('serialize')) {\n (0, _emberDataPrivateDebug.warn)(\"You provided a serialize option on the \\\"\" + key + \"\\\" property in the \\\"\" + this._internalModel.modelName + \"\\\" class, this belongs in the serializer. See DS.Serializer and it's implementations http://emberjs.com/api/data/classes/DS.Serializer.html\", false, {\n id: 'ds.model.serialize-option-in-belongs-to'\n });\n }\n\n if (opts.hasOwnProperty('embedded')) {\n (0, _emberDataPrivateDebug.warn)(\"You provided an embedded option on the \\\"\" + key + \"\\\" property in the \\\"\" + this._internalModel.modelName + \"\\\" class, this belongs in the serializer. See DS.EmbeddedRecordsMixin http://emberjs.com/api/data/classes/DS.EmbeddedRecordsMixin.html\", false, {\n id: 'ds.model.embedded-option-in-belongs-to'\n });\n }\n\n return this._internalModel._relationships.get(key).getRecord();\n },\n set: function set(key, value) {\n if (value === undefined) {\n value = null;\n }\n if (value && value.then) {\n this._internalModel._relationships.get(key).setRecordPromise(value);\n } else if (value) {\n this._internalModel._relationships.get(key).setRecord(value._internalModel);\n } else {\n this._internalModel._relationships.get(key).setRecord(value);\n }\n\n return this._internalModel._relationships.get(key).getRecord();\n }\n }).meta(meta);\n }\n\n /*\n These observers observe all `belongsTo` relationships on the record. See\n `relationships/ext` to see how these observers get their dependencies.\n */\n var BelongsToMixin = _ember[\"default\"].Mixin.create({\n notifyBelongsToChanged: function notifyBelongsToChanged(key) {\n this.notifyPropertyChange(key);\n }\n });\n exports.BelongsToMixin = BelongsToMixin;\n});","define(\"ember-data/-private/system/relationships/ext\", [\"exports\", \"ember\", \"ember-data/-private/debug\", \"ember-data/-private/system/relationship-meta\", \"ember-data/-private/system/empty-object\"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateSystemRelationshipMeta, _emberDataPrivateSystemEmptyObject) {\n \"use strict\";\n\n var get = _ember[\"default\"].get;\n var Map = _ember[\"default\"].Map;\n var MapWithDefault = _ember[\"default\"].MapWithDefault;\n\n var relationshipsDescriptor = _ember[\"default\"].computed(function () {\n if (_ember[\"default\"].testing === true && relationshipsDescriptor._cacheable === true) {\n relationshipsDescriptor._cacheable = false;\n }\n\n var map = new MapWithDefault({\n defaultValue: function defaultValue() {\n return [];\n }\n });\n\n // Loop through each computed property on the class\n this.eachComputedProperty(function (name, meta) {\n // If the computed property is a relationship, add\n // it to the map.\n if (meta.isRelationship) {\n meta.key = name;\n var relationshipsForType = map.get((0, _emberDataPrivateSystemRelationshipMeta.typeForRelationshipMeta)(meta));\n\n relationshipsForType.push({\n name: name,\n kind: meta.kind\n });\n }\n });\n\n return map;\n }).readOnly();\n\n var relatedTypesDescriptor = _ember[\"default\"].computed(function () {\n var _this = this;\n\n if (_ember[\"default\"].testing === true && relatedTypesDescriptor._cacheable === true) {\n relatedTypesDescriptor._cacheable = false;\n }\n\n var modelName;\n var types = _ember[\"default\"].A();\n\n // Loop through each computed property on the class,\n // and create an array of the unique types involved\n // in relationships\n this.eachComputedProperty(function (name, meta) {\n if (meta.isRelationship) {\n meta.key = name;\n modelName = (0, _emberDataPrivateSystemRelationshipMeta.typeForRelationshipMeta)(meta);\n\n (0, _emberDataPrivateDebug.assert)(\"You specified a hasMany (\" + meta.type + \") on \" + meta.parentType + \" but \" + meta.type + \" was not found.\", modelName);\n\n if (!types.includes(modelName)) {\n (0, _emberDataPrivateDebug.assert)(\"Trying to sideload \" + name + \" on \" + _this.toString() + \" but the type doesn't exist.\", !!modelName);\n types.push(modelName);\n }\n }\n });\n\n return types;\n }).readOnly();\n\n var relationshipsByNameDescriptor = _ember[\"default\"].computed(function () {\n if (_ember[\"default\"].testing === true && relationshipsByNameDescriptor._cacheable === true) {\n relationshipsByNameDescriptor._cacheable = false;\n }\n\n var map = Map.create();\n\n this.eachComputedProperty(function (name, meta) {\n if (meta.isRelationship) {\n meta.key = name;\n var relationship = (0, _emberDataPrivateSystemRelationshipMeta.relationshipFromMeta)(meta);\n relationship.type = (0, _emberDataPrivateSystemRelationshipMeta.typeForRelationshipMeta)(meta);\n map.set(name, relationship);\n }\n });\n\n return map;\n }).readOnly();\n\n /**\n @module ember-data\n */\n\n /*\n This file defines several extensions to the base `DS.Model` class that\n add support for one-to-many relationships.\n */\n\n /**\n @class Model\n @namespace DS\n */\n var DidDefinePropertyMixin = _ember[\"default\"].Mixin.create({\n\n /**\n This Ember.js hook allows an object to be notified when a property\n is defined.\n In this case, we use it to be notified when an Ember Data user defines a\n belongs-to relationship. In that case, we need to set up observers for\n each one, allowing us to track relationship changes and automatically\n reflect changes in the inverse has-many array.\n This hook passes the class being set up, as well as the key and value\n being defined. So, for example, when the user does this:\n ```javascript\n DS.Model.extend({\n parent: DS.belongsTo('user')\n });\n ```\n This hook would be called with \"parent\" as the key and the computed\n property returned by `DS.belongsTo` as the value.\n @method didDefineProperty\n @param {Object} proto\n @param {String} key\n @param {Ember.ComputedProperty} value\n */\n didDefineProperty: function didDefineProperty(proto, key, value) {\n // Check if the value being set is a computed property.\n if (value instanceof _ember[\"default\"].ComputedProperty) {\n\n // If it is, get the metadata for the relationship. This is\n // populated by the `DS.belongsTo` helper when it is creating\n // the computed property.\n var meta = value.meta();\n\n meta.parentType = proto.constructor;\n }\n }\n });\n\n exports.DidDefinePropertyMixin = DidDefinePropertyMixin;\n\n /*\n These DS.Model extensions add class methods that provide relationship\n introspection abilities about relationships.\n \n A note about the computed properties contained here:\n \n **These properties are effectively sealed once called for the first time.**\n To avoid repeatedly doing expensive iteration over a model's fields, these\n values are computed once and then cached for the remainder of the runtime of\n your application.\n \n If your application needs to modify a class after its initial definition\n (for example, using `reopen()` to add additional attributes), make sure you\n do it before using your model with the store, which uses these properties\n extensively.\n */\n\n var RelationshipsClassMethodsMixin = _ember[\"default\"].Mixin.create({\n\n /**\n For a given relationship name, returns the model type of the relationship.\n For example, if you define a model like this:\n ```app/models/post.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n comments: DS.hasMany('comment')\n });\n ```\n Calling `App.Post.typeForRelationship('comments')` will return `App.Comment`.\n @method typeForRelationship\n @static\n @param {String} name the name of the relationship\n @param {store} store an instance of DS.Store\n @return {DS.Model} the type of the relationship, or undefined\n */\n typeForRelationship: function typeForRelationship(name, store) {\n var relationship = get(this, 'relationshipsByName').get(name);\n return relationship && store.modelFor(relationship.type);\n },\n\n inverseMap: _ember[\"default\"].computed(function () {\n return new _emberDataPrivateSystemEmptyObject[\"default\"]();\n }),\n\n /**\n Find the relationship which is the inverse of the one asked for.\n For example, if you define models like this:\n ```app/models/post.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n comments: DS.hasMany('message')\n });\n ```\n ```app/models/message.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n owner: DS.belongsTo('post')\n });\n ```\n App.Post.inverseFor('comments') -> { type: App.Message, name: 'owner', kind: 'belongsTo' }\n App.Message.inverseFor('owner') -> { type: App.Post, name: 'comments', kind: 'hasMany' }\n @method inverseFor\n @static\n @param {String} name the name of the relationship\n @return {Object} the inverse relationship, or null\n */\n inverseFor: function inverseFor(name, store) {\n var inverseMap = get(this, 'inverseMap');\n if (inverseMap[name]) {\n return inverseMap[name];\n } else {\n var inverse = this._findInverseFor(name, store);\n inverseMap[name] = inverse;\n return inverse;\n }\n },\n\n //Calculate the inverse, ignoring the cache\n _findInverseFor: function _findInverseFor(name, store) {\n\n var inverseType = this.typeForRelationship(name, store);\n if (!inverseType) {\n return null;\n }\n\n var propertyMeta = this.metaForProperty(name);\n //If inverse is manually specified to be null, like `comments: DS.hasMany('message', { inverse: null })`\n var options = propertyMeta.options;\n if (options.inverse === null) {\n return null;\n }\n\n var inverseName, inverseKind, inverse;\n\n //If inverse is specified manually, return the inverse\n if (options.inverse) {\n inverseName = options.inverse;\n inverse = _ember[\"default\"].get(inverseType, 'relationshipsByName').get(inverseName);\n\n (0, _emberDataPrivateDebug.assert)(\"We found no inverse relationships by the name of '\" + inverseName + \"' on the '\" + inverseType.modelName + \"' model. This is most likely due to a missing attribute on your model definition.\", !_ember[\"default\"].isNone(inverse));\n\n inverseKind = inverse.kind;\n } else {\n //No inverse was specified manually, we need to use a heuristic to guess one\n if (propertyMeta.type === propertyMeta.parentType.modelName) {\n (0, _emberDataPrivateDebug.warn)(\"Detected a reflexive relationship by the name of '\" + name + \"' without an inverse option. Look at http://emberjs.com/guides/models/defining-models/#toc_reflexive-relation for how to explicitly specify inverses.\", false, {\n id: 'ds.model.reflexive-relationship-without-inverse'\n });\n }\n\n var possibleRelationships = findPossibleInverses(this, inverseType);\n\n if (possibleRelationships.length === 0) {\n return null;\n }\n\n var filteredRelationships = possibleRelationships.filter(function (possibleRelationship) {\n var optionsForRelationship = inverseType.metaForProperty(possibleRelationship.name).options;\n return name === optionsForRelationship.inverse;\n });\n\n (0, _emberDataPrivateDebug.assert)(\"You defined the '\" + name + \"' relationship on \" + this + \", but you defined the inverse relationships of type \" + inverseType.toString() + \" multiple times. Look at http://emberjs.com/guides/models/defining-models/#toc_explicit-inverses for how to explicitly specify inverses\", filteredRelationships.length < 2);\n\n if (filteredRelationships.length === 1) {\n possibleRelationships = filteredRelationships;\n }\n\n (0, _emberDataPrivateDebug.assert)(\"You defined the '\" + name + \"' relationship on \" + this + \", but multiple possible inverse relationships of type \" + this + \" were found on \" + inverseType + \". Look at http://emberjs.com/guides/models/defining-models/#toc_explicit-inverses for how to explicitly specify inverses\", possibleRelationships.length === 1);\n\n inverseName = possibleRelationships[0].name;\n inverseKind = possibleRelationships[0].kind;\n }\n\n function findPossibleInverses(type, inverseType, relationshipsSoFar) {\n var possibleRelationships = relationshipsSoFar || [];\n\n var relationshipMap = get(inverseType, 'relationships');\n if (!relationshipMap) {\n return possibleRelationships;\n }\n\n var relationships = relationshipMap.get(type.modelName);\n\n relationships = relationships.filter(function (relationship) {\n var optionsForRelationship = inverseType.metaForProperty(relationship.name).options;\n\n if (!optionsForRelationship.inverse) {\n return true;\n }\n\n return name === optionsForRelationship.inverse;\n });\n\n if (relationships) {\n possibleRelationships.push.apply(possibleRelationships, relationships);\n }\n\n //Recurse to support polymorphism\n if (type.superclass) {\n findPossibleInverses(type.superclass, inverseType, possibleRelationships);\n }\n\n return possibleRelationships;\n }\n\n return {\n type: inverseType,\n name: inverseName,\n kind: inverseKind\n };\n },\n\n /**\n The model's relationships as a map, keyed on the type of the\n relationship. The value of each entry is an array containing a descriptor\n for each relationship with that type, describing the name of the relationship\n as well as the type.\n For example, given the following model definition:\n ```app/models/blog.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n users: DS.hasMany('user'),\n owner: DS.belongsTo('user'),\n posts: DS.hasMany('post')\n });\n ```\n This computed property would return a map describing these\n relationships, like this:\n ```javascript\n import Ember from 'ember';\n import Blog from 'app/models/blog';\n var relationships = Ember.get(Blog, 'relationships');\n relationships.get(App.User);\n //=> [ { name: 'users', kind: 'hasMany' },\n // { name: 'owner', kind: 'belongsTo' } ]\n relationships.get(App.Post);\n //=> [ { name: 'posts', kind: 'hasMany' } ]\n ```\n @property relationships\n @static\n @type Ember.Map\n @readOnly\n */\n\n relationships: relationshipsDescriptor,\n\n /**\n A hash containing lists of the model's relationships, grouped\n by the relationship kind. For example, given a model with this\n definition:\n ```app/models/blog.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n users: DS.hasMany('user'),\n owner: DS.belongsTo('user'),\n posts: DS.hasMany('post')\n });\n ```\n This property would contain the following:\n ```javascript\n import Ember from 'ember';\n import Blog from 'app/models/blog';\n var relationshipNames = Ember.get(Blog, 'relationshipNames');\n relationshipNames.hasMany;\n //=> ['users', 'posts']\n relationshipNames.belongsTo;\n //=> ['owner']\n ```\n @property relationshipNames\n @static\n @type Object\n @readOnly\n */\n relationshipNames: _ember[\"default\"].computed(function () {\n var names = {\n hasMany: [],\n belongsTo: []\n };\n\n this.eachComputedProperty(function (name, meta) {\n if (meta.isRelationship) {\n names[meta.kind].push(name);\n }\n });\n\n return names;\n }),\n\n /**\n An array of types directly related to a model. Each type will be\n included once, regardless of the number of relationships it has with\n the model.\n For example, given a model with this definition:\n ```app/models/blog.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n users: DS.hasMany('user'),\n owner: DS.belongsTo('user'),\n posts: DS.hasMany('post')\n });\n ```\n This property would contain the following:\n ```javascript\n import Ember from 'ember';\n import Blog from 'app/models/blog';\n var relatedTypes = Ember.get(Blog, 'relatedTypes');\n //=> [ App.User, App.Post ]\n ```\n @property relatedTypes\n @static\n @type Ember.Array\n @readOnly\n */\n relatedTypes: relatedTypesDescriptor,\n\n /**\n A map whose keys are the relationships of a model and whose values are\n relationship descriptors.\n For example, given a model with this\n definition:\n ```app/models/blog.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n users: DS.hasMany('user'),\n owner: DS.belongsTo('user'),\n posts: DS.hasMany('post')\n });\n ```\n This property would contain the following:\n ```javascript\n import Ember from 'ember';\n import Blog from 'app/models/blog';\n var relationshipsByName = Ember.get(Blog, 'relationshipsByName');\n relationshipsByName.get('users');\n //=> { key: 'users', kind: 'hasMany', type: 'user', options: Object, isRelationship: true }\n relationshipsByName.get('owner');\n //=> { key: 'owner', kind: 'belongsTo', type: 'user', options: Object, isRelationship: true }\n ```\n @property relationshipsByName\n @static\n @type Ember.Map\n @readOnly\n */\n relationshipsByName: relationshipsByNameDescriptor,\n\n /**\n A map whose keys are the fields of the model and whose values are strings\n describing the kind of the field. A model's fields are the union of all of its\n attributes and relationships.\n For example:\n ```app/models/blog.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n users: DS.hasMany('user'),\n owner: DS.belongsTo('user'),\n posts: DS.hasMany('post'),\n title: DS.attr('string')\n });\n ```\n ```js\n import Ember from 'ember';\n import Blog from 'app/models/blog';\n var fields = Ember.get(Blog, 'fields');\n fields.forEach(function(kind, field) {\n console.log(field, kind);\n });\n // prints:\n // users, hasMany\n // owner, belongsTo\n // posts, hasMany\n // title, attribute\n ```\n @property fields\n @static\n @type Ember.Map\n @readOnly\n */\n fields: _ember[\"default\"].computed(function () {\n var map = Map.create();\n\n this.eachComputedProperty(function (name, meta) {\n if (meta.isRelationship) {\n map.set(name, meta.kind);\n } else if (meta.isAttribute) {\n map.set(name, 'attribute');\n }\n });\n\n return map;\n }).readOnly(),\n\n /**\n Given a callback, iterates over each of the relationships in the model,\n invoking the callback with the name of each relationship and its relationship\n descriptor.\n @method eachRelationship\n @static\n @param {Function} callback the callback to invoke\n @param {any} binding the value to which the callback's `this` should be bound\n */\n eachRelationship: function eachRelationship(callback, binding) {\n get(this, 'relationshipsByName').forEach(function (relationship, name) {\n callback.call(binding, name, relationship);\n });\n },\n\n /**\n Given a callback, iterates over each of the types related to a model,\n invoking the callback with the related type's class. Each type will be\n returned just once, regardless of how many different relationships it has\n with a model.\n @method eachRelatedType\n @static\n @param {Function} callback the callback to invoke\n @param {any} binding the value to which the callback's `this` should be bound\n */\n eachRelatedType: function eachRelatedType(callback, binding) {\n var relationshipTypes = get(this, 'relatedTypes');\n\n for (var i = 0; i < relationshipTypes.length; i++) {\n var type = relationshipTypes[i];\n callback.call(binding, type);\n }\n },\n\n determineRelationshipType: function determineRelationshipType(knownSide, store) {\n var knownKey = knownSide.key;\n var knownKind = knownSide.kind;\n var inverse = this.inverseFor(knownKey, store);\n // let key;\n var otherKind = undefined;\n\n if (!inverse) {\n return knownKind === 'belongsTo' ? 'oneToNone' : 'manyToNone';\n }\n\n // key = inverse.name;\n otherKind = inverse.kind;\n\n if (otherKind === 'belongsTo') {\n return knownKind === 'belongsTo' ? 'oneToOne' : 'manyToOne';\n } else {\n return knownKind === 'belongsTo' ? 'oneToMany' : 'manyToMany';\n }\n }\n\n });\n\n exports.RelationshipsClassMethodsMixin = RelationshipsClassMethodsMixin;\n\n var RelationshipsInstanceMethodsMixin = _ember[\"default\"].Mixin.create({\n /**\n Given a callback, iterates over each of the relationships in the model,\n invoking the callback with the name of each relationship and its relationship\n descriptor.\n The callback method you provide should have the following signature (all\n parameters are optional):\n ```javascript\n function(name, descriptor);\n ```\n - `name` the name of the current property in the iteration\n - `descriptor` the meta object that describes this relationship\n The relationship descriptor argument is an object with the following properties.\n - **key** String the name of this relationship on the Model\n - **kind** String \"hasMany\" or \"belongsTo\"\n - **options** Object the original options hash passed when the relationship was declared\n - **parentType** DS.Model the type of the Model that owns this relationship\n - **type** String the type name of the related Model\n Note that in addition to a callback, you can also pass an optional target\n object that will be set as `this` on the context.\n Example\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n serialize: function(record, options) {\n var json = {};\n record.eachRelationship(function(name, descriptor) {\n if (descriptor.kind === 'hasMany') {\n var serializedHasManyName = name.toUpperCase() + '_IDS';\n json[serializedHasManyName] = record.get(name).mapBy('id');\n }\n });\n return json;\n }\n });\n ```\n @method eachRelationship\n @param {Function} callback the callback to invoke\n @param {any} binding the value to which the callback's `this` should be bound\n */\n eachRelationship: function eachRelationship(callback, binding) {\n this.constructor.eachRelationship(callback, binding);\n },\n\n relationshipFor: function relationshipFor(name) {\n return get(this.constructor, 'relationshipsByName').get(name);\n },\n\n inverseFor: function inverseFor(key) {\n return this.constructor.inverseFor(key, this.store);\n }\n\n });\n exports.RelationshipsInstanceMethodsMixin = RelationshipsInstanceMethodsMixin;\n});","define(\"ember-data/-private/system/relationships/has-many\", [\"exports\", \"ember\", \"ember-data/-private/debug\", \"ember-data/-private/system/normalize-model-name\", \"ember-data/-private/system/is-array-like\"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateSystemNormalizeModelName, _emberDataPrivateSystemIsArrayLike) {\n \"use strict\";\n\n exports[\"default\"] = hasMany;\n\n /**\n @module ember-data\n */\n\n /**\n `DS.hasMany` is used to define One-To-Many and Many-To-Many\n relationships on a [DS.Model](/api/data/classes/DS.Model.html).\n \n `DS.hasMany` takes an optional hash as a second parameter, currently\n supported options are:\n \n - `async`: A boolean value used to explicitly declare this to be an async relationship.\n - `inverse`: A string used to identify the inverse property on a related model.\n \n #### One-To-Many\n To declare a one-to-many relationship between two models, use\n `DS.belongsTo` in combination with `DS.hasMany`, like this:\n \n ```app/models/post.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n comments: DS.hasMany('comment')\n });\n ```\n \n ```app/models/comment.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n post: DS.belongsTo('post')\n });\n ```\n \n #### Many-To-Many\n To declare a many-to-many relationship between two models, use\n `DS.hasMany`:\n \n ```app/models/post.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n tags: DS.hasMany('tag')\n });\n ```\n \n ```app/models/tag.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n posts: DS.hasMany('post')\n });\n ```\n \n You can avoid passing a string as the first parameter. In that case Ember Data\n will infer the type from the singularized key name.\n \n ```app/models/post.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n tags: DS.hasMany()\n });\n ```\n \n will lookup for a Tag type.\n \n #### Explicit Inverses\n \n Ember Data will do its best to discover which relationships map to\n one another. In the one-to-many code above, for example, Ember Data\n can figure out that changing the `comments` relationship should update\n the `post` relationship on the inverse because post is the only\n relationship to that model.\n \n However, sometimes you may have multiple `belongsTo`/`hasManys` for the\n same type. You can specify which property on the related model is\n the inverse using `DS.hasMany`'s `inverse` option:\n \n ```app/models/comment.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n onePost: DS.belongsTo('post'),\n twoPost: DS.belongsTo('post'),\n redPost: DS.belongsTo('post'),\n bluePost: DS.belongsTo('post')\n });\n ```\n \n ```app/models/post.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n comments: DS.hasMany('comment', {\n inverse: 'redPost'\n })\n });\n ```\n \n You can also specify an inverse on a `belongsTo`, which works how\n you'd expect.\n \n @namespace\n @method hasMany\n @for DS\n @param {String} type (optional) type of the relationship\n @param {Object} options (optional) a hash of options\n @return {Ember.computed} relationship\n */\n function hasMany(type, options) {\n if (typeof type === 'object') {\n options = type;\n type = undefined;\n }\n\n (0, _emberDataPrivateDebug.assert)(\"The first argument to DS.hasMany must be a string representing a model type key, not an instance of \" + _ember[\"default\"].inspect(type) + \". E.g., to define a relation to the Comment model, use DS.hasMany('comment')\", typeof type === 'string' || typeof type === 'undefined');\n\n options = options || {};\n\n if (typeof type === 'string') {\n type = (0, _emberDataPrivateSystemNormalizeModelName[\"default\"])(type);\n }\n\n // Metadata about relationships is stored on the meta of\n // the relationship. This is used for introspection and\n // serialization. Note that `key` is populated lazily\n // the first time the CP is called.\n var meta = {\n type: type,\n isRelationship: true,\n options: options,\n kind: 'hasMany',\n key: null\n };\n\n return _ember[\"default\"].computed({\n get: function get(key) {\n var relationship = this._internalModel._relationships.get(key);\n return relationship.getRecords();\n },\n set: function set(key, records) {\n (0, _emberDataPrivateDebug.assert)(\"You must pass an array of records to set a hasMany relationship\", (0, _emberDataPrivateSystemIsArrayLike[\"default\"])(records));\n (0, _emberDataPrivateDebug.assert)(\"All elements of a hasMany relationship must be instances of DS.Model, you passed \" + _ember[\"default\"].inspect(records), (function () {\n return _ember[\"default\"].A(records).every(function (record) {\n return record.hasOwnProperty('_internalModel') === true;\n });\n })());\n\n var relationship = this._internalModel._relationships.get(key);\n relationship.clear();\n relationship.addRecords(_ember[\"default\"].A(records).mapBy('_internalModel'));\n return relationship.getRecords();\n }\n }).meta(meta);\n }\n\n var HasManyMixin = _ember[\"default\"].Mixin.create({\n notifyHasManyAdded: function notifyHasManyAdded(key) {\n //We need to notifyPropertyChange in the adding case because we need to make sure\n //we fetch the newly added record in case it is unloaded\n //TODO(Igor): Consider whether we could do this only if the record state is unloaded\n\n //Goes away once hasMany is double promisified\n this.notifyPropertyChange(key);\n }\n });\n exports.HasManyMixin = HasManyMixin;\n});","define(\"ember-data/-private/system/relationships/state/belongs-to\", [\"exports\", \"ember\", \"ember-data/-private/debug\", \"ember-data/-private/system/promise-proxies\", \"ember-data/-private/system/relationships/state/relationship\"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateSystemPromiseProxies, _emberDataPrivateSystemRelationshipsStateRelationship) {\n \"use strict\";\n\n exports[\"default\"] = BelongsToRelationship;\n\n function BelongsToRelationship(store, record, inverseKey, relationshipMeta) {\n this._super$constructor(store, record, inverseKey, relationshipMeta);\n this.record = record;\n this.key = relationshipMeta.key;\n this.inverseRecord = null;\n this.canonicalState = null;\n }\n\n BelongsToRelationship.prototype = Object.create(_emberDataPrivateSystemRelationshipsStateRelationship[\"default\"].prototype);\n BelongsToRelationship.prototype.constructor = BelongsToRelationship;\n BelongsToRelationship.prototype._super$constructor = _emberDataPrivateSystemRelationshipsStateRelationship[\"default\"];\n\n BelongsToRelationship.prototype.setRecord = function (newRecord) {\n if (newRecord) {\n this.addRecord(newRecord);\n } else if (this.inverseRecord) {\n this.removeRecord(this.inverseRecord);\n }\n this.setHasData(true);\n this.setHasLoaded(true);\n };\n\n BelongsToRelationship.prototype.setCanonicalRecord = function (newRecord) {\n if (newRecord) {\n this.addCanonicalRecord(newRecord);\n } else if (this.canonicalState) {\n this.removeCanonicalRecord(this.canonicalState);\n }\n this.flushCanonicalLater();\n this.setHasData(true);\n this.setHasLoaded(true);\n };\n\n BelongsToRelationship.prototype._super$addCanonicalRecord = _emberDataPrivateSystemRelationshipsStateRelationship[\"default\"].prototype.addCanonicalRecord;\n BelongsToRelationship.prototype.addCanonicalRecord = function (newRecord) {\n if (this.canonicalMembers.has(newRecord)) {\n return;\n }\n\n if (this.canonicalState) {\n this.removeCanonicalRecord(this.canonicalState);\n }\n\n this.canonicalState = newRecord;\n this._super$addCanonicalRecord(newRecord);\n };\n\n BelongsToRelationship.prototype._super$flushCanonical = _emberDataPrivateSystemRelationshipsStateRelationship[\"default\"].prototype.flushCanonical;\n BelongsToRelationship.prototype.flushCanonical = function () {\n //temporary fix to not remove newly created records if server returned null.\n //TODO remove once we have proper diffing\n if (this.inverseRecord && this.inverseRecord.isNew() && !this.canonicalState) {\n return;\n }\n this.inverseRecord = this.canonicalState;\n this.record.notifyBelongsToChanged(this.key);\n this._super$flushCanonical();\n };\n\n BelongsToRelationship.prototype._super$addRecord = _emberDataPrivateSystemRelationshipsStateRelationship[\"default\"].prototype.addRecord;\n BelongsToRelationship.prototype.addRecord = function (newRecord) {\n if (this.members.has(newRecord)) {\n return;\n }\n\n (0, _emberDataPrivateDebug.assertPolymorphicType)(this.record, this.relationshipMeta, newRecord);\n\n if (this.inverseRecord) {\n this.removeRecord(this.inverseRecord);\n }\n\n this.inverseRecord = newRecord;\n this._super$addRecord(newRecord);\n this.record.notifyBelongsToChanged(this.key);\n };\n\n BelongsToRelationship.prototype.setRecordPromise = function (newPromise) {\n var content = newPromise.get && newPromise.get('content');\n (0, _emberDataPrivateDebug.assert)(\"You passed in a promise that did not originate from an EmberData relationship. You can only pass promises that come from a belongsTo or hasMany relationship to the get call.\", content !== undefined);\n this.setRecord(content ? content._internalModel : content);\n };\n\n BelongsToRelationship.prototype._super$removeRecordFromOwn = _emberDataPrivateSystemRelationshipsStateRelationship[\"default\"].prototype.removeRecordFromOwn;\n BelongsToRelationship.prototype.removeRecordFromOwn = function (record) {\n if (!this.members.has(record)) {\n return;\n }\n this.inverseRecord = null;\n this._super$removeRecordFromOwn(record);\n this.record.notifyBelongsToChanged(this.key);\n };\n\n BelongsToRelationship.prototype._super$removeCanonicalRecordFromOwn = _emberDataPrivateSystemRelationshipsStateRelationship[\"default\"].prototype.removeCanonicalRecordFromOwn;\n BelongsToRelationship.prototype.removeCanonicalRecordFromOwn = function (record) {\n if (!this.canonicalMembers.has(record)) {\n return;\n }\n this.canonicalState = null;\n this._super$removeCanonicalRecordFromOwn(record);\n };\n\n BelongsToRelationship.prototype.findRecord = function () {\n if (this.inverseRecord) {\n return this.store._findByInternalModel(this.inverseRecord);\n } else {\n return _ember[\"default\"].RSVP.Promise.resolve(null);\n }\n };\n\n BelongsToRelationship.prototype.fetchLink = function () {\n var _this = this;\n\n return this.store.findBelongsTo(this.record, this.link, this.relationshipMeta).then(function (record) {\n if (record) {\n _this.addRecord(record);\n }\n return record;\n });\n };\n\n BelongsToRelationship.prototype.getRecord = function () {\n var _this2 = this;\n\n //TODO(Igor) flushCanonical here once our syncing is not stupid\n if (this.isAsync) {\n var promise;\n if (this.link) {\n if (this.hasLoaded) {\n promise = this.findRecord();\n } else {\n promise = this.findLink().then(function () {\n return _this2.findRecord();\n });\n }\n } else {\n promise = this.findRecord();\n }\n\n return _emberDataPrivateSystemPromiseProxies.PromiseObject.create({\n promise: promise,\n content: this.inverseRecord ? this.inverseRecord.getRecord() : null\n });\n } else {\n if (this.inverseRecord === null) {\n return null;\n }\n var toReturn = this.inverseRecord.getRecord();\n (0, _emberDataPrivateDebug.assert)(\"You looked up the '\" + this.key + \"' relationship on a '\" + this.record.type.modelName + \"' with id \" + this.record.id + \" but some of the associated records were not loaded. Either make sure they are all loaded together with the parent record, or specify that the relationship is async (`DS.belongsTo({ async: true })`)\", toReturn === null || !toReturn.get('isEmpty'));\n return toReturn;\n }\n };\n\n BelongsToRelationship.prototype.reload = function () {\n // TODO handle case when reload() is triggered multiple times\n\n if (this.link) {\n return this.fetchLink();\n }\n\n // reload record, if it is already loaded\n if (this.inverseRecord && this.inverseRecord.record) {\n return this.inverseRecord.record.reload();\n }\n\n return this.findRecord();\n };\n});","define(\"ember-data/-private/system/relationships/state/create\", [\"exports\", \"ember\", \"ember-data/-private/system/relationships/state/has-many\", \"ember-data/-private/system/relationships/state/belongs-to\", \"ember-data/-private/system/empty-object\"], function (exports, _ember, _emberDataPrivateSystemRelationshipsStateHasMany, _emberDataPrivateSystemRelationshipsStateBelongsTo, _emberDataPrivateSystemEmptyObject) {\n \"use strict\";\n\n exports[\"default\"] = Relationships;\n\n var get = _ember[\"default\"].get;\n\n function shouldFindInverse(relationshipMeta) {\n var options = relationshipMeta.options;\n return !(options && options.inverse === null);\n }\n\n function createRelationshipFor(record, relationshipMeta, store) {\n var inverseKey = undefined;\n var inverse = null;\n if (shouldFindInverse(relationshipMeta)) {\n inverse = record.type.inverseFor(relationshipMeta.key, store);\n }\n\n if (inverse) {\n inverseKey = inverse.name;\n }\n\n if (relationshipMeta.kind === 'hasMany') {\n return new _emberDataPrivateSystemRelationshipsStateHasMany[\"default\"](store, record, inverseKey, relationshipMeta);\n } else {\n return new _emberDataPrivateSystemRelationshipsStateBelongsTo[\"default\"](store, record, inverseKey, relationshipMeta);\n }\n }\n function Relationships(record) {\n this.record = record;\n this.initializedRelationships = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n }\n\n Relationships.prototype.has = function (key) {\n return !!this.initializedRelationships[key];\n };\n\n Relationships.prototype.get = function (key) {\n var relationships = this.initializedRelationships;\n var relationshipsByName = get(this.record.type, 'relationshipsByName');\n if (!relationships[key] && relationshipsByName.get(key)) {\n relationships[key] = createRelationshipFor(this.record, relationshipsByName.get(key), this.record.store);\n }\n return relationships[key];\n };\n});","define(\"ember-data/-private/system/relationships/state/has-many\", [\"exports\", \"ember-data/-private/debug\", \"ember-data/-private/system/promise-proxies\", \"ember-data/-private/system/relationships/state/relationship\", \"ember-data/-private/system/ordered-set\", \"ember-data/-private/system/many-array\"], function (exports, _emberDataPrivateDebug, _emberDataPrivateSystemPromiseProxies, _emberDataPrivateSystemRelationshipsStateRelationship, _emberDataPrivateSystemOrderedSet, _emberDataPrivateSystemManyArray) {\n \"use strict\";\n\n exports[\"default\"] = ManyRelationship;\n\n function ManyRelationship(store, record, inverseKey, relationshipMeta) {\n this._super$constructor(store, record, inverseKey, relationshipMeta);\n this.belongsToType = relationshipMeta.type;\n this.canonicalState = [];\n this.manyArray = _emberDataPrivateSystemManyArray[\"default\"].create({\n canonicalState: this.canonicalState,\n store: this.store,\n relationship: this,\n type: this.store.modelFor(this.belongsToType),\n record: record\n });\n this.isPolymorphic = relationshipMeta.options.polymorphic;\n this.manyArray.isPolymorphic = this.isPolymorphic;\n }\n\n ManyRelationship.prototype = Object.create(_emberDataPrivateSystemRelationshipsStateRelationship[\"default\"].prototype);\n ManyRelationship.prototype.constructor = ManyRelationship;\n ManyRelationship.prototype._super$constructor = _emberDataPrivateSystemRelationshipsStateRelationship[\"default\"];\n\n ManyRelationship.prototype.destroy = function () {\n this.manyArray.destroy();\n };\n\n ManyRelationship.prototype._super$updateMeta = _emberDataPrivateSystemRelationshipsStateRelationship[\"default\"].prototype.updateMeta;\n ManyRelationship.prototype.updateMeta = function (meta) {\n this._super$updateMeta(meta);\n this.manyArray.set('meta', meta);\n };\n\n ManyRelationship.prototype._super$addCanonicalRecord = _emberDataPrivateSystemRelationshipsStateRelationship[\"default\"].prototype.addCanonicalRecord;\n ManyRelationship.prototype.addCanonicalRecord = function (record, idx) {\n if (this.canonicalMembers.has(record)) {\n return;\n }\n if (idx !== undefined) {\n this.canonicalState.splice(idx, 0, record);\n } else {\n this.canonicalState.push(record);\n }\n this._super$addCanonicalRecord(record, idx);\n };\n\n ManyRelationship.prototype._super$addRecord = _emberDataPrivateSystemRelationshipsStateRelationship[\"default\"].prototype.addRecord;\n ManyRelationship.prototype.addRecord = function (record, idx) {\n if (this.members.has(record)) {\n return;\n }\n this._super$addRecord(record, idx);\n this.manyArray.internalAddRecords([record], idx);\n };\n\n ManyRelationship.prototype._super$removeCanonicalRecordFromOwn = _emberDataPrivateSystemRelationshipsStateRelationship[\"default\"].prototype.removeCanonicalRecordFromOwn;\n ManyRelationship.prototype.removeCanonicalRecordFromOwn = function (record, idx) {\n var i = idx;\n if (!this.canonicalMembers.has(record)) {\n return;\n }\n if (i === undefined) {\n i = this.canonicalState.indexOf(record);\n }\n if (i > -1) {\n this.canonicalState.splice(i, 1);\n }\n this._super$removeCanonicalRecordFromOwn(record, idx);\n };\n\n ManyRelationship.prototype._super$flushCanonical = _emberDataPrivateSystemRelationshipsStateRelationship[\"default\"].prototype.flushCanonical;\n ManyRelationship.prototype.flushCanonical = function () {\n this.manyArray.flushCanonical();\n this._super$flushCanonical();\n };\n\n ManyRelationship.prototype._super$removeRecordFromOwn = _emberDataPrivateSystemRelationshipsStateRelationship[\"default\"].prototype.removeRecordFromOwn;\n ManyRelationship.prototype.removeRecordFromOwn = function (record, idx) {\n if (!this.members.has(record)) {\n return;\n }\n this._super$removeRecordFromOwn(record, idx);\n if (idx !== undefined) {\n //TODO(Igor) not used currently, fix\n this.manyArray.currentState.removeAt(idx);\n } else {\n this.manyArray.internalRemoveRecords([record]);\n }\n };\n\n ManyRelationship.prototype.notifyRecordRelationshipAdded = function (record, idx) {\n (0, _emberDataPrivateDebug.assertPolymorphicType)(this.record, this.relationshipMeta, record);\n\n this.record.notifyHasManyAdded(this.key, record, idx);\n };\n\n ManyRelationship.prototype.reload = function () {\n var _this = this;\n\n var manyArrayLoadedState = this.manyArray.get('isLoaded');\n\n if (this._loadingPromise) {\n if (this._loadingPromise.get('isPending')) {\n return this._loadingPromise;\n }\n if (this._loadingPromise.get('isRejected')) {\n this.manyArray.set('isLoaded', manyArrayLoadedState);\n }\n }\n\n if (this.link) {\n this._loadingPromise = (0, _emberDataPrivateSystemPromiseProxies.promiseManyArray)(this.fetchLink(), 'Reload with link');\n return this._loadingPromise;\n } else {\n this._loadingPromise = (0, _emberDataPrivateSystemPromiseProxies.promiseManyArray)(this.store.scheduleFetchMany(this.manyArray.toArray()).then(function () {\n return _this.manyArray;\n }), 'Reload with ids');\n return this._loadingPromise;\n }\n };\n\n ManyRelationship.prototype.computeChanges = function (records) {\n var members = this.canonicalMembers;\n var recordsToRemove = [];\n var length;\n var record;\n var i;\n\n records = setForArray(records);\n\n members.forEach(function (member) {\n if (records.has(member)) {\n return;\n }\n\n recordsToRemove.push(member);\n });\n\n this.removeCanonicalRecords(recordsToRemove);\n\n // Using records.toArray() since currently using\n // removeRecord can modify length, messing stuff up\n // forEach since it directly looks at \"length\" each\n // iteration\n records = records.toArray();\n length = records.length;\n for (i = 0; i < length; i++) {\n record = records[i];\n this.removeCanonicalRecord(record);\n this.addCanonicalRecord(record, i);\n }\n };\n\n ManyRelationship.prototype.fetchLink = function () {\n var _this2 = this;\n\n return this.store.findHasMany(this.record, this.link, this.relationshipMeta).then(function (records) {\n if (records.hasOwnProperty('meta')) {\n _this2.updateMeta(records.meta);\n }\n _this2.store._backburner.join(function () {\n _this2.updateRecordsFromAdapter(records);\n _this2.manyArray.set('isLoaded', true);\n });\n return _this2.manyArray;\n });\n };\n\n ManyRelationship.prototype.findRecords = function () {\n var _this3 = this;\n\n var manyArray = this.manyArray.toArray();\n var internalModels = new Array(manyArray.length);\n\n for (var i = 0; i < manyArray.length; i++) {\n internalModels[i] = manyArray[i]._internalModel;\n }\n\n //TODO CLEANUP\n return this.store.findMany(internalModels).then(function () {\n if (!_this3.manyArray.get('isDestroyed')) {\n //Goes away after the manyArray refactor\n _this3.manyArray.set('isLoaded', true);\n }\n return _this3.manyArray;\n });\n };\n ManyRelationship.prototype.notifyHasManyChanged = function () {\n this.record.notifyHasManyAdded(this.key);\n };\n\n ManyRelationship.prototype.getRecords = function () {\n var _this4 = this;\n\n //TODO(Igor) sync server here, once our syncing is not stupid\n if (this.isAsync) {\n var promise;\n if (this.link) {\n if (this.hasLoaded) {\n promise = this.findRecords();\n } else {\n promise = this.findLink().then(function () {\n return _this4.findRecords();\n });\n }\n } else {\n promise = this.findRecords();\n }\n this._loadingPromise = _emberDataPrivateSystemPromiseProxies.PromiseManyArray.create({\n content: this.manyArray,\n promise: promise\n });\n return this._loadingPromise;\n } else {\n (0, _emberDataPrivateDebug.assert)(\"You looked up the '\" + this.key + \"' relationship on a '\" + this.record.type.modelName + \"' with id \" + this.record.id + \" but some of the associated records were not loaded. Either make sure they are all loaded together with the parent record, or specify that the relationship is async (`DS.hasMany({ async: true })`)\", this.manyArray.isEvery('isEmpty', false));\n\n //TODO(Igor) WTF DO I DO HERE?\n if (!this.manyArray.get('isDestroyed')) {\n this.manyArray.set('isLoaded', true);\n }\n return this.manyArray;\n }\n };\n\n function setForArray(array) {\n var set = new _emberDataPrivateSystemOrderedSet[\"default\"]();\n\n if (array) {\n for (var i = 0, l = array.length; i < l; i++) {\n set.add(array[i]);\n }\n }\n\n return set;\n }\n});","define(\"ember-data/-private/system/relationships/state/relationship\", [\"exports\", \"ember\", \"ember-data/-private/debug\", \"ember-data/-private/system/ordered-set\"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateSystemOrderedSet) {\n \"use strict\";\n\n exports[\"default\"] = Relationship;\n\n function Relationship(store, record, inverseKey, relationshipMeta) {\n var async = relationshipMeta.options.async;\n this.members = new _emberDataPrivateSystemOrderedSet[\"default\"]();\n this.canonicalMembers = new _emberDataPrivateSystemOrderedSet[\"default\"]();\n this.store = store;\n this.key = relationshipMeta.key;\n this.inverseKey = inverseKey;\n this.record = record;\n this.isAsync = typeof async === 'undefined' ? true : async;\n this.relationshipMeta = relationshipMeta;\n //This probably breaks for polymorphic relationship in complex scenarios, due to\n //multiple possible modelNames\n this.inverseKeyForImplicit = this.record.constructor.modelName + this.key;\n this.linkPromise = null;\n this.meta = null;\n this.hasData = false;\n this.hasLoaded = false;\n }\n\n Relationship.prototype = {\n constructor: Relationship,\n\n destroy: _ember[\"default\"].K,\n\n updateMeta: function updateMeta(meta) {\n this.meta = meta;\n },\n\n clear: function clear() {\n var members = this.members.list;\n var member;\n\n while (members.length > 0) {\n member = members[0];\n this.removeRecord(member);\n }\n },\n\n removeRecords: function removeRecords(records) {\n var _this = this;\n\n records.forEach(function (record) {\n return _this.removeRecord(record);\n });\n },\n\n addRecords: function addRecords(records, idx) {\n var _this2 = this;\n\n records.forEach(function (record) {\n _this2.addRecord(record, idx);\n if (idx !== undefined) {\n idx++;\n }\n });\n },\n\n addCanonicalRecords: function addCanonicalRecords(records, idx) {\n for (var i = 0; i < records.length; i++) {\n if (idx !== undefined) {\n this.addCanonicalRecord(records[i], i + idx);\n } else {\n this.addCanonicalRecord(records[i]);\n }\n }\n },\n\n addCanonicalRecord: function addCanonicalRecord(record, idx) {\n if (!this.canonicalMembers.has(record)) {\n this.canonicalMembers.add(record);\n if (this.inverseKey) {\n record._relationships.get(this.inverseKey).addCanonicalRecord(this.record);\n } else {\n if (!record._implicitRelationships[this.inverseKeyForImplicit]) {\n record._implicitRelationships[this.inverseKeyForImplicit] = new Relationship(this.store, record, this.key, { options: {} });\n }\n record._implicitRelationships[this.inverseKeyForImplicit].addCanonicalRecord(this.record);\n }\n }\n this.flushCanonicalLater();\n this.setHasData(true);\n },\n\n removeCanonicalRecords: function removeCanonicalRecords(records, idx) {\n for (var i = 0; i < records.length; i++) {\n if (idx !== undefined) {\n this.removeCanonicalRecord(records[i], i + idx);\n } else {\n this.removeCanonicalRecord(records[i]);\n }\n }\n },\n\n removeCanonicalRecord: function removeCanonicalRecord(record, idx) {\n if (this.canonicalMembers.has(record)) {\n this.removeCanonicalRecordFromOwn(record);\n if (this.inverseKey) {\n this.removeCanonicalRecordFromInverse(record);\n } else {\n if (record._implicitRelationships[this.inverseKeyForImplicit]) {\n record._implicitRelationships[this.inverseKeyForImplicit].removeCanonicalRecord(this.record);\n }\n }\n }\n this.flushCanonicalLater();\n },\n\n addRecord: function addRecord(record, idx) {\n if (!this.members.has(record)) {\n this.members.addWithIndex(record, idx);\n this.notifyRecordRelationshipAdded(record, idx);\n if (this.inverseKey) {\n record._relationships.get(this.inverseKey).addRecord(this.record);\n } else {\n if (!record._implicitRelationships[this.inverseKeyForImplicit]) {\n record._implicitRelationships[this.inverseKeyForImplicit] = new Relationship(this.store, record, this.key, { options: {} });\n }\n record._implicitRelationships[this.inverseKeyForImplicit].addRecord(this.record);\n }\n this.record.updateRecordArraysLater();\n }\n this.setHasData(true);\n },\n\n removeRecord: function removeRecord(record) {\n if (this.members.has(record)) {\n this.removeRecordFromOwn(record);\n if (this.inverseKey) {\n this.removeRecordFromInverse(record);\n } else {\n if (record._implicitRelationships[this.inverseKeyForImplicit]) {\n record._implicitRelationships[this.inverseKeyForImplicit].removeRecord(this.record);\n }\n }\n }\n },\n\n removeRecordFromInverse: function removeRecordFromInverse(record) {\n var inverseRelationship = record._relationships.get(this.inverseKey);\n //Need to check for existence, as the record might unloading at the moment\n if (inverseRelationship) {\n inverseRelationship.removeRecordFromOwn(this.record);\n }\n },\n\n removeRecordFromOwn: function removeRecordFromOwn(record) {\n this.members[\"delete\"](record);\n this.notifyRecordRelationshipRemoved(record);\n this.record.updateRecordArrays();\n },\n\n removeCanonicalRecordFromInverse: function removeCanonicalRecordFromInverse(record) {\n var inverseRelationship = record._relationships.get(this.inverseKey);\n //Need to check for existence, as the record might unloading at the moment\n if (inverseRelationship) {\n inverseRelationship.removeCanonicalRecordFromOwn(this.record);\n }\n },\n\n removeCanonicalRecordFromOwn: function removeCanonicalRecordFromOwn(record) {\n this.canonicalMembers[\"delete\"](record);\n this.flushCanonicalLater();\n },\n\n flushCanonical: function flushCanonical() {\n this.willSync = false;\n //a hack for not removing new records\n //TODO remove once we have proper diffing\n var newRecords = [];\n for (var i = 0; i < this.members.list.length; i++) {\n if (this.members.list[i].isNew()) {\n newRecords.push(this.members.list[i]);\n }\n }\n //TODO(Igor) make this less abysmally slow\n this.members = this.canonicalMembers.copy();\n for (i = 0; i < newRecords.length; i++) {\n this.members.add(newRecords[i]);\n }\n },\n\n flushCanonicalLater: function flushCanonicalLater() {\n var _this3 = this;\n\n if (this.willSync) {\n return;\n }\n this.willSync = true;\n this.store._backburner.join(function () {\n return _this3.store._backburner.schedule('syncRelationships', _this3, _this3.flushCanonical);\n });\n },\n\n updateLink: function updateLink(link) {\n (0, _emberDataPrivateDebug.warn)(\"You have pushed a record of type '\" + this.record.type.modelName + \"' with '\" + this.key + \"' as a link, but the association is not an async relationship.\", this.isAsync, {\n id: 'ds.store.push-link-for-sync-relationship'\n });\n (0, _emberDataPrivateDebug.assert)(\"You have pushed a record of type '\" + this.record.type.modelName + \"' with '\" + this.key + \"' as a link, but the value of that link is not a string.\", typeof link === 'string' || link === null);\n if (link !== this.link) {\n this.link = link;\n this.linkPromise = null;\n this.setHasLoaded(false);\n this.record.notifyPropertyChange(this.key);\n }\n },\n\n findLink: function findLink() {\n if (this.linkPromise) {\n return this.linkPromise;\n } else {\n var promise = this.fetchLink();\n this.linkPromise = promise;\n return promise.then(function (result) {\n return result;\n });\n }\n },\n\n updateRecordsFromAdapter: function updateRecordsFromAdapter(records) {\n //TODO(Igor) move this to a proper place\n //TODO Once we have adapter support, we need to handle updated and canonical changes\n this.computeChanges(records);\n this.setHasData(true);\n this.setHasLoaded(true);\n },\n\n notifyRecordRelationshipAdded: _ember[\"default\"].K,\n notifyRecordRelationshipRemoved: _ember[\"default\"].K,\n\n /*\n `hasData` for a relationship is a flag to indicate if we consider the\n content of this relationship \"known\". Snapshots uses this to tell the\n difference between unknown (`undefined`) or empty (`null`). The reason for\n this is that we wouldn't want to serialize unknown relationships as `null`\n as that might overwrite remote state.\n All relationships for a newly created (`store.createRecord()`) are\n considered known (`hasData === true`).\n */\n setHasData: function setHasData(value) {\n this.hasData = value;\n },\n\n /*\n `hasLoaded` is a flag to indicate if we have gotten data from the adapter or\n not when the relationship has a link.\n This is used to be able to tell when to fetch the link and when to return\n the local data in scenarios where the local state is considered known\n (`hasData === true`).\n Updating the link will automatically set `hasLoaded` to `false`.\n */\n setHasLoaded: function setHasLoaded(value) {\n this.hasLoaded = value;\n }\n };\n});","define('ember-data/-private/system/snapshot-record-array', ['exports'], function (exports) {\n 'use strict';\n\n exports['default'] = SnapshotRecordArray;\n\n /**\n @module ember-data\n */\n\n /**\n @class SnapshotRecordArray\n @namespace DS\n @private\n @constructor\n @param {Array} snapshots An array of snapshots\n @param {Object} meta\n */\n function SnapshotRecordArray(recordArray, meta) {\n var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];\n\n /**\n An array of snapshots\n @private\n @property _snapshots\n @type {Array}\n */\n this._snapshots = null;\n /**\n An array of records\n @private\n @property _recordArray\n @type {Array}\n */\n this._recordArray = recordArray;\n /**\n Number of records in the array\n @property length\n @type {Number}\n */\n this.length = recordArray.get('length');\n /**\n The type of the underlying records for the snapshots in the array, as a DS.Model\n @property type\n @type {DS.Model}\n */\n this.type = recordArray.get('type');\n /**\n Meta object\n @property meta\n @type {Object}\n */\n this.meta = meta;\n /**\n A hash of adapter options\n @property adapterOptions\n @type {Object}\n */\n this.adapterOptions = options.adapterOptions;\n\n this.include = options.include;\n }\n\n /**\n Get snapshots of the underlying record array\n @method snapshots\n @return {Array} Array of snapshots\n */\n SnapshotRecordArray.prototype.snapshots = function () {\n if (this._snapshots) {\n return this._snapshots;\n }\n var recordArray = this._recordArray;\n this._snapshots = recordArray.invoke('createSnapshot');\n\n return this._snapshots;\n };\n});","define(\"ember-data/-private/system/snapshot\", [\"exports\", \"ember\", \"ember-data/-private/system/empty-object\"], function (exports, _ember, _emberDataPrivateSystemEmptyObject) {\n \"use strict\";\n\n exports[\"default\"] = Snapshot;\n\n /**\n @module ember-data\n */\n\n var get = _ember[\"default\"].get;\n\n /**\n @class Snapshot\n @namespace DS\n @private\n @constructor\n @param {DS.Model} internalModel The model to create a snapshot from\n */\n function Snapshot(internalModel) {\n var _this = this;\n\n var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n this._attributes = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n this._belongsToRelationships = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n this._belongsToIds = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n this._hasManyRelationships = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n this._hasManyIds = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n\n var record = internalModel.getRecord();\n this.record = record;\n record.eachAttribute(function (keyName) {\n return _this._attributes[keyName] = get(record, keyName);\n });\n\n this.id = internalModel.id;\n this._internalModel = internalModel;\n this.type = internalModel.type;\n this.modelName = internalModel.type.modelName;\n\n /**\n A hash of adapter options\n @property adapterOptions\n @type {Object}\n */\n this.adapterOptions = options.adapterOptions;\n\n this.include = options.include;\n\n this._changedAttributes = record.changedAttributes();\n }\n\n Snapshot.prototype = {\n constructor: Snapshot,\n\n /**\n The id of the snapshot's underlying record\n Example\n ```javascript\n // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });\n postSnapshot.id; // => '1'\n ```\n @property id\n @type {String}\n */\n id: null,\n\n /**\n The underlying record for this snapshot. Can be used to access methods and\n properties defined on the record.\n Example\n ```javascript\n var json = snapshot.record.toJSON();\n ```\n @property record\n @type {DS.Model}\n */\n record: null,\n\n /**\n The type of the underlying record for this snapshot, as a DS.Model.\n @property type\n @type {DS.Model}\n */\n type: null,\n\n /**\n The name of the type of the underlying record for this snapshot, as a string.\n @property modelName\n @type {String}\n */\n modelName: null,\n\n /**\n Returns the value of an attribute.\n Example\n ```javascript\n // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });\n postSnapshot.attr('author'); // => 'Tomster'\n postSnapshot.attr('title'); // => 'Ember.js rocks'\n ```\n Note: Values are loaded eagerly and cached when the snapshot is created.\n @method attr\n @param {String} keyName\n @return {Object} The attribute value or undefined\n */\n attr: function attr(keyName) {\n if (keyName in this._attributes) {\n return this._attributes[keyName];\n }\n throw new _ember[\"default\"].Error(\"Model '\" + _ember[\"default\"].inspect(this.record) + \"' has no attribute named '\" + keyName + \"' defined.\");\n },\n\n /**\n Returns all attributes and their corresponding values.\n Example\n ```javascript\n // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });\n postSnapshot.attributes(); // => { author: 'Tomster', title: 'Ember.js rocks' }\n ```\n @method attributes\n @return {Object} All attributes of the current snapshot\n */\n attributes: function attributes() {\n return _ember[\"default\"].copy(this._attributes);\n },\n\n /**\n Returns all changed attributes and their old and new values.\n Example\n ```javascript\n // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });\n postModel.set('title', 'Ember.js rocks!');\n postSnapshot.changedAttributes(); // => { title: ['Ember.js rocks', 'Ember.js rocks!'] }\n ```\n @method changedAttributes\n @return {Object} All changed attributes of the current snapshot\n */\n changedAttributes: function changedAttributes() {\n var changedAttributes = new _emberDataPrivateSystemEmptyObject[\"default\"]();\n var changedAttributeKeys = Object.keys(this._changedAttributes);\n\n for (var i = 0, _length = changedAttributeKeys.length; i < _length; i++) {\n var key = changedAttributeKeys[i];\n changedAttributes[key] = _ember[\"default\"].copy(this._changedAttributes[key]);\n }\n\n return changedAttributes;\n },\n\n /**\n Returns the current value of a belongsTo relationship.\n `belongsTo` takes an optional hash of options as a second parameter,\n currently supported options are:\n - `id`: set to `true` if you only want the ID of the related record to be\n returned.\n Example\n ```javascript\n // store.push('post', { id: 1, title: 'Hello World' });\n // store.createRecord('comment', { body: 'Lorem ipsum', post: post });\n commentSnapshot.belongsTo('post'); // => DS.Snapshot\n commentSnapshot.belongsTo('post', { id: true }); // => '1'\n // store.push('comment', { id: 1, body: 'Lorem ipsum' });\n commentSnapshot.belongsTo('post'); // => undefined\n ```\n Calling `belongsTo` will return a new Snapshot as long as there's any known\n data for the relationship available, such as an ID. If the relationship is\n known but unset, `belongsTo` will return `null`. If the contents of the\n relationship is unknown `belongsTo` will return `undefined`.\n Note: Relationships are loaded lazily and cached upon first access.\n @method belongsTo\n @param {String} keyName\n @param {Object} [options]\n @return {(DS.Snapshot|String|null|undefined)} A snapshot or ID of a known\n relationship or null if the relationship is known but unset. undefined\n will be returned if the contents of the relationship is unknown.\n */\n belongsTo: function belongsTo(keyName, options) {\n var id = options && options.id;\n var relationship, inverseRecord, hasData;\n var result;\n\n if (id && keyName in this._belongsToIds) {\n return this._belongsToIds[keyName];\n }\n\n if (!id && keyName in this._belongsToRelationships) {\n return this._belongsToRelationships[keyName];\n }\n\n relationship = this._internalModel._relationships.get(keyName);\n if (!(relationship && relationship.relationshipMeta.kind === 'belongsTo')) {\n throw new _ember[\"default\"].Error(\"Model '\" + _ember[\"default\"].inspect(this.record) + \"' has no belongsTo relationship named '\" + keyName + \"' defined.\");\n }\n\n hasData = get(relationship, 'hasData');\n inverseRecord = get(relationship, 'inverseRecord');\n\n if (hasData) {\n if (inverseRecord && !inverseRecord.isDeleted()) {\n if (id) {\n result = get(inverseRecord, 'id');\n } else {\n result = inverseRecord.createSnapshot();\n }\n } else {\n result = null;\n }\n }\n\n if (id) {\n this._belongsToIds[keyName] = result;\n } else {\n this._belongsToRelationships[keyName] = result;\n }\n\n return result;\n },\n\n /**\n Returns the current value of a hasMany relationship.\n `hasMany` takes an optional hash of options as a second parameter,\n currently supported options are:\n - `ids`: set to `true` if you only want the IDs of the related records to be\n returned.\n Example\n ```javascript\n // store.push('post', { id: 1, title: 'Hello World', comments: [2, 3] });\n postSnapshot.hasMany('comments'); // => [DS.Snapshot, DS.Snapshot]\n postSnapshot.hasMany('comments', { ids: true }); // => ['2', '3']\n // store.push('post', { id: 1, title: 'Hello World' });\n postSnapshot.hasMany('comments'); // => undefined\n ```\n Note: Relationships are loaded lazily and cached upon first access.\n @method hasMany\n @param {String} keyName\n @param {Object} [options]\n @return {(Array|undefined)} An array of snapshots or IDs of a known\n relationship or an empty array if the relationship is known but unset.\n undefined will be returned if the contents of the relationship is unknown.\n */\n hasMany: function hasMany(keyName, options) {\n var ids = options && options.ids;\n var relationship, members, hasData;\n var results;\n\n if (ids && keyName in this._hasManyIds) {\n return this._hasManyIds[keyName];\n }\n\n if (!ids && keyName in this._hasManyRelationships) {\n return this._hasManyRelationships[keyName];\n }\n\n relationship = this._internalModel._relationships.get(keyName);\n if (!(relationship && relationship.relationshipMeta.kind === 'hasMany')) {\n throw new _ember[\"default\"].Error(\"Model '\" + _ember[\"default\"].inspect(this.record) + \"' has no hasMany relationship named '\" + keyName + \"' defined.\");\n }\n\n hasData = get(relationship, 'hasData');\n members = get(relationship, 'members');\n\n if (hasData) {\n results = [];\n members.forEach(function (member) {\n if (!member.isDeleted()) {\n if (ids) {\n results.push(member.id);\n } else {\n results.push(member.createSnapshot());\n }\n }\n });\n }\n\n if (ids) {\n this._hasManyIds[keyName] = results;\n } else {\n this._hasManyRelationships[keyName] = results;\n }\n\n return results;\n },\n\n /**\n Iterates through all the attributes of the model, calling the passed\n function on each attribute.\n Example\n ```javascript\n snapshot.eachAttribute(function(name, meta) {\n // ...\n });\n ```\n @method eachAttribute\n @param {Function} callback the callback to execute\n @param {Object} [binding] the value to which the callback's `this` should be bound\n */\n eachAttribute: function eachAttribute(callback, binding) {\n this.record.eachAttribute(callback, binding);\n },\n\n /**\n Iterates through all the relationships of the model, calling the passed\n function on each relationship.\n Example\n ```javascript\n snapshot.eachRelationship(function(name, relationship) {\n // ...\n });\n ```\n @method eachRelationship\n @param {Function} callback the callback to execute\n @param {Object} [binding] the value to which the callback's `this` should be bound\n */\n eachRelationship: function eachRelationship(callback, binding) {\n this.record.eachRelationship(callback, binding);\n },\n\n /**\n @method serialize\n @param {Object} options\n @return {Object} an object whose values are primitive JSON values only\n */\n serialize: function serialize(options) {\n return this.record.store.serializerFor(this.modelName).serialize(this, options);\n }\n };\n});","define('ember-data/-private/system/store', ['exports', 'ember', 'ember-data/model', 'ember-data/-private/debug', 'ember-data/-private/system/normalize-link', 'ember-data/-private/system/normalize-model-name', 'ember-data/adapters/errors', 'ember-data/-private/system/promise-proxies', 'ember-data/-private/system/store/common', 'ember-data/-private/system/store/serializer-response', 'ember-data/-private/system/store/serializers', 'ember-data/-private/system/store/finders', 'ember-data/-private/utils', 'ember-data/-private/system/coerce-id', 'ember-data/-private/system/record-array-manager', 'ember-data/-private/system/store/container-instance-cache', 'ember-data/-private/system/model/internal-model', 'ember-data/-private/system/empty-object', 'ember-data/-private/features'], function (exports, _ember, _emberDataModel, _emberDataPrivateDebug, _emberDataPrivateSystemNormalizeLink, _emberDataPrivateSystemNormalizeModelName, _emberDataAdaptersErrors, _emberDataPrivateSystemPromiseProxies, _emberDataPrivateSystemStoreCommon, _emberDataPrivateSystemStoreSerializerResponse, _emberDataPrivateSystemStoreSerializers, _emberDataPrivateSystemStoreFinders, _emberDataPrivateUtils, _emberDataPrivateSystemCoerceId, _emberDataPrivateSystemRecordArrayManager, _emberDataPrivateSystemStoreContainerInstanceCache, _emberDataPrivateSystemModelInternalModel, _emberDataPrivateSystemEmptyObject, _emberDataPrivateFeatures) {\n /**\n @module ember-data\n */\n\n 'use strict';\n\n var badIdFormatAssertion = '`id` passed to `findRecord()` has to be non-empty string or number';\n\n exports.badIdFormatAssertion = badIdFormatAssertion;\n\n var Backburner = _ember['default']._Backburner;\n var Map = _ember['default'].Map;\n\n //Get the materialized model from the internalModel/promise that returns\n //an internal model and return it in a promiseObject. Useful for returning\n //from find methods\n function promiseRecord(internalModel, label) {\n var toReturn = internalModel.then(function (model) {\n return model.getRecord();\n });\n return (0, _emberDataPrivateSystemPromiseProxies.promiseObject)(toReturn, label);\n }\n\n var get = _ember['default'].get;\n var set = _ember['default'].set;\n var once = _ember['default'].run.once;\n var isNone = _ember['default'].isNone;\n var isPresent = _ember['default'].isPresent;\n var Promise = _ember['default'].RSVP.Promise;\n var copy = _ember['default'].copy;\n var Store;\n\n var Service = _ember['default'].Service;\n\n // Implementors Note:\n //\n // The variables in this file are consistently named according to the following\n // scheme:\n //\n // * +id+ means an identifier managed by an external source, provided inside\n // the data provided by that source. These are always coerced to be strings\n // before being used internally.\n // * +clientId+ means a transient numerical identifier generated at runtime by\n // the data store. It is important primarily because newly created objects may\n // not yet have an externally generated id.\n // * +internalModel+ means a record internalModel object, which holds metadata about a\n // record, even if it has not yet been fully materialized.\n // * +type+ means a DS.Model.\n\n /**\n The store contains all of the data for records loaded from the server.\n It is also responsible for creating instances of `DS.Model` that wrap\n the individual data for a record, so that they can be bound to in your\n Handlebars templates.\n \n Define your application's store like this:\n \n ```app/services/store.js\n import DS from 'ember-data';\n \n export default DS.Store.extend({\n });\n ```\n \n Most Ember.js applications will only have a single `DS.Store` that is\n automatically created by their `Ember.Application`.\n \n You can retrieve models from the store in several ways. To retrieve a record\n for a specific id, use `DS.Store`'s `findRecord()` method:\n \n ```javascript\n store.findRecord('person', 123).then(function (person) {\n });\n ```\n \n By default, the store will talk to your backend using a standard\n REST mechanism. You can customize how the store talks to your\n backend by specifying a custom adapter:\n \n ```app/adapters/application.js\n import DS from 'ember-data';\n \n export default DS.Adapter.extend({\n });\n ```\n \n You can learn more about writing a custom adapter by reading the `DS.Adapter`\n documentation.\n \n ### Store createRecord() vs. push() vs. pushPayload()\n \n The store provides multiple ways to create new record objects. They have\n some subtle differences in their use which are detailed below:\n \n [createRecord](#method_createRecord) is used for creating new\n records on the client side. This will return a new record in the\n `created.uncommitted` state. In order to persist this record to the\n backend you will need to call `record.save()`.\n \n [push](#method_push) is used to notify Ember Data's store of new or\n updated records that exist in the backend. This will return a record\n in the `loaded.saved` state. The primary use-case for `store#push` is\n to notify Ember Data about record updates (full or partial) that happen\n outside of the normal adapter methods (for example\n [SSE](http://dev.w3.org/html5/eventsource/) or [Web\n Sockets](http://www.w3.org/TR/2009/WD-websockets-20091222/)).\n \n [pushPayload](#method_pushPayload) is a convenience wrapper for\n `store#push` that will deserialize payloads if the\n Serializer implements a `pushPayload` method.\n \n Note: When creating a new record using any of the above methods\n Ember Data will update `DS.RecordArray`s such as those returned by\n `store#peekAll()`, `store#findAll()` or `store#filter()`. This means any\n data bindings or computed properties that depend on the RecordArray\n will automatically be synced to include the new or updated record\n values.\n \n @class Store\n @namespace DS\n @extends Ember.Service\n */\n exports.Store = Store = Service.extend({\n\n /**\n @method init\n @private\n */\n init: function init() {\n this._super.apply(this, arguments);\n this._backburner = new Backburner(['normalizeRelationships', 'syncRelationships', 'finished']);\n // internal bookkeeping; not observable\n this.typeMaps = {};\n this.recordArrayManager = _emberDataPrivateSystemRecordArrayManager['default'].create({\n store: this\n });\n this._pendingSave = [];\n this._instanceCache = new _emberDataPrivateSystemStoreContainerInstanceCache['default']((0, _emberDataPrivateUtils.getOwner)(this));\n //Used to keep track of all the find requests that need to be coalesced\n this._pendingFetch = Map.create();\n },\n\n /**\n The adapter to use to communicate to a backend server or other persistence layer.\n This can be specified as an instance, class, or string.\n If you want to specify `app/adapters/custom.js` as a string, do:\n ```js\n adapter: 'custom'\n ```\n @property adapter\n @default DS.JSONAPIAdapter\n @type {(DS.Adapter|String)}\n */\n adapter: '-json-api',\n\n /**\n Returns a JSON representation of the record using a custom\n type-specific serializer, if one exists.\n The available options are:\n * `includeId`: `true` if the record's ID should be included in\n the JSON representation\n @method serialize\n @private\n @param {DS.Model} record the record to serialize\n @param {Object} options an options hash\n */\n serialize: function serialize(record, options) {\n var snapshot = record._internalModel.createSnapshot();\n return snapshot.serialize(options);\n },\n\n /**\n This property returns the adapter, after resolving a possible\n string key.\n If the supplied `adapter` was a class, or a String property\n path resolved to a class, this property will instantiate the\n class.\n This property is cacheable, so the same instance of a specified\n adapter class should be used for the lifetime of the store.\n @property defaultAdapter\n @private\n @return DS.Adapter\n */\n defaultAdapter: _ember['default'].computed('adapter', function () {\n var adapter = get(this, 'adapter');\n\n (0, _emberDataPrivateDebug.assert)('You tried to set `adapter` property to an instance of `DS.Adapter`, where it should be a name', typeof adapter === 'string');\n\n adapter = this.retrieveManagedInstance('adapter', adapter);\n\n return adapter;\n }),\n\n // .....................\n // . CREATE NEW RECORD .\n // .....................\n\n /**\n Create a new record in the current store. The properties passed\n to this method are set on the newly created record.\n To create a new instance of a `Post`:\n ```js\n store.createRecord('post', {\n title: \"Rails is omakase\"\n });\n ```\n To create a new instance of a `Post` that has a relationship with a `User` record:\n ```js\n var user = this.store.peekRecord('user', 1);\n store.createRecord('post', {\n title: \"Rails is omakase\",\n user: user\n });\n ```\n @method createRecord\n @param {String} modelName\n @param {Object} inputProperties a hash of properties to set on the\n newly created record.\n @return {DS.Model} record\n */\n createRecord: function createRecord(modelName, inputProperties) {\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a model name to the store's createRecord method\", isPresent(modelName));\n (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n var typeClass = this.modelFor(modelName);\n var properties = copy(inputProperties) || new _emberDataPrivateSystemEmptyObject['default']();\n\n // If the passed properties do not include a primary key,\n // give the adapter an opportunity to generate one. Typically,\n // client-side ID generators will use something like uuid.js\n // to avoid conflicts.\n\n if (isNone(properties.id)) {\n properties.id = this._generateId(modelName, properties);\n }\n\n // Coerce ID to a string\n properties.id = (0, _emberDataPrivateSystemCoerceId['default'])(properties.id);\n\n var internalModel = this.buildInternalModel(typeClass, properties.id);\n var record = internalModel.getRecord();\n\n // Move the record out of its initial `empty` state into\n // the `loaded` state.\n internalModel.loadedData();\n\n // Set the properties specified on the record.\n record.setProperties(properties);\n\n internalModel.eachRelationship(function (key, descriptor) {\n internalModel._relationships.get(key).setHasData(true);\n });\n\n return record;\n },\n\n /**\n If possible, this method asks the adapter to generate an ID for\n a newly created record.\n @method _generateId\n @private\n @param {String} modelName\n @param {Object} properties from the new record\n @return {String} if the adapter can generate one, an ID\n */\n _generateId: function _generateId(modelName, properties) {\n var adapter = this.adapterFor(modelName);\n\n if (adapter && adapter.generateIdForRecord) {\n return adapter.generateIdForRecord(this, modelName, properties);\n }\n\n return null;\n },\n\n // .................\n // . DELETE RECORD .\n // .................\n\n /**\n For symmetry, a record can be deleted via the store.\n Example\n ```javascript\n var post = store.createRecord('post', {\n title: \"Rails is omakase\"\n });\n store.deleteRecord(post);\n ```\n @method deleteRecord\n @param {DS.Model} record\n */\n deleteRecord: function deleteRecord(record) {\n record.deleteRecord();\n },\n\n /**\n For symmetry, a record can be unloaded via the store. Only\n non-dirty records can be unloaded.\n Example\n ```javascript\n store.findRecord('post', 1).then(function(post) {\n store.unloadRecord(post);\n });\n ```\n @method unloadRecord\n @param {DS.Model} record\n */\n unloadRecord: function unloadRecord(record) {\n record.unloadRecord();\n },\n\n // ................\n // . FIND RECORDS .\n // ................\n\n /**\n @method find\n @param {String} modelName\n @param {String|Integer} id\n @param {Object} options\n @return {Promise} promise\n @private\n */\n find: function find(modelName, id, options) {\n // The default `model` hook in Ember.Route calls `find(modelName, id)`,\n // that's why we have to keep this method around even though `findRecord` is\n // the public way to get a record by modelName and id.\n\n if (arguments.length === 1) {\n (0, _emberDataPrivateDebug.assert)('Using store.find(type) has been removed. Use store.findAll(type) to retrieve all records for a given type.');\n }\n\n if (_ember['default'].typeOf(id) === 'object') {\n (0, _emberDataPrivateDebug.assert)('Calling store.find() with a query object is no longer supported. Use store.query() instead.');\n }\n\n if (options) {\n (0, _emberDataPrivateDebug.assert)('Calling store.find(type, id, { preload: preload }) is no longer supported. Use store.findRecord(type, id, { preload: preload }) instead.');\n }\n\n (0, _emberDataPrivateDebug.assert)(\"You need to pass the model name and id to the store's find method\", arguments.length === 2);\n (0, _emberDataPrivateDebug.assert)(\"You cannot pass `\" + _ember['default'].inspect(id) + \"` as id to the store's find method\", _ember['default'].typeOf(id) === 'string' || _ember['default'].typeOf(id) === 'number');\n (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n\n return this.findRecord(modelName, id);\n },\n\n /**\n This method returns a record for a given type and id combination.\n The `findRecord` method will always resolve its promise with the same\n object for a given type and `id`.\n The `findRecord` method will always return a **promise** that will be\n resolved with the record.\n Example\n ```app/routes/post.js\n import Ember from 'ember';\n export default Ember.Route.extend({\n model: function(params) {\n return this.store.findRecord('post', params.post_id);\n }\n });\n ```\n If the record is not yet available, the store will ask the adapter's `find`\n method to find the necessary data. If the record is already present in the\n store, it depends on the reload behavior _when_ the returned promise\n resolves.\n ### Reloading\n The reload behavior is configured either via the passed `options` hash or\n the result of the adapter's `shouldReloadRecord`.\n If `{ reload: true }` is passed or `adapter.shouldReloadRecord` evaluates\n to `true`, then the returned promise resolves once the adapter returns\n data, regardless if the requested record is already in the store:\n ```js\n store.push({\n data: {\n id: 1,\n type: 'post',\n revision: 1\n }\n });\n // adapter#findRecord resolves with\n // [\n // {\n // id: 1,\n // type: 'post',\n // revision: 2\n // }\n // ]\n store.findRecord('post', 1, { reload: true }).then(function(post) {\n post.get(\"revision\"); // 2\n });\n ```\n If no reload is indicated via the abovementioned ways, then the promise\n immediately resolves with the cached version in the store.\n ### Background Reloading\n Optionally, if `adapter.shouldBackgroundReloadRecord` evaluates to `true`,\n then a background reload is started, which updates the records' data, once\n it is available:\n ```js\n // app/adapters/post.js\n import ApplicationAdapter from \"./application\";\n export default ApplicationAdapter.extend({\n shouldReloadRecord(store, snapshot) {\n return false;\n },\n shouldBackgroundReloadRecord(store, snapshot) {\n return true;\n }\n });\n // ...\n store.push({\n data: {\n id: 1,\n type: 'post',\n revision: 1\n }\n });\n var blogPost = store.findRecord('post', 1).then(function(post) {\n post.get('revision'); // 1\n });\n // later, once adapter#findRecord resolved with\n // [\n // {\n // id: 1,\n // type: 'post',\n // revision: 2\n // }\n // ]\n blogPost.get('revision'); // 2\n ```\n If you would like to force or prevent background reloading, you can set a\n boolean value for `backgroundReload` in the options object for\n `findRecord`.\n ```app/routes/post/edit.js\n import Ember from 'ember';\n export default Ember.Route.extend({\n model: function(params) {\n return this.store.findRecord('post', params.post_id, { backgroundReload: false });\n }\n });\n ```\n If you pass an object on the `adapterOptions` property of the options\n argument it will be passed to you adapter via the snapshot\n ```app/routes/post/edit.js\n import Ember from 'ember';\n export default Ember.Route.extend({\n model: function(params) {\n return this.store.findRecord('post', params.post_id, {\n adapterOptions: { subscribe: false }\n });\n }\n });\n ```\n ```app/adapters/post.js\n import MyCustomAdapter from './custom-adapter';\n export default MyCustomAdapter.extend({\n findRecord: function(store, type, id, snapshot) {\n if (snapshot.adapterOptions.subscribe) {\n // ...\n }\n // ...\n }\n });\n ```\n See [peekRecord](#method_peekRecord) to get the cached version of a record.\n @since 1.13.0\n @method findRecord\n @param {String} modelName\n @param {(String|Integer)} id\n @param {Object} options\n @return {Promise} promise\n */\n findRecord: function findRecord(modelName, id, options) {\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a model name to the store's findRecord method\", isPresent(modelName));\n (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n (0, _emberDataPrivateDebug.assert)(badIdFormatAssertion, typeof id === 'string' && id.length > 0 || typeof id === 'number' && !isNaN(id));\n\n var internalModel = this._internalModelForId(modelName, id);\n options = options || {};\n\n if (!this.hasRecordForId(modelName, id)) {\n return this._findByInternalModel(internalModel, options);\n }\n\n var fetchedInternalModel = this._findRecord(internalModel, options);\n\n return promiseRecord(fetchedInternalModel, \"DS: Store#findRecord \" + internalModel.typeKey + \" with id: \" + get(internalModel, 'id'));\n },\n\n _findRecord: function _findRecord(internalModel, options) {\n // Refetch if the reload option is passed\n if (options.reload) {\n return this.scheduleFetch(internalModel, options);\n }\n\n var snapshot = internalModel.createSnapshot(options);\n var typeClass = internalModel.type;\n var adapter = this.adapterFor(typeClass.modelName);\n\n // Refetch the record if the adapter thinks the record is stale\n if (adapter.shouldReloadRecord(this, snapshot)) {\n return this.scheduleFetch(internalModel, options);\n }\n\n if (options.backgroundReload === false) {\n return Promise.resolve(internalModel);\n }\n\n // Trigger the background refetch if backgroundReload option is passed\n if (options.backgroundReload || adapter.shouldBackgroundReloadRecord(this, snapshot)) {\n this.scheduleFetch(internalModel, options);\n }\n\n // Return the cached record\n return Promise.resolve(internalModel);\n },\n\n _findByInternalModel: function _findByInternalModel(internalModel, options) {\n options = options || {};\n\n if (options.preload) {\n internalModel._preloadData(options.preload);\n }\n\n var fetchedInternalModel = this._findEmptyInternalModel(internalModel, options);\n\n return promiseRecord(fetchedInternalModel, \"DS: Store#findRecord \" + internalModel.typeKey + \" with id: \" + get(internalModel, 'id'));\n },\n\n _findEmptyInternalModel: function _findEmptyInternalModel(internalModel, options) {\n if (internalModel.isEmpty()) {\n return this.scheduleFetch(internalModel, options);\n }\n\n //TODO double check about reloading\n if (internalModel.isLoading()) {\n return internalModel._loadingPromise;\n }\n\n return Promise.resolve(internalModel);\n },\n\n /**\n This method makes a series of requests to the adapter's `find` method\n and returns a promise that resolves once they are all loaded.\n @private\n @method findByIds\n @param {String} modelName\n @param {Array} ids\n @return {Promise} promise\n */\n findByIds: function findByIds(modelName, ids) {\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a model name to the store's findByIds method\", isPresent(modelName));\n (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n var promises = new Array(ids.length);\n\n for (var i = 0; i < ids.length; i++) {\n promises[i] = this.findRecord(modelName, ids[i]);\n }\n\n return (0, _emberDataPrivateSystemPromiseProxies.promiseArray)(_ember['default'].RSVP.all(promises).then(_ember['default'].A, null, \"DS: Store#findByIds of \" + modelName + \" complete\"));\n },\n\n /**\n This method is called by `findRecord` if it discovers that a particular\n type/id pair hasn't been loaded yet to kick off a request to the\n adapter.\n @method fetchRecord\n @private\n @param {InternalModel} internalModel model\n @return {Promise} promise\n */\n // TODO rename this to have an underscore\n fetchRecord: function fetchRecord(internalModel, options) {\n var typeClass = internalModel.type;\n var id = internalModel.id;\n var adapter = this.adapterFor(typeClass.modelName);\n\n (0, _emberDataPrivateDebug.assert)(\"You tried to find a record but you have no adapter (for \" + typeClass + \")\", adapter);\n (0, _emberDataPrivateDebug.assert)(\"You tried to find a record but your adapter (for \" + typeClass + \") does not implement 'findRecord'\", typeof adapter.findRecord === 'function' || typeof adapter.find === 'function');\n\n var promise = (0, _emberDataPrivateSystemStoreFinders._find)(adapter, this, typeClass, id, internalModel, options);\n return promise;\n },\n\n scheduleFetchMany: function scheduleFetchMany(records) {\n var internalModels = new Array(records.length);\n var fetches = new Array(records.length);\n for (var i = 0; i < records.length; i++) {\n internalModels[i] = records[i]._internalModel;\n }\n\n for (var i = 0; i < internalModels.length; i++) {\n fetches[i] = this.scheduleFetch(internalModels[i]);\n }\n\n return _ember['default'].RSVP.Promise.all(fetches);\n },\n\n scheduleFetch: function scheduleFetch(internalModel, options) {\n var typeClass = internalModel.type;\n\n if (internalModel._loadingPromise) {\n return internalModel._loadingPromise;\n }\n\n var resolver = _ember['default'].RSVP.defer('Fetching ' + typeClass + 'with id: ' + internalModel.id);\n var pendingFetchItem = {\n record: internalModel,\n resolver: resolver,\n options: options\n };\n var promise = resolver.promise;\n\n internalModel.loadingData(promise);\n\n if (!this._pendingFetch.get(typeClass)) {\n this._pendingFetch.set(typeClass, [pendingFetchItem]);\n } else {\n this._pendingFetch.get(typeClass).push(pendingFetchItem);\n }\n _ember['default'].run.scheduleOnce('afterRender', this, this.flushAllPendingFetches);\n\n return promise;\n },\n\n flushAllPendingFetches: function flushAllPendingFetches() {\n if (this.isDestroyed || this.isDestroying) {\n return;\n }\n\n this._pendingFetch.forEach(this._flushPendingFetchForType, this);\n this._pendingFetch = Map.create();\n },\n\n _flushPendingFetchForType: function _flushPendingFetchForType(pendingFetchItems, typeClass) {\n var store = this;\n var adapter = store.adapterFor(typeClass.modelName);\n var shouldCoalesce = !!adapter.findMany && adapter.coalesceFindRequests;\n var records = _ember['default'].A(pendingFetchItems).mapBy('record');\n\n function _fetchRecord(recordResolverPair) {\n recordResolverPair.resolver.resolve(store.fetchRecord(recordResolverPair.record, recordResolverPair.options)); // TODO adapter options\n }\n\n function resolveFoundRecords(records) {\n records.forEach(function (record) {\n var pair = _ember['default'].A(pendingFetchItems).findBy('record', record);\n if (pair) {\n var resolver = pair.resolver;\n resolver.resolve(record);\n }\n });\n return records;\n }\n\n function makeMissingRecordsRejector(requestedRecords) {\n return function rejectMissingRecords(resolvedRecords) {\n resolvedRecords = _ember['default'].A(resolvedRecords);\n var missingRecords = requestedRecords.reject(function (record) {\n return resolvedRecords.includes(record);\n });\n if (missingRecords.length) {\n (0, _emberDataPrivateDebug.warn)('Ember Data expected to find records with the following ids in the adapter response but they were missing: ' + _ember['default'].inspect(_ember['default'].A(missingRecords).mapBy('id')), false, {\n id: 'ds.store.missing-records-from-adapter'\n });\n }\n rejectRecords(missingRecords);\n };\n }\n\n function makeRecordsRejector(records) {\n return function (error) {\n rejectRecords(records, error);\n };\n }\n\n function rejectRecords(records, error) {\n records.forEach(function (record) {\n var pair = _ember['default'].A(pendingFetchItems).findBy('record', record);\n if (pair) {\n var resolver = pair.resolver;\n resolver.reject(error);\n }\n });\n }\n\n if (pendingFetchItems.length === 1) {\n _fetchRecord(pendingFetchItems[0]);\n } else if (shouldCoalesce) {\n\n // TODO: Improve records => snapshots => records => snapshots\n //\n // We want to provide records to all store methods and snapshots to all\n // adapter methods. To make sure we're doing that we're providing an array\n // of snapshots to adapter.groupRecordsForFindMany(), which in turn will\n // return grouped snapshots instead of grouped records.\n //\n // But since the _findMany() finder is a store method we need to get the\n // records from the grouped snapshots even though the _findMany() finder\n // will once again convert the records to snapshots for adapter.findMany()\n\n var snapshots = _ember['default'].A(records).invoke('createSnapshot');\n var groups = adapter.groupRecordsForFindMany(this, snapshots);\n groups.forEach(function (groupOfSnapshots) {\n var groupOfRecords = _ember['default'].A(groupOfSnapshots).mapBy('_internalModel');\n var requestedRecords = _ember['default'].A(groupOfRecords);\n var ids = requestedRecords.mapBy('id');\n if (ids.length > 1) {\n (0, _emberDataPrivateSystemStoreFinders._findMany)(adapter, store, typeClass, ids, requestedRecords).then(resolveFoundRecords).then(makeMissingRecordsRejector(requestedRecords)).then(null, makeRecordsRejector(requestedRecords));\n } else if (ids.length === 1) {\n var pair = _ember['default'].A(pendingFetchItems).findBy('record', groupOfRecords[0]);\n _fetchRecord(pair);\n } else {\n (0, _emberDataPrivateDebug.assert)(\"You cannot return an empty array from adapter's method groupRecordsForFindMany\", false);\n }\n });\n } else {\n pendingFetchItems.forEach(_fetchRecord);\n }\n },\n\n /**\n Get the reference for the specified record.\n Example\n ```javascript\n var userRef = store.getReference('user', 1);\n // check if the user is loaded\n var isLoaded = userRef.value() !== null;\n // get the record of the reference (null if not yet available)\n var user = userRef.value();\n // get the identifier of the reference\n if (userRef.remoteType() === \"id\") {\n var id = userRef.id();\n }\n // load user (via store.find)\n userRef.load().then(...)\n // or trigger a reload\n userRef.reload().then(...)\n // provide data for reference\n userRef.push({ id: 1, username: \"@user\" }).then(function(user) {\n userRef.value() === user;\n });\n ```\n @method getReference\n @param {String} type\n @param {String|Integer} id\n @since 2.5.0\n @return {RecordReference}\n */\n getReference: function getReference(type, id) {\n return this._internalModelForId(type, id).recordReference;\n },\n\n /**\n Get a record by a given type and ID without triggering a fetch.\n This method will synchronously return the record if it is available in the store,\n otherwise it will return `null`. A record is available if it has been fetched earlier, or\n pushed manually into the store.\n _Note: This is an synchronous method and does not return a promise._\n ```js\n var post = store.peekRecord('post', 1);\n post.get('id'); // 1\n ```\n @since 1.13.0\n @method peekRecord\n @param {String} modelName\n @param {String|Integer} id\n @return {DS.Model|null} record\n */\n peekRecord: function peekRecord(modelName, id) {\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a model name to the store's peekRecord method\", isPresent(modelName));\n (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n if (this.hasRecordForId(modelName, id)) {\n return this._internalModelForId(modelName, id).getRecord();\n } else {\n return null;\n }\n },\n\n /**\n This method is called by the record's `reload` method.\n This method calls the adapter's `find` method, which returns a promise. When\n **that** promise resolves, `reloadRecord` will resolve the promise returned\n by the record's `reload`.\n @method reloadRecord\n @private\n @param {DS.Model} internalModel\n @return {Promise} promise\n */\n reloadRecord: function reloadRecord(internalModel) {\n var modelName = internalModel.type.modelName;\n var adapter = this.adapterFor(modelName);\n var id = internalModel.id;\n\n (0, _emberDataPrivateDebug.assert)(\"You cannot reload a record without an ID\", id);\n (0, _emberDataPrivateDebug.assert)(\"You tried to reload a record but you have no adapter (for \" + modelName + \")\", adapter);\n (0, _emberDataPrivateDebug.assert)(\"You tried to reload a record but your adapter does not implement `findRecord`\", typeof adapter.findRecord === 'function' || typeof adapter.find === 'function');\n\n return this.scheduleFetch(internalModel);\n },\n\n /**\n Returns true if a record for a given type and ID is already loaded.\n @method hasRecordForId\n @param {(String|DS.Model)} modelName\n @param {(String|Integer)} inputId\n @return {Boolean}\n */\n hasRecordForId: function hasRecordForId(modelName, inputId) {\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a model name to the store's hasRecordForId method\", isPresent(modelName));\n (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n var typeClass = this.modelFor(modelName);\n var id = (0, _emberDataPrivateSystemCoerceId['default'])(inputId);\n var internalModel = this.typeMapFor(typeClass).idToRecord[id];\n return !!internalModel && internalModel.isLoaded();\n },\n\n /**\n Returns id record for a given type and ID. If one isn't already loaded,\n it builds a new record and leaves it in the `empty` state.\n @method recordForId\n @private\n @param {String} modelName\n @param {(String|Integer)} id\n @return {DS.Model} record\n */\n recordForId: function recordForId(modelName, id) {\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a model name to the store's recordForId method\", isPresent(modelName));\n (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n return this._internalModelForId(modelName, id).getRecord();\n },\n\n _internalModelForId: function _internalModelForId(typeName, inputId) {\n var typeClass = this.modelFor(typeName);\n var id = (0, _emberDataPrivateSystemCoerceId['default'])(inputId);\n var idToRecord = this.typeMapFor(typeClass).idToRecord;\n var record = idToRecord[id];\n\n if (!record || !idToRecord[id]) {\n record = this.buildInternalModel(typeClass, id);\n }\n\n return record;\n },\n\n /**\n @method findMany\n @private\n @param {Array} internalModels\n @return {Promise} promise\n */\n findMany: function findMany(internalModels) {\n var finds = new Array(internalModels.length);\n\n for (var i = 0; i < internalModels.length; i++) {\n finds[i] = this._findByInternalModel(internalModels[i]);\n }\n\n return Promise.all(finds);\n },\n\n /**\n If a relationship was originally populated by the adapter as a link\n (as opposed to a list of IDs), this method is called when the\n relationship is fetched.\n The link (which is usually a URL) is passed through unchanged, so the\n adapter can make whatever request it wants.\n The usual use-case is for the server to register a URL as a link, and\n then use that URL in the future to make a request for the relationship.\n @method findHasMany\n @private\n @param {DS.Model} owner\n @param {any} link\n @param {(Relationship)} relationship\n @return {Promise} promise\n */\n findHasMany: function findHasMany(owner, link, relationship) {\n var adapter = this.adapterFor(owner.type.modelName);\n\n (0, _emberDataPrivateDebug.assert)(\"You tried to load a hasMany relationship but you have no adapter (for \" + owner.type + \")\", adapter);\n (0, _emberDataPrivateDebug.assert)(\"You tried to load a hasMany relationship from a specified `link` in the original payload but your adapter does not implement `findHasMany`\", typeof adapter.findHasMany === 'function');\n\n return (0, _emberDataPrivateSystemStoreFinders._findHasMany)(adapter, this, owner, link, relationship);\n },\n\n /**\n @method findBelongsTo\n @private\n @param {DS.Model} owner\n @param {any} link\n @param {Relationship} relationship\n @return {Promise} promise\n */\n findBelongsTo: function findBelongsTo(owner, link, relationship) {\n var adapter = this.adapterFor(owner.type.modelName);\n\n (0, _emberDataPrivateDebug.assert)(\"You tried to load a belongsTo relationship but you have no adapter (for \" + owner.type + \")\", adapter);\n (0, _emberDataPrivateDebug.assert)(\"You tried to load a belongsTo relationship from a specified `link` in the original payload but your adapter does not implement `findBelongsTo`\", typeof adapter.findBelongsTo === 'function');\n\n return (0, _emberDataPrivateSystemStoreFinders._findBelongsTo)(adapter, this, owner, link, relationship);\n },\n\n /**\n This method delegates a query to the adapter. This is the one place where\n adapter-level semantics are exposed to the application.\n Exposing queries this way seems preferable to creating an abstract query\n language for all server-side queries, and then require all adapters to\n implement them.\n ---\n If you do something like this:\n ```javascript\n store.query('person', { page: 1 });\n ```\n The call made to the server, using a Rails backend, will look something like this:\n ```\n Started GET \"/api/v1/person?page=1\"\n Processing by Api::V1::PersonsController#index as HTML\n Parameters: { \"page\"=>\"1\" }\n ```\n ---\n If you do something like this:\n ```javascript\n store.query('person', { ids: [1, 2, 3] });\n ```\n The call to the server, using a Rails backend, will look something like this:\n ```\n Started GET \"/api/v1/person?ids%5B%5D=1&ids%5B%5D=2&ids%5B%5D=3\"\n Processing by Api::V1::PersonsController#index as HTML\n Parameters: { \"ids\" => [\"1\", \"2\", \"3\"] }\n ```\n This method returns a promise, which is resolved with a `RecordArray`\n once the server returns.\n @since 1.13.0\n @method query\n @param {String} modelName\n @param {any} query an opaque query to be used by the adapter\n @return {Promise} promise\n */\n query: function query(modelName, _query2) {\n return this._query(modelName, _query2);\n },\n\n _query: function _query(modelName, query, array) {\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a model name to the store's query method\", isPresent(modelName));\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a query hash to the store's query method\", query);\n (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n var typeClass = this.modelFor(modelName);\n array = array || this.recordArrayManager.createAdapterPopulatedRecordArray(typeClass, query);\n\n var adapter = this.adapterFor(modelName);\n\n (0, _emberDataPrivateDebug.assert)(\"You tried to load a query but you have no adapter (for \" + typeClass + \")\", adapter);\n (0, _emberDataPrivateDebug.assert)(\"You tried to load a query but your adapter does not implement `query`\", typeof adapter.query === 'function');\n\n return (0, _emberDataPrivateSystemPromiseProxies.promiseArray)((0, _emberDataPrivateSystemStoreFinders._query)(adapter, this, typeClass, query, array));\n },\n\n /**\n This method makes a request for one record, where the `id` is not known\n beforehand (if the `id` is known, use `findRecord` instead).\n This method can be used when it is certain that the server will return a\n single object for the primary data.\n Let's assume our API provides an endpoint for the currently logged in user\n via:\n ```\n // GET /api/current_user\n {\n user: {\n id: 1234,\n username: 'admin'\n }\n }\n ```\n Since the specific `id` of the `user` is not known beforehand, we can use\n `queryRecord` to get the user:\n ```javascript\n store.queryRecord('user', {}).then(function(user) {\n let username = user.get('username');\n console.log(`Currently logged in as ${username}`);\n });\n ```\n The request is made through the adapters' `queryRecord`:\n ```javascript\n // app/adapters/user.js\n import DS from \"ember-data\";\n export default DS.Adapter.extend({\n queryRecord(modelName, query) {\n return Ember.$.getJSON(\"/api/current_user\");\n }\n });\n ```\n Note: the primary use case for `store.queryRecord` is when a single record\n is queried and the `id` is not known beforehand. In all other cases\n `store.query` and using the first item of the array is likely the preferred\n way:\n ```\n // GET /users?username=unique\n {\n data: [{\n id: 1234,\n type: 'user',\n attributes: {\n username: \"unique\"\n }\n }]\n }\n ```\n ```javascript\n store.query('user', { username: 'unique' }).then(function(users) {\n return users.get('firstObject');\n }).then(function(user) {\n let id = user.get('id');\n });\n ```\n This method returns a promise, which resolves with the found record.\n If the adapter returns no data for the primary data of the payload, then\n `queryRecord` resolves with `null`:\n ```\n // GET /users?username=unique\n {\n data: null\n }\n ```\n ```javascript\n store.queryRecord('user', { username: 'unique' }).then(function(user) {\n console.log(user); // null\n });\n ```\n @since 1.13.0\n @method queryRecord\n @param {String} modelName\n @param {any} query an opaque query to be used by the adapter\n @return {Promise} promise which resolves with the found record or `null`\n */\n queryRecord: function queryRecord(modelName, query) {\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a model name to the store's queryRecord method\", isPresent(modelName));\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a query hash to the store's queryRecord method\", query);\n (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n\n var typeClass = this.modelFor(modelName);\n var adapter = this.adapterFor(modelName);\n\n (0, _emberDataPrivateDebug.assert)(\"You tried to make a query but you have no adapter (for \" + typeClass + \")\", adapter);\n (0, _emberDataPrivateDebug.assert)(\"You tried to make a query but your adapter does not implement `queryRecord`\", typeof adapter.queryRecord === 'function');\n\n return (0, _emberDataPrivateSystemPromiseProxies.promiseObject)((0, _emberDataPrivateSystemStoreFinders._queryRecord)(adapter, this, typeClass, query));\n },\n\n /**\n `findAll` asks the adapter's `findAll` method to find the records for the\n given type, and returns a promise which will resolve with all records of\n this type present in the store, even if the adapter only returns a subset\n of them.\n ```app/routes/authors.js\n import Ember from 'ember';\n export default Ember.Route.extend({\n model: function(params) {\n return this.store.findAll('author');\n }\n });\n ```\n _When_ the returned promise resolves depends on the reload behavior,\n configured via the passed `options` hash and the result of the adapter's\n `shouldReloadAll` method.\n ### Reloading\n If `{ reload: true }` is passed or `adapter.shouldReloadAll` evaluates to\n `true`, then the returned promise resolves once the adapter returns data,\n regardless if there are already records in the store:\n ```js\n store.push({\n data: {\n id: 'first',\n type: 'author'\n }\n });\n // adapter#findAll resolves with\n // [\n // {\n // id: 'second',\n // type: 'author'\n // }\n // ]\n store.findAll('author', { reload: true }).then(function(authors) {\n authors.getEach(\"id\"); // ['first', 'second']\n });\n ```\n If no reload is indicated via the abovementioned ways, then the promise\n immediately resolves with all the records currently loaded in the store.\n ### Background Reloading\n Optionally, if `adapter.shouldBackgroundReloadAll` evaluates to `true`,\n then a background reload is started. Once this resolves, the array with\n which the promise resolves, is updated automatically so it contains all the\n records in the store:\n ```js\n // app/adapters/application.js\n export default DS.Adapter.extend({\n shouldReloadAll(store, snapshotsArray) {\n return false;\n },\n shouldBackgroundReloadAll(store, snapshotsArray) {\n return true;\n }\n });\n // ...\n store.push({\n data: {\n id: 'first',\n type: 'author'\n }\n });\n var allAuthors;\n store.findAll('author').then(function(authors) {\n authors.getEach('id'); // ['first']\n allAuthors = authors;\n });\n // later, once adapter#findAll resolved with\n // [\n // {\n // id: 'second',\n // type: 'author'\n // }\n // ]\n allAuthors.getEach('id'); // ['first', 'second']\n ```\n If you would like to force or prevent background reloading, you can set a\n boolean value for `backgroundReload` in the options object for\n `findAll`.\n ```app/routes/post/edit.js\n import Ember from 'ember';\n export default Ember.Route.extend({\n model: function() {\n return this.store.findAll('post', { backgroundReload: false });\n }\n });\n ```\n If you pass an object on the `adapterOptions` property of the options\n argument it will be passed to you adapter via the `snapshotRecordArray`\n ```app/routes/posts.js\n import Ember from 'ember';\n export default Ember.Route.extend({\n model: function(params) {\n return this.store.findAll('post', {\n adapterOptions: { subscribe: false }\n });\n }\n });\n ```\n ```app/adapters/post.js\n import MyCustomAdapter from './custom-adapter';\n export default MyCustomAdapter.extend({\n findAll: function(store, type, sinceToken, snapshotRecordArray) {\n if (snapshotRecordArray.adapterOptions.subscribe) {\n // ...\n }\n // ...\n }\n });\n ```\n See [peekAll](#method_peekAll) to get an array of current records in the\n store, without waiting until a reload is finished.\n See [query](#method_query) to only get a subset of records from the server.\n @since 1.13.0\n @method findAll\n @param {String} modelName\n @param {Object} options\n @return {Promise} promise\n */\n findAll: function findAll(modelName, options) {\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a model name to the store's findAll method\", isPresent(modelName));\n (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n var typeClass = this.modelFor(modelName);\n\n return this._fetchAll(typeClass, this.peekAll(modelName), options);\n },\n\n /**\n @method _fetchAll\n @private\n @param {DS.Model} typeClass\n @param {DS.RecordArray} array\n @return {Promise} promise\n */\n _fetchAll: function _fetchAll(typeClass, array, options) {\n options = options || {};\n var adapter = this.adapterFor(typeClass.modelName);\n var sinceToken = this.typeMapFor(typeClass).metadata.since;\n\n (0, _emberDataPrivateDebug.assert)(\"You tried to load all records but you have no adapter (for \" + typeClass + \")\", adapter);\n (0, _emberDataPrivateDebug.assert)(\"You tried to load all records but your adapter does not implement `findAll`\", typeof adapter.findAll === 'function');\n\n set(array, 'isUpdating', true);\n\n if (options.reload) {\n return (0, _emberDataPrivateSystemPromiseProxies.promiseArray)((0, _emberDataPrivateSystemStoreFinders._findAll)(adapter, this, typeClass, sinceToken, options));\n }\n\n var snapshotArray = array.createSnapshot(options);\n\n if (adapter.shouldReloadAll(this, snapshotArray)) {\n return (0, _emberDataPrivateSystemPromiseProxies.promiseArray)((0, _emberDataPrivateSystemStoreFinders._findAll)(adapter, this, typeClass, sinceToken, options));\n }\n\n if (options.backgroundReload === false) {\n return (0, _emberDataPrivateSystemPromiseProxies.promiseArray)(Promise.resolve(array));\n }\n\n if (options.backgroundReload || adapter.shouldBackgroundReloadAll(this, snapshotArray)) {\n (0, _emberDataPrivateSystemStoreFinders._findAll)(adapter, this, typeClass, sinceToken, options);\n }\n\n return (0, _emberDataPrivateSystemPromiseProxies.promiseArray)(Promise.resolve(array));\n },\n\n /**\n @method didUpdateAll\n @param {DS.Model} typeClass\n @private\n */\n didUpdateAll: function didUpdateAll(typeClass) {\n var liveRecordArray = this.recordArrayManager.liveRecordArrayFor(typeClass);\n set(liveRecordArray, 'isUpdating', false);\n },\n\n /**\n This method returns a filtered array that contains all of the\n known records for a given type in the store.\n Note that because it's just a filter, the result will contain any\n locally created records of the type, however, it will not make a\n request to the backend to retrieve additional records. If you\n would like to request all the records from the backend please use\n [store.findAll](#method_findAll).\n Also note that multiple calls to `peekAll` for a given type will always\n return the same `RecordArray`.\n Example\n ```javascript\n var localPosts = store.peekAll('post');\n ```\n @since 1.13.0\n @method peekAll\n @param {String} modelName\n @return {DS.RecordArray}\n */\n peekAll: function peekAll(modelName) {\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a model name to the store's peekAll method\", isPresent(modelName));\n (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n var typeClass = this.modelFor(modelName);\n\n var liveRecordArray = this.recordArrayManager.liveRecordArrayFor(typeClass);\n this.recordArrayManager.populateLiveRecordArray(liveRecordArray, typeClass);\n\n return liveRecordArray;\n },\n\n /**\n This method unloads all records in the store.\n Optionally you can pass a type which unload all records for a given type.\n ```javascript\n store.unloadAll();\n store.unloadAll('post');\n ```\n @method unloadAll\n @param {String=} modelName\n */\n unloadAll: function unloadAll(modelName) {\n (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), !modelName || typeof modelName === 'string');\n if (arguments.length === 0) {\n var typeMaps = this.typeMaps;\n var keys = Object.keys(typeMaps);\n var types = new Array(keys.length);\n\n for (var i = 0; i < keys.length; i++) {\n types[i] = typeMaps[keys[i]]['type'].modelName;\n }\n\n types.forEach(this.unloadAll, this);\n } else {\n var typeClass = this.modelFor(modelName);\n var typeMap = this.typeMapFor(typeClass);\n var records = typeMap.records.slice();\n var record = undefined;\n\n for (var i = 0; i < records.length; i++) {\n record = records[i];\n record.unloadRecord();\n record.destroy(); // maybe within unloadRecord\n }\n\n typeMap.metadata = new _emberDataPrivateSystemEmptyObject['default']();\n }\n },\n\n /**\n Takes a type and filter function, and returns a live RecordArray that\n remains up to date as new records are loaded into the store or created\n locally.\n The filter function takes a materialized record, and returns true\n if the record should be included in the filter and false if it should\n not.\n Example\n ```javascript\n store.filter('post', function(post) {\n return post.get('unread');\n });\n ```\n The filter function is called once on all records for the type when\n it is created, and then once on each newly loaded or created record.\n If any of a record's properties change, or if it changes state, the\n filter function will be invoked again to determine whether it should\n still be in the array.\n Optionally you can pass a query, which is the equivalent of calling\n [query](#method_query) with that same query, to fetch additional records\n from the server. The results returned by the server could then appear\n in the filter if they match the filter function.\n The query itself is not used to filter records, it's only sent to your\n server for you to be able to do server-side filtering. The filter\n function will be applied on the returned results regardless.\n Example\n ```javascript\n store.filter('post', { unread: true }, function(post) {\n return post.get('unread');\n }).then(function(unreadPosts) {\n unreadPosts.get('length'); // 5\n var unreadPost = unreadPosts.objectAt(0);\n unreadPost.set('unread', false);\n unreadPosts.get('length'); // 4\n });\n ```\n @method filter\n @private\n @param {String} modelName\n @param {Object} query optional query\n @param {Function} filter\n @return {DS.PromiseArray}\n @deprecated\n */\n filter: function filter(modelName, query, _filter) {\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a model name to the store's filter method\", isPresent(modelName));\n (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n\n if (!_ember['default'].ENV.ENABLE_DS_FILTER) {\n (0, _emberDataPrivateDebug.assert)('The filter API has been moved to a plugin. To enable store.filter using an environment flag, or to use an alternative, you can visit the ember-data-filter addon page. https://github.com/ember-data/ember-data-filter', false);\n }\n\n var promise;\n var length = arguments.length;\n var array;\n var hasQuery = length === 3;\n\n // allow an optional server query\n if (hasQuery) {\n promise = this.query(modelName, query);\n } else if (arguments.length === 2) {\n _filter = query;\n }\n\n modelName = this.modelFor(modelName);\n\n if (hasQuery) {\n array = this.recordArrayManager.createFilteredRecordArray(modelName, _filter, query);\n } else {\n array = this.recordArrayManager.createFilteredRecordArray(modelName, _filter);\n }\n\n promise = promise || Promise.resolve(array);\n\n return (0, _emberDataPrivateSystemPromiseProxies.promiseArray)(promise.then(function () {\n return array;\n }, null, 'DS: Store#filter of ' + modelName));\n },\n\n /**\n This method returns if a certain record is already loaded\n in the store. Use this function to know beforehand if a findRecord()\n will result in a request or that it will be a cache hit.\n Example\n ```javascript\n store.recordIsLoaded('post', 1); // false\n store.findRecord('post', 1).then(function() {\n store.recordIsLoaded('post', 1); // true\n });\n ```\n @method recordIsLoaded\n @param {String} modelName\n @param {string} id\n @return {boolean}\n */\n recordIsLoaded: function recordIsLoaded(modelName, id) {\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a model name to the store's recordIsLoaded method\", isPresent(modelName));\n (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n return this.hasRecordForId(modelName, id);\n },\n\n // ............\n // . UPDATING .\n // ............\n\n /**\n If the adapter updates attributes the record will notify\n the store to update its membership in any filters.\n To avoid thrashing, this method is invoked only once per\n run loop per record.\n @method dataWasUpdated\n @private\n @param {Class} type\n @param {InternalModel} internalModel\n */\n dataWasUpdated: function dataWasUpdated(type, internalModel) {\n this.recordArrayManager.recordDidChange(internalModel);\n },\n\n // ..............\n // . PERSISTING .\n // ..............\n\n /**\n This method is called by `record.save`, and gets passed a\n resolver for the promise that `record.save` returns.\n It schedules saving to happen at the end of the run loop.\n @method scheduleSave\n @private\n @param {InternalModel} internalModel\n @param {Resolver} resolver\n @param {Object} options\n */\n scheduleSave: function scheduleSave(internalModel, resolver, options) {\n var snapshot = internalModel.createSnapshot(options);\n internalModel.flushChangedAttributes();\n internalModel.adapterWillCommit();\n this._pendingSave.push({\n snapshot: snapshot,\n resolver: resolver\n });\n once(this, 'flushPendingSave');\n },\n\n /**\n This method is called at the end of the run loop, and\n flushes any records passed into `scheduleSave`\n @method flushPendingSave\n @private\n */\n flushPendingSave: function flushPendingSave() {\n var _this = this;\n\n var pending = this._pendingSave.slice();\n this._pendingSave = [];\n\n pending.forEach(function (pendingItem) {\n var snapshot = pendingItem.snapshot;\n var resolver = pendingItem.resolver;\n var record = snapshot._internalModel;\n var adapter = _this.adapterFor(record.type.modelName);\n var operation;\n\n if (get(record, 'currentState.stateName') === 'root.deleted.saved') {\n return resolver.resolve();\n } else if (record.isNew()) {\n operation = 'createRecord';\n } else if (record.isDeleted()) {\n operation = 'deleteRecord';\n } else {\n operation = 'updateRecord';\n }\n\n resolver.resolve(_commit(adapter, _this, operation, snapshot));\n });\n },\n\n /**\n This method is called once the promise returned by an\n adapter's `createRecord`, `updateRecord` or `deleteRecord`\n is resolved.\n If the data provides a server-generated ID, it will\n update the record and the store's indexes.\n @method didSaveRecord\n @private\n @param {InternalModel} internalModel the in-flight internal model\n @param {Object} data optional data (see above)\n */\n didSaveRecord: function didSaveRecord(internalModel, dataArg) {\n var data;\n if (dataArg) {\n data = dataArg.data;\n }\n if (data) {\n // normalize relationship IDs into records\n this._backburner.schedule('normalizeRelationships', this, '_setupRelationships', internalModel, data);\n this.updateId(internalModel, data);\n }\n\n //We first make sure the primary data has been updated\n //TODO try to move notification to the user to the end of the runloop\n internalModel.adapterDidCommit(data);\n },\n\n /**\n This method is called once the promise returned by an\n adapter's `createRecord`, `updateRecord` or `deleteRecord`\n is rejected with a `DS.InvalidError`.\n @method recordWasInvalid\n @private\n @param {InternalModel} internalModel\n @param {Object} errors\n */\n recordWasInvalid: function recordWasInvalid(internalModel, errors) {\n internalModel.adapterDidInvalidate(errors);\n },\n\n /**\n This method is called once the promise returned by an\n adapter's `createRecord`, `updateRecord` or `deleteRecord`\n is rejected (with anything other than a `DS.InvalidError`).\n @method recordWasError\n @private\n @param {InternalModel} internalModel\n @param {Error} error\n */\n recordWasError: function recordWasError(internalModel, error) {\n internalModel.adapterDidError(error);\n },\n\n /**\n When an adapter's `createRecord`, `updateRecord` or `deleteRecord`\n resolves with data, this method extracts the ID from the supplied\n data.\n @method updateId\n @private\n @param {InternalModel} internalModel\n @param {Object} data\n */\n updateId: function updateId(internalModel, data) {\n var oldId = internalModel.id;\n var id = (0, _emberDataPrivateSystemCoerceId['default'])(data.id);\n\n (0, _emberDataPrivateDebug.assert)(\"An adapter cannot assign a new id to a record that already has an id. \" + internalModel + \" had id: \" + oldId + \" and you tried to update it with \" + id + \". This likely happened because your server returned data in response to a find or update that had a different id than the one you sent.\", oldId === null || id === oldId);\n\n this.typeMapFor(internalModel.type).idToRecord[id] = internalModel;\n\n internalModel.setId(id);\n },\n\n /**\n Returns a map of IDs to client IDs for a given type.\n @method typeMapFor\n @private\n @param {DS.Model} typeClass\n @return {Object} typeMap\n */\n typeMapFor: function typeMapFor(typeClass) {\n var typeMaps = get(this, 'typeMaps');\n var guid = _ember['default'].guidFor(typeClass);\n var typeMap = typeMaps[guid];\n\n if (typeMap) {\n return typeMap;\n }\n\n typeMap = {\n idToRecord: new _emberDataPrivateSystemEmptyObject['default'](),\n records: [],\n metadata: new _emberDataPrivateSystemEmptyObject['default'](),\n type: typeClass\n };\n\n typeMaps[guid] = typeMap;\n\n return typeMap;\n },\n\n // ................\n // . LOADING DATA .\n // ................\n\n /**\n This internal method is used by `push`.\n @method _load\n @private\n @param {(String|DS.Model)} type\n @param {Object} data\n */\n _load: function _load(data) {\n var internalModel = this._internalModelForId(data.type, data.id);\n\n internalModel.setupData(data);\n\n this.recordArrayManager.recordDidChange(internalModel);\n\n return internalModel;\n },\n\n /*\n In case someone defined a relationship to a mixin, for example:\n ```\n var Comment = DS.Model.extend({\n owner: belongsTo('commentable'. { polymorphic: true})\n });\n var Commentable = Ember.Mixin.create({\n comments: hasMany('comment')\n });\n ```\n we want to look up a Commentable class which has all the necessary\n relationship metadata. Thus, we look up the mixin and create a mock\n DS.Model, so we can access the relationship CPs of the mixin (`comments`)\n in this case\n */\n\n _modelForMixin: function _modelForMixin(modelName) {\n var normalizedModelName = (0, _emberDataPrivateSystemNormalizeModelName['default'])(modelName);\n // container.registry = 2.1\n // container._registry = 1.11 - 2.0\n // container = < 1.11\n var owner = (0, _emberDataPrivateUtils.getOwner)(this);\n\n var mixin = owner._lookupFactory('mixin:' + normalizedModelName);\n if (mixin) {\n //Cache the class as a model\n owner.register('model:' + normalizedModelName, _emberDataModel['default'].extend(mixin));\n }\n var factory = this.modelFactoryFor(normalizedModelName);\n if (factory) {\n factory.__isMixin = true;\n factory.__mixin = mixin;\n }\n\n return factory;\n },\n\n /**\n Returns a model class for a particular key. Used by\n methods that take a type key (like `find`, `createRecord`,\n etc.)\n @method modelFor\n @param {String} modelName\n @return {DS.Model}\n */\n modelFor: function modelFor(modelName) {\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a model name to the store's modelFor method\", isPresent(modelName));\n (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n\n var factory = this.modelFactoryFor(modelName);\n if (!factory) {\n //Support looking up mixins as base types for polymorphic relationships\n factory = this._modelForMixin(modelName);\n }\n if (!factory) {\n throw new _ember['default'].Error(\"No model was found for '\" + modelName + \"'\");\n }\n factory.modelName = factory.modelName || (0, _emberDataPrivateSystemNormalizeModelName['default'])(modelName);\n\n return factory;\n },\n\n modelFactoryFor: function modelFactoryFor(modelName) {\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a model name to the store's modelFactoryFor method\", isPresent(modelName));\n (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n var normalizedKey = (0, _emberDataPrivateSystemNormalizeModelName['default'])(modelName);\n\n var owner = (0, _emberDataPrivateUtils.getOwner)(this);\n\n return owner._lookupFactory('model:' + normalizedKey);\n },\n\n /**\n Push some data for a given type into the store.\n This method expects normalized [JSON API](http://jsonapi.org/) document. This means you have to follow [JSON API specification](http://jsonapi.org/format/) with few minor adjustments:\n - record's `type` should always be in singular, dasherized form\n - members (properties) should be camelCased\n [Your primary data should be wrapped inside `data` property](http://jsonapi.org/format/#document-top-level):\n ```js\n store.push({\n data: {\n // primary data for single record of type `Person`\n id: '1',\n type: 'person',\n attributes: {\n firstName: 'Daniel',\n lastName: 'Kmak'\n }\n }\n });\n ```\n [Demo.](http://ember-twiddle.com/fb99f18cd3b4d3e2a4c7)\n `data` property can also hold an array (of records):\n ```js\n store.push({\n data: [\n // an array of records\n {\n id: '1',\n type: 'person',\n attributes: {\n firstName: 'Daniel',\n lastName: 'Kmak'\n }\n },\n {\n id: '2',\n type: 'person',\n attributes: {\n firstName: 'Tom',\n lastName: 'Dale'\n }\n }\n ]\n });\n ```\n [Demo.](http://ember-twiddle.com/69cdbeaa3702159dc355)\n There are some typical properties for `JSONAPI` payload:\n * `id` - mandatory, unique record's key\n * `type` - mandatory string which matches `model`'s dasherized name in singular form\n * `attributes` - object which holds data for record attributes - `DS.attr`'s declared in model\n * `relationships` - object which must contain any of the following properties under each relationships' respective key (example path is `relationships.achievements.data`):\n - [`links`](http://jsonapi.org/format/#document-links)\n - [`data`](http://jsonapi.org/format/#document-resource-object-linkage) - place for primary data\n - [`meta`](http://jsonapi.org/format/#document-meta) - object which contains meta-information about relationship\n For this model:\n ```app/models/person.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n firstName: DS.attr('string'),\n lastName: DS.attr('string'),\n children: DS.hasMany('person')\n });\n ```\n To represent the children as IDs:\n ```js\n {\n data: {\n id: '1',\n type: 'person',\n attributes: {\n firstName: 'Tom',\n lastName: 'Dale'\n },\n relationships: {\n children: {\n data: [\n {\n id: '2',\n type: 'person'\n },\n {\n id: '3',\n type: 'person'\n },\n {\n id: '4',\n type: 'person'\n }\n ]\n }\n }\n }\n }\n ```\n [Demo.](http://ember-twiddle.com/343e1735e034091f5bde)\n To represent the children relationship as a URL:\n ```js\n {\n data: {\n id: '1',\n type: 'person',\n attributes: {\n firstName: 'Tom',\n lastName: 'Dale'\n },\n relationships: {\n children: {\n links: {\n related: '/people/1/children'\n }\n }\n }\n }\n }\n ```\n If you're streaming data or implementing an adapter, make sure\n that you have converted the incoming data into this form. The\n store's [normalize](#method_normalize) method is a convenience\n helper for converting a json payload into the form Ember Data\n expects.\n ```js\n store.push(store.normalize('person', data));\n ```\n This method can be used both to push in brand new\n records, as well as to update existing records.\n @method push\n @param {Object} data\n @return {DS.Model|Array} the record(s) that was created or\n updated.\n */\n push: function push(data) {\n var included = data.included;\n var i, length;\n if (included) {\n for (i = 0, length = included.length; i < length; i++) {\n this._pushInternalModel(included[i]);\n }\n }\n\n if (Array.isArray(data.data)) {\n length = data.data.length;\n var internalModels = new Array(length);\n for (i = 0; i < length; i++) {\n internalModels[i] = this._pushInternalModel(data.data[i]).getRecord();\n }\n return internalModels;\n }\n\n if (data.data === null) {\n return null;\n }\n\n (0, _emberDataPrivateDebug.assert)('Expected an object in the \\'data\\' property in a call to \\'push\\' for ' + data.type + ', but was ' + _ember['default'].typeOf(data.data), _ember['default'].typeOf(data.data) === 'object');\n\n var internalModel = this._pushInternalModel(data.data);\n\n return internalModel.getRecord();\n },\n\n _hasModelFor: function _hasModelFor(type) {\n return !!(0, _emberDataPrivateUtils.getOwner)(this)._lookupFactory('model:' + type);\n },\n\n _pushInternalModel: function _pushInternalModel(data) {\n var _this2 = this;\n\n var modelName = data.type;\n (0, _emberDataPrivateDebug.assert)('You must include an \\'id\\' for ' + modelName + ' in an object passed to \\'push\\'', data.id !== null && data.id !== undefined && data.id !== '');\n (0, _emberDataPrivateDebug.assert)('You tried to push data with a type \\'' + modelName + '\\' but no model could be found with that name.', this._hasModelFor(modelName));\n\n (0, _emberDataPrivateDebug.runInDebug)(function () {\n // If Ember.ENV.DS_WARN_ON_UNKNOWN_KEYS is set to true and the payload\n // contains unknown attributes or relationships, log a warning.\n\n if (_ember['default'].ENV.DS_WARN_ON_UNKNOWN_KEYS) {\n (function () {\n var type = _this2.modelFor(modelName);\n\n // Check unknown attributes\n var unknownAttributes = Object.keys(data.attributes || {}).filter(function (key) {\n return !get(type, 'fields').has(key);\n });\n var unknownAttributesMessage = 'The payload for \\'' + type.modelName + '\\' contains these unknown attributes: ' + unknownAttributes + '. Make sure they\\'ve been defined in your model.';\n (0, _emberDataPrivateDebug.warn)(unknownAttributesMessage, unknownAttributes.length === 0, { id: 'ds.store.unknown-keys-in-payload' });\n\n // Check unknown relationships\n var unknownRelationships = Object.keys(data.relationships || {}).filter(function (key) {\n return !get(type, 'fields').has(key);\n });\n var unknownRelationshipsMessage = 'The payload for \\'' + type.modelName + '\\' contains these unknown relationships: ' + unknownRelationships + '. Make sure they\\'ve been defined in your model.';\n (0, _emberDataPrivateDebug.warn)(unknownRelationshipsMessage, unknownRelationships.length === 0, { id: 'ds.store.unknown-keys-in-payload' });\n })();\n }\n });\n\n // Actually load the record into the store.\n var internalModel = this._load(data);\n\n this._backburner.join(function () {\n _this2._backburner.schedule('normalizeRelationships', _this2, '_setupRelationships', internalModel, data);\n });\n\n return internalModel;\n },\n\n _setupRelationships: function _setupRelationships(record, data) {\n // This will convert relationships specified as IDs into DS.Model instances\n // (possibly unloaded) and also create the data structures used to track\n // relationships.\n setupRelationships(this, record, data);\n },\n\n /**\n Push some raw data into the store.\n This method can be used both to push in brand new\n records, as well as to update existing records. You\n can push in more than one type of object at once.\n All objects should be in the format expected by the\n serializer.\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.ActiveModelSerializer;\n ```\n ```js\n var pushData = {\n posts: [\n { id: 1, post_title: \"Great post\", comment_ids: [2] }\n ],\n comments: [\n { id: 2, comment_body: \"Insightful comment\" }\n ]\n }\n store.pushPayload(pushData);\n ```\n By default, the data will be deserialized using a default\n serializer (the application serializer if it exists).\n Alternatively, `pushPayload` will accept a model type which\n will determine which serializer will process the payload.\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.ActiveModelSerializer;\n ```\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.JSONSerializer;\n ```\n ```js\n store.pushPayload('comment', pushData); // Will use the application serializer\n store.pushPayload('post', pushData); // Will use the post serializer\n ```\n @method pushPayload\n @param {String} modelName Optionally, a model type used to determine which serializer will be used\n @param {Object} inputPayload\n */\n pushPayload: function pushPayload(modelName, inputPayload) {\n var _this3 = this;\n\n var serializer;\n var payload;\n if (!inputPayload) {\n payload = modelName;\n serializer = defaultSerializer(this);\n (0, _emberDataPrivateDebug.assert)(\"You cannot use `store#pushPayload` without a modelName unless your default serializer defines `pushPayload`\", typeof serializer.pushPayload === 'function');\n } else {\n payload = inputPayload;\n (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n serializer = this.serializerFor(modelName);\n }\n if (false) {\n return this._adapterRun(function () {\n return serializer.pushPayload(_this3, payload);\n });\n } else {\n this._adapterRun(function () {\n return serializer.pushPayload(_this3, payload);\n });\n }\n },\n\n /**\n `normalize` converts a json payload into the normalized form that\n [push](#method_push) expects.\n Example\n ```js\n socket.on('message', function(message) {\n var modelName = message.model;\n var data = message.data;\n store.push(store.normalize(modelName, data));\n });\n ```\n @method normalize\n @param {String} modelName The name of the model type for this payload\n @param {Object} payload\n @return {Object} The normalized payload\n */\n normalize: function normalize(modelName, payload) {\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a model name to the store's normalize method\", isPresent(modelName));\n (0, _emberDataPrivateDebug.assert)('Passing classes to store methods has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n var serializer = this.serializerFor(modelName);\n var model = this.modelFor(modelName);\n return serializer.normalize(model, payload);\n },\n\n /**\n Build a brand new record for a given type, ID, and\n initial data.\n @method buildRecord\n @private\n @param {DS.Model} type\n @param {String} id\n @param {Object} data\n @return {InternalModel} internal model\n */\n buildInternalModel: function buildInternalModel(type, id, data) {\n var typeMap = this.typeMapFor(type);\n var idToRecord = typeMap.idToRecord;\n\n (0, _emberDataPrivateDebug.assert)('The id ' + id + ' has already been used with another record of type ' + type.toString() + '.', !id || !idToRecord[id]);\n (0, _emberDataPrivateDebug.assert)('\\'' + _ember['default'].inspect(type) + '\\' does not appear to be an ember-data model', typeof type._create === 'function');\n\n // lookupFactory should really return an object that creates\n // instances with the injections applied\n var internalModel = new _emberDataPrivateSystemModelInternalModel['default'](type, id, this, null, data);\n\n // if we're creating an item, this process will be done\n // later, once the object has been persisted.\n if (id) {\n idToRecord[id] = internalModel;\n }\n\n typeMap.records.push(internalModel);\n\n return internalModel;\n },\n\n //Called by the state machine to notify the store that the record is ready to be interacted with\n recordWasLoaded: function recordWasLoaded(record) {\n this.recordArrayManager.recordWasLoaded(record);\n },\n\n // ...............\n // . DESTRUCTION .\n // ...............\n\n /**\n When a record is destroyed, this un-indexes it and\n removes it from any record arrays so it can be GCed.\n @method _dematerializeRecord\n @private\n @param {InternalModel} internalModel\n */\n _dematerializeRecord: function _dematerializeRecord(internalModel) {\n var type = internalModel.type;\n var typeMap = this.typeMapFor(type);\n var id = internalModel.id;\n\n internalModel.updateRecordArrays();\n\n if (id) {\n delete typeMap.idToRecord[id];\n }\n\n var loc = typeMap.records.indexOf(internalModel);\n typeMap.records.splice(loc, 1);\n },\n\n // ......................\n // . PER-TYPE ADAPTERS\n // ......................\n\n /**\n Returns an instance of the adapter for a given type. For\n example, `adapterFor('person')` will return an instance of\n `App.PersonAdapter`.\n If no `App.PersonAdapter` is found, this method will look\n for an `App.ApplicationAdapter` (the default adapter for\n your entire application).\n If no `App.ApplicationAdapter` is found, it will return\n the value of the `defaultAdapter`.\n @method adapterFor\n @public\n @param {String} modelName\n @return DS.Adapter\n */\n adapterFor: function adapterFor(modelName) {\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a model name to the store's adapterFor method\", isPresent(modelName));\n (0, _emberDataPrivateDebug.assert)('Passing classes to store.adapterFor has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n\n return this.lookupAdapter(modelName);\n },\n\n _adapterRun: function _adapterRun(fn) {\n return this._backburner.run(fn);\n },\n\n // ..............................\n // . RECORD CHANGE NOTIFICATION .\n // ..............................\n\n /**\n Returns an instance of the serializer for a given type. For\n example, `serializerFor('person')` will return an instance of\n `App.PersonSerializer`.\n If no `App.PersonSerializer` is found, this method will look\n for an `App.ApplicationSerializer` (the default serializer for\n your entire application).\n if no `App.ApplicationSerializer` is found, it will attempt\n to get the `defaultSerializer` from the `PersonAdapter`\n (`adapterFor('person')`).\n If a serializer cannot be found on the adapter, it will fall back\n to an instance of `DS.JSONSerializer`.\n @method serializerFor\n @public\n @param {String} modelName the record to serialize\n @return {DS.Serializer}\n */\n serializerFor: function serializerFor(modelName) {\n (0, _emberDataPrivateDebug.assert)(\"You need to pass a model name to the store's serializerFor method\", isPresent(modelName));\n (0, _emberDataPrivateDebug.assert)('Passing classes to store.serializerFor has been removed. Please pass a dasherized string instead of ' + _ember['default'].inspect(modelName), typeof modelName === 'string');\n\n var fallbacks = ['application', this.adapterFor(modelName).get('defaultSerializer'), '-default'];\n\n var serializer = this.lookupSerializer(modelName, fallbacks);\n return serializer;\n },\n\n /**\n Retrieve a particular instance from the\n container cache. If not found, creates it and\n placing it in the cache.\n Enabled a store to manage local instances of\n adapters and serializers.\n @method retrieveManagedInstance\n @private\n @param {String} modelName the object modelName\n @param {String} name the object name\n @param {Array} fallbacks the fallback objects to lookup if the lookup for modelName or 'application' fails\n @return {Ember.Object}\n */\n retrieveManagedInstance: function retrieveManagedInstance(type, modelName, fallbacks) {\n var normalizedModelName = (0, _emberDataPrivateSystemNormalizeModelName['default'])(modelName);\n\n var instance = this._instanceCache.get(type, normalizedModelName, fallbacks);\n set(instance, 'store', this);\n return instance;\n },\n\n lookupAdapter: function lookupAdapter(name) {\n return this.retrieveManagedInstance('adapter', name, this.get('_adapterFallbacks'));\n },\n\n _adapterFallbacks: _ember['default'].computed('adapter', function () {\n var adapter = this.get('adapter');\n return ['application', adapter, '-json-api'];\n }),\n\n lookupSerializer: function lookupSerializer(name, fallbacks) {\n return this.retrieveManagedInstance('serializer', name, fallbacks);\n },\n\n willDestroy: function willDestroy() {\n this._super.apply(this, arguments);\n this.recordArrayManager.destroy();\n\n this.unloadAll();\n }\n\n });\n\n function deserializeRecordId(store, key, relationship, id) {\n if (isNone(id)) {\n return;\n }\n\n (0, _emberDataPrivateDebug.assert)('A ' + relationship.parentType + ' record was pushed into the store with the value of ' + key + ' being ' + _ember['default'].inspect(id) + ', but ' + key + ' is a belongsTo relationship so the value must not be an array. You should probably check your data payload or serializer.', !Array.isArray(id));\n\n //TODO:Better asserts\n return store._internalModelForId(id.type, id.id);\n }\n\n function deserializeRecordIds(store, key, relationship, ids) {\n if (isNone(ids)) {\n return;\n }\n\n (0, _emberDataPrivateDebug.assert)('A ' + relationship.parentType + ' record was pushed into the store with the value of ' + key + ' being \\'' + _ember['default'].inspect(ids) + '\\', but ' + key + ' is a hasMany relationship so the value must be an array. You should probably check your data payload or serializer.', Array.isArray(ids));\n var _ids = new Array(ids.length);\n\n for (var i = 0; i < ids.length; i++) {\n _ids[i] = deserializeRecordId(store, key, relationship, ids[i]);\n }\n\n return _ids;\n }\n\n // Delegation to the adapter and promise management\n\n function defaultSerializer(store) {\n return store.serializerFor('application');\n }\n\n function _commit(adapter, store, operation, snapshot) {\n var internalModel = snapshot._internalModel;\n var modelName = snapshot.modelName;\n var typeClass = store.modelFor(modelName);\n var promise = adapter[operation](store, typeClass, snapshot);\n var serializer = (0, _emberDataPrivateSystemStoreSerializers.serializerForAdapter)(store, adapter, modelName);\n var label = 'DS: Extract and notify about ' + operation + ' completion of ' + internalModel;\n\n (0, _emberDataPrivateDebug.assert)('Your adapter\\'s \\'' + operation + '\\' method must return a value, but it returned \\'undefined\\'', promise !== undefined);\n\n promise = Promise.resolve(promise, label);\n promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, store));\n promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, internalModel));\n\n return promise.then(function (adapterPayload) {\n store._adapterRun(function () {\n var payload, data;\n if (adapterPayload) {\n payload = (0, _emberDataPrivateSystemStoreSerializerResponse.normalizeResponseHelper)(serializer, store, typeClass, adapterPayload, snapshot.id, operation);\n if (payload.included) {\n store.push({ data: payload.included });\n }\n data = payload.data;\n }\n store.didSaveRecord(internalModel, { data: data });\n });\n\n return internalModel;\n }, function (error) {\n if (error instanceof _emberDataAdaptersErrors.InvalidError) {\n var errors = serializer.extractErrors(store, typeClass, error, snapshot.id);\n store.recordWasInvalid(internalModel, errors);\n } else {\n store.recordWasError(internalModel, error);\n }\n\n throw error;\n }, label);\n }\n\n function setupRelationships(store, record, data) {\n if (!data.relationships) {\n return;\n }\n\n record.type.eachRelationship(function (key, descriptor) {\n var kind = descriptor.kind;\n\n if (!data.relationships[key]) {\n return;\n }\n\n var relationship;\n\n if (data.relationships[key].links && data.relationships[key].links.related) {\n var relatedLink = (0, _emberDataPrivateSystemNormalizeLink['default'])(data.relationships[key].links.related);\n if (relatedLink && relatedLink.href) {\n relationship = record._relationships.get(key);\n relationship.updateLink(relatedLink.href);\n }\n }\n\n if (data.relationships[key].meta) {\n relationship = record._relationships.get(key);\n relationship.updateMeta(data.relationships[key].meta);\n }\n\n // If the data contains a relationship that is specified as an ID (or IDs),\n // normalizeRelationship will convert them into DS.Model instances\n // (possibly unloaded) before we push the payload into the store.\n normalizeRelationship(store, key, descriptor, data.relationships[key]);\n\n var value = data.relationships[key].data;\n\n if (value !== undefined) {\n if (kind === 'belongsTo') {\n relationship = record._relationships.get(key);\n relationship.setCanonicalRecord(value);\n } else if (kind === 'hasMany') {\n relationship = record._relationships.get(key);\n relationship.updateRecordsFromAdapter(value);\n }\n }\n });\n }\n\n function normalizeRelationship(store, key, relationship, jsonPayload) {\n var data = jsonPayload.data;\n if (data) {\n var kind = relationship.kind;\n if (kind === 'belongsTo') {\n jsonPayload.data = deserializeRecordId(store, key, relationship, data);\n } else if (kind === 'hasMany') {\n jsonPayload.data = deserializeRecordIds(store, key, relationship, data);\n }\n }\n }\n\n exports.Store = Store;\n exports['default'] = Store;\n});","define('ember-data/-private/system/store/common', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports._bind = _bind;\n exports._guard = _guard;\n exports._objectIsAlive = _objectIsAlive;\n\n var get = _ember['default'].get;\n\n function _bind(fn) {\n var args = Array.prototype.slice.call(arguments, 1);\n\n return function () {\n return fn.apply(undefined, args);\n };\n }\n\n function _guard(promise, test) {\n var guarded = promise['finally'](function () {\n if (!test()) {\n guarded._subscribers.length = 0;\n }\n });\n\n return guarded;\n }\n\n function _objectIsAlive(object) {\n return !(get(object, \"isDestroyed\") || get(object, \"isDestroying\"));\n }\n});","define('ember-data/-private/system/store/container-instance-cache', ['exports', 'ember', 'ember-data/-private/system/empty-object'], function (exports, _ember, _emberDataPrivateSystemEmptyObject) {\n 'use strict';\n\n exports['default'] = ContainerInstanceCache;\n\n var assign = _ember['default'].assign || _ember['default'].merge;\n\n /**\n * The `ContainerInstanceCache` serves as a lazy cache for looking up\n * instances of serializers and adapters. It has some additional logic for\n * finding the 'fallback' adapter or serializer.\n *\n * The 'fallback' adapter or serializer is an adapter or serializer that is looked up\n * when the preferred lookup fails. For example, say you try to look up `adapter:post`,\n * but there is no entry (app/adapters/post.js in EmberCLI) for `adapter:post` in the registry.\n *\n * The `fallbacks` array passed will then be used; the first entry in the fallbacks array\n * that exists in the container will then be cached for `adapter:post`. So, the next time you\n * look up `adapter:post`, you'll get the `adapter:application` instance (or whatever the fallback\n * was if `adapter:application` doesn't exist).\n *\n * @private\n * @class ContainerInstanceCache\n *\n */\n function ContainerInstanceCache(owner) {\n this._owner = owner;\n this._cache = new _emberDataPrivateSystemEmptyObject['default']();\n }\n\n ContainerInstanceCache.prototype = new _emberDataPrivateSystemEmptyObject['default']();\n\n assign(ContainerInstanceCache.prototype, {\n get: function get(type, preferredKey, fallbacks) {\n var cache = this._cache;\n var preferredLookupKey = type + ':' + preferredKey;\n\n if (!(preferredLookupKey in cache)) {\n var instance = this.instanceFor(preferredLookupKey) || this._findInstance(type, fallbacks);\n if (instance) {\n cache[preferredLookupKey] = instance;\n }\n }\n return cache[preferredLookupKey];\n },\n\n _findInstance: function _findInstance(type, fallbacks) {\n for (var i = 0, _length = fallbacks.length; i < _length; i++) {\n var fallback = fallbacks[i];\n var lookupKey = type + ':' + fallback;\n var instance = this.instanceFor(lookupKey);\n\n if (instance) {\n return instance;\n }\n }\n },\n\n instanceFor: function instanceFor(key) {\n var cache = this._cache;\n if (!cache[key]) {\n var instance = this._owner.lookup(key);\n if (instance) {\n cache[key] = instance;\n }\n }\n return cache[key];\n },\n\n destroy: function destroy() {\n var cache = this._cache;\n var cacheEntries = Object.keys(cache);\n\n for (var i = 0, _length2 = cacheEntries.length; i < _length2; i++) {\n var cacheKey = cacheEntries[i];\n var cacheEntry = cache[cacheKey];\n if (cacheEntry) {\n cacheEntry.destroy();\n }\n }\n this._owner = null;\n },\n\n constructor: ContainerInstanceCache,\n\n toString: function toString() {\n return 'ContainerInstanceCache';\n }\n });\n});","define(\"ember-data/-private/system/store/finders\", [\"exports\", \"ember\", \"ember-data/-private/debug\", \"ember-data/-private/system/store/common\", \"ember-data/-private/system/store/serializer-response\", \"ember-data/-private/system/store/serializers\"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateSystemStoreCommon, _emberDataPrivateSystemStoreSerializerResponse, _emberDataPrivateSystemStoreSerializers) {\n \"use strict\";\n\n exports._find = _find;\n exports._findMany = _findMany;\n exports._findHasMany = _findHasMany;\n exports._findBelongsTo = _findBelongsTo;\n exports._findAll = _findAll;\n exports._query = _query;\n exports._queryRecord = _queryRecord;\n\n var Promise = _ember[\"default\"].RSVP.Promise;\n\n function payloadIsNotBlank(adapterPayload) {\n if (Array.isArray(adapterPayload)) {\n return true;\n } else {\n return Object.keys(adapterPayload || {}).length;\n }\n }\n\n function _find(adapter, store, typeClass, id, internalModel, options) {\n var snapshot = internalModel.createSnapshot(options);\n var promise = adapter.findRecord(store, typeClass, id, snapshot);\n var serializer = (0, _emberDataPrivateSystemStoreSerializers.serializerForAdapter)(store, adapter, internalModel.type.modelName);\n var label = \"DS: Handle Adapter#findRecord of \" + typeClass + \" with id: \" + id;\n\n promise = Promise.resolve(promise, label);\n promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, store));\n\n return promise.then(function (adapterPayload) {\n (0, _emberDataPrivateDebug.assert)(\"You made a `findRecord` request for a \" + typeClass.modelName + \" with id \" + id + \", but the adapter's response did not have any data\", payloadIsNotBlank(adapterPayload));\n return store._adapterRun(function () {\n var payload = (0, _emberDataPrivateSystemStoreSerializerResponse.normalizeResponseHelper)(serializer, store, typeClass, adapterPayload, id, 'findRecord');\n (0, _emberDataPrivateDebug.assert)('Ember Data expected the primary data returned from a `findRecord` response to be an object but instead it found an array.', !Array.isArray(payload.data));\n //TODO Optimize\n var record = store.push(payload);\n return record._internalModel;\n });\n }, function (error) {\n internalModel.notFound();\n if (internalModel.isEmpty()) {\n internalModel.unloadRecord();\n }\n\n throw error;\n }, \"DS: Extract payload of '\" + typeClass + \"'\");\n }\n\n function _findMany(adapter, store, typeClass, ids, internalModels) {\n var snapshots = _ember[\"default\"].A(internalModels).invoke('createSnapshot');\n var promise = adapter.findMany(store, typeClass, ids, snapshots);\n var serializer = (0, _emberDataPrivateSystemStoreSerializers.serializerForAdapter)(store, adapter, typeClass.modelName);\n var label = \"DS: Handle Adapter#findMany of \" + typeClass;\n\n if (promise === undefined) {\n throw new Error('adapter.findMany returned undefined, this was very likely a mistake');\n }\n\n promise = Promise.resolve(promise, label);\n promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, store));\n\n return promise.then(function (adapterPayload) {\n (0, _emberDataPrivateDebug.assert)(\"You made a `findMany` request for \" + typeClass.modelName + \" records with ids \" + ids + \", but the adapter's response did not have any data\", payloadIsNotBlank(adapterPayload));\n return store._adapterRun(function () {\n var payload = (0, _emberDataPrivateSystemStoreSerializerResponse.normalizeResponseHelper)(serializer, store, typeClass, adapterPayload, null, 'findMany');\n //TODO Optimize, no need to materialize here\n var records = store.push(payload);\n var internalModels = new Array(records.length);\n\n for (var i = 0; i < records.length; i++) {\n internalModels[i] = records[i]._internalModel;\n }\n\n return internalModels;\n });\n }, null, \"DS: Extract payload of \" + typeClass);\n }\n\n function _findHasMany(adapter, store, internalModel, link, relationship) {\n var snapshot = internalModel.createSnapshot();\n var typeClass = store.modelFor(relationship.type);\n var promise = adapter.findHasMany(store, snapshot, link, relationship);\n var serializer = (0, _emberDataPrivateSystemStoreSerializers.serializerForAdapter)(store, adapter, relationship.type);\n var label = \"DS: Handle Adapter#findHasMany of \" + internalModel + \" : \" + relationship.type;\n\n promise = Promise.resolve(promise, label);\n promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, store));\n promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, internalModel));\n\n return promise.then(function (adapterPayload) {\n (0, _emberDataPrivateDebug.assert)(\"You made a `findHasMany` request for a \" + internalModel.modelName + \"'s `\" + relationship.key + \"` relationship, using link \" + link + \", but the adapter's response did not have any data\", payloadIsNotBlank(adapterPayload));\n return store._adapterRun(function () {\n var payload = (0, _emberDataPrivateSystemStoreSerializerResponse.normalizeResponseHelper)(serializer, store, typeClass, adapterPayload, null, 'findHasMany');\n //TODO Use a non record creating push\n var records = store.push(payload);\n var recordArray = records.map(function (record) {\n return record._internalModel;\n });\n recordArray.meta = payload.meta;\n return recordArray;\n });\n }, null, \"DS: Extract payload of \" + internalModel + \" : hasMany \" + relationship.type);\n }\n\n function _findBelongsTo(adapter, store, internalModel, link, relationship) {\n var snapshot = internalModel.createSnapshot();\n var typeClass = store.modelFor(relationship.type);\n var promise = adapter.findBelongsTo(store, snapshot, link, relationship);\n var serializer = (0, _emberDataPrivateSystemStoreSerializers.serializerForAdapter)(store, adapter, relationship.type);\n var label = \"DS: Handle Adapter#findBelongsTo of \" + internalModel + \" : \" + relationship.type;\n\n promise = Promise.resolve(promise, label);\n promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, store));\n promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, internalModel));\n\n return promise.then(function (adapterPayload) {\n return store._adapterRun(function () {\n var payload = (0, _emberDataPrivateSystemStoreSerializerResponse.normalizeResponseHelper)(serializer, store, typeClass, adapterPayload, null, 'findBelongsTo');\n\n if (!payload.data) {\n return null;\n }\n\n //TODO Optimize\n var record = store.push(payload);\n return record._internalModel;\n });\n }, null, \"DS: Extract payload of \" + internalModel + \" : \" + relationship.type);\n }\n\n function _findAll(adapter, store, typeClass, sinceToken, options) {\n var modelName = typeClass.modelName;\n var recordArray = store.peekAll(modelName);\n var snapshotArray = recordArray.createSnapshot(options);\n var promise = adapter.findAll(store, typeClass, sinceToken, snapshotArray);\n var serializer = (0, _emberDataPrivateSystemStoreSerializers.serializerForAdapter)(store, adapter, modelName);\n var label = \"DS: Handle Adapter#findAll of \" + typeClass;\n\n promise = Promise.resolve(promise, label);\n promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, store));\n\n return promise.then(function (adapterPayload) {\n (0, _emberDataPrivateDebug.assert)(\"You made a `findAll` request for \" + typeClass.modelName + \" records, but the adapter's response did not have any data\", payloadIsNotBlank(adapterPayload));\n store._adapterRun(function () {\n var payload = (0, _emberDataPrivateSystemStoreSerializerResponse.normalizeResponseHelper)(serializer, store, typeClass, adapterPayload, null, 'findAll');\n //TODO Optimize\n store.push(payload);\n });\n\n store.didUpdateAll(typeClass);\n return store.peekAll(modelName);\n }, null, \"DS: Extract payload of findAll \" + typeClass);\n }\n\n function _query(adapter, store, typeClass, query, recordArray) {\n var modelName = typeClass.modelName;\n var promise = adapter.query(store, typeClass, query, recordArray);\n\n var serializer = (0, _emberDataPrivateSystemStoreSerializers.serializerForAdapter)(store, adapter, modelName);\n var label = \"DS: Handle Adapter#query of \" + typeClass;\n\n promise = Promise.resolve(promise, label);\n promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, store));\n\n return promise.then(function (adapterPayload) {\n var records, payload;\n store._adapterRun(function () {\n payload = (0, _emberDataPrivateSystemStoreSerializerResponse.normalizeResponseHelper)(serializer, store, typeClass, adapterPayload, null, 'query');\n //TODO Optimize\n records = store.push(payload);\n });\n\n (0, _emberDataPrivateDebug.assert)('The response to store.query is expected to be an array but it was a single record. Please wrap your response in an array or use `store.queryRecord` to query for a single record.', Array.isArray(records));\n recordArray.loadRecords(records, payload);\n return recordArray;\n }, null, \"DS: Extract payload of query \" + typeClass);\n }\n\n function _queryRecord(adapter, store, typeClass, query) {\n var modelName = typeClass.modelName;\n var promise = adapter.queryRecord(store, typeClass, query);\n var serializer = (0, _emberDataPrivateSystemStoreSerializers.serializerForAdapter)(store, adapter, modelName);\n var label = \"DS: Handle Adapter#queryRecord of \" + typeClass;\n\n promise = Promise.resolve(promise, label);\n promise = (0, _emberDataPrivateSystemStoreCommon._guard)(promise, (0, _emberDataPrivateSystemStoreCommon._bind)(_emberDataPrivateSystemStoreCommon._objectIsAlive, store));\n\n return promise.then(function (adapterPayload) {\n var record;\n store._adapterRun(function () {\n var payload = (0, _emberDataPrivateSystemStoreSerializerResponse.normalizeResponseHelper)(serializer, store, typeClass, adapterPayload, null, 'queryRecord');\n\n (0, _emberDataPrivateDebug.assert)(\"Expected the primary data returned by the serializer for a `queryRecord` response to be a single object or null but instead it was an array.\", !Array.isArray(payload.data), {\n id: 'ds.store.queryRecord-array-response'\n });\n\n //TODO Optimize\n record = store.push(payload);\n });\n\n return record;\n }, null, \"DS: Extract payload of queryRecord \" + typeClass);\n }\n});","define('ember-data/-private/system/store/serializer-response', ['exports', 'ember', 'ember-data/-private/debug'], function (exports, _ember, _emberDataPrivateDebug) {\n 'use strict';\n\n exports.validateDocumentStructure = validateDocumentStructure;\n exports.normalizeResponseHelper = normalizeResponseHelper;\n\n /*\n This is a helper method that validates a JSON API top-level document\n \n The format of a document is described here:\n http://jsonapi.org/format/#document-top-level\n \n @method validateDocumentStructure\n @param {Object} doc JSON API document\n @return {array} An array of errors found in the document structure\n */\n\n function validateDocumentStructure(doc) {\n var errors = [];\n if (!doc || typeof doc !== 'object') {\n errors.push('Top level of a JSON API document must be an object');\n } else {\n if (!('data' in doc) && !('errors' in doc) && !('meta' in doc)) {\n errors.push('One or more of the following keys must be present: \"data\", \"errors\", \"meta\".');\n } else {\n if ('data' in doc && 'errors' in doc) {\n errors.push('Top level keys \"errors\" and \"data\" cannot both be present in a JSON API document');\n }\n }\n if ('data' in doc) {\n if (!(doc.data === null || Array.isArray(doc.data) || typeof doc.data === 'object')) {\n errors.push('data must be null, an object, or an array');\n }\n }\n if ('meta' in doc) {\n if (typeof doc.meta !== 'object') {\n errors.push('meta must be an object');\n }\n }\n if ('errors' in doc) {\n if (!Array.isArray(doc.errors)) {\n errors.push('errors must be an array');\n }\n }\n if ('links' in doc) {\n if (typeof doc.links !== 'object') {\n errors.push('links must be an object');\n }\n }\n if ('jsonapi' in doc) {\n if (typeof doc.jsonapi !== 'object') {\n errors.push('jsonapi must be an object');\n }\n }\n if ('included' in doc) {\n if (typeof doc.included !== 'object') {\n errors.push('included must be an array');\n }\n }\n }\n\n return errors;\n }\n\n /*\n This is a helper method that always returns a JSON-API Document.\n \n @method normalizeResponseHelper\n @param {DS.Serializer} serializer\n @param {DS.Store} store\n @param {subclass of DS.Model} modelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n\n function normalizeResponseHelper(serializer, store, modelClass, payload, id, requestType) {\n var normalizedResponse = serializer.normalizeResponse(store, modelClass, payload, id, requestType);\n var validationErrors = [];\n (0, _emberDataPrivateDebug.runInDebug)(function () {\n validationErrors = validateDocumentStructure(normalizedResponse);\n });\n (0, _emberDataPrivateDebug.assert)('normalizeResponse must return a valid JSON API document:\\n\\t* ' + validationErrors.join('\\n\\t* '), _ember['default'].isEmpty(validationErrors));\n\n return normalizedResponse;\n }\n});","define(\"ember-data/-private/system/store/serializers\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.serializerForAdapter = serializerForAdapter;\n\n function serializerForAdapter(store, adapter, type) {\n var serializer = adapter.serializer;\n\n if (serializer === undefined) {\n serializer = store.serializerFor(type);\n }\n\n if (serializer === null || serializer === undefined) {\n serializer = {\n extract: function extract(store, type, payload) {\n return payload;\n }\n };\n }\n\n return serializer;\n }\n});","define(\"ember-data/-private/transforms\", [\"exports\", \"ember-data/transform\", \"ember-data/-private/transforms/number\", \"ember-data/-private/transforms/date\", \"ember-data/-private/transforms/string\", \"ember-data/-private/transforms/boolean\"], function (exports, _emberDataTransform, _emberDataPrivateTransformsNumber, _emberDataPrivateTransformsDate, _emberDataPrivateTransformsString, _emberDataPrivateTransformsBoolean) {\n \"use strict\";\n\n exports.Transform = _emberDataTransform[\"default\"];\n exports.NumberTransform = _emberDataPrivateTransformsNumber[\"default\"];\n exports.DateTransform = _emberDataPrivateTransformsDate[\"default\"];\n exports.StringTransform = _emberDataPrivateTransformsString[\"default\"];\n exports.BooleanTransform = _emberDataPrivateTransformsBoolean[\"default\"];\n});","define('ember-data/-private/transforms/boolean', ['exports', 'ember', 'ember-data/transform', 'ember-data/-private/features'], function (exports, _ember, _emberDataTransform, _emberDataPrivateFeatures) {\n 'use strict';\n\n var isNone = _ember['default'].isNone;\n\n /**\n The `DS.BooleanTransform` class is used to serialize and deserialize\n boolean attributes on Ember Data record objects. This transform is\n used when `boolean` is passed as the type parameter to the\n [DS.attr](../../data#method_attr) function.\n \n Usage\n \n ```app/models/user.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n isAdmin: DS.attr('boolean'),\n name: DS.attr('string'),\n email: DS.attr('string')\n });\n ```\n \n @class BooleanTransform\n @extends DS.Transform\n @namespace DS\n */\n exports['default'] = _emberDataTransform['default'].extend({\n deserialize: function deserialize(serialized, options) {\n var type = typeof serialized;\n\n if (true) {\n if (isNone(serialized) && options.allowNull === true) {\n return null;\n }\n }\n\n if (type === \"boolean\") {\n return serialized;\n } else if (type === \"string\") {\n return serialized.match(/^true$|^t$|^1$/i) !== null;\n } else if (type === \"number\") {\n return serialized === 1;\n } else {\n return false;\n }\n },\n\n serialize: function serialize(deserialized, options) {\n if (true) {\n if (isNone(deserialized) && options.allowNull === true) {\n return null;\n }\n }\n\n return Boolean(deserialized);\n }\n });\n});","define(\"ember-data/-private/transforms/date\", [\"exports\", \"ember-data/-private/ext/date\", \"ember-data/transform\"], function (exports, _emberDataPrivateExtDate, _emberDataTransform) {\n \"use strict\";\n\n exports[\"default\"] = _emberDataTransform[\"default\"].extend({\n deserialize: function deserialize(serialized) {\n var type = typeof serialized;\n\n if (type === \"string\") {\n return new Date((0, _emberDataPrivateExtDate.parseDate)(serialized));\n } else if (type === \"number\") {\n return new Date(serialized);\n } else if (serialized === null || serialized === undefined) {\n // if the value is null return null\n // if the value is not present in the data return undefined\n return serialized;\n } else {\n return null;\n }\n },\n\n serialize: function serialize(date) {\n if (date instanceof Date) {\n return date.toISOString();\n } else {\n return null;\n }\n }\n });\n});\n\n/**\n The `DS.DateTransform` class is used to serialize and deserialize\n date attributes on Ember Data record objects. This transform is used\n when `date` is passed as the type parameter to the\n [DS.attr](../../data#method_attr) function.\n\n ```app/models/score.js\n import DS from 'ember-data';\n\n export default DS.Model.extend({\n value: DS.attr('number'),\n player: DS.belongsTo('player'),\n date: DS.attr('date')\n });\n ```\n\n @class DateTransform\n @extends DS.Transform\n @namespace DS\n */","define(\"ember-data/-private/transforms/number\", [\"exports\", \"ember\", \"ember-data/transform\"], function (exports, _ember, _emberDataTransform) {\n \"use strict\";\n\n var empty = _ember[\"default\"].isEmpty;\n\n function isNumber(value) {\n return value === value && value !== Infinity && value !== -Infinity;\n }\n\n /**\n The `DS.NumberTransform` class is used to serialize and deserialize\n numeric attributes on Ember Data record objects. This transform is\n used when `number` is passed as the type parameter to the\n [DS.attr](../../data#method_attr) function.\n \n Usage\n \n ```app/models/score.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n value: DS.attr('number'),\n player: DS.belongsTo('player'),\n date: DS.attr('date')\n });\n ```\n \n @class NumberTransform\n @extends DS.Transform\n @namespace DS\n */\n exports[\"default\"] = _emberDataTransform[\"default\"].extend({\n deserialize: function deserialize(serialized) {\n var transformed;\n\n if (empty(serialized)) {\n return null;\n } else {\n transformed = Number(serialized);\n\n return isNumber(transformed) ? transformed : null;\n }\n },\n\n serialize: function serialize(deserialized) {\n var transformed;\n\n if (empty(deserialized)) {\n return null;\n } else {\n transformed = Number(deserialized);\n\n return isNumber(transformed) ? transformed : null;\n }\n }\n });\n});","define(\"ember-data/-private/transforms/string\", [\"exports\", \"ember\", \"ember-data/transform\"], function (exports, _ember, _emberDataTransform) {\n \"use strict\";\n\n var none = _ember[\"default\"].isNone;\n\n /**\n The `DS.StringTransform` class is used to serialize and deserialize\n string attributes on Ember Data record objects. This transform is\n used when `string` is passed as the type parameter to the\n [DS.attr](../../data#method_attr) function.\n \n Usage\n \n ```app/models/user.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n isAdmin: DS.attr('boolean'),\n name: DS.attr('string'),\n email: DS.attr('string')\n });\n ```\n \n @class StringTransform\n @extends DS.Transform\n @namespace DS\n */\n exports[\"default\"] = _emberDataTransform[\"default\"].extend({\n deserialize: function deserialize(serialized) {\n return none(serialized) ? null : String(serialized);\n },\n serialize: function serialize(deserialized) {\n return none(deserialized) ? null : String(deserialized);\n }\n });\n});","define('ember-data/-private/utils', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n var get = _ember['default'].get;\n\n /*\n Check if the passed model has a `type` attribute or a relationship named `type`.\n \n @method modelHasAttributeOrRelationshipNamedType\n @param modelClass\n */\n function modelHasAttributeOrRelationshipNamedType(modelClass) {\n return get(modelClass, 'attributes').has('type') || get(modelClass, 'relationshipsByName').has('type');\n }\n\n /*\n ember-container-inject-owner is a new feature in Ember 2.3 that finally provides a public\n API for looking items up. This function serves as a super simple polyfill to avoid\n triggering deprecations.\n */\n function getOwner(context) {\n var owner;\n\n if (_ember['default'].getOwner) {\n owner = _ember['default'].getOwner(context);\n }\n\n if (!owner && context.container) {\n owner = context.container;\n }\n\n if (owner && owner.lookupFactory && !owner._lookupFactory) {\n // `owner` is a container, we are just making this work\n owner._lookupFactory = owner.lookupFactory;\n owner.register = function () {\n var registry = owner.registry || owner._registry || owner;\n\n return registry.register.apply(registry, arguments);\n };\n }\n\n return owner;\n }\n\n exports.modelHasAttributeOrRelationshipNamedType = modelHasAttributeOrRelationshipNamedType;\n exports.getOwner = getOwner;\n});","define('ember-data/-private/utils/parse-response-headers', ['exports', 'ember-data/-private/system/empty-object'], function (exports, _emberDataPrivateSystemEmptyObject) {\n 'use strict';\n\n exports['default'] = parseResponseHeaders;\n\n function _toArray(arr) {\n return Array.isArray(arr) ? arr : Array.from(arr);\n }\n\n var CLRF = '\\r\\n';\n function parseResponseHeaders(headersString) {\n var headers = new _emberDataPrivateSystemEmptyObject['default']();\n\n if (!headersString) {\n return headers;\n }\n\n var headerPairs = headersString.split(CLRF);\n\n headerPairs.forEach(function (header) {\n var _header$split = header.split(':');\n\n var _header$split2 = _toArray(_header$split);\n\n var field = _header$split2[0];\n\n var value = _header$split2.slice(1);\n\n field = field.trim();\n value = value.join(':').trim();\n\n if (value) {\n headers[field] = value;\n }\n });\n\n return headers;\n }\n});","define('ember-data/adapter', ['exports', 'ember'], function (exports, _ember) {\n /**\n @module ember-data\n */\n\n 'use strict';\n\n var get = _ember['default'].get;\n\n /**\n An adapter is an object that receives requests from a store and\n translates them into the appropriate action to take against your\n persistence layer. The persistence layer is usually an HTTP API, but\n may be anything, such as the browser's local storage. Typically the\n adapter is not invoked directly instead its functionality is accessed\n through the `store`.\n \n ### Creating an Adapter\n \n Create a new subclass of `DS.Adapter` in the `app/adapters` folder:\n \n ```app/adapters/application.js\n import DS from 'ember-data';\n \n export default DS.Adapter.extend({\n // ...your code here\n });\n ```\n \n Model-specific adapters can be created by putting your adapter\n class in an `app/adapters/` + `model-name` + `.js` file of the application.\n \n ```app/adapters/post.js\n import DS from 'ember-data';\n \n export default DS.Adapter.extend({\n // ...Post-specific adapter code goes here\n });\n ```\n \n `DS.Adapter` is an abstract base class that you should override in your\n application to customize it for your backend. The minimum set of methods\n that you should implement is:\n \n * `findRecord()`\n * `createRecord()`\n * `updateRecord()`\n * `deleteRecord()`\n * `findAll()`\n * `query()`\n \n To improve the network performance of your application, you can optimize\n your adapter by overriding these lower-level methods:\n \n * `findMany()`\n \n \n For an example implementation, see `DS.RESTAdapter`, the\n included REST adapter.\n \n @class Adapter\n @namespace DS\n @extends Ember.Object\n */\n\n exports['default'] = _ember['default'].Object.extend({\n\n /**\n If you would like your adapter to use a custom serializer you can\n set the `defaultSerializer` property to be the name of the custom\n serializer.\n Note the `defaultSerializer` serializer has a lower priority than\n a model specific serializer (i.e. `PostSerializer`) or the\n `application` serializer.\n ```app/adapters/django.js\n import DS from 'ember-data';\n export default DS.Adapter.extend({\n defaultSerializer: 'django'\n });\n ```\n @property defaultSerializer\n @type {String}\n */\n defaultSerializer: '-default',\n\n /**\n The `findRecord()` method is invoked when the store is asked for a record that\n has not previously been loaded. In response to `findRecord()` being called, you\n should query your persistence layer for a record with the given ID. The `findRecord`\n method should return a promise that will resolve to a JavaScript object that will be\n normalized by the serializer.\n Here is an example `findRecord` implementation:\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.Adapter.extend({\n findRecord: function(store, type, id, snapshot) {\n return new Ember.RSVP.Promise(function(resolve, reject) {\n Ember.$.getJSON(`/${type.modelName}/${id}`).then(function(data) {\n resolve(data);\n }, function(jqXHR) {\n reject(jqXHR);\n });\n });\n }\n });\n ```\n @method findRecord\n @param {DS.Store} store\n @param {DS.Model} type\n @param {String} id\n @param {DS.Snapshot} snapshot\n @return {Promise} promise\n */\n findRecord: null,\n\n /**\n The `findAll()` method is used to retrieve all records for a given type.\n Example\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.Adapter.extend({\n findAll: function(store, type, sinceToken) {\n var query = { since: sinceToken };\n return new Ember.RSVP.Promise(function(resolve, reject) {\n Ember.$.getJSON(`/${type.modelName}`, query).then(function(data) {\n resolve(data);\n }, function(jqXHR) {\n reject(jqXHR);\n });\n });\n }\n });\n ```\n @method findAll\n @param {DS.Store} store\n @param {DS.Model} type\n @param {String} sinceToken\n @param {DS.SnapshotRecordArray} snapshotRecordArray\n @return {Promise} promise\n */\n findAll: null,\n\n /**\n This method is called when you call `query` on the store.\n Example\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.Adapter.extend({\n query: function(store, type, query) {\n return new Ember.RSVP.Promise(function(resolve, reject) {\n Ember.$.getJSON(`/${type.modelName}`, query).then(function(data) {\n resolve(data);\n }, function(jqXHR) {\n reject(jqXHR);\n });\n });\n }\n });\n ```\n @method query\n @param {DS.Store} store\n @param {DS.Model} type\n @param {Object} query\n @param {DS.AdapterPopulatedRecordArray} recordArray\n @return {Promise} promise\n */\n query: null,\n\n /**\n The `queryRecord()` method is invoked when the store is asked for a single\n record through a query object.\n In response to `queryRecord()` being called, you should always fetch fresh\n data. Once found, you can asynchronously call the store's `push()` method\n to push the record into the store.\n Here is an example `queryRecord` implementation:\n Example\n ```app/adapters/application.js\n import DS from 'ember-data';\n import Ember from 'ember';\n export default DS.Adapter.extend(DS.BuildURLMixin, {\n queryRecord: function(store, type, query) {\n return new Ember.RSVP.Promise(function(resolve, reject) {\n Ember.$.getJSON(`/${type.modelName}`, query).then(function(data) {\n resolve(data);\n }, function(jqXHR) {\n reject(jqXHR);\n });\n });\n }\n });\n ```\n @method queryRecord\n @param {DS.Store} store\n @param {subclass of DS.Model} type\n @param {Object} query\n @return {Promise} promise\n */\n queryRecord: null,\n\n /**\n If the globally unique IDs for your records should be generated on the client,\n implement the `generateIdForRecord()` method. This method will be invoked\n each time you create a new record, and the value returned from it will be\n assigned to the record's `primaryKey`.\n Most traditional REST-like HTTP APIs will not use this method. Instead, the ID\n of the record will be set by the server, and your adapter will update the store\n with the new ID when it calls `didCreateRecord()`. Only implement this method if\n you intend to generate record IDs on the client-side.\n The `generateIdForRecord()` method will be invoked with the requesting store as\n the first parameter and the newly created record as the second parameter:\n ```javascript\n import DS from 'ember-data';\n import { v4 } from 'uuid';\n export default DS.Adapter.extend({\n generateIdForRecord: function(store, inputProperties) {\n return v4();\n }\n });\n ```\n @method generateIdForRecord\n @param {DS.Store} store\n @param {DS.Model} type the DS.Model class of the record\n @param {Object} inputProperties a hash of properties to set on the\n newly created record.\n @return {(String|Number)} id\n */\n generateIdForRecord: null,\n\n /**\n Proxies to the serializer's `serialize` method.\n Example\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.Adapter.extend({\n createRecord: function(store, type, snapshot) {\n var data = this.serialize(snapshot, { includeId: true });\n var url = `/${type.modelName}`;\n // ...\n }\n });\n ```\n @method serialize\n @param {DS.Snapshot} snapshot\n @param {Object} options\n @return {Object} serialized snapshot\n */\n serialize: function serialize(snapshot, options) {\n return get(snapshot.record, 'store').serializerFor(snapshot.modelName).serialize(snapshot, options);\n },\n\n /**\n Implement this method in a subclass to handle the creation of\n new records.\n Serializes the record and sends it to the server.\n Example\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.Adapter.extend({\n createRecord: function(store, type, snapshot) {\n var data = this.serialize(snapshot, { includeId: true });\n return new Ember.RSVP.Promise(function(resolve, reject) {\n Ember.$.ajax({\n type: 'POST',\n url: `/${type.modelName}`,\n dataType: 'json',\n data: data\n }).then(function(data) {\n Ember.run(null, resolve, data);\n }, function(jqXHR) {\n jqXHR.then = null; // tame jQuery's ill mannered promises\n Ember.run(null, reject, jqXHR);\n });\n });\n }\n });\n ```\n @method createRecord\n @param {DS.Store} store\n @param {DS.Model} type the DS.Model class of the record\n @param {DS.Snapshot} snapshot\n @return {Promise} promise\n */\n createRecord: null,\n\n /**\n Implement this method in a subclass to handle the updating of\n a record.\n Serializes the record update and sends it to the server.\n The updateRecord method is expected to return a promise that will\n resolve with the serialized record. This allows the backend to\n inform the Ember Data store the current state of this record after\n the update. If it is not possible to return a serialized record\n the updateRecord promise can also resolve with `undefined` and the\n Ember Data store will assume all of the updates were successfully\n applied on the backend.\n Example\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.Adapter.extend({\n updateRecord: function(store, type, snapshot) {\n var data = this.serialize(snapshot, { includeId: true });\n var id = snapshot.id;\n return new Ember.RSVP.Promise(function(resolve, reject) {\n Ember.$.ajax({\n type: 'PUT',\n url: `/${type.modelName}/${id}`,\n dataType: 'json',\n data: data\n }).then(function(data) {\n Ember.run(null, resolve, data);\n }, function(jqXHR) {\n jqXHR.then = null; // tame jQuery's ill mannered promises\n Ember.run(null, reject, jqXHR);\n });\n });\n }\n });\n ```\n @method updateRecord\n @param {DS.Store} store\n @param {DS.Model} type the DS.Model class of the record\n @param {DS.Snapshot} snapshot\n @return {Promise} promise\n */\n updateRecord: null,\n\n /**\n Implement this method in a subclass to handle the deletion of\n a record.\n Sends a delete request for the record to the server.\n Example\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.Adapter.extend({\n deleteRecord: function(store, type, snapshot) {\n var data = this.serialize(snapshot, { includeId: true });\n var id = snapshot.id;\n return new Ember.RSVP.Promise(function(resolve, reject) {\n Ember.$.ajax({\n type: 'DELETE',\n url: `/${type.modelName}/${id}`,\n dataType: 'json',\n data: data\n }).then(function(data) {\n Ember.run(null, resolve, data);\n }, function(jqXHR) {\n jqXHR.then = null; // tame jQuery's ill mannered promises\n Ember.run(null, reject, jqXHR);\n });\n });\n }\n });\n ```\n @method deleteRecord\n @param {DS.Store} store\n @param {DS.Model} type the DS.Model class of the record\n @param {DS.Snapshot} snapshot\n @return {Promise} promise\n */\n deleteRecord: null,\n\n /**\n By default the store will try to coalesce all `fetchRecord` calls within the same runloop\n into as few requests as possible by calling groupRecordsForFindMany and passing it into a findMany call.\n You can opt out of this behaviour by either not implementing the findMany hook or by setting\n coalesceFindRequests to false.\n @property coalesceFindRequests\n @type {boolean}\n */\n coalesceFindRequests: true,\n\n /**\n The store will call `findMany` instead of multiple `findRecord`\n requests to find multiple records at once if coalesceFindRequests\n is true.\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.Adapter.extend({\n findMany(store, type, ids, snapshots) {\n return new Ember.RSVP.Promise(function(resolve, reject) {\n Ember.$.ajax({\n type: 'GET',\n url: `/${type.modelName}/`,\n dataType: 'json',\n data: { filter: { id: ids.join(',') } }\n }).then(function(data) {\n Ember.run(null, resolve, data);\n }, function(jqXHR) {\n jqXHR.then = null; // tame jQuery's ill mannered promises\n Ember.run(null, reject, jqXHR);\n });\n });\n }\n });\n ```\n @method findMany\n @param {DS.Store} store\n @param {DS.Model} type the DS.Model class of the records\n @param {Array} ids\n @param {Array} snapshots\n @return {Promise} promise\n */\n findMany: null,\n\n /**\n Organize records into groups, each of which is to be passed to separate\n calls to `findMany`.\n For example, if your api has nested URLs that depend on the parent, you will\n want to group records by their parent.\n The default implementation returns the records as a single group.\n @method groupRecordsForFindMany\n @param {DS.Store} store\n @param {Array} snapshots\n @return {Array} an array of arrays of records, each of which is to be\n loaded separately by `findMany`.\n */\n groupRecordsForFindMany: function groupRecordsForFindMany(store, snapshots) {\n return [snapshots];\n },\n\n /**\n This method is used by the store to determine if the store should\n reload a record from the adapter when a record is requested by\n `store.findRecord`.\n If this method returns `true`, the store will re-fetch a record from\n the adapter. If this method returns `false`, the store will resolve\n immediately using the cached record.\n For example, if you are building an events ticketing system, in which users\n can only reserve tickets for 20 minutes at a time, and want to ensure that\n in each route you have data that is no more than 20 minutes old you could\n write:\n ```javascript\n shouldReloadRecord: function(store, ticketSnapshot) {\n var timeDiff = moment().diff(ticketSnapshot.attr('lastAccessedAt')).minutes();\n if (timeDiff > 20) {\n return true;\n } else {\n return false;\n }\n }\n ```\n This method would ensure that whenever you do `store.findRecord('ticket',\n id)` you will always get a ticket that is no more than 20 minutes old. In\n case the cached version is more than 20 minutes old, `findRecord` will not\n resolve until you fetched the latest version.\n By default this hook returns `false`, as most UIs should not block user\n interactions while waiting on data update.\n @since 1.13.0\n @method shouldReloadRecord\n @param {DS.Store} store\n @param {DS.Snapshot} snapshot\n @return {Boolean}\n */\n shouldReloadRecord: function shouldReloadRecord(store, snapshot) {\n return false;\n },\n\n /**\n This method is used by the store to determine if the store should\n reload all records from the adapter when records are requested by\n `store.findAll`.\n If this method returns `true`, the store will re-fetch all records from\n the adapter. If this method returns `false`, the store will resolve\n immediately using the cached records.\n For example, if you are building an events ticketing system, in which users\n can only reserve tickets for 20 minutes at a time, and want to ensure that\n in each route you have data that is no more than 20 minutes old you could\n write:\n ```javascript\n shouldReloadAll: function(store, snapshotArray) {\n var snapshots = snapshotArray.snapshots();\n return snapshots.any(function(ticketSnapshot) {\n var timeDiff = moment().diff(ticketSnapshot.attr('lastAccessedAt')).minutes();\n if (timeDiff > 20) {\n return true;\n } else {\n return false;\n }\n });\n }\n ```\n This method would ensure that whenever you do `store.findAll('ticket')` you\n will always get a list of tickets that are no more than 20 minutes old. In\n case a cached version is more than 20 minutes old, `findAll` will not\n resolve until you fetched the latest versions.\n By default this methods returns `true` if the passed `snapshotRecordArray`\n is empty (meaning that there are no records locally available yet),\n otherwise it returns `false`.\n @since 1.13.0\n @method shouldReloadAll\n @param {DS.Store} store\n @param {DS.SnapshotRecordArray} snapshotRecordArray\n @return {Boolean}\n */\n shouldReloadAll: function shouldReloadAll(store, snapshotRecordArray) {\n return !snapshotRecordArray.length;\n },\n\n /**\n This method is used by the store to determine if the store should\n reload a record after the `store.findRecord` method resolves a\n cached record.\n This method is *only* checked by the store when the store is\n returning a cached record.\n If this method returns `true` the store will re-fetch a record from\n the adapter.\n For example, if you do not want to fetch complex data over a mobile\n connection, or if the network is down, you can implement\n `shouldBackgroundReloadRecord` as follows:\n ```javascript\n shouldBackgroundReloadRecord: function(store, snapshot) {\n var connection = window.navigator.connection;\n if (connection === 'cellular' || connection === 'none') {\n return false;\n } else {\n return true;\n }\n }\n ```\n By default this hook returns `true` so the data for the record is updated\n in the background.\n @since 1.13.0\n @method shouldBackgroundReloadRecord\n @param {DS.Store} store\n @param {DS.Snapshot} snapshot\n @return {Boolean}\n */\n shouldBackgroundReloadRecord: function shouldBackgroundReloadRecord(store, snapshot) {\n return true;\n },\n\n /**\n This method is used by the store to determine if the store should\n reload a record array after the `store.findAll` method resolves\n with a cached record array.\n This method is *only* checked by the store when the store is\n returning a cached record array.\n If this method returns `true` the store will re-fetch all records\n from the adapter.\n For example, if you do not want to fetch complex data over a mobile\n connection, or if the network is down, you can implement\n `shouldBackgroundReloadAll` as follows:\n ```javascript\n shouldBackgroundReloadAll: function(store, snapshotArray) {\n var connection = window.navigator.connection;\n if (connection === 'cellular' || connection === 'none') {\n return false;\n } else {\n return true;\n }\n }\n ```\n By default this method returns `true`, indicating that a background reload\n should always be triggered.\n @since 1.13.0\n @method shouldBackgroundReloadAll\n @param {DS.Store} store\n @param {DS.SnapshotRecordArray} snapshotRecordArray\n @return {Boolean}\n */\n shouldBackgroundReloadAll: function shouldBackgroundReloadAll(store, snapshotRecordArray) {\n return true;\n }\n });\n});","define('ember-data/adapters/errors', ['exports', 'ember', 'ember-data/-private/debug', 'ember-data/-private/features'], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateFeatures) {\n 'use strict';\n\n exports.AdapterError = AdapterError;\n exports.errorsHashToArray = errorsHashToArray;\n exports.errorsArrayToHash = errorsArrayToHash;\n\n var EmberError = _ember['default'].Error;\n\n var SOURCE_POINTER_REGEXP = /^\\/?data\\/(attributes|relationships)\\/(.*)/;\n var SOURCE_POINTER_PRIMARY_REGEXP = /^\\/?data/;\n var PRIMARY_ATTRIBUTE_KEY = 'base';\n\n /**\n @class AdapterError\n @namespace DS\n */\n\n function AdapterError(errors) {\n var message = arguments.length <= 1 || arguments[1] === undefined ? 'Adapter operation failed' : arguments[1];\n\n this.isAdapterError = true;\n EmberError.call(this, message);\n\n this.errors = errors || [{\n title: 'Adapter Error',\n detail: message\n }];\n }\n\n var extendedErrorsEnabled = false;\n if (false) {\n extendedErrorsEnabled = true;\n }\n\n function extendFn(ErrorClass) {\n return function () {\n var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var defaultMessage = _ref.message;\n\n return extend(ErrorClass, defaultMessage);\n };\n }\n\n function extend(ParentErrorClass, defaultMessage) {\n var ErrorClass = function ErrorClass(errors, message) {\n (0, _emberDataPrivateDebug.assert)('`AdapterError` expects json-api formatted errors array.', Array.isArray(errors || []));\n ParentErrorClass.call(this, errors, message || defaultMessage);\n };\n ErrorClass.prototype = Object.create(ParentErrorClass.prototype);\n\n if (extendedErrorsEnabled) {\n ErrorClass.extend = extendFn(ErrorClass);\n }\n\n return ErrorClass;\n }\n\n AdapterError.prototype = Object.create(EmberError.prototype);\n\n if (extendedErrorsEnabled) {\n AdapterError.extend = extendFn(AdapterError);\n }\n\n /**\n A `DS.InvalidError` is used by an adapter to signal the external API\n was unable to process a request because the content was not\n semantically correct or meaningful per the API. Usually this means a\n record failed some form of server side validation. When a promise\n from an adapter is rejected with a `DS.InvalidError` the record will\n transition to the `invalid` state and the errors will be set to the\n `errors` property on the record.\n \n For Ember Data to correctly map errors to their corresponding\n properties on the model, Ember Data expects each error to be\n a valid json-api error object with a `source/pointer` that matches\n the property name. For example if you had a Post model that\n looked like this.\n \n ```app/models/post.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n title: DS.attr('string'),\n content: DS.attr('string')\n });\n ```\n \n To show an error from the server related to the `title` and\n `content` properties your adapter could return a promise that\n rejects with a `DS.InvalidError` object that looks like this:\n \n ```app/adapters/post.js\n import Ember from 'ember';\n import DS from 'ember-data';\n \n export default DS.RESTAdapter.extend({\n updateRecord: function() {\n // Fictional adapter that always rejects\n return Ember.RSVP.reject(new DS.InvalidError([\n {\n detail: 'Must be unique',\n source: { pointer: '/data/attributes/title' }\n },\n {\n detail: 'Must not be blank',\n source: { pointer: '/data/attributes/content'}\n }\n ]));\n }\n });\n ```\n \n Your backend may use different property names for your records the\n store will attempt extract and normalize the errors using the\n serializer's `extractErrors` method before the errors get added to\n the the model. As a result, it is safe for the `InvalidError` to\n wrap the error payload unaltered.\n \n @class InvalidError\n @namespace DS\n */\n var InvalidError = extend(AdapterError, 'The adapter rejected the commit because it was invalid');\n\n exports.InvalidError = InvalidError;\n\n /**\n @class TimeoutError\n @namespace DS\n */\n var TimeoutError = extend(AdapterError, 'The adapter operation timed out');\n\n exports.TimeoutError = TimeoutError;\n\n /**\n @class AbortError\n @namespace DS\n */\n var AbortError = extend(AdapterError, 'The adapter operation was aborted');\n\n exports.AbortError = AbortError;\n\n /**\n @class UnauthorizedError\n @namespace DS\n */\n var UnauthorizedError = extendedErrorsEnabled ? extend(AdapterError, 'The adapter operation is unauthorized') : null;\n\n exports.UnauthorizedError = UnauthorizedError;\n\n /**\n @class ForbiddenError\n @namespace DS\n */\n var ForbiddenError = extendedErrorsEnabled ? extend(AdapterError, 'The adapter operation is forbidden') : null;\n\n exports.ForbiddenError = ForbiddenError;\n\n /**\n @class NotFoundError\n @namespace DS\n */\n var NotFoundError = extendedErrorsEnabled ? extend(AdapterError, 'The adapter could not find the resource') : null;\n\n exports.NotFoundError = NotFoundError;\n\n /**\n @class ConflictError\n @namespace DS\n */\n var ConflictError = extendedErrorsEnabled ? extend(AdapterError, 'The adapter operation failed due to a conflict') : null;\n\n exports.ConflictError = ConflictError;\n\n /**\n @class ServerError\n @namespace DS\n */\n var ServerError = extendedErrorsEnabled ? extend(AdapterError, 'The adapter operation failed due to a server error') : null;\n\n exports.ServerError = ServerError;\n\n /**\n @method errorsHashToArray\n @private\n */\n\n function errorsHashToArray(errors) {\n var out = [];\n\n if (_ember['default'].isPresent(errors)) {\n Object.keys(errors).forEach(function (key) {\n var messages = _ember['default'].makeArray(errors[key]);\n for (var i = 0; i < messages.length; i++) {\n var title = 'Invalid Attribute';\n var pointer = '/data/attributes/' + key;\n if (key === PRIMARY_ATTRIBUTE_KEY) {\n title = 'Invalid Document';\n pointer = '/data';\n }\n out.push({\n title: title,\n detail: messages[i],\n source: {\n pointer: pointer\n }\n });\n }\n });\n }\n\n return out;\n }\n\n /**\n @method errorsArrayToHash\n @private\n */\n\n function errorsArrayToHash(errors) {\n var out = {};\n\n if (_ember['default'].isPresent(errors)) {\n errors.forEach(function (error) {\n if (error.source && error.source.pointer) {\n var key = error.source.pointer.match(SOURCE_POINTER_REGEXP);\n\n if (key) {\n key = key[2];\n } else if (error.source.pointer.search(SOURCE_POINTER_PRIMARY_REGEXP) !== -1) {\n key = PRIMARY_ATTRIBUTE_KEY;\n }\n\n if (key) {\n out[key] = out[key] || [];\n out[key].push(error.detail || error.title);\n }\n }\n });\n }\n\n return out;\n }\n});","define('ember-data/adapters/json-api', ['exports', 'ember', 'ember-data/adapters/rest', 'ember-data/-private/features', 'ember-data/-private/debug'], function (exports, _ember, _emberDataAdaptersRest, _emberDataPrivateFeatures, _emberDataPrivateDebug) {\n /**\n @module ember-data\n */\n\n 'use strict';\n\n /**\n @since 1.13.0\n @class JSONAPIAdapter\n @constructor\n @namespace DS\n @extends DS.RESTAdapter\n */\n var JSONAPIAdapter = _emberDataAdaptersRest['default'].extend({\n defaultSerializer: '-json-api',\n\n /**\n @method ajaxOptions\n @private\n @param {String} url\n @param {String} type The request type GET, POST, PUT, DELETE etc.\n @param {Object} options\n @return {Object}\n */\n ajaxOptions: function ajaxOptions(url, type, options) {\n var hash = this._super.apply(this, arguments);\n\n if (hash.contentType) {\n hash.contentType = 'application/vnd.api+json';\n }\n\n var beforeSend = hash.beforeSend;\n hash.beforeSend = function (xhr) {\n xhr.setRequestHeader('Accept', 'application/vnd.api+json');\n if (beforeSend) {\n beforeSend(xhr);\n }\n };\n\n return hash;\n },\n\n /**\n By default the JSONAPIAdapter will send each find request coming from a `store.find`\n or from accessing a relationship separately to the server. If your server supports passing\n ids as a query string, you can set coalesceFindRequests to true to coalesce all find requests\n within a single runloop.\n For example, if you have an initial payload of:\n ```javascript\n {\n post: {\n id: 1,\n comments: [1, 2]\n }\n }\n ```\n By default calling `post.get('comments')` will trigger the following requests(assuming the\n comments haven't been loaded before):\n ```\n GET /comments/1\n GET /comments/2\n ```\n If you set coalesceFindRequests to `true` it will instead trigger the following request:\n ```\n GET /comments?filter[id]=1,2\n ```\n Setting coalesceFindRequests to `true` also works for `store.find` requests and `belongsTo`\n relationships accessed within the same runloop. If you set `coalesceFindRequests: true`\n ```javascript\n store.findRecord('comment', 1);\n store.findRecord('comment', 2);\n ```\n will also send a request to: `GET /comments?filter[id]=1,2`\n Note: Requests coalescing rely on URL building strategy. So if you override `buildURL` in your app\n `groupRecordsForFindMany` more likely should be overridden as well in order for coalescing to work.\n @property coalesceFindRequests\n @type {boolean}\n */\n coalesceFindRequests: false,\n\n /**\n @method findMany\n @param {DS.Store} store\n @param {DS.Model} type\n @param {Array} ids\n @param {Array} snapshots\n @return {Promise} promise\n */\n findMany: function findMany(store, type, ids, snapshots) {\n if (false && !this._hasCustomizedAjax()) {\n return this._super.apply(this, arguments);\n } else {\n var url = this.buildURL(type.modelName, ids, snapshots, 'findMany');\n return this.ajax(url, 'GET', { data: { filter: { id: ids.join(',') } } });\n }\n },\n\n /**\n @method pathForType\n @param {String} modelName\n @return {String} path\n **/\n pathForType: function pathForType(modelName) {\n var dasherized = _ember['default'].String.dasherize(modelName);\n return _ember['default'].String.pluralize(dasherized);\n },\n\n // TODO: Remove this once we have a better way to override HTTP verbs.\n /**\n @method updateRecord\n @param {DS.Store} store\n @param {DS.Model} type\n @param {DS.Snapshot} snapshot\n @return {Promise} promise\n */\n updateRecord: function updateRecord(store, type, snapshot) {\n if (false && !this._hasCustomizedAjax()) {\n return this._super.apply(this, arguments);\n } else {\n var data = {};\n var serializer = store.serializerFor(type.modelName);\n\n serializer.serializeIntoHash(data, type, snapshot, { includeId: true });\n\n var id = snapshot.id;\n var url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');\n\n return this.ajax(url, 'PATCH', { data: data });\n }\n },\n\n _hasCustomizedAjax: function _hasCustomizedAjax() {\n if (this.ajax !== JSONAPIAdapter.prototype.ajax) {\n (0, _emberDataPrivateDebug.deprecate)('JSONAPIAdapter#ajax has been deprecated please use. `methodForRequest`, `urlForRequest`, `headersForRequest` or `dataForRequest` instead.', false, {\n id: 'ds.json-api-adapter.ajax',\n until: '3.0.0'\n });\n return true;\n }\n\n if (this.ajaxOptions !== JSONAPIAdapter.prototype.ajaxOptions) {\n (0, _emberDataPrivateDebug.deprecate)('JSONAPIAdapterr#ajaxOptions has been deprecated please use. `methodForRequest`, `urlForRequest`, `headersForRequest` or `dataForRequest` instead.', false, {\n id: 'ds.json-api-adapter.ajax-options',\n until: '3.0.0'\n });\n return true;\n }\n\n return false;\n }\n });\n\n if (false) {\n\n JSONAPIAdapter.reopen({\n\n methodForRequest: function methodForRequest(params) {\n if (params.requestType === 'updateRecord') {\n return 'PATCH';\n }\n\n return this._super.apply(this, arguments);\n },\n\n dataForRequest: function dataForRequest(params) {\n var requestType = params.requestType;\n var ids = params.ids;\n\n if (requestType === 'findMany') {\n return {\n filter: { id: ids.join(',') }\n };\n }\n\n if (requestType === 'updateRecord') {\n var store = params.store;\n var type = params.type;\n var snapshot = params.snapshot;\n\n var data = {};\n var serializer = store.serializerFor(type.modelName);\n\n serializer.serializeIntoHash(data, type, snapshot, { includeId: true });\n\n return data;\n }\n\n return this._super.apply(this, arguments);\n },\n\n headersForRequest: function headersForRequest() {\n var headers = this._super.apply(this, arguments) || {};\n\n headers['Accept'] = 'application/vnd.api+json';\n\n return headers;\n },\n\n _requestToJQueryAjaxHash: function _requestToJQueryAjaxHash() {\n var hash = this._super.apply(this, arguments);\n\n if (hash.contentType) {\n hash.contentType = 'application/vnd.api+json';\n }\n\n return hash;\n }\n\n });\n }\n\n exports['default'] = JSONAPIAdapter;\n});","define('ember-data/adapters/rest', ['exports', 'ember', 'ember-data/adapter', 'ember-data/adapters/errors', 'ember-data/-private/adapters/build-url-mixin', 'ember-data/-private/features', 'ember-data/-private/debug', 'ember-data/-private/utils/parse-response-headers'], function (exports, _ember, _emberDataAdapter, _emberDataAdaptersErrors, _emberDataPrivateAdaptersBuildUrlMixin, _emberDataPrivateFeatures, _emberDataPrivateDebug, _emberDataPrivateUtilsParseResponseHeaders) {\n /**\n @module ember-data\n */\n\n 'use strict';\n\n var MapWithDefault = _ember['default'].MapWithDefault;\n var get = _ember['default'].get;\n\n var Promise = _ember['default'].RSVP.Promise;\n\n /**\n The REST adapter allows your store to communicate with an HTTP server by\n transmitting JSON via XHR. Most Ember.js apps that consume a JSON API\n should use the REST adapter.\n \n This adapter is designed around the idea that the JSON exchanged with\n the server should be conventional.\n \n ## Success and failure\n \n The REST adapter will consider a success any response with a status code\n of the 2xx family (\"Success\"), as well as 304 (\"Not Modified\"). Any other\n status code will be considered a failure.\n \n On success, the request promise will be resolved with the full response\n payload.\n \n Failed responses with status code 422 (\"Unprocessable Entity\") will be\n considered \"invalid\". The response will be discarded, except for the\n `errors` key. The request promise will be rejected with a `DS.InvalidError`.\n This error object will encapsulate the saved `errors` value.\n \n Any other status codes will be treated as an \"adapter error\". The request\n promise will be rejected, similarly to the \"invalid\" case, but with\n an instance of `DS.AdapterError` instead.\n \n ## JSON Structure\n \n The REST adapter expects the JSON returned from your server to follow\n these conventions.\n \n ### Object Root\n \n The JSON payload should be an object that contains the record inside a\n root property. For example, in response to a `GET` request for\n `/posts/1`, the JSON should look like this:\n \n ```js\n {\n \"post\": {\n \"id\": 1,\n \"title\": \"I'm Running to Reform the W3C's Tag\",\n \"author\": \"Yehuda Katz\"\n }\n }\n ```\n \n Similarly, in response to a `GET` request for `/posts`, the JSON should\n look like this:\n \n ```js\n {\n \"posts\": [\n {\n \"id\": 1,\n \"title\": \"I'm Running to Reform the W3C's Tag\",\n \"author\": \"Yehuda Katz\"\n },\n {\n \"id\": 2,\n \"title\": \"Rails is omakase\",\n \"author\": \"D2H\"\n }\n ]\n }\n ```\n \n Note that the object root can be pluralized for both a single-object response\n and an array response: the REST adapter is not strict on this. Further, if the\n HTTP server responds to a `GET` request to `/posts/1` (e.g. the response to a\n `findRecord` query) with more than one object in the array, Ember Data will\n only display the object with the matching ID.\n \n ### Conventional Names\n \n Attribute names in your JSON payload should be the camelCased versions of\n the attributes in your Ember.js models.\n \n For example, if you have a `Person` model:\n \n ```app/models/person.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n firstName: DS.attr('string'),\n lastName: DS.attr('string'),\n occupation: DS.attr('string')\n });\n ```\n \n The JSON returned should look like this:\n \n ```js\n {\n \"person\": {\n \"id\": 5,\n \"firstName\": \"Barack\",\n \"lastName\": \"Obama\",\n \"occupation\": \"President\"\n }\n }\n ```\n \n ### Errors\n \n If a response is considered a failure, the JSON payload is expected to include\n a top-level key `errors`, detailing any specific issues. For example:\n \n ```js\n {\n \"errors\": {\n \"msg\": \"Something went wrong\"\n }\n }\n ```\n \n This adapter does not make any assumptions as to the format of the `errors`\n object. It will simply be passed along as is, wrapped in an instance\n of `DS.InvalidError` or `DS.AdapterError`. The serializer can interpret it\n afterwards.\n \n ## Customization\n \n ### Endpoint path customization\n \n Endpoint paths can be prefixed with a `namespace` by setting the namespace\n property on the adapter:\n \n ```app/adapters/application.js\n import DS from 'ember-data';\n \n export default DS.RESTAdapter.extend({\n namespace: 'api/1'\n });\n ```\n Requests for the `Person` model would now target `/api/1/people/1`.\n \n ### Host customization\n \n An adapter can target other hosts by setting the `host` property.\n \n ```app/adapters/application.js\n import DS from 'ember-data';\n \n export default DS.RESTAdapter.extend({\n host: 'https://api.example.com'\n });\n ```\n \n ### Headers customization\n \n Some APIs require HTTP headers, e.g. to provide an API key. Arbitrary\n headers can be set as key/value pairs on the `RESTAdapter`'s `headers`\n object and Ember Data will send them along with each ajax request.\n \n \n ```app/adapters/application.js\n import DS from 'ember-data';\n \n export default DS.RESTAdapter.extend({\n headers: {\n \"API_KEY\": \"secret key\",\n \"ANOTHER_HEADER\": \"Some header value\"\n }\n });\n ```\n \n `headers` can also be used as a computed property to support dynamic\n headers. In the example below, the `session` object has been\n injected into an adapter by Ember's container.\n \n ```app/adapters/application.js\n import DS from 'ember-data';\n \n export default DS.RESTAdapter.extend({\n headers: Ember.computed('session.authToken', function() {\n return {\n \"API_KEY\": this.get(\"session.authToken\"),\n \"ANOTHER_HEADER\": \"Some header value\"\n };\n })\n });\n ```\n \n In some cases, your dynamic headers may require data from some\n object outside of Ember's observer system (for example\n `document.cookie`). You can use the\n [volatile](/api/classes/Ember.ComputedProperty.html#method_volatile)\n function to set the property into a non-cached mode causing the headers to\n be recomputed with every request.\n \n ```app/adapters/application.js\n import DS from 'ember-data';\n \n export default DS.RESTAdapter.extend({\n headers: Ember.computed(function() {\n return {\n \"API_KEY\": Ember.get(document.cookie.match(/apiKey\\=([^;]*)/), \"1\"),\n \"ANOTHER_HEADER\": \"Some header value\"\n };\n }).volatile()\n });\n ```\n \n @class RESTAdapter\n @constructor\n @namespace DS\n @extends DS.Adapter\n @uses DS.BuildURLMixin\n */\n var RESTAdapter = _emberDataAdapter['default'].extend(_emberDataPrivateAdaptersBuildUrlMixin['default'], {\n defaultSerializer: '-rest',\n\n /**\n By default, the RESTAdapter will send the query params sorted alphabetically to the\n server.\n For example:\n ```js\n store.query('posts', { sort: 'price', category: 'pets' });\n ```\n will generate a requests like this `/posts?category=pets&sort=price`, even if the\n parameters were specified in a different order.\n That way the generated URL will be deterministic and that simplifies caching mechanisms\n in the backend.\n Setting `sortQueryParams` to a falsey value will respect the original order.\n In case you want to sort the query parameters with a different criteria, set\n `sortQueryParams` to your custom sort function.\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.RESTAdapter.extend({\n sortQueryParams: function(params) {\n var sortedKeys = Object.keys(params).sort().reverse();\n var len = sortedKeys.length, newParams = {};\n for (var i = 0; i < len; i++) {\n newParams[sortedKeys[i]] = params[sortedKeys[i]];\n }\n return newParams;\n }\n });\n ```\n @method sortQueryParams\n @param {Object} obj\n @return {Object}\n */\n sortQueryParams: function sortQueryParams(obj) {\n var keys = Object.keys(obj);\n var len = keys.length;\n if (len < 2) {\n return obj;\n }\n var newQueryParams = {};\n var sortedKeys = keys.sort();\n\n for (var i = 0; i < len; i++) {\n newQueryParams[sortedKeys[i]] = obj[sortedKeys[i]];\n }\n return newQueryParams;\n },\n\n /**\n By default the RESTAdapter will send each find request coming from a `store.find`\n or from accessing a relationship separately to the server. If your server supports passing\n ids as a query string, you can set coalesceFindRequests to true to coalesce all find requests\n within a single runloop.\n For example, if you have an initial payload of:\n ```javascript\n {\n post: {\n id: 1,\n comments: [1, 2]\n }\n }\n ```\n By default calling `post.get('comments')` will trigger the following requests(assuming the\n comments haven't been loaded before):\n ```\n GET /comments/1\n GET /comments/2\n ```\n If you set coalesceFindRequests to `true` it will instead trigger the following request:\n ```\n GET /comments?ids[]=1&ids[]=2\n ```\n Setting coalesceFindRequests to `true` also works for `store.find` requests and `belongsTo`\n relationships accessed within the same runloop. If you set `coalesceFindRequests: true`\n ```javascript\n store.findRecord('comment', 1);\n store.findRecord('comment', 2);\n ```\n will also send a request to: `GET /comments?ids[]=1&ids[]=2`\n Note: Requests coalescing rely on URL building strategy. So if you override `buildURL` in your app\n `groupRecordsForFindMany` more likely should be overridden as well in order for coalescing to work.\n @property coalesceFindRequests\n @type {boolean}\n */\n coalesceFindRequests: false,\n\n /**\n Endpoint paths can be prefixed with a `namespace` by setting the namespace\n property on the adapter:\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.RESTAdapter.extend({\n namespace: 'api/1'\n });\n ```\n Requests for the `Post` model would now target `/api/1/post/`.\n @property namespace\n @type {String}\n */\n\n /**\n An adapter can target other hosts by setting the `host` property.\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.RESTAdapter.extend({\n host: 'https://api.example.com'\n });\n ```\n Requests for the `Post` model would now target `https://api.example.com/post/`.\n @property host\n @type {String}\n */\n\n /**\n Some APIs require HTTP headers, e.g. to provide an API\n key. Arbitrary headers can be set as key/value pairs on the\n `RESTAdapter`'s `headers` object and Ember Data will send them\n along with each ajax request. For dynamic headers see [headers\n customization](/api/data/classes/DS.RESTAdapter.html#toc_headers-customization).\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.RESTAdapter.extend({\n headers: {\n \"API_KEY\": \"secret key\",\n \"ANOTHER_HEADER\": \"Some header value\"\n }\n });\n ```\n @property headers\n @type {Object}\n */\n\n /**\n Called by the store in order to fetch the JSON for a given\n type and ID.\n The `findRecord` method makes an Ajax request to a URL computed by\n `buildURL`, and returns a promise for the resulting payload.\n This method performs an HTTP `GET` request with the id provided as part of the query string.\n @since 1.13.0\n @method findRecord\n @param {DS.Store} store\n @param {DS.Model} type\n @param {String} id\n @param {DS.Snapshot} snapshot\n @return {Promise} promise\n */\n findRecord: function findRecord(store, type, id, snapshot) {\n if (false && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store: store, type: type, id: id, snapshot: snapshot,\n requestType: 'findRecord'\n });\n\n return this._makeRequest(request);\n } else {\n var url = this.buildURL(type.modelName, id, snapshot, 'findRecord');\n var query = this.buildQuery(snapshot);\n\n return this.ajax(url, 'GET', { data: query });\n }\n },\n\n /**\n Called by the store in order to fetch a JSON array for all\n of the records for a given type.\n The `findAll` method makes an Ajax (HTTP GET) request to a URL computed by `buildURL`, and returns a\n promise for the resulting payload.\n @method findAll\n @param {DS.Store} store\n @param {DS.Model} type\n @param {String} sinceToken\n @param {DS.SnapshotRecordArray} snapshotRecordArray\n @return {Promise} promise\n */\n findAll: function findAll(store, type, sinceToken, snapshotRecordArray) {\n var query = this.buildQuery(snapshotRecordArray);\n\n if (false && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store: store, type: type, sinceToken: sinceToken, query: query,\n snapshots: snapshotRecordArray,\n requestType: 'findAll'\n });\n\n return this._makeRequest(request);\n } else {\n var url = this.buildURL(type.modelName, null, snapshotRecordArray, 'findAll');\n\n if (sinceToken) {\n query.since = sinceToken;\n }\n\n return this.ajax(url, 'GET', { data: query });\n }\n },\n\n /**\n Called by the store in order to fetch a JSON array for\n the records that match a particular query.\n The `query` method makes an Ajax (HTTP GET) request to a URL\n computed by `buildURL`, and returns a promise for the resulting\n payload.\n The `query` argument is a simple JavaScript object that will be passed directly\n to the server as parameters.\n @method query\n @param {DS.Store} store\n @param {DS.Model} type\n @param {Object} query\n @return {Promise} promise\n */\n query: function query(store, type, _query) {\n if (false && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store: store, type: type, query: _query,\n requestType: 'query'\n });\n\n return this._makeRequest(request);\n } else {\n var url = this.buildURL(type.modelName, null, null, 'query', _query);\n\n if (this.sortQueryParams) {\n _query = this.sortQueryParams(_query);\n }\n\n return this.ajax(url, 'GET', { data: _query });\n }\n },\n\n /**\n Called by the store in order to fetch a JSON object for\n the record that matches a particular query.\n The `queryRecord` method makes an Ajax (HTTP GET) request to a URL\n computed by `buildURL`, and returns a promise for the resulting\n payload.\n The `query` argument is a simple JavaScript object that will be passed directly\n to the server as parameters.\n @since 1.13.0\n @method queryRecord\n @param {DS.Store} store\n @param {DS.Model} type\n @param {Object} query\n @return {Promise} promise\n */\n queryRecord: function queryRecord(store, type, query) {\n if (false && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store: store, type: type, query: query,\n requestType: 'queryRecord'\n });\n\n return this._makeRequest(request);\n } else {\n var url = this.buildURL(type.modelName, null, null, 'queryRecord', query);\n\n if (this.sortQueryParams) {\n query = this.sortQueryParams(query);\n }\n\n return this.ajax(url, 'GET', { data: query });\n }\n },\n\n /**\n Called by the store in order to fetch several records together if `coalesceFindRequests` is true\n For example, if the original payload looks like:\n ```js\n {\n \"id\": 1,\n \"title\": \"Rails is omakase\",\n \"comments\": [ 1, 2, 3 ]\n }\n ```\n The IDs will be passed as a URL-encoded Array of IDs, in this form:\n ```\n ids[]=1&ids[]=2&ids[]=3\n ```\n Many servers, such as Rails and PHP, will automatically convert this URL-encoded array\n into an Array for you on the server-side. If you want to encode the\n IDs, differently, just override this (one-line) method.\n The `findMany` method makes an Ajax (HTTP GET) request to a URL computed by `buildURL`, and returns a\n promise for the resulting payload.\n @method findMany\n @param {DS.Store} store\n @param {DS.Model} type\n @param {Array} ids\n @param {Array} snapshots\n @return {Promise} promise\n */\n findMany: function findMany(store, type, ids, snapshots) {\n if (false && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store: store, type: type, ids: ids, snapshots: snapshots,\n requestType: 'findMany'\n });\n\n return this._makeRequest(request);\n } else {\n var url = this.buildURL(type.modelName, ids, snapshots, 'findMany');\n return this.ajax(url, 'GET', { data: { ids: ids } });\n }\n },\n\n /**\n Called by the store in order to fetch a JSON array for\n the unloaded records in a has-many relationship that were originally\n specified as a URL (inside of `links`).\n For example, if your original payload looks like this:\n ```js\n {\n \"post\": {\n \"id\": 1,\n \"title\": \"Rails is omakase\",\n \"links\": { \"comments\": \"/posts/1/comments\" }\n }\n }\n ```\n This method will be called with the parent record and `/posts/1/comments`.\n The `findHasMany` method will make an Ajax (HTTP GET) request to the originally specified URL.\n The format of your `links` value will influence the final request URL via the `urlPrefix` method:\n * Links beginning with `//`, `http://`, `https://`, will be used as is, with no further manipulation.\n * Links beginning with a single `/` will have the current adapter's `host` value prepended to it.\n * Links with no beginning `/` will have a parentURL prepended to it, via the current adapter's `buildURL`.\n @method findHasMany\n @param {DS.Store} store\n @param {DS.Snapshot} snapshot\n @param {String} url\n @return {Promise} promise\n */\n findHasMany: function findHasMany(store, snapshot, url, relationship) {\n if (false && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store: store, snapshot: snapshot, url: url, relationship: relationship,\n requestType: 'findHasMany'\n });\n\n return this._makeRequest(request);\n } else {\n var id = snapshot.id;\n var type = snapshot.modelName;\n\n url = this.urlPrefix(url, this.buildURL(type, id, snapshot, 'findHasMany'));\n\n return this.ajax(url, 'GET');\n }\n },\n\n /**\n Called by the store in order to fetch the JSON for the unloaded record in a\n belongs-to relationship that was originally specified as a URL (inside of\n `links`).\n For example, if your original payload looks like this:\n ```js\n {\n \"person\": {\n \"id\": 1,\n \"name\": \"Tom Dale\",\n \"links\": { \"group\": \"/people/1/group\" }\n }\n }\n ```\n This method will be called with the parent record and `/people/1/group`.\n The `findBelongsTo` method will make an Ajax (HTTP GET) request to the originally specified URL.\n The format of your `links` value will influence the final request URL via the `urlPrefix` method:\n * Links beginning with `//`, `http://`, `https://`, will be used as is, with no further manipulation.\n * Links beginning with a single `/` will have the current adapter's `host` value prepended to it.\n * Links with no beginning `/` will have a parentURL prepended to it, via the current adapter's `buildURL`.\n @method findBelongsTo\n @param {DS.Store} store\n @param {DS.Snapshot} snapshot\n @param {String} url\n @return {Promise} promise\n */\n findBelongsTo: function findBelongsTo(store, snapshot, url, relationship) {\n if (false && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store: store, snapshot: snapshot, url: url, relationship: relationship,\n requestType: 'findBelongsTo'\n });\n\n return this._makeRequest(request);\n } else {\n var id = snapshot.id;\n var type = snapshot.modelName;\n\n url = this.urlPrefix(url, this.buildURL(type, id, snapshot, 'findBelongsTo'));\n return this.ajax(url, 'GET');\n }\n },\n\n /**\n Called by the store when a newly created record is\n saved via the `save` method on a model record instance.\n The `createRecord` method serializes the record and makes an Ajax (HTTP POST) request\n to a URL computed by `buildURL`.\n See `serialize` for information on how to customize the serialized form\n of a record.\n @method createRecord\n @param {DS.Store} store\n @param {DS.Model} type\n @param {DS.Snapshot} snapshot\n @return {Promise} promise\n */\n createRecord: function createRecord(store, type, snapshot) {\n if (false && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store: store, type: type, snapshot: snapshot,\n requestType: 'createRecord'\n });\n\n return this._makeRequest(request);\n } else {\n var data = {};\n var serializer = store.serializerFor(type.modelName);\n var url = this.buildURL(type.modelName, null, snapshot, 'createRecord');\n\n serializer.serializeIntoHash(data, type, snapshot, { includeId: true });\n\n return this.ajax(url, \"POST\", { data: data });\n }\n },\n\n /**\n Called by the store when an existing record is saved\n via the `save` method on a model record instance.\n The `updateRecord` method serializes the record and makes an Ajax (HTTP PUT) request\n to a URL computed by `buildURL`.\n See `serialize` for information on how to customize the serialized form\n of a record.\n @method updateRecord\n @param {DS.Store} store\n @param {DS.Model} type\n @param {DS.Snapshot} snapshot\n @return {Promise} promise\n */\n updateRecord: function updateRecord(store, type, snapshot) {\n if (false && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store: store, type: type, snapshot: snapshot,\n requestType: 'updateRecord'\n });\n\n return this._makeRequest(request);\n } else {\n var data = {};\n var serializer = store.serializerFor(type.modelName);\n\n serializer.serializeIntoHash(data, type, snapshot);\n\n var id = snapshot.id;\n var url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');\n\n return this.ajax(url, \"PUT\", { data: data });\n }\n },\n\n /**\n Called by the store when a record is deleted.\n The `deleteRecord` method makes an Ajax (HTTP DELETE) request to a URL computed by `buildURL`.\n @method deleteRecord\n @param {DS.Store} store\n @param {DS.Model} type\n @param {DS.Snapshot} snapshot\n @return {Promise} promise\n */\n deleteRecord: function deleteRecord(store, type, snapshot) {\n if (false && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store: store, type: type, snapshot: snapshot,\n requestType: 'deleteRecord'\n });\n\n return this._makeRequest(request);\n } else {\n var id = snapshot.id;\n\n return this.ajax(this.buildURL(type.modelName, id, snapshot, 'deleteRecord'), \"DELETE\");\n }\n },\n\n _stripIDFromURL: function _stripIDFromURL(store, snapshot) {\n var url = this.buildURL(snapshot.modelName, snapshot.id, snapshot);\n\n var expandedURL = url.split('/');\n // Case when the url is of the format ...something/:id\n // We are decodeURIComponent-ing the lastSegment because if it represents\n // the id, it has been encodeURIComponent-ified within `buildURL`. If we\n // don't do this, then records with id having special characters are not\n // coalesced correctly (see GH #4190 for the reported bug)\n var lastSegment = expandedURL[expandedURL.length - 1];\n var id = snapshot.id;\n if (decodeURIComponent(lastSegment) === id) {\n expandedURL[expandedURL.length - 1] = \"\";\n } else if (endsWith(lastSegment, '?id=' + id)) {\n //Case when the url is of the format ...something?id=:id\n expandedURL[expandedURL.length - 1] = lastSegment.substring(0, lastSegment.length - id.length - 1);\n }\n\n return expandedURL.join('/');\n },\n\n // http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers\n maxURLLength: 2048,\n\n /**\n Organize records into groups, each of which is to be passed to separate\n calls to `findMany`.\n This implementation groups together records that have the same base URL but\n differing ids. For example `/comments/1` and `/comments/2` will be grouped together\n because we know findMany can coalesce them together as `/comments?ids[]=1&ids[]=2`\n It also supports urls where ids are passed as a query param, such as `/comments?id=1`\n but not those where there is more than 1 query param such as `/comments?id=2&name=David`\n Currently only the query param of `id` is supported. If you need to support others, please\n override this or the `_stripIDFromURL` method.\n It does not group records that have differing base urls, such as for example: `/posts/1/comments/2`\n and `/posts/2/comments/3`\n @method groupRecordsForFindMany\n @param {DS.Store} store\n @param {Array} snapshots\n @return {Array} an array of arrays of records, each of which is to be\n loaded separately by `findMany`.\n */\n groupRecordsForFindMany: function groupRecordsForFindMany(store, snapshots) {\n var groups = MapWithDefault.create({ defaultValue: function defaultValue() {\n return [];\n } });\n var adapter = this;\n var maxURLLength = this.maxURLLength;\n\n snapshots.forEach(function (snapshot) {\n var baseUrl = adapter._stripIDFromURL(store, snapshot);\n groups.get(baseUrl).push(snapshot);\n });\n\n function splitGroupToFitInUrl(group, maxURLLength, paramNameLength) {\n var baseUrl = adapter._stripIDFromURL(store, group[0]);\n var idsSize = 0;\n var splitGroups = [[]];\n\n group.forEach(function (snapshot) {\n var additionalLength = encodeURIComponent(snapshot.id).length + paramNameLength;\n if (baseUrl.length + idsSize + additionalLength >= maxURLLength) {\n idsSize = 0;\n splitGroups.push([]);\n }\n\n idsSize += additionalLength;\n\n var lastGroupIndex = splitGroups.length - 1;\n splitGroups[lastGroupIndex].push(snapshot);\n });\n\n return splitGroups;\n }\n\n var groupsArray = [];\n groups.forEach(function (group, key) {\n var paramNameLength = '&ids%5B%5D='.length;\n var splitGroups = splitGroupToFitInUrl(group, maxURLLength, paramNameLength);\n\n splitGroups.forEach(function (splitGroup) {\n return groupsArray.push(splitGroup);\n });\n });\n\n return groupsArray;\n },\n\n /**\n Takes an ajax response, and returns the json payload or an error.\n By default this hook just returns the json payload passed to it.\n You might want to override it in two cases:\n 1. Your API might return useful results in the response headers.\n Response headers are passed in as the second argument.\n 2. Your API might return errors as successful responses with status code\n 200 and an Errors text or object. You can return a `DS.InvalidError` or a\n `DS.AdapterError` (or a sub class) from this hook and it will automatically\n reject the promise and put your record into the invalid or error state.\n Returning a `DS.InvalidError` from this method will cause the\n record to transition into the `invalid` state and make the\n `errors` object available on the record. When returning an\n `DS.InvalidError` the store will attempt to normalize the error data\n returned from the server using the serializer's `extractErrors`\n method.\n @since 1.13.0\n @method handleResponse\n @param {Number} status\n @param {Object} headers\n @param {Object} payload\n @param {Object} requestData - the original request information\n @return {Object | DS.AdapterError} response\n */\n handleResponse: function handleResponse(status, headers, payload, requestData) {\n if (this.isSuccess(status, headers, payload)) {\n return payload;\n } else if (this.isInvalid(status, headers, payload)) {\n return new _emberDataAdaptersErrors.InvalidError(payload.errors);\n }\n\n var errors = this.normalizeErrorResponse(status, headers, payload);\n var detailedMessage = this.generatedDetailedMessage(status, headers, payload, requestData);\n\n if (false) {\n switch (status) {\n case 401:\n return new _emberDataAdaptersErrors.UnauthorizedError(errors, detailedMessage);\n case 403:\n return new _emberDataAdaptersErrors.ForbiddenError(errors, detailedMessage);\n case 404:\n return new _emberDataAdaptersErrors.NotFoundError(errors, detailedMessage);\n case 409:\n return new _emberDataAdaptersErrors.ConflictError(errors, detailedMessage);\n default:\n if (status >= 500) {\n return new _emberDataAdaptersErrors.ServerError(errors, detailedMessage);\n }\n }\n }\n\n return new _emberDataAdaptersErrors.AdapterError(errors, detailedMessage);\n },\n\n /**\n Default `handleResponse` implementation uses this hook to decide if the\n response is a success.\n @since 1.13.0\n @method isSuccess\n @param {Number} status\n @param {Object} headers\n @param {Object} payload\n @return {Boolean}\n */\n isSuccess: function isSuccess(status, headers, payload) {\n return status >= 200 && status < 300 || status === 304;\n },\n\n /**\n Default `handleResponse` implementation uses this hook to decide if the\n response is a an invalid error.\n @since 1.13.0\n @method isInvalid\n @param {Number} status\n @param {Object} headers\n @param {Object} payload\n @return {Boolean}\n */\n isInvalid: function isInvalid(status, headers, payload) {\n return status === 422;\n },\n\n /**\n Takes a URL, an HTTP method and a hash of data, and makes an\n HTTP request.\n When the server responds with a payload, Ember Data will call into `extractSingle`\n or `extractArray` (depending on whether the original query was for one record or\n many records).\n By default, `ajax` method has the following behavior:\n * It sets the response `dataType` to `\"json\"`\n * If the HTTP method is not `\"GET\"`, it sets the `Content-Type` to be\n `application/json; charset=utf-8`\n * If the HTTP method is not `\"GET\"`, it stringifies the data passed in. The\n data is the serialized record in the case of a save.\n * Registers success and failure handlers.\n @method ajax\n @private\n @param {String} url\n @param {String} type The request type GET, POST, PUT, DELETE etc.\n @param {Object} options\n @return {Promise} promise\n */\n ajax: function ajax(url, type, options) {\n var adapter = this;\n\n var requestData = {\n url: url,\n method: type\n };\n\n return new Promise(function (resolve, reject) {\n var hash = adapter.ajaxOptions(url, type, options);\n\n hash.success = function (payload, textStatus, jqXHR) {\n var response = ajaxSuccess(adapter, jqXHR, payload, requestData);\n _ember['default'].run.join(null, resolve, response);\n };\n\n hash.error = function (jqXHR, textStatus, errorThrown) {\n var responseData = {\n textStatus: textStatus,\n errorThrown: errorThrown\n };\n var error = ajaxError(adapter, jqXHR, requestData, responseData);\n _ember['default'].run.join(null, reject, error);\n };\n\n adapter._ajaxRequest(hash);\n }, 'DS: RESTAdapter#ajax ' + type + ' to ' + url);\n },\n\n /**\n @method _ajaxRequest\n @private\n @param {Object} options jQuery ajax options to be used for the ajax request\n */\n _ajaxRequest: function _ajaxRequest(options) {\n _ember['default'].$.ajax(options);\n },\n\n /**\n @method ajaxOptions\n @private\n @param {String} url\n @param {String} type The request type GET, POST, PUT, DELETE etc.\n @param {Object} options\n @return {Object}\n */\n ajaxOptions: function ajaxOptions(url, type, options) {\n var hash = options || {};\n hash.url = url;\n hash.type = type;\n hash.dataType = 'json';\n hash.context = this;\n\n if (hash.data && type !== 'GET') {\n hash.contentType = 'application/json; charset=utf-8';\n hash.data = JSON.stringify(hash.data);\n }\n\n var headers = get(this, 'headers');\n if (headers !== undefined) {\n hash.beforeSend = function (xhr) {\n Object.keys(headers).forEach(function (key) {\n return xhr.setRequestHeader(key, headers[key]);\n });\n };\n }\n\n return hash;\n },\n\n /**\n @method parseErrorResponse\n @private\n @param {String} responseText\n @return {Object}\n */\n parseErrorResponse: function parseErrorResponse(responseText) {\n var json = responseText;\n\n try {\n json = _ember['default'].$.parseJSON(responseText);\n } catch (e) {\n // ignored\n }\n\n return json;\n },\n\n /**\n @method normalizeErrorResponse\n @private\n @param {Number} status\n @param {Object} headers\n @param {Object} payload\n @return {Array} errors payload\n */\n normalizeErrorResponse: function normalizeErrorResponse(status, headers, payload) {\n if (payload && typeof payload === 'object' && payload.errors) {\n return payload.errors;\n } else {\n return [{\n status: '' + status,\n title: \"The backend responded with an error\",\n detail: '' + payload\n }];\n }\n },\n\n /**\n Generates a detailed (\"friendly\") error message, with plenty\n of information for debugging (good luck!)\n @method generatedDetailedMessage\n @private\n @param {Number} status\n @param {Object} headers\n @param {Object} payload\n @param {Object} requestData\n @return {String} detailed error message\n */\n generatedDetailedMessage: function generatedDetailedMessage(status, headers, payload, requestData) {\n var shortenedPayload;\n var payloadContentType = headers[\"Content-Type\"] || \"Empty Content-Type\";\n\n if (payloadContentType === \"text/html\" && payload.length > 250) {\n shortenedPayload = \"[Omitted Lengthy HTML]\";\n } else {\n shortenedPayload = payload;\n }\n\n var requestDescription = requestData.method + ' ' + requestData.url;\n var payloadDescription = 'Payload (' + payloadContentType + ')';\n\n return ['Ember Data Request ' + requestDescription + ' returned a ' + status, payloadDescription, shortenedPayload].join('\\n');\n },\n\n // @since 2.5.0\n buildQuery: function buildQuery(snapshot) {\n var query = {};\n\n if (snapshot) {\n var include = snapshot.include;\n\n if (include) {\n query.include = include;\n }\n }\n\n return query;\n },\n\n _hasCustomizedAjax: function _hasCustomizedAjax() {\n if (this.ajax !== RESTAdapter.prototype.ajax) {\n (0, _emberDataPrivateDebug.deprecate)('RESTAdapter#ajax has been deprecated please use. `methodForRequest`, `urlForRequest`, `headersForRequest` or `dataForRequest` instead.', false, {\n id: 'ds.rest-adapter.ajax',\n until: '3.0.0'\n });\n return true;\n }\n\n if (this.ajaxOptions !== RESTAdapter.prototype.ajaxOptions) {\n (0, _emberDataPrivateDebug.deprecate)('RESTAdapter#ajaxOptions has been deprecated please use. `methodForRequest`, `urlForRequest`, `headersForRequest` or `dataForRequest` instead.', false, {\n id: 'ds.rest-adapter.ajax-options',\n until: '3.0.0'\n });\n return true;\n }\n\n return false;\n }\n });\n\n if (false) {\n\n RESTAdapter.reopen({\n\n /**\n * Get the data (body or query params) for a request.\n *\n * @public\n * @method dataForRequest\n * @param {Object} params\n * @return {Object} data\n */\n dataForRequest: function dataForRequest(params) {\n var store = params.store;\n var type = params.type;\n var snapshot = params.snapshot;\n var requestType = params.requestType;\n var query = params.query;\n\n // type is not passed to findBelongsTo and findHasMany\n type = type || snapshot && snapshot.type;\n\n var serializer = store.serializerFor(type.modelName);\n var data = {};\n\n switch (requestType) {\n case 'createRecord':\n serializer.serializeIntoHash(data, type, snapshot, { includeId: true });\n break;\n\n case 'updateRecord':\n serializer.serializeIntoHash(data, type, snapshot);\n break;\n\n case 'findRecord':\n data = this.buildQuery(snapshot);\n break;\n\n case 'findAll':\n if (params.sinceToken) {\n query = query || {};\n query.since = params.sinceToken;\n }\n data = query;\n break;\n\n case 'query':\n case 'queryRecord':\n if (this.sortQueryParams) {\n query = this.sortQueryParams(query);\n }\n data = query;\n break;\n\n case 'findMany':\n data = { ids: params.ids };\n break;\n\n default:\n data = undefined;\n break;\n }\n\n return data;\n },\n\n /**\n * Get the HTTP method for a request.\n *\n * @public\n * @method methodForRequest\n * @param {Object} params\n * @return {String} HTTP method\n */\n methodForRequest: function methodForRequest(params) {\n var requestType = params.requestType;\n\n switch (requestType) {\n case 'createRecord':\n return 'POST';\n case 'updateRecord':\n return 'PUT';\n case 'deleteRecord':\n return 'DELETE';\n }\n\n return 'GET';\n },\n\n /**\n * Get the URL for a request.\n *\n * @public\n * @method urlForRequest\n * @param {Object} params\n * @return {String} URL\n */\n urlForRequest: function urlForRequest(params) {\n var type = params.type;\n var id = params.id;\n var ids = params.ids;\n var snapshot = params.snapshot;\n var snapshots = params.snapshots;\n var requestType = params.requestType;\n var query = params.query;\n\n // type and id are not passed from updateRecord and deleteRecord, hence they\n // are defined if not set\n type = type || snapshot && snapshot.type;\n id = id || snapshot && snapshot.id;\n\n switch (requestType) {\n case 'findAll':\n return this.buildURL(type.modelName, null, snapshots, requestType);\n\n case 'query':\n case 'queryRecord':\n return this.buildURL(type.modelName, null, null, requestType, query);\n\n case 'findMany':\n return this.buildURL(type.modelName, ids, snapshots, requestType);\n\n case 'findHasMany':\n case 'findBelongsTo':\n {\n var url = this.buildURL(type.modelName, id, snapshot, requestType);\n return this.urlPrefix(params.url, url);\n }\n }\n\n return this.buildURL(type.modelName, id, snapshot, requestType, query);\n },\n\n /**\n * Get the headers for a request.\n *\n * By default the value of the `headers` property of the adapter is\n * returned.\n *\n * @public\n * @method headersForRequest\n * @param {Object} params\n * @return {Object} headers\n */\n headersForRequest: function headersForRequest(params) {\n return this.get('headers');\n },\n\n /**\n * Get an object which contains all properties for a request which should\n * be made.\n *\n * @private\n * @method _requestFor\n * @param {Object} params\n * @return {Object} request object\n */\n _requestFor: function _requestFor(params) {\n var method = this.methodForRequest(params);\n var url = this.urlForRequest(params);\n var headers = this.headersForRequest(params);\n var data = this.dataForRequest(params);\n\n return { method: method, url: url, headers: headers, data: data };\n },\n\n /**\n * Convert a request object into a hash which can be passed to `jQuery.ajax`.\n *\n * @private\n * @method _requestToJQueryAjaxHash\n * @param {Object} request\n * @return {Object} jQuery ajax hash\n */\n _requestToJQueryAjaxHash: function _requestToJQueryAjaxHash(request) {\n var hash = {};\n\n hash.type = request.method;\n hash.url = request.url;\n hash.dataType = 'json';\n hash.context = this;\n\n if (request.data) {\n if (request.method !== 'GET') {\n hash.contentType = 'application/json; charset=utf-8';\n hash.data = JSON.stringify(request.data);\n } else {\n hash.data = request.data;\n }\n }\n\n var headers = request.headers;\n if (headers !== undefined) {\n hash.beforeSend = function (xhr) {\n Object.keys(headers).forEach(function (key) {\n return xhr.setRequestHeader(key, headers[key]);\n });\n };\n }\n\n return hash;\n },\n\n /**\n * Make a request using `jQuery.ajax`.\n *\n * @private\n * @method _makeRequest\n * @param {Object} request\n * @return {Promise} promise\n */\n _makeRequest: function _makeRequest(request) {\n var adapter = this;\n var hash = this._requestToJQueryAjaxHash(request);\n\n var method = request.method;\n var url = request.url;\n\n var requestData = { method: method, url: url };\n\n return new _ember['default'].RSVP.Promise(function (resolve, reject) {\n\n hash.success = function (payload, textStatus, jqXHR) {\n var response = ajaxSuccess(adapter, jqXHR, payload, requestData);\n _ember['default'].run.join(null, resolve, response);\n };\n\n hash.error = function (jqXHR, textStatus, errorThrown) {\n var responseData = {\n textStatus: textStatus,\n errorThrown: errorThrown\n };\n var error = ajaxError(adapter, jqXHR, requestData, responseData);\n _ember['default'].run.join(null, reject, error);\n };\n\n adapter._ajaxRequest(hash);\n }, 'DS: RESTAdapter#makeRequest: ' + method + ' ' + url);\n }\n });\n }\n\n function ajaxSuccess(adapter, jqXHR, payload, requestData) {\n var response = undefined;\n try {\n response = adapter.handleResponse(jqXHR.status, (0, _emberDataPrivateUtilsParseResponseHeaders['default'])(jqXHR.getAllResponseHeaders()), payload, requestData);\n } catch (error) {\n return Promise.reject(error);\n }\n\n if (response && response.isAdapterError) {\n return Promise.reject(response);\n } else {\n return response;\n }\n }\n\n function ajaxError(adapter, jqXHR, requestData, responseData) {\n (0, _emberDataPrivateDebug.runInDebug)(function () {\n var message = 'The server returned an empty string for ' + requestData.method + ' ' + requestData.url + ', which cannot be parsed into a valid JSON. Return either null or {}.';\n var validJSONString = !(responseData.textStatus === \"parsererror\" && jqXHR.responseText === \"\");\n (0, _emberDataPrivateDebug.warn)(message, validJSONString, {\n id: 'ds.adapter.returned-empty-string-as-JSON'\n });\n });\n\n var error = undefined;\n\n if (responseData.errorThrown instanceof Error) {\n error = responseData.errorThrown;\n } else if (responseData.textStatus === 'timeout') {\n error = new _emberDataAdaptersErrors.TimeoutError();\n } else if (responseData.textStatus === 'abort') {\n error = new _emberDataAdaptersErrors.AbortError();\n } else {\n try {\n error = adapter.handleResponse(jqXHR.status, (0, _emberDataPrivateUtilsParseResponseHeaders['default'])(jqXHR.getAllResponseHeaders()), adapter.parseErrorResponse(jqXHR.responseText) || responseData.errorThrown, requestData);\n } catch (e) {\n error = e;\n }\n }\n\n return error;\n }\n\n //From http://stackoverflow.com/questions/280634/endswith-in-javascript\n function endsWith(string, suffix) {\n if (typeof String.prototype.endsWith !== 'function') {\n return string.indexOf(suffix, string.length - suffix.length) !== -1;\n } else {\n return string.endsWith(suffix);\n }\n }\n\n exports['default'] = RESTAdapter;\n});","define('ember-data/attr', ['exports', 'ember', 'ember-data/-private/debug'], function (exports, _ember, _emberDataPrivateDebug) {\n 'use strict';\n\n exports['default'] = attr;\n\n /**\n @module ember-data\n */\n\n function getDefaultValue(record, options, key) {\n if (typeof options.defaultValue === 'function') {\n return options.defaultValue.apply(null, arguments);\n } else {\n var defaultValue = options.defaultValue;\n (0, _emberDataPrivateDebug.deprecate)('Non primitive defaultValues are deprecated because they are shared between all instances. If you would like to use a complex object as a default value please provide a function that returns the complex object.', typeof defaultValue !== 'object' || defaultValue === null, {\n id: 'ds.defaultValue.complex-object',\n until: '3.0.0'\n });\n return defaultValue;\n }\n }\n\n function hasValue(record, key) {\n return key in record._attributes || key in record._inFlightAttributes || key in record._data;\n }\n\n function getValue(record, key) {\n if (key in record._attributes) {\n return record._attributes[key];\n } else if (key in record._inFlightAttributes) {\n return record._inFlightAttributes[key];\n } else {\n return record._data[key];\n }\n }\n\n /**\n `DS.attr` defines an attribute on a [DS.Model](/api/data/classes/DS.Model.html).\n By default, attributes are passed through as-is, however you can specify an\n optional type to have the value automatically transformed.\n Ember Data ships with four basic transform types: `string`, `number`,\n `boolean` and `date`. You can define your own transforms by subclassing\n [DS.Transform](/api/data/classes/DS.Transform.html).\n \n Note that you cannot use `attr` to define an attribute of `id`.\n \n `DS.attr` takes an optional hash as a second parameter, currently\n supported options are:\n \n - `defaultValue`: Pass a string or a function to be called to set the attribute\n to a default value if none is supplied.\n \n Example\n \n ```app/models/user.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n username: DS.attr('string'),\n email: DS.attr('string'),\n verified: DS.attr('boolean', { defaultValue: false })\n });\n ```\n \n Default value can also be a function. This is useful it you want to return\n a new object for each attribute.\n \n ```app/models/user.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n username: attr('string'),\n email: attr('string'),\n settings: attr({defaultValue: function() {\n return {};\n }})\n });\n ```\n \n The `options` hash is passed as second argument to a transforms'\n `serialize` and `deserialize` method. This allows to configure a\n transformation and adapt the corresponding value, based on the config:\n \n ```app/models/post.js\n export default DS.Model.extend({\n text: DS.attr('text', {\n uppercase: true\n })\n });\n ```\n \n ```app/transforms/text.js\n export default DS.Transform.extend({\n serialize: function(value, options) {\n if (options.uppercase) {\n return value.toUpperCase();\n }\n \n return value;\n },\n \n deserialize: function(value) {\n return value;\n }\n })\n ```\n \n @namespace\n @method attr\n @for DS\n @param {String} type the attribute type\n @param {Object} options a hash of options\n @return {Attribute}\n */\n function attr(type, options) {\n if (typeof type === 'object') {\n options = type;\n type = undefined;\n } else {\n options = options || {};\n }\n\n var meta = {\n type: type,\n isAttribute: true,\n options: options\n };\n\n return _ember['default'].computed({\n get: function get(key) {\n var internalModel = this._internalModel;\n if (hasValue(internalModel, key)) {\n return getValue(internalModel, key);\n } else {\n return getDefaultValue(this, options, key);\n }\n },\n set: function set(key, value) {\n var internalModel = this._internalModel;\n var oldValue = getValue(internalModel, key);\n var originalValue;\n\n if (value !== oldValue) {\n // Add the new value to the changed attributes hash; it will get deleted by\n // the 'didSetProperty' handler if it is no different from the original value\n internalModel._attributes[key] = value;\n\n if (key in internalModel._inFlightAttributes) {\n originalValue = internalModel._inFlightAttributes[key];\n } else {\n originalValue = internalModel._data[key];\n }\n\n this._internalModel.send('didSetProperty', {\n name: key,\n oldValue: oldValue,\n originalValue: originalValue,\n value: value\n });\n }\n\n return value;\n }\n }).meta(meta);\n }\n});","define(\"ember-data/index\", [\"exports\", \"ember\", \"ember-data/-private/debug\", \"ember-data/-private/features\", \"ember-data/-private/global\", \"ember-data/-private/core\", \"ember-data/-private/system/normalize-model-name\", \"ember-data/-private/system/model/internal-model\", \"ember-data/-private/system/promise-proxies\", \"ember-data/-private/system/store\", \"ember-data/-private/system/model\", \"ember-data/model\", \"ember-data/-private/system/snapshot\", \"ember-data/adapter\", \"ember-data/serializer\", \"ember-data/-private/system/debug\", \"ember-data/adapters/errors\", \"ember-data/-private/system/record-arrays\", \"ember-data/-private/system/many-array\", \"ember-data/-private/system/record-array-manager\", \"ember-data/-private/adapters\", \"ember-data/-private/adapters/build-url-mixin\", \"ember-data/-private/serializers\", \"ember-inflector\", \"ember-data/serializers/embedded-records-mixin\", \"ember-data/-private/transforms\", \"ember-data/relationships\", \"ember-data/setup-container\", \"ember-data/-private/instance-initializers/initialize-store-service\", \"ember-data/-private/system/container-proxy\", \"ember-data/-private/system/relationships/state/relationship\"], function (exports, _ember, _emberDataPrivateDebug, _emberDataPrivateFeatures, _emberDataPrivateGlobal, _emberDataPrivateCore, _emberDataPrivateSystemNormalizeModelName, _emberDataPrivateSystemModelInternalModel, _emberDataPrivateSystemPromiseProxies, _emberDataPrivateSystemStore, _emberDataPrivateSystemModel, _emberDataModel, _emberDataPrivateSystemSnapshot, _emberDataAdapter, _emberDataSerializer, _emberDataPrivateSystemDebug, _emberDataAdaptersErrors, _emberDataPrivateSystemRecordArrays, _emberDataPrivateSystemManyArray, _emberDataPrivateSystemRecordArrayManager, _emberDataPrivateAdapters, _emberDataPrivateAdaptersBuildUrlMixin, _emberDataPrivateSerializers, _emberInflector, _emberDataSerializersEmbeddedRecordsMixin, _emberDataPrivateTransforms, _emberDataRelationships, _emberDataSetupContainer, _emberDataPrivateInstanceInitializersInitializeStoreService, _emberDataPrivateSystemContainerProxy, _emberDataPrivateSystemRelationshipsStateRelationship) {\n \"use strict\";\n\n if (_ember[\"default\"].VERSION.match(/^1\\.([0-9]|1[0-2])\\./)) {\n throw new _ember[\"default\"].Error(\"Ember Data requires at least Ember 1.13.0, but you have \" + _ember[\"default\"].VERSION + \". Please upgrade your version of Ember, then upgrade Ember Data.\");\n }_emberDataPrivateCore[\"default\"].Store = _emberDataPrivateSystemStore.Store;\n _emberDataPrivateCore[\"default\"].PromiseArray = _emberDataPrivateSystemPromiseProxies.PromiseArray;\n _emberDataPrivateCore[\"default\"].PromiseObject = _emberDataPrivateSystemPromiseProxies.PromiseObject;\n\n _emberDataPrivateCore[\"default\"].PromiseManyArray = _emberDataPrivateSystemPromiseProxies.PromiseManyArray;\n\n _emberDataPrivateCore[\"default\"].Model = _emberDataModel[\"default\"];\n _emberDataPrivateCore[\"default\"].RootState = _emberDataPrivateSystemModel.RootState;\n _emberDataPrivateCore[\"default\"].attr = _emberDataPrivateSystemModel.attr;\n _emberDataPrivateCore[\"default\"].Errors = _emberDataPrivateSystemModel.Errors;\n\n _emberDataPrivateCore[\"default\"].InternalModel = _emberDataPrivateSystemModelInternalModel[\"default\"];\n _emberDataPrivateCore[\"default\"].Snapshot = _emberDataPrivateSystemSnapshot[\"default\"];\n\n _emberDataPrivateCore[\"default\"].Adapter = _emberDataAdapter[\"default\"];\n\n _emberDataPrivateCore[\"default\"].AdapterError = _emberDataAdaptersErrors.AdapterError;\n _emberDataPrivateCore[\"default\"].InvalidError = _emberDataAdaptersErrors.InvalidError;\n _emberDataPrivateCore[\"default\"].TimeoutError = _emberDataAdaptersErrors.TimeoutError;\n _emberDataPrivateCore[\"default\"].AbortError = _emberDataAdaptersErrors.AbortError;\n\n if (false) {\n _emberDataPrivateCore[\"default\"].UnauthorizedError = _emberDataAdaptersErrors.UnauthorizedError;\n _emberDataPrivateCore[\"default\"].ForbiddenError = _emberDataAdaptersErrors.ForbiddenError;\n _emberDataPrivateCore[\"default\"].NotFoundError = _emberDataAdaptersErrors.NotFoundError;\n _emberDataPrivateCore[\"default\"].ConflictError = _emberDataAdaptersErrors.ConflictError;\n _emberDataPrivateCore[\"default\"].ServerError = _emberDataAdaptersErrors.ServerError;\n }\n\n _emberDataPrivateCore[\"default\"].errorsHashToArray = _emberDataAdaptersErrors.errorsHashToArray;\n _emberDataPrivateCore[\"default\"].errorsArrayToHash = _emberDataAdaptersErrors.errorsArrayToHash;\n\n _emberDataPrivateCore[\"default\"].Serializer = _emberDataSerializer[\"default\"];\n\n _emberDataPrivateCore[\"default\"].DebugAdapter = _emberDataPrivateSystemDebug[\"default\"];\n\n _emberDataPrivateCore[\"default\"].RecordArray = _emberDataPrivateSystemRecordArrays.RecordArray;\n _emberDataPrivateCore[\"default\"].FilteredRecordArray = _emberDataPrivateSystemRecordArrays.FilteredRecordArray;\n _emberDataPrivateCore[\"default\"].AdapterPopulatedRecordArray = _emberDataPrivateSystemRecordArrays.AdapterPopulatedRecordArray;\n _emberDataPrivateCore[\"default\"].ManyArray = _emberDataPrivateSystemManyArray[\"default\"];\n\n _emberDataPrivateCore[\"default\"].RecordArrayManager = _emberDataPrivateSystemRecordArrayManager[\"default\"];\n\n _emberDataPrivateCore[\"default\"].RESTAdapter = _emberDataPrivateAdapters.RESTAdapter;\n _emberDataPrivateCore[\"default\"].BuildURLMixin = _emberDataPrivateAdaptersBuildUrlMixin[\"default\"];\n\n _emberDataPrivateCore[\"default\"].RESTSerializer = _emberDataPrivateSerializers.RESTSerializer;\n _emberDataPrivateCore[\"default\"].JSONSerializer = _emberDataPrivateSerializers.JSONSerializer;\n\n _emberDataPrivateCore[\"default\"].JSONAPIAdapter = _emberDataPrivateAdapters.JSONAPIAdapter;\n _emberDataPrivateCore[\"default\"].JSONAPISerializer = _emberDataPrivateSerializers.JSONAPISerializer;\n\n _emberDataPrivateCore[\"default\"].Transform = _emberDataPrivateTransforms.Transform;\n _emberDataPrivateCore[\"default\"].DateTransform = _emberDataPrivateTransforms.DateTransform;\n _emberDataPrivateCore[\"default\"].StringTransform = _emberDataPrivateTransforms.StringTransform;\n _emberDataPrivateCore[\"default\"].NumberTransform = _emberDataPrivateTransforms.NumberTransform;\n _emberDataPrivateCore[\"default\"].BooleanTransform = _emberDataPrivateTransforms.BooleanTransform;\n\n _emberDataPrivateCore[\"default\"].EmbeddedRecordsMixin = _emberDataSerializersEmbeddedRecordsMixin[\"default\"];\n\n _emberDataPrivateCore[\"default\"].belongsTo = _emberDataRelationships.belongsTo;\n _emberDataPrivateCore[\"default\"].hasMany = _emberDataRelationships.hasMany;\n\n _emberDataPrivateCore[\"default\"].Relationship = _emberDataPrivateSystemRelationshipsStateRelationship[\"default\"];\n\n _emberDataPrivateCore[\"default\"].ContainerProxy = _emberDataPrivateSystemContainerProxy[\"default\"];\n\n _emberDataPrivateCore[\"default\"]._setupContainer = _emberDataSetupContainer[\"default\"];\n _emberDataPrivateCore[\"default\"]._initializeStoreService = _emberDataPrivateInstanceInitializersInitializeStoreService[\"default\"];\n\n Object.defineProperty(_emberDataPrivateCore[\"default\"], 'normalizeModelName', {\n enumerable: true,\n writable: false,\n configurable: false,\n value: _emberDataPrivateSystemNormalizeModelName[\"default\"]\n });\n\n Object.defineProperty(_emberDataPrivateGlobal[\"default\"], 'DS', {\n configurable: true,\n get: function get() {\n (0, _emberDataPrivateDebug.deprecate)('Using the global version of DS is deprecated. Please either import ' + 'the specific modules needed or `import DS from \\'ember-data\\';`.', false, { id: 'ember-data.global-ds', until: '3.0.0' });\n\n return _emberDataPrivateCore[\"default\"];\n }\n });\n\n exports[\"default\"] = _emberDataPrivateCore[\"default\"];\n});\n\n/**\n Ember Data\n @module ember-data\n @main ember-data\n*/","define(\"ember-data/model\", [\"exports\", \"ember-data/-private/system/model\"], function (exports, _emberDataPrivateSystemModel) {\n \"use strict\";\n\n exports[\"default\"] = _emberDataPrivateSystemModel[\"default\"];\n});","define(\"ember-data/relationships\", [\"exports\", \"ember-data/-private/system/relationships/belongs-to\", \"ember-data/-private/system/relationships/has-many\"], function (exports, _emberDataPrivateSystemRelationshipsBelongsTo, _emberDataPrivateSystemRelationshipsHasMany) {\n /**\n @module ember-data\n */\n\n \"use strict\";\n\n exports.belongsTo = _emberDataPrivateSystemRelationshipsBelongsTo[\"default\"];\n exports.hasMany = _emberDataPrivateSystemRelationshipsHasMany[\"default\"];\n});","define('ember-data/serializer', ['exports', 'ember'], function (exports, _ember) {\n /**\n @module ember-data\n */\n\n 'use strict';\n\n /**\n `DS.Serializer` is an abstract base class that you should override in your\n application to customize it for your backend. The minimum set of methods\n that you should implement is:\n \n * `normalizeResponse()`\n * `serialize()`\n \n And you can optionally override the following methods:\n \n * `normalize()`\n \n For an example implementation, see\n [DS.JSONSerializer](DS.JSONSerializer.html), the included JSON serializer.\n \n @class Serializer\n @namespace DS\n @extends Ember.Object\n */\n\n exports['default'] = _ember['default'].Object.extend({\n\n /**\n The `store` property is the application's `store` that contains all records.\n It's injected as a service.\n It can be used to push records from a non flat data structure server\n response.\n @property store\n @type {DS.Store}\n @public\n */\n\n /**\n The `normalizeResponse` method is used to normalize a payload from the\n server to a JSON-API Document.\n http://jsonapi.org/format/#document-structure\n @since 1.13.0\n @method normalizeResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeResponse: null,\n\n /**\n The `serialize` method is used when a record is saved in order to convert\n the record into the form that your external data source expects.\n `serialize` takes an optional `options` hash with a single option:\n - `includeId`: If this is `true`, `serialize` should include the ID\n in the serialized object it builds.\n @method serialize\n @param {DS.Model} record\n @param {Object} [options]\n @return {Object}\n */\n serialize: null,\n\n /**\n The `normalize` method is used to convert a payload received from your\n external data source into the normalized form `store.push()` expects. You\n should override this method, munge the hash and return the normalized\n payload.\n @method normalize\n @param {DS.Model} typeClass\n @param {Object} hash\n @return {Object}\n */\n normalize: function normalize(typeClass, hash) {\n return hash;\n }\n\n });\n});","define('ember-data/serializers/embedded-records-mixin', ['exports', 'ember', 'ember-data/-private/debug'], function (exports, _ember, _emberDataPrivateDebug) {\n 'use strict';\n\n function _toConsumableArray(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];return arr2;\n } else {\n return Array.from(arr);\n }\n }\n\n var get = _ember['default'].get;\n var set = _ember['default'].set;\n var camelize = _ember['default'].String.camelize;\n\n /**\n ## Using Embedded Records\n \n `DS.EmbeddedRecordsMixin` supports serializing embedded records.\n \n To set up embedded records, include the mixin when extending a serializer,\n then define and configure embedded (model) relationships.\n \n Below is an example of a per-type serializer (`post` type).\n \n ```app/serializers/post.js\n import DS from 'ember-data';\n \n export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {\n attrs: {\n author: { embedded: 'always' },\n comments: { serialize: 'ids' }\n }\n });\n ```\n Note that this use of `{ embedded: 'always' }` is unrelated to\n the `{ embedded: 'always' }` that is defined as an option on `DS.attr` as part of\n defining a model while working with the `ActiveModelSerializer`. Nevertheless,\n using `{ embedded: 'always' }` as an option to `DS.attr` is not a valid way to setup\n embedded records.\n \n The `attrs` option for a resource `{ embedded: 'always' }` is shorthand for:\n \n ```js\n {\n serialize: 'records',\n deserialize: 'records'\n }\n ```\n \n ### Configuring Attrs\n \n A resource's `attrs` option may be set to use `ids`, `records` or false for the\n `serialize` and `deserialize` settings.\n \n The `attrs` property can be set on the `ApplicationSerializer` or a per-type\n serializer.\n \n In the case where embedded JSON is expected while extracting a payload (reading)\n the setting is `deserialize: 'records'`, there is no need to use `ids` when\n extracting as that is the default behavior without this mixin if you are using\n the vanilla `EmbeddedRecordsMixin`. Likewise, to embed JSON in the payload while\n serializing `serialize: 'records'` is the setting to use. There is an option of\n not embedding JSON in the serialized payload by using `serialize: 'ids'`. If you\n do not want the relationship sent at all, you can use `serialize: false`.\n \n \n ### EmbeddedRecordsMixin defaults\n If you do not overwrite `attrs` for a specific relationship, the `EmbeddedRecordsMixin`\n will behave in the following way:\n \n BelongsTo: `{ serialize: 'id', deserialize: 'id' }`\n HasMany: `{ serialize: false, deserialize: 'ids' }`\n \n ### Model Relationships\n \n Embedded records must have a model defined to be extracted and serialized. Note that\n when defining any relationships on your model such as `belongsTo` and `hasMany`, you\n should not both specify `async: true` and also indicate through the serializer's\n `attrs` attribute that the related model should be embedded for deserialization.\n If a model is declared embedded for deserialization (`embedded: 'always'` or `deserialize: 'records'`),\n then do not use `async: true`.\n \n To successfully extract and serialize embedded records the model relationships\n must be setup correcty. See the\n [defining relationships](/guides/models/defining-models/#toc_defining-relationships)\n section of the **Defining Models** guide page.\n \n Records without an `id` property are not considered embedded records, model\n instances must have an `id` property to be used with Ember Data.\n \n ### Example JSON payloads, Models and Serializers\n \n **When customizing a serializer it is important to grok what the customizations\n are. Please read the docs for the methods this mixin provides, in case you need\n to modify it to fit your specific needs.**\n \n For example review the docs for each method of this mixin:\n * [normalize](/api/data/classes/DS.EmbeddedRecordsMixin.html#method_normalize)\n * [serializeBelongsTo](/api/data/classes/DS.EmbeddedRecordsMixin.html#method_serializeBelongsTo)\n * [serializeHasMany](/api/data/classes/DS.EmbeddedRecordsMixin.html#method_serializeHasMany)\n \n @class EmbeddedRecordsMixin\n @namespace DS\n */\n exports['default'] = _ember['default'].Mixin.create({\n\n /**\n Normalize the record and recursively normalize/extract all the embedded records\n while pushing them into the store as they are encountered\n A payload with an attr configured for embedded records needs to be extracted:\n ```js\n {\n \"post\": {\n \"id\": \"1\"\n \"title\": \"Rails is omakase\",\n \"comments\": [{\n \"id\": \"1\",\n \"body\": \"Rails is unagi\"\n }, {\n \"id\": \"2\",\n \"body\": \"Omakase O_o\"\n }]\n }\n }\n ```\n @method normalize\n @param {DS.Model} typeClass\n @param {Object} hash to be normalized\n @param {String} prop the hash has been referenced by\n @return {Object} the normalized hash\n **/\n normalize: function normalize(typeClass, hash, prop) {\n var normalizedHash = this._super(typeClass, hash, prop);\n return this._extractEmbeddedRecords(this, this.store, typeClass, normalizedHash);\n },\n\n keyForRelationship: function keyForRelationship(key, typeClass, method) {\n if (method === 'serialize' && this.hasSerializeRecordsOption(key) || method === 'deserialize' && this.hasDeserializeRecordsOption(key)) {\n return this.keyForAttribute(key, method);\n } else {\n return this._super(key, typeClass, method) || key;\n }\n },\n\n /**\n Serialize `belongsTo` relationship when it is configured as an embedded object.\n This example of an author model belongs to a post model:\n ```js\n Post = DS.Model.extend({\n title: DS.attr('string'),\n body: DS.attr('string'),\n author: DS.belongsTo('author')\n });\n Author = DS.Model.extend({\n name: DS.attr('string'),\n post: DS.belongsTo('post')\n });\n ```\n Use a custom (type) serializer for the post model to configure embedded author\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {\n attrs: {\n author: { embedded: 'always' }\n }\n })\n ```\n A payload with an attribute configured for embedded records can serialize\n the records together under the root attribute's payload:\n ```js\n {\n \"post\": {\n \"id\": \"1\"\n \"title\": \"Rails is omakase\",\n \"author\": {\n \"id\": \"2\"\n \"name\": \"dhh\"\n }\n }\n }\n ```\n @method serializeBelongsTo\n @param {DS.Snapshot} snapshot\n @param {Object} json\n @param {Object} relationship\n */\n serializeBelongsTo: function serializeBelongsTo(snapshot, json, relationship) {\n var attr = relationship.key;\n if (this.noSerializeOptionSpecified(attr)) {\n this._super(snapshot, json, relationship);\n return;\n }\n var includeIds = this.hasSerializeIdsOption(attr);\n var includeRecords = this.hasSerializeRecordsOption(attr);\n var embeddedSnapshot = snapshot.belongsTo(attr);\n if (includeIds) {\n var serializedKey = this._getMappedKey(relationship.key, snapshot.type);\n if (serializedKey === relationship.key && this.keyForRelationship) {\n serializedKey = this.keyForRelationship(relationship.key, relationship.kind, \"serialize\");\n }\n\n if (!embeddedSnapshot) {\n json[serializedKey] = null;\n } else {\n json[serializedKey] = embeddedSnapshot.id;\n\n if (relationship.options.polymorphic) {\n this.serializePolymorphicType(snapshot, json, relationship);\n }\n }\n } else if (includeRecords) {\n this._serializeEmbeddedBelongsTo(snapshot, json, relationship);\n }\n },\n\n _serializeEmbeddedBelongsTo: function _serializeEmbeddedBelongsTo(snapshot, json, relationship) {\n var embeddedSnapshot = snapshot.belongsTo(relationship.key);\n var serializedKey = this._getMappedKey(relationship.key, snapshot.type);\n if (serializedKey === relationship.key && this.keyForRelationship) {\n serializedKey = this.keyForRelationship(relationship.key, relationship.kind, \"serialize\");\n }\n\n if (!embeddedSnapshot) {\n json[serializedKey] = null;\n } else {\n json[serializedKey] = embeddedSnapshot.serialize({ includeId: true });\n this.removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, json[serializedKey]);\n\n if (relationship.options.polymorphic) {\n this.serializePolymorphicType(snapshot, json, relationship);\n }\n }\n },\n\n /**\n Serializes `hasMany` relationships when it is configured as embedded objects.\n This example of a post model has many comments:\n ```js\n Post = DS.Model.extend({\n title: DS.attr('string'),\n body: DS.attr('string'),\n comments: DS.hasMany('comment')\n });\n Comment = DS.Model.extend({\n body: DS.attr('string'),\n post: DS.belongsTo('post')\n });\n ```\n Use a custom (type) serializer for the post model to configure embedded comments\n ```app/serializers/post.js\n import DS from 'ember-data;\n export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {\n attrs: {\n comments: { embedded: 'always' }\n }\n })\n ```\n A payload with an attribute configured for embedded records can serialize\n the records together under the root attribute's payload:\n ```js\n {\n \"post\": {\n \"id\": \"1\"\n \"title\": \"Rails is omakase\",\n \"body\": \"I want this for my ORM, I want that for my template language...\"\n \"comments\": [{\n \"id\": \"1\",\n \"body\": \"Rails is unagi\"\n }, {\n \"id\": \"2\",\n \"body\": \"Omakase O_o\"\n }]\n }\n }\n ```\n The attrs options object can use more specific instruction for extracting and\n serializing. When serializing, an option to embed `ids`, `ids-and-types` or `records` can be set.\n When extracting the only option is `records`.\n So `{ embedded: 'always' }` is shorthand for:\n `{ serialize: 'records', deserialize: 'records' }`\n To embed the `ids` for a related object (using a hasMany relationship):\n ```app/serializers/post.js\n import DS from 'ember-data;\n export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {\n attrs: {\n comments: { serialize: 'ids', deserialize: 'records' }\n }\n })\n ```\n ```js\n {\n \"post\": {\n \"id\": \"1\"\n \"title\": \"Rails is omakase\",\n \"body\": \"I want this for my ORM, I want that for my template language...\"\n \"comments\": [\"1\", \"2\"]\n }\n }\n ```\n To embed the relationship as a collection of objects with `id` and `type` keys, set\n `ids-and-types` for the related object.\n This is particularly useful for polymorphic relationships where records don't share\n the same table and the `id` is not enough information.\n By example having a user that has many pets:\n ```js\n User = DS.Model.extend({\n name: DS.attr('string'),\n pets: DS.hasMany('pet', { polymorphic: true })\n });\n Pet = DS.Model.extend({\n name: DS.attr('string'),\n });\n Cat = Pet.extend({\n // ...\n });\n Parrot = Pet.extend({\n // ...\n });\n ```\n ```app/serializers/user.js\n import DS from 'ember-data;\n export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {\n attrs: {\n pets: { serialize: 'ids-and-types', deserialize: 'records' }\n }\n });\n ```\n ```js\n {\n \"user\": {\n \"id\": \"1\"\n \"name\": \"Bertin Osborne\",\n \"pets\": [\n { \"id\": \"1\", \"type\": \"Cat\" },\n { \"id\": \"1\", \"type\": \"Parrot\"}\n ]\n }\n }\n ```\n @method serializeHasMany\n @param {DS.Snapshot} snapshot\n @param {Object} json\n @param {Object} relationship\n */\n serializeHasMany: function serializeHasMany(snapshot, json, relationship) {\n var attr = relationship.key;\n if (this.noSerializeOptionSpecified(attr)) {\n this._super(snapshot, json, relationship);\n return;\n }\n\n if (this.hasSerializeIdsOption(attr)) {\n var serializedKey = this._getMappedKey(relationship.key, snapshot.type);\n if (serializedKey === relationship.key && this.keyForRelationship) {\n serializedKey = this.keyForRelationship(relationship.key, relationship.kind, \"serialize\");\n }\n\n json[serializedKey] = snapshot.hasMany(attr, { ids: true });\n } else if (this.hasSerializeRecordsOption(attr)) {\n this._serializeEmbeddedHasMany(snapshot, json, relationship);\n } else {\n if (this.hasSerializeIdsAndTypesOption(attr)) {\n this._serializeHasManyAsIdsAndTypes(snapshot, json, relationship);\n }\n }\n },\n\n /**\n Serializes a hasMany relationship as an array of objects containing only `id` and `type`\n keys.\n This has its use case on polymorphic hasMany relationships where the server is not storing\n all records in the same table using STI, and therefore the `id` is not enough information\n TODO: Make the default in Ember-data 3.0??\n */\n _serializeHasManyAsIdsAndTypes: function _serializeHasManyAsIdsAndTypes(snapshot, json, relationship) {\n var serializedKey = this.keyForAttribute(relationship.key, 'serialize');\n var hasMany = snapshot.hasMany(relationship.key);\n\n json[serializedKey] = _ember['default'].A(hasMany).map(function (recordSnapshot) {\n //\n // I'm sure I'm being utterly naive here. Propably id is a configurate property and\n // type too, and the modelName has to be normalized somehow.\n //\n return { id: recordSnapshot.id, type: recordSnapshot.modelName };\n });\n },\n\n _serializeEmbeddedHasMany: function _serializeEmbeddedHasMany(snapshot, json, relationship) {\n var serializedKey = this._getMappedKey(relationship.key, snapshot.type);\n if (serializedKey === relationship.key && this.keyForRelationship) {\n serializedKey = this.keyForRelationship(relationship.key, relationship.kind, \"serialize\");\n }\n\n (0, _emberDataPrivateDebug.warn)('The embedded relationship \\'' + serializedKey + '\\' is undefined for \\'' + snapshot.modelName + '\\' with id \\'' + snapshot.id + '\\'. Please include it in your original payload.', _ember['default'].typeOf(snapshot.hasMany(relationship.key)) !== 'undefined', { id: 'ds.serializer.embedded-relationship-undefined' });\n\n json[serializedKey] = this._generateSerializedHasMany(snapshot, relationship);\n },\n\n /*\n Returns an array of embedded records serialized to JSON\n */\n _generateSerializedHasMany: function _generateSerializedHasMany(snapshot, relationship) {\n var hasMany = snapshot.hasMany(relationship.key);\n var manyArray = _ember['default'].A(hasMany);\n var ret = new Array(manyArray.length);\n\n for (var i = 0; i < manyArray.length; i++) {\n var embeddedSnapshot = manyArray[i];\n var embeddedJson = embeddedSnapshot.serialize({ includeId: true });\n this.removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, embeddedJson);\n ret[i] = embeddedJson;\n }\n\n return ret;\n },\n\n /**\n When serializing an embedded record, modify the property (in the json payload)\n that refers to the parent record (foreign key for relationship).\n Serializing a `belongsTo` relationship removes the property that refers to the\n parent record\n Serializing a `hasMany` relationship does not remove the property that refers to\n the parent record.\n @method removeEmbeddedForeignKey\n @param {DS.Snapshot} snapshot\n @param {DS.Snapshot} embeddedSnapshot\n @param {Object} relationship\n @param {Object} json\n */\n removeEmbeddedForeignKey: function removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, json) {\n if (relationship.kind === 'hasMany') {\n return;\n } else if (relationship.kind === 'belongsTo') {\n var parentRecord = snapshot.type.inverseFor(relationship.key, this.store);\n if (parentRecord) {\n var name = parentRecord.name;\n var embeddedSerializer = this.store.serializerFor(embeddedSnapshot.modelName);\n var parentKey = embeddedSerializer.keyForRelationship(name, parentRecord.kind, 'deserialize');\n if (parentKey) {\n delete json[parentKey];\n }\n }\n }\n },\n\n // checks config for attrs option to embedded (always) - serialize and deserialize\n hasEmbeddedAlwaysOption: function hasEmbeddedAlwaysOption(attr) {\n var option = this.attrsOption(attr);\n return option && option.embedded === 'always';\n },\n\n // checks config for attrs option to serialize ids\n hasSerializeRecordsOption: function hasSerializeRecordsOption(attr) {\n var alwaysEmbed = this.hasEmbeddedAlwaysOption(attr);\n var option = this.attrsOption(attr);\n return alwaysEmbed || option && option.serialize === 'records';\n },\n\n // checks config for attrs option to serialize records\n hasSerializeIdsOption: function hasSerializeIdsOption(attr) {\n var option = this.attrsOption(attr);\n return option && (option.serialize === 'ids' || option.serialize === 'id');\n },\n\n // checks config for attrs option to serialize records as objects containing id and types\n hasSerializeIdsAndTypesOption: function hasSerializeIdsAndTypesOption(attr) {\n var option = this.attrsOption(attr);\n return option && (option.serialize === 'ids-and-types' || option.serialize === 'id-and-type');\n },\n\n // checks config for attrs option to serialize records\n noSerializeOptionSpecified: function noSerializeOptionSpecified(attr) {\n var option = this.attrsOption(attr);\n return !(option && (option.serialize || option.embedded));\n },\n\n // checks config for attrs option to deserialize records\n // a defined option object for a resource is treated the same as\n // `deserialize: 'records'`\n hasDeserializeRecordsOption: function hasDeserializeRecordsOption(attr) {\n var alwaysEmbed = this.hasEmbeddedAlwaysOption(attr);\n var option = this.attrsOption(attr);\n return alwaysEmbed || option && option.deserialize === 'records';\n },\n\n attrsOption: function attrsOption(attr) {\n var attrs = this.get('attrs');\n return attrs && (attrs[camelize(attr)] || attrs[attr]);\n },\n\n /**\n @method _extractEmbeddedRecords\n @private\n */\n _extractEmbeddedRecords: function _extractEmbeddedRecords(serializer, store, typeClass, partial) {\n var _this = this;\n\n typeClass.eachRelationship(function (key, relationship) {\n if (serializer.hasDeserializeRecordsOption(key)) {\n if (relationship.kind === \"hasMany\") {\n _this._extractEmbeddedHasMany(store, key, partial, relationship);\n }\n if (relationship.kind === \"belongsTo\") {\n _this._extractEmbeddedBelongsTo(store, key, partial, relationship);\n }\n }\n });\n return partial;\n },\n\n /**\n @method _extractEmbeddedHasMany\n @private\n */\n _extractEmbeddedHasMany: function _extractEmbeddedHasMany(store, key, hash, relationshipMeta) {\n var relationshipHash = get(hash, 'data.relationships.' + key + '.data');\n\n if (!relationshipHash) {\n return;\n }\n\n var hasMany = new Array(relationshipHash.length);\n\n for (var i = 0; i < relationshipHash.length; i++) {\n var item = relationshipHash[i];\n\n var _normalizeEmbeddedRelationship2 = this._normalizeEmbeddedRelationship(store, relationshipMeta, item);\n\n var data = _normalizeEmbeddedRelationship2.data;\n var included = _normalizeEmbeddedRelationship2.included;\n\n hash.included = hash.included || [];\n hash.included.push(data);\n if (included) {\n var _hash$included;\n\n (_hash$included = hash.included).push.apply(_hash$included, _toConsumableArray(included));\n }\n\n hasMany[i] = { id: data.id, type: data.type };\n }\n\n var relationship = { data: hasMany };\n set(hash, 'data.relationships.' + key, relationship);\n },\n\n /**\n @method _extractEmbeddedBelongsTo\n @private\n */\n _extractEmbeddedBelongsTo: function _extractEmbeddedBelongsTo(store, key, hash, relationshipMeta) {\n var relationshipHash = get(hash, 'data.relationships.' + key + '.data');\n if (!relationshipHash) {\n return;\n }\n\n var _normalizeEmbeddedRelationship3 = this._normalizeEmbeddedRelationship(store, relationshipMeta, relationshipHash);\n\n var data = _normalizeEmbeddedRelationship3.data;\n var included = _normalizeEmbeddedRelationship3.included;\n\n hash.included = hash.included || [];\n hash.included.push(data);\n if (included) {\n var _hash$included2;\n\n (_hash$included2 = hash.included).push.apply(_hash$included2, _toConsumableArray(included));\n }\n\n var belongsTo = { id: data.id, type: data.type };\n var relationship = { data: belongsTo };\n\n set(hash, 'data.relationships.' + key, relationship);\n },\n\n /**\n @method _normalizeEmbeddedRelationship\n @private\n */\n _normalizeEmbeddedRelationship: function _normalizeEmbeddedRelationship(store, relationshipMeta, relationshipHash) {\n var modelName = relationshipMeta.type;\n if (relationshipMeta.options.polymorphic) {\n modelName = relationshipHash.type;\n }\n var modelClass = store.modelFor(modelName);\n var serializer = store.serializerFor(modelName);\n\n return serializer.normalize(modelClass, relationshipHash, null);\n },\n isEmbeddedRecordsMixin: true\n });\n});","define('ember-data/serializers/json-api', ['exports', 'ember', 'ember-data/-private/debug', 'ember-data/serializers/json', 'ember-data/-private/system/normalize-model-name', 'ember-inflector', 'ember-data/-private/features'], function (exports, _ember, _emberDataPrivateDebug, _emberDataSerializersJson, _emberDataPrivateSystemNormalizeModelName, _emberInflector, _emberDataPrivateFeatures) {\n /**\n @module ember-data\n */\n\n 'use strict';\n\n var dasherize = _ember['default'].String.dasherize;\n\n /**\n Ember Data 2.0 Serializer:\n \n In Ember Data a Serializer is used to serialize and deserialize\n records when they are transferred in and out of an external source.\n This process involves normalizing property names, transforming\n attribute values and serializing relationships.\n \n `JSONAPISerializer` supports the http://jsonapi.org/ spec and is the\n serializer recommended by Ember Data.\n \n This serializer normalizes a JSON API payload that looks like:\n \n ```js\n \n // models/player.js\n import DS from \"ember-data\";\n \n export default DS.Model.extend({\n name: DS.attr(),\n skill: DS.attr(),\n gamesPlayed: DS.attr(),\n club: DS.belongsTo('club')\n });\n \n // models/club.js\n import DS from \"ember-data\";\n \n export default DS.Model.extend({\n name: DS.attr(),\n location: DS.attr(),\n players: DS.hasMany('player')\n });\n ```\n \n ```js\n \n {\n \"data\": [\n {\n \"attributes\": {\n \"name\": \"Benfica\",\n \"location\": \"Portugal\"\n },\n \"id\": \"1\",\n \"relationships\": {\n \"players\": {\n \"data\": [\n {\n \"id\": \"3\",\n \"type\": \"players\"\n }\n ]\n }\n },\n \"type\": \"clubs\"\n }\n ],\n \"included\": [\n {\n \"attributes\": {\n \"name\": \"Eusebio Silva Ferreira\",\n \"skill\": \"Rocket shot\",\n \"games-played\": 431\n },\n \"id\": \"3\",\n \"relationships\": {\n \"club\": {\n \"data\": {\n \"id\": \"1\",\n \"type\": \"clubs\"\n }\n }\n },\n \"type\": \"players\"\n }\n ]\n }\n ```\n \n to the format that the Ember Data store expects.\n \n @since 1.13.0\n @class JSONAPISerializer\n @namespace DS\n @extends DS.JSONSerializer\n */\n var JSONAPISerializer = _emberDataSerializersJson['default'].extend({\n\n /**\n @method _normalizeDocumentHelper\n @param {Object} documentHash\n @return {Object}\n @private\n */\n _normalizeDocumentHelper: function _normalizeDocumentHelper(documentHash) {\n\n if (_ember['default'].typeOf(documentHash.data) === 'object') {\n documentHash.data = this._normalizeResourceHelper(documentHash.data);\n } else if (Array.isArray(documentHash.data)) {\n var ret = new Array(documentHash.data.length);\n\n for (var i = 0; i < documentHash.data.length; i++) {\n var data = documentHash.data[i];\n ret[i] = this._normalizeResourceHelper(data);\n }\n\n documentHash.data = ret;\n }\n\n if (Array.isArray(documentHash.included)) {\n var ret = new Array(documentHash.included.length);\n\n for (var i = 0; i < documentHash.included.length; i++) {\n var included = documentHash.included[i];\n ret[i] = this._normalizeResourceHelper(included);\n }\n\n documentHash.included = ret;\n }\n\n return documentHash;\n },\n\n /**\n @method _normalizeRelationshipDataHelper\n @param {Object} relationshipDataHash\n @return {Object}\n @private\n */\n _normalizeRelationshipDataHelper: function _normalizeRelationshipDataHelper(relationshipDataHash) {\n if (false) {\n var modelName = this.modelNameFromPayloadType(relationshipDataHash.type);\n var deprecatedModelNameLookup = this.modelNameFromPayloadKey(relationshipDataHash.type);\n\n if (modelName !== deprecatedModelNameLookup && this._hasCustomModelNameFromPayloadKey()) {\n (0, _emberDataPrivateDebug.deprecate)(\"You are using modelNameFromPayloadKey to normalize the type for a relationship. This has been deprecated in favor of modelNameFromPayloadType\", false, {\n id: 'ds.json-api-serializer.deprecated-model-name-for-relationship',\n until: '3.0.0'\n });\n\n modelName = deprecatedModelNameLookup;\n }\n\n relationshipDataHash.type = modelName;\n } else {\n var type = this.modelNameFromPayloadKey(relationshipDataHash.type);\n relationshipDataHash.type = type;\n }\n\n return relationshipDataHash;\n },\n\n /**\n @method _normalizeResourceHelper\n @param {Object} resourceHash\n @return {Object}\n @private\n */\n _normalizeResourceHelper: function _normalizeResourceHelper(resourceHash) {\n (0, _emberDataPrivateDebug.assert)(this.warnMessageForUndefinedType(), !_ember['default'].isNone(resourceHash.type), {\n id: 'ds.serializer.type-is-undefined'\n });\n\n var modelName = undefined,\n usedLookup = undefined;\n\n if (false) {\n modelName = this.modelNameFromPayloadType(resourceHash.type);\n var deprecatedModelNameLookup = this.modelNameFromPayloadKey(resourceHash.type);\n\n usedLookup = 'modelNameFromPayloadType';\n\n if (modelName !== deprecatedModelNameLookup && this._hasCustomModelNameFromPayloadKey()) {\n (0, _emberDataPrivateDebug.deprecate)(\"You are using modelNameFromPayloadKey to normalize the type for a resource. This has been deprecated in favor of modelNameFromPayloadType\", false, {\n id: 'ds.json-api-serializer.deprecated-model-name-for-resource',\n until: '3.0.0'\n });\n\n modelName = deprecatedModelNameLookup;\n usedLookup = 'modelNameFromPayloadKey';\n }\n } else {\n modelName = this.modelNameFromPayloadKey(resourceHash.type);\n usedLookup = 'modelNameFromPayloadKey';\n }\n\n if (!this.store._hasModelFor(modelName)) {\n (0, _emberDataPrivateDebug.warn)(this.warnMessageNoModelForType(modelName, resourceHash.type, usedLookup), false, {\n id: 'ds.serializer.model-for-type-missing'\n });\n return null;\n }\n\n var modelClass = this.store.modelFor(modelName);\n var serializer = this.store.serializerFor(modelName);\n\n var _serializer$normalize = serializer.normalize(modelClass, resourceHash);\n\n var data = _serializer$normalize.data;\n\n return data;\n },\n\n /**\n @method pushPayload\n @param {DS.Store} store\n @param {Object} payload\n */\n pushPayload: function pushPayload(store, payload) {\n var normalizedPayload = this._normalizeDocumentHelper(payload);\n if (false) {\n return store.push(normalizedPayload);\n } else {\n store.push(normalizedPayload);\n }\n },\n\n /**\n @method _normalizeResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @param {Boolean} isSingle\n @return {Object} JSON-API Document\n @private\n */\n _normalizeResponse: function _normalizeResponse(store, primaryModelClass, payload, id, requestType, isSingle) {\n var normalizedPayload = this._normalizeDocumentHelper(payload);\n return normalizedPayload;\n },\n\n normalizeQueryRecordResponse: function normalizeQueryRecordResponse() {\n var normalized = this._super.apply(this, arguments);\n\n (0, _emberDataPrivateDebug.assert)('Expected the primary data returned by the serializer for a `queryRecord` response to be a single object but instead it was an array.', !Array.isArray(normalized.data), {\n id: 'ds.serializer.json-api.queryRecord-array-response'\n });\n\n return normalized;\n },\n\n /**\n @method extractAttributes\n @param {DS.Model} modelClass\n @param {Object} resourceHash\n @return {Object}\n */\n extractAttributes: function extractAttributes(modelClass, resourceHash) {\n var _this = this;\n\n var attributes = {};\n\n if (resourceHash.attributes) {\n modelClass.eachAttribute(function (key) {\n var attributeKey = _this.keyForAttribute(key, 'deserialize');\n if (resourceHash.attributes[attributeKey] !== undefined) {\n attributes[key] = resourceHash.attributes[attributeKey];\n }\n });\n }\n\n return attributes;\n },\n\n /**\n @method extractRelationship\n @param {Object} relationshipHash\n @return {Object}\n */\n extractRelationship: function extractRelationship(relationshipHash) {\n\n if (_ember['default'].typeOf(relationshipHash.data) === 'object') {\n relationshipHash.data = this._normalizeRelationshipDataHelper(relationshipHash.data);\n }\n\n if (Array.isArray(relationshipHash.data)) {\n var ret = new Array(relationshipHash.data.length);\n\n for (var i = 0; i < relationshipHash.data.length; i++) {\n var data = relationshipHash.data[i];\n ret[i] = this._normalizeRelationshipDataHelper(data);\n }\n\n relationshipHash.data = ret;\n }\n\n return relationshipHash;\n },\n\n /**\n @method extractRelationships\n @param {Object} modelClass\n @param {Object} resourceHash\n @return {Object}\n */\n extractRelationships: function extractRelationships(modelClass, resourceHash) {\n var _this2 = this;\n\n var relationships = {};\n\n if (resourceHash.relationships) {\n modelClass.eachRelationship(function (key, relationshipMeta) {\n var relationshipKey = _this2.keyForRelationship(key, relationshipMeta.kind, 'deserialize');\n if (resourceHash.relationships[relationshipKey] !== undefined) {\n\n var relationshipHash = resourceHash.relationships[relationshipKey];\n relationships[key] = _this2.extractRelationship(relationshipHash);\n }\n });\n }\n\n return relationships;\n },\n\n /**\n @method _extractType\n @param {DS.Model} modelClass\n @param {Object} resourceHash\n @return {String}\n @private\n */\n _extractType: function _extractType(modelClass, resourceHash) {\n if (false) {\n var modelName = this.modelNameFromPayloadType(resourceHash.type);\n var deprecatedModelNameLookup = this.modelNameFromPayloadKey(resourceHash.type);\n\n if (modelName !== deprecatedModelNameLookup && this._hasCustomModelNameFromPayloadKey()) {\n (0, _emberDataPrivateDebug.deprecate)(\"You are using modelNameFromPayloadKey to normalize the type for a polymorphic relationship. This has been deprecated in favor of modelNameFromPayloadType\", false, {\n id: 'ds.json-api-serializer.deprecated-model-name-for-polymorphic-type',\n until: '3.0.0'\n });\n\n modelName = deprecatedModelNameLookup;\n }\n\n return modelName;\n } else {\n return this.modelNameFromPayloadKey(resourceHash.type);\n }\n },\n\n /**\n @method modelNameFromPayloadKey\n @param {String} key\n @return {String} the model's modelName\n */\n // TODO @deprecated Use modelNameFromPayloadType instead\n modelNameFromPayloadKey: function modelNameFromPayloadKey(key) {\n return (0, _emberInflector.singularize)((0, _emberDataPrivateSystemNormalizeModelName['default'])(key));\n },\n\n /**\n @method payloadKeyFromModelName\n @param {String} modelName\n @return {String}\n */\n // TODO @deprecated Use payloadTypeFromModelName instead\n payloadKeyFromModelName: function payloadKeyFromModelName(modelName) {\n return (0, _emberInflector.pluralize)(modelName);\n },\n\n /**\n @method normalize\n @param {DS.Model} modelClass\n @param {Object} resourceHash the resource hash from the adapter\n @return {Object} the normalized resource hash\n */\n normalize: function normalize(modelClass, resourceHash) {\n if (resourceHash.attributes) {\n this.normalizeUsingDeclaredMapping(modelClass, resourceHash.attributes);\n }\n\n if (resourceHash.relationships) {\n this.normalizeUsingDeclaredMapping(modelClass, resourceHash.relationships);\n }\n\n var data = {\n id: this.extractId(modelClass, resourceHash),\n type: this._extractType(modelClass, resourceHash),\n attributes: this.extractAttributes(modelClass, resourceHash),\n relationships: this.extractRelationships(modelClass, resourceHash)\n };\n\n this.applyTransforms(modelClass, data.attributes);\n\n return { data: data };\n },\n\n /**\n `keyForAttribute` can be used to define rules for how to convert an\n attribute name in your model to a key in your JSON.\n By default `JSONAPISerializer` follows the format used on the examples of\n http://jsonapi.org/format and uses dashes as the word separator in the JSON\n attribute keys.\n This behaviour can be easily customized by extending this method.\n Example\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.JSONAPISerializer.extend({\n keyForAttribute: function(attr, method) {\n return Ember.String.dasherize(attr).toUpperCase();\n }\n });\n ```\n @method keyForAttribute\n @param {String} key\n @param {String} method\n @return {String} normalized key\n */\n keyForAttribute: function keyForAttribute(key, method) {\n return dasherize(key);\n },\n\n /**\n `keyForRelationship` can be used to define a custom key when\n serializing and deserializing relationship properties.\n By default `JSONAPISerializer` follows the format used on the examples of\n http://jsonapi.org/format and uses dashes as word separators in\n relationship properties.\n This behaviour can be easily customized by extending this method.\n Example\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.JSONAPISerializer.extend({\n keyForRelationship: function(key, relationship, method) {\n return Ember.String.underscore(key);\n }\n });\n ```\n @method keyForRelationship\n @param {String} key\n @param {String} typeClass\n @param {String} method\n @return {String} normalized key\n */\n keyForRelationship: function keyForRelationship(key, typeClass, method) {\n return dasherize(key);\n },\n\n /**\n @method serialize\n @param {DS.Snapshot} snapshot\n @param {Object} options\n @return {Object} json\n */\n serialize: function serialize(snapshot, options) {\n var data = this._super.apply(this, arguments);\n\n var payloadType = undefined;\n if (false) {\n payloadType = this.payloadTypeFromModelName(snapshot.modelName);\n var deprecatedPayloadTypeLookup = this.payloadKeyFromModelName(snapshot.modelName);\n\n if (payloadType !== deprecatedPayloadTypeLookup && this._hasCustomPayloadKeyFromModelName()) {\n (0, _emberDataPrivateDebug.deprecate)(\"You used payloadKeyFromModelName to customize how a type is serialized. Use payloadTypeFromModelName instead.\", false, {\n id: 'ds.json-api-serializer.deprecated-payload-type-for-model',\n until: '3.0.0'\n });\n\n payloadType = deprecatedPayloadTypeLookup;\n }\n } else {\n payloadType = this.payloadKeyFromModelName(snapshot.modelName);\n }\n\n data.type = payloadType;\n return { data: data };\n },\n\n /**\n @method serializeAttribute\n @param {DS.Snapshot} snapshot\n @param {Object} json\n @param {String} key\n @param {Object} attribute\n */\n serializeAttribute: function serializeAttribute(snapshot, json, key, attribute) {\n var type = attribute.type;\n\n if (this._canSerialize(key)) {\n json.attributes = json.attributes || {};\n\n var value = snapshot.attr(key);\n if (type) {\n var transform = this.transformFor(type);\n value = transform.serialize(value, attribute.options);\n }\n\n var payloadKey = this._getMappedKey(key, snapshot.type);\n\n if (payloadKey === key) {\n payloadKey = this.keyForAttribute(key, 'serialize');\n }\n\n json.attributes[payloadKey] = value;\n }\n },\n\n /**\n @method serializeBelongsTo\n @param {DS.Snapshot} snapshot\n @param {Object} json\n @param {Object} relationship\n */\n serializeBelongsTo: function serializeBelongsTo(snapshot, json, relationship) {\n var key = relationship.key;\n\n if (this._canSerialize(key)) {\n var belongsTo = snapshot.belongsTo(key);\n if (belongsTo !== undefined) {\n\n json.relationships = json.relationships || {};\n\n var payloadKey = this._getMappedKey(key, snapshot.type);\n if (payloadKey === key) {\n payloadKey = this.keyForRelationship(key, 'belongsTo', 'serialize');\n }\n\n var data = null;\n if (belongsTo) {\n var payloadType = undefined;\n\n if (false) {\n payloadType = this.payloadTypeFromModelName(belongsTo.modelName);\n var deprecatedPayloadTypeLookup = this.payloadKeyFromModelName(belongsTo.modelName);\n\n if (payloadType !== deprecatedPayloadTypeLookup && this._hasCustomPayloadKeyFromModelName()) {\n (0, _emberDataPrivateDebug.deprecate)(\"You used payloadKeyFromModelName to serialize type for belongs-to relationship. Use payloadTypeFromModelName instead.\", false, {\n id: 'ds.json-api-serializer.deprecated-payload-type-for-belongs-to',\n until: '3.0.0'\n });\n\n payloadType = deprecatedPayloadTypeLookup;\n }\n } else {\n payloadType = this.payloadKeyFromModelName(belongsTo.modelName);\n }\n\n data = {\n type: payloadType,\n id: belongsTo.id\n };\n }\n\n json.relationships[payloadKey] = { data: data };\n }\n }\n },\n\n /**\n @method serializeHasMany\n @param {DS.Snapshot} snapshot\n @param {Object} json\n @param {Object} relationship\n */\n serializeHasMany: function serializeHasMany(snapshot, json, relationship) {\n var key = relationship.key;\n var shouldSerializeHasMany = '_shouldSerializeHasMany';\n if (false) {\n shouldSerializeHasMany = 'shouldSerializeHasMany';\n }\n\n if (this[shouldSerializeHasMany](snapshot, key, relationship)) {\n var hasMany = snapshot.hasMany(key);\n if (hasMany !== undefined) {\n\n json.relationships = json.relationships || {};\n\n var payloadKey = this._getMappedKey(key, snapshot.type);\n if (payloadKey === key && this.keyForRelationship) {\n payloadKey = this.keyForRelationship(key, 'hasMany', 'serialize');\n }\n\n var data = new Array(hasMany.length);\n\n for (var i = 0; i < hasMany.length; i++) {\n var item = hasMany[i];\n\n var payloadType = undefined;\n\n if (false) {\n payloadType = this.payloadTypeFromModelName(item.modelName);\n var deprecatedPayloadTypeLookup = this.payloadKeyFromModelName(item.modelName);\n\n if (payloadType !== deprecatedPayloadTypeLookup && this._hasCustomPayloadKeyFromModelName()) {\n (0, _emberDataPrivateDebug.deprecate)(\"You used payloadKeyFromModelName to serialize type for belongs-to relationship. Use payloadTypeFromModelName instead.\", false, {\n id: 'ds.json-api-serializer.deprecated-payload-type-for-has-many',\n until: '3.0.0'\n });\n\n payloadType = deprecatedPayloadTypeLookup;\n }\n } else {\n payloadType = this.payloadKeyFromModelName(item.modelName);\n }\n\n data[i] = {\n type: payloadType,\n id: item.id\n };\n }\n\n json.relationships[payloadKey] = { data: data };\n }\n }\n }\n });\n\n if (false) {\n\n JSONAPISerializer.reopen({\n\n /**\n `modelNameFromPayloadType` can be used to change the mapping for a DS model\n name, taken from the value in the payload.\n Say your API namespaces the type of a model and returns the following\n payload for the `post` model:\n ```javascript\n // GET /api/posts/1\n {\n \"data\": {\n \"id\": 1,\n \"type: \"api::v1::post\"\n }\n }\n ```\n By overwriting `modelNameFromPayloadType` you can specify that the\n `posr` model should be used:\n ```app/serializers/application.js\n import DS from \"ember-data\";\n export default DS.JSONAPISerializer.extend({\n modelNameFromPayloadType(payloadType) {\n return payloadType.replace('api::v1::', '');\n }\n });\n ```\n By default the modelName for a model is its singularized name in dasherized\n form. Usually, Ember Data can use the correct inflection to do this for\n you. Most of the time, you won't need to override\n `modelNameFromPayloadType` for this purpose.\n Also take a look at\n [payloadTypeFromModelName](#method_payloadTypeFromModelName) to customize\n how the type of a record should be serialized.\n @method modelNameFromPayloadType\n @public\n @param {String} payloadType type from payload\n @return {String} modelName\n */\n modelNameFromPayloadType: function modelNameFromPayloadType(type) {\n return (0, _emberInflector.singularize)((0, _emberDataPrivateSystemNormalizeModelName['default'])(type));\n },\n\n /**\n `payloadTypeFromModelName` can be used to change the mapping for the type in\n the payload, taken from the model name.\n Say your API namespaces the type of a model and expects the following\n payload when you update the `post` model:\n ```javascript\n // POST /api/posts/1\n {\n \"data\": {\n \"id\": 1,\n \"type\": \"api::v1::post\"\n }\n }\n ```\n By overwriting `payloadTypeFromModelName` you can specify that the\n namespaces model name for the `post` should be used:\n ```app/serializers/application.js\n import DS from \"ember-data\";\n export default JSONAPISerializer.extend({\n payloadTypeFromModelName(modelName) {\n return \"api::v1::\" + modelName;\n }\n });\n ```\n By default the payload type is the pluralized model name. Usually, Ember\n Data can use the correct inflection to do this for you. Most of the time,\n you won't need to override `payloadTypeFromModelName` for this purpose.\n Also take a look at\n [modelNameFromPayloadType](#method_modelNameFromPayloadType) to customize\n how the model name from should be mapped from the payload.\n @method payloadTypeFromModelName\n @public\n @param {String} modelname modelName from the record\n @return {String} payloadType\n */\n payloadTypeFromModelName: function payloadTypeFromModelName(modelName) {\n return (0, _emberInflector.pluralize)(modelName);\n },\n\n _hasCustomModelNameFromPayloadKey: function _hasCustomModelNameFromPayloadKey() {\n return this.modelNameFromPayloadKey !== JSONAPISerializer.prototype.modelNameFromPayloadKey;\n },\n\n _hasCustomPayloadKeyFromModelName: function _hasCustomPayloadKeyFromModelName() {\n return this.payloadKeyFromModelName !== JSONAPISerializer.prototype.payloadKeyFromModelName;\n }\n\n });\n }\n\n (0, _emberDataPrivateDebug.runInDebug)(function () {\n JSONAPISerializer.reopen({\n willMergeMixin: function willMergeMixin(props) {\n (0, _emberDataPrivateDebug.warn)('The JSONAPISerializer does not work with the EmbeddedRecordsMixin because the JSON API spec does not describe how to format embedded resources.', !props.isEmbeddedRecordsMixin, {\n id: 'ds.serializer.embedded-records-mixin-not-supported'\n });\n },\n warnMessageForUndefinedType: function warnMessageForUndefinedType() {\n return 'Encountered a resource object with an undefined type (resolved resource using ' + this.constructor.toString() + ')';\n },\n warnMessageNoModelForType: function warnMessageNoModelForType(modelName, originalType, usedLookup) {\n return 'Encountered a resource object with type \"' + originalType + '\", but no model was found for model name \"' + modelName + '\" (resolved model name using \\'' + this.constructor.toString() + '.' + usedLookup + '(\"' + originalType + '\")).';\n }\n });\n });\n\n exports['default'] = JSONAPISerializer;\n});","define('ember-data/serializers/json', ['exports', 'ember', 'ember-data/-private/debug', 'ember-data/serializer', 'ember-data/-private/system/coerce-id', 'ember-data/-private/system/normalize-model-name', 'ember-data/-private/utils', 'ember-data/-private/features', 'ember-data/adapters/errors'], function (exports, _ember, _emberDataPrivateDebug, _emberDataSerializer, _emberDataPrivateSystemCoerceId, _emberDataPrivateSystemNormalizeModelName, _emberDataPrivateUtils, _emberDataPrivateFeatures, _emberDataAdaptersErrors) {\n 'use strict';\n\n function _toConsumableArray(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];return arr2;\n } else {\n return Array.from(arr);\n }\n }\n\n var get = _ember['default'].get;\n var isNone = _ember['default'].isNone;\n var assign = _ember['default'].assign || _ember['default'].merge;\n\n /**\n Ember Data 2.0 Serializer:\n \n In Ember Data a Serializer is used to serialize and deserialize\n records when they are transferred in and out of an external source.\n This process involves normalizing property names, transforming\n attribute values and serializing relationships.\n \n By default, Ember Data uses and recommends the `JSONAPISerializer`.\n \n `JSONSerializer` is useful for simpler or legacy backends that may\n not support the http://jsonapi.org/ spec.\n \n For example, given the following `User` model and JSON payload:\n \n ```app/models/user.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n friends: DS.hasMany('user'),\n house: DS.belongsTo('location'),\n \n name: DS.attr('string')\n });\n ```\n \n ```js\n {\n id: 1,\n name: 'Sebastian',\n friends: [3, 4],\n links: {\n house: '/houses/lefkada'\n }\n }\n ```\n \n `JSONSerializer` will normalize the JSON payload to the JSON API format that the\n Ember Data store expects.\n \n You can customize how JSONSerializer processes its payload by passing options in\n the `attrs` hash or by subclassing the `JSONSerializer` and overriding hooks:\n \n - To customize how a single record is normalized, use the `normalize` hook.\n - To customize how `JSONSerializer` normalizes the whole server response, use the\n `normalizeResponse` hook.\n - To customize how `JSONSerializer` normalizes a specific response from the server,\n use one of the many specific `normalizeResponse` hooks.\n - To customize how `JSONSerializer` normalizes your id, attributes or relationships,\n use the `extractId`, `extractAttributes` and `extractRelationships` hooks.\n \n The `JSONSerializer` normalization process follows these steps:\n \n - `normalizeResponse` - entry method to the serializer.\n - `normalizeCreateRecordResponse` - a `normalizeResponse` for a specific operation is called.\n - `normalizeSingleResponse`|`normalizeArrayResponse` - for methods like `createRecord` we expect\n a single record back, while for methods like `findAll` we expect multiple methods back.\n - `normalize` - `normalizeArray` iterates and calls `normalize` for each of its records while `normalizeSingle`\n calls it once. This is the method you most likely want to subclass.\n - `extractId` | `extractAttributes` | `extractRelationships` - `normalize` delegates to these methods to\n turn the record payload into the JSON API format.\n \n @class JSONSerializer\n @namespace DS\n @extends DS.Serializer\n */\n var JSONSerializer = _emberDataSerializer['default'].extend({\n\n /**\n The `primaryKey` is used when serializing and deserializing\n data. Ember Data always uses the `id` property to store the id of\n the record. The external source may not always follow this\n convention. In these cases it is useful to override the\n `primaryKey` property to match the `primaryKey` of your external\n store.\n Example\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n primaryKey: '_id'\n });\n ```\n @property primaryKey\n @type {String}\n @default 'id'\n */\n primaryKey: 'id',\n\n /**\n The `attrs` object can be used to declare a simple mapping between\n property names on `DS.Model` records and payload keys in the\n serialized JSON object representing the record. An object with the\n property `key` can also be used to designate the attribute's key on\n the response payload.\n Example\n ```app/models/person.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n firstName: DS.attr('string'),\n lastName: DS.attr('string'),\n occupation: DS.attr('string'),\n admin: DS.attr('boolean')\n });\n ```\n ```app/serializers/person.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n attrs: {\n admin: 'is_admin',\n occupation: { key: 'career' }\n }\n });\n ```\n You can also remove attributes by setting the `serialize` key to\n `false` in your mapping object.\n Example\n ```app/serializers/person.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n attrs: {\n admin: { serialize: false },\n occupation: { key: 'career' }\n }\n });\n ```\n When serialized:\n ```javascript\n {\n \"firstName\": \"Harry\",\n \"lastName\": \"Houdini\",\n \"career\": \"magician\"\n }\n ```\n Note that the `admin` is now not included in the payload.\n @property attrs\n @type {Object}\n */\n mergedProperties: ['attrs'],\n\n /**\n Given a subclass of `DS.Model` and a JSON object this method will\n iterate through each attribute of the `DS.Model` and invoke the\n `DS.Transform#deserialize` method on the matching property of the\n JSON object. This method is typically called after the\n serializer's `normalize` method.\n @method applyTransforms\n @private\n @param {DS.Model} typeClass\n @param {Object} data The data to transform\n @return {Object} data The transformed data object\n */\n applyTransforms: function applyTransforms(typeClass, data) {\n var _this = this;\n\n var attributes = get(typeClass, 'attributes');\n\n typeClass.eachTransformedAttribute(function (key, typeClass) {\n if (data[key] === undefined) {\n return;\n }\n\n var transform = _this.transformFor(typeClass);\n var transformMeta = attributes.get(key);\n data[key] = transform.deserialize(data[key], transformMeta.options);\n });\n\n return data;\n },\n\n /**\n The `normalizeResponse` method is used to normalize a payload from the\n server to a JSON-API Document.\n http://jsonapi.org/format/#document-structure\n This method delegates to a more specific normalize method based on\n the `requestType`.\n To override this method with a custom one, make sure to call\n `return this._super(store, primaryModelClass, payload, id, requestType)` with your\n pre-processed data.\n Here's an example of using `normalizeResponse` manually:\n ```javascript\n socket.on('message', function(message) {\n var data = message.data;\n var modelClass = store.modelFor(data.modelName);\n var serializer = store.serializerFor(data.modelName);\n var normalized = serializer.normalizeSingleResponse(store, modelClass, data, data.id);\n store.push(normalized);\n });\n ```\n @since 1.13.0\n @method normalizeResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeResponse: function normalizeResponse(store, primaryModelClass, payload, id, requestType) {\n switch (requestType) {\n case 'findRecord':\n return this.normalizeFindRecordResponse.apply(this, arguments);\n case 'queryRecord':\n return this.normalizeQueryRecordResponse.apply(this, arguments);\n case 'findAll':\n return this.normalizeFindAllResponse.apply(this, arguments);\n case 'findBelongsTo':\n return this.normalizeFindBelongsToResponse.apply(this, arguments);\n case 'findHasMany':\n return this.normalizeFindHasManyResponse.apply(this, arguments);\n case 'findMany':\n return this.normalizeFindManyResponse.apply(this, arguments);\n case 'query':\n return this.normalizeQueryResponse.apply(this, arguments);\n case 'createRecord':\n return this.normalizeCreateRecordResponse.apply(this, arguments);\n case 'deleteRecord':\n return this.normalizeDeleteRecordResponse.apply(this, arguments);\n case 'updateRecord':\n return this.normalizeUpdateRecordResponse.apply(this, arguments);\n }\n },\n\n /**\n @since 1.13.0\n @method normalizeFindRecordResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeFindRecordResponse: function normalizeFindRecordResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeSingleResponse.apply(this, arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeQueryRecordResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeQueryRecordResponse: function normalizeQueryRecordResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeSingleResponse.apply(this, arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeFindAllResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeFindAllResponse: function normalizeFindAllResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeArrayResponse.apply(this, arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeFindBelongsToResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeFindBelongsToResponse: function normalizeFindBelongsToResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeSingleResponse.apply(this, arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeFindHasManyResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeFindHasManyResponse: function normalizeFindHasManyResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeArrayResponse.apply(this, arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeFindManyResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeFindManyResponse: function normalizeFindManyResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeArrayResponse.apply(this, arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeQueryResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeQueryResponse: function normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeArrayResponse.apply(this, arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeCreateRecordResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeCreateRecordResponse: function normalizeCreateRecordResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeSaveResponse.apply(this, arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeDeleteRecordResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeDeleteRecordResponse: function normalizeDeleteRecordResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeSaveResponse.apply(this, arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeUpdateRecordResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeUpdateRecordResponse: function normalizeUpdateRecordResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeSaveResponse.apply(this, arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeSaveResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeSaveResponse: function normalizeSaveResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeSingleResponse.apply(this, arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeSingleResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeSingleResponse: function normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n return this._normalizeResponse(store, primaryModelClass, payload, id, requestType, true);\n },\n\n /**\n @since 1.13.0\n @method normalizeArrayResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeArrayResponse: function normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n return this._normalizeResponse(store, primaryModelClass, payload, id, requestType, false);\n },\n\n /**\n @method _normalizeResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @param {Boolean} isSingle\n @return {Object} JSON-API Document\n @private\n */\n _normalizeResponse: function _normalizeResponse(store, primaryModelClass, payload, id, requestType, isSingle) {\n var documentHash = {\n data: null,\n included: []\n };\n\n var meta = this.extractMeta(store, primaryModelClass, payload);\n if (meta) {\n (0, _emberDataPrivateDebug.assert)('The `meta` returned from `extractMeta` has to be an object, not \"' + _ember['default'].typeOf(meta) + '\".', _ember['default'].typeOf(meta) === 'object');\n documentHash.meta = meta;\n }\n\n if (isSingle) {\n var _normalize = this.normalize(primaryModelClass, payload);\n\n var data = _normalize.data;\n var included = _normalize.included;\n\n documentHash.data = data;\n if (included) {\n documentHash.included = included;\n }\n } else {\n var ret = new Array(payload.length);\n for (var i = 0, l = payload.length; i < l; i++) {\n var item = payload[i];\n\n var _normalize2 = this.normalize(primaryModelClass, item);\n\n var data = _normalize2.data;\n var included = _normalize2.included;\n\n if (included) {\n var _documentHash$included;\n\n (_documentHash$included = documentHash.included).push.apply(_documentHash$included, _toConsumableArray(included));\n }\n ret[i] = data;\n }\n\n documentHash.data = ret;\n }\n\n return documentHash;\n },\n\n /**\n Normalizes a part of the JSON payload returned by\n the server. You should override this method, munge the hash\n and call super if you have generic normalization to do.\n It takes the type of the record that is being normalized\n (as a DS.Model class), the property where the hash was\n originally found, and the hash to normalize.\n You can use this method, for example, to normalize underscored keys to camelized\n or other general-purpose normalizations.\n Example\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n normalize: function(typeClass, hash) {\n var fields = Ember.get(typeClass, 'fields');\n fields.forEach(function(field) {\n var payloadField = Ember.String.underscore(field);\n if (field === payloadField) { return; }\n hash[field] = hash[payloadField];\n delete hash[payloadField];\n });\n return this._super.apply(this, arguments);\n }\n });\n ```\n @method normalize\n @param {DS.Model} typeClass\n @param {Object} hash\n @return {Object}\n */\n normalize: function normalize(modelClass, resourceHash) {\n var data = null;\n\n if (resourceHash) {\n this.normalizeUsingDeclaredMapping(modelClass, resourceHash);\n if (_ember['default'].typeOf(resourceHash.links) === 'object') {\n this.normalizeUsingDeclaredMapping(modelClass, resourceHash.links);\n }\n\n data = {\n id: this.extractId(modelClass, resourceHash),\n type: modelClass.modelName,\n attributes: this.extractAttributes(modelClass, resourceHash),\n relationships: this.extractRelationships(modelClass, resourceHash)\n };\n\n this.applyTransforms(modelClass, data.attributes);\n }\n\n return { data: data };\n },\n\n /**\n Returns the resource's ID.\n @method extractId\n @param {Object} modelClass\n @param {Object} resourceHash\n @return {String}\n */\n extractId: function extractId(modelClass, resourceHash) {\n var primaryKey = get(this, 'primaryKey');\n var id = resourceHash[primaryKey];\n return (0, _emberDataPrivateSystemCoerceId['default'])(id);\n },\n\n /**\n Returns the resource's attributes formatted as a JSON-API \"attributes object\".\n http://jsonapi.org/format/#document-resource-object-attributes\n @method extractAttributes\n @param {Object} modelClass\n @param {Object} resourceHash\n @return {Object}\n */\n extractAttributes: function extractAttributes(modelClass, resourceHash) {\n var _this2 = this;\n\n var attributeKey;\n var attributes = {};\n\n modelClass.eachAttribute(function (key) {\n attributeKey = _this2.keyForAttribute(key, 'deserialize');\n if (resourceHash[attributeKey] !== undefined) {\n attributes[key] = resourceHash[attributeKey];\n }\n });\n\n return attributes;\n },\n\n /**\n Returns a relationship formatted as a JSON-API \"relationship object\".\n http://jsonapi.org/format/#document-resource-object-relationships\n @method extractRelationship\n @param {Object} relationshipModelName\n @param {Object} relationshipHash\n @return {Object}\n */\n extractRelationship: function extractRelationship(relationshipModelName, relationshipHash) {\n if (_ember['default'].isNone(relationshipHash)) {\n return null;\n }\n /*\n When `relationshipHash` is an object it usually means that the relationship\n is polymorphic. It could however also be embedded resources that the\n EmbeddedRecordsMixin has be able to process.\n */\n if (_ember['default'].typeOf(relationshipHash) === 'object') {\n if (relationshipHash.id) {\n relationshipHash.id = (0, _emberDataPrivateSystemCoerceId['default'])(relationshipHash.id);\n }\n\n var modelClass = this.store.modelFor(relationshipModelName);\n if (relationshipHash.type && !(0, _emberDataPrivateUtils.modelHasAttributeOrRelationshipNamedType)(modelClass)) {\n\n if (false) {\n var modelName = this.modelNameFromPayloadType(relationshipHash.type);\n var deprecatedModelNameLookup = this.modelNameFromPayloadKey(relationshipHash.type);\n\n if (modelName !== deprecatedModelNameLookup && this._hasCustomModelNameFromPayloadKey()) {\n (0, _emberDataPrivateDebug.deprecate)(\"You used modelNameFromPayloadKey to customize how a type is normalized. Use modelNameFromPayloadType instead\", false, {\n id: 'ds.json-serializer.deprecated-type-for-polymorphic-relationship',\n until: '3.0.0'\n });\n\n modelName = deprecatedModelNameLookup;\n }\n\n relationshipHash.type = modelName;\n } else {\n relationshipHash.type = this.modelNameFromPayloadKey(relationshipHash.type);\n }\n }\n return relationshipHash;\n }\n return { id: (0, _emberDataPrivateSystemCoerceId['default'])(relationshipHash), type: relationshipModelName };\n },\n\n /**\n Returns a polymorphic relationship formatted as a JSON-API \"relationship object\".\n http://jsonapi.org/format/#document-resource-object-relationships\n `relationshipOptions` is a hash which contains more information about the\n polymorphic relationship which should be extracted:\n - `resourceHash` complete hash of the resource the relationship should be\n extracted from\n - `relationshipKey` key under which the value for the relationship is\n extracted from the resourceHash\n - `relationshipMeta` meta information about the relationship\n @method extractPolymorphicRelationship\n @param {Object} relationshipModelName\n @param {Object} relationshipHash\n @param {Object} relationshipOptions\n @return {Object}\n */\n extractPolymorphicRelationship: function extractPolymorphicRelationship(relationshipModelName, relationshipHash, relationshipOptions) {\n return this.extractRelationship(relationshipModelName, relationshipHash);\n },\n\n /**\n Returns the resource's relationships formatted as a JSON-API \"relationships object\".\n http://jsonapi.org/format/#document-resource-object-relationships\n @method extractRelationships\n @param {Object} modelClass\n @param {Object} resourceHash\n @return {Object}\n */\n extractRelationships: function extractRelationships(modelClass, resourceHash) {\n var _this3 = this;\n\n var relationships = {};\n\n modelClass.eachRelationship(function (key, relationshipMeta) {\n var relationship = null;\n var relationshipKey = _this3.keyForRelationship(key, relationshipMeta.kind, 'deserialize');\n if (resourceHash[relationshipKey] !== undefined) {\n var data = null;\n var relationshipHash = resourceHash[relationshipKey];\n if (relationshipMeta.kind === 'belongsTo') {\n if (relationshipMeta.options.polymorphic) {\n // extracting a polymorphic belongsTo may need more information\n // than the type and the hash (which might only be an id) for the\n // relationship, hence we pass the key, resource and\n // relationshipMeta too\n data = _this3.extractPolymorphicRelationship(relationshipMeta.type, relationshipHash, { key: key, resourceHash: resourceHash, relationshipMeta: relationshipMeta });\n } else {\n data = _this3.extractRelationship(relationshipMeta.type, relationshipHash);\n }\n } else if (relationshipMeta.kind === 'hasMany') {\n if (!_ember['default'].isNone(relationshipHash)) {\n data = new Array(relationshipHash.length);\n for (var i = 0, l = relationshipHash.length; i < l; i++) {\n var item = relationshipHash[i];\n data[i] = _this3.extractRelationship(relationshipMeta.type, item);\n }\n }\n }\n relationship = { data: data };\n }\n\n var linkKey = _this3.keyForLink(key, relationshipMeta.kind);\n if (resourceHash.links && resourceHash.links[linkKey] !== undefined) {\n var related = resourceHash.links[linkKey];\n relationship = relationship || {};\n relationship.links = { related: related };\n }\n\n if (relationship) {\n relationships[key] = relationship;\n }\n });\n\n return relationships;\n },\n\n /**\n @method modelNameFromPayloadKey\n @param {String} key\n @return {String} the model's modelName\n */\n // TODO @deprecated Use modelNameFromPayloadType instead\n modelNameFromPayloadKey: function modelNameFromPayloadKey(key) {\n return (0, _emberDataPrivateSystemNormalizeModelName['default'])(key);\n },\n\n /**\n @method normalizeAttributes\n @private\n */\n normalizeAttributes: function normalizeAttributes(typeClass, hash) {\n var _this4 = this;\n\n var payloadKey;\n\n if (this.keyForAttribute) {\n typeClass.eachAttribute(function (key) {\n payloadKey = _this4.keyForAttribute(key, 'deserialize');\n if (key === payloadKey) {\n return;\n }\n if (hash[payloadKey] === undefined) {\n return;\n }\n\n hash[key] = hash[payloadKey];\n delete hash[payloadKey];\n });\n }\n },\n\n /**\n @method normalizeRelationships\n @private\n */\n normalizeRelationships: function normalizeRelationships(typeClass, hash) {\n var _this5 = this;\n\n var payloadKey;\n\n if (this.keyForRelationship) {\n typeClass.eachRelationship(function (key, relationship) {\n payloadKey = _this5.keyForRelationship(key, relationship.kind, 'deserialize');\n if (key === payloadKey) {\n return;\n }\n if (hash[payloadKey] === undefined) {\n return;\n }\n\n hash[key] = hash[payloadKey];\n delete hash[payloadKey];\n });\n }\n },\n\n /**\n @method normalizeUsingDeclaredMapping\n @private\n */\n normalizeUsingDeclaredMapping: function normalizeUsingDeclaredMapping(modelClass, hash) {\n var attrs = get(this, 'attrs');\n var normalizedKey, payloadKey, key;\n\n if (attrs) {\n for (key in attrs) {\n normalizedKey = payloadKey = this._getMappedKey(key, modelClass);\n\n if (hash[payloadKey] === undefined) {\n continue;\n }\n\n if (get(modelClass, 'attributes').has(key)) {\n normalizedKey = this.keyForAttribute(key);\n }\n\n if (get(modelClass, 'relationshipsByName').has(key)) {\n normalizedKey = this.keyForRelationship(key);\n }\n\n if (payloadKey !== normalizedKey) {\n hash[normalizedKey] = hash[payloadKey];\n delete hash[payloadKey];\n }\n }\n }\n },\n\n /**\n Looks up the property key that was set by the custom `attr` mapping\n passed to the serializer.\n @method _getMappedKey\n @private\n @param {String} key\n @return {String} key\n */\n _getMappedKey: function _getMappedKey(key, modelClass) {\n (0, _emberDataPrivateDebug.warn)('There is no attribute or relationship with the name `' + key + '` on `' + modelClass.modelName + '`. Check your serializers attrs hash.', get(modelClass, 'attributes').has(key) || get(modelClass, 'relationshipsByName').has(key), {\n id: 'ds.serializer.no-mapped-attrs-key'\n });\n\n var attrs = get(this, 'attrs');\n var mappedKey;\n if (attrs && attrs[key]) {\n mappedKey = attrs[key];\n //We need to account for both the { title: 'post_title' } and\n //{ title: { key: 'post_title' }} forms\n if (mappedKey.key) {\n mappedKey = mappedKey.key;\n }\n if (typeof mappedKey === 'string') {\n key = mappedKey;\n }\n }\n\n return key;\n },\n\n /**\n Check attrs.key.serialize property to inform if the `key`\n can be serialized\n @method _canSerialize\n @private\n @param {String} key\n @return {boolean} true if the key can be serialized\n */\n _canSerialize: function _canSerialize(key) {\n var attrs = get(this, 'attrs');\n\n return !attrs || !attrs[key] || attrs[key].serialize !== false;\n },\n\n /**\n When attrs.key.serialize is set to true then\n it takes priority over the other checks and the related\n attribute/relationship will be serialized\n @method _mustSerialize\n @private\n @param {String} key\n @return {boolean} true if the key must be serialized\n */\n _mustSerialize: function _mustSerialize(key) {\n var attrs = get(this, 'attrs');\n\n return attrs && attrs[key] && attrs[key].serialize === true;\n },\n\n /**\n Check if the given hasMany relationship should be serialized\n @method shouldSerializeHasMany\n @param {DS.Snapshot} snapshot\n @param {String} key\n @param {String} relationshipType\n @return {boolean} true if the hasMany relationship should be serialized\n */\n\n shouldSerializeHasMany: function shouldSerializeHasMany(snapshot, key, relationship) {\n if (this._shouldSerializeHasMany !== JSONSerializer.prototype._shouldSerializeHasMany) {\n (0, _emberDataPrivateDebug.deprecate)('The private method _shouldSerializeHasMany has been promoted to the public API. Please remove the underscore to use the public shouldSerializeHasMany method.', false, {\n id: 'ds.serializer.private-should-serialize-has-many',\n until: '3.0.0'\n });\n }\n\n return this._shouldSerializeHasMany(snapshot, key, relationship);\n },\n\n /**\n Check if the given hasMany relationship should be serialized\n @method _shouldSerializeHasMany\n @private\n @param {DS.Snapshot} snapshot\n @param {String} key\n @param {String} relationshipType\n @return {boolean} true if the hasMany relationship should be serialized\n */\n _shouldSerializeHasMany: function _shouldSerializeHasMany(snapshot, key, relationship) {\n var relationshipType = snapshot.type.determineRelationshipType(relationship, this.store);\n if (this._mustSerialize(key)) {\n return true;\n }\n return this._canSerialize(key) && (relationshipType === 'manyToNone' || relationshipType === 'manyToMany');\n },\n\n // SERIALIZE\n /**\n Called when a record is saved in order to convert the\n record into JSON.\n By default, it creates a JSON object with a key for\n each attribute and belongsTo relationship.\n For example, consider this model:\n ```app/models/comment.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n title: DS.attr(),\n body: DS.attr(),\n author: DS.belongsTo('user')\n });\n ```\n The default serialization would create a JSON object like:\n ```javascript\n {\n \"title\": \"Rails is unagi\",\n \"body\": \"Rails? Omakase? O_O\",\n \"author\": 12\n }\n ```\n By default, attributes are passed through as-is, unless\n you specified an attribute type (`DS.attr('date')`). If\n you specify a transform, the JavaScript value will be\n serialized when inserted into the JSON hash.\n By default, belongs-to relationships are converted into\n IDs when inserted into the JSON hash.\n ## IDs\n `serialize` takes an options hash with a single option:\n `includeId`. If this option is `true`, `serialize` will,\n by default include the ID in the JSON object it builds.\n The adapter passes in `includeId: true` when serializing\n a record for `createRecord`, but not for `updateRecord`.\n ## Customization\n Your server may expect a different JSON format than the\n built-in serialization format.\n In that case, you can implement `serialize` yourself and\n return a JSON hash of your choosing.\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n serialize: function(snapshot, options) {\n var json = {\n POST_TTL: snapshot.attr('title'),\n POST_BDY: snapshot.attr('body'),\n POST_CMS: snapshot.hasMany('comments', { ids: true })\n }\n if (options.includeId) {\n json.POST_ID_ = snapshot.id;\n }\n return json;\n }\n });\n ```\n ## Customizing an App-Wide Serializer\n If you want to define a serializer for your entire\n application, you'll probably want to use `eachAttribute`\n and `eachRelationship` on the record.\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n serialize: function(snapshot, options) {\n var json = {};\n snapshot.eachAttribute(function(name) {\n json[serverAttributeName(name)] = snapshot.attr(name);\n })\n snapshot.eachRelationship(function(name, relationship) {\n if (relationship.kind === 'hasMany') {\n json[serverHasManyName(name)] = snapshot.hasMany(name, { ids: true });\n }\n });\n if (options.includeId) {\n json.ID_ = snapshot.id;\n }\n return json;\n }\n });\n function serverAttributeName(attribute) {\n return attribute.underscore().toUpperCase();\n }\n function serverHasManyName(name) {\n return serverAttributeName(name.singularize()) + \"_IDS\";\n }\n ```\n This serializer will generate JSON that looks like this:\n ```javascript\n {\n \"TITLE\": \"Rails is omakase\",\n \"BODY\": \"Yep. Omakase.\",\n \"COMMENT_IDS\": [ 1, 2, 3 ]\n }\n ```\n ## Tweaking the Default JSON\n If you just want to do some small tweaks on the default JSON,\n you can call super first and make the tweaks on the returned\n JSON.\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n serialize: function(snapshot, options) {\n var json = this._super.apply(this, arguments);\n json.subject = json.title;\n delete json.title;\n return json;\n }\n });\n ```\n @method serialize\n @param {DS.Snapshot} snapshot\n @param {Object} options\n @return {Object} json\n */\n serialize: function serialize(snapshot, options) {\n var _this6 = this;\n\n var json = {};\n\n if (options && options.includeId) {\n var id = snapshot.id;\n\n if (id) {\n json[get(this, 'primaryKey')] = id;\n }\n }\n\n snapshot.eachAttribute(function (key, attribute) {\n _this6.serializeAttribute(snapshot, json, key, attribute);\n });\n\n snapshot.eachRelationship(function (key, relationship) {\n if (relationship.kind === 'belongsTo') {\n _this6.serializeBelongsTo(snapshot, json, relationship);\n } else if (relationship.kind === 'hasMany') {\n _this6.serializeHasMany(snapshot, json, relationship);\n }\n });\n\n return json;\n },\n\n /**\n You can use this method to customize how a serialized record is added to the complete\n JSON hash to be sent to the server. By default the JSON Serializer does not namespace\n the payload and just sends the raw serialized JSON object.\n If your server expects namespaced keys, you should consider using the RESTSerializer.\n Otherwise you can override this method to customize how the record is added to the hash.\n The hash property should be modified by reference.\n For example, your server may expect underscored root objects.\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend({\n serializeIntoHash: function(data, type, snapshot, options) {\n var root = Ember.String.decamelize(type.modelName);\n data[root] = this.serialize(snapshot, options);\n }\n });\n ```\n @method serializeIntoHash\n @param {Object} hash\n @param {DS.Model} typeClass\n @param {DS.Snapshot} snapshot\n @param {Object} options\n */\n serializeIntoHash: function serializeIntoHash(hash, typeClass, snapshot, options) {\n assign(hash, this.serialize(snapshot, options));\n },\n\n /**\n `serializeAttribute` can be used to customize how `DS.attr`\n properties are serialized\n For example if you wanted to ensure all your attributes were always\n serialized as properties on an `attributes` object you could\n write:\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n serializeAttribute: function(snapshot, json, key, attributes) {\n json.attributes = json.attributes || {};\n this._super(snapshot, json.attributes, key, attributes);\n }\n });\n ```\n @method serializeAttribute\n @param {DS.Snapshot} snapshot\n @param {Object} json\n @param {String} key\n @param {Object} attribute\n */\n serializeAttribute: function serializeAttribute(snapshot, json, key, attribute) {\n var type = attribute.type;\n\n if (this._canSerialize(key)) {\n var value = snapshot.attr(key);\n if (type) {\n var transform = this.transformFor(type);\n value = transform.serialize(value, attribute.options);\n }\n\n // if provided, use the mapping provided by `attrs` in\n // the serializer\n var payloadKey = this._getMappedKey(key, snapshot.type);\n\n if (payloadKey === key && this.keyForAttribute) {\n payloadKey = this.keyForAttribute(key, 'serialize');\n }\n\n json[payloadKey] = value;\n }\n },\n\n /**\n `serializeBelongsTo` can be used to customize how `DS.belongsTo`\n properties are serialized.\n Example\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n serializeBelongsTo: function(snapshot, json, relationship) {\n var key = relationship.key;\n var belongsTo = snapshot.belongsTo(key);\n key = this.keyForRelationship ? this.keyForRelationship(key, \"belongsTo\", \"serialize\") : key;\n json[key] = Ember.isNone(belongsTo) ? belongsTo : belongsTo.record.toJSON();\n }\n });\n ```\n @method serializeBelongsTo\n @param {DS.Snapshot} snapshot\n @param {Object} json\n @param {Object} relationship\n */\n serializeBelongsTo: function serializeBelongsTo(snapshot, json, relationship) {\n var key = relationship.key;\n\n if (this._canSerialize(key)) {\n var belongsToId = snapshot.belongsTo(key, { id: true });\n\n // if provided, use the mapping provided by `attrs` in\n // the serializer\n var payloadKey = this._getMappedKey(key, snapshot.type);\n if (payloadKey === key && this.keyForRelationship) {\n payloadKey = this.keyForRelationship(key, \"belongsTo\", \"serialize\");\n }\n\n //Need to check whether the id is there for new&async records\n if (isNone(belongsToId)) {\n json[payloadKey] = null;\n } else {\n json[payloadKey] = belongsToId;\n }\n\n if (relationship.options.polymorphic) {\n this.serializePolymorphicType(snapshot, json, relationship);\n }\n }\n },\n\n /**\n `serializeHasMany` can be used to customize how `DS.hasMany`\n properties are serialized.\n Example\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n serializeHasMany: function(snapshot, json, relationship) {\n var key = relationship.key;\n if (key === 'comments') {\n return;\n } else {\n this._super.apply(this, arguments);\n }\n }\n });\n ```\n @method serializeHasMany\n @param {DS.Snapshot} snapshot\n @param {Object} json\n @param {Object} relationship\n */\n serializeHasMany: function serializeHasMany(snapshot, json, relationship) {\n var key = relationship.key;\n var shouldSerializeHasMany = '_shouldSerializeHasMany';\n if (false) {\n shouldSerializeHasMany = 'shouldSerializeHasMany';\n }\n\n if (this[shouldSerializeHasMany](snapshot, key, relationship)) {\n var hasMany = snapshot.hasMany(key, { ids: true });\n if (hasMany !== undefined) {\n // if provided, use the mapping provided by `attrs` in\n // the serializer\n var payloadKey = this._getMappedKey(key, snapshot.type);\n if (payloadKey === key && this.keyForRelationship) {\n payloadKey = this.keyForRelationship(key, \"hasMany\", \"serialize\");\n }\n\n json[payloadKey] = hasMany;\n // TODO support for polymorphic manyToNone and manyToMany relationships\n }\n }\n },\n\n /**\n You can use this method to customize how polymorphic objects are\n serialized. Objects are considered to be polymorphic if\n `{ polymorphic: true }` is pass as the second argument to the\n `DS.belongsTo` function.\n Example\n ```app/serializers/comment.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n serializePolymorphicType: function(snapshot, json, relationship) {\n var key = relationship.key,\n belongsTo = snapshot.belongsTo(key);\n key = this.keyForAttribute ? this.keyForAttribute(key, \"serialize\") : key;\n if (Ember.isNone(belongsTo)) {\n json[key + \"_type\"] = null;\n } else {\n json[key + \"_type\"] = belongsTo.modelName;\n }\n }\n });\n ```\n @method serializePolymorphicType\n @param {DS.Snapshot} snapshot\n @param {Object} json\n @param {Object} relationship\n */\n serializePolymorphicType: _ember['default'].K,\n\n /**\n `extractMeta` is used to deserialize any meta information in the\n adapter payload. By default Ember Data expects meta information to\n be located on the `meta` property of the payload object.\n Example\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n extractMeta: function(store, typeClass, payload) {\n if (payload && payload.hasOwnProperty('_pagination')) {\n let meta = payload._pagination;\n delete payload._pagination;\n return meta;\n }\n }\n });\n ```\n @method extractMeta\n @param {DS.Store} store\n @param {DS.Model} modelClass\n @param {Object} payload\n */\n extractMeta: function extractMeta(store, modelClass, payload) {\n if (payload && payload['meta'] !== undefined) {\n var meta = payload.meta;\n delete payload.meta;\n return meta;\n }\n },\n\n /**\n `extractErrors` is used to extract model errors when a call\n to `DS.Model#save` fails with an `InvalidError`. By default\n Ember Data expects error information to be located on the `errors`\n property of the payload object.\n This serializer expects this `errors` object to be an Array similar\n to the following, compliant with the JSON-API specification:\n ```js\n {\n \"errors\": [\n {\n \"detail\": \"This username is already taken!\",\n \"source\": {\n \"pointer\": \"data/attributes/username\"\n }\n }, {\n \"detail\": \"Doesn't look like a valid email.\",\n \"source\": {\n \"pointer\": \"data/attributes/email\"\n }\n }\n ]\n }\n ```\n The key `detail` provides a textual description of the problem.\n Alternatively, the key `title` can be used for the same purpose.\n The nested keys `source.pointer` detail which specific element\n of the request data was invalid.\n Note that JSON-API also allows for object-level errors to be placed\n in an object with pointer `data`, signifying that the problem\n cannot be traced to a specific attribute:\n ```javascript\n {\n \"errors\": [\n {\n \"detail\": \"Some generic non property error message\",\n \"source\": {\n \"pointer\": \"data\"\n }\n }\n ]\n }\n ```\n When turn into a `DS.Errors` object, you can read these errors\n through the property `base`:\n ```handlebars\n {{#each model.errors.base as |error|}}\n \n {{error.message}}\n
\n {{/each}}\n ```\n Example of alternative implementation, overriding the default\n behavior to deal with a different format of errors:\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n extractErrors: function(store, typeClass, payload, id) {\n if (payload && typeof payload === 'object' && payload._problems) {\n payload = payload._problems;\n this.normalizeErrors(typeClass, payload);\n }\n return payload;\n }\n });\n ```\n @method extractErrors\n @param {DS.Store} store\n @param {DS.Model} typeClass\n @param {Object} payload\n @param {(String|Number)} id\n @return {Object} json The deserialized errors\n */\n extractErrors: function extractErrors(store, typeClass, payload, id) {\n var _this7 = this;\n\n if (payload && typeof payload === 'object' && payload.errors) {\n payload = (0, _emberDataAdaptersErrors.errorsArrayToHash)(payload.errors);\n\n this.normalizeUsingDeclaredMapping(typeClass, payload);\n\n typeClass.eachAttribute(function (name) {\n var key = _this7.keyForAttribute(name, 'deserialize');\n if (key !== name && payload[key] !== undefined) {\n payload[name] = payload[key];\n delete payload[key];\n }\n });\n\n typeClass.eachRelationship(function (name) {\n var key = _this7.keyForRelationship(name, 'deserialize');\n if (key !== name && payload[key] !== undefined) {\n payload[name] = payload[key];\n delete payload[key];\n }\n });\n }\n\n return payload;\n },\n\n /**\n `keyForAttribute` can be used to define rules for how to convert an\n attribute name in your model to a key in your JSON.\n Example\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend({\n keyForAttribute: function(attr, method) {\n return Ember.String.underscore(attr).toUpperCase();\n }\n });\n ```\n @method keyForAttribute\n @param {String} key\n @param {String} method\n @return {String} normalized key\n */\n keyForAttribute: function keyForAttribute(key, method) {\n return key;\n },\n\n /**\n `keyForRelationship` can be used to define a custom key when\n serializing and deserializing relationship properties. By default\n `JSONSerializer` does not provide an implementation of this method.\n Example\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n keyForRelationship: function(key, relationship, method) {\n return 'rel_' + Ember.String.underscore(key);\n }\n });\n ```\n @method keyForRelationship\n @param {String} key\n @param {String} typeClass\n @param {String} method\n @return {String} normalized key\n */\n keyForRelationship: function keyForRelationship(key, typeClass, method) {\n return key;\n },\n\n /**\n `keyForLink` can be used to define a custom key when deserializing link\n properties.\n @method keyForLink\n @param {String} key\n @param {String} kind `belongsTo` or `hasMany`\n @return {String} normalized key\n */\n keyForLink: function keyForLink(key, kind) {\n return key;\n },\n\n // HELPERS\n\n /**\n @method transformFor\n @private\n @param {String} attributeType\n @param {Boolean} skipAssertion\n @return {DS.Transform} transform\n */\n transformFor: function transformFor(attributeType, skipAssertion) {\n var transform = (0, _emberDataPrivateUtils.getOwner)(this).lookup('transform:' + attributeType);\n\n (0, _emberDataPrivateDebug.assert)(\"Unable to find transform for '\" + attributeType + \"'\", skipAssertion || !!transform);\n\n return transform;\n }\n });\n\n if (false) {\n\n JSONSerializer.reopen({\n\n /**\n @method modelNameFromPayloadType\n @public\n @param {String} type\n @return {String} the model's modelName\n */\n modelNameFromPayloadType: function modelNameFromPayloadType(type) {\n return (0, _emberDataPrivateSystemNormalizeModelName['default'])(type);\n },\n\n _hasCustomModelNameFromPayloadKey: function _hasCustomModelNameFromPayloadKey() {\n return this.modelNameFromPayloadKey !== JSONSerializer.prototype.modelNameFromPayloadKey;\n }\n\n });\n }\n\n exports['default'] = JSONSerializer;\n});","define(\"ember-data/serializers/rest\", [\"exports\", \"ember\", \"ember-data/-private/debug\", \"ember-data/serializers/json\", \"ember-data/-private/system/normalize-model-name\", \"ember-inflector\", \"ember-data/-private/system/coerce-id\", \"ember-data/-private/utils\", \"ember-data/-private/features\"], function (exports, _ember, _emberDataPrivateDebug, _emberDataSerializersJson, _emberDataPrivateSystemNormalizeModelName, _emberInflector, _emberDataPrivateSystemCoerceId, _emberDataPrivateUtils, _emberDataPrivateFeatures) {\n \"use strict\";\n\n function _toConsumableArray(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];return arr2;\n } else {\n return Array.from(arr);\n }\n }\n\n /**\n @module ember-data\n */\n\n var camelize = _ember[\"default\"].String.camelize;\n\n /**\n Normally, applications will use the `RESTSerializer` by implementing\n the `normalize` method.\n \n This allows you to do whatever kind of munging you need, and is\n especially useful if your server is inconsistent and you need to\n do munging differently for many different kinds of responses.\n \n See the `normalize` documentation for more information.\n \n ## Across the Board Normalization\n \n There are also a number of hooks that you might find useful to define\n across-the-board rules for your payload. These rules will be useful\n if your server is consistent, or if you're building an adapter for\n an infrastructure service, like Firebase, and want to encode service\n conventions.\n \n For example, if all of your keys are underscored and all-caps, but\n otherwise consistent with the names you use in your models, you\n can implement across-the-board rules for how to convert an attribute\n name in your model to a key in your JSON.\n \n ```app/serializers/application.js\n import DS from 'ember-data';\n \n export default DS.RESTSerializer.extend({\n keyForAttribute: function(attr, method) {\n return Ember.String.underscore(attr).toUpperCase();\n }\n });\n ```\n \n You can also implement `keyForRelationship`, which takes the name\n of the relationship as the first parameter, the kind of\n relationship (`hasMany` or `belongsTo`) as the second parameter, and\n the method (`serialize` or `deserialize`) as the third parameter.\n \n @class RESTSerializer\n @namespace DS\n @extends DS.JSONSerializer\n */\n var RESTSerializer = _emberDataSerializersJson[\"default\"].extend({\n\n /**\n `keyForPolymorphicType` can be used to define a custom key when\n serializing and deserializing a polymorphic type. By default, the\n returned key is `${key}Type`.\n Example\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend({\n keyForPolymorphicType: function(key, relationship) {\n var relationshipKey = this.keyForRelationship(key);\n return 'type-' + relationshipKey;\n }\n });\n ```\n @method keyForPolymorphicType\n @param {String} key\n @param {String} typeClass\n @param {String} method\n @return {String} normalized key\n */\n keyForPolymorphicType: function keyForPolymorphicType(key, typeClass, method) {\n var relationshipKey = this.keyForRelationship(key);\n\n return relationshipKey + \"Type\";\n },\n\n /**\n Normalizes a part of the JSON payload returned by\n the server. You should override this method, munge the hash\n and call super if you have generic normalization to do.\n It takes the type of the record that is being normalized\n (as a DS.Model class), the property where the hash was\n originally found, and the hash to normalize.\n For example, if you have a payload that looks like this:\n ```js\n {\n \"post\": {\n \"id\": 1,\n \"title\": \"Rails is omakase\",\n \"comments\": [ 1, 2 ]\n },\n \"comments\": [{\n \"id\": 1,\n \"body\": \"FIRST\"\n }, {\n \"id\": 2,\n \"body\": \"Rails is unagi\"\n }]\n }\n ```\n The `normalize` method will be called three times:\n * With `App.Post`, `\"posts\"` and `{ id: 1, title: \"Rails is omakase\", ... }`\n * With `App.Comment`, `\"comments\"` and `{ id: 1, body: \"FIRST\" }`\n * With `App.Comment`, `\"comments\"` and `{ id: 2, body: \"Rails is unagi\" }`\n You can use this method, for example, to normalize underscored keys to camelized\n or other general-purpose normalizations. You will only need to implement\n `normalize` and manipulate the payload as desired.\n For example, if the `IDs` under `\"comments\"` are provided as `_id` instead of\n `id`, you can specify how to normalize just the comments:\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend({\n normalize(model, hash, prop) {\n if (prop === 'comments') {\n hash.id = hash._id;\n delete hash._id;\n }\n return this._super(...arguments);\n }\n });\n ```\n On each call to the `normalize` method, the third parameter (`prop`) is always\n one of the keys that were in the original payload or in the result of another\n normalization as `normalizeResponse`.\n @method normalize\n @param {DS.Model} modelClass\n @param {Object} resourceHash\n @param {String} prop\n @return {Object}\n */\n normalize: function normalize(modelClass, resourceHash, prop) {\n if (this.normalizeHash && this.normalizeHash[prop]) {\n (0, _emberDataPrivateDebug.deprecate)('`RESTSerializer.normalizeHash` has been deprecated. Please use `serializer.normalize` to modify the payload of single resources.', false, {\n id: 'ds.serializer.normalize-hash-deprecated',\n until: '3.0.0'\n });\n this.normalizeHash[prop](resourceHash);\n }\n return this._super(modelClass, resourceHash);\n },\n\n /**\n Normalizes an array of resource payloads and returns a JSON-API Document\n with primary data and, if any, included data as `{ data, included }`.\n @method _normalizeArray\n @param {DS.Store} store\n @param {String} modelName\n @param {Object} arrayHash\n @param {String} prop\n @return {Object}\n @private\n */\n _normalizeArray: function _normalizeArray(store, modelName, arrayHash, prop) {\n var _this = this;\n\n var documentHash = {\n data: [],\n included: []\n };\n\n var modelClass = store.modelFor(modelName);\n var serializer = store.serializerFor(modelName);\n\n _ember[\"default\"].makeArray(arrayHash).forEach(function (hash) {\n var _normalizePolymorphicRecord2 = _this._normalizePolymorphicRecord(store, hash, prop, modelClass, serializer);\n\n var data = _normalizePolymorphicRecord2.data;\n var included = _normalizePolymorphicRecord2.included;\n\n documentHash.data.push(data);\n if (included) {\n var _documentHash$included;\n\n (_documentHash$included = documentHash.included).push.apply(_documentHash$included, _toConsumableArray(included));\n }\n });\n\n return documentHash;\n },\n\n _normalizePolymorphicRecord: function _normalizePolymorphicRecord(store, hash, prop, primaryModelClass, primarySerializer) {\n var serializer = primarySerializer;\n var modelClass = primaryModelClass;\n\n var primaryHasTypeAttribute = (0, _emberDataPrivateUtils.modelHasAttributeOrRelationshipNamedType)(primaryModelClass);\n\n if (!primaryHasTypeAttribute && hash.type) {\n // Support polymorphic records in async relationships\n var modelName = undefined;\n if (false) {\n modelName = this.modelNameFromPayloadType(hash.type);\n var deprecatedModelNameLookup = this.modelNameFromPayloadKey(hash.type);\n\n if (modelName !== deprecatedModelNameLookup && !this._hasCustomModelNameFromPayloadType() && this._hasCustomModelNameFromPayloadKey()) {\n (0, _emberDataPrivateDebug.deprecate)(\"You are using modelNameFromPayloadKey to normalize the type for a polymorphic relationship. This is has been deprecated in favor of modelNameFromPayloadType\", false, {\n id: 'ds.rest-serializer.deprecated-model-name-for-polymorphic-type',\n until: '3.0.0'\n });\n\n modelName = deprecatedModelNameLookup;\n }\n } else {\n modelName = this.modelNameFromPayloadKey(hash.type);\n }\n\n if (store._hasModelFor(modelName)) {\n serializer = store.serializerFor(modelName);\n modelClass = store.modelFor(modelName);\n }\n }\n\n return serializer.normalize(modelClass, hash, prop);\n },\n\n /*\n @method _normalizeResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @param {Boolean} isSingle\n @return {Object} JSON-API Document\n @private\n */\n _normalizeResponse: function _normalizeResponse(store, primaryModelClass, payload, id, requestType, isSingle) {\n var documentHash = {\n data: null,\n included: []\n };\n\n var meta = this.extractMeta(store, primaryModelClass, payload);\n if (meta) {\n (0, _emberDataPrivateDebug.assert)('The `meta` returned from `extractMeta` has to be an object, not \"' + _ember[\"default\"].typeOf(meta) + '\".', _ember[\"default\"].typeOf(meta) === 'object');\n documentHash.meta = meta;\n }\n\n var keys = Object.keys(payload);\n\n for (var i = 0, _length = keys.length; i < _length; i++) {\n var prop = keys[i];\n var modelName = prop;\n var forcedSecondary = false;\n\n /*\n If you want to provide sideloaded records of the same type that the\n primary data you can do that by prefixing the key with `_`.\n Example\n ```\n {\n users: [\n { id: 1, title: 'Tom', manager: 3 },\n { id: 2, title: 'Yehuda', manager: 3 }\n ],\n _users: [\n { id: 3, title: 'Tomster' }\n ]\n }\n ```\n This forces `_users` to be added to `included` instead of `data`.\n */\n if (prop.charAt(0) === '_') {\n forcedSecondary = true;\n modelName = prop.substr(1);\n }\n\n var typeName = this.modelNameFromPayloadKey(modelName);\n if (!store.modelFactoryFor(typeName)) {\n (0, _emberDataPrivateDebug.warn)(this.warnMessageNoModelForKey(modelName, typeName), false, {\n id: 'ds.serializer.model-for-key-missing'\n });\n continue;\n }\n\n var isPrimary = !forcedSecondary && this.isPrimaryType(store, typeName, primaryModelClass);\n var value = payload[prop];\n\n if (value === null) {\n continue;\n }\n\n (0, _emberDataPrivateDebug.runInDebug)(function () {\n var isQueryRecordAnArray = requestType === 'queryRecord' && isPrimary && Array.isArray(value);\n var message = \"The adapter returned an array for the primary data of a `queryRecord` response. This is deprecated as `queryRecord` should return a single record.\";\n\n (0, _emberDataPrivateDebug.deprecate)(message, !isQueryRecordAnArray, {\n id: 'ds.serializer.rest.queryRecord-array-response',\n until: '3.0'\n });\n });\n\n /*\n Support primary data as an object instead of an array.\n Example\n ```\n {\n user: { id: 1, title: 'Tom', manager: 3 }\n }\n ```\n */\n if (isPrimary && _ember[\"default\"].typeOf(value) !== 'array') {\n var _normalizePolymorphicRecord3 = this._normalizePolymorphicRecord(store, value, prop, primaryModelClass, this);\n\n var _data = _normalizePolymorphicRecord3.data;\n var _included = _normalizePolymorphicRecord3.included;\n\n documentHash.data = _data;\n if (_included) {\n var _documentHash$included2;\n\n (_documentHash$included2 = documentHash.included).push.apply(_documentHash$included2, _toConsumableArray(_included));\n }\n continue;\n }\n\n var _normalizeArray2 = this._normalizeArray(store, typeName, value, prop);\n\n var data = _normalizeArray2.data;\n var included = _normalizeArray2.included;\n\n if (included) {\n var _documentHash$included3;\n\n (_documentHash$included3 = documentHash.included).push.apply(_documentHash$included3, _toConsumableArray(included));\n }\n\n if (isSingle) {\n data.forEach(function (resource) {\n\n /*\n Figures out if this is the primary record or not.\n It's either:\n 1. The record with the same ID as the original request\n 2. If it's a newly created record without an ID, the first record\n in the array\n */\n var isUpdatedRecord = isPrimary && (0, _emberDataPrivateSystemCoerceId[\"default\"])(resource.id) === id;\n var isFirstCreatedRecord = isPrimary && !id && !documentHash.data;\n\n if (isFirstCreatedRecord || isUpdatedRecord) {\n documentHash.data = resource;\n } else {\n documentHash.included.push(resource);\n }\n });\n } else {\n if (isPrimary) {\n documentHash.data = data;\n } else {\n if (data) {\n var _documentHash$included4;\n\n (_documentHash$included4 = documentHash.included).push.apply(_documentHash$included4, _toConsumableArray(data));\n }\n }\n }\n }\n\n return documentHash;\n },\n\n isPrimaryType: function isPrimaryType(store, typeName, primaryTypeClass) {\n var typeClass = store.modelFor(typeName);\n return typeClass.modelName === primaryTypeClass.modelName;\n },\n\n /**\n This method allows you to push a payload containing top-level\n collections of records organized per type.\n ```js\n {\n \"posts\": [{\n \"id\": \"1\",\n \"title\": \"Rails is omakase\",\n \"author\", \"1\",\n \"comments\": [ \"1\" ]\n }],\n \"comments\": [{\n \"id\": \"1\",\n \"body\": \"FIRST\"\n }],\n \"users\": [{\n \"id\": \"1\",\n \"name\": \"@d2h\"\n }]\n }\n ```\n It will first normalize the payload, so you can use this to push\n in data streaming in from your server structured the same way\n that fetches and saves are structured.\n @method pushPayload\n @param {DS.Store} store\n @param {Object} payload\n */\n pushPayload: function pushPayload(store, payload) {\n var documentHash = {\n data: [],\n included: []\n };\n\n for (var prop in payload) {\n var modelName = this.modelNameFromPayloadKey(prop);\n if (!store.modelFactoryFor(modelName)) {\n (0, _emberDataPrivateDebug.warn)(this.warnMessageNoModelForKey(prop, modelName), false, {\n id: 'ds.serializer.model-for-key-missing'\n });\n continue;\n }\n var type = store.modelFor(modelName);\n var typeSerializer = store.serializerFor(type.modelName);\n\n _ember[\"default\"].makeArray(payload[prop]).forEach(function (hash) {\n var _typeSerializer$normalize = typeSerializer.normalize(type, hash, prop);\n\n var data = _typeSerializer$normalize.data;\n var included = _typeSerializer$normalize.included;\n\n documentHash.data.push(data);\n if (included) {\n var _documentHash$included5;\n\n (_documentHash$included5 = documentHash.included).push.apply(_documentHash$included5, _toConsumableArray(included));\n }\n });\n }\n\n if (false) {\n return store.push(documentHash);\n } else {\n store.push(documentHash);\n }\n },\n\n /**\n This method is used to convert each JSON root key in the payload\n into a modelName that it can use to look up the appropriate model for\n that part of the payload.\n For example, your server may send a model name that does not correspond with\n the name of the model in your app. Let's take a look at an example model,\n and an example payload:\n ```app/models/post.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n });\n ```\n ```javascript\n {\n \"blog/post\": {\n \"id\": \"1\n }\n }\n ```\n Ember Data is going to normalize the payload's root key for the modelName. As a result,\n it will try to look up the \"blog/post\" model. Since we don't have a model called \"blog/post\"\n (or a file called app/models/blog/post.js in ember-cli), Ember Data will throw an error\n because it cannot find the \"blog/post\" model.\n Since we want to remove this namespace, we can define a serializer for the application that will\n remove \"blog/\" from the payload key whenver it's encountered by Ember Data:\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend({\n modelNameFromPayloadKey: function(payloadKey) {\n if (payloadKey === 'blog/post') {\n return this._super(payloadKey.replace('blog/', ''));\n } else {\n return this._super(payloadKey);\n }\n }\n });\n ```\n After refreshing, Ember Data will appropriately look up the \"post\" model.\n By default the modelName for a model is its\n name in dasherized form. This means that a payload key like \"blogPost\" would be\n normalized to \"blog-post\" when Ember Data looks up the model. Usually, Ember Data\n can use the correct inflection to do this for you. Most of the time, you won't\n need to override `modelNameFromPayloadKey` for this purpose.\n @method modelNameFromPayloadKey\n @param {String} key\n @return {String} the model's modelName\n */\n modelNameFromPayloadKey: function modelNameFromPayloadKey(key) {\n return (0, _emberInflector.singularize)((0, _emberDataPrivateSystemNormalizeModelName[\"default\"])(key));\n },\n\n // SERIALIZE\n\n /**\n Called when a record is saved in order to convert the\n record into JSON.\n By default, it creates a JSON object with a key for\n each attribute and belongsTo relationship.\n For example, consider this model:\n ```app/models/comment.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n title: DS.attr(),\n body: DS.attr(),\n author: DS.belongsTo('user')\n });\n ```\n The default serialization would create a JSON object like:\n ```js\n {\n \"title\": \"Rails is unagi\",\n \"body\": \"Rails? Omakase? O_O\",\n \"author\": 12\n }\n ```\n By default, attributes are passed through as-is, unless\n you specified an attribute type (`DS.attr('date')`). If\n you specify a transform, the JavaScript value will be\n serialized when inserted into the JSON hash.\n By default, belongs-to relationships are converted into\n IDs when inserted into the JSON hash.\n ## IDs\n `serialize` takes an options hash with a single option:\n `includeId`. If this option is `true`, `serialize` will,\n by default include the ID in the JSON object it builds.\n The adapter passes in `includeId: true` when serializing\n a record for `createRecord`, but not for `updateRecord`.\n ## Customization\n Your server may expect a different JSON format than the\n built-in serialization format.\n In that case, you can implement `serialize` yourself and\n return a JSON hash of your choosing.\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend({\n serialize: function(snapshot, options) {\n var json = {\n POST_TTL: snapshot.attr('title'),\n POST_BDY: snapshot.attr('body'),\n POST_CMS: snapshot.hasMany('comments', { ids: true })\n }\n if (options.includeId) {\n json.POST_ID_ = snapshot.id;\n }\n return json;\n }\n });\n ```\n ## Customizing an App-Wide Serializer\n If you want to define a serializer for your entire\n application, you'll probably want to use `eachAttribute`\n and `eachRelationship` on the record.\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend({\n serialize: function(snapshot, options) {\n var json = {};\n snapshot.eachAttribute(function(name) {\n json[serverAttributeName(name)] = snapshot.attr(name);\n })\n snapshot.eachRelationship(function(name, relationship) {\n if (relationship.kind === 'hasMany') {\n json[serverHasManyName(name)] = snapshot.hasMany(name, { ids: true });\n }\n });\n if (options.includeId) {\n json.ID_ = snapshot.id;\n }\n return json;\n }\n });\n function serverAttributeName(attribute) {\n return attribute.underscore().toUpperCase();\n }\n function serverHasManyName(name) {\n return serverAttributeName(name.singularize()) + \"_IDS\";\n }\n ```\n This serializer will generate JSON that looks like this:\n ```js\n {\n \"TITLE\": \"Rails is omakase\",\n \"BODY\": \"Yep. Omakase.\",\n \"COMMENT_IDS\": [ 1, 2, 3 ]\n }\n ```\n ## Tweaking the Default JSON\n If you just want to do some small tweaks on the default JSON,\n you can call super first and make the tweaks on the returned\n JSON.\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend({\n serialize: function(snapshot, options) {\n var json = this._super(snapshot, options);\n json.subject = json.title;\n delete json.title;\n return json;\n }\n });\n ```\n @method serialize\n @param {DS.Snapshot} snapshot\n @param {Object} options\n @return {Object} json\n */\n serialize: function serialize(snapshot, options) {\n return this._super.apply(this, arguments);\n },\n\n /**\n You can use this method to customize the root keys serialized into the JSON.\n The hash property should be modified by reference (possibly using something like _.extend)\n By default the REST Serializer sends the modelName of a model, which is a camelized\n version of the name.\n For example, your server may expect underscored root objects.\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend({\n serializeIntoHash: function(data, type, record, options) {\n var root = Ember.String.decamelize(type.modelName);\n data[root] = this.serialize(record, options);\n }\n });\n ```\n @method serializeIntoHash\n @param {Object} hash\n @param {DS.Model} typeClass\n @param {DS.Snapshot} snapshot\n @param {Object} options\n */\n serializeIntoHash: function serializeIntoHash(hash, typeClass, snapshot, options) {\n var normalizedRootKey = this.payloadKeyFromModelName(typeClass.modelName);\n hash[normalizedRootKey] = this.serialize(snapshot, options);\n },\n\n /**\n You can use `payloadKeyFromModelName` to override the root key for an outgoing\n request. By default, the RESTSerializer returns a camelized version of the\n model's name.\n For a model called TacoParty, its `modelName` would be the string `taco-party`. The RESTSerializer\n will send it to the server with `tacoParty` as the root key in the JSON payload:\n ```js\n {\n \"tacoParty\": {\n \"id\": \"1\",\n \"location\": \"Matthew Beale's House\"\n }\n }\n ```\n For example, your server may expect dasherized root objects:\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend({\n payloadKeyFromModelName: function(modelName) {\n return Ember.String.dasherize(modelName);\n }\n });\n ```\n Given a `TacoParty` model, calling `save` on it would produce an outgoing\n request like:\n ```js\n {\n \"taco-party\": {\n \"id\": \"1\",\n \"location\": \"Matthew Beale's House\"\n }\n }\n ```\n @method payloadKeyFromModelName\n @param {String} modelName\n @return {String}\n */\n payloadKeyFromModelName: function payloadKeyFromModelName(modelName) {\n return camelize(modelName);\n },\n\n /**\n You can use this method to customize how polymorphic objects are serialized.\n By default the REST Serializer creates the key by appending `Type` to\n the attribute and value from the model's camelcased model name.\n @method serializePolymorphicType\n @param {DS.Snapshot} snapshot\n @param {Object} json\n @param {Object} relationship\n */\n serializePolymorphicType: function serializePolymorphicType(snapshot, json, relationship) {\n var key = relationship.key;\n var belongsTo = snapshot.belongsTo(key);\n var typeKey = this.keyForPolymorphicType(key, relationship.type, 'serialize');\n\n // old way of getting the key for the polymorphic type\n key = this.keyForAttribute ? this.keyForAttribute(key, \"serialize\") : key;\n key = key + \"Type\";\n\n // The old way of serializing the type of a polymorphic record used\n // `keyForAttribute`, which is not correct. The next code checks if the old\n // way is used and if it differs from the new way of using\n // `keyForPolymorphicType`. If this is the case, a deprecation warning is\n // logged and the old way is restored (so nothing breaks).\n if (key !== typeKey && this.keyForPolymorphicType === RESTSerializer.prototype.keyForPolymorphicType) {\n (0, _emberDataPrivateDebug.deprecate)(\"The key to serialize the type of a polymorphic record is created via keyForAttribute which has been deprecated. Use the keyForPolymorphicType hook instead.\", false, {\n id: 'ds.rest-serializer.deprecated-key-for-polymorphic-type',\n until: '3.0.0'\n });\n\n typeKey = key;\n }\n\n if (_ember[\"default\"].isNone(belongsTo)) {\n json[typeKey] = null;\n } else {\n if (false) {\n json[typeKey] = this.payloadTypeFromModelName(belongsTo.modelName);\n } else {\n json[typeKey] = camelize(belongsTo.modelName);\n }\n }\n },\n\n /**\n You can use this method to customize how a polymorphic relationship should\n be extracted.\n @method extractPolymorphicRelationship\n @param {Object} relationshipType\n @param {Object} relationshipHash\n @param {Object} relationshipOptions\n @return {Object}\n */\n extractPolymorphicRelationship: function extractPolymorphicRelationship(relationshipType, relationshipHash, relationshipOptions) {\n var key = relationshipOptions.key;\n var resourceHash = relationshipOptions.resourceHash;\n var relationshipMeta = relationshipOptions.relationshipMeta;\n\n // A polymorphic belongsTo relationship can be present in the payload\n // either in the form where the `id` and the `type` are given:\n //\n // {\n // message: { id: 1, type: 'post' }\n // }\n //\n // or by the `id` and a `Type` attribute:\n //\n // {\n // message: 1,\n // messageType: 'post'\n // }\n //\n // The next code checks if the latter case is present and returns the\n // corresponding JSON-API representation. The former case is handled within\n // the base class JSONSerializer.\n var isPolymorphic = relationshipMeta.options.polymorphic;\n var typeProperty = this.keyForPolymorphicType(key, relationshipType, 'deserialize');\n\n if (isPolymorphic && resourceHash[typeProperty] !== undefined && typeof relationshipHash !== 'object') {\n\n if (false) {\n\n var payloadType = resourceHash[typeProperty];\n var type = this.modelNameFromPayloadType(payloadType);\n var deprecatedTypeLookup = this.modelNameFromPayloadKey(payloadType);\n\n if (payloadType !== deprecatedTypeLookup && !this._hasCustomModelNameFromPayloadType() && this._hasCustomModelNameFromPayloadKey()) {\n (0, _emberDataPrivateDebug.deprecate)(\"You are using modelNameFromPayloadKey to normalize the type for a polymorphic relationship. This has been deprecated in favor of modelNameFromPayloadType\", false, {\n id: 'ds.rest-serializer.deprecated-model-name-for-polymorphic-type',\n until: '3.0.0'\n });\n\n type = deprecatedTypeLookup;\n }\n\n return {\n id: relationshipHash,\n type: type\n };\n } else {\n\n var type = this.modelNameFromPayloadKey(resourceHash[typeProperty]);\n return {\n id: relationshipHash,\n type: type\n };\n }\n }\n\n return this._super.apply(this, arguments);\n }\n });\n\n if (false) {\n\n RESTSerializer.reopen({\n\n /**\n `modelNameFromPayloadType` can be used to change the mapping for a DS model\n name, taken from the value in the payload.\n Say your API namespaces the type of a model and returns the following\n payload for the `post` model, which has a polymorphic `user` relationship:\n ```javascript\n // GET /api/posts/1\n {\n \"post\": {\n \"id\": 1,\n \"user\": 1,\n \"userType: \"api::v1::administrator\"\n }\n }\n ```\n By overwriting `modelNameFromPayloadType` you can specify that the\n `administrator` model should be used:\n ```app/serializers/application.js\n import DS from \"ember-data\";\n export default DS.RESTSerializer.extend({\n modelNameFromPayloadType(payloadType) {\n return payloadType.replace('api::v1::', '');\n }\n });\n ```\n By default the modelName for a model is its name in dasherized form.\n Usually, Ember Data can use the correct inflection to do this for you. Most\n of the time, you won't need to override `modelNameFromPayloadType` for this\n purpose.\n Also take a look at\n [payloadTypeFromModelName](#method_payloadTypeFromModelName) to customize\n how the type of a record should be serialized.\n @method modelNameFromPayloadType\n @public\n @param {String} payloadType type from payload\n @return {String} modelName\n */\n modelNameFromPayloadType: function modelNameFromPayloadType(payloadType) {\n return (0, _emberInflector.singularize)((0, _emberDataPrivateSystemNormalizeModelName[\"default\"])(payloadType));\n },\n\n /**\n `payloadTypeFromModelName` can be used to change the mapping for the type in\n the payload, taken from the model name.\n Say your API namespaces the type of a model and expects the following\n payload when you update the `post` model, which has a polymorphic `user`\n relationship:\n ```javascript\n // POST /api/posts/1\n {\n \"post\": {\n \"id\": 1,\n \"user\": 1,\n \"userType\": \"api::v1::administrator\"\n }\n }\n ```\n By overwriting `payloadTypeFromModelName` you can specify that the\n namespaces model name for the `administrator` should be used:\n ```app/serializers/application.js\n import DS from \"ember-data\";\n export default DS.RESTSerializer.extend({\n payloadTypeFromModelName(modelName) {\n return \"api::v1::\" + modelName;\n }\n });\n ```\n By default the payload type is the camelized model name. Usually, Ember\n Data can use the correct inflection to do this for you. Most of the time,\n you won't need to override `payloadTypeFromModelName` for this purpose.\n Also take a look at\n [modelNameFromPayloadType](#method_modelNameFromPayloadType) to customize\n how the model name from should be mapped from the payload.\n @method payloadTypeFromModelName\n @public\n @param {String} modelname modelName from the record\n @return {String} payloadType\n */\n payloadTypeFromModelName: function payloadTypeFromModelName(modelName) {\n return camelize(modelName);\n },\n\n _hasCustomModelNameFromPayloadKey: function _hasCustomModelNameFromPayloadKey() {\n return this.modelNameFromPayloadKey !== RESTSerializer.prototype.modelNameFromPayloadKey;\n },\n\n _hasCustomModelNameFromPayloadType: function _hasCustomModelNameFromPayloadType() {\n return this.modelNameFromPayloadType !== RESTSerializer.prototype.modelNameFromPayloadType;\n },\n\n _hasCustomPayloadTypeFromModelName: function _hasCustomPayloadTypeFromModelName() {\n return this.payloadTypeFromModelName !== RESTSerializer.prototype.payloadTypeFromModelName;\n },\n\n _hasCustomPayloadKeyFromModelName: function _hasCustomPayloadKeyFromModelName() {\n return this.payloadKeyFromModelName !== RESTSerializer.prototype.payloadKeyFromModelName;\n }\n\n });\n }\n\n (0, _emberDataPrivateDebug.runInDebug)(function () {\n RESTSerializer.reopen({\n warnMessageNoModelForKey: function warnMessageNoModelForKey(prop, typeKey) {\n return 'Encountered \"' + prop + '\" in payload, but no model was found for model name \"' + typeKey + '\" (resolved model name using ' + this.constructor.toString() + '.modelNameFromPayloadKey(\"' + prop + '\"))';\n }\n });\n });\n\n exports[\"default\"] = RESTSerializer;\n});","define('ember-data/setup-container', ['exports', 'ember-data/-private/initializers/store', 'ember-data/-private/initializers/transforms', 'ember-data/-private/initializers/store-injections', 'ember-data/-private/initializers/data-adapter'], function (exports, _emberDataPrivateInitializersStore, _emberDataPrivateInitializersTransforms, _emberDataPrivateInitializersStoreInjections, _emberDataPrivateInitializersDataAdapter) {\n 'use strict';\n\n exports['default'] = setupContainer;\n\n function setupContainer(application) {\n (0, _emberDataPrivateInitializersDataAdapter['default'])(application);\n (0, _emberDataPrivateInitializersTransforms['default'])(application);\n (0, _emberDataPrivateInitializersStoreInjections['default'])(application);\n (0, _emberDataPrivateInitializersStore['default'])(application);\n }\n});","define(\"ember-data/store\", [\"exports\", \"ember-data/-private/system/store\"], function (exports, _emberDataPrivateSystemStore) {\n \"use strict\";\n\n exports[\"default\"] = _emberDataPrivateSystemStore[\"default\"];\n});","define('ember-data/transform', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n /**\n The `DS.Transform` class is used to serialize and deserialize model\n attributes when they are saved or loaded from an\n adapter. Subclassing `DS.Transform` is useful for creating custom\n attributes. All subclasses of `DS.Transform` must implement a\n `serialize` and a `deserialize` method.\n \n Example\n \n ```app/transforms/temperature.js\n import DS from 'ember-data';\n \n // Converts centigrade in the JSON to fahrenheit in the app\n export default DS.Transform.extend({\n deserialize: function(serialized) {\n return (serialized * 1.8) + 32;\n },\n serialize: function(deserialized) {\n return (deserialized - 32) / 1.8;\n }\n });\n ```\n \n Usage\n \n ```app/models/requirement.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n name: DS.attr('string'),\n temperature: DS.attr('temperature')\n });\n ```\n \n @class Transform\n @namespace DS\n */\n exports['default'] = _ember['default'].Object.extend({\n /**\n When given a deserialized value from a record attribute this\n method must return the serialized value.\n Example\n ```javascript\n serialize: function(deserialized, options) {\n return Ember.isEmpty(deserialized) ? null : Number(deserialized);\n }\n ```\n @method serialize\n @param deserialized The deserialized value\n @param options hash of options passed to `DS.attr`\n @return The serialized value\n */\n serialize: null,\n\n /**\n When given a serialize value from a JSON object this method must\n return the deserialized value for the record attribute.\n Example\n ```javascript\n deserialize: function(serialized, options) {\n return empty(serialized) ? null : Number(serialized);\n }\n ```\n @method deserialize\n @param serialized The serialized value\n @param options hash of options passed to `DS.attr`\n @return The deserialized value\n */\n deserialize: null\n });\n});","define(\"ember-data/version\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports[\"default\"] = \"2.8.1\";\n});","define('ember-getowner-polyfill/fake-owner', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n var _createClass = (function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ('value' in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n })();\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError('Cannot call a class as a function');\n }\n }\n\n var CONTAINER = '__' + new Date() + '_container';\n var REGISTRY = '__' + new Date() + '_registry';\n\n var FakeOwner = (function () {\n function FakeOwner(object) {\n _classCallCheck(this, FakeOwner);\n\n this[CONTAINER] = object.container;\n\n if (_ember['default'].Registry) {\n // object.container._registry is used by 1.11\n this[REGISTRY] = object.container.registry || object.container._registry;\n } else {\n // Ember < 1.12\n this[REGISTRY] = object.container;\n }\n }\n\n // ContainerProxyMixin methods\n //\n // => http://emberjs.com/api/classes/ContainerProxyMixin.html\n //\n\n _createClass(FakeOwner, [{\n key: 'lookup',\n value: function lookup() {\n var _CONTAINER;\n\n return (_CONTAINER = this[CONTAINER]).lookup.apply(_CONTAINER, arguments);\n }\n }, {\n key: '_lookupFactory',\n value: function _lookupFactory() {\n var _CONTAINER2;\n\n return (_CONTAINER2 = this[CONTAINER]).lookupFactory.apply(_CONTAINER2, arguments);\n }\n }, {\n key: 'ownerInjection',\n value: function ownerInjection() {\n return {\n container: this[CONTAINER]\n };\n }\n\n // RegistryProxyMixin methods\n //\n // => http://emberjs.com/api/classes/RegistryProxyMixin.html\n //\n }, {\n key: 'hasRegistration',\n value: function hasRegistration() {\n var _REGISTRY;\n\n return (_REGISTRY = this[REGISTRY]).has.apply(_REGISTRY, arguments);\n }\n }, {\n key: 'inject',\n value: function inject() {\n var _REGISTRY2;\n\n return (_REGISTRY2 = this[REGISTRY]).injection.apply(_REGISTRY2, arguments);\n }\n }, {\n key: 'register',\n value: function register() {\n var _REGISTRY3;\n\n return (_REGISTRY3 = this[REGISTRY]).register.apply(_REGISTRY3, arguments);\n }\n }, {\n key: 'registerOption',\n value: function registerOption() {\n var _REGISTRY4;\n\n return (_REGISTRY4 = this[REGISTRY]).option.apply(_REGISTRY4, arguments);\n }\n }, {\n key: 'registerOptions',\n value: function registerOptions() {\n var _REGISTRY5;\n\n return (_REGISTRY5 = this[REGISTRY]).options.apply(_REGISTRY5, arguments);\n }\n }, {\n key: 'registerOptionsForType',\n value: function registerOptionsForType() {\n var _REGISTRY6;\n\n return (_REGISTRY6 = this[REGISTRY]).optionsForType.apply(_REGISTRY6, arguments);\n }\n }, {\n key: 'registeredOption',\n value: function registeredOption() {\n var _REGISTRY7;\n\n return (_REGISTRY7 = this[REGISTRY]).getOption.apply(_REGISTRY7, arguments);\n }\n }, {\n key: 'registeredOptions',\n value: function registeredOptions() {\n var _REGISTRY8;\n\n return (_REGISTRY8 = this[REGISTRY]).getOptions.apply(_REGISTRY8, arguments);\n }\n }, {\n key: 'registeredOptionsForType',\n value: function registeredOptionsForType(type) {\n if (this[REGISTRY].getOptionsForType) {\n var _REGISTRY9;\n\n return (_REGISTRY9 = this[REGISTRY]).getOptionsForType.apply(_REGISTRY9, arguments);\n } else {\n // used for Ember 1.10\n return this[REGISTRY]._typeOptions[type];\n }\n }\n }, {\n key: 'resolveRegistration',\n value: function resolveRegistration() {\n var _REGISTRY10;\n\n return (_REGISTRY10 = this[REGISTRY]).resolve.apply(_REGISTRY10, arguments);\n }\n }, {\n key: 'unregister',\n value: function unregister() {\n var _REGISTRY11;\n\n return (_REGISTRY11 = this[REGISTRY]).unregister.apply(_REGISTRY11, arguments);\n }\n }]);\n\n return FakeOwner;\n })();\n\n exports['default'] = FakeOwner;\n});","define('ember-getowner-polyfill/index', ['exports', 'ember', 'ember-getowner-polyfill/fake-owner'], function (exports, _ember, _emberGetownerPolyfillFakeOwner) {\n 'use strict';\n\n var hasGetOwner = !!_ember['default'].getOwner;\n\n exports['default'] = function (object) {\n var owner = undefined;\n\n if (hasGetOwner) {\n owner = _ember['default'].getOwner(object);\n }\n\n if (!owner && object.container) {\n owner = new _emberGetownerPolyfillFakeOwner['default'](object);\n }\n\n return owner;\n };\n});","define('ember-highcharts/components/high-charts', ['exports', 'ember', 'ember-highcharts/utils/option-loader', 'ember-getowner-polyfill'], function (exports, _ember, _emberHighchartsUtilsOptionLoader, _emberGetownerPolyfill) {\n 'use strict';\n\n var Component = _ember['default'].Component;\n var computed = _ember['default'].computed;\n var get = _ember['default'].get;\n var set = _ember['default'].set;\n var on = _ember['default'].on;\n var run = _ember['default'].run;\n var $ = _ember['default'].$;\n\n var assign = _ember['default'].assign || _ember['default'].merge;\n\n exports['default'] = Component.extend({\n classNames: ['highcharts-wrapper'],\n content: undefined,\n mode: undefined,\n chartOptions: undefined,\n chart: null,\n theme: undefined,\n callback: undefined,\n\n buildOptions: computed('chartOptions', 'content.[]', function () {\n var chartOptions = $.extend(true, {}, get(this, 'theme'), get(this, 'chartOptions'));\n var chartContent = get(this, 'content.length') ? get(this, 'content') : [{\n id: 'noData',\n data: 0,\n color: '#aaaaaa'\n }];\n\n var defaults = { series: chartContent };\n\n return assign(defaults, chartOptions);\n }),\n\n didReceiveAttrs: function didReceiveAttrs() {\n this._super.apply(this, arguments);\n\n var _getProperties = this.getProperties('content', 'chart', 'mode');\n\n var content = _getProperties.content;\n var chart = _getProperties.chart;\n var mode = _getProperties.mode;\n\n if (!content || !chart) {\n return;\n }\n\n var isStockChart = mode === 'StockChart';\n\n // create maps to make series data easier to work with\n var contentSeriesMap = content.reduce(function (contentSeriesMap, contentSeries) {\n contentSeriesMap[contentSeries.name] = contentSeries;\n return contentSeriesMap;\n }, {});\n\n var chartSeriesMap = chart.series.reduce(function (chartSeriesMap, chartSeries) {\n chartSeriesMap[chartSeries.name] = chartSeries;\n return chartSeriesMap;\n }, {});\n\n // remove and update current series\n var chartSeriesToRemove = [];\n\n chart.series.forEach(function (series) {\n if (isStockChart && series.name === 'Navigator') {\n return;\n }\n\n var contentSeries = contentSeriesMap[series.name];\n\n if (!contentSeries) {\n return chartSeriesToRemove.push(series);\n }\n\n series.setData(contentSeries.data, false);\n });\n\n chartSeriesToRemove.forEach(function (series) {\n return series.remove(false);\n });\n\n // add new series\n content.forEach(function (contentSeries) {\n if (!chartSeriesMap.hasOwnProperty(contentSeries.name)) {\n chart.addSeries(contentSeries, false);\n }\n });\n\n // reset navigator data\n if (isStockChart && chart.xAxis.length) {\n chart.xAxis[0].setExtremes();\n }\n\n return chart.redraw();\n },\n\n drawAfterRender: function drawAfterRender() {\n run.scheduleOnce('afterRender', this, 'draw');\n },\n\n draw: function draw() {\n var completeChartOptions = [get(this, 'buildOptions'), get(this, 'callback')];\n var mode = get(this, 'mode');\n\n if (typeof mode === 'string' && !!mode) {\n completeChartOptions.unshift(mode);\n }\n\n var $element = this.$();\n if ($element) {\n var chart = $element.highcharts.apply($element, completeChartOptions).highcharts();\n set(this, 'chart', chart);\n }\n },\n\n _renderChart: on('didInsertElement', function () {\n this.drawAfterRender();\n (0, _emberHighchartsUtilsOptionLoader.setDefaultHighChartOptions)((0, _emberGetownerPolyfill['default'])(this));\n }),\n\n _destroyChart: on('willDestroyElement', function () {\n if (get(this, 'chart')) {\n get(this, 'chart').destroy();\n }\n })\n });\n});","define('ember-highcharts/utils/option-loader', ['exports'], function (exports) {\n 'use strict';\n\n exports.setDefaultHighChartOptions = setDefaultHighChartOptions;\n\n var localConfig = null;\n\n function setDefaultHighChartOptions(owner) {\n if (!localConfig) {\n // use options defined in highcharts-configs/application.js if they exist\n var localConfigBuilder = owner._lookupFactory('highcharts-config:application');\n if (localConfigBuilder) {\n localConfig = localConfigBuilder(defaultOptions);\n } else {\n localConfig = defaultOptions;\n }\n }\n\n Highcharts.setOptions(localConfig);\n }\n\n var defaultOptions = {\n plotOptions: {\n series: {\n shadow: false\n }\n },\n\n global: {\n timezoneOffset: new Date().getTimezoneOffset()\n },\n\n credits: {\n enabled: false\n }\n };\n});","define(\"ember-inflector/index\", [\"exports\", \"ember\", \"ember-inflector/lib/system\", \"ember-inflector/lib/ext/string\"], function (exports, _ember, _emberInflectorLibSystem, _emberInflectorLibExtString) {\n /* global define, module */\n\n \"use strict\";\n\n _emberInflectorLibSystem.Inflector.defaultRules = _emberInflectorLibSystem.defaultRules;\n _ember[\"default\"].Inflector = _emberInflectorLibSystem.Inflector;\n\n _ember[\"default\"].String.pluralize = _emberInflectorLibSystem.pluralize;\n _ember[\"default\"].String.singularize = _emberInflectorLibSystem.singularize;exports[\"default\"] = _emberInflectorLibSystem.Inflector;\n exports.pluralize = _emberInflectorLibSystem.pluralize;\n exports.singularize = _emberInflectorLibSystem.singularize;\n exports.defaultRules = _emberInflectorLibSystem.defaultRules;\n\n if (typeof define !== 'undefined' && define.amd) {\n define('ember-inflector', ['exports'], function (__exports__) {\n __exports__['default'] = _emberInflectorLibSystem.Inflector;\n return _emberInflectorLibSystem.Inflector;\n });\n } else if (typeof module !== 'undefined' && module['exports']) {\n module['exports'] = _emberInflectorLibSystem.Inflector;\n }\n});","define('ember-inflector/lib/ext/string', ['exports', 'ember', 'ember-inflector/lib/system/string'], function (exports, _ember, _emberInflectorLibSystemString) {\n 'use strict';\n\n if (_ember['default'].EXTEND_PROTOTYPES === true || _ember['default'].EXTEND_PROTOTYPES.String) {\n /**\n See {{#crossLink \"Ember.String/pluralize\"}}{{/crossLink}}\n @method pluralize\n @for String\n */\n String.prototype.pluralize = function () {\n return (0, _emberInflectorLibSystemString.pluralize)(this);\n };\n\n /**\n See {{#crossLink \"Ember.String/singularize\"}}{{/crossLink}}\n @method singularize\n @for String\n */\n String.prototype.singularize = function () {\n return (0, _emberInflectorLibSystemString.singularize)(this);\n };\n }\n});","define('ember-inflector/lib/helpers/pluralize', ['exports', 'ember-inflector', 'ember-inflector/lib/utils/make-helper'], function (exports, _emberInflector, _emberInflectorLibUtilsMakeHelper) {\n 'use strict';\n\n /**\n *\n * If you have Ember Inflector (such as if Ember Data is present),\n * pluralize a word. For example, turn \"ox\" into \"oxen\".\n *\n * Example:\n *\n * {{pluralize count myProperty}}\n * {{pluralize 1 \"oxen\"}}\n * {{pluralize myProperty}}\n * {{pluralize \"ox\"}}\n *\n * @for Ember.HTMLBars.helpers\n * @method pluralize\n * @param {Number|Property} [count] count of objects\n * @param {String|Property} word word to pluralize\n */\n exports['default'] = (0, _emberInflectorLibUtilsMakeHelper['default'])(function (params) {\n var count = undefined,\n word = undefined;\n\n if (params.length === 1) {\n word = params[0];\n return (0, _emberInflector.pluralize)(word);\n } else {\n count = params[0];\n word = params[1];\n\n if (parseFloat(count) !== 1) {\n word = (0, _emberInflector.pluralize)(word);\n }\n\n return count + \" \" + word;\n }\n });\n});","define('ember-inflector/lib/helpers/singularize', ['exports', 'ember-inflector', 'ember-inflector/lib/utils/make-helper'], function (exports, _emberInflector, _emberInflectorLibUtilsMakeHelper) {\n 'use strict';\n\n /**\n *\n * If you have Ember Inflector (such as if Ember Data is present),\n * singularize a word. For example, turn \"oxen\" into \"ox\".\n *\n * Example:\n *\n * {{singularize myProperty}}\n * {{singularize \"oxen\"}}\n *\n * @for Ember.HTMLBars.helpers\n * @method singularize\n * @param {String|Property} word word to singularize\n */\n exports['default'] = (0, _emberInflectorLibUtilsMakeHelper['default'])(function (params) {\n return (0, _emberInflector.singularize)(params[0]);\n });\n});","define(\"ember-inflector/lib/system\", [\"exports\", \"ember-inflector/lib/system/inflector\", \"ember-inflector/lib/system/string\", \"ember-inflector/lib/system/inflections\"], function (exports, _emberInflectorLibSystemInflector, _emberInflectorLibSystemString, _emberInflectorLibSystemInflections) {\n \"use strict\";\n\n _emberInflectorLibSystemInflector[\"default\"].inflector = new _emberInflectorLibSystemInflector[\"default\"](_emberInflectorLibSystemInflections[\"default\"]);\n\n exports.Inflector = _emberInflectorLibSystemInflector[\"default\"];\n exports.singularize = _emberInflectorLibSystemString.singularize;\n exports.pluralize = _emberInflectorLibSystemString.pluralize;\n exports.defaultRules = _emberInflectorLibSystemInflections[\"default\"];\n});","define('ember-inflector/lib/system/inflections', ['exports'], function (exports) {\n 'use strict';\n\n exports['default'] = {\n plurals: [[/$/, 's'], [/s$/i, 's'], [/^(ax|test)is$/i, '$1es'], [/(octop|vir)us$/i, '$1i'], [/(octop|vir)i$/i, '$1i'], [/(alias|status|bonus)$/i, '$1es'], [/(bu)s$/i, '$1ses'], [/(buffal|tomat)o$/i, '$1oes'], [/([ti])um$/i, '$1a'], [/([ti])a$/i, '$1a'], [/sis$/i, 'ses'], [/(?:([^f])fe|([lr])f)$/i, '$1$2ves'], [/(hive)$/i, '$1s'], [/([^aeiouy]|qu)y$/i, '$1ies'], [/(x|ch|ss|sh)$/i, '$1es'], [/(matr|vert|ind)(?:ix|ex)$/i, '$1ices'], [/^(m|l)ouse$/i, '$1ice'], [/^(m|l)ice$/i, '$1ice'], [/^(ox)$/i, '$1en'], [/^(oxen)$/i, '$1'], [/(quiz)$/i, '$1zes']],\n\n singular: [[/s$/i, ''], [/(ss)$/i, '$1'], [/(n)ews$/i, '$1ews'], [/([ti])a$/i, '$1um'], [/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)$/i, '$1sis'], [/(^analy)(sis|ses)$/i, '$1sis'], [/([^f])ves$/i, '$1fe'], [/(hive)s$/i, '$1'], [/(tive)s$/i, '$1'], [/([lr])ves$/i, '$1f'], [/([^aeiouy]|qu)ies$/i, '$1y'], [/(s)eries$/i, '$1eries'], [/(m)ovies$/i, '$1ovie'], [/(x|ch|ss|sh)es$/i, '$1'], [/^(m|l)ice$/i, '$1ouse'], [/(bus)(es)?$/i, '$1'], [/(o)es$/i, '$1'], [/(shoe)s$/i, '$1'], [/(cris|test)(is|es)$/i, '$1is'], [/^(a)x[ie]s$/i, '$1xis'], [/(octop|vir)(us|i)$/i, '$1us'], [/(alias|status|bonus)(es)?$/i, '$1'], [/^(ox)en/i, '$1'], [/(vert|ind)ices$/i, '$1ex'], [/(matr)ices$/i, '$1ix'], [/(quiz)zes$/i, '$1'], [/(database)s$/i, '$1']],\n\n irregularPairs: [['person', 'people'], ['man', 'men'], ['child', 'children'], ['sex', 'sexes'], ['move', 'moves'], ['cow', 'kine'], ['zombie', 'zombies']],\n\n uncountable: ['equipment', 'information', 'rice', 'money', 'species', 'series', 'fish', 'sheep', 'jeans', 'police']\n };\n});","define('ember-inflector/lib/system/inflector', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n var capitalize = _ember['default'].String.capitalize;\n\n var BLANK_REGEX = /^\\s*$/;\n var LAST_WORD_DASHED_REGEX = /([\\w/-]+[_/\\s-])([a-z\\d]+$)/;\n var LAST_WORD_CAMELIZED_REGEX = /([\\w/\\s-]+)([A-Z][a-z\\d]*$)/;\n var CAMELIZED_REGEX = /[A-Z][a-z\\d]*$/;\n\n function loadUncountable(rules, uncountable) {\n for (var i = 0, length = uncountable.length; i < length; i++) {\n rules.uncountable[uncountable[i].toLowerCase()] = true;\n }\n }\n\n function loadIrregular(rules, irregularPairs) {\n var pair;\n\n for (var i = 0, length = irregularPairs.length; i < length; i++) {\n pair = irregularPairs[i];\n\n //pluralizing\n rules.irregular[pair[0].toLowerCase()] = pair[1];\n rules.irregular[pair[1].toLowerCase()] = pair[1];\n\n //singularizing\n rules.irregularInverse[pair[1].toLowerCase()] = pair[0];\n rules.irregularInverse[pair[0].toLowerCase()] = pair[0];\n }\n }\n\n /**\n Inflector.Ember provides a mechanism for supplying inflection rules for your\n application. Ember includes a default set of inflection rules, and provides an\n API for providing additional rules.\n \n Examples:\n \n Creating an inflector with no rules.\n \n ```js\n var inflector = new Ember.Inflector();\n ```\n \n Creating an inflector with the default ember ruleset.\n \n ```js\n var inflector = new Ember.Inflector(Ember.Inflector.defaultRules);\n \n inflector.pluralize('cow'); //=> 'kine'\n inflector.singularize('kine'); //=> 'cow'\n ```\n \n Creating an inflector and adding rules later.\n \n ```javascript\n var inflector = Ember.Inflector.inflector;\n \n inflector.pluralize('advice'); // => 'advices'\n inflector.uncountable('advice');\n inflector.pluralize('advice'); // => 'advice'\n \n inflector.pluralize('formula'); // => 'formulas'\n inflector.irregular('formula', 'formulae');\n inflector.pluralize('formula'); // => 'formulae'\n \n // you would not need to add these as they are the default rules\n inflector.plural(/$/, 's');\n inflector.singular(/s$/i, '');\n ```\n \n Creating an inflector with a nondefault ruleset.\n \n ```javascript\n var rules = {\n plurals: [ /$/, 's' ],\n singular: [ /\\s$/, '' ],\n irregularPairs: [\n [ 'cow', 'kine' ]\n ],\n uncountable: [ 'fish' ]\n };\n \n var inflector = new Ember.Inflector(rules);\n ```\n \n @class Inflector\n @namespace Ember\n */\n function Inflector(ruleSet) {\n ruleSet = ruleSet || {};\n ruleSet.uncountable = ruleSet.uncountable || makeDictionary();\n ruleSet.irregularPairs = ruleSet.irregularPairs || makeDictionary();\n\n var rules = this.rules = {\n plurals: ruleSet.plurals || [],\n singular: ruleSet.singular || [],\n irregular: makeDictionary(),\n irregularInverse: makeDictionary(),\n uncountable: makeDictionary()\n };\n\n loadUncountable(rules, ruleSet.uncountable);\n loadIrregular(rules, ruleSet.irregularPairs);\n\n this.enableCache();\n }\n\n if (!Object.create && !Object.create(null).hasOwnProperty) {\n throw new Error(\"This browser does not support Object.create(null), please polyfil with es5-sham: http://git.io/yBU2rg\");\n }\n\n function makeDictionary() {\n var cache = Object.create(null);\n cache['_dict'] = null;\n delete cache['_dict'];\n return cache;\n }\n\n Inflector.prototype = {\n /**\n @public\n As inflections can be costly, and commonly the same subset of words are repeatedly\n inflected an optional cache is provided.\n @method enableCache\n */\n enableCache: function enableCache() {\n this.purgeCache();\n\n this.singularize = function (word) {\n this._cacheUsed = true;\n return this._sCache[word] || (this._sCache[word] = this._singularize(word));\n };\n\n this.pluralize = function (word) {\n this._cacheUsed = true;\n return this._pCache[word] || (this._pCache[word] = this._pluralize(word));\n };\n },\n\n /**\n @public\n @method purgedCache\n */\n purgeCache: function purgeCache() {\n this._cacheUsed = false;\n this._sCache = makeDictionary();\n this._pCache = makeDictionary();\n },\n\n /**\n @public\n disable caching\n @method disableCache;\n */\n disableCache: function disableCache() {\n this._sCache = null;\n this._pCache = null;\n this.singularize = function (word) {\n return this._singularize(word);\n };\n\n this.pluralize = function (word) {\n return this._pluralize(word);\n };\n },\n\n /**\n @method plural\n @param {RegExp} regex\n @param {String} string\n */\n plural: function plural(regex, string) {\n if (this._cacheUsed) {\n this.purgeCache();\n }\n this.rules.plurals.push([regex, string.toLowerCase()]);\n },\n\n /**\n @method singular\n @param {RegExp} regex\n @param {String} string\n */\n singular: function singular(regex, string) {\n if (this._cacheUsed) {\n this.purgeCache();\n }\n this.rules.singular.push([regex, string.toLowerCase()]);\n },\n\n /**\n @method uncountable\n @param {String} regex\n */\n uncountable: function uncountable(string) {\n if (this._cacheUsed) {\n this.purgeCache();\n }\n loadUncountable(this.rules, [string.toLowerCase()]);\n },\n\n /**\n @method irregular\n @param {String} singular\n @param {String} plural\n */\n irregular: function irregular(singular, plural) {\n if (this._cacheUsed) {\n this.purgeCache();\n }\n loadIrregular(this.rules, [[singular, plural]]);\n },\n\n /**\n @method pluralize\n @param {String} word\n */\n pluralize: function pluralize(word) {\n return this._pluralize(word);\n },\n\n _pluralize: function _pluralize(word) {\n return this.inflect(word, this.rules.plurals, this.rules.irregular);\n },\n /**\n @method singularize\n @param {String} word\n */\n singularize: function singularize(word) {\n return this._singularize(word);\n },\n\n _singularize: function _singularize(word) {\n return this.inflect(word, this.rules.singular, this.rules.irregularInverse);\n },\n\n /**\n @protected\n @method inflect\n @param {String} word\n @param {Object} typeRules\n @param {Object} irregular\n */\n inflect: function inflect(word, typeRules, irregular) {\n var inflection, substitution, result, lowercase, wordSplit, firstPhrase, lastWord, isBlank, isCamelized, rule, isUncountable;\n\n isBlank = !word || BLANK_REGEX.test(word);\n\n isCamelized = CAMELIZED_REGEX.test(word);\n firstPhrase = \"\";\n\n if (isBlank) {\n return word;\n }\n\n lowercase = word.toLowerCase();\n wordSplit = LAST_WORD_DASHED_REGEX.exec(word) || LAST_WORD_CAMELIZED_REGEX.exec(word);\n\n if (wordSplit) {\n firstPhrase = wordSplit[1];\n lastWord = wordSplit[2].toLowerCase();\n }\n\n isUncountable = this.rules.uncountable[lowercase] || this.rules.uncountable[lastWord];\n\n if (isUncountable) {\n return word;\n }\n\n for (rule in irregular) {\n if (lowercase.match(rule + \"$\")) {\n substitution = irregular[rule];\n\n if (isCamelized && irregular[lastWord]) {\n substitution = capitalize(substitution);\n rule = capitalize(rule);\n }\n\n return word.replace(new RegExp(rule, 'i'), substitution);\n }\n }\n\n for (var i = typeRules.length, min = 0; i > min; i--) {\n inflection = typeRules[i - 1];\n rule = inflection[0];\n\n if (rule.test(word)) {\n break;\n }\n }\n\n inflection = inflection || [];\n\n rule = inflection[0];\n substitution = inflection[1];\n\n result = word.replace(rule, substitution);\n\n return result;\n }\n };\n\n exports['default'] = Inflector;\n});","define('ember-inflector/lib/system/string', ['exports', 'ember-inflector/lib/system/inflector'], function (exports, _emberInflectorLibSystemInflector) {\n 'use strict';\n\n function pluralize(word) {\n return _emberInflectorLibSystemInflector['default'].inflector.pluralize(word);\n }\n\n function singularize(word) {\n return _emberInflectorLibSystemInflector['default'].inflector.singularize(word);\n }\n\n exports.pluralize = pluralize;\n exports.singularize = singularize;\n});","define('ember-inflector/lib/utils/make-helper', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports['default'] = makeHelper;\n\n function makeHelper(helperFunction) {\n if (_ember['default'].Helper) {\n return _ember['default'].Helper.helper(helperFunction);\n }\n if (_ember['default'].HTMLBars) {\n return _ember['default'].HTMLBars.makeBoundHelper(helperFunction);\n }\n return _ember['default'].Handlebars.makeBoundHelper(helperFunction);\n }\n});","define('ember-load-initializers/index', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports['default'] = function (app, prefix) {\n var regex = new RegExp('^' + prefix + '\\/((?:instance-)?initializers)\\/');\n var getKeys = Object.keys || _ember['default'].keys;\n\n getKeys(requirejs._eak_seen).map(function (moduleName) {\n return {\n moduleName: moduleName,\n matches: regex.exec(moduleName)\n };\n }).filter(function (dep) {\n return dep.matches && dep.matches.length === 2;\n }).forEach(function (dep) {\n var moduleName = dep.moduleName;\n\n var module = require(moduleName, null, null, true);\n if (!module) {\n throw new Error(moduleName + ' must export an initializer.');\n }\n\n var initializerType = _ember['default'].String.camelize(dep.matches[1].substring(0, dep.matches[1].length - 1));\n var initializer = module['default'];\n if (!initializer.name) {\n var initializerName = moduleName.match(/[^\\/]+\\/?$/)[0];\n initializer.name = initializerName;\n }\n\n if (app[initializerType]) {\n app[initializerType](initializer);\n }\n });\n };\n});","define('ember-local-storage/adapters/adapter', ['exports', 'ember-local-storage/adapters/local'], function (exports, _emberLocalStorageAdaptersLocal) {\n 'use strict';\n\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberLocalStorageAdaptersLocal['default'];\n }\n });\n});","define('ember-local-storage/adapters/base', ['exports', 'ember', 'ember-data', 'ember-local-storage/mixins/adapters/import-export'], function (exports, _ember, _emberData, _emberLocalStorageMixinsAdaptersImportExport) {\n 'use strict';\n\n var keys = Object.keys || _ember['default'].keys;\n\n var JSONAPIAdapter = _emberData['default'].JSONAPIAdapter;\n var get = _ember['default'].get;\n var RSVP = _ember['default'].RSVP;\n var run = _ember['default'].run;\n var Inflector = _ember['default'].Inflector;\n var typeOf = _ember['default'].typeOf;\n var isEmpty = _ember['default'].isEmpty;\n\n // Ember data ships with ember-inflector\n var inflector = Inflector.inflector;\n\n exports['default'] = JSONAPIAdapter.extend(_emberLocalStorageMixinsAdaptersImportExport['default'], {\n _debug: false,\n _indices: {},\n isNewSerializerAPI: true,\n coalesceFindRequests: false,\n\n // Reload behavior\n shouldReloadRecord: function shouldReloadRecord() {\n return true;\n },\n shouldReloadAll: function shouldReloadAll() {\n return true;\n },\n shouldBackgroundReloadRecord: function shouldBackgroundReloadRecord() {\n return true;\n },\n shouldBackgroundReloadAll: function shouldBackgroundReloadAll() {\n return true;\n },\n\n generateIdForRecord: function generateIdForRecord() {\n return Math.random().toString(32).slice(2).substr(0, 8);\n },\n\n // Relationship sugar\n createRecord: function createRecord(store, type, snapshot) {\n snapshot.eachRelationship(function (name, relationship) {\n var kind = relationship.kind;\n var options = relationship.options;\n\n if (kind === 'belongsTo' && options.autoSave) {\n snapshot.record.get(name).then(function (record) {\n if (record) {\n record.save();\n }\n });\n }\n });\n\n return this._super.apply(this, arguments);\n },\n\n deleteRecord: function deleteRecord(store, type, snapshot) {\n snapshot.eachRelationship(function (name, relationship) {\n var kind = relationship.kind;\n var options = relationship.options;\n\n if (kind === 'hasMany' && options.dependent === 'destroy') {\n snapshot.record.get(name).then(function (records) {\n records.forEach(function (record) {\n record.destroyRecord();\n });\n });\n }\n\n if (kind === 'belongsTo' && options.autoSave) {\n snapshot.record.get(name).then(function (record) {\n if (record) {\n record.save();\n }\n });\n }\n });\n\n return this._super.apply(this, arguments);\n },\n\n // Polyfill queryRecord\n queryRecord: function queryRecord(store, type, query) {\n var records = this._super.apply(this, arguments);\n\n if (!records) {\n var url = this.buildURL(type.modelName, null, null, 'queryRecord', query);\n\n if (this.sortQueryParams) {\n query = this.sortQueryParams(query);\n }\n\n records = this.ajax(url, 'GET', { data: query });\n }\n\n return records.then(function (result) {\n result = result.data[0];\n // hack to fix https://github.com/emberjs/data/issues/3790\n // and https://github.com/emberjs/data/pull/3866\n try {\n store.push({ data: null });\n return { data: result || null };\n } catch (e) {\n return { data: result || [] };\n }\n });\n },\n\n // Delegate to _handleStorageRequest\n ajax: function ajax() {\n return this._handleStorageRequest.apply(this, arguments);\n },\n\n // Delegate to _handleStorageRequest\n makeRequest: function makeRequest(request) {\n return this._handleStorageRequest(request.url, request.method, { data: request.data });\n },\n\n // Work arround ds-improved-ajax Feature Flag\n _makeRequest: function _makeRequest() {\n return this.makeRequest.apply(this, arguments);\n },\n\n // Remove the ajax() deprecation warning\n _hasCustomizedAjax: function _hasCustomizedAjax() {\n return false;\n },\n\n // Delegate to _handle${type}Request\n _handleStorageRequest: function _handleStorageRequest(url, type) {\n var _this = this;\n\n var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];\n\n if (this._debug) {\n console.log(url, type, options);\n }\n\n return new RSVP.Promise(function (resolve, reject) {\n var handler = _this['_handle' + type + 'Request'];\n if (handler) {\n var data = handler.call(_this, url, options.data);\n run(null, resolve, { data: data });\n } else {\n run(null, reject, 'There is nothing to handle _handle' + type + 'Request');\n }\n }, 'DS: LocalStorageAdapter#_handleStorageRequest ' + type + ' to ' + url);\n },\n\n _handleGETRequest: function _handleGETRequest(url, query) {\n var _this2 = this;\n\n var _urlParts2 = this._urlParts(url);\n\n var type = _urlParts2.type;\n var id = _urlParts2.id;\n\n var storage = get(this, '_storage'),\n storageKey = this._storageKey(type, id);\n\n if (id) {\n return storage[storageKey] ? JSON.parse(storage[storageKey]) : null;\n }\n\n var records = this._getIndex(type).filter(function (storageKey) {\n return storage[storageKey];\n }).map(function (storageKey) {\n return JSON.parse(storage[storageKey]);\n });\n\n if (query && query.filter) {\n var _ret = (function () {\n var serializer = _this2.store.serializerFor(inflector.singularize(type));\n\n return {\n v: records.filter(function (record) {\n return _this2._queryFilter(record, serializer, query.filter);\n })\n };\n })();\n\n if (typeof _ret === 'object') return _ret.v;\n }\n\n return records;\n },\n\n _handlePOSTRequest: function _handlePOSTRequest(url, record) {\n var _record$data = record.data;\n var type = _record$data.type;\n var id = _record$data.id;\n\n var storageKey = this._storageKey(type, id);\n\n this._addToIndex(type, storageKey);\n get(this, '_storage')[storageKey] = JSON.stringify(record.data);\n\n return null;\n },\n\n _handlePATCHRequest: function _handlePATCHRequest(url, record) {\n var _record$data2 = record.data;\n var type = _record$data2.type;\n var id = _record$data2.id;\n\n var storageKey = this._storageKey(type, id);\n\n this._addToIndex(type, storageKey);\n get(this, '_storage')[storageKey] = JSON.stringify(record.data);\n\n return null;\n },\n\n _handleDELETERequest: function _handleDELETERequest(url) {\n var _urlParts3 = this._urlParts(url);\n\n var type = _urlParts3.type;\n var id = _urlParts3.id;\n\n var storageKey = this._storageKey(type, id);\n\n this._removeFromIndex(type, storageKey);\n delete get(this, '_storage')[storageKey];\n\n return null;\n },\n\n _queryFilter: function _queryFilter(data, serializer) {\n var _this3 = this;\n\n var query = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];\n\n var queryType = typeOf(query),\n dataType = typeOf(data);\n\n if (queryType === 'object' && dataType === 'object') {\n return keys(query).every(function (key) {\n var queryValue = query[key],\n recordValue = undefined;\n\n // normalize type\n if (key === 'type' && typeOf(queryValue) === 'string') {\n queryValue = inflector.pluralize(queryValue);\n }\n\n // Attributes\n if (key === 'id' || key === 'type') {\n recordValue = data[key];\n } else {\n key = serializer.keyForAttribute(key);\n recordValue = data.attributes ? data.attributes[key] : null;\n }\n\n if (recordValue !== undefined) {\n return _this3._matches(recordValue, queryValue);\n }\n\n // Relationships\n key = serializer.keyForRelationship(key);\n if (data.relationships && data.relationships[key]) {\n if (isEmpty(data.relationships[key].data)) {\n return;\n }\n\n return _this3._queryFilter(data.relationships[key].data, serializer, queryValue);\n }\n });\n } else if (queryType === 'array') {\n // belongsTo\n if (dataType === 'object') {\n var queryMessage = query.map(function (item) {\n return keys(item).map(function (key) {\n return key + ': ' + item[key];\n });\n }).join(', ');\n\n throw new Error('You can not provide an array with a belongsTo relation. ' + 'Query: ' + queryMessage);\n\n // hasMany\n } else {\n return query.every(function (queryValue) {\n return _this3._queryFilter(data, serializer, queryValue);\n });\n }\n } else {\n // belongsTo\n if (dataType === 'object') {\n return this._matches(data.id, query);\n\n // hasMany\n } else {\n return data.some(function (record) {\n return _this3._queryFilter(record, serializer, query);\n });\n }\n }\n },\n\n _matches: function _matches(recordValue, queryValue) {\n if (typeOf(queryValue) === 'regexp') {\n return queryValue.test(recordValue);\n }\n\n return recordValue === queryValue;\n },\n\n _urlParts: function _urlParts(url) {\n var parts = url.split('/');\n\n // remove empty part\n parts.shift();\n\n var type = parts.shift();\n var id = parts.shift();\n\n if (type === this.modelNamespace) {\n type = type + '/' + id;\n id = parts.shift();\n }\n\n return {\n type: type,\n id: id\n };\n },\n\n _storageKey: function _storageKey(type, id) {\n return type + '-' + id;\n },\n\n // Should be overwriten\n // Signature: _getIndex(type)\n _getIndex: function _getIndex() {},\n\n _indexHasKey: function _indexHasKey(type, id) {\n return this._getIndex(type).indexOf(id) !== -1;\n },\n\n _addToIndex: function _addToIndex(type, id) {\n if (!this._indexHasKey(type, id)) {\n this._getIndex(type).addObject(id);\n }\n },\n\n _removeFromIndex: function _removeFromIndex(type, id) {\n this._getIndex(type).removeObject(id);\n }\n });\n});","define('ember-local-storage/adapters/local', ['exports', 'ember', 'ember-local-storage/adapters/base', 'ember-local-storage/helpers/storage', 'ember-local-storage/local/array'], function (exports, _ember, _emberLocalStorageAdaptersBase, _emberLocalStorageHelpersStorage, _emberLocalStorageLocalArray) {\n 'use strict';\n\n var get = _ember['default'].get;\n\n exports['default'] = _emberLocalStorageAdaptersBase['default'].extend({\n _storage: (0, _emberLocalStorageHelpersStorage.getStorage)('local'),\n\n _getIndex: function _getIndex(type) {\n var indices = get(this, '_indices');\n\n if (!indices[type]) {\n indices[type] = _emberLocalStorageLocalArray['default'].extend({ _storageKey: 'index-' + type }).create();\n }\n\n return indices[type];\n }\n });\n});","define('ember-local-storage/adapters/session', ['exports', 'ember', 'ember-local-storage/adapters/base', 'ember-local-storage/helpers/storage', 'ember-local-storage/session/array'], function (exports, _ember, _emberLocalStorageAdaptersBase, _emberLocalStorageHelpersStorage, _emberLocalStorageSessionArray) {\n 'use strict';\n\n var get = _ember['default'].get;\n\n exports['default'] = _emberLocalStorageAdaptersBase['default'].extend({\n _storage: (0, _emberLocalStorageHelpersStorage.getStorage)('session'),\n\n _getIndex: function _getIndex(type) {\n var indices = get(this, '_indices');\n\n if (!indices[type]) {\n indices[type] = _emberLocalStorageSessionArray['default'].extend({ _storageKey: 'index-' + type }).create();\n }\n\n return indices[type];\n }\n });\n});","define('ember-local-storage/helpers/storage', ['exports', 'ember', 'ember-getowner-polyfill'], function (exports, _ember, _emberGetownerPolyfill) {\n 'use strict';\n\n var assert = _ember['default'].assert;\n var computed = _ember['default'].computed;\n var dasherize = _ember['default'].String.dasherize;\n\n var assign = _ember['default'].assign || _ember['default'].merge;\n\n var storage = {};\n\n function tryStorage(name) {\n var nativeStorage = undefined;\n\n // safari private mode exposes xStorage but fails on setItem\n try {\n nativeStorage = name === 'local' ? localStorage : sessionStorage;\n nativeStorage.setItem('emberlocalstorage.test', 'ok');\n nativeStorage.removeItem('emberlocalstorage.test');\n } catch (e) {\n nativeStorage = null;\n }\n\n return nativeStorage;\n }\n\n function getStorage(name) {\n if (storage[name]) {\n return storage[name];\n } else {\n return storage[name] = tryStorage(name) || {};\n }\n }\n\n var storages = {};\n\n function storageFor(key, modelName) {\n var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];\n\n if (arguments.length === 2 && typeof modelName === 'object') {\n options = modelName;\n modelName = null;\n }\n\n assert('The options argument must be an object', typeof options === 'object');\n\n // normalize key\n key = dasherize(key);\n\n if (!modelName) {\n return computed(function () {\n if (!storages[key]) {\n storages[key] = createStorage(this, key, null, options);\n }\n\n return storages[key];\n });\n }\n\n assert('The second argument must be a string', typeof modelName === 'string');\n\n return computed(modelName, function () {\n var model = this.get(modelName);\n\n // if the propertyValue is null/undefined we simply return null/undefined\n if (!model || typeof model === 'undefined') {\n return model;\n }\n\n var modelKey = _modelKey(model);\n // TODO allow callbacks to delete the storage if model gets deleted\n\n if (!storages[modelKey]) {\n storages[modelKey] = createStorage(this, key, modelKey, options);\n }\n\n return storages[modelKey];\n });\n }\n\n /*\n * Looks up the storage factory on the container and sets initial state\n * on the instance if desired.\n */\n function createStorage(context, key, modelKey, options) {\n var owner = (0, _emberGetownerPolyfill['default'])(context);\n var factoryType = 'storage';\n var storageFactory = factoryType + ':' + key;\n\n var storageKey = undefined;\n\n owner.registerOptionsForType(factoryType, { instantiate: false });\n\n if (options.legacyKey) {\n storageKey = options.legacyKey;\n } else {\n storageKey = modelKey ? storageFactory + ':' + modelKey : storageFactory;\n }\n\n var initialState = {},\n defaultState = {\n _storageKey: storageKey\n },\n StorageFactory = owner.lookup(storageFactory);\n\n if (!StorageFactory) {\n throw new TypeError('Unknown StorageFactory: ' + storageFactory);\n }\n\n if (typeof StorageFactory.initialState === 'function') {\n initialState._initialContent = StorageFactory.initialState.call(context);\n } else if (StorageFactory.initialState) {\n throw new TypeError('initialState property must be a function');\n }\n\n assign(initialState, defaultState);\n\n if (StorageFactory.create) {\n return StorageFactory.create(initialState);\n }\n\n return _ember['default'].Object.create(StorageFactory);\n }\n\n function _modelKey(model) {\n var modelName = model.modelName || model.constructor.typeKey,\n id = model.get('id');\n\n if (!modelName || !id) {\n throw new TypeError('The model must have a `modelName` and `id` on it');\n }\n\n return modelName + ':' + id;\n }\n\n // Testing helper\n function _resetStorages() {\n storages = {};\n }\n\n exports.tryStorage = tryStorage;\n exports.getStorage = getStorage;\n exports.storageFor = storageFor;\n exports._resetStorages = _resetStorages;\n});","define('ember-local-storage/index', ['exports', 'ember-local-storage/helpers/storage'], function (exports, _emberLocalStorageHelpersStorage) {\n 'use strict';\n\n exports.storageFor = _emberLocalStorageHelpersStorage.storageFor;\n});","define('ember-local-storage/initializers/local-storage-adapter', ['exports', 'ember-data', 'ember-local-storage/adapters/adapter'], function (exports, _emberData, _emberLocalStorageAdaptersAdapter) {\n 'use strict';\n\n exports.initialize = initialize;\n\n function initialize() {\n if (!_emberData['default'].Store.prototype._emberLocalStoragePatched) {\n (function () {\n var adapter = _emberLocalStorageAdaptersAdapter['default'].create();\n\n _emberData['default'].Store.reopen({\n _emberLocalStoragePatched: true,\n importData: function importData(json, options) {\n return adapter.importData.call(adapter, this, json, options);\n },\n exportData: function exportData(types, options) {\n return adapter.exportData.call(adapter, this, types, options);\n }\n });\n })();\n }\n }\n\n exports['default'] = {\n name: 'local-storage-adapter',\n after: 'ember-data',\n initialize: initialize\n };\n});","define('ember-local-storage/local/array', ['exports', 'ember', 'ember-local-storage/mixins/array'], function (exports, _ember, _emberLocalStorageMixinsArray) {\n 'use strict';\n\n exports['default'] = _ember['default'].ArrayProxy.extend(_emberLocalStorageMixinsArray['default'], {\n _storageType: 'local'\n });\n});","define('ember-local-storage/local/object', ['exports', 'ember', 'ember-local-storage/mixins/object'], function (exports, _ember, _emberLocalStorageMixinsObject) {\n 'use strict';\n\n exports['default'] = _ember['default'].ObjectProxy.extend(_emberLocalStorageMixinsObject['default'], {\n _storageType: 'local'\n });\n});","define('ember-local-storage/mixins/adapters/import-export', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n var get = _ember['default'].get;\n\n var Mixin = _ember['default'].Mixin;\n var singularize = _ember['default'].String.singularize;\n\n var assign = _ember['default'].assign || _ember['default'].merge;\n\n exports['default'] = Mixin.create({\n importData: function importData(store, content, options) {\n var _this = this;\n\n // merge defaults\n options = assign({\n json: true,\n truncate: true\n }, options || {});\n\n var reloadTypes = [];\n\n content = options.json ? JSON.parse(content) : content;\n\n if (options.truncate) {\n content.data.forEach(function (record) {\n var type = record.type;\n\n _this._getIndex(type).forEach(function (storageKey) {\n delete get(_this, '_storage')[storageKey];\n });\n\n _this._getIndex(type).reset();\n\n // unload from store\n store.unloadAll(singularize(type));\n });\n }\n\n var promises = content.data.map(function (record) {\n // collect types to reload\n reloadTypes.push(singularize(record.type));\n\n return _this._handleStorageRequest(null, 'POST', {\n data: { data: record }\n });\n });\n\n return _ember['default'].RSVP.all(promises).then(function () {\n // reload from store\n reloadTypes.forEach(function (type) {\n store.findAll(type);\n });\n });\n },\n\n exportData: function exportData(store, types, options) {\n var _this2 = this;\n\n // merge defaults\n options = assign({\n json: true,\n download: false,\n filename: 'ember-data.json'\n }, options || {});\n\n var json = undefined,\n data = undefined;\n\n // collect data\n data = types.reduce(function (records, type) {\n var url = _this2.buildURL(type),\n exportData = _this2._handleGETRequest(url);\n\n records.data = records.data.concat(exportData);\n return records;\n }, { data: [] });\n\n if (options.json || options.download) {\n json = JSON.stringify(data);\n }\n\n if (options.json) {\n data = json;\n }\n\n if (options.download) {\n window.saveAs(new Blob([json], { type: 'application/json;charset=utf-8' }), options.filename);\n }\n\n return new _ember['default'].RSVP.Promise(function (resolve) {\n _ember['default'].run(null, resolve, data);\n }, 'DS: LocalStorageAdapter#exportData');\n }\n });\n});","define('ember-local-storage/mixins/array', ['exports', 'ember', 'ember-local-storage/mixins/storage'], function (exports, _ember, _emberLocalStorageMixinsStorage) {\n 'use strict';\n\n var set = _ember['default'].set;\n\n exports['default'] = _ember['default'].Mixin.create(_emberLocalStorageMixinsStorage['default'], {\n _initialContent: _ember['default'].A(),\n\n replaceContent: function replaceContent() {\n this._super.apply(this, arguments);\n this._save();\n },\n\n // we need to save\n reset: function reset() {\n this._super.apply(this, arguments);\n this._save();\n },\n\n _clear: function _clear() {\n set(this, 'content', _ember['default'].A());\n }\n });\n});","define('ember-local-storage/mixins/object', ['exports', 'ember', 'ember-local-storage/mixins/storage'], function (exports, _ember, _emberLocalStorageMixinsStorage) {\n 'use strict';\n\n var set = _ember['default'].set;\n\n exports['default'] = _ember['default'].Mixin.create(_emberLocalStorageMixinsStorage['default'], {\n _initialContent: {},\n\n setUnknownProperty: function setUnknownProperty(key) {\n this._super.apply(this, arguments);\n\n if (key !== '_isInitialContent') {\n this._save();\n }\n },\n\n set: function set(key) {\n this._super.apply(this, arguments);\n\n if (key !== '_isInitialContent') {\n this._save();\n }\n },\n\n setProperties: function setProperties() {\n this._super.apply(this, arguments);\n this._save();\n },\n\n _clear: function _clear() {\n set(this, 'content', {});\n }\n });\n});","define('ember-local-storage/mixins/storage', ['exports', 'ember', 'ember-local-storage/helpers/storage'], function (exports, _ember, _emberLocalStorageHelpersStorage) {\n 'use strict';\n\n var get = _ember['default'].get;\n var set = _ember['default'].set;\n\n var Mixin = _ember['default'].Mixin;\n var deprecate = _ember['default'].deprecate;\n var copy = _ember['default'].copy;\n var isArray = _ember['default'].isArray;\n\n var assign = _ember['default'].assign || _ember['default'].merge;\n\n exports['default'] = Mixin.create({\n // TODO remove on 2.0 release\n _storageKey: null,\n // TODO remove on 2.0 release\n initialContent: null,\n _initialContent: null,\n _initialContentString: null,\n _isInitialContent: true,\n // we need it for storage event testing\n _testing: false,\n\n // Shorthand for the storage\n _storage: function _storage() {\n return (0, _emberLocalStorageHelpersStorage.getStorage)(get(this, '_storageType'));\n },\n\n init: function init() {\n var storage = this._storage();\n\n var serialized = undefined,\n content = undefined,\n storageKey = get(this, '_storageKey'),\n initialContent = get(this, '_initialContent');\n\n // TODO remove on 2.0 release and make storageKey a const\n if (get(this, 'storageKey')) {\n storageKey = get(this, 'storageKey');\n deprecate('Usage of storageKey is deprecated use the generator instead: ember g storage -h');\n }\n\n // TODO remove on 2.0 release and make initialContent a const\n if (get(this, 'initialContent')) {\n initialContent = get(this, 'initialContent');\n deprecate('Usage of initialContent is deprecated use the generator instead: ember g storage -h');\n }\n\n // TODO remove on 2.0 release\n if (!initialContent) {\n throw new Error('You must specify the initialContent.');\n }\n\n set(this, '_initialContentString', JSON.stringify(initialContent));\n\n // Retrieve the serialized version from storage..\n serialized = storage[storageKey];\n\n // Merge the serialized version into defaults.\n content = this._getInitialContentCopy();\n\n if (serialized) {\n assign(content, JSON.parse(serialized));\n }\n\n // Do not change to set(this, 'content', content)\n this.set('content', content);\n\n // Keep in sync with other windows\n this._addStorageListener();\n\n return this._super.apply(this, arguments);\n },\n\n _getInitialContentCopy: function _getInitialContentCopy() {\n var initialContent = get(this, '_initialContent'),\n content = copy(initialContent, true);\n\n // Ember.copy returns a normal array when prototype extensions are off\n // This ensures that we wrap it in an Ember Array.\n return isArray(content) ? _ember['default'].A(content) : content;\n },\n\n _addStorageListener: function _addStorageListener() {\n var _this = this;\n\n var storage = this._storage(),\n storageKey = get(this, '_storageKey');\n\n if (window.addEventListener) {\n window.addEventListener('storage', function (event) {\n if (event.storageArea === storage && event.key === storageKey) {\n if ('hidden' in document && !document.hidden && !_this._testing || event.newValue === event.oldValue || event.newValue === JSON.stringify(_this.get('content'))) {\n return;\n }\n\n if (event.newValue) {\n _this.set('content', JSON.parse(event.newValue));\n } else {\n _this.clear();\n }\n }\n }, false);\n }\n },\n\n _save: function _save() {\n var storage = this._storage(),\n content = get(this, 'content'),\n storageKey = get(this, '_storageKey'),\n initialContentString = get(this, '_initialContentString');\n\n if (storageKey) {\n var json = JSON.stringify(content);\n\n if (json !== initialContentString) {\n set(this, '_isInitialContent', false);\n }\n\n storage[storageKey] = json;\n }\n },\n\n // Public API\n\n // returns boolean\n isInitialContent: function isInitialContent() {\n return get(this, '_isInitialContent');\n },\n\n // reset the content\n // returns void\n reset: function reset() {\n var content = this._getInitialContentCopy();\n\n // Do not change to set(this, 'content', content)\n this.set('content', content);\n set(this, '_isInitialContent', true);\n },\n\n // clear the content\n // returns void\n clear: function clear() {\n this._clear();\n delete this._storage()[get(this, '_storageKey')];\n }\n });\n});","define('ember-local-storage/serializers/serializer', ['exports', 'ember-data'], function (exports, _emberData) {\n 'use strict';\n\n var JSONAPISerializer = _emberData['default'].JSONAPISerializer;\n\n exports['default'] = JSONAPISerializer.extend({\n // Serialization behavior\n _shouldSerializeHasMany: function _shouldSerializeHasMany() {\n return true;\n }\n });\n});","define('ember-local-storage/session/array', ['exports', 'ember', 'ember-local-storage/mixins/array'], function (exports, _ember, _emberLocalStorageMixinsArray) {\n 'use strict';\n\n exports['default'] = _ember['default'].ArrayProxy.extend(_emberLocalStorageMixinsArray['default'], {\n _storageType: 'session'\n });\n});","define('ember-local-storage/session/object', ['exports', 'ember', 'ember-local-storage/mixins/object'], function (exports, _ember, _emberLocalStorageMixinsObject) {\n 'use strict';\n\n exports['default'] = _ember['default'].ObjectProxy.extend(_emberLocalStorageMixinsObject['default'], {\n _storageType: 'session'\n });\n});","define('ember-modal-dialog/components/modal-dialog-overlay', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports['default'] = _ember['default'].Component.extend({\n attributeBindings: ['data-ember-modal-dialog-overlay'],\n 'data-ember-modal-dialog-overlay': true,\n\n // trigger only when clicking the overlay itself, not its children\n click: function click(event) {\n if (event.target === this.get('element')) {\n this.sendAction();\n }\n }\n });\n});","define('ember-modal-dialog/components/modal-dialog', ['exports', 'ember', 'ember-modal-dialog/templates/components/modal-dialog'], function (exports, _ember, _emberModalDialogTemplatesComponentsModalDialog) {\n 'use strict';\n\n var dasherize = _ember['default'].String.dasherize;\n var $ = _ember['default'].$;\n var computed = _ember['default'].computed;\n var inject = _ember['default'].inject;\n var oneWay = computed.oneWay;\n\n var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);\n var computedJoin = function computedJoin(prop) {\n return computed(prop, function () {\n return this.get(prop).join(' ');\n });\n };\n\n exports['default'] = _ember['default'].Component.extend({\n tagName: '',\n layout: _emberModalDialogTemplatesComponentsModalDialog['default'],\n modalService: inject.service('modal-dialog'),\n destinationElementId: oneWay('modalService.destinationElementId'),\n\n // container-class - set this from templates\n containerClassNames: ['ember-modal-dialog'], // set this in a subclass definition\n containerClassNamesString: computedJoin('containerClassNames'),\n\n // 'overlay-class - set this from templates\n overlayClassNames: ['ember-modal-overlay'], // set this in a subclass definition\n overlayClassNamesString: computedJoin('overlayClassNames'),\n\n // 'wrapper-class - set this from templates\n wrapperClassNames: ['ember-modal-wrapper'], // set this in a subclass definition\n wrapperClassNamesString: computedJoin('wrapperClassNames'),\n\n concatenatedProperties: ['containerClassNames', 'overlayClassNames', 'wrapperClassNames'],\n\n targetAttachmentClass: computed('targetAttachment', function () {\n var targetAttachment = this.get('targetAttachment') || '';\n // Convert tether-styled values like 'middle right' to 'right'\n targetAttachment = targetAttachment.split(' ').slice(-1)[0];\n return 'ember-modal-dialog-target-attachment-' + dasherize(targetAttachment);\n }),\n\n target: 'body', // element, css selector, or view instance\n targetAttachment: 'middle center',\n\n translucentOverlay: false,\n clickOutsideToClose: false,\n renderInPlace: false,\n\n makeOverlayClickableOnIOS: _ember['default'].on('didInsertElement', function () {\n if (isIOS) {\n _ember['default'].$('div[data-ember-modal-dialog-overlay]').css('cursor', 'pointer');\n }\n }),\n\n didInsertElement: function didInsertElement() {\n var _this = this;\n\n if (!this.get('clickOutsideToClose')) {\n return;\n }\n\n var handleClick = function handleClick(event) {\n if (!$(event.target).closest('.ember-modal-dialog').length) {\n _this.send('close');\n }\n };\n var registerClick = function registerClick() {\n return $(document).on('click.ember-modal-dialog', handleClick);\n };\n\n // setTimeout needed or else the click handler will catch the click that spawned this modal dialog\n setTimeout(registerClick);\n this._super.apply(this, arguments);\n },\n willDestroyElement: function willDestroyElement() {\n $(document).off('click.ember-modal-dialog');\n this._super.apply(this, arguments);\n },\n\n actions: {\n close: function close() {\n this.sendAction('close');\n }\n }\n });\n});","define('ember-modal-dialog/components/positioned-container', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n var computed = _ember['default'].computed;\n var observer = _ember['default'].observer;\n var on = _ember['default'].on;\n var capitalize = _ember['default'].String.capitalize;\n\n var SUPPORTED_TARGET_ATTACHMENTS = ['top', 'right', 'bottom', 'left', 'center', 'none'];\n\n exports['default'] = _ember['default'].Component.extend({\n\n // target - element selector, element, or Ember View\n // targetAttachment - top, right, bottom, left, center, or none\n // left, right, top, bottom (relative to target)\n // center (relative to container)\n targetAttachment: 'center',\n\n isPositioned: computed('targetAttachment', 'target', 'renderInPlace', function () {\n if (this.get('renderInPlace')) {\n return false;\n }\n if (this.get('target') && this.get('targetAttachment')) {\n return true;\n }\n var targetAttachment = this.get('targetAttachment');\n return targetAttachment === 'center' || targetAttachment === 'middle center';\n }),\n\n didGetPositioned: observer('isPositioned', on('didInsertElement', function () {\n if (this._state !== 'inDOM') {\n return;\n }\n\n if (this.get('isPositioned')) {\n this.updateTargetAttachment();\n } else {\n this.$().css('left', '').css('top', '');\n }\n })),\n\n getWrappedTargetAttachmentElement: function getWrappedTargetAttachmentElement() {\n var target = this.get('target');\n if (!target) {\n return null;\n }\n\n if (_ember['default'].typeOf(target) === 'string') {\n var targetSelector = target;\n var wrappedElement = _ember['default'].$(targetSelector).eq(0);\n _ember['default'].assert('No element found for modal-dialog\\'s target selector \\'' + targetSelector + '\\'.', wrappedElement);\n return wrappedElement;\n }\n\n // passed an ember view or component\n if (target.element) {\n return _ember['default'].$(target.element);\n }\n\n // passed an element directly\n return _ember['default'].$(target);\n },\n\n updateTargetAttachment: function updateTargetAttachment() {\n var targetAttachment = this.get('targetAttachment');\n // Convert tether-styled values like 'middle right' to 'right'\n targetAttachment = targetAttachment.split(' ').slice(-1)[0];\n _ember['default'].assert('Positioned container supports targetAttachments of ' + SUPPORTED_TARGET_ATTACHMENTS.join(', '), SUPPORTED_TARGET_ATTACHMENTS.indexOf(targetAttachment) > -1);\n var targetAttachmentMethod = 'align' + capitalize(targetAttachment);\n var targetAttachmentElement = this.getWrappedTargetAttachmentElement();\n\n this[targetAttachmentMethod](targetAttachmentElement);\n },\n\n alignCenter: function alignCenter() {\n var elementWidth = this.$().outerWidth();\n var elementHeight = this.$().outerHeight();\n\n this.$().css('left', '50%').css('top', '50%').css('margin-left', elementWidth * -0.5).css('margin-top', elementHeight * -0.5);\n },\n\n alignLeft: function alignLeft(targetAttachmentElement) {\n _ember['default'].assert('Left targetAttachment requires a target', targetAttachmentElement.length > 0);\n\n var elementWidth = this.$().outerWidth();\n var originOffset = targetAttachmentElement.offset();\n var originOffsetTop = originOffset.top - _ember['default'].$(window).scrollTop();\n\n this.$().css('left', originOffset.left - elementWidth).css('top', originOffsetTop);\n },\n\n alignRight: function alignRight(targetAttachmentElement) {\n _ember['default'].assert('Right targetAttachment requires a target', targetAttachmentElement.length > 0);\n\n var targetWidth = targetAttachmentElement.outerWidth();\n var originOffset = targetAttachmentElement.offset();\n var originOffsetTop = originOffset.top - _ember['default'].$(window).scrollTop();\n\n this.$().css('left', originOffset.left + targetWidth).css('top', originOffsetTop);\n },\n\n alignTop: function alignTop(targetAttachmentElement) {\n _ember['default'].assert('Top targetAttachment requires a target', targetAttachmentElement.length > 0);\n\n var elementWidth = this.$().outerWidth();\n var elementHeight = this.$().outerHeight();\n var originOffset = targetAttachmentElement.offset();\n var originOffsetTop = originOffset.top - _ember['default'].$(window).scrollTop();\n var targetWidth = targetAttachmentElement.outerWidth();\n\n this.$().css('left', originOffset.left + targetWidth / 2 - elementWidth / 2).css('top', originOffsetTop - elementHeight);\n },\n\n alignBottom: function alignBottom(targetAttachmentElement) {\n _ember['default'].assert('Bottom targetAttachment requires a target', targetAttachmentElement.length > 0);\n\n var elementWidth = this.$().outerWidth();\n var originOffset = targetAttachmentElement.offset();\n var originOffsetTop = originOffset.top - _ember['default'].$(window).scrollTop();\n var targetWidth = targetAttachmentElement.outerWidth();\n var targetHeight = targetAttachmentElement.outerHeight();\n\n this.$().css('left', originOffset.left + targetWidth / 2 - elementWidth / 2).css('top', originOffsetTop + targetHeight);\n },\n\n alignNone: function alignNone() {}\n });\n});","define('ember-modal-dialog/components/tether-dialog', ['exports', 'ember', 'ember-modal-dialog/components/modal-dialog', 'ember-modal-dialog/templates/components/tether-dialog'], function (exports, _ember, _emberModalDialogComponentsModalDialog, _emberModalDialogTemplatesComponentsTetherDialog) {\n 'use strict';\n\n var dasherize = _ember['default'].String.dasherize;\n var computed = _ember['default'].computed;\n var get = _ember['default'].get;\n\n var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);\n\n exports['default'] = _emberModalDialogComponentsModalDialog['default'].extend({\n layout: _emberModalDialogTemplatesComponentsTetherDialog['default'],\n\n targetAttachmentClass: computed('targetAttachment', function () {\n var targetAttachment = this.get('targetAttachment') || '';\n return 'ember-modal-dialog-target-attachment-' + dasherize(targetAttachment);\n }),\n\n targetAttachment: 'middle center',\n attachment: 'middle center',\n hasOverlay: true,\n target: 'viewport', // element, css selector, view instance, 'viewport', or 'scroll-handle'\n\n tetherClassPrefix: 'ember-tether',\n // offset - passed in\n // targetOffset - passed in\n // targetModifier - passed in\n\n makeOverlayClickableOnIOS: _ember['default'].on('didInsertElement', function () {\n if (isIOS && get(this, 'hasOverlay')) {\n _ember['default'].$('div[data-ember-modal-dialog-overlay]').css('cursor', 'pointer');\n }\n })\n\n });\n});","define('ember-modal-dialog/initializers/add-modals-container', ['exports'], function (exports) {\n /*globals document */\n 'use strict';\n\n var hasDOM = typeof document !== 'undefined';\n\n function appendContainerElement(rootElementId, id) {\n if (!hasDOM) {\n return;\n }\n\n if (document.getElementById(id)) {\n return;\n }\n\n var rootEl = document.querySelector(rootElementId);\n var modalContainerEl = document.createElement('div');\n modalContainerEl.id = id;\n rootEl.appendChild(modalContainerEl);\n }\n\n exports['default'] = function () {\n var application = arguments[1] || arguments[0];\n var emberModalDialog = application.emberModalDialog || {};\n var modalContainerElId = emberModalDialog.modalRootElementId || 'modal-overlays';\n\n application.register('config:modals-container-id', modalContainerElId, { instantiate: false });\n\n application.inject('service:modal-dialog', 'destinationElementId', 'config:modals-container-id');\n\n appendContainerElement(application.rootElement, modalContainerElId);\n };\n});","define('ember-modal-dialog/services/modal-dialog', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports['default'] = _ember['default'].Service.extend({\n // destinationElementId - injected\n });\n});","define(\"ember-modal-dialog/templates/components/modal-dialog\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 7,\n \"column\": 6\n },\n \"end\": {\n \"line\": 12,\n \"column\": 6\n }\n },\n \"moduleName\": \"modules/ember-modal-dialog/templates/components/modal-dialog.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [11, 8], [11, 17]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 4\n },\n \"end\": {\n \"line\": 13,\n \"column\": 4\n }\n },\n \"moduleName\": \"modules/ember-modal-dialog/templates/components/modal-dialog.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"ember-modal-dialog-positioned-container\", [], [\"targetAttachment\", [\"subexpr\", \"@mut\", [[\"get\", \"targetAttachment\", [\"loc\", [null, [8, 27], [8, 43]]]]], [], []], \"target\", [\"subexpr\", \"@mut\", [[\"get\", \"target\", [\"loc\", [null, [9, 17], [9, 23]]]]], [], []], \"class\", [\"subexpr\", \"concat\", [[\"subexpr\", \"if\", [[\"get\", \"containerClassNamesString\", []], [\"subexpr\", \"-normalize-class\", [\"containerClassNamesString\", [\"get\", \"containerClassNamesString\", []]], [], []]], [], []], \" \", [\"subexpr\", \"if\", [[\"get\", \"targetAttachmentClass\", []], [\"subexpr\", \"-normalize-class\", [\"targetAttachmentClass\", [\"get\", \"targetAttachmentClass\", []]], [], []]], [], []], \" \", [\"subexpr\", \"if\", [[\"get\", \"container-class\", []], [\"subexpr\", \"-normalize-class\", [\"container-class\", [\"get\", \"container-class\", []]], [], []]], [], []], \" \"], [], []]], 0, null, [\"loc\", [null, [7, 6], [12, 50]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"triple-curlies\"\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 15,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-modal-dialog/templates/components/modal-dialog.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(2);\n morphs[0] = dom.createAttrMorph(element0, 'class');\n morphs[1] = dom.createMorphAt(element0, 1, 1);\n return morphs;\n },\n statements: [[\"attribute\", \"class\", [\"concat\", [[\"get\", \"wrapperClassNamesString\", [\"loc\", [null, [2, 16], [2, 39]]]], \" \", [\"get\", \"wrapper-class\", [\"loc\", [null, [2, 44], [2, 57]]]]]]], [\"block\", \"modal-dialog-overlay\", [], [\"action\", \"close\", \"class\", [\"subexpr\", \"concat\", [[\"subexpr\", \"if\", [[\"get\", \"overlayClassNamesString\", []], [\"subexpr\", \"-normalize-class\", [\"overlayClassNamesString\", [\"get\", \"overlayClassNamesString\", []]], [], []]], [], []], \" \", [\"subexpr\", \"if\", [[\"get\", \"translucentOverlay\", []], \"translucent\"], [], []], \" \", [\"subexpr\", \"if\", [[\"get\", \"overlay-class\", []], [\"subexpr\", \"-normalize-class\", [\"overlay-class\", [\"get\", \"overlay-class\", []]], [], []]], [], []], \" \"], [], []]], 0, null, [\"loc\", [null, [3, 4], [13, 29]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 16,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-modal-dialog/templates/components/modal-dialog.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"ember-wormhole\", [], [\"to\", [\"subexpr\", \"@mut\", [[\"get\", \"destinationElementId\", [\"loc\", [null, [1, 21], [1, 41]]]]], [], []], \"renderInPlace\", [\"subexpr\", \"@mut\", [[\"get\", \"renderInPlace\", [\"loc\", [null, [1, 56], [1, 69]]]]], [], []]], 0, null, [\"loc\", [null, [1, 0], [15, 19]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-modal-dialog/templates/components/tether-dialog\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 7,\n \"column\": 2\n }\n },\n \"moduleName\": \"modules/ember-modal-dialog/templates/components/tether-dialog.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"modal-dialog-overlay\", [], [\"action\", \"close\", \"class\", [\"subexpr\", \"concat\", [[\"subexpr\", \"if\", [[\"get\", \"overlayClassNamesString\", []], [\"subexpr\", \"-normalize-class\", [\"overlayClassNamesString\", [\"get\", \"overlayClassNamesString\", []]], [], []]], [], []], \" \", [\"subexpr\", \"if\", [[\"get\", \"translucentOverlay\", []], \"translucent\"], [], []], \" \", [\"subexpr\", \"if\", [[\"get\", \"overlay-class\", []], [\"subexpr\", \"-normalize-class\", [\"overlay-class\", [\"get\", \"overlay-class\", []]], [], []]], [], []], \" \"], [], []]], [\"loc\", [null, [3, 4], [6, 6]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 8,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-modal-dialog/templates/components/tether-dialog.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"hasOverlay\", [\"loc\", [null, [2, 8], [2, 18]]]]], [], 0, null, [\"loc\", [null, [2, 2], [7, 9]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 10,\n \"column\": 2\n },\n \"end\": {\n \"line\": 16,\n \"column\": 2\n }\n },\n \"moduleName\": \"modules/ember-modal-dialog/templates/components/tether-dialog.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [15, 4], [15, 13]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 9,\n \"column\": 0\n },\n \"end\": {\n \"line\": 17,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-modal-dialog/templates/components/tether-dialog.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"ember-modal-dialog-positioned-container\", [], [\"targetAttachment\", [\"subexpr\", \"@mut\", [[\"get\", \"targetAttachment\", [\"loc\", [null, [11, 23], [11, 39]]]]], [], []], \"target\", [\"subexpr\", \"@mut\", [[\"get\", \"target\", [\"loc\", [null, [12, 13], [12, 19]]]]], [], []], \"renderInPlace\", [\"subexpr\", \"@mut\", [[\"get\", \"renderInPlace\", [\"loc\", [null, [13, 20], [13, 33]]]]], [], []], \"class\", [\"subexpr\", \"concat\", [[\"subexpr\", \"if\", [[\"get\", \"containerClassNamesString\", []], [\"subexpr\", \"-normalize-class\", [\"containerClassNamesString\", [\"get\", \"containerClassNamesString\", []]], [], []]], [], []], \" \", [\"subexpr\", \"if\", [[\"get\", \"targetAttachmentClass\", []], [\"subexpr\", \"-normalize-class\", [\"targetAttachmentClass\", [\"get\", \"targetAttachmentClass\", []]], [], []]], [], []], \" \", [\"subexpr\", \"if\", [[\"get\", \"container-class\", []], [\"subexpr\", \"-normalize-class\", [\"container-class\", [\"get\", \"container-class\", []]], [], []]], [], []], \" \"], [], []]], 0, null, [\"loc\", [null, [10, 2], [16, 46]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child2 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 18,\n \"column\": 2\n },\n \"end\": {\n \"line\": 29,\n \"column\": 2\n }\n },\n \"moduleName\": \"modules/ember-modal-dialog/templates/components/tether-dialog.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [28, 4], [28, 13]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 17,\n \"column\": 0\n },\n \"end\": {\n \"line\": 30,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-modal-dialog/templates/components/tether-dialog.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"ember-tether\", [], [\"target\", [\"subexpr\", \"@mut\", [[\"get\", \"target\", [\"loc\", [null, [19, 13], [19, 19]]]]], [], []], \"attachment\", [\"subexpr\", \"@mut\", [[\"get\", \"attachment\", [\"loc\", [null, [20, 17], [20, 27]]]]], [], []], \"targetAttachment\", [\"subexpr\", \"@mut\", [[\"get\", \"targetAttachment\", [\"loc\", [null, [21, 23], [21, 39]]]]], [], []], \"targetModifier\", [\"subexpr\", \"@mut\", [[\"get\", \"targetModifier\", [\"loc\", [null, [22, 21], [22, 35]]]]], [], []], \"classPrefix\", [\"subexpr\", \"@mut\", [[\"get\", \"tetherClassPrefix\", [\"loc\", [null, [23, 18], [23, 35]]]]], [], []], \"offset\", [\"subexpr\", \"@mut\", [[\"get\", \"offset\", [\"loc\", [null, [24, 13], [24, 19]]]]], [], []], \"targetOffset\", [\"subexpr\", \"@mut\", [[\"get\", \"targetOffset\", [\"loc\", [null, [25, 19], [25, 31]]]]], [], []], \"constraints\", [\"subexpr\", \"@mut\", [[\"get\", \"constraints\", [\"loc\", [null, [26, 18], [26, 29]]]]], [], []], \"class\", [\"subexpr\", \"concat\", [[\"subexpr\", \"if\", [[\"get\", \"containerClassNamesString\", []], [\"subexpr\", \"-normalize-class\", [\"containerClassNamesString\", [\"get\", \"containerClassNamesString\", []]], [], []]], [], []], \" \", [\"subexpr\", \"if\", [[\"get\", \"container-class\", []], [\"subexpr\", \"-normalize-class\", [\"container-class\", [\"get\", \"container-class\", []]], [], []]], [], []], \" \"], [], []]], 0, null, [\"loc\", [null, [18, 2], [29, 19]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 31,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-modal-dialog/templates/components/tether-dialog.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"ember-wormhole\", [], [\"to\", [\"subexpr\", \"@mut\", [[\"get\", \"destinationElementId\", [\"loc\", [null, [1, 21], [1, 41]]]]], [], []], \"renderInPlace\", [\"subexpr\", \"@mut\", [[\"get\", \"renderInPlace\", [\"loc\", [null, [1, 56], [1, 69]]]]], [], []]], 0, null, [\"loc\", [null, [1, 0], [8, 19]]]], [\"block\", \"if\", [[\"get\", \"renderInPlace\", [\"loc\", [null, [9, 6], [9, 19]]]]], [], 1, 2, [\"loc\", [null, [9, 0], [30, 7]]]]],\n locals: [],\n templates: [child0, child1, child2]\n };\n })());\n});","define('ember-power-select/components/power-select', ['exports', 'ember', 'ember-power-select/templates/components/power-select', 'ember-power-select/utils/group-utils'], function (exports, _ember, _emberPowerSelectTemplatesComponentsPowerSelect, _emberPowerSelectUtilsGroupUtils) {\n 'use strict';\n\n var computed = _ember['default'].computed;\n\n function fallbackIfUndefined(fallback) {\n return computed({\n get: function get() {\n return fallback;\n },\n set: function set(_, v) {\n return v === undefined ? fallback : v;\n }\n });\n }\n\n exports['default'] = _ember['default'].Component.extend({\n layout: _emberPowerSelectTemplatesComponentsPowerSelect['default'],\n\n // Universal config\n tagName: fallbackIfUndefined(''),\n disabled: fallbackIfUndefined(false),\n placeholder: fallbackIfUndefined(null),\n loadingMessage: fallbackIfUndefined('Loading options...'),\n noMatchesMessage: fallbackIfUndefined('No results found'),\n optionsComponent: fallbackIfUndefined('power-select/options'),\n afterOptionsComponent: fallbackIfUndefined(null),\n dropdownPosition: fallbackIfUndefined('auto'),\n matcher: fallbackIfUndefined(_emberPowerSelectUtilsGroupUtils.defaultMatcher),\n searchField: fallbackIfUndefined(null),\n search: fallbackIfUndefined(null),\n closeOnSelect: fallbackIfUndefined(true),\n dropdownClass: fallbackIfUndefined(null),\n triggerClass: fallbackIfUndefined(null),\n dir: fallbackIfUndefined(null),\n opened: fallbackIfUndefined(false),\n\n // Select single config\n searchEnabled: fallbackIfUndefined(true),\n searchMessage: fallbackIfUndefined(\"Type to search\"),\n searchPlaceholder: fallbackIfUndefined(null),\n allowClear: fallbackIfUndefined(false),\n\n // Lifecycle hooks\n didInitAttrs: function didInitAttrs() {\n this._super.apply(this, arguments);\n _ember['default'].assert('{{power-select}} requires an `onchange` function', this.get('onchange') && typeof this.get('onchange') === 'function');\n },\n\n // CPs\n concreteComponentName: _ember['default'].computed('multiple', function () {\n return 'power-select/' + (this.get('multiple') ? 'multiple' : 'single');\n }),\n\n selectedComponentOrDefault: _ember['default'].computed('multiple', 'selectedComponent', function () {\n var givenComponent = this.get('selectedComponent');\n if (givenComponent) {\n return givenComponent;\n }\n return 'power-select/' + (this.get('multiple') ? 'multiple' : 'single') + '/selected';\n }),\n\n beforeOptionsComponentOrDefault: _ember['default'].computed('multiple', 'beforeOptionsComponent', function () {\n var givenComponent = this.get('beforeOptionsComponent');\n if (givenComponent) {\n return givenComponent;\n }\n return this.get('multiple') ? null : 'power-select/before-options';\n })\n });\n});","define('ember-power-select/components/power-select/base', ['exports', 'ember', 'ember-power-select/utils/group-utils'], function (exports, _ember, _emberPowerSelectUtilsGroupUtils) {\n 'use strict';\n\n var RSVP = _ember['default'].RSVP;\n var computed = _ember['default'].computed;\n var run = _ember['default'].run;\n var get = _ember['default'].get;\n var isBlank = _ember['default'].isBlank;\n\n var Promise = RSVP.Promise;\n var PromiseArray = _ember['default'].ArrayProxy.extend(_ember['default'].PromiseProxyMixin);\n\n exports['default'] = _ember['default'].Component.extend({\n tagName: '',\n searchText: '',\n searchReturnedUndefined: false,\n activeSearch: null,\n attributeBindings: ['dir'],\n\n init: function init() {\n this._super.apply(this, arguments);\n var randomUUID = Math.random().toString().slice(-10);\n this.triggerUniqueClass = 'ember-power-select-trigger-' + randomUUID;\n this.dropdownUniqueClass = 'ember-power-select-dropdown-' + randomUUID;\n },\n\n // CPs\n concatenatedTriggerClasses: computed('class', function () {\n var classes = ['ember-power-select-trigger', this.triggerUniqueClass];\n if (this.get('triggerClass')) {\n classes.push(this.get('triggerClass'));\n }\n if (this.get('class')) {\n classes.push(this.get('class') + '-trigger');\n }\n return classes.join(' ');\n }),\n\n concatenatedDropdownClasses: computed('class', function () {\n var classes = ['ember-power-select-dropdown', this.dropdownUniqueClass];\n if (this.get('dropdownClass')) {\n classes.push(this.get('dropdownClass'));\n }\n if (this.get('class')) {\n classes.push(this.get('class') + '-dropdown');\n }\n return classes.join(' ');\n }),\n\n mustShowSearchMessage: computed('searchText', 'search', 'searchMessage', 'results.length', function () {\n return this.get('searchText.length') === 0 && !!this.get('search') && !!this.get('searchMessage') && this.get('results.length') === 0;\n }),\n\n mustShowNoMessages: computed('results.{isFulfilled,length}', function () {\n return this.get('results.isFulfilled') && this.get('results.length') === 0;\n }),\n\n results: computed('options.[]', 'searchText', function () {\n var _this = this;\n\n var _getProperties = this.getProperties('options', 'searchText', 'previousResults');\n\n var options = _getProperties.options;\n var searchText = _getProperties.searchText;\n var _getProperties$previousResults = _getProperties.previousResults;\n var previousResults = _getProperties$previousResults === undefined ? _ember['default'].A() : _getProperties$previousResults;\n // jshint ignore:line\n var promise = undefined;\n if (isBlank(searchText) || this.searchReturnedUndefined) {\n promise = Promise.resolve(options).then(function (opts) {\n return _ember['default'].A(opts);\n });\n } else if (this.get('search')) {\n var result = this.get('search')(searchText);\n if (!result) {\n promise = Promise.resolve(previousResults);\n this.searchReturnedUndefined = true;\n } else {\n (function () {\n _this.searchReturnedUndefined = false;\n var search = _this.activeSearch = Promise.resolve(result);\n promise = search.then(function (opts) {\n return search !== _this.activeSearch ? previousResults : _ember['default'].A(opts);\n });\n })();\n }\n } else {\n promise = Promise.resolve(options).then(function (opts) {\n return _this.filter(_ember['default'].A(opts), _this.get('searchText'));\n });\n }\n promise.then(function (opts) {\n return _this.setProperties({ currentlyHighlighted: undefined, previousResults: opts });\n });\n return PromiseArray.create({ promise: promise, content: previousResults });\n }),\n\n highlighted: computed('results.[]', 'currentlyHighlighted', 'selected', function () {\n return this.get('currentlyHighlighted') || this.defaultHighlighted();\n }),\n\n resultsLength: computed('results.[]', function () {\n return (0, _emberPowerSelectUtilsGroupUtils.countOptions)(this.get('results'));\n }),\n\n // Actions\n actions: {\n open: function open(dropdown, e) {\n dropdown.actions.open(e);\n },\n\n close: function close(dropdown, e) {\n dropdown.actions.close(e);\n },\n\n highlight: function highlight(dropdown, option) {\n this._doHighlight(option);\n },\n\n search: function search(dropdown, term /*, e */) {\n this._doSearch(term);\n },\n\n removeOption: function removeOption(dropdown, option, e) {\n e.stopPropagation();\n this.removeOption(dropdown, option, e);\n },\n\n handleKeydown: function handleKeydown(dropdown, e) {\n if (e.defaultPrevented) {\n return;\n }\n if (e.keyCode === 38 || e.keyCode === 40) {\n // Up & Down\n if (dropdown.isOpen) {\n this.handleVerticalArrowKey(e);\n } else {\n dropdown.actions.open(e);\n }\n } else if (e.keyCode === 9) {\n // Tab\n dropdown.actions.close(e);\n } else if (e.keyCode === 27) {\n // ESC\n dropdown.actions.close(e);\n }\n },\n\n // It is not evident what is going on here, so I'll explain why.\n //\n // As of this writting, Ember doesn allow to yield data to the \"inverse\" block.\n // Because of that, elements of this component rendered in the trigger can't receive the\n // yielded object contaning the public API of the ember-basic-dropdown, with actions for open,\n // close and toggle.\n //\n // The only possible workaround for this is to on initialization inject a similar object\n // to the one yielded and store it to make it available in the entire component.\n //\n // This this limitation on ember should be fixed soon, this is temporary. Because of that this\n // object will be passed to the action from the inverse block like if it was yielded.\n //\n registerDropdown: function registerDropdown(dropdown) {\n this.set('registeredDropdown', dropdown);\n }\n },\n\n // Methods\n\n handleOpen: function handleOpen(dropdown, e) {\n var action = this.get('onopen');\n if (action) {\n action(this.buildPublicAPI(dropdown), e);\n }\n run.scheduleOnce('afterRender', this, this.focusSearch, e);\n run.scheduleOnce('afterRender', this, this.scrollIfHighlightedIsOutOfViewport);\n },\n\n handleClose: function handleClose(dropdown, e) {\n var action = this.get('onclose');\n if (action) {\n action(this.buildPublicAPI(dropdown), e);\n }\n this._doSearch('');\n this._doHighlight(null);\n },\n\n handleVerticalArrowKey: function handleVerticalArrowKey(e) {\n e.preventDefault();\n var newHighlighted = this.advanceSelectableOption(this.get('highlighted'), e.keyCode === 40 ? 1 : -1);\n this._doHighlight(newHighlighted);\n run.scheduleOnce('afterRender', this, this.scrollIfHighlightedIsOutOfViewport);\n },\n\n scrollIfHighlightedIsOutOfViewport: function scrollIfHighlightedIsOutOfViewport() {\n var optionsList = document.querySelector('.ember-power-select-options');\n if (!optionsList) {\n return;\n }\n var highlightedOption = optionsList.querySelector('.ember-power-select-option--highlighted');\n if (!highlightedOption) {\n return;\n }\n var optionTopScroll = highlightedOption.offsetTop - optionsList.offsetTop;\n var optionBottomScroll = optionTopScroll + highlightedOption.offsetHeight;\n if (optionBottomScroll > optionsList.offsetHeight + optionsList.scrollTop) {\n optionsList.scrollTop = optionBottomScroll - optionsList.offsetHeight;\n } else if (optionTopScroll < optionsList.scrollTop) {\n optionsList.scrollTop = optionTopScroll;\n }\n },\n\n indexOfOption: function indexOfOption(option) {\n return (0, _emberPowerSelectUtilsGroupUtils.indexOfOption)(this.get('results'), option);\n },\n\n optionAtIndex: function optionAtIndex(index) {\n return (0, _emberPowerSelectUtilsGroupUtils.optionAtIndex)(this.get('results'), index);\n },\n\n advanceSelectableOption: function advanceSelectableOption(activeHighlighted, step) {\n var resultsLength = this.get('resultsLength');\n var startIndex = Math.min(Math.max(this.indexOfOption(activeHighlighted) + step, 0), resultsLength - 1);\n var nextOption = this.optionAtIndex(startIndex);\n while (nextOption && get(nextOption, 'disabled')) {\n nextOption = this.optionAtIndex(startIndex += step);\n }\n return nextOption;\n },\n\n filter: function filter(options, searchText) {\n var _this2 = this;\n\n var matcher = undefined;\n if (this.get('searchField')) {\n matcher = function (option, text) {\n return _this2.matcher(get(option, _this2.get('searchField')), text);\n };\n } else {\n matcher = function (option, text) {\n return _this2.matcher(option, text);\n };\n }\n return (0, _emberPowerSelectUtilsGroupUtils.filterOptions)(options || [], searchText, matcher);\n },\n\n _doSearch: function _doSearch(term) {\n this.set('searchText', term);\n },\n\n _doHighlight: function _doHighlight(option) {\n if (option && get(option, 'disabled')) {\n return;\n }\n this.set('currentlyHighlighted', option);\n },\n\n buildPublicAPI: function buildPublicAPI(dropdown) {\n var ownActions = { search: this._doSearch.bind(this), highlight: this._doHighlight.bind(this) };\n return {\n isOpen: dropdown.isOpen,\n actions: _ember['default'].merge(ownActions, dropdown.actions)\n };\n }\n });\n});","define('ember-power-select/components/power-select/before-options', ['exports', 'ember', 'ember-power-select/templates/components/power-select/before-options'], function (exports, _ember, _emberPowerSelectTemplatesComponentsPowerSelectBeforeOptions) {\n 'use strict';\n\n exports['default'] = _ember['default'].Component.extend({\n tagName: '',\n layout: _emberPowerSelectTemplatesComponentsPowerSelectBeforeOptions['default']\n });\n});","define('ember-power-select/components/power-select/multiple', ['exports', 'ember', 'ember-power-select/components/power-select/base', 'ember-power-select/templates/components/power-select/main'], function (exports, _ember, _emberPowerSelectComponentsPowerSelectBase, _emberPowerSelectTemplatesComponentsPowerSelectMain) {\n 'use strict';\n\n var computed = _ember['default'].computed;\n var get = _ember['default'].get;\n\n exports['default'] = _emberPowerSelectComponentsPowerSelectBase['default'].extend({\n layout: _emberPowerSelectTemplatesComponentsPowerSelectMain['default'],\n\n // CPs\n selection: computed('selected', {\n get: function get() {\n return _ember['default'].A(this.get('selected'));\n },\n set: function set(_, v) {\n return v;\n }\n }),\n\n concatenatedClasses: computed('class', function () {\n var classes = ['ember-power-select', 'multiple'];\n if (this.get('class')) {\n classes.push(this.get('class'));\n }\n return classes.join(' ');\n }),\n\n // Actions\n actions: {\n select: function select(dropdown, option, e) {\n e.preventDefault();\n e.stopPropagation();\n var newSelection = this.cloneSelection();\n if (newSelection.indexOf(option) > -1) {\n newSelection.removeObject(option);\n } else {\n newSelection.addObject(option);\n }\n if (this.get('closeOnSelect')) {\n dropdown.actions.close(e);\n }\n this.get('onchange')(newSelection, this.buildPublicAPI(dropdown));\n },\n\n handleKeydown: function handleKeydown(dropdown, e) {\n var onkeydown = this.get('onkeydown');\n if (onkeydown) {\n onkeydown(this.buildPublicAPI(dropdown), e);\n }\n if (e.defaultPrevented) {\n return;\n }\n if (e.keyCode === 8) {\n // BACKSPACE\n this.removeLastOptionIfSearchIsEmpty(dropdown, e);\n dropdown.actions.open(e);\n } else if (e.keyCode === 13) {\n e.stopPropagation();\n if (dropdown.isOpen) {\n var highlighted = this.get('highlighted');\n if (highlighted && (this.get('selected') || []).indexOf(highlighted) === -1) {\n this.send('select', dropdown, highlighted, e);\n } else {\n dropdown.actions.close(e);\n }\n } else {\n dropdown.actions.open(e);\n }\n } else {\n this._super.apply(this, arguments);\n }\n },\n\n handleFocus: function handleFocus(dropdown, evt) {\n var action = this.get('onfocus');\n if (action) {\n action(this.buildPublicAPI(dropdown), evt);\n }\n this.focusSearch();\n }\n },\n\n // Methods\n defaultHighlighted: function defaultHighlighted() {\n return this.optionAtIndex(0);\n },\n\n removeLastOptionIfSearchIsEmpty: function removeLastOptionIfSearchIsEmpty(dropdown, e) {\n if (this.get('searchText.length') !== 0) {\n return;\n }\n var lastSelection = this.get('selection.lastObject');\n if (!lastSelection) {\n return;\n }\n var lastText = typeof lastSelection === 'string' ? lastSelection : get(lastSelection, this.get('searchField'));\n this.removeOption(dropdown, lastSelection, e);\n this.set('searchText', lastText);\n },\n\n removeOption: function removeOption(dropdown, option, e) {\n var newSelection = this.cloneSelection();\n newSelection.removeObject(option);\n this.get('onchange')(newSelection, this.buildPublicAPI(dropdown), e);\n },\n\n focusSearch: function focusSearch() {\n var el = _ember['default'].$('.' + this.get('triggerUniqueClass'))[0];\n if (el) {\n el.querySelector('.ember-power-select-trigger-multiple-input').focus();\n }\n },\n\n cloneSelection: function cloneSelection() {\n return _ember['default'].A((this.get('selection') || []).slice(0));\n }\n });\n});","define('ember-power-select/components/power-select/multiple/selected', ['exports', 'ember', 'ember-power-select/templates/components/power-select/multiple/selected'], function (exports, _ember, _emberPowerSelectTemplatesComponentsPowerSelectMultipleSelected) {\n 'use strict';\n\n var computed = _ember['default'].computed;\n var htmlSafe = _ember['default'].String.htmlSafe;\n\n exports['default'] = _ember['default'].Component.extend({\n layout: _emberPowerSelectTemplatesComponentsPowerSelectMultipleSelected['default'],\n tagName: '',\n\n // CPs\n triggerMultipleInputStyle: computed('searchText.length', 'selection.length', function () {\n if (this.get('selection.length') === 0) {\n return htmlSafe('width: 100%;');\n } else {\n return htmlSafe('width: ' + ((this.get('searchText.length') || 0) * 0.5 + 2) + 'em');\n }\n }),\n\n maybePlaceholder: computed('placeholder', 'selection.length', function () {\n return this.get('selection.length') === 0 ? this.get('placeholder') || '' : '';\n }),\n\n actions: {\n search: function search(term, e) {\n var _get = this.get('select.actions');\n\n var search = _get.search;\n var open = _get.open;\n\n search(term, e);\n open(e);\n }\n }\n });\n});","define('ember-power-select/components/power-select/options', ['exports', 'ember', 'ember-power-select/templates/components/power-select/options'], function (exports, _ember, _emberPowerSelectTemplatesComponentsPowerSelectOptions) {\n 'use strict';\n\n // TODO: Do I really need a component? A recursive template would do ...\n exports['default'] = _ember['default'].Component.extend({\n layout: _emberPowerSelectTemplatesComponentsPowerSelectOptions['default'],\n tagName: 'ul',\n attributeBindings: ['role'],\n role: 'listbox'\n });\n});","define('ember-power-select/components/power-select/single', ['exports', 'ember', 'ember-power-select/components/power-select/base', 'ember-power-select/templates/components/power-select/main'], function (exports, _ember, _emberPowerSelectComponentsPowerSelectBase, _emberPowerSelectTemplatesComponentsPowerSelectMain) {\n 'use strict';\n\n var computed = _ember['default'].computed;\n\n exports['default'] = _emberPowerSelectComponentsPowerSelectBase['default'].extend({\n layout: _emberPowerSelectTemplatesComponentsPowerSelectMain['default'],\n\n // CPs\n selection: computed('selected', {\n get: function get() {\n return this.get('selected');\n },\n set: function set(_, v) {\n return v;\n }\n }),\n\n concatenatedClasses: computed('class', function () {\n var classes = ['ember-power-select'];\n if (this.get('class')) {\n classes.push(this.get('class'));\n }\n return classes.join(' ');\n }),\n\n // Actions\n actions: {\n select: function select(dropdown, option, e) {\n e.preventDefault();\n e.stopPropagation();\n if (this.get('closeOnSelect')) {\n dropdown.actions.close(e);\n }\n if (this.get('selection') !== option) {\n this.get('onchange')(option, this.buildPublicAPI(dropdown));\n }\n },\n\n handleKeydown: function handleKeydown(dropdown, e) {\n var onkeydown = this.get('onkeydown');\n if (onkeydown) {\n onkeydown(this.buildPublicAPI(dropdown), e);\n }\n if (e.defaultPrevented) {\n return;\n }\n if (e.keyCode === 13 && dropdown.isOpen) {\n // Enter\n this.send('select', dropdown, this.get('highlighted'), e);\n } else {\n this._super.apply(this, arguments);\n }\n },\n\n handleFocus: function handleFocus(dropdown, event) {\n var action = this.get('onfocus');\n if (action) {\n action(this.buildPublicAPI(dropdown), event);\n }\n }\n },\n\n // Methods\n removeOption: function removeOption(dropdown, option, e) {\n this.get('onchange')(null, this.buildPublicAPI(dropdown), e);\n },\n\n defaultHighlighted: function defaultHighlighted() {\n var selection = this.get('selection');\n\n if (!selection || this.indexOfOption(selection) === -1) {\n return this.optionAtIndex(0);\n }\n\n return selection;\n },\n\n focusSearch: function focusSearch() {\n _ember['default'].$('.ember-power-select-search input').focus();\n }\n });\n});","define('ember-power-select/components/power-select/single/selected', ['exports', 'ember', 'ember-power-select/templates/components/power-select/single/selected'], function (exports, _ember, _emberPowerSelectTemplatesComponentsPowerSelectSingleSelected) {\n 'use strict';\n\n exports['default'] = _ember['default'].Component.extend({\n layout: _emberPowerSelectTemplatesComponentsPowerSelectSingleSelected['default'],\n tagName: ''\n });\n});","define('ember-power-select/helpers/ember-power-select-option-classes', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n var _slicedToArray = (function () {\n function sliceIterator(arr, i) {\n var _arr = [];var _n = true;var _d = false;var _e = undefined;try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;_e = err;\n } finally {\n try {\n if (!_n && _i['return']) _i['return']();\n } finally {\n if (_d) throw _e;\n }\n }return _arr;\n }return function (arr, i) {\n if (Array.isArray(arr)) {\n return arr;\n } else if (Symbol.iterator in Object(arr)) {\n return sliceIterator(arr, i);\n } else {\n throw new TypeError('Invalid attempt to destructure non-iterable instance');\n }\n };\n })();\n\n exports.emberPowerSelectOptionClasses = emberPowerSelectOptionClasses;\n\n var isArray = _ember['default'].isArray;\n var get = _ember['default'].get;\n\n // TODO: Make it private or scoped to the component\n\n function emberPowerSelectOptionClasses(_ref /*, hash*/) {\n var _ref2 = _slicedToArray(_ref, 3);\n\n var option = _ref2[0];\n var selected = _ref2[1];\n var highlighted = _ref2[2];\n\n var classes = undefined;\n if (isArray(selected)) {\n classes = selected.indexOf(option) > -1 ? 'ember-power-select-option--selected' : '';\n } else {\n classes = option === selected ? 'ember-power-select-option--selected' : '';\n }\n if (get(option, 'disabled')) {\n classes += ' ember-power-select-option--disabled';\n }\n if (option === highlighted) {\n classes += ' ember-power-select-option--highlighted';\n }\n return classes;\n }\n\n exports['default'] = _ember['default'].Helper.helper(emberPowerSelectOptionClasses);\n});","define(\"ember-power-select/templates/components/power-select\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 37,\n \"column\": 2\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select.hbs\"\n },\n isEmpty: false,\n arity: 2,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"yield\", [[\"get\", \"option\", [\"loc\", [null, [36, 12], [36, 18]]]], [\"get\", \"term\", [\"loc\", [null, [36, 19], [36, 23]]]]], [], [\"loc\", [null, [36, 4], [36, 25]]]]],\n locals: [\"option\", \"term\"],\n templates: []\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 37,\n \"column\": 2\n },\n \"end\": {\n \"line\": 39,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"yield\", [], [\"to\", \"inverse\"], [\"loc\", [null, [38, 4], [38, 26]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 40,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"component\", [[\"get\", \"concreteComponentName\", [\"loc\", [null, [1, 13], [1, 34]]]]], [\"options\", [\"subexpr\", \"@mut\", [[\"get\", \"options\", [\"loc\", [null, [2, 12], [2, 19]]]]], [], []], \"selected\", [\"subexpr\", \"@mut\", [[\"get\", \"selected\", [\"loc\", [null, [3, 13], [3, 21]]]]], [], []], \"onchange\", [\"subexpr\", \"@mut\", [[\"get\", \"onchange\", [\"loc\", [null, [4, 13], [4, 21]]]]], [], []], \"onkeydown\", [\"subexpr\", \"@mut\", [[\"get\", \"onkeydown\", [\"loc\", [null, [5, 14], [5, 23]]]]], [], []], \"onfocus\", [\"subexpr\", \"@mut\", [[\"get\", \"onfocus\", [\"loc\", [null, [6, 12], [6, 19]]]]], [], []], \"onopen\", [\"subexpr\", \"@mut\", [[\"get\", \"onopen\", [\"loc\", [null, [7, 11], [7, 17]]]]], [], []], \"onclose\", [\"subexpr\", \"@mut\", [[\"get\", \"onclose\", [\"loc\", [null, [8, 12], [8, 19]]]]], [], []], \"disabled\", [\"subexpr\", \"@mut\", [[\"get\", \"disabled\", [\"loc\", [null, [9, 13], [9, 21]]]]], [], []], \"placeholder\", [\"subexpr\", \"@mut\", [[\"get\", \"placeholder\", [\"loc\", [null, [10, 16], [10, 27]]]]], [], []], \"searchEnabled\", [\"subexpr\", \"@mut\", [[\"get\", \"searchEnabled\", [\"loc\", [null, [11, 18], [11, 31]]]]], [], []], \"searchPlaceholder\", [\"subexpr\", \"@mut\", [[\"get\", \"searchPlaceholder\", [\"loc\", [null, [12, 22], [12, 39]]]]], [], []], \"loadingMessage\", [\"subexpr\", \"@mut\", [[\"get\", \"loadingMessage\", [\"loc\", [null, [13, 19], [13, 33]]]]], [], []], \"noMatchesMessage\", [\"subexpr\", \"@mut\", [[\"get\", \"noMatchesMessage\", [\"loc\", [null, [14, 21], [14, 37]]]]], [], []], \"searchMessage\", [\"subexpr\", \"@mut\", [[\"get\", \"searchMessage\", [\"loc\", [null, [15, 18], [15, 31]]]]], [], []], \"selectedComponent\", [\"subexpr\", \"@mut\", [[\"get\", \"selectedComponentOrDefault\", [\"loc\", [null, [16, 22], [16, 48]]]]], [], []], \"beforeOptionsComponent\", [\"subexpr\", \"@mut\", [[\"get\", \"beforeOptionsComponentOrDefault\", [\"loc\", [null, [17, 27], [17, 58]]]]], [], []], \"optionsComponent\", [\"subexpr\", \"@mut\", [[\"get\", \"optionsComponent\", [\"loc\", [null, [18, 21], [18, 37]]]]], [], []], \"afterOptionsComponent\", [\"subexpr\", \"@mut\", [[\"get\", \"afterOptionsComponent\", [\"loc\", [null, [19, 26], [19, 47]]]]], [], []], \"matcher\", [\"subexpr\", \"@mut\", [[\"get\", \"matcher\", [\"loc\", [null, [20, 12], [20, 19]]]]], [], []], \"searchField\", [\"subexpr\", \"@mut\", [[\"get\", \"searchField\", [\"loc\", [null, [21, 16], [21, 27]]]]], [], []], \"renderInPlace\", [\"subexpr\", \"@mut\", [[\"get\", \"renderInPlace\", [\"loc\", [null, [22, 18], [22, 31]]]]], [], []], \"search\", [\"subexpr\", \"@mut\", [[\"get\", \"search\", [\"loc\", [null, [23, 11], [23, 17]]]]], [], []], \"allowClear\", [\"subexpr\", \"@mut\", [[\"get\", \"allowClear\", [\"loc\", [null, [24, 15], [24, 25]]]]], [], []], \"dropdownPosition\", [\"subexpr\", \"@mut\", [[\"get\", \"dropdownPosition\", [\"loc\", [null, [25, 21], [25, 37]]]]], [], []], \"closeOnSelect\", [\"subexpr\", \"@mut\", [[\"get\", \"closeOnSelect\", [\"loc\", [null, [26, 18], [26, 31]]]]], [], []], \"opened\", [\"subexpr\", \"@mut\", [[\"get\", \"opened\", [\"loc\", [null, [27, 11], [27, 17]]]]], [], []], \"hasInverseBlock\", [\"subexpr\", \"hasBlock\", [\"inverse\"], [], [\"loc\", [null, [28, 20], [28, 40]]]], \"tabindex\", [\"subexpr\", \"@mut\", [[\"get\", \"tabindex\", [\"loc\", [null, [29, 13], [29, 21]]]]], [], []], \"dir\", [\"subexpr\", \"@mut\", [[\"get\", \"dir\", [\"loc\", [null, [30, 8], [30, 11]]]]], [], []], \"class\", [\"subexpr\", \"@mut\", [[\"get\", \"class\", [\"loc\", [null, [31, 10], [31, 15]]]]], [], []], \"triggerClass\", [\"subexpr\", \"@mut\", [[\"get\", \"triggerClass\", [\"loc\", [null, [32, 17], [32, 29]]]]], [], []], \"dropdownClass\", [\"subexpr\", \"@mut\", [[\"get\", \"dropdownClass\", [\"loc\", [null, [33, 18], [33, 31]]]]], [], []], \"extra\", [\"subexpr\", \"@mut\", [[\"get\", \"extra\", [\"loc\", [null, [34, 10], [34, 15]]]]], [], []]], 0, 1, [\"loc\", [null, [1, 0], [39, 14]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })());\n});","define(\"ember-power-select/templates/components/power-select/before-options\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"triple-curlies\"\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 7,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/before-options.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"div\");\n dom.setAttribute(el1, \"class\", \"ember-power-select-search\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"input\");\n dom.setAttribute(el2, \"type\", \"search\");\n dom.setAttribute(el2, \"autocomplete\", \"off\");\n dom.setAttribute(el2, \"autocorrect\", \"off\");\n dom.setAttribute(el2, \"autocapitalize\", \"off\");\n dom.setAttribute(el2, \"spellcheck\", \"false\");\n dom.setAttribute(el2, \"role\", \"combobox\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1, 1]);\n var morphs = new Array(3);\n morphs[0] = dom.createAttrMorph(element0, 'oninput');\n morphs[1] = dom.createAttrMorph(element0, 'onkeydown');\n morphs[2] = dom.createAttrMorph(element0, 'placeholder');\n return morphs;\n },\n statements: [[\"attribute\", \"oninput\", [\"subexpr\", \"action\", [[\"get\", \"select.actions.search\", [\"loc\", [null, [4, 56], [4, 77]]]]], [\"value\", \"target.value\"], [\"loc\", [null, [4, 47], [4, 100]]]]], [\"attribute\", \"onkeydown\", [\"get\", \"select.actions.handleKeydown\", [\"loc\", [null, [5, 16], [5, 44]]]]], [\"attribute\", \"placeholder\", [\"get\", \"searchPlaceholder\", [\"loc\", [null, [5, 61], [5, 78]]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 7,\n \"column\": 7\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/before-options.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"searchEnabled\", [\"loc\", [null, [1, 6], [1, 19]]]]], [], 0, null, [\"loc\", [null, [1, 0], [7, 7]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-power-select/templates/components/power-select/main\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 16,\n \"column\": 6\n },\n \"end\": {\n \"line\": 18,\n \"column\": 6\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/main.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n dom.setAttribute(el1, \"class\", \"ember-power-select-options\");\n dom.setAttribute(el1, \"role\", \"listbox\");\n var el2 = dom.createElement(\"li\");\n dom.setAttribute(el2, \"class\", \"ember-power-select-option\");\n dom.setAttribute(el2, \"role\", \"option\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 0]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"searchMessage\", [\"loc\", [null, [17, 114], [17, 131]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 19,\n \"column\": 8\n },\n \"end\": {\n \"line\": 21,\n \"column\": 8\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/main.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"yield\", [], [\"to\", \"inverse\"], [\"loc\", [null, [20, 10], [20, 32]]]]],\n locals: [],\n templates: []\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 21,\n \"column\": 8\n },\n \"end\": {\n \"line\": 23,\n \"column\": 8\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/main.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"ul\");\n dom.setAttribute(el1, \"class\", \"ember-power-select-options\");\n dom.setAttribute(el1, \"role\", \"listbox\");\n var el2 = dom.createElement(\"li\");\n dom.setAttribute(el2, \"class\", \"ember-power-select-option\");\n dom.setAttribute(el2, \"role\", \"option\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n \");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1, 0]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"noMatchesMessage\", [\"loc\", [null, [22, 116], [22, 136]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 21,\n \"column\": 8\n },\n \"end\": {\n \"line\": 23,\n \"column\": 8\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/main.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"noMatchesMessage\", [\"loc\", [null, [21, 18], [21, 34]]]]], [], 0, null, [\"loc\", [null, [21, 8], [23, 8]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 18,\n \"column\": 6\n },\n \"end\": {\n \"line\": 24,\n \"column\": 6\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/main.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"hasInverseBlock\", [\"loc\", [null, [19, 14], [19, 29]]]]], [], 0, 1, [\"loc\", [null, [19, 8], [23, 15]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 25,\n \"column\": 8\n },\n \"end\": {\n \"line\": 30,\n \"column\": 8\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/main.hbs\"\n },\n isEmpty: false,\n arity: 2,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"yield\", [[\"get\", \"option\", [\"loc\", [null, [29, 18], [29, 24]]]], [\"get\", \"term\", [\"loc\", [null, [29, 25], [29, 29]]]]], [], [\"loc\", [null, [29, 10], [29, 31]]]]],\n locals: [\"option\", \"term\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 24,\n \"column\": 6\n },\n \"end\": {\n \"line\": 31,\n \"column\": 6\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/main.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"component\", [[\"get\", \"optionsComponent\", [\"loc\", [null, [25, 21], [25, 37]]]]], [\"options\", [\"subexpr\", \"readonly\", [[\"get\", \"results\", [\"loc\", [null, [25, 56], [25, 63]]]]], [], [\"loc\", [null, [25, 46], [25, 64]]]], \"highlighted\", [\"subexpr\", \"readonly\", [[\"get\", \"highlighted\", [\"loc\", [null, [25, 87], [25, 98]]]]], [], [\"loc\", [null, [25, 77], [25, 99]]]], \"selection\", [\"subexpr\", \"readonly\", [[\"get\", \"selection\", [\"loc\", [null, [26, 30], [26, 39]]]]], [], [\"loc\", [null, [26, 20], [26, 40]]]], \"optionsComponent\", [\"subexpr\", \"readonly\", [[\"get\", \"optionsComponent\", [\"loc\", [null, [26, 68], [26, 84]]]]], [], [\"loc\", [null, [26, 58], [26, 85]]]], \"searchText\", [\"subexpr\", \"readonly\", [[\"get\", \"searchText\", [\"loc\", [null, [26, 107], [26, 117]]]]], [], [\"loc\", [null, [26, 97], [26, 118]]]], \"select\", [\"subexpr\", \"readonly\", [[\"get\", \"select\", [\"loc\", [null, [27, 27], [27, 33]]]]], [], [\"loc\", [null, [27, 17], [27, 34]]]], \"extra\", [\"subexpr\", \"readonly\", [[\"get\", \"extra\", [\"loc\", [null, [27, 51], [27, 56]]]]], [], [\"loc\", [null, [27, 41], [27, 57]]]], \"loadingMessage\", [\"subexpr\", \"readonly\", [[\"get\", \"loadingMessage\", [\"loc\", [null, [27, 83], [27, 97]]]]], [], [\"loc\", [null, [27, 73], [27, 98]]]], \"class\", \"ember-power-select-options\"], 0, null, [\"loc\", [null, [25, 8], [30, 22]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 18,\n \"column\": 6\n },\n \"end\": {\n \"line\": 31,\n \"column\": 6\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/main.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"mustShowNoMessages\", [\"loc\", [null, [18, 16], [18, 34]]]]], [], 0, 1, [\"loc\", [null, [18, 6], [31, 6]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 4,\n \"column\": 2\n },\n \"end\": {\n \"line\": 33,\n \"column\": 2\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/main.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(3);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n morphs[2] = dom.createMorphAt(fragment, 5, 5, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"component\", [[\"get\", \"beforeOptionsComponent\", [\"loc\", [null, [15, 18], [15, 40]]]]], [\"select\", [\"subexpr\", \"readonly\", [[\"get\", \"select\", [\"loc\", [null, [15, 58], [15, 64]]]]], [], [\"loc\", [null, [15, 48], [15, 65]]]], \"searchPlaceholder\", [\"subexpr\", \"readonly\", [[\"get\", \"searchPlaceholder\", [\"loc\", [null, [15, 94], [15, 111]]]]], [], [\"loc\", [null, [15, 84], [15, 112]]]], \"searchEnabled\", [\"subexpr\", \"readonly\", [[\"get\", \"searchEnabled\", [\"loc\", [null, [15, 137], [15, 150]]]]], [], [\"loc\", [null, [15, 127], [15, 151]]]]], [\"loc\", [null, [15, 6], [15, 153]]]], [\"block\", \"if\", [[\"get\", \"mustShowSearchMessage\", [\"loc\", [null, [16, 12], [16, 33]]]]], [], 0, 1, [\"loc\", [null, [16, 6], [31, 13]]]], [\"inline\", \"component\", [[\"get\", \"afterOptionsComponent\", [\"loc\", [null, [32, 18], [32, 39]]]]], [\"select\", [\"subexpr\", \"readonly\", [[\"get\", \"select\", [\"loc\", [null, [32, 57], [32, 63]]]]], [], [\"loc\", [null, [32, 47], [32, 64]]]], \"options\", [\"subexpr\", \"readonly\", [[\"get\", \"results\", [\"loc\", [null, [32, 83], [32, 90]]]]], [], [\"loc\", [null, [32, 73], [32, 91]]]], \"searchPlaceholder\", [\"subexpr\", \"readonly\", [[\"get\", \"searchPlaceholder\", [\"loc\", [null, [32, 120], [32, 137]]]]], [], [\"loc\", [null, [32, 110], [32, 138]]]], \"searchEnabled\", [\"subexpr\", \"readonly\", [[\"get\", \"searchEnabled\", [\"loc\", [null, [32, 163], [32, 176]]]]], [], [\"loc\", [null, [32, 153], [32, 177]]]]], [\"loc\", [null, [32, 6], [32, 179]]]]],\n locals: [\"select\"],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 34,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/main.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"with\", [[\"subexpr\", \"hash\", [], [\"isOpen\", [\"get\", \"dropdown.isOpen\", [\"loc\", [null, [5, 11], [5, 26]]]], \"actions\", [\"subexpr\", \"hash\", [], [\"open\", [\"subexpr\", \"action\", [\"open\", [\"get\", \"dropdown\", [\"loc\", [null, [7, 26], [7, 34]]]]], [], [\"loc\", [null, [7, 11], [7, 35]]]], \"close\", [\"subexpr\", \"action\", [\"close\", [\"get\", \"dropdown\", [\"loc\", [null, [8, 28], [8, 36]]]]], [], [\"loc\", [null, [8, 12], [8, 37]]]], \"select\", [\"subexpr\", \"action\", [\"select\", [\"get\", \"dropdown\", [\"loc\", [null, [9, 30], [9, 38]]]]], [], [\"loc\", [null, [9, 13], [9, 39]]]], \"highlight\", [\"subexpr\", \"action\", [\"highlight\", [\"get\", \"dropdown\", [\"loc\", [null, [10, 36], [10, 44]]]]], [], [\"loc\", [null, [10, 16], [10, 45]]]], \"search\", [\"subexpr\", \"action\", [\"search\", [\"get\", \"dropdown\", [\"loc\", [null, [11, 30], [11, 38]]]]], [], [\"loc\", [null, [11, 13], [11, 39]]]], \"removeOption\", [\"subexpr\", \"action\", [\"removeOption\", [\"get\", \"dropdown\", [\"loc\", [null, [12, 42], [12, 50]]]]], [], [\"loc\", [null, [12, 19], [12, 51]]]], \"handleKeydown\", [\"subexpr\", \"action\", [\"handleKeydown\", [\"get\", \"dropdown\", [\"loc\", [null, [13, 44], [13, 52]]]]], [], [\"loc\", [null, [13, 20], [13, 53]]]]], [\"loc\", [null, [6, 12], [14, 5]]]]], [\"loc\", [null, [4, 10], [14, 6]]]]], [], 0, null, [\"loc\", [null, [4, 2], [33, 11]]]]],\n locals: [\"dropdown\"],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 47,\n \"column\": 4\n },\n \"end\": {\n \"line\": 51,\n \"column\": 4\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/main.hbs\"\n },\n isEmpty: false,\n arity: 2,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"yield\", [[\"get\", \"opt\", [\"loc\", [null, [50, 14], [50, 17]]]], [\"get\", \"term\", [\"loc\", [null, [50, 18], [50, 22]]]]], [], [\"loc\", [null, [50, 6], [50, 24]]]]],\n locals: [\"opt\", \"term\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 35,\n \"column\": 2\n },\n \"end\": {\n \"line\": 52,\n \"column\": 2\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/main.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"component\", [[\"get\", \"selectedComponent\", [\"loc\", [null, [47, 17], [47, 34]]]]], [\"options\", [\"subexpr\", \"readonly\", [[\"get\", \"results\", [\"loc\", [null, [47, 53], [47, 60]]]]], [], [\"loc\", [null, [47, 43], [47, 61]]]], \"selection\", [\"subexpr\", \"readonly\", [[\"get\", \"selection\", [\"loc\", [null, [47, 82], [47, 91]]]]], [], [\"loc\", [null, [47, 72], [47, 92]]]], \"searchText\", [\"subexpr\", \"readonly\", [[\"get\", \"searchText\", [\"loc\", [null, [47, 114], [47, 124]]]]], [], [\"loc\", [null, [47, 104], [47, 125]]]], \"placeholder\", [\"subexpr\", \"readonly\", [[\"get\", \"placeholder\", [\"loc\", [null, [48, 28], [48, 39]]]]], [], [\"loc\", [null, [48, 18], [48, 40]]]], \"disabled\", [\"subexpr\", \"readonly\", [[\"get\", \"disabled\", [\"loc\", [null, [48, 60], [48, 68]]]]], [], [\"loc\", [null, [48, 50], [48, 69]]]], \"highlighted\", [\"subexpr\", \"readonly\", [[\"get\", \"highlighted\", [\"loc\", [null, [48, 92], [48, 103]]]]], [], [\"loc\", [null, [48, 82], [48, 104]]]], \"select\", [\"subexpr\", \"readonly\", [[\"get\", \"select\", [\"loc\", [null, [49, 23], [49, 29]]]]], [], [\"loc\", [null, [49, 13], [49, 30]]]], \"extra\", [\"subexpr\", \"readonly\", [[\"get\", \"extra\", [\"loc\", [null, [49, 47], [49, 52]]]]], [], [\"loc\", [null, [49, 37], [49, 53]]]]], 0, null, [\"loc\", [null, [47, 4], [51, 18]]]]],\n locals: [\"select\"],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 34,\n \"column\": 0\n },\n \"end\": {\n \"line\": 53,\n \"column\": 1\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/main.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"with\", [[\"subexpr\", \"hash\", [], [\"isOpen\", [\"get\", \"registeredDropdown.isOpen\", [\"loc\", [null, [36, 11], [36, 36]]]], \"actions\", [\"subexpr\", \"hash\", [], [\"open\", [\"subexpr\", \"action\", [\"open\", [\"get\", \"registeredDropdown\", [\"loc\", [null, [38, 26], [38, 44]]]]], [], [\"loc\", [null, [38, 11], [38, 45]]]], \"close\", [\"subexpr\", \"action\", [\"close\", [\"get\", \"registeredDropdown\", [\"loc\", [null, [39, 28], [39, 46]]]]], [], [\"loc\", [null, [39, 12], [39, 47]]]], \"select\", [\"subexpr\", \"action\", [\"select\", [\"get\", \"registeredDropdown\", [\"loc\", [null, [40, 30], [40, 48]]]]], [], [\"loc\", [null, [40, 13], [40, 49]]]], \"highlight\", [\"subexpr\", \"action\", [\"highlight\", [\"get\", \"registeredDropdown\", [\"loc\", [null, [41, 36], [41, 54]]]]], [], [\"loc\", [null, [41, 16], [41, 55]]]], \"search\", [\"subexpr\", \"action\", [\"search\", [\"get\", \"registeredDropdown\", [\"loc\", [null, [42, 30], [42, 48]]]]], [], [\"loc\", [null, [42, 13], [42, 49]]]], \"removeOption\", [\"subexpr\", \"action\", [\"removeOption\", [\"get\", \"registeredDropdown\", [\"loc\", [null, [43, 42], [43, 60]]]]], [], [\"loc\", [null, [43, 19], [43, 61]]]], \"clear\", [\"subexpr\", \"if\", [[\"get\", \"allowClear\", [\"loc\", [null, [44, 16], [44, 26]]]], [\"subexpr\", \"action\", [\"select\", [\"get\", \"registeredDropdown\", [\"loc\", [null, [44, 44], [44, 62]]]], null], [], [\"loc\", [null, [44, 27], [44, 68]]]]], [], [\"loc\", [null, [44, 12], [44, 69]]]], \"handleKeydown\", [\"subexpr\", \"action\", [\"handleKeydown\", [\"get\", \"registeredDropdown\", [\"loc\", [null, [45, 44], [45, 62]]]]], [], [\"loc\", [null, [45, 20], [45, 63]]]]], [\"loc\", [null, [37, 12], [46, 5]]]]], [\"loc\", [null, [35, 10], [46, 6]]]]], [], 0, null, [\"loc\", [null, [35, 2], [52, 11]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 54,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/main.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"basic-dropdown\", [], [\"class\", [\"subexpr\", \"readonly\", [[\"get\", \"concatenatedClasses\", [\"loc\", [null, [1, 34], [1, 53]]]]], [], [\"loc\", [null, [1, 24], [1, 54]]]], \"dir\", [\"subexpr\", \"readonly\", [[\"get\", \"dir\", [\"loc\", [null, [1, 69], [1, 72]]]]], [], [\"loc\", [null, [1, 59], [1, 73]]]], \"tabindex\", [\"subexpr\", \"readonly\", [[\"get\", \"tabindex\", [\"loc\", [null, [1, 93], [1, 101]]]]], [], [\"loc\", [null, [1, 83], [1, 102]]]], \"renderInPlace\", [\"subexpr\", \"readonly\", [[\"get\", \"renderInPlace\", [\"loc\", [null, [1, 127], [1, 140]]]]], [], [\"loc\", [null, [1, 117], [1, 141]]]], \"matchTriggerWidth\", true, \"disabled\", [\"subexpr\", \"readonly\", [[\"get\", \"disabled\", [\"loc\", [null, [2, 21], [2, 29]]]]], [], [\"loc\", [null, [2, 11], [2, 30]]]], \"dropdownPosition\", [\"subexpr\", \"readonly\", [[\"get\", \"dropdownPosition\", [\"loc\", [null, [2, 58], [2, 74]]]]], [], [\"loc\", [null, [2, 48], [2, 75]]]], \"triggerClass\", [\"subexpr\", \"readonly\", [[\"get\", \"concatenatedTriggerClasses\", [\"loc\", [null, [2, 99], [2, 125]]]]], [], [\"loc\", [null, [2, 89], [2, 126]]]], \"dropdownClass\", [\"subexpr\", \"readonly\", [[\"get\", \"concatenatedDropdownClasses\", [\"loc\", [null, [2, 151], [2, 178]]]]], [], [\"loc\", [null, [2, 141], [2, 179]]]], \"opened\", [\"subexpr\", \"@mut\", [[\"get\", \"opened\", [\"loc\", [null, [3, 9], [3, 15]]]]], [], []], \"onOpen\", [\"subexpr\", \"action\", [[\"get\", \"handleOpen\", [\"loc\", [null, [3, 31], [3, 41]]]]], [], [\"loc\", [null, [3, 23], [3, 42]]]], \"onClose\", [\"subexpr\", \"action\", [[\"get\", \"handleClose\", [\"loc\", [null, [3, 59], [3, 70]]]]], [], [\"loc\", [null, [3, 51], [3, 71]]]], \"onFocus\", [\"subexpr\", \"action\", [\"handleFocus\"], [], [\"loc\", [null, [3, 80], [3, 102]]]], \"onKeydown\", [\"subexpr\", \"action\", [\"handleKeydown\"], [], [\"loc\", [null, [3, 113], [3, 137]]]], \"registerActionsInParent\", [\"subexpr\", \"action\", [\"registerDropdown\"], [], [\"loc\", [null, [3, 162], [3, 189]]]]], 0, 1, [\"loc\", [null, [1, 0], [53, 20]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })());\n});","define(\"ember-power-select/templates/components/power-select/multiple/selected\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 4\n },\n \"end\": {\n \"line\": 5,\n \"column\": 4\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/multiple/selected.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"aria-label\", \"remove element\");\n dom.setAttribute(el1, \"class\", \"ember-power-select-multiple-remove-btn\");\n var el2 = dom.createTextNode(\"×\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createAttrMorph(element0, 'onmousedown');\n return morphs;\n },\n statements: [[\"attribute\", \"onmousedown\", [\"subexpr\", \"action\", [[\"get\", \"select.actions.removeOption\", [\"loc\", [null, [4, 108], [4, 135]]]], [\"get\", \"opt\", [\"loc\", [null, [4, 136], [4, 139]]]]], [], [\"loc\", [null, [4, 99], [4, 141]]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"triple-curlies\"\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 8,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/multiple/selected.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ember-power-select-multiple-option\");\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element1 = dom.childAt(fragment, [1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(element1, 1, 1);\n morphs[1] = dom.createMorphAt(element1, 3, 3);\n return morphs;\n },\n statements: [[\"block\", \"unless\", [[\"get\", \"disabled\", [\"loc\", [null, [3, 14], [3, 22]]]]], [], 0, null, [\"loc\", [null, [3, 4], [5, 15]]]], [\"inline\", \"yield\", [[\"get\", \"opt\", [\"loc\", [null, [6, 12], [6, 15]]]], [\"get\", \"searchText\", [\"loc\", [null, [6, 16], [6, 26]]]]], [], [\"loc\", [null, [6, 4], [6, 28]]]]],\n locals: [\"opt\"],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 13,\n \"column\": 52\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/multiple/selected.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"input\");\n dom.setAttribute(el1, \"type\", \"search\");\n dom.setAttribute(el1, \"class\", \"ember-power-select-trigger-multiple-input\");\n dom.setAttribute(el1, \"tabindex\", \"0\");\n dom.setAttribute(el1, \"autocomplete\", \"off\");\n dom.setAttribute(el1, \"autocorrect\", \"off\");\n dom.setAttribute(el1, \"autocapitalize\", \"off\");\n dom.setAttribute(el1, \"spellcheck\", \"false\");\n dom.setAttribute(el1, \"role\", \"combobox\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ember-power-select-status-icon\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element2 = dom.childAt(fragment, [1]);\n var morphs = new Array(7);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createAttrMorph(element2, 'style');\n morphs[2] = dom.createAttrMorph(element2, 'placeholder');\n morphs[3] = dom.createAttrMorph(element2, 'value');\n morphs[4] = dom.createAttrMorph(element2, 'disabled');\n morphs[5] = dom.createAttrMorph(element2, 'oninput');\n morphs[6] = dom.createAttrMorph(element2, 'onkeydown');\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"each\", [[\"get\", \"selection\", [\"loc\", [null, [1, 8], [1, 17]]]]], [], 0, null, [\"loc\", [null, [1, 0], [8, 9]]]], [\"attribute\", \"style\", [\"get\", \"triggerMultipleInputStyle\", [\"loc\", [null, [10, 84], [10, 109]]]]], [\"attribute\", \"placeholder\", [\"get\", \"maybePlaceholder\", [\"loc\", [null, [11, 16], [11, 32]]]]], [\"attribute\", \"value\", [\"get\", \"searchText\", [\"loc\", [null, [11, 43], [11, 53]]]]], [\"attribute\", \"disabled\", [\"get\", \"disabled\", [\"loc\", [null, [11, 67], [11, 75]]]]], [\"attribute\", \"oninput\", [\"subexpr\", \"action\", [\"search\"], [\"value\", \"target.value\"], [\"loc\", [null, [12, 10], [12, 50]]]]], [\"attribute\", \"onkeydown\", [\"get\", \"select.actions.handleKeydown\", [\"loc\", [null, [12, 63], [12, 91]]]]]],\n locals: [],\n templates: [child0]\n };\n })());\n});","define(\"ember-power-select/templates/components/power-select/options\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 2,\n \"column\": 2\n },\n \"end\": {\n \"line\": 4,\n \"column\": 2\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/options.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n dom.setAttribute(el1, \"class\", \"ember-power-select-option\");\n dom.setAttribute(el1, \"role\", \"option\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"loadingMessage\", [\"loc\", [null, [3, 56], [3, 74]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 5,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/options.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"loadingMessage\", [\"loc\", [null, [2, 8], [2, 22]]]]], [], 0, null, [\"loc\", [null, [2, 2], [4, 9]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 10,\n \"column\": 6\n },\n \"end\": {\n \"line\": 14,\n \"column\": 6\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/options.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n return morphs;\n },\n statements: [[\"inline\", \"yield\", [[\"get\", \"option\", [\"loc\", [null, [13, 16], [13, 22]]]], [\"get\", \"searchText\", [\"loc\", [null, [13, 23], [13, 33]]]]], [], [\"loc\", [null, [13, 8], [13, 35]]]]],\n locals: [\"option\"],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 7,\n \"column\": 2\n },\n \"end\": {\n \"line\": 16,\n \"column\": 2\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/options.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n dom.setAttribute(el1, \"class\", \"ember-power-select-group\");\n dom.setAttribute(el1, \"role\", \"option\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createElement(\"span\");\n dom.setAttribute(el2, \"class\", \"ember-power-select-group-name\");\n var el3 = dom.createComment(\"\");\n dom.appendChild(el2, el3);\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n\");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\" \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element1 = dom.childAt(fragment, [1]);\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(dom.childAt(element1, [1]), 0, 0);\n morphs[1] = dom.createMorphAt(element1, 3, 3);\n return morphs;\n },\n statements: [[\"content\", \"opt.groupName\", [\"loc\", [null, [9, 50], [9, 67]]]], [\"block\", \"component\", [[\"get\", \"optionsComponent\", [\"loc\", [null, [10, 19], [10, 35]]]]], [\"highlighted\", [\"subexpr\", \"readonly\", [[\"get\", \"highlighted\", [\"loc\", [null, [10, 58], [10, 69]]]]], [], [\"loc\", [null, [10, 48], [10, 70]]]], \"selection\", [\"subexpr\", \"readonly\", [[\"get\", \"selection\", [\"loc\", [null, [10, 91], [10, 100]]]]], [], [\"loc\", [null, [10, 81], [10, 101]]]], \"options\", [\"subexpr\", \"readonly\", [[\"get\", \"opt.options\", [\"loc\", [null, [11, 26], [11, 37]]]]], [], [\"loc\", [null, [11, 16], [11, 38]]]], \"optionsComponent\", [\"subexpr\", \"readonly\", [[\"get\", \"optionsComponent\", [\"loc\", [null, [11, 66], [11, 82]]]]], [], [\"loc\", [null, [11, 56], [11, 83]]]], \"select\", [\"subexpr\", \"readonly\", [[\"get\", \"select\", [\"loc\", [null, [11, 101], [11, 107]]]]], [], [\"loc\", [null, [11, 91], [11, 108]]]], \"class\", \"ember-power-select-options ember-power-select-options--nested\"], 0, null, [\"loc\", [null, [10, 6], [14, 20]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 16,\n \"column\": 2\n },\n \"end\": {\n \"line\": 21,\n \"column\": 2\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/options.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"li\");\n dom.setAttribute(el1, \"role\", \"option\");\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n var el2 = dom.createTextNode(\"\\n \");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(4);\n morphs[0] = dom.createAttrMorph(element0, 'class');\n morphs[1] = dom.createAttrMorph(element0, 'onmouseup');\n morphs[2] = dom.createAttrMorph(element0, 'onmouseover');\n morphs[3] = dom.createMorphAt(element0, 1, 1);\n return morphs;\n },\n statements: [[\"attribute\", \"class\", [\"concat\", [\"ember-power-select-option \", [\"subexpr\", \"ember-power-select-option-classes\", [[\"get\", \"opt\", [\"loc\", [null, [17, 77], [17, 80]]]], [\"get\", \"selection\", [\"loc\", [null, [17, 81], [17, 90]]]], [\"get\", \"highlighted\", [\"loc\", [null, [17, 91], [17, 102]]]]], [], [\"loc\", [null, [17, 41], [17, 104]]]]]]], [\"attribute\", \"onmouseup\", [\"subexpr\", \"action\", [[\"get\", \"select.actions.select\", [\"loc\", [null, [18, 25], [18, 46]]]], [\"get\", \"opt\", [\"loc\", [null, [18, 47], [18, 50]]]]], [], [\"loc\", [null, [18, 16], [18, 52]]]]], [\"attribute\", \"onmouseover\", [\"subexpr\", \"action\", [[\"get\", \"select.actions.highlight\", [\"loc\", [null, [18, 74], [18, 98]]]], [\"get\", \"opt\", [\"loc\", [null, [18, 99], [18, 102]]]]], [], [\"loc\", [null, [18, 65], [18, 104]]]]], [\"inline\", \"yield\", [[\"get\", \"opt\", [\"loc\", [null, [19, 14], [19, 17]]]], [\"get\", \"searchText\", [\"loc\", [null, [19, 18], [19, 28]]]]], [], [\"loc\", [null, [19, 6], [19, 30]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 6,\n \"column\": 0\n },\n \"end\": {\n \"line\": 22,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/options.hbs\"\n },\n isEmpty: false,\n arity: 1,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"opt.groupName\", [\"loc\", [null, [7, 8], [7, 21]]]]], [], 0, 1, [\"loc\", [null, [7, 2], [21, 9]]]]],\n locals: [\"opt\"],\n templates: [child0, child1]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 23,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/options.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"options.isPending\", [\"loc\", [null, [1, 6], [1, 23]]]]], [], 0, null, [\"loc\", [null, [1, 0], [5, 7]]]], [\"block\", \"each\", [[\"get\", \"options\", [\"loc\", [null, [6, 8], [6, 15]]]]], [], 1, null, [\"loc\", [null, [6, 0], [22, 9]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })());\n});","define(\"ember-power-select/templates/components/power-select/single/selected\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n var child0 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 3,\n \"column\": 2\n },\n \"end\": {\n \"line\": 5,\n \"column\": 2\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/single/selected.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ember-power-select-clear-btn\");\n var el2 = dom.createTextNode(\"×\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var element0 = dom.childAt(fragment, [1]);\n var morphs = new Array(1);\n morphs[0] = dom.createAttrMorph(element0, 'onmousedown');\n return morphs;\n },\n statements: [[\"attribute\", \"onmousedown\", [\"get\", \"select.actions.clear\", [\"loc\", [null, [4, 61], [4, 81]]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 6,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/single/selected.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(2);\n morphs[0] = dom.createMorphAt(fragment, 1, 1, contextualElement);\n morphs[1] = dom.createMorphAt(fragment, 3, 3, contextualElement);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"inline\", \"yield\", [[\"get\", \"selection\", [\"loc\", [null, [2, 10], [2, 19]]]], [\"get\", \"searchText\", [\"loc\", [null, [2, 20], [2, 30]]]]], [], [\"loc\", [null, [2, 2], [2, 32]]]], [\"block\", \"if\", [[\"get\", \"select.actions.clear\", [\"loc\", [null, [3, 8], [3, 28]]]]], [], 0, null, [\"loc\", [null, [3, 2], [5, 9]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n var child1 = (function () {\n var child0 = (function () {\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 6,\n \"column\": 0\n },\n \"end\": {\n \"line\": 8,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/single/selected.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createTextNode(\" \");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ember-power-select-placeholder\");\n var el2 = dom.createComment(\"\");\n dom.appendChild(el1, el2);\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(dom.childAt(fragment, [1]), 0, 0);\n return morphs;\n },\n statements: [[\"content\", \"placeholder\", [\"loc\", [null, [7, 47], [7, 62]]]]],\n locals: [],\n templates: []\n };\n })();\n return {\n meta: {\n \"fragmentReason\": false,\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 6,\n \"column\": 0\n },\n \"end\": {\n \"line\": 8,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/single/selected.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n dom.insertBoundary(fragment, null);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"placeholder\", [\"loc\", [null, [6, 10], [6, 21]]]]], [], 0, null, [\"loc\", [null, [6, 0], [8, 0]]]]],\n locals: [],\n templates: [child0]\n };\n })();\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\", \"multiple-nodes\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 9,\n \"column\": 52\n }\n },\n \"moduleName\": \"modules/ember-power-select/templates/components/power-select/single/selected.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createElement(\"span\");\n dom.setAttribute(el1, \"class\", \"ember-power-select-status-icon\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"block\", \"if\", [[\"get\", \"selection\", [\"loc\", [null, [1, 6], [1, 15]]]]], [], 0, 1, [\"loc\", [null, [1, 0], [8, 7]]]]],\n locals: [],\n templates: [child0, child1]\n };\n })());\n});","define('ember-power-select/utils/group-utils', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports.isGroup = isGroup;\n exports.countOptions = countOptions;\n exports.indexOfOption = indexOfOption;\n exports.optionAtIndex = optionAtIndex;\n exports.filterOptions = filterOptions;\n exports.stripDiacritics = stripDiacritics;\n exports.defaultMatcher = defaultMatcher;\n\n var get = _ember['default'].get;\n\n function isGroup(entry) {\n return !!entry && !!get(entry, 'groupName') && !!get(entry, 'options');\n }\n\n function countOptions(collection) {\n var counter = 0;\n (function walk(collection) {\n if (!collection) {\n return null;\n }\n if (!collection.objectAt) {\n collection = _ember['default'].A(collection);\n }\n for (var i = 0; i < get(collection, 'length'); i++) {\n var entry = collection.objectAt(i);\n if (isGroup(entry)) {\n walk(get(entry, 'options'));\n } else {\n counter++;\n }\n }\n })(collection);\n return counter;\n }\n\n function indexOfOption(collection, option) {\n var index = 0;\n return (function walk(collection) {\n if (!collection) {\n return null;\n }\n if (!collection.objectAt) {\n collection = _ember['default'].A(collection);\n }\n for (var i = 0; i < get(collection, 'length'); i++) {\n var entry = collection.objectAt(i);\n if (isGroup(entry)) {\n var result = walk(get(entry, 'options'));\n if (result > -1) {\n return result;\n }\n } else if (entry === option) {\n return index;\n } else {\n index++;\n }\n }\n return -1;\n })(collection);\n }\n\n function optionAtIndex(originalCollection, index) {\n var counter = 0;\n return (function walk(collection) {\n if (!collection) {\n return null;\n }\n if (!collection.objectAt) {\n collection = _ember['default'].A(collection);\n }\n var localCounter = 0;\n var length = get(collection, 'length');\n while (counter <= index && localCounter < length) {\n var entry = collection.objectAt(localCounter);\n if (isGroup(entry)) {\n var found = walk(get(entry, 'options'));\n if (found) {\n return found;\n }\n } else if (counter === index) {\n return entry;\n } else {\n counter++;\n }\n localCounter++;\n }\n })(originalCollection);\n }\n\n function filterOptions(options, text, matcher) {\n var sanitizedOptions = options.objectAt ? options : _ember['default'].A(options);\n var opts = _ember['default'].A();\n var length = get(options, 'length');\n for (var i = 0; i < length; i++) {\n var entry = sanitizedOptions.objectAt(i);\n if (isGroup(entry)) {\n var suboptions = filterOptions(get(entry, 'options'), text, matcher);\n if (get(suboptions, 'length') > 0) {\n opts.push({ groupName: entry.groupName, options: suboptions });\n }\n } else if (matcher(entry, text)) {\n opts.push(entry);\n }\n }\n return opts;\n }\n\n var DIACRITICS = {\n 'Ⓐ': 'A',\n 'A': 'A',\n 'À': 'A',\n 'Á': 'A',\n 'Â': 'A',\n 'Ầ': 'A',\n 'Ấ': 'A',\n 'Ẫ': 'A',\n 'Ẩ': 'A',\n 'Ã': 'A',\n 'Ā': 'A',\n 'Ă': 'A',\n 'Ằ': 'A',\n 'Ắ': 'A',\n 'Ẵ': 'A',\n 'Ẳ': 'A',\n 'Ȧ': 'A',\n 'Ǡ': 'A',\n 'Ä': 'A',\n 'Ǟ': 'A',\n 'Ả': 'A',\n 'Å': 'A',\n 'Ǻ': 'A',\n 'Ǎ': 'A',\n 'Ȁ': 'A',\n 'Ȃ': 'A',\n 'Ạ': 'A',\n 'Ậ': 'A',\n 'Ặ': 'A',\n 'Ḁ': 'A',\n 'Ą': 'A',\n 'Ⱥ': 'A',\n 'Ɐ': 'A',\n 'Ꜳ': 'AA',\n 'Æ': 'AE',\n 'Ǽ': 'AE',\n 'Ǣ': 'AE',\n 'Ꜵ': 'AO',\n 'Ꜷ': 'AU',\n 'Ꜹ': 'AV',\n 'Ꜻ': 'AV',\n 'Ꜽ': 'AY',\n 'Ⓑ': 'B',\n 'B': 'B',\n 'Ḃ': 'B',\n 'Ḅ': 'B',\n 'Ḇ': 'B',\n 'Ƀ': 'B',\n 'Ƃ': 'B',\n 'Ɓ': 'B',\n 'Ⓒ': 'C',\n 'C': 'C',\n 'Ć': 'C',\n 'Ĉ': 'C',\n 'Ċ': 'C',\n 'Č': 'C',\n 'Ç': 'C',\n 'Ḉ': 'C',\n 'Ƈ': 'C',\n 'Ȼ': 'C',\n 'Ꜿ': 'C',\n 'Ⓓ': 'D',\n 'D': 'D',\n 'Ḋ': 'D',\n 'Ď': 'D',\n 'Ḍ': 'D',\n 'Ḑ': 'D',\n 'Ḓ': 'D',\n 'Ḏ': 'D',\n 'Đ': 'D',\n 'Ƌ': 'D',\n 'Ɗ': 'D',\n 'Ɖ': 'D',\n 'Ꝺ': 'D',\n 'DZ': 'DZ',\n 'DŽ': 'DZ',\n 'Dz': 'Dz',\n 'Dž': 'Dz',\n 'Ⓔ': 'E',\n 'E': 'E',\n 'È': 'E',\n 'É': 'E',\n 'Ê': 'E',\n 'Ề': 'E',\n 'Ế': 'E',\n 'Ễ': 'E',\n 'Ể': 'E',\n 'Ẽ': 'E',\n 'Ē': 'E',\n 'Ḕ': 'E',\n 'Ḗ': 'E',\n 'Ĕ': 'E',\n 'Ė': 'E',\n 'Ë': 'E',\n 'Ẻ': 'E',\n 'Ě': 'E',\n 'Ȅ': 'E',\n 'Ȇ': 'E',\n 'Ẹ': 'E',\n 'Ệ': 'E',\n 'Ȩ': 'E',\n 'Ḝ': 'E',\n 'Ę': 'E',\n 'Ḙ': 'E',\n 'Ḛ': 'E',\n 'Ɛ': 'E',\n 'Ǝ': 'E',\n 'Ⓕ': 'F',\n 'F': 'F',\n 'Ḟ': 'F',\n 'Ƒ': 'F',\n 'Ꝼ': 'F',\n 'Ⓖ': 'G',\n 'G': 'G',\n 'Ǵ': 'G',\n 'Ĝ': 'G',\n 'Ḡ': 'G',\n 'Ğ': 'G',\n 'Ġ': 'G',\n 'Ǧ': 'G',\n 'Ģ': 'G',\n 'Ǥ': 'G',\n 'Ɠ': 'G',\n 'Ꞡ': 'G',\n 'Ᵹ': 'G',\n 'Ꝿ': 'G',\n 'Ⓗ': 'H',\n 'H': 'H',\n 'Ĥ': 'H',\n 'Ḣ': 'H',\n 'Ḧ': 'H',\n 'Ȟ': 'H',\n 'Ḥ': 'H',\n 'Ḩ': 'H',\n 'Ḫ': 'H',\n 'Ħ': 'H',\n 'Ⱨ': 'H',\n 'Ⱶ': 'H',\n 'Ɥ': 'H',\n 'Ⓘ': 'I',\n 'I': 'I',\n 'Ì': 'I',\n 'Í': 'I',\n 'Î': 'I',\n 'Ĩ': 'I',\n 'Ī': 'I',\n 'Ĭ': 'I',\n 'İ': 'I',\n 'Ï': 'I',\n 'Ḯ': 'I',\n 'Ỉ': 'I',\n 'Ǐ': 'I',\n 'Ȉ': 'I',\n 'Ȋ': 'I',\n 'Ị': 'I',\n 'Į': 'I',\n 'Ḭ': 'I',\n 'Ɨ': 'I',\n 'Ⓙ': 'J',\n 'J': 'J',\n 'Ĵ': 'J',\n 'Ɉ': 'J',\n 'Ⓚ': 'K',\n 'K': 'K',\n 'Ḱ': 'K',\n 'Ǩ': 'K',\n 'Ḳ': 'K',\n 'Ķ': 'K',\n 'Ḵ': 'K',\n 'Ƙ': 'K',\n 'Ⱪ': 'K',\n 'Ꝁ': 'K',\n 'Ꝃ': 'K',\n 'Ꝅ': 'K',\n 'Ꞣ': 'K',\n 'Ⓛ': 'L',\n 'L': 'L',\n 'Ŀ': 'L',\n 'Ĺ': 'L',\n 'Ľ': 'L',\n 'Ḷ': 'L',\n 'Ḹ': 'L',\n 'Ļ': 'L',\n 'Ḽ': 'L',\n 'Ḻ': 'L',\n 'Ł': 'L',\n 'Ƚ': 'L',\n 'Ɫ': 'L',\n 'Ⱡ': 'L',\n 'Ꝉ': 'L',\n 'Ꝇ': 'L',\n 'Ꞁ': 'L',\n 'LJ': 'LJ',\n 'Lj': 'Lj',\n 'Ⓜ': 'M',\n 'M': 'M',\n 'Ḿ': 'M',\n 'Ṁ': 'M',\n 'Ṃ': 'M',\n 'Ɱ': 'M',\n 'Ɯ': 'M',\n 'Ⓝ': 'N',\n 'N': 'N',\n 'Ǹ': 'N',\n 'Ń': 'N',\n 'Ñ': 'N',\n 'Ṅ': 'N',\n 'Ň': 'N',\n 'Ṇ': 'N',\n 'Ņ': 'N',\n 'Ṋ': 'N',\n 'Ṉ': 'N',\n 'Ƞ': 'N',\n 'Ɲ': 'N',\n 'Ꞑ': 'N',\n 'Ꞥ': 'N',\n 'NJ': 'NJ',\n 'Nj': 'Nj',\n 'Ⓞ': 'O',\n 'O': 'O',\n 'Ò': 'O',\n 'Ó': 'O',\n 'Ô': 'O',\n 'Ồ': 'O',\n 'Ố': 'O',\n 'Ỗ': 'O',\n 'Ổ': 'O',\n 'Õ': 'O',\n 'Ṍ': 'O',\n 'Ȭ': 'O',\n 'Ṏ': 'O',\n 'Ō': 'O',\n 'Ṑ': 'O',\n 'Ṓ': 'O',\n 'Ŏ': 'O',\n 'Ȯ': 'O',\n 'Ȱ': 'O',\n 'Ö': 'O',\n 'Ȫ': 'O',\n 'Ỏ': 'O',\n 'Ő': 'O',\n 'Ǒ': 'O',\n 'Ȍ': 'O',\n 'Ȏ': 'O',\n 'Ơ': 'O',\n 'Ờ': 'O',\n 'Ớ': 'O',\n 'Ỡ': 'O',\n 'Ở': 'O',\n 'Ợ': 'O',\n 'Ọ': 'O',\n 'Ộ': 'O',\n 'Ǫ': 'O',\n 'Ǭ': 'O',\n 'Ø': 'O',\n 'Ǿ': 'O',\n 'Ɔ': 'O',\n 'Ɵ': 'O',\n 'Ꝋ': 'O',\n 'Ꝍ': 'O',\n 'Ƣ': 'OI',\n 'Ꝏ': 'OO',\n 'Ȣ': 'OU',\n 'Ⓟ': 'P',\n 'P': 'P',\n 'Ṕ': 'P',\n 'Ṗ': 'P',\n 'Ƥ': 'P',\n 'Ᵽ': 'P',\n 'Ꝑ': 'P',\n 'Ꝓ': 'P',\n 'Ꝕ': 'P',\n 'Ⓠ': 'Q',\n 'Q': 'Q',\n 'Ꝗ': 'Q',\n 'Ꝙ': 'Q',\n 'Ɋ': 'Q',\n 'Ⓡ': 'R',\n 'R': 'R',\n 'Ŕ': 'R',\n 'Ṙ': 'R',\n 'Ř': 'R',\n 'Ȑ': 'R',\n 'Ȓ': 'R',\n 'Ṛ': 'R',\n 'Ṝ': 'R',\n 'Ŗ': 'R',\n 'Ṟ': 'R',\n 'Ɍ': 'R',\n 'Ɽ': 'R',\n 'Ꝛ': 'R',\n 'Ꞧ': 'R',\n 'Ꞃ': 'R',\n 'Ⓢ': 'S',\n 'S': 'S',\n 'ẞ': 'S',\n 'Ś': 'S',\n 'Ṥ': 'S',\n 'Ŝ': 'S',\n 'Ṡ': 'S',\n 'Š': 'S',\n 'Ṧ': 'S',\n 'Ṣ': 'S',\n 'Ṩ': 'S',\n 'Ș': 'S',\n 'Ş': 'S',\n 'Ȿ': 'S',\n 'Ꞩ': 'S',\n 'Ꞅ': 'S',\n 'Ⓣ': 'T',\n 'T': 'T',\n 'Ṫ': 'T',\n 'Ť': 'T',\n 'Ṭ': 'T',\n 'Ț': 'T',\n 'Ţ': 'T',\n 'Ṱ': 'T',\n 'Ṯ': 'T',\n 'Ŧ': 'T',\n 'Ƭ': 'T',\n 'Ʈ': 'T',\n 'Ⱦ': 'T',\n 'Ꞇ': 'T',\n 'Ꜩ': 'TZ',\n 'Ⓤ': 'U',\n 'U': 'U',\n 'Ù': 'U',\n 'Ú': 'U',\n 'Û': 'U',\n 'Ũ': 'U',\n 'Ṹ': 'U',\n 'Ū': 'U',\n 'Ṻ': 'U',\n 'Ŭ': 'U',\n 'Ü': 'U',\n 'Ǜ': 'U',\n 'Ǘ': 'U',\n 'Ǖ': 'U',\n 'Ǚ': 'U',\n 'Ủ': 'U',\n 'Ů': 'U',\n 'Ű': 'U',\n 'Ǔ': 'U',\n 'Ȕ': 'U',\n 'Ȗ': 'U',\n 'Ư': 'U',\n 'Ừ': 'U',\n 'Ứ': 'U',\n 'Ữ': 'U',\n 'Ử': 'U',\n 'Ự': 'U',\n 'Ụ': 'U',\n 'Ṳ': 'U',\n 'Ų': 'U',\n 'Ṷ': 'U',\n 'Ṵ': 'U',\n 'Ʉ': 'U',\n 'Ⓥ': 'V',\n 'V': 'V',\n 'Ṽ': 'V',\n 'Ṿ': 'V',\n 'Ʋ': 'V',\n 'Ꝟ': 'V',\n 'Ʌ': 'V',\n 'Ꝡ': 'VY',\n 'Ⓦ': 'W',\n 'W': 'W',\n 'Ẁ': 'W',\n 'Ẃ': 'W',\n 'Ŵ': 'W',\n 'Ẇ': 'W',\n 'Ẅ': 'W',\n 'Ẉ': 'W',\n 'Ⱳ': 'W',\n 'Ⓧ': 'X',\n 'X': 'X',\n 'Ẋ': 'X',\n 'Ẍ': 'X',\n 'Ⓨ': 'Y',\n 'Y': 'Y',\n 'Ỳ': 'Y',\n 'Ý': 'Y',\n 'Ŷ': 'Y',\n 'Ỹ': 'Y',\n 'Ȳ': 'Y',\n 'Ẏ': 'Y',\n 'Ÿ': 'Y',\n 'Ỷ': 'Y',\n 'Ỵ': 'Y',\n 'Ƴ': 'Y',\n 'Ɏ': 'Y',\n 'Ỿ': 'Y',\n 'Ⓩ': 'Z',\n 'Z': 'Z',\n 'Ź': 'Z',\n 'Ẑ': 'Z',\n 'Ż': 'Z',\n 'Ž': 'Z',\n 'Ẓ': 'Z',\n 'Ẕ': 'Z',\n 'Ƶ': 'Z',\n 'Ȥ': 'Z',\n 'Ɀ': 'Z',\n 'Ⱬ': 'Z',\n 'Ꝣ': 'Z',\n 'ⓐ': 'a',\n 'a': 'a',\n 'ẚ': 'a',\n 'à': 'a',\n 'á': 'a',\n 'â': 'a',\n 'ầ': 'a',\n 'ấ': 'a',\n 'ẫ': 'a',\n 'ẩ': 'a',\n 'ã': 'a',\n 'ā': 'a',\n 'ă': 'a',\n 'ằ': 'a',\n 'ắ': 'a',\n 'ẵ': 'a',\n 'ẳ': 'a',\n 'ȧ': 'a',\n 'ǡ': 'a',\n 'ä': 'a',\n 'ǟ': 'a',\n 'ả': 'a',\n 'å': 'a',\n 'ǻ': 'a',\n 'ǎ': 'a',\n 'ȁ': 'a',\n 'ȃ': 'a',\n 'ạ': 'a',\n 'ậ': 'a',\n 'ặ': 'a',\n 'ḁ': 'a',\n 'ą': 'a',\n 'ⱥ': 'a',\n 'ɐ': 'a',\n 'ꜳ': 'aa',\n 'æ': 'ae',\n 'ǽ': 'ae',\n 'ǣ': 'ae',\n 'ꜵ': 'ao',\n 'ꜷ': 'au',\n 'ꜹ': 'av',\n 'ꜻ': 'av',\n 'ꜽ': 'ay',\n 'ⓑ': 'b',\n 'b': 'b',\n 'ḃ': 'b',\n 'ḅ': 'b',\n 'ḇ': 'b',\n 'ƀ': 'b',\n 'ƃ': 'b',\n 'ɓ': 'b',\n 'ⓒ': 'c',\n 'c': 'c',\n 'ć': 'c',\n 'ĉ': 'c',\n 'ċ': 'c',\n 'č': 'c',\n 'ç': 'c',\n 'ḉ': 'c',\n 'ƈ': 'c',\n 'ȼ': 'c',\n 'ꜿ': 'c',\n 'ↄ': 'c',\n 'ⓓ': 'd',\n 'd': 'd',\n 'ḋ': 'd',\n 'ď': 'd',\n 'ḍ': 'd',\n 'ḑ': 'd',\n 'ḓ': 'd',\n 'ḏ': 'd',\n 'đ': 'd',\n 'ƌ': 'd',\n 'ɖ': 'd',\n 'ɗ': 'd',\n 'ꝺ': 'd',\n 'dz': 'dz',\n 'dž': 'dz',\n 'ⓔ': 'e',\n 'e': 'e',\n 'è': 'e',\n 'é': 'e',\n 'ê': 'e',\n 'ề': 'e',\n 'ế': 'e',\n 'ễ': 'e',\n 'ể': 'e',\n 'ẽ': 'e',\n 'ē': 'e',\n 'ḕ': 'e',\n 'ḗ': 'e',\n 'ĕ': 'e',\n 'ė': 'e',\n 'ë': 'e',\n 'ẻ': 'e',\n 'ě': 'e',\n 'ȅ': 'e',\n 'ȇ': 'e',\n 'ẹ': 'e',\n 'ệ': 'e',\n 'ȩ': 'e',\n 'ḝ': 'e',\n 'ę': 'e',\n 'ḙ': 'e',\n 'ḛ': 'e',\n 'ɇ': 'e',\n 'ɛ': 'e',\n 'ǝ': 'e',\n 'ⓕ': 'f',\n 'f': 'f',\n 'ḟ': 'f',\n 'ƒ': 'f',\n 'ꝼ': 'f',\n 'ⓖ': 'g',\n 'g': 'g',\n 'ǵ': 'g',\n 'ĝ': 'g',\n 'ḡ': 'g',\n 'ğ': 'g',\n 'ġ': 'g',\n 'ǧ': 'g',\n 'ģ': 'g',\n 'ǥ': 'g',\n 'ɠ': 'g',\n 'ꞡ': 'g',\n 'ᵹ': 'g',\n 'ꝿ': 'g',\n 'ⓗ': 'h',\n 'h': 'h',\n 'ĥ': 'h',\n 'ḣ': 'h',\n 'ḧ': 'h',\n 'ȟ': 'h',\n 'ḥ': 'h',\n 'ḩ': 'h',\n 'ḫ': 'h',\n 'ẖ': 'h',\n 'ħ': 'h',\n 'ⱨ': 'h',\n 'ⱶ': 'h',\n 'ɥ': 'h',\n 'ƕ': 'hv',\n 'ⓘ': 'i',\n 'i': 'i',\n 'ì': 'i',\n 'í': 'i',\n 'î': 'i',\n 'ĩ': 'i',\n 'ī': 'i',\n 'ĭ': 'i',\n 'ï': 'i',\n 'ḯ': 'i',\n 'ỉ': 'i',\n 'ǐ': 'i',\n 'ȉ': 'i',\n 'ȋ': 'i',\n 'ị': 'i',\n 'į': 'i',\n 'ḭ': 'i',\n 'ɨ': 'i',\n 'ı': 'i',\n 'ⓙ': 'j',\n 'j': 'j',\n 'ĵ': 'j',\n 'ǰ': 'j',\n 'ɉ': 'j',\n 'ⓚ': 'k',\n 'k': 'k',\n 'ḱ': 'k',\n 'ǩ': 'k',\n 'ḳ': 'k',\n 'ķ': 'k',\n 'ḵ': 'k',\n 'ƙ': 'k',\n 'ⱪ': 'k',\n 'ꝁ': 'k',\n 'ꝃ': 'k',\n 'ꝅ': 'k',\n 'ꞣ': 'k',\n 'ⓛ': 'l',\n 'l': 'l',\n 'ŀ': 'l',\n 'ĺ': 'l',\n 'ľ': 'l',\n 'ḷ': 'l',\n 'ḹ': 'l',\n 'ļ': 'l',\n 'ḽ': 'l',\n 'ḻ': 'l',\n 'ſ': 'l',\n 'ł': 'l',\n 'ƚ': 'l',\n 'ɫ': 'l',\n 'ⱡ': 'l',\n 'ꝉ': 'l',\n 'ꞁ': 'l',\n 'ꝇ': 'l',\n 'lj': 'lj',\n 'ⓜ': 'm',\n 'm': 'm',\n 'ḿ': 'm',\n 'ṁ': 'm',\n 'ṃ': 'm',\n 'ɱ': 'm',\n 'ɯ': 'm',\n 'ⓝ': 'n',\n 'n': 'n',\n 'ǹ': 'n',\n 'ń': 'n',\n 'ñ': 'n',\n 'ṅ': 'n',\n 'ň': 'n',\n 'ṇ': 'n',\n 'ņ': 'n',\n 'ṋ': 'n',\n 'ṉ': 'n',\n 'ƞ': 'n',\n 'ɲ': 'n',\n 'ʼn': 'n',\n 'ꞑ': 'n',\n 'ꞥ': 'n',\n 'nj': 'nj',\n 'ⓞ': 'o',\n 'o': 'o',\n 'ò': 'o',\n 'ó': 'o',\n 'ô': 'o',\n 'ồ': 'o',\n 'ố': 'o',\n 'ỗ': 'o',\n 'ổ': 'o',\n 'õ': 'o',\n 'ṍ': 'o',\n 'ȭ': 'o',\n 'ṏ': 'o',\n 'ō': 'o',\n 'ṑ': 'o',\n 'ṓ': 'o',\n 'ŏ': 'o',\n 'ȯ': 'o',\n 'ȱ': 'o',\n 'ö': 'o',\n 'ȫ': 'o',\n 'ỏ': 'o',\n 'ő': 'o',\n 'ǒ': 'o',\n 'ȍ': 'o',\n 'ȏ': 'o',\n 'ơ': 'o',\n 'ờ': 'o',\n 'ớ': 'o',\n 'ỡ': 'o',\n 'ở': 'o',\n 'ợ': 'o',\n 'ọ': 'o',\n 'ộ': 'o',\n 'ǫ': 'o',\n 'ǭ': 'o',\n 'ø': 'o',\n 'ǿ': 'o',\n 'ɔ': 'o',\n 'ꝋ': 'o',\n 'ꝍ': 'o',\n 'ɵ': 'o',\n 'ƣ': 'oi',\n 'ȣ': 'ou',\n 'ꝏ': 'oo',\n 'ⓟ': 'p',\n 'p': 'p',\n 'ṕ': 'p',\n 'ṗ': 'p',\n 'ƥ': 'p',\n 'ᵽ': 'p',\n 'ꝑ': 'p',\n 'ꝓ': 'p',\n 'ꝕ': 'p',\n 'ⓠ': 'q',\n 'q': 'q',\n 'ɋ': 'q',\n 'ꝗ': 'q',\n 'ꝙ': 'q',\n 'ⓡ': 'r',\n 'r': 'r',\n 'ŕ': 'r',\n 'ṙ': 'r',\n 'ř': 'r',\n 'ȑ': 'r',\n 'ȓ': 'r',\n 'ṛ': 'r',\n 'ṝ': 'r',\n 'ŗ': 'r',\n 'ṟ': 'r',\n 'ɍ': 'r',\n 'ɽ': 'r',\n 'ꝛ': 'r',\n 'ꞧ': 'r',\n 'ꞃ': 'r',\n 'ⓢ': 's',\n 's': 's',\n 'ß': 's',\n 'ś': 's',\n 'ṥ': 's',\n 'ŝ': 's',\n 'ṡ': 's',\n 'š': 's',\n 'ṧ': 's',\n 'ṣ': 's',\n 'ṩ': 's',\n 'ș': 's',\n 'ş': 's',\n 'ȿ': 's',\n 'ꞩ': 's',\n 'ꞅ': 's',\n 'ẛ': 's',\n 'ⓣ': 't',\n 't': 't',\n 'ṫ': 't',\n 'ẗ': 't',\n 'ť': 't',\n 'ṭ': 't',\n 'ț': 't',\n 'ţ': 't',\n 'ṱ': 't',\n 'ṯ': 't',\n 'ŧ': 't',\n 'ƭ': 't',\n 'ʈ': 't',\n 'ⱦ': 't',\n 'ꞇ': 't',\n 'ꜩ': 'tz',\n 'ⓤ': 'u',\n 'u': 'u',\n 'ù': 'u',\n 'ú': 'u',\n 'û': 'u',\n 'ũ': 'u',\n 'ṹ': 'u',\n 'ū': 'u',\n 'ṻ': 'u',\n 'ŭ': 'u',\n 'ü': 'u',\n 'ǜ': 'u',\n 'ǘ': 'u',\n 'ǖ': 'u',\n 'ǚ': 'u',\n 'ủ': 'u',\n 'ů': 'u',\n 'ű': 'u',\n 'ǔ': 'u',\n 'ȕ': 'u',\n 'ȗ': 'u',\n 'ư': 'u',\n 'ừ': 'u',\n 'ứ': 'u',\n 'ữ': 'u',\n 'ử': 'u',\n 'ự': 'u',\n 'ụ': 'u',\n 'ṳ': 'u',\n 'ų': 'u',\n 'ṷ': 'u',\n 'ṵ': 'u',\n 'ʉ': 'u',\n 'ⓥ': 'v',\n 'v': 'v',\n 'ṽ': 'v',\n 'ṿ': 'v',\n 'ʋ': 'v',\n 'ꝟ': 'v',\n 'ʌ': 'v',\n 'ꝡ': 'vy',\n 'ⓦ': 'w',\n 'w': 'w',\n 'ẁ': 'w',\n 'ẃ': 'w',\n 'ŵ': 'w',\n 'ẇ': 'w',\n 'ẅ': 'w',\n 'ẘ': 'w',\n 'ẉ': 'w',\n 'ⱳ': 'w',\n 'ⓧ': 'x',\n 'x': 'x',\n 'ẋ': 'x',\n 'ẍ': 'x',\n 'ⓨ': 'y',\n 'y': 'y',\n 'ỳ': 'y',\n 'ý': 'y',\n 'ŷ': 'y',\n 'ỹ': 'y',\n 'ȳ': 'y',\n 'ẏ': 'y',\n 'ÿ': 'y',\n 'ỷ': 'y',\n 'ẙ': 'y',\n 'ỵ': 'y',\n 'ƴ': 'y',\n 'ɏ': 'y',\n 'ỿ': 'y',\n 'ⓩ': 'z',\n 'z': 'z',\n 'ź': 'z',\n 'ẑ': 'z',\n 'ż': 'z',\n 'ž': 'z',\n 'ẓ': 'z',\n 'ẕ': 'z',\n 'ƶ': 'z',\n 'ȥ': 'z',\n 'ɀ': 'z',\n 'ⱬ': 'z',\n 'ꝣ': 'z',\n 'Ά': 'Α',\n 'Έ': 'Ε',\n 'Ή': 'Η',\n 'Ί': 'Ι',\n 'Ϊ': 'Ι',\n 'Ό': 'Ο',\n 'Ύ': 'Υ',\n 'Ϋ': 'Υ',\n 'Ώ': 'Ω',\n 'ά': 'α',\n 'έ': 'ε',\n 'ή': 'η',\n 'ί': 'ι',\n 'ϊ': 'ι',\n 'ΐ': 'ι',\n 'ό': 'ο',\n 'ύ': 'υ',\n 'ϋ': 'υ',\n 'ΰ': 'υ',\n 'ω': 'ω',\n 'ς': 'σ'\n };\n\n // Copied from Select2\n\n function stripDiacritics(text) {\n // Used 'uni range + named function' from http://jsperf.com/diacritics/18\n function match(a) {\n return DIACRITICS[a] || a;\n }\n\n return ('' + text).replace(/[^\\u0000-\\u007E]/g, match);\n }\n\n function defaultMatcher(value, text) {\n return text === '' || stripDiacritics(value).toUpperCase().indexOf(stripDiacritics(text).toUpperCase()) > -1;\n }\n});","define('ember-resolver/container-debug-adapter', ['exports', 'ember', 'ember-resolver/utils/module-registry'], function (exports, _ember, _emberResolverUtilsModuleRegistry) {\n 'use strict';\n\n var ContainerDebugAdapter = _ember['default'].ContainerDebugAdapter;\n\n var ModulesContainerDebugAdapter = null;\n\n function getPod(type, key, prefix) {\n var match = key.match(new RegExp('^/?' + prefix + '/(.+)/' + type + '$'));\n if (match) {\n return match[1];\n }\n }\n\n // Support Ember < 1.5-beta.4\n // TODO: Remove this after 1.5.0 is released\n if (typeof ContainerDebugAdapter !== 'undefined') {\n\n /*\n * This module defines a subclass of Ember.ContainerDebugAdapter that adds two\n * important features:\n *\n * 1) is able provide injections to classes that implement `extend`\n * (as is typical with Ember).\n */\n\n ModulesContainerDebugAdapter = ContainerDebugAdapter.extend({\n _moduleRegistry: null,\n\n init: function init() {\n this._super.apply(this, arguments);\n\n if (!this._moduleRegistry) {\n this._moduleRegistry = new _emberResolverUtilsModuleRegistry['default']();\n }\n },\n\n /**\n The container of the application being debugged.\n This property will be injected\n on creation.\n @property container\n @default null\n */\n\n /**\n The resolver instance of the application\n being debugged. This property will be injected\n on creation.\n @property resolver\n @default null\n */\n\n /**\n Returns true if it is possible to catalog a list of available\n classes in the resolver for a given type.\n @method canCatalogEntriesByType\n @param {string} type The type. e.g. \"model\", \"controller\", \"route\"\n @return {boolean} whether a list is available for this type.\n */\n canCatalogEntriesByType: function canCatalogEntriesByType() /* type */{\n return true;\n },\n\n /**\n Returns the available classes a given type.\n @method catalogEntriesByType\n @param {string} type The type. e.g. \"model\", \"controller\", \"route\"\n @return {Array} An array of classes.\n */\n catalogEntriesByType: function catalogEntriesByType(type) {\n var moduleNames = this._moduleRegistry.moduleNames();\n var types = _ember['default'].A();\n\n var prefix = this.namespace.modulePrefix;\n\n for (var i = 0, l = moduleNames.length; i < l; i++) {\n var key = moduleNames[i];\n\n if (key.indexOf(type) !== -1) {\n // Check if it's a pod module\n var name = getPod(type, key, this.namespace.podModulePrefix || prefix);\n if (!name) {\n // Not pod\n name = key.split(type + 's/').pop();\n\n // Support for different prefix (such as ember-cli addons).\n // Uncomment the code below when\n // https://github.com/ember-cli/ember-resolver/pull/80 is merged.\n\n //var match = key.match('^/?(.+)/' + type);\n //if (match && match[1] !== prefix) {\n // Different prefix such as an addon\n //name = match[1] + '@' + name;\n //}\n }\n types.addObject(name);\n }\n }\n return types;\n }\n });\n }\n\n exports['default'] = ModulesContainerDebugAdapter;\n});","define('ember-resolver/index', ['exports', 'ember-resolver/resolver'], function (exports, _emberResolverResolver) {\n 'use strict';\n\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function get() {\n return _emberResolverResolver['default'];\n }\n });\n});","define('ember-resolver/resolver', ['exports', 'ember', 'ember-resolver/utils/module-registry', 'ember-resolver/utils/class-factory', 'ember-resolver/utils/make-dictionary'], function (exports, _ember, _emberResolverUtilsModuleRegistry, _emberResolverUtilsClassFactory, _emberResolverUtilsMakeDictionary) {\n /*globals require */\n\n 'use strict';\n\n /*\n * This module defines a subclass of Ember.DefaultResolver that adds two\n * important features:\n *\n * 1) The resolver makes the container aware of es6 modules via the AMD\n * output. The loader's _moduleEntries is consulted so that classes can be\n * resolved directly via the module loader, without needing a manual\n * `import`.\n * 2) is able to provide injections to classes that implement `extend`\n * (as is typical with Ember).\n */\n\n var _Ember$String = _ember['default'].String;\n var underscore = _Ember$String.underscore;\n var classify = _Ember$String.classify;\n var get = _ember['default'].get;\n var DefaultResolver = _ember['default'].DefaultResolver;\n\n function parseName(fullName) {\n /*jshint validthis:true */\n\n if (fullName.parsedName === true) {\n return fullName;\n }\n\n var prefix, type, name;\n var fullNameParts = fullName.split('@');\n\n // HTMLBars uses helper:@content-helper which collides\n // with ember-cli namespace detection.\n // This will be removed in a future release of HTMLBars.\n if (fullName !== 'helper:@content-helper' && fullNameParts.length === 2) {\n var prefixParts = fullNameParts[0].split(':');\n\n if (prefixParts.length === 2) {\n prefix = prefixParts[1];\n type = prefixParts[0];\n name = fullNameParts[1];\n } else {\n var nameParts = fullNameParts[1].split(':');\n\n prefix = fullNameParts[0];\n type = nameParts[0];\n name = nameParts[1];\n }\n } else {\n fullNameParts = fullName.split(':');\n type = fullNameParts[0];\n name = fullNameParts[1];\n }\n\n var fullNameWithoutType = name;\n var namespace = get(this, 'namespace');\n var root = namespace;\n\n return {\n parsedName: true,\n fullName: fullName,\n prefix: prefix || this.prefix({ type: type }),\n type: type,\n fullNameWithoutType: fullNameWithoutType,\n name: name,\n root: root,\n resolveMethodName: \"resolve\" + classify(type)\n };\n }\n\n function resolveOther(parsedName) {\n /*jshint validthis:true */\n\n _ember['default'].assert('`modulePrefix` must be defined', this.namespace.modulePrefix);\n\n var normalizedModuleName = this.findModuleName(parsedName);\n\n if (normalizedModuleName) {\n var defaultExport = this._extractDefaultExport(normalizedModuleName, parsedName);\n\n if (defaultExport === undefined) {\n throw new Error(\" Expected to find: '\" + parsedName.fullName + \"' within '\" + normalizedModuleName + \"' but got 'undefined'. Did you forget to `export default` within '\" + normalizedModuleName + \"'?\");\n }\n\n if (this.shouldWrapInClassFactory(defaultExport, parsedName)) {\n defaultExport = (0, _emberResolverUtilsClassFactory['default'])(defaultExport);\n }\n\n return defaultExport;\n } else {\n return this._super(parsedName);\n }\n }\n\n // Ember.DefaultResolver docs:\n // https://github.com/emberjs/ember.js/blob/master/packages/ember-application/lib/system/resolver.js\n var Resolver = DefaultResolver.extend({\n resolveOther: resolveOther,\n parseName: parseName,\n resolveTemplate: resolveOther,\n pluralizedTypes: null,\n moduleRegistry: null,\n\n makeToString: function makeToString(factory, fullName) {\n return '' + this.namespace.modulePrefix + '@' + fullName + ':';\n },\n\n shouldWrapInClassFactory: function shouldWrapInClassFactory() /* module, parsedName */{\n return false;\n },\n\n init: function init() {\n this._super();\n this.moduleBasedResolver = true;\n\n if (!this._moduleRegistry) {\n this._moduleRegistry = new _emberResolverUtilsModuleRegistry['default']();\n }\n\n this._normalizeCache = (0, _emberResolverUtilsMakeDictionary['default'])();\n\n this.pluralizedTypes = this.pluralizedTypes || (0, _emberResolverUtilsMakeDictionary['default'])();\n\n if (!this.pluralizedTypes.config) {\n this.pluralizedTypes.config = 'config';\n }\n\n this._deprecatedPodModulePrefix = false;\n },\n\n normalize: function normalize(fullName) {\n return this._normalizeCache[fullName] || (this._normalizeCache[fullName] = this._normalize(fullName));\n },\n\n _normalize: function _normalize(fullName) {\n // replace `.` with `/` in order to make nested controllers work in the following cases\n // 1. `needs: ['posts/post']`\n // 2. `{{render \"posts/post\"}}`\n // 3. `this.render('posts/post')` from Route\n var split = fullName.split(':');\n if (split.length > 1) {\n return split[0] + ':' + _ember['default'].String.dasherize(split[1].replace(/\\./g, '/'));\n } else {\n return fullName;\n }\n },\n\n pluralize: function pluralize(type) {\n return this.pluralizedTypes[type] || (this.pluralizedTypes[type] = type + 's');\n },\n\n podBasedLookupWithPrefix: function podBasedLookupWithPrefix(podPrefix, parsedName) {\n var fullNameWithoutType = parsedName.fullNameWithoutType;\n\n if (parsedName.type === 'template') {\n fullNameWithoutType = fullNameWithoutType.replace(/^components\\//, '');\n }\n\n return podPrefix + '/' + fullNameWithoutType + '/' + parsedName.type;\n },\n\n podBasedModuleName: function podBasedModuleName(parsedName) {\n var podPrefix = this.namespace.podModulePrefix || this.namespace.modulePrefix;\n\n return this.podBasedLookupWithPrefix(podPrefix, parsedName);\n },\n\n podBasedComponentsInSubdir: function podBasedComponentsInSubdir(parsedName) {\n var podPrefix = this.namespace.podModulePrefix || this.namespace.modulePrefix;\n podPrefix = podPrefix + '/components';\n\n if (parsedName.type === 'component' || parsedName.fullNameWithoutType.match(/^components/)) {\n return this.podBasedLookupWithPrefix(podPrefix, parsedName);\n }\n },\n\n resolveEngine: function resolveEngine(parsedName) {\n var engineName = parsedName.fullNameWithoutType;\n var engineModule = engineName + '/engine';\n\n if (this._moduleRegistry.has(engineModule)) {\n return this._extractDefaultExport(engineModule);\n }\n },\n\n resolveRouteMap: function resolveRouteMap(parsedName) {\n var engineName = parsedName.fullNameWithoutType;\n var engineRoutesModule = engineName + '/routes';\n\n if (this._moduleRegistry.has(engineRoutesModule)) {\n var routeMap = this._extractDefaultExport(engineRoutesModule);\n\n _ember['default'].assert('The route map for ' + engineName + ' should be wrapped by \\'buildRoutes\\' before exporting.', routeMap.isRouteMap);\n\n return routeMap;\n }\n },\n\n mainModuleName: function mainModuleName(parsedName) {\n // if router:main or adapter:main look for a module with just the type first\n var tmpModuleName = parsedName.prefix + '/' + parsedName.type;\n\n if (parsedName.fullNameWithoutType === 'main') {\n return tmpModuleName;\n }\n },\n\n defaultModuleName: function defaultModuleName(parsedName) {\n return parsedName.prefix + '/' + this.pluralize(parsedName.type) + '/' + parsedName.fullNameWithoutType;\n },\n\n prefix: function prefix(parsedName) {\n var tmpPrefix = this.namespace.modulePrefix;\n\n if (this.namespace[parsedName.type + 'Prefix']) {\n tmpPrefix = this.namespace[parsedName.type + 'Prefix'];\n }\n\n return tmpPrefix;\n },\n\n /**\n A listing of functions to test for moduleName's based on the provided\n `parsedName`. This allows easy customization of additional module based\n lookup patterns.\n @property moduleNameLookupPatterns\n @returns {Ember.Array}\n */\n moduleNameLookupPatterns: _ember['default'].computed(function () {\n return [this.podBasedModuleName, this.podBasedComponentsInSubdir, this.mainModuleName, this.defaultModuleName];\n }),\n\n findModuleName: function findModuleName(parsedName, loggingDisabled) {\n var moduleNameLookupPatterns = this.get('moduleNameLookupPatterns');\n var moduleName;\n\n for (var index = 0, _length = moduleNameLookupPatterns.length; index < _length; index++) {\n var item = moduleNameLookupPatterns[index];\n\n var tmpModuleName = item.call(this, parsedName);\n\n // allow treat all dashed and all underscored as the same thing\n // supports components with dashes and other stuff with underscores.\n if (tmpModuleName) {\n tmpModuleName = this.chooseModuleName(tmpModuleName);\n }\n\n if (tmpModuleName && this._moduleRegistry.has(tmpModuleName)) {\n moduleName = tmpModuleName;\n }\n\n if (!loggingDisabled) {\n this._logLookup(moduleName, parsedName, tmpModuleName);\n }\n\n if (moduleName) {\n return moduleName;\n }\n }\n },\n\n chooseModuleName: function chooseModuleName(moduleName) {\n var underscoredModuleName = underscore(moduleName);\n\n if (moduleName !== underscoredModuleName && this._moduleRegistry.has(moduleName) && this._moduleRegistry.has(underscoredModuleName)) {\n throw new TypeError(\"Ambiguous module names: `\" + moduleName + \"` and `\" + underscoredModuleName + \"`\");\n }\n\n if (this._moduleRegistry.has(moduleName)) {\n return moduleName;\n } else if (this._moduleRegistry.has(underscoredModuleName)) {\n return underscoredModuleName;\n } else {\n // workaround for dasherized partials:\n // something/something/-something => something/something/_something\n var partializedModuleName = moduleName.replace(/\\/-([^\\/]*)$/, '/_$1');\n\n if (this._moduleRegistry.has(partializedModuleName)) {\n _ember['default'].deprecate('Modules should not contain underscores. ' + 'Attempted to lookup \"' + moduleName + '\" which ' + 'was not found. Please rename \"' + partializedModuleName + '\" ' + 'to \"' + moduleName + '\" instead.', false, { id: 'ember-resolver.underscored-modules', until: '3.0.0' });\n\n return partializedModuleName;\n } else {\n return moduleName;\n }\n }\n },\n\n // used by Ember.DefaultResolver.prototype._logLookup\n lookupDescription: function lookupDescription(fullName) {\n var parsedName = this.parseName(fullName);\n\n var moduleName = this.findModuleName(parsedName, true);\n\n return moduleName;\n },\n\n // only needed until 1.6.0-beta.2 can be required\n _logLookup: function _logLookup(found, parsedName, description) {\n if (!_ember['default'].ENV.LOG_MODULE_RESOLVER && !parsedName.root.LOG_RESOLVER) {\n return;\n }\n\n var symbol, padding;\n\n if (found) {\n symbol = '[✓]';\n } else {\n symbol = '[ ]';\n }\n\n if (parsedName.fullName.length > 60) {\n padding = '.';\n } else {\n padding = new Array(60 - parsedName.fullName.length).join('.');\n }\n\n if (!description) {\n description = this.lookupDescription(parsedName);\n }\n\n _ember['default'].Logger.info(symbol, parsedName.fullName, padding, description);\n },\n\n knownForType: function knownForType(type) {\n var moduleKeys = this._moduleRegistry.moduleNames();\n\n var items = (0, _emberResolverUtilsMakeDictionary['default'])();\n for (var index = 0, length = moduleKeys.length; index < length; index++) {\n var moduleName = moduleKeys[index];\n var fullname = this.translateToContainerFullname(type, moduleName);\n\n if (fullname) {\n items[fullname] = true;\n }\n }\n\n return items;\n },\n\n translateToContainerFullname: function translateToContainerFullname(type, moduleName) {\n var prefix = this.prefix({ type: type });\n\n // Note: using string manipulation here rather than regexes for better performance.\n // pod modules\n // '^' + prefix + '/(.+)/' + type + '$'\n var podPrefix = prefix + '/';\n var podSuffix = '/' + type;\n var start = moduleName.indexOf(podPrefix);\n var end = moduleName.indexOf(podSuffix);\n\n if (start === 0 && end === moduleName.length - podSuffix.length && moduleName.length > podPrefix.length + podSuffix.length) {\n return type + ':' + moduleName.slice(start + podPrefix.length, end);\n }\n\n // non-pod modules\n // '^' + prefix + '/' + pluralizedType + '/(.+)$'\n var pluralizedType = this.pluralize(type);\n var nonPodPrefix = prefix + '/' + pluralizedType + '/';\n\n if (moduleName.indexOf(nonPodPrefix) === 0 && moduleName.length > nonPodPrefix.length) {\n return type + ':' + moduleName.slice(nonPodPrefix.length);\n }\n },\n\n _extractDefaultExport: function _extractDefaultExport(normalizedModuleName) {\n var module = require(normalizedModuleName, null, null, true /* force sync */);\n\n if (module && module['default']) {\n module = module['default'];\n }\n\n return module;\n }\n });\n\n Resolver.reopenClass({\n moduleBasedResolver: true\n });\n\n exports['default'] = Resolver;\n});","define('ember-resolver/utils/class-factory', ['exports'], function (exports) {\n 'use strict';\n\n exports['default'] = classFactory;\n\n function classFactory(klass) {\n return {\n create: function create(injections) {\n if (typeof klass.extend === 'function') {\n return klass.extend(injections);\n } else {\n return klass;\n }\n }\n };\n }\n});","define(\"ember-resolver/utils/create\", [\"exports\", \"ember\"], function (exports, _ember) {\n \"use strict\";\n\n var create = Object.create || _ember[\"default\"].create;\n if (!(create && !create(null).hasOwnProperty)) {\n throw new Error(\"This browser does not support Object.create(null), please polyfil with es5-sham: http://git.io/yBU2rg\");\n }\n\n exports[\"default\"] = create;\n});","define('ember-resolver/utils/make-dictionary', ['exports', 'ember-resolver/utils/create'], function (exports, _emberResolverUtilsCreate) {\n 'use strict';\n\n exports['default'] = makeDictionary;\n\n function makeDictionary() {\n var cache = (0, _emberResolverUtilsCreate['default'])(null);\n cache['_dict'] = null;\n delete cache['_dict'];\n return cache;\n }\n});","define('ember-resolver/utils/module-registry', ['exports', 'ember'], function (exports, _ember) {\n /*globals requirejs, require */\n\n 'use strict';\n\n if (typeof requirejs.entries === 'undefined') {\n requirejs.entries = requirejs._eak_seen;\n }\n\n function ModuleRegistry(entries) {\n this._entries = entries || requirejs.entries;\n }\n\n ModuleRegistry.prototype.moduleNames = function ModuleRegistry_moduleNames() {\n return (Object.keys || _ember['default'].keys)(this._entries);\n };\n\n ModuleRegistry.prototype.has = function ModuleRegistry_has(moduleName) {\n return moduleName in this._entries;\n };\n\n ModuleRegistry.prototype.get = function ModuleRegistry_get(moduleName) {\n var exportName = arguments.length <= 1 || arguments[1] === undefined ? 'default' : arguments[1];\n\n var module = require(moduleName);\n return module && module[exportName];\n };\n\n exports['default'] = ModuleRegistry;\n});","define('ember-tooltips/components/tooltip-on-parent', ['exports', 'ember', 'ember-tooltips/templates/components/tooltip-on-parent'], function (exports, _ember, _emberTooltipsTemplatesComponentsTooltipOnParent) {\n 'use strict';\n\n var computed = _ember['default'].computed;\n var run = _ember['default'].run;\n var get = _ember['default'].get;\n\n exports['default'] = _ember['default'].Component.extend({\n attributeBindings: ['style'],\n layout: _emberTooltipsTemplatesComponentsTooltipOnParent['default'],\n\n style: computed(function () {\n return _ember['default'].String.htmlSafe('display:none;');\n }),\n\n init: function init() {\n var _this = this;\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n this._super(args);\n\n run.schedule('afterRender', function () {\n var parentView = _this.get('parentView');\n\n if (!parentView) {\n console.warn('No parentView found');\n } else if (parentView.renderTooltip) {\n parentView.renderTooltip(_this);\n } else {\n console.warn('No renderTooltip method found on the parent view of the {{tooltip-on-parent}} component');\n }\n\n _this.remove();\n });\n }\n\n });\n});","define('ember-tooltips/mixins/components/tooltips', ['exports', 'ember', 'ember-tooltips/utils/render-tooltip'], function (exports, _ember, _emberTooltipsUtilsRenderTooltip) {\n 'use strict';\n\n var on = _ember['default'].on;\n var run = _ember['default'].run;\n var Tooltip = window.Tooltip;\n\n exports['default'] = _ember['default'].Mixin.create({\n\n /**\n The tooltip object\n @property tooltip\n @type Object\n */\n\n tooltip: null,\n\n /**\n A list of Tooltip properties currently supported\n by this addon\n @property tooltipSupportedProperties\n @type Array\n */\n\n tooltipSupportedProperties: ['auto', 'content', 'duration', 'delay', 'delayOnChange', 'effectClass', 'event', 'hideOn', 'place', 'showOn', 'spacing', 'tabIndex', 'typeClass', 'visibility'],\n\n /* Tooltip options - see http://darsa.in/tooltip/ */\n\n tooltipAuto: true,\n tooltipContent: null,\n tooltipDuration: null,\n tooltipEffectClass: 'slide', // fade, grow, slide, null\n tooltipEvent: 'hover', // hover, click, focus, ready, or none\n tooltipHideOn: null,\n tooltipPlace: 'top',\n tooltipShowOn: null,\n tooltipSpacing: 10,\n tooltipDelay: 0,\n tooltipDelayOnChange: true, // tooltips should listen to the above `delay` option by default\n tooltipTabIndex: 0, // A positive integer (to enable) or -1 (to disable)\n tooltipTypeClass: null,\n tooltipVisibility: null, // for manual-mode triggering\n\n /**\n Removes a tooltip from the DOM if the element it is attached\n to is destroyed.\n @method destroyTooltip\n */\n\n destroyTooltip: on('willDestroyElement', function () {\n var tooltip = this.get('tooltip');\n\n if (tooltip && tooltip instanceof Tooltip) {\n tooltip.effect(null); // Remove animation\n tooltip.detach(); // Remove the tooltip from the document\n this.$().off(); // Remove all event listeners\n }\n\n /* Remove observer, even if it was never added */\n\n this.removeObserver('tooltipVisibility', this, this._tooltipVisibilityDidChange);\n this.removeObserver('tooltipContent', this, this._tooltipContentDidChange);\n }),\n\n /**\n Adds a tooltip to the current component using the values of the tooltip\n properties on this component's helper or, if a `{{tooltip-on-parent}}` component is\n passed, the values set on that component.\n In the latter case, the `{{tooltip-on-parent}}` block template will\n be used for the tooltip content.\n ## Example 1 - Setting values on a component\n ```hbs\n {{#some-component tooltipContent='This will show' tooltipPlace='right'}}\n Hover over me\n {{/some-component}}\n ```\n ## Example 2 - Using a child component\n ```hbs\n {{#some-component}}\n {{#tooltip-on-parent place='right'}}\n This will show\n {{/tooltip-on-parent}}\n Hover over me\n {{/some-component}}\n ```\n Usually you won't have to call the `renderTooltip` method directly but it's still\n made publically available. In the above examples, the components handle calling\n this `renderTooltip()` method at the correct time.\n Supported options are in the format tooltip{$capitalizedProperty} where\n capitalizedProperty is each property, capitalized, in tooltipSupportedProperties.\n @method renderTooltip\n @param [maybeTooltipComponent] An optionally-passed component for a `{{tooltip-on-parent}}` class\n */\n\n renderTooltip: on('didInsertElement', function (maybeTooltipComponent) {\n var componentWasPassed = _ember['default'].typeOf(maybeTooltipComponent) === 'instance';\n var component = componentWasPassed ? maybeTooltipComponent : _ember['default'].Object.create({});\n var renderContext = componentWasPassed ? component : this;\n\n var content = this.get('tooltipContent');\n var tooltip = undefined,\n tooltipOptions = undefined;\n\n var keys = Object.keys(this);\n var hasTooltipContentProperty = _ember['default'].$.inArray('tooltipContent', keys) !== -1;\n\n if (componentWasPassed) {\n var componentContent = component.get('content');\n\n if (componentContent) {\n content = componentContent;\n } else {\n content = component.get('element').innerHTML;\n }\n }\n\n if (!content && !hasTooltipContentProperty) {\n return;\n }\n\n tooltipOptions = {\n content: content\n };\n\n this.get('tooltipSupportedProperties').forEach(function (property) {\n\n /* Ignore content because we dealt with it already */\n\n if (property === 'content') {\n return;\n }\n\n var capitalizedProperty = _ember['default'].String.capitalize(property);\n\n tooltipOptions[property] = component.get(property) || this.get('tooltip' + capitalizedProperty);\n }, this);\n\n tooltip = (0, _emberTooltipsUtilsRenderTooltip['default'])(this.get('element'), tooltipOptions, renderContext);\n\n this.set('tooltip', tooltip);\n\n /* Bind observer if tooltipContent changes */\n\n this.addObserver('tooltipContent', this, this._tooltipContentDidChange);\n\n /* Bind observer if in manual-triggering mode */\n\n if (tooltipOptions.event === 'manual' || tooltipOptions.event === 'none') {\n if (componentWasPassed) {\n\n /* Keep track of child tooltip component */\n\n this.set('tooltipChildComponent', component);\n\n /* Turn 'tooltipVisibility' into a computed property, reading\n from child tooltip component's 'visibility' option */\n\n _ember['default'].defineProperty(this, 'tooltipVisibility', _ember['default'].computed.reads('tooltipChildComponent.visibility'));\n }\n\n this.addObserver('tooltipVisibility', this, this._tooltipVisibilityDidChange);\n this._tooltipVisibilityDidChange();\n }\n }),\n\n /**\n Updates the content value of the tooltip with value of 'tooltipContent'.\n @method _tooltipContentDidChange\n @private\n */\n\n _tooltipContentDidChange: function _tooltipContentDidChange() {\n var tooltip = this.get('tooltip');\n\n if (tooltip) {\n var tooltipContent = this.get('tooltipContent');\n if (tooltipContent instanceof _ember['default'].Handlebars.SafeString) {\n // Convert SafeString to regular string\n tooltipContent = tooltipContent.toString();\n }\n tooltip.content(tooltipContent);\n }\n },\n\n /**\n Opens or closes tooltip based on value of 'tooltipVisibility'.\n Only used when event is 'manual'.\n @method _tooltipVisibilityDidChange\n @private\n */\n\n _tooltipVisibilityDidChange: function _tooltipVisibilityDidChange() {\n var tooltip = this.get('tooltip');\n\n run.cancel(this._delayTimer);\n if (this.get('tooltipVisibility')) {\n this._delayTimer = run.later(tooltip, 'show', this.get('tooltipDelay'));\n } else {\n tooltip.hide();\n }\n },\n\n /**\n Call this method on any component to attach tooltips to all elements in its\n template that have a `.tooltip` class. Tooltip options are set using\n data attributes.\n ```hbs\n {{!--app/templates/components/some-widget.hbs--}}\n \n Hover over me!\n
\n ```\n ```js\n // app/components/some-widget.js\n export default Ember.Component.extend({\n renderTooltipsInTemplate: function() {\n this.renderTooltip();\n }.on('didInsertElement'),\n });\n ```\n Supported options are in the format data-tooltip-{$dasherizedProperty} where\n dasherizedProperty is each property, dasherized, in tooltipSupportedProperties.\n @method renderChildTooltips\n */\n\n renderChildTooltips: function renderChildTooltips() {\n var _this = this;\n var tooltipSupportedProperties = this.get('tooltipSupportedProperties');\n\n _ember['default'].run.scheduleOnce('render', this, function () {\n var tooltipOptions = {};\n\n this.$().find('.has-tooltip').each(function () {\n var $element = _ember['default'].$(this);\n\n tooltipSupportedProperties.forEach(function (property) {\n var capitalizedProperty = _ember['default'].String.capitalize(property);\n var dasherizedProperty = _ember['default'].String.dasherize(property);\n var value = $element.data('tooltip-' + dasherizedProperty);\n\n tooltipOptions[property] = value || _this.get('tooltip' + capitalizedProperty);\n }, this);\n\n (0, _emberTooltipsUtilsRenderTooltip['default'])(this, tooltipOptions);\n });\n });\n }\n\n });\n});","define(\"ember-tooltips/templates/components/tooltip-on-parent\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 2,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ember-tooltips/templates/components/tooltip-on-parent.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"content\", \"yield\", [\"loc\", [null, [1, 0], [1, 9]]]]],\n locals: [],\n templates: []\n };\n })());\n});","define('ember-tooltips/utils/render-tooltip', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports['default'] = renderTooltip;\n\n var Tooltip = window.Tooltip;\n var $ = _ember['default'].$;\n var run = _ember['default'].run;\n var SafeString = _ember['default'].Handlebars.SafeString;\n\n var tooltipIndex = 1;\n\n /**\n A utility to attach a tooltip to a DOM element.\n \n @submodule utils\n @method renderTooltip\n @param {Element} domElement The DOM element, not jQuery element, to attach the tooltip to\n @param {Object} options The tooltip options to render the tooltip with\n */\n function renderTooltip(domElement, options, context) {\n\n _ember['default'].assert('You must pass a DOM element as the first argument to the renderTooltip util', !domElement || domElement && !!domElement.tagName);\n\n var $domElement = $(domElement);\n var parsedOptions = parseTooltipOptions(options);\n var content = parsedOptions.content;\n var duration = parsedOptions.duration;\n var event = parsedOptions.event;\n var hideOn = parsedOptions.hideOn;\n var tabIndex = parsedOptions.tabIndex;\n var showOn = parsedOptions.showOn;\n var delay = parsedOptions.delay;\n var delayOnChange = parsedOptions.delayOnChange;\n\n var tooltipId = 'tooltip-' + tooltipIndex;\n\n var $tooltip = undefined,\n tooltip = undefined;\n\n /**\n @method setTooltipVisibility\n @private\n */\n\n function setTooltipVisibility(shouldShow) {\n\n /* We debounce to avoid focus causing issues\n when showOn and hideOn are the same event */\n\n run.debounce(function () {\n\n run.cancel(tooltip._delayTimer);\n\n /* If we're setting visibility to the value\n it already is, do nothing... */\n\n if (tooltip.hidden === shouldShow) {\n return;\n }\n\n if (context && context.isDestroying) {\n return;\n }\n\n /* Clean previously queued removal (if present) */\n run.cancel(tooltip._hideTimer);\n\n if (shouldShow) {\n\n var showTooltipDelay = delay;\n if (!delayOnChange) {\n // If the `delayOnChange` property is set to false, we don't want to delay opening this tooltip if there is\n // already a tooltip visible in the DOM. Check that here and adjust the delay as needed.\n var visibleTooltips = _ember['default'].$('.tooltip').length;\n showTooltipDelay = visibleTooltips ? 0 : delay;\n }\n\n tooltip._delayTimer = run.later(function () {\n tooltip.show();\n $tooltip.attr('aria-hidden', false);\n if (context) {\n context.set('tooltipVisibility', true);\n }\n $domElement.attr('aria-describedby', tooltipId);\n if (duration) {\n /* Hide tooltip after specified duration */\n var hideTimer = run.later(tooltip, 'hide', duration);\n\n /* Save timer ID for cancelling should an event\n hide the tooltop before the duration */\n tooltip._hideTimer = hideTimer;\n }\n }, showTooltipDelay);\n } else {\n tooltip.hide();\n $tooltip.attr('aria-hidden', true);\n if (context) {\n context.set('tooltipVisibility', false);\n }\n $domElement.removeAttr('aria-describedby');\n }\n }, 150);\n }\n\n /**\n @method parseTooltipOptions\n @private\n Manipulate the options object\n */\n\n function parseTooltipOptions() {\n var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var newOptions = options;\n var content = newOptions.content;\n var duration = newOptions.duration;\n var event = newOptions.event;\n var tabIndex = newOptions.tabIndex;\n var typeClass = newOptions.typeClass;\n var delay = newOptions.delay;\n\n /* Prefix type class */\n\n if (typeClass) {\n newOptions.typeClass = 'tooltip-' + typeClass;\n }\n\n /* Set the correct hide and show events */\n\n if (!newOptions.showOn) {\n if (event === 'hover') {\n newOptions.showOn = 'mouseenter';\n } else {\n newOptions.showOn = event;\n }\n }\n\n if (!newOptions.hideOn) {\n if (event === 'hover') {\n newOptions.hideOn = 'mouseleave';\n } else if (event === 'focus') {\n newOptions.hideOn = 'blur';\n } else if (event === 'ready') {\n newOptions.hideOn = null;\n } else {\n newOptions.hideOn = event;\n }\n }\n\n /* If duration is passed as a string, make it a number */\n\n if (duration && typeof duration === 'string') {\n var cleanDuration = parseInt(duration, 10);\n\n /* Remove invalid parseInt results */\n\n if (isNaN(cleanDuration) || !isFinite(cleanDuration)) {\n cleanDuration = null;\n }\n\n newOptions.duration = cleanDuration;\n }\n\n if (delay && typeof delay === 'string') {\n var cleanDelay = parseInt(delay, 10);\n\n /* Remove invalid parseInt results */\n\n if (isNaN(cleanDelay) || !isFinite(cleanDelay)) {\n cleanDelay = 0;\n }\n\n newOptions.delay = cleanDelay;\n }\n /* Make tab index a string */\n\n if (typeof tabIndex === 'number') {\n newOptions.tabIndex = tabIndex.toString();\n } else if (!tabIndex) {\n newOptions.tabIndex = '-1';\n }\n\n /* Make sure content can be passed as a SafeString */\n\n if (content instanceof SafeString) {\n newOptions.content = content.toString();\n }\n\n return newOptions;\n }\n\n /* First, create the tooltip and set the variables */\n\n tooltip = new Tooltip(content, parsedOptions);\n $tooltip = $(tooltip.element);\n\n tooltip.attach(domElement);\n\n if (event !== 'manual' && event !== 'none') {\n\n /* If show and hide are the same (e.g. click), toggle\n the visibility */\n\n if (showOn === hideOn) {\n $domElement.on(showOn, function () {\n setTooltipVisibility(!!tooltip.hidden);\n });\n } else {\n\n /* Else, add the show and hide events individually */\n\n if (showOn !== 'none') {\n $domElement.on(showOn, function () {\n setTooltipVisibility(true);\n });\n }\n\n if (hideOn !== 'none') {\n $domElement.on(hideOn, function () {\n setTooltipVisibility(false);\n });\n }\n }\n\n /* Hide and show the tooltip on focus and escape\n for acessibility */\n\n if (event !== 'focus') {\n $domElement.focusin(function () {\n setTooltipVisibility(true);\n });\n\n $domElement.focusout(function () {\n setTooltipVisibility(false);\n });\n }\n\n $domElement.keydown(function (keyEvent) {\n if (keyEvent.which === 27) {\n setTooltipVisibility(false);\n keyEvent.preventDefault();\n\n return false;\n }\n });\n }\n\n /* Setup ARIA attributes for acessibility */\n\n $tooltip.attr({\n id: tooltipId,\n role: 'tooltip'\n });\n\n $domElement.attr({\n tabindex: $domElement.attr('tabindex') || tabIndex\n });\n\n // title: $domElement.attr('title') || content.toString(), // Removed for #9\n tooltipIndex++;\n\n return tooltip;\n }\n});","define('ember-truth-helpers/helpers/and', ['exports', 'ember-truth-helpers/utils/truth-convert'], function (exports, _emberTruthHelpersUtilsTruthConvert) {\n 'use strict';\n\n exports.andHelper = andHelper;\n\n function andHelper(params) {\n for (var i = 0, len = params.length; i < len; i++) {\n if ((0, _emberTruthHelpersUtilsTruthConvert['default'])(params[i]) === false) {\n return params[i];\n }\n }\n return params[params.length - 1];\n }\n});","define(\"ember-truth-helpers/helpers/equal\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.equalHelper = equalHelper;\n\n function equalHelper(params) {\n return params[0] === params[1];\n }\n});","define('ember-truth-helpers/helpers/gt', ['exports'], function (exports) {\n 'use strict';\n\n exports.gtHelper = gtHelper;\n\n function gtHelper(params, hash) {\n var left = params[0];\n var right = params[1];\n if (hash.forceNumber) {\n if (typeof left !== 'number') {\n left = Number(left);\n }\n if (typeof right !== 'number') {\n right = Number(right);\n }\n }\n return left > right;\n }\n});","define('ember-truth-helpers/helpers/gte', ['exports'], function (exports) {\n 'use strict';\n\n exports.gteHelper = gteHelper;\n\n function gteHelper(params, hash) {\n var left = params[0];\n var right = params[1];\n if (hash.forceNumber) {\n if (typeof left !== 'number') {\n left = Number(left);\n }\n if (typeof right !== 'number') {\n right = Number(right);\n }\n }\n return left >= right;\n }\n});","define('ember-truth-helpers/helpers/is-array', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports.isArrayHelper = isArrayHelper;\n\n function isArrayHelper(params) {\n for (var i = 0, len = params.length; i < len; i++) {\n if (_ember['default'].isArray(params[i]) === false) {\n return false;\n }\n }\n return true;\n }\n});","define('ember-truth-helpers/helpers/lt', ['exports'], function (exports) {\n 'use strict';\n\n exports.ltHelper = ltHelper;\n\n function ltHelper(params, hash) {\n var left = params[0];\n var right = params[1];\n if (hash.forceNumber) {\n if (typeof left !== 'number') {\n left = Number(left);\n }\n if (typeof right !== 'number') {\n right = Number(right);\n }\n }\n return left < right;\n }\n});","define('ember-truth-helpers/helpers/lte', ['exports'], function (exports) {\n 'use strict';\n\n exports.lteHelper = lteHelper;\n\n function lteHelper(params, hash) {\n var left = params[0];\n var right = params[1];\n if (hash.forceNumber) {\n if (typeof left !== 'number') {\n left = Number(left);\n }\n if (typeof right !== 'number') {\n right = Number(right);\n }\n }\n return left <= right;\n }\n});","define(\"ember-truth-helpers/helpers/not-equal\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.notEqualHelper = notEqualHelper;\n\n function notEqualHelper(params) {\n return params[0] !== params[1];\n }\n});","define('ember-truth-helpers/helpers/not', ['exports', 'ember-truth-helpers/utils/truth-convert'], function (exports, _emberTruthHelpersUtilsTruthConvert) {\n 'use strict';\n\n exports.notHelper = notHelper;\n\n function notHelper(params) {\n for (var i = 0, len = params.length; i < len; i++) {\n if ((0, _emberTruthHelpersUtilsTruthConvert['default'])(params[i]) === true) {\n return false;\n }\n }\n return true;\n }\n});","define('ember-truth-helpers/helpers/or', ['exports', 'ember-truth-helpers/utils/truth-convert'], function (exports, _emberTruthHelpersUtilsTruthConvert) {\n 'use strict';\n\n exports.orHelper = orHelper;\n\n function orHelper(params) {\n for (var i = 0, len = params.length; i < len; i++) {\n if ((0, _emberTruthHelpersUtilsTruthConvert['default'])(params[i]) === true) {\n return params[i];\n }\n }\n return params[params.length - 1];\n }\n});","define('ember-truth-helpers/helpers/xor', ['exports', 'ember-truth-helpers/utils/truth-convert'], function (exports, _emberTruthHelpersUtilsTruthConvert) {\n 'use strict';\n\n exports.xorHelper = xorHelper;\n\n function xorHelper(params) {\n return (0, _emberTruthHelpersUtilsTruthConvert['default'])(params[0]) !== (0, _emberTruthHelpersUtilsTruthConvert['default'])(params[1]);\n }\n});","define('ember-truth-helpers/utils/register-helper', ['exports', 'ember'], function (exports, _ember) {\n\t'use strict';\n\n\texports.registerHelper = registerHelper;\n\n\tfunction registerHelperIteration1(name, helperFunction) {\n\t\t//earlier versions of ember with htmlbars used this\n\t\t_ember['default'].HTMLBars.helpers[name] = _ember['default'].HTMLBars.makeBoundHelper(helperFunction);\n\t}\n\n\tfunction registerHelperIteration2(name, helperFunction) {\n\t\t//registerHelper has been made private as _registerHelper\n\t\t//this is kept here if anyone is using it\n\t\t_ember['default'].HTMLBars.registerHelper(name, _ember['default'].HTMLBars.makeBoundHelper(helperFunction));\n\t}\n\n\tfunction registerHelperIteration3(name, helperFunction) {\n\t\t//latest versin of ember uses this\n\t\t_ember['default'].HTMLBars._registerHelper(name, _ember['default'].HTMLBars.makeBoundHelper(helperFunction));\n\t}\n\n\tfunction registerHelper(name, helperFunction) {\n\t\t// Do not register helpers from Ember 1.13 onwards, starting from 1.13 they\n\t\t// will be auto-discovered.\n\t\tif (_ember['default'].Helper) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (_ember['default'].HTMLBars._registerHelper) {\n\t\t\tif (_ember['default'].HTMLBars.helpers) {\n\t\t\t\tregisterHelperIteration1(name, helperFunction);\n\t\t\t} else {\n\t\t\t\tregisterHelperIteration3(name, helperFunction);\n\t\t\t}\n\t\t} else if (_ember['default'].HTMLBars.registerHelper) {\n\t\t\tregisterHelperIteration2(name, helperFunction);\n\t\t}\n\t}\n});","define('ember-truth-helpers/utils/truth-convert', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n exports['default'] = truthConvert;\n\n function truthConvert(result) {\n var truthy = result && _ember['default'].get(result, 'isTruthy');\n if (typeof truthy === 'boolean') {\n return truthy;\n }\n\n if (_ember['default'].isArray(result)) {\n return _ember['default'].get(result, 'length') !== 0;\n } else {\n return !!result;\n }\n }\n});","define('ember-wormhole/components/ember-wormhole', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n var computed = _ember['default'].computed;\n var observer = _ember['default'].observer;\n var run = _ember['default'].run;\n\n exports['default'] = _ember['default'].Component.extend({\n to: computed.alias('destinationElementId'),\n destinationElementId: null,\n destinationElement: computed('destinationElementId', 'renderInPlace', function () {\n return this.get('renderInPlace') ? this.element : document.getElementById(this.get('destinationElementId'));\n }),\n renderInPlace: false,\n\n didInsertElement: function didInsertElement() {\n this._super.apply(this, arguments);\n this._firstNode = this.element.firstChild;\n this._lastNode = this.element.lastChild;\n this.appendToDestination();\n },\n\n willDestroyElement: function willDestroyElement() {\n var _this = this;\n\n this._super.apply(this, arguments);\n var firstNode = this._firstNode;\n var lastNode = this._lastNode;\n run.schedule('render', function () {\n _this.removeRange(firstNode, lastNode);\n });\n },\n\n destinationDidChange: observer('destinationElement', function () {\n var destinationElement = this.get('destinationElement');\n if (destinationElement !== this._firstNode.parentNode) {\n run.schedule('render', this, 'appendToDestination');\n }\n }),\n\n appendToDestination: function appendToDestination() {\n var destinationElement = this.get('destinationElement');\n var currentActiveElement = document.activeElement;\n if (!destinationElement) {\n var destinationElementId = this.get('destinationElementId');\n if (destinationElementId) {\n throw new Error('ember-wormhole failed to render into \\'#' + this.get('destinationElementId') + '\\' because the element is not in the DOM');\n }\n throw new Error('ember-wormhole failed to render content because the destinationElementId was set to an undefined or falsy value.');\n }\n\n this.appendRange(destinationElement, this._firstNode, this._lastNode);\n if (document.activeElement !== currentActiveElement) {\n currentActiveElement.focus();\n }\n },\n\n appendRange: function appendRange(destinationElement, firstNode, lastNode) {\n while (firstNode) {\n destinationElement.insertBefore(firstNode, null);\n firstNode = firstNode !== lastNode ? lastNode.parentNode.firstChild : null;\n }\n },\n\n removeRange: function removeRange(firstNode, lastNode) {\n var node = lastNode;\n do {\n var next = node.previousSibling;\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n if (node === firstNode) {\n break;\n }\n }\n node = next;\n } while (node);\n }\n\n });\n});","define('ivy-codemirror/components/ivy-codemirror', ['exports', 'codemirror', 'ember'], function (exports, _codemirror, _ember) {\n 'use strict';\n\n exports['default'] = _ember['default'].Component.extend({\n /**\n * The value of the editor.\n *\n * @property value\n * @type {String}\n * @default null\n */\n value: null,\n\n autofocus: false,\n coverGutterNextToScrollbar: false,\n electricChars: true,\n extraKeys: null,\n firstLineNumber: 1,\n fixedGutter: true,\n historyEventDelay: 1250,\n indentUnit: 2,\n indentWithTabs: false,\n keyMap: 'default',\n lineNumbers: false,\n lineWrapping: false,\n mode: null,\n readOnly: false,\n rtlMoveVisually: true,\n showCursorWhenSelecting: false,\n smartIndent: true,\n tabSize: 4,\n tabindex: null,\n theme: 'default',\n undoDepth: 200,\n\n tagName: 'textarea',\n\n /**\n * Force CodeMirror to refresh.\n *\n * @method refresh\n */\n refresh: function refresh() {\n this.get('codeMirror').refresh();\n },\n\n _initCodemirror: _ember['default'].on('didInsertElement', function () {\n var codeMirror = _codemirror['default'].fromTextArea(this.get('element'));\n\n // Stash away the CodeMirror instance.\n this.set('codeMirror', codeMirror);\n\n // Set up handlers for CodeMirror events.\n this._bindCodeMirrorEvent('change', this, '_updateValue');\n\n // Set up bindings for CodeMirror options.\n this._bindCodeMirrorOption('autofocus');\n this._bindCodeMirrorOption('coverGutterNextToScrollbar');\n this._bindCodeMirrorOption('electricChars');\n this._bindCodeMirrorOption('extraKeys');\n this._bindCodeMirrorOption('firstLineNumber');\n this._bindCodeMirrorOption('fixedGutter');\n this._bindCodeMirrorOption('historyEventDelay');\n this._bindCodeMirrorOption('indentUnit');\n this._bindCodeMirrorOption('indentWithTabs');\n this._bindCodeMirrorOption('keyMap');\n this._bindCodeMirrorOption('lineNumbers');\n this._bindCodeMirrorOption('lineWrapping');\n this._bindCodeMirrorOption('mode');\n this._bindCodeMirrorOption('readOnly');\n this._bindCodeMirrorOption('rtlMoveVisually');\n this._bindCodeMirrorOption('showCursorWhenSelecting');\n this._bindCodeMirrorOption('smartIndent');\n this._bindCodeMirrorOption('tabSize');\n this._bindCodeMirrorOption('tabindex');\n this._bindCodeMirrorOption('theme');\n this._bindCodeMirrorOption('undoDepth');\n\n this._bindCodeMirrorProperty('value', this, '_valueDidChange');\n this._valueDidChange();\n\n // Force a refresh on `becameVisible`, since CodeMirror won't render itself\n // onto a hidden element.\n this.on('becameVisible', this, 'refresh');\n }),\n\n /**\n * Bind a handler for `event`, to be torn down in `willDestroyElement`.\n *\n * @private\n * @method _bindCodeMirrorEvent\n */\n _bindCodeMirrorEvent: function _bindCodeMirrorEvent(event, target, method) {\n var callback = _ember['default'].run.bind(target, method);\n\n this.get('codeMirror').on(event, callback);\n\n this.on('willDestroyElement', this, function () {\n this.get('codeMirror').off(event, callback);\n });\n },\n\n /**\n * @private\n * @method _bindCodeMirrorProperty\n */\n _bindCodeMirrorOption: function _bindCodeMirrorOption(key) {\n this._bindCodeMirrorProperty(key, this, '_optionDidChange');\n\n // Set the initial option synchronously.\n this._optionDidChange(this, key);\n },\n\n /**\n * Bind an observer on `key`, to be torn down in `willDestroyElement`.\n *\n * @private\n * @method _bindCodeMirrorProperty\n */\n _bindCodeMirrorProperty: function _bindCodeMirrorProperty(key, target, method) {\n this.addObserver(key, target, method);\n\n this.on('willDestroyElement', this, function () {\n this.removeObserver(key, target, method);\n });\n },\n\n /**\n * Sync a local option value with CodeMirror.\n *\n * @private\n * @method _optionDidChange\n */\n _optionDidChange: function _optionDidChange(sender, key) {\n this.get('codeMirror').setOption(key, this.get(key));\n },\n\n /**\n * Update the `value` property when a CodeMirror `change` event occurs.\n *\n * @private\n * @method _updateValue\n */\n _updateValue: function _updateValue(instance, changeObj) {\n var value = instance.getValue();\n this.set('value', value);\n this.sendAction('valueUpdated', value, instance, changeObj);\n },\n\n _valueDidChange: function _valueDidChange() {\n var codeMirror = this.get('codeMirror'),\n value = this.get('value');\n\n if (value !== codeMirror.getValue()) {\n codeMirror.setValue(value || '');\n }\n }\n });\n});","define('ivy-tabs/components/ivy-tab-list', ['exports', 'ember', 'ivy-tabs/templates/components/ivy-tab-list'], function (exports, _ember, _ivyTabsTemplatesComponentsIvyTabList) {\n 'use strict';\n\n /**\n * @module ivy-tabs\n */\n\n /**\n * @class IvyTabListComponent\n * @namespace IvyTabs\n * @extends Ember.Component\n */\n exports['default'] = _ember['default'].Component.extend({\n layout: _ivyTabsTemplatesComponentsIvyTabList['default'],\n\n tagName: 'ul',\n attributeBindings: ['aria-multiselectable', 'role'],\n classNames: ['ivy-tab-list'],\n\n init: function init() {\n this._super.apply(this, arguments);\n _ember['default'].run.once(this, this._registerWithTabsContainer);\n },\n\n willDestroy: function willDestroy() {\n this._super.apply(this, arguments);\n _ember['default'].run.once(this, this._unregisterWithTabsContainer);\n },\n\n /**\n * Tells screenreaders that only one tab can be selected at a time.\n *\n * @property aria-multiselectable\n * @type String\n * @default 'false'\n */\n 'aria-multiselectable': 'false',\n\n /**\n * The `role` attribute of the tab list element.\n *\n * See http://www.w3.org/TR/wai-aria/roles#tablist\n *\n * @property role\n * @type String\n * @default 'tablist'\n */\n role: 'tablist',\n\n /**\n * Gives focus to the selected tab.\n *\n * @method focusSelectedTab\n */\n focusSelectedTab: function focusSelectedTab() {\n this.get('selectedTab').$().focus();\n },\n\n /**\n * Event handler for navigating tabs via arrow keys. The left (or up) arrow\n * selects the previous tab, while the right (or down) arrow selects the next\n * tab.\n *\n * @method navigateOnKeyDown\n * @param {Event} event\n */\n navigateOnKeyDown: _ember['default'].on('keyDown', function (event) {\n switch (event.keyCode) {\n case 37: /* left */\n case 38:\n /* up */\n this.selectPreviousTab();\n break;\n case 39: /* right */\n case 40:\n /* down */\n this.selectNextTab();\n break;\n default:\n return;\n }\n\n event.preventDefault();\n _ember['default'].run.scheduleOnce('afterRender', this, this.focusSelectedTab);\n }),\n\n /**\n * Adds a tab to the `tabs` array.\n *\n * @method registerTab\n * @param {IvyTabs.IvyTabComponent} tab\n */\n registerTab: function registerTab(tab) {\n this.get('tabs').pushObject(tab);\n },\n\n /**\n * Selects the next tab in the list, if any.\n *\n * @method selectNextTab\n */\n selectNextTab: function selectNextTab() {\n var index = this.get('selected-index') + 1;\n if (index === this.get('tabs.length')) {\n index = 0;\n }\n this.selectTabByIndex(index);\n },\n\n /**\n * Selects the previous tab in the list, if any.\n *\n * @method selectPreviousTab\n */\n selectPreviousTab: function selectPreviousTab() {\n var index = this.get('selected-index') - 1;\n\n // Previous from the first tab should select the last tab.\n if (index < 0) {\n index = this.get('tabs.length') - 1;\n }\n // This would only happen if there are no tabs, so stay at 0.\n if (index < 0) {\n index = 0;\n }\n\n this.selectTabByIndex(index);\n },\n\n 'selected-index': _ember['default'].computed.alias('tabsContainer.selected-index'),\n\n /**\n * The currently-selected `ivy-tab` instance.\n *\n * @property selectedTab\n * @type IvyTabs.IvyTabComponent\n */\n selectedTab: _ember['default'].computed(function () {\n return this.get('tabs').objectAt(this.get('selected-index'));\n }).property('selected-index', 'tabs.[]'),\n\n /**\n * Select the given tab.\n *\n * @method selectTab\n * @param {IvyTabs.IvyTabComponent} tab\n */\n selectTab: function selectTab(tab) {\n this.selectTabByIndex(this.get('tabs').indexOf(tab));\n },\n\n /**\n * Select the tab at `index`.\n *\n * @method selectTabByIndex\n * @param {Number} index\n */\n selectTabByIndex: function selectTabByIndex(index) {\n this.sendAction('on-select', index);\n },\n\n tabs: _ember['default'].computed(function () {\n return _ember['default'].A();\n }).readOnly(),\n\n /**\n * The `ivy-tabs` component.\n *\n * @property tabsContainer\n * @type IvyTabs.IvyTabsComponent\n * @default null\n */\n tabsContainer: null,\n\n /**\n * Removes a tab from the `tabs` array.\n *\n * @method unregisterTab\n * @param {IvyTabs.IvyTabComponent} tab\n */\n unregisterTab: function unregisterTab(tab) {\n var index = tab.get('index');\n this.get('tabs').removeObject(tab);\n\n if (index < this.get('selected-index')) {\n this.selectPreviousTab();\n } else if (tab.get('isSelected')) {\n if (index !== 0) {\n this.selectPreviousTab();\n }\n }\n },\n\n _registerWithTabsContainer: function _registerWithTabsContainer() {\n this.get('tabsContainer').registerTabList(this);\n },\n\n _unregisterWithTabsContainer: function _unregisterWithTabsContainer() {\n this.get('tabsContainer').unregisterTabList(this);\n }\n });\n});","define('ivy-tabs/components/ivy-tab-panel', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n /**\n * @module ivy-tabs\n */\n\n /**\n * @class IvyTabPanelComponent\n * @namespace IvyTabs\n * @extends Ember.Component\n */\n exports['default'] = _ember['default'].Component.extend({\n attributeBindings: ['aria-hidden', 'aria-labelledby', 'role'],\n classNames: ['ivy-tab-panel'],\n classNameBindings: ['active'],\n\n init: function init() {\n this._super.apply(this, arguments);\n _ember['default'].run.once(this, this._registerWithTabsContainer);\n },\n\n willDestroy: function willDestroy() {\n this._super.apply(this, arguments);\n _ember['default'].run.once(this, this._unregisterWithTabsContainer);\n },\n\n /**\n * Tells screenreaders whether or not the panel is visible.\n *\n * See http://www.w3.org/TR/wai-aria/states_and_properties#aria-hidden\n *\n * @property aria-hidden\n * @type Boolean\n * @readOnly\n */\n 'aria-hidden': _ember['default'].computed.not('isSelected').readOnly(),\n\n /**\n * Tells screenreaders which tab labels this panel.\n *\n * See http://www.w3.org/TR/wai-aria/states_and_properties#aria-labelledby\n *\n * @property aria-labelledby\n * @type String\n * @readOnly\n */\n 'aria-labelledby': _ember['default'].computed.alias('tab.elementId').readOnly(),\n\n /**\n * See http://www.w3.org/TR/wai-aria/roles#tabpanel\n *\n * @property role\n * @type String\n * @default 'tabpanel'\n */\n role: 'tabpanel',\n\n /**\n * Accessed as a className binding to apply the panel's `activeClass` CSS\n * class to the element when the panel's `isSelected` property is true.\n *\n * @property active\n * @type String\n * @readOnly\n */\n active: _ember['default'].computed(function () {\n if (this.get('isSelected')) {\n return this.get('activeClass');\n }\n }).property('isSelected'),\n\n /**\n * The CSS class to apply to a panel's element when its `isSelected` property\n * is `true`.\n *\n * @property activeClass\n * @type String\n * @default 'active'\n */\n activeClass: 'active',\n\n /**\n * The index of this panel in the `ivy-tabs` component.\n *\n * @property index\n * @type Number\n */\n index: _ember['default'].computed(function () {\n return this.get('tabPanels').indexOf(this);\n }).property('tabPanels.[]'),\n\n /**\n * Whether or not this panel's associated tab is selected.\n *\n * @property isSelected\n * @type Boolean\n * @readOnly\n */\n isSelected: _ember['default'].computed.alias('tab.isSelected').readOnly(),\n\n /**\n * If `false`, this panel will appear hidden in the DOM. This is an alias to\n * `isSelected`.\n *\n * @property isVisible\n * @type Boolean\n * @readOnly\n */\n isVisible: _ember['default'].computed.alias('isSelected').readOnly(),\n\n /**\n * The `ivy-tab` associated with this panel.\n *\n * @property tab\n * @type IvyTabs.IvyTabComponent\n */\n tab: _ember['default'].computed(function () {\n var tabs = this.get('tabs');\n if (tabs) {\n return tabs.objectAt(this.get('index'));\n }\n }).property('tabs.[]', 'index'),\n\n /**\n * The `ivy-tab-list` component this panel belongs to.\n *\n * @property tabList\n * @type IvyTabs.IvyTabListComponent\n * @readOnly\n */\n tabList: _ember['default'].computed.alias('tabsContainer.tabList').readOnly(),\n\n /**\n * The array of all `ivy-tab-panel` instances within the `ivy-tabs`\n * component.\n *\n * @property tabPanels\n * @type Array | IvyTabs.IvyTabPanelComponent\n * @readOnly\n */\n tabPanels: _ember['default'].computed.alias('tabsContainer.tabPanels').readOnly(),\n\n /**\n * The array of all `ivy-tab` instances within the `ivy-tab-list` component.\n *\n * @property tabs\n * @type Array | IvyTabs.IvyTabComponent\n * @readOnly\n */\n tabs: _ember['default'].computed.alias('tabList.tabs').readOnly(),\n\n /**\n * The `ivy-tabs` component.\n *\n * @property tabsContainer\n * @type IvyTabs.IvyTabsComponent\n * @default null\n */\n tabsContainer: null,\n\n _registerWithTabsContainer: function _registerWithTabsContainer() {\n this.get('tabsContainer').registerTabPanel(this);\n },\n\n _unregisterWithTabsContainer: function _unregisterWithTabsContainer() {\n this.get('tabsContainer').unregisterTabPanel(this);\n }\n });\n});","define('ivy-tabs/components/ivy-tab', ['exports', 'ember'], function (exports, _ember) {\n 'use strict';\n\n /**\n * @module ivy-tabs\n */\n\n /**\n * @class IvyTabComponent\n * @namespace IvyTabs\n * @extends Ember.Component\n */\n exports['default'] = _ember['default'].Component.extend({\n tagName: 'li',\n attributeBindings: ['aria-controls', 'aria-expanded', 'aria-selected', 'role', 'selected', 'tabindex'],\n classNames: ['ivy-tab'],\n classNameBindings: ['active'],\n\n init: function init() {\n this._super.apply(this, arguments);\n _ember['default'].run.once(this, this._registerWithTabList);\n },\n\n willDestroy: function willDestroy() {\n this._super.apply(this, arguments);\n _ember['default'].run.once(this, this._unregisterWithTabList);\n },\n\n /**\n * Tells screenreaders which panel this tab controls.\n *\n * See http://www.w3.org/TR/wai-aria/states_and_properties#aria-controls\n *\n * @property aria-controls\n * @type String\n * @readOnly\n */\n 'aria-controls': _ember['default'].computed.alias('tabPanel.elementId').readOnly(),\n\n /**\n * Tells screenreaders whether or not this tab's panel is expanded.\n *\n * See http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded\n *\n * @property aria-expanded\n * @type String\n * @readOnly\n */\n 'aria-expanded': _ember['default'].computed.alias('aria-selected').readOnly(),\n\n /**\n * Tells screenreaders whether or not this tab is selected.\n *\n * See http://www.w3.org/TR/wai-aria/states_and_properties#aria-selected\n *\n * @property aria-selected\n * @type String\n */\n 'aria-selected': _ember['default'].computed(function () {\n return this.get('isSelected') + ''; // coerce to 'true' or 'false'\n }).property('isSelected'),\n\n /**\n * The `role` attribute of the tab element.\n *\n * See http://www.w3.org/TR/wai-aria/roles#tab\n *\n * @property role\n * @type String\n * @default 'tab'\n */\n role: 'tab',\n\n /**\n * The `selected` attribute of the tab element. If the tab's `isSelected`\n * property is `true` this will be the literal string 'selected', otherwise\n * it will be `undefined`.\n *\n * @property selected\n * @type String\n */\n selected: _ember['default'].computed(function () {\n if (this.get('isSelected')) {\n return 'selected';\n }\n }).property('isSelected'),\n\n /**\n * Makes the selected tab keyboard tabbable, and prevents tabs from getting\n * focus when clicked with a mouse.\n *\n * @property tabindex\n * @type Number\n */\n tabindex: _ember['default'].computed(function () {\n if (this.get('isSelected')) {\n return 0;\n }\n }).property('isSelected'),\n\n /**\n * Accessed as a className binding to apply the tab's `activeClass` CSS class\n * to the element when the tab's `isSelected` property is true.\n *\n * @property active\n * @type String\n * @readOnly\n */\n active: _ember['default'].computed(function () {\n if (this.get('isSelected')) {\n return this.get('activeClass');\n }\n }).property('isSelected'),\n\n /**\n * The CSS class to apply to a tab's element when its `isSelected` property\n * is `true`.\n *\n * @property activeClass\n * @type String\n * @default 'active'\n */\n activeClass: 'active',\n\n /**\n * The index of this tab in the `ivy-tab-list` component.\n *\n * @property index\n * @type Number\n */\n index: _ember['default'].computed(function () {\n return this.get('tabs').indexOf(this);\n }).property('tabs.[]'),\n\n /**\n * Whether or not this tab is selected.\n *\n * @property isSelected\n * @type Boolean\n */\n isSelected: _ember['default'].computed(function () {\n return this.get('tabList.selectedTab') === this;\n }).property('tabList.selectedTab'),\n\n /**\n * Called when the user clicks on the tab. Selects this tab.\n *\n * @method select\n */\n select: _ember['default'].on('click', 'touchEnd', function () {\n this.get('tabList').selectTab(this);\n }),\n\n /**\n * The `ivy-tab-list` component this tab belongs to.\n *\n * @property tabList\n * @type IvyTabs.IvyTabListComponent\n * @default null\n */\n tabList: null,\n\n /**\n * The `ivy-tab-panel` associated with this tab.\n *\n * @property tabPanel\n * @type IvyTabs.IvyTabPanelComponent\n */\n tabPanel: _ember['default'].computed(function () {\n return this.get('tabPanels').objectAt(this.get('index'));\n }).property('tabPanels.[]', 'index'),\n\n /**\n * The array of all `ivy-tab-panel` instances within the `ivy-tabs`\n * component.\n *\n * @property tabPanels\n * @type Array | IvyTabs.IvyTabPanelComponent\n * @readOnly\n */\n tabPanels: _ember['default'].computed.alias('tabsContainer.tabPanels').readOnly(),\n\n /**\n * The array of all `ivy-tab` instances within the `ivy-tab-list` component.\n *\n * @property tabs\n * @type Array | IvyTabs.IvyTabComponent\n * @readOnly\n */\n tabs: _ember['default'].computed.alias('tabList.tabs').readOnly(),\n\n /**\n * The `ivy-tabs` component.\n *\n * @property tabsContainer\n * @type IvyTabs.IvyTabsComponent\n * @readOnly\n */\n tabsContainer: _ember['default'].computed.alias('tabList.tabsContainer').readOnly(),\n\n _registerWithTabList: function _registerWithTabList() {\n this.get('tabList').registerTab(this);\n },\n\n _unregisterWithTabList: function _unregisterWithTabList() {\n this.get('tabList').unregisterTab(this);\n }\n });\n});","define('ivy-tabs/components/ivy-tabs', ['exports', 'ember', 'ivy-tabs/templates/components/ivy-tabs'], function (exports, _ember, _ivyTabsTemplatesComponentsIvyTabs) {\n 'use strict';\n\n /**\n * @module ivy-tabs\n */\n\n /**\n * @class IvyTabsComponent\n * @namespace IvyTabs\n * @extends Ember.Component\n */\n exports['default'] = _ember['default'].Component.extend({\n layout: _ivyTabsTemplatesComponentsIvyTabs['default'],\n\n classNames: ['ivy-tabs'],\n\n /**\n * Set this to the index of the tab you'd like to be selected. Usually it is\n * bound to a controller property that is used as a query parameter, but can\n * be bound to anything.\n *\n * @property selected-index\n * @type Number\n * @default 0\n */\n 'selected-index': 0,\n\n /**\n * Registers the `ivy-tab-list` instance.\n *\n * @method registerTabList\n * @param {IvyTabs.IvyTabListComponent} tabList\n */\n registerTabList: function registerTabList(tabList) {\n this.set('tabList', tabList);\n _ember['default'].run.once(this, this._selectTabByIndex);\n },\n\n /**\n * Adds a panel to the `tabPanels` array.\n *\n * @method registerTabPanel\n * @param {IvyTabs.IvyTabPanelComponent} tabPanel\n */\n registerTabPanel: function registerTabPanel(tabPanel) {\n this.get('tabPanels').pushObject(tabPanel);\n },\n\n tabPanels: _ember['default'].computed(function () {\n return _ember['default'].A();\n }).readOnly(),\n\n /**\n * Removes the `ivy-tab-list` component.\n *\n * @method unregisterTabList\n * @param {IvyTabs.IvyTabListComponent} tabList\n */\n unregisterTabList: function unregisterTabList() /* tabList */{\n this.set('tabList', null);\n },\n\n /**\n * Removes a panel from the `tabPanels` array.\n *\n * @method unregisterTabPanel\n * @param {IvyTabs.IvyTabPanelComponent} tabPanel\n */\n unregisterTabPanel: function unregisterTabPanel(tabPanel) {\n this.get('tabPanels').removeObject(tabPanel);\n },\n\n _selectTabByIndex: function _selectTabByIndex() {\n var selectedIndex = this.get('selected-index');\n if (_ember['default'].isNone(selectedIndex)) {\n selectedIndex = 0;\n }\n this.get('tabList').selectTabByIndex(selectedIndex);\n }\n });\n});","define(\"ivy-tabs/templates/components/ivy-tab-list\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 2,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ivy-tabs/templates/components/ivy-tab-list.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"inline\", \"yield\", [[\"subexpr\", \"hash\", [], [\"tab\", [\"subexpr\", \"component\", [\"ivy-tab\"], [\"tabList\", [\"subexpr\", \"@mut\", [[\"get\", \"this\", [\"loc\", [null, [1, 47], [1, 51]]]]], [], []]], [\"loc\", [null, [1, 18], [1, 52]]]]], [\"loc\", [null, [1, 8], [1, 53]]]]], [], [\"loc\", [null, [1, 0], [1, 55]]]]],\n locals: [],\n templates: []\n };\n })());\n});","define(\"ivy-tabs/templates/components/ivy-tabs\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports[\"default\"] = Ember.HTMLBars.template((function () {\n return {\n meta: {\n \"fragmentReason\": {\n \"name\": \"missing-wrapper\",\n \"problems\": [\"wrong-type\"]\n },\n \"revision\": \"Ember@2.5.1\",\n \"loc\": {\n \"source\": null,\n \"start\": {\n \"line\": 1,\n \"column\": 0\n },\n \"end\": {\n \"line\": 2,\n \"column\": 0\n }\n },\n \"moduleName\": \"modules/ivy-tabs/templates/components/ivy-tabs.hbs\"\n },\n isEmpty: false,\n arity: 0,\n cachedFragment: null,\n hasRendered: false,\n buildFragment: function buildFragment(dom) {\n var el0 = dom.createDocumentFragment();\n var el1 = dom.createComment(\"\");\n dom.appendChild(el0, el1);\n var el1 = dom.createTextNode(\"\\n\");\n dom.appendChild(el0, el1);\n return el0;\n },\n buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) {\n var morphs = new Array(1);\n morphs[0] = dom.createMorphAt(fragment, 0, 0, contextualElement);\n dom.insertBoundary(fragment, 0);\n return morphs;\n },\n statements: [[\"inline\", \"yield\", [[\"subexpr\", \"hash\", [], [\"tablist\", [\"subexpr\", \"component\", [\"ivy-tab-list\"], [\"on-select\", [\"subexpr\", \"@mut\", [[\"get\", \"on-select\", [\"loc\", [null, [1, 58], [1, 67]]]]], [], []], \"tabsContainer\", [\"subexpr\", \"@mut\", [[\"get\", \"this\", [\"loc\", [null, [1, 82], [1, 86]]]]], [], []]], [\"loc\", [null, [1, 22], [1, 87]]]], \"tabpanel\", [\"subexpr\", \"component\", [\"ivy-tab-panel\"], [\"tabsContainer\", [\"subexpr\", \"@mut\", [[\"get\", \"this\", [\"loc\", [null, [1, 138], [1, 142]]]]], [], []]], [\"loc\", [null, [1, 97], [1, 143]]]]], [\"loc\", [null, [1, 8], [1, 144]]]]], [], [\"loc\", [null, [1, 0], [1, 146]]]]],\n locals: [],\n templates: []\n };\n })());\n});","define('lodash/array', ['exports', 'lodash/array/chunk', 'lodash/array/compact', 'lodash/array/difference', 'lodash/array/drop', 'lodash/array/dropRight', 'lodash/array/dropRightWhile', 'lodash/array/dropWhile', 'lodash/array/fill', 'lodash/array/findIndex', 'lodash/array/findLastIndex', 'lodash/array/first', 'lodash/array/flatten', 'lodash/array/flattenDeep', 'lodash/array/head', 'lodash/array/indexOf', 'lodash/array/initial', 'lodash/array/intersection', 'lodash/array/last', 'lodash/array/lastIndexOf', 'lodash/array/object', 'lodash/array/pull', 'lodash/array/pullAt', 'lodash/array/remove', 'lodash/array/rest', 'lodash/array/slice', 'lodash/array/sortedIndex', 'lodash/array/sortedLastIndex', 'lodash/array/tail', 'lodash/array/take', 'lodash/array/takeRight', 'lodash/array/takeRightWhile', 'lodash/array/takeWhile', 'lodash/array/union', 'lodash/array/uniq', 'lodash/array/unique', 'lodash/array/unzip', 'lodash/array/unzipWith', 'lodash/array/without', 'lodash/array/xor', 'lodash/array/zip', 'lodash/array/zipObject', 'lodash/array/zipWith'], function (exports, _lodashArrayChunk, _lodashArrayCompact, _lodashArrayDifference, _lodashArrayDrop, _lodashArrayDropRight, _lodashArrayDropRightWhile, _lodashArrayDropWhile, _lodashArrayFill, _lodashArrayFindIndex, _lodashArrayFindLastIndex, _lodashArrayFirst, _lodashArrayFlatten, _lodashArrayFlattenDeep, _lodashArrayHead, _lodashArrayIndexOf, _lodashArrayInitial, _lodashArrayIntersection, _lodashArrayLast, _lodashArrayLastIndexOf, _lodashArrayObject, _lodashArrayPull, _lodashArrayPullAt, _lodashArrayRemove, _lodashArrayRest, _lodashArraySlice, _lodashArraySortedIndex, _lodashArraySortedLastIndex, _lodashArrayTail, _lodashArrayTake, _lodashArrayTakeRight, _lodashArrayTakeRightWhile, _lodashArrayTakeWhile, _lodashArrayUnion, _lodashArrayUniq, _lodashArrayUnique, _lodashArrayUnzip, _lodashArrayUnzipWith, _lodashArrayWithout, _lodashArrayXor, _lodashArrayZip, _lodashArrayZipObject, _lodashArrayZipWith) {\n 'use strict';\n\n exports['default'] = {\n 'chunk': _lodashArrayChunk['default'],\n 'compact': _lodashArrayCompact['default'],\n 'difference': _lodashArrayDifference['default'],\n 'drop': _lodashArrayDrop['default'],\n 'dropRight': _lodashArrayDropRight['default'],\n 'dropRightWhile': _lodashArrayDropRightWhile['default'],\n 'dropWhile': _lodashArrayDropWhile['default'],\n 'fill': _lodashArrayFill['default'],\n 'findIndex': _lodashArrayFindIndex['default'],\n 'findLastIndex': _lodashArrayFindLastIndex['default'],\n 'first': _lodashArrayFirst['default'],\n 'flatten': _lodashArrayFlatten['default'],\n 'flattenDeep': _lodashArrayFlattenDeep['default'],\n 'head': _lodashArrayHead['default'],\n 'indexOf': _lodashArrayIndexOf['default'],\n 'initial': _lodashArrayInitial['default'],\n 'intersection': _lodashArrayIntersection['default'],\n 'last': _lodashArrayLast['default'],\n 'lastIndexOf': _lodashArrayLastIndexOf['default'],\n 'object': _lodashArrayObject['default'],\n 'pull': _lodashArrayPull['default'],\n 'pullAt': _lodashArrayPullAt['default'],\n 'remove': _lodashArrayRemove['default'],\n 'rest': _lodashArrayRest['default'],\n 'slice': _lodashArraySlice['default'],\n 'sortedIndex': _lodashArraySortedIndex['default'],\n 'sortedLastIndex': _lodashArraySortedLastIndex['default'],\n 'tail': _lodashArrayTail['default'],\n 'take': _lodashArrayTake['default'],\n 'takeRight': _lodashArrayTakeRight['default'],\n 'takeRightWhile': _lodashArrayTakeRightWhile['default'],\n 'takeWhile': _lodashArrayTakeWhile['default'],\n 'union': _lodashArrayUnion['default'],\n 'uniq': _lodashArrayUniq['default'],\n 'unique': _lodashArrayUnique['default'],\n 'unzip': _lodashArrayUnzip['default'],\n 'unzipWith': _lodashArrayUnzipWith['default'],\n 'without': _lodashArrayWithout['default'],\n 'xor': _lodashArrayXor['default'],\n 'zip': _lodashArrayZip['default'],\n 'zipObject': _lodashArrayZipObject['default'],\n 'zipWith': _lodashArrayZipWith['default']\n };\n});","define('lodash/array/chunk', ['exports', 'lodash/internal/baseSlice', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseSlice, _lodashInternalIsIterateeCall) {\n 'use strict';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeCeil = Math.ceil,\n nativeFloor = Math.floor,\n nativeMax = Math.max;\n\n /**\n * Creates an array of elements split into groups the length of `size`.\n * If `collection` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Array} Returns the new array containing chunks.\n * @example\n *\n * _.chunk(['a', 'b', 'c', 'd'], 2);\n * // => [['a', 'b'], ['c', 'd']]\n *\n * _.chunk(['a', 'b', 'c', 'd'], 3);\n * // => [['a', 'b', 'c'], ['d']]\n */\n function chunk(array, size, guard) {\n if (guard ? (0, _lodashInternalIsIterateeCall['default'])(array, size, guard) : size == null) {\n size = 1;\n } else {\n size = nativeMax(nativeFloor(size) || 1, 1);\n }\n var index = 0,\n length = array ? array.length : 0,\n resIndex = -1,\n result = Array(nativeCeil(length / size));\n\n while (index < length) {\n result[++resIndex] = (0, _lodashInternalBaseSlice['default'])(array, index, index += size);\n }\n return result;\n }\n\n exports['default'] = chunk;\n});","define(\"lodash/array/compact\", [\"exports\"], function (exports) {\n /**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\n \"use strict\";\n\n function compact(array) {\n var index = -1,\n length = array ? array.length : 0,\n resIndex = -1,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value) {\n result[++resIndex] = value;\n }\n }\n return result;\n }\n\n exports[\"default\"] = compact;\n});","define('lodash/array/difference', ['exports', 'lodash/internal/baseDifference', 'lodash/internal/baseFlatten', 'lodash/internal/isArrayLike', 'lodash/internal/isObjectLike', 'lodash/function/restParam'], function (exports, _lodashInternalBaseDifference, _lodashInternalBaseFlatten, _lodashInternalIsArrayLike, _lodashInternalIsObjectLike, _lodashFunctionRestParam) {\n 'use strict';\n\n /**\n * Creates an array of unique `array` values not included in the other\n * provided arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The arrays of values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.difference([1, 2, 3], [4, 2]);\n * // => [1, 3]\n */\n var difference = (0, _lodashFunctionRestParam['default'])(function (array, values) {\n return (0, _lodashInternalIsObjectLike['default'])(array) && (0, _lodashInternalIsArrayLike['default'])(array) ? (0, _lodashInternalBaseDifference['default'])(array, (0, _lodashInternalBaseFlatten['default'])(values, false, true)) : [];\n });\n\n exports['default'] = difference;\n});","define('lodash/array/drop', ['exports', 'lodash/internal/baseSlice', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseSlice, _lodashInternalIsIterateeCall) {\n 'use strict';\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the beginning.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.drop([1, 2, 3]);\n * // => [2, 3]\n *\n * _.drop([1, 2, 3], 2);\n * // => [3]\n *\n * _.drop([1, 2, 3], 5);\n * // => []\n *\n * _.drop([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function drop(array, n, guard) {\n var length = array ? array.length : 0;\n if (!length) {\n return [];\n }\n if (guard ? (0, _lodashInternalIsIterateeCall['default'])(array, n, guard) : n == null) {\n n = 1;\n }\n return (0, _lodashInternalBaseSlice['default'])(array, n < 0 ? 0 : n);\n }\n\n exports['default'] = drop;\n});","define('lodash/array/dropRight', ['exports', 'lodash/internal/baseSlice', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseSlice, _lodashInternalIsIterateeCall) {\n 'use strict';\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function dropRight(array, n, guard) {\n var length = array ? array.length : 0;\n if (!length) {\n return [];\n }\n if (guard ? (0, _lodashInternalIsIterateeCall['default'])(array, n, guard) : n == null) {\n n = 1;\n }\n n = length - (+n || 0);\n return (0, _lodashInternalBaseSlice['default'])(array, 0, n < 0 ? 0 : n);\n }\n\n exports['default'] = dropRight;\n});","define('lodash/array/dropRightWhile', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseWhile'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseWhile) {\n 'use strict';\n\n /**\n * Creates a slice of `array` excluding elements dropped from the end.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * bound to `thisArg` and invoked with three arguments: (value, index, array).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that match the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRightWhile([1, 2, 3], function(n) {\n * return n > 1;\n * });\n * // => [1]\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * // using the `_.matches` callback shorthand\n * _.pluck(_.dropRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');\n * // => ['barney', 'fred']\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.pluck(_.dropRightWhile(users, 'active', false), 'user');\n * // => ['barney']\n *\n * // using the `_.property` callback shorthand\n * _.pluck(_.dropRightWhile(users, 'active'), 'user');\n * // => ['barney', 'fred', 'pebbles']\n */\n function dropRightWhile(array, predicate, thisArg) {\n return array && array.length ? (0, _lodashInternalBaseWhile['default'])(array, (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3), true, true) : [];\n }\n\n exports['default'] = dropRightWhile;\n});","define('lodash/array/dropWhile', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseWhile'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseWhile) {\n 'use strict';\n\n /**\n * Creates a slice of `array` excluding elements dropped from the beginning.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * bound to `thisArg` and invoked with three arguments: (value, index, array).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropWhile([1, 2, 3], function(n) {\n * return n < 3;\n * });\n * // => [3]\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * // using the `_.matches` callback shorthand\n * _.pluck(_.dropWhile(users, { 'user': 'barney', 'active': false }), 'user');\n * // => ['fred', 'pebbles']\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.pluck(_.dropWhile(users, 'active', false), 'user');\n * // => ['pebbles']\n *\n * // using the `_.property` callback shorthand\n * _.pluck(_.dropWhile(users, 'active'), 'user');\n * // => ['barney', 'fred', 'pebbles']\n */\n function dropWhile(array, predicate, thisArg) {\n return array && array.length ? (0, _lodashInternalBaseWhile['default'])(array, (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3), true) : [];\n }\n\n exports['default'] = dropWhile;\n});","define('lodash/array/fill', ['exports', 'lodash/internal/baseFill', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseFill, _lodashInternalIsIterateeCall) {\n 'use strict';\n\n /**\n * Fills elements of `array` with `value` from `start` up to, but not\n * including, `end`.\n *\n * **Note:** This method mutates `array`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.fill(array, 'a');\n * console.log(array);\n * // => ['a', 'a', 'a']\n *\n * _.fill(Array(3), 2);\n * // => [2, 2, 2]\n *\n * _.fill([4, 6, 8], '*', 1, 2);\n * // => [4, '*', 8]\n */\n function fill(array, value, start, end) {\n var length = array ? array.length : 0;\n if (!length) {\n return [];\n }\n if (start && typeof start != 'number' && (0, _lodashInternalIsIterateeCall['default'])(array, value, start)) {\n start = 0;\n end = length;\n }\n return (0, _lodashInternalBaseFill['default'])(array, value, start, end);\n }\n\n exports['default'] = fill;\n});","define('lodash/array/findIndex', ['exports', 'lodash/internal/createFindIndex'], function (exports, _lodashInternalCreateFindIndex) {\n 'use strict';\n\n /**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to search.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(chr) {\n * return chr.user == 'barney';\n * });\n * // => 0\n *\n * // using the `_.matches` callback shorthand\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.findIndex(users, 'active', false);\n * // => 0\n *\n * // using the `_.property` callback shorthand\n * _.findIndex(users, 'active');\n * // => 2\n */\n var findIndex = (0, _lodashInternalCreateFindIndex['default'])();\n\n exports['default'] = findIndex;\n});","define('lodash/array/findLastIndex', ['exports', 'lodash/internal/createFindIndex'], function (exports, _lodashInternalCreateFindIndex) {\n 'use strict';\n\n /**\n * This method is like `_.findIndex` except that it iterates over elements\n * of `collection` from right to left.\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to search.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.findLastIndex(users, function(chr) {\n * return chr.user == 'pebbles';\n * });\n * // => 2\n *\n * // using the `_.matches` callback shorthand\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n * // => 0\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.findLastIndex(users, 'active', false);\n * // => 2\n *\n * // using the `_.property` callback shorthand\n * _.findLastIndex(users, 'active');\n * // => 0\n */\n var findLastIndex = (0, _lodashInternalCreateFindIndex['default'])(true);\n\n exports['default'] = findLastIndex;\n});","define(\"lodash/array/first\", [\"exports\"], function (exports) {\n /**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @alias head\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.first([1, 2, 3]);\n * // => 1\n *\n * _.first([]);\n * // => undefined\n */\n \"use strict\";\n\n function first(array) {\n return array ? array[0] : undefined;\n }\n\n exports[\"default\"] = first;\n});","define('lodash/array/flatten', ['exports', 'lodash/internal/baseFlatten', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseFlatten, _lodashInternalIsIterateeCall) {\n 'use strict';\n\n /**\n * Flattens a nested array. If `isDeep` is `true` the array is recursively\n * flattened, otherwise it's only flattened a single level.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to flatten.\n * @param {boolean} [isDeep] Specify a deep flatten.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, 3, [4]]]);\n * // => [1, 2, 3, [4]]\n *\n * // using `isDeep`\n * _.flatten([1, [2, 3, [4]]], true);\n * // => [1, 2, 3, 4]\n */\n function flatten(array, isDeep, guard) {\n var length = array ? array.length : 0;\n if (guard && (0, _lodashInternalIsIterateeCall['default'])(array, isDeep, guard)) {\n isDeep = false;\n }\n return length ? (0, _lodashInternalBaseFlatten['default'])(array, isDeep) : [];\n }\n\n exports['default'] = flatten;\n});","define('lodash/array/flattenDeep', ['exports', 'lodash/internal/baseFlatten'], function (exports, _lodashInternalBaseFlatten) {\n 'use strict';\n\n /**\n * Recursively flattens a nested array.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to recursively flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flattenDeep([1, [2, 3, [4]]]);\n * // => [1, 2, 3, 4]\n */\n function flattenDeep(array) {\n var length = array ? array.length : 0;\n return length ? (0, _lodashInternalBaseFlatten['default'])(array, true) : [];\n }\n\n exports['default'] = flattenDeep;\n});","define('lodash/array/head', ['exports', 'lodash/array/first'], function (exports, _lodashArrayFirst) {\n 'use strict';\n\n exports['default'] = _lodashArrayFirst['default'];\n});","define('lodash/array/indexOf', ['exports', 'lodash/internal/baseIndexOf', 'lodash/internal/binaryIndex'], function (exports, _lodashInternalBaseIndexOf, _lodashInternalBinaryIndex) {\n 'use strict';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeMax = Math.max;\n\n /**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it's used as the offset\n * from the end of `array`. If `array` is sorted providing `true` for `fromIndex`\n * performs a faster binary search.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to search.\n * @param {*} value The value to search for.\n * @param {boolean|number} [fromIndex=0] The index to search from or `true`\n * to perform a binary search on a sorted array.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // using `fromIndex`\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n *\n * // performing a binary search\n * _.indexOf([1, 1, 2, 2], 2, true);\n * // => 2\n */\n function indexOf(array, value, fromIndex) {\n var length = array ? array.length : 0;\n if (!length) {\n return -1;\n }\n if (typeof fromIndex == 'number') {\n fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;\n } else if (fromIndex) {\n var index = (0, _lodashInternalBinaryIndex['default'])(array, value);\n if (index < length && (value === value ? value === array[index] : array[index] !== array[index])) {\n return index;\n }\n return -1;\n }\n return (0, _lodashInternalBaseIndexOf['default'])(array, value, fromIndex || 0);\n }\n\n exports['default'] = indexOf;\n});","define('lodash/array/initial', ['exports', 'lodash/array/dropRight'], function (exports, _lodashArrayDropRight) {\n 'use strict';\n\n /**\n * Gets all but the last element of `array`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.initial([1, 2, 3]);\n * // => [1, 2]\n */\n function initial(array) {\n return (0, _lodashArrayDropRight['default'])(array, 1);\n }\n\n exports['default'] = initial;\n});","define('lodash/array/intersection', ['exports', 'lodash/internal/baseIndexOf', 'lodash/internal/cacheIndexOf', 'lodash/internal/createCache', 'lodash/internal/isArrayLike', 'lodash/function/restParam'], function (exports, _lodashInternalBaseIndexOf, _lodashInternalCacheIndexOf, _lodashInternalCreateCache, _lodashInternalIsArrayLike, _lodashFunctionRestParam) {\n 'use strict';\n\n /**\n * Creates an array of unique values that are included in all of the provided\n * arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of shared values.\n * @example\n * _.intersection([1, 2], [4, 2], [2, 1]);\n * // => [2]\n */\n var intersection = (0, _lodashFunctionRestParam['default'])(function (arrays) {\n var othLength = arrays.length,\n othIndex = othLength,\n caches = Array(length),\n indexOf = _lodashInternalBaseIndexOf['default'],\n isCommon = true,\n result = [];\n\n while (othIndex--) {\n var value = arrays[othIndex] = (0, _lodashInternalIsArrayLike['default'])(value = arrays[othIndex]) ? value : [];\n caches[othIndex] = isCommon && value.length >= 120 ? (0, _lodashInternalCreateCache['default'])(othIndex && value) : null;\n }\n var array = arrays[0],\n index = -1,\n length = array ? array.length : 0,\n seen = caches[0];\n\n outer: while (++index < length) {\n value = array[index];\n if ((seen ? (0, _lodashInternalCacheIndexOf['default'])(seen, value) : indexOf(result, value, 0)) < 0) {\n var othIndex = othLength;\n while (--othIndex) {\n var cache = caches[othIndex];\n if ((cache ? (0, _lodashInternalCacheIndexOf['default'])(cache, value) : indexOf(arrays[othIndex], value, 0)) < 0) {\n continue outer;\n }\n }\n if (seen) {\n seen.push(value);\n }\n result.push(value);\n }\n }\n return result;\n });\n\n exports['default'] = intersection;\n});","define(\"lodash/array/last\", [\"exports\"], function (exports) {\n /**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\n \"use strict\";\n\n function last(array) {\n var length = array ? array.length : 0;\n return length ? array[length - 1] : undefined;\n }\n\n exports[\"default\"] = last;\n});","define('lodash/array/lastIndexOf', ['exports', 'lodash/internal/binaryIndex', 'lodash/internal/indexOfNaN'], function (exports, _lodashInternalBinaryIndex, _lodashInternalIndexOfNaN) {\n 'use strict';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeMax = Math.max,\n nativeMin = Math.min;\n\n /**\n * This method is like `_.indexOf` except that it iterates over elements of\n * `array` from right to left.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to search.\n * @param {*} value The value to search for.\n * @param {boolean|number} [fromIndex=array.length-1] The index to search from\n * or `true` to perform a binary search on a sorted array.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.lastIndexOf([1, 2, 1, 2], 2);\n * // => 3\n *\n * // using `fromIndex`\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n * // => 1\n *\n * // performing a binary search\n * _.lastIndexOf([1, 1, 2, 2], 2, true);\n * // => 3\n */\n function lastIndexOf(array, value, fromIndex) {\n var length = array ? array.length : 0;\n if (!length) {\n return -1;\n }\n var index = length;\n if (typeof fromIndex == 'number') {\n index = (fromIndex < 0 ? nativeMax(length + fromIndex, 0) : nativeMin(fromIndex || 0, length - 1)) + 1;\n } else if (fromIndex) {\n index = (0, _lodashInternalBinaryIndex['default'])(array, value, true) - 1;\n var other = array[index];\n if (value === value ? value === other : other !== other) {\n return index;\n }\n return -1;\n }\n if (value !== value) {\n return (0, _lodashInternalIndexOfNaN['default'])(array, index, true);\n }\n while (index--) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n }\n\n exports['default'] = lastIndexOf;\n});","define('lodash/array/object', ['exports', 'lodash/array/zipObject'], function (exports, _lodashArrayZipObject) {\n 'use strict';\n\n exports['default'] = _lodashArrayZipObject['default'];\n});","define('lodash/array/pull', ['exports', 'lodash/internal/baseIndexOf'], function (exports, _lodashInternalBaseIndexOf) {\n 'use strict';\n\n /** Used for native method references. */\n var arrayProto = Array.prototype;\n\n /** Native method references. */\n var splice = arrayProto.splice;\n\n /**\n * Removes all provided values from `array` using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.without`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...*} [values] The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3, 1, 2, 3];\n *\n * _.pull(array, 2, 3);\n * console.log(array);\n * // => [1, 1]\n */\n function pull() {\n var args = arguments,\n array = args[0];\n\n if (!(array && array.length)) {\n return array;\n }\n var index = 0,\n indexOf = _lodashInternalBaseIndexOf['default'],\n length = args.length;\n\n while (++index < length) {\n var fromIndex = 0,\n value = args[index];\n\n while ((fromIndex = indexOf(array, value, fromIndex)) > -1) {\n splice.call(array, fromIndex, 1);\n }\n }\n return array;\n }\n\n exports['default'] = pull;\n});","define('lodash/array/pullAt', ['exports', 'lodash/internal/baseAt', 'lodash/internal/baseCompareAscending', 'lodash/internal/baseFlatten', 'lodash/internal/basePullAt', 'lodash/function/restParam'], function (exports, _lodashInternalBaseAt, _lodashInternalBaseCompareAscending, _lodashInternalBaseFlatten, _lodashInternalBasePullAt, _lodashFunctionRestParam) {\n 'use strict';\n\n /**\n * Removes elements from `array` corresponding to the given indexes and returns\n * an array of the removed elements. Indexes may be specified as an array of\n * indexes or as individual arguments.\n *\n * **Note:** Unlike `_.at`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...(number|number[])} [indexes] The indexes of elements to remove,\n * specified as individual indexes or arrays of indexes.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = [5, 10, 15, 20];\n * var evens = _.pullAt(array, 1, 3);\n *\n * console.log(array);\n * // => [5, 15]\n *\n * console.log(evens);\n * // => [10, 20]\n */\n var pullAt = (0, _lodashFunctionRestParam['default'])(function (array, indexes) {\n indexes = (0, _lodashInternalBaseFlatten['default'])(indexes);\n\n var result = (0, _lodashInternalBaseAt['default'])(array, indexes);\n (0, _lodashInternalBasePullAt['default'])(array, indexes.sort(_lodashInternalBaseCompareAscending['default']));\n return result;\n });\n\n exports['default'] = pullAt;\n});","define('lodash/array/remove', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/basePullAt'], function (exports, _lodashInternalBaseCallback, _lodashInternalBasePullAt) {\n 'use strict';\n\n /**\n * Removes all elements from `array` that `predicate` returns truthy for\n * and returns an array of the removed elements. The predicate is bound to\n * `thisArg` and invoked with three arguments: (value, index, array).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * **Note:** Unlike `_.filter`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = [1, 2, 3, 4];\n * var evens = _.remove(array, function(n) {\n * return n % 2 == 0;\n * });\n *\n * console.log(array);\n * // => [1, 3]\n *\n * console.log(evens);\n * // => [2, 4]\n */\n function remove(array, predicate, thisArg) {\n var result = [];\n if (!(array && array.length)) {\n return result;\n }\n var index = -1,\n indexes = [],\n length = array.length;\n\n predicate = (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3);\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result.push(value);\n indexes.push(index);\n }\n }\n (0, _lodashInternalBasePullAt['default'])(array, indexes);\n return result;\n }\n\n exports['default'] = remove;\n});","define('lodash/array/rest', ['exports', 'lodash/array/drop'], function (exports, _lodashArrayDrop) {\n 'use strict';\n\n /**\n * Gets all but the first element of `array`.\n *\n * @static\n * @memberOf _\n * @alias tail\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.rest([1, 2, 3]);\n * // => [2, 3]\n */\n function rest(array) {\n return (0, _lodashArrayDrop['default'])(array, 1);\n }\n\n exports['default'] = rest;\n});","define('lodash/array/slice', ['exports', 'lodash/internal/baseSlice', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseSlice, _lodashInternalIsIterateeCall) {\n 'use strict';\n\n /**\n * Creates a slice of `array` from `start` up to, but not including, `end`.\n *\n * **Note:** This method is used instead of `Array#slice` to support node\n * lists in IE < 9 and to ensure dense arrays are returned.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function slice(array, start, end) {\n var length = array ? array.length : 0;\n if (!length) {\n return [];\n }\n if (end && typeof end != 'number' && (0, _lodashInternalIsIterateeCall['default'])(array, start, end)) {\n start = 0;\n end = length;\n }\n return (0, _lodashInternalBaseSlice['default'])(array, start, end);\n }\n\n exports['default'] = slice;\n});","define('lodash/array/sortedIndex', ['exports', 'lodash/internal/createSortedIndex'], function (exports, _lodashInternalCreateSortedIndex) {\n 'use strict';\n\n /**\n * Uses a binary search to determine the lowest index at which `value` should\n * be inserted into `array` in order to maintain its sort order. If an iteratee\n * function is provided it's invoked for `value` and each element of `array`\n * to compute their sort ranking. The iteratee is bound to `thisArg` and\n * invoked with one argument; (value).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedIndex([30, 50], 40);\n * // => 1\n *\n * _.sortedIndex([4, 4, 5, 5], 5);\n * // => 2\n *\n * var dict = { 'data': { 'thirty': 30, 'forty': 40, 'fifty': 50 } };\n *\n * // using an iteratee function\n * _.sortedIndex(['thirty', 'fifty'], 'forty', function(word) {\n * return this.data[word];\n * }, dict);\n * // => 1\n *\n * // using the `_.property` callback shorthand\n * _.sortedIndex([{ 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\n * // => 1\n */\n var sortedIndex = (0, _lodashInternalCreateSortedIndex['default'])();\n\n exports['default'] = sortedIndex;\n});","define('lodash/array/sortedLastIndex', ['exports', 'lodash/internal/createSortedIndex'], function (exports, _lodashInternalCreateSortedIndex) {\n 'use strict';\n\n /**\n * This method is like `_.sortedIndex` except that it returns the highest\n * index at which `value` should be inserted into `array` in order to\n * maintain its sort order.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedLastIndex([4, 4, 5, 5], 5);\n * // => 4\n */\n var sortedLastIndex = (0, _lodashInternalCreateSortedIndex['default'])(true);\n\n exports['default'] = sortedLastIndex;\n});","define('lodash/array/tail', ['exports', 'lodash/array/rest'], function (exports, _lodashArrayRest) {\n 'use strict';\n\n exports['default'] = _lodashArrayRest['default'];\n});","define('lodash/array/take', ['exports', 'lodash/internal/baseSlice', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseSlice, _lodashInternalIsIterateeCall) {\n 'use strict';\n\n /**\n * Creates a slice of `array` with `n` elements taken from the beginning.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.take([1, 2, 3]);\n * // => [1]\n *\n * _.take([1, 2, 3], 2);\n * // => [1, 2]\n *\n * _.take([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.take([1, 2, 3], 0);\n * // => []\n */\n function take(array, n, guard) {\n var length = array ? array.length : 0;\n if (!length) {\n return [];\n }\n if (guard ? (0, _lodashInternalIsIterateeCall['default'])(array, n, guard) : n == null) {\n n = 1;\n }\n return (0, _lodashInternalBaseSlice['default'])(array, 0, n < 0 ? 0 : n);\n }\n\n exports['default'] = take;\n});","define('lodash/array/takeRight', ['exports', 'lodash/internal/baseSlice', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseSlice, _lodashInternalIsIterateeCall) {\n 'use strict';\n\n /**\n * Creates a slice of `array` with `n` elements taken from the end.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.takeRight([1, 2, 3]);\n * // => [3]\n *\n * _.takeRight([1, 2, 3], 2);\n * // => [2, 3]\n *\n * _.takeRight([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.takeRight([1, 2, 3], 0);\n * // => []\n */\n function takeRight(array, n, guard) {\n var length = array ? array.length : 0;\n if (!length) {\n return [];\n }\n if (guard ? (0, _lodashInternalIsIterateeCall['default'])(array, n, guard) : n == null) {\n n = 1;\n }\n n = length - (+n || 0);\n return (0, _lodashInternalBaseSlice['default'])(array, n < 0 ? 0 : n);\n }\n\n exports['default'] = takeRight;\n});","define('lodash/array/takeRightWhile', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseWhile'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseWhile) {\n 'use strict';\n\n /**\n * Creates a slice of `array` with elements taken from the end. Elements are\n * taken until `predicate` returns falsey. The predicate is bound to `thisArg`\n * and invoked with three arguments: (value, index, array).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.takeRightWhile([1, 2, 3], function(n) {\n * return n > 1;\n * });\n * // => [2, 3]\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * // using the `_.matches` callback shorthand\n * _.pluck(_.takeRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');\n * // => ['pebbles']\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.pluck(_.takeRightWhile(users, 'active', false), 'user');\n * // => ['fred', 'pebbles']\n *\n * // using the `_.property` callback shorthand\n * _.pluck(_.takeRightWhile(users, 'active'), 'user');\n * // => []\n */\n function takeRightWhile(array, predicate, thisArg) {\n return array && array.length ? (0, _lodashInternalBaseWhile['default'])(array, (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3), false, true) : [];\n }\n\n exports['default'] = takeRightWhile;\n});","define('lodash/array/takeWhile', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseWhile'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseWhile) {\n 'use strict';\n\n /**\n * Creates a slice of `array` with elements taken from the beginning. Elements\n * are taken until `predicate` returns falsey. The predicate is bound to\n * `thisArg` and invoked with three arguments: (value, index, array).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.takeWhile([1, 2, 3], function(n) {\n * return n < 3;\n * });\n * // => [1, 2]\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false},\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * // using the `_.matches` callback shorthand\n * _.pluck(_.takeWhile(users, { 'user': 'barney', 'active': false }), 'user');\n * // => ['barney']\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.pluck(_.takeWhile(users, 'active', false), 'user');\n * // => ['barney', 'fred']\n *\n * // using the `_.property` callback shorthand\n * _.pluck(_.takeWhile(users, 'active'), 'user');\n * // => []\n */\n function takeWhile(array, predicate, thisArg) {\n return array && array.length ? (0, _lodashInternalBaseWhile['default'])(array, (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3)) : [];\n }\n\n exports['default'] = takeWhile;\n});","define('lodash/array/union', ['exports', 'lodash/internal/baseFlatten', 'lodash/internal/baseUniq', 'lodash/function/restParam'], function (exports, _lodashInternalBaseFlatten, _lodashInternalBaseUniq, _lodashFunctionRestParam) {\n 'use strict';\n\n /**\n * Creates an array of unique values, in order, from all of the provided arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([1, 2], [4, 2], [2, 1]);\n * // => [1, 2, 4]\n */\n var union = (0, _lodashFunctionRestParam['default'])(function (arrays) {\n return (0, _lodashInternalBaseUniq['default'])((0, _lodashInternalBaseFlatten['default'])(arrays, false, true));\n });\n\n exports['default'] = union;\n});","define('lodash/array/uniq', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseUniq', 'lodash/internal/isIterateeCall', 'lodash/internal/sortedUniq'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseUniq, _lodashInternalIsIterateeCall, _lodashInternalSortedUniq) {\n 'use strict';\n\n /**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurence of each element\n * is kept. Providing `true` for `isSorted` performs a faster search algorithm\n * for sorted arrays. If an iteratee function is provided it's invoked for\n * each element in the array to generate the criterion by which uniqueness\n * is computed. The `iteratee` is bound to `thisArg` and invoked with three\n * arguments: (value, index, array).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @alias unique\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {boolean} [isSorted] Specify the array is sorted.\n * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array} Returns the new duplicate-value-free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n *\n * // using `isSorted`\n * _.uniq([1, 1, 2], true);\n * // => [1, 2]\n *\n * // using an iteratee function\n * _.uniq([1, 2.5, 1.5, 2], function(n) {\n * return this.floor(n);\n * }, Math);\n * // => [1, 2.5]\n *\n * // using the `_.property` callback shorthand\n * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\n function uniq(array, isSorted, iteratee, thisArg) {\n var length = array ? array.length : 0;\n if (!length) {\n return [];\n }\n if (isSorted != null && typeof isSorted != 'boolean') {\n thisArg = iteratee;\n iteratee = (0, _lodashInternalIsIterateeCall['default'])(array, isSorted, thisArg) ? undefined : isSorted;\n isSorted = false;\n }\n iteratee = iteratee == null ? iteratee : (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 3);\n return isSorted ? (0, _lodashInternalSortedUniq['default'])(array, iteratee) : (0, _lodashInternalBaseUniq['default'])(array, iteratee);\n }\n\n exports['default'] = uniq;\n});","define('lodash/array/unique', ['exports', 'lodash/array/uniq'], function (exports, _lodashArrayUniq) {\n 'use strict';\n\n exports['default'] = _lodashArrayUniq['default'];\n});","define('lodash/array/unzip', ['exports', 'lodash/internal/arrayFilter', 'lodash/internal/arrayMap', 'lodash/internal/baseProperty', 'lodash/internal/isArrayLike'], function (exports, _lodashInternalArrayFilter, _lodashInternalArrayMap, _lodashInternalBaseProperty, _lodashInternalIsArrayLike) {\n 'use strict';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeMax = Math.max;\n\n /**\n * This method is like `_.zip` except that it accepts an array of grouped\n * elements and creates an array regrouping the elements to their pre-zip\n * configuration.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip(['fred', 'barney'], [30, 40], [true, false]);\n * // => [['fred', 30, true], ['barney', 40, false]]\n *\n * _.unzip(zipped);\n * // => [['fred', 'barney'], [30, 40], [true, false]]\n */\n function unzip(array) {\n if (!(array && array.length)) {\n return [];\n }\n var index = -1,\n length = 0;\n\n array = (0, _lodashInternalArrayFilter['default'])(array, function (group) {\n if ((0, _lodashInternalIsArrayLike['default'])(group)) {\n length = nativeMax(group.length, length);\n return true;\n }\n });\n var result = Array(length);\n while (++index < length) {\n result[index] = (0, _lodashInternalArrayMap['default'])(array, (0, _lodashInternalBaseProperty['default'])(index));\n }\n return result;\n }\n\n exports['default'] = unzip;\n});","define('lodash/array/unzipWith', ['exports', 'lodash/internal/arrayMap', 'lodash/internal/arrayReduce', 'lodash/internal/bindCallback', 'lodash/array/unzip'], function (exports, _lodashInternalArrayMap, _lodashInternalArrayReduce, _lodashInternalBindCallback, _lodashArrayUnzip) {\n 'use strict';\n\n /**\n * This method is like `_.unzip` except that it accepts an iteratee to specify\n * how regrouped values should be combined. The `iteratee` is bound to `thisArg`\n * and invoked with four arguments: (accumulator, value, index, group).\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @param {Function} [iteratee] The function to combine regrouped values.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n * // => [[1, 10, 100], [2, 20, 200]]\n *\n * _.unzipWith(zipped, _.add);\n * // => [3, 30, 300]\n */\n function unzipWith(array, iteratee, thisArg) {\n var length = array ? array.length : 0;\n if (!length) {\n return [];\n }\n var result = (0, _lodashArrayUnzip['default'])(array);\n if (iteratee == null) {\n return result;\n }\n iteratee = (0, _lodashInternalBindCallback['default'])(iteratee, thisArg, 4);\n return (0, _lodashInternalArrayMap['default'])(result, function (group) {\n return (0, _lodashInternalArrayReduce['default'])(group, iteratee, undefined, true);\n });\n }\n\n exports['default'] = unzipWith;\n});","define('lodash/array/without', ['exports', 'lodash/internal/baseDifference', 'lodash/internal/isArrayLike', 'lodash/function/restParam'], function (exports, _lodashInternalBaseDifference, _lodashInternalIsArrayLike, _lodashFunctionRestParam) {\n 'use strict';\n\n /**\n * Creates an array excluding all provided values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to filter.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.without([1, 2, 1, 3], 1, 2);\n * // => [3]\n */\n var without = (0, _lodashFunctionRestParam['default'])(function (array, values) {\n return (0, _lodashInternalIsArrayLike['default'])(array) ? (0, _lodashInternalBaseDifference['default'])(array, values) : [];\n });\n\n exports['default'] = without;\n});","define('lodash/array/xor', ['exports', 'lodash/internal/arrayPush', 'lodash/internal/baseDifference', 'lodash/internal/baseUniq', 'lodash/internal/isArrayLike'], function (exports, _lodashInternalArrayPush, _lodashInternalBaseDifference, _lodashInternalBaseUniq, _lodashInternalIsArrayLike) {\n 'use strict';\n\n /**\n * Creates an array of unique values that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n * of the provided arrays.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of values.\n * @example\n *\n * _.xor([1, 2], [4, 2]);\n * // => [1, 4]\n */\n function xor() {\n var index = -1,\n length = arguments.length;\n\n while (++index < length) {\n var array = arguments[index];\n if ((0, _lodashInternalIsArrayLike['default'])(array)) {\n var result = result ? (0, _lodashInternalArrayPush['default'])((0, _lodashInternalBaseDifference['default'])(result, array), (0, _lodashInternalBaseDifference['default'])(array, result)) : array;\n }\n }\n return result ? (0, _lodashInternalBaseUniq['default'])(result) : [];\n }\n\n exports['default'] = xor;\n});","define('lodash/array/zip', ['exports', 'lodash/function/restParam', 'lodash/array/unzip'], function (exports, _lodashFunctionRestParam, _lodashArrayUnzip) {\n 'use strict';\n\n /**\n * Creates an array of grouped elements, the first of which contains the first\n * elements of the given arrays, the second of which contains the second elements\n * of the given arrays, and so on.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zip(['fred', 'barney'], [30, 40], [true, false]);\n * // => [['fred', 30, true], ['barney', 40, false]]\n */\n var zip = (0, _lodashFunctionRestParam['default'])(_lodashArrayUnzip['default']);\n\n exports['default'] = zip;\n});","define('lodash/array/zipObject', ['exports', 'lodash/lang/isArray'], function (exports, _lodashLangIsArray) {\n 'use strict';\n\n /**\n * The inverse of `_.pairs`; this method returns an object composed from arrays\n * of property names and values. Provide either a single two dimensional array,\n * e.g. `[[key1, value1], [key2, value2]]` or two arrays, one of property names\n * and one of corresponding values.\n *\n * @static\n * @memberOf _\n * @alias object\n * @category Array\n * @param {Array} props The property names.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObject([['fred', 30], ['barney', 40]]);\n * // => { 'fred': 30, 'barney': 40 }\n *\n * _.zipObject(['fred', 'barney'], [30, 40]);\n * // => { 'fred': 30, 'barney': 40 }\n */\n function zipObject(props, values) {\n var index = -1,\n length = props ? props.length : 0,\n result = {};\n\n if (length && !values && !(0, _lodashLangIsArray['default'])(props[0])) {\n values = [];\n }\n while (++index < length) {\n var key = props[index];\n if (values) {\n result[key] = values[index];\n } else if (key) {\n result[key[0]] = key[1];\n }\n }\n return result;\n }\n\n exports['default'] = zipObject;\n});","define('lodash/array/zipWith', ['exports', 'lodash/function/restParam', 'lodash/array/unzipWith'], function (exports, _lodashFunctionRestParam, _lodashArrayUnzipWith) {\n 'use strict';\n\n /**\n * This method is like `_.zip` except that it accepts an iteratee to specify\n * how grouped values should be combined. The `iteratee` is bound to `thisArg`\n * and invoked with four arguments: (accumulator, value, index, group).\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @param {Function} [iteratee] The function to combine grouped values.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zipWith([1, 2], [10, 20], [100, 200], _.add);\n * // => [111, 222]\n */\n var zipWith = (0, _lodashFunctionRestParam['default'])(function (arrays) {\n var length = arrays.length,\n iteratee = length > 2 ? arrays[length - 2] : undefined,\n thisArg = length > 1 ? arrays[length - 1] : undefined;\n\n if (length > 2 && typeof iteratee == 'function') {\n length -= 2;\n } else {\n iteratee = length > 1 && typeof thisArg == 'function' ? (--length, thisArg) : undefined;\n thisArg = undefined;\n }\n arrays.length = length;\n return (0, _lodashArrayUnzipWith['default'])(arrays, iteratee, thisArg);\n });\n\n exports['default'] = zipWith;\n});","define('lodash/chain', ['exports', 'lodash/chain/chain', 'lodash/chain/commit', 'lodash/chain/concat', 'lodash/chain/lodash', 'lodash/chain/plant', 'lodash/chain/reverse', 'lodash/chain/run', 'lodash/chain/tap', 'lodash/chain/thru', 'lodash/chain/toJSON', 'lodash/chain/toString', 'lodash/chain/value', 'lodash/chain/valueOf', 'lodash/chain/wrapperChain'], function (exports, _lodashChainChain, _lodashChainCommit, _lodashChainConcat, _lodashChainLodash, _lodashChainPlant, _lodashChainReverse, _lodashChainRun, _lodashChainTap, _lodashChainThru, _lodashChainToJSON, _lodashChainToString, _lodashChainValue, _lodashChainValueOf, _lodashChainWrapperChain) {\n 'use strict';\n\n exports['default'] = {\n 'chain': _lodashChainChain['default'],\n 'commit': _lodashChainCommit['default'],\n 'concat': _lodashChainConcat['default'],\n 'lodash': _lodashChainLodash['default'],\n 'plant': _lodashChainPlant['default'],\n 'reverse': _lodashChainReverse['default'],\n 'run': _lodashChainRun['default'],\n 'tap': _lodashChainTap['default'],\n 'thru': _lodashChainThru['default'],\n 'toJSON': _lodashChainToJSON['default'],\n 'toString': _lodashChainToString['default'],\n 'value': _lodashChainValue['default'],\n 'valueOf': _lodashChainValueOf['default'],\n 'wrapperChain': _lodashChainWrapperChain['default']\n };\n});","define('lodash/chain/chain', ['exports', 'lodash/chain/lodash'], function (exports, _lodashChainLodash) {\n 'use strict';\n\n /**\n * Creates a `lodash` object that wraps `value` with explicit method\n * chaining enabled.\n *\n * @static\n * @memberOf _\n * @category Chain\n * @param {*} value The value to wrap.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'pebbles', 'age': 1 }\n * ];\n *\n * var youngest = _.chain(users)\n * .sortBy('age')\n * .map(function(chr) {\n * return chr.user + ' is ' + chr.age;\n * })\n * .first()\n * .value();\n * // => 'pebbles is 1'\n */\n function chain(value) {\n var result = (0, _lodashChainLodash['default'])(value);\n result.__chain__ = true;\n return result;\n }\n\n exports['default'] = chain;\n});","define('lodash/chain/commit', ['exports', 'lodash/chain/wrapperCommit'], function (exports, _lodashChainWrapperCommit) {\n 'use strict';\n\n exports['default'] = _lodashChainWrapperCommit['default'];\n});","define('lodash/chain/concat', ['exports', 'lodash/chain/wrapperConcat'], function (exports, _lodashChainWrapperConcat) {\n 'use strict';\n\n exports['default'] = _lodashChainWrapperConcat['default'];\n});","define('lodash/chain/lodash', ['exports', 'lodash/internal/LazyWrapper', 'lodash/internal/LodashWrapper', 'lodash/internal/baseLodash', 'lodash/lang/isArray', 'lodash/internal/isObjectLike', 'lodash/internal/wrapperClone'], function (exports, _lodashInternalLazyWrapper, _lodashInternalLodashWrapper, _lodashInternalBaseLodash, _lodashLangIsArray, _lodashInternalIsObjectLike, _lodashInternalWrapperClone) {\n 'use strict';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /**\n * Creates a `lodash` object which wraps `value` to enable implicit chaining.\n * Methods that operate on and return arrays, collections, and functions can\n * be chained together. Methods that retrieve a single value or may return a\n * primitive value will automatically end the chain returning the unwrapped\n * value. Explicit chaining may be enabled using `_.chain`. The execution of\n * chained methods is lazy, that is, execution is deferred until `_#value`\n * is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion. Shortcut\n * fusion is an optimization strategy which merge iteratee calls; this can help\n * to avoid the creation of intermediate data structures and greatly reduce the\n * number of iteratee executions.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`,\n * `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `compact`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `filter`,\n * `first`, `initial`, `last`, `map`, `pluck`, `reject`, `rest`, `reverse`,\n * `slice`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `toArray`,\n * and `where`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `at`, `before`, `bind`, `bindAll`, `bindKey`,\n * `callback`, `chain`, `chunk`, `commit`, `compact`, `concat`, `constant`,\n * `countBy`, `create`, `curry`, `debounce`, `defaults`, `defaultsDeep`,\n * `defer`, `delay`, `difference`, `drop`, `dropRight`, `dropRightWhile`,\n * `dropWhile`, `fill`, `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`,\n * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\n * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\n * `invoke`, `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`,\n * `matchesProperty`, `memoize`, `merge`, `method`, `methodOf`, `mixin`,\n * `modArgs`, `negate`, `omit`, `once`, `pairs`, `partial`, `partialRight`,\n * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`,\n * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `restParam`,\n * `reverse`, `set`, `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`,\n * `sortByOrder`, `splice`, `spread`, `take`, `takeRight`, `takeRightWhile`,\n * `takeWhile`, `tap`, `throttle`, `thru`, `times`, `toArray`, `toPlainObject`,\n * `transform`, `union`, `uniq`, `unshift`, `unzip`, `unzipWith`, `values`,\n * `valuesIn`, `where`, `without`, `wrap`, `xor`, `zip`, `zipObject`, `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clone`, `cloneDeep`,\n * `deburr`, `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`,\n * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`,\n * `floor`, `get`, `gt`, `gte`, `has`, `identity`, `includes`, `indexOf`,\n * `inRange`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\n * `isEmpty`, `isEqual`, `isError`, `isFinite` `isFunction`, `isMatch`,\n * `isNative`, `isNaN`, `isNull`, `isNumber`, `isObject`, `isPlainObject`,\n * `isRegExp`, `isString`, `isUndefined`, `isTypedArray`, `join`, `kebabCase`,\n * `last`, `lastIndexOf`, `lt`, `lte`, `max`, `min`, `noConflict`, `noop`,\n * `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, `random`, `reduce`,\n * `reduceRight`, `repeat`, `result`, `round`, `runInContext`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`, `startCase`,\n * `startsWith`, `sum`, `template`, `trim`, `trimLeft`, `trimRight`, `trunc`,\n * `unescape`, `uniqueId`, `value`, and `words`\n *\n * The wrapper method `sample` will return a wrapped value when `n` is provided,\n * otherwise an unwrapped value is returned.\n *\n * @name _\n * @constructor\n * @category Chain\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // returns an unwrapped value\n * wrapped.reduce(function(total, n) {\n * return total + n;\n * });\n * // => 6\n *\n * // returns a wrapped value\n * var squares = wrapped.map(function(n) {\n * return n * n;\n * });\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\n function lodash(value) {\n if ((0, _lodashInternalIsObjectLike['default'])(value) && !(0, _lodashLangIsArray['default'])(value) && !(value instanceof _lodashInternalLazyWrapper['default'])) {\n if (value instanceof _lodashInternalLodashWrapper['default']) {\n return value;\n }\n if (hasOwnProperty.call(value, '__chain__') && hasOwnProperty.call(value, '__wrapped__')) {\n return (0, _lodashInternalWrapperClone['default'])(value);\n }\n }\n return new _lodashInternalLodashWrapper['default'](value);\n }\n\n // Ensure wrappers are instances of `baseLodash`.\n lodash.prototype = _lodashInternalBaseLodash['default'].prototype;\n\n exports['default'] = lodash;\n});","define('lodash/chain/plant', ['exports', 'lodash/chain/wrapperPlant'], function (exports, _lodashChainWrapperPlant) {\n 'use strict';\n\n exports['default'] = _lodashChainWrapperPlant['default'];\n});","define('lodash/chain/reverse', ['exports', 'lodash/chain/wrapperReverse'], function (exports, _lodashChainWrapperReverse) {\n 'use strict';\n\n exports['default'] = _lodashChainWrapperReverse['default'];\n});","define('lodash/chain/run', ['exports', 'lodash/chain/wrapperValue'], function (exports, _lodashChainWrapperValue) {\n 'use strict';\n\n exports['default'] = _lodashChainWrapperValue['default'];\n});","define(\"lodash/chain/tap\", [\"exports\"], function (exports) {\n /**\n * This method invokes `interceptor` and returns `value`. The interceptor is\n * bound to `thisArg` and invoked with one argument; (value). The purpose of\n * this method is to \"tap into\" a method chain in order to perform operations\n * on intermediate results within the chain.\n *\n * @static\n * @memberOf _\n * @category Chain\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @param {*} [thisArg] The `this` binding of `interceptor`.\n * @returns {*} Returns `value`.\n * @example\n *\n * _([1, 2, 3])\n * .tap(function(array) {\n * array.pop();\n * })\n * .reverse()\n * .value();\n * // => [2, 1]\n */\n \"use strict\";\n\n function tap(value, interceptor, thisArg) {\n interceptor.call(thisArg, value);\n return value;\n }\n\n exports[\"default\"] = tap;\n});","define(\"lodash/chain/thru\", [\"exports\"], function (exports) {\n /**\n * This method is like `_.tap` except that it returns the result of `interceptor`.\n *\n * @static\n * @memberOf _\n * @category Chain\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @param {*} [thisArg] The `this` binding of `interceptor`.\n * @returns {*} Returns the result of `interceptor`.\n * @example\n *\n * _(' abc ')\n * .chain()\n * .trim()\n * .thru(function(value) {\n * return [value];\n * })\n * .value();\n * // => ['abc']\n */\n \"use strict\";\n\n function thru(value, interceptor, thisArg) {\n return interceptor.call(thisArg, value);\n }\n\n exports[\"default\"] = thru;\n});","define('lodash/chain/toJSON', ['exports', 'lodash/chain/wrapperValue'], function (exports, _lodashChainWrapperValue) {\n 'use strict';\n\n exports['default'] = _lodashChainWrapperValue['default'];\n});","define('lodash/chain/toString', ['exports', 'lodash/chain/wrapperToString'], function (exports, _lodashChainWrapperToString) {\n 'use strict';\n\n exports['default'] = _lodashChainWrapperToString['default'];\n});","define('lodash/chain/value', ['exports', 'lodash/chain/wrapperValue'], function (exports, _lodashChainWrapperValue) {\n 'use strict';\n\n exports['default'] = _lodashChainWrapperValue['default'];\n});","define('lodash/chain/valueOf', ['exports', 'lodash/chain/wrapperValue'], function (exports, _lodashChainWrapperValue) {\n 'use strict';\n\n exports['default'] = _lodashChainWrapperValue['default'];\n});","define('lodash/chain/wrapperChain', ['exports', 'lodash/chain/chain'], function (exports, _lodashChainChain) {\n 'use strict';\n\n /**\n * Enables explicit method chaining on the wrapper object.\n *\n * @name chain\n * @memberOf _\n * @category Chain\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 }\n * ];\n *\n * // without explicit chaining\n * _(users).first();\n * // => { 'user': 'barney', 'age': 36 }\n *\n * // with explicit chaining\n * _(users).chain()\n * .first()\n * .pick('user')\n * .value();\n * // => { 'user': 'barney' }\n */\n function wrapperChain() {\n return (0, _lodashChainChain['default'])(this);\n }\n\n exports['default'] = wrapperChain;\n});","define('lodash/chain/wrapperCommit', ['exports', 'lodash/internal/LodashWrapper'], function (exports, _lodashInternalLodashWrapper) {\n 'use strict';\n\n /**\n * Executes the chained sequence and returns the wrapped result.\n *\n * @name commit\n * @memberOf _\n * @category Chain\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2];\n * var wrapped = _(array).push(3);\n *\n * console.log(array);\n * // => [1, 2]\n *\n * wrapped = wrapped.commit();\n * console.log(array);\n * // => [1, 2, 3]\n *\n * wrapped.last();\n * // => 3\n *\n * console.log(array);\n * // => [1, 2, 3]\n */\n function wrapperCommit() {\n return new _lodashInternalLodashWrapper['default'](this.value(), this.__chain__);\n }\n\n exports['default'] = wrapperCommit;\n});","define('lodash/chain/wrapperConcat', ['exports', 'lodash/internal/arrayConcat', 'lodash/internal/baseFlatten', 'lodash/lang/isArray', 'lodash/function/restParam', 'lodash/internal/toObject'], function (exports, _lodashInternalArrayConcat, _lodashInternalBaseFlatten, _lodashLangIsArray, _lodashFunctionRestParam, _lodashInternalToObject) {\n 'use strict';\n\n /**\n * Creates a new array joining a wrapped array with any additional arrays\n * and/or values.\n *\n * @name concat\n * @memberOf _\n * @category Chain\n * @param {...*} [values] The values to concatenate.\n * @returns {Array} Returns the new concatenated array.\n * @example\n *\n * var array = [1];\n * var wrapped = _(array).concat(2, [3], [[4]]);\n *\n * console.log(wrapped.value());\n * // => [1, 2, 3, [4]]\n *\n * console.log(array);\n * // => [1]\n */\n var wrapperConcat = (0, _lodashFunctionRestParam['default'])(function (values) {\n values = (0, _lodashInternalBaseFlatten['default'])(values);\n return this.thru(function (array) {\n return (0, _lodashInternalArrayConcat['default'])((0, _lodashLangIsArray['default'])(array) ? array : [(0, _lodashInternalToObject['default'])(array)], values);\n });\n });\n\n exports['default'] = wrapperConcat;\n});","define('lodash/chain/wrapperPlant', ['exports', 'lodash/internal/baseLodash', 'lodash/internal/wrapperClone'], function (exports, _lodashInternalBaseLodash, _lodashInternalWrapperClone) {\n 'use strict';\n\n /**\n * Creates a clone of the chained sequence planting `value` as the wrapped value.\n *\n * @name plant\n * @memberOf _\n * @category Chain\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2];\n * var wrapped = _(array).map(function(value) {\n * return Math.pow(value, 2);\n * });\n *\n * var other = [3, 4];\n * var otherWrapped = wrapped.plant(other);\n *\n * otherWrapped.value();\n * // => [9, 16]\n *\n * wrapped.value();\n * // => [1, 4]\n */\n function wrapperPlant(value) {\n var result,\n parent = this;\n\n while (parent instanceof _lodashInternalBaseLodash['default']) {\n var clone = (0, _lodashInternalWrapperClone['default'])(parent);\n if (result) {\n previous.__wrapped__ = clone;\n } else {\n result = clone;\n }\n var previous = clone;\n parent = parent.__wrapped__;\n }\n previous.__wrapped__ = value;\n return result;\n }\n\n exports['default'] = wrapperPlant;\n});","define('lodash/chain/wrapperReverse', ['exports', 'lodash/internal/LazyWrapper', 'lodash/internal/LodashWrapper', 'lodash/chain/thru'], function (exports, _lodashInternalLazyWrapper, _lodashInternalLodashWrapper, _lodashChainThru) {\n 'use strict';\n\n /**\n * Reverses the wrapped array so the first element becomes the last, the\n * second element becomes the second to last, and so on.\n *\n * **Note:** This method mutates the wrapped array.\n *\n * @name reverse\n * @memberOf _\n * @category Chain\n * @returns {Object} Returns the new reversed `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _(array).reverse().value()\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\n function wrapperReverse() {\n var value = this.__wrapped__;\n\n var interceptor = function interceptor(value) {\n return value.reverse();\n };\n if (value instanceof _lodashInternalLazyWrapper['default']) {\n var wrapped = value;\n if (this.__actions__.length) {\n wrapped = new _lodashInternalLazyWrapper['default'](this);\n }\n wrapped = wrapped.reverse();\n wrapped.__actions__.push({ 'func': _lodashChainThru['default'], 'args': [interceptor], 'thisArg': undefined });\n return new _lodashInternalLodashWrapper['default'](wrapped, this.__chain__);\n }\n return this.thru(interceptor);\n }\n\n exports['default'] = wrapperReverse;\n});","define('lodash/chain/wrapperToString', ['exports'], function (exports) {\n /**\n * Produces the result of coercing the unwrapped value to a string.\n *\n * @name toString\n * @memberOf _\n * @category Chain\n * @returns {string} Returns the coerced string value.\n * @example\n *\n * _([1, 2, 3]).toString();\n * // => '1,2,3'\n */\n 'use strict';\n\n function wrapperToString() {\n return this.value() + '';\n }\n\n exports['default'] = wrapperToString;\n});","define('lodash/chain/wrapperValue', ['exports', 'lodash/internal/baseWrapperValue'], function (exports, _lodashInternalBaseWrapperValue) {\n 'use strict';\n\n /**\n * Executes the chained sequence to extract the unwrapped value.\n *\n * @name value\n * @memberOf _\n * @alias run, toJSON, valueOf\n * @category Chain\n * @returns {*} Returns the resolved unwrapped value.\n * @example\n *\n * _([1, 2, 3]).value();\n * // => [1, 2, 3]\n */\n function wrapperValue() {\n return (0, _lodashInternalBaseWrapperValue['default'])(this.__wrapped__, this.__actions__);\n }\n\n exports['default'] = wrapperValue;\n});","define('lodash/collection', ['exports', 'lodash/collection/all', 'lodash/collection/any', 'lodash/collection/at', 'lodash/collection/collect', 'lodash/collection/contains', 'lodash/collection/countBy', 'lodash/collection/detect', 'lodash/collection/each', 'lodash/collection/eachRight', 'lodash/collection/every', 'lodash/collection/filter', 'lodash/collection/find', 'lodash/collection/findLast', 'lodash/collection/findWhere', 'lodash/collection/foldl', 'lodash/collection/foldr', 'lodash/collection/forEach', 'lodash/collection/forEachRight', 'lodash/collection/groupBy', 'lodash/collection/include', 'lodash/collection/includes', 'lodash/collection/indexBy', 'lodash/collection/inject', 'lodash/collection/invoke', 'lodash/collection/map', 'lodash/math/max', 'lodash/math/min', 'lodash/collection/partition', 'lodash/collection/pluck', 'lodash/collection/reduce', 'lodash/collection/reduceRight', 'lodash/collection/reject', 'lodash/collection/sample', 'lodash/collection/select', 'lodash/collection/shuffle', 'lodash/collection/size', 'lodash/collection/some', 'lodash/collection/sortBy', 'lodash/collection/sortByAll', 'lodash/collection/sortByOrder', 'lodash/math/sum', 'lodash/collection/where'], function (exports, _lodashCollectionAll, _lodashCollectionAny, _lodashCollectionAt, _lodashCollectionCollect, _lodashCollectionContains, _lodashCollectionCountBy, _lodashCollectionDetect, _lodashCollectionEach, _lodashCollectionEachRight, _lodashCollectionEvery, _lodashCollectionFilter, _lodashCollectionFind, _lodashCollectionFindLast, _lodashCollectionFindWhere, _lodashCollectionFoldl, _lodashCollectionFoldr, _lodashCollectionForEach, _lodashCollectionForEachRight, _lodashCollectionGroupBy, _lodashCollectionInclude, _lodashCollectionIncludes, _lodashCollectionIndexBy, _lodashCollectionInject, _lodashCollectionInvoke, _lodashCollectionMap, _lodashMathMax, _lodashMathMin, _lodashCollectionPartition, _lodashCollectionPluck, _lodashCollectionReduce, _lodashCollectionReduceRight, _lodashCollectionReject, _lodashCollectionSample, _lodashCollectionSelect, _lodashCollectionShuffle, _lodashCollectionSize, _lodashCollectionSome, _lodashCollectionSortBy, _lodashCollectionSortByAll, _lodashCollectionSortByOrder, _lodashMathSum, _lodashCollectionWhere) {\n 'use strict';\n\n exports['default'] = {\n 'all': _lodashCollectionAll['default'],\n 'any': _lodashCollectionAny['default'],\n 'at': _lodashCollectionAt['default'],\n 'collect': _lodashCollectionCollect['default'],\n 'contains': _lodashCollectionContains['default'],\n 'countBy': _lodashCollectionCountBy['default'],\n 'detect': _lodashCollectionDetect['default'],\n 'each': _lodashCollectionEach['default'],\n 'eachRight': _lodashCollectionEachRight['default'],\n 'every': _lodashCollectionEvery['default'],\n 'filter': _lodashCollectionFilter['default'],\n 'find': _lodashCollectionFind['default'],\n 'findLast': _lodashCollectionFindLast['default'],\n 'findWhere': _lodashCollectionFindWhere['default'],\n 'foldl': _lodashCollectionFoldl['default'],\n 'foldr': _lodashCollectionFoldr['default'],\n 'forEach': _lodashCollectionForEach['default'],\n 'forEachRight': _lodashCollectionForEachRight['default'],\n 'groupBy': _lodashCollectionGroupBy['default'],\n 'include': _lodashCollectionInclude['default'],\n 'includes': _lodashCollectionIncludes['default'],\n 'indexBy': _lodashCollectionIndexBy['default'],\n 'inject': _lodashCollectionInject['default'],\n 'invoke': _lodashCollectionInvoke['default'],\n 'map': _lodashCollectionMap['default'],\n 'max': _lodashMathMax['default'],\n 'min': _lodashMathMin['default'],\n 'partition': _lodashCollectionPartition['default'],\n 'pluck': _lodashCollectionPluck['default'],\n 'reduce': _lodashCollectionReduce['default'],\n 'reduceRight': _lodashCollectionReduceRight['default'],\n 'reject': _lodashCollectionReject['default'],\n 'sample': _lodashCollectionSample['default'],\n 'select': _lodashCollectionSelect['default'],\n 'shuffle': _lodashCollectionShuffle['default'],\n 'size': _lodashCollectionSize['default'],\n 'some': _lodashCollectionSome['default'],\n 'sortBy': _lodashCollectionSortBy['default'],\n 'sortByAll': _lodashCollectionSortByAll['default'],\n 'sortByOrder': _lodashCollectionSortByOrder['default'],\n 'sum': _lodashMathSum['default'],\n 'where': _lodashCollectionWhere['default']\n };\n});","define('lodash/collection/all', ['exports', 'lodash/collection/every'], function (exports, _lodashCollectionEvery) {\n 'use strict';\n\n exports['default'] = _lodashCollectionEvery['default'];\n});","define('lodash/collection/any', ['exports', 'lodash/collection/some'], function (exports, _lodashCollectionSome) {\n 'use strict';\n\n exports['default'] = _lodashCollectionSome['default'];\n});","define('lodash/collection/at', ['exports', 'lodash/internal/baseAt', 'lodash/internal/baseFlatten', 'lodash/function/restParam'], function (exports, _lodashInternalBaseAt, _lodashInternalBaseFlatten, _lodashFunctionRestParam) {\n 'use strict';\n\n /**\n * Creates an array of elements corresponding to the given keys, or indexes,\n * of `collection`. Keys may be specified as individual arguments or as arrays\n * of keys.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {...(number|number[]|string|string[])} [props] The property names\n * or indexes of elements to pick, specified individually or in arrays.\n * @returns {Array} Returns the new array of picked elements.\n * @example\n *\n * _.at(['a', 'b', 'c'], [0, 2]);\n * // => ['a', 'c']\n *\n * _.at(['barney', 'fred', 'pebbles'], 0, 2);\n * // => ['barney', 'pebbles']\n */\n var at = (0, _lodashFunctionRestParam['default'])(function (collection, props) {\n return (0, _lodashInternalBaseAt['default'])(collection, (0, _lodashInternalBaseFlatten['default'])(props));\n });\n\n exports['default'] = at;\n});","define('lodash/collection/collect', ['exports', 'lodash/collection/map'], function (exports, _lodashCollectionMap) {\n 'use strict';\n\n exports['default'] = _lodashCollectionMap['default'];\n});","define('lodash/collection/contains', ['exports', 'lodash/collection/includes'], function (exports, _lodashCollectionIncludes) {\n 'use strict';\n\n exports['default'] = _lodashCollectionIncludes['default'];\n});","define('lodash/collection/countBy', ['exports', 'lodash/internal/createAggregator'], function (exports, _lodashInternalCreateAggregator) {\n 'use strict';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` through `iteratee`. The corresponding value\n * of each key is the number of times the key was returned by `iteratee`.\n * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n * (value, index|key, collection).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.countBy([4.3, 6.1, 6.4], function(n) {\n * return Math.floor(n);\n * });\n * // => { '4': 1, '6': 2 }\n *\n * _.countBy([4.3, 6.1, 6.4], function(n) {\n * return this.floor(n);\n * }, Math);\n * // => { '4': 1, '6': 2 }\n *\n * _.countBy(['one', 'two', 'three'], 'length');\n * // => { '3': 2, '5': 1 }\n */\n var countBy = (0, _lodashInternalCreateAggregator['default'])(function (result, value, key) {\n hasOwnProperty.call(result, key) ? ++result[key] : result[key] = 1;\n });\n\n exports['default'] = countBy;\n});","define('lodash/collection/detect', ['exports', 'lodash/collection/find'], function (exports, _lodashCollectionFind) {\n 'use strict';\n\n exports['default'] = _lodashCollectionFind['default'];\n});","define('lodash/collection/each', ['exports', 'lodash/collection/forEach'], function (exports, _lodashCollectionForEach) {\n 'use strict';\n\n exports['default'] = _lodashCollectionForEach['default'];\n});","define('lodash/collection/eachRight', ['exports', 'lodash/collection/forEachRight'], function (exports, _lodashCollectionForEachRight) {\n 'use strict';\n\n exports['default'] = _lodashCollectionForEachRight['default'];\n});","define('lodash/collection/every', ['exports', 'lodash/internal/arrayEvery', 'lodash/internal/baseCallback', 'lodash/internal/baseEvery', 'lodash/lang/isArray', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalArrayEvery, _lodashInternalBaseCallback, _lodashInternalBaseEvery, _lodashLangIsArray, _lodashInternalIsIterateeCall) {\n 'use strict';\n\n /**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * The predicate is bound to `thisArg` and invoked with three arguments:\n * (value, index|key, collection).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @alias all\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // using the `_.matches` callback shorthand\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.every(users, 'active', false);\n * // => true\n *\n * // using the `_.property` callback shorthand\n * _.every(users, 'active');\n * // => false\n */\n function every(collection, predicate, thisArg) {\n var func = (0, _lodashLangIsArray['default'])(collection) ? _lodashInternalArrayEvery['default'] : _lodashInternalBaseEvery['default'];\n if (thisArg && (0, _lodashInternalIsIterateeCall['default'])(collection, predicate, thisArg)) {\n predicate = undefined;\n }\n if (typeof predicate != 'function' || thisArg !== undefined) {\n predicate = (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3);\n }\n return func(collection, predicate);\n }\n\n exports['default'] = every;\n});","define('lodash/collection/filter', ['exports', 'lodash/internal/arrayFilter', 'lodash/internal/baseCallback', 'lodash/internal/baseFilter', 'lodash/lang/isArray'], function (exports, _lodashInternalArrayFilter, _lodashInternalBaseCallback, _lodashInternalBaseFilter, _lodashLangIsArray) {\n 'use strict';\n\n /**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is bound to `thisArg` and\n * invoked with three arguments: (value, index|key, collection).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @alias select\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Array} Returns the new filtered array.\n * @example\n *\n * _.filter([4, 5, 6], function(n) {\n * return n % 2 == 0;\n * });\n * // => [4, 6]\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // using the `_.matches` callback shorthand\n * _.pluck(_.filter(users, { 'age': 36, 'active': true }), 'user');\n * // => ['barney']\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.pluck(_.filter(users, 'active', false), 'user');\n * // => ['fred']\n *\n * // using the `_.property` callback shorthand\n * _.pluck(_.filter(users, 'active'), 'user');\n * // => ['barney']\n */\n function filter(collection, predicate, thisArg) {\n var func = (0, _lodashLangIsArray['default'])(collection) ? _lodashInternalArrayFilter['default'] : _lodashInternalBaseFilter['default'];\n predicate = (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3);\n return func(collection, predicate);\n }\n\n exports['default'] = filter;\n});","define('lodash/collection/find', ['exports', 'lodash/internal/baseEach', 'lodash/internal/createFind'], function (exports, _lodashInternalBaseEach, _lodashInternalCreateFind) {\n 'use strict';\n\n /**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is bound to `thisArg` and\n * invoked with three arguments: (value, index|key, collection).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @alias detect\n * @category Collection\n * @param {Array|Object|string} collection The collection to search.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.result(_.find(users, function(chr) {\n * return chr.age < 40;\n * }), 'user');\n * // => 'barney'\n *\n * // using the `_.matches` callback shorthand\n * _.result(_.find(users, { 'age': 1, 'active': true }), 'user');\n * // => 'pebbles'\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.result(_.find(users, 'active', false), 'user');\n * // => 'fred'\n *\n * // using the `_.property` callback shorthand\n * _.result(_.find(users, 'active'), 'user');\n * // => 'barney'\n */\n var find = (0, _lodashInternalCreateFind['default'])(_lodashInternalBaseEach['default']);\n\n exports['default'] = find;\n});","define('lodash/collection/findLast', ['exports', 'lodash/internal/baseEachRight', 'lodash/internal/createFind'], function (exports, _lodashInternalBaseEachRight, _lodashInternalCreateFind) {\n 'use strict';\n\n /**\n * This method is like `_.find` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to search.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * _.findLast([1, 2, 3, 4], function(n) {\n * return n % 2 == 1;\n * });\n * // => 3\n */\n var findLast = (0, _lodashInternalCreateFind['default'])(_lodashInternalBaseEachRight['default'], true);\n\n exports['default'] = findLast;\n});","define('lodash/collection/findWhere', ['exports', 'lodash/internal/baseMatches', 'lodash/collection/find'], function (exports, _lodashInternalBaseMatches, _lodashCollectionFind) {\n 'use strict';\n\n /**\n * Performs a deep comparison between each element in `collection` and the\n * source object, returning the first element that has equivalent property\n * values.\n *\n * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n * numbers, `Object` objects, regexes, and strings. Objects are compared by\n * their own, not inherited, enumerable properties. For comparing a single\n * own or inherited property value see `_.matchesProperty`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to search.\n * @param {Object} source The object of property values to match.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.result(_.findWhere(users, { 'age': 36, 'active': true }), 'user');\n * // => 'barney'\n *\n * _.result(_.findWhere(users, { 'age': 40, 'active': false }), 'user');\n * // => 'fred'\n */\n function findWhere(collection, source) {\n return (0, _lodashCollectionFind['default'])(collection, (0, _lodashInternalBaseMatches['default'])(source));\n }\n\n exports['default'] = findWhere;\n});","define('lodash/collection/foldl', ['exports', 'lodash/collection/reduce'], function (exports, _lodashCollectionReduce) {\n 'use strict';\n\n exports['default'] = _lodashCollectionReduce['default'];\n});","define('lodash/collection/foldr', ['exports', 'lodash/collection/reduceRight'], function (exports, _lodashCollectionReduceRight) {\n 'use strict';\n\n exports['default'] = _lodashCollectionReduceRight['default'];\n});","define('lodash/collection/forEach', ['exports', 'lodash/internal/arrayEach', 'lodash/internal/baseEach', 'lodash/internal/createForEach'], function (exports, _lodashInternalArrayEach, _lodashInternalBaseEach, _lodashInternalCreateForEach) {\n 'use strict';\n\n /**\n * Iterates over elements of `collection` invoking `iteratee` for each element.\n * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n * (value, index|key, collection). Iteratee functions may exit iteration early\n * by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\" property\n * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n * may be used for object iteration.\n *\n * @static\n * @memberOf _\n * @alias each\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array|Object|string} Returns `collection`.\n * @example\n *\n * _([1, 2]).forEach(function(n) {\n * console.log(n);\n * }).value();\n * // => logs each value from left to right and returns the array\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(n, key) {\n * console.log(n, key);\n * });\n * // => logs each value-key pair and returns the object (iteration order is not guaranteed)\n */\n var forEach = (0, _lodashInternalCreateForEach['default'])(_lodashInternalArrayEach['default'], _lodashInternalBaseEach['default']);\n\n exports['default'] = forEach;\n});","define('lodash/collection/forEachRight', ['exports', 'lodash/internal/arrayEachRight', 'lodash/internal/baseEachRight', 'lodash/internal/createForEach'], function (exports, _lodashInternalArrayEachRight, _lodashInternalBaseEachRight, _lodashInternalCreateForEach) {\n 'use strict';\n\n /**\n * This method is like `_.forEach` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @alias eachRight\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array|Object|string} Returns `collection`.\n * @example\n *\n * _([1, 2]).forEachRight(function(n) {\n * console.log(n);\n * }).value();\n * // => logs each value from right to left and returns the array\n */\n var forEachRight = (0, _lodashInternalCreateForEach['default'])(_lodashInternalArrayEachRight['default'], _lodashInternalBaseEachRight['default']);\n\n exports['default'] = forEachRight;\n});","define('lodash/collection/groupBy', ['exports', 'lodash/internal/createAggregator'], function (exports, _lodashInternalCreateAggregator) {\n 'use strict';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` through `iteratee`. The corresponding value\n * of each key is an array of the elements responsible for generating the key.\n * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n * (value, index|key, collection).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([4.2, 6.1, 6.4], function(n) {\n * return Math.floor(n);\n * });\n * // => { '4': [4.2], '6': [6.1, 6.4] }\n *\n * _.groupBy([4.2, 6.1, 6.4], function(n) {\n * return this.floor(n);\n * }, Math);\n * // => { '4': [4.2], '6': [6.1, 6.4] }\n *\n * // using the `_.property` callback shorthand\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\n var groupBy = (0, _lodashInternalCreateAggregator['default'])(function (result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n result[key].push(value);\n } else {\n result[key] = [value];\n }\n });\n\n exports['default'] = groupBy;\n});","define('lodash/collection/include', ['exports', 'lodash/collection/includes'], function (exports, _lodashCollectionIncludes) {\n 'use strict';\n\n exports['default'] = _lodashCollectionIncludes['default'];\n});","define('lodash/collection/includes', ['exports', 'lodash/internal/baseIndexOf', 'lodash/internal/getLength', 'lodash/lang/isArray', 'lodash/internal/isIterateeCall', 'lodash/internal/isLength', 'lodash/lang/isString', 'lodash/object/values'], function (exports, _lodashInternalBaseIndexOf, _lodashInternalGetLength, _lodashLangIsArray, _lodashInternalIsIterateeCall, _lodashInternalIsLength, _lodashLangIsString, _lodashObjectValues) {\n 'use strict';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeMax = Math.max;\n\n /**\n * Checks if `target` is in `collection` using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it's used as the offset\n * from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @alias contains, include\n * @category Collection\n * @param {Array|Object|string} collection The collection to search.\n * @param {*} target The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.\n * @returns {boolean} Returns `true` if a matching element is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'user': 'fred', 'age': 40 }, 'fred');\n * // => true\n *\n * _.includes('pebbles', 'eb');\n * // => true\n */\n function includes(collection, target, fromIndex, guard) {\n var length = collection ? (0, _lodashInternalGetLength['default'])(collection) : 0;\n if (!(0, _lodashInternalIsLength['default'])(length)) {\n collection = (0, _lodashObjectValues['default'])(collection);\n length = collection.length;\n }\n if (typeof fromIndex != 'number' || guard && (0, _lodashInternalIsIterateeCall['default'])(target, fromIndex, guard)) {\n fromIndex = 0;\n } else {\n fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex || 0;\n }\n return typeof collection == 'string' || !(0, _lodashLangIsArray['default'])(collection) && (0, _lodashLangIsString['default'])(collection) ? fromIndex <= length && collection.indexOf(target, fromIndex) > -1 : !!length && (0, _lodashInternalBaseIndexOf['default'])(collection, target, fromIndex) > -1;\n }\n\n exports['default'] = includes;\n});","define('lodash/collection/indexBy', ['exports', 'lodash/internal/createAggregator'], function (exports, _lodashInternalCreateAggregator) {\n 'use strict';\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` through `iteratee`. The corresponding value\n * of each key is the last element responsible for generating the key. The\n * iteratee function is bound to `thisArg` and invoked with three arguments:\n * (value, index|key, collection).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * var keyData = [\n * { 'dir': 'left', 'code': 97 },\n * { 'dir': 'right', 'code': 100 }\n * ];\n *\n * _.indexBy(keyData, 'dir');\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n *\n * _.indexBy(keyData, function(object) {\n * return String.fromCharCode(object.code);\n * });\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n *\n * _.indexBy(keyData, function(object) {\n * return this.fromCharCode(object.code);\n * }, String);\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n */\n var indexBy = (0, _lodashInternalCreateAggregator['default'])(function (result, value, key) {\n result[key] = value;\n });\n\n exports['default'] = indexBy;\n});","define('lodash/collection/inject', ['exports', 'lodash/collection/reduce'], function (exports, _lodashCollectionReduce) {\n 'use strict';\n\n exports['default'] = _lodashCollectionReduce['default'];\n});","define('lodash/collection/invoke', ['exports', 'lodash/internal/baseEach', 'lodash/internal/invokePath', 'lodash/internal/isArrayLike', 'lodash/internal/isKey', 'lodash/function/restParam'], function (exports, _lodashInternalBaseEach, _lodashInternalInvokePath, _lodashInternalIsArrayLike, _lodashInternalIsKey, _lodashFunctionRestParam) {\n 'use strict';\n\n /**\n * Invokes the method at `path` of each element in `collection`, returning\n * an array of the results of each invoked method. Any additional arguments\n * are provided to each invoked method. If `methodName` is a function it's\n * invoked for, and `this` bound to, each element in `collection`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Array|Function|string} path The path of the method to invoke or\n * the function invoked per iteration.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\n * // => [[1, 5, 7], [1, 2, 3]]\n *\n * _.invoke([123, 456], String.prototype.split, '');\n * // => [['1', '2', '3'], ['4', '5', '6']]\n */\n var invoke = (0, _lodashFunctionRestParam['default'])(function (collection, path, args) {\n var index = -1,\n isFunc = typeof path == 'function',\n isProp = (0, _lodashInternalIsKey['default'])(path),\n result = (0, _lodashInternalIsArrayLike['default'])(collection) ? Array(collection.length) : [];\n\n (0, _lodashInternalBaseEach['default'])(collection, function (value) {\n var func = isFunc ? path : isProp && value != null ? value[path] : undefined;\n result[++index] = func ? func.apply(value, args) : (0, _lodashInternalInvokePath['default'])(value, path, args);\n });\n return result;\n });\n\n exports['default'] = invoke;\n});","define('lodash/collection/map', ['exports', 'lodash/internal/arrayMap', 'lodash/internal/baseCallback', 'lodash/internal/baseMap', 'lodash/lang/isArray'], function (exports, _lodashInternalArrayMap, _lodashInternalBaseCallback, _lodashInternalBaseMap, _lodashLangIsArray) {\n 'use strict';\n\n /**\n * Creates an array of values by running each element in `collection` through\n * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three\n * arguments: (value, index|key, collection).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`,\n * `drop`, `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`,\n * `parseInt`, `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`,\n * `trimLeft`, `trimRight`, `trunc`, `random`, `range`, `sample`, `some`,\n * `sum`, `uniq`, and `words`\n *\n * @static\n * @memberOf _\n * @alias collect\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function timesThree(n) {\n * return n * 3;\n * }\n *\n * _.map([1, 2], timesThree);\n * // => [3, 6]\n *\n * _.map({ 'a': 1, 'b': 2 }, timesThree);\n * // => [3, 6] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // using the `_.property` callback shorthand\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\n function map(collection, iteratee, thisArg) {\n var func = (0, _lodashLangIsArray['default'])(collection) ? _lodashInternalArrayMap['default'] : _lodashInternalBaseMap['default'];\n iteratee = (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 3);\n return func(collection, iteratee);\n }\n\n exports['default'] = map;\n});","define('lodash/collection/max', ['exports', 'lodash/math/max'], function (exports, _lodashMathMax) {\n 'use strict';\n\n exports['default'] = _lodashMathMax['default'];\n});","define('lodash/collection/min', ['exports', 'lodash/math/min'], function (exports, _lodashMathMin) {\n 'use strict';\n\n exports['default'] = _lodashMathMin['default'];\n});","define('lodash/collection/partition', ['exports', 'lodash/internal/createAggregator'], function (exports, _lodashInternalCreateAggregator) {\n 'use strict';\n\n /**\n * Creates an array of elements split into two groups, the first of which\n * contains elements `predicate` returns truthy for, while the second of which\n * contains elements `predicate` returns falsey for. The predicate is bound\n * to `thisArg` and invoked with three arguments: (value, index|key, collection).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Array} Returns the array of grouped elements.\n * @example\n *\n * _.partition([1, 2, 3], function(n) {\n * return n % 2;\n * });\n * // => [[1, 3], [2]]\n *\n * _.partition([1.2, 2.3, 3.4], function(n) {\n * return this.floor(n) % 2;\n * }, Math);\n * // => [[1.2, 3.4], [2.3]]\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true },\n * { 'user': 'pebbles', 'age': 1, 'active': false }\n * ];\n *\n * var mapper = function(array) {\n * return _.pluck(array, 'user');\n * };\n *\n * // using the `_.matches` callback shorthand\n * _.map(_.partition(users, { 'age': 1, 'active': false }), mapper);\n * // => [['pebbles'], ['barney', 'fred']]\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.map(_.partition(users, 'active', false), mapper);\n * // => [['barney', 'pebbles'], ['fred']]\n *\n * // using the `_.property` callback shorthand\n * _.map(_.partition(users, 'active'), mapper);\n * // => [['fred'], ['barney', 'pebbles']]\n */\n var partition = (0, _lodashInternalCreateAggregator['default'])(function (result, value, key) {\n result[key ? 0 : 1].push(value);\n }, function () {\n return [[], []];\n });\n\n exports['default'] = partition;\n});","define('lodash/collection/pluck', ['exports', 'lodash/collection/map', 'lodash/utility/property'], function (exports, _lodashCollectionMap, _lodashUtilityProperty) {\n 'use strict';\n\n /**\n * Gets the property value of `path` from all elements in `collection`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Array|string} path The path of the property to pluck.\n * @returns {Array} Returns the property values.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 }\n * ];\n *\n * _.pluck(users, 'user');\n * // => ['barney', 'fred']\n *\n * var userIndex = _.indexBy(users, 'user');\n * _.pluck(userIndex, 'age');\n * // => [36, 40] (iteration order is not guaranteed)\n */\n function pluck(collection, path) {\n return (0, _lodashCollectionMap['default'])(collection, (0, _lodashUtilityProperty['default'])(path));\n }\n\n exports['default'] = pluck;\n});","define('lodash/collection/reduce', ['exports', 'lodash/internal/arrayReduce', 'lodash/internal/baseEach', 'lodash/internal/createReduce'], function (exports, _lodashInternalArrayReduce, _lodashInternalBaseEach, _lodashInternalCreateReduce) {\n 'use strict';\n\n /**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` through `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not provided the first element of `collection` is used as the initial\n * value. The `iteratee` is bound to `thisArg` and invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `sortByAll`,\n * and `sortByOrder`\n *\n * @static\n * @memberOf _\n * @alias foldl, inject\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.reduce([1, 2], function(total, n) {\n * return total + n;\n * });\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2 }, function(result, n, key) {\n * result[key] = n * 3;\n * return result;\n * }, {});\n * // => { 'a': 3, 'b': 6 } (iteration order is not guaranteed)\n */\n var reduce = (0, _lodashInternalCreateReduce['default'])(_lodashInternalArrayReduce['default'], _lodashInternalBaseEach['default']);\n\n exports['default'] = reduce;\n});","define('lodash/collection/reduceRight', ['exports', 'lodash/internal/arrayReduceRight', 'lodash/internal/baseEachRight', 'lodash/internal/createReduce'], function (exports, _lodashInternalArrayReduceRight, _lodashInternalBaseEachRight, _lodashInternalCreateReduce) {\n 'use strict';\n\n /**\n * This method is like `_.reduce` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @alias foldr\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * var array = [[0, 1], [2, 3], [4, 5]];\n *\n * _.reduceRight(array, function(flattened, other) {\n * return flattened.concat(other);\n * }, []);\n * // => [4, 5, 2, 3, 0, 1]\n */\n var reduceRight = (0, _lodashInternalCreateReduce['default'])(_lodashInternalArrayReduceRight['default'], _lodashInternalBaseEachRight['default']);\n\n exports['default'] = reduceRight;\n});","define('lodash/collection/reject', ['exports', 'lodash/internal/arrayFilter', 'lodash/internal/baseCallback', 'lodash/internal/baseFilter', 'lodash/lang/isArray'], function (exports, _lodashInternalArrayFilter, _lodashInternalBaseCallback, _lodashInternalBaseFilter, _lodashLangIsArray) {\n 'use strict';\n\n /**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Array} Returns the new filtered array.\n * @example\n *\n * _.reject([1, 2, 3, 4], function(n) {\n * return n % 2 == 0;\n * });\n * // => [1, 3]\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * // using the `_.matches` callback shorthand\n * _.pluck(_.reject(users, { 'age': 40, 'active': true }), 'user');\n * // => ['barney']\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.pluck(_.reject(users, 'active', false), 'user');\n * // => ['fred']\n *\n * // using the `_.property` callback shorthand\n * _.pluck(_.reject(users, 'active'), 'user');\n * // => ['barney']\n */\n function reject(collection, predicate, thisArg) {\n var func = (0, _lodashLangIsArray['default'])(collection) ? _lodashInternalArrayFilter['default'] : _lodashInternalBaseFilter['default'];\n predicate = (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3);\n return func(collection, function (value, index, collection) {\n return !predicate(value, index, collection);\n });\n }\n\n exports['default'] = reject;\n});","define('lodash/collection/sample', ['exports', 'lodash/internal/baseRandom', 'lodash/internal/isIterateeCall', 'lodash/lang/toArray', 'lodash/internal/toIterable'], function (exports, _lodashInternalBaseRandom, _lodashInternalIsIterateeCall, _lodashLangToArray, _lodashInternalToIterable) {\n 'use strict';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeMin = Math.min;\n\n /**\n * Gets a random element or `n` random elements from a collection.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to sample.\n * @param {number} [n] The number of elements to sample.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {*} Returns the random sample(s).\n * @example\n *\n * _.sample([1, 2, 3, 4]);\n * // => 2\n *\n * _.sample([1, 2, 3, 4], 2);\n * // => [3, 1]\n */\n function sample(collection, n, guard) {\n if (guard ? (0, _lodashInternalIsIterateeCall['default'])(collection, n, guard) : n == null) {\n collection = (0, _lodashInternalToIterable['default'])(collection);\n var length = collection.length;\n return length > 0 ? collection[(0, _lodashInternalBaseRandom['default'])(0, length - 1)] : undefined;\n }\n var index = -1,\n result = (0, _lodashLangToArray['default'])(collection),\n length = result.length,\n lastIndex = length - 1;\n\n n = nativeMin(n < 0 ? 0 : +n || 0, length);\n while (++index < n) {\n var rand = (0, _lodashInternalBaseRandom['default'])(index, lastIndex),\n value = result[rand];\n\n result[rand] = result[index];\n result[index] = value;\n }\n result.length = n;\n return result;\n }\n\n exports['default'] = sample;\n});","define('lodash/collection/select', ['exports', 'lodash/collection/filter'], function (exports, _lodashCollectionFilter) {\n 'use strict';\n\n exports['default'] = _lodashCollectionFilter['default'];\n});","define('lodash/collection/shuffle', ['exports', 'lodash/collection/sample'], function (exports, _lodashCollectionSample) {\n 'use strict';\n\n /** Used as references for `-Infinity` and `Infinity`. */\n var POSITIVE_INFINITY = Number.POSITIVE_INFINITY;\n\n /**\n * Creates an array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n * @example\n *\n * _.shuffle([1, 2, 3, 4]);\n * // => [4, 1, 3, 2]\n */\n function shuffle(collection) {\n return (0, _lodashCollectionSample['default'])(collection, POSITIVE_INFINITY);\n }\n\n exports['default'] = shuffle;\n});","define('lodash/collection/size', ['exports', 'lodash/internal/getLength', 'lodash/internal/isLength', 'lodash/object/keys'], function (exports, _lodashInternalGetLength, _lodashInternalIsLength, _lodashObjectKeys) {\n 'use strict';\n\n /**\n * Gets the size of `collection` by returning its length for array-like\n * values or the number of own enumerable properties for objects.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @returns {number} Returns the size of `collection`.\n * @example\n *\n * _.size([1, 2, 3]);\n * // => 3\n *\n * _.size({ 'a': 1, 'b': 2 });\n * // => 2\n *\n * _.size('pebbles');\n * // => 7\n */\n function size(collection) {\n var length = collection ? (0, _lodashInternalGetLength['default'])(collection) : 0;\n return (0, _lodashInternalIsLength['default'])(length) ? length : (0, _lodashObjectKeys['default'])(collection).length;\n }\n\n exports['default'] = size;\n});","define('lodash/collection/some', ['exports', 'lodash/internal/arraySome', 'lodash/internal/baseCallback', 'lodash/internal/baseSome', 'lodash/lang/isArray', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalArraySome, _lodashInternalBaseCallback, _lodashInternalBaseSome, _lodashLangIsArray, _lodashInternalIsIterateeCall) {\n 'use strict';\n\n /**\n * Checks if `predicate` returns truthy for **any** element of `collection`.\n * The function returns as soon as it finds a passing value and does not iterate\n * over the entire collection. The predicate is bound to `thisArg` and invoked\n * with three arguments: (value, index|key, collection).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @alias any\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // using the `_.matches` callback shorthand\n * _.some(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.some(users, 'active', false);\n * // => true\n *\n * // using the `_.property` callback shorthand\n * _.some(users, 'active');\n * // => true\n */\n function some(collection, predicate, thisArg) {\n var func = (0, _lodashLangIsArray['default'])(collection) ? _lodashInternalArraySome['default'] : _lodashInternalBaseSome['default'];\n if (thisArg && (0, _lodashInternalIsIterateeCall['default'])(collection, predicate, thisArg)) {\n predicate = undefined;\n }\n if (typeof predicate != 'function' || thisArg !== undefined) {\n predicate = (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3);\n }\n return func(collection, predicate);\n }\n\n exports['default'] = some;\n});","define('lodash/collection/sortBy', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseMap', 'lodash/internal/baseSortBy', 'lodash/internal/compareAscending', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseMap, _lodashInternalBaseSortBy, _lodashInternalCompareAscending, _lodashInternalIsIterateeCall) {\n 'use strict';\n\n /**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection through `iteratee`. This method performs\n * a stable sort, that is, it preserves the original sort order of equal elements.\n * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n * (value, index|key, collection).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * _.sortBy([1, 2, 3], function(n) {\n * return Math.sin(n);\n * });\n * // => [3, 1, 2]\n *\n * _.sortBy([1, 2, 3], function(n) {\n * return this.sin(n);\n * }, Math);\n * // => [3, 1, 2]\n *\n * var users = [\n * { 'user': 'fred' },\n * { 'user': 'pebbles' },\n * { 'user': 'barney' }\n * ];\n *\n * // using the `_.property` callback shorthand\n * _.pluck(_.sortBy(users, 'user'), 'user');\n * // => ['barney', 'fred', 'pebbles']\n */\n function sortBy(collection, iteratee, thisArg) {\n if (collection == null) {\n return [];\n }\n if (thisArg && (0, _lodashInternalIsIterateeCall['default'])(collection, iteratee, thisArg)) {\n iteratee = undefined;\n }\n var index = -1;\n iteratee = (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 3);\n\n var result = (0, _lodashInternalBaseMap['default'])(collection, function (value, key, collection) {\n return { 'criteria': iteratee(value, key, collection), 'index': ++index, 'value': value };\n });\n return (0, _lodashInternalBaseSortBy['default'])(result, _lodashInternalCompareAscending['default']);\n }\n\n exports['default'] = sortBy;\n});","define('lodash/collection/sortByAll', ['exports', 'lodash/internal/baseFlatten', 'lodash/internal/baseSortByOrder', 'lodash/internal/isIterateeCall', 'lodash/function/restParam'], function (exports, _lodashInternalBaseFlatten, _lodashInternalBaseSortByOrder, _lodashInternalIsIterateeCall, _lodashFunctionRestParam) {\n 'use strict';\n\n /**\n * This method is like `_.sortBy` except that it can sort by multiple iteratees\n * or property names.\n *\n * If a property name is provided for an iteratee the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If an object is provided for an iteratee the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {...(Function|Function[]|Object|Object[]|string|string[])} iteratees\n * The iteratees to sort by, specified as individual values or arrays of values.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 42 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.map(_.sortByAll(users, ['user', 'age']), _.values);\n * // => [['barney', 34], ['barney', 36], ['fred', 42], ['fred', 48]]\n *\n * _.map(_.sortByAll(users, 'user', function(chr) {\n * return Math.floor(chr.age / 10);\n * }), _.values);\n * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]\n */\n var sortByAll = (0, _lodashFunctionRestParam['default'])(function (collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var guard = iteratees[2];\n if (guard && (0, _lodashInternalIsIterateeCall['default'])(iteratees[0], iteratees[1], guard)) {\n iteratees.length = 1;\n }\n return (0, _lodashInternalBaseSortByOrder['default'])(collection, (0, _lodashInternalBaseFlatten['default'])(iteratees), []);\n });\n\n exports['default'] = sortByAll;\n});","define('lodash/collection/sortByOrder', ['exports', 'lodash/internal/baseSortByOrder', 'lodash/lang/isArray', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseSortByOrder, _lodashLangIsArray, _lodashInternalIsIterateeCall) {\n 'use strict';\n\n /**\n * This method is like `_.sortByAll` except that it allows specifying the\n * sort orders of the iteratees to sort by. If `orders` is unspecified, all\n * values are sorted in ascending order. Otherwise, a value is sorted in\n * ascending order if its corresponding order is \"asc\", and descending if \"desc\".\n *\n * If a property name is provided for an iteratee the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If an object is provided for an iteratee the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {boolean[]} [orders] The sort orders of `iteratees`.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 34 },\n * { 'user': 'fred', 'age': 42 },\n * { 'user': 'barney', 'age': 36 }\n * ];\n *\n * // sort by `user` in ascending order and by `age` in descending order\n * _.map(_.sortByOrder(users, ['user', 'age'], ['asc', 'desc']), _.values);\n * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]\n */\n function sortByOrder(collection, iteratees, orders, guard) {\n if (collection == null) {\n return [];\n }\n if (guard && (0, _lodashInternalIsIterateeCall['default'])(iteratees, orders, guard)) {\n orders = undefined;\n }\n if (!(0, _lodashLangIsArray['default'])(iteratees)) {\n iteratees = iteratees == null ? [] : [iteratees];\n }\n if (!(0, _lodashLangIsArray['default'])(orders)) {\n orders = orders == null ? [] : [orders];\n }\n return (0, _lodashInternalBaseSortByOrder['default'])(collection, iteratees, orders);\n }\n\n exports['default'] = sortByOrder;\n});","define('lodash/collection/sum', ['exports', 'lodash/math/sum'], function (exports, _lodashMathSum) {\n 'use strict';\n\n exports['default'] = _lodashMathSum['default'];\n});","define('lodash/collection/where', ['exports', 'lodash/internal/baseMatches', 'lodash/collection/filter'], function (exports, _lodashInternalBaseMatches, _lodashCollectionFilter) {\n 'use strict';\n\n /**\n * Performs a deep comparison between each element in `collection` and the\n * source object, returning an array of all elements that have equivalent\n * property values.\n *\n * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n * numbers, `Object` objects, regexes, and strings. Objects are compared by\n * their own, not inherited, enumerable properties. For comparing a single\n * own or inherited property value see `_.matchesProperty`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to search.\n * @param {Object} source The object of property values to match.\n * @returns {Array} Returns the new filtered array.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false, 'pets': ['hoppy'] },\n * { 'user': 'fred', 'age': 40, 'active': true, 'pets': ['baby puss', 'dino'] }\n * ];\n *\n * _.pluck(_.where(users, { 'age': 36, 'active': false }), 'user');\n * // => ['barney']\n *\n * _.pluck(_.where(users, { 'pets': ['dino'] }), 'user');\n * // => ['fred']\n */\n function where(collection, source) {\n return (0, _lodashCollectionFilter['default'])(collection, (0, _lodashInternalBaseMatches['default'])(source));\n }\n\n exports['default'] = where;\n});","define('lodash/date', ['exports', 'lodash/date/now'], function (exports, _lodashDateNow) {\n 'use strict';\n\n exports['default'] = {\n 'now': _lodashDateNow['default']\n };\n});","define('lodash/date/now', ['exports', 'lodash/internal/getNative'], function (exports, _lodashInternalGetNative) {\n 'use strict';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeNow = (0, _lodashInternalGetNative['default'])(Date, 'now');\n\n /**\n * Gets the number of milliseconds that have elapsed since the Unix epoch\n * (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @category Date\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => logs the number of milliseconds it took for the deferred function to be invoked\n */\n var now = nativeNow || function () {\n return new Date().getTime();\n };\n\n exports['default'] = now;\n});","define('lodash/function', ['exports', 'lodash/function/after', 'lodash/function/ary', 'lodash/function/backflow', 'lodash/function/before', 'lodash/function/bind', 'lodash/function/bindAll', 'lodash/function/bindKey', 'lodash/function/compose', 'lodash/function/curry', 'lodash/function/curryRight', 'lodash/function/debounce', 'lodash/function/defer', 'lodash/function/delay', 'lodash/function/flow', 'lodash/function/flowRight', 'lodash/function/memoize', 'lodash/function/modArgs', 'lodash/function/negate', 'lodash/function/once', 'lodash/function/partial', 'lodash/function/partialRight', 'lodash/function/rearg', 'lodash/function/restParam', 'lodash/function/spread', 'lodash/function/throttle', 'lodash/function/wrap'], function (exports, _lodashFunctionAfter, _lodashFunctionAry, _lodashFunctionBackflow, _lodashFunctionBefore, _lodashFunctionBind, _lodashFunctionBindAll, _lodashFunctionBindKey, _lodashFunctionCompose, _lodashFunctionCurry, _lodashFunctionCurryRight, _lodashFunctionDebounce, _lodashFunctionDefer, _lodashFunctionDelay, _lodashFunctionFlow, _lodashFunctionFlowRight, _lodashFunctionMemoize, _lodashFunctionModArgs, _lodashFunctionNegate, _lodashFunctionOnce, _lodashFunctionPartial, _lodashFunctionPartialRight, _lodashFunctionRearg, _lodashFunctionRestParam, _lodashFunctionSpread, _lodashFunctionThrottle, _lodashFunctionWrap) {\n 'use strict';\n\n exports['default'] = {\n 'after': _lodashFunctionAfter['default'],\n 'ary': _lodashFunctionAry['default'],\n 'backflow': _lodashFunctionBackflow['default'],\n 'before': _lodashFunctionBefore['default'],\n 'bind': _lodashFunctionBind['default'],\n 'bindAll': _lodashFunctionBindAll['default'],\n 'bindKey': _lodashFunctionBindKey['default'],\n 'compose': _lodashFunctionCompose['default'],\n 'curry': _lodashFunctionCurry['default'],\n 'curryRight': _lodashFunctionCurryRight['default'],\n 'debounce': _lodashFunctionDebounce['default'],\n 'defer': _lodashFunctionDefer['default'],\n 'delay': _lodashFunctionDelay['default'],\n 'flow': _lodashFunctionFlow['default'],\n 'flowRight': _lodashFunctionFlowRight['default'],\n 'memoize': _lodashFunctionMemoize['default'],\n 'modArgs': _lodashFunctionModArgs['default'],\n 'negate': _lodashFunctionNegate['default'],\n 'once': _lodashFunctionOnce['default'],\n 'partial': _lodashFunctionPartial['default'],\n 'partialRight': _lodashFunctionPartialRight['default'],\n 'rearg': _lodashFunctionRearg['default'],\n 'restParam': _lodashFunctionRestParam['default'],\n 'spread': _lodashFunctionSpread['default'],\n 'throttle': _lodashFunctionThrottle['default'],\n 'wrap': _lodashFunctionWrap['default']\n };\n});","define('lodash/function/after', ['exports', 'lodash/internal/root'], function (exports, _lodashInternalRoot) {\n 'use strict';\n\n /** Used as the `TypeError` message for \"Functions\" methods. */\n var FUNC_ERROR_TEXT = 'Expected a function';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeIsFinite = _lodashInternalRoot['default'].isFinite;\n\n /**\n * The opposite of `_.before`; this method creates a function that invokes\n * `func` once it's called `n` or more times.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {number} n The number of calls before `func` is invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var saves = ['profile', 'settings'];\n *\n * var done = _.after(saves.length, function() {\n * console.log('done saving!');\n * });\n *\n * _.forEach(saves, function(type) {\n * asyncSave({ 'type': type, 'complete': done });\n * });\n * // => logs 'done saving!' after the two async saves have completed\n */\n function after(n, func) {\n if (typeof func != 'function') {\n if (typeof n == 'function') {\n var temp = n;\n n = func;\n func = temp;\n } else {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n }\n n = nativeIsFinite(n = +n) ? n : 0;\n return function () {\n if (--n < 1) {\n return func.apply(this, arguments);\n }\n };\n }\n\n exports['default'] = after;\n});","define('lodash/function/ary', ['exports', 'lodash/internal/createWrapper', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalCreateWrapper, _lodashInternalIsIterateeCall) {\n 'use strict';\n\n /** Used to compose bitmasks for wrapper metadata. */\n var ARY_FLAG = 128;\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeMax = Math.max;\n\n /**\n * Creates a function that accepts up to `n` arguments ignoring any\n * additional arguments.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @param {number} [n=func.length] The arity cap.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Function} Returns the new function.\n * @example\n *\n * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n * // => [6, 8, 10]\n */\n function ary(func, n, guard) {\n if (guard && (0, _lodashInternalIsIterateeCall['default'])(func, n, guard)) {\n n = undefined;\n }\n n = func && n == null ? func.length : nativeMax(+n || 0, 0);\n return (0, _lodashInternalCreateWrapper['default'])(func, ARY_FLAG, undefined, undefined, undefined, undefined, n);\n }\n\n exports['default'] = ary;\n});","define('lodash/function/backflow', ['exports', 'lodash/function/flowRight'], function (exports, _lodashFunctionFlowRight) {\n 'use strict';\n\n exports['default'] = _lodashFunctionFlowRight['default'];\n});","define('lodash/function/before', ['exports'], function (exports) {\n /** Used as the `TypeError` message for \"Functions\" methods. */\n 'use strict';\n\n var FUNC_ERROR_TEXT = 'Expected a function';\n\n /**\n * Creates a function that invokes `func`, with the `this` binding and arguments\n * of the created function, while it's called less than `n` times. Subsequent\n * calls to the created function return the result of the last `func` invocation.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {number} n The number of calls at which `func` is no longer invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * jQuery('#add').on('click', _.before(5, addContactToList));\n * // => allows adding up to 4 contacts to the list\n */\n function before(n, func) {\n var result;\n if (typeof func != 'function') {\n if (typeof n == 'function') {\n var temp = n;\n n = func;\n func = temp;\n } else {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n }\n return function () {\n if (--n > 0) {\n result = func.apply(this, arguments);\n }\n if (n <= 1) {\n func = undefined;\n }\n return result;\n };\n }\n\n exports['default'] = before;\n});","define('lodash/function/bind', ['exports', 'lodash/internal/createWrapper', 'lodash/internal/replaceHolders', 'lodash/function/restParam'], function (exports, _lodashInternalCreateWrapper, _lodashInternalReplaceHolders, _lodashFunctionRestParam) {\n 'use strict';\n\n /** Used to compose bitmasks for wrapper metadata. */\n var BIND_FLAG = 1,\n PARTIAL_FLAG = 32;\n\n /**\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\n * and prepends any additional `_.bind` arguments to those provided to the\n * bound function.\n *\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for partially applied arguments.\n *\n * **Note:** Unlike native `Function#bind` this method does not set the \"length\"\n * property of bound functions.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var greet = function(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * };\n *\n * var object = { 'user': 'fred' };\n *\n * var bound = _.bind(greet, object, 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * // using placeholders\n * var bound = _.bind(greet, object, _, '!');\n * bound('hi');\n * // => 'hi fred!'\n */\n var bind = (0, _lodashFunctionRestParam['default'])(function (func, thisArg, partials) {\n var bitmask = BIND_FLAG;\n if (partials.length) {\n var holders = (0, _lodashInternalReplaceHolders['default'])(partials, bind.placeholder);\n bitmask |= PARTIAL_FLAG;\n }\n return (0, _lodashInternalCreateWrapper['default'])(func, bitmask, thisArg, partials, holders);\n });\n\n // Assign default placeholders.\n bind.placeholder = {};\n\n exports['default'] = bind;\n});","define('lodash/function/bindAll', ['exports', 'lodash/internal/baseFlatten', 'lodash/internal/createWrapper', 'lodash/object/functions', 'lodash/function/restParam'], function (exports, _lodashInternalBaseFlatten, _lodashInternalCreateWrapper, _lodashObjectFunctions, _lodashFunctionRestParam) {\n 'use strict';\n\n /** Used to compose bitmasks for wrapper metadata. */\n var BIND_FLAG = 1;\n\n /**\n * Binds methods of an object to the object itself, overwriting the existing\n * method. Method names may be specified as individual arguments or as arrays\n * of method names. If no method names are provided all enumerable function\n * properties, own and inherited, of `object` are bound.\n *\n * **Note:** This method does not set the \"length\" property of bound functions.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Object} object The object to bind and assign the bound methods to.\n * @param {...(string|string[])} [methodNames] The object method names to bind,\n * specified as individual method names or arrays of method names.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var view = {\n * 'label': 'docs',\n * 'onClick': function() {\n * console.log('clicked ' + this.label);\n * }\n * };\n *\n * _.bindAll(view);\n * jQuery('#docs').on('click', view.onClick);\n * // => logs 'clicked docs' when the element is clicked\n */\n var bindAll = (0, _lodashFunctionRestParam['default'])(function (object, methodNames) {\n methodNames = methodNames.length ? (0, _lodashInternalBaseFlatten['default'])(methodNames) : (0, _lodashObjectFunctions['default'])(object);\n\n var index = -1,\n length = methodNames.length;\n\n while (++index < length) {\n var key = methodNames[index];\n object[key] = (0, _lodashInternalCreateWrapper['default'])(object[key], BIND_FLAG, object);\n }\n return object;\n });\n\n exports['default'] = bindAll;\n});","define('lodash/function/bindKey', ['exports', 'lodash/internal/createWrapper', 'lodash/internal/replaceHolders', 'lodash/function/restParam'], function (exports, _lodashInternalCreateWrapper, _lodashInternalReplaceHolders, _lodashFunctionRestParam) {\n 'use strict';\n\n /** Used to compose bitmasks for wrapper metadata. */\n var BIND_FLAG = 1,\n BIND_KEY_FLAG = 2,\n PARTIAL_FLAG = 32;\n\n /**\n * Creates a function that invokes the method at `object[key]` and prepends\n * any additional `_.bindKey` arguments to those provided to the bound function.\n *\n * This method differs from `_.bind` by allowing bound functions to reference\n * methods that may be redefined or don't yet exist.\n * See [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n * for more details.\n *\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Object} object The object the method belongs to.\n * @param {string} key The key of the method.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var object = {\n * 'user': 'fred',\n * 'greet': function(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n * };\n *\n * var bound = _.bindKey(object, 'greet', 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * object.greet = function(greeting, punctuation) {\n * return greeting + 'ya ' + this.user + punctuation;\n * };\n *\n * bound('!');\n * // => 'hiya fred!'\n *\n * // using placeholders\n * var bound = _.bindKey(object, 'greet', _, '!');\n * bound('hi');\n * // => 'hiya fred!'\n */\n var bindKey = (0, _lodashFunctionRestParam['default'])(function (object, key, partials) {\n var bitmask = BIND_FLAG | BIND_KEY_FLAG;\n if (partials.length) {\n var holders = (0, _lodashInternalReplaceHolders['default'])(partials, bindKey.placeholder);\n bitmask |= PARTIAL_FLAG;\n }\n return (0, _lodashInternalCreateWrapper['default'])(key, bitmask, object, partials, holders);\n });\n\n // Assign default placeholders.\n bindKey.placeholder = {};\n\n exports['default'] = bindKey;\n});","define('lodash/function/compose', ['exports', 'lodash/function/flowRight'], function (exports, _lodashFunctionFlowRight) {\n 'use strict';\n\n exports['default'] = _lodashFunctionFlowRight['default'];\n});","define('lodash/function/curry', ['exports', 'lodash/internal/createCurry'], function (exports, _lodashInternalCreateCurry) {\n 'use strict';\n\n /** Used to compose bitmasks for wrapper metadata. */\n var CURRY_FLAG = 8;\n\n /**\n * Creates a function that accepts one or more arguments of `func` that when\n * called either invokes `func` returning its result, if all `func` arguments\n * have been provided, or returns a function that accepts one or more of the\n * remaining `func` arguments, and so on. The arity of `func` may be specified\n * if `func.length` is not sufficient.\n *\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for provided arguments.\n *\n * **Note:** This method does not set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curry(abc);\n *\n * curried(1)(2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // using placeholders\n * curried(1)(_, 3)(2);\n * // => [1, 2, 3]\n */\n var curry = (0, _lodashInternalCreateCurry['default'])(CURRY_FLAG);\n\n // Assign default placeholders.\n curry.placeholder = {};\n\n exports['default'] = curry;\n});","define('lodash/function/curryRight', ['exports', 'lodash/internal/createCurry'], function (exports, _lodashInternalCreateCurry) {\n 'use strict';\n\n /** Used to compose bitmasks for wrapper metadata. */\n var CURRY_RIGHT_FLAG = 16;\n\n /**\n * This method is like `_.curry` except that arguments are applied to `func`\n * in the manner of `_.partialRight` instead of `_.partial`.\n *\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for provided arguments.\n *\n * **Note:** This method does not set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curryRight(abc);\n *\n * curried(3)(2)(1);\n * // => [1, 2, 3]\n *\n * curried(2, 3)(1);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // using placeholders\n * curried(3)(1, _)(2);\n * // => [1, 2, 3]\n */\n var curryRight = (0, _lodashInternalCreateCurry['default'])(CURRY_RIGHT_FLAG);\n\n // Assign default placeholders.\n curryRight.placeholder = {};\n\n exports['default'] = curryRight;\n});","define('lodash/function/debounce', ['exports', 'lodash/lang/isObject', 'lodash/date/now'], function (exports, _lodashLangIsObject, _lodashDateNow) {\n 'use strict';\n\n /** Used as the `TypeError` message for \"Functions\" methods. */\n var FUNC_ERROR_TEXT = 'Expected a function';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeMax = Math.max;\n\n /**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed invocations. Provide an options object to indicate that `func`\n * should be invoked on the leading and/or trailing edge of the `wait` timeout.\n * Subsequent calls to the debounced function return the result of the last\n * `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the debounced function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=false] Specify invoking on the leading\n * edge of the timeout.\n * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n * delayed before it's invoked.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n * edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // avoid costly calculations while the window size is in flux\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // invoke `sendMail` when the click event is fired, debouncing subsequent calls\n * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // ensure `batchLog` is invoked once after 1 second of debounced calls\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', _.debounce(batchLog, 250, {\n * 'maxWait': 1000\n * }));\n *\n * // cancel a debounced call\n * var todoChanges = _.debounce(batchLog, 1000);\n * Object.observe(models.todo, todoChanges);\n *\n * Object.observe(models, function(changes) {\n * if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) {\n * todoChanges.cancel();\n * }\n * }, ['delete']);\n *\n * // ...at some point `models.todo` is changed\n * models.todo.completed = true;\n *\n * // ...before 1 second has passed `models.todo` is deleted\n * // which cancels the debounced `todoChanges` call\n * delete models.todo;\n */\n function debounce(func, wait, options) {\n var args,\n maxTimeoutId,\n result,\n stamp,\n thisArg,\n timeoutId,\n trailingCall,\n lastCalled = 0,\n maxWait = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = wait < 0 ? 0 : +wait || 0;\n if (options === true) {\n var leading = true;\n trailing = false;\n } else if ((0, _lodashLangIsObject['default'])(options)) {\n leading = !!options.leading;\n maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function cancel() {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n if (maxTimeoutId) {\n clearTimeout(maxTimeoutId);\n }\n lastCalled = 0;\n maxTimeoutId = timeoutId = trailingCall = undefined;\n }\n\n function complete(isCalled, id) {\n if (id) {\n clearTimeout(id);\n }\n maxTimeoutId = timeoutId = trailingCall = undefined;\n if (isCalled) {\n lastCalled = (0, _lodashDateNow['default'])();\n result = func.apply(thisArg, args);\n if (!timeoutId && !maxTimeoutId) {\n args = thisArg = undefined;\n }\n }\n }\n\n function delayed() {\n var remaining = wait - ((0, _lodashDateNow['default'])() - stamp);\n if (remaining <= 0 || remaining > wait) {\n complete(trailingCall, maxTimeoutId);\n } else {\n timeoutId = setTimeout(delayed, remaining);\n }\n }\n\n function maxDelayed() {\n complete(trailing, timeoutId);\n }\n\n function debounced() {\n args = arguments;\n stamp = (0, _lodashDateNow['default'])();\n thisArg = this;\n trailingCall = trailing && (timeoutId || !leading);\n\n if (maxWait === false) {\n var leadingCall = leading && !timeoutId;\n } else {\n if (!maxTimeoutId && !leading) {\n lastCalled = stamp;\n }\n var remaining = maxWait - (stamp - lastCalled),\n isCalled = remaining <= 0 || remaining > maxWait;\n\n if (isCalled) {\n if (maxTimeoutId) {\n maxTimeoutId = clearTimeout(maxTimeoutId);\n }\n lastCalled = stamp;\n result = func.apply(thisArg, args);\n } else if (!maxTimeoutId) {\n maxTimeoutId = setTimeout(maxDelayed, remaining);\n }\n }\n if (isCalled && timeoutId) {\n timeoutId = clearTimeout(timeoutId);\n } else if (!timeoutId && wait !== maxWait) {\n timeoutId = setTimeout(delayed, wait);\n }\n if (leadingCall) {\n isCalled = true;\n result = func.apply(thisArg, args);\n }\n if (isCalled && !timeoutId && !maxTimeoutId) {\n args = thisArg = undefined;\n }\n return result;\n }\n debounced.cancel = cancel;\n return debounced;\n }\n\n exports['default'] = debounce;\n});","define('lodash/function/defer', ['exports', 'lodash/internal/baseDelay', 'lodash/function/restParam'], function (exports, _lodashInternalBaseDelay, _lodashFunctionRestParam) {\n 'use strict';\n\n /**\n * Defers invoking the `func` until the current call stack has cleared. Any\n * additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to defer.\n * @param {...*} [args] The arguments to invoke the function with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.defer(function(text) {\n * console.log(text);\n * }, 'deferred');\n * // logs 'deferred' after one or more milliseconds\n */\n var defer = (0, _lodashFunctionRestParam['default'])(function (func, args) {\n return (0, _lodashInternalBaseDelay['default'])(func, 1, args);\n });\n\n exports['default'] = defer;\n});","define('lodash/function/delay', ['exports', 'lodash/internal/baseDelay', 'lodash/function/restParam'], function (exports, _lodashInternalBaseDelay, _lodashFunctionRestParam) {\n 'use strict';\n\n /**\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\n * provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {...*} [args] The arguments to invoke the function with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.delay(function(text) {\n * console.log(text);\n * }, 1000, 'later');\n * // => logs 'later' after one second\n */\n var delay = (0, _lodashFunctionRestParam['default'])(function (func, wait, args) {\n return (0, _lodashInternalBaseDelay['default'])(func, wait, args);\n });\n\n exports['default'] = delay;\n});","define('lodash/function/flow', ['exports', 'lodash/internal/createFlow'], function (exports, _lodashInternalCreateFlow) {\n 'use strict';\n\n /**\n * Creates a function that returns the result of invoking the provided\n * functions with the `this` binding of the created function, where each\n * successive invocation is supplied the return value of the previous.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {...Function} [funcs] Functions to invoke.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var addSquare = _.flow(_.add, square);\n * addSquare(1, 2);\n * // => 9\n */\n var flow = (0, _lodashInternalCreateFlow['default'])();\n\n exports['default'] = flow;\n});","define('lodash/function/flowRight', ['exports', 'lodash/internal/createFlow'], function (exports, _lodashInternalCreateFlow) {\n 'use strict';\n\n /**\n * This method is like `_.flow` except that it creates a function that\n * invokes the provided functions from right to left.\n *\n * @static\n * @memberOf _\n * @alias backflow, compose\n * @category Function\n * @param {...Function} [funcs] Functions to invoke.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var addSquare = _.flowRight(square, _.add);\n * addSquare(1, 2);\n * // => 9\n */\n var flowRight = (0, _lodashInternalCreateFlow['default'])(true);\n\n exports['default'] = flowRight;\n});","define('lodash/function/memoize', ['exports', 'lodash/internal/MapCache'], function (exports, _lodashInternalMapCache) {\n 'use strict';\n\n /** Used as the `TypeError` message for \"Functions\" methods. */\n var FUNC_ERROR_TEXT = 'Expected a function';\n\n /**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is coerced to a string and used as the\n * cache key. The `func` is invoked with the `this` binding of the memoized\n * function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the [`Map`](http://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoizing function.\n * @example\n *\n * var upperCase = _.memoize(function(string) {\n * return string.toUpperCase();\n * });\n *\n * upperCase('fred');\n * // => 'FRED'\n *\n * // modifying the result cache\n * upperCase.cache.set('fred', 'BARNEY');\n * upperCase('fred');\n * // => 'BARNEY'\n *\n * // replacing `_.memoize.Cache`\n * var object = { 'user': 'fred' };\n * var other = { 'user': 'barney' };\n * var identity = _.memoize(_.identity);\n *\n * identity(object);\n * // => { 'user': 'fred' }\n * identity(other);\n * // => { 'user': 'fred' }\n *\n * _.memoize.Cache = WeakMap;\n * var identity = _.memoize(_.identity);\n *\n * identity(object);\n * // => { 'user': 'fred' }\n * identity(other);\n * // => { 'user': 'barney' }\n */\n function memoize(func, resolver) {\n if (typeof func != 'function' || resolver && typeof resolver != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function memoized() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result);\n return result;\n };\n memoized.cache = new memoize.Cache();\n return memoized;\n }\n\n // Assign cache to `_.memoize`.\n memoize.Cache = _lodashInternalMapCache['default'];\n\n exports['default'] = memoize;\n});","define('lodash/function/modArgs', ['exports', 'lodash/internal/arrayEvery', 'lodash/internal/baseFlatten', 'lodash/internal/baseIsFunction', 'lodash/function/restParam'], function (exports, _lodashInternalArrayEvery, _lodashInternalBaseFlatten, _lodashInternalBaseIsFunction, _lodashFunctionRestParam) {\n 'use strict';\n\n /** Used as the `TypeError` message for \"Functions\" methods. */\n var FUNC_ERROR_TEXT = 'Expected a function';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeMin = Math.min;\n\n /**\n * Creates a function that runs each argument through a corresponding\n * transform function.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to wrap.\n * @param {...(Function|Function[])} [transforms] The functions to transform\n * arguments, specified as individual functions or arrays of functions.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function doubled(n) {\n * return n * 2;\n * }\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var modded = _.modArgs(function(x, y) {\n * return [x, y];\n * }, square, doubled);\n *\n * modded(1, 2);\n * // => [1, 4]\n *\n * modded(5, 10);\n * // => [25, 20]\n */\n var modArgs = (0, _lodashFunctionRestParam['default'])(function (func, transforms) {\n transforms = (0, _lodashInternalBaseFlatten['default'])(transforms);\n if (typeof func != 'function' || !(0, _lodashInternalArrayEvery['default'])(transforms, _lodashInternalBaseIsFunction['default'])) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var length = transforms.length;\n return (0, _lodashFunctionRestParam['default'])(function (args) {\n var index = nativeMin(args.length, length);\n while (index--) {\n args[index] = transforms[index](args[index]);\n }\n return func.apply(this, args);\n });\n });\n\n exports['default'] = modArgs;\n});","define('lodash/function/negate', ['exports'], function (exports) {\n /** Used as the `TypeError` message for \"Functions\" methods. */\n 'use strict';\n\n var FUNC_ERROR_TEXT = 'Expected a function';\n\n /**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\n function negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function () {\n return !predicate.apply(this, arguments);\n };\n }\n\n exports['default'] = negate;\n});","define('lodash/function/once', ['exports', 'lodash/function/before'], function (exports, _lodashFunctionBefore) {\n 'use strict';\n\n /**\n * Creates a function that is restricted to invoking `func` once. Repeat calls\n * to the function return the value of the first call. The `func` is invoked\n * with the `this` binding and arguments of the created function.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var initialize = _.once(createApplication);\n * initialize();\n * initialize();\n * // `initialize` invokes `createApplication` once\n */\n function once(func) {\n return (0, _lodashFunctionBefore['default'])(2, func);\n }\n\n exports['default'] = once;\n});","define('lodash/function/partial', ['exports', 'lodash/internal/createPartial'], function (exports, _lodashInternalCreatePartial) {\n 'use strict';\n\n /** Used to compose bitmasks for wrapper metadata. */\n var PARTIAL_FLAG = 32;\n\n /**\n * Creates a function that invokes `func` with `partial` arguments prepended\n * to those provided to the new function. This method is like `_.bind` except\n * it does **not** alter the `this` binding.\n *\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method does not set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * var greet = function(greeting, name) {\n * return greeting + ' ' + name;\n * };\n *\n * var sayHelloTo = _.partial(greet, 'hello');\n * sayHelloTo('fred');\n * // => 'hello fred'\n *\n * // using placeholders\n * var greetFred = _.partial(greet, _, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n */\n var partial = (0, _lodashInternalCreatePartial['default'])(PARTIAL_FLAG);\n\n // Assign default placeholders.\n partial.placeholder = {};\n\n exports['default'] = partial;\n});","define('lodash/function/partialRight', ['exports', 'lodash/internal/createPartial'], function (exports, _lodashInternalCreatePartial) {\n 'use strict';\n\n /** Used to compose bitmasks for wrapper metadata. */\n var PARTIAL_RIGHT_FLAG = 64;\n\n /**\n * This method is like `_.partial` except that partially applied arguments\n * are appended to those provided to the new function.\n *\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method does not set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * var greet = function(greeting, name) {\n * return greeting + ' ' + name;\n * };\n *\n * var greetFred = _.partialRight(greet, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n *\n * // using placeholders\n * var sayHelloTo = _.partialRight(greet, 'hello', _);\n * sayHelloTo('fred');\n * // => 'hello fred'\n */\n var partialRight = (0, _lodashInternalCreatePartial['default'])(PARTIAL_RIGHT_FLAG);\n\n // Assign default placeholders.\n partialRight.placeholder = {};\n\n exports['default'] = partialRight;\n});","define('lodash/function/rearg', ['exports', 'lodash/internal/baseFlatten', 'lodash/internal/createWrapper', 'lodash/function/restParam'], function (exports, _lodashInternalBaseFlatten, _lodashInternalCreateWrapper, _lodashFunctionRestParam) {\n 'use strict';\n\n /** Used to compose bitmasks for wrapper metadata. */\n var REARG_FLAG = 256;\n\n /**\n * Creates a function that invokes `func` with arguments arranged according\n * to the specified indexes where the argument value at the first index is\n * provided as the first argument, the argument value at the second index is\n * provided as the second argument, and so on.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to rearrange arguments for.\n * @param {...(number|number[])} indexes The arranged argument indexes,\n * specified as individual indexes or arrays of indexes.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var rearged = _.rearg(function(a, b, c) {\n * return [a, b, c];\n * }, 2, 0, 1);\n *\n * rearged('b', 'c', 'a')\n * // => ['a', 'b', 'c']\n *\n * var map = _.rearg(_.map, [1, 0]);\n * map(function(n) {\n * return n * 3;\n * }, [1, 2, 3]);\n * // => [3, 6, 9]\n */\n var rearg = (0, _lodashFunctionRestParam['default'])(function (func, indexes) {\n return (0, _lodashInternalCreateWrapper['default'])(func, REARG_FLAG, undefined, undefined, undefined, (0, _lodashInternalBaseFlatten['default'])(indexes));\n });\n\n exports['default'] = rearg;\n});","define('lodash/function/restParam', ['exports'], function (exports) {\n /** Used as the `TypeError` message for \"Functions\" methods. */\n 'use strict';\n\n var FUNC_ERROR_TEXT = 'Expected a function';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeMax = Math.max;\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as an array.\n *\n * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters).\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.restParam(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\n function restParam(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = nativeMax(start === undefined ? func.length - 1 : +start || 0, 0);\n return function () {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n rest = Array(length);\n\n while (++index < length) {\n rest[index] = args[start + index];\n }\n switch (start) {\n case 0:\n return func.call(this, rest);\n case 1:\n return func.call(this, args[0], rest);\n case 2:\n return func.call(this, args[0], args[1], rest);\n }\n var otherArgs = Array(start + 1);\n index = -1;\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = rest;\n return func.apply(this, otherArgs);\n };\n }\n\n exports['default'] = restParam;\n});","define('lodash/function/spread', ['exports'], function (exports) {\n /** Used as the `TypeError` message for \"Functions\" methods. */\n 'use strict';\n\n var FUNC_ERROR_TEXT = 'Expected a function';\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the created\n * function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3).\n *\n * **Note:** This method is based on the [spread operator](https://developer.mozilla.org/Web/JavaScript/Reference/Operators/Spread_operator).\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to spread arguments over.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.spread(function(who, what) {\n * return who + ' says ' + what;\n * });\n *\n * say(['fred', 'hello']);\n * // => 'fred says hello'\n *\n * // with a Promise\n * var numbers = Promise.all([\n * Promise.resolve(40),\n * Promise.resolve(36)\n * ]);\n *\n * numbers.then(_.spread(function(x, y) {\n * return x + y;\n * }));\n * // => a Promise of 76\n */\n function spread(func) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function (array) {\n return func.apply(this, array);\n };\n }\n\n exports['default'] = spread;\n});","define('lodash/function/throttle', ['exports', 'lodash/function/debounce', 'lodash/lang/isObject'], function (exports, _lodashFunctionDebounce, _lodashLangIsObject) {\n 'use strict';\n\n /** Used as the `TypeError` message for \"Functions\" methods. */\n var FUNC_ERROR_TEXT = 'Expected a function';\n\n /**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed invocations. Provide an options object to indicate\n * that `func` should be invoked on the leading and/or trailing edge of the\n * `wait` timeout. Subsequent calls to the throttled function return the\n * result of the last `func` call.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the throttled function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=true] Specify invoking on the leading\n * edge of the timeout.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n * edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // avoid excessively updating the position while scrolling\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes\n * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\n * 'trailing': false\n * }));\n *\n * // cancel a trailing throttled call\n * jQuery(window).on('popstate', throttled.cancel);\n */\n function throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (options === false) {\n leading = false;\n } else if ((0, _lodashLangIsObject['default'])(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return (0, _lodashFunctionDebounce['default'])(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing });\n }\n\n exports['default'] = throttle;\n});","define('lodash/function/wrap', ['exports', 'lodash/internal/createWrapper', 'lodash/utility/identity'], function (exports, _lodashInternalCreateWrapper, _lodashUtilityIdentity) {\n 'use strict';\n\n /** Used to compose bitmasks for wrapper metadata. */\n var PARTIAL_FLAG = 32;\n\n /**\n * Creates a function that provides `value` to the wrapper function as its\n * first argument. Any additional arguments provided to the function are\n * appended to those provided to the wrapper function. The wrapper is invoked\n * with the `this` binding of the created function.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {*} value The value to wrap.\n * @param {Function} wrapper The wrapper function.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var p = _.wrap(_.escape, function(func, text) {\n * return '' + func(text) + '
';\n * });\n *\n * p('fred, barney, & pebbles');\n * // => 'fred, barney, & pebbles
'\n */\n function wrap(value, wrapper) {\n wrapper = wrapper == null ? _lodashUtilityIdentity['default'] : wrapper;\n return (0, _lodashInternalCreateWrapper['default'])(wrapper, PARTIAL_FLAG, undefined, [value], []);\n }\n\n exports['default'] = wrap;\n});","define('lodash/index', ['exports', 'lodash/lodash'], function (exports, _lodashLodash) {\n 'use strict';\n\n exports['default'] = _lodashLodash['default'];\n});","define('lodash/internal/LazyWrapper', ['exports', 'lodash/internal/baseCreate', 'lodash/internal/baseLodash'], function (exports, _lodashInternalBaseCreate, _lodashInternalBaseLodash) {\n 'use strict';\n\n /** Used as references for `-Infinity` and `Infinity`. */\n var POSITIVE_INFINITY = Number.POSITIVE_INFINITY;\n\n /**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @param {*} value The value to wrap.\n */\n function LazyWrapper(value) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__dir__ = 1;\n this.__filtered__ = false;\n this.__iteratees__ = [];\n this.__takeCount__ = POSITIVE_INFINITY;\n this.__views__ = [];\n }\n\n LazyWrapper.prototype = (0, _lodashInternalBaseCreate['default'])(_lodashInternalBaseLodash['default'].prototype);\n LazyWrapper.prototype.constructor = LazyWrapper;\n\n exports['default'] = LazyWrapper;\n});","define('lodash/internal/LodashWrapper', ['exports', 'lodash/internal/baseCreate', 'lodash/internal/baseLodash'], function (exports, _lodashInternalBaseCreate, _lodashInternalBaseLodash) {\n 'use strict';\n\n /**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable chaining for all wrapper methods.\n * @param {Array} [actions=[]] Actions to peform to resolve the unwrapped value.\n */\n function LodashWrapper(value, chainAll, actions) {\n this.__wrapped__ = value;\n this.__actions__ = actions || [];\n this.__chain__ = !!chainAll;\n }\n\n LodashWrapper.prototype = (0, _lodashInternalBaseCreate['default'])(_lodashInternalBaseLodash['default'].prototype);\n LodashWrapper.prototype.constructor = LodashWrapper;\n\n exports['default'] = LodashWrapper;\n});","define('lodash/internal/MapCache', ['exports', 'lodash/internal/mapDelete', 'lodash/internal/mapGet', 'lodash/internal/mapHas', 'lodash/internal/mapSet'], function (exports, _lodashInternalMapDelete, _lodashInternalMapGet, _lodashInternalMapHas, _lodashInternalMapSet) {\n 'use strict';\n\n /**\n * Creates a cache object to store key/value pairs.\n *\n * @private\n * @static\n * @name Cache\n * @memberOf _.memoize\n */\n function MapCache() {\n this.__data__ = {};\n }\n\n // Add functions to the `Map` cache.\n MapCache.prototype['delete'] = _lodashInternalMapDelete['default'];\n MapCache.prototype.get = _lodashInternalMapGet['default'];\n MapCache.prototype.has = _lodashInternalMapHas['default'];\n MapCache.prototype.set = _lodashInternalMapSet['default'];\n\n exports['default'] = MapCache;\n});","define('lodash/internal/SetCache', ['exports', 'lodash/internal/cachePush', 'lodash/internal/getNative', 'lodash/internal/root'], function (exports, _lodashInternalCachePush, _lodashInternalGetNative, _lodashInternalRoot) {\n 'use strict';\n\n /** Native method references. */\n var Set = (0, _lodashInternalGetNative['default'])(_lodashInternalRoot['default'], 'Set');\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeCreate = (0, _lodashInternalGetNative['default'])(Object, 'create');\n\n /**\n *\n * Creates a cache object to store unique values.\n *\n * @private\n * @param {Array} [values] The values to cache.\n */\n function SetCache(values) {\n var length = values ? values.length : 0;\n\n this.data = { 'hash': nativeCreate(null), 'set': new Set() };\n while (length--) {\n this.push(values[length]);\n }\n }\n\n // Add functions to the `Set` cache.\n SetCache.prototype.push = _lodashInternalCachePush['default'];\n\n exports['default'] = SetCache;\n});","define(\"lodash/internal/arrayConcat\", [\"exports\"], function (exports) {\n /**\n * Creates a new array joining `array` with `other`.\n *\n * @private\n * @param {Array} array The array to join.\n * @param {Array} other The other array to join.\n * @returns {Array} Returns the new concatenated array.\n */\n \"use strict\";\n\n function arrayConcat(array, other) {\n var index = -1,\n length = array.length,\n othIndex = -1,\n othLength = other.length,\n result = Array(length + othLength);\n\n while (++index < length) {\n result[index] = array[index];\n }\n while (++othIndex < othLength) {\n result[index++] = other[othIndex];\n }\n return result;\n }\n\n exports[\"default\"] = arrayConcat;\n});","define(\"lodash/internal/arrayCopy\", [\"exports\"], function (exports) {\n /**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\n \"use strict\";\n\n function arrayCopy(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n }\n\n exports[\"default\"] = arrayCopy;\n});","define(\"lodash/internal/arrayEach\", [\"exports\"], function (exports) {\n /**\n * A specialized version of `_.forEach` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n \"use strict\";\n\n function arrayEach(array, iteratee) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n }\n\n exports[\"default\"] = arrayEach;\n});","define(\"lodash/internal/arrayEachRight\", [\"exports\"], function (exports) {\n /**\n * A specialized version of `_.forEachRight` for arrays without support for\n * callback shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n \"use strict\";\n\n function arrayEachRight(array, iteratee) {\n var length = array.length;\n\n while (length--) {\n if (iteratee(array[length], length, array) === false) {\n break;\n }\n }\n return array;\n }\n\n exports[\"default\"] = arrayEachRight;\n});","define(\"lodash/internal/arrayEvery\", [\"exports\"], function (exports) {\n /**\n * A specialized version of `_.every` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n */\n \"use strict\";\n\n function arrayEvery(array, predicate) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n }\n\n exports[\"default\"] = arrayEvery;\n});","define(\"lodash/internal/arrayExtremum\", [\"exports\"], function (exports) {\n /**\n * A specialized version of `baseExtremum` for arrays which invokes `iteratee`\n * with one argument: (value).\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} comparator The function used to compare values.\n * @param {*} exValue The initial extremum value.\n * @returns {*} Returns the extremum value.\n */\n \"use strict\";\n\n function arrayExtremum(array, iteratee, comparator, exValue) {\n var index = -1,\n length = array.length,\n computed = exValue,\n result = computed;\n\n while (++index < length) {\n var value = array[index],\n current = +iteratee(value);\n\n if (comparator(current, computed)) {\n computed = current;\n result = value;\n }\n }\n return result;\n }\n\n exports[\"default\"] = arrayExtremum;\n});","define(\"lodash/internal/arrayFilter\", [\"exports\"], function (exports) {\n /**\n * A specialized version of `_.filter` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n \"use strict\";\n\n function arrayFilter(array, predicate) {\n var index = -1,\n length = array.length,\n resIndex = -1,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[++resIndex] = value;\n }\n }\n return result;\n }\n\n exports[\"default\"] = arrayFilter;\n});","define(\"lodash/internal/arrayMap\", [\"exports\"], function (exports) {\n /**\n * A specialized version of `_.map` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n \"use strict\";\n\n function arrayMap(array, iteratee) {\n var index = -1,\n length = array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n }\n\n exports[\"default\"] = arrayMap;\n});","define(\"lodash/internal/arrayPush\", [\"exports\"], function (exports) {\n /**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\n \"use strict\";\n\n function arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n }\n\n exports[\"default\"] = arrayPush;\n});","define(\"lodash/internal/arrayReduce\", [\"exports\"], function (exports) {\n /**\n * A specialized version of `_.reduce` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initFromArray] Specify using the first element of `array`\n * as the initial value.\n * @returns {*} Returns the accumulated value.\n */\n \"use strict\";\n\n function arrayReduce(array, iteratee, accumulator, initFromArray) {\n var index = -1,\n length = array.length;\n\n if (initFromArray && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n }\n\n exports[\"default\"] = arrayReduce;\n});","define(\"lodash/internal/arrayReduceRight\", [\"exports\"], function (exports) {\n /**\n * A specialized version of `_.reduceRight` for arrays without support for\n * callback shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initFromArray] Specify using the last element of `array`\n * as the initial value.\n * @returns {*} Returns the accumulated value.\n */\n \"use strict\";\n\n function arrayReduceRight(array, iteratee, accumulator, initFromArray) {\n var length = array.length;\n if (initFromArray && length) {\n accumulator = array[--length];\n }\n while (length--) {\n accumulator = iteratee(accumulator, array[length], length, array);\n }\n return accumulator;\n }\n\n exports[\"default\"] = arrayReduceRight;\n});","define(\"lodash/internal/arraySome\", [\"exports\"], function (exports) {\n /**\n * A specialized version of `_.some` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n \"use strict\";\n\n function arraySome(array, predicate) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n }\n\n exports[\"default\"] = arraySome;\n});","define(\"lodash/internal/arraySum\", [\"exports\"], function (exports) {\n /**\n * A specialized version of `_.sum` for arrays without support for callback\n * shorthands and `this` binding..\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the sum.\n */\n \"use strict\";\n\n function arraySum(array, iteratee) {\n var length = array.length,\n result = 0;\n\n while (length--) {\n result += +iteratee(array[length]) || 0;\n }\n return result;\n }\n\n exports[\"default\"] = arraySum;\n});","define(\"lodash/internal/assignDefaults\", [\"exports\"], function (exports) {\n /**\n * Used by `_.defaults` to customize its `_.assign` use.\n *\n * @private\n * @param {*} objectValue The destination object property value.\n * @param {*} sourceValue The source object property value.\n * @returns {*} Returns the value to assign to the destination object.\n */\n \"use strict\";\n\n function assignDefaults(objectValue, sourceValue) {\n return objectValue === undefined ? sourceValue : objectValue;\n }\n\n exports[\"default\"] = assignDefaults;\n});","define(\"lodash/internal/assignOwnDefaults\", [\"exports\"], function (exports) {\n /** Used for native method references. */\n \"use strict\";\n\n var objectProto = Object.prototype;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /**\n * Used by `_.template` to customize its `_.assign` use.\n *\n * **Note:** This function is like `assignDefaults` except that it ignores\n * inherited property values when checking if a property is `undefined`.\n *\n * @private\n * @param {*} objectValue The destination object property value.\n * @param {*} sourceValue The source object property value.\n * @param {string} key The key associated with the object and source values.\n * @param {Object} object The destination object.\n * @returns {*} Returns the value to assign to the destination object.\n */\n function assignOwnDefaults(objectValue, sourceValue, key, object) {\n return objectValue === undefined || !hasOwnProperty.call(object, key) ? sourceValue : objectValue;\n }\n\n exports[\"default\"] = assignOwnDefaults;\n});","define('lodash/internal/assignWith', ['exports', 'lodash/object/keys'], function (exports, _lodashObjectKeys) {\n 'use strict';\n\n /**\n * A specialized version of `_.assign` for customizing assigned values without\n * support for argument juggling, multiple sources, and `this` binding `customizer`\n * functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Object} Returns `object`.\n */\n function assignWith(object, source, customizer) {\n var index = -1,\n props = (0, _lodashObjectKeys['default'])(source),\n length = props.length;\n\n while (++index < length) {\n var key = props[index],\n value = object[key],\n result = customizer(value, source[key], key, object, source);\n\n if ((result === result ? result !== value : value === value) || value === undefined && !(key in object)) {\n object[key] = result;\n }\n }\n return object;\n }\n\n exports['default'] = assignWith;\n});","define('lodash/internal/baseAssign', ['exports', 'lodash/internal/baseCopy', 'lodash/object/keys'], function (exports, _lodashInternalBaseCopy, _lodashObjectKeys) {\n 'use strict';\n\n /**\n * The base implementation of `_.assign` without support for argument juggling,\n * multiple sources, and `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssign(object, source) {\n return source == null ? object : (0, _lodashInternalBaseCopy['default'])(source, (0, _lodashObjectKeys['default'])(source), object);\n }\n\n exports['default'] = baseAssign;\n});","define('lodash/internal/baseAt', ['exports', 'lodash/internal/isArrayLike', 'lodash/internal/isIndex'], function (exports, _lodashInternalIsArrayLike, _lodashInternalIsIndex) {\n 'use strict';\n\n /**\n * The base implementation of `_.at` without support for string collections\n * and individual key arguments.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {number[]|string[]} props The property names or indexes of elements to pick.\n * @returns {Array} Returns the new array of picked elements.\n */\n function baseAt(collection, props) {\n var index = -1,\n isNil = collection == null,\n isArr = !isNil && (0, _lodashInternalIsArrayLike['default'])(collection),\n length = isArr ? collection.length : 0,\n propsLength = props.length,\n result = Array(propsLength);\n\n while (++index < propsLength) {\n var key = props[index];\n if (isArr) {\n result[index] = (0, _lodashInternalIsIndex['default'])(key, length) ? collection[key] : undefined;\n } else {\n result[index] = isNil ? undefined : collection[key];\n }\n }\n return result;\n }\n\n exports['default'] = baseAt;\n});","define('lodash/internal/baseCallback', ['exports', 'lodash/internal/baseMatches', 'lodash/internal/baseMatchesProperty', 'lodash/internal/bindCallback', 'lodash/utility/identity', 'lodash/utility/property'], function (exports, _lodashInternalBaseMatches, _lodashInternalBaseMatchesProperty, _lodashInternalBindCallback, _lodashUtilityIdentity, _lodashUtilityProperty) {\n 'use strict';\n\n /**\n * The base implementation of `_.callback` which supports specifying the\n * number of arguments to provide to `func`.\n *\n * @private\n * @param {*} [func=_.identity] The value to convert to a callback.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {number} [argCount] The number of arguments to provide to `func`.\n * @returns {Function} Returns the callback.\n */\n function baseCallback(func, thisArg, argCount) {\n var type = typeof func;\n if (type == 'function') {\n return thisArg === undefined ? func : (0, _lodashInternalBindCallback['default'])(func, thisArg, argCount);\n }\n if (func == null) {\n return _lodashUtilityIdentity['default'];\n }\n if (type == 'object') {\n return (0, _lodashInternalBaseMatches['default'])(func);\n }\n return thisArg === undefined ? (0, _lodashUtilityProperty['default'])(func) : (0, _lodashInternalBaseMatchesProperty['default'])(func, thisArg);\n }\n\n exports['default'] = baseCallback;\n});","define('lodash/internal/baseClone', ['exports', 'lodash/internal/arrayCopy', 'lodash/internal/arrayEach', 'lodash/internal/baseAssign', 'lodash/internal/baseForOwn', 'lodash/internal/initCloneArray', 'lodash/internal/initCloneByTag', 'lodash/internal/initCloneObject', 'lodash/lang/isArray', 'lodash/lang/isObject'], function (exports, _lodashInternalArrayCopy, _lodashInternalArrayEach, _lodashInternalBaseAssign, _lodashInternalBaseForOwn, _lodashInternalInitCloneArray, _lodashInternalInitCloneByTag, _lodashInternalInitCloneObject, _lodashLangIsArray, _lodashLangIsObject) {\n 'use strict';\n\n /** `Object#toString` result references. */\n var argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\n var arrayBufferTag = '[object ArrayBuffer]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n /** Used to identify `toStringTag` values supported by `_.clone`. */\n var cloneableTags = {};\n cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[stringTag] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[mapTag] = cloneableTags[setTag] = cloneableTags[weakMapTag] = false;\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\n var objToString = objectProto.toString;\n\n /**\n * The base implementation of `_.clone` without support for argument juggling\n * and `this` binding `customizer` functions.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @param {Function} [customizer] The function to customize cloning values.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The object `value` belongs to.\n * @param {Array} [stackA=[]] Tracks traversed source objects.\n * @param {Array} [stackB=[]] Associates clones with source counterparts.\n * @returns {*} Returns the cloned value.\n */\n function baseClone(value, isDeep, customizer, key, object, stackA, stackB) {\n var result;\n if (customizer) {\n result = object ? customizer(value, key, object) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!(0, _lodashLangIsObject['default'])(value)) {\n return value;\n }\n var isArr = (0, _lodashLangIsArray['default'])(value);\n if (isArr) {\n result = (0, _lodashInternalInitCloneArray['default'])(value);\n if (!isDeep) {\n return (0, _lodashInternalArrayCopy['default'])(value, result);\n }\n } else {\n var tag = objToString.call(value),\n isFunc = tag == funcTag;\n\n if (tag == objectTag || tag == argsTag || isFunc && !object) {\n result = (0, _lodashInternalInitCloneObject['default'])(isFunc ? {} : value);\n if (!isDeep) {\n return (0, _lodashInternalBaseAssign['default'])(result, value);\n }\n } else {\n return cloneableTags[tag] ? (0, _lodashInternalInitCloneByTag['default'])(value, tag, isDeep) : object ? value : {};\n }\n }\n // Check for circular references and return its corresponding clone.\n stackA || (stackA = []);\n stackB || (stackB = []);\n\n var length = stackA.length;\n while (length--) {\n if (stackA[length] == value) {\n return stackB[length];\n }\n }\n // Add the source value to the stack of traversed objects and associate it with its clone.\n stackA.push(value);\n stackB.push(result);\n\n // Recursively populate clone (susceptible to call stack limits).\n (isArr ? _lodashInternalArrayEach['default'] : _lodashInternalBaseForOwn['default'])(value, function (subValue, key) {\n result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB);\n });\n return result;\n }\n\n exports['default'] = baseClone;\n});","define(\"lodash/internal/baseCompareAscending\", [\"exports\"], function (exports) {\n /**\n * The base implementation of `compareAscending` which compares values and\n * sorts them in ascending order without guaranteeing a stable sort.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\n \"use strict\";\n\n function baseCompareAscending(value, other) {\n if (value !== other) {\n var valIsNull = value === null,\n valIsUndef = value === undefined,\n valIsReflexive = value === value;\n\n var othIsNull = other === null,\n othIsUndef = other === undefined,\n othIsReflexive = other === other;\n\n if (value > other && !othIsNull || !valIsReflexive || valIsNull && !othIsUndef && othIsReflexive || valIsUndef && othIsReflexive) {\n return 1;\n }\n if (value < other && !valIsNull || !othIsReflexive || othIsNull && !valIsUndef && valIsReflexive || othIsUndef && valIsReflexive) {\n return -1;\n }\n }\n return 0;\n }\n\n exports[\"default\"] = baseCompareAscending;\n});","define(\"lodash/internal/baseCopy\", [\"exports\"], function (exports) {\n /**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property names to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @returns {Object} Returns `object`.\n */\n \"use strict\";\n\n function baseCopy(source, props, object) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n object[key] = source[key];\n }\n return object;\n }\n\n exports[\"default\"] = baseCopy;\n});","define('lodash/internal/baseCreate', ['exports', 'lodash/lang/isObject'], function (exports, _lodashLangIsObject) {\n 'use strict';\n\n /**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} prototype The object to inherit from.\n * @returns {Object} Returns the new object.\n */\n var baseCreate = (function () {\n function object() {}\n return function (prototype) {\n if ((0, _lodashLangIsObject['default'])(prototype)) {\n object.prototype = prototype;\n var result = new object();\n object.prototype = undefined;\n }\n return result || {};\n };\n })();\n\n exports['default'] = baseCreate;\n});","define('lodash/internal/baseDelay', ['exports'], function (exports) {\n /** Used as the `TypeError` message for \"Functions\" methods. */\n 'use strict';\n\n var FUNC_ERROR_TEXT = 'Expected a function';\n\n /**\n * The base implementation of `_.delay` and `_.defer` which accepts an index\n * of where to slice the arguments to provide to `func`.\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {Object} args The arguments provide to `func`.\n * @returns {number} Returns the timer id.\n */\n function baseDelay(func, wait, args) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return setTimeout(function () {\n func.apply(undefined, args);\n }, wait);\n }\n\n exports['default'] = baseDelay;\n});","define('lodash/internal/baseDifference', ['exports', 'lodash/internal/baseIndexOf', 'lodash/internal/cacheIndexOf', 'lodash/internal/createCache'], function (exports, _lodashInternalBaseIndexOf, _lodashInternalCacheIndexOf, _lodashInternalCreateCache) {\n 'use strict';\n\n /** Used as the size to enable large array optimizations. */\n var LARGE_ARRAY_SIZE = 200;\n\n /**\n * The base implementation of `_.difference` which accepts a single array\n * of values to exclude.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n */\n function baseDifference(array, values) {\n var length = array ? array.length : 0,\n result = [];\n\n if (!length) {\n return result;\n }\n var index = -1,\n indexOf = _lodashInternalBaseIndexOf['default'],\n isCommon = true,\n cache = isCommon && values.length >= LARGE_ARRAY_SIZE ? (0, _lodashInternalCreateCache['default'])(values) : null,\n valuesLength = values.length;\n\n if (cache) {\n indexOf = _lodashInternalCacheIndexOf['default'];\n isCommon = false;\n values = cache;\n }\n outer: while (++index < length) {\n var value = array[index];\n\n if (isCommon && value === value) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === value) {\n continue outer;\n }\n }\n result.push(value);\n } else if (indexOf(values, value, 0) < 0) {\n result.push(value);\n }\n }\n return result;\n }\n\n exports['default'] = baseDifference;\n});","define('lodash/internal/baseEach', ['exports', 'lodash/internal/baseForOwn', 'lodash/internal/createBaseEach'], function (exports, _lodashInternalBaseForOwn, _lodashInternalCreateBaseEach) {\n 'use strict';\n\n /**\n * The base implementation of `_.forEach` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object|string} Returns `collection`.\n */\n var baseEach = (0, _lodashInternalCreateBaseEach['default'])(_lodashInternalBaseForOwn['default']);\n\n exports['default'] = baseEach;\n});","define('lodash/internal/baseEachRight', ['exports', 'lodash/internal/baseForOwnRight', 'lodash/internal/createBaseEach'], function (exports, _lodashInternalBaseForOwnRight, _lodashInternalCreateBaseEach) {\n 'use strict';\n\n /**\n * The base implementation of `_.forEachRight` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object|string} Returns `collection`.\n */\n var baseEachRight = (0, _lodashInternalCreateBaseEach['default'])(_lodashInternalBaseForOwnRight['default'], true);\n\n exports['default'] = baseEachRight;\n});","define('lodash/internal/baseEvery', ['exports', 'lodash/internal/baseEach'], function (exports, _lodashInternalBaseEach) {\n 'use strict';\n\n /**\n * The base implementation of `_.every` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`\n */\n function baseEvery(collection, predicate) {\n var result = true;\n (0, _lodashInternalBaseEach['default'])(collection, function (value, index, collection) {\n result = !!predicate(value, index, collection);\n return result;\n });\n return result;\n }\n\n exports['default'] = baseEvery;\n});","define('lodash/internal/baseExtremum', ['exports', 'lodash/internal/baseEach'], function (exports, _lodashInternalBaseEach) {\n 'use strict';\n\n /**\n * Gets the extremum value of `collection` invoking `iteratee` for each value\n * in `collection` to generate the criterion by which the value is ranked.\n * The `iteratee` is invoked with three arguments: (value, index|key, collection).\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} comparator The function used to compare values.\n * @param {*} exValue The initial extremum value.\n * @returns {*} Returns the extremum value.\n */\n function baseExtremum(collection, iteratee, comparator, exValue) {\n var computed = exValue,\n result = computed;\n\n (0, _lodashInternalBaseEach['default'])(collection, function (value, index, collection) {\n var current = +iteratee(value, index, collection);\n if (comparator(current, computed) || current === exValue && current === result) {\n computed = current;\n result = value;\n }\n });\n return result;\n }\n\n exports['default'] = baseExtremum;\n});","define(\"lodash/internal/baseFill\", [\"exports\"], function (exports) {\n /**\n * The base implementation of `_.fill` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n */\n \"use strict\";\n\n function baseFill(array, value, start, end) {\n var length = array.length;\n\n start = start == null ? 0 : +start || 0;\n if (start < 0) {\n start = -start > length ? 0 : length + start;\n }\n end = end === undefined || end > length ? length : +end || 0;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : end >>> 0;\n start >>>= 0;\n\n while (start < length) {\n array[start++] = value;\n }\n return array;\n }\n\n exports[\"default\"] = baseFill;\n});","define('lodash/internal/baseFilter', ['exports', 'lodash/internal/baseEach'], function (exports, _lodashInternalBaseEach) {\n 'use strict';\n\n /**\n * The base implementation of `_.filter` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function baseFilter(collection, predicate) {\n var result = [];\n (0, _lodashInternalBaseEach['default'])(collection, function (value, index, collection) {\n if (predicate(value, index, collection)) {\n result.push(value);\n }\n });\n return result;\n }\n\n exports['default'] = baseFilter;\n});","define(\"lodash/internal/baseFind\", [\"exports\"], function (exports) {\n /**\n * The base implementation of `_.find`, `_.findLast`, `_.findKey`, and `_.findLastKey`,\n * without support for callback shorthands and `this` binding, which iterates\n * over `collection` using the provided `eachFunc`.\n *\n * @private\n * @param {Array|Object|string} collection The collection to search.\n * @param {Function} predicate The function invoked per iteration.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @param {boolean} [retKey] Specify returning the key of the found element\n * instead of the element itself.\n * @returns {*} Returns the found element or its key, else `undefined`.\n */\n \"use strict\";\n\n function baseFind(collection, predicate, eachFunc, retKey) {\n var result;\n eachFunc(collection, function (value, key, collection) {\n if (predicate(value, key, collection)) {\n result = retKey ? key : value;\n return false;\n }\n });\n return result;\n }\n\n exports[\"default\"] = baseFind;\n});","define(\"lodash/internal/baseFindIndex\", [\"exports\"], function (exports) {\n /**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for callback shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to search.\n * @param {Function} predicate The function invoked per iteration.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n \"use strict\";\n\n function baseFindIndex(array, predicate, fromRight) {\n var length = array.length,\n index = fromRight ? length : -1;\n\n while (fromRight ? index-- : ++index < length) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n }\n\n exports[\"default\"] = baseFindIndex;\n});","define('lodash/internal/baseFlatten', ['exports', 'lodash/internal/arrayPush', 'lodash/lang/isArguments', 'lodash/lang/isArray', 'lodash/internal/isArrayLike', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalArrayPush, _lodashLangIsArguments, _lodashLangIsArray, _lodashInternalIsArrayLike, _lodashInternalIsObjectLike) {\n 'use strict';\n\n /**\n * The base implementation of `_.flatten` with added support for restricting\n * flattening and specifying the start index.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {boolean} [isDeep] Specify a deep flatten.\n * @param {boolean} [isStrict] Restrict flattening to arrays-like objects.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\n function baseFlatten(array, isDeep, isStrict, result) {\n result || (result = []);\n\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index];\n if ((0, _lodashInternalIsObjectLike['default'])(value) && (0, _lodashInternalIsArrayLike['default'])(value) && (isStrict || (0, _lodashLangIsArray['default'])(value) || (0, _lodashLangIsArguments['default'])(value))) {\n if (isDeep) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, isDeep, isStrict, result);\n } else {\n (0, _lodashInternalArrayPush['default'])(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n }\n\n exports['default'] = baseFlatten;\n});","define('lodash/internal/baseFor', ['exports', 'lodash/internal/createBaseFor'], function (exports, _lodashInternalCreateBaseFor) {\n 'use strict';\n\n /**\n * The base implementation of `baseForIn` and `baseForOwn` which iterates\n * over `object` properties returned by `keysFunc` invoking `iteratee` for\n * each property. Iteratee functions may exit iteration early by explicitly\n * returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseFor = (0, _lodashInternalCreateBaseFor['default'])();\n\n exports['default'] = baseFor;\n});","define('lodash/internal/baseForIn', ['exports', 'lodash/internal/baseFor', 'lodash/object/keysIn'], function (exports, _lodashInternalBaseFor, _lodashObjectKeysIn) {\n 'use strict';\n\n /**\n * The base implementation of `_.forIn` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForIn(object, iteratee) {\n return (0, _lodashInternalBaseFor['default'])(object, iteratee, _lodashObjectKeysIn['default']);\n }\n\n exports['default'] = baseForIn;\n});","define('lodash/internal/baseForOwn', ['exports', 'lodash/internal/baseFor', 'lodash/object/keys'], function (exports, _lodashInternalBaseFor, _lodashObjectKeys) {\n 'use strict';\n\n /**\n * The base implementation of `_.forOwn` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwn(object, iteratee) {\n return (0, _lodashInternalBaseFor['default'])(object, iteratee, _lodashObjectKeys['default']);\n }\n\n exports['default'] = baseForOwn;\n});","define('lodash/internal/baseForOwnRight', ['exports', 'lodash/internal/baseForRight', 'lodash/object/keys'], function (exports, _lodashInternalBaseForRight, _lodashObjectKeys) {\n 'use strict';\n\n /**\n * The base implementation of `_.forOwnRight` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwnRight(object, iteratee) {\n return (0, _lodashInternalBaseForRight['default'])(object, iteratee, _lodashObjectKeys['default']);\n }\n\n exports['default'] = baseForOwnRight;\n});","define('lodash/internal/baseForRight', ['exports', 'lodash/internal/createBaseFor'], function (exports, _lodashInternalCreateBaseFor) {\n 'use strict';\n\n /**\n * This function is like `baseFor` except that it iterates over properties\n * in the opposite order.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseForRight = (0, _lodashInternalCreateBaseFor['default'])(true);\n\n exports['default'] = baseForRight;\n});","define('lodash/internal/baseFunctions', ['exports', 'lodash/lang/isFunction'], function (exports, _lodashLangIsFunction) {\n 'use strict';\n\n /**\n * The base implementation of `_.functions` which creates an array of\n * `object` function property names filtered from those provided.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} props The property names to filter.\n * @returns {Array} Returns the new array of filtered property names.\n */\n function baseFunctions(object, props) {\n var index = -1,\n length = props.length,\n resIndex = -1,\n result = [];\n\n while (++index < length) {\n var key = props[index];\n if ((0, _lodashLangIsFunction['default'])(object[key])) {\n result[++resIndex] = key;\n }\n }\n return result;\n }\n\n exports['default'] = baseFunctions;\n});","define('lodash/internal/baseGet', ['exports', 'lodash/internal/toObject'], function (exports, _lodashInternalToObject) {\n 'use strict';\n\n /**\n * The base implementation of `get` without support for string paths\n * and default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path of the property to get.\n * @param {string} [pathKey] The key representation of path.\n * @returns {*} Returns the resolved value.\n */\n function baseGet(object, path, pathKey) {\n if (object == null) {\n return;\n }\n if (pathKey !== undefined && pathKey in (0, _lodashInternalToObject['default'])(object)) {\n path = [pathKey];\n }\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[path[index++]];\n }\n return index && index == length ? object : undefined;\n }\n\n exports['default'] = baseGet;\n});","define('lodash/internal/baseIndexOf', ['exports', 'lodash/internal/indexOfNaN'], function (exports, _lodashInternalIndexOfNaN) {\n 'use strict';\n\n /**\n * The base implementation of `_.indexOf` without support for binary searches.\n *\n * @private\n * @param {Array} array The array to search.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOf(array, value, fromIndex) {\n if (value !== value) {\n return (0, _lodashInternalIndexOfNaN['default'])(array, fromIndex);\n }\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n }\n\n exports['default'] = baseIndexOf;\n});","define('lodash/internal/baseIsEqual', ['exports', 'lodash/internal/baseIsEqualDeep', 'lodash/lang/isObject', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalBaseIsEqualDeep, _lodashLangIsObject, _lodashInternalIsObjectLike) {\n 'use strict';\n\n /**\n * The base implementation of `_.isEqual` without support for `this` binding\n * `customizer` functions.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparing values.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\n function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || !(0, _lodashLangIsObject['default'])(value) && !(0, _lodashInternalIsObjectLike['default'])(other)) {\n return value !== value && other !== other;\n }\n return (0, _lodashInternalBaseIsEqualDeep['default'])(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);\n }\n\n exports['default'] = baseIsEqual;\n});","define('lodash/internal/baseIsEqualDeep', ['exports', 'lodash/internal/equalArrays', 'lodash/internal/equalByTag', 'lodash/internal/equalObjects', 'lodash/lang/isArray', 'lodash/lang/isTypedArray'], function (exports, _lodashInternalEqualArrays, _lodashInternalEqualByTag, _lodashInternalEqualObjects, _lodashLangIsArray, _lodashLangIsTypedArray) {\n 'use strict';\n\n /** `Object#toString` result references. */\n var argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\n var objToString = objectProto.toString;\n\n /**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing objects.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA=[]] Tracks traversed `value` objects.\n * @param {Array} [stackB=[]] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n var objIsArr = (0, _lodashLangIsArray['default'])(object),\n othIsArr = (0, _lodashLangIsArray['default'])(other),\n objTag = arrayTag,\n othTag = arrayTag;\n\n if (!objIsArr) {\n objTag = objToString.call(object);\n if (objTag == argsTag) {\n objTag = objectTag;\n } else if (objTag != objectTag) {\n objIsArr = (0, _lodashLangIsTypedArray['default'])(object);\n }\n }\n if (!othIsArr) {\n othTag = objToString.call(other);\n if (othTag == argsTag) {\n othTag = objectTag;\n } else if (othTag != objectTag) {\n othIsArr = (0, _lodashLangIsTypedArray['default'])(other);\n }\n }\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && !(objIsArr || objIsObj)) {\n return (0, _lodashInternalEqualByTag['default'])(object, other, objTag);\n }\n if (!isLoose) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);\n }\n }\n if (!isSameTag) {\n return false;\n }\n // Assume cyclic values are equal.\n // For more information on detecting circular references see https://es5.github.io/#JO.\n stackA || (stackA = []);\n stackB || (stackB = []);\n\n var length = stackA.length;\n while (length--) {\n if (stackA[length] == object) {\n return stackB[length] == other;\n }\n }\n // Add `object` and `other` to the stack of traversed objects.\n stackA.push(object);\n stackB.push(other);\n\n var result = (objIsArr ? _lodashInternalEqualArrays['default'] : _lodashInternalEqualObjects['default'])(object, other, equalFunc, customizer, isLoose, stackA, stackB);\n\n stackA.pop();\n stackB.pop();\n\n return result;\n }\n\n exports['default'] = baseIsEqualDeep;\n});","define('lodash/internal/baseIsFunction', ['exports'], function (exports) {\n /**\n * The base implementation of `_.isFunction` without support for environments\n * with incorrect `typeof` results.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n */\n 'use strict';\n\n function baseIsFunction(value) {\n // Avoid a Chakra JIT bug in compatibility modes of IE 11.\n // See https://github.com/jashkenas/underscore/issues/1621 for more details.\n return typeof value == 'function' || false;\n }\n\n exports['default'] = baseIsFunction;\n});","define('lodash/internal/baseIsMatch', ['exports', 'lodash/internal/baseIsEqual', 'lodash/internal/toObject'], function (exports, _lodashInternalBaseIsEqual, _lodashInternalToObject) {\n 'use strict';\n\n /**\n * The base implementation of `_.isMatch` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} matchData The propery names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparing objects.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\n function baseIsMatch(object, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = (0, _lodashInternalToObject['default'])(object);\n while (index--) {\n var data = matchData[index];\n if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var result = customizer ? customizer(objValue, srcValue, key) : undefined;\n if (!(result === undefined ? (0, _lodashInternalBaseIsEqual['default'])(srcValue, objValue, customizer, true) : result)) {\n return false;\n }\n }\n }\n return true;\n }\n\n exports['default'] = baseIsMatch;\n});","define(\"lodash/internal/baseLodash\", [\"exports\"], function (exports) {\n /**\n * The function whose prototype all chaining wrappers inherit from.\n *\n * @private\n */\n \"use strict\";\n\n function baseLodash() {\n // No operation performed.\n }\n\n exports[\"default\"] = baseLodash;\n});","define('lodash/internal/baseMap', ['exports', 'lodash/internal/baseEach', 'lodash/internal/isArrayLike'], function (exports, _lodashInternalBaseEach, _lodashInternalIsArrayLike) {\n 'use strict';\n\n /**\n * The base implementation of `_.map` without support for callback shorthands\n * and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function baseMap(collection, iteratee) {\n var index = -1,\n result = (0, _lodashInternalIsArrayLike['default'])(collection) ? Array(collection.length) : [];\n\n (0, _lodashInternalBaseEach['default'])(collection, function (value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n }\n\n exports['default'] = baseMap;\n});","define('lodash/internal/baseMatches', ['exports', 'lodash/internal/baseIsMatch', 'lodash/internal/getMatchData', 'lodash/internal/toObject'], function (exports, _lodashInternalBaseIsMatch, _lodashInternalGetMatchData, _lodashInternalToObject) {\n 'use strict';\n\n /**\n * The base implementation of `_.matches` which does not clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new function.\n */\n function baseMatches(source) {\n var matchData = (0, _lodashInternalGetMatchData['default'])(source);\n if (matchData.length == 1 && matchData[0][2]) {\n var key = matchData[0][0],\n value = matchData[0][1];\n\n return function (object) {\n if (object == null) {\n return false;\n }\n return object[key] === value && (value !== undefined || key in (0, _lodashInternalToObject['default'])(object));\n };\n }\n return function (object) {\n return (0, _lodashInternalBaseIsMatch['default'])(object, matchData);\n };\n }\n\n exports['default'] = baseMatches;\n});","define('lodash/internal/baseMatchesProperty', ['exports', 'lodash/internal/baseGet', 'lodash/internal/baseIsEqual', 'lodash/internal/baseSlice', 'lodash/lang/isArray', 'lodash/internal/isKey', 'lodash/internal/isStrictComparable', 'lodash/array/last', 'lodash/internal/toObject', 'lodash/internal/toPath'], function (exports, _lodashInternalBaseGet, _lodashInternalBaseIsEqual, _lodashInternalBaseSlice, _lodashLangIsArray, _lodashInternalIsKey, _lodashInternalIsStrictComparable, _lodashArrayLast, _lodashInternalToObject, _lodashInternalToPath) {\n 'use strict';\n\n /**\n * The base implementation of `_.matchesProperty` which does not clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to compare.\n * @returns {Function} Returns the new function.\n */\n function baseMatchesProperty(path, srcValue) {\n var isArr = (0, _lodashLangIsArray['default'])(path),\n isCommon = (0, _lodashInternalIsKey['default'])(path) && (0, _lodashInternalIsStrictComparable['default'])(srcValue),\n pathKey = path + '';\n\n path = (0, _lodashInternalToPath['default'])(path);\n return function (object) {\n if (object == null) {\n return false;\n }\n var key = pathKey;\n object = (0, _lodashInternalToObject['default'])(object);\n if ((isArr || !isCommon) && !(key in object)) {\n object = path.length == 1 ? object : (0, _lodashInternalBaseGet['default'])(object, (0, _lodashInternalBaseSlice['default'])(path, 0, -1));\n if (object == null) {\n return false;\n }\n key = (0, _lodashArrayLast['default'])(path);\n object = (0, _lodashInternalToObject['default'])(object);\n }\n return object[key] === srcValue ? srcValue !== undefined || key in object : (0, _lodashInternalBaseIsEqual['default'])(srcValue, object[key], undefined, true);\n };\n }\n\n exports['default'] = baseMatchesProperty;\n});","define('lodash/internal/baseMerge', ['exports', 'lodash/internal/arrayEach', 'lodash/internal/baseMergeDeep', 'lodash/lang/isArray', 'lodash/internal/isArrayLike', 'lodash/lang/isObject', 'lodash/internal/isObjectLike', 'lodash/lang/isTypedArray', 'lodash/object/keys'], function (exports, _lodashInternalArrayEach, _lodashInternalBaseMergeDeep, _lodashLangIsArray, _lodashInternalIsArrayLike, _lodashLangIsObject, _lodashInternalIsObjectLike, _lodashLangIsTypedArray, _lodashObjectKeys) {\n 'use strict';\n\n /**\n * The base implementation of `_.merge` without support for argument juggling,\n * multiple sources, and `this` binding `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Array} [stackA=[]] Tracks traversed source objects.\n * @param {Array} [stackB=[]] Associates values with source counterparts.\n * @returns {Object} Returns `object`.\n */\n function baseMerge(object, source, customizer, stackA, stackB) {\n if (!(0, _lodashLangIsObject['default'])(object)) {\n return object;\n }\n var isSrcArr = (0, _lodashInternalIsArrayLike['default'])(source) && ((0, _lodashLangIsArray['default'])(source) || (0, _lodashLangIsTypedArray['default'])(source)),\n props = isSrcArr ? undefined : (0, _lodashObjectKeys['default'])(source);\n\n (0, _lodashInternalArrayEach['default'])(props || source, function (srcValue, key) {\n if (props) {\n key = srcValue;\n srcValue = source[key];\n }\n if ((0, _lodashInternalIsObjectLike['default'])(srcValue)) {\n stackA || (stackA = []);\n stackB || (stackB = []);\n (0, _lodashInternalBaseMergeDeep['default'])(object, source, key, baseMerge, customizer, stackA, stackB);\n } else {\n var value = object[key],\n result = customizer ? customizer(value, srcValue, key, object, source) : undefined,\n isCommon = result === undefined;\n\n if (isCommon) {\n result = srcValue;\n }\n if ((result !== undefined || isSrcArr && !(key in object)) && (isCommon || (result === result ? result !== value : value === value))) {\n object[key] = result;\n }\n }\n });\n return object;\n }\n\n exports['default'] = baseMerge;\n});","define('lodash/internal/baseMergeDeep', ['exports', 'lodash/internal/arrayCopy', 'lodash/lang/isArguments', 'lodash/lang/isArray', 'lodash/internal/isArrayLike', 'lodash/lang/isPlainObject', 'lodash/lang/isTypedArray', 'lodash/lang/toPlainObject'], function (exports, _lodashInternalArrayCopy, _lodashLangIsArguments, _lodashLangIsArray, _lodashInternalIsArrayLike, _lodashLangIsPlainObject, _lodashLangIsTypedArray, _lodashLangToPlainObject) {\n 'use strict';\n\n /**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Array} [stackA=[]] Tracks traversed source objects.\n * @param {Array} [stackB=[]] Associates values with source counterparts.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {\n var length = stackA.length,\n srcValue = source[key];\n\n while (length--) {\n if (stackA[length] == srcValue) {\n object[key] = stackB[length];\n return;\n }\n }\n var value = object[key],\n result = customizer ? customizer(value, srcValue, key, object, source) : undefined,\n isCommon = result === undefined;\n\n if (isCommon) {\n result = srcValue;\n if ((0, _lodashInternalIsArrayLike['default'])(srcValue) && ((0, _lodashLangIsArray['default'])(srcValue) || (0, _lodashLangIsTypedArray['default'])(srcValue))) {\n result = (0, _lodashLangIsArray['default'])(value) ? value : (0, _lodashInternalIsArrayLike['default'])(value) ? (0, _lodashInternalArrayCopy['default'])(value) : [];\n } else if ((0, _lodashLangIsPlainObject['default'])(srcValue) || (0, _lodashLangIsArguments['default'])(srcValue)) {\n result = (0, _lodashLangIsArguments['default'])(value) ? (0, _lodashLangToPlainObject['default'])(value) : (0, _lodashLangIsPlainObject['default'])(value) ? value : {};\n } else {\n isCommon = false;\n }\n }\n // Add the source value to the stack of traversed objects and associate\n // it with its merged value.\n stackA.push(srcValue);\n stackB.push(result);\n\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);\n } else if (result === result ? result !== value : value === value) {\n object[key] = result;\n }\n }\n\n exports['default'] = baseMergeDeep;\n});","define(\"lodash/internal/baseProperty\", [\"exports\"], function (exports) {\n /**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\n \"use strict\";\n\n function baseProperty(key) {\n return function (object) {\n return object == null ? undefined : object[key];\n };\n }\n\n exports[\"default\"] = baseProperty;\n});","define('lodash/internal/basePropertyDeep', ['exports', 'lodash/internal/baseGet', 'lodash/internal/toPath'], function (exports, _lodashInternalBaseGet, _lodashInternalToPath) {\n 'use strict';\n\n /**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new function.\n */\n function basePropertyDeep(path) {\n var pathKey = path + '';\n path = (0, _lodashInternalToPath['default'])(path);\n return function (object) {\n return (0, _lodashInternalBaseGet['default'])(object, path, pathKey);\n };\n }\n\n exports['default'] = basePropertyDeep;\n});","define('lodash/internal/basePullAt', ['exports', 'lodash/internal/isIndex'], function (exports, _lodashInternalIsIndex) {\n 'use strict';\n\n /** Used for native method references. */\n var arrayProto = Array.prototype;\n\n /** Native method references. */\n var splice = arrayProto.splice;\n\n /**\n * The base implementation of `_.pullAt` without support for individual\n * index arguments and capturing the removed elements.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {number[]} indexes The indexes of elements to remove.\n * @returns {Array} Returns `array`.\n */\n function basePullAt(array, indexes) {\n var length = array ? indexes.length : 0;\n while (length--) {\n var index = indexes[length];\n if (index != previous && (0, _lodashInternalIsIndex['default'])(index)) {\n var previous = index;\n splice.call(array, index, 1);\n }\n }\n return array;\n }\n\n exports['default'] = basePullAt;\n});","define(\"lodash/internal/baseRandom\", [\"exports\"], function (exports) {\n /* Native method references for those with the same name as other `lodash` methods. */\n \"use strict\";\n\n var nativeFloor = Math.floor,\n nativeRandom = Math.random;\n\n /**\n * The base implementation of `_.random` without support for argument juggling\n * and returning floating-point numbers.\n *\n * @private\n * @param {number} min The minimum possible value.\n * @param {number} max The maximum possible value.\n * @returns {number} Returns the random number.\n */\n function baseRandom(min, max) {\n return min + nativeFloor(nativeRandom() * (max - min + 1));\n }\n\n exports[\"default\"] = baseRandom;\n});","define(\"lodash/internal/baseReduce\", [\"exports\"], function (exports) {\n /**\n * The base implementation of `_.reduce` and `_.reduceRight` without support\n * for callback shorthands and `this` binding, which iterates over `collection`\n * using the provided `eachFunc`.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initFromCollection Specify using the first or last element\n * of `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\n \"use strict\";\n\n function baseReduce(collection, iteratee, accumulator, initFromCollection, eachFunc) {\n eachFunc(collection, function (value, index, collection) {\n accumulator = initFromCollection ? (initFromCollection = false, value) : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n }\n\n exports[\"default\"] = baseReduce;\n});","define('lodash/internal/baseSetData', ['exports', 'lodash/utility/identity', 'lodash/internal/metaMap'], function (exports, _lodashUtilityIdentity, _lodashInternalMetaMap) {\n 'use strict';\n\n /**\n * The base implementation of `setData` without support for hot loop detection.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var baseSetData = !_lodashInternalMetaMap['default'] ? _lodashUtilityIdentity['default'] : function (func, data) {\n _lodashInternalMetaMap['default'].set(func, data);\n return func;\n };\n\n exports['default'] = baseSetData;\n});","define(\"lodash/internal/baseSlice\", [\"exports\"], function (exports) {\n /**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n \"use strict\";\n\n function baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n start = start == null ? 0 : +start || 0;\n if (start < 0) {\n start = -start > length ? 0 : length + start;\n }\n end = end === undefined || end > length ? length : +end || 0;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : end - start >>> 0;\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n }\n\n exports[\"default\"] = baseSlice;\n});","define('lodash/internal/baseSome', ['exports', 'lodash/internal/baseEach'], function (exports, _lodashInternalBaseEach) {\n 'use strict';\n\n /**\n * The base implementation of `_.some` without support for callback shorthands\n * and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function baseSome(collection, predicate) {\n var result;\n\n (0, _lodashInternalBaseEach['default'])(collection, function (value, index, collection) {\n result = predicate(value, index, collection);\n return !result;\n });\n return !!result;\n }\n\n exports['default'] = baseSome;\n});","define(\"lodash/internal/baseSortBy\", [\"exports\"], function (exports) {\n /**\n * The base implementation of `_.sortBy` which uses `comparer` to define\n * the sort order of `array` and replaces criteria objects with their\n * corresponding values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\n \"use strict\";\n\n function baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n }\n\n exports[\"default\"] = baseSortBy;\n});","define('lodash/internal/baseSortByOrder', ['exports', 'lodash/internal/arrayMap', 'lodash/internal/baseCallback', 'lodash/internal/baseMap', 'lodash/internal/baseSortBy', 'lodash/internal/compareMultiple'], function (exports, _lodashInternalArrayMap, _lodashInternalBaseCallback, _lodashInternalBaseMap, _lodashInternalBaseSortBy, _lodashInternalCompareMultiple) {\n 'use strict';\n\n /**\n * The base implementation of `_.sortByOrder` without param guards.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {boolean[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\n function baseSortByOrder(collection, iteratees, orders) {\n var index = -1;\n\n iteratees = (0, _lodashInternalArrayMap['default'])(iteratees, function (iteratee) {\n return (0, _lodashInternalBaseCallback['default'])(iteratee);\n });\n\n var result = (0, _lodashInternalBaseMap['default'])(collection, function (value) {\n var criteria = (0, _lodashInternalArrayMap['default'])(iteratees, function (iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return (0, _lodashInternalBaseSortBy['default'])(result, function (object, other) {\n return (0, _lodashInternalCompareMultiple['default'])(object, other, orders);\n });\n }\n\n exports['default'] = baseSortByOrder;\n});","define('lodash/internal/baseSum', ['exports', 'lodash/internal/baseEach'], function (exports, _lodashInternalBaseEach) {\n 'use strict';\n\n /**\n * The base implementation of `_.sum` without support for callback shorthands\n * and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the sum.\n */\n function baseSum(collection, iteratee) {\n var result = 0;\n (0, _lodashInternalBaseEach['default'])(collection, function (value, index, collection) {\n result += +iteratee(value, index, collection) || 0;\n });\n return result;\n }\n\n exports['default'] = baseSum;\n});","define('lodash/internal/baseToString', ['exports'], function (exports) {\n /**\n * Converts `value` to a string if it's not one. An empty string is returned\n * for `null` or `undefined` values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\n 'use strict';\n\n function baseToString(value) {\n return value == null ? '' : value + '';\n }\n\n exports['default'] = baseToString;\n});","define('lodash/internal/baseUniq', ['exports', 'lodash/internal/baseIndexOf', 'lodash/internal/cacheIndexOf', 'lodash/internal/createCache'], function (exports, _lodashInternalBaseIndexOf, _lodashInternalCacheIndexOf, _lodashInternalCreateCache) {\n 'use strict';\n\n /** Used as the size to enable large array optimizations. */\n var LARGE_ARRAY_SIZE = 200;\n\n /**\n * The base implementation of `_.uniq` without support for callback shorthands\n * and `this` binding.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The function invoked per iteration.\n * @returns {Array} Returns the new duplicate free array.\n */\n function baseUniq(array, iteratee) {\n var index = -1,\n indexOf = _lodashInternalBaseIndexOf['default'],\n length = array.length,\n isCommon = true,\n isLarge = isCommon && length >= LARGE_ARRAY_SIZE,\n seen = isLarge ? (0, _lodashInternalCreateCache['default'])() : null,\n result = [];\n\n if (seen) {\n indexOf = _lodashInternalCacheIndexOf['default'];\n isCommon = false;\n } else {\n isLarge = false;\n seen = iteratee ? [] : result;\n }\n outer: while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value, index, array) : value;\n\n if (isCommon && value === value) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n } else if (indexOf(seen, computed, 0) < 0) {\n if (iteratee || isLarge) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n exports['default'] = baseUniq;\n});","define(\"lodash/internal/baseValues\", [\"exports\"], function (exports) {\n /**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\n \"use strict\";\n\n function baseValues(object, props) {\n var index = -1,\n length = props.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = object[props[index]];\n }\n return result;\n }\n\n exports[\"default\"] = baseValues;\n});","define('lodash/internal/baseWhile', ['exports', 'lodash/internal/baseSlice'], function (exports, _lodashInternalBaseSlice) {\n 'use strict';\n\n /**\n * The base implementation of `_.dropRightWhile`, `_.dropWhile`, `_.takeRightWhile`,\n * and `_.takeWhile` without support for callback shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {Function} predicate The function invoked per iteration.\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseWhile(array, predicate, isDrop, fromRight) {\n var length = array.length,\n index = fromRight ? length : -1;\n\n while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {}\n return isDrop ? (0, _lodashInternalBaseSlice['default'])(array, fromRight ? 0 : index, fromRight ? index + 1 : length) : (0, _lodashInternalBaseSlice['default'])(array, fromRight ? index + 1 : 0, fromRight ? length : index);\n }\n\n exports['default'] = baseWhile;\n});","define('lodash/internal/baseWrapperValue', ['exports', 'lodash/internal/LazyWrapper', 'lodash/internal/arrayPush'], function (exports, _lodashInternalLazyWrapper, _lodashInternalArrayPush) {\n 'use strict';\n\n /**\n * The base implementation of `wrapperValue` which returns the result of\n * performing a sequence of actions on the unwrapped `value`, where each\n * successive action is supplied the return value of the previous.\n *\n * @private\n * @param {*} value The unwrapped value.\n * @param {Array} actions Actions to peform to resolve the unwrapped value.\n * @returns {*} Returns the resolved value.\n */\n function baseWrapperValue(value, actions) {\n var result = value;\n if (result instanceof _lodashInternalLazyWrapper['default']) {\n result = result.value();\n }\n var index = -1,\n length = actions.length;\n\n while (++index < length) {\n var action = actions[index];\n result = action.func.apply(action.thisArg, (0, _lodashInternalArrayPush['default'])([result], action.args));\n }\n return result;\n }\n\n exports['default'] = baseWrapperValue;\n});","define('lodash/internal/binaryIndex', ['exports', 'lodash/internal/binaryIndexBy', 'lodash/utility/identity'], function (exports, _lodashInternalBinaryIndexBy, _lodashUtilityIdentity) {\n 'use strict';\n\n /** Used as references for the maximum length and index of an array. */\n var MAX_ARRAY_LENGTH = 4294967295,\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n /**\n * Performs a binary search of `array` to determine the index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function binaryIndex(array, value, retHighest) {\n var low = 0,\n high = array ? array.length : low;\n\n if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n while (low < high) {\n var mid = low + high >>> 1,\n computed = array[mid];\n\n if ((retHighest ? computed <= value : computed < value) && computed !== null) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return high;\n }\n return (0, _lodashInternalBinaryIndexBy['default'])(array, value, _lodashUtilityIdentity['default'], retHighest);\n }\n\n exports['default'] = binaryIndex;\n});","define(\"lodash/internal/binaryIndexBy\", [\"exports\"], function (exports) {\n /* Native method references for those with the same name as other `lodash` methods. */\n \"use strict\";\n\n var nativeFloor = Math.floor,\n nativeMin = Math.min;\n\n /** Used as references for the maximum length and index of an array. */\n var MAX_ARRAY_LENGTH = 4294967295,\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1;\n\n /**\n * This function is like `binaryIndex` except that it invokes `iteratee` for\n * `value` and each element of `array` to compute their sort ranking. The\n * iteratee is invoked with one argument; (value).\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function binaryIndexBy(array, value, iteratee, retHighest) {\n value = iteratee(value);\n\n var low = 0,\n high = array ? array.length : 0,\n valIsNaN = value !== value,\n valIsNull = value === null,\n valIsUndef = value === undefined;\n\n while (low < high) {\n var mid = nativeFloor((low + high) / 2),\n computed = iteratee(array[mid]),\n isDef = computed !== undefined,\n isReflexive = computed === computed;\n\n if (valIsNaN) {\n var setLow = isReflexive || retHighest;\n } else if (valIsNull) {\n setLow = isReflexive && isDef && (retHighest || computed != null);\n } else if (valIsUndef) {\n setLow = isReflexive && (retHighest || isDef);\n } else if (computed == null) {\n setLow = false;\n } else {\n setLow = retHighest ? computed <= value : computed < value;\n }\n if (setLow) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return nativeMin(high, MAX_ARRAY_INDEX);\n }\n\n exports[\"default\"] = binaryIndexBy;\n});","define('lodash/internal/bindCallback', ['exports', 'lodash/utility/identity'], function (exports, _lodashUtilityIdentity) {\n 'use strict';\n\n /**\n * A specialized version of `baseCallback` which only supports `this` binding\n * and specifying the number of arguments to provide to `func`.\n *\n * @private\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {number} [argCount] The number of arguments to provide to `func`.\n * @returns {Function} Returns the callback.\n */\n function bindCallback(func, thisArg, argCount) {\n if (typeof func != 'function') {\n return _lodashUtilityIdentity['default'];\n }\n if (thisArg === undefined) {\n return func;\n }\n switch (argCount) {\n case 1:\n return function (value) {\n return func.call(thisArg, value);\n };\n case 3:\n return function (value, index, collection) {\n return func.call(thisArg, value, index, collection);\n };\n case 4:\n return function (accumulator, value, index, collection) {\n return func.call(thisArg, accumulator, value, index, collection);\n };\n case 5:\n return function (value, other, key, object, source) {\n return func.call(thisArg, value, other, key, object, source);\n };\n }\n return function () {\n return func.apply(thisArg, arguments);\n };\n }\n\n exports['default'] = bindCallback;\n});","define('lodash/internal/bufferClone', ['exports', 'lodash/internal/root'], function (exports, _lodashInternalRoot) {\n 'use strict';\n\n /** Native method references. */\n var ArrayBuffer = _lodashInternalRoot['default'].ArrayBuffer,\n Uint8Array = _lodashInternalRoot['default'].Uint8Array;\n\n /**\n * Creates a clone of the given array buffer.\n *\n * @private\n * @param {ArrayBuffer} buffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\n function bufferClone(buffer) {\n var result = new ArrayBuffer(buffer.byteLength),\n view = new Uint8Array(result);\n\n view.set(new Uint8Array(buffer));\n return result;\n }\n\n exports['default'] = bufferClone;\n});","define('lodash/internal/cacheIndexOf', ['exports', 'lodash/lang/isObject'], function (exports, _lodashLangIsObject) {\n 'use strict';\n\n /**\n * Checks if `value` is in `cache` mimicking the return signature of\n * `_.indexOf` by returning `0` if the value is found, else `-1`.\n *\n * @private\n * @param {Object} cache The cache to search.\n * @param {*} value The value to search for.\n * @returns {number} Returns `0` if `value` is found, else `-1`.\n */\n function cacheIndexOf(cache, value) {\n var data = cache.data,\n result = typeof value == 'string' || (0, _lodashLangIsObject['default'])(value) ? data.set.has(value) : data.hash[value];\n\n return result ? 0 : -1;\n }\n\n exports['default'] = cacheIndexOf;\n});","define('lodash/internal/cachePush', ['exports', 'lodash/lang/isObject'], function (exports, _lodashLangIsObject) {\n 'use strict';\n\n /**\n * Adds `value` to the cache.\n *\n * @private\n * @name push\n * @memberOf SetCache\n * @param {*} value The value to cache.\n */\n function cachePush(value) {\n var data = this.data;\n if (typeof value == 'string' || (0, _lodashLangIsObject['default'])(value)) {\n data.set.add(value);\n } else {\n data.hash[value] = true;\n }\n }\n\n exports['default'] = cachePush;\n});","define(\"lodash/internal/charsLeftIndex\", [\"exports\"], function (exports) {\n /**\n * Used by `_.trim` and `_.trimLeft` to get the index of the first character\n * of `string` that is not found in `chars`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @param {string} chars The characters to find.\n * @returns {number} Returns the index of the first character not found in `chars`.\n */\n \"use strict\";\n\n function charsLeftIndex(string, chars) {\n var index = -1,\n length = string.length;\n\n while (++index < length && chars.indexOf(string.charAt(index)) > -1) {}\n return index;\n }\n\n exports[\"default\"] = charsLeftIndex;\n});","define(\"lodash/internal/charsRightIndex\", [\"exports\"], function (exports) {\n /**\n * Used by `_.trim` and `_.trimRight` to get the index of the last character\n * of `string` that is not found in `chars`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @param {string} chars The characters to find.\n * @returns {number} Returns the index of the last character not found in `chars`.\n */\n \"use strict\";\n\n function charsRightIndex(string, chars) {\n var index = string.length;\n\n while (index-- && chars.indexOf(string.charAt(index)) > -1) {}\n return index;\n }\n\n exports[\"default\"] = charsRightIndex;\n});","define('lodash/internal/compareAscending', ['exports', 'lodash/internal/baseCompareAscending'], function (exports, _lodashInternalBaseCompareAscending) {\n 'use strict';\n\n /**\n * Used by `_.sortBy` to compare transformed elements of a collection and stable\n * sort them in ascending order.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @returns {number} Returns the sort order indicator for `object`.\n */\n function compareAscending(object, other) {\n return (0, _lodashInternalBaseCompareAscending['default'])(object.criteria, other.criteria) || object.index - other.index;\n }\n\n exports['default'] = compareAscending;\n});","define('lodash/internal/compareMultiple', ['exports', 'lodash/internal/baseCompareAscending'], function (exports, _lodashInternalBaseCompareAscending) {\n 'use strict';\n\n /**\n * Used by `_.sortByOrder` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all valuess are sorted in ascending order. Otherwise,\n * a value is sorted in ascending order if its corresponding order is \"asc\", and\n * descending if \"desc\".\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\n function compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = (0, _lodashInternalBaseCompareAscending['default'])(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order === 'asc' || order === true ? 1 : -1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://code.google.com/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n }\n\n exports['default'] = compareMultiple;\n});","define(\"lodash/internal/composeArgs\", [\"exports\"], function (exports) {\n /* Native method references for those with the same name as other `lodash` methods. */\n \"use strict\";\n\n var nativeMax = Math.max;\n\n /**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array|Object} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgs(args, partials, holders) {\n var holdersLength = holders.length,\n argsIndex = -1,\n argsLength = nativeMax(args.length - holdersLength, 0),\n leftIndex = -1,\n leftLength = partials.length,\n result = Array(leftLength + argsLength);\n\n while (++leftIndex < leftLength) {\n result[leftIndex] = partials[leftIndex];\n }\n while (++argsIndex < holdersLength) {\n result[holders[argsIndex]] = args[argsIndex];\n }\n while (argsLength--) {\n result[leftIndex++] = args[argsIndex++];\n }\n return result;\n }\n\n exports[\"default\"] = composeArgs;\n});","define(\"lodash/internal/composeArgsRight\", [\"exports\"], function (exports) {\n /* Native method references for those with the same name as other `lodash` methods. */\n \"use strict\";\n\n var nativeMax = Math.max;\n\n /**\n * This function is like `composeArgs` except that the arguments composition\n * is tailored for `_.partialRight`.\n *\n * @private\n * @param {Array|Object} args The provided arguments.\n * @param {Array} partials The arguments to append to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgsRight(args, partials, holders) {\n var holdersIndex = -1,\n holdersLength = holders.length,\n argsIndex = -1,\n argsLength = nativeMax(args.length - holdersLength, 0),\n rightIndex = -1,\n rightLength = partials.length,\n result = Array(argsLength + rightLength);\n\n while (++argsIndex < argsLength) {\n result[argsIndex] = args[argsIndex];\n }\n var offset = argsIndex;\n while (++rightIndex < rightLength) {\n result[offset + rightIndex] = partials[rightIndex];\n }\n while (++holdersIndex < holdersLength) {\n result[offset + holders[holdersIndex]] = args[argsIndex++];\n }\n return result;\n }\n\n exports[\"default\"] = composeArgsRight;\n});","define('lodash/internal/createAggregator', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseEach', 'lodash/lang/isArray'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseEach, _lodashLangIsArray) {\n 'use strict';\n\n /**\n * Creates a `_.countBy`, `_.groupBy`, `_.indexBy`, or `_.partition` function.\n *\n * @private\n * @param {Function} setter The function to set keys and values of the accumulator object.\n * @param {Function} [initializer] The function to initialize the accumulator object.\n * @returns {Function} Returns the new aggregator function.\n */\n function createAggregator(setter, initializer) {\n return function (collection, iteratee, thisArg) {\n var result = initializer ? initializer() : {};\n iteratee = (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 3);\n\n if ((0, _lodashLangIsArray['default'])(collection)) {\n var index = -1,\n length = collection.length;\n\n while (++index < length) {\n var value = collection[index];\n setter(result, value, iteratee(value, index, collection), collection);\n }\n } else {\n (0, _lodashInternalBaseEach['default'])(collection, function (value, key, collection) {\n setter(result, value, iteratee(value, key, collection), collection);\n });\n }\n return result;\n };\n }\n\n exports['default'] = createAggregator;\n});","define('lodash/internal/createAssigner', ['exports', 'lodash/internal/bindCallback', 'lodash/internal/isIterateeCall', 'lodash/function/restParam'], function (exports, _lodashInternalBindCallback, _lodashInternalIsIterateeCall, _lodashFunctionRestParam) {\n 'use strict';\n\n /**\n * Creates a `_.assign`, `_.defaults`, or `_.merge` function.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\n function createAssigner(assigner) {\n return (0, _lodashFunctionRestParam['default'])(function (object, sources) {\n var index = -1,\n length = object == null ? 0 : sources.length,\n customizer = length > 2 ? sources[length - 2] : undefined,\n guard = length > 2 ? sources[2] : undefined,\n thisArg = length > 1 ? sources[length - 1] : undefined;\n\n if (typeof customizer == 'function') {\n customizer = (0, _lodashInternalBindCallback['default'])(customizer, thisArg, 5);\n length -= 2;\n } else {\n customizer = typeof thisArg == 'function' ? thisArg : undefined;\n length -= customizer ? 1 : 0;\n }\n if (guard && (0, _lodashInternalIsIterateeCall['default'])(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, customizer);\n }\n }\n return object;\n });\n }\n\n exports['default'] = createAssigner;\n});","define('lodash/internal/createBaseEach', ['exports', 'lodash/internal/getLength', 'lodash/internal/isLength', 'lodash/internal/toObject'], function (exports, _lodashInternalGetLength, _lodashInternalIsLength, _lodashInternalToObject) {\n 'use strict';\n\n /**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseEach(eachFunc, fromRight) {\n return function (collection, iteratee) {\n var length = collection ? (0, _lodashInternalGetLength['default'])(collection) : 0;\n if (!(0, _lodashInternalIsLength['default'])(length)) {\n return eachFunc(collection, iteratee);\n }\n var index = fromRight ? length : -1,\n iterable = (0, _lodashInternalToObject['default'])(collection);\n\n while (fromRight ? index-- : ++index < length) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n }\n\n exports['default'] = createBaseEach;\n});","define('lodash/internal/createBaseFor', ['exports', 'lodash/internal/toObject'], function (exports, _lodashInternalToObject) {\n 'use strict';\n\n /**\n * Creates a base function for `_.forIn` or `_.forInRight`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseFor(fromRight) {\n return function (object, iteratee, keysFunc) {\n var iterable = (0, _lodashInternalToObject['default'])(object),\n props = keysFunc(object),\n length = props.length,\n index = fromRight ? length : -1;\n\n while (fromRight ? index-- : ++index < length) {\n var key = props[index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n }\n\n exports['default'] = createBaseFor;\n});","define('lodash/internal/createBindWrapper', ['exports', 'lodash/internal/createCtorWrapper', 'lodash/internal/root'], function (exports, _lodashInternalCreateCtorWrapper, _lodashInternalRoot) {\n 'use strict';\n\n /**\n * Creates a function that wraps `func` and invokes it with the `this`\n * binding of `thisArg`.\n *\n * @private\n * @param {Function} func The function to bind.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @returns {Function} Returns the new bound function.\n */\n function createBindWrapper(func, thisArg) {\n var Ctor = (0, _lodashInternalCreateCtorWrapper['default'])(func);\n\n function wrapper() {\n var fn = this && this !== _lodashInternalRoot['default'] && this instanceof wrapper ? Ctor : func;\n return fn.apply(thisArg, arguments);\n }\n return wrapper;\n }\n\n exports['default'] = createBindWrapper;\n});","define('lodash/internal/createCache', ['exports', 'lodash/internal/SetCache', 'lodash/internal/getNative', 'lodash/internal/root'], function (exports, _lodashInternalSetCache, _lodashInternalGetNative, _lodashInternalRoot) {\n 'use strict';\n\n /** Native method references. */\n var Set = (0, _lodashInternalGetNative['default'])(_lodashInternalRoot['default'], 'Set');\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeCreate = (0, _lodashInternalGetNative['default'])(Object, 'create');\n\n /**\n * Creates a `Set` cache object to optimize linear searches of large arrays.\n *\n * @private\n * @param {Array} [values] The values to cache.\n * @returns {null|Object} Returns the new cache object if `Set` is supported, else `null`.\n */\n function createCache(values) {\n return nativeCreate && Set ? new _lodashInternalSetCache['default'](values) : null;\n }\n\n exports['default'] = createCache;\n});","define('lodash/internal/createCompounder', ['exports', 'lodash/string/deburr', 'lodash/string/words'], function (exports, _lodashStringDeburr, _lodashStringWords) {\n 'use strict';\n\n /**\n * Creates a function that produces compound words out of the words in a\n * given string.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\n function createCompounder(callback) {\n return function (string) {\n var index = -1,\n array = (0, _lodashStringWords['default'])((0, _lodashStringDeburr['default'])(string)),\n length = array.length,\n result = '';\n\n while (++index < length) {\n result = callback(result, array[index], index);\n }\n return result;\n };\n }\n\n exports['default'] = createCompounder;\n});","define('lodash/internal/createCtorWrapper', ['exports', 'lodash/internal/baseCreate', 'lodash/lang/isObject'], function (exports, _lodashInternalBaseCreate, _lodashLangIsObject) {\n 'use strict';\n\n /**\n * Creates a function that produces an instance of `Ctor` regardless of\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n *\n * @private\n * @param {Function} Ctor The constructor to wrap.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCtorWrapper(Ctor) {\n return function () {\n // Use a `switch` statement to work with class constructors.\n // See http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n // for more details.\n var args = arguments;\n switch (args.length) {\n case 0:\n return new Ctor();\n case 1:\n return new Ctor(args[0]);\n case 2:\n return new Ctor(args[0], args[1]);\n case 3:\n return new Ctor(args[0], args[1], args[2]);\n case 4:\n return new Ctor(args[0], args[1], args[2], args[3]);\n case 5:\n return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n case 6:\n return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n case 7:\n return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n }\n var thisBinding = (0, _lodashInternalBaseCreate['default'])(Ctor.prototype),\n result = Ctor.apply(thisBinding, args);\n\n // Mimic the constructor's `return` behavior.\n // See https://es5.github.io/#x13.2.2 for more details.\n return (0, _lodashLangIsObject['default'])(result) ? result : thisBinding;\n };\n }\n\n exports['default'] = createCtorWrapper;\n});","define('lodash/internal/createCurry', ['exports', 'lodash/internal/createWrapper', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalCreateWrapper, _lodashInternalIsIterateeCall) {\n 'use strict';\n\n /**\n * Creates a `_.curry` or `_.curryRight` function.\n *\n * @private\n * @param {boolean} flag The curry bit flag.\n * @returns {Function} Returns the new curry function.\n */\n function createCurry(flag) {\n function curryFunc(func, arity, guard) {\n if (guard && (0, _lodashInternalIsIterateeCall['default'])(func, arity, guard)) {\n arity = undefined;\n }\n var result = (0, _lodashInternalCreateWrapper['default'])(func, flag, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curryFunc.placeholder;\n return result;\n }\n return curryFunc;\n }\n\n exports['default'] = createCurry;\n});","define('lodash/internal/createDefaults', ['exports', 'lodash/function/restParam'], function (exports, _lodashFunctionRestParam) {\n 'use strict';\n\n /**\n * Creates a `_.defaults` or `_.defaultsDeep` function.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Function} Returns the new defaults function.\n */\n function createDefaults(assigner, customizer) {\n return (0, _lodashFunctionRestParam['default'])(function (args) {\n var object = args[0];\n if (object == null) {\n return object;\n }\n args.push(customizer);\n return assigner.apply(undefined, args);\n });\n }\n\n exports['default'] = createDefaults;\n});","define('lodash/internal/createExtremum', ['exports', 'lodash/internal/arrayExtremum', 'lodash/internal/baseCallback', 'lodash/internal/baseExtremum', 'lodash/lang/isArray', 'lodash/internal/isIterateeCall', 'lodash/internal/toIterable'], function (exports, _lodashInternalArrayExtremum, _lodashInternalBaseCallback, _lodashInternalBaseExtremum, _lodashLangIsArray, _lodashInternalIsIterateeCall, _lodashInternalToIterable) {\n 'use strict';\n\n /**\n * Creates a `_.max` or `_.min` function.\n *\n * @private\n * @param {Function} comparator The function used to compare values.\n * @param {*} exValue The initial extremum value.\n * @returns {Function} Returns the new extremum function.\n */\n function createExtremum(comparator, exValue) {\n return function (collection, iteratee, thisArg) {\n if (thisArg && (0, _lodashInternalIsIterateeCall['default'])(collection, iteratee, thisArg)) {\n iteratee = undefined;\n }\n iteratee = (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 3);\n if (iteratee.length == 1) {\n collection = (0, _lodashLangIsArray['default'])(collection) ? collection : (0, _lodashInternalToIterable['default'])(collection);\n var result = (0, _lodashInternalArrayExtremum['default'])(collection, iteratee, comparator, exValue);\n if (!(collection.length && result === exValue)) {\n return result;\n }\n }\n return (0, _lodashInternalBaseExtremum['default'])(collection, iteratee, comparator, exValue);\n };\n }\n\n exports['default'] = createExtremum;\n});","define('lodash/internal/createFind', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseFind', 'lodash/internal/baseFindIndex', 'lodash/lang/isArray'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseFind, _lodashInternalBaseFindIndex, _lodashLangIsArray) {\n 'use strict';\n\n /**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new find function.\n */\n function createFind(eachFunc, fromRight) {\n return function (collection, predicate, thisArg) {\n predicate = (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3);\n if ((0, _lodashLangIsArray['default'])(collection)) {\n var index = (0, _lodashInternalBaseFindIndex['default'])(collection, predicate, fromRight);\n return index > -1 ? collection[index] : undefined;\n }\n return (0, _lodashInternalBaseFind['default'])(collection, predicate, eachFunc);\n };\n }\n\n exports['default'] = createFind;\n});","define('lodash/internal/createFindIndex', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseFindIndex'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseFindIndex) {\n 'use strict';\n\n /**\n * Creates a `_.findIndex` or `_.findLastIndex` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new find function.\n */\n function createFindIndex(fromRight) {\n return function (array, predicate, thisArg) {\n if (!(array && array.length)) {\n return -1;\n }\n predicate = (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3);\n return (0, _lodashInternalBaseFindIndex['default'])(array, predicate, fromRight);\n };\n }\n\n exports['default'] = createFindIndex;\n});","define('lodash/internal/createFindKey', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseFind'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseFind) {\n 'use strict';\n\n /**\n * Creates a `_.findKey` or `_.findLastKey` function.\n *\n * @private\n * @param {Function} objectFunc The function to iterate over an object.\n * @returns {Function} Returns the new find function.\n */\n function createFindKey(objectFunc) {\n return function (object, predicate, thisArg) {\n predicate = (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 3);\n return (0, _lodashInternalBaseFind['default'])(object, predicate, objectFunc, true);\n };\n }\n\n exports['default'] = createFindKey;\n});","define('lodash/internal/createFlow', ['exports', 'lodash/internal/LodashWrapper', 'lodash/internal/getData', 'lodash/internal/getFuncName', 'lodash/lang/isArray', 'lodash/internal/isLaziable'], function (exports, _lodashInternalLodashWrapper, _lodashInternalGetData, _lodashInternalGetFuncName, _lodashLangIsArray, _lodashInternalIsLaziable) {\n 'use strict';\n\n /** Used to compose bitmasks for wrapper metadata. */\n var CURRY_FLAG = 8,\n PARTIAL_FLAG = 32,\n ARY_FLAG = 128,\n REARG_FLAG = 256;\n\n /** Used as the size to enable large array optimizations. */\n var LARGE_ARRAY_SIZE = 200;\n\n /** Used as the `TypeError` message for \"Functions\" methods. */\n var FUNC_ERROR_TEXT = 'Expected a function';\n\n /**\n * Creates a `_.flow` or `_.flowRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new flow function.\n */\n function createFlow(fromRight) {\n return function () {\n var wrapper,\n length = arguments.length,\n index = fromRight ? length : -1,\n leftIndex = 0,\n funcs = Array(length);\n\n while (fromRight ? index-- : ++index < length) {\n var func = funcs[leftIndex++] = arguments[index];\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (!wrapper && _lodashInternalLodashWrapper['default'].prototype.thru && (0, _lodashInternalGetFuncName['default'])(func) == 'wrapper') {\n wrapper = new _lodashInternalLodashWrapper['default']([], true);\n }\n }\n index = wrapper ? -1 : length;\n while (++index < length) {\n func = funcs[index];\n\n var funcName = (0, _lodashInternalGetFuncName['default'])(func),\n data = funcName == 'wrapper' ? (0, _lodashInternalGetData['default'])(func) : undefined;\n\n if (data && (0, _lodashInternalIsLaziable['default'])(data[0]) && data[1] == (ARY_FLAG | CURRY_FLAG | PARTIAL_FLAG | REARG_FLAG) && !data[4].length && data[9] == 1) {\n wrapper = wrapper[(0, _lodashInternalGetFuncName['default'])(data[0])].apply(wrapper, data[3]);\n } else {\n wrapper = func.length == 1 && (0, _lodashInternalIsLaziable['default'])(func) ? wrapper[funcName]() : wrapper.thru(func);\n }\n }\n return function () {\n var args = arguments,\n value = args[0];\n\n if (wrapper && args.length == 1 && (0, _lodashLangIsArray['default'])(value) && value.length >= LARGE_ARRAY_SIZE) {\n return wrapper.plant(value).value();\n }\n var index = 0,\n result = length ? funcs[index].apply(this, args) : value;\n\n while (++index < length) {\n result = funcs[index].call(this, result);\n }\n return result;\n };\n };\n }\n\n exports['default'] = createFlow;\n});","define('lodash/internal/createForEach', ['exports', 'lodash/internal/bindCallback', 'lodash/lang/isArray'], function (exports, _lodashInternalBindCallback, _lodashLangIsArray) {\n 'use strict';\n\n /**\n * Creates a function for `_.forEach` or `_.forEachRight`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over an array.\n * @param {Function} eachFunc The function to iterate over a collection.\n * @returns {Function} Returns the new each function.\n */\n function createForEach(arrayFunc, eachFunc) {\n return function (collection, iteratee, thisArg) {\n return typeof iteratee == 'function' && thisArg === undefined && (0, _lodashLangIsArray['default'])(collection) ? arrayFunc(collection, iteratee) : eachFunc(collection, (0, _lodashInternalBindCallback['default'])(iteratee, thisArg, 3));\n };\n }\n\n exports['default'] = createForEach;\n});","define('lodash/internal/createForIn', ['exports', 'lodash/internal/bindCallback', 'lodash/object/keysIn'], function (exports, _lodashInternalBindCallback, _lodashObjectKeysIn) {\n 'use strict';\n\n /**\n * Creates a function for `_.forIn` or `_.forInRight`.\n *\n * @private\n * @param {Function} objectFunc The function to iterate over an object.\n * @returns {Function} Returns the new each function.\n */\n function createForIn(objectFunc) {\n return function (object, iteratee, thisArg) {\n if (typeof iteratee != 'function' || thisArg !== undefined) {\n iteratee = (0, _lodashInternalBindCallback['default'])(iteratee, thisArg, 3);\n }\n return objectFunc(object, iteratee, _lodashObjectKeysIn['default']);\n };\n }\n\n exports['default'] = createForIn;\n});","define('lodash/internal/createForOwn', ['exports', 'lodash/internal/bindCallback'], function (exports, _lodashInternalBindCallback) {\n 'use strict';\n\n /**\n * Creates a function for `_.forOwn` or `_.forOwnRight`.\n *\n * @private\n * @param {Function} objectFunc The function to iterate over an object.\n * @returns {Function} Returns the new each function.\n */\n function createForOwn(objectFunc) {\n return function (object, iteratee, thisArg) {\n if (typeof iteratee != 'function' || thisArg !== undefined) {\n iteratee = (0, _lodashInternalBindCallback['default'])(iteratee, thisArg, 3);\n }\n return objectFunc(object, iteratee);\n };\n }\n\n exports['default'] = createForOwn;\n});","define('lodash/internal/createHybridWrapper', ['exports', 'lodash/internal/arrayCopy', 'lodash/internal/composeArgs', 'lodash/internal/composeArgsRight', 'lodash/internal/createCtorWrapper', 'lodash/internal/isLaziable', 'lodash/internal/reorder', 'lodash/internal/replaceHolders', 'lodash/internal/root', 'lodash/internal/setData'], function (exports, _lodashInternalArrayCopy, _lodashInternalComposeArgs, _lodashInternalComposeArgsRight, _lodashInternalCreateCtorWrapper, _lodashInternalIsLaziable, _lodashInternalReorder, _lodashInternalReplaceHolders, _lodashInternalRoot, _lodashInternalSetData) {\n 'use strict';\n\n /** Used to compose bitmasks for wrapper metadata. */\n var BIND_FLAG = 1,\n BIND_KEY_FLAG = 2,\n CURRY_BOUND_FLAG = 4,\n CURRY_FLAG = 8,\n CURRY_RIGHT_FLAG = 16,\n PARTIAL_FLAG = 32,\n PARTIAL_RIGHT_FLAG = 64,\n ARY_FLAG = 128;\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeMax = Math.max;\n\n /**\n * Creates a function that wraps `func` and invokes it with optional `this`\n * binding of, partial application, and currying.\n *\n * @private\n * @param {Function|string} func The function or method name to reference.\n * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [partialsRight] The arguments to append to those provided to the new function.\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n var isAry = bitmask & ARY_FLAG,\n isBind = bitmask & BIND_FLAG,\n isBindKey = bitmask & BIND_KEY_FLAG,\n isCurry = bitmask & CURRY_FLAG,\n isCurryBound = bitmask & CURRY_BOUND_FLAG,\n isCurryRight = bitmask & CURRY_RIGHT_FLAG,\n Ctor = isBindKey ? undefined : (0, _lodashInternalCreateCtorWrapper['default'])(func);\n\n function wrapper() {\n // Avoid `arguments` object use disqualifying optimizations by\n // converting it to an array before providing it to other functions.\n var length = arguments.length,\n index = length,\n args = Array(length);\n\n while (index--) {\n args[index] = arguments[index];\n }\n if (partials) {\n args = (0, _lodashInternalComposeArgs['default'])(args, partials, holders);\n }\n if (partialsRight) {\n args = (0, _lodashInternalComposeArgsRight['default'])(args, partialsRight, holdersRight);\n }\n if (isCurry || isCurryRight) {\n var placeholder = wrapper.placeholder,\n argsHolders = (0, _lodashInternalReplaceHolders['default'])(args, placeholder);\n\n length -= argsHolders.length;\n if (length < arity) {\n var newArgPos = argPos ? (0, _lodashInternalArrayCopy['default'])(argPos) : undefined,\n newArity = nativeMax(arity - length, 0),\n newsHolders = isCurry ? argsHolders : undefined,\n newHoldersRight = isCurry ? undefined : argsHolders,\n newPartials = isCurry ? args : undefined,\n newPartialsRight = isCurry ? undefined : args;\n\n bitmask |= isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG;\n bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG);\n\n if (!isCurryBound) {\n bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);\n }\n var newData = [func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity],\n result = createHybridWrapper.apply(undefined, newData);\n\n if ((0, _lodashInternalIsLaziable['default'])(func)) {\n (0, _lodashInternalSetData['default'])(result, newData);\n }\n result.placeholder = placeholder;\n return result;\n }\n }\n var thisBinding = isBind ? thisArg : this,\n fn = isBindKey ? thisBinding[func] : func;\n\n if (argPos) {\n args = (0, _lodashInternalReorder['default'])(args, argPos);\n }\n if (isAry && ary < args.length) {\n args.length = ary;\n }\n if (this && this !== _lodashInternalRoot['default'] && this instanceof wrapper) {\n fn = Ctor || (0, _lodashInternalCreateCtorWrapper['default'])(func);\n }\n return fn.apply(thisBinding, args);\n }\n return wrapper;\n }\n\n exports['default'] = createHybridWrapper;\n});","define('lodash/internal/createObjectMapper', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseForOwn'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseForOwn) {\n 'use strict';\n\n /**\n * Creates a function for `_.mapKeys` or `_.mapValues`.\n *\n * @private\n * @param {boolean} [isMapKeys] Specify mapping keys instead of values.\n * @returns {Function} Returns the new map function.\n */\n function createObjectMapper(isMapKeys) {\n return function (object, iteratee, thisArg) {\n var result = {};\n iteratee = (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 3);\n\n (0, _lodashInternalBaseForOwn['default'])(object, function (value, key, object) {\n var mapped = iteratee(value, key, object);\n key = isMapKeys ? mapped : key;\n value = isMapKeys ? value : mapped;\n result[key] = value;\n });\n return result;\n };\n }\n\n exports['default'] = createObjectMapper;\n});","define('lodash/internal/createPadDir', ['exports', 'lodash/internal/baseToString', 'lodash/internal/createPadding'], function (exports, _lodashInternalBaseToString, _lodashInternalCreatePadding) {\n 'use strict';\n\n /**\n * Creates a function for `_.padLeft` or `_.padRight`.\n *\n * @private\n * @param {boolean} [fromRight] Specify padding from the right.\n * @returns {Function} Returns the new pad function.\n */\n function createPadDir(fromRight) {\n return function (string, length, chars) {\n string = (0, _lodashInternalBaseToString['default'])(string);\n return (fromRight ? string : '') + (0, _lodashInternalCreatePadding['default'])(string, length, chars) + (fromRight ? '' : string);\n };\n }\n\n exports['default'] = createPadDir;\n});","define('lodash/internal/createPadding', ['exports', 'lodash/string/repeat', 'lodash/internal/root'], function (exports, _lodashStringRepeat, _lodashInternalRoot) {\n 'use strict';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeCeil = Math.ceil,\n nativeIsFinite = _lodashInternalRoot['default'].isFinite;\n\n /**\n * Creates the padding required for `string` based on the given `length`.\n * The `chars` string is truncated if the number of characters exceeds `length`.\n *\n * @private\n * @param {string} string The string to create padding for.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the pad for `string`.\n */\n function createPadding(string, length, chars) {\n var strLength = string.length;\n length = +length;\n\n if (strLength >= length || !nativeIsFinite(length)) {\n return '';\n }\n var padLength = length - strLength;\n chars = chars == null ? ' ' : chars + '';\n return (0, _lodashStringRepeat['default'])(chars, nativeCeil(padLength / chars.length)).slice(0, padLength);\n }\n\n exports['default'] = createPadding;\n});","define('lodash/internal/createPartial', ['exports', 'lodash/internal/createWrapper', 'lodash/internal/replaceHolders', 'lodash/function/restParam'], function (exports, _lodashInternalCreateWrapper, _lodashInternalReplaceHolders, _lodashFunctionRestParam) {\n 'use strict';\n\n /**\n * Creates a `_.partial` or `_.partialRight` function.\n *\n * @private\n * @param {boolean} flag The partial bit flag.\n * @returns {Function} Returns the new partial function.\n */\n function createPartial(flag) {\n var partialFunc = (0, _lodashFunctionRestParam['default'])(function (func, partials) {\n var holders = (0, _lodashInternalReplaceHolders['default'])(partials, partialFunc.placeholder);\n return (0, _lodashInternalCreateWrapper['default'])(func, flag, undefined, partials, holders);\n });\n return partialFunc;\n }\n\n exports['default'] = createPartial;\n});","define('lodash/internal/createPartialWrapper', ['exports', 'lodash/internal/createCtorWrapper', 'lodash/internal/root'], function (exports, _lodashInternalCreateCtorWrapper, _lodashInternalRoot) {\n 'use strict';\n\n /** Used to compose bitmasks for wrapper metadata. */\n var BIND_FLAG = 1;\n\n /**\n * Creates a function that wraps `func` and invokes it with the optional `this`\n * binding of `thisArg` and the `partials` prepended to those provided to\n * the wrapper.\n *\n * @private\n * @param {Function} func The function to partially apply arguments to.\n * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} partials The arguments to prepend to those provided to the new function.\n * @returns {Function} Returns the new bound function.\n */\n function createPartialWrapper(func, bitmask, thisArg, partials) {\n var isBind = bitmask & BIND_FLAG,\n Ctor = (0, _lodashInternalCreateCtorWrapper['default'])(func);\n\n function wrapper() {\n // Avoid `arguments` object use disqualifying optimizations by\n // converting it to an array before providing it `func`.\n var argsIndex = -1,\n argsLength = arguments.length,\n leftIndex = -1,\n leftLength = partials.length,\n args = Array(leftLength + argsLength);\n\n while (++leftIndex < leftLength) {\n args[leftIndex] = partials[leftIndex];\n }\n while (argsLength--) {\n args[leftIndex++] = arguments[++argsIndex];\n }\n var fn = this && this !== _lodashInternalRoot['default'] && this instanceof wrapper ? Ctor : func;\n return fn.apply(isBind ? thisArg : this, args);\n }\n return wrapper;\n }\n\n exports['default'] = createPartialWrapper;\n});","define('lodash/internal/createReduce', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/baseReduce', 'lodash/lang/isArray'], function (exports, _lodashInternalBaseCallback, _lodashInternalBaseReduce, _lodashLangIsArray) {\n 'use strict';\n\n /**\n * Creates a function for `_.reduce` or `_.reduceRight`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over an array.\n * @param {Function} eachFunc The function to iterate over a collection.\n * @returns {Function} Returns the new each function.\n */\n function createReduce(arrayFunc, eachFunc) {\n return function (collection, iteratee, accumulator, thisArg) {\n var initFromArray = arguments.length < 3;\n return typeof iteratee == 'function' && thisArg === undefined && (0, _lodashLangIsArray['default'])(collection) ? arrayFunc(collection, iteratee, accumulator, initFromArray) : (0, _lodashInternalBaseReduce['default'])(collection, (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 4), accumulator, initFromArray, eachFunc);\n };\n }\n\n exports['default'] = createReduce;\n});","define(\"lodash/internal/createRound\", [\"exports\"], function (exports) {\n /** Native method references. */\n \"use strict\";\n\n var pow = Math.pow;\n\n /**\n * Creates a `_.ceil`, `_.floor`, or `_.round` function.\n *\n * @private\n * @param {string} methodName The name of the `Math` method to use when rounding.\n * @returns {Function} Returns the new round function.\n */\n function createRound(methodName) {\n var func = Math[methodName];\n return function (number, precision) {\n precision = precision === undefined ? 0 : +precision || 0;\n if (precision) {\n precision = pow(10, precision);\n return func(number * precision) / precision;\n }\n return func(number);\n };\n }\n\n exports[\"default\"] = createRound;\n});","define('lodash/internal/createSortedIndex', ['exports', 'lodash/internal/baseCallback', 'lodash/internal/binaryIndex', 'lodash/internal/binaryIndexBy'], function (exports, _lodashInternalBaseCallback, _lodashInternalBinaryIndex, _lodashInternalBinaryIndexBy) {\n 'use strict';\n\n /**\n * Creates a `_.sortedIndex` or `_.sortedLastIndex` function.\n *\n * @private\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {Function} Returns the new index function.\n */\n function createSortedIndex(retHighest) {\n return function (array, value, iteratee, thisArg) {\n return iteratee == null ? (0, _lodashInternalBinaryIndex['default'])(array, value, retHighest) : (0, _lodashInternalBinaryIndexBy['default'])(array, value, (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 1), retHighest);\n };\n }\n\n exports['default'] = createSortedIndex;\n});","define('lodash/internal/createWrapper', ['exports', 'lodash/internal/baseSetData', 'lodash/internal/createBindWrapper', 'lodash/internal/createHybridWrapper', 'lodash/internal/createPartialWrapper', 'lodash/internal/getData', 'lodash/internal/mergeData', 'lodash/internal/setData'], function (exports, _lodashInternalBaseSetData, _lodashInternalCreateBindWrapper, _lodashInternalCreateHybridWrapper, _lodashInternalCreatePartialWrapper, _lodashInternalGetData, _lodashInternalMergeData, _lodashInternalSetData) {\n 'use strict';\n\n /** Used to compose bitmasks for wrapper metadata. */\n var BIND_FLAG = 1,\n BIND_KEY_FLAG = 2,\n PARTIAL_FLAG = 32,\n PARTIAL_RIGHT_FLAG = 64;\n\n /** Used as the `TypeError` message for \"Functions\" methods. */\n var FUNC_ERROR_TEXT = 'Expected a function';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeMax = Math.max;\n\n /**\n * Creates a function that either curries or invokes `func` with optional\n * `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to reference.\n * @param {number} bitmask The bitmask of flags.\n * The bitmask may be composed of the following flags:\n * 1 - `_.bind`\n * 2 - `_.bindKey`\n * 4 - `_.curry` or `_.curryRight` of a bound function\n * 8 - `_.curry`\n * 16 - `_.curryRight`\n * 32 - `_.partial`\n * 64 - `_.partialRight`\n * 128 - `_.rearg`\n * 256 - `_.ary`\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to be partially applied.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n var isBindKey = bitmask & BIND_KEY_FLAG;\n if (!isBindKey && typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var length = partials ? partials.length : 0;\n if (!length) {\n bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);\n partials = holders = undefined;\n }\n length -= holders ? holders.length : 0;\n if (bitmask & PARTIAL_RIGHT_FLAG) {\n var partialsRight = partials,\n holdersRight = holders;\n\n partials = holders = undefined;\n }\n var data = isBindKey ? undefined : (0, _lodashInternalGetData['default'])(func),\n newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];\n\n if (data) {\n (0, _lodashInternalMergeData['default'])(newData, data);\n bitmask = newData[1];\n arity = newData[9];\n }\n newData[9] = arity == null ? isBindKey ? 0 : func.length : nativeMax(arity - length, 0) || 0;\n\n if (bitmask == BIND_FLAG) {\n var result = (0, _lodashInternalCreateBindWrapper['default'])(newData[0], newData[2]);\n } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !newData[4].length) {\n result = _lodashInternalCreatePartialWrapper['default'].apply(undefined, newData);\n } else {\n result = _lodashInternalCreateHybridWrapper['default'].apply(undefined, newData);\n }\n var setter = data ? _lodashInternalBaseSetData['default'] : _lodashInternalSetData['default'];\n return setter(result, newData);\n }\n\n exports['default'] = createWrapper;\n});","define('lodash/internal/deburrLetter', ['exports'], function (exports) {\n /** Used to map latin-1 supplementary letters to basic latin letters. */\n 'use strict';\n\n var deburredLetters = {\n '\\xc0': 'A', '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n '\\xe0': 'a', '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n '\\xc7': 'C', '\\xe7': 'c',\n '\\xd0': 'D', '\\xf0': 'd',\n '\\xc8': 'E', '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n '\\xe8': 'e', '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n '\\xcC': 'I', '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n '\\xeC': 'i', '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n '\\xd1': 'N', '\\xf1': 'n',\n '\\xd2': 'O', '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n '\\xf2': 'o', '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n '\\xd9': 'U', '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n '\\xf9': 'u', '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n '\\xdd': 'Y', '\\xfd': 'y', '\\xff': 'y',\n '\\xc6': 'Ae', '\\xe6': 'ae',\n '\\xde': 'Th', '\\xfe': 'th',\n '\\xdf': 'ss'\n };\n\n /**\n * Used by `_.deburr` to convert latin-1 supplementary letters to basic latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\n function deburrLetter(letter) {\n return deburredLetters[letter];\n }\n\n exports['default'] = deburrLetter;\n});","define('lodash/internal/equalArrays', ['exports', 'lodash/internal/arraySome'], function (exports, _lodashInternalArraySome) {\n 'use strict';\n\n /**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing arrays.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\n function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {\n var index = -1,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isLoose && othLength > arrLength)) {\n return false;\n }\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index],\n result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined;\n\n if (result !== undefined) {\n if (result) {\n continue;\n }\n return false;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (isLoose) {\n if (!(0, _lodashInternalArraySome['default'])(other, function (othValue) {\n return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);\n })) {\n return false;\n }\n } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) {\n return false;\n }\n }\n return true;\n }\n\n exports['default'] = equalArrays;\n});","define('lodash/internal/equalByTag', ['exports'], function (exports) {\n /** `Object#toString` result references. */\n 'use strict';\n\n var boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n stringTag = '[object String]';\n\n /**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalByTag(object, other, tag) {\n switch (tag) {\n case boolTag:\n case dateTag:\n // Coerce dates and booleans to numbers, dates to milliseconds and booleans\n // to `1` or `0` treating invalid dates coerced to `NaN` as not equal.\n return +object == +other;\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case numberTag:\n // Treat `NaN` vs. `NaN` as equal.\n return object != +object ? other != +other : object == +other;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings primitives and string\n // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.\n return object == other + '';\n }\n return false;\n }\n\n exports['default'] = equalByTag;\n});","define('lodash/internal/equalObjects', ['exports', 'lodash/object/keys'], function (exports, _lodashObjectKeys) {\n 'use strict';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing values.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n var objProps = (0, _lodashObjectKeys['default'])(object),\n objLength = objProps.length,\n othProps = (0, _lodashObjectKeys['default'])(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isLoose) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n var skipCtor = isLoose;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key],\n result = customizer ? customizer(isLoose ? othValue : objValue, isLoose ? objValue : othValue, key) : undefined;\n\n // Recursively compare objects (susceptible to call stack limits).\n if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) {\n return false;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (!skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor && 'constructor' in object && 'constructor' in other && !(typeof objCtor == 'function' && objCtor instanceof objCtor && typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n return false;\n }\n }\n return true;\n }\n\n exports['default'] = equalObjects;\n});","define('lodash/internal/escapeHtmlChar', ['exports'], function (exports) {\n /** Used to map characters to HTML entities. */\n 'use strict';\n\n var htmlEscapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`'\n };\n\n /**\n * Used by `_.escape` to convert characters to HTML entities.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n function escapeHtmlChar(chr) {\n return htmlEscapes[chr];\n }\n\n exports['default'] = escapeHtmlChar;\n});","define('lodash/internal/escapeRegExpChar', ['exports'], function (exports) {\n /** Used to escape characters for inclusion in compiled regexes. */\n 'use strict';\n\n var regexpEscapes = {\n '0': 'x30', '1': 'x31', '2': 'x32', '3': 'x33', '4': 'x34',\n '5': 'x35', '6': 'x36', '7': 'x37', '8': 'x38', '9': 'x39',\n 'A': 'x41', 'B': 'x42', 'C': 'x43', 'D': 'x44', 'E': 'x45', 'F': 'x46',\n 'a': 'x61', 'b': 'x62', 'c': 'x63', 'd': 'x64', 'e': 'x65', 'f': 'x66',\n 'n': 'x6e', 'r': 'x72', 't': 'x74', 'u': 'x75', 'v': 'x76', 'x': 'x78'\n };\n\n /** Used to escape characters for inclusion in compiled string literals. */\n var stringEscapes = {\n '\\\\': '\\\\',\n \"'\": \"'\",\n '\\n': 'n',\n '\\r': 'r',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n };\n\n /**\n * Used by `_.escapeRegExp` to escape characters for inclusion in compiled regexes.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @param {string} leadingChar The capture group for a leading character.\n * @param {string} whitespaceChar The capture group for a whitespace character.\n * @returns {string} Returns the escaped character.\n */\n function escapeRegExpChar(chr, leadingChar, whitespaceChar) {\n if (leadingChar) {\n chr = regexpEscapes[chr];\n } else if (whitespaceChar) {\n chr = stringEscapes[chr];\n }\n return '\\\\' + chr;\n }\n\n exports['default'] = escapeRegExpChar;\n});","define('lodash/internal/escapeStringChar', ['exports'], function (exports) {\n /** Used to escape characters for inclusion in compiled string literals. */\n 'use strict';\n\n var stringEscapes = {\n '\\\\': '\\\\',\n \"'\": \"'\",\n '\\n': 'n',\n '\\r': 'r',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n };\n\n /**\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n function escapeStringChar(chr) {\n return '\\\\' + stringEscapes[chr];\n }\n\n exports['default'] = escapeStringChar;\n});","define('lodash/internal/getData', ['exports', 'lodash/internal/metaMap', 'lodash/utility/noop'], function (exports, _lodashInternalMetaMap, _lodashUtilityNoop) {\n 'use strict';\n\n /**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\n var getData = !_lodashInternalMetaMap['default'] ? _lodashUtilityNoop['default'] : function (func) {\n return _lodashInternalMetaMap['default'].get(func);\n };\n\n exports['default'] = getData;\n});","define('lodash/internal/getFuncName', ['exports', 'lodash/internal/realNames'], function (exports, _lodashInternalRealNames) {\n 'use strict';\n\n /**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\n function getFuncName(func) {\n var result = func.name + '',\n array = _lodashInternalRealNames['default'][result],\n length = array ? array.length : 0;\n\n while (length--) {\n var data = array[length],\n otherFunc = data.func;\n if (otherFunc == null || otherFunc == func) {\n return data.name;\n }\n }\n return result;\n }\n\n exports['default'] = getFuncName;\n});","define('lodash/internal/getLength', ['exports', 'lodash/internal/baseProperty'], function (exports, _lodashInternalBaseProperty) {\n 'use strict';\n\n /**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\n var getLength = (0, _lodashInternalBaseProperty['default'])('length');\n\n exports['default'] = getLength;\n});","define('lodash/internal/getMatchData', ['exports', 'lodash/internal/isStrictComparable', 'lodash/object/pairs'], function (exports, _lodashInternalIsStrictComparable, _lodashObjectPairs) {\n 'use strict';\n\n /**\n * Gets the propery names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\n function getMatchData(object) {\n var result = (0, _lodashObjectPairs['default'])(object),\n length = result.length;\n\n while (length--) {\n result[length][2] = (0, _lodashInternalIsStrictComparable['default'])(result[length][1]);\n }\n return result;\n }\n\n exports['default'] = getMatchData;\n});","define('lodash/internal/getNative', ['exports', 'lodash/lang/isNative'], function (exports, _lodashLangIsNative) {\n 'use strict';\n\n /**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\n function getNative(object, key) {\n var value = object == null ? undefined : object[key];\n return (0, _lodashLangIsNative['default'])(value) ? value : undefined;\n }\n\n exports['default'] = getNative;\n});","define('lodash/internal/getView', ['exports'], function (exports) {\n /* Native method references for those with the same name as other `lodash` methods. */\n 'use strict';\n\n var nativeMax = Math.max,\n nativeMin = Math.min;\n\n /**\n * Gets the view, applying any `transforms` to the `start` and `end` positions.\n *\n * @private\n * @param {number} start The start of the view.\n * @param {number} end The end of the view.\n * @param {Array} transforms The transformations to apply to the view.\n * @returns {Object} Returns an object containing the `start` and `end`\n * positions of the view.\n */\n function getView(start, end, transforms) {\n var index = -1,\n length = transforms.length;\n\n while (++index < length) {\n var data = transforms[index],\n size = data.size;\n\n switch (data.type) {\n case 'drop':\n start += size;break;\n case 'dropRight':\n end -= size;break;\n case 'take':\n end = nativeMin(end, start + size);break;\n case 'takeRight':\n start = nativeMax(start, end - size);break;\n }\n }\n return { 'start': start, 'end': end };\n }\n\n exports['default'] = getView;\n});","define(\"lodash/internal/indexOfNaN\", [\"exports\"], function (exports) {\n /**\n * Gets the index at which the first occurrence of `NaN` is found in `array`.\n *\n * @private\n * @param {Array} array The array to search.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched `NaN`, else `-1`.\n */\n \"use strict\";\n\n function indexOfNaN(array, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 0 : -1);\n\n while (fromRight ? index-- : ++index < length) {\n var other = array[index];\n if (other !== other) {\n return index;\n }\n }\n return -1;\n }\n\n exports[\"default\"] = indexOfNaN;\n});","define('lodash/internal/initCloneArray', ['exports'], function (exports) {\n /** Used for native method references. */\n 'use strict';\n\n var objectProto = Object.prototype;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\n function initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add array properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n }\n\n exports['default'] = initCloneArray;\n});","define('lodash/internal/initCloneByTag', ['exports', 'lodash/internal/bufferClone'], function (exports, _lodashInternalBufferClone) {\n 'use strict';\n\n /** `Object#toString` result references. */\n var boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n stringTag = '[object String]';\n\n var arrayBufferTag = '[object ArrayBuffer]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n /** Used to match `RegExp` flags from their coerced string values. */\n var reFlags = /\\w*$/;\n\n /**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return (0, _lodashInternalBufferClone['default'])(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case float32Tag:case float64Tag:\n case int8Tag:case int16Tag:case int32Tag:\n case uint8Tag:case uint8ClampedTag:case uint16Tag:case uint32Tag:\n var buffer = object.buffer;\n return new Ctor(isDeep ? (0, _lodashInternalBufferClone['default'])(buffer) : buffer, object.byteOffset, object.length);\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n var result = new Ctor(object.source, reFlags.exec(object));\n result.lastIndex = object.lastIndex;\n }\n return result;\n }\n\n exports['default'] = initCloneByTag;\n});","define('lodash/internal/initCloneObject', ['exports'], function (exports) {\n /**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\n 'use strict';\n\n function initCloneObject(object) {\n var Ctor = object.constructor;\n if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) {\n Ctor = Object;\n }\n return new Ctor();\n }\n\n exports['default'] = initCloneObject;\n});","define('lodash/internal/invokePath', ['exports', 'lodash/internal/baseGet', 'lodash/internal/baseSlice', 'lodash/internal/isKey', 'lodash/array/last', 'lodash/internal/toPath'], function (exports, _lodashInternalBaseGet, _lodashInternalBaseSlice, _lodashInternalIsKey, _lodashArrayLast, _lodashInternalToPath) {\n 'use strict';\n\n /**\n * Invokes the method at `path` on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {Array} args The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n */\n function invokePath(object, path, args) {\n if (object != null && !(0, _lodashInternalIsKey['default'])(path, object)) {\n path = (0, _lodashInternalToPath['default'])(path);\n object = path.length == 1 ? object : (0, _lodashInternalBaseGet['default'])(object, (0, _lodashInternalBaseSlice['default'])(path, 0, -1));\n path = (0, _lodashArrayLast['default'])(path);\n }\n var func = object == null ? object : object[path];\n return func == null ? undefined : func.apply(object, args);\n }\n\n exports['default'] = invokePath;\n});","define('lodash/internal/isArrayLike', ['exports', 'lodash/internal/getLength', 'lodash/internal/isLength'], function (exports, _lodashInternalGetLength, _lodashInternalIsLength) {\n 'use strict';\n\n /**\n * Checks if `value` is array-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n */\n function isArrayLike(value) {\n return value != null && (0, _lodashInternalIsLength['default'])((0, _lodashInternalGetLength['default'])(value));\n }\n\n exports['default'] = isArrayLike;\n});","define('lodash/internal/isIndex', ['exports'], function (exports) {\n /** Used to detect unsigned integer values. */\n 'use strict';\n\n var reIsUint = /^\\d+$/;\n\n /**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\n var MAX_SAFE_INTEGER = 9007199254740991;\n\n /**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\n function isIndex(value, length) {\n value = typeof value == 'number' || reIsUint.test(value) ? +value : -1;\n length = length == null ? MAX_SAFE_INTEGER : length;\n return value > -1 && value % 1 == 0 && value < length;\n }\n\n exports['default'] = isIndex;\n});","define('lodash/internal/isIterateeCall', ['exports', 'lodash/internal/isArrayLike', 'lodash/internal/isIndex', 'lodash/lang/isObject'], function (exports, _lodashInternalIsArrayLike, _lodashInternalIsIndex, _lodashLangIsObject) {\n 'use strict';\n\n /**\n * Checks if the provided arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n */\n function isIterateeCall(value, index, object) {\n if (!(0, _lodashLangIsObject['default'])(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number' ? (0, _lodashInternalIsArrayLike['default'])(object) && (0, _lodashInternalIsIndex['default'])(index, object.length) : type == 'string' && index in object) {\n var other = object[index];\n return value === value ? value === other : other !== other;\n }\n return false;\n }\n\n exports['default'] = isIterateeCall;\n});","define('lodash/internal/isKey', ['exports', 'lodash/lang/isArray', 'lodash/internal/toObject'], function (exports, _lodashLangIsArray, _lodashInternalToObject) {\n 'use strict';\n\n /** Used to match property names within property paths. */\n var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\n\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n /**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\n function isKey(value, object) {\n var type = typeof value;\n if (type == 'string' && reIsPlainProp.test(value) || type == 'number') {\n return true;\n }\n if ((0, _lodashLangIsArray['default'])(value)) {\n return false;\n }\n var result = !reIsDeepProp.test(value);\n return result || object != null && value in (0, _lodashInternalToObject['default'])(object);\n }\n\n exports['default'] = isKey;\n});","define('lodash/internal/isLaziable', ['exports', 'lodash/internal/LazyWrapper', 'lodash/internal/getData', 'lodash/internal/getFuncName', 'lodash/chain/lodash'], function (exports, _lodashInternalLazyWrapper, _lodashInternalGetData, _lodashInternalGetFuncName, _lodashChainLodash) {\n 'use strict';\n\n /**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`.\n */\n function isLaziable(func) {\n var funcName = (0, _lodashInternalGetFuncName['default'])(func),\n other = _lodashChainLodash['default'][funcName];\n\n if (typeof other != 'function' || !(funcName in _lodashInternalLazyWrapper['default'].prototype)) {\n return false;\n }\n if (func === other) {\n return true;\n }\n var data = (0, _lodashInternalGetData['default'])(other);\n return !!data && func === data[0];\n }\n\n exports['default'] = isLaziable;\n});","define('lodash/internal/isLength', ['exports'], function (exports) {\n /**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\n 'use strict';\n\n var MAX_SAFE_INTEGER = 9007199254740991;\n\n /**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\n function isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n }\n\n exports['default'] = isLength;\n});","define('lodash/internal/isObjectLike', ['exports'], function (exports) {\n /**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\n 'use strict';\n\n function isObjectLike(value) {\n return !!value && typeof value == 'object';\n }\n\n exports['default'] = isObjectLike;\n});","define(\"lodash/internal/isSpace\", [\"exports\"], function (exports) {\n /**\n * Used by `trimmedLeftIndex` and `trimmedRightIndex` to determine if a\n * character code is whitespace.\n *\n * @private\n * @param {number} charCode The character code to inspect.\n * @returns {boolean} Returns `true` if `charCode` is whitespace, else `false`.\n */\n \"use strict\";\n\n function isSpace(charCode) {\n return charCode <= 160 && charCode >= 9 && charCode <= 13 || charCode == 32 || charCode == 160 || charCode == 5760 || charCode == 6158 || charCode >= 8192 && (charCode <= 8202 || charCode == 8232 || charCode == 8233 || charCode == 8239 || charCode == 8287 || charCode == 12288 || charCode == 65279);\n }\n\n exports[\"default\"] = isSpace;\n});","define('lodash/internal/isStrictComparable', ['exports', 'lodash/lang/isObject'], function (exports, _lodashLangIsObject) {\n 'use strict';\n\n /**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\n function isStrictComparable(value) {\n return value === value && !(0, _lodashLangIsObject['default'])(value);\n }\n\n exports['default'] = isStrictComparable;\n});","define('lodash/internal/lazyClone', ['exports', 'lodash/internal/LazyWrapper', 'lodash/internal/arrayCopy'], function (exports, _lodashInternalLazyWrapper, _lodashInternalArrayCopy) {\n 'use strict';\n\n /**\n * Creates a clone of the lazy wrapper object.\n *\n * @private\n * @name clone\n * @memberOf LazyWrapper\n * @returns {Object} Returns the cloned `LazyWrapper` object.\n */\n function lazyClone() {\n var result = new _lodashInternalLazyWrapper['default'](this.__wrapped__);\n result.__actions__ = (0, _lodashInternalArrayCopy['default'])(this.__actions__);\n result.__dir__ = this.__dir__;\n result.__filtered__ = this.__filtered__;\n result.__iteratees__ = (0, _lodashInternalArrayCopy['default'])(this.__iteratees__);\n result.__takeCount__ = this.__takeCount__;\n result.__views__ = (0, _lodashInternalArrayCopy['default'])(this.__views__);\n return result;\n }\n\n exports['default'] = lazyClone;\n});","define('lodash/internal/lazyReverse', ['exports', 'lodash/internal/LazyWrapper'], function (exports, _lodashInternalLazyWrapper) {\n 'use strict';\n\n /**\n * Reverses the direction of lazy iteration.\n *\n * @private\n * @name reverse\n * @memberOf LazyWrapper\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\n */\n function lazyReverse() {\n if (this.__filtered__) {\n var result = new _lodashInternalLazyWrapper['default'](this);\n result.__dir__ = -1;\n result.__filtered__ = true;\n } else {\n result = this.clone();\n result.__dir__ *= -1;\n }\n return result;\n }\n\n exports['default'] = lazyReverse;\n});","define('lodash/internal/lazyValue', ['exports', 'lodash/internal/baseWrapperValue', 'lodash/internal/getView', 'lodash/lang/isArray'], function (exports, _lodashInternalBaseWrapperValue, _lodashInternalGetView, _lodashLangIsArray) {\n 'use strict';\n\n /** Used as the size to enable large array optimizations. */\n var LARGE_ARRAY_SIZE = 200;\n\n /** Used to indicate the type of lazy iteratees. */\n var LAZY_FILTER_FLAG = 1,\n LAZY_MAP_FLAG = 2;\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeMin = Math.min;\n\n /**\n * Extracts the unwrapped value from its lazy wrapper.\n *\n * @private\n * @name value\n * @memberOf LazyWrapper\n * @returns {*} Returns the unwrapped value.\n */\n function lazyValue() {\n var array = this.__wrapped__.value(),\n dir = this.__dir__,\n isArr = (0, _lodashLangIsArray['default'])(array),\n isRight = dir < 0,\n arrLength = isArr ? array.length : 0,\n view = (0, _lodashInternalGetView['default'])(0, arrLength, this.__views__),\n start = view.start,\n end = view.end,\n length = end - start,\n index = isRight ? end : start - 1,\n iteratees = this.__iteratees__,\n iterLength = iteratees.length,\n resIndex = 0,\n takeCount = nativeMin(length, this.__takeCount__);\n\n if (!isArr || arrLength < LARGE_ARRAY_SIZE || arrLength == length && takeCount == length) {\n return (0, _lodashInternalBaseWrapperValue['default'])(array, this.__actions__);\n }\n var result = [];\n\n outer: while (length-- && resIndex < takeCount) {\n index += dir;\n\n var iterIndex = -1,\n value = array[index];\n\n while (++iterIndex < iterLength) {\n var data = iteratees[iterIndex],\n iteratee = data.iteratee,\n type = data.type,\n computed = iteratee(value);\n\n if (type == LAZY_MAP_FLAG) {\n value = computed;\n } else if (!computed) {\n if (type == LAZY_FILTER_FLAG) {\n continue outer;\n } else {\n break outer;\n }\n }\n }\n result[resIndex++] = value;\n }\n return result;\n }\n\n exports['default'] = lazyValue;\n});","define(\"lodash/internal/mapDelete\", [\"exports\"], function (exports) {\n /**\n * Removes `key` and its value from the cache.\n *\n * @private\n * @name delete\n * @memberOf _.memoize.Cache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed successfully, else `false`.\n */\n \"use strict\";\n\n function mapDelete(key) {\n return this.has(key) && delete this.__data__[key];\n }\n\n exports[\"default\"] = mapDelete;\n});","define('lodash/internal/mapGet', ['exports'], function (exports) {\n /**\n * Gets the cached value for `key`.\n *\n * @private\n * @name get\n * @memberOf _.memoize.Cache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the cached value.\n */\n 'use strict';\n\n function mapGet(key) {\n return key == '__proto__' ? undefined : this.__data__[key];\n }\n\n exports['default'] = mapGet;\n});","define('lodash/internal/mapHas', ['exports'], function (exports) {\n /** Used for native method references. */\n 'use strict';\n\n var objectProto = Object.prototype;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /**\n * Checks if a cached value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf _.memoize.Cache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function mapHas(key) {\n return key != '__proto__' && hasOwnProperty.call(this.__data__, key);\n }\n\n exports['default'] = mapHas;\n});","define('lodash/internal/mapSet', ['exports'], function (exports) {\n /**\n * Sets `value` to `key` of the cache.\n *\n * @private\n * @name set\n * @memberOf _.memoize.Cache\n * @param {string} key The key of the value to cache.\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache object.\n */\n 'use strict';\n\n function mapSet(key, value) {\n if (key != '__proto__') {\n this.__data__[key] = value;\n }\n return this;\n }\n\n exports['default'] = mapSet;\n});","define('lodash/internal/mergeData', ['exports', 'lodash/internal/arrayCopy', 'lodash/internal/composeArgs', 'lodash/internal/composeArgsRight', 'lodash/internal/replaceHolders'], function (exports, _lodashInternalArrayCopy, _lodashInternalComposeArgs, _lodashInternalComposeArgsRight, _lodashInternalReplaceHolders) {\n 'use strict';\n\n /** Used to compose bitmasks for wrapper metadata. */\n var BIND_FLAG = 1,\n CURRY_BOUND_FLAG = 4,\n CURRY_FLAG = 8,\n ARY_FLAG = 128,\n REARG_FLAG = 256;\n\n /** Used as the internal argument placeholder. */\n var PLACEHOLDER = '__lodash_placeholder__';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeMin = Math.min;\n\n /**\n * Merges the function metadata of `source` into `data`.\n *\n * Merging metadata reduces the number of wrappers required to invoke a function.\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n * may be applied regardless of execution order. Methods like `_.ary` and `_.rearg`\n * augment function arguments, making the order in which they are executed important,\n * preventing the merging of metadata. However, we make an exception for a safe\n * common case where curried functions have `_.ary` and or `_.rearg` applied.\n *\n * @private\n * @param {Array} data The destination metadata.\n * @param {Array} source The source metadata.\n * @returns {Array} Returns `data`.\n */\n function mergeData(data, source) {\n var bitmask = data[1],\n srcBitmask = source[1],\n newBitmask = bitmask | srcBitmask,\n isCommon = newBitmask < ARY_FLAG;\n\n var isCombo = srcBitmask == ARY_FLAG && bitmask == CURRY_FLAG || srcBitmask == ARY_FLAG && bitmask == REARG_FLAG && data[7].length <= source[8] || srcBitmask == (ARY_FLAG | REARG_FLAG) && bitmask == CURRY_FLAG;\n\n // Exit early if metadata can't be merged.\n if (!(isCommon || isCombo)) {\n return data;\n }\n // Use source `thisArg` if available.\n if (srcBitmask & BIND_FLAG) {\n data[2] = source[2];\n // Set when currying a bound function.\n newBitmask |= bitmask & BIND_FLAG ? 0 : CURRY_BOUND_FLAG;\n }\n // Compose partial arguments.\n var value = source[3];\n if (value) {\n var partials = data[3];\n data[3] = partials ? (0, _lodashInternalComposeArgs['default'])(partials, value, source[4]) : (0, _lodashInternalArrayCopy['default'])(value);\n data[4] = partials ? (0, _lodashInternalReplaceHolders['default'])(data[3], PLACEHOLDER) : (0, _lodashInternalArrayCopy['default'])(source[4]);\n }\n // Compose partial right arguments.\n value = source[5];\n if (value) {\n partials = data[5];\n data[5] = partials ? (0, _lodashInternalComposeArgsRight['default'])(partials, value, source[6]) : (0, _lodashInternalArrayCopy['default'])(value);\n data[6] = partials ? (0, _lodashInternalReplaceHolders['default'])(data[5], PLACEHOLDER) : (0, _lodashInternalArrayCopy['default'])(source[6]);\n }\n // Use source `argPos` if available.\n value = source[7];\n if (value) {\n data[7] = (0, _lodashInternalArrayCopy['default'])(value);\n }\n // Use source `ary` if it's smaller.\n if (srcBitmask & ARY_FLAG) {\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n }\n // Use source `arity` if one is not provided.\n if (data[9] == null) {\n data[9] = source[9];\n }\n // Use source `func` and merge bitmasks.\n data[0] = source[0];\n data[1] = newBitmask;\n\n return data;\n }\n\n exports['default'] = mergeData;\n});","define('lodash/internal/mergeDefaults', ['exports', 'lodash/object/merge'], function (exports, _lodashObjectMerge) {\n 'use strict';\n\n /**\n * Used by `_.defaultsDeep` to customize its `_.merge` use.\n *\n * @private\n * @param {*} objectValue The destination object property value.\n * @param {*} sourceValue The source object property value.\n * @returns {*} Returns the value to assign to the destination object.\n */\n function mergeDefaults(objectValue, sourceValue) {\n return objectValue === undefined ? sourceValue : (0, _lodashObjectMerge['default'])(objectValue, sourceValue, mergeDefaults);\n }\n\n exports['default'] = mergeDefaults;\n});","define('lodash/internal/metaMap', ['exports', 'lodash/internal/getNative', 'lodash/internal/root'], function (exports, _lodashInternalGetNative, _lodashInternalRoot) {\n 'use strict';\n\n /** Native method references. */\n var WeakMap = (0, _lodashInternalGetNative['default'])(_lodashInternalRoot['default'], 'WeakMap');\n\n /** Used to store function metadata. */\n var metaMap = WeakMap && new WeakMap();\n\n exports['default'] = metaMap;\n});","define('lodash/internal/pickByArray', ['exports', 'lodash/internal/toObject'], function (exports, _lodashInternalToObject) {\n 'use strict';\n\n /**\n * A specialized version of `_.pick` which picks `object` properties specified\n * by `props`.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} props The property names to pick.\n * @returns {Object} Returns the new object.\n */\n function pickByArray(object, props) {\n object = (0, _lodashInternalToObject['default'])(object);\n\n var index = -1,\n length = props.length,\n result = {};\n\n while (++index < length) {\n var key = props[index];\n if (key in object) {\n result[key] = object[key];\n }\n }\n return result;\n }\n\n exports['default'] = pickByArray;\n});","define('lodash/internal/pickByCallback', ['exports', 'lodash/internal/baseForIn'], function (exports, _lodashInternalBaseForIn) {\n 'use strict';\n\n /**\n * A specialized version of `_.pick` which picks `object` properties `predicate`\n * returns truthy for.\n *\n * @private\n * @param {Object} object The source object.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Object} Returns the new object.\n */\n function pickByCallback(object, predicate) {\n var result = {};\n (0, _lodashInternalBaseForIn['default'])(object, function (value, key, object) {\n if (predicate(value, key, object)) {\n result[key] = value;\n }\n });\n return result;\n }\n\n exports['default'] = pickByCallback;\n});","define(\"lodash/internal/reEscape\", [\"exports\"], function (exports) {\n /** Used to match template delimiters. */\n \"use strict\";\n\n var reEscape = /<%-([\\s\\S]+?)%>/g;\n\n exports[\"default\"] = reEscape;\n});","define(\"lodash/internal/reEvaluate\", [\"exports\"], function (exports) {\n /** Used to match template delimiters. */\n \"use strict\";\n\n var reEvaluate = /<%([\\s\\S]+?)%>/g;\n\n exports[\"default\"] = reEvaluate;\n});","define(\"lodash/internal/reInterpolate\", [\"exports\"], function (exports) {\n /** Used to match template delimiters. */\n \"use strict\";\n\n var reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n exports[\"default\"] = reInterpolate;\n});","define(\"lodash/internal/realNames\", [\"exports\"], function (exports) {\n /** Used to lookup unminified function names. */\n \"use strict\";\n\n var realNames = {};\n\n exports[\"default\"] = realNames;\n});","define('lodash/internal/reorder', ['exports', 'lodash/internal/arrayCopy', 'lodash/internal/isIndex'], function (exports, _lodashInternalArrayCopy, _lodashInternalIsIndex) {\n 'use strict';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeMin = Math.min;\n\n /**\n * Reorder `array` according to the specified indexes where the element at\n * the first index is assigned as the first element, the element at\n * the second index is assigned as the second element, and so on.\n *\n * @private\n * @param {Array} array The array to reorder.\n * @param {Array} indexes The arranged array indexes.\n * @returns {Array} Returns `array`.\n */\n function reorder(array, indexes) {\n var arrLength = array.length,\n length = nativeMin(indexes.length, arrLength),\n oldArray = (0, _lodashInternalArrayCopy['default'])(array);\n\n while (length--) {\n var index = indexes[length];\n array[length] = (0, _lodashInternalIsIndex['default'])(index, arrLength) ? oldArray[index] : undefined;\n }\n return array;\n }\n\n exports['default'] = reorder;\n});","define('lodash/internal/replaceHolders', ['exports'], function (exports) {\n /** Used as the internal argument placeholder. */\n 'use strict';\n\n var PLACEHOLDER = '__lodash_placeholder__';\n\n /**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */\n function replaceHolders(array, placeholder) {\n var index = -1,\n length = array.length,\n resIndex = -1,\n result = [];\n\n while (++index < length) {\n if (array[index] === placeholder) {\n array[index] = PLACEHOLDER;\n result[++resIndex] = index;\n }\n }\n return result;\n }\n\n exports['default'] = replaceHolders;\n});","define('lodash/internal/root', ['exports'], function (exports) {\n /** Used to determine if values are of the language type `Object`. */\n 'use strict';\n\n var objectTypes = {\n 'function': true,\n 'object': true\n };\n\n /** Detect free variable `exports`. */\n var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n\n /** Detect free variable `module`. */\n var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n /** Detect free variable `global` from Node.js. */\n var freeGlobal = freeExports && freeModule && typeof global == 'object' && global && global.Object && global;\n\n /** Detect free variable `self`. */\n var freeSelf = objectTypes[typeof self] && self && self.Object && self;\n\n /** Detect free variable `window`. */\n var freeWindow = objectTypes[typeof window] && window && window.Object && window;\n\n /**\n * Used as a reference to the global object.\n *\n * The `this` value is used if it's the global object to avoid Greasemonkey's\n * restricted `window` object, otherwise the `window` object is used.\n */\n var root = freeGlobal || window;\n // var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this;\n\n exports['default'] = root;\n});","define('lodash/internal/setData', ['exports', 'lodash/internal/baseSetData', 'lodash/date/now'], function (exports, _lodashInternalBaseSetData, _lodashDateNow) {\n 'use strict';\n\n /** Used to detect when a function becomes hot. */\n var HOT_COUNT = 150,\n HOT_SPAN = 16;\n\n /**\n * Sets metadata for `func`.\n *\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n * period of time, it will trip its breaker and transition to an identity function\n * to avoid garbage collection pauses in V8. See [V8 issue 2070](https://code.google.com/p/v8/issues/detail?id=2070)\n * for more details.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var setData = (function () {\n var count = 0,\n lastCalled = 0;\n\n return function (key, value) {\n var stamp = (0, _lodashDateNow['default'])(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return key;\n }\n } else {\n count = 0;\n }\n return (0, _lodashInternalBaseSetData['default'])(key, value);\n };\n })();\n\n exports['default'] = setData;\n});","define('lodash/internal/shimKeys', ['exports', 'lodash/lang/isArguments', 'lodash/lang/isArray', 'lodash/internal/isIndex', 'lodash/internal/isLength', 'lodash/object/keysIn'], function (exports, _lodashLangIsArguments, _lodashLangIsArray, _lodashInternalIsIndex, _lodashInternalIsLength, _lodashObjectKeysIn) {\n 'use strict';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /**\n * A fallback implementation of `Object.keys` which creates an array of the\n * own enumerable property names of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function shimKeys(object) {\n var props = (0, _lodashObjectKeysIn['default'])(object),\n propsLength = props.length,\n length = propsLength && object.length;\n\n var allowIndexes = !!length && (0, _lodashInternalIsLength['default'])(length) && ((0, _lodashLangIsArray['default'])(object) || (0, _lodashLangIsArguments['default'])(object));\n\n var index = -1,\n result = [];\n\n while (++index < propsLength) {\n var key = props[index];\n if (allowIndexes && (0, _lodashInternalIsIndex['default'])(key, length) || hasOwnProperty.call(object, key)) {\n result.push(key);\n }\n }\n return result;\n }\n\n exports['default'] = shimKeys;\n});","define(\"lodash/internal/sortedUniq\", [\"exports\"], function (exports) {\n /**\n * An implementation of `_.uniq` optimized for sorted arrays without support\n * for callback shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The function invoked per iteration.\n * @returns {Array} Returns the new duplicate free array.\n */\n \"use strict\";\n\n function sortedUniq(array, iteratee) {\n var seen,\n index = -1,\n length = array.length,\n resIndex = -1,\n result = [];\n\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value, index, array) : value;\n\n if (!index || seen !== computed) {\n seen = computed;\n result[++resIndex] = value;\n }\n }\n return result;\n }\n\n exports[\"default\"] = sortedUniq;\n});","define('lodash/internal/toIterable', ['exports', 'lodash/internal/isArrayLike', 'lodash/lang/isObject', 'lodash/object/values'], function (exports, _lodashInternalIsArrayLike, _lodashLangIsObject, _lodashObjectValues) {\n 'use strict';\n\n /**\n * Converts `value` to an array-like object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Array|Object} Returns the array-like object.\n */\n function toIterable(value) {\n if (value == null) {\n return [];\n }\n if (!(0, _lodashInternalIsArrayLike['default'])(value)) {\n return (0, _lodashObjectValues['default'])(value);\n }\n return (0, _lodashLangIsObject['default'])(value) ? value : Object(value);\n }\n\n exports['default'] = toIterable;\n});","define('lodash/internal/toObject', ['exports', 'lodash/lang/isObject'], function (exports, _lodashLangIsObject) {\n 'use strict';\n\n /**\n * Converts `value` to an object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Object} Returns the object.\n */\n function toObject(value) {\n return (0, _lodashLangIsObject['default'])(value) ? value : Object(value);\n }\n\n exports['default'] = toObject;\n});","define('lodash/internal/toPath', ['exports', 'lodash/internal/baseToString', 'lodash/lang/isArray'], function (exports, _lodashInternalBaseToString, _lodashLangIsArray) {\n 'use strict';\n\n /** Used to match property names within property paths. */\n var rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\n\\\\]|\\\\.)*?)\\2)\\]/g;\n\n /** Used to match backslashes in property paths. */\n var reEscapeChar = /\\\\(\\\\)?/g;\n\n /**\n * Converts `value` to property path array if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Array} Returns the property path array.\n */\n function toPath(value) {\n if ((0, _lodashLangIsArray['default'])(value)) {\n return value;\n }\n var result = [];\n (0, _lodashInternalBaseToString['default'])(value).replace(rePropName, function (match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : number || match);\n });\n return result;\n }\n\n exports['default'] = toPath;\n});","define('lodash/internal/trimmedLeftIndex', ['exports', 'lodash/internal/isSpace'], function (exports, _lodashInternalIsSpace) {\n 'use strict';\n\n /**\n * Used by `_.trim` and `_.trimLeft` to get the index of the first non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the first non-whitespace character.\n */\n function trimmedLeftIndex(string) {\n var index = -1,\n length = string.length;\n\n while (++index < length && (0, _lodashInternalIsSpace['default'])(string.charCodeAt(index))) {}\n return index;\n }\n\n exports['default'] = trimmedLeftIndex;\n});","define('lodash/internal/trimmedRightIndex', ['exports', 'lodash/internal/isSpace'], function (exports, _lodashInternalIsSpace) {\n 'use strict';\n\n /**\n * Used by `_.trim` and `_.trimRight` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\n function trimmedRightIndex(string) {\n var index = string.length;\n\n while (index-- && (0, _lodashInternalIsSpace['default'])(string.charCodeAt(index))) {}\n return index;\n }\n\n exports['default'] = trimmedRightIndex;\n});","define('lodash/internal/unescapeHtmlChar', ['exports'], function (exports) {\n /** Used to map HTML entities to characters. */\n 'use strict';\n\n var htmlUnescapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\",\n '`': '`'\n };\n\n /**\n * Used by `_.unescape` to convert HTML entities to characters.\n *\n * @private\n * @param {string} chr The matched character to unescape.\n * @returns {string} Returns the unescaped character.\n */\n function unescapeHtmlChar(chr) {\n return htmlUnescapes[chr];\n }\n\n exports['default'] = unescapeHtmlChar;\n});","define('lodash/internal/wrapperClone', ['exports', 'lodash/internal/LazyWrapper', 'lodash/internal/LodashWrapper', 'lodash/internal/arrayCopy'], function (exports, _lodashInternalLazyWrapper, _lodashInternalLodashWrapper, _lodashInternalArrayCopy) {\n 'use strict';\n\n /**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\n function wrapperClone(wrapper) {\n return wrapper instanceof _lodashInternalLazyWrapper['default'] ? wrapper.clone() : new _lodashInternalLodashWrapper['default'](wrapper.__wrapped__, wrapper.__chain__, (0, _lodashInternalArrayCopy['default'])(wrapper.__actions__));\n }\n\n exports['default'] = wrapperClone;\n});","define('lodash/lang', ['exports', 'lodash/lang/clone', 'lodash/lang/cloneDeep', 'lodash/lang/eq', 'lodash/lang/gt', 'lodash/lang/gte', 'lodash/lang/isArguments', 'lodash/lang/isArray', 'lodash/lang/isBoolean', 'lodash/lang/isDate', 'lodash/lang/isElement', 'lodash/lang/isEmpty', 'lodash/lang/isEqual', 'lodash/lang/isError', 'lodash/lang/isFinite', 'lodash/lang/isFunction', 'lodash/lang/isMatch', 'lodash/lang/isNaN', 'lodash/lang/isNative', 'lodash/lang/isNull', 'lodash/lang/isNumber', 'lodash/lang/isObject', 'lodash/lang/isPlainObject', 'lodash/lang/isRegExp', 'lodash/lang/isString', 'lodash/lang/isTypedArray', 'lodash/lang/isUndefined', 'lodash/lang/lt', 'lodash/lang/lte', 'lodash/lang/toArray', 'lodash/lang/toPlainObject'], function (exports, _lodashLangClone, _lodashLangCloneDeep, _lodashLangEq, _lodashLangGt, _lodashLangGte, _lodashLangIsArguments, _lodashLangIsArray, _lodashLangIsBoolean, _lodashLangIsDate, _lodashLangIsElement, _lodashLangIsEmpty, _lodashLangIsEqual, _lodashLangIsError, _lodashLangIsFinite, _lodashLangIsFunction, _lodashLangIsMatch, _lodashLangIsNaN, _lodashLangIsNative, _lodashLangIsNull, _lodashLangIsNumber, _lodashLangIsObject, _lodashLangIsPlainObject, _lodashLangIsRegExp, _lodashLangIsString, _lodashLangIsTypedArray, _lodashLangIsUndefined, _lodashLangLt, _lodashLangLte, _lodashLangToArray, _lodashLangToPlainObject) {\n 'use strict';\n\n exports['default'] = {\n 'clone': _lodashLangClone['default'],\n 'cloneDeep': _lodashLangCloneDeep['default'],\n 'eq': _lodashLangEq['default'],\n 'gt': _lodashLangGt['default'],\n 'gte': _lodashLangGte['default'],\n 'isArguments': _lodashLangIsArguments['default'],\n 'isArray': _lodashLangIsArray['default'],\n 'isBoolean': _lodashLangIsBoolean['default'],\n 'isDate': _lodashLangIsDate['default'],\n 'isElement': _lodashLangIsElement['default'],\n 'isEmpty': _lodashLangIsEmpty['default'],\n 'isEqual': _lodashLangIsEqual['default'],\n 'isError': _lodashLangIsError['default'],\n 'isFinite': _lodashLangIsFinite['default'],\n 'isFunction': _lodashLangIsFunction['default'],\n 'isMatch': _lodashLangIsMatch['default'],\n 'isNaN': _lodashLangIsNaN['default'],\n 'isNative': _lodashLangIsNative['default'],\n 'isNull': _lodashLangIsNull['default'],\n 'isNumber': _lodashLangIsNumber['default'],\n 'isObject': _lodashLangIsObject['default'],\n 'isPlainObject': _lodashLangIsPlainObject['default'],\n 'isRegExp': _lodashLangIsRegExp['default'],\n 'isString': _lodashLangIsString['default'],\n 'isTypedArray': _lodashLangIsTypedArray['default'],\n 'isUndefined': _lodashLangIsUndefined['default'],\n 'lt': _lodashLangLt['default'],\n 'lte': _lodashLangLte['default'],\n 'toArray': _lodashLangToArray['default'],\n 'toPlainObject': _lodashLangToPlainObject['default']\n };\n});","define('lodash/lang/clone', ['exports', 'lodash/internal/baseClone', 'lodash/internal/bindCallback', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseClone, _lodashInternalBindCallback, _lodashInternalIsIterateeCall) {\n 'use strict';\n\n /**\n * Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned,\n * otherwise they are assigned by reference. If `customizer` is provided it's\n * invoked to produce the cloned values. If `customizer` returns `undefined`\n * cloning is handled by the method instead. The `customizer` is bound to\n * `thisArg` and invoked with up to three argument; (value [, index|key, object]).\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).\n * The enumerable properties of `arguments` objects and objects created by\n * constructors other than `Object` are cloned to plain `Object` objects. An\n * empty object is returned for uncloneable values such as functions, DOM nodes,\n * Maps, Sets, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @param {Function} [customizer] The function to customize cloning values.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {*} Returns the cloned value.\n * @example\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * var shallow = _.clone(users);\n * shallow[0] === users[0];\n * // => true\n *\n * var deep = _.clone(users, true);\n * deep[0] === users[0];\n * // => false\n *\n * // using a customizer callback\n * var el = _.clone(document.body, function(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(false);\n * }\n * });\n *\n * el === document.body\n * // => false\n * el.nodeName\n * // => BODY\n * el.childNodes.length;\n * // => 0\n */\n function clone(value, isDeep, customizer, thisArg) {\n if (isDeep && typeof isDeep != 'boolean' && (0, _lodashInternalIsIterateeCall['default'])(value, isDeep, customizer)) {\n isDeep = false;\n } else if (typeof isDeep == 'function') {\n thisArg = customizer;\n customizer = isDeep;\n isDeep = false;\n }\n return typeof customizer == 'function' ? (0, _lodashInternalBaseClone['default'])(value, isDeep, (0, _lodashInternalBindCallback['default'])(customizer, thisArg, 3)) : (0, _lodashInternalBaseClone['default'])(value, isDeep);\n }\n\n exports['default'] = clone;\n});","define('lodash/lang/cloneDeep', ['exports', 'lodash/internal/baseClone', 'lodash/internal/bindCallback'], function (exports, _lodashInternalBaseClone, _lodashInternalBindCallback) {\n 'use strict';\n\n /**\n * Creates a deep clone of `value`. If `customizer` is provided it's invoked\n * to produce the cloned values. If `customizer` returns `undefined` cloning\n * is handled by the method instead. The `customizer` is bound to `thisArg`\n * and invoked with up to three argument; (value [, index|key, object]).\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).\n * The enumerable properties of `arguments` objects and objects created by\n * constructors other than `Object` are cloned to plain `Object` objects. An\n * empty object is returned for uncloneable values such as functions, DOM nodes,\n * Maps, Sets, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to deep clone.\n * @param {Function} [customizer] The function to customize cloning values.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {*} Returns the deep cloned value.\n * @example\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * var deep = _.cloneDeep(users);\n * deep[0] === users[0];\n * // => false\n *\n * // using a customizer callback\n * var el = _.cloneDeep(document.body, function(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(true);\n * }\n * });\n *\n * el === document.body\n * // => false\n * el.nodeName\n * // => BODY\n * el.childNodes.length;\n * // => 20\n */\n function cloneDeep(value, customizer, thisArg) {\n return typeof customizer == 'function' ? (0, _lodashInternalBaseClone['default'])(value, true, (0, _lodashInternalBindCallback['default'])(customizer, thisArg, 3)) : (0, _lodashInternalBaseClone['default'])(value, true);\n }\n\n exports['default'] = cloneDeep;\n});","define('lodash/lang/eq', ['exports', 'lodash/lang/isEqual'], function (exports, _lodashLangIsEqual) {\n 'use strict';\n\n exports['default'] = _lodashLangIsEqual['default'];\n});","define(\"lodash/lang/gt\", [\"exports\"], function (exports) {\n /**\n * Checks if `value` is greater than `other`.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`, else `false`.\n * @example\n *\n * _.gt(3, 1);\n * // => true\n *\n * _.gt(3, 3);\n * // => false\n *\n * _.gt(1, 3);\n * // => false\n */\n \"use strict\";\n\n function gt(value, other) {\n return value > other;\n }\n\n exports[\"default\"] = gt;\n});","define(\"lodash/lang/gte\", [\"exports\"], function (exports) {\n /**\n * Checks if `value` is greater than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than or equal to `other`, else `false`.\n * @example\n *\n * _.gte(3, 1);\n * // => true\n *\n * _.gte(3, 3);\n * // => true\n *\n * _.gte(1, 3);\n * // => false\n */\n \"use strict\";\n\n function gte(value, other) {\n return value >= other;\n }\n\n exports[\"default\"] = gte;\n});","define('lodash/lang/isArguments', ['exports', 'lodash/internal/isArrayLike', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalIsArrayLike, _lodashInternalIsObjectLike) {\n 'use strict';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Native method references. */\n var propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n /**\n * Checks if `value` is classified as an `arguments` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\n function isArguments(value) {\n return (0, _lodashInternalIsObjectLike['default'])(value) && (0, _lodashInternalIsArrayLike['default'])(value) && hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');\n }\n\n exports['default'] = isArguments;\n});","define('lodash/lang/isArray', ['exports', 'lodash/internal/getNative', 'lodash/internal/isLength', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalGetNative, _lodashInternalIsLength, _lodashInternalIsObjectLike) {\n 'use strict';\n\n /** `Object#toString` result references. */\n var arrayTag = '[object Array]';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\n var objToString = objectProto.toString;\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeIsArray = (0, _lodashInternalGetNative['default'])(Array, 'isArray');\n\n /**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(function() { return arguments; }());\n * // => false\n */\n var isArray = nativeIsArray || function (value) {\n return (0, _lodashInternalIsObjectLike['default'])(value) && (0, _lodashInternalIsLength['default'])(value.length) && objToString.call(value) == arrayTag;\n };\n\n exports['default'] = isArray;\n});","define('lodash/lang/isBoolean', ['exports', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalIsObjectLike) {\n 'use strict';\n\n /** `Object#toString` result references. */\n var boolTag = '[object Boolean]';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\n var objToString = objectProto.toString;\n\n /**\n * Checks if `value` is classified as a boolean primitive or object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isBoolean(false);\n * // => true\n *\n * _.isBoolean(null);\n * // => false\n */\n function isBoolean(value) {\n return value === true || value === false || (0, _lodashInternalIsObjectLike['default'])(value) && objToString.call(value) == boolTag;\n }\n\n exports['default'] = isBoolean;\n});","define('lodash/lang/isDate', ['exports', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalIsObjectLike) {\n 'use strict';\n\n /** `Object#toString` result references. */\n var dateTag = '[object Date]';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\n var objToString = objectProto.toString;\n\n /**\n * Checks if `value` is classified as a `Date` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n *\n * _.isDate('Mon April 23 2012');\n * // => false\n */\n function isDate(value) {\n return (0, _lodashInternalIsObjectLike['default'])(value) && objToString.call(value) == dateTag;\n }\n\n exports['default'] = isDate;\n});","define('lodash/lang/isElement', ['exports', 'lodash/internal/isObjectLike', 'lodash/lang/isPlainObject'], function (exports, _lodashInternalIsObjectLike, _lodashLangIsPlainObject) {\n 'use strict';\n\n /**\n * Checks if `value` is a DOM element.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n * @example\n *\n * _.isElement(document.body);\n * // => true\n *\n * _.isElement('');\n * // => false\n */\n function isElement(value) {\n return !!value && value.nodeType === 1 && (0, _lodashInternalIsObjectLike['default'])(value) && !(0, _lodashLangIsPlainObject['default'])(value);\n }\n\n exports['default'] = isElement;\n});","define('lodash/lang/isEmpty', ['exports', 'lodash/lang/isArguments', 'lodash/lang/isArray', 'lodash/internal/isArrayLike', 'lodash/lang/isFunction', 'lodash/internal/isObjectLike', 'lodash/lang/isString', 'lodash/object/keys'], function (exports, _lodashLangIsArguments, _lodashLangIsArray, _lodashInternalIsArrayLike, _lodashLangIsFunction, _lodashInternalIsObjectLike, _lodashLangIsString, _lodashObjectKeys) {\n 'use strict';\n\n /**\n * Checks if `value` is empty. A value is considered empty unless it's an\n * `arguments` object, array, string, or jQuery-like collection with a length\n * greater than `0` or an object with own enumerable properties.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {Array|Object|string} value The value to inspect.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\n function isEmpty(value) {\n if (value == null) {\n return true;\n }\n if ((0, _lodashInternalIsArrayLike['default'])(value) && ((0, _lodashLangIsArray['default'])(value) || (0, _lodashLangIsString['default'])(value) || (0, _lodashLangIsArguments['default'])(value) || (0, _lodashInternalIsObjectLike['default'])(value) && (0, _lodashLangIsFunction['default'])(value.splice))) {\n return !value.length;\n }\n return !(0, _lodashObjectKeys['default'])(value).length;\n }\n\n exports['default'] = isEmpty;\n});","define('lodash/lang/isEqual', ['exports', 'lodash/internal/baseIsEqual', 'lodash/internal/bindCallback'], function (exports, _lodashInternalBaseIsEqual, _lodashInternalBindCallback) {\n 'use strict';\n\n /**\n * Performs a deep comparison between two values to determine if they are\n * equivalent. If `customizer` is provided it's invoked to compare values.\n * If `customizer` returns `undefined` comparisons are handled by the method\n * instead. The `customizer` is bound to `thisArg` and invoked with up to\n * three arguments: (value, other [, index|key]).\n *\n * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n * numbers, `Object` objects, regexes, and strings. Objects are compared by\n * their own, not inherited, enumerable properties. Functions and DOM nodes\n * are **not** supported. Provide a customizer function to extend support\n * for comparing other values.\n *\n * @static\n * @memberOf _\n * @alias eq\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize value comparisons.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'user': 'fred' };\n * var other = { 'user': 'fred' };\n *\n * object == other;\n * // => false\n *\n * _.isEqual(object, other);\n * // => true\n *\n * // using a customizer callback\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * _.isEqual(array, other, function(value, other) {\n * if (_.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/)) {\n * return true;\n * }\n * });\n * // => true\n */\n function isEqual(value, other, customizer, thisArg) {\n customizer = typeof customizer == 'function' ? (0, _lodashInternalBindCallback['default'])(customizer, thisArg, 3) : undefined;\n var result = customizer ? customizer(value, other) : undefined;\n return result === undefined ? (0, _lodashInternalBaseIsEqual['default'])(value, other, customizer) : !!result;\n }\n\n exports['default'] = isEqual;\n});","define('lodash/lang/isError', ['exports', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalIsObjectLike) {\n 'use strict';\n\n /** `Object#toString` result references. */\n var errorTag = '[object Error]';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\n var objToString = objectProto.toString;\n\n /**\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n * `SyntaxError`, `TypeError`, or `URIError` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n * @example\n *\n * _.isError(new Error);\n * // => true\n *\n * _.isError(Error);\n * // => false\n */\n function isError(value) {\n return (0, _lodashInternalIsObjectLike['default'])(value) && typeof value.message == 'string' && objToString.call(value) == errorTag;\n }\n\n exports['default'] = isError;\n});","define('lodash/lang/isFinite', ['exports', 'lodash/internal/root'], function (exports, _lodashInternalRoot) {\n 'use strict';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeIsFinite = _lodashInternalRoot['default'].isFinite;\n\n /**\n * Checks if `value` is a finite primitive number.\n *\n * **Note:** This method is based on [`Number.isFinite`](http://ecma-international.org/ecma-262/6.0/#sec-number.isfinite).\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n * @example\n *\n * _.isFinite(10);\n * // => true\n *\n * _.isFinite('10');\n * // => false\n *\n * _.isFinite(true);\n * // => false\n *\n * _.isFinite(Object(10));\n * // => false\n *\n * _.isFinite(Infinity);\n * // => false\n */\n function isFinite(value) {\n return typeof value == 'number' && nativeIsFinite(value);\n }\n\n exports['default'] = isFinite;\n});","define('lodash/lang/isFunction', ['exports', 'lodash/lang/isObject'], function (exports, _lodashLangIsObject) {\n 'use strict';\n\n /** `Object#toString` result references. */\n var funcTag = '[object Function]';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\n var objToString = objectProto.toString;\n\n /**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\n function isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in older versions of Chrome and Safari which return 'function' for regexes\n // and Safari 8 which returns 'object' for typed array constructors.\n return (0, _lodashLangIsObject['default'])(value) && objToString.call(value) == funcTag;\n }\n\n exports['default'] = isFunction;\n});","define('lodash/lang/isMatch', ['exports', 'lodash/internal/baseIsMatch', 'lodash/internal/bindCallback', 'lodash/internal/getMatchData'], function (exports, _lodashInternalBaseIsMatch, _lodashInternalBindCallback, _lodashInternalGetMatchData) {\n 'use strict';\n\n /**\n * Performs a deep comparison between `object` and `source` to determine if\n * `object` contains equivalent property values. If `customizer` is provided\n * it's invoked to compare values. If `customizer` returns `undefined`\n * comparisons are handled by the method instead. The `customizer` is bound\n * to `thisArg` and invoked with three arguments: (value, other, index|key).\n *\n * **Note:** This method supports comparing properties of arrays, booleans,\n * `Date` objects, numbers, `Object` objects, regexes, and strings. Functions\n * and DOM nodes are **not** supported. Provide a customizer function to extend\n * support for comparing other values.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Function} [customizer] The function to customize value comparisons.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * var object = { 'user': 'fred', 'age': 40 };\n *\n * _.isMatch(object, { 'age': 40 });\n * // => true\n *\n * _.isMatch(object, { 'age': 36 });\n * // => false\n *\n * // using a customizer callback\n * var object = { 'greeting': 'hello' };\n * var source = { 'greeting': 'hi' };\n *\n * _.isMatch(object, source, function(value, other) {\n * return _.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/) || undefined;\n * });\n * // => true\n */\n function isMatch(object, source, customizer, thisArg) {\n customizer = typeof customizer == 'function' ? (0, _lodashInternalBindCallback['default'])(customizer, thisArg, 3) : undefined;\n return (0, _lodashInternalBaseIsMatch['default'])(object, (0, _lodashInternalGetMatchData['default'])(source), customizer);\n }\n\n exports['default'] = isMatch;\n});","define('lodash/lang/isNaN', ['exports', 'lodash/lang/isNumber'], function (exports, _lodashLangIsNumber) {\n 'use strict';\n\n /**\n * Checks if `value` is `NaN`.\n *\n * **Note:** This method is not the same as [`isNaN`](https://es5.github.io/#x15.1.2.4)\n * which returns `true` for `undefined` and other non-numeric values.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n * @example\n *\n * _.isNaN(NaN);\n * // => true\n *\n * _.isNaN(new Number(NaN));\n * // => true\n *\n * isNaN(undefined);\n * // => true\n *\n * _.isNaN(undefined);\n * // => false\n */\n function isNaN(value) {\n // An `NaN` primitive is the only value that is not equal to itself.\n // Perform the `toStringTag` check first to avoid errors with some host objects in IE.\n return (0, _lodashLangIsNumber['default'])(value) && value != +value;\n }\n\n exports['default'] = isNaN;\n});","define('lodash/lang/isNative', ['exports', 'lodash/lang/isFunction', 'lodash/internal/isObjectLike'], function (exports, _lodashLangIsFunction, _lodashInternalIsObjectLike) {\n 'use strict';\n\n /** Used to detect host constructors (Safari > 5). */\n var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /** Used to resolve the decompiled source of functions. */\n var fnToString = Function.prototype.toString;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to detect if a method is native. */\n var reIsNative = RegExp('^' + fnToString.call(hasOwnProperty).replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&').replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$');\n\n /**\n * Checks if `value` is a native function.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function, else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\n function isNative(value) {\n if (value == null) {\n return false;\n }\n if ((0, _lodashLangIsFunction['default'])(value)) {\n return reIsNative.test(fnToString.call(value));\n }\n return (0, _lodashInternalIsObjectLike['default'])(value) && reIsHostCtor.test(value);\n }\n\n exports['default'] = isNative;\n});","define(\"lodash/lang/isNull\", [\"exports\"], function (exports) {\n /**\n * Checks if `value` is `null`.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n * @example\n *\n * _.isNull(null);\n * // => true\n *\n * _.isNull(void 0);\n * // => false\n */\n \"use strict\";\n\n function isNull(value) {\n return value === null;\n }\n\n exports[\"default\"] = isNull;\n});","define('lodash/lang/isNumber', ['exports', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalIsObjectLike) {\n 'use strict';\n\n /** `Object#toString` result references. */\n var numberTag = '[object Number]';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\n var objToString = objectProto.toString;\n\n /**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are classified\n * as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isNumber(8.4);\n * // => true\n *\n * _.isNumber(NaN);\n * // => true\n *\n * _.isNumber('8.4');\n * // => false\n */\n function isNumber(value) {\n return typeof value == 'number' || (0, _lodashInternalIsObjectLike['default'])(value) && objToString.call(value) == numberTag;\n }\n\n exports['default'] = isNumber;\n});","define('lodash/lang/isObject', ['exports'], function (exports) {\n /**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(1);\n * // => false\n */\n 'use strict';\n\n function isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n }\n\n exports['default'] = isObject;\n});","define('lodash/lang/isPlainObject', ['exports', 'lodash/internal/baseForIn', 'lodash/lang/isArguments', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalBaseForIn, _lodashLangIsArguments, _lodashInternalIsObjectLike) {\n 'use strict';\n\n /** `Object#toString` result references. */\n var objectTag = '[object Object]';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\n var objToString = objectProto.toString;\n\n /**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * **Note:** This method assumes objects created by the `Object` constructor\n * have no inherited enumerable properties.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\n function isPlainObject(value) {\n var Ctor;\n\n // Exit early for non `Object` objects.\n if (!((0, _lodashInternalIsObjectLike['default'])(value) && objToString.call(value) == objectTag && !(0, _lodashLangIsArguments['default'])(value)) || !hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor))) {\n return false;\n }\n // IE < 9 iterates inherited properties before own properties. If the first\n // iterated property is an object's own property then there are no inherited\n // enumerable properties.\n var result;\n // In most environments an object's own properties are iterated before\n // its inherited properties. If the last iterated property is an object's\n // own property then there are no inherited enumerable properties.\n (0, _lodashInternalBaseForIn['default'])(value, function (subValue, key) {\n result = key;\n });\n return result === undefined || hasOwnProperty.call(value, result);\n }\n\n exports['default'] = isPlainObject;\n});","define('lodash/lang/isRegExp', ['exports', 'lodash/lang/isObject'], function (exports, _lodashLangIsObject) {\n 'use strict';\n\n /** `Object#toString` result references. */\n var regexpTag = '[object RegExp]';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\n var objToString = objectProto.toString;\n\n /**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\n function isRegExp(value) {\n return (0, _lodashLangIsObject['default'])(value) && objToString.call(value) == regexpTag;\n }\n\n exports['default'] = isRegExp;\n});","define('lodash/lang/isString', ['exports', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalIsObjectLike) {\n 'use strict';\n\n /** `Object#toString` result references. */\n var stringTag = '[object String]';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\n var objToString = objectProto.toString;\n\n /**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\n function isString(value) {\n return typeof value == 'string' || (0, _lodashInternalIsObjectLike['default'])(value) && objToString.call(value) == stringTag;\n }\n\n exports['default'] = isString;\n});","define('lodash/lang/isTypedArray', ['exports', 'lodash/internal/isLength', 'lodash/internal/isObjectLike'], function (exports, _lodashInternalIsLength, _lodashInternalIsObjectLike) {\n 'use strict';\n\n /** `Object#toString` result references. */\n var argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\n var arrayBufferTag = '[object ArrayBuffer]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n /** Used to identify `toStringTag` values of typed arrays. */\n var typedArrayTags = {};\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;\n typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\n var objToString = objectProto.toString;\n\n /**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\n function isTypedArray(value) {\n return (0, _lodashInternalIsObjectLike['default'])(value) && (0, _lodashInternalIsLength['default'])(value.length) && !!typedArrayTags[objToString.call(value)];\n }\n\n exports['default'] = isTypedArray;\n});","define(\"lodash/lang/isUndefined\", [\"exports\"], function (exports) {\n /**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\n \"use strict\";\n\n function isUndefined(value) {\n return value === undefined;\n }\n\n exports[\"default\"] = isUndefined;\n});","define(\"lodash/lang/lt\", [\"exports\"], function (exports) {\n /**\n * Checks if `value` is less than `other`.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`, else `false`.\n * @example\n *\n * _.lt(1, 3);\n * // => true\n *\n * _.lt(3, 3);\n * // => false\n *\n * _.lt(3, 1);\n * // => false\n */\n \"use strict\";\n\n function lt(value, other) {\n return value < other;\n }\n\n exports[\"default\"] = lt;\n});","define(\"lodash/lang/lte\", [\"exports\"], function (exports) {\n /**\n * Checks if `value` is less than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than or equal to `other`, else `false`.\n * @example\n *\n * _.lte(1, 3);\n * // => true\n *\n * _.lte(3, 3);\n * // => true\n *\n * _.lte(3, 1);\n * // => false\n */\n \"use strict\";\n\n function lte(value, other) {\n return value <= other;\n }\n\n exports[\"default\"] = lte;\n});","define('lodash/lang/toArray', ['exports', 'lodash/internal/arrayCopy', 'lodash/internal/getLength', 'lodash/internal/isLength', 'lodash/object/values'], function (exports, _lodashInternalArrayCopy, _lodashInternalGetLength, _lodashInternalIsLength, _lodashObjectValues) {\n 'use strict';\n\n /**\n * Converts `value` to an array.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Array} Returns the converted array.\n * @example\n *\n * (function() {\n * return _.toArray(arguments).slice(1);\n * }(1, 2, 3));\n * // => [2, 3]\n */\n function toArray(value) {\n var length = value ? (0, _lodashInternalGetLength['default'])(value) : 0;\n if (!(0, _lodashInternalIsLength['default'])(length)) {\n return (0, _lodashObjectValues['default'])(value);\n }\n if (!length) {\n return [];\n }\n return (0, _lodashInternalArrayCopy['default'])(value);\n }\n\n exports['default'] = toArray;\n});","define('lodash/lang/toPlainObject', ['exports', 'lodash/internal/baseCopy', 'lodash/object/keysIn'], function (exports, _lodashInternalBaseCopy, _lodashObjectKeysIn) {\n 'use strict';\n\n /**\n * Converts `value` to a plain object flattening inherited enumerable\n * properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\n function toPlainObject(value) {\n return (0, _lodashInternalBaseCopy['default'])(value, (0, _lodashObjectKeysIn['default'])(value));\n }\n\n exports['default'] = toPlainObject;\n});","define('lodash/lodash', ['exports', 'lodash/array', 'lodash/chain', 'lodash/collection', 'lodash/date', 'lodash/function', 'lodash/lang', 'lodash/math', 'lodash/number', 'lodash/object', 'lodash/string', 'lodash/utility', 'lodash/internal/LazyWrapper', 'lodash/internal/LodashWrapper', 'lodash/internal/arrayEach', 'lodash/internal/arrayPush', 'lodash/internal/baseCallback', 'lodash/internal/baseForOwn', 'lodash/internal/baseFunctions', 'lodash/internal/baseMatches', 'lodash/internal/createHybridWrapper', 'lodash/utility/identity', 'lodash/lang/isArray', 'lodash/lang/isObject', 'lodash/object/keys', 'lodash/array/last', 'lodash/internal/lazyClone', 'lodash/internal/lazyReverse', 'lodash/internal/lazyValue', 'lodash/chain/lodash', 'lodash/utility/mixin', 'lodash/utility/property', 'lodash/internal/realNames', 'lodash/support', 'lodash/chain/thru'], function (exports, _lodashArray, _lodashChain, _lodashCollection, _lodashDate, _lodashFunction, _lodashLang, _lodashMath, _lodashNumber, _lodashObject, _lodashString, _lodashUtility, _lodashInternalLazyWrapper, _lodashInternalLodashWrapper, _lodashInternalArrayEach, _lodashInternalArrayPush, _lodashInternalBaseCallback, _lodashInternalBaseForOwn, _lodashInternalBaseFunctions, _lodashInternalBaseMatches, _lodashInternalCreateHybridWrapper, _lodashUtilityIdentity, _lodashLangIsArray, _lodashLangIsObject, _lodashObjectKeys, _lodashArrayLast, _lodashInternalLazyClone, _lodashInternalLazyReverse, _lodashInternalLazyValue, _lodashChainLodash, _lodashUtilityMixin, _lodashUtilityProperty, _lodashInternalRealNames, _lodashSupport, _lodashChainThru) {\n /**\n * @license\n * lodash 3.10.1 (Custom Build) \n * Build: `lodash modularize modern exports=\"es\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n 'use strict';\n\n /** Used as the semantic version number. */\n var VERSION = '3.10.1';\n\n /** Used to compose bitmasks for wrapper metadata. */\n var BIND_KEY_FLAG = 2;\n\n /** Used to indicate the type of lazy iteratees. */\n var LAZY_MAP_FLAG = 2;\n\n /** Used for native method references. */\n var arrayProto = Array.prototype,\n stringProto = String.prototype;\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeFloor = Math.floor,\n nativeMax = Math.max,\n nativeMin = Math.min;\n\n /** Used as references for `-Infinity` and `Infinity`. */\n var POSITIVE_INFINITY = Number.POSITIVE_INFINITY;\n\n // wrap `_.mixin` so it works when provided only one argument\n var mixin = (function (func) {\n return function (object, source, options) {\n if (options == null) {\n var isObj = (0, _lodashLangIsObject['default'])(source),\n props = isObj && (0, _lodashObjectKeys['default'])(source),\n methodNames = props && props.length && (0, _lodashInternalBaseFunctions['default'])(source, props);\n\n if (!(methodNames ? methodNames.length : isObj)) {\n options = source;\n source = object;\n object = this;\n }\n }\n return func(object, source, options);\n };\n })(_lodashUtilityMixin['default']);\n\n // Add functions that return wrapped values when chaining.\n _lodashChainLodash['default'].after = _lodashFunction['default'].after;\n _lodashChainLodash['default'].ary = _lodashFunction['default'].ary;\n _lodashChainLodash['default'].assign = _lodashObject['default'].assign;\n _lodashChainLodash['default'].at = _lodashCollection['default'].at;\n _lodashChainLodash['default'].before = _lodashFunction['default'].before;\n _lodashChainLodash['default'].bind = _lodashFunction['default'].bind;\n _lodashChainLodash['default'].bindAll = _lodashFunction['default'].bindAll;\n _lodashChainLodash['default'].bindKey = _lodashFunction['default'].bindKey;\n _lodashChainLodash['default'].callback = _lodashUtility['default'].callback;\n _lodashChainLodash['default'].chain = _lodashChain['default'].chain;\n _lodashChainLodash['default'].chunk = _lodashArray['default'].chunk;\n _lodashChainLodash['default'].compact = _lodashArray['default'].compact;\n _lodashChainLodash['default'].constant = _lodashUtility['default'].constant;\n _lodashChainLodash['default'].countBy = _lodashCollection['default'].countBy;\n _lodashChainLodash['default'].create = _lodashObject['default'].create;\n _lodashChainLodash['default'].curry = _lodashFunction['default'].curry;\n _lodashChainLodash['default'].curryRight = _lodashFunction['default'].curryRight;\n _lodashChainLodash['default'].debounce = _lodashFunction['default'].debounce;\n _lodashChainLodash['default'].defaults = _lodashObject['default'].defaults;\n _lodashChainLodash['default'].defaultsDeep = _lodashObject['default'].defaultsDeep;\n _lodashChainLodash['default'].defer = _lodashFunction['default'].defer;\n _lodashChainLodash['default'].delay = _lodashFunction['default'].delay;\n _lodashChainLodash['default'].difference = _lodashArray['default'].difference;\n _lodashChainLodash['default'].drop = _lodashArray['default'].drop;\n _lodashChainLodash['default'].dropRight = _lodashArray['default'].dropRight;\n _lodashChainLodash['default'].dropRightWhile = _lodashArray['default'].dropRightWhile;\n _lodashChainLodash['default'].dropWhile = _lodashArray['default'].dropWhile;\n _lodashChainLodash['default'].fill = _lodashArray['default'].fill;\n _lodashChainLodash['default'].filter = _lodashCollection['default'].filter;\n _lodashChainLodash['default'].flatten = _lodashArray['default'].flatten;\n _lodashChainLodash['default'].flattenDeep = _lodashArray['default'].flattenDeep;\n _lodashChainLodash['default'].flow = _lodashFunction['default'].flow;\n _lodashChainLodash['default'].flowRight = _lodashFunction['default'].flowRight;\n _lodashChainLodash['default'].forEach = _lodashCollection['default'].forEach;\n _lodashChainLodash['default'].forEachRight = _lodashCollection['default'].forEachRight;\n _lodashChainLodash['default'].forIn = _lodashObject['default'].forIn;\n _lodashChainLodash['default'].forInRight = _lodashObject['default'].forInRight;\n _lodashChainLodash['default'].forOwn = _lodashObject['default'].forOwn;\n _lodashChainLodash['default'].forOwnRight = _lodashObject['default'].forOwnRight;\n _lodashChainLodash['default'].functions = _lodashObject['default'].functions;\n _lodashChainLodash['default'].groupBy = _lodashCollection['default'].groupBy;\n _lodashChainLodash['default'].indexBy = _lodashCollection['default'].indexBy;\n _lodashChainLodash['default'].initial = _lodashArray['default'].initial;\n _lodashChainLodash['default'].intersection = _lodashArray['default'].intersection;\n _lodashChainLodash['default'].invert = _lodashObject['default'].invert;\n _lodashChainLodash['default'].invoke = _lodashCollection['default'].invoke;\n _lodashChainLodash['default'].keys = _lodashObjectKeys['default'];\n _lodashChainLodash['default'].keysIn = _lodashObject['default'].keysIn;\n _lodashChainLodash['default'].map = _lodashCollection['default'].map;\n _lodashChainLodash['default'].mapKeys = _lodashObject['default'].mapKeys;\n _lodashChainLodash['default'].mapValues = _lodashObject['default'].mapValues;\n _lodashChainLodash['default'].matches = _lodashUtility['default'].matches;\n _lodashChainLodash['default'].matchesProperty = _lodashUtility['default'].matchesProperty;\n _lodashChainLodash['default'].memoize = _lodashFunction['default'].memoize;\n _lodashChainLodash['default'].merge = _lodashObject['default'].merge;\n _lodashChainLodash['default'].method = _lodashUtility['default'].method;\n _lodashChainLodash['default'].methodOf = _lodashUtility['default'].methodOf;\n _lodashChainLodash['default'].mixin = mixin;\n _lodashChainLodash['default'].modArgs = _lodashFunction['default'].modArgs;\n _lodashChainLodash['default'].negate = _lodashFunction['default'].negate;\n _lodashChainLodash['default'].omit = _lodashObject['default'].omit;\n _lodashChainLodash['default'].once = _lodashFunction['default'].once;\n _lodashChainLodash['default'].pairs = _lodashObject['default'].pairs;\n _lodashChainLodash['default'].partial = _lodashFunction['default'].partial;\n _lodashChainLodash['default'].partialRight = _lodashFunction['default'].partialRight;\n _lodashChainLodash['default'].partition = _lodashCollection['default'].partition;\n _lodashChainLodash['default'].pick = _lodashObject['default'].pick;\n _lodashChainLodash['default'].pluck = _lodashCollection['default'].pluck;\n _lodashChainLodash['default'].property = _lodashUtilityProperty['default'];\n _lodashChainLodash['default'].propertyOf = _lodashUtility['default'].propertyOf;\n _lodashChainLodash['default'].pull = _lodashArray['default'].pull;\n _lodashChainLodash['default'].pullAt = _lodashArray['default'].pullAt;\n _lodashChainLodash['default'].range = _lodashUtility['default'].range;\n _lodashChainLodash['default'].rearg = _lodashFunction['default'].rearg;\n _lodashChainLodash['default'].reject = _lodashCollection['default'].reject;\n _lodashChainLodash['default'].remove = _lodashArray['default'].remove;\n _lodashChainLodash['default'].rest = _lodashArray['default'].rest;\n _lodashChainLodash['default'].restParam = _lodashFunction['default'].restParam;\n _lodashChainLodash['default'].set = _lodashObject['default'].set;\n _lodashChainLodash['default'].shuffle = _lodashCollection['default'].shuffle;\n _lodashChainLodash['default'].slice = _lodashArray['default'].slice;\n _lodashChainLodash['default'].sortBy = _lodashCollection['default'].sortBy;\n _lodashChainLodash['default'].sortByAll = _lodashCollection['default'].sortByAll;\n _lodashChainLodash['default'].sortByOrder = _lodashCollection['default'].sortByOrder;\n _lodashChainLodash['default'].spread = _lodashFunction['default'].spread;\n _lodashChainLodash['default'].take = _lodashArray['default'].take;\n _lodashChainLodash['default'].takeRight = _lodashArray['default'].takeRight;\n _lodashChainLodash['default'].takeRightWhile = _lodashArray['default'].takeRightWhile;\n _lodashChainLodash['default'].takeWhile = _lodashArray['default'].takeWhile;\n _lodashChainLodash['default'].tap = _lodashChain['default'].tap;\n _lodashChainLodash['default'].throttle = _lodashFunction['default'].throttle;\n _lodashChainLodash['default'].thru = _lodashChainThru['default'];\n _lodashChainLodash['default'].times = _lodashUtility['default'].times;\n _lodashChainLodash['default'].toArray = _lodashLang['default'].toArray;\n _lodashChainLodash['default'].toPlainObject = _lodashLang['default'].toPlainObject;\n _lodashChainLodash['default'].transform = _lodashObject['default'].transform;\n _lodashChainLodash['default'].union = _lodashArray['default'].union;\n _lodashChainLodash['default'].uniq = _lodashArray['default'].uniq;\n _lodashChainLodash['default'].unzip = _lodashArray['default'].unzip;\n _lodashChainLodash['default'].unzipWith = _lodashArray['default'].unzipWith;\n _lodashChainLodash['default'].values = _lodashObject['default'].values;\n _lodashChainLodash['default'].valuesIn = _lodashObject['default'].valuesIn;\n _lodashChainLodash['default'].where = _lodashCollection['default'].where;\n _lodashChainLodash['default'].without = _lodashArray['default'].without;\n _lodashChainLodash['default'].wrap = _lodashFunction['default'].wrap;\n _lodashChainLodash['default'].xor = _lodashArray['default'].xor;\n _lodashChainLodash['default'].zip = _lodashArray['default'].zip;\n _lodashChainLodash['default'].zipObject = _lodashArray['default'].zipObject;\n _lodashChainLodash['default'].zipWith = _lodashArray['default'].zipWith;\n\n // Add aliases.\n _lodashChainLodash['default'].backflow = _lodashFunction['default'].flowRight;\n _lodashChainLodash['default'].collect = _lodashCollection['default'].map;\n _lodashChainLodash['default'].compose = _lodashFunction['default'].flowRight;\n _lodashChainLodash['default'].each = _lodashCollection['default'].forEach;\n _lodashChainLodash['default'].eachRight = _lodashCollection['default'].forEachRight;\n _lodashChainLodash['default'].extend = _lodashObject['default'].assign;\n _lodashChainLodash['default'].iteratee = _lodashUtility['default'].callback;\n _lodashChainLodash['default'].methods = _lodashObject['default'].functions;\n _lodashChainLodash['default'].object = _lodashArray['default'].zipObject;\n _lodashChainLodash['default'].select = _lodashCollection['default'].filter;\n _lodashChainLodash['default'].tail = _lodashArray['default'].rest;\n _lodashChainLodash['default'].unique = _lodashArray['default'].uniq;\n\n // Add functions to `lodash.prototype`.\n mixin(_lodashChainLodash['default'], _lodashChainLodash['default']);\n\n // Add functions that return unwrapped values when chaining.\n _lodashChainLodash['default'].add = _lodashMath['default'].add;\n _lodashChainLodash['default'].attempt = _lodashUtility['default'].attempt;\n _lodashChainLodash['default'].camelCase = _lodashString['default'].camelCase;\n _lodashChainLodash['default'].capitalize = _lodashString['default'].capitalize;\n _lodashChainLodash['default'].ceil = _lodashMath['default'].ceil;\n _lodashChainLodash['default'].clone = _lodashLang['default'].clone;\n _lodashChainLodash['default'].cloneDeep = _lodashLang['default'].cloneDeep;\n _lodashChainLodash['default'].deburr = _lodashString['default'].deburr;\n _lodashChainLodash['default'].endsWith = _lodashString['default'].endsWith;\n _lodashChainLodash['default'].escape = _lodashString['default'].escape;\n _lodashChainLodash['default'].escapeRegExp = _lodashString['default'].escapeRegExp;\n _lodashChainLodash['default'].every = _lodashCollection['default'].every;\n _lodashChainLodash['default'].find = _lodashCollection['default'].find;\n _lodashChainLodash['default'].findIndex = _lodashArray['default'].findIndex;\n _lodashChainLodash['default'].findKey = _lodashObject['default'].findKey;\n _lodashChainLodash['default'].findLast = _lodashCollection['default'].findLast;\n _lodashChainLodash['default'].findLastIndex = _lodashArray['default'].findLastIndex;\n _lodashChainLodash['default'].findLastKey = _lodashObject['default'].findLastKey;\n _lodashChainLodash['default'].findWhere = _lodashCollection['default'].findWhere;\n _lodashChainLodash['default'].first = _lodashArray['default'].first;\n _lodashChainLodash['default'].floor = _lodashMath['default'].floor;\n _lodashChainLodash['default'].get = _lodashObject['default'].get;\n _lodashChainLodash['default'].gt = _lodashLang['default'].gt;\n _lodashChainLodash['default'].gte = _lodashLang['default'].gte;\n _lodashChainLodash['default'].has = _lodashObject['default'].has;\n _lodashChainLodash['default'].identity = _lodashUtilityIdentity['default'];\n _lodashChainLodash['default'].includes = _lodashCollection['default'].includes;\n _lodashChainLodash['default'].indexOf = _lodashArray['default'].indexOf;\n _lodashChainLodash['default'].inRange = _lodashNumber['default'].inRange;\n _lodashChainLodash['default'].isArguments = _lodashLang['default'].isArguments;\n _lodashChainLodash['default'].isArray = _lodashLangIsArray['default'];\n _lodashChainLodash['default'].isBoolean = _lodashLang['default'].isBoolean;\n _lodashChainLodash['default'].isDate = _lodashLang['default'].isDate;\n _lodashChainLodash['default'].isElement = _lodashLang['default'].isElement;\n _lodashChainLodash['default'].isEmpty = _lodashLang['default'].isEmpty;\n _lodashChainLodash['default'].isEqual = _lodashLang['default'].isEqual;\n _lodashChainLodash['default'].isError = _lodashLang['default'].isError;\n _lodashChainLodash['default'].isFinite = _lodashLang['default'].isFinite;\n _lodashChainLodash['default'].isFunction = _lodashLang['default'].isFunction;\n _lodashChainLodash['default'].isMatch = _lodashLang['default'].isMatch;\n _lodashChainLodash['default'].isNaN = _lodashLang['default'].isNaN;\n _lodashChainLodash['default'].isNative = _lodashLang['default'].isNative;\n _lodashChainLodash['default'].isNull = _lodashLang['default'].isNull;\n _lodashChainLodash['default'].isNumber = _lodashLang['default'].isNumber;\n _lodashChainLodash['default'].isObject = _lodashLangIsObject['default'];\n _lodashChainLodash['default'].isPlainObject = _lodashLang['default'].isPlainObject;\n _lodashChainLodash['default'].isRegExp = _lodashLang['default'].isRegExp;\n _lodashChainLodash['default'].isString = _lodashLang['default'].isString;\n _lodashChainLodash['default'].isTypedArray = _lodashLang['default'].isTypedArray;\n _lodashChainLodash['default'].isUndefined = _lodashLang['default'].isUndefined;\n _lodashChainLodash['default'].kebabCase = _lodashString['default'].kebabCase;\n _lodashChainLodash['default'].last = _lodashArrayLast['default'];\n _lodashChainLodash['default'].lastIndexOf = _lodashArray['default'].lastIndexOf;\n _lodashChainLodash['default'].lt = _lodashLang['default'].lt;\n _lodashChainLodash['default'].lte = _lodashLang['default'].lte;\n _lodashChainLodash['default'].max = _lodashMath['default'].max;\n _lodashChainLodash['default'].min = _lodashMath['default'].min;\n _lodashChainLodash['default'].noop = _lodashUtility['default'].noop;\n _lodashChainLodash['default'].now = _lodashDate['default'].now;\n _lodashChainLodash['default'].pad = _lodashString['default'].pad;\n _lodashChainLodash['default'].padLeft = _lodashString['default'].padLeft;\n _lodashChainLodash['default'].padRight = _lodashString['default'].padRight;\n _lodashChainLodash['default'].parseInt = _lodashString['default'].parseInt;\n _lodashChainLodash['default'].random = _lodashNumber['default'].random;\n _lodashChainLodash['default'].reduce = _lodashCollection['default'].reduce;\n _lodashChainLodash['default'].reduceRight = _lodashCollection['default'].reduceRight;\n _lodashChainLodash['default'].repeat = _lodashString['default'].repeat;\n _lodashChainLodash['default'].result = _lodashObject['default'].result;\n _lodashChainLodash['default'].round = _lodashMath['default'].round;\n _lodashChainLodash['default'].size = _lodashCollection['default'].size;\n _lodashChainLodash['default'].snakeCase = _lodashString['default'].snakeCase;\n _lodashChainLodash['default'].some = _lodashCollection['default'].some;\n _lodashChainLodash['default'].sortedIndex = _lodashArray['default'].sortedIndex;\n _lodashChainLodash['default'].sortedLastIndex = _lodashArray['default'].sortedLastIndex;\n _lodashChainLodash['default'].startCase = _lodashString['default'].startCase;\n _lodashChainLodash['default'].startsWith = _lodashString['default'].startsWith;\n _lodashChainLodash['default'].sum = _lodashMath['default'].sum;\n _lodashChainLodash['default'].template = _lodashString['default'].template;\n _lodashChainLodash['default'].trim = _lodashString['default'].trim;\n _lodashChainLodash['default'].trimLeft = _lodashString['default'].trimLeft;\n _lodashChainLodash['default'].trimRight = _lodashString['default'].trimRight;\n _lodashChainLodash['default'].trunc = _lodashString['default'].trunc;\n _lodashChainLodash['default'].unescape = _lodashString['default'].unescape;\n _lodashChainLodash['default'].uniqueId = _lodashUtility['default'].uniqueId;\n _lodashChainLodash['default'].words = _lodashString['default'].words;\n\n // Add aliases.\n _lodashChainLodash['default'].all = _lodashCollection['default'].every;\n _lodashChainLodash['default'].any = _lodashCollection['default'].some;\n _lodashChainLodash['default'].contains = _lodashCollection['default'].includes;\n _lodashChainLodash['default'].eq = _lodashLang['default'].isEqual;\n _lodashChainLodash['default'].detect = _lodashCollection['default'].find;\n _lodashChainLodash['default'].foldl = _lodashCollection['default'].reduce;\n _lodashChainLodash['default'].foldr = _lodashCollection['default'].reduceRight;\n _lodashChainLodash['default'].head = _lodashArray['default'].first;\n _lodashChainLodash['default'].include = _lodashCollection['default'].includes;\n _lodashChainLodash['default'].inject = _lodashCollection['default'].reduce;\n\n mixin(_lodashChainLodash['default'], (function () {\n var source = {};\n (0, _lodashInternalBaseForOwn['default'])(_lodashChainLodash['default'], function (func, methodName) {\n if (!_lodashChainLodash['default'].prototype[methodName]) {\n source[methodName] = func;\n }\n });\n return source;\n })(), false);\n\n // Add functions capable of returning wrapped and unwrapped values when chaining.\n _lodashChainLodash['default'].sample = _lodashCollection['default'].sample;\n\n _lodashChainLodash['default'].prototype.sample = function (n) {\n if (!this.__chain__ && n == null) {\n return _lodashCollection['default'].sample(this.value());\n }\n return this.thru(function (value) {\n return _lodashCollection['default'].sample(value, n);\n });\n };\n\n /**\n * The semantic version number.\n *\n * @static\n * @memberOf _\n * @type string\n */\n _lodashChainLodash['default'].VERSION = VERSION;\n\n _lodashChainLodash['default'].support = _lodashSupport['default'];\n (_lodashChainLodash['default'].templateSettings = _lodashString['default'].templateSettings).imports._ = _lodashChainLodash['default'];\n\n // Assign default placeholders.\n (0, _lodashInternalArrayEach['default'])(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function (methodName) {\n _lodashChainLodash['default'][methodName].placeholder = _lodashChainLodash['default'];\n });\n\n // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n (0, _lodashInternalArrayEach['default'])(['drop', 'take'], function (methodName, index) {\n _lodashInternalLazyWrapper['default'].prototype[methodName] = function (n) {\n var filtered = this.__filtered__;\n if (filtered && !index) {\n return new _lodashInternalLazyWrapper['default'](this);\n }\n n = n == null ? 1 : nativeMax(nativeFloor(n) || 0, 0);\n\n var result = this.clone();\n if (filtered) {\n result.__takeCount__ = nativeMin(result.__takeCount__, n);\n } else {\n result.__views__.push({ 'size': n, 'type': methodName + (result.__dir__ < 0 ? 'Right' : '') });\n }\n return result;\n };\n\n _lodashInternalLazyWrapper['default'].prototype[methodName + 'Right'] = function (n) {\n return this.reverse()[methodName](n).reverse();\n };\n });\n\n // Add `LazyWrapper` methods that accept an `iteratee` value.\n (0, _lodashInternalArrayEach['default'])(['filter', 'map', 'takeWhile'], function (methodName, index) {\n var type = index + 1,\n isFilter = type != LAZY_MAP_FLAG;\n\n _lodashInternalLazyWrapper['default'].prototype[methodName] = function (iteratee, thisArg) {\n var result = this.clone();\n result.__iteratees__.push({ 'iteratee': (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 1), 'type': type });\n result.__filtered__ = result.__filtered__ || isFilter;\n return result;\n };\n });\n\n // Add `LazyWrapper` methods for `_.first` and `_.last`.\n (0, _lodashInternalArrayEach['default'])(['first', 'last'], function (methodName, index) {\n var takeName = 'take' + (index ? 'Right' : '');\n\n _lodashInternalLazyWrapper['default'].prototype[methodName] = function () {\n return this[takeName](1).value()[0];\n };\n });\n\n // Add `LazyWrapper` methods for `_.initial` and `_.rest`.\n (0, _lodashInternalArrayEach['default'])(['initial', 'rest'], function (methodName, index) {\n var dropName = 'drop' + (index ? '' : 'Right');\n\n _lodashInternalLazyWrapper['default'].prototype[methodName] = function () {\n return this.__filtered__ ? new _lodashInternalLazyWrapper['default'](this) : this[dropName](1);\n };\n });\n\n // Add `LazyWrapper` methods for `_.pluck` and `_.where`.\n (0, _lodashInternalArrayEach['default'])(['pluck', 'where'], function (methodName, index) {\n var operationName = index ? 'filter' : 'map',\n createCallback = index ? _lodashInternalBaseMatches['default'] : _lodashUtilityProperty['default'];\n\n _lodashInternalLazyWrapper['default'].prototype[methodName] = function (value) {\n return this[operationName](createCallback(value));\n };\n });\n\n _lodashInternalLazyWrapper['default'].prototype.compact = function () {\n return this.filter(_lodashUtilityIdentity['default']);\n };\n\n _lodashInternalLazyWrapper['default'].prototype.reject = function (predicate, thisArg) {\n predicate = (0, _lodashInternalBaseCallback['default'])(predicate, thisArg, 1);\n return this.filter(function (value) {\n return !predicate(value);\n });\n };\n\n _lodashInternalLazyWrapper['default'].prototype.slice = function (start, end) {\n start = start == null ? 0 : +start || 0;\n\n var result = this;\n if (result.__filtered__ && (start > 0 || end < 0)) {\n return new _lodashInternalLazyWrapper['default'](result);\n }\n if (start < 0) {\n result = result.takeRight(-start);\n } else if (start) {\n result = result.drop(start);\n }\n if (end !== undefined) {\n end = +end || 0;\n result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n }\n return result;\n };\n\n _lodashInternalLazyWrapper['default'].prototype.takeRightWhile = function (predicate, thisArg) {\n return this.reverse().takeWhile(predicate, thisArg).reverse();\n };\n\n _lodashInternalLazyWrapper['default'].prototype.toArray = function () {\n return this.take(POSITIVE_INFINITY);\n };\n\n // Add `LazyWrapper` methods to `lodash.prototype`.\n (0, _lodashInternalBaseForOwn['default'])(_lodashInternalLazyWrapper['default'].prototype, function (func, methodName) {\n var checkIteratee = /^(?:filter|map|reject)|While$/.test(methodName),\n retUnwrapped = /^(?:first|last)$/.test(methodName),\n lodashFunc = _lodashChainLodash['default'][retUnwrapped ? 'take' + (methodName == 'last' ? 'Right' : '') : methodName];\n\n if (!lodashFunc) {\n return;\n }\n _lodashChainLodash['default'].prototype[methodName] = function () {\n var args = retUnwrapped ? [1] : arguments,\n chainAll = this.__chain__,\n value = this.__wrapped__,\n isHybrid = !!this.__actions__.length,\n isLazy = value instanceof _lodashInternalLazyWrapper['default'],\n iteratee = args[0],\n useLazy = isLazy || (0, _lodashLangIsArray['default'])(value);\n\n if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n isLazy = useLazy = false;\n }\n var interceptor = function interceptor(value) {\n return retUnwrapped && chainAll ? lodashFunc(value, 1)[0] : lodashFunc.apply(undefined, (0, _lodashInternalArrayPush['default'])([value], args));\n };\n\n var action = { 'func': _lodashChainThru['default'], 'args': [interceptor], 'thisArg': undefined },\n onlyLazy = isLazy && !isHybrid;\n\n if (retUnwrapped && !chainAll) {\n if (onlyLazy) {\n value = value.clone();\n value.__actions__.push(action);\n return func.call(value);\n }\n return lodashFunc.call(undefined, this.value())[0];\n }\n if (!retUnwrapped && useLazy) {\n value = onlyLazy ? value : new _lodashInternalLazyWrapper['default'](this);\n var result = func.apply(value, args);\n result.__actions__.push(action);\n return new _lodashInternalLodashWrapper['default'](result, chainAll);\n }\n return this.thru(interceptor);\n };\n });\n\n // Add `Array` and `String` methods to `lodash.prototype`.\n (0, _lodashInternalArrayEach['default'])(['join', 'pop', 'push', 'replace', 'shift', 'sort', 'splice', 'split', 'unshift'], function (methodName) {\n var func = (/^(?:replace|split)$/.test(methodName) ? stringProto : arrayProto)[methodName],\n chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n retUnwrapped = /^(?:join|pop|replace|shift)$/.test(methodName);\n\n _lodashChainLodash['default'].prototype[methodName] = function () {\n var args = arguments;\n if (retUnwrapped && !this.__chain__) {\n return func.apply(this.value(), args);\n }\n return this[chainName](function (value) {\n return func.apply(value, args);\n });\n };\n });\n\n // Map minified function names to their real names.\n (0, _lodashInternalBaseForOwn['default'])(_lodashInternalLazyWrapper['default'].prototype, function (func, methodName) {\n var lodashFunc = _lodashChainLodash['default'][methodName];\n if (lodashFunc) {\n var key = lodashFunc.name + '',\n names = _lodashInternalRealNames['default'][key] || (_lodashInternalRealNames['default'][key] = []);\n\n names.push({ 'name': methodName, 'func': lodashFunc });\n }\n });\n\n _lodashInternalRealNames['default'][(0, _lodashInternalCreateHybridWrapper['default'])(undefined, BIND_KEY_FLAG).name] = [{ 'name': 'wrapper', 'func': undefined }];\n\n // Add functions to the lazy wrapper.\n _lodashInternalLazyWrapper['default'].prototype.clone = _lodashInternalLazyClone['default'];\n _lodashInternalLazyWrapper['default'].prototype.reverse = _lodashInternalLazyReverse['default'];\n _lodashInternalLazyWrapper['default'].prototype.value = _lodashInternalLazyValue['default'];\n\n // Add chaining functions to the `lodash` wrapper.\n _lodashChainLodash['default'].prototype.chain = _lodashChain['default'].wrapperChain;\n _lodashChainLodash['default'].prototype.commit = _lodashChain['default'].commit;\n _lodashChainLodash['default'].prototype.concat = _lodashChain['default'].concat;\n _lodashChainLodash['default'].prototype.plant = _lodashChain['default'].plant;\n _lodashChainLodash['default'].prototype.reverse = _lodashChain['default'].reverse;\n _lodashChainLodash['default'].prototype.toString = _lodashChain['default'].toString;\n _lodashChainLodash['default'].prototype.run = _lodashChainLodash['default'].prototype.toJSON = _lodashChainLodash['default'].prototype.valueOf = _lodashChainLodash['default'].prototype.value = _lodashChain['default'].value;\n\n // Add function aliases to the `lodash` wrapper.\n _lodashChainLodash['default'].prototype.collect = _lodashChainLodash['default'].prototype.map;\n _lodashChainLodash['default'].prototype.head = _lodashChainLodash['default'].prototype.first;\n _lodashChainLodash['default'].prototype.select = _lodashChainLodash['default'].prototype.filter;\n _lodashChainLodash['default'].prototype.tail = _lodashChainLodash['default'].prototype.rest;\n\n exports['default'] = _lodashChainLodash['default'];\n});","define('lodash/math', ['exports', 'lodash/math/add', 'lodash/math/ceil', 'lodash/math/floor', 'lodash/math/max', 'lodash/math/min', 'lodash/math/round', 'lodash/math/sum'], function (exports, _lodashMathAdd, _lodashMathCeil, _lodashMathFloor, _lodashMathMax, _lodashMathMin, _lodashMathRound, _lodashMathSum) {\n 'use strict';\n\n exports['default'] = {\n 'add': _lodashMathAdd['default'],\n 'ceil': _lodashMathCeil['default'],\n 'floor': _lodashMathFloor['default'],\n 'max': _lodashMathMax['default'],\n 'min': _lodashMathMin['default'],\n 'round': _lodashMathRound['default'],\n 'sum': _lodashMathSum['default']\n };\n});","define(\"lodash/math/add\", [\"exports\"], function (exports) {\n /**\n * Adds two numbers.\n *\n * @static\n * @memberOf _\n * @category Math\n * @param {number} augend The first number to add.\n * @param {number} addend The second number to add.\n * @returns {number} Returns the sum.\n * @example\n *\n * _.add(6, 4);\n * // => 10\n */\n \"use strict\";\n\n function add(augend, addend) {\n return (+augend || 0) + (+addend || 0);\n }\n\n exports[\"default\"] = add;\n});","define('lodash/math/ceil', ['exports', 'lodash/internal/createRound'], function (exports, _lodashInternalCreateRound) {\n 'use strict';\n\n /**\n * Calculates `n` rounded up to `precision`.\n *\n * @static\n * @memberOf _\n * @category Math\n * @param {number} n The number to round up.\n * @param {number} [precision=0] The precision to round up to.\n * @returns {number} Returns the rounded up number.\n * @example\n *\n * _.ceil(4.006);\n * // => 5\n *\n * _.ceil(6.004, 2);\n * // => 6.01\n *\n * _.ceil(6040, -2);\n * // => 6100\n */\n var ceil = (0, _lodashInternalCreateRound['default'])('ceil');\n\n exports['default'] = ceil;\n});","define('lodash/math/floor', ['exports', 'lodash/internal/createRound'], function (exports, _lodashInternalCreateRound) {\n 'use strict';\n\n /**\n * Calculates `n` rounded down to `precision`.\n *\n * @static\n * @memberOf _\n * @category Math\n * @param {number} n The number to round down.\n * @param {number} [precision=0] The precision to round down to.\n * @returns {number} Returns the rounded down number.\n * @example\n *\n * _.floor(4.006);\n * // => 4\n *\n * _.floor(0.046, 2);\n * // => 0.04\n *\n * _.floor(4060, -2);\n * // => 4000\n */\n var floor = (0, _lodashInternalCreateRound['default'])('floor');\n\n exports['default'] = floor;\n});","define('lodash/math/max', ['exports', 'lodash/internal/createExtremum', 'lodash/lang/gt'], function (exports, _lodashInternalCreateExtremum, _lodashLangGt) {\n 'use strict';\n\n /** Used as references for `-Infinity` and `Infinity`. */\n var NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY;\n\n /**\n * Gets the maximum value of `collection`. If `collection` is empty or falsey\n * `-Infinity` is returned. If an iteratee function is provided it's invoked\n * for each value in `collection` to generate the criterion by which the value\n * is ranked. The `iteratee` is bound to `thisArg` and invoked with three\n * arguments: (value, index, collection).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Math\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * _.max([4, 2, 8, 6]);\n * // => 8\n *\n * _.max([]);\n * // => -Infinity\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 }\n * ];\n *\n * _.max(users, function(chr) {\n * return chr.age;\n * });\n * // => { 'user': 'fred', 'age': 40 }\n *\n * // using the `_.property` callback shorthand\n * _.max(users, 'age');\n * // => { 'user': 'fred', 'age': 40 }\n */\n var max = (0, _lodashInternalCreateExtremum['default'])(_lodashLangGt['default'], NEGATIVE_INFINITY);\n\n exports['default'] = max;\n});","define('lodash/math/min', ['exports', 'lodash/internal/createExtremum', 'lodash/lang/lt'], function (exports, _lodashInternalCreateExtremum, _lodashLangLt) {\n 'use strict';\n\n /** Used as references for `-Infinity` and `Infinity`. */\n var POSITIVE_INFINITY = Number.POSITIVE_INFINITY;\n\n /**\n * Gets the minimum value of `collection`. If `collection` is empty or falsey\n * `Infinity` is returned. If an iteratee function is provided it's invoked\n * for each value in `collection` to generate the criterion by which the value\n * is ranked. The `iteratee` is bound to `thisArg` and invoked with three\n * arguments: (value, index, collection).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Math\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => Infinity\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 }\n * ];\n *\n * _.min(users, function(chr) {\n * return chr.age;\n * });\n * // => { 'user': 'barney', 'age': 36 }\n *\n * // using the `_.property` callback shorthand\n * _.min(users, 'age');\n * // => { 'user': 'barney', 'age': 36 }\n */\n var min = (0, _lodashInternalCreateExtremum['default'])(_lodashLangLt['default'], POSITIVE_INFINITY);\n\n exports['default'] = min;\n});","define('lodash/math/round', ['exports', 'lodash/internal/createRound'], function (exports, _lodashInternalCreateRound) {\n 'use strict';\n\n /**\n * Calculates `n` rounded to `precision`.\n *\n * @static\n * @memberOf _\n * @category Math\n * @param {number} n The number to round.\n * @param {number} [precision=0] The precision to round to.\n * @returns {number} Returns the rounded number.\n * @example\n *\n * _.round(4.006);\n * // => 4\n *\n * _.round(4.006, 2);\n * // => 4.01\n *\n * _.round(4060, -2);\n * // => 4100\n */\n var round = (0, _lodashInternalCreateRound['default'])('round');\n\n exports['default'] = round;\n});","define('lodash/math/sum', ['exports', 'lodash/internal/arraySum', 'lodash/internal/baseCallback', 'lodash/internal/baseSum', 'lodash/lang/isArray', 'lodash/internal/isIterateeCall', 'lodash/internal/toIterable'], function (exports, _lodashInternalArraySum, _lodashInternalBaseCallback, _lodashInternalBaseSum, _lodashLangIsArray, _lodashInternalIsIterateeCall, _lodashInternalToIterable) {\n 'use strict';\n\n /**\n * Gets the sum of the values in `collection`.\n *\n * @static\n * @memberOf _\n * @category Math\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {number} Returns the sum.\n * @example\n *\n * _.sum([4, 6]);\n * // => 10\n *\n * _.sum({ 'a': 4, 'b': 6 });\n * // => 10\n *\n * var objects = [\n * { 'n': 4 },\n * { 'n': 6 }\n * ];\n *\n * _.sum(objects, function(object) {\n * return object.n;\n * });\n * // => 10\n *\n * // using the `_.property` callback shorthand\n * _.sum(objects, 'n');\n * // => 10\n */\n function sum(collection, iteratee, thisArg) {\n if (thisArg && (0, _lodashInternalIsIterateeCall['default'])(collection, iteratee, thisArg)) {\n iteratee = undefined;\n }\n iteratee = (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 3);\n return iteratee.length == 1 ? (0, _lodashInternalArraySum['default'])((0, _lodashLangIsArray['default'])(collection) ? collection : (0, _lodashInternalToIterable['default'])(collection), iteratee) : (0, _lodashInternalBaseSum['default'])(collection, iteratee);\n }\n\n exports['default'] = sum;\n});","define('lodash/number', ['exports', 'lodash/number/inRange', 'lodash/number/random'], function (exports, _lodashNumberInRange, _lodashNumberRandom) {\n 'use strict';\n\n exports['default'] = {\n 'inRange': _lodashNumberInRange['default'],\n 'random': _lodashNumberRandom['default']\n };\n});","define(\"lodash/number/inRange\", [\"exports\"], function (exports) {\n /* Native method references for those with the same name as other `lodash` methods. */\n \"use strict\";\n\n var nativeMax = Math.max,\n nativeMin = Math.min;\n\n /**\n * Checks if `n` is between `start` and up to but not including, `end`. If\n * `end` is not specified it's set to `start` with `start` then set to `0`.\n *\n * @static\n * @memberOf _\n * @category Number\n * @param {number} n The number to check.\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `n` is in the range, else `false`.\n * @example\n *\n * _.inRange(3, 2, 4);\n * // => true\n *\n * _.inRange(4, 8);\n * // => true\n *\n * _.inRange(4, 2);\n * // => false\n *\n * _.inRange(2, 2);\n * // => false\n *\n * _.inRange(1.2, 2);\n * // => true\n *\n * _.inRange(5.2, 4);\n * // => false\n */\n function inRange(value, start, end) {\n start = +start || 0;\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = +end || 0;\n }\n return value >= nativeMin(start, end) && value < nativeMax(start, end);\n }\n\n exports[\"default\"] = inRange;\n});","define('lodash/number/random', ['exports', 'lodash/internal/baseRandom', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseRandom, _lodashInternalIsIterateeCall) {\n 'use strict';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeMin = Math.min,\n nativeRandom = Math.random;\n\n /**\n * Produces a random number between `min` and `max` (inclusive). If only one\n * argument is provided a number between `0` and the given number is returned.\n * If `floating` is `true`, or either `min` or `max` are floats, a floating-point\n * number is returned instead of an integer.\n *\n * @static\n * @memberOf _\n * @category Number\n * @param {number} [min=0] The minimum possible value.\n * @param {number} [max=1] The maximum possible value.\n * @param {boolean} [floating] Specify returning a floating-point number.\n * @returns {number} Returns the random number.\n * @example\n *\n * _.random(0, 5);\n * // => an integer between 0 and 5\n *\n * _.random(5);\n * // => also an integer between 0 and 5\n *\n * _.random(5, true);\n * // => a floating-point number between 0 and 5\n *\n * _.random(1.2, 5.2);\n * // => a floating-point number between 1.2 and 5.2\n */\n function random(min, max, floating) {\n if (floating && (0, _lodashInternalIsIterateeCall['default'])(min, max, floating)) {\n max = floating = undefined;\n }\n var noMin = min == null,\n noMax = max == null;\n\n if (floating == null) {\n if (noMax && typeof min == 'boolean') {\n floating = min;\n min = 1;\n } else if (typeof max == 'boolean') {\n floating = max;\n noMax = true;\n }\n }\n if (noMin && noMax) {\n max = 1;\n noMax = false;\n }\n min = +min || 0;\n if (noMax) {\n max = min;\n min = 0;\n } else {\n max = +max || 0;\n }\n if (floating || min % 1 || max % 1) {\n var rand = nativeRandom();\n return nativeMin(min + rand * (max - min + parseFloat('1e-' + ((rand + '').length - 1))), max);\n }\n return (0, _lodashInternalBaseRandom['default'])(min, max);\n }\n\n exports['default'] = random;\n});","define('lodash/object', ['exports', 'lodash/object/assign', 'lodash/object/create', 'lodash/object/defaults', 'lodash/object/defaultsDeep', 'lodash/object/extend', 'lodash/object/findKey', 'lodash/object/findLastKey', 'lodash/object/forIn', 'lodash/object/forInRight', 'lodash/object/forOwn', 'lodash/object/forOwnRight', 'lodash/object/functions', 'lodash/object/get', 'lodash/object/has', 'lodash/object/invert', 'lodash/object/keys', 'lodash/object/keysIn', 'lodash/object/mapKeys', 'lodash/object/mapValues', 'lodash/object/merge', 'lodash/object/methods', 'lodash/object/omit', 'lodash/object/pairs', 'lodash/object/pick', 'lodash/object/result', 'lodash/object/set', 'lodash/object/transform', 'lodash/object/values', 'lodash/object/valuesIn'], function (exports, _lodashObjectAssign, _lodashObjectCreate, _lodashObjectDefaults, _lodashObjectDefaultsDeep, _lodashObjectExtend, _lodashObjectFindKey, _lodashObjectFindLastKey, _lodashObjectForIn, _lodashObjectForInRight, _lodashObjectForOwn, _lodashObjectForOwnRight, _lodashObjectFunctions, _lodashObjectGet, _lodashObjectHas, _lodashObjectInvert, _lodashObjectKeys, _lodashObjectKeysIn, _lodashObjectMapKeys, _lodashObjectMapValues, _lodashObjectMerge, _lodashObjectMethods, _lodashObjectOmit, _lodashObjectPairs, _lodashObjectPick, _lodashObjectResult, _lodashObjectSet, _lodashObjectTransform, _lodashObjectValues, _lodashObjectValuesIn) {\n 'use strict';\n\n exports['default'] = {\n 'assign': _lodashObjectAssign['default'],\n 'create': _lodashObjectCreate['default'],\n 'defaults': _lodashObjectDefaults['default'],\n 'defaultsDeep': _lodashObjectDefaultsDeep['default'],\n 'extend': _lodashObjectExtend['default'],\n 'findKey': _lodashObjectFindKey['default'],\n 'findLastKey': _lodashObjectFindLastKey['default'],\n 'forIn': _lodashObjectForIn['default'],\n 'forInRight': _lodashObjectForInRight['default'],\n 'forOwn': _lodashObjectForOwn['default'],\n 'forOwnRight': _lodashObjectForOwnRight['default'],\n 'functions': _lodashObjectFunctions['default'],\n 'get': _lodashObjectGet['default'],\n 'has': _lodashObjectHas['default'],\n 'invert': _lodashObjectInvert['default'],\n 'keys': _lodashObjectKeys['default'],\n 'keysIn': _lodashObjectKeysIn['default'],\n 'mapKeys': _lodashObjectMapKeys['default'],\n 'mapValues': _lodashObjectMapValues['default'],\n 'merge': _lodashObjectMerge['default'],\n 'methods': _lodashObjectMethods['default'],\n 'omit': _lodashObjectOmit['default'],\n 'pairs': _lodashObjectPairs['default'],\n 'pick': _lodashObjectPick['default'],\n 'result': _lodashObjectResult['default'],\n 'set': _lodashObjectSet['default'],\n 'transform': _lodashObjectTransform['default'],\n 'values': _lodashObjectValues['default'],\n 'valuesIn': _lodashObjectValuesIn['default']\n };\n});","define('lodash/object/assign', ['exports', 'lodash/internal/assignWith', 'lodash/internal/baseAssign', 'lodash/internal/createAssigner'], function (exports, _lodashInternalAssignWith, _lodashInternalBaseAssign, _lodashInternalCreateAssigner) {\n 'use strict';\n\n /**\n * Assigns own enumerable properties of source object(s) to the destination\n * object. Subsequent sources overwrite property assignments of previous sources.\n * If `customizer` is provided it's invoked to produce the assigned values.\n * The `customizer` is bound to `thisArg` and invoked with five arguments:\n * (objectValue, sourceValue, key, object, source).\n *\n * **Note:** This method mutates `object` and is based on\n * [`Object.assign`](http://ecma-international.org/ecma-262/6.0/#sec-object.assign).\n *\n * @static\n * @memberOf _\n * @alias extend\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' });\n * // => { 'user': 'fred', 'age': 40 }\n *\n * // using a customizer callback\n * var defaults = _.partialRight(_.assign, function(value, other) {\n * return _.isUndefined(value) ? other : value;\n * });\n *\n * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });\n * // => { 'user': 'barney', 'age': 36 }\n */\n var assign = (0, _lodashInternalCreateAssigner['default'])(function (object, source, customizer) {\n return customizer ? (0, _lodashInternalAssignWith['default'])(object, source, customizer) : (0, _lodashInternalBaseAssign['default'])(object, source);\n });\n\n exports['default'] = assign;\n});","define('lodash/object/create', ['exports', 'lodash/internal/baseAssign', 'lodash/internal/baseCreate', 'lodash/internal/isIterateeCall'], function (exports, _lodashInternalBaseAssign, _lodashInternalBaseCreate, _lodashInternalIsIterateeCall) {\n 'use strict';\n\n /**\n * Creates an object that inherits from the given `prototype` object. If a\n * `properties` object is provided its own enumerable properties are assigned\n * to the created object.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} prototype The object to inherit from.\n * @param {Object} [properties] The properties to assign to the object.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Object} Returns the new object.\n * @example\n *\n * function Shape() {\n * this.x = 0;\n * this.y = 0;\n * }\n *\n * function Circle() {\n * Shape.call(this);\n * }\n *\n * Circle.prototype = _.create(Shape.prototype, {\n * 'constructor': Circle\n * });\n *\n * var circle = new Circle;\n * circle instanceof Circle;\n * // => true\n *\n * circle instanceof Shape;\n * // => true\n */\n function create(prototype, properties, guard) {\n var result = (0, _lodashInternalBaseCreate['default'])(prototype);\n if (guard && (0, _lodashInternalIsIterateeCall['default'])(prototype, properties, guard)) {\n properties = undefined;\n }\n return properties ? (0, _lodashInternalBaseAssign['default'])(result, properties) : result;\n }\n\n exports['default'] = create;\n});","define('lodash/object/defaults', ['exports', 'lodash/object/assign', 'lodash/internal/assignDefaults', 'lodash/internal/createDefaults'], function (exports, _lodashObjectAssign, _lodashInternalAssignDefaults, _lodashInternalCreateDefaults) {\n 'use strict';\n\n /**\n * Assigns own enumerable properties of source object(s) to the destination\n * object for all destination properties that resolve to `undefined`. Once a\n * property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });\n * // => { 'user': 'barney', 'age': 36 }\n */\n var defaults = (0, _lodashInternalCreateDefaults['default'])(_lodashObjectAssign['default'], _lodashInternalAssignDefaults['default']);\n\n exports['default'] = defaults;\n});","define('lodash/object/defaultsDeep', ['exports', 'lodash/internal/createDefaults', 'lodash/object/merge', 'lodash/internal/mergeDefaults'], function (exports, _lodashInternalCreateDefaults, _lodashObjectMerge, _lodashInternalMergeDefaults) {\n 'use strict';\n\n /**\n * This method is like `_.defaults` except that it recursively assigns\n * default properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * _.defaultsDeep({ 'user': { 'name': 'barney' } }, { 'user': { 'name': 'fred', 'age': 36 } });\n * // => { 'user': { 'name': 'barney', 'age': 36 } }\n *\n */\n var defaultsDeep = (0, _lodashInternalCreateDefaults['default'])(_lodashObjectMerge['default'], _lodashInternalMergeDefaults['default']);\n\n exports['default'] = defaultsDeep;\n});","define('lodash/object/extend', ['exports', 'lodash/object/assign'], function (exports, _lodashObjectAssign) {\n 'use strict';\n\n exports['default'] = _lodashObjectAssign['default'];\n});","define('lodash/object/findKey', ['exports', 'lodash/internal/baseForOwn', 'lodash/internal/createFindKey'], function (exports, _lodashInternalBaseForOwn, _lodashInternalCreateFindKey) {\n 'use strict';\n\n /**\n * This method is like `_.find` except that it returns the key of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to search.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {string|undefined} Returns the key of the matched element, else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findKey(users, function(chr) {\n * return chr.age < 40;\n * });\n * // => 'barney' (iteration order is not guaranteed)\n *\n * // using the `_.matches` callback shorthand\n * _.findKey(users, { 'age': 1, 'active': true });\n * // => 'pebbles'\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.findKey(users, 'active', false);\n * // => 'fred'\n *\n * // using the `_.property` callback shorthand\n * _.findKey(users, 'active');\n * // => 'barney'\n */\n var findKey = (0, _lodashInternalCreateFindKey['default'])(_lodashInternalBaseForOwn['default']);\n\n exports['default'] = findKey;\n});","define('lodash/object/findLastKey', ['exports', 'lodash/internal/baseForOwnRight', 'lodash/internal/createFindKey'], function (exports, _lodashInternalBaseForOwnRight, _lodashInternalCreateFindKey) {\n 'use strict';\n\n /**\n * This method is like `_.findKey` except that it iterates over elements of\n * a collection in the opposite order.\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to search.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {string|undefined} Returns the key of the matched element, else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findLastKey(users, function(chr) {\n * return chr.age < 40;\n * });\n * // => returns `pebbles` assuming `_.findKey` returns `barney`\n *\n * // using the `_.matches` callback shorthand\n * _.findLastKey(users, { 'age': 36, 'active': true });\n * // => 'barney'\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.findLastKey(users, 'active', false);\n * // => 'fred'\n *\n * // using the `_.property` callback shorthand\n * _.findLastKey(users, 'active');\n * // => 'pebbles'\n */\n var findLastKey = (0, _lodashInternalCreateFindKey['default'])(_lodashInternalBaseForOwnRight['default']);\n\n exports['default'] = findLastKey;\n});","define('lodash/object/forIn', ['exports', 'lodash/internal/baseFor', 'lodash/internal/createForIn'], function (exports, _lodashInternalBaseFor, _lodashInternalCreateForIn) {\n 'use strict';\n\n /**\n * Iterates over own and inherited enumerable properties of an object invoking\n * `iteratee` for each property. The `iteratee` is bound to `thisArg` and invoked\n * with three arguments: (value, key, object). Iteratee functions may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forIn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => logs 'a', 'b', and 'c' (iteration order is not guaranteed)\n */\n var forIn = (0, _lodashInternalCreateForIn['default'])(_lodashInternalBaseFor['default']);\n\n exports['default'] = forIn;\n});","define('lodash/object/forInRight', ['exports', 'lodash/internal/baseForRight', 'lodash/internal/createForIn'], function (exports, _lodashInternalBaseForRight, _lodashInternalCreateForIn) {\n 'use strict';\n\n /**\n * This method is like `_.forIn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forInRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => logs 'c', 'b', and 'a' assuming `_.forIn ` logs 'a', 'b', and 'c'\n */\n var forInRight = (0, _lodashInternalCreateForIn['default'])(_lodashInternalBaseForRight['default']);\n\n exports['default'] = forInRight;\n});","define('lodash/object/forOwn', ['exports', 'lodash/internal/baseForOwn', 'lodash/internal/createForOwn'], function (exports, _lodashInternalBaseForOwn, _lodashInternalCreateForOwn) {\n 'use strict';\n\n /**\n * Iterates over own enumerable properties of an object invoking `iteratee`\n * for each property. The `iteratee` is bound to `thisArg` and invoked with\n * three arguments: (value, key, object). Iteratee functions may exit iteration\n * early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => logs 'a' and 'b' (iteration order is not guaranteed)\n */\n var forOwn = (0, _lodashInternalCreateForOwn['default'])(_lodashInternalBaseForOwn['default']);\n\n exports['default'] = forOwn;\n});","define('lodash/object/forOwnRight', ['exports', 'lodash/internal/baseForOwnRight', 'lodash/internal/createForOwn'], function (exports, _lodashInternalBaseForOwnRight, _lodashInternalCreateForOwn) {\n 'use strict';\n\n /**\n * This method is like `_.forOwn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwnRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => logs 'b' and 'a' assuming `_.forOwn` logs 'a' and 'b'\n */\n var forOwnRight = (0, _lodashInternalCreateForOwn['default'])(_lodashInternalBaseForOwnRight['default']);\n\n exports['default'] = forOwnRight;\n});","define('lodash/object/functions', ['exports', 'lodash/internal/baseFunctions', 'lodash/object/keysIn'], function (exports, _lodashInternalBaseFunctions, _lodashObjectKeysIn) {\n 'use strict';\n\n /**\n * Creates an array of function property names from all enumerable properties,\n * own and inherited, of `object`.\n *\n * @static\n * @memberOf _\n * @alias methods\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the new array of property names.\n * @example\n *\n * _.functions(_);\n * // => ['after', 'ary', 'assign', ...]\n */\n function functions(object) {\n return (0, _lodashInternalBaseFunctions['default'])(object, (0, _lodashObjectKeysIn['default'])(object));\n }\n\n exports['default'] = functions;\n});","define('lodash/object/get', ['exports', 'lodash/internal/baseGet', 'lodash/internal/toPath'], function (exports, _lodashInternalBaseGet, _lodashInternalToPath) {\n 'use strict';\n\n /**\n * Gets the property value at `path` of `object`. If the resolved value is\n * `undefined` the `defaultValue` is used in its place.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\n function get(object, path, defaultValue) {\n var result = object == null ? undefined : (0, _lodashInternalBaseGet['default'])(object, (0, _lodashInternalToPath['default'])(path), path + '');\n return result === undefined ? defaultValue : result;\n }\n\n exports['default'] = get;\n});","define('lodash/object/has', ['exports', 'lodash/internal/baseGet', 'lodash/internal/baseSlice', 'lodash/lang/isArguments', 'lodash/lang/isArray', 'lodash/internal/isIndex', 'lodash/internal/isKey', 'lodash/internal/isLength', 'lodash/array/last', 'lodash/internal/toPath'], function (exports, _lodashInternalBaseGet, _lodashInternalBaseSlice, _lodashLangIsArguments, _lodashLangIsArray, _lodashInternalIsIndex, _lodashInternalIsKey, _lodashInternalIsLength, _lodashArrayLast, _lodashInternalToPath) {\n 'use strict';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /**\n * Checks if `path` is a direct property.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` is a direct property, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': { 'c': 3 } } };\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b.c');\n * // => true\n *\n * _.has(object, ['a', 'b', 'c']);\n * // => true\n */\n function has(object, path) {\n if (object == null) {\n return false;\n }\n var result = hasOwnProperty.call(object, path);\n if (!result && !(0, _lodashInternalIsKey['default'])(path)) {\n path = (0, _lodashInternalToPath['default'])(path);\n object = path.length == 1 ? object : (0, _lodashInternalBaseGet['default'])(object, (0, _lodashInternalBaseSlice['default'])(path, 0, -1));\n if (object == null) {\n return false;\n }\n path = (0, _lodashArrayLast['default'])(path);\n result = hasOwnProperty.call(object, path);\n }\n return result || (0, _lodashInternalIsLength['default'])(object.length) && (0, _lodashInternalIsIndex['default'])(path, object.length) && ((0, _lodashLangIsArray['default'])(object) || (0, _lodashLangIsArguments['default'])(object));\n }\n\n exports['default'] = has;\n});","define('lodash/object/invert', ['exports', 'lodash/internal/isIterateeCall', 'lodash/object/keys'], function (exports, _lodashInternalIsIterateeCall, _lodashObjectKeys) {\n 'use strict';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /**\n * Creates an object composed of the inverted keys and values of `object`.\n * If `object` contains duplicate values, subsequent values overwrite property\n * assignments of previous values unless `multiValue` is `true`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to invert.\n * @param {boolean} [multiValue] Allow multiple values per key.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invert(object);\n * // => { '1': 'c', '2': 'b' }\n *\n * // with `multiValue`\n * _.invert(object, true);\n * // => { '1': ['a', 'c'], '2': ['b'] }\n */\n function invert(object, multiValue, guard) {\n if (guard && (0, _lodashInternalIsIterateeCall['default'])(object, multiValue, guard)) {\n multiValue = undefined;\n }\n var index = -1,\n props = (0, _lodashObjectKeys['default'])(object),\n length = props.length,\n result = {};\n\n while (++index < length) {\n var key = props[index],\n value = object[key];\n\n if (multiValue) {\n if (hasOwnProperty.call(result, value)) {\n result[value].push(key);\n } else {\n result[value] = [key];\n }\n } else {\n result[value] = key;\n }\n }\n return result;\n }\n\n exports['default'] = invert;\n});","define('lodash/object/keys', ['exports', 'lodash/internal/getNative', 'lodash/internal/isArrayLike', 'lodash/lang/isObject', 'lodash/internal/shimKeys'], function (exports, _lodashInternalGetNative, _lodashInternalIsArrayLike, _lodashLangIsObject, _lodashInternalShimKeys) {\n 'use strict';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeKeys = (0, _lodashInternalGetNative['default'])(Object, 'keys');\n\n /**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\n var keys = !nativeKeys ? _lodashInternalShimKeys['default'] : function (object) {\n var Ctor = object == null ? undefined : object.constructor;\n if (typeof Ctor == 'function' && Ctor.prototype === object || typeof object != 'function' && (0, _lodashInternalIsArrayLike['default'])(object)) {\n return (0, _lodashInternalShimKeys['default'])(object);\n }\n return (0, _lodashLangIsObject['default'])(object) ? nativeKeys(object) : [];\n };\n\n exports['default'] = keys;\n});","define('lodash/object/keysIn', ['exports', 'lodash/lang/isArguments', 'lodash/lang/isArray', 'lodash/internal/isIndex', 'lodash/internal/isLength', 'lodash/lang/isObject'], function (exports, _lodashLangIsArguments, _lodashLangIsArray, _lodashInternalIsIndex, _lodashInternalIsLength, _lodashLangIsObject) {\n 'use strict';\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\n function keysIn(object) {\n if (object == null) {\n return [];\n }\n if (!(0, _lodashLangIsObject['default'])(object)) {\n object = Object(object);\n }\n var length = object.length;\n length = length && (0, _lodashInternalIsLength['default'])(length) && ((0, _lodashLangIsArray['default'])(object) || (0, _lodashLangIsArguments['default'])(object)) && length || 0;\n\n var Ctor = object.constructor,\n index = -1,\n isProto = typeof Ctor == 'function' && Ctor.prototype === object,\n result = Array(length),\n skipIndexes = length > 0;\n\n while (++index < length) {\n result[index] = index + '';\n }\n for (var key in object) {\n if (!(skipIndexes && (0, _lodashInternalIsIndex['default'])(key, length)) && !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n }\n\n exports['default'] = keysIn;\n});","define('lodash/object/mapKeys', ['exports', 'lodash/internal/createObjectMapper'], function (exports, _lodashInternalCreateObjectMapper) {\n 'use strict';\n\n /**\n * The opposite of `_.mapValues`; this method creates an object with the\n * same values as `object` and keys generated by running each own enumerable\n * property of `object` through `iteratee`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Object} Returns the new mapped object.\n * @example\n *\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n * return key + value;\n * });\n * // => { 'a1': 1, 'b2': 2 }\n */\n var mapKeys = (0, _lodashInternalCreateObjectMapper['default'])(true);\n\n exports['default'] = mapKeys;\n});","define('lodash/object/mapValues', ['exports', 'lodash/internal/createObjectMapper'], function (exports, _lodashInternalCreateObjectMapper) {\n 'use strict';\n\n /**\n * Creates an object with the same keys as `object` and values generated by\n * running each own enumerable property of `object` through `iteratee`. The\n * iteratee function is bound to `thisArg` and invoked with three arguments:\n * (value, key, object).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Object} Returns the new mapped object.\n * @example\n *\n * _.mapValues({ 'a': 1, 'b': 2 }, function(n) {\n * return n * 3;\n * });\n * // => { 'a': 3, 'b': 6 }\n *\n * var users = {\n * 'fred': { 'user': 'fred', 'age': 40 },\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * // using the `_.property` callback shorthand\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\n var mapValues = (0, _lodashInternalCreateObjectMapper['default'])();\n\n exports['default'] = mapValues;\n});","define('lodash/object/merge', ['exports', 'lodash/internal/baseMerge', 'lodash/internal/createAssigner'], function (exports, _lodashInternalBaseMerge, _lodashInternalCreateAssigner) {\n 'use strict';\n\n /**\n * Recursively merges own enumerable properties of the source object(s), that\n * don't resolve to `undefined` into the destination object. Subsequent sources\n * overwrite property assignments of previous sources. If `customizer` is\n * provided it's invoked to produce the merged values of the destination and\n * source properties. If `customizer` returns `undefined` merging is handled\n * by the method instead. The `customizer` is bound to `thisArg` and invoked\n * with five arguments: (objectValue, sourceValue, key, object, source).\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var users = {\n * 'data': [{ 'user': 'barney' }, { 'user': 'fred' }]\n * };\n *\n * var ages = {\n * 'data': [{ 'age': 36 }, { 'age': 40 }]\n * };\n *\n * _.merge(users, ages);\n * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }\n *\n * // using a customizer callback\n * var object = {\n * 'fruits': ['apple'],\n * 'vegetables': ['beet']\n * };\n *\n * var other = {\n * 'fruits': ['banana'],\n * 'vegetables': ['carrot']\n * };\n *\n * _.merge(object, other, function(a, b) {\n * if (_.isArray(a)) {\n * return a.concat(b);\n * }\n * });\n * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }\n */\n var merge = (0, _lodashInternalCreateAssigner['default'])(_lodashInternalBaseMerge['default']);\n\n exports['default'] = merge;\n});","define('lodash/object/methods', ['exports', 'lodash/object/functions'], function (exports, _lodashObjectFunctions) {\n 'use strict';\n\n exports['default'] = _lodashObjectFunctions['default'];\n});","define('lodash/object/omit', ['exports', 'lodash/internal/arrayMap', 'lodash/internal/baseDifference', 'lodash/internal/baseFlatten', 'lodash/internal/bindCallback', 'lodash/object/keysIn', 'lodash/internal/pickByArray', 'lodash/internal/pickByCallback', 'lodash/function/restParam'], function (exports, _lodashInternalArrayMap, _lodashInternalBaseDifference, _lodashInternalBaseFlatten, _lodashInternalBindCallback, _lodashObjectKeysIn, _lodashInternalPickByArray, _lodashInternalPickByCallback, _lodashFunctionRestParam) {\n 'use strict';\n\n /**\n * The opposite of `_.pick`; this method creates an object composed of the\n * own and inherited enumerable properties of `object` that are not omitted.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {Function|...(string|string[])} [predicate] The function invoked per\n * iteration or property names to omit, specified as individual property\n * names or arrays of property names.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'user': 'fred', 'age': 40 };\n *\n * _.omit(object, 'age');\n * // => { 'user': 'fred' }\n *\n * _.omit(object, _.isNumber);\n * // => { 'user': 'fred' }\n */\n var omit = (0, _lodashFunctionRestParam['default'])(function (object, props) {\n if (object == null) {\n return {};\n }\n if (typeof props[0] != 'function') {\n var props = (0, _lodashInternalArrayMap['default'])((0, _lodashInternalBaseFlatten['default'])(props), String);\n return (0, _lodashInternalPickByArray['default'])(object, (0, _lodashInternalBaseDifference['default'])((0, _lodashObjectKeysIn['default'])(object), props));\n }\n var predicate = (0, _lodashInternalBindCallback['default'])(props[0], props[1], 3);\n return (0, _lodashInternalPickByCallback['default'])(object, function (value, key, object) {\n return !predicate(value, key, object);\n });\n });\n\n exports['default'] = omit;\n});","define('lodash/object/pairs', ['exports', 'lodash/object/keys', 'lodash/internal/toObject'], function (exports, _lodashObjectKeys, _lodashInternalToObject) {\n 'use strict';\n\n /**\n * Creates a two dimensional array of the key-value pairs for `object`,\n * e.g. `[[key1, value1], [key2, value2]]`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the new array of key-value pairs.\n * @example\n *\n * _.pairs({ 'barney': 36, 'fred': 40 });\n * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)\n */\n function pairs(object) {\n object = (0, _lodashInternalToObject['default'])(object);\n\n var index = -1,\n props = (0, _lodashObjectKeys['default'])(object),\n length = props.length,\n result = Array(length);\n\n while (++index < length) {\n var key = props[index];\n result[index] = [key, object[key]];\n }\n return result;\n }\n\n exports['default'] = pairs;\n});","define('lodash/object/pick', ['exports', 'lodash/internal/baseFlatten', 'lodash/internal/bindCallback', 'lodash/internal/pickByArray', 'lodash/internal/pickByCallback', 'lodash/function/restParam'], function (exports, _lodashInternalBaseFlatten, _lodashInternalBindCallback, _lodashInternalPickByArray, _lodashInternalPickByCallback, _lodashFunctionRestParam) {\n 'use strict';\n\n /**\n * Creates an object composed of the picked `object` properties. Property\n * names may be specified as individual arguments or as arrays of property\n * names. If `predicate` is provided it's invoked for each property of `object`\n * picking the properties `predicate` returns truthy for. The predicate is\n * bound to `thisArg` and invoked with three arguments: (value, key, object).\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {Function|...(string|string[])} [predicate] The function invoked per\n * iteration or property names to pick, specified as individual property\n * names or arrays of property names.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'user': 'fred', 'age': 40 };\n *\n * _.pick(object, 'user');\n * // => { 'user': 'fred' }\n *\n * _.pick(object, _.isString);\n * // => { 'user': 'fred' }\n */\n var pick = (0, _lodashFunctionRestParam['default'])(function (object, props) {\n if (object == null) {\n return {};\n }\n return typeof props[0] == 'function' ? (0, _lodashInternalPickByCallback['default'])(object, (0, _lodashInternalBindCallback['default'])(props[0], props[1], 3)) : (0, _lodashInternalPickByArray['default'])(object, (0, _lodashInternalBaseFlatten['default'])(props));\n });\n\n exports['default'] = pick;\n});","define('lodash/object/result', ['exports', 'lodash/internal/baseGet', 'lodash/internal/baseSlice', 'lodash/lang/isFunction', 'lodash/internal/isKey', 'lodash/array/last', 'lodash/internal/toPath'], function (exports, _lodashInternalBaseGet, _lodashInternalBaseSlice, _lodashLangIsFunction, _lodashInternalIsKey, _lodashArrayLast, _lodashInternalToPath) {\n 'use strict';\n\n /**\n * This method is like `_.get` except that if the resolved value is a function\n * it's invoked with the `this` binding of its parent object and its result\n * is returned.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to resolve.\n * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n *\n * _.result(object, 'a[0].b.c1');\n * // => 3\n *\n * _.result(object, 'a[0].b.c2');\n * // => 4\n *\n * _.result(object, 'a.b.c', 'default');\n * // => 'default'\n *\n * _.result(object, 'a.b.c', _.constant('default'));\n * // => 'default'\n */\n function result(object, path, defaultValue) {\n var result = object == null ? undefined : object[path];\n if (result === undefined) {\n if (object != null && !(0, _lodashInternalIsKey['default'])(path, object)) {\n path = (0, _lodashInternalToPath['default'])(path);\n object = path.length == 1 ? object : (0, _lodashInternalBaseGet['default'])(object, (0, _lodashInternalBaseSlice['default'])(path, 0, -1));\n result = object == null ? undefined : object[(0, _lodashArrayLast['default'])(path)];\n }\n result = result === undefined ? defaultValue : result;\n }\n return (0, _lodashLangIsFunction['default'])(result) ? result.call(object) : result;\n }\n\n exports['default'] = result;\n});","define('lodash/object/set', ['exports', 'lodash/internal/isIndex', 'lodash/internal/isKey', 'lodash/lang/isObject', 'lodash/internal/toPath'], function (exports, _lodashInternalIsIndex, _lodashInternalIsKey, _lodashLangIsObject, _lodashInternalToPath) {\n 'use strict';\n\n /**\n * Sets the property value of `path` on `object`. If a portion of `path`\n * does not exist it's created.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to augment.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.set(object, 'a[0].b.c', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, 'x[0].y.z', 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */\n function set(object, path, value) {\n if (object == null) {\n return object;\n }\n var pathKey = path + '';\n path = object[pathKey] != null || (0, _lodashInternalIsKey['default'])(path, object) ? [pathKey] : (0, _lodashInternalToPath['default'])(path);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = path[index];\n if ((0, _lodashLangIsObject['default'])(nested)) {\n if (index == lastIndex) {\n nested[key] = value;\n } else if (nested[key] == null) {\n nested[key] = (0, _lodashInternalIsIndex['default'])(path[index + 1]) ? [] : {};\n }\n }\n nested = nested[key];\n }\n return object;\n }\n\n exports['default'] = set;\n});","define('lodash/object/transform', ['exports', 'lodash/internal/arrayEach', 'lodash/internal/baseCallback', 'lodash/internal/baseCreate', 'lodash/internal/baseForOwn', 'lodash/lang/isArray', 'lodash/lang/isFunction', 'lodash/lang/isObject', 'lodash/lang/isTypedArray'], function (exports, _lodashInternalArrayEach, _lodashInternalBaseCallback, _lodashInternalBaseCreate, _lodashInternalBaseForOwn, _lodashLangIsArray, _lodashLangIsFunction, _lodashLangIsObject, _lodashLangIsTypedArray) {\n 'use strict';\n\n /**\n * An alternative to `_.reduce`; this method transforms `object` to a new\n * `accumulator` object which is the result of running each of its own enumerable\n * properties through `iteratee`, with each invocation potentially mutating\n * the `accumulator` object. The `iteratee` is bound to `thisArg` and invoked\n * with four arguments: (accumulator, value, key, object). Iteratee functions\n * may exit iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Array|Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The custom accumulator value.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.transform([2, 3, 4], function(result, n) {\n * result.push(n *= n);\n * return n % 2 == 0;\n * });\n * // => [4, 9]\n *\n * _.transform({ 'a': 1, 'b': 2 }, function(result, n, key) {\n * result[key] = n * 3;\n * });\n * // => { 'a': 3, 'b': 6 }\n */\n function transform(object, iteratee, accumulator, thisArg) {\n var isArr = (0, _lodashLangIsArray['default'])(object) || (0, _lodashLangIsTypedArray['default'])(object);\n iteratee = (0, _lodashInternalBaseCallback['default'])(iteratee, thisArg, 4);\n\n if (accumulator == null) {\n if (isArr || (0, _lodashLangIsObject['default'])(object)) {\n var Ctor = object.constructor;\n if (isArr) {\n accumulator = (0, _lodashLangIsArray['default'])(object) ? new Ctor() : [];\n } else {\n accumulator = (0, _lodashInternalBaseCreate['default'])((0, _lodashLangIsFunction['default'])(Ctor) ? Ctor.prototype : undefined);\n }\n } else {\n accumulator = {};\n }\n }\n (isArr ? _lodashInternalArrayEach['default'] : _lodashInternalBaseForOwn['default'])(object, function (value, index, object) {\n return iteratee(accumulator, value, index, object);\n });\n return accumulator;\n }\n\n exports['default'] = transform;\n});","define('lodash/object/values', ['exports', 'lodash/internal/baseValues', 'lodash/object/keys'], function (exports, _lodashInternalBaseValues, _lodashObjectKeys) {\n 'use strict';\n\n /**\n * Creates an array of the own enumerable property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\n function values(object) {\n return (0, _lodashInternalBaseValues['default'])(object, (0, _lodashObjectKeys['default'])(object));\n }\n\n exports['default'] = values;\n});","define('lodash/object/valuesIn', ['exports', 'lodash/internal/baseValues', 'lodash/object/keysIn'], function (exports, _lodashInternalBaseValues, _lodashObjectKeysIn) {\n 'use strict';\n\n /**\n * Creates an array of the own and inherited enumerable property values\n * of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.valuesIn(new Foo);\n * // => [1, 2, 3] (iteration order is not guaranteed)\n */\n function valuesIn(object) {\n return (0, _lodashInternalBaseValues['default'])(object, (0, _lodashObjectKeysIn['default'])(object));\n }\n\n exports['default'] = valuesIn;\n});","define('lodash/string', ['exports', 'lodash/string/camelCase', 'lodash/string/capitalize', 'lodash/string/deburr', 'lodash/string/endsWith', 'lodash/string/escape', 'lodash/string/escapeRegExp', 'lodash/string/kebabCase', 'lodash/string/pad', 'lodash/string/padLeft', 'lodash/string/padRight', 'lodash/string/parseInt', 'lodash/string/repeat', 'lodash/string/snakeCase', 'lodash/string/startCase', 'lodash/string/startsWith', 'lodash/string/template', 'lodash/string/templateSettings', 'lodash/string/trim', 'lodash/string/trimLeft', 'lodash/string/trimRight', 'lodash/string/trunc', 'lodash/string/unescape', 'lodash/string/words'], function (exports, _lodashStringCamelCase, _lodashStringCapitalize, _lodashStringDeburr, _lodashStringEndsWith, _lodashStringEscape, _lodashStringEscapeRegExp, _lodashStringKebabCase, _lodashStringPad, _lodashStringPadLeft, _lodashStringPadRight, _lodashStringParseInt, _lodashStringRepeat, _lodashStringSnakeCase, _lodashStringStartCase, _lodashStringStartsWith, _lodashStringTemplate, _lodashStringTemplateSettings, _lodashStringTrim, _lodashStringTrimLeft, _lodashStringTrimRight, _lodashStringTrunc, _lodashStringUnescape, _lodashStringWords) {\n 'use strict';\n\n exports['default'] = {\n 'camelCase': _lodashStringCamelCase['default'],\n 'capitalize': _lodashStringCapitalize['default'],\n 'deburr': _lodashStringDeburr['default'],\n 'endsWith': _lodashStringEndsWith['default'],\n 'escape': _lodashStringEscape['default'],\n 'escapeRegExp': _lodashStringEscapeRegExp['default'],\n 'kebabCase': _lodashStringKebabCase['default'],\n 'pad': _lodashStringPad['default'],\n 'padLeft': _lodashStringPadLeft['default'],\n 'padRight': _lodashStringPadRight['default'],\n 'parseInt': _lodashStringParseInt['default'],\n 'repeat': _lodashStringRepeat['default'],\n 'snakeCase': _lodashStringSnakeCase['default'],\n 'startCase': _lodashStringStartCase['default'],\n 'startsWith': _lodashStringStartsWith['default'],\n 'template': _lodashStringTemplate['default'],\n 'templateSettings': _lodashStringTemplateSettings['default'],\n 'trim': _lodashStringTrim['default'],\n 'trimLeft': _lodashStringTrimLeft['default'],\n 'trimRight': _lodashStringTrimRight['default'],\n 'trunc': _lodashStringTrunc['default'],\n 'unescape': _lodashStringUnescape['default'],\n 'words': _lodashStringWords['default']\n };\n});","define('lodash/string/camelCase', ['exports', 'lodash/internal/createCompounder'], function (exports, _lodashInternalCreateCompounder) {\n 'use strict';\n\n /**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar');\n * // => 'fooBar'\n *\n * _.camelCase('__foo_bar__');\n * // => 'fooBar'\n */\n var camelCase = (0, _lodashInternalCreateCompounder['default'])(function (result, word, index) {\n word = word.toLowerCase();\n return result + (index ? word.charAt(0).toUpperCase() + word.slice(1) : word);\n });\n\n exports['default'] = camelCase;\n});","define('lodash/string/capitalize', ['exports', 'lodash/internal/baseToString'], function (exports, _lodashInternalBaseToString) {\n 'use strict';\n\n /**\n * Capitalizes the first character of `string`.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('fred');\n * // => 'Fred'\n */\n function capitalize(string) {\n string = (0, _lodashInternalBaseToString['default'])(string);\n return string && string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n exports['default'] = capitalize;\n});","define('lodash/string/deburr', ['exports', 'lodash/internal/baseToString', 'lodash/internal/deburrLetter'], function (exports, _lodashInternalBaseToString, _lodashInternalDeburrLetter) {\n 'use strict';\n\n /** Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). */\n var reComboMark = /[\\u0300-\\u036f\\ufe20-\\ufe23]/g;\n\n /** Used to match latin-1 supplementary letters (excluding mathematical operators). */\n var reLatin1 = /[\\xc0-\\xd6\\xd8-\\xde\\xdf-\\xf6\\xf8-\\xff]/g;\n\n /**\n * Deburrs `string` by converting [latin-1 supplementary letters](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * to basic latin letters and removing [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\n function deburr(string) {\n string = (0, _lodashInternalBaseToString['default'])(string);\n return string && string.replace(reLatin1, _lodashInternalDeburrLetter['default']).replace(reComboMark, '');\n }\n\n exports['default'] = deburr;\n});","define('lodash/string/endsWith', ['exports', 'lodash/internal/baseToString'], function (exports, _lodashInternalBaseToString) {\n 'use strict';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeMin = Math.min;\n\n /**\n * Checks if `string` ends with the given target string.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to search.\n * @param {string} [target] The string to search for.\n * @param {number} [position=string.length] The position to search from.\n * @returns {boolean} Returns `true` if `string` ends with `target`, else `false`.\n * @example\n *\n * _.endsWith('abc', 'c');\n * // => true\n *\n * _.endsWith('abc', 'b');\n * // => false\n *\n * _.endsWith('abc', 'b', 2);\n * // => true\n */\n function endsWith(string, target, position) {\n string = (0, _lodashInternalBaseToString['default'])(string);\n target = target + '';\n\n var length = string.length;\n position = position === undefined ? length : nativeMin(position < 0 ? 0 : +position || 0, length);\n\n position -= target.length;\n return position >= 0 && string.indexOf(target, position) == position;\n }\n\n exports['default'] = endsWith;\n});","define('lodash/string/escape', ['exports', 'lodash/internal/baseToString', 'lodash/internal/escapeHtmlChar'], function (exports, _lodashInternalBaseToString, _lodashInternalEscapeHtmlChar) {\n 'use strict';\n\n /** Used to match HTML entities and HTML characters. */\n var reUnescapedHtml = /[&<>\"'`]/g,\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n /**\n * Converts the characters \"&\", \"<\", \">\", '\"', \"'\", and \"\\`\", in `string` to\n * their corresponding HTML entities.\n *\n * **Note:** No other characters are escaped. To escape additional characters\n * use a third-party library like [_he_](https://mths.be/he).\n *\n * Though the \">\" character is escaped for symmetry, characters like\n * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n * unless they're part of a tag or unquoted attribute value.\n * See [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n * (under \"semi-related fun fact\") for more details.\n *\n * Backticks are escaped because in Internet Explorer < 9, they can break out\n * of attribute values or HTML comments. See [#59](https://html5sec.org/#59),\n * [#102](https://html5sec.org/#102), [#108](https://html5sec.org/#108), and\n * [#133](https://html5sec.org/#133) of the [HTML5 Security Cheatsheet](https://html5sec.org/)\n * for more details.\n *\n * When working with HTML you should always [quote attribute values](http://wonko.com/post/html-escaping)\n * to reduce XSS vectors.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape('fred, barney, & pebbles');\n * // => 'fred, barney, & pebbles'\n */\n function escape(string) {\n // Reset `lastIndex` because in IE < 9 `String#replace` does not.\n string = (0, _lodashInternalBaseToString['default'])(string);\n return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, _lodashInternalEscapeHtmlChar['default']) : string;\n }\n\n exports['default'] = escape;\n});","define('lodash/string/escapeRegExp', ['exports', 'lodash/internal/baseToString', 'lodash/internal/escapeRegExpChar'], function (exports, _lodashInternalBaseToString, _lodashInternalEscapeRegExpChar) {\n 'use strict';\n\n /**\n * Used to match `RegExp` [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns)\n * and those outlined by [`EscapeRegExpPattern`](http://ecma-international.org/ecma-262/6.0/#sec-escaperegexppattern).\n */\n var reRegExpChars = /^[:!,]|[\\\\^$.*+?()[\\]{}|\\/]|(^[0-9a-fA-Fnrtuvx])|([\\n\\r\\u2028\\u2029])/g,\n reHasRegExpChars = RegExp(reRegExpChars.source);\n\n /**\n * Escapes the `RegExp` special characters \"\\\", \"/\", \"^\", \"$\", \".\", \"|\", \"?\",\n * \"*\", \"+\", \"(\", \")\", \"[\", \"]\", \"{\" and \"}\" in `string`.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https:\\/\\/lodash\\.com\\/\\)'\n */\n function escapeRegExp(string) {\n string = (0, _lodashInternalBaseToString['default'])(string);\n return string && reHasRegExpChars.test(string) ? string.replace(reRegExpChars, _lodashInternalEscapeRegExpChar['default']) : string || '(?:)';\n }\n\n exports['default'] = escapeRegExp;\n});","define('lodash/string/kebabCase', ['exports', 'lodash/internal/createCompounder'], function (exports, _lodashInternalCreateCompounder) {\n 'use strict';\n\n /**\n * Converts `string` to [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the kebab cased string.\n * @example\n *\n * _.kebabCase('Foo Bar');\n * // => 'foo-bar'\n *\n * _.kebabCase('fooBar');\n * // => 'foo-bar'\n *\n * _.kebabCase('__foo_bar__');\n * // => 'foo-bar'\n */\n var kebabCase = (0, _lodashInternalCreateCompounder['default'])(function (result, word, index) {\n return result + (index ? '-' : '') + word.toLowerCase();\n });\n\n exports['default'] = kebabCase;\n});","define('lodash/string/pad', ['exports', 'lodash/internal/baseToString', 'lodash/internal/createPadding', 'lodash/internal/root'], function (exports, _lodashInternalBaseToString, _lodashInternalCreatePadding, _lodashInternalRoot) {\n 'use strict';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeCeil = Math.ceil,\n nativeFloor = Math.floor,\n nativeIsFinite = _lodashInternalRoot['default'].isFinite;\n\n /**\n * Pads `string` on the left and right sides if it's shorter than `length`.\n * Padding characters are truncated if they can't be evenly divided by `length`.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.pad('abc', 8);\n * // => ' abc '\n *\n * _.pad('abc', 8, '_-');\n * // => '_-abc_-_'\n *\n * _.pad('abc', 3);\n * // => 'abc'\n */\n function pad(string, length, chars) {\n string = (0, _lodashInternalBaseToString['default'])(string);\n length = +length;\n\n var strLength = string.length;\n if (strLength >= length || !nativeIsFinite(length)) {\n return string;\n }\n var mid = (length - strLength) / 2,\n leftLength = nativeFloor(mid),\n rightLength = nativeCeil(mid);\n\n chars = (0, _lodashInternalCreatePadding['default'])('', rightLength, chars);\n return chars.slice(0, leftLength) + string + chars;\n }\n\n exports['default'] = pad;\n});","define('lodash/string/padLeft', ['exports', 'lodash/internal/createPadDir'], function (exports, _lodashInternalCreatePadDir) {\n 'use strict';\n\n /**\n * Pads `string` on the left side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padLeft('abc', 6);\n * // => ' abc'\n *\n * _.padLeft('abc', 6, '_-');\n * // => '_-_abc'\n *\n * _.padLeft('abc', 3);\n * // => 'abc'\n */\n var padLeft = (0, _lodashInternalCreatePadDir['default'])();\n\n exports['default'] = padLeft;\n});","define('lodash/string/padRight', ['exports', 'lodash/internal/createPadDir'], function (exports, _lodashInternalCreatePadDir) {\n 'use strict';\n\n /**\n * Pads `string` on the right side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padRight('abc', 6);\n * // => 'abc '\n *\n * _.padRight('abc', 6, '_-');\n * // => 'abc_-_'\n *\n * _.padRight('abc', 3);\n * // => 'abc'\n */\n var padRight = (0, _lodashInternalCreatePadDir['default'])(true);\n\n exports['default'] = padRight;\n});","define('lodash/string/parseInt', ['exports', 'lodash/internal/isIterateeCall', 'lodash/internal/root', 'lodash/string/trim'], function (exports, _lodashInternalIsIterateeCall, _lodashInternalRoot, _lodashStringTrim) {\n 'use strict';\n\n /** Used to detect hexadecimal string values. */\n var reHasHexPrefix = /^0[xX]/;\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeParseInt = _lodashInternalRoot['default'].parseInt;\n\n /**\n * Converts `string` to an integer of the specified radix. If `radix` is\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a hexadecimal,\n * in which case a `radix` of `16` is used.\n *\n * **Note:** This method aligns with the [ES5 implementation](https://es5.github.io/#E)\n * of `parseInt`.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} string The string to convert.\n * @param {number} [radix] The radix to interpret `value` by.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.parseInt('08');\n * // => 8\n *\n * _.map(['6', '08', '10'], _.parseInt);\n * // => [6, 8, 10]\n */\n function parseInt(string, radix, guard) {\n // Firefox < 21 and Opera < 15 follow ES3 for `parseInt`.\n // Chrome fails to trim leading whitespace characters.\n // See https://code.google.com/p/v8/issues/detail?id=3109 for more details.\n if (guard ? (0, _lodashInternalIsIterateeCall['default'])(string, radix, guard) : radix == null) {\n radix = 0;\n } else if (radix) {\n radix = +radix;\n }\n string = (0, _lodashStringTrim['default'])(string);\n return nativeParseInt(string, radix || (reHasHexPrefix.test(string) ? 16 : 10));\n }\n\n exports['default'] = parseInt;\n});","define('lodash/string/repeat', ['exports', 'lodash/internal/baseToString', 'lodash/internal/root'], function (exports, _lodashInternalBaseToString, _lodashInternalRoot) {\n 'use strict';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeFloor = Math.floor,\n nativeIsFinite = _lodashInternalRoot['default'].isFinite;\n\n /**\n * Repeats the given string `n` times.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to repeat.\n * @param {number} [n=0] The number of times to repeat the string.\n * @returns {string} Returns the repeated string.\n * @example\n *\n * _.repeat('*', 3);\n * // => '***'\n *\n * _.repeat('abc', 2);\n * // => 'abcabc'\n *\n * _.repeat('abc', 0);\n * // => ''\n */\n function repeat(string, n) {\n var result = '';\n string = (0, _lodashInternalBaseToString['default'])(string);\n n = +n;\n if (n < 1 || !string || !nativeIsFinite(n)) {\n return result;\n }\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n do {\n if (n % 2) {\n result += string;\n }\n n = nativeFloor(n / 2);\n string += string;\n } while (n);\n\n return result;\n }\n\n exports['default'] = repeat;\n});","define('lodash/string/snakeCase', ['exports', 'lodash/internal/createCompounder'], function (exports, _lodashInternalCreateCompounder) {\n 'use strict';\n\n /**\n * Converts `string` to [snake case](https://en.wikipedia.org/wiki/Snake_case).\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the snake cased string.\n * @example\n *\n * _.snakeCase('Foo Bar');\n * // => 'foo_bar'\n *\n * _.snakeCase('fooBar');\n * // => 'foo_bar'\n *\n * _.snakeCase('--foo-bar');\n * // => 'foo_bar'\n */\n var snakeCase = (0, _lodashInternalCreateCompounder['default'])(function (result, word, index) {\n return result + (index ? '_' : '') + word.toLowerCase();\n });\n\n exports['default'] = snakeCase;\n});","define('lodash/string/startCase', ['exports', 'lodash/internal/createCompounder'], function (exports, _lodashInternalCreateCompounder) {\n 'use strict';\n\n /**\n * Converts `string` to [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the start cased string.\n * @example\n *\n * _.startCase('--foo-bar');\n * // => 'Foo Bar'\n *\n * _.startCase('fooBar');\n * // => 'Foo Bar'\n *\n * _.startCase('__foo_bar__');\n * // => 'Foo Bar'\n */\n var startCase = (0, _lodashInternalCreateCompounder['default'])(function (result, word, index) {\n return result + (index ? ' ' : '') + (word.charAt(0).toUpperCase() + word.slice(1));\n });\n\n exports['default'] = startCase;\n});","define('lodash/string/startsWith', ['exports', 'lodash/internal/baseToString'], function (exports, _lodashInternalBaseToString) {\n 'use strict';\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeMin = Math.min;\n\n /**\n * Checks if `string` starts with the given target string.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to search.\n * @param {string} [target] The string to search for.\n * @param {number} [position=0] The position to search from.\n * @returns {boolean} Returns `true` if `string` starts with `target`, else `false`.\n * @example\n *\n * _.startsWith('abc', 'a');\n * // => true\n *\n * _.startsWith('abc', 'b');\n * // => false\n *\n * _.startsWith('abc', 'b', 1);\n * // => true\n */\n function startsWith(string, target, position) {\n string = (0, _lodashInternalBaseToString['default'])(string);\n position = position == null ? 0 : nativeMin(position < 0 ? 0 : +position || 0, string.length);\n\n return string.lastIndexOf(target, position) == position;\n }\n\n exports['default'] = startsWith;\n});","define('lodash/string/template', ['exports', 'lodash/internal/assignOwnDefaults', 'lodash/internal/assignWith', 'lodash/utility/attempt', 'lodash/internal/baseAssign', 'lodash/internal/baseToString', 'lodash/internal/baseValues', 'lodash/internal/escapeStringChar', 'lodash/lang/isError', 'lodash/internal/isIterateeCall', 'lodash/object/keys', 'lodash/internal/reInterpolate', 'lodash/string/templateSettings'], function (exports, _lodashInternalAssignOwnDefaults, _lodashInternalAssignWith, _lodashUtilityAttempt, _lodashInternalBaseAssign, _lodashInternalBaseToString, _lodashInternalBaseValues, _lodashInternalEscapeStringChar, _lodashLangIsError, _lodashInternalIsIterateeCall, _lodashObjectKeys, _lodashInternalReInterpolate, _lodashStringTemplateSettings) {\n 'use strict';\n\n /** Used to match empty string literals in compiled template source. */\n var reEmptyStringLeading = /\\b__p \\+= '';/g,\n reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n /** Used to match [ES template delimiters](http://ecma-international.org/ecma-262/6.0/#sec-template-literal-lexical-components). */\n var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n /** Used to ensure capturing order of template delimiters. */\n var reNoMatch = /($^)/;\n\n /** Used to match unescaped characters in compiled string literals. */\n var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n /**\n * Creates a compiled template function that can interpolate data properties\n * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n * properties may be accessed as free variables in the template. If a setting\n * object is provided it takes precedence over `_.templateSettings` values.\n *\n * **Note:** In the development build `_.template` utilizes\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n * for easier debugging.\n *\n * For more information on precompiling templates see\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n *\n * For more information on Chrome extension sandboxes see\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The template string.\n * @param {Object} [options] The options object.\n * @param {RegExp} [options.escape] The HTML \"escape\" delimiter.\n * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\n * @param {Object} [options.imports] An object to import into the template as free variables.\n * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\n * @param {string} [options.sourceURL] The sourceURL of the template's compiled source.\n * @param {string} [options.variable] The data object variable name.\n * @param- {Object} [otherOptions] Enables the legacy `options` param signature.\n * @returns {Function} Returns the compiled template function.\n * @example\n *\n * // using the \"interpolate\" delimiter to create a compiled template\n * var compiled = _.template('hello <%= user %>!');\n * compiled({ 'user': 'fred' });\n * // => 'hello fred!'\n *\n * // using the HTML \"escape\" delimiter to escape data property values\n * var compiled = _.template('<%- value %> ');\n * compiled({ 'value': '
-
+
+
diff --git a/priv/ember_riak_explorer/dist/testem.js b/priv/ember_riak_explorer/dist/testem.js
new file mode 100644
index 0000000..1fe084c
--- /dev/null
+++ b/priv/ember_riak_explorer/dist/testem.js
@@ -0,0 +1,19 @@
+/**
+ * This is dummy file that exists for the sole purpose
+ * of allowing tests to run directly in the browser as
+ * well as by Testem.
+ *
+ * Testem is configured to run tests directly against
+ * the test build of index.html, which requires a
+ * snippet to load the testem.js file:
+ *
+ * This has to go before the qunit framework and app
+ * tests are loaded.
+ *
+ * Testem internally supplies this file. However, if you
+ * run the tests directly in the browser (localhost:8000/tests),
+ * this file does not exist.
+ *
+ * Hence the purpose of this fake file. This file is served
+ * directly from the express server to satisify the script load.
+ */
diff --git a/priv/ember_riak_explorer/dist/tests/index.html b/priv/ember_riak_explorer/dist/tests/index.html
new file mode 100644
index 0000000..cf17983
--- /dev/null
+++ b/priv/ember_riak_explorer/dist/tests/index.html
@@ -0,0 +1,44 @@
+
+
+
+
+
+ EmberRiakExplorer Tests
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+